From e56d49ed37af2f8e944ada290794bea7cdada466 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 24 Nov 2023 11:21:12 +0800 Subject: [PATCH 01/38] Add `IdentitySession` entity. --- .../Abp/Identity/IdentitySessionConsts.cs | 10 +++ .../Identity/IIdentitySessionRepository.cs | 9 +++ .../Volo/Abp/Identity/IdentitySession.cs | 81 +++++++++++++++++++ .../AbpIdentityEntityFrameworkCoreModule.cs | 1 + .../EfCoreIdentitySessionRepository.cs | 15 ++++ .../EntityFrameworkCore/IIdentityDbContext.cs | 2 + .../EntityFrameworkCore/IdentityDbContext.cs | 2 + ...IdentityDbContextModelBuilderExtensions.cs | 16 ++++ .../MongoDB/AbpIdentityMongoDbContext.cs | 2 + .../AbpIdentityMongoDbContextExtensions.cs | 5 ++ .../MongoDB/AbpIdentityMongoDbModule.cs | 1 + .../MongoDB/IAbpIdentityMongoDbContext.cs | 2 + .../MongoDB/MongoIdentitySessionRepository.cs | 14 ++++ 13 files changed, 160 insertions(+) create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionConsts.cs create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs create mode 100644 modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs create mode 100644 modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionConsts.cs new file mode 100644 index 0000000000..7182afa28e --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionConsts.cs @@ -0,0 +1,10 @@ +namespace Volo.Abp.Identity; + +public class IdentitySessionConsts +{ + public static int MaxDeviceLength { get; set; } = 128; + + public static int MaxClientIdLength { get; set; } = 64; + + public static int MaxIpAddressesLength { get; set; } = 256; +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs new file mode 100644 index 0000000000..2cb0875674 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs @@ -0,0 +1,9 @@ +using System; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.Identity; + +public interface IIdentitySessionRepository : IBasicRepository +{ + +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs new file mode 100644 index 0000000000..0dd53c5f74 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.Identity; + +public class IdentitySession : BasicAggregateRoot +{ + /// + /// Web, CLI, STUDIO, ... + /// + public virtual string Device { get; protected set; } + + public virtual Guid? TenantId { get; protected set; } + + public virtual Guid UserId { get; protected set; } + + public virtual string ClientId { get; set; } + + public virtual string IpAddresses { get; protected set; } + + public virtual DateTime SignedIn { get; protected set; } + + public virtual DateTime? LastAccessed { get; protected set; } + + protected IdentitySession() + { + + } + + public IdentitySession( + Guid id, + string device, + Guid userId, + Guid? tenantId, + string clientId, + string ipAddresses, + DateTime signedIn, + DateTime? lastAccessed) + { + Id = id; + Device = device; + UserId = userId; + TenantId = tenantId; + ClientId = clientId; + IpAddresses = ipAddresses; + SignedIn = signedIn; + LastAccessed = lastAccessed; + } + + public void SetSignedInTime(DateTime signedIn) + { + SignedIn = signedIn; + } + + public void UpdateLastAccessedTime(DateTime? lastAccessed) + { + LastAccessed = lastAccessed; + } + + public void SetIpAddresses(IEnumerable ipAddresses) + { + IpAddresses = JoinAsString(ipAddresses); + } + + public IEnumerable GetIpAddresses() + { + return GetArrayFromString(IpAddresses); + } + + private static string JoinAsString(IEnumerable list) + { + var serialized = string.Join(",", list); + return serialized.IsNullOrWhiteSpace() ? null : serialized; + } + + private string[] GetArrayFromString(string str) + { + return str?.Split(",", StringSplitOptions.RemoveEmptyEntries) ?? Array.Empty(); + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs index a58a73a996..16433977d7 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs @@ -20,6 +20,7 @@ public class AbpIdentityEntityFrameworkCoreModule : AbpModule options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs new file mode 100644 index 0000000000..e86e57d0ee --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs @@ -0,0 +1,15 @@ +using System; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace Volo.Abp.Identity.EntityFrameworkCore; + +public class EfCoreIdentitySessionRepository : EfCoreRepository, IIdentitySessionRepository +{ + public EfCoreIdentitySessionRepository(IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + + } + +} diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs index 2f409a61b2..6fe3b8dd9b 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs @@ -20,4 +20,6 @@ public interface IIdentityDbContext : IEfCoreDbContext DbSet LinkUsers { get; } DbSet UserDelegations { get; } + + DbSet Sessions { get; } } diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs index 79adece5e1..3bb7777cb4 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs @@ -24,6 +24,8 @@ public class IdentityDbContext : AbpDbContext, IIdentityDbCon public DbSet UserDelegations { get; set; } + public DbSet Sessions { get; set; } + public IdentityDbContext(DbContextOptions options) : base(options) { diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs index f85f72e84e..6258f1b24b 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs @@ -279,6 +279,22 @@ public static class IdentityDbContextModelBuilderExtensions b.ApplyObjectExtensionMappings(); }); + builder.Entity(b => + { + b.ToTable(AbpIdentityDbProperties.DbTablePrefix + "Sessions", AbpIdentityDbProperties.DbSchema); + + b.ConfigureByConvention(); + + b.Property(x => x.Device).HasMaxLength(IdentitySessionConsts.MaxDeviceLength).IsRequired(); + b.Property(x => x.ClientId).HasMaxLength(IdentitySessionConsts.MaxClientIdLength); + b.Property(x => x.IpAddresses).HasMaxLength(IdentitySessionConsts.MaxIpAddressesLength); + + b.HasIndex(x => new { x.Device }); + b.HasIndex(x => new { x.TenantId, x.UserId }); + + b.ApplyObjectExtensionMappings(); + }); + builder.TryConfigureObjectExtensions(); } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs index 90118a534e..86995f5472 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs @@ -21,6 +21,8 @@ public class AbpIdentityMongoDbContext : AbpMongoDbContext, IAbpIdentityMongoDbC public IMongoCollection UserDelegations => Collection(); + public IMongoCollection Sessions => Collection(); + protected override void CreateModel(IMongoModelBuilder modelBuilder) { base.CreateModel(modelBuilder); diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs index 5ee7ffc47e..4ccb9fe7f7 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs @@ -42,5 +42,10 @@ public static class AbpIdentityMongoDbContextExtensions { b.CollectionName = AbpIdentityDbProperties.DbTablePrefix + "UserDelegations"; }); + + builder.Entity(b => + { + b.CollectionName = AbpIdentityDbProperties.DbTablePrefix + "Sessions"; + }); } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs index 35c81b25bb..8537bf630f 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs @@ -21,6 +21,7 @@ public class AbpIdentityMongoDbModule : AbpModule options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs index 39bcc23b50..7481afe5ac 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs @@ -20,4 +20,6 @@ public interface IAbpIdentityMongoDbContext : IAbpMongoDbContext IMongoCollection LinkUsers { get; } IMongoCollection UserDelegations { get; } + + IMongoCollection Sessions { get; } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs new file mode 100644 index 0000000000..9f873165a0 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs @@ -0,0 +1,14 @@ +using System; +using Volo.Abp.Domain.Repositories.MongoDB; +using Volo.Abp.MongoDB; + +namespace Volo.Abp.Identity.MongoDB; + +public class MongoIdentitySessionRepository : MongoDbRepository, IIdentitySessionRepository +{ + public MongoIdentitySessionRepository(IMongoDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + + } +} From 3d91733bc10e955b4fc9f12267679b70b9028e72 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 1 Dec 2023 17:33:19 +0800 Subject: [PATCH 02/38] Add `IdentitySessionManager`. --- .../Principal/AbpClaimsIdentityExtensions.cs | 33 +++++++ .../Volo/Abp/Security/Claims/AbpClaimTypes.cs | 8 +- .../Volo/Abp/Users/CurrentUserExtensions.cs | 22 +++++ .../Abp/Identity/IdentitySessionConsts.cs | 6 +- .../Abp/Identity/IdentitySessionDevices.cs | 8 ++ .../Identity/IIdentitySessionRepository.cs | 11 +++ .../Volo/Abp/Identity/IdentitySession.cs | 15 ++- .../Abp/Identity/IdentitySessionManager.cs | 98 +++++++++++++++++++ .../EfCoreIdentitySessionRepository.cs | 37 +++++++ ...IdentityDbContextModelBuilderExtensions.cs | 5 +- .../MongoDB/MongoIdentitySessionRepository.cs | 41 ++++++++ 11 files changed, 278 insertions(+), 6 deletions(-) create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionDevices.cs create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySessionManager.cs diff --git a/framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs b/framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs index 2661298405..6f950524f3 100644 --- a/framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs +++ b/framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs @@ -276,4 +276,37 @@ public static class AbpClaimsIdentityExtensions return principal; } + + public static Guid? FindSessionId([NotNull] this IIdentity identity) + { + Check.NotNull(identity, nameof(identity)); + + var claimsIdentity = identity as ClaimsIdentity; + + var sessionIdOrNull = claimsIdentity?.Claims?.FirstOrDefault(c => c.Type == AbpClaimTypes.SessionId); + if (sessionIdOrNull == null || sessionIdOrNull.Value.IsNullOrWhiteSpace()) + { + return null; + } + + if (Guid.TryParse(sessionIdOrNull.Value, out var guid)) + { + return guid; + } + + return null; + } + + public static string? FindSessionId([NotNull] this ClaimsPrincipal principal) + { + Check.NotNull(principal, nameof(principal)); + + var sessionIdOrNull = principal.Claims?.FirstOrDefault(c => c.Type == AbpClaimTypes.SessionId); + if (sessionIdOrNull == null || sessionIdOrNull.Value.IsNullOrWhiteSpace()) + { + return null; + } + + return sessionIdOrNull.Value; + } } diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs index 63628bd33a..52f721a4e6 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs @@ -87,9 +87,15 @@ public static class AbpClaimTypes /// Default: "impersonator_username". /// public static string ImpersonatorUserName { get; set; } = "impersonator_username"; - + /// /// Default: "picture". /// public static string Picture { get; set; } = "picture"; + + /// + /// Default: "session_id". + /// + public static string SessionId { get; set; } = "session_id"; + } diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentUserExtensions.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentUserExtensions.cs index b702bcffde..3007cc95c3 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentUserExtensions.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentUserExtensions.cs @@ -70,4 +70,26 @@ public static class CurrentUserExtensions { return currentUser.FindClaimValue(AbpClaimTypes.ImpersonatorUserName); } + + public static Guid GetSessionId([NotNull] this ICurrentUser currentUser) + { + var sessionId = currentUser.FindSessionId(); + Debug.Assert(sessionId != null, "sessionId != null"); + return sessionId!.Value; + } + + public static Guid? FindSessionId([NotNull] this ICurrentUser currentUser) + { + var sessionId = currentUser.FindClaimValue(AbpClaimTypes.SessionId); + if (sessionId.IsNullOrWhiteSpace()) + { + return null; + } + if (Guid.TryParse(sessionId, out var guid)) + { + return guid; + } + + return null; + } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionConsts.cs index 7182afa28e..96cb8df5c9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionConsts.cs @@ -2,7 +2,11 @@ namespace Volo.Abp.Identity; public class IdentitySessionConsts { - public static int MaxDeviceLength { get; set; } = 128; + public static int MaxSessionIdLength { get; set; } = 128; + + public static int MaxDeviceLength { get; set; } = 64; + + public static int MaxDeviceInfoLength { get; set; } = 64; public static int MaxClientIdLength { get; set; } = 64; diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionDevices.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionDevices.cs new file mode 100644 index 0000000000..989841d034 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionDevices.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.Identity; + +public static class IdentitySessionDevices +{ + public const string Web = "Web"; + + public const string OAuth = "OAuth"; +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs index 2cb0875674..b425b24c33 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs @@ -1,9 +1,20 @@ using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; using Volo.Abp.Domain.Repositories; namespace Volo.Abp.Identity; public interface IIdentitySessionRepository : IBasicRepository { + Task FindAsync(string sessionId, CancellationToken cancellationToken = default); + Task GetAsync(string sessionId, CancellationToken cancellationToken = default); + + Task> GetListAsync(Guid userId, CancellationToken cancellationToken = default); + + Task DeleteAllAsync(Guid userId, Guid? exceptSessionId = null, CancellationToken cancellationToken = default); + + Task DeleteAllAsync(Guid userId, string device, Guid? exceptSessionId = null, CancellationToken cancellationToken = default); } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs index 0dd53c5f74..9e63b8e0cc 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs @@ -1,16 +1,21 @@ using System; using System.Collections.Generic; using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.Identity; -public class IdentitySession : BasicAggregateRoot +public class IdentitySession : BasicAggregateRoot, IMultiTenant { + public virtual string SessionId { get; protected set; } + /// - /// Web, CLI, STUDIO, ... + /// Web, OAuth ... /// public virtual string Device { get; protected set; } + public virtual string DeviceInfo { get; protected set; } + public virtual Guid? TenantId { get; protected set; } public virtual Guid UserId { get; protected set; } @@ -30,16 +35,20 @@ public class IdentitySession : BasicAggregateRoot public IdentitySession( Guid id, + string sessionId, string device, + string deviceInfo, Guid userId, Guid? tenantId, string clientId, string ipAddresses, DateTime signedIn, - DateTime? lastAccessed) + DateTime? lastAccessed = null) { Id = id; + SessionId = sessionId; Device = device; + DeviceInfo = deviceInfo; UserId = userId; TenantId = tenantId; ClientId = clientId; diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySessionManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySessionManager.cs new file mode 100644 index 0000000000..012ddd87ab --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySessionManager.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; +using Volo.Abp.Users; + +namespace Volo.Abp.Identity; + +public class IdentitySessionManager : DomainService +{ + protected IIdentitySessionRepository IdentitySessionRepository { get; } + protected ICurrentUser CurrentUser { get; } + + public IdentitySessionManager(IIdentitySessionRepository identitySessionRepository, ICurrentUser currentUser) + { + IdentitySessionRepository = identitySessionRepository; + CurrentUser = currentUser; + } + + public virtual async Task CreateAsync( + string sessionId, + string device, + string deviceInfo, + Guid userId, + Guid? tenantId, + string clientId, + string ipAddresses) + { + Check.NotNullOrWhiteSpace(sessionId, nameof(sessionId)); + Check.NotNullOrWhiteSpace(device, nameof(device)); + + var session = new IdentitySession( + GuidGenerator.Create(), + sessionId, + device, + deviceInfo, + userId, + tenantId, + clientId, + ipAddresses, + Clock.Now + ); + + return await IdentitySessionRepository.InsertAsync(session); + } + + public virtual async Task UpdateAsync(IdentitySession session) + { + await IdentitySessionRepository.UpdateAsync(session); + } + + public virtual async Task> GetListAsync(Guid userId) + { + return await IdentitySessionRepository.GetListAsync(userId); + } + + public virtual async Task GetAsync(Guid id) + { + return await IdentitySessionRepository.GetAsync(id); + } + + public virtual async Task FindAsync(Guid id) + { + return await IdentitySessionRepository.FindAsync(id); + } + + public virtual async Task GetAsync(string sessionId) + { + return await IdentitySessionRepository.GetAsync(sessionId); + } + + public virtual async Task FindAsync(string sessionId) + { + return await IdentitySessionRepository.FindAsync(sessionId); + } + + public virtual async Task RevokeAsync(Guid id) + { + var session = await IdentitySessionRepository.GetAsync(id); + await IdentitySessionRepository.DeleteAsync(session); + } + + public virtual async Task RevokeAsync(string sessionId) + { + var session = await IdentitySessionRepository.GetAsync(sessionId); + await IdentitySessionRepository.DeleteAsync(session); + } + + public virtual async Task RevokeAllAsync(Guid userId, Guid? exceptSessionId = null) + { + await IdentitySessionRepository.DeleteAllAsync(userId, exceptSessionId); + } + + public virtual async Task RevokeAllAsync(Guid userId, string device, Guid? exceptSessionId = null) + { + await IdentitySessionRepository.DeleteAllAsync(userId, device, exceptSessionId); + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs index e86e57d0ee..5a583531aa 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs @@ -1,4 +1,11 @@ using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; @@ -12,4 +19,34 @@ public class EfCoreIdentitySessionRepository : EfCoreRepository FindAsync(string sessionId, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()).FirstOrDefaultAsync(x => x.SessionId == sessionId, GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetAsync(string sessionId, CancellationToken cancellationToken = default) + { + var session = await FindAsync(sessionId, cancellationToken); + if (session == null) + { + throw new EntityNotFoundException(typeof(IdentitySession)); + } + + return session; + } + + public virtual async Task> GetListAsync(Guid userId, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()).Where(x => x.UserId == userId).ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task DeleteAllAsync(Guid userId, Guid? exceptSessionId = null, CancellationToken cancellationToken = default) + { + await DeleteDirectAsync(x => x.UserId == userId && x.Id != exceptSessionId, cancellationToken); + } + + public virtual async Task DeleteAllAsync(Guid userId, string device, Guid? exceptSessionId = null, CancellationToken cancellationToken = default) + { + await DeleteDirectAsync(x => x.UserId == userId && x.Device == device && x.Id != exceptSessionId, cancellationToken); + } } diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs index 6258f1b24b..f94f4690cc 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs @@ -285,11 +285,14 @@ public static class IdentityDbContextModelBuilderExtensions b.ConfigureByConvention(); + b.Property(x => x.SessionId).HasMaxLength(IdentitySessionConsts.MaxSessionIdLength).IsRequired(); b.Property(x => x.Device).HasMaxLength(IdentitySessionConsts.MaxDeviceLength).IsRequired(); + b.Property(x => x.DeviceInfo).HasMaxLength(IdentitySessionConsts.MaxDeviceInfoLength); b.Property(x => x.ClientId).HasMaxLength(IdentitySessionConsts.MaxClientIdLength); b.Property(x => x.IpAddresses).HasMaxLength(IdentitySessionConsts.MaxIpAddressesLength); - b.HasIndex(x => new { x.Device }); + b.HasIndex(x => x.SessionId); + b.HasIndex(x => x.Device ); b.HasIndex(x => new { x.TenantId, x.UserId }); b.ApplyObjectExtensionMappings(); diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs index 9f873165a0..222d1d432b 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs @@ -1,4 +1,10 @@ using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using MongoDB.Driver; +using MongoDB.Driver.Linq; +using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.MongoDB; @@ -11,4 +17,39 @@ public class MongoIdentitySessionRepository : MongoDbRepository FindAsync(string sessionId, CancellationToken cancellationToken = default) + { + return await (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken))) + .As>() + .FirstOrDefaultAsync(x => x.SessionId == sessionId, GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetAsync(string sessionId, CancellationToken cancellationToken = default) + { + var session = await FindAsync(sessionId, cancellationToken); + if (session == null) + { + throw new EntityNotFoundException(typeof(IdentitySession)); + } + + return session; + } + + public virtual async Task> GetListAsync(Guid userId, CancellationToken cancellationToken = default) + { + return await (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken))) + .As>() + .Where(x => x.UserId == userId).ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task DeleteAllAsync(Guid userId, Guid? exceptSessionId = null, CancellationToken cancellationToken = default) + { + await DeleteDirectAsync(x => x.UserId == userId && x.Id != exceptSessionId, cancellationToken); + } + + public virtual async Task DeleteAllAsync(Guid userId, string device, Guid? exceptSessionId = null, CancellationToken cancellationToken = default) + { + await DeleteDirectAsync(x => x.UserId == userId && x.Device == device && x.Id != exceptSessionId, cancellationToken); + } } From a6610da28fda203bcadd6ec6d01ccad40e402e4c Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 21 Dec 2023 13:22:45 +0800 Subject: [PATCH 03/38] Add`SessionId` claim to `AccessToken`. --- .../Claims/AbpDefaultOpenIddictClaimsPrincipalHandler.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Claims/AbpDefaultOpenIddictClaimsPrincipalHandler.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Claims/AbpDefaultOpenIddictClaimsPrincipalHandler.cs index 7a5b3d2835..418a2c47c6 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Claims/AbpDefaultOpenIddictClaimsPrincipalHandler.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Claims/AbpDefaultOpenIddictClaimsPrincipalHandler.cs @@ -26,6 +26,12 @@ public class AbpDefaultOpenIddictClaimsPrincipalHandler : IAbpOpenIddictClaimsPr continue; } + if (claim.Type == AbpClaimTypes.SessionId) + { + claim.SetDestinations(OpenIddictConstants.Destinations.AccessToken); + continue; + } + switch (claim.Type) { case OpenIddictConstants.Claims.PreferredUsername: From 7530fd788d9905f4972eb7ca560d429e86d3329a Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 21 Dec 2023 14:50:06 +0800 Subject: [PATCH 04/38] Add `DeviceInfo` to `IWebClientInfoProvider`. --- Directory.Packages.props | 1 + .../Volo.Abp.AspNetCore.csproj | 1 + .../HttpContextWebClientInfoProvider.cs | 29 +++++++++++++++++++ .../WebClientInfo/IWebClientInfoProvider.cs | 2 ++ 4 files changed, 33 insertions(+) diff --git a/Directory.Packages.props b/Directory.Packages.props index 5dd9846a73..c155d760ae 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -26,6 +26,7 @@ + diff --git a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj index 88b4506dc5..782fa65241 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj +++ b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj @@ -30,6 +30,7 @@ + diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/HttpContextWebClientInfoProvider.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/HttpContextWebClientInfoProvider.cs index 3c44cda4e3..13b5ab070c 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/HttpContextWebClientInfoProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/HttpContextWebClientInfoProvider.cs @@ -1,4 +1,5 @@ using System; +using DeviceDetectorNET; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Volo.Abp.DependencyInjection; @@ -22,6 +23,8 @@ public class HttpContextWebClientInfoProvider : IWebClientInfoProvider, ITransie public string? ClientIpAddress => GetClientIpAddress(); + public string? DeviceInfo => GetDeviceInfo(); + protected virtual string? GetBrowserInfo() { return HttpContextAccessor.HttpContext?.Request?.Headers?["User-Agent"]; @@ -39,4 +42,30 @@ public class HttpContextWebClientInfoProvider : IWebClientInfoProvider, ITransie return null; } } + + protected virtual string? GetDeviceInfo() + { + string? deviceInfo = null; + var deviceDetector = new DeviceDetector(GetBrowserInfo()); + deviceDetector.Parse(); + if (!deviceDetector.IsParsed()) + { + return deviceInfo; + } + + var osInfo = deviceDetector.GetOs(); + if (osInfo.Success) + { + deviceInfo = osInfo.Match.Name; + } + + var clientInfo = deviceDetector.GetClient(); + if (clientInfo.Success) + { + deviceInfo = deviceInfo.IsNullOrWhiteSpace() ? clientInfo.Match.Name : deviceInfo + " " + clientInfo.Match.Name; + } + + return deviceInfo; + } + } diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/IWebClientInfoProvider.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/IWebClientInfoProvider.cs index abd92597d3..7cbb4ecae8 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/IWebClientInfoProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/IWebClientInfoProvider.cs @@ -5,4 +5,6 @@ public interface IWebClientInfoProvider string? BrowserInfo { get; } string? ClientIpAddress { get; } + + string? DeviceInfo { get; } } From c0ede6ef3a6db36741a8726630cef2042f396e2d Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 22 Dec 2023 14:43:55 +0800 Subject: [PATCH 05/38] Add `IdentitySessionEto`. --- .../Volo/Abp/Identity/IdentitySessionEto.cs | 31 +++++++++++++++++++ .../Abp/Identity/AbpIdentityDomainModule.cs | 1 + .../Identity/IdentityDomainMappingProfile.cs | 1 + 3 files changed, 33 insertions(+) create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionEto.cs diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionEto.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionEto.cs new file mode 100644 index 0000000000..9b251c2bc9 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionEto.cs @@ -0,0 +1,31 @@ +using System; +using Volo.Abp.Auditing; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.Identity; + +[Serializable] +public class IdentitySessionEto : IMultiTenant, IHasEntityVersion +{ + public Guid Id { get; set; } + + public virtual string SessionId { get; set; } + + public virtual string Device { get; set; } + + public virtual string DeviceInfo { get; set; } + + public virtual Guid? TenantId { get; set; } + + public virtual Guid UserId { get; set; } + + public virtual string ClientId { get; set; } + + public virtual string IpAddresses { get; set; } + + public virtual DateTime SignedIn { get; set; } + + public virtual DateTime? LastAccessed { get; set; } + + public int EntityVersion { get; set; } +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs index 49f353153b..ea60ec4b82 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs @@ -48,6 +48,7 @@ public class AbpIdentityDomainModule : AbpModule options.EtoMappings.Add(typeof(AbpIdentityDomainModule)); options.EtoMappings.Add(typeof(AbpIdentityDomainModule)); options.EtoMappings.Add(typeof(AbpIdentityDomainModule)); + options.EtoMappings.Add(typeof(AbpIdentityDomainModule)); options.AutoEventSelectors.Add(); options.AutoEventSelectors.Add(); diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDomainMappingProfile.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDomainMappingProfile.cs index ae9e5b5065..0dbe37984e 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDomainMappingProfile.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDomainMappingProfile.cs @@ -11,5 +11,6 @@ public class IdentityDomainMappingProfile : Profile CreateMap(); CreateMap(); CreateMap(); + CreateMap(); } } From 87473132d7e1064fdfe46f3d19cd67d7a19a0470 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 22 Dec 2023 14:52:15 +0800 Subject: [PATCH 06/38] Delete IdentitySessionManager.cs --- .../Abp/Identity/IdentitySessionManager.cs | 98 ------------------- 1 file changed, 98 deletions(-) delete mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySessionManager.cs diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySessionManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySessionManager.cs deleted file mode 100644 index 012ddd87ab..0000000000 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySessionManager.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Volo.Abp.Domain.Services; -using Volo.Abp.Users; - -namespace Volo.Abp.Identity; - -public class IdentitySessionManager : DomainService -{ - protected IIdentitySessionRepository IdentitySessionRepository { get; } - protected ICurrentUser CurrentUser { get; } - - public IdentitySessionManager(IIdentitySessionRepository identitySessionRepository, ICurrentUser currentUser) - { - IdentitySessionRepository = identitySessionRepository; - CurrentUser = currentUser; - } - - public virtual async Task CreateAsync( - string sessionId, - string device, - string deviceInfo, - Guid userId, - Guid? tenantId, - string clientId, - string ipAddresses) - { - Check.NotNullOrWhiteSpace(sessionId, nameof(sessionId)); - Check.NotNullOrWhiteSpace(device, nameof(device)); - - var session = new IdentitySession( - GuidGenerator.Create(), - sessionId, - device, - deviceInfo, - userId, - tenantId, - clientId, - ipAddresses, - Clock.Now - ); - - return await IdentitySessionRepository.InsertAsync(session); - } - - public virtual async Task UpdateAsync(IdentitySession session) - { - await IdentitySessionRepository.UpdateAsync(session); - } - - public virtual async Task> GetListAsync(Guid userId) - { - return await IdentitySessionRepository.GetListAsync(userId); - } - - public virtual async Task GetAsync(Guid id) - { - return await IdentitySessionRepository.GetAsync(id); - } - - public virtual async Task FindAsync(Guid id) - { - return await IdentitySessionRepository.FindAsync(id); - } - - public virtual async Task GetAsync(string sessionId) - { - return await IdentitySessionRepository.GetAsync(sessionId); - } - - public virtual async Task FindAsync(string sessionId) - { - return await IdentitySessionRepository.FindAsync(sessionId); - } - - public virtual async Task RevokeAsync(Guid id) - { - var session = await IdentitySessionRepository.GetAsync(id); - await IdentitySessionRepository.DeleteAsync(session); - } - - public virtual async Task RevokeAsync(string sessionId) - { - var session = await IdentitySessionRepository.GetAsync(sessionId); - await IdentitySessionRepository.DeleteAsync(session); - } - - public virtual async Task RevokeAllAsync(Guid userId, Guid? exceptSessionId = null) - { - await IdentitySessionRepository.DeleteAllAsync(userId, exceptSessionId); - } - - public virtual async Task RevokeAllAsync(Guid userId, string device, Guid? exceptSessionId = null) - { - await IdentitySessionRepository.DeleteAllAsync(userId, device, exceptSessionId); - } -} From 8d3e9c635e268621d193f12d1d204a1afd1469d0 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 26 Dec 2023 10:47:07 +0800 Subject: [PATCH 07/38] Remove `IHasEntityVersion` from `IdentitySessionEto`. --- .../Volo/Abp/Identity/IdentitySessionEto.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionEto.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionEto.cs index 9b251c2bc9..16633df847 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionEto.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionEto.cs @@ -5,7 +5,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.Identity; [Serializable] -public class IdentitySessionEto : IMultiTenant, IHasEntityVersion +public class IdentitySessionEto : IMultiTenant { public Guid Id { get; set; } @@ -26,6 +26,4 @@ public class IdentitySessionEto : IMultiTenant, IHasEntityVersion public virtual DateTime SignedIn { get; set; } public virtual DateTime? LastAccessed { get; set; } - - public int EntityVersion { get; set; } } From bf0f2ee72870878ebb6a72cc3a759a51971729ac Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 26 Dec 2023 15:07:52 +0800 Subject: [PATCH 08/38] Remove `IdentitySessionEto` class. --- .../Volo/Abp/Identity/IdentitySessionEto.cs | 29 ------------------- .../Abp/Identity/AbpIdentityDomainModule.cs | 1 - .../Identity/IdentityDomainMappingProfile.cs | 1 - 3 files changed, 31 deletions(-) delete mode 100644 modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionEto.cs diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionEto.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionEto.cs deleted file mode 100644 index 16633df847..0000000000 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionEto.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using Volo.Abp.Auditing; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Identity; - -[Serializable] -public class IdentitySessionEto : IMultiTenant -{ - public Guid Id { get; set; } - - public virtual string SessionId { get; set; } - - public virtual string Device { get; set; } - - public virtual string DeviceInfo { get; set; } - - public virtual Guid? TenantId { get; set; } - - public virtual Guid UserId { get; set; } - - public virtual string ClientId { get; set; } - - public virtual string IpAddresses { get; set; } - - public virtual DateTime SignedIn { get; set; } - - public virtual DateTime? LastAccessed { get; set; } -} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs index ea60ec4b82..49f353153b 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs @@ -48,7 +48,6 @@ public class AbpIdentityDomainModule : AbpModule options.EtoMappings.Add(typeof(AbpIdentityDomainModule)); options.EtoMappings.Add(typeof(AbpIdentityDomainModule)); options.EtoMappings.Add(typeof(AbpIdentityDomainModule)); - options.EtoMappings.Add(typeof(AbpIdentityDomainModule)); options.AutoEventSelectors.Add(); options.AutoEventSelectors.Add(); diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDomainMappingProfile.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDomainMappingProfile.cs index 0dbe37984e..ae9e5b5065 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDomainMappingProfile.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDomainMappingProfile.cs @@ -11,6 +11,5 @@ public class IdentityDomainMappingProfile : Profile CreateMap(); CreateMap(); CreateMap(); - CreateMap(); } } From 76b86ddec0410e453cce318c57b434f02303a553 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 26 Dec 2023 17:06:44 +0800 Subject: [PATCH 09/38] Update AbpDynamicClaimsMiddleware.cs --- .../Claims/AbpDynamicClaimsMiddleware.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/AbpDynamicClaimsMiddleware.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/AbpDynamicClaimsMiddleware.cs index 777ca7744a..f7b6e67111 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/AbpDynamicClaimsMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/AbpDynamicClaimsMiddleware.cs @@ -1,4 +1,6 @@ +using System; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -15,8 +17,26 @@ public class AbpDynamicClaimsMiddleware : IMiddleware, ITransientDependency { if (context.RequestServices.GetRequiredService>().Value.IsDynamicClaimsEnabled) { + var authenticationType = context.User.Identity.AuthenticationType; var abpClaimsPrincipalFactory = context.RequestServices.GetRequiredService(); context.User = await abpClaimsPrincipalFactory.CreateDynamicAsync(context.User); + + if (context.User.Identity?.IsAuthenticated == false) + { + if (!authenticationType.IsNullOrWhiteSpace()) + { + var authenticationSchemeProvider = context.RequestServices.GetRequiredService(); + var scheme = await authenticationSchemeProvider.GetSchemeAsync(authenticationType); + if (scheme != null) + { + await context.SignOutAsync(scheme.Name); + } + } + else + { + await context.SignOutAsync(); + } + } } } From e26c32e2a459a6fd38719e3129b23043d2b06a35 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 28 Dec 2023 17:55:36 +0800 Subject: [PATCH 10/38] Add `GetListAsync` and `GetCountAsync ` to `IIdentitySessionRepository `. --- .../IIdentitySecurityLogRepository.cs | 2 +- .../Identity/IIdentitySessionRepository.cs | 15 ++++++++- .../AbpIdentityEntityFrameworkCoreModule.cs | 2 +- ...=> EfCoreIdentitySecurityLogRepository.cs} | 6 ++-- .../EfCoreIdentitySessionRepository.cs | 30 +++++++++++++++-- .../MongoIdentitySecurityLogRepository.cs | 2 +- .../MongoDB/MongoIdentitySessionRepository.cs | 32 +++++++++++++++++-- 7 files changed, 78 insertions(+), 11 deletions(-) rename modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/{EFCoreIdentitySecurityLogRepository.cs => EfCoreIdentitySecurityLogRepository.cs} (96%) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySecurityLogRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySecurityLogRepository.cs index 2ceaa8ed4c..8a1e50795f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySecurityLogRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySecurityLogRepository.cs @@ -10,7 +10,7 @@ public interface IIdentitySecurityLogRepository : IBasicRepository> GetListAsync( string sorting = null, - int maxResultCount = 50, + int maxResultCount = int.MaxValue, int skipCount = 0, DateTime? startTime = null, DateTime? endTime = null, diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs index b425b24c33..7c1af6937c 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs @@ -12,7 +12,20 @@ public interface IIdentitySessionRepository : IBasicRepository GetAsync(string sessionId, CancellationToken cancellationToken = default); - Task> GetListAsync(Guid userId, CancellationToken cancellationToken = default); + Task> GetListAsync( + string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + Guid? userId = null, + string device = null, + string clientId = null, + CancellationToken cancellationToken = default); + + Task GetCountAsync( + Guid? userId = null, + string device = null, + string clientId = null, + CancellationToken cancellationToken = default); Task DeleteAllAsync(Guid userId, Guid? exceptSessionId = null, CancellationToken cancellationToken = default); diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs index 16433977d7..c9dcc70e68 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs @@ -17,7 +17,7 @@ public class AbpIdentityEntityFrameworkCoreModule : AbpModule options.AddRepository(); options.AddRepository(); options.AddRepository(); - options.AddRepository(); + options.AddRepository(); options.AddRepository(); options.AddRepository(); options.AddRepository(); diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EFCoreIdentitySecurityLogRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySecurityLogRepository.cs similarity index 96% rename from modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EFCoreIdentitySecurityLogRepository.cs rename to modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySecurityLogRepository.cs index 0e5c2a9b4c..2043293395 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EFCoreIdentitySecurityLogRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySecurityLogRepository.cs @@ -10,9 +10,9 @@ using Volo.Abp.EntityFrameworkCore; namespace Volo.Abp.Identity.EntityFrameworkCore; -public class EFCoreIdentitySecurityLogRepository : EfCoreRepository, IIdentitySecurityLogRepository +public class EfCoreIdentitySecurityLogRepository : EfCoreRepository, IIdentitySecurityLogRepository { - public EFCoreIdentitySecurityLogRepository(IDbContextProvider dbContextProvider) + public EfCoreIdentitySecurityLogRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) { @@ -20,7 +20,7 @@ public class EFCoreIdentitySecurityLogRepository : EfCoreRepository> GetListAsync( string sorting = null, - int maxResultCount = 50, + int maxResultCount = int.MaxValue, int skipCount = 0, DateTime? startTime = null, DateTime? endTime = null, diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs index 5a583531aa..1b39ecef29 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs @@ -35,9 +35,35 @@ public class EfCoreIdentitySessionRepository : EfCoreRepository> GetListAsync(Guid userId, CancellationToken cancellationToken = default) + public virtual async Task> GetListAsync( + string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + Guid? userId = null, + string device = null, + string clientId = null, + CancellationToken cancellationToken = default) { - return await (await GetDbSetAsync()).Where(x => x.UserId == userId).ToListAsync(GetCancellationToken(cancellationToken)); + return await (await GetDbSetAsync()) + .WhereIf(userId.HasValue, x => x.UserId == userId) + .WhereIf(!device.IsNullOrWhiteSpace(), x => x.Device == device) + .WhereIf(!clientId.IsNullOrWhiteSpace(), x => x.ClientId == clientId) + .OrderBy(sorting.IsNullOrWhiteSpace() ? $"{nameof(IdentitySession.LastAccessed)} desc" : sorting) + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetCountAsync( + Guid? userId = null, + string device = null, + string clientId = null, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .WhereIf(userId.HasValue, x => x.UserId == userId) + .WhereIf(!device.IsNullOrWhiteSpace(), x => x.Device == device) + .WhereIf(!clientId.IsNullOrWhiteSpace(), x => x.ClientId == clientId) + .LongCountAsync(GetCancellationToken(cancellationToken)); } public virtual async Task DeleteAllAsync(Guid userId, Guid? exceptSessionId = null, CancellationToken cancellationToken = default) diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySecurityLogRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySecurityLogRepository.cs index de5587d8d9..6a875444f9 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySecurityLogRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySecurityLogRepository.cs @@ -21,7 +21,7 @@ public class MongoIdentitySecurityLogRepository : public virtual async Task> GetListAsync( string sorting = null, - int maxResultCount = 50, + int maxResultCount = int.MaxValue, int skipCount = 0, DateTime? startTime = null, DateTime? endTime = null, diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs index 222d1d432b..3ce5cf6bf6 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; using System.Threading; using System.Threading.Tasks; using MongoDB.Driver; @@ -36,11 +38,37 @@ public class MongoIdentitySessionRepository : MongoDbRepository> GetListAsync(Guid userId, CancellationToken cancellationToken = default) + public virtual async Task> GetListAsync( + string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + Guid? userId = null, + string device = null, + string clientId = null, + CancellationToken cancellationToken = default) { return await (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken))) + .WhereIf(userId.HasValue, x => x.UserId == userId) + .WhereIf(!device.IsNullOrWhiteSpace(), x => x.Device == device) + .WhereIf(!clientId.IsNullOrWhiteSpace(), x => x.ClientId == clientId) + .OrderBy(sorting.IsNullOrWhiteSpace() ? $"{nameof(IdentitySession.LastAccessed)} desc" : sorting) + .PageBy(skipCount, maxResultCount) .As>() - .Where(x => x.UserId == userId).ToListAsync(GetCancellationToken(cancellationToken)); + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetCountAsync( + Guid? userId = null, + string device = null, + string clientId = null, + CancellationToken cancellationToken = default) + { + return await (await GetMongoQueryableAsync(GetCancellationToken(cancellationToken))) + .WhereIf(userId.HasValue, x => x.UserId == userId) + .WhereIf(!device.IsNullOrWhiteSpace(), x => x.Device == device) + .WhereIf(!clientId.IsNullOrWhiteSpace(), x => x.ClientId == clientId) + .As>() + .LongCountAsync(GetCancellationToken(cancellationToken)); } public virtual async Task DeleteAllAsync(Guid userId, Guid? exceptSessionId = null, CancellationToken cancellationToken = default) From 6755be0796705828c8f912f8de62f0e96fdefd60 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 6 Mar 2024 10:48:04 +0800 Subject: [PATCH 11/38] Add `AbpRefreshingPrincipalOptions`. --- .../AspNetCore/AbpIdentityAspNetCoreModule.cs | 14 +++++++++----- .../AspNetCore/AbpRefreshingPrincipalOptions.cs | 17 +++++++++++++++++ .../AbpSecurityStampValidatorCallback.cs | 17 ++++++++++++++++- .../SecurityStampValidatorOptionsExtensions.cs | 4 ++-- 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpRefreshingPrincipalOptions.cs diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreModule.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreModule.cs index 9b38e2e25a..d261068adb 100644 --- a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreModule.cs @@ -1,5 +1,7 @@ -using Microsoft.AspNetCore.Identity; +using System; +using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Volo.Abp.Modularity; using static Volo.Abp.Identity.AspNetCore.AbpSecurityStampValidatorCallback; @@ -45,9 +47,11 @@ public class AbpIdentityAspNetCoreModule : AbpModule public override void PostConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.UpdatePrincipal(); - }); + context.Services.AddOptions() + .Configure((securityStampValidatorOptions, serviceProvider) => + { + var abpRefreshingPrincipalOptions = serviceProvider.GetRequiredService>().Value; + securityStampValidatorOptions.UpdatePrincipal(abpRefreshingPrincipalOptions); + }); } } diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpRefreshingPrincipalOptions.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpRefreshingPrincipalOptions.cs new file mode 100644 index 0000000000..55e9007d6c --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpRefreshingPrincipalOptions.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using Volo.Abp.Security.Claims; + +namespace Volo.Abp.Identity.AspNetCore; + +public class AbpRefreshingPrincipalOptions +{ + public List CurrentPrincipalKeepClaimTypes { get; set; } + + public AbpRefreshingPrincipalOptions() + { + CurrentPrincipalKeepClaimTypes = new List + { + AbpClaimTypes.SessionId + }; + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSecurityStampValidatorCallback.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSecurityStampValidatorCallback.cs index 63bed70dfd..7108d30a5b 100644 --- a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSecurityStampValidatorCallback.cs +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSecurityStampValidatorCallback.cs @@ -1,5 +1,7 @@ using System.Linq; +using System.Security.Principal; using System.Threading.Tasks; +using JetBrains.Annotations; using Microsoft.AspNetCore.Identity; namespace Volo.Abp.Identity.AspNetCore; @@ -17,8 +19,9 @@ public class AbpSecurityStampValidatorCallback /// This is needed to preserve claims such as idp, auth_time, amr. /// /// The context. + /// The AbpRefreshingPrincipalOptions. /// - public static Task UpdatePrincipal(SecurityStampRefreshingPrincipalContext context) + public static Task UpdatePrincipal(SecurityStampRefreshingPrincipalContext context, AbpRefreshingPrincipalOptions refreshingPrincipalOptions) { var newClaimTypes = context.NewPrincipal.Claims.Select(x => x.Type).ToArray(); var currentClaimsToKeep = context.CurrentPrincipal.Claims.Where(x => !newClaimTypes.Contains(x.Type)).ToArray(); @@ -26,6 +29,18 @@ public class AbpSecurityStampValidatorCallback var id = context.NewPrincipal.Identities.First(); id.AddClaims(currentClaimsToKeep); + if (refreshingPrincipalOptions.CurrentPrincipalKeepClaimTypes.Any()) + { + foreach (var claimType in refreshingPrincipalOptions.CurrentPrincipalKeepClaimTypes) + { + var sessionIdClaim = context.CurrentPrincipal.Claims.FirstOrDefault(x => x.Type == claimType); + if (sessionIdClaim != null) + { + id.AddOrReplace(sessionIdClaim); + } + } + } + return Task.CompletedTask; } } diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/SecurityStampValidatorOptionsExtensions.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/SecurityStampValidatorOptionsExtensions.cs index d1c51fbf41..009e170310 100644 --- a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/SecurityStampValidatorOptionsExtensions.cs +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/SecurityStampValidatorOptionsExtensions.cs @@ -5,12 +5,12 @@ namespace Volo.Abp.Identity.AspNetCore; public static class SecurityStampValidatorOptionsExtensions { - public static SecurityStampValidatorOptions UpdatePrincipal(this SecurityStampValidatorOptions options) + public static SecurityStampValidatorOptions UpdatePrincipal(this SecurityStampValidatorOptions options, AbpRefreshingPrincipalOptions abpRefreshingPrincipalOptions) { var previousOnRefreshingPrincipal = options.OnRefreshingPrincipal; options.OnRefreshingPrincipal = async context => { - await SecurityStampValidatorCallback.UpdatePrincipal(context); + await SecurityStampValidatorCallback.UpdatePrincipal(context, abpRefreshingPrincipalOptions); if(previousOnRefreshingPrincipal != null) { await previousOnRefreshingPrincipal.Invoke(context); From ccdd3aef154d0c5b5880c31470ce5aeab5d14f22 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 6 Mar 2024 11:21:23 +0800 Subject: [PATCH 12/38] Rename `OAuth ` to `Mobile`. --- .../Volo/Abp/Identity/IdentitySessionDevices.cs | 2 +- .../Volo/Abp/Identity/IdentitySession.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionDevices.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionDevices.cs index 989841d034..40d5f79baf 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionDevices.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionDevices.cs @@ -4,5 +4,5 @@ public static class IdentitySessionDevices { public const string Web = "Web"; - public const string OAuth = "OAuth"; + public const string Mobile = "Mobile"; } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs index 9e63b8e0cc..c25a6b2e82 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentitySession.cs @@ -10,7 +10,7 @@ public class IdentitySession : BasicAggregateRoot, IMultiTenant public virtual string SessionId { get; protected set; } /// - /// Web, OAuth ... + /// Web, Mobile ... /// public virtual string Device { get; protected set; } From ed4f5793d7d0f6b5abce33357a7ca326342936f1 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 6 Mar 2024 19:09:31 +0800 Subject: [PATCH 13/38] Use `DeleteAsync` instead of `DeleteDirectAsync`. --- .../EntityFrameworkCore/EfCoreIdentitySessionRepository.cs | 4 ++-- .../Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs index 1b39ecef29..81a7cde839 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs @@ -68,11 +68,11 @@ public class EfCoreIdentitySessionRepository : EfCoreRepository x.UserId == userId && x.Id != exceptSessionId, cancellationToken); + await DeleteAsync(x => x.UserId == userId && x.Id != exceptSessionId, cancellationToken: cancellationToken); } public virtual async Task DeleteAllAsync(Guid userId, string device, Guid? exceptSessionId = null, CancellationToken cancellationToken = default) { - await DeleteDirectAsync(x => x.UserId == userId && x.Device == device && x.Id != exceptSessionId, cancellationToken); + await DeleteAsync(x => x.UserId == userId && x.Device == device && x.Id != exceptSessionId, cancellationToken: cancellationToken); } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs index 3ce5cf6bf6..65906d42c5 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs @@ -73,11 +73,11 @@ public class MongoIdentitySessionRepository : MongoDbRepository x.UserId == userId && x.Id != exceptSessionId, cancellationToken); + await DeleteAsync(x => x.UserId == userId && x.Id != exceptSessionId, cancellationToken: cancellationToken); } public virtual async Task DeleteAllAsync(Guid userId, string device, Guid? exceptSessionId = null, CancellationToken cancellationToken = default) { - await DeleteDirectAsync(x => x.UserId == userId && x.Device == device && x.Id != exceptSessionId, cancellationToken); + await DeleteAsync(x => x.UserId == userId && x.Device == device && x.Id != exceptSessionId, cancellationToken: cancellationToken); } } From cce2ffde8f158bf000424faa9b9a7a2e0b6ace75 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 6 Mar 2024 19:47:13 +0800 Subject: [PATCH 14/38] Add new `DeleteAllAsync` method to `IIdentitySessionRepository`. --- .../Volo/Abp/Identity/IIdentitySessionRepository.cs | 2 ++ .../EntityFrameworkCore/EfCoreIdentitySessionRepository.cs | 5 +++++ .../Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs index 7c1af6937c..d40fbbcc95 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentitySessionRepository.cs @@ -30,4 +30,6 @@ public interface IIdentitySessionRepository : IBasicRepository x.UserId == userId && x.Device == device && x.Id != exceptSessionId, cancellationToken: cancellationToken); } + + public virtual async Task DeleteAllAsync(TimeSpan inactiveTimeSpan, CancellationToken cancellationToken = default) + { + await DeleteDirectAsync(x => x.LastAccessed == null || x.LastAccessed < DateTime.UtcNow.Subtract(inactiveTimeSpan), cancellationToken: cancellationToken); + } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs index 65906d42c5..0ef4afd8da 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs @@ -80,4 +80,9 @@ public class MongoIdentitySessionRepository : MongoDbRepository x.UserId == userId && x.Device == device && x.Id != exceptSessionId, cancellationToken: cancellationToken); } + + public virtual async Task DeleteAllAsync(TimeSpan inactiveTimeSpan, CancellationToken cancellationToken = default) + { + await DeleteDirectAsync(x => x.LastAccessed == null || x.LastAccessed < DateTime.UtcNow.Subtract(inactiveTimeSpan), cancellationToken: cancellationToken); + } } From ce7f84461ecb077f9b7803bc82c968f93cf201d8 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 7 Mar 2024 13:44:00 +0800 Subject: [PATCH 15/38] Using `string` as session id. --- .../Principal/AbpClaimsIdentityExtensions.cs | 9 ++------- .../Volo/Abp/Users/CurrentUserExtensions.cs | 18 ++++-------------- .../EfCoreIdentitySessionRepository.cs | 4 +++- .../MongoDB/MongoIdentitySessionRepository.cs | 4 +++- ...pDefaultOpenIddictClaimsPrincipalHandler.cs | 2 +- 5 files changed, 13 insertions(+), 24 deletions(-) diff --git a/framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs b/framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs index 6f950524f3..0a89ba7a3f 100644 --- a/framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs +++ b/framework/src/Volo.Abp.Security/System/Security/Principal/AbpClaimsIdentityExtensions.cs @@ -277,7 +277,7 @@ public static class AbpClaimsIdentityExtensions return principal; } - public static Guid? FindSessionId([NotNull] this IIdentity identity) + public static string? FindSessionId([NotNull] this IIdentity identity) { Check.NotNull(identity, nameof(identity)); @@ -289,12 +289,7 @@ public static class AbpClaimsIdentityExtensions return null; } - if (Guid.TryParse(sessionIdOrNull.Value, out var guid)) - { - return guid; - } - - return null; + return sessionIdOrNull.Value; } public static string? FindSessionId([NotNull] this ClaimsPrincipal principal) diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentUserExtensions.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentUserExtensions.cs index 3007cc95c3..e40c9a9fd7 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentUserExtensions.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Users/CurrentUserExtensions.cs @@ -71,25 +71,15 @@ public static class CurrentUserExtensions return currentUser.FindClaimValue(AbpClaimTypes.ImpersonatorUserName); } - public static Guid GetSessionId([NotNull] this ICurrentUser currentUser) + public static string GetSessionId([NotNull] this ICurrentUser currentUser) { var sessionId = currentUser.FindSessionId(); Debug.Assert(sessionId != null, "sessionId != null"); - return sessionId!.Value; + return sessionId!; } - public static Guid? FindSessionId([NotNull] this ICurrentUser currentUser) + public static string? FindSessionId([NotNull] this ICurrentUser currentUser) { - var sessionId = currentUser.FindClaimValue(AbpClaimTypes.SessionId); - if (sessionId.IsNullOrWhiteSpace()) - { - return null; - } - if (Guid.TryParse(sessionId, out var guid)) - { - return guid; - } - - return null; + return currentUser.FindClaimValue(AbpClaimTypes.SessionId); } } diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs index c8deec244b..222ecf5886 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentitySessionRepository.cs @@ -8,6 +8,7 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Timing; namespace Volo.Abp.Identity.EntityFrameworkCore; @@ -78,6 +79,7 @@ public class EfCoreIdentitySessionRepository : EfCoreRepository x.LastAccessed == null || x.LastAccessed < DateTime.UtcNow.Subtract(inactiveTimeSpan), cancellationToken: cancellationToken); + var now = LazyServiceProvider.LazyGetRequiredService().Now; + await DeleteDirectAsync(x => x.LastAccessed == null || x.LastAccessed < now.Subtract(inactiveTimeSpan), cancellationToken: cancellationToken); } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs index 0ef4afd8da..957699d4d7 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentitySessionRepository.cs @@ -9,6 +9,7 @@ using MongoDB.Driver.Linq; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.MongoDB; +using Volo.Abp.Timing; namespace Volo.Abp.Identity.MongoDB; @@ -83,6 +84,7 @@ public class MongoIdentitySessionRepository : MongoDbRepository x.LastAccessed == null || x.LastAccessed < DateTime.UtcNow.Subtract(inactiveTimeSpan), cancellationToken: cancellationToken); + var now = LazyServiceProvider.LazyGetRequiredService().Now; + await DeleteDirectAsync(x => x.LastAccessed == null || x.LastAccessed < now.Subtract(inactiveTimeSpan), cancellationToken: cancellationToken); } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Claims/AbpDefaultOpenIddictClaimsPrincipalHandler.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Claims/AbpDefaultOpenIddictClaimsPrincipalHandler.cs index 418a2c47c6..370b23a856 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Claims/AbpDefaultOpenIddictClaimsPrincipalHandler.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Claims/AbpDefaultOpenIddictClaimsPrincipalHandler.cs @@ -28,7 +28,7 @@ public class AbpDefaultOpenIddictClaimsPrincipalHandler : IAbpOpenIddictClaimsPr if (claim.Type == AbpClaimTypes.SessionId) { - claim.SetDestinations(OpenIddictConstants.Destinations.AccessToken); + claim.SetDestinations(OpenIddictConstants.Destinations.AccessToken, OpenIddictConstants.Destinations.IdentityToken); continue; } From 1c98230d649af2dc37d9bb0e4c78c88e0698272c Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 7 Mar 2024 14:41:43 +0800 Subject: [PATCH 16/38] Update template migrations. --- ....cs => 20240307063834_Initial.Designer.cs} | 2 +- ...2_Initial.cs => 20240307063834_Initial.cs} | 0 ....cs => 20240307064033_Initial.Designer.cs} | 2 +- ...0_Initial.cs => 20240307064033_Initial.cs} | 0 .../20240221053113_Initial.Designer.cs | 1959 ----------------- .../Migrations/20240221053113_Initial.cs | 1131 ---------- .../MyProjectNameDbContextModelSnapshot.cs | 1956 ---------------- ....cs => 20240307063806_Initial.Designer.cs} | 2 +- ...0_Initial.cs => 20240307063806_Initial.cs} | 0 ....cs => 20240307063923_Initial.Designer.cs} | 2 +- ...8_Initial.cs => 20240307063923_Initial.cs} | 0 ....cs => 20240307063902_Initial.Designer.cs} | 2 +- ...1_Initial.cs => 20240307063902_Initial.cs} | 0 ....cs => 20240307063939_Initial.Designer.cs} | 2 +- ...1_Initial.cs => 20240307063939_Initial.cs} | 0 ....cs => 20240307064001_Initial.Designer.cs} | 2 +- ...8_Initial.cs => 20240307064001_Initial.cs} | 0 17 files changed, 7 insertions(+), 5053 deletions(-) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/{20240221053152_Initial.Designer.cs => 20240307063834_Initial.Designer.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/{20240221053152_Initial.cs => 20240307063834_Initial.cs} (100%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/{20240221053320_Initial.Designer.cs => 20240307064033_Initial.Designer.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/{20240221053320_Initial.cs => 20240307064033_Initial.cs} (100%) delete mode 100644 templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240221053113_Initial.Designer.cs delete mode 100644 templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240221053113_Initial.cs delete mode 100644 templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/{20240221053130_Initial.Designer.cs => 20240307063806_Initial.Designer.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/{20240221053130_Initial.cs => 20240307063806_Initial.cs} (100%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/{20240221053228_Initial.Designer.cs => 20240307063923_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/{20240221053228_Initial.cs => 20240307063923_Initial.cs} (100%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/{20240221053211_Initial.Designer.cs => 20240307063902_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/{20240221053211_Initial.cs => 20240307063902_Initial.cs} (100%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/{20240221053241_Initial.Designer.cs => 20240307063939_Initial.Designer.cs} (96%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/{20240221053241_Initial.cs => 20240307063939_Initial.cs} (100%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20240221053258_Initial.Designer.cs => 20240307064001_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20240221053258_Initial.cs => 20240307064001_Initial.cs} (100%) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240221053152_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240307063834_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240221053152_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240307063834_Initial.Designer.cs index ff9207e631..1dcec924bb 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240221053152_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240307063834_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20240221053152_Initial")] + [Migration("20240307063834_Initial")] partial class Initial { /// diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240221053152_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240307063834_Initial.cs similarity index 100% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240221053152_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240307063834_Initial.cs diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240221053320_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240307064033_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240221053320_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240307064033_Initial.Designer.cs index 0e4661692c..86cef13c23 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240221053320_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240307064033_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20240221053320_Initial")] + [Migration("20240307064033_Initial")] partial class Initial { /// diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240221053320_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240307064033_Initial.cs similarity index 100% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240221053320_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240307064033_Initial.cs diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240221053113_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240221053113_Initial.Designer.cs deleted file mode 100644 index 1d5b08c79d..0000000000 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240221053113_Initial.Designer.cs +++ /dev/null @@ -1,1959 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyCompanyName.MyProjectName.Data; -using Volo.Abp.EntityFrameworkCore; - -#nullable disable - -namespace MyCompanyName.MyProjectName.Host.Migrations -{ - [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20240221053113_Initial")] - partial class Initial - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ApplicationName") - .HasMaxLength(96) - .HasColumnType("nvarchar(96)") - .HasColumnName("ApplicationName"); - - b.Property("BrowserInfo") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)") - .HasColumnName("BrowserInfo"); - - b.Property("ClientId") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("ClientId"); - - b.Property("ClientIpAddress") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("ClientIpAddress"); - - b.Property("ClientName") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)") - .HasColumnName("ClientName"); - - b.Property("Comments") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("Comments"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CorrelationId") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("CorrelationId"); - - b.Property("Exceptions") - .HasColumnType("nvarchar(max)"); - - b.Property("ExecutionDuration") - .HasColumnType("int") - .HasColumnName("ExecutionDuration"); - - b.Property("ExecutionTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("HttpMethod") - .HasMaxLength(16) - .HasColumnType("nvarchar(16)") - .HasColumnName("HttpMethod"); - - b.Property("HttpStatusCode") - .HasColumnType("int") - .HasColumnName("HttpStatusCode"); - - b.Property("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("ImpersonatorTenantId"); - - b.Property("ImpersonatorTenantName") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("ImpersonatorTenantName"); - - b.Property("ImpersonatorUserId") - .HasColumnType("uniqueidentifier") - .HasColumnName("ImpersonatorUserId"); - - b.Property("ImpersonatorUserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("ImpersonatorUserName"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("TenantName") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("TenantName"); - - b.Property("Url") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("Url"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier") - .HasColumnName("UserId"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("UserName"); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "ExecutionTime"); - - b.HasIndex("TenantId", "UserId", "ExecutionTime"); - - b.ToTable("AbpAuditLogs", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AuditLogId") - .HasColumnType("uniqueidentifier") - .HasColumnName("AuditLogId"); - - b.Property("ExecutionDuration") - .HasColumnType("int") - .HasColumnName("ExecutionDuration"); - - b.Property("ExecutionTime") - .HasColumnType("datetime2") - .HasColumnName("ExecutionTime"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("MethodName") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)") - .HasColumnName("MethodName"); - - b.Property("Parameters") - .HasMaxLength(2000) - .HasColumnType("nvarchar(2000)") - .HasColumnName("Parameters"); - - b.Property("ServiceName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("ServiceName"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("AuditLogId"); - - b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); - - b.ToTable("AbpAuditLogActions", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AuditLogId") - .HasColumnType("uniqueidentifier") - .HasColumnName("AuditLogId"); - - b.Property("ChangeTime") - .HasColumnType("datetime2") - .HasColumnName("ChangeTime"); - - b.Property("ChangeType") - .HasColumnType("tinyint") - .HasColumnName("ChangeType"); - - b.Property("EntityId") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)") - .HasColumnName("EntityId"); - - b.Property("EntityTenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("EntityTypeFullName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)") - .HasColumnName("EntityTypeFullName"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("AuditLogId"); - - b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); - - b.ToTable("AbpEntityChanges", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("EntityChangeId") - .HasColumnType("uniqueidentifier"); - - b.Property("NewValue") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)") - .HasColumnName("NewValue"); - - b.Property("OriginalValue") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)") - .HasColumnName("OriginalValue"); - - b.Property("PropertyName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)") - .HasColumnName("PropertyName"); - - b.Property("PropertyTypeFullName") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("PropertyTypeFullName"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("EntityChangeId"); - - b.ToTable("AbpEntityPropertyChanges", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AllowedProviders") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("DefaultValue") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("Description") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("DisplayName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("GroupName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("IsAvailableToHost") - .HasColumnType("bit"); - - b.Property("IsVisibleToClients") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ParentName") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ValueType") - .HasMaxLength(2048) - .HasColumnType("nvarchar(2048)"); - - b.HasKey("Id"); - - b.HasIndex("GroupName"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("AbpFeatures", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("DisplayName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("AbpFeatureGroups", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ProviderKey") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ProviderName") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey") - .IsUnique() - .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); - - b.ToTable("AbpFeatureValues", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("Description") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsStatic") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("Regex") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)"); - - b.Property("RegexDescription") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("Required") - .HasColumnType("bit"); - - b.Property("ValueType") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.ToTable("AbpClaimTypes", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("SourceTenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("SourceUserId") - .HasColumnType("uniqueidentifier"); - - b.Property("TargetTenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("TargetUserId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") - .IsUnique() - .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); - - b.ToTable("AbpLinkUsers", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("EntityVersion") - .HasColumnType("int"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDefault") - .HasColumnType("bit") - .HasColumnName("IsDefault"); - - b.Property("IsPublic") - .HasColumnType("bit") - .HasColumnName("IsPublic"); - - b.Property("IsStatic") - .HasColumnType("bit") - .HasColumnName("IsStatic"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName"); - - b.ToTable("AbpRoles", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("ClaimType") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ClaimValue") - .HasMaxLength(1024) - .HasColumnType("nvarchar(1024)"); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AbpRoleClaims", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Action") - .HasMaxLength(96) - .HasColumnType("nvarchar(96)"); - - b.Property("ApplicationName") - .HasMaxLength(96) - .HasColumnType("nvarchar(96)"); - - b.Property("BrowserInfo") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)"); - - b.Property("ClientId") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ClientIpAddress") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CorrelationId") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("CreationTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("Identity") - .HasMaxLength(96) - .HasColumnType("nvarchar(96)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("TenantName") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "Action"); - - b.HasIndex("TenantId", "ApplicationName"); - - b.HasIndex("TenantId", "Identity"); - - b.HasIndex("TenantId", "UserId"); - - b.ToTable("AbpSecurityLogs", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentitySession", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ClientId") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Device") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("IpAddresses") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("LastAccessed") - .HasColumnType("datetime2"); - - b.Property("SessionId") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("SignedIn") - .HasColumnType("datetime2"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("Device"); - - b.HasIndex("SessionId"); - - b.HasIndex("TenantId", "UserId"); - - b.ToTable("AbpSessions", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AccessFailedCount") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasDefaultValue(0) - .HasColumnName("AccessFailedCount"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("Email"); - - b.Property("EmailConfirmed") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("EmailConfirmed"); - - b.Property("EntityVersion") - .HasColumnType("int"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsActive") - .HasColumnType("bit") - .HasColumnName("IsActive"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("IsExternal") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsExternal"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("LastPasswordChangeTime") - .HasColumnType("datetimeoffset"); - - b.Property("LockoutEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("LockoutEnabled"); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("Name"); - - b.Property("NormalizedEmail") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("NormalizedEmail"); - - b.Property("NormalizedUserName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("NormalizedUserName"); - - b.Property("PasswordHash") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("PasswordHash"); - - b.Property("PhoneNumber") - .HasMaxLength(16) - .HasColumnType("nvarchar(16)") - .HasColumnName("PhoneNumber"); - - b.Property("PhoneNumberConfirmed") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("PhoneNumberConfirmed"); - - b.Property("SecurityStamp") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("SecurityStamp"); - - b.Property("ShouldChangePasswordOnNextLogin") - .HasColumnType("bit"); - - b.Property("Surname") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("Surname"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("TwoFactorEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("TwoFactorEnabled"); - - b.Property("UserName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("UserName"); - - b.HasKey("Id"); - - b.HasIndex("Email"); - - b.HasIndex("NormalizedEmail"); - - b.HasIndex("NormalizedUserName"); - - b.HasIndex("UserName"); - - b.ToTable("AbpUsers", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("ClaimType") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ClaimValue") - .HasMaxLength(1024) - .HasColumnType("nvarchar(1024)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AbpUserClaims", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("EndTime") - .HasColumnType("datetime2"); - - b.Property("SourceUserId") - .HasColumnType("uniqueidentifier"); - - b.Property("StartTime") - .HasColumnType("datetime2"); - - b.Property("TargetUserId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.ToTable("AbpUserDelegations", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("LoginProvider") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ProviderDisplayName") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ProviderKey") - .IsRequired() - .HasMaxLength(196) - .HasColumnType("nvarchar(196)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("UserId", "LoginProvider"); - - b.HasIndex("LoginProvider", "ProviderKey"); - - b.ToTable("AbpUserLogins", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => - { - b.Property("OrganizationUnitId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("OrganizationUnitId", "UserId"); - - b.HasIndex("UserId", "OrganizationUnitId"); - - b.ToTable("AbpUserOrganizationUnits", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId", "UserId"); - - b.ToTable("AbpUserRoles", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("LoginProvider") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Name") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("Value") - .HasColumnType("nvarchar(max)"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AbpUserTokens", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Code") - .IsRequired() - .HasMaxLength(95) - .HasColumnType("nvarchar(95)") - .HasColumnName("Code"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("DisplayName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)") - .HasColumnName("DisplayName"); - - b.Property("EntityVersion") - .HasColumnType("int"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("ParentId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("Code"); - - b.HasIndex("ParentId"); - - b.ToTable("AbpOrganizationUnits", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => - { - b.Property("OrganizationUnitId") - .HasColumnType("uniqueidentifier"); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("OrganizationUnitId", "RoleId"); - - b.HasIndex("RoleId", "OrganizationUnitId"); - - b.ToTable("AbpOrganizationUnitRoles", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ApplicationType") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("ClientId") - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - - b.Property("ClientSecret") - .HasColumnType("nvarchar(max)"); - - b.Property("ClientType") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("ClientUri") - .HasColumnType("nvarchar(max)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("ConsentType") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("DisplayName") - .HasColumnType("nvarchar(max)"); - - b.Property("DisplayNames") - .HasColumnType("nvarchar(max)"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("JsonWebKeySet") - .HasColumnType("nvarchar(max)"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("LogoUri") - .HasColumnType("nvarchar(max)"); - - b.Property("Permissions") - .HasColumnType("nvarchar(max)"); - - b.Property("PostLogoutRedirectUris") - .HasColumnType("nvarchar(max)"); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - - b.Property("RedirectUris") - .HasColumnType("nvarchar(max)"); - - b.Property("Requirements") - .HasColumnType("nvarchar(max)"); - - b.Property("Settings") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.HasIndex("ClientId"); - - b.ToTable("OpenIddictApplications", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ApplicationId") - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationDate") - .HasColumnType("datetime2"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - - b.Property("Scopes") - .HasColumnType("nvarchar(max)"); - - b.Property("Status") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("Subject") - .HasMaxLength(400) - .HasColumnType("nvarchar(400)"); - - b.Property("Type") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId", "Status", "Subject", "Type"); - - b.ToTable("OpenIddictAuthorizations", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Scopes.OpenIddictScope", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("Description") - .HasColumnType("nvarchar(max)"); - - b.Property("Descriptions") - .HasColumnType("nvarchar(max)"); - - b.Property("DisplayName") - .HasColumnType("nvarchar(max)"); - - b.Property("DisplayNames") - .HasColumnType("nvarchar(max)"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - - b.Property("Resources") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.HasIndex("Name"); - - b.ToTable("OpenIddictScopes", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ApplicationId") - .HasColumnType("uniqueidentifier"); - - b.Property("AuthorizationId") - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationDate") - .HasColumnType("datetime2"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("ExpirationDate") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Payload") - .HasColumnType("nvarchar(max)"); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - - b.Property("RedemptionDate") - .HasColumnType("datetime2"); - - b.Property("ReferenceId") - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - - b.Property("Status") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("Subject") - .HasMaxLength(400) - .HasColumnType("nvarchar(400)"); - - b.Property("Type") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.HasKey("Id"); - - b.HasIndex("AuthorizationId"); - - b.HasIndex("ReferenceId"); - - b.HasIndex("ApplicationId", "Status", "Subject", "Type"); - - b.ToTable("OpenIddictTokens", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("DisplayName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("GroupName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("IsEnabled") - .HasColumnType("bit"); - - b.Property("MultiTenancySide") - .HasColumnType("tinyint"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ParentName") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("Providers") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("StateCheckers") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("GroupName"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("AbpPermissions", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ProviderKey") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ProviderName") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") - .IsUnique() - .HasFilter("[TenantId] IS NOT NULL"); - - b.ToTable("AbpPermissionGrants", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("DisplayName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("AbpPermissionGroups", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ProviderKey") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ProviderName") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(2048) - .HasColumnType("nvarchar(2048)"); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey") - .IsUnique() - .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); - - b.ToTable("AbpSettings", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("DefaultValue") - .HasMaxLength(2048) - .HasColumnType("nvarchar(2048)"); - - b.Property("Description") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)"); - - b.Property("DisplayName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsEncrypted") - .HasColumnType("bit"); - - b.Property("IsInherited") - .HasColumnType("bit"); - - b.Property("IsVisibleToClients") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("Providers") - .HasMaxLength(1024) - .HasColumnType("nvarchar(1024)"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("AbpSettingDefinitions", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("EntityVersion") - .HasColumnType("int"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("NormalizedName") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.HasKey("Id"); - - b.HasIndex("Name"); - - b.HasIndex("NormalizedName"); - - b.ToTable("AbpTenants", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => - { - b.Property("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(1024) - .HasColumnType("nvarchar(1024)"); - - b.HasKey("TenantId", "Name"); - - b.ToTable("AbpTenantConnectionStrings", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("Actions") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("EntityChanges") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) - .WithMany("PropertyChanges") - .HasForeignKey("EntityChangeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany("Claims") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Claims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Logins") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("OrganizationUnits") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Roles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Tokens") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("ParentId"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany("Roles") - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => - { - b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) - .WithMany() - .HasForeignKey("ApplicationId"); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => - { - b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) - .WithMany() - .HasForeignKey("ApplicationId"); - - b.HasOne("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", null) - .WithMany() - .HasForeignKey("AuthorizationId"); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => - { - b.HasOne("Volo.Abp.TenantManagement.Tenant", null) - .WithMany("ConnectionStrings") - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => - { - b.Navigation("Actions"); - - b.Navigation("EntityChanges"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.Navigation("PropertyChanges"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => - { - b.Navigation("Claims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => - { - b.Navigation("Claims"); - - b.Navigation("Logins"); - - b.Navigation("OrganizationUnits"); - - b.Navigation("Roles"); - - b.Navigation("Tokens"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.Navigation("Roles"); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => - { - b.Navigation("ConnectionStrings"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240221053113_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240221053113_Initial.cs deleted file mode 100644 index e36cf69df7..0000000000 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240221053113_Initial.cs +++ /dev/null @@ -1,1131 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MyCompanyName.MyProjectName.Host.Migrations -{ - /// - public partial class Initial : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AbpAuditLogs", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), - UserId = table.Column(type: "uniqueidentifier", nullable: true), - UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ImpersonatorUserId = table.Column(type: "uniqueidentifier", nullable: true), - ImpersonatorUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ImpersonatorTenantId = table.Column(type: "uniqueidentifier", nullable: true), - ImpersonatorTenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ExecutionTime = table.Column(type: "datetime2", nullable: false), - ExecutionDuration = table.Column(type: "int", nullable: false), - ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ClientName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - HttpMethod = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), - Url = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - Exceptions = table.Column(type: "nvarchar(max)", nullable: true), - Comments = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - HttpStatusCode = table.Column(type: "int", nullable: true), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpClaimTypes", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - Required = table.Column(type: "bit", nullable: false), - IsStatic = table.Column(type: "bit", nullable: false), - Regex = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - RegexDescription = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ValueType = table.Column(type: "int", nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpFeatureGroups", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpFeatureGroups", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpFeatures", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - DefaultValue = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - IsVisibleToClients = table.Column(type: "bit", nullable: false), - IsAvailableToHost = table.Column(type: "bit", nullable: false), - AllowedProviders = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ValueType = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpFeatures", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpFeatureValues", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Value = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpLinkUsers", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), - SourceTenantId = table.Column(type: "uniqueidentifier", nullable: true), - TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), - TargetTenantId = table.Column(type: "uniqueidentifier", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpLinkUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpOrganizationUnits", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - ParentId = table.Column(type: "uniqueidentifier", nullable: true), - Code = table.Column(type: "nvarchar(95)", maxLength: 95, nullable: false), - DisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - EntityVersion = table.Column(type: "int", nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); - table.ForeignKey( - name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", - column: x => x.ParentId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "AbpPermissionGrants", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpPermissionGroups", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpPermissionGroups", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpPermissions", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - IsEnabled = table.Column(type: "bit", nullable: false), - MultiTenancySide = table.Column(type: "tinyint", nullable: false), - Providers = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - StateCheckers = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpPermissions", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpRoles", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - IsDefault = table.Column(type: "bit", nullable: false), - IsStatic = table.Column(type: "bit", nullable: false), - IsPublic = table.Column(type: "bit", nullable: false), - EntityVersion = table.Column(type: "int", nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSecurityLogs", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), - Identity = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), - Action = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), - UserId = table.Column(type: "uniqueidentifier", nullable: true), - UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - CreationTime = table.Column(type: "datetime2", nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSessions", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - DeviceInfo = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - UserId = table.Column(type: "uniqueidentifier", nullable: false), - ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - IpAddresses = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - SignedIn = table.Column(type: "datetime2", nullable: false), - LastAccessed = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSessions", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSettingDefinitions", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - Description = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - DefaultValue = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), - IsVisibleToClients = table.Column(type: "bit", nullable: false), - Providers = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true), - IsInherited = table.Column(type: "bit", nullable: false), - IsEncrypted = table.Column(type: "bit", nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSettingDefinitions", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSettings", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - Value = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: false), - ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSettings", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpTenants", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - NormalizedName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - EntityVersion = table.Column(type: "int", nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpTenants", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpUserDelegations", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), - TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), - StartTime = table.Column(type: "datetime2", nullable: false), - EndTime = table.Column(type: "datetime2", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpUsers", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - Surname = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - EmailConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), - PasswordHash = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - SecurityStamp = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - IsExternal = table.Column(type: "bit", nullable: false, defaultValue: false), - PhoneNumber = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), - PhoneNumberConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), - IsActive = table.Column(type: "bit", nullable: false), - TwoFactorEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), - LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), - LockoutEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), - AccessFailedCount = table.Column(type: "int", nullable: false, defaultValue: 0), - ShouldChangePasswordOnNextLogin = table.Column(type: "bit", nullable: false), - EntityVersion = table.Column(type: "int", nullable: false), - LastPasswordChangeTime = table.Column(type: "datetimeoffset", nullable: true), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictApplications", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - ApplicationType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), - ClientId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), - ClientSecret = table.Column(type: "nvarchar(max)", nullable: true), - ClientType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), - ConsentType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), - DisplayName = table.Column(type: "nvarchar(max)", nullable: true), - DisplayNames = table.Column(type: "nvarchar(max)", nullable: true), - JsonWebKeySet = table.Column(type: "nvarchar(max)", nullable: true), - Permissions = table.Column(type: "nvarchar(max)", nullable: true), - PostLogoutRedirectUris = table.Column(type: "nvarchar(max)", nullable: true), - Properties = table.Column(type: "nvarchar(max)", nullable: true), - RedirectUris = table.Column(type: "nvarchar(max)", nullable: true), - Requirements = table.Column(type: "nvarchar(max)", nullable: true), - Settings = table.Column(type: "nvarchar(max)", nullable: true), - ClientUri = table.Column(type: "nvarchar(max)", nullable: true), - LogoUri = table.Column(type: "nvarchar(max)", nullable: true), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_OpenIddictApplications", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictScopes", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Description = table.Column(type: "nvarchar(max)", nullable: true), - Descriptions = table.Column(type: "nvarchar(max)", nullable: true), - DisplayName = table.Column(type: "nvarchar(max)", nullable: true), - DisplayNames = table.Column(type: "nvarchar(max)", nullable: true), - Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), - Properties = table.Column(type: "nvarchar(max)", nullable: true), - Resources = table.Column(type: "nvarchar(max)", nullable: true), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_OpenIddictScopes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpAuditLogActions", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), - ServiceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - MethodName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - Parameters = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), - ExecutionTime = table.Column(type: "datetime2", nullable: false), - ExecutionDuration = table.Column(type: "int", nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); - table.ForeignKey( - name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", - column: x => x.AuditLogId, - principalTable: "AbpAuditLogs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpEntityChanges", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - ChangeTime = table.Column(type: "datetime2", nullable: false), - ChangeType = table.Column(type: "tinyint", nullable: false), - EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), - EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); - table.ForeignKey( - name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", - column: x => x.AuditLogId, - principalTable: "AbpAuditLogs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpOrganizationUnitRoles", - columns: table => new - { - RoleId = table.Column(type: "uniqueidentifier", nullable: false), - OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); - table.ForeignKey( - name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", - column: x => x.OrganizationUnitId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpRoleClaims", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - RoleId = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AbpRoleClaims_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpTenantConnectionStrings", - columns: table => new - { - TenantId = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - Value = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); - table.ForeignKey( - name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", - column: x => x.TenantId, - principalTable: "AbpTenants", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserClaims", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - UserId = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), - ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AbpUserClaims_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserLogins", - columns: table => new - { - UserId = table.Column(type: "uniqueidentifier", nullable: false), - LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - ProviderKey = table.Column(type: "nvarchar(196)", maxLength: 196, nullable: false), - ProviderDisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); - table.ForeignKey( - name: "FK_AbpUserLogins_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserOrganizationUnits", - columns: table => new - { - UserId = table.Column(type: "uniqueidentifier", nullable: false), - OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); - table.ForeignKey( - name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", - column: x => x.OrganizationUnitId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserRoles", - columns: table => new - { - UserId = table.Column(type: "uniqueidentifier", nullable: false), - RoleId = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AbpUserRoles_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpUserRoles_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserTokens", - columns: table => new - { - UserId = table.Column(type: "uniqueidentifier", nullable: false), - LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - Value = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AbpUserTokens_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictAuthorizations", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - ApplicationId = table.Column(type: "uniqueidentifier", nullable: true), - CreationDate = table.Column(type: "datetime2", nullable: true), - Properties = table.Column(type: "nvarchar(max)", nullable: true), - Scopes = table.Column(type: "nvarchar(max)", nullable: true), - Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), - Subject = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: true), - Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_OpenIddictAuthorizations", x => x.Id); - table.ForeignKey( - name: "FK_OpenIddictAuthorizations_OpenIddictApplications_ApplicationId", - column: x => x.ApplicationId, - principalTable: "OpenIddictApplications", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "AbpEntityPropertyChanges", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - TenantId = table.Column(type: "uniqueidentifier", nullable: true), - EntityChangeId = table.Column(type: "uniqueidentifier", nullable: false), - NewValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - OriginalValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), - PropertyName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), - PropertyTypeFullName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); - table.ForeignKey( - name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", - column: x => x.EntityChangeId, - principalTable: "AbpEntityChanges", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "OpenIddictTokens", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - ApplicationId = table.Column(type: "uniqueidentifier", nullable: true), - AuthorizationId = table.Column(type: "uniqueidentifier", nullable: true), - CreationDate = table.Column(type: "datetime2", nullable: true), - ExpirationDate = table.Column(type: "datetime2", nullable: true), - Payload = table.Column(type: "nvarchar(max)", nullable: true), - Properties = table.Column(type: "nvarchar(max)", nullable: true), - RedemptionDate = table.Column(type: "datetime2", nullable: true), - ReferenceId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), - Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), - Subject = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: true), - Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), - ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), - CreationTime = table.Column(type: "datetime2", nullable: false), - CreatorId = table.Column(type: "uniqueidentifier", nullable: true), - LastModificationTime = table.Column(type: "datetime2", nullable: true), - LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), - IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), - DeleterId = table.Column(type: "uniqueidentifier", nullable: true), - DeletionTime = table.Column(type: "datetime2", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_OpenIddictTokens", x => x.Id); - table.ForeignKey( - name: "FK_OpenIddictTokens_OpenIddictApplications_ApplicationId", - column: x => x.ApplicationId, - principalTable: "OpenIddictApplications", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_OpenIddictTokens_OpenIddictAuthorizations_AuthorizationId", - column: x => x.AuthorizationId, - principalTable: "OpenIddictAuthorizations", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogActions_AuditLogId", - table: "AbpAuditLogActions", - column: "AuditLogId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", - table: "AbpAuditLogActions", - columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogs_TenantId_ExecutionTime", - table: "AbpAuditLogs", - columns: new[] { "TenantId", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", - table: "AbpAuditLogs", - columns: new[] { "TenantId", "UserId", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityChanges_AuditLogId", - table: "AbpEntityChanges", - column: "AuditLogId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", - table: "AbpEntityChanges", - columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityPropertyChanges_EntityChangeId", - table: "AbpEntityPropertyChanges", - column: "EntityChangeId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpFeatureGroups_Name", - table: "AbpFeatureGroups", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AbpFeatures_GroupName", - table: "AbpFeatures", - column: "GroupName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpFeatures_Name", - table: "AbpFeatures", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", - table: "AbpFeatureValues", - columns: new[] { "Name", "ProviderName", "ProviderKey" }, - unique: true, - filter: "[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AbpLinkUsers_SourceUserId_SourceTenantId_TargetUserId_TargetTenantId", - table: "AbpLinkUsers", - columns: new[] { "SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId" }, - unique: true, - filter: "[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", - table: "AbpOrganizationUnitRoles", - columns: new[] { "RoleId", "OrganizationUnitId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnits_Code", - table: "AbpOrganizationUnits", - column: "Code"); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnits_ParentId", - table: "AbpOrganizationUnits", - column: "ParentId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpPermissionGrants_TenantId_Name_ProviderName_ProviderKey", - table: "AbpPermissionGrants", - columns: new[] { "TenantId", "Name", "ProviderName", "ProviderKey" }, - unique: true, - filter: "[TenantId] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AbpPermissionGroups_Name", - table: "AbpPermissionGroups", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AbpPermissions_GroupName", - table: "AbpPermissions", - column: "GroupName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpPermissions_Name", - table: "AbpPermissions", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AbpRoleClaims_RoleId", - table: "AbpRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpRoles_NormalizedName", - table: "AbpRoles", - column: "NormalizedName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_Action", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "Action" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_ApplicationName", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "ApplicationName" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_Identity", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "Identity" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_UserId", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSessions_Device", - table: "AbpSessions", - column: "Device"); - - migrationBuilder.CreateIndex( - name: "IX_AbpSessions_SessionId", - table: "AbpSessions", - column: "SessionId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpSessions_TenantId_UserId", - table: "AbpSessions", - columns: new[] { "TenantId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSettingDefinitions_Name", - table: "AbpSettingDefinitions", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AbpSettings_Name_ProviderName_ProviderKey", - table: "AbpSettings", - columns: new[] { "Name", "ProviderName", "ProviderKey" }, - unique: true, - filter: "[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AbpTenants_Name", - table: "AbpTenants", - column: "Name"); - - migrationBuilder.CreateIndex( - name: "IX_AbpTenants_NormalizedName", - table: "AbpTenants", - column: "NormalizedName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserClaims_UserId", - table: "AbpUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserLogins_LoginProvider_ProviderKey", - table: "AbpUserLogins", - columns: new[] { "LoginProvider", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", - table: "AbpUserOrganizationUnits", - columns: new[] { "UserId", "OrganizationUnitId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserRoles_RoleId_UserId", - table: "AbpUserRoles", - columns: new[] { "RoleId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_Email", - table: "AbpUsers", - column: "Email"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_NormalizedEmail", - table: "AbpUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_NormalizedUserName", - table: "AbpUsers", - column: "NormalizedUserName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_UserName", - table: "AbpUsers", - column: "UserName"); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictApplications_ClientId", - table: "OpenIddictApplications", - column: "ClientId"); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictAuthorizations_ApplicationId_Status_Subject_Type", - table: "OpenIddictAuthorizations", - columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictScopes_Name", - table: "OpenIddictScopes", - column: "Name"); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictTokens_ApplicationId_Status_Subject_Type", - table: "OpenIddictTokens", - columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictTokens_AuthorizationId", - table: "OpenIddictTokens", - column: "AuthorizationId"); - - migrationBuilder.CreateIndex( - name: "IX_OpenIddictTokens_ReferenceId", - table: "OpenIddictTokens", - column: "ReferenceId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AbpAuditLogActions"); - - migrationBuilder.DropTable( - name: "AbpClaimTypes"); - - migrationBuilder.DropTable( - name: "AbpEntityPropertyChanges"); - - migrationBuilder.DropTable( - name: "AbpFeatureGroups"); - - migrationBuilder.DropTable( - name: "AbpFeatures"); - - migrationBuilder.DropTable( - name: "AbpFeatureValues"); - - migrationBuilder.DropTable( - name: "AbpLinkUsers"); - - migrationBuilder.DropTable( - name: "AbpOrganizationUnitRoles"); - - migrationBuilder.DropTable( - name: "AbpPermissionGrants"); - - migrationBuilder.DropTable( - name: "AbpPermissionGroups"); - - migrationBuilder.DropTable( - name: "AbpPermissions"); - - migrationBuilder.DropTable( - name: "AbpRoleClaims"); - - migrationBuilder.DropTable( - name: "AbpSecurityLogs"); - - migrationBuilder.DropTable( - name: "AbpSessions"); - - migrationBuilder.DropTable( - name: "AbpSettingDefinitions"); - - migrationBuilder.DropTable( - name: "AbpSettings"); - - migrationBuilder.DropTable( - name: "AbpTenantConnectionStrings"); - - migrationBuilder.DropTable( - name: "AbpUserClaims"); - - migrationBuilder.DropTable( - name: "AbpUserDelegations"); - - migrationBuilder.DropTable( - name: "AbpUserLogins"); - - migrationBuilder.DropTable( - name: "AbpUserOrganizationUnits"); - - migrationBuilder.DropTable( - name: "AbpUserRoles"); - - migrationBuilder.DropTable( - name: "AbpUserTokens"); - - migrationBuilder.DropTable( - name: "OpenIddictScopes"); - - migrationBuilder.DropTable( - name: "OpenIddictTokens"); - - migrationBuilder.DropTable( - name: "AbpEntityChanges"); - - migrationBuilder.DropTable( - name: "AbpTenants"); - - migrationBuilder.DropTable( - name: "AbpOrganizationUnits"); - - migrationBuilder.DropTable( - name: "AbpRoles"); - - migrationBuilder.DropTable( - name: "AbpUsers"); - - migrationBuilder.DropTable( - name: "OpenIddictAuthorizations"); - - migrationBuilder.DropTable( - name: "AbpAuditLogs"); - - migrationBuilder.DropTable( - name: "OpenIddictApplications"); - } - } -} diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs deleted file mode 100644 index f2ef0d1071..0000000000 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ /dev/null @@ -1,1956 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyCompanyName.MyProjectName.Data; -using Volo.Abp.EntityFrameworkCore; - -#nullable disable - -namespace MyCompanyName.MyProjectName.Host.Migrations -{ - [DbContext(typeof(MyProjectNameDbContext))] - partial class MyProjectNameDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ApplicationName") - .HasMaxLength(96) - .HasColumnType("nvarchar(96)") - .HasColumnName("ApplicationName"); - - b.Property("BrowserInfo") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)") - .HasColumnName("BrowserInfo"); - - b.Property("ClientId") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("ClientId"); - - b.Property("ClientIpAddress") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("ClientIpAddress"); - - b.Property("ClientName") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)") - .HasColumnName("ClientName"); - - b.Property("Comments") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("Comments"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CorrelationId") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("CorrelationId"); - - b.Property("Exceptions") - .HasColumnType("nvarchar(max)"); - - b.Property("ExecutionDuration") - .HasColumnType("int") - .HasColumnName("ExecutionDuration"); - - b.Property("ExecutionTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("HttpMethod") - .HasMaxLength(16) - .HasColumnType("nvarchar(16)") - .HasColumnName("HttpMethod"); - - b.Property("HttpStatusCode") - .HasColumnType("int") - .HasColumnName("HttpStatusCode"); - - b.Property("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("ImpersonatorTenantId"); - - b.Property("ImpersonatorTenantName") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("ImpersonatorTenantName"); - - b.Property("ImpersonatorUserId") - .HasColumnType("uniqueidentifier") - .HasColumnName("ImpersonatorUserId"); - - b.Property("ImpersonatorUserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("ImpersonatorUserName"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("TenantName") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("TenantName"); - - b.Property("Url") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("Url"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier") - .HasColumnName("UserId"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("UserName"); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "ExecutionTime"); - - b.HasIndex("TenantId", "UserId", "ExecutionTime"); - - b.ToTable("AbpAuditLogs", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AuditLogId") - .HasColumnType("uniqueidentifier") - .HasColumnName("AuditLogId"); - - b.Property("ExecutionDuration") - .HasColumnType("int") - .HasColumnName("ExecutionDuration"); - - b.Property("ExecutionTime") - .HasColumnType("datetime2") - .HasColumnName("ExecutionTime"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("MethodName") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)") - .HasColumnName("MethodName"); - - b.Property("Parameters") - .HasMaxLength(2000) - .HasColumnType("nvarchar(2000)") - .HasColumnName("Parameters"); - - b.Property("ServiceName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("ServiceName"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("AuditLogId"); - - b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); - - b.ToTable("AbpAuditLogActions", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AuditLogId") - .HasColumnType("uniqueidentifier") - .HasColumnName("AuditLogId"); - - b.Property("ChangeTime") - .HasColumnType("datetime2") - .HasColumnName("ChangeTime"); - - b.Property("ChangeType") - .HasColumnType("tinyint") - .HasColumnName("ChangeType"); - - b.Property("EntityId") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)") - .HasColumnName("EntityId"); - - b.Property("EntityTenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("EntityTypeFullName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)") - .HasColumnName("EntityTypeFullName"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("AuditLogId"); - - b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); - - b.ToTable("AbpEntityChanges", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("EntityChangeId") - .HasColumnType("uniqueidentifier"); - - b.Property("NewValue") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)") - .HasColumnName("NewValue"); - - b.Property("OriginalValue") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)") - .HasColumnName("OriginalValue"); - - b.Property("PropertyName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)") - .HasColumnName("PropertyName"); - - b.Property("PropertyTypeFullName") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("PropertyTypeFullName"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("EntityChangeId"); - - b.ToTable("AbpEntityPropertyChanges", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AllowedProviders") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("DefaultValue") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("Description") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("DisplayName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("GroupName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("IsAvailableToHost") - .HasColumnType("bit"); - - b.Property("IsVisibleToClients") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ParentName") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ValueType") - .HasMaxLength(2048) - .HasColumnType("nvarchar(2048)"); - - b.HasKey("Id"); - - b.HasIndex("GroupName"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("AbpFeatures", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("DisplayName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("AbpFeatureGroups", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ProviderKey") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ProviderName") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey") - .IsUnique() - .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); - - b.ToTable("AbpFeatureValues", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("Description") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsStatic") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("Regex") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)"); - - b.Property("RegexDescription") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("Required") - .HasColumnType("bit"); - - b.Property("ValueType") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.ToTable("AbpClaimTypes", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("SourceTenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("SourceUserId") - .HasColumnType("uniqueidentifier"); - - b.Property("TargetTenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("TargetUserId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") - .IsUnique() - .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); - - b.ToTable("AbpLinkUsers", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("EntityVersion") - .HasColumnType("int"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDefault") - .HasColumnType("bit") - .HasColumnName("IsDefault"); - - b.Property("IsPublic") - .HasColumnType("bit") - .HasColumnName("IsPublic"); - - b.Property("IsStatic") - .HasColumnType("bit") - .HasColumnName("IsStatic"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName"); - - b.ToTable("AbpRoles", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("ClaimType") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ClaimValue") - .HasMaxLength(1024) - .HasColumnType("nvarchar(1024)"); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AbpRoleClaims", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Action") - .HasMaxLength(96) - .HasColumnType("nvarchar(96)"); - - b.Property("ApplicationName") - .HasMaxLength(96) - .HasColumnType("nvarchar(96)"); - - b.Property("BrowserInfo") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)"); - - b.Property("ClientId") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ClientIpAddress") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CorrelationId") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("CreationTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("Identity") - .HasMaxLength(96) - .HasColumnType("nvarchar(96)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("TenantName") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "Action"); - - b.HasIndex("TenantId", "ApplicationName"); - - b.HasIndex("TenantId", "Identity"); - - b.HasIndex("TenantId", "UserId"); - - b.ToTable("AbpSecurityLogs", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentitySession", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ClientId") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Device") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("DeviceInfo") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("IpAddresses") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("LastAccessed") - .HasColumnType("datetime2"); - - b.Property("SessionId") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("SignedIn") - .HasColumnType("datetime2"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("Device"); - - b.HasIndex("SessionId"); - - b.HasIndex("TenantId", "UserId"); - - b.ToTable("AbpSessions", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AccessFailedCount") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasDefaultValue(0) - .HasColumnName("AccessFailedCount"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("Email"); - - b.Property("EmailConfirmed") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("EmailConfirmed"); - - b.Property("EntityVersion") - .HasColumnType("int"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsActive") - .HasColumnType("bit") - .HasColumnName("IsActive"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("IsExternal") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsExternal"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("LastPasswordChangeTime") - .HasColumnType("datetimeoffset"); - - b.Property("LockoutEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("LockoutEnabled"); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("Name"); - - b.Property("NormalizedEmail") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("NormalizedEmail"); - - b.Property("NormalizedUserName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("NormalizedUserName"); - - b.Property("PasswordHash") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("PasswordHash"); - - b.Property("PhoneNumber") - .HasMaxLength(16) - .HasColumnType("nvarchar(16)") - .HasColumnName("PhoneNumber"); - - b.Property("PhoneNumberConfirmed") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("PhoneNumberConfirmed"); - - b.Property("SecurityStamp") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("SecurityStamp"); - - b.Property("ShouldChangePasswordOnNextLogin") - .HasColumnType("bit"); - - b.Property("Surname") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)") - .HasColumnName("Surname"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("TwoFactorEnabled") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("TwoFactorEnabled"); - - b.Property("UserName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)") - .HasColumnName("UserName"); - - b.HasKey("Id"); - - b.HasIndex("Email"); - - b.HasIndex("NormalizedEmail"); - - b.HasIndex("NormalizedUserName"); - - b.HasIndex("UserName"); - - b.ToTable("AbpUsers", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("ClaimType") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ClaimValue") - .HasMaxLength(1024) - .HasColumnType("nvarchar(1024)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AbpUserClaims", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("EndTime") - .HasColumnType("datetime2"); - - b.Property("SourceUserId") - .HasColumnType("uniqueidentifier"); - - b.Property("StartTime") - .HasColumnType("datetime2"); - - b.Property("TargetUserId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.ToTable("AbpUserDelegations", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("LoginProvider") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ProviderDisplayName") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ProviderKey") - .IsRequired() - .HasMaxLength(196) - .HasColumnType("nvarchar(196)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("UserId", "LoginProvider"); - - b.HasIndex("LoginProvider", "ProviderKey"); - - b.ToTable("AbpUserLogins", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => - { - b.Property("OrganizationUnitId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("OrganizationUnitId", "UserId"); - - b.HasIndex("UserId", "OrganizationUnitId"); - - b.ToTable("AbpUserOrganizationUnits", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId", "UserId"); - - b.ToTable("AbpUserRoles", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("LoginProvider") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Name") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.Property("Value") - .HasColumnType("nvarchar(max)"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AbpUserTokens", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Code") - .IsRequired() - .HasMaxLength(95) - .HasColumnType("nvarchar(95)") - .HasColumnName("Code"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("DisplayName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)") - .HasColumnName("DisplayName"); - - b.Property("EntityVersion") - .HasColumnType("int"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("ParentId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("Code"); - - b.HasIndex("ParentId"); - - b.ToTable("AbpOrganizationUnits", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => - { - b.Property("OrganizationUnitId") - .HasColumnType("uniqueidentifier"); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("OrganizationUnitId", "RoleId"); - - b.HasIndex("RoleId", "OrganizationUnitId"); - - b.ToTable("AbpOrganizationUnitRoles", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ApplicationType") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("ClientId") - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - - b.Property("ClientSecret") - .HasColumnType("nvarchar(max)"); - - b.Property("ClientType") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("ClientUri") - .HasColumnType("nvarchar(max)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("ConsentType") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("DisplayName") - .HasColumnType("nvarchar(max)"); - - b.Property("DisplayNames") - .HasColumnType("nvarchar(max)"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("JsonWebKeySet") - .HasColumnType("nvarchar(max)"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("LogoUri") - .HasColumnType("nvarchar(max)"); - - b.Property("Permissions") - .HasColumnType("nvarchar(max)"); - - b.Property("PostLogoutRedirectUris") - .HasColumnType("nvarchar(max)"); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - - b.Property("RedirectUris") - .HasColumnType("nvarchar(max)"); - - b.Property("Requirements") - .HasColumnType("nvarchar(max)"); - - b.Property("Settings") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.HasIndex("ClientId"); - - b.ToTable("OpenIddictApplications", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ApplicationId") - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationDate") - .HasColumnType("datetime2"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - - b.Property("Scopes") - .HasColumnType("nvarchar(max)"); - - b.Property("Status") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("Subject") - .HasMaxLength(400) - .HasColumnType("nvarchar(400)"); - - b.Property("Type") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.HasKey("Id"); - - b.HasIndex("ApplicationId", "Status", "Subject", "Type"); - - b.ToTable("OpenIddictAuthorizations", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Scopes.OpenIddictScope", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("Description") - .HasColumnType("nvarchar(max)"); - - b.Property("Descriptions") - .HasColumnType("nvarchar(max)"); - - b.Property("DisplayName") - .HasColumnType("nvarchar(max)"); - - b.Property("DisplayNames") - .HasColumnType("nvarchar(max)"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .HasMaxLength(200) - .HasColumnType("nvarchar(200)"); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - - b.Property("Resources") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.HasIndex("Name"); - - b.ToTable("OpenIddictScopes", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ApplicationId") - .HasColumnType("uniqueidentifier"); - - b.Property("AuthorizationId") - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationDate") - .HasColumnType("datetime2"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("ExpirationDate") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Payload") - .HasColumnType("nvarchar(max)"); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - - b.Property("RedemptionDate") - .HasColumnType("datetime2"); - - b.Property("ReferenceId") - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - - b.Property("Status") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.Property("Subject") - .HasMaxLength(400) - .HasColumnType("nvarchar(400)"); - - b.Property("Type") - .HasMaxLength(50) - .HasColumnType("nvarchar(50)"); - - b.HasKey("Id"); - - b.HasIndex("AuthorizationId"); - - b.HasIndex("ReferenceId"); - - b.HasIndex("ApplicationId", "Status", "Subject", "Type"); - - b.ToTable("OpenIddictTokens", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("DisplayName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("GroupName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("IsEnabled") - .HasColumnType("bit"); - - b.Property("MultiTenancySide") - .HasColumnType("tinyint"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ParentName") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("Providers") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("StateCheckers") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("GroupName"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("AbpPermissions", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ProviderKey") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ProviderName") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("TenantId") - .HasColumnType("uniqueidentifier") - .HasColumnName("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") - .IsUnique() - .HasFilter("[TenantId] IS NOT NULL"); - - b.ToTable("AbpPermissionGrants", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("DisplayName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("AbpPermissionGroups", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("ProviderKey") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("ProviderName") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(2048) - .HasColumnType("nvarchar(2048)"); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey") - .IsUnique() - .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); - - b.ToTable("AbpSettings", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("DefaultValue") - .HasMaxLength(2048) - .HasColumnType("nvarchar(2048)"); - - b.Property("Description") - .HasMaxLength(512) - .HasColumnType("nvarchar(512)"); - - b.Property("DisplayName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ExtraProperties") - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsEncrypted") - .HasColumnType("bit"); - - b.Property("IsInherited") - .HasColumnType("bit"); - - b.Property("IsVisibleToClients") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); - - b.Property("Providers") - .HasMaxLength(1024) - .HasColumnType("nvarchar(1024)"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("AbpSettingDefinitions", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasMaxLength(40) - .HasColumnType("nvarchar(40)") - .HasColumnName("ConcurrencyStamp"); - - b.Property("CreationTime") - .HasColumnType("datetime2") - .HasColumnName("CreationTime"); - - b.Property("CreatorId") - .HasColumnType("uniqueidentifier") - .HasColumnName("CreatorId"); - - b.Property("DeleterId") - .HasColumnType("uniqueidentifier") - .HasColumnName("DeleterId"); - - b.Property("DeletionTime") - .HasColumnType("datetime2") - .HasColumnName("DeletionTime"); - - b.Property("EntityVersion") - .HasColumnType("int"); - - b.Property("ExtraProperties") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false) - .HasColumnName("IsDeleted"); - - b.Property("LastModificationTime") - .HasColumnType("datetime2") - .HasColumnName("LastModificationTime"); - - b.Property("LastModifierId") - .HasColumnType("uniqueidentifier") - .HasColumnName("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("NormalizedName") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.HasKey("Id"); - - b.HasIndex("Name"); - - b.HasIndex("NormalizedName"); - - b.ToTable("AbpTenants", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => - { - b.Property("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(1024) - .HasColumnType("nvarchar(1024)"); - - b.HasKey("TenantId", "Name"); - - b.ToTable("AbpTenantConnectionStrings", (string)null); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("Actions") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("EntityChanges") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) - .WithMany("PropertyChanges") - .HasForeignKey("EntityChangeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany("Claims") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Claims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Logins") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("OrganizationUnits") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Roles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Tokens") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("ParentId"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany("Roles") - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => - { - b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) - .WithMany() - .HasForeignKey("ApplicationId"); - }); - - modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => - { - b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) - .WithMany() - .HasForeignKey("ApplicationId"); - - b.HasOne("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", null) - .WithMany() - .HasForeignKey("AuthorizationId"); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => - { - b.HasOne("Volo.Abp.TenantManagement.Tenant", null) - .WithMany("ConnectionStrings") - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => - { - b.Navigation("Actions"); - - b.Navigation("EntityChanges"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.Navigation("PropertyChanges"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => - { - b.Navigation("Claims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => - { - b.Navigation("Claims"); - - b.Navigation("Logins"); - - b.Navigation("OrganizationUnits"); - - b.Navigation("Roles"); - - b.Navigation("Tokens"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.Navigation("Roles"); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => - { - b.Navigation("ConnectionStrings"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240221053130_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240307063806_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240221053130_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240307063806_Initial.Designer.cs index 23251a4433..090586505d 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240221053130_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240307063806_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Mvc.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20240221053130_Initial")] + [Migration("20240307063806_Initial")] partial class Initial { /// diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240221053130_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240307063806_Initial.cs similarity index 100% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240221053130_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240307063806_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240221053228_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240307063923_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240221053228_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240307063923_Initial.Designer.cs index 65eb699a41..1f16ba9226 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240221053228_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240307063923_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(AuthServerDbContext))] - [Migration("20240221053228_Initial")] + [Migration("20240307063923_Initial")] partial class Initial { /// diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240221053228_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240307063923_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240221053228_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240307063923_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240221053211_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240307063902_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240221053211_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240307063902_Initial.Designer.cs index 5b598d0d87..b3ab695e1b 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240221053211_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240307063902_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20240221053211_Initial")] + [Migration("20240307063902_Initial")] partial class Initial { /// diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240221053211_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240307063902_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240221053211_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240307063902_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240221053241_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240307063939_Initial.Designer.cs similarity index 96% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240221053241_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240307063939_Initial.Designer.cs index 8b6b1f0abb..7e66237856 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240221053241_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240307063939_Initial.Designer.cs @@ -12,7 +12,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameHttpApiHostMigrationsDbContext))] - [Migration("20240221053241_Initial")] + [Migration("20240307063939_Initial")] partial class Initial { /// diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240221053241_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240307063939_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240221053241_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240307063939_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240221053258_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240307064001_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240221053258_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240307064001_Initial.Designer.cs index cb30ef7cc9..103ca42435 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240221053258_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240307064001_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20240221053258_Initial")] + [Migration("20240307064001_Initial")] partial class Initial { /// diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240221053258_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240307064001_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240221053258_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240307064001_Initial.cs From da471f13b2ddc5b8617f88b86d7f46df91ce709f Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 7 Mar 2024 15:16:17 +0800 Subject: [PATCH 17/38] Update AbpClaimTypes.cs --- .../Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs index 9c2a95841b..0e7f098174 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpClaimTypes.cs @@ -93,6 +93,7 @@ public static class AbpClaimTypes /// public static string Picture { get; set; } = "picture"; + /// /// Default: "remember_me". /// public static string RememberMe { get; set; } = "remember_me"; From 929fc246dbe532b27dcd1ad2a672cf1bbefdaba1 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 11 Mar 2024 16:21:34 +0800 Subject: [PATCH 18/38] Clear the `ApplicationConfigurationDto` cache when getting dynamic claims fails. --- .../MvcCachedApplicationConfigurationClientHelper.cs | 2 +- .../RemoteDynamicClaimsPrincipalContributorCache.cs | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) rename framework/src/{Volo.Abp.AspNetCore.Mvc.Client => Volo.Abp.AspNetCore.Mvc.Client.Common}/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClientHelper.cs (83%) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClientHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClientHelper.cs similarity index 83% rename from framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClientHelper.cs rename to framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClientHelper.cs index 740a79c884..cc1180fd20 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClientHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClientHelper.cs @@ -3,7 +3,7 @@ using Volo.Abp.Users; namespace Volo.Abp.AspNetCore.Mvc.Client; -internal static class MvcCachedApplicationConfigurationClientHelper +public static class MvcCachedApplicationConfigurationClientHelper { public static string CreateCacheKey(ICurrentUser currentUser) { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributorCache.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributorCache.cs index 738884fe06..f63c04e49c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributorCache.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributorCache.cs @@ -4,10 +4,12 @@ using System.Net.Http; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.Caching; using Volo.Abp.Http.Client; using Volo.Abp.Http.Client.Authentication; using Volo.Abp.Security.Claims; +using Volo.Abp.Users; namespace Volo.Abp.AspNetCore.Mvc.Client; @@ -18,17 +20,23 @@ public class RemoteDynamicClaimsPrincipalContributorCache : RemoteDynamicClaimsP protected IDistributedCache Cache { get; } protected IHttpClientFactory HttpClientFactory { get; } protected IRemoteServiceHttpClientAuthenticator HttpClientAuthenticator { get; } + protected IDistributedCache ApplicationConfigurationDtoCache { get; } + protected ICurrentUser CurrentUser { get; } public RemoteDynamicClaimsPrincipalContributorCache( IDistributedCache cache, IHttpClientFactory httpClientFactory, IOptions abpClaimsPrincipalFactoryOptions, - IRemoteServiceHttpClientAuthenticator httpClientAuthenticator) + IRemoteServiceHttpClientAuthenticator httpClientAuthenticator, + IDistributedCache applicationConfigurationDtoCache, + ICurrentUser currentUser) : base(abpClaimsPrincipalFactoryOptions) { Cache = cache; HttpClientFactory = httpClientFactory; HttpClientAuthenticator = httpClientAuthenticator; + ApplicationConfigurationDtoCache = applicationConfigurationDtoCache; + CurrentUser = currentUser; } protected async override Task GetCacheAsync(Guid userId, Guid? tenantId = null) @@ -49,6 +57,7 @@ public class RemoteDynamicClaimsPrincipalContributorCache : RemoteDynamicClaimsP catch (Exception e) { Logger.LogWarning(e, $"Failed to refresh remote claims for user: {userId}"); + await ApplicationConfigurationDtoCache.RemoveAsync(MvcCachedApplicationConfigurationClientHelper.CreateCacheKey(CurrentUser)); throw; } } From 953ba4d960b61b03e62689b5b54cd9d806eb26e3 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 12 Mar 2024 12:44:15 +0800 Subject: [PATCH 19/38] Update template migrations. --- ...4_Initial.Designer.cs => 20240312033651_Initial.Designer.cs} | 2 +- .../{20240307063834_Initial.cs => 20240312033651_Initial.cs} | 0 ...3_Initial.Designer.cs => 20240312033906_Initial.Designer.cs} | 2 +- .../{20240307064033_Initial.cs => 20240312033906_Initial.cs} | 0 ...6_Initial.Designer.cs => 20240312033558_Initial.Designer.cs} | 2 +- .../{20240307063806_Initial.cs => 20240312033558_Initial.cs} | 0 ...3_Initial.Designer.cs => 20240312033751_Initial.Designer.cs} | 2 +- .../{20240307063923_Initial.cs => 20240312033751_Initial.cs} | 0 ...2_Initial.Designer.cs => 20240312033728_Initial.Designer.cs} | 2 +- .../{20240307063902_Initial.cs => 20240312033728_Initial.cs} | 0 ...9_Initial.Designer.cs => 20240312033807_Initial.Designer.cs} | 2 +- .../{20240307063939_Initial.cs => 20240312033807_Initial.cs} | 0 ...1_Initial.Designer.cs => 20240312033830_Initial.Designer.cs} | 2 +- .../{20240307064001_Initial.cs => 20240312033830_Initial.cs} | 0 14 files changed, 7 insertions(+), 7 deletions(-) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/{20240307063834_Initial.Designer.cs => 20240312033651_Initial.Designer.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/{20240307063834_Initial.cs => 20240312033651_Initial.cs} (100%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/{20240307064033_Initial.Designer.cs => 20240312033906_Initial.Designer.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/{20240307064033_Initial.cs => 20240312033906_Initial.cs} (100%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/{20240307063806_Initial.Designer.cs => 20240312033558_Initial.Designer.cs} (99%) rename templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/{20240307063806_Initial.cs => 20240312033558_Initial.cs} (100%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/{20240307063923_Initial.Designer.cs => 20240312033751_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/{20240307063923_Initial.cs => 20240312033751_Initial.cs} (100%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/{20240307063902_Initial.Designer.cs => 20240312033728_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/{20240307063902_Initial.cs => 20240312033728_Initial.cs} (100%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/{20240307063939_Initial.Designer.cs => 20240312033807_Initial.Designer.cs} (96%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/{20240307063939_Initial.cs => 20240312033807_Initial.cs} (100%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20240307064001_Initial.Designer.cs => 20240312033830_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20240307064001_Initial.cs => 20240312033830_Initial.cs} (100%) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240307063834_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240312033651_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240307063834_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240312033651_Initial.Designer.cs index 1dcec924bb..b97eb71e95 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240307063834_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240312033651_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20240307063834_Initial")] + [Migration("20240312033651_Initial")] partial class Initial { /// diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240307063834_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240312033651_Initial.cs similarity index 100% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240307063834_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20240312033651_Initial.cs diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240307064033_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240312033906_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240307064033_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240312033906_Initial.Designer.cs index 86cef13c23..84ee9411af 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240307064033_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240312033906_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20240307064033_Initial")] + [Migration("20240312033906_Initial")] partial class Initial { /// diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240307064033_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240312033906_Initial.cs similarity index 100% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240307064033_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20240312033906_Initial.cs diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240307063806_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240312033558_Initial.Designer.cs similarity index 99% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240307063806_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240312033558_Initial.Designer.cs index 090586505d..fc604df03b 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240307063806_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240312033558_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Mvc.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20240307063806_Initial")] + [Migration("20240312033558_Initial")] partial class Initial { /// diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240307063806_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240312033558_Initial.cs similarity index 100% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240307063806_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20240312033558_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240307063923_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240312033751_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240307063923_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240312033751_Initial.Designer.cs index 1f16ba9226..98b6cc9a7a 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240307063923_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240312033751_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(AuthServerDbContext))] - [Migration("20240307063923_Initial")] + [Migration("20240312033751_Initial")] partial class Initial { /// diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240307063923_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240312033751_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240307063923_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240312033751_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240307063902_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240312033728_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240307063902_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240312033728_Initial.Designer.cs index b3ab695e1b..cc7dab7c4b 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240307063902_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240312033728_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20240307063902_Initial")] + [Migration("20240312033728_Initial")] partial class Initial { /// diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240307063902_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240312033728_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240307063902_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20240312033728_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240307063939_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240312033807_Initial.Designer.cs similarity index 96% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240307063939_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240312033807_Initial.Designer.cs index 7e66237856..3407609e8f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240307063939_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240312033807_Initial.Designer.cs @@ -12,7 +12,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameHttpApiHostMigrationsDbContext))] - [Migration("20240307063939_Initial")] + [Migration("20240312033807_Initial")] partial class Initial { /// diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240307063939_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240312033807_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240307063939_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20240312033807_Initial.cs diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240307064001_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240312033830_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240307064001_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240312033830_Initial.Designer.cs index 103ca42435..618206a870 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240307064001_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240312033830_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20240307064001_Initial")] + [Migration("20240312033830_Initial")] partial class Initial { /// diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240307064001_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240312033830_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240307064001_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20240312033830_Initial.cs From e3ad48a00110f82c9865550e73066c29fec96af2 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 13 Mar 2024 09:39:22 +0800 Subject: [PATCH 20/38] Add `OAuth` device type. --- .../Volo/Abp/Identity/IdentitySessionDevices.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionDevices.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionDevices.cs index 40d5f79baf..ff8e470bae 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionDevices.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentitySessionDevices.cs @@ -4,5 +4,7 @@ public static class IdentitySessionDevices { public const string Web = "Web"; + public const string OAuth = "OAuth"; + public const string Mobile = "Mobile"; } From a24eceabee49f878f6ef39b46895f5b8fc8e8b7c Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 13 Mar 2024 15:16:29 +0800 Subject: [PATCH 21/38] Add `Volo.Abp.AspNetCore.Abstractions` package. --- framework/Volo.Abp.sln | 7 +++++ .../FodyWeavers.xml | 3 ++ .../FodyWeavers.xsd | 30 +++++++++++++++++++ .../Volo.Abp.AspNetCore.Abstractions.csproj | 23 ++++++++++++++ .../AbpAspNetCoreAbstractionsModule.cs | 15 ++++++++++ .../Volo/Abp/AspNetCore/Filters/IAbpFilter.cs | 0 .../IWebContentFileProvider.cs | 0 .../NullWebContentFileProvider.cs | 22 ++++++++++++++ .../WebClientInfo/IWebClientInfoProvider.cs | 0 .../NullWebClientInfoProvider.cs | 10 +++++++ .../Volo.Abp.AspNetCore.csproj | 1 + .../Abp/AspNetCore/AbpAspNetCoreModule.cs | 3 +- .../WebContentFileProvider.cs | 1 + .../HttpContextWebClientInfoProvider.cs | 1 + nupkg/common.ps1 | 1 + 15 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Abstractions/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.AspNetCore.Abstractions/FodyWeavers.xsd create mode 100644 framework/src/Volo.Abp.AspNetCore.Abstractions/Volo.Abp.AspNetCore.Abstractions.csproj create mode 100644 framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/AbpAspNetCoreAbstractionsModule.cs rename framework/src/{Volo.Abp.AspNetCore => Volo.Abp.AspNetCore.Abstractions}/Volo/Abp/AspNetCore/Filters/IAbpFilter.cs (100%) rename framework/src/{Volo.Abp.AspNetCore => Volo.Abp.AspNetCore.Abstractions}/Volo/Abp/AspNetCore/VirtualFileSystem/IWebContentFileProvider.cs (100%) create mode 100644 framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/VirtualFileSystem/NullWebContentFileProvider.cs rename framework/src/{Volo.Abp.AspNetCore => Volo.Abp.AspNetCore.Abstractions}/Volo/Abp/AspNetCore/WebClientInfo/IWebClientInfoProvider.cs (100%) create mode 100644 framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/WebClientInfo/NullWebClientInfoProvider.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index b46a809403..3373a239de 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -465,6 +465,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.SkiaSharp. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.RemoteServices.Tests", "test\Volo.Abp.RemoteServices.Tests\Volo.Abp.RemoteServices.Tests.csproj", "{DACD4485-61BE-4DE5-ACAE-4FFABC122500}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Abstractions", "src\Volo.Abp.AspNetCore.Abstractions\Volo.Abp.AspNetCore.Abstractions.csproj", "{E1051CD0-9262-4869-832D-B951723F4DDE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1387,6 +1389,10 @@ Global {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Debug|Any CPU.Build.0 = Debug|Any CPU {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Release|Any CPU.ActiveCfg = Release|Any CPU {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Release|Any CPU.Build.0 = Release|Any CPU + {E1051CD0-9262-4869-832D-B951723F4DDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E1051CD0-9262-4869-832D-B951723F4DDE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E1051CD0-9262-4869-832D-B951723F4DDE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E1051CD0-9262-4869-832D-B951723F4DDE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1621,6 +1627,7 @@ Global {198683D0-7DC6-40F2-B81B-8E446E70A9DE} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {DFAF8763-D1D6-4EB4-B459-20E31007FE2F} = {447C8A77-E5F0-4538-8687-7383196D04EA} {DACD4485-61BE-4DE5-ACAE-4FFABC122500} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {E1051CD0-9262-4869-832D-B951723F4DDE} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.AspNetCore.Abstractions/FodyWeavers.xml b/framework/src/Volo.Abp.AspNetCore.Abstractions/FodyWeavers.xml new file mode 100644 index 0000000000..1715698ccd --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Abstractions/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Abstractions/FodyWeavers.xsd b/framework/src/Volo.Abp.AspNetCore.Abstractions/FodyWeavers.xsd new file mode 100644 index 0000000000..ffa6fc4b78 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Abstractions/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo.Abp.AspNetCore.Abstractions.csproj b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo.Abp.AspNetCore.Abstractions.csproj new file mode 100644 index 0000000000..c96dbc0c7b --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo.Abp.AspNetCore.Abstractions.csproj @@ -0,0 +1,23 @@ + + + + + + + netstandard2.0;netstandard2.1;net8.0 + enable + Nullable + Volo.Abp.AspNetCore.Abstractions + Volo.Abp.AspNetCore.Abstractions + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + diff --git a/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/AbpAspNetCoreAbstractionsModule.cs b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/AbpAspNetCoreAbstractionsModule.cs new file mode 100644 index 0000000000..6a15c5550f --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/AbpAspNetCoreAbstractionsModule.cs @@ -0,0 +1,15 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.VirtualFileSystem; +using Volo.Abp.AspNetCore.WebClientInfo; +using Volo.Abp.Modularity; + +namespace Volo.Abp.AspNetCore; + +public class AbpAspNetCoreAbstractionsModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddSingleton(); + context.Services.AddSingleton();; + } +} diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Filters/IAbpFilter.cs b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/Filters/IAbpFilter.cs similarity index 100% rename from framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Filters/IAbpFilter.cs rename to framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/Filters/IAbpFilter.cs diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/VirtualFileSystem/IWebContentFileProvider.cs b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/VirtualFileSystem/IWebContentFileProvider.cs similarity index 100% rename from framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/VirtualFileSystem/IWebContentFileProvider.cs rename to framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/VirtualFileSystem/IWebContentFileProvider.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/VirtualFileSystem/NullWebContentFileProvider.cs b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/VirtualFileSystem/NullWebContentFileProvider.cs new file mode 100644 index 0000000000..a690c36062 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/VirtualFileSystem/NullWebContentFileProvider.cs @@ -0,0 +1,22 @@ +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Primitives; + +namespace Volo.Abp.AspNetCore.VirtualFileSystem; + +public class NullWebContentFileProvider : IWebContentFileProvider +{ + public virtual IFileInfo GetFileInfo(string subpath) + { + return new NotFoundFileInfo(subpath); + } + + public virtual IDirectoryContents GetDirectoryContents(string subpath) + { + return new NotFoundDirectoryContents(); + } + + public virtual IChangeToken Watch(string filter) + { + return NullChangeToken.Singleton; + } +} diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/IWebClientInfoProvider.cs b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/WebClientInfo/IWebClientInfoProvider.cs similarity index 100% rename from framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/IWebClientInfoProvider.cs rename to framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/WebClientInfo/IWebClientInfoProvider.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/WebClientInfo/NullWebClientInfoProvider.cs b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/WebClientInfo/NullWebClientInfoProvider.cs new file mode 100644 index 0000000000..9b83ffa4f3 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/WebClientInfo/NullWebClientInfoProvider.cs @@ -0,0 +1,10 @@ +namespace Volo.Abp.AspNetCore.WebClientInfo; + +public class NullWebClientInfoProvider : IWebClientInfoProvider +{ + public virtual string? BrowserInfo { get; } + + public virtual string? ClientIpAddress { get; } + + public virtual string? DeviceInfo { get; } +} diff --git a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj index 782fa65241..c6326e3e95 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj +++ b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj @@ -20,6 +20,7 @@ + diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs index bad4b7c491..cda6aea27f 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/AbpAspNetCoreModule.cs @@ -25,7 +25,8 @@ namespace Volo.Abp.AspNetCore; typeof(AbpHttpModule), typeof(AbpAuthorizationModule), typeof(AbpValidationModule), - typeof(AbpExceptionHandlingModule) + typeof(AbpExceptionHandlingModule), + typeof(AbpAspNetCoreAbstractionsModule) )] public class AbpAspNetCoreModule : AbpModule { diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/VirtualFileSystem/WebContentFileProvider.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/VirtualFileSystem/WebContentFileProvider.cs index fffc35792a..9814dd8c97 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/VirtualFileSystem/WebContentFileProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/VirtualFileSystem/WebContentFileProvider.cs @@ -10,6 +10,7 @@ using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.AspNetCore.VirtualFileSystem; +[Dependency(ReplaceServices = true)] public class WebContentFileProvider : IWebContentFileProvider, ISingletonDependency { private readonly IVirtualFileProvider _virtualFileProvider; diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/HttpContextWebClientInfoProvider.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/HttpContextWebClientInfoProvider.cs index 13b5ab070c..6e450efbcd 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/HttpContextWebClientInfoProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/WebClientInfo/HttpContextWebClientInfoProvider.cs @@ -6,6 +6,7 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.WebClientInfo; +[Dependency(ReplaceServices = true)] public class HttpContextWebClientInfoProvider : IWebClientInfoProvider, ITransientDependency { protected ILogger Logger { get; } diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index 78de2aef44..9f014cd526 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -97,6 +97,7 @@ $projects = ( "framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer", "framework/src/Volo.Abp.AspNetCore.Authentication.OAuth", "framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect", + "framework/src/Volo.Abp.AspNetCore.Abstractions", "framework/src/Volo.Abp.AspNetCore", "framework/src/Volo.Abp.AspNetCore.Mvc.Dapr", "framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus", From 97dde3879e604153ad91db50e8a4d670b9ddf60d Mon Sep 17 00:00:00 2001 From: xxxxue <32764266+xxxxue@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:23:31 +0800 Subject: [PATCH 22/38] Update Swagger-Integration.md --- docs/en/API/Swagger-Integration.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/API/Swagger-Integration.md b/docs/en/API/Swagger-Integration.md index aad5c531c4..395b1830d7 100644 --- a/docs/en/API/Swagger-Integration.md +++ b/docs/en/API/Swagger-Integration.md @@ -74,6 +74,10 @@ public override void OnApplicationInitialization(ApplicationInitializationContex //... other configurations. + app.UseStaticFiles(); + + app.UseSwagger(); + app.UseAbpSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "Test API"); From 0d6a59324dbaba0a0560ee823e8c154876144f85 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 21 Mar 2024 09:17:43 +0800 Subject: [PATCH 23/38] Update migrations. --- .../20240321011533_Initial.Designer.cs | 1959 +++++++++++++++++ .../Migrations/20240321011533_Initial.cs | 1131 ++++++++++ .../MyProjectNameDbContextModelSnapshot.cs | 1956 ++++++++++++++++ ....cs => 20240321011622_Initial.Designer.cs} | 2 +- ...1_Initial.cs => 20240321011622_Initial.cs} | 0 5 files changed, 5047 insertions(+), 1 deletion(-) create mode 100644 templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240321011533_Initial.Designer.cs create mode 100644 templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240321011533_Initial.cs create mode 100644 templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/{20240312033751_Initial.Designer.cs => 20240321011622_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/{20240312033751_Initial.cs => 20240321011622_Initial.cs} (100%) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240321011533_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240321011533_Initial.Designer.cs new file mode 100644 index 0000000000..309ac9f973 --- /dev/null +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240321011533_Initial.Designer.cs @@ -0,0 +1,1959 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using MyCompanyName.MyProjectName.Data; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace MyCompanyName.MyProjectName.Host.Migrations +{ + [DbContext(typeof(MyProjectNameDbContext))] + [Migration("20240321011533_Initial")] + partial class Initial + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "8.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("nvarchar(max)"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EntityChangeId") + .HasColumnType("uniqueidentifier"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatures", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatureGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("IpAddresses") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("LastAccessed") + .HasColumnType("datetime2"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("SignedIn") + .HasColumnType("datetime2"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("bit") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("datetimeoffset"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("bit"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ClientUri") + .HasColumnType("nvarchar(max)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JsonWebKeySet") + .HasColumnType("nvarchar(max)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("nvarchar(max)"); + + b.Property("Permissions") + .HasColumnType("nvarchar(max)"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Requirements") + .HasColumnType("nvarchar(max)"); + + b.Property("Settings") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Scopes") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Scopes.OpenIddictScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Descriptions") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Resources") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorizationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExpirationDate") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedemptionDate") + .HasColumnType("datetime2"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("bit"); + + b.Property("IsInherited") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpSettingDefinitions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + + b.HasOne("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", null) + .WithMany() + .HasForeignKey("AuthorizationId"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240321011533_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240321011533_Initial.cs new file mode 100644 index 0000000000..e36cf69df7 --- /dev/null +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20240321011533_Initial.cs @@ -0,0 +1,1131 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace MyCompanyName.MyProjectName.Host.Migrations +{ + /// + public partial class Initial : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AbpAuditLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ImpersonatorUserId = table.Column(type: "uniqueidentifier", nullable: true), + ImpersonatorUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ImpersonatorTenantId = table.Column(type: "uniqueidentifier", nullable: true), + ImpersonatorTenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + HttpMethod = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + Url = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + Exceptions = table.Column(type: "nvarchar(max)", nullable: true), + Comments = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + HttpStatusCode = table.Column(type: "int", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpClaimTypes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Required = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + Regex = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + RegexDescription = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatureGroups", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureGroups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatures", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + DefaultValue = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + IsVisibleToClients = table.Column(type: "bit", nullable: false), + IsAvailableToHost = table.Column(type: "bit", nullable: false), + AllowedProviders = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatures", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatureValues", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpLinkUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + SourceTenantId = table.Column(type: "uniqueidentifier", nullable: true), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetTenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpLinkUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnits", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ParentId = table.Column(type: "uniqueidentifier", nullable: true), + Code = table.Column(type: "nvarchar(95)", maxLength: 95, nullable: false), + DisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); + table.ForeignKey( + name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", + column: x => x.ParentId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGrants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGroups", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGroups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsEnabled = table.Column(type: "bit", nullable: false), + MultiTenancySide = table.Column(type: "tinyint", nullable: false), + Providers = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + StateCheckers = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpRoles", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsDefault = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + IsPublic = table.Column(type: "bit", nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSecurityLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Identity = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Action = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSessions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + DeviceInfo = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: false), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + IpAddresses = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + SignedIn = table.Column(type: "datetime2", nullable: false), + LastAccessed = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSessions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSettingDefinitions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Description = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + DefaultValue = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), + IsVisibleToClients = table.Column(type: "bit", nullable: false), + Providers = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true), + IsInherited = table.Column(type: "bit", nullable: false), + IsEncrypted = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSettingDefinitions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSettings", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSettings", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpTenants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + NormalizedName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + StartTime = table.Column(type: "datetime2", nullable: false), + EndTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Surname = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + EmailConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + PasswordHash = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + SecurityStamp = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsExternal = table.Column(type: "bit", nullable: false, defaultValue: false), + PhoneNumber = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + PhoneNumberConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + IsActive = table.Column(type: "bit", nullable: false), + TwoFactorEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), + LockoutEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + AccessFailedCount = table.Column(type: "int", nullable: false, defaultValue: 0), + ShouldChangePasswordOnNextLogin = table.Column(type: "bit", nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + LastPasswordChangeTime = table.Column(type: "datetimeoffset", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictApplications", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + ClientId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + ClientSecret = table.Column(type: "nvarchar(max)", nullable: true), + ClientType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + ConsentType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + DisplayName = table.Column(type: "nvarchar(max)", nullable: true), + DisplayNames = table.Column(type: "nvarchar(max)", nullable: true), + JsonWebKeySet = table.Column(type: "nvarchar(max)", nullable: true), + Permissions = table.Column(type: "nvarchar(max)", nullable: true), + PostLogoutRedirectUris = table.Column(type: "nvarchar(max)", nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + RedirectUris = table.Column(type: "nvarchar(max)", nullable: true), + Requirements = table.Column(type: "nvarchar(max)", nullable: true), + Settings = table.Column(type: "nvarchar(max)", nullable: true), + ClientUri = table.Column(type: "nvarchar(max)", nullable: true), + LogoUri = table.Column(type: "nvarchar(max)", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictApplications", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictScopes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Description = table.Column(type: "nvarchar(max)", nullable: true), + Descriptions = table.Column(type: "nvarchar(max)", nullable: true), + DisplayName = table.Column(type: "nvarchar(max)", nullable: true), + DisplayNames = table.Column(type: "nvarchar(max)", nullable: true), + Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + Resources = table.Column(type: "nvarchar(max)", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictScopes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpAuditLogActions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + ServiceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + MethodName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Parameters = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); + table.ForeignKey( + name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityChanges", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ChangeTime = table.Column(type: "datetime2", nullable: false), + ChangeType = table.Column(type: "tinyint", nullable: false), + EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnitRoles", + columns: table => new + { + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpRoleClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpRoleClaims_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpTenantConnectionStrings", + columns: table => new + { + TenantId = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Value = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); + table.ForeignKey( + name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", + column: x => x.TenantId, + principalTable: "AbpTenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + UserId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpUserClaims_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserLogins", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ProviderKey = table.Column(type: "nvarchar(196)", maxLength: 196, nullable: false), + ProviderDisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); + table.ForeignKey( + name: "FK_AbpUserLogins_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserOrganizationUnits", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserRoles", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserTokens", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Value = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AbpUserTokens_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictAuthorizations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationId = table.Column(type: "uniqueidentifier", nullable: true), + CreationDate = table.Column(type: "datetime2", nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + Scopes = table.Column(type: "nvarchar(max)", nullable: true), + Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + Subject = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: true), + Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictAuthorizations", x => x.Id); + table.ForeignKey( + name: "FK_OpenIddictAuthorizations_OpenIddictApplications_ApplicationId", + column: x => x.ApplicationId, + principalTable: "OpenIddictApplications", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityPropertyChanges", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityChangeId = table.Column(type: "uniqueidentifier", nullable: false), + NewValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + OriginalValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + PropertyName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + PropertyTypeFullName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", + column: x => x.EntityChangeId, + principalTable: "AbpEntityChanges", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictTokens", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationId = table.Column(type: "uniqueidentifier", nullable: true), + AuthorizationId = table.Column(type: "uniqueidentifier", nullable: true), + CreationDate = table.Column(type: "datetime2", nullable: true), + ExpirationDate = table.Column(type: "datetime2", nullable: true), + Payload = table.Column(type: "nvarchar(max)", nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + RedemptionDate = table.Column(type: "datetime2", nullable: true), + ReferenceId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + Subject = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: true), + Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictTokens", x => x.Id); + table.ForeignKey( + name: "FK_OpenIddictTokens_OpenIddictApplications_ApplicationId", + column: x => x.ApplicationId, + principalTable: "OpenIddictApplications", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_OpenIddictTokens_OpenIddictAuthorizations_AuthorizationId", + column: x => x.AuthorizationId, + principalTable: "OpenIddictAuthorizations", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_AuditLogId", + table: "AbpAuditLogActions", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", + table: "AbpAuditLogActions", + columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "UserId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_AuditLogId", + table: "AbpEntityChanges", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", + table: "AbpEntityChanges", + columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityPropertyChanges_EntityChangeId", + table: "AbpEntityPropertyChanges", + column: "EntityChangeId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureGroups_Name", + table: "AbpFeatureGroups", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatures_GroupName", + table: "AbpFeatures", + column: "GroupName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatures_Name", + table: "AbpFeatures", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", + table: "AbpFeatureValues", + columns: new[] { "Name", "ProviderName", "ProviderKey" }, + unique: true, + filter: "[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpLinkUsers_SourceUserId_SourceTenantId_TargetUserId_TargetTenantId", + table: "AbpLinkUsers", + columns: new[] { "SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId" }, + unique: true, + filter: "[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", + table: "AbpOrganizationUnitRoles", + columns: new[] { "RoleId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_Code", + table: "AbpOrganizationUnits", + column: "Code"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_ParentId", + table: "AbpOrganizationUnits", + column: "ParentId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGrants_TenantId_Name_ProviderName_ProviderKey", + table: "AbpPermissionGrants", + columns: new[] { "TenantId", "Name", "ProviderName", "ProviderKey" }, + unique: true, + filter: "[TenantId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGroups_Name", + table: "AbpPermissionGroups", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_GroupName", + table: "AbpPermissions", + column: "GroupName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_Name", + table: "AbpPermissions", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoleClaims_RoleId", + table: "AbpRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoles_NormalizedName", + table: "AbpRoles", + column: "NormalizedName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Action", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Action" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_ApplicationName", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "ApplicationName" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Identity", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Identity" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_UserId", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSessions_Device", + table: "AbpSessions", + column: "Device"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSessions_SessionId", + table: "AbpSessions", + column: "SessionId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSessions_TenantId_UserId", + table: "AbpSessions", + columns: new[] { "TenantId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSettingDefinitions_Name", + table: "AbpSettingDefinitions", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpSettings_Name_ProviderName_ProviderKey", + table: "AbpSettings", + columns: new[] { "Name", "ProviderName", "ProviderKey" }, + unique: true, + filter: "[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpTenants_Name", + table: "AbpTenants", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_AbpTenants_NormalizedName", + table: "AbpTenants", + column: "NormalizedName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserClaims_UserId", + table: "AbpUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserLogins_LoginProvider_ProviderKey", + table: "AbpUserLogins", + columns: new[] { "LoginProvider", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", + table: "AbpUserOrganizationUnits", + columns: new[] { "UserId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserRoles_RoleId_UserId", + table: "AbpUserRoles", + columns: new[] { "RoleId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_Email", + table: "AbpUsers", + column: "Email"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedEmail", + table: "AbpUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedUserName", + table: "AbpUsers", + column: "NormalizedUserName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_UserName", + table: "AbpUsers", + column: "UserName"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictApplications_ClientId", + table: "OpenIddictApplications", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictAuthorizations_ApplicationId_Status_Subject_Type", + table: "OpenIddictAuthorizations", + columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictScopes_Name", + table: "OpenIddictScopes", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_ApplicationId_Status_Subject_Type", + table: "OpenIddictTokens", + columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_AuthorizationId", + table: "OpenIddictTokens", + column: "AuthorizationId"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_ReferenceId", + table: "OpenIddictTokens", + column: "ReferenceId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AbpAuditLogActions"); + + migrationBuilder.DropTable( + name: "AbpClaimTypes"); + + migrationBuilder.DropTable( + name: "AbpEntityPropertyChanges"); + + migrationBuilder.DropTable( + name: "AbpFeatureGroups"); + + migrationBuilder.DropTable( + name: "AbpFeatures"); + + migrationBuilder.DropTable( + name: "AbpFeatureValues"); + + migrationBuilder.DropTable( + name: "AbpLinkUsers"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnitRoles"); + + migrationBuilder.DropTable( + name: "AbpPermissionGrants"); + + migrationBuilder.DropTable( + name: "AbpPermissionGroups"); + + migrationBuilder.DropTable( + name: "AbpPermissions"); + + migrationBuilder.DropTable( + name: "AbpRoleClaims"); + + migrationBuilder.DropTable( + name: "AbpSecurityLogs"); + + migrationBuilder.DropTable( + name: "AbpSessions"); + + migrationBuilder.DropTable( + name: "AbpSettingDefinitions"); + + migrationBuilder.DropTable( + name: "AbpSettings"); + + migrationBuilder.DropTable( + name: "AbpTenantConnectionStrings"); + + migrationBuilder.DropTable( + name: "AbpUserClaims"); + + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + + migrationBuilder.DropTable( + name: "AbpUserLogins"); + + migrationBuilder.DropTable( + name: "AbpUserOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpUserRoles"); + + migrationBuilder.DropTable( + name: "AbpUserTokens"); + + migrationBuilder.DropTable( + name: "OpenIddictScopes"); + + migrationBuilder.DropTable( + name: "OpenIddictTokens"); + + migrationBuilder.DropTable( + name: "AbpEntityChanges"); + + migrationBuilder.DropTable( + name: "AbpTenants"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpRoles"); + + migrationBuilder.DropTable( + name: "AbpUsers"); + + migrationBuilder.DropTable( + name: "OpenIddictAuthorizations"); + + migrationBuilder.DropTable( + name: "AbpAuditLogs"); + + migrationBuilder.DropTable( + name: "OpenIddictApplications"); + } + } +} diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs new file mode 100644 index 0000000000..f2ef0d1071 --- /dev/null +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -0,0 +1,1956 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using MyCompanyName.MyProjectName.Data; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace MyCompanyName.MyProjectName.Host.Migrations +{ + [DbContext(typeof(MyProjectNameDbContext))] + partial class MyProjectNameDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "8.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("nvarchar(max)"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EntityChangeId") + .HasColumnType("uniqueidentifier"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatures", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatureGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("IpAddresses") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("LastAccessed") + .HasColumnType("datetime2"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("SignedIn") + .HasColumnType("datetime2"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("bit") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("datetimeoffset"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("bit"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ClientUri") + .HasColumnType("nvarchar(max)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JsonWebKeySet") + .HasColumnType("nvarchar(max)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("nvarchar(max)"); + + b.Property("Permissions") + .HasColumnType("nvarchar(max)"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Requirements") + .HasColumnType("nvarchar(max)"); + + b.Property("Settings") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Scopes") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Scopes.OpenIddictScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Descriptions") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Resources") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorizationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExpirationDate") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedemptionDate") + .HasColumnType("datetime2"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("bit"); + + b.Property("IsInherited") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpSettingDefinitions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + + b.HasOne("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", null) + .WithMany() + .HasForeignKey("AuthorizationId"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240312033751_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240321011622_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240312033751_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240321011622_Initial.Designer.cs index 98b6cc9a7a..6e7456f3ba 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240312033751_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240321011622_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(AuthServerDbContext))] - [Migration("20240312033751_Initial")] + [Migration("20240321011622_Initial")] partial class Initial { /// diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240312033751_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240321011622_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240312033751_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20240321011622_Initial.cs From 2a730bea7306bcf33bfce27b7181faf6823371a8 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 21 Mar 2024 16:14:04 +0800 Subject: [PATCH 24/38] Fix user filter --- .../EfCoreIdentityUserRepository.cs | 12 ++++++++++-- .../MongoDB/MongoIdentityUserRepository.cs | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs index bbaa8087f4..8c905a3169 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs @@ -289,7 +289,16 @@ public class EfCoreIdentityUserRepository : EfCoreRepository().Where(q => q.RoleId == roleId.Value).Select(q => q.OrganizationUnitId).ToArrayAsync(cancellationToken: cancellationToken); + query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); + } + + return await query .WhereIf( !filter.IsNullOrWhiteSpace(), u => @@ -299,7 +308,6 @@ public class EfCoreIdentityUserRepository : EfCoreRepository identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) .WhereIf(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) .WhereIf(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs index aab3e3c63a..43a875f6f0 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs @@ -263,7 +263,19 @@ public class MongoIdentityUserRepository : MongoDbRepository(cancellationToken)) + .Where(ou => ou.Roles.Any(r => r.RoleId == roleId.Value)) + .Select(userOrganizationUnit => userOrganizationUnit.Id) + .ToArray(); + + query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); + } + + return await query .WhereIf>( !filter.IsNullOrWhiteSpace(), u => @@ -273,7 +285,6 @@ public class MongoIdentityUserRepository : MongoDbRepository>(roleId.HasValue, identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) .WhereIf>(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) .WhereIf>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) From 0689e1c1c326cd454ba22d1ee96a17402af5ef58 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 21 Mar 2024 16:25:18 +0800 Subject: [PATCH 25/38] Add GetFilteredQueryableAsync method --- .../EfCoreIdentityUserRepository.cs | 166 ++++++++++------- .../MongoDB/MongoIdentityUserRepository.cs | 176 ++++++++++-------- 2 files changed, 195 insertions(+), 147 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs index 8c905a3169..4f2269225e 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs @@ -197,42 +197,27 @@ public class EfCoreIdentityUserRepository : EfCoreRepository().Where(q => q.RoleId == roleId.Value).Select(q => q.OrganizationUnitId).ToArrayAsync(cancellationToken: cancellationToken); - query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); - } - - return await query - .WhereIf( - !filter.IsNullOrWhiteSpace(), - u => - u.NormalizedUserName.Contains(upperFilter) || - u.NormalizedEmail.Contains(upperFilter) || - (u.Name != null && u.Name.Contains(filter)) || - (u.Surname != null && u.Surname.Contains(filter)) || - (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) - ) - .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) - .WhereIf(!string.IsNullOrWhiteSpace(userName), x => x.UserName.Contains(userName)) - .WhereIf(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber.Contains(phoneNumber)) - .WhereIf(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email.Contains(emailAddress)) - .WhereIf(!string.IsNullOrWhiteSpace(name), x => x.Name.Contains(name)) - .WhereIf(!string.IsNullOrWhiteSpace(surname), x => x.Surname.Contains(surname)) - .WhereIf(isLockedOut.HasValue, x => (x.LockoutEnabled && x.LockoutEnd.HasValue && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) == isLockedOut.Value) - .WhereIf(notActive.HasValue, x => x.IsActive == !notActive.Value) - .WhereIf(emailConfirmed.HasValue, x => x.EmailConfirmed == emailConfirmed.Value) - .WhereIf(isExternal.HasValue, x => x.IsExternal == isExternal.Value) - .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) - .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) - .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) - .WhereIf(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime) + var query = await GetFilteredQueryableAsync( + filter, + roleId, + organizationUnitId, + userName, + phoneNumber, + emailAddress, + name, + surname, + isLockedOut, + notActive, + emailConfirmed, + isExternal, + maxCreationTime, + minCreationTime, + maxModifitionTime, + minModifitionTime, + cancellationToken + ); + + return await query.IncludeDetails(includeDetails) .OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(IdentityUser.UserName) : sorting) .PageBy(skipCount, maxResultCount) .ToListAsync(GetCancellationToken(cancellationToken)); @@ -288,41 +273,25 @@ public class EfCoreIdentityUserRepository : EfCoreRepository().Where(q => q.RoleId == roleId.Value).Select(q => q.OrganizationUnitId).ToArrayAsync(cancellationToken: cancellationToken); - query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); - } - - return await query - .WhereIf( - !filter.IsNullOrWhiteSpace(), - u => - u.NormalizedUserName.Contains(upperFilter) || - u.NormalizedEmail.Contains(upperFilter) || - (u.Name != null && u.Name.Contains(filter)) || - (u.Surname != null && u.Surname.Contains(filter)) || - (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) - ) - .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) - .WhereIf(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) - .WhereIf(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) - .WhereIf(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) - .WhereIf(!string.IsNullOrWhiteSpace(name), x => x.Name == name) - .WhereIf(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) - .WhereIf(isLockedOut.HasValue, x => (x.LockoutEnabled && x.LockoutEnd.HasValue && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) == isLockedOut.Value) - .WhereIf(notActive.HasValue, x => x.IsActive == !notActive.Value) - .WhereIf(emailConfirmed.HasValue, x => x.EmailConfirmed == emailConfirmed.Value) - .WhereIf(isExternal.HasValue, x => x.IsExternal == isExternal.Value) - .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) - .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) - .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) - .WhereIf(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime) - .LongCountAsync(GetCancellationToken(cancellationToken)); + return await (await GetFilteredQueryableAsync( + filter, + roleId, + organizationUnitId, + userName, + phoneNumber, + emailAddress, + name, + surname, + isLockedOut, + notActive, + emailConfirmed, + isExternal, + maxCreationTime, + minCreationTime, + maxModifitionTime, + minModifitionTime, + cancellationToken + )).LongCountAsync(GetCancellationToken(cancellationToken)); } public virtual async Task> GetOrganizationUnitsAsync( @@ -446,4 +415,59 @@ public class EfCoreIdentityUserRepository : EfCoreRepository().Where(x => x.OrganizationUnitId == sourceOrganizationId).ExecuteDeleteAsync(GetCancellationToken(cancellationToken)); } } + + protected virtual async Task GetFilteredQueryableAsync( + string filter = null, + Guid? roleId = null, + Guid? organizationUnitId = null, + string userName = null, + string phoneNumber = null, + string emailAddress = null, + string name = null, + string surname = null, + bool? isLockedOut = null, + bool? notActive = null, + bool? emailConfirmed = null, + bool? isExternal = null, + DateTime? maxCreationTime = null, + DateTime? minCreationTime = null, + DateTime? maxModifitionTime = null, + DateTime? minModifitionTime = null, + CancellationToken cancellationToken = default) + { + var upperFilter = filter?.ToUpperInvariant(); + var query = await GetQueryableAsync(); + + if (roleId.HasValue) + { + var dbContext = await GetDbContextAsync(); + var organizationUnitIds = await dbContext.Set().Where(q => q.RoleId == roleId.Value).Select(q => q.OrganizationUnitId).ToArrayAsync(cancellationToken: cancellationToken); + query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); + } + + return query + .WhereIf( + !filter.IsNullOrWhiteSpace(), + u => + u.NormalizedUserName.Contains(upperFilter) || + u.NormalizedEmail.Contains(upperFilter) || + (u.Name != null && u.Name.Contains(filter)) || + (u.Surname != null && u.Surname.Contains(filter)) || + (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) + ) + .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) + .WhereIf(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) + .WhereIf(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) + .WhereIf(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) + .WhereIf(!string.IsNullOrWhiteSpace(name), x => x.Name == name) + .WhereIf(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) + .WhereIf(isLockedOut.HasValue, x => (x.LockoutEnabled && x.LockoutEnd.HasValue && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) == isLockedOut.Value) + .WhereIf(notActive.HasValue, x => x.IsActive == !notActive.Value) + .WhereIf(emailConfirmed.HasValue, x => x.EmailConfirmed == emailConfirmed.Value) + .WhereIf(isExternal.HasValue, x => x.IsExternal == isExternal.Value) + .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) + .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) + .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) + .WhereIf(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime); + } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs index 43a875f6f0..1ce97c4dfd 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs @@ -164,45 +164,28 @@ public class MongoIdentityUserRepository : MongoDbRepository(cancellationToken)) - .Where(ou => ou.Roles.Any(r => r.RoleId == roleId.Value)) - .Select(userOrganizationUnit => userOrganizationUnit.Id) - .ToArray(); - - query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); - } + { + var query = await GetFilteredQueryableAsync( + filter, + roleId, + organizationUnitId, + userName, + phoneNumber, + emailAddress, + name, + surname, + isLockedOut, + notActive, + emailConfirmed, + isExternal, + maxCreationTime, + minCreationTime, + maxModifitionTime, + minModifitionTime, + cancellationToken + ); return await query - .WhereIf>( - !filter.IsNullOrWhiteSpace(), - u => - u.NormalizedUserName.Contains(upperFilter) || - u.NormalizedEmail.Contains(upperFilter) || - (u.Name != null && u.Name.Contains(filter)) || - (u.Surname != null && u.Surname.Contains(filter)) || - (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) - ) - .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) - .WhereIf>(!string.IsNullOrWhiteSpace(userName), x => x.UserName.Contains(userName)) - .WhereIf>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber.Contains(phoneNumber)) - .WhereIf>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email.Contains(emailAddress)) - .WhereIf>(!string.IsNullOrWhiteSpace(name), x => x.Name.Contains(name)) - .WhereIf>(!string.IsNullOrWhiteSpace(surname), x => x.Surname.Contains(surname)) - .WhereIf>(isLockedOut.HasValue && isLockedOut.Value, x => x.LockoutEnabled && x.LockoutEnd != null && x.LockoutEnd > DateTimeOffset.UtcNow) - .WhereIf>(isLockedOut.HasValue && !isLockedOut.Value, x => !(x.LockoutEnabled && x.LockoutEnd != null && x.LockoutEnd > DateTimeOffset.UtcNow)) - .WhereIf>(notActive.HasValue, x => x.IsActive == !notActive.Value) - .WhereIf>(emailConfirmed.HasValue, x => x.EmailConfirmed == emailConfirmed.Value) - .WhereIf>(isExternal.HasValue, x => x.IsExternal == isExternal.Value) - .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) - .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) - .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) - .WhereIf(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime) .OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(IdentityUser.UserName) : sorting) .As>() .PageBy>(skipCount, maxResultCount) @@ -262,45 +245,27 @@ public class MongoIdentityUserRepository : MongoDbRepository(cancellationToken)) - .Where(ou => ou.Roles.Any(r => r.RoleId == roleId.Value)) - .Select(userOrganizationUnit => userOrganizationUnit.Id) - .ToArray(); - - query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); - } - - return await query - .WhereIf>( - !filter.IsNullOrWhiteSpace(), - u => - u.NormalizedUserName.Contains(upperFilter) || - u.NormalizedEmail.Contains(upperFilter) || - (u.Name != null && u.Name.Contains(filter)) || - (u.Surname != null && u.Surname.Contains(filter)) || - (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) - ) - .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) - .WhereIf>(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) - .WhereIf>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) - .WhereIf>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) - .WhereIf>(!string.IsNullOrWhiteSpace(name), x => x.Name == name) - .WhereIf>(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) - .WhereIf>(isLockedOut.HasValue && isLockedOut.Value, x => x.LockoutEnabled && x.LockoutEnd != null && x.LockoutEnd > DateTimeOffset.UtcNow) - .WhereIf>(isLockedOut.HasValue && !isLockedOut.Value, x => !(x.LockoutEnabled && x.LockoutEnd != null && x.LockoutEnd > DateTimeOffset.UtcNow)) - .WhereIf>(notActive.HasValue, x => x.IsActive == !notActive.Value) - .WhereIf>(emailConfirmed.HasValue, x => x.EmailConfirmed == emailConfirmed.Value) - .WhereIf>(isExternal.HasValue, x => x.IsExternal == isExternal.Value) - .WhereIf>(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) - .WhereIf>(minCreationTime != null, p => p.CreationTime >= minCreationTime) - .WhereIf>(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) - .WhereIf>(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime) - .LongCountAsync(GetCancellationToken(cancellationToken)); + var query = await GetFilteredQueryableAsync( + filter, + roleId, + organizationUnitId, + userName, + phoneNumber, + emailAddress, + name, + surname, + isLockedOut, + notActive, + emailConfirmed, + isExternal, + maxCreationTime, + minCreationTime, + maxModifitionTime, + minModifitionTime, + cancellationToken + ); + + return await query.LongCountAsync(GetCancellationToken(cancellationToken)); } public virtual async Task> GetUsersInOrganizationUnitAsync( @@ -442,4 +407,63 @@ public class MongoIdentityUserRepository : MongoDbRepository> GetFilteredQueryableAsync( + string filter = null, + Guid? roleId = null, + Guid? organizationUnitId = null, + string userName = null, + string phoneNumber = null, + string emailAddress = null, + string name = null, + string surname = null, + bool? isLockedOut = null, + bool? notActive = null, + bool? emailConfirmed = null, + bool? isExternal = null, + DateTime? maxCreationTime = null, + DateTime? minCreationTime = null, + DateTime? maxModifitionTime = null, + DateTime? minModifitionTime = null, + CancellationToken cancellationToken = default) + { + var upperFilter = filter?.ToUpperInvariant(); + var query = await GetMongoQueryableAsync(cancellationToken); + + if (roleId.HasValue) + { + var organizationUnitIds = (await GetMongoQueryableAsync(cancellationToken)) + .Where(ou => ou.Roles.Any(r => r.RoleId == roleId.Value)) + .Select(userOrganizationUnit => userOrganizationUnit.Id) + .ToArray(); + + query = query.Where(identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value) || identityUser.OrganizationUnits.Any(x => organizationUnitIds.Contains(x.OrganizationUnitId))); + } + + return query + .WhereIf>( + !filter.IsNullOrWhiteSpace(), + u => + u.NormalizedUserName.Contains(upperFilter) || + u.NormalizedEmail.Contains(upperFilter) || + (u.Name != null && u.Name.Contains(filter)) || + (u.Surname != null && u.Surname.Contains(filter)) || + (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) + ) + .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) + .WhereIf>(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) + .WhereIf>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) + .WhereIf>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) + .WhereIf>(!string.IsNullOrWhiteSpace(name), x => x.Name == name) + .WhereIf>(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) + .WhereIf>(isLockedOut.HasValue && isLockedOut.Value, x => x.LockoutEnabled && x.LockoutEnd != null && x.LockoutEnd > DateTimeOffset.UtcNow) + .WhereIf>(isLockedOut.HasValue && !isLockedOut.Value, x => !(x.LockoutEnabled && x.LockoutEnd != null && x.LockoutEnd > DateTimeOffset.UtcNow)) + .WhereIf>(notActive.HasValue, x => x.IsActive == !notActive.Value) + .WhereIf>(emailConfirmed.HasValue, x => x.EmailConfirmed == emailConfirmed.Value) + .WhereIf>(isExternal.HasValue, x => x.IsExternal == isExternal.Value) + .WhereIf>(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) + .WhereIf>(minCreationTime != null, p => p.CreationTime >= minCreationTime) + .WhereIf>(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) + .WhereIf>(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime); + } } From 27f84abe7fbf4adbaa2fa08f95bd467a6707504a Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 21 Mar 2024 16:31:36 +0800 Subject: [PATCH 26/38] Update EfCoreIdentityUserRepository.cs --- .../EntityFrameworkCore/EfCoreIdentityUserRepository.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs index 4f2269225e..2b261b065e 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs @@ -197,7 +197,7 @@ public class EfCoreIdentityUserRepository : EfCoreRepository GetFilteredQueryableAsync( + protected virtual async Task> GetFilteredQueryableAsync( string filter = null, Guid? roleId = null, Guid? organizationUnitId = null, From 7ac072de0cb4308b903926c591e42d4810f02d67 Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 22 Mar 2024 00:58:31 +0300 Subject: [PATCH 27/38] Improve clear cache --- .../Docs/Admin/Documents/DocumentAdminAppService.cs | 6 ++---- .../Volo/Docs/Documents/DocumentWithoutDetails.cs | 2 ++ .../Volo/Docs/Documents/IDocumentRepository.cs | 2 ++ .../Volo/Docs/Documents/EFCoreDocumentRepository.cs | 5 +++++ .../Volo/Docs/Documents/MongoDocumentRepository.cs | 10 ++++++++++ 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs index 9356ba9c38..b93b4f6698 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs @@ -57,7 +57,7 @@ namespace Volo.Docs.Admin.Documents var versionCacheKey = CacheKeyGenerator.GenerateProjectVersionsCacheKey(project); await _versionCache.RemoveAsync(versionCacheKey, true); - var documents = await _documentRepository.GetListByProjectId(project.Id); + var documents = await _documentRepository.GetListWithoutDetailsByProjectId(project.Id); var documentUpdateInfoCacheKeys = documents.Select(document => CacheKeyGenerator.GenerateDocumentUpdateInfoCacheKey( @@ -69,10 +69,8 @@ namespace Volo.Docs.Admin.Documents ); await _documentUpdateCache.RemoveManyAsync(documentUpdateInfoCacheKeys); - - documents.ForEach(document => document.LastCachedTime = DateTime.MinValue); - await _documentRepository.UpdateManyAsync(documents); + await _documentRepository.ClearCachesAsync(project.Id); } public virtual async Task PullAllAsync(PullAllDocumentInput input) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentWithoutDetails.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentWithoutDetails.cs index 8adade5be2..2aaf54aee4 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentWithoutDetails.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentWithoutDetails.cs @@ -5,6 +5,8 @@ namespace Volo.Docs.Documents public class DocumentWithoutDetails { public Guid Id { get; set; } + + public string Name { get; set; } public virtual string Version { get; set; } diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentRepository.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentRepository.cs index b1580f379a..7b985b19d8 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentRepository.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentRepository.cs @@ -12,6 +12,8 @@ namespace Volo.Docs.Documents Task> GetUniqueListDocumentInfoAsync(CancellationToken cancellationToken = default); Task> GetListByProjectId(Guid projectId, CancellationToken cancellationToken = default); + + Task ClearCachesAsync(Guid projectId, CancellationToken cancellationToken = default); Task FindAsync(Guid projectId, string name, diff --git a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs index 700203e7dd..9fe9ecceb0 100644 --- a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs +++ b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs @@ -55,6 +55,11 @@ namespace Volo.Docs.Documents return await (await GetDbSetAsync()).Where(d => d.ProjectId == projectId).ToListAsync(GetCancellationToken(cancellationToken)); } + public async Task ClearCachesAsync(Guid projectId, CancellationToken cancellationToken = default) + { + await (await GetDbSetAsync()).Where(d => d.ProjectId == projectId).ExecuteUpdateAsync(x => x.SetProperty(d => d.LastCachedTime, DateTime.MinValue), GetCancellationToken(cancellationToken)); + } + public virtual async Task> GetListAsync(Guid? projectId, string version, string name, CancellationToken cancellationToken = default) { return await (await GetDbSetAsync()) diff --git a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs index 1cd93545a5..26811a3567 100644 --- a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs +++ b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs @@ -53,6 +53,16 @@ namespace Volo.Docs.Documents return await (await GetMongoQueryableAsync(cancellationToken)).Where(d => d.ProjectId == projectId).ToListAsync(GetCancellationToken(cancellationToken)); } + public async Task ClearCachesAsync(Guid projectId, CancellationToken cancellationToken = default) + { + var collection = await GetCollectionAsync(cancellationToken); + await collection.UpdateManyAsync( + Builders.Filter.Eq(x => x.ProjectId, projectId), + Builders.Update.Set(x => x.LastCachedTime, DateTime.MinValue), + cancellationToken: GetCancellationToken(cancellationToken) + ); + } + public virtual async Task FindAsync(Guid projectId, string name, string languageCode, string version, bool includeDetails = true, CancellationToken cancellationToken = default) From 1912165e71cafeeba4f075ca5eea7ef0216aff32 Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 22 Mar 2024 01:23:25 +0300 Subject: [PATCH 28/38] Add name --- .../Volo/Docs/Documents/EFCoreDocumentRepository.cs | 1 + .../Volo/Docs/Documents/MongoDocumentRepository.cs | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs index 9fe9ecceb0..83d1683368 100644 --- a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs +++ b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs @@ -28,6 +28,7 @@ namespace Volo.Docs.Documents Version = x.Version, LanguageCode = x.LanguageCode, Format = x.Format, + Name = x.Name }) .ToListAsync(GetCancellationToken(cancellationToken)); } diff --git a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs index 26811a3567..b1a3288ac4 100644 --- a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs +++ b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs @@ -29,7 +29,8 @@ namespace Volo.Docs.Documents Id = x.Id, Version = x.Version, LanguageCode = x.LanguageCode, - Format = x.Format + Format = x.Format, + Name = x.Name }) .ToListAsync(GetCancellationToken(cancellationToken)); } From 874dd5649d0c6ec2836572651018a0aae14e14ba Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 22 Mar 2024 01:32:41 +0300 Subject: [PATCH 29/38] Add test --- .../Volo/Docs/DocumentRepository_Tests.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/docs/test/Volo.Docs.TestBase/Volo/Docs/DocumentRepository_Tests.cs b/modules/docs/test/Volo.Docs.TestBase/Volo/Docs/DocumentRepository_Tests.cs index ed0769ccc1..a1cdaa6269 100644 --- a/modules/docs/test/Volo.Docs.TestBase/Volo/Docs/DocumentRepository_Tests.cs +++ b/modules/docs/test/Volo.Docs.TestBase/Volo/Docs/DocumentRepository_Tests.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using Shouldly; using Volo.Abp.Modularity; using Volo.Docs.Documents; @@ -34,5 +35,13 @@ namespace Volo.Docs (await DocumentRepository.GetListAsync()).ShouldBeEmpty(); } + + [Fact] + public async Task ClearCachesAsync() + { + await DocumentRepository.ClearCachesAsync(DocsTestData.ProjectId); + var documentsAfterClear = await DocumentRepository.GetListByProjectId(DocsTestData.ProjectId); + documentsAfterClear.ForEach(d => d.LastCachedTime.ShouldBe(DateTime.MinValue)); + } } } From 4672bad2cd09fd8ca7738aebb5c52ee169fedde3 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 22 Mar 2024 13:15:58 +0800 Subject: [PATCH 30/38] Replace `Newtonsoft` with `System.Text.Json` in `PackageVersionCheckerService`. --- .../Version/PackageVersionCheckerService.cs | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs index a72c00714d..75c67a4f64 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs @@ -1,5 +1,5 @@ using System; -using Newtonsoft.Json; +using System.Collections.Concurrent; using NuGet.Versioning; using System.Collections.Generic; using System.Linq; @@ -14,7 +14,7 @@ using Volo.Abp.Cli.ProjectModification; using Volo.Abp.DependencyInjection; using Volo.Abp.Json; using Volo.Abp.Threading; -using System.Net.Mail; +using System.Text.Json.Serialization; namespace Volo.Abp.Cli.Version; @@ -66,7 +66,7 @@ public class PackageVersionCheckerService : ITransientDependency { return await GetLatestStableVersionFromGithubAsync(); } - + var versionList = await GetPackageVersionListAsync(packageId, includeNightly); if (versionList == null) { @@ -79,8 +79,8 @@ public class PackageVersionCheckerService : ITransientDependency .Select(SemanticVersion.Parse) .OrderByDescending(v => v, new VersionComparer()).ToList(); - return versions.Any() - ? new LatestVersionInfo(versions.Max()) + return versions.Any() + ? new LatestVersionInfo(versions.Max()) : null; } @@ -96,7 +96,7 @@ public class PackageVersionCheckerService : ITransientDependency { return await GetPackageVersionsFromAbpCommercialNuGetAsync(packageId); } - + return await GetPackageVersionsFromNuGetOrgAsync(packageId) ?? new List(); } @@ -113,21 +113,32 @@ public class PackageVersionCheckerService : ITransientDependency : null; } + private static ConcurrentDictionary CommercialPackagesCache { get; } = new (); + private async Task IsCommercialPackageAsync(string packageId) { + if (CommercialPackagesCache.TryGetValue(packageId, out var isCommercial)) + { + return isCommercial; + } + if (CommercialPackages.IsCommercial(packageId)) { + CommercialPackagesCache.TryAdd(packageId, true); return true; } await SetApiKeyResultAsync(); if (_apiKeyResult?.ApiKey == null) { + CommercialPackagesCache.TryAdd(packageId, false); return false; } var searchUrl = CliUrls.GetNuGetPackageSearchUrl(_apiKeyResult.ApiKey, packageId); - return await HasAnyPackageAsync(searchUrl, packageId); + isCommercial = await HasAnyPackageAsync(searchUrl, packageId); + CommercialPackagesCache.TryAdd(packageId, isCommercial); + return isCommercial; } private async Task HasAnyPackageAsync(string url, string packageId) @@ -147,7 +158,7 @@ public class PackageVersionCheckerService : ITransientDependency var responseContent = await responseMessage.Content.ReadAsStringAsync(); var nugetSearchResult = JsonSerializer.Deserialize(responseContent); - return nugetSearchResult.TotalHits > 0 && nugetSearchResult.Packages.Any(package => package.Id.ToLowerInvariant() == packageId.ToLowerInvariant()); + return nugetSearchResult.TotalHits > 0 && nugetSearchResult.Data.Any(package => package.Id.ToLowerInvariant() == packageId.ToLowerInvariant()); } } catch (Exception) @@ -191,7 +202,7 @@ public class PackageVersionCheckerService : ITransientDependency //the package doesn't exist... return new List(); } - + await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); var responseContent = await responseMessage.Content.ReadAsStringAsync(); @@ -231,7 +242,7 @@ public class PackageVersionCheckerService : ITransientDependency var content = await responseMessage.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize>(content); - + return result.FirstOrDefault(x => x.Type.ToLowerInvariant() == "stable"); } } @@ -243,25 +254,20 @@ public class PackageVersionCheckerService : ITransientDependency public class NuGetSearchResultDto { - [JsonProperty("totalHits")] public int TotalHits { get; set; } - [JsonProperty("data")] - public NuGetSearchResultPackagesDto[] Packages { get; set; } + public NuGetSearchResultPackagesDto[] Data { get; set; } } - public class NuGetSearchResultPackagesDto + public class NuGetSearchResultPackagesDto { - [JsonProperty("id")] public string Id { get; set; } - [JsonProperty("version")] public string Version { get; set; } } - + public class NuGetVersionResultDto { - [JsonProperty("versions")] public List Versions { get; set; } } @@ -272,7 +278,7 @@ public class PackageVersionCheckerService : ITransientDependency public DateTime? ReleaseDate { get; set; } public string Type { get; set; } - + public string Message { get; set; } } } From 1dbda4cf61600aec1c42062f17c7a176af5eb728 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 22 Mar 2024 14:11:51 +0800 Subject: [PATCH 31/38] Update bookstore-appservice-tests.png --- .../images/bookstore-appservice-tests.png | Bin 16291 -> 205742 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/en/Tutorials/images/bookstore-appservice-tests.png b/docs/en/Tutorials/images/bookstore-appservice-tests.png index 942d2832a62db6a9cc581569c1685d34939b8e2b..40feffb8f6561b899886b7f6fae9a66761aece19 100644 GIT binary patch literal 205742 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 z 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 literal 16291 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 From 3e6db0fc27206eb28b92a2e3338b2836a9f56d02 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 22 Mar 2024 15:38:49 +0800 Subject: [PATCH 32/38] Upgrade Blazorise to 1.5.0 --- Directory.Packages.props | 8 ++--- ...e.MyProjectName.Blazor.Server.Mongo.csproj | 4 +-- ...anyName.MyProjectName.Blazor.Server.csproj | 4 +-- ...ojectName.Blazor.WebAssembly.Client.csproj | 4 +-- .../Client/wwwroot/global.css | 2 +- .../Client/wwwroot/global.js | 2 +- .../Server.Mongo/Components/App.razor | 4 +-- ...anyName.MyProjectName.Blazor.Client.csproj | 4 +-- .../wwwroot/global.css | 2 +- .../wwwroot/global.js | 2 +- ....MyProjectName.Blazor.Server.Tiered.csproj | 4 +-- ...anyName.MyProjectName.Blazor.Server.csproj | 4 +-- ....MyProjectName.Blazor.WebApp.Client.csproj | 4 +-- .../wwwroot/global.css | 14 ++++----- .../wwwroot/global.js | 31 ++++++++++++------- ...ectName.Blazor.WebApp.Tiered.Client.csproj | 4 +-- .../wwwroot/global.css | 14 ++++----- .../wwwroot/global.js | 31 ++++++++++++------- ....MyProjectName.Blazor.WebApp.Tiered.csproj | 4 +-- ...anyName.MyProjectName.Blazor.WebApp.csproj | 4 +-- .../App.razor | 10 +++--- ...me.MyProjectName.Blazor.Host.Client.csproj | 4 +-- .../wwwroot/global.css | 2 +- .../App.razor | 10 +++--- ...me.MyProjectName.Blazor.Server.Host.csproj | 4 +-- 25 files changed, 97 insertions(+), 83 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 4787ed47bc..cf6dbf6b28 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -16,10 +16,10 @@ - - - - + + + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj index 2b46cb318b..545b63175c 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index bf3144328e..6f453333ff 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj index e25025527e..a77b859e6c 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/wwwroot/global.css b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/wwwroot/global.css index 5e68d46d6d..c989edd248 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/wwwroot/global.css +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/wwwroot/global.css @@ -14,7 +14,7 @@ body:before{content:"mobile";display:none;visibility:hidden}@media(min-width:768px){body:before{content:"tablet"}}@media(min-width:992px){body:before{content:"desktop"}}@media(min-width:1200px){body:before{content:"widescreen"}}@media(min-width:1400px){body:before{content:"fullhd"}}hr.divider.divider-solid{border-top:var(--b-divider-thickness,1px) solid var(--b-divider-color,#999)}hr.divider.divider-dashed{border-top:var(--b-divider-thickness,1px) dashed var(--b-divider-color,#999)}hr.divider.divider-dotted{border-top:var(--b-divider-thickness,1px) dotted var(--b-divider-color,#999)}hr.divider.divider-text{position:relative;border:0;height:var(--b-divider-thickness,1px);background:var(--b-divider-color,#999)}hr.divider.divider-text::before{content:attr(data-content);display:inline-block;background:#fff;font-weight:bold;font-size:var(--b-divider-font-size,.85rem);color:var(--b-divider-color,#999);border-radius:30rem;padding:.2rem 2rem;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.b-drop-zone{position:relative;transition:all 300ms cubic-bezier(.4,0,.2,1) 0ms}.b-drop-zone.b-drop-zone-drag-block>*{pointer-events:none}.b-drop-zone.b-drop-zone-drop-allowed{outline:1px solid var(--b-theme-success,"#00FF00")!important}.b-drop-zone.b-drop-zone-drop-not-allowed{outline:1px solid var(--b-theme-danger,"#FF0000")!important}.b-drop-zone-draggable:not(.draggable-preview-start){cursor:grab;user-select:none}.b-drop-zone-draggable:not(.draggable-preview-start):active{cursor:grabbing}.b-drop-zone .draggable-placeholder{outline:2px dashed var(--b-theme-primary,"#0000FF")!important;padding:1rem}.b-drop-zone .draggable-preview-start{height:20px;width:100%;position:absolute;top:0;left:0;z-index:1}.b-file-picker{display:inline-block;width:100%}.b-file-picker .b-text-drop{border:1px solid rgba(0,0,0,.15);margin-top:.5rem;display:block;text-align:center;font-size:.75rem;padding-top:.25rem;padding-bottom:.25rem}.b-file-picker .b-file-picker-file{min-width:25rem}.b-file-picker .b-file-picker-file span{display:block}.b-file-picker .b-file-picker-file .b-file-picker-file-size,.b-file-picker .b-file-picker-file .b-file-picker-file-status,.b-file-picker .b-file-picker-file .b-file-picker-file-relativepath{font-size:.75rem}.b-input-color-picker{padding:.6rem}.b-input-color-picker>.b-input-color-picker-preview{position:relative;z-index:1;width:100%;height:100%;display:flex;flex-direction:row;justify-content:space-between}.b-input-color-picker>.b-input-color-picker-preview::before{position:absolute;content:"";top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, ');background-size:.5em;border-radius:.15em;z-index:-1}.b-input-color-picker>.b-input-color-picker-preview>.b-input-color-picker-curent-color{display:inline-block;width:100%;height:100%}.b-input-color-picker[aria-disabled=true]{opacity:.65}.progress.progress-xs{height:.25rem}.progress.progress-sm{height:.5rem}.progress.progress-md{height:1rem}.progress.progress-lg{height:1.5rem}.progress.progress-xl{height:2rem}.b-page-progress{width:100%;height:4px;z-index:9999;top:0;left:0;position:fixed;display:none}.b-page-progress .b-page-progress-indicator{width:0;height:100%;transition:height .3s;background-color:#000;transition:width 1s}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-indeterminate{width:30%;animation:running-page-progress 2s cubic-bezier(.4,0,.2,1) infinite}.b-page-progress.b-page-progress-active{display:block}@keyframes running-page-progress{0%{margin-left:0;margin-right:100%}50%{margin-left:25%;margin-right:0%}100%{margin-left:100%;margin-right:0}}.tippy-box[data-animation=scale][data-placement^=top]{transform-origin:bottom}.tippy-box[data-animation=scale][data-placement^=bottom]{transform-origin:top}.tippy-box[data-animation=scale][data-placement^=left]{transform-origin:right}.tippy-box[data-animation=scale][data-placement^=right]{transform-origin:left}.tippy-box[data-animation=scale][data-state=hidden]{transform:scale(.5);opacity:0}.tippy-box[data-theme~=blazorise]{background-color:RGBA(var(--b-tooltip-background-color-r,128),var(--b-tooltip-background-color-g,128),var(--b-tooltip-background-color-b,128),var(--b-tooltip-background-opacity,.9));color:var(--b-tooltip-color,#fff)}.tippy-box[data-theme~=blazorise][data-placement^=top]>.tippy-arrow::before{border-top-color:RGBA(var(--b-tooltip-background-color-r,128),var(--b-tooltip-background-color-g,128),var(--b-tooltip-background-color-b,128),var(--b-tooltip-background-opacity,.9))}.tippy-box[data-theme~=blazorise][data-placement^=bottom]>.tippy-arrow::before{border-bottom-color:RGBA(var(--b-tooltip-background-color-r,128),var(--b-tooltip-background-color-g,128),var(--b-tooltip-background-color-b,128),var(--b-tooltip-background-opacity,.9))}.tippy-box[data-theme~=blazorise][data-placement^=left]>.tippy-arrow::before{border-left-color:RGBA(var(--b-tooltip-background-color-r,128),var(--b-tooltip-background-color-g,128),var(--b-tooltip-background-color-b,128),var(--b-tooltip-background-opacity,.9))}.tippy-box[data-theme~=blazorise][data-placement^=right]>.tippy-arrow::before{border-right-color:RGBA(var(--b-tooltip-background-color-r,128),var(--b-tooltip-background-color-g,128),var(--b-tooltip-background-color-b,128),var(--b-tooltip-background-opacity,.9))}.tippy-box[data-theme~=blazorise]>.tippy-svg-arrow{fill:RGBA(var(--b-tooltip-background-color-r,128),var(--b-tooltip-background-color-g,128),var(--b-tooltip-background-color-b,128),var(--b-tooltip-background-opacity,.9))}.b-tooltip-inline{display:inline-block}.b-layout{display:flex;flex:auto;flex-direction:column}.b-layout.b-layout-root{height:100vh}.b-layout,.b-layout *{box-sizing:border-box}@keyframes spinner{0%{transform:translate3d(-50%,-50%,0) rotate(0deg)}100%{transform:translate3d(-50%,-50%,0) rotate(360deg)}}.b-layout>.b-layout-loading{z-index:9999;position:fixed;width:100%;height:100%;background:rgba(0,0,0,.3)}.b-layout>.b-layout-loading:before{animation:1s linear infinite spinner;border:solid 3px #eee;border-bottom-color:var(--b-theme-primary);border-radius:50%;height:40px;left:50%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0);width:40px;content:" "}.b-layout.b-layout-has-sider{flex-direction:row;min-height:0}.b-layout.b-layout-has-sider .b-layout{overflow-x:hidden}.b-layout-header,.b-layout-footer{flex:0 0 auto}.b-layout-header{color:rgba(0,0,0,.65)}.b-layout.b-layout-root.b-layout-has-sider>.b-layout-header-fixed,.b-layout.b-layout-root.b-layout-has-sider>.b-layout>.b-layout-header-fixed{position:sticky;top:0;width:100%;flex:0}.b-layout.b-layout-root:not(.b-layout-has-sider) .b-layout-header-fixed,.b-layout.b-layout-root:not(.b-layout-has-sider)>.b-layout .b-layout-header-fixed{position:fixed;top:0;left:0;right:0;flex:0}.b-layout.b-layout-root:not(.b-layout-has-sider) .b-layout-header-fixed+.b-layout-content,.b-layout.b-layout-root:not(.b-layout-has-sider)>.b-layout .b-layout-header-fixed+.b-layout-content{margin-top:var(--b-bar-horizontal-height,auto)}.b-layout.b-layout-root>.b-layout-header.b-layout-header-fixed+.b-layout.b-layout-has-sider{margin-top:var(--b-bar-horizontal-height,auto)}.b-layout-footer{color:rgba(0,0,0,.65)}.b-layout-footer-fixed{position:sticky;z-index:1;bottom:0;flex:0}.b-layout-content{flex:1}.b-layout-sider{display:flex;position:relative;background:#001529}.b-layout-sider-content{position:sticky;top:0;z-index:2}.b-layout-header .navbar{line-height:inherit}.b-bar-horizontal[data-collapse=hide]{flex-wrap:nowrap}.b-bar-horizontal[data-collapse=hide][data-broken=true]{height:auto}.b-bar-horizontal[data-broken=false]{height:auto}.b-layout>.b-layout-header .b-bar-horizontal[data-collapse=hide][data-broken=true]{height:var(--b-bar-horizontal-height,auto)}.b-layout>.b-layout-header .b-bar-horizontal[data-broken=false]{height:var(--b-bar-horizontal-height,auto)}.b-bar-initial{display:none!important}.b-bar-vertical-inline,.b-bar-vertical-popout,.b-bar-vertical-small{display:flex;flex-direction:column;flex-wrap:nowrap;position:sticky;top:0;padding:0;min-width:var(--b-vertical-bar-width,230px);max-width:var(--b-vertical-bar-width,230px);width:var(--b-vertical-bar-width,230px);box-shadow:2px 0 6px rgba(0,21,41,.35);height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.b-bar-vertical-inline:not(.b-bar-initial),.b-bar-vertical-popout:not(.b-bar-initial),.b-bar-vertical-small:not(.b-bar-initial){transition:width 200ms ease-in-out,min-width 200ms ease-in-out}.b-bar-vertical-inline .b-bar-menu,.b-bar-vertical-popout .b-bar-menu,.b-bar-vertical-small .b-bar-menu{width:100%;display:flex;flex:1;justify-content:space-between;flex-direction:column;align-self:stretch}.b-bar-vertical-inline .b-bar-brand,.b-bar-vertical-popout .b-bar-brand,.b-bar-vertical-small .b-bar-brand{width:100%;display:flex;height:var(--b-vertical-bar-brand-height,64px);min-height:var(--b-vertical-bar-brand-height,64px)}.b-bar-vertical-inline .b-bar-toggler-inline,.b-bar-vertical-popout .b-bar-toggler-inline,.b-bar-vertical-small .b-bar-toggler-inline{height:var(--b-vertical-bar-brand-height,64px);padding:12px;display:inline-flex;cursor:pointer;position:absolute;right:0}.b-bar-vertical-inline .b-bar-toggler-inline>*,.b-bar-vertical-popout .b-bar-toggler-inline>*,.b-bar-vertical-small .b-bar-toggler-inline>*{margin:auto}.b-bar-vertical-inline .b-bar-toggler-popout:not(.b-bar-mobile-toggle),.b-bar-vertical-popout .b-bar-toggler-popout:not(.b-bar-mobile-toggle),.b-bar-vertical-small .b-bar-toggler-popout:not(.b-bar-mobile-toggle){display:flex;position:fixed;left:var(--b-vertical-bar-width,230px);border-radius:0 10px 10px 0;border:0;width:10px;height:40px;padding:5px;align-items:center;box-shadow:2px 0 6px rgba(0,21,41,.35);cursor:pointer}.b-bar-vertical-inline .b-bar-toggler-popout:not(.b-bar-mobile-toggle):not(.b-bar-initial),.b-bar-vertical-popout .b-bar-toggler-popout:not(.b-bar-mobile-toggle):not(.b-bar-initial),.b-bar-vertical-small .b-bar-toggler-popout:not(.b-bar-mobile-toggle):not(.b-bar-initial){transition:width 200ms ease-in-out,left 200ms ease-in-out}.b-bar-vertical-inline .b-bar-toggler-popout:not(.b-bar-mobile-toggle)>*,.b-bar-vertical-popout .b-bar-toggler-popout:not(.b-bar-mobile-toggle)>*,.b-bar-vertical-small .b-bar-toggler-popout:not(.b-bar-mobile-toggle)>*{margin:auto;display:none}.b-bar-vertical-inline .b-bar-toggler-popout:not(.b-bar-mobile-toggle):hover,.b-bar-vertical-popout .b-bar-toggler-popout:not(.b-bar-mobile-toggle):hover,.b-bar-vertical-small .b-bar-toggler-popout:not(.b-bar-mobile-toggle):hover{width:45px}.b-bar-vertical-inline .b-bar-toggler-popout:not(.b-bar-mobile-toggle):hover>*,.b-bar-vertical-popout .b-bar-toggler-popout:not(.b-bar-mobile-toggle):hover>*,.b-bar-vertical-small .b-bar-toggler-popout:not(.b-bar-mobile-toggle):hover>*{display:block}.b-bar-vertical-inline .b-bar-item,.b-bar-vertical-popout .b-bar-item,.b-bar-vertical-small .b-bar-item{margin:auto;flex-grow:1;min-height:40px}.b-bar-vertical-inline .b-bar-item .b-bar-icon,.b-bar-vertical-popout .b-bar-item .b-bar-icon,.b-bar-vertical-small .b-bar-item .b-bar-icon{font-size:1.25rem;vertical-align:middle;margin:3px;display:inline-block}.b-bar-vertical-inline .b-bar-start,.b-bar-vertical-popout .b-bar-start,.b-bar-vertical-small .b-bar-start{width:100%;display:block}.b-bar-vertical-inline .b-bar-end,.b-bar-vertical-popout .b-bar-end,.b-bar-vertical-small .b-bar-end{padding-bottom:1rem;width:100%;padding-top:1rem;display:block}.b-bar-vertical-inline .b-bar-end .b-bar-dropdown,.b-bar-vertical-popout .b-bar-end .b-bar-dropdown,.b-bar-vertical-small .b-bar-end .b-bar-dropdown{position:relative}.b-bar-vertical-inline .b-bar-end .b-bar-dropdown-menu-container,.b-bar-vertical-popout .b-bar-end .b-bar-dropdown-menu-container,.b-bar-vertical-small .b-bar-end .b-bar-dropdown-menu-container{bottom:0}.b-bar-vertical-inline .b-bar-link,.b-bar-vertical-popout .b-bar-link,.b-bar-vertical-small .b-bar-link{display:block;width:100%;text-decoration:none;padding:.5rem .5rem .5rem 1.5rem;cursor:pointer;overflow-x:hidden;line-height:1.5rem;vertical-align:middle;transition:font-size 150ms ease-in}.b-bar-vertical-inline .b-bar-label,.b-bar-vertical-popout .b-bar-label,.b-bar-vertical-small .b-bar-label{background:transparent;color:#adb5bd;padding:.375rem 1.25rem;font-size:.75rem;text-overflow:ellipsis;overflow-x:hidden}.b-bar-vertical-inline .b-bar-dropdown .b-bar-dropdown-toggle:before,.b-bar-vertical-popout .b-bar-dropdown .b-bar-dropdown-toggle:before,.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-toggle:before{content:" ";border:solid;border-width:0 2px 2px 0;display:inline-block;padding:2px;right:1rem;transition:transform 200ms ease-out;float:right;position:relative;-webkit-transform:rotate(225deg);transform:rotate(225deg);top:.7rem}.b-bar-vertical-inline .b-bar-dropdown:not([data-visible=true]) .b-bar-dropdown-toggle:before,.b-bar-vertical-popout .b-bar-dropdown:not([data-visible=true]) .b-bar-dropdown-toggle:before,.b-bar-vertical-small .b-bar-dropdown:not([data-visible=true]) .b-bar-dropdown-toggle:before{-webkit-transform:rotate(45deg);transform:rotate(45deg);top:.5rem}.b-bar-vertical-inline .b-bar-dropdown .b-bar-dropdown-menu,.b-bar-vertical-popout .b-bar-dropdown .b-bar-dropdown-menu,.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu{display:none;background:inherit;color:inherit;float:none;padding:5px 0}.b-bar-vertical-inline .b-bar-dropdown .b-bar-dropdown-menu[data-visible=true],.b-bar-vertical-popout .b-bar-dropdown .b-bar-dropdown-menu[data-visible=true],.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu[data-visible=true]{display:block}.b-bar-vertical-inline .b-bar-dropdown .b-bar-dropdown-menu .b-bar-dropdown-item,.b-bar-vertical-popout .b-bar-dropdown .b-bar-dropdown-menu .b-bar-dropdown-item,.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu .b-bar-dropdown-item{position:relative;color:inherit;transition:background 100ms ease-in-out,color 100ms ease-in-out;text-decoration:none;display:block;width:100%;overflow-x:hidden}.b-bar-vertical-inline .b-bar-dropdown .b-bar-dropdown-menu .b-bar-dropdown-item i,.b-bar-vertical-popout .b-bar-dropdown .b-bar-dropdown-menu .b-bar-dropdown-item i,.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu .b-bar-dropdown-item i{margin-right:.3rem}.b-bar-vertical-inline .b-bar-dropdown .b-bar-dropdown-menu:before,.b-bar-vertical-popout .b-bar-dropdown .b-bar-dropdown-menu:before,.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu:before{background:inherit;box-shadow:none}.b-bar-vertical-inline .b-bar-mobile-toggle,.b-bar-vertical-popout .b-bar-mobile-toggle,.b-bar-vertical-small .b-bar-mobile-toggle{right:20px;margin:auto;display:none}.b-bar-vertical-inline .b-bar-item-multi-line,.b-bar-vertical-popout .b-bar-item-multi-line,.b-bar-vertical-small .b-bar-item-multi-line{display:-webkit-box!important;-webkit-box-orient:vertical;-webkit-line-clamp:var(--b-bar-item-lines,2);white-space:normal!important;overflow:hidden;text-overflow:ellipsis}.b-bar-vertical-inline.b-bar-dark,.b-bar-vertical-popout.b-bar-dark,.b-bar-vertical-small.b-bar-dark{background:var(--b-bar-dark-background,#001529);color:var(--b-bar-dark-color,rgba(255,255,255,.5))}.b-bar-vertical-inline.b-bar-dark .b-bar-brand,.b-bar-vertical-popout.b-bar-dark .b-bar-brand,.b-bar-vertical-small.b-bar-dark .b-bar-brand{background:var(--b-bar-brand-dark-background,rgba(255,255,255,.025))}.b-bar-vertical-inline.b-bar-dark .b-bar-brand .b-bar-link,.b-bar-vertical-popout.b-bar-dark .b-bar-brand .b-bar-link,.b-bar-vertical-small.b-bar-dark .b-bar-brand .b-bar-link{color:#fff}.b-bar-vertical-inline.b-bar-dark .b-bar-brand .b-bar-link.active,.b-bar-vertical-popout.b-bar-dark .b-bar-brand .b-bar-link.active,.b-bar-vertical-small.b-bar-dark .b-bar-brand .b-bar-link.active{color:#fff;background:inherit}.b-bar-vertical-inline.b-bar-dark .b-bar-brand .b-bar-link:hover,.b-bar-vertical-popout.b-bar-dark .b-bar-brand .b-bar-link:hover,.b-bar-vertical-small.b-bar-dark .b-bar-brand .b-bar-link:hover{color:#fff;background:inherit}.b-bar-vertical-inline.b-bar-dark .b-bar-toggler-popout:not(.b-bar-mobile-toggle),.b-bar-vertical-popout.b-bar-dark .b-bar-toggler-popout:not(.b-bar-mobile-toggle),.b-bar-vertical-small.b-bar-dark .b-bar-toggler-popout:not(.b-bar-mobile-toggle){background:var(--b-bar-dark-background,#001529);color:var(--b-bar-dark-color,rgba(255,255,255,.5))}.b-bar-vertical-inline.b-bar-dark .b-bar-dropdown-menu,.b-bar-vertical-popout.b-bar-dark .b-bar-dropdown-menu,.b-bar-vertical-small.b-bar-dark .b-bar-dropdown-menu{background:var(--b-bar-dropdown-dark-background,#000c17)}.b-bar-vertical-inline.b-bar-dark .b-bar-dropdown-menu .b-bar-dropdown-item.active,.b-bar-vertical-popout.b-bar-dark .b-bar-dropdown-menu .b-bar-dropdown-item.active,.b-bar-vertical-small.b-bar-dark .b-bar-dropdown-menu .b-bar-dropdown-item.active{color:var(--b-bar-item-dark-active-color,#fff);background:var(--b-bar-item-dark-active-background,#0288d1)}.b-bar-vertical-inline.b-bar-dark .b-bar-dropdown-menu .b-bar-dropdown-item:hover,.b-bar-vertical-popout.b-bar-dark .b-bar-dropdown-menu .b-bar-dropdown-item:hover,.b-bar-vertical-small.b-bar-dark .b-bar-dropdown-menu .b-bar-dropdown-item:hover{color:var(--b-bar-item-dark-hover-color,#fff);background:var(--b-bar-item-dark-hover-background,rgba(255,255,255,.3))}.b-bar-vertical-inline.b-bar-dark .b-bar-link,.b-bar-vertical-popout.b-bar-dark .b-bar-link,.b-bar-vertical-small.b-bar-dark .b-bar-link{color:inherit}.b-bar-vertical-inline.b-bar-dark .b-bar-link.active,.b-bar-vertical-popout.b-bar-dark .b-bar-link.active,.b-bar-vertical-small.b-bar-dark .b-bar-link.active{color:var(--b-bar-item-dark-active-color,#fff);background:var(--b-bar-item-dark-active-background,#0288d1)}.b-bar-vertical-inline.b-bar-dark .b-bar-link:hover,.b-bar-vertical-popout.b-bar-dark .b-bar-link:hover,.b-bar-vertical-small.b-bar-dark .b-bar-link:hover{color:var(--b-bar-item-dark-hover-color,#fff);background:var(--b-bar-item-dark-hover-background,rgba(255,255,255,.3))}.b-bar-vertical-inline.b-bar-light,.b-bar-vertical-popout.b-bar-light,.b-bar-vertical-small.b-bar-light{background:var(--b-bar-light-background,#fff);color:var(--b-bar-light-color,rgba(0,0,0,.7))}.b-bar-vertical-inline.b-bar-light .b-bar-brand,.b-bar-vertical-popout.b-bar-light .b-bar-brand,.b-bar-vertical-small.b-bar-light .b-bar-brand{background:var(--b-bar-brand-light-background,rgba(0,0,0,.025))}.b-bar-vertical-inline.b-bar-light .b-bar-brand .b-bar-link,.b-bar-vertical-popout.b-bar-light .b-bar-brand .b-bar-link,.b-bar-vertical-small.b-bar-light .b-bar-brand .b-bar-link{color:#000}.b-bar-vertical-inline.b-bar-light .b-bar-brand .b-bar-link.active,.b-bar-vertical-popout.b-bar-light .b-bar-brand .b-bar-link.active,.b-bar-vertical-small.b-bar-light .b-bar-brand .b-bar-link.active{background:inherit}.b-bar-vertical-inline.b-bar-light .b-bar-brand .b-bar-link:hover,.b-bar-vertical-popout.b-bar-light .b-bar-brand .b-bar-link:hover,.b-bar-vertical-small.b-bar-light .b-bar-brand .b-bar-link:hover{background:inherit}.b-bar-vertical-inline.b-bar-light .b-bar-toggler-popout:not(.b-bar-mobile-toggle),.b-bar-vertical-popout.b-bar-light .b-bar-toggler-popout:not(.b-bar-mobile-toggle),.b-bar-vertical-small.b-bar-light .b-bar-toggler-popout:not(.b-bar-mobile-toggle){background:var(--b-bar-brand-light-background,#fff);color:var(--b-bar-light-color,rgba(0,0,0,.7))}.b-bar-vertical-inline.b-bar-light .b-bar-dropdown-menu,.b-bar-vertical-popout.b-bar-light .b-bar-dropdown-menu,.b-bar-vertical-small.b-bar-light .b-bar-dropdown-menu{background:var(--b-bar-dropdown-light-background,#f2f2f2)}.b-bar-vertical-inline.b-bar-light .b-bar-dropdown-menu .b-bar-dropdown-item.active,.b-bar-vertical-popout.b-bar-light .b-bar-dropdown-menu .b-bar-dropdown-item.active,.b-bar-vertical-small.b-bar-light .b-bar-dropdown-menu .b-bar-dropdown-item.active{color:var(--b-bar-item-light-active-color,#000);background:var(--b-bar-item-light-active-background,#0288d1)}.b-bar-vertical-inline.b-bar-light .b-bar-dropdown-menu .b-bar-dropdown-item:hover,.b-bar-vertical-popout.b-bar-light .b-bar-dropdown-menu .b-bar-dropdown-item:hover,.b-bar-vertical-small.b-bar-light .b-bar-dropdown-menu .b-bar-dropdown-item:hover{color:var(--b-bar-item-light-hover-color,#000);background:var(--b-bar-item-light-hover-background,rgba(0,0,0,.3))}.b-bar-vertical-inline.b-bar-light .b-bar-link,.b-bar-vertical-popout.b-bar-light .b-bar-link,.b-bar-vertical-small.b-bar-light .b-bar-link{color:inherit}.b-bar-vertical-inline.b-bar-light .b-bar-link.active,.b-bar-vertical-popout.b-bar-light .b-bar-link.active,.b-bar-vertical-small.b-bar-light .b-bar-link.active{color:var(--b-bar-item-light-active-color,#000);background:var(--b-bar-item-light-active-background,#0288d1)}.b-bar-vertical-inline.b-bar-light .b-bar-link:hover,.b-bar-vertical-popout.b-bar-light .b-bar-link:hover,.b-bar-vertical-small.b-bar-light .b-bar-link:hover{color:var(--b-bar-item-light-hover-color,#000);background:var(--b-bar-item-light-hover-background,rgba(0,0,0,.3))}.b-bar-vertical-small,.b-bar-vertical-inline[data-collapse=small],.b-bar-vertical-popout[data-collapse=small]{width:var(--b-vertical-bar-small-width,64px);min-width:var(--b-vertical-bar-small-width,64px)}.b-bar-vertical-small:not(.b-bar-initial),.b-bar-vertical-inline[data-collapse=small]:not(.b-bar-initial),.b-bar-vertical-popout[data-collapse=small]:not(.b-bar-initial){transition:width 200ms ease-in-out,min-width 200ms ease-in-out}.b-bar-vertical-small .b-bar-toggler-inline,.b-bar-vertical-inline[data-collapse=small] .b-bar-toggler-inline,.b-bar-vertical-popout[data-collapse=small] .b-bar-toggler-inline{position:relative;width:100%}.b-bar-vertical-small .b-bar-toggler-popout:not(.b-bar-mobile-toggle),.b-bar-vertical-inline[data-collapse=small] .b-bar-toggler-popout:not(.b-bar-mobile-toggle),.b-bar-vertical-popout[data-collapse=small] .b-bar-toggler-popout:not(.b-bar-mobile-toggle){left:var(--b-vertical-bar-small-width,64px)}.b-bar-vertical-small .b-bar-item>.b-bar-dropdown>.b-bar-dropdown-toggle:before,.b-bar-vertical-inline[data-collapse=small] .b-bar-item>.b-bar-dropdown>.b-bar-dropdown-toggle:before,.b-bar-vertical-popout[data-collapse=small] .b-bar-item>.b-bar-dropdown>.b-bar-dropdown-toggle:before{display:none}.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu-container,.b-bar-vertical-inline[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container,.b-bar-vertical-popout[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container{z-index:100;max-height:50vh;position:absolute!important;margin:-42px 5px 0 5px;display:flex;width:var(--b-vertical-bar-popout-menu-width,180px);left:var(--b-vertical-bar-small-width,64px)}.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu-container.b-bar-right,.b-bar-vertical-inline[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container.b-bar-right,.b-bar-vertical-popout[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container.b-bar-right{right:var(--b-vertical-bar-small-width,64px);left:unset}.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu,.b-bar-vertical-inline[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu,.b-bar-vertical-popout[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu{box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05);border-radius:3px;overflow-y:auto;overflow-x:hidden;flex:1 100%}.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu .b-bar-dropdown-item,.b-bar-vertical-inline[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu .b-bar-dropdown-item,.b-bar-vertical-popout[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu .b-bar-dropdown-item{padding:.5rem .5rem .5rem 1.5rem}.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu:before,.b-bar-vertical-inline[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu:before,.b-bar-vertical-popout[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu:before{position:absolute;top:0;left:-7px;right:0;bottom:0;width:100%;height:100%;opacity:.0001;content:" ";z-index:-1}.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu.b-bar-right:before,.b-bar-vertical-inline[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu.b-bar-right:before,.b-bar-vertical-popout[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu.b-bar-right:before{left:unset;right:-7px}.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown .b-bar-dropdown-menu-container,.b-bar-vertical-inline[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown .b-bar-dropdown-menu-container,.b-bar-vertical-popout[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown .b-bar-dropdown-menu-container{left:var(--b-vertical-bar-popout-menu-width,180px)}.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown .b-bar-dropdown-menu-container.b-bar-right,.b-bar-vertical-inline[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown .b-bar-dropdown-menu-container.b-bar-right,.b-bar-vertical-popout[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown .b-bar-dropdown-menu-container.b-bar-right{right:var(--b-vertical-bar-popout-menu-width,180px)}.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown .b-bar-dropdown-toggle:before,.b-bar-vertical-inline[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown .b-bar-dropdown-toggle:before,.b-bar-vertical-popout[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown .b-bar-dropdown-toggle:before{content:" ";border:solid;border-width:0 2px 2px 0;display:inline-block;padding:2px;right:1rem;transition:transform 200ms ease-out;float:right;position:relative;-webkit-transform:rotate(135deg);transform:rotate(135deg);right:.8rem}.b-bar-vertical-small .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown:not([data-visible=true]) .b-bar-dropdown-toggle:before,.b-bar-vertical-inline[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown:not([data-visible=true]) .b-bar-dropdown-toggle:before,.b-bar-vertical-popout[data-collapse=small] .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown:not([data-visible=true]) .b-bar-dropdown-toggle:before{-webkit-transform:rotate(315deg);transform:rotate(315deg)}@keyframes b-bar-link-small{to{text-align:center;padding-left:0;padding-right:0}}.b-bar-vertical-small .b-bar-item>.b-bar-link,.b-bar-vertical-small .b-bar-item>.b-bar-dropdown>.b-bar-link,.b-bar-vertical-inline[data-collapse=small] .b-bar-item>.b-bar-link,.b-bar-vertical-inline[data-collapse=small] .b-bar-item>.b-bar-dropdown>.b-bar-link,.b-bar-vertical-popout[data-collapse=small] .b-bar-item>.b-bar-link,.b-bar-vertical-popout[data-collapse=small] .b-bar-item>.b-bar-dropdown>.b-bar-link{animation:b-bar-link-small forwards;animation-delay:170ms;font-size:0;transition:font-size 100ms ease-out}.b-bar-vertical-small .b-bar-item>.b-bar-link:after,.b-bar-vertical-small .b-bar-item>.b-bar-dropdown>.b-bar-link:after,.b-bar-vertical-inline[data-collapse=small] .b-bar-item>.b-bar-link:after,.b-bar-vertical-inline[data-collapse=small] .b-bar-item>.b-bar-dropdown>.b-bar-link:after,.b-bar-vertical-popout[data-collapse=small] .b-bar-item>.b-bar-link:after,.b-bar-vertical-popout[data-collapse=small] .b-bar-item>.b-bar-dropdown>.b-bar-link:after{display:none}.b-bar-vertical-small .b-bar-label,.b-bar-vertical-inline[data-collapse=small] .b-bar-label,.b-bar-vertical-popout[data-collapse=small] .b-bar-label{text-align:center}.b-bar-vertical-inline:not([data-collapse]){overflow-y:auto;overflow-x:hidden}.b-bar-vertical-inline:not([data-collapse]) .b-bar-dropdown .b-bar-dropdown-menu-container{position:relative}.b-bar-vertical-inline:not([data-collapse]) .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu{position:relative!important;border:0;border-radius:0;box-shadow:none}.b-bar-vertical-inline:not([data-collapse]) .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu .b-bar-dropdown-item{padding:.5rem .5rem .5rem 3rem}.b-bar-vertical-inline:not([data-collapse]) .b-bar-brand .b-bar-link{display:flex;align-items:center}.b-bar-vertical-popout:not([data-collapse]) .b-bar-dropdown .b-bar-dropdown-toggle:before{content:" ";border:solid;border-width:0 2px 2px 0;display:inline-block;padding:2px;right:1rem;transition:transform 200ms ease-out;float:right;position:relative;-webkit-transform:rotate(135deg);transform:rotate(135deg);right:.8rem}.b-bar-vertical-popout:not([data-collapse]) .b-bar-dropdown:not([data-visible=true]) .b-bar-dropdown-toggle:before{-webkit-transform:rotate(315deg);transform:rotate(315deg)}.b-bar-vertical-popout:not([data-collapse]) .b-bar-dropdown .b-bar-dropdown-menu-container{z-index:100;max-height:50vh;position:absolute!important;margin:-42px 5px 0 5px;display:flex;width:var(--b-vertical-bar-popout-menu-width,180px);left:var(--b-vertical-bar-width,230px)}.b-bar-vertical-popout:not([data-collapse]) .b-bar-dropdown .b-bar-dropdown-menu-container.b-bar-right{right:var(--b-vertical-bar-width,230px);left:unset}.b-bar-vertical-popout:not([data-collapse]) .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu{box-shadow:0 3px 6px -4px rgba(0,0,0,.12),0 6px 16px 0 rgba(0,0,0,.08),0 9px 28px 8px rgba(0,0,0,.05);border-radius:3px;overflow-y:auto;overflow-x:hidden;flex:1 100%}.b-bar-vertical-popout:not([data-collapse]) .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu .b-bar-dropdown-item{padding:.5rem .5rem .5rem 1.5rem}.b-bar-vertical-popout:not([data-collapse]) .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu:before{position:absolute;top:0;left:-7px;right:0;bottom:0;width:100%;height:100%;opacity:.0001;content:" ";z-index:-1}.b-bar-vertical-popout:not([data-collapse]) .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu.b-bar-right:before{left:unset;right:-7px}.b-bar-vertical-popout:not([data-collapse]) .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown .b-bar-dropdown-menu-container{left:var(--b-vertical-bar-popout-menu-width,180px)}.b-bar-vertical-popout:not([data-collapse]) .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu>.b-bar-dropdown .b-bar-dropdown-menu-container.b-bar-right{right:var(--b-vertical-bar-popout-menu-width,180px)}.b-bar-vertical-inline[data-collapse=hide],.b-bar-vertical-popout[data-collapse=hide],.b-bar-vertical-small[data-collapse=hide]{width:0;min-width:0;overflow-y:hidden;visibility:hidden}.b-bar-vertical-inline[data-collapse=hide]:not(.b-bar-initial),.b-bar-vertical-popout[data-collapse=hide]:not(.b-bar-initial),.b-bar-vertical-small[data-collapse=hide]:not(.b-bar-initial){transition:width 200ms ease-in-out,min-width 200ms ease-in-out,visibility 100ms}.b-bar-vertical-inline[data-collapse=hide] .b-bar-toggler-inline,.b-bar-vertical-popout[data-collapse=hide] .b-bar-toggler-inline,.b-bar-vertical-small[data-collapse=hide] .b-bar-toggler-inline{display:none}.b-bar-vertical-inline[data-collapse=hide] .b-bar-toggler-popout:not(.b-bar-mobile-toggle),.b-bar-vertical-popout[data-collapse=hide] .b-bar-toggler-popout:not(.b-bar-mobile-toggle),.b-bar-vertical-small[data-collapse=hide] .b-bar-toggler-popout:not(.b-bar-mobile-toggle){visibility:visible;left:0}@media only screen and (max-width:576px){.b-bar-vertical-inline:not([data-collapse]){min-width:100vw}.b-bar-vertical-inline:not([data-collapse]) .b-bar-toggler-inline:not(.b-bar-mobile-toggle){display:none}.b-bar-vertical-inline:not([data-collapse]) .b-bar-toggler-popout:not(.b-bar-mobile-toggle){left:100vw}.b-bar-vertical-inline:not([data-collapse]) .b-bar-mobile-toggle{display:flex}}.b-table.table{position:relative}.b-table.table .b-table-resizer{position:absolute;top:0;right:0;width:5px;cursor:col-resize;user-select:none;z-index:1}.b-table.table .b-table-resizer:hover,.b-table.table .b-table-resizing{cursor:col-resize!important;border-right:2px solid var(--b-theme-primary,#00f)}.b-table.table .b-table-resizing{cursor:col-resize!important}thead tr th{position:relative}.b-character-casing-lower{text-transform:lowercase}.b-character-casing-upper{text-transform:uppercase}.b-character-casing-title{text-transform:lowercase}.b-character-casing-title::first-letter {text-transform:uppercase}.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08)}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1);animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none!important;box-shadow:none!important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:"";height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:contents}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,.9);fill:rgba(0,0,0,.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,.9);fill:rgba(0,0,0,.9)}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,.1)}.numInputWrapper span:active{background:rgba(0,0,0,.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,.5)}.numInputWrapper:hover{background:rgba(0,0,0,.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,.5);background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:0;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:0;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:0}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:0;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:rgba(57,57,57,.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,.3);background:transparent;cursor:default;border:0}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.flatpickr-monthSelect-months{margin:10px 1px 3px 1px;flex-wrap:wrap}.flatpickr-monthSelect-month{background:none;border:0;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;display:inline-block;font-weight:400;margin:.5px;justify-content:center;padding:10px;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;text-align:center;width:33%}.flatpickr-monthSelect-month.disabled{color:#eee}.flatpickr-monthSelect-month.disabled:hover,.flatpickr-monthSelect-month.disabled:focus{cursor:not-allowed;background:none!important}.flatpickr-monthSelect-theme-dark{background:#3f4458}.flatpickr-monthSelect-theme-dark .flatpickr-current-month input.cur-year{color:#fff}.flatpickr-monthSelect-theme-dark .flatpickr-months .flatpickr-prev-month,.flatpickr-monthSelect-theme-dark .flatpickr-months .flatpickr-next-month{color:#fff;fill:#fff}.flatpickr-monthSelect-theme-dark .flatpickr-monthSelect-month{color:rgba(255,255,255,.95)}.flatpickr-monthSelect-month:hover,.flatpickr-monthSelect-month:focus{background:#e6e6e6;cursor:pointer;outline:0}.flatpickr-monthSelect-theme-dark .flatpickr-monthSelect-month:hover,.flatpickr-monthSelect-theme-dark .flatpickr-monthSelect-month:focus{background:#646c8c;border-color:#646c8c}.flatpickr-monthSelect-month.selected{background-color:#569ff7;color:#fff}.flatpickr-monthSelect-theme-dark .flatpickr-monthSelect-month.selected{background:#80cbc4;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#80cbc4} /*! Pickr 1.8.2 MIT | https://github.com/Simonwep/pickr */ .pickr{position:relative;overflow:visible;transform:translateY(0)}.pickr *{box-sizing:border-box;outline:0;border:0;-webkit-appearance:none}.pickr .pcr-button{position:relative;height:2em;width:2em;padding:.5em;cursor:pointer;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Helvetica Neue",Arial,sans-serif;border-radius:.15em;background:url('data:image/svg+xml;utf8, ') no-repeat center;background-size:0;transition:all .3s}.pickr .pcr-button::before{position:absolute;content:"";top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, ');background-size:.5em;border-radius:.15em;z-index:-1}.pickr .pcr-button::before{z-index:initial}.pickr .pcr-button::after{position:absolute;content:"";top:0;left:0;height:100%;width:100%;transition:background .3s;background:var(--pcr-color);border-radius:.15em}.pickr .pcr-button.clear{background-size:70%}.pickr .pcr-button.clear::before{opacity:0}.pickr .pcr-button.clear:focus{box-shadow:0 0 0 1px rgba(255,255,255,.85),0 0 0 3px var(--pcr-color)}.pickr .pcr-button.disabled{cursor:not-allowed}.pickr *,.pcr-app *{box-sizing:border-box;outline:0;border:0;-webkit-appearance:none}.pickr input:focus,.pickr input.pcr-active,.pickr button:focus,.pickr button.pcr-active,.pcr-app input:focus,.pcr-app input.pcr-active,.pcr-app button:focus,.pcr-app button.pcr-active{box-shadow:0 0 0 1px rgba(255,255,255,.85),0 0 0 3px var(--pcr-color)}.pickr .pcr-palette,.pickr .pcr-slider,.pcr-app .pcr-palette,.pcr-app .pcr-slider{transition:box-shadow .3s}.pickr .pcr-palette:focus,.pickr .pcr-slider:focus,.pcr-app .pcr-palette:focus,.pcr-app .pcr-slider:focus{box-shadow:0 0 0 1px rgba(255,255,255,.85),0 0 0 3px rgba(0,0,0,.25)}.pcr-app{position:fixed;display:flex;flex-direction:column;z-index:10000;border-radius:.1em;background:#fff;opacity:0;visibility:hidden;transition:opacity .3s,visibility 0s .3s;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Helvetica Neue",Arial,sans-serif;box-shadow:0 .15em 1.5em 0 rgba(0,0,0,.1),0 0 1em 0 rgba(0,0,0,.03);left:0;top:0}.pcr-app.visible{transition:opacity .3s;visibility:visible;opacity:1}.pcr-app .pcr-swatches{display:flex;flex-wrap:wrap;margin-top:.75em}.pcr-app .pcr-swatches.pcr-last{margin:0}@supports(display:grid){.pcr-app .pcr-swatches{display:grid;align-items:center;grid-template-columns:repeat(auto-fit,1.75em)}}.pcr-app .pcr-swatches>button{font-size:1em;position:relative;width:calc(1.75em - 5px);height:calc(1.75em - 5px);border-radius:.15em;cursor:pointer;margin:2.5px;flex-shrink:0;justify-self:center;transition:all .15s;overflow:hidden;background:transparent;z-index:1}.pcr-app .pcr-swatches>button::before{position:absolute;content:"";top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, ');background-size:6px;border-radius:.15em;z-index:-1}.pcr-app .pcr-swatches>button::after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background:var(--pcr-color);border:1px solid rgba(0,0,0,.05);border-radius:.15em;box-sizing:border-box}.pcr-app .pcr-swatches>button:hover{filter:brightness(1.05)}.pcr-app .pcr-swatches>button:not(.pcr-active){box-shadow:none}.pcr-app .pcr-interaction{display:flex;flex-wrap:wrap;align-items:center;margin:0 -.2em 0 -.2em}.pcr-app .pcr-interaction>*{margin:0 .2em}.pcr-app .pcr-interaction input{letter-spacing:.07em;font-size:.75em;text-align:center;cursor:pointer;color:#75797e;background:#f1f3f4;border-radius:.15em;transition:all .15s;padding:.45em .5em;margin-top:.75em}.pcr-app .pcr-interaction input:hover{filter:brightness(.975)}.pcr-app .pcr-interaction input:focus{box-shadow:0 0 0 1px rgba(255,255,255,.85),0 0 0 3px rgba(66,133,244,.75)}.pcr-app .pcr-interaction .pcr-result{color:#75797e;text-align:left;flex:1 1 8em;min-width:8em;transition:all .2s;border-radius:.15em;background:#f1f3f4;cursor:text}.pcr-app .pcr-interaction .pcr-result::-moz-selection{background:#4285f4;color:#fff}.pcr-app .pcr-interaction .pcr-result::selection{background:#4285f4;color:#fff}.pcr-app .pcr-interaction .pcr-type.active{color:#fff;background:#4285f4}.pcr-app .pcr-interaction .pcr-save,.pcr-app .pcr-interaction .pcr-cancel,.pcr-app .pcr-interaction .pcr-clear{color:#fff;width:auto}.pcr-app .pcr-interaction .pcr-save,.pcr-app .pcr-interaction .pcr-cancel,.pcr-app .pcr-interaction .pcr-clear{color:#fff}.pcr-app .pcr-interaction .pcr-save:hover,.pcr-app .pcr-interaction .pcr-cancel:hover,.pcr-app .pcr-interaction .pcr-clear:hover{filter:brightness(.925)}.pcr-app .pcr-interaction .pcr-save{background:#4285f4}.pcr-app .pcr-interaction .pcr-clear,.pcr-app .pcr-interaction .pcr-cancel{background:#f44250}.pcr-app .pcr-interaction .pcr-clear:focus,.pcr-app .pcr-interaction .pcr-cancel:focus{box-shadow:0 0 0 1px rgba(255,255,255,.85),0 0 0 3px rgba(244,66,80,.75)}.pcr-app .pcr-selection .pcr-picker{position:absolute;height:18px;width:18px;border:2px solid #fff;border-radius:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pcr-app .pcr-selection .pcr-color-palette,.pcr-app .pcr-selection .pcr-color-chooser,.pcr-app .pcr-selection .pcr-color-opacity{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:column;cursor:grab;cursor:-webkit-grab}.pcr-app .pcr-selection .pcr-color-palette:active,.pcr-app .pcr-selection .pcr-color-chooser:active,.pcr-app .pcr-selection .pcr-color-opacity:active{cursor:grabbing;cursor:-webkit-grabbing}.pcr-app[data-theme=monolith]{width:14.25em;max-width:95vw;padding:.8em}.pcr-app[data-theme=monolith] .pcr-selection{display:flex;flex-direction:column;justify-content:space-between;flex-grow:1}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-preview{position:relative;z-index:1;width:100%;height:1em;display:flex;flex-direction:row;justify-content:space-between;margin-bottom:.5em}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-preview::before{position:absolute;content:"";top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, ');background-size:.5em;border-radius:.15em;z-index:-1}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-preview .pcr-last-color{cursor:pointer;transition:background-color .3s,box-shadow .3s;border-radius:.15em 0 0 .15em;z-index:2}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-preview .pcr-current-color{border-radius:0 .15em .15em 0}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-preview .pcr-last-color,.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-preview .pcr-current-color{background:var(--pcr-color);width:50%;height:100%}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-palette{width:100%;height:8em;z-index:1}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-palette .pcr-palette{border-radius:.15em;width:100%;height:100%}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-palette .pcr-palette::before{position:absolute;content:"";top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, ');background-size:.5em;border-radius:.15em;z-index:-1}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-chooser,.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-opacity{height:.5em;margin-top:.75em}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-chooser .pcr-picker,.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-opacity .pcr-picker{top:50%;transform:translateY(-50%)}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-chooser .pcr-slider,.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-opacity .pcr-slider{flex-grow:1;border-radius:50em}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-chooser .pcr-slider{background:linear-gradient(to right,#f00,#ff0,#0f0,#0ff,#00f,#f0f,#f00)}.pcr-app[data-theme=monolith] .pcr-selection .pcr-color-opacity .pcr-slider{background:linear-gradient(to right,transparent,#000),url('data:image/svg+xml;utf8, ');background-size:100%,.25em} -.badge-close{cursor:pointer}.badge-close::before{height:2px;width:50%}.badge-close::after{height:50%;width:2px}.badge-close:hover,.badge-close:focus{background-color:rgba(10,10,10,.3)}.badge-close:active{background-color:rgba(10,10,10,.4)}.navbar-nav .nav-item:hover{cursor:pointer}.navbar-nav .nav-link:hover{cursor:pointer}.nav .nav-link:hover{cursor:pointer}.nav-item{position:relative}.b-bar-horizontal .nav-item.dropdown .dropdown-menu>.dropdown>.dropdown-item{width:100%}.b-bar-horizontal .nav-item.dropdown .dropdown-menu>.dropdown>.dropdown-item::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.b-bar-horizontal .nav-item.dropdown .dropdown-menu>.dropdown>.dropdown-item:empty::after{margin-left:0}.b-bar-horizontal .nav-item.dropdown .dropdown-menu>.dropdown>.dropdown-item::after{transform:rotate(-90deg);position:absolute;right:10%;top:45%}.b-bar-horizontal .nav-item.dropdown .dropdown-menu>.dropdown>.dropdown-menu{top:0;left:100%;margin-left:0;margin-right:.1rem}.btn-group>.b-tooltip:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.b-tooltip:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group.btn-group-toggle .btn.active.disabled{opacity:1}.btn-group-vertical>.b-tooltip:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.b-tooltip:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-xs,.btn-group-xs>.btn{padding:.15rem .5rem;font-size:.75rem;line-height:1.5;border-radius:.15rem}.btn-md,.btn-group-md>.btn{padding:.47rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.25rem}.btn-xl,.btn-group-xl>.btn{padding:.5rem 1rem;font-size:1.5rem;line-height:1.5;border-radius:1rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.card-deck .card{height:100%;margin-bottom:.75rem}@media(min-width:576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-.75rem;margin-left:-.75rem}.card-deck .card{flex:1 0 0%;margin-right:.75rem;margin-bottom:0;margin-left:.75rem}}hr.divider.divider-text{position:unset}hr.divider.divider-text::before{top:unset}.table-fixed-header .table thead tr th.dropdown-table-fixed-header-visible{z-index:11}.dropdown-menu-position-strategy{width:max-content;top:0;left:0}.dropdown-menu-position-strategy-absolute{position:absolute}.dropdown-menu-position-strategy-fixed{position:fixed}.dropdown-toggle.dropdown-toggle-hidden::after{content:none!important}.dropdown-toggle.dropdown-toggle-hidden::before{content:none!important}.dropdown-menu.show{animation-duration:.3s;animation-fill-mode:both;animation-name:fadeIn}.dropdown-menu a:not([href]).dropdown-item:not(.disabled){cursor:pointer}.dropdown-menu.dropdown-menu-scrollable{max-height:var(--dropdown-list-menu-max-height,200px);overflow-y:scroll}.b-is-autocomplete .dropdown-menu{width:100%;max-height:var(--autocomplete-menu-max-height,200px);overflow-y:scroll}.b-is-autocomplete .dropdown-menu .dropdown-item.focus{color:#1e2125!important;background-color:#e9ecef}.b-is-autocomplete.b-is-autocomplete-multipleselection{display:flex;align-items:center;flex-wrap:wrap;max-width:100%;width:100%;cursor:text;min-height:calc(1.5em + .75rem + 2px);height:auto;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.b-is-autocomplete.b-is-autocomplete-multipleselection>input.form-control{display:inline-block;border:0;box-shadow:none;outline:0;background-color:transparent;max-width:inherit;width:auto;flex-grow:1}.b-is-autocomplete.b-is-autocomplete-multipleselection>.badge{margin-top:.25rem;margin-bottom:.25rem;line-height:1.5;flex-grow:initial}.b-is-autocomplete.b-is-autocomplete-multipleselection .dropdown-menu{top:100%}.b-is-autocomplete.b-is-autocomplete-multipleselection.focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.dropdown.btn-group>.btn.dropdown-toggle-split+.dropdown-menu.show{top:100%}.dropdown{position:relative}.dropdown .btn.dropdown-toggle:not(.btn-outline){box-shadow:none;border:0}.dropdown.dropdown-disabled.b-is-autocomplete{background-color:var(--b-theme-light,#e9ecef)}.dropdown>.dropdown-menu>.dropdown:not(.dropup,.dropstart,.dropend){position:relative}.dropdown>.dropdown-menu>.dropdown:not(.dropup,.dropstart,.dropend)>.dropdown-toggle{width:100%}.dropdown>.dropdown-menu>.dropdown:not(.dropup,.dropstart,.dropend)>.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown>.dropdown-menu>.dropdown:not(.dropup,.dropstart,.dropend)>.dropdown-toggle:empty::after{margin-left:0}.dropdown>.dropdown-menu>.dropdown:not(.dropup,.dropstart,.dropend)>.dropdown-toggle::after{position:absolute;right:10%;top:45%}.dropdown>.dropdown-menu>.dropdown:not(.dropup,.dropstart,.dropend)>.dropdown-menu{top:auto;left:auto;bottom:auto;right:auto}.dropdown>.dropdown-menu>.dropdown.dropup .dropdown-toggle::after,.dropdown>.dropdown-menu>.dropdown.dropend .dropdown-toggle::after{vertical-align:0;position:absolute;right:10%;top:45%}.dropdown>.dropdown-menu>.dropdown.dropstart .dropdown-toggle::after{vertical-align:0}.dropdown.dropup>.dropdown-menu{top:auto;bottom:auto;margin-top:0;margin-bottom:.125rem}.dropdown.dropup>.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropdown.dropup>.dropdown-toggle:empty::after{margin-left:0}.dropdown.dropend>.dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropdown.dropend>.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropdown.dropend>.dropdown-toggle:empty::after{margin-left:0}.dropdown.dropend>.dropdown-toggle::after{vertical-align:0}.dropdown.dropstart>.dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropdown.dropstart>.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropdown.dropstart>.dropdown-toggle::after{display:none}.dropdown.dropstart>.dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropdown.dropstart>.dropdown-toggle:empty::after{margin-left:0}.dropdown.dropstart>.dropdown-toggle::before{vertical-align:0}.dropdown-menu-start{right:auto;left:0}.dropdown-menu-end{right:0;left:auto}@media(min-width:576px){.dropdown-menu-sm-start{right:auto;left:0}.dropdown-menu-sm-end{right:0;left:auto}}@media(min-width:768px){.dropdown-menu-md-start{right:auto;left:0}.dropdown-menu-md-end{right:0;left:auto}}@media(min-width:992px){.dropdown-menu-lg-start{right:auto;left:0}.dropdown-menu-lg-end{right:0;left:auto}}@media(min-width:1200px){.dropdown-menu-xl-start{right:auto;left:0}.dropdown-menu-xl-end{right:0;left:auto}}@media(min-width:1400px){.dropdown-menu-xxl-start{right:auto;left:0}.dropdown-menu-xxl-end{right:0;left:auto}}.figure.figure-is-16x16{height:16px;width:16px}.figure.figure-is-24x24{height:24px;width:24px}.figure.figure-is-32x32{height:32px;width:32px}.figure.figure-is-48x48{height:48px;width:48px}.figure.figure-is-64x64{height:64px;width:64px}.figure.figure-is-96x96{height:96px;width:96px}.figure.figure-is-128x128{height:128px;width:128px}.figure.figure-is-256x256{height:256px;width:256px}.figure.figure-is-512x512{height:512px;width:512px}.form-check>.form-check-input.form-check-input-pointer,.form-check>.form-check-label.form-check-label-pointer,.form-switch>.form-check-input.form-check-input-pointer,.form-switch>.form-check-label.form-check-label-pointer{cursor:pointer}.form-control-plaintext.form-control-xs,.form-control-plaintext.form-control-md,.form-control-plaintext.form-control-xl{padding-right:0;padding-left:0}.form-control-xs{height:calc(1.5em + .3rem + calc(var(--bs-border-width)*2));padding:.15rem .5rem;font-size:.75rem;line-height:1.5;border-radius:.15rem}.form-control-md{height:calc(1.5em + .94rem + calc(var(--bs-border-width)*2));padding:.47rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.25rem}.form-control-xl{height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2));padding:.5rem 1rem;font-size:1.5rem;line-height:1.5;border-radius:1rem}.form-select-xs{height:calc(1.5em + .3rem + calc(var(--bs-border-width)*2));padding-top:.15rem;padding-bottom:.15rem;padding-left:.5rem;font-size:.75rem}.form-select-md{height:calc(1.5em + .94rem + calc(var(--bs-border-width)*2));padding-top:.47rem;padding-bottom:.47rem;padding-left:1rem;font-size:1.125rem}.form-select-xl{height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2));padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.5rem}.input-group>.b-numeric:not(:last-child)>input,.input-group>div.flatpickr-wrapper:not(:last-child)>input{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.b-numeric:not(:first-child)>input,.input-group>div.flatpickr-wrapper:not(:first-child)>input{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-xs>.form-control:not(textarea),.input-group-xs>.form-select,.input-group-xs>.b-numeric>input{height:calc(1.5em + .3rem + calc(var(--bs-border-width)*2))}.input-group-xs>.form-control,.input-group-xs>.form-select,.input-group-xs>.input-group-text,.input-group-xs>.btn,.input-group-xs>.b-numeric>input{padding:.15rem .5rem;font-size:.75rem;line-height:1.5;border-radius:.15rem}.input-group-sm>.b-numeric>input{height:calc(1.5em + .5rem + calc(var(--bs-border-width)*2))}.input-group-sm>.b-numeric>input{padding:.25rem .5rem;font-size:.875rem;line-height:1.25;border-radius:var(--bs-border-radius-sm)}.input-group-md>.form-control:not(textarea),.input-group-md>.form-select,.input-group-md>.b-numeric>input{height:calc(1.5em + .94rem + calc(var(--bs-border-width)*2))}.input-group-md>.form-control,.input-group-md>.form-select,.input-group-md>.input-group-text,.input-group-md>.btn,.input-group-md>.b-numeric>input{padding:.47rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.25rem}.input-group-lg>.b-numeric>input{height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2))}.input-group-lg>.b-numeric>input{padding:.5rem 1rem;font-size:1.25rem;line-height:2;border-radius:var(--bs-border-radius-lg)}.input-group-xl>.form-control:not(textarea),.input-group-xl>.form-select,.input-group-xl>.b-numeric>input{height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2))}.input-group-xl>.form-control,.input-group-xl>.form-select,.input-group-xl>.input-group-text,.input-group-xl>.btn,.input-group-xl>.b-numeric>input{padding:.5rem 1rem;font-size:1.5rem;line-height:1.5;border-radius:1rem}.input-group-xs>.form-select,.input-group-md>.form-select,.input-group-xl>.form-select{padding-right:1.75rem}.input-group:not(.has-validation)>.dropdown:first-child>.btn:not(:last-child).dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown>.btn:not(:last-child).dropdown-toggle,.input-group.has-validation>.dropdown>.btn:not(:last-child):not(.dropdown-toggle){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>div.flatpickr-wrapper>.form-control{position:relative;flex:1 1 auto;width:1%;min-width:0}.form-check>.form-check-input.form-check-input-xs{width:.7rem;height:.7rem}.form-check>.form-check-input.form-check-input-xs+.form-check-label{line-height:"normal";padding-left:0}.form-check>.form-check-input.form-check-input-sm{width:.8rem;height:.8rem}.form-check>.form-check-input.form-check-input-sm+.form-check-label{line-height:"normal";padding-left:0}.form-check>.form-check-input.form-check-input-md{width:1.25rem;height:1.25rem}.form-check>.form-check-input.form-check-input-md+.form-check-label{line-height:1.7rem;padding-left:3px}.form-check>.form-check-input.form-check-input-lg{width:1.55rem;height:1.55rem}.form-check>.form-check-input.form-check-input-lg+.form-check-label{line-height:2rem;padding-left:6px}.form-check>.form-check-input.form-check-input-xl{width:1.85rem;height:1.85rem}.form-check>.form-check-input.form-check-input-xl+.form-check-label{line-height:2.5rem;padding-left:10px}select[readonly]{pointer-events:none}select[readonly] option,select[readonly] optgroup{display:none}.b-numeric{position:relative;width:100%}.b-numeric:hover>.b-numeric-handler-wrap{opacity:1}.b-numeric input:disabled+.b-numeric-handler-wrap,.b-numeric input:read-only+.b-numeric-handler-wrap{display:none}.b-numeric-handler-wrap{position:absolute;top:0;right:0;width:22px;height:100%;background:#fff;border:1px solid #d9d9d9;opacity:0}.input-group .b-numeric{-ms-flex:1 1 auto;flex:1 1 auto;width:1%}.b-numeric-handler-wrap .b-numeric-handler.b-numeric-handler-down{border-top:1px solid #d9d9d9}.b-numeric-handler{position:relative;display:flex;width:100%;height:50%;overflow:hidden;color:rgba(0,0,0,.45);font-weight:700;line-height:0;align-items:center;justify-content:center}.b-numeric-handler.btn{padding:0}.form-control+.b-numeric-handler-wrap{font-size:1rem;border-top-right-radius:var(--bs-border-radius);border-bottom-right-radius:var(--bs-border-radius)}.form-control-xs+.b-numeric-handler-wrap{font-size:.75rem;border-top-right-radius:.15rem;border-bottom-right-radius:.15rem}.form-control-xs+.b-numeric-handler-wrap>.b-numeric-handler.btn{font-size:.75rem}.form-control-sm+.b-numeric-handler-wrap{font-size:.875rem;border-top-right-radius:var(--bs-border-radius-sm);border-bottom-right-radius:var(--bs-border-radius-sm)}.form-control-sm+.b-numeric-handler-wrap>.b-numeric-handler.btn{font-size:.875rem}.form-control-md+.b-numeric-handler-wrap{font-size:1.125rem;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.form-control-md+.b-numeric-handler-wrap>.b-numeric-handler.btn{font-size:1.125rem}.form-control-lg+.b-numeric-handler-wrap{font-size:1.25rem;border-top-right-radius:var(--bs-border-radius-lg);border-bottom-right-radius:var(--bs-border-radius-lg)}.form-control-lg+.b-numeric-handler-wrap>.b-numeric-handler.btn{font-size:1.25rem}.form-control-xl+.b-numeric-handler-wrap{font-size:1.5rem;border-top-right-radius:1rem;border-bottom-right-radius:1rem}.form-control-xl+.b-numeric-handler-wrap>.b-numeric-handler.btn{font-size:1.5rem}.custom-file-label{overflow:hidden}input[readonly][type=range],input[readonly=readonly][type=range]{pointer-events:none}input[readonly][type=range]::-webkit-slider-thumb,input[readonly=readonly][type=range]::-webkit-slider-thumb{pointer-events:none}input[readonly][type=range]::-moz-range-thumb,input[readonly=readonly][type=range]::-moz-range-thumb{pointer-events:none}input[readonly][type=range]::-ms-thumb,input[readonly=readonly][type=range]::-ms-thumb{pointer-events:none}.form-group{margin-bottom:1rem}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media(min-width:576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .form-select{align-items:center;justify-content:center}.form-inline .form-check-label{margin-bottom:0}}.b-input-color-picker{padding:.5rem .6rem}.b-input-color-picker>.b-input-color-picker-preview{height:.55rem}.focus-trap{display:contents}.form-file input[type=file]{margin-left:-2px!important}.form-file input[type=file]::-webkit-file-upload-button{display:none}.form-file input[type=file]::file-selector-button{display:none}.form-label-required:after{content:" *";color:var(--b-theme-danger,#dc3545)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.5rem}@media(min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.jumbotron.jumbotron-primary{background-color:#0d6efd;color:#fff}.jumbotron.jumbotron-secondary{background-color:#6c757d;color:#fff}.jumbotron.jumbotron-success{background-color:#198754;color:#fff}.jumbotron.jumbotron-info{background-color:#0dcaf0;color:#000}.jumbotron.jumbotron-warning{background-color:#ffc107;color:#000}.jumbotron.jumbotron-danger{background-color:#dc3545;color:#fff}.jumbotron.jumbotron-light{background-color:#f8f9fa;color:#000}.jumbotron.jumbotron-dark{background-color:#212529;color:#fff}.jumbotron.jumbotron-link{background-color:#3273dc;color:#fff}.b-layout-header-fixed{z-index:1030}.b-layout-footer-fixed{z-index:1030}.b-layout-sider-content{z-index:1031}a.link-unstyled{text-decoration:none;color:inherit}li.list-group-item-action{cursor:pointer}.list-group-scrollable{overflow-y:scroll}.media{display:flex;align-items:flex-start}.media-body{flex:1}.modal.fade{transition:opacity var(--modal-animation-duration,300ms) linear}.modal.fade .modal-dialog{transition:-webkit-transform var(--modal-animation-duration,300ms) ease-out;transition:transform var(--modal-animation-duration,300ms) ease-out}.offcanvas-footer{position:sticky;bottom:0;top:auto;display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.page-item:not(.disabled) .page-link{cursor:pointer}.pagination-xs .page-link{padding:.125rem .25rem;font-size:.75rem;line-height:1.5}.pagination-xs .page-item:first-child .page-link{border-top-left-radius:.15rem;border-bottom-left-radius:.15rem}.pagination-xs .page-item:last-child .page-link{border-top-right-radius:.15rem;border-bottom-right-radius:.15rem}.pagination-md .page-link{padding:.625rem 1.25rem;font-size:1.125rem;line-height:1.5}.pagination-md .page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.pagination-md .page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-xl .page-link{padding:1rem 2rem;font-size:1.5rem;line-height:1.5}.pagination-xl .page-item:first-child .page-link{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.pagination-xl .page-item:last-child .page-link{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-primary{background-color:#0d6efd}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-secondary{background-color:#6c757d}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-success{background-color:#198754}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-info{background-color:#0dcaf0}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-warning{background-color:#ffc107}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-danger{background-color:#dc3545}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-light{background-color:#f8f9fa}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-dark{background-color:#212529}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-link{background-color:#3273dc}.rating:not(.rating-disabled):not(.rating-readonly):hover .rating-item{cursor:pointer}.rating.rating-disabled{opacity:.65}.rating .rating-item.rating-item-primary{color:#0d6efd}.rating .rating-item.rating-item-secondary{color:#6c757d}.rating .rating-item.rating-item-success{color:#198754}.rating .rating-item.rating-item-info{color:#0dcaf0}.rating .rating-item.rating-item-warning{color:#ffc107}.rating .rating-item.rating-item-danger{color:#dc3545}.rating .rating-item.rating-item-light{color:#f8f9fa}.rating .rating-item.rating-item-dark{color:#212529}.rating .rating-item.rating-item-link{color:#3273dc}.rating .rating-item.rating-item-hover{opacity:.7}.steps{padding:0;margin:0;list-style:none;display:flex;overflow-x:auto}.steps .step:first-child{margin-left:auto}.steps .step:last-child{margin-right:auto}.step:first-of-type .step-circle::before{display:none}.step:last-of-type .step-container{padding-right:0}.step-container{box-sizing:content-box;display:flex;align-items:center;flex-direction:column;width:5rem;min-width:5rem;max-width:5rem;padding-top:.5rem;padding-right:1rem}.step-circle{position:relative;display:flex;justify-content:center;align-items:center;width:1.5rem;height:1.5rem;color:#adb5bd;border:2px solid #adb5bd;border-radius:100%;background-color:#fff}.step-circle::before{content:"";display:block;position:absolute;top:50%;left:-2px;width:calc(5rem + 1rem - 1.5rem);height:2px;transform:translate(-100%,-50%);color:#adb5bd;background-color:currentColor}.step-text{color:#adb5bd;word-break:keep-all;text-align:center;margin-top:.25em}.step-completed .step-circle{color:#fff;background-color:#198754;border-color:#198754}.step-completed .step-circle::before{color:#198754}.step-completed .step-text{color:#198754}.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-active .step-circle::before{color:#0d6efd}.step-active .step-text{color:#0d6efd}.step-primary .step-circle{color:#0d6efd;border-color:#0d6efd}.step-primary.step-completed .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-primary.step-completed .step-circle::before{color:#0d6efd}.step-primary.step-completed .step-text{color:#0d6efd}.step-primary.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-primary.step-active::before{color:#0d6efd}.step-primary.step-active .step-text{color:#0d6efd}.step-secondary .step-circle{color:#6c757d;border-color:#6c757d}.step-secondary.step-completed .step-circle{color:#fff;background-color:#6c757d;border-color:#6c757d}.step-secondary.step-completed .step-circle::before{color:#6c757d}.step-secondary.step-completed .step-text{color:#6c757d}.step-secondary.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-secondary.step-active::before{color:#0d6efd}.step-secondary.step-active .step-text{color:#0d6efd}.step-success .step-circle{color:#198754;border-color:#198754}.step-success.step-completed .step-circle{color:#fff;background-color:#198754;border-color:#198754}.step-success.step-completed .step-circle::before{color:#198754}.step-success.step-completed .step-text{color:#198754}.step-success.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-success.step-active::before{color:#0d6efd}.step-success.step-active .step-text{color:#0d6efd}.step-info .step-circle{color:#0dcaf0;border-color:#0dcaf0}.step-info.step-completed .step-circle{color:#fff;background-color:#0dcaf0;border-color:#0dcaf0}.step-info.step-completed .step-circle::before{color:#0dcaf0}.step-info.step-completed .step-text{color:#0dcaf0}.step-info.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-info.step-active::before{color:#0d6efd}.step-info.step-active .step-text{color:#0d6efd}.step-warning .step-circle{color:#ffc107;border-color:#ffc107}.step-warning.step-completed .step-circle{color:#fff;background-color:#ffc107;border-color:#ffc107}.step-warning.step-completed .step-circle::before{color:#ffc107}.step-warning.step-completed .step-text{color:#ffc107}.step-warning.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-warning.step-active::before{color:#0d6efd}.step-warning.step-active .step-text{color:#0d6efd}.step-danger .step-circle{color:#dc3545;border-color:#dc3545}.step-danger.step-completed .step-circle{color:#fff;background-color:#dc3545;border-color:#dc3545}.step-danger.step-completed .step-circle::before{color:#dc3545}.step-danger.step-completed .step-text{color:#dc3545}.step-danger.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-danger.step-active::before{color:#0d6efd}.step-danger.step-active .step-text{color:#0d6efd}.step-light .step-circle{color:#f8f9fa;border-color:#f8f9fa}.step-light.step-completed .step-circle{color:#fff;background-color:#f8f9fa;border-color:#f8f9fa}.step-light.step-completed .step-circle::before{color:#f8f9fa}.step-light.step-completed .step-text{color:#f8f9fa}.step-light.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-light.step-active::before{color:#0d6efd}.step-light.step-active .step-text{color:#0d6efd}.step-dark .step-circle{color:#212529;border-color:#212529}.step-dark.step-completed .step-circle{color:#fff;background-color:#212529;border-color:#212529}.step-dark.step-completed .step-circle::before{color:#212529}.step-dark.step-completed .step-text{color:#212529}.step-dark.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-dark.step-active::before{color:#0d6efd}.step-dark.step-active .step-text{color:#0d6efd}.step-link .step-circle{color:#3273dc;border-color:#3273dc}.step-link.step-completed .step-circle{color:#fff;background-color:#3273dc;border-color:#3273dc}.step-link.step-completed .step-circle::before{color:#3273dc}.step-link.step-completed .step-text{color:#3273dc}.step-link.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-link.step-active::before{color:#0d6efd}.step-link.step-active .step-text{color:#0d6efd}.steps-content{margin:1rem 0}.steps-content>.step-panel{display:none}.steps-content>.active{display:block}.form-check.form-switch .form-check-input.form-check-input-primary:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check.form-switch .form-check-input.form-check-input-secondary:checked{background-color:#6c757d;border-color:#6c757d}.form-check.form-switch .form-check-input.form-check-input-success:checked{background-color:#198754;border-color:#198754}.form-check.form-switch .form-check-input.form-check-input-info:checked{background-color:#0dcaf0;border-color:#0dcaf0}.form-check.form-switch .form-check-input.form-check-input-warning:checked{background-color:#ffc107;border-color:#ffc107}.form-check.form-switch .form-check-input.form-check-input-danger:checked{background-color:#dc3545;border-color:#dc3545}.form-check.form-switch .form-check-input.form-check-input-light:checked{background-color:#f8f9fa;border-color:#f8f9fa}.form-check.form-switch .form-check-input.form-check-input-dark:checked{background-color:#212529;border-color:#212529}.form-check.form-switch .form-check-input.form-check-input-link:checked{background-color:#3273dc;border-color:#3273dc}.form-check.form-switch .form-check-input.form-check-input-xs{width:calc(.75rem + (.5rem/2));height:.5rem;margin-left:-2.5em}.form-check.form-switch .form-check-input.form-check-input-xs+.form-check-label{line-height:1rem;vertical-align:middle;padding-left:0}.form-check.form-switch .form-check-input.form-check-input-xs:checked~.form-check-label::after{transform:translateX(calc(.75rem - (.5rem/2)))}.form-check.form-switch .form-check-input.form-check-input-sm{width:calc(1rem + (.75rem/2));height:.75rem;margin-left:-2.5em}.form-check.form-switch .form-check-input.form-check-input-sm+.form-check-label{line-height:1.25rem;vertical-align:middle;padding-left:.75rem}.form-check.form-switch .form-check-input.form-check-input-sm:checked~.form-check-label::after{transform:translateX(calc(1rem - (.75rem/2)))}.form-check.form-switch .form-check-input.form-check-input-md{width:calc(2rem + (1.5rem/2));height:1.5rem;margin-left:-2.5em}.form-check.form-switch .form-check-input.form-check-input-md+.form-check-label{line-height:2rem;vertical-align:middle;padding-left:.75rem}.form-check.form-switch .form-check-input.form-check-input-md:checked~.form-check-label::after{transform:translateX(calc(2rem - (1.5rem/2)))}.form-check.form-switch .form-check-input.form-check-input-lg{width:calc(3rem + (2rem/2));height:2rem;margin-left:-2.5em}.form-check.form-switch .form-check-input.form-check-input-lg+.form-check-label{line-height:2.5rem;vertical-align:middle;padding-left:.75rem}.form-check.form-switch .form-check-input.form-check-input-lg:checked~.form-check-label::after{transform:translateX(calc(3rem - (2rem/2)))}.form-check.form-switch .form-check-input.form-check-input-xl{width:calc(4rem + (2.5rem/2));height:2.5rem;margin-left:-2.5em}.form-check.form-switch .form-check-input.form-check-input-xl+.form-check-label{line-height:3rem;vertical-align:middle;padding-left:.75rem}.form-check.form-switch .form-check-input.form-check-input-xl:checked~.form-check-label::after{transform:translateX(calc(4rem - (2.5rem/2)))}table.table tbody tr:not(.table-group).selected{background-color:var(--bs-primary)}table.table tbody tr.table-group{cursor:pointer;background-color:var(--b-theme-light,var(--bs-light,#f5f5f5));font-weight:700}tr.table-row-selectable:hover{cursor:pointer}tr.table-row-selectable:focus[tabindex="0"]{outline:0}.table-fixed-header{overflow-y:auto}.table-fixed-header>.table{border-collapse:separate;border-spacing:0}.table-fixed-header>.table>thead:not(.table-thead-theme)>tr>th{background:#fff}.table-fixed-header>.table>thead>tr>th{border-top:0;position:sticky;z-index:10}.table-fixed-header>.table>thead>tr:nth-child(1)>th{top:0}.table-fixed-header>.table-bordered>:not(caption)>*>*{border-width:1px 1px}.table-fixed-columns{width:100%;overflow-x:auto;white-space:nowrap;position:relative}.table-fixed-columns .table{table-layout:fixed;overflow-x:auto;white-space:nowrap;border-collapse:separate;border-spacing:0}.table-fixed-columns .table .table-header-cell-fixed-start,.table-fixed-columns .table .table-row-header-fixed-start,.table-fixed-columns .table .table-row-cell-fixed-start{position:sticky;border-left:0;z-index:11;background-color:#fff;border-inline-start-width:0;left:0}.table-fixed-columns .table .table-header-cell-fixed-end,.table-fixed-columns .table .table-row-header-fixed-end,.table-fixed-columns .table .table-row-cell-fixed-end{position:sticky;border-left:0;z-index:11;background-color:#fff;border-inline-start-width:0;right:0}.table-fixed-columns .table.table-bordered td:not(.table-header-cell-fixed-start):not(.table-row-header-fixed-start):not(.table-row-cell-fixed-start),.table-fixed-columns .table.table-bordered th:not(.table-header-cell-fixed-start):not(.table-row-header-fixed-start):not(.table-row-cell-fixed-start){border-left:1px;border-inline-start-width:1px}.snackbar-stack{z-index:1069!important}.snackbar{z-index:1070!important}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}0%{opacity:0}}@keyframes slideIn{0%{transform:translateY(1rem);opacity:0}100%{transform:translateY(0);opacity:1}0%{transform:translateY(1rem);opacity:0}}.border-1{border:1px solid #dee2e6!important}.border-1.border-primary{border-color:#0d6efd!important}.border-1.border-secondary{border-color:#6c757d!important}.border-1.border-success{border-color:#198754!important}.border-1.border-info{border-color:#0dcaf0!important}.border-1.border-warning{border-color:#ffc107!important}.border-1.border-danger{border-color:#dc3545!important}.border-1.border-light{border-color:#f8f9fa!important}.border-1.border-dark{border-color:#212529!important}.border-1.border-link{border-color:#3273dc!important}.border-primary-1{border:1px solid #0d6efd!important}.border-secondary-1{border:1px solid #6c757d!important}.border-success-1{border:1px solid #198754!important}.border-info-1{border:1px solid #0dcaf0!important}.border-warning-1{border:1px solid #ffc107!important}.border-danger-1{border:1px solid #dc3545!important}.border-light-1{border:1px solid #f8f9fa!important}.border-dark-1{border:1px solid #212529!important}.border-link-1{border:1px solid #3273dc!important}.border-top-1{border-top:1px solid #dee2e6!important}.border-primary-top-1{border-top:1px solid #0d6efd!important}.border-secondary-top-1{border-top:1px solid #6c757d!important}.border-success-top-1{border-top:1px solid #198754!important}.border-info-top-1{border-top:1px solid #0dcaf0!important}.border-warning-top-1{border-top:1px solid #ffc107!important}.border-danger-top-1{border-top:1px solid #dc3545!important}.border-light-top-1{border-top:1px solid #f8f9fa!important}.border-dark-top-1{border-top:1px solid #212529!important}.border-link-top-1{border-top:1px solid #3273dc!important}.border-end-1{border-right:1px solid #dee2e6!important}.border-primary-end-1{border-right:1px solid #0d6efd!important}.border-secondary-end-1{border-right:1px solid #6c757d!important}.border-success-end-1{border-right:1px solid #198754!important}.border-info-end-1{border-right:1px solid #0dcaf0!important}.border-warning-end-1{border-right:1px solid #ffc107!important}.border-danger-end-1{border-right:1px solid #dc3545!important}.border-light-end-1{border-right:1px solid #f8f9fa!important}.border-dark-end-1{border-right:1px solid #212529!important}.border-link-end-1{border-right:1px solid #3273dc!important}.border-bottom-1{border-bottom:1px solid #dee2e6!important}.border-primary-bottom-1{border-bottom:1px solid #0d6efd!important}.border-secondary-bottom-1{border-bottom:1px solid #6c757d!important}.border-success-bottom-1{border-bottom:1px solid #198754!important}.border-info-bottom-1{border-bottom:1px solid #0dcaf0!important}.border-warning-bottom-1{border-bottom:1px solid #ffc107!important}.border-danger-bottom-1{border-bottom:1px solid #dc3545!important}.border-light-bottom-1{border-bottom:1px solid #f8f9fa!important}.border-dark-bottom-1{border-bottom:1px solid #212529!important}.border-link-bottom-1{border-bottom:1px solid #3273dc!important}.border-start-1{border-left:1px solid #dee2e6!important}.border-primary-start-1{border-left:1px solid #0d6efd!important}.border-secondary-start-1{border-left:1px solid #6c757d!important}.border-success-start-1{border-left:1px solid #198754!important}.border-info-start-1{border-left:1px solid #0dcaf0!important}.border-warning-start-1{border-left:1px solid #ffc107!important}.border-danger-start-1{border-left:1px solid #dc3545!important}.border-light-start-1{border-left:1px solid #f8f9fa!important}.border-dark-start-1{border-left:1px solid #212529!important}.border-link-start-1{border-left:1px solid #3273dc!important}.border-2{border:2px solid #dee2e6!important}.border-2.border-primary{border-color:#0d6efd!important}.border-2.border-secondary{border-color:#6c757d!important}.border-2.border-success{border-color:#198754!important}.border-2.border-info{border-color:#0dcaf0!important}.border-2.border-warning{border-color:#ffc107!important}.border-2.border-danger{border-color:#dc3545!important}.border-2.border-light{border-color:#f8f9fa!important}.border-2.border-dark{border-color:#212529!important}.border-2.border-link{border-color:#3273dc!important}.border-primary-2{border:2px solid #0d6efd!important}.border-secondary-2{border:2px solid #6c757d!important}.border-success-2{border:2px solid #198754!important}.border-info-2{border:2px solid #0dcaf0!important}.border-warning-2{border:2px solid #ffc107!important}.border-danger-2{border:2px solid #dc3545!important}.border-light-2{border:2px solid #f8f9fa!important}.border-dark-2{border:2px solid #212529!important}.border-link-2{border:2px solid #3273dc!important}.border-top-2{border-top:2px solid #dee2e6!important}.border-primary-top-2{border-top:2px solid #0d6efd!important}.border-secondary-top-2{border-top:2px solid #6c757d!important}.border-success-top-2{border-top:2px solid #198754!important}.border-info-top-2{border-top:2px solid #0dcaf0!important}.border-warning-top-2{border-top:2px solid #ffc107!important}.border-danger-top-2{border-top:2px solid #dc3545!important}.border-light-top-2{border-top:2px solid #f8f9fa!important}.border-dark-top-2{border-top:2px solid #212529!important}.border-link-top-2{border-top:2px solid #3273dc!important}.border-end-2{border-right:2px solid #dee2e6!important}.border-primary-end-2{border-right:2px solid #0d6efd!important}.border-secondary-end-2{border-right:2px solid #6c757d!important}.border-success-end-2{border-right:2px solid #198754!important}.border-info-end-2{border-right:2px solid #0dcaf0!important}.border-warning-end-2{border-right:2px solid #ffc107!important}.border-danger-end-2{border-right:2px solid #dc3545!important}.border-light-end-2{border-right:2px solid #f8f9fa!important}.border-dark-end-2{border-right:2px solid #212529!important}.border-link-end-2{border-right:2px solid #3273dc!important}.border-bottom-2{border-bottom:2px solid #dee2e6!important}.border-primary-bottom-2{border-bottom:2px solid #0d6efd!important}.border-secondary-bottom-2{border-bottom:2px solid #6c757d!important}.border-success-bottom-2{border-bottom:2px solid #198754!important}.border-info-bottom-2{border-bottom:2px solid #0dcaf0!important}.border-warning-bottom-2{border-bottom:2px solid #ffc107!important}.border-danger-bottom-2{border-bottom:2px solid #dc3545!important}.border-light-bottom-2{border-bottom:2px solid #f8f9fa!important}.border-dark-bottom-2{border-bottom:2px solid #212529!important}.border-link-bottom-2{border-bottom:2px solid #3273dc!important}.border-start-2{border-left:2px solid #dee2e6!important}.border-primary-start-2{border-left:2px solid #0d6efd!important}.border-secondary-start-2{border-left:2px solid #6c757d!important}.border-success-start-2{border-left:2px solid #198754!important}.border-info-start-2{border-left:2px solid #0dcaf0!important}.border-warning-start-2{border-left:2px solid #ffc107!important}.border-danger-start-2{border-left:2px solid #dc3545!important}.border-light-start-2{border-left:2px solid #f8f9fa!important}.border-dark-start-2{border-left:2px solid #212529!important}.border-link-start-2{border-left:2px solid #3273dc!important}.border-3{border:3px solid #dee2e6!important}.border-3.border-primary{border-color:#0d6efd!important}.border-3.border-secondary{border-color:#6c757d!important}.border-3.border-success{border-color:#198754!important}.border-3.border-info{border-color:#0dcaf0!important}.border-3.border-warning{border-color:#ffc107!important}.border-3.border-danger{border-color:#dc3545!important}.border-3.border-light{border-color:#f8f9fa!important}.border-3.border-dark{border-color:#212529!important}.border-3.border-link{border-color:#3273dc!important}.border-primary-3{border:3px solid #0d6efd!important}.border-secondary-3{border:3px solid #6c757d!important}.border-success-3{border:3px solid #198754!important}.border-info-3{border:3px solid #0dcaf0!important}.border-warning-3{border:3px solid #ffc107!important}.border-danger-3{border:3px solid #dc3545!important}.border-light-3{border:3px solid #f8f9fa!important}.border-dark-3{border:3px solid #212529!important}.border-link-3{border:3px solid #3273dc!important}.border-top-3{border-top:3px solid #dee2e6!important}.border-primary-top-3{border-top:3px solid #0d6efd!important}.border-secondary-top-3{border-top:3px solid #6c757d!important}.border-success-top-3{border-top:3px solid #198754!important}.border-info-top-3{border-top:3px solid #0dcaf0!important}.border-warning-top-3{border-top:3px solid #ffc107!important}.border-danger-top-3{border-top:3px solid #dc3545!important}.border-light-top-3{border-top:3px solid #f8f9fa!important}.border-dark-top-3{border-top:3px solid #212529!important}.border-link-top-3{border-top:3px solid #3273dc!important}.border-end-3{border-right:3px solid #dee2e6!important}.border-primary-end-3{border-right:3px solid #0d6efd!important}.border-secondary-end-3{border-right:3px solid #6c757d!important}.border-success-end-3{border-right:3px solid #198754!important}.border-info-end-3{border-right:3px solid #0dcaf0!important}.border-warning-end-3{border-right:3px solid #ffc107!important}.border-danger-end-3{border-right:3px solid #dc3545!important}.border-light-end-3{border-right:3px solid #f8f9fa!important}.border-dark-end-3{border-right:3px solid #212529!important}.border-link-end-3{border-right:3px solid #3273dc!important}.border-bottom-3{border-bottom:3px solid #dee2e6!important}.border-primary-bottom-3{border-bottom:3px solid #0d6efd!important}.border-secondary-bottom-3{border-bottom:3px solid #6c757d!important}.border-success-bottom-3{border-bottom:3px solid #198754!important}.border-info-bottom-3{border-bottom:3px solid #0dcaf0!important}.border-warning-bottom-3{border-bottom:3px solid #ffc107!important}.border-danger-bottom-3{border-bottom:3px solid #dc3545!important}.border-light-bottom-3{border-bottom:3px solid #f8f9fa!important}.border-dark-bottom-3{border-bottom:3px solid #212529!important}.border-link-bottom-3{border-bottom:3px solid #3273dc!important}.border-start-3{border-left:3px solid #dee2e6!important}.border-primary-start-3{border-left:3px solid #0d6efd!important}.border-secondary-start-3{border-left:3px solid #6c757d!important}.border-success-start-3{border-left:3px solid #198754!important}.border-info-start-3{border-left:3px solid #0dcaf0!important}.border-warning-start-3{border-left:3px solid #ffc107!important}.border-danger-start-3{border-left:3px solid #dc3545!important}.border-light-start-3{border-left:3px solid #f8f9fa!important}.border-dark-start-3{border-left:3px solid #212529!important}.border-link-start-3{border-left:3px solid #3273dc!important}.border-4{border:4px solid #dee2e6!important}.border-4.border-primary{border-color:#0d6efd!important}.border-4.border-secondary{border-color:#6c757d!important}.border-4.border-success{border-color:#198754!important}.border-4.border-info{border-color:#0dcaf0!important}.border-4.border-warning{border-color:#ffc107!important}.border-4.border-danger{border-color:#dc3545!important}.border-4.border-light{border-color:#f8f9fa!important}.border-4.border-dark{border-color:#212529!important}.border-4.border-link{border-color:#3273dc!important}.border-primary-4{border:4px solid #0d6efd!important}.border-secondary-4{border:4px solid #6c757d!important}.border-success-4{border:4px solid #198754!important}.border-info-4{border:4px solid #0dcaf0!important}.border-warning-4{border:4px solid #ffc107!important}.border-danger-4{border:4px solid #dc3545!important}.border-light-4{border:4px solid #f8f9fa!important}.border-dark-4{border:4px solid #212529!important}.border-link-4{border:4px solid #3273dc!important}.border-top-4{border-top:4px solid #dee2e6!important}.border-primary-top-4{border-top:4px solid #0d6efd!important}.border-secondary-top-4{border-top:4px solid #6c757d!important}.border-success-top-4{border-top:4px solid #198754!important}.border-info-top-4{border-top:4px solid #0dcaf0!important}.border-warning-top-4{border-top:4px solid #ffc107!important}.border-danger-top-4{border-top:4px solid #dc3545!important}.border-light-top-4{border-top:4px solid #f8f9fa!important}.border-dark-top-4{border-top:4px solid #212529!important}.border-link-top-4{border-top:4px solid #3273dc!important}.border-end-4{border-right:4px solid #dee2e6!important}.border-primary-end-4{border-right:4px solid #0d6efd!important}.border-secondary-end-4{border-right:4px solid #6c757d!important}.border-success-end-4{border-right:4px solid #198754!important}.border-info-end-4{border-right:4px solid #0dcaf0!important}.border-warning-end-4{border-right:4px solid #ffc107!important}.border-danger-end-4{border-right:4px solid #dc3545!important}.border-light-end-4{border-right:4px solid #f8f9fa!important}.border-dark-end-4{border-right:4px solid #212529!important}.border-link-end-4{border-right:4px solid #3273dc!important}.border-bottom-4{border-bottom:4px solid #dee2e6!important}.border-primary-bottom-4{border-bottom:4px solid #0d6efd!important}.border-secondary-bottom-4{border-bottom:4px solid #6c757d!important}.border-success-bottom-4{border-bottom:4px solid #198754!important}.border-info-bottom-4{border-bottom:4px solid #0dcaf0!important}.border-warning-bottom-4{border-bottom:4px solid #ffc107!important}.border-danger-bottom-4{border-bottom:4px solid #dc3545!important}.border-light-bottom-4{border-bottom:4px solid #f8f9fa!important}.border-dark-bottom-4{border-bottom:4px solid #212529!important}.border-link-bottom-4{border-bottom:4px solid #3273dc!important}.border-start-4{border-left:4px solid #dee2e6!important}.border-primary-start-4{border-left:4px solid #0d6efd!important}.border-secondary-start-4{border-left:4px solid #6c757d!important}.border-success-start-4{border-left:4px solid #198754!important}.border-info-start-4{border-left:4px solid #0dcaf0!important}.border-warning-start-4{border-left:4px solid #ffc107!important}.border-danger-start-4{border-left:4px solid #dc3545!important}.border-light-start-4{border-left:4px solid #f8f9fa!important}.border-dark-start-4{border-left:4px solid #212529!important}.border-link-start-4{border-left:4px solid #3273dc!important}.border-5{border:5px solid #dee2e6!important}.border-5.border-primary{border-color:#0d6efd!important}.border-5.border-secondary{border-color:#6c757d!important}.border-5.border-success{border-color:#198754!important}.border-5.border-info{border-color:#0dcaf0!important}.border-5.border-warning{border-color:#ffc107!important}.border-5.border-danger{border-color:#dc3545!important}.border-5.border-light{border-color:#f8f9fa!important}.border-5.border-dark{border-color:#212529!important}.border-5.border-link{border-color:#3273dc!important}.border-primary-5{border:5px solid #0d6efd!important}.border-secondary-5{border:5px solid #6c757d!important}.border-success-5{border:5px solid #198754!important}.border-info-5{border:5px solid #0dcaf0!important}.border-warning-5{border:5px solid #ffc107!important}.border-danger-5{border:5px solid #dc3545!important}.border-light-5{border:5px solid #f8f9fa!important}.border-dark-5{border:5px solid #212529!important}.border-link-5{border:5px solid #3273dc!important}.border-top-5{border-top:5px solid #dee2e6!important}.border-primary-top-5{border-top:5px solid #0d6efd!important}.border-secondary-top-5{border-top:5px solid #6c757d!important}.border-success-top-5{border-top:5px solid #198754!important}.border-info-top-5{border-top:5px solid #0dcaf0!important}.border-warning-top-5{border-top:5px solid #ffc107!important}.border-danger-top-5{border-top:5px solid #dc3545!important}.border-light-top-5{border-top:5px solid #f8f9fa!important}.border-dark-top-5{border-top:5px solid #212529!important}.border-link-top-5{border-top:5px solid #3273dc!important}.border-end-5{border-right:5px solid #dee2e6!important}.border-primary-end-5{border-right:5px solid #0d6efd!important}.border-secondary-end-5{border-right:5px solid #6c757d!important}.border-success-end-5{border-right:5px solid #198754!important}.border-info-end-5{border-right:5px solid #0dcaf0!important}.border-warning-end-5{border-right:5px solid #ffc107!important}.border-danger-end-5{border-right:5px solid #dc3545!important}.border-light-end-5{border-right:5px solid #f8f9fa!important}.border-dark-end-5{border-right:5px solid #212529!important}.border-link-end-5{border-right:5px solid #3273dc!important}.border-bottom-5{border-bottom:5px solid #dee2e6!important}.border-primary-bottom-5{border-bottom:5px solid #0d6efd!important}.border-secondary-bottom-5{border-bottom:5px solid #6c757d!important}.border-success-bottom-5{border-bottom:5px solid #198754!important}.border-info-bottom-5{border-bottom:5px solid #0dcaf0!important}.border-warning-bottom-5{border-bottom:5px solid #ffc107!important}.border-danger-bottom-5{border-bottom:5px solid #dc3545!important}.border-light-bottom-5{border-bottom:5px solid #f8f9fa!important}.border-dark-bottom-5{border-bottom:5px solid #212529!important}.border-link-bottom-5{border-bottom:5px solid #3273dc!important}.border-start-5{border-left:5px solid #dee2e6!important}.border-primary-start-5{border-left:5px solid #0d6efd!important}.border-secondary-start-5{border-left:5px solid #6c757d!important}.border-success-start-5{border-left:5px solid #198754!important}.border-info-start-5{border-left:5px solid #0dcaf0!important}.border-warning-start-5{border-left:5px solid #ffc107!important}.border-danger-start-5{border-left:5px solid #dc3545!important}.border-light-start-5{border-left:5px solid #f8f9fa!important}.border-dark-start-5{border-left:5px solid #212529!important}.border-link-start-5{border-left:5px solid #3273dc!important}.cursor-pointer{cursor:pointer}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows,1),1fr);grid-template-columns:repeat(var(--bs-columns,12),1fr);gap:var(--bs-gap,1.5rem)}.grid.g-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid.g-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid.g-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid.g-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid.g-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid.g-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid.g-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid.g-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.g-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.g-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.g-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid.g-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid.g-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid.g-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid.g-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid.g-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid.g-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid.g-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}@media(min-width:576px){.grid.g-rows-sm-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid.g-rows-sm-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid.g-rows-sm-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid.g-rows-sm-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid.g-rows-sm-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid.g-rows-sm-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid.g-cols-sm-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid.g-cols-sm-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.g-cols-sm-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.g-cols-sm-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.g-cols-sm-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid.g-cols-sm-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid.g-cols-sm-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid.g-cols-sm-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid.g-cols-sm-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid.g-cols-sm-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid.g-cols-sm-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid.g-cols-sm-12{grid-template-columns:repeat(12,minmax(0,1fr))}}@media(min-width:768px){.grid.g-rows-md-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid.g-rows-md-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid.g-rows-md-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid.g-rows-md-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid.g-rows-md-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid.g-rows-md-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid.g-cols-md-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid.g-cols-md-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.g-cols-md-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.g-cols-md-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.g-cols-md-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid.g-cols-md-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid.g-cols-md-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid.g-cols-md-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid.g-cols-md-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid.g-cols-md-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid.g-cols-md-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid.g-cols-md-12{grid-template-columns:repeat(12,minmax(0,1fr))}}@media(min-width:992px){.grid.g-rows-lg-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid.g-rows-lg-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid.g-rows-lg-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid.g-rows-lg-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid.g-rows-lg-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid.g-rows-lg-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid.g-cols-lg-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid.g-cols-lg-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.g-cols-lg-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.g-cols-lg-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.g-cols-lg-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid.g-cols-lg-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid.g-cols-lg-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid.g-cols-lg-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid.g-cols-lg-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid.g-cols-lg-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid.g-cols-lg-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid.g-cols-lg-12{grid-template-columns:repeat(12,minmax(0,1fr))}}@media(min-width:1200px){.grid.g-rows-xl-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid.g-rows-xl-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid.g-rows-xl-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid.g-rows-xl-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid.g-rows-xl-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid.g-rows-xl-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid.g-cols-xl-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid.g-cols-xl-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.g-cols-xl-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.g-cols-xl-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.g-cols-xl-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid.g-cols-xl-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid.g-cols-xl-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid.g-cols-xl-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid.g-cols-xl-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid.g-cols-xl-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid.g-cols-xl-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid.g-cols-xl-12{grid-template-columns:repeat(12,minmax(0,1fr))}}@media(min-width:1400px){.grid.g-rows-xxl-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid.g-rows-xxl-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid.g-rows-xxl-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid.g-rows-xxl-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid.g-rows-xxl-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid.g-rows-xxl-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid.g-cols-xxl-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid.g-cols-xxl-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.g-cols-xxl-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.g-cols-xxl-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.g-cols-xxl-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid.g-cols-xxl-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid.g-cols-xxl-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid.g-cols-xxl-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid.g-cols-xxl-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid.g-cols-xxl-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid.g-cols-xxl-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid.g-cols-xxl-12{grid-template-columns:repeat(12,minmax(0,1fr))}}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width:576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width:768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width:992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width:1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width:1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}ol.ordered-list-lower-alpha{list-style-type:lower-alpha}ol.ordered-list-lower-roman{list-style-type:lower-roman}ol.ordered-list-upper-alpha{list-style-type:upper-alpha}ol.ordered-list-upper-roman{list-style-type:upper-roman}.overflow-auto-auto{overflow:auto auto!important}.overflow-auto-hidden{overflow:auto hidden!important}.overflow-auto-visible{overflow:auto visible!important}.overflow-auto-scroll{overflow:auto scroll!important}.overflow-hidden-auto{overflow:hidden auto!important}.overflow-hidden-hidden{overflow:hidden hidden!important}.overflow-hidden-visible{overflow:hidden visible!important}.overflow-hidden-scroll{overflow:hidden scroll!important}.overflow-visible-auto{overflow:visible auto!important}.overflow-visible-hidden{overflow:visible hidden!important}.overflow-visible-visible{overflow:visible visible!important}.overflow-visible-scroll{overflow:visible scroll!important}.overflow-scroll-auto{overflow:scroll auto!important}.overflow-scroll-hidden{overflow:scroll hidden!important}.overflow-scroll-visible{overflow:scroll visible!important}.overflow-scroll-scroll{overflow:scroll scroll!important}@media(min-width:576px){.w-sm-25{width:25%!important}.w-sm-50{width:50%!important}.w-sm-75{width:75%!important}.w-sm-100{width:100%!important}.w-sm-auto{width:auto!important}.w-sm-33{width:33.333333%!important}.w-sm-66{width:66.666667%!important}.mw-sm-100{max-width:100%!important}.vw-sm-100{width:100vw!important}.min-vw-sm-100{min-width:100vw!important}.h-sm-25{height:25%!important}.h-sm-50{height:50%!important}.h-sm-75{height:75%!important}.h-sm-100{height:100%!important}.h-sm-auto{height:auto!important}.h-sm-33{height:33.333333%!important}.h-sm-66{height:66.666667%!important}.mh-sm-100{max-height:100%!important}.vh-sm-100{height:100vh!important}.min-vh-sm-100{min-height:100vh!important}}@media(min-width:768px){.w-md-25{width:25%!important}.w-md-50{width:50%!important}.w-md-75{width:75%!important}.w-md-100{width:100%!important}.w-md-auto{width:auto!important}.w-md-33{width:33.333333%!important}.w-md-66{width:66.666667%!important}.mw-md-100{max-width:100%!important}.vw-md-100{width:100vw!important}.min-vw-md-100{min-width:100vw!important}.h-md-25{height:25%!important}.h-md-50{height:50%!important}.h-md-75{height:75%!important}.h-md-100{height:100%!important}.h-md-auto{height:auto!important}.h-md-33{height:33.333333%!important}.h-md-66{height:66.666667%!important}.mh-md-100{max-height:100%!important}.vh-md-100{height:100vh!important}.min-vh-md-100{min-height:100vh!important}}@media(min-width:992px){.w-lg-25{width:25%!important}.w-lg-50{width:50%!important}.w-lg-75{width:75%!important}.w-lg-100{width:100%!important}.w-lg-auto{width:auto!important}.w-lg-33{width:33.333333%!important}.w-lg-66{width:66.666667%!important}.mw-lg-100{max-width:100%!important}.vw-lg-100{width:100vw!important}.min-vw-lg-100{min-width:100vw!important}.h-lg-25{height:25%!important}.h-lg-50{height:50%!important}.h-lg-75{height:75%!important}.h-lg-100{height:100%!important}.h-lg-auto{height:auto!important}.h-lg-33{height:33.333333%!important}.h-lg-66{height:66.666667%!important}.mh-lg-100{max-height:100%!important}.vh-lg-100{height:100vh!important}.min-vh-lg-100{min-height:100vh!important}}@media(min-width:1200px){.w-xl-25{width:25%!important}.w-xl-50{width:50%!important}.w-xl-75{width:75%!important}.w-xl-100{width:100%!important}.w-xl-auto{width:auto!important}.w-xl-33{width:33.333333%!important}.w-xl-66{width:66.666667%!important}.mw-xl-100{max-width:100%!important}.vw-xl-100{width:100vw!important}.min-vw-xl-100{min-width:100vw!important}.h-xl-25{height:25%!important}.h-xl-50{height:50%!important}.h-xl-75{height:75%!important}.h-xl-100{height:100%!important}.h-xl-auto{height:auto!important}.h-xl-33{height:33.333333%!important}.h-xl-66{height:66.666667%!important}.mh-xl-100{max-height:100%!important}.vh-xl-100{height:100vh!important}.min-vh-xl-100{min-height:100vh!important}}@media(min-width:1400px){.w-xxl-25{width:25%!important}.w-xxl-50{width:50%!important}.w-xxl-75{width:75%!important}.w-xxl-100{width:100%!important}.w-xxl-auto{width:auto!important}.w-xxl-33{width:33.333333%!important}.w-xxl-66{width:66.666667%!important}.mw-xxl-100{max-width:100%!important}.vw-xxl-100{width:100vw!important}.min-vw-xxl-100{min-width:100vw!important}.h-xxl-25{height:25%!important}.h-xxl-50{height:50%!important}.h-xxl-75{height:75%!important}.h-xxl-100{height:100%!important}.h-xxl-auto{height:auto!important}.h-xxl-33{height:33.333333%!important}.h-xxl-66{height:66.666667%!important}.mh-xxl-100{max-height:100%!important}.vh-xxl-100{height:100vh!important}.min-vh-xxl-100{min-height:100vh!important}}.gap-y-0{row-gap:0!important}.gap-x-0{column-gap:0!important}.gap-y-1{row-gap:.25rem!important}.gap-x-1{column-gap:.25rem!important}.gap-y-2{row-gap:.5rem!important}.gap-x-2{column-gap:.5rem!important}.gap-y-3{row-gap:1rem!important}.gap-x-3{column-gap:1rem!important}.gap-y-4{row-gap:1.5rem!important}.gap-x-4{column-gap:1.5rem!important}.gap-y-5{row-gap:3rem!important}.gap-x-5{column-gap:3rem!important}.fs-xs{font-size:.75rem!important}.fs-sm{font-size:.925rem!important}.fs-md{font-size:1.125rem!important}.fs-lg{font-size:1.25rem!important}.fs-xl{font-size:1.5rem!important}.flatpickr-months{margin:.5rem 0}.flatpickr-months .flatpickr-month,.flatpickr-months .flatpickr-next-month,.flatpickr-months .flatpickr-prev-month{height:auto;position:relative}.flatpickr-months .flatpickr-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg,.flatpickr-months .flatpickr-prev-month:hover svg{fill:#0d6efd}.flatpickr-months .flatpickr-month{color:#212529}.flatpickr-current-month{padding:13px 0 0 0;font-size:115%}.flatpickr-current-month span.cur-month{font-weight:700}.flatpickr-current-month span.cur-month:hover{background:rgba(13,110,253,.15)}.numInputWrapper:hover{background:rgba(13,110,253,.15)}.flatpickr-day{border-radius:.375rem;font-weight:500;color:#212529}.flatpickr-day.today{border-color:#0d6efd}.flatpickr-day.today:hover{background:#0d6efd;border-color:#0d6efd}.flatpickr-day:hover{background:rgba(13,110,253,.1);border-color:rgba(0,0,0,0)}span.flatpickr-weekday{color:#212529}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#0d6efd;border-color:#0d6efd}.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)){box-shadow:-10px 0 0 #0d6efd}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:.375rem 0 0 .375rem}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 .375rem .375rem 0}.flatpickr-monthSelect-month:hover,.flatpickr-monthSelect-month:focus{background:rgba(13,110,253,.1)}.flatpickr-monthSelect-month.selected{background-color:#0d6efd} +.badge-close{cursor:pointer}.badge-close::before{height:2px;width:50%}.badge-close::after{height:50%;width:2px}.badge-close:hover,.badge-close:focus{background-color:rgba(10,10,10,.3)}.badge-close:active{background-color:rgba(10,10,10,.4)}.navbar-nav .nav-item:hover{cursor:pointer}.navbar-nav .nav-link:hover{cursor:pointer}.nav .nav-link:hover{cursor:pointer}.nav-item{position:relative}.b-bar-horizontal .nav-item.dropdown .dropdown-menu>.dropdown>.dropdown-item{width:100%}.b-bar-horizontal .nav-item.dropdown .dropdown-menu>.dropdown>.dropdown-item::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.b-bar-horizontal .nav-item.dropdown .dropdown-menu>.dropdown>.dropdown-item:empty::after{margin-left:0}.b-bar-horizontal .nav-item.dropdown .dropdown-menu>.dropdown>.dropdown-item::after{transform:rotate(-90deg);position:absolute;right:10%;top:45%}.b-bar-horizontal .nav-item.dropdown .dropdown-menu>.dropdown>.dropdown-menu{top:0;left:100%;margin-left:0;margin-right:.1rem}.btn-group>.b-tooltip:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.b-tooltip:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group.btn-group-toggle .btn.active.disabled{opacity:1}.btn-group-vertical>.b-tooltip:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.b-tooltip:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-xs,.btn-group-xs>.btn{padding:.15rem .5rem;font-size:.75rem;line-height:1.5;border-radius:.15rem}.btn-md,.btn-group-md>.btn{padding:.47rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.25rem}.btn-xl,.btn-group-xl>.btn{padding:.5rem 1rem;font-size:1.5rem;line-height:1.5;border-radius:1rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.card-deck .card{height:100%;margin-bottom:.75rem}@media(min-width:576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-.75rem;margin-left:-.75rem}.card-deck .card{flex:1 0 0%;margin-right:.75rem;margin-bottom:0;margin-left:.75rem}}hr.divider.divider-text{position:unset}hr.divider.divider-text::before{top:unset}.table-fixed-header .table thead tr th.dropdown-table-fixed-header-visible{z-index:11}.dropdown-menu-position-strategy{width:max-content;top:0;left:0}.dropdown-menu-position-strategy-absolute{position:absolute}.dropdown-menu-position-strategy-fixed{position:fixed}.dropdown-toggle.dropdown-toggle-hidden::after{content:none!important}.dropdown-toggle.dropdown-toggle-hidden::before{content:none!important}.dropdown-menu.show{animation-duration:.3s;animation-fill-mode:both;animation-name:fadeIn}.dropdown-menu a:not([href]).dropdown-item:not(.disabled){cursor:pointer}.dropdown-menu.dropdown-menu-scrollable{max-height:var(--dropdown-list-menu-max-height,200px);overflow-y:scroll}.b-is-autocomplete .dropdown-menu{width:100%;max-height:var(--autocomplete-menu-max-height,200px);overflow-y:scroll}.b-is-autocomplete .dropdown-menu .dropdown-item.focus{color:#1e2125!important;background-color:#e9ecef}.b-is-autocomplete.b-is-autocomplete-multipleselection{display:flex;align-items:center;flex-wrap:wrap;max-width:100%;width:100%;cursor:text;min-height:calc(1.5em + .75rem + 2px);height:auto;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.b-is-autocomplete.b-is-autocomplete-multipleselection>input.form-control:not(.is-valid,.is-invalid){border:0}.b-is-autocomplete.b-is-autocomplete-multipleselection>input.form-control{display:inline-block;box-shadow:none;outline:0;background-color:transparent;max-width:inherit;width:auto;flex-grow:1}.b-is-autocomplete.b-is-autocomplete-multipleselection>.badge{margin-top:.25rem;margin-bottom:.25rem;line-height:1.5;flex-grow:initial}.b-is-autocomplete.b-is-autocomplete-multipleselection .dropdown-menu{top:100%}.b-is-autocomplete.b-is-autocomplete-multipleselection.focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.dropdown.btn-group>.btn.dropdown-toggle-split+.dropdown-menu.show{top:100%}.dropdown{position:relative}.dropdown .btn.dropdown-toggle:not(.btn-outline){box-shadow:none;border:0}.dropdown.dropdown-disabled.b-is-autocomplete{background-color:var(--b-theme-light,#e9ecef)}.dropdown>.dropdown-menu>.dropdown:not(.dropup,.dropstart,.dropend){position:relative}.dropdown>.dropdown-menu>.dropdown:not(.dropup,.dropstart,.dropend)>.dropdown-toggle{width:100%}.dropdown>.dropdown-menu>.dropdown:not(.dropup,.dropstart,.dropend)>.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown>.dropdown-menu>.dropdown:not(.dropup,.dropstart,.dropend)>.dropdown-toggle:empty::after{margin-left:0}.dropdown>.dropdown-menu>.dropdown:not(.dropup,.dropstart,.dropend)>.dropdown-toggle::after{position:absolute;right:10%;top:45%}.dropdown>.dropdown-menu>.dropdown:not(.dropup,.dropstart,.dropend)>.dropdown-menu{top:auto;left:auto;bottom:auto;right:auto}.dropdown>.dropdown-menu>.dropdown.dropup .dropdown-toggle::after,.dropdown>.dropdown-menu>.dropdown.dropend .dropdown-toggle::after{vertical-align:0;position:absolute;right:10%;top:45%}.dropdown>.dropdown-menu>.dropdown.dropstart .dropdown-toggle::after{vertical-align:0}.dropdown.dropup>.dropdown-menu{top:auto;bottom:auto;margin-top:0;margin-bottom:.125rem}.dropdown.dropup>.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropdown.dropup>.dropdown-toggle:empty::after{margin-left:0}.dropdown.dropend>.dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropdown.dropend>.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropdown.dropend>.dropdown-toggle:empty::after{margin-left:0}.dropdown.dropend>.dropdown-toggle::after{vertical-align:0}.dropdown.dropstart>.dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropdown.dropstart>.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropdown.dropstart>.dropdown-toggle::after{display:none}.dropdown.dropstart>.dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropdown.dropstart>.dropdown-toggle:empty::after{margin-left:0}.dropdown.dropstart>.dropdown-toggle::before{vertical-align:0}.dropdown-menu-start{right:auto;left:0}.dropdown-menu-end{right:0;left:auto}@media(min-width:576px){.dropdown-menu-sm-start{right:auto;left:0}.dropdown-menu-sm-end{right:0;left:auto}}@media(min-width:768px){.dropdown-menu-md-start{right:auto;left:0}.dropdown-menu-md-end{right:0;left:auto}}@media(min-width:992px){.dropdown-menu-lg-start{right:auto;left:0}.dropdown-menu-lg-end{right:0;left:auto}}@media(min-width:1200px){.dropdown-menu-xl-start{right:auto;left:0}.dropdown-menu-xl-end{right:0;left:auto}}@media(min-width:1400px){.dropdown-menu-xxl-start{right:auto;left:0}.dropdown-menu-xxl-end{right:0;left:auto}}.figure.figure-is-16x16{height:16px;width:16px}.figure.figure-is-24x24{height:24px;width:24px}.figure.figure-is-32x32{height:32px;width:32px}.figure.figure-is-48x48{height:48px;width:48px}.figure.figure-is-64x64{height:64px;width:64px}.figure.figure-is-96x96{height:96px;width:96px}.figure.figure-is-128x128{height:128px;width:128px}.figure.figure-is-256x256{height:256px;width:256px}.figure.figure-is-512x512{height:512px;width:512px}.b-file-picker>.input-group{flex-wrap:nowrap}.form-check>.form-check-input.form-check-input-pointer,.form-check>.form-check-label.form-check-label-pointer,.form-switch>.form-check-input.form-check-input-pointer,.form-switch>.form-check-label.form-check-label-pointer{cursor:pointer}.form-control-plaintext.form-control-xs,.form-control-plaintext.form-control-md,.form-control-plaintext.form-control-xl{padding-right:0;padding-left:0}.form-control-xs{height:calc(1.5em + .3rem + calc(var(--bs-border-width)*2));padding:.15rem .5rem;font-size:.75rem;line-height:1.5;border-radius:.15rem}.form-control-md{height:calc(1.5em + .94rem + calc(var(--bs-border-width)*2));padding:.47rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.25rem}.form-control-xl{height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2));padding:.5rem 1rem;font-size:1.5rem;line-height:1.5;border-radius:1rem}.form-select-xs{height:calc(1.5em + .3rem + calc(var(--bs-border-width)*2));padding-top:.15rem;padding-bottom:.15rem;padding-left:.5rem;font-size:.75rem}.form-select-md{height:calc(1.5em + .94rem + calc(var(--bs-border-width)*2));padding-top:.47rem;padding-bottom:.47rem;padding-left:1rem;font-size:1.125rem}.form-select-xl{height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2));padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.5rem}.input-group>.b-numeric:not(:last-child)>input,.input-group>div.flatpickr-wrapper:not(:last-child)>input{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.b-numeric:not(:first-child)>input,.input-group>div.flatpickr-wrapper:not(:first-child)>input{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-xs>.form-control:not(textarea),.input-group-xs>.form-select,.input-group-xs>.b-numeric>input{height:calc(1.5em + .3rem + calc(var(--bs-border-width)*2))}.input-group-xs>.form-control,.input-group-xs>.form-select,.input-group-xs>.input-group-text,.input-group-xs>.btn,.input-group-xs>.b-numeric>input{padding:.15rem .5rem;font-size:.75rem;line-height:1.5;border-radius:.15rem}.input-group-sm>.b-numeric>input{height:calc(1.5em + .5rem + calc(var(--bs-border-width)*2))}.input-group-sm>.b-numeric>input{padding:.25rem .5rem;font-size:.875rem;line-height:1.25;border-radius:var(--bs-border-radius-sm)}.input-group-md>.form-control:not(textarea),.input-group-md>.form-select,.input-group-md>.b-numeric>input{height:calc(1.5em + .94rem + calc(var(--bs-border-width)*2))}.input-group-md>.form-control,.input-group-md>.form-select,.input-group-md>.input-group-text,.input-group-md>.btn,.input-group-md>.b-numeric>input{padding:.47rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.25rem}.input-group-lg>.b-numeric>input{height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2))}.input-group-lg>.b-numeric>input{padding:.5rem 1rem;font-size:1.25rem;line-height:2;border-radius:var(--bs-border-radius-lg)}.input-group-xl>.form-control:not(textarea),.input-group-xl>.form-select,.input-group-xl>.b-numeric>input{height:calc(1.5em + 1rem + calc(var(--bs-border-width)*2))}.input-group-xl>.form-control,.input-group-xl>.form-select,.input-group-xl>.input-group-text,.input-group-xl>.btn,.input-group-xl>.b-numeric>input{padding:.5rem 1rem;font-size:1.5rem;line-height:1.5;border-radius:1rem}.input-group-xs>.form-select,.input-group-md>.form-select,.input-group-xl>.form-select{padding-right:1.75rem}.input-group:not(.has-validation)>.dropdown:first-child>.btn:not(:last-child).dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown>.btn:not(:last-child).dropdown-toggle,.input-group.has-validation>.dropdown>.btn:not(:last-child):not(.dropdown-toggle){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>div.flatpickr-wrapper>.form-control{position:relative;flex:1 1 auto;width:1%;min-width:0}.form-check>.form-check-input.form-check-input-xs{width:.7rem;height:.7rem}.form-check>.form-check-input.form-check-input-xs+.form-check-label{line-height:"normal";padding-left:0}.form-check>.form-check-input.form-check-input-sm{width:.8rem;height:.8rem}.form-check>.form-check-input.form-check-input-sm+.form-check-label{line-height:"normal";padding-left:0}.form-check>.form-check-input.form-check-input-md{width:1.25rem;height:1.25rem}.form-check>.form-check-input.form-check-input-md+.form-check-label{line-height:1.7rem;padding-left:3px}.form-check>.form-check-input.form-check-input-lg{width:1.55rem;height:1.55rem}.form-check>.form-check-input.form-check-input-lg+.form-check-label{line-height:2rem;padding-left:6px}.form-check>.form-check-input.form-check-input-xl{width:1.85rem;height:1.85rem}.form-check>.form-check-input.form-check-input-xl+.form-check-label{line-height:2.5rem;padding-left:10px}select[readonly]{pointer-events:none}select[readonly] option,select[readonly] optgroup{display:none}.b-numeric{position:relative;width:100%}.b-numeric:hover>.b-numeric-handler-wrap{opacity:1}.b-numeric input:disabled+.b-numeric-handler-wrap,.b-numeric input:read-only+.b-numeric-handler-wrap{display:none}.b-numeric-handler-wrap{position:absolute;top:0;right:0;width:22px;height:100%;background:#fff;border:1px solid #d9d9d9;opacity:0}.input-group .b-numeric{-ms-flex:1 1 auto;flex:1 1 auto;width:1%}.b-numeric-handler-wrap .b-numeric-handler.b-numeric-handler-down{border-top:1px solid #d9d9d9}.b-numeric-handler{position:relative;display:flex;width:100%;height:50%;overflow:hidden;color:rgba(0,0,0,.45);font-weight:700;line-height:0;align-items:center;justify-content:center}.b-numeric-handler.btn{padding:0}.form-control+.b-numeric-handler-wrap{font-size:1rem;border-top-right-radius:var(--bs-border-radius);border-bottom-right-radius:var(--bs-border-radius)}.form-control-xs+.b-numeric-handler-wrap{font-size:.75rem;border-top-right-radius:.15rem;border-bottom-right-radius:.15rem}.form-control-xs+.b-numeric-handler-wrap>.b-numeric-handler.btn{font-size:.75rem}.form-control-sm+.b-numeric-handler-wrap{font-size:.875rem;border-top-right-radius:var(--bs-border-radius-sm);border-bottom-right-radius:var(--bs-border-radius-sm)}.form-control-sm+.b-numeric-handler-wrap>.b-numeric-handler.btn{font-size:.875rem}.form-control-md+.b-numeric-handler-wrap{font-size:1.125rem;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.form-control-md+.b-numeric-handler-wrap>.b-numeric-handler.btn{font-size:1.125rem}.form-control-lg+.b-numeric-handler-wrap{font-size:1.25rem;border-top-right-radius:var(--bs-border-radius-lg);border-bottom-right-radius:var(--bs-border-radius-lg)}.form-control-lg+.b-numeric-handler-wrap>.b-numeric-handler.btn{font-size:1.25rem}.form-control-xl+.b-numeric-handler-wrap{font-size:1.5rem;border-top-right-radius:1rem;border-bottom-right-radius:1rem}.form-control-xl+.b-numeric-handler-wrap>.b-numeric-handler.btn{font-size:1.5rem}.custom-file-label{overflow:hidden}input[readonly][type=range],input[readonly=readonly][type=range]{pointer-events:none}input[readonly][type=range]::-webkit-slider-thumb,input[readonly=readonly][type=range]::-webkit-slider-thumb{pointer-events:none}input[readonly][type=range]::-moz-range-thumb,input[readonly=readonly][type=range]::-moz-range-thumb{pointer-events:none}input[readonly][type=range]::-ms-thumb,input[readonly=readonly][type=range]::-ms-thumb{pointer-events:none}.form-group{margin-bottom:1rem}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media(min-width:576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .form-select{align-items:center;justify-content:center}.form-inline .form-check-label{margin-bottom:0}}.b-input-color-picker{padding:.5rem .6rem}.b-input-color-picker>.b-input-color-picker-preview{height:.55rem}.focus-trap{display:contents}.form-file input[type=file]{margin-left:-2px!important}.form-file input[type=file]::-webkit-file-upload-button{display:none}.form-file input[type=file]::file-selector-button{display:none}.form-label-required:after{content:" *";color:var(--b-theme-danger,#dc3545)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.5rem}@media(min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.jumbotron.jumbotron-primary{background-color:#0d6efd;color:#fff}.jumbotron.jumbotron-secondary{background-color:#6c757d;color:#fff}.jumbotron.jumbotron-success{background-color:#198754;color:#fff}.jumbotron.jumbotron-info{background-color:#0dcaf0;color:#000}.jumbotron.jumbotron-warning{background-color:#ffc107;color:#000}.jumbotron.jumbotron-danger{background-color:#dc3545;color:#fff}.jumbotron.jumbotron-light{background-color:#f8f9fa;color:#000}.jumbotron.jumbotron-dark{background-color:#212529;color:#fff}.jumbotron.jumbotron-link{background-color:#3273dc;color:#fff}.b-layout-header-fixed{z-index:1030}.b-layout-footer-fixed{z-index:1030}.b-layout-sider-content{z-index:1031}a.link-unstyled{text-decoration:none;color:inherit}a.link-disabled[aria-disabled=true]{pointer-events:none;opacity:.65}li.list-group-item-action{cursor:pointer}.list-group-scrollable{overflow-y:scroll}.media{display:flex;align-items:flex-start}.media-body{flex:1}.modal.show{display:block}.modal.show .modal-dialog:not(.modal-dialog-centered){animation:modal-slidein var(--modal-animation-duration,300ms) ease-out}.modal.show .modal-dialog.modal-dialog-centered{animation:modal-slidein,modal-slidein-centered var(--modal-animation-duration,300ms) ease-out}.modal:not(.show){display:none;animation:modal-slideaway var(--modal-animation-duration,300ms) linear}.modal:not(.show) .modal-dialog:not(.modal-dialog-centered){animation:modal-slideaway var(--modal-animation-duration,300ms) ease-out}.modal:not(.show) .modal-dialog.modal-dialog-centered{animation:modal-slideaway,modal-slideaway-centered var(--modal-animation-duration,300ms) ease-out}.modal-backdrop.fade{transition-property:opacity;transition-duration:var(--modal-animation-duration,300ms);transition-timing-function:linear}@keyframes modal-slidein{0%{display:none;opacity:0;transform:translate(0,-50px)}1%{display:block;opacity:0}100%{opacity:1}}@keyframes modal-slidein-centered{0%{display:none;opacity:0;transform:translate(0,-50px)}100%{display:flex;align-items:center;opacity:1}}@keyframes modal-slideaway{from{display:block;opacity:1}to{transform:translate(0,-50px);opacity:0}}@keyframes modal-slideaway-centered{from{display:flex;align-items:center;opacity:1}to{transform:translate(0,-50px);opacity:0}}.offcanvas-footer{position:sticky;bottom:0;top:auto;display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.page-item:not(.disabled) .page-link{cursor:pointer}.pagination-xs .page-link{padding:.125rem .25rem;font-size:.75rem;line-height:1.5}.pagination-xs .page-item:first-child .page-link{border-top-left-radius:.15rem;border-bottom-left-radius:.15rem}.pagination-xs .page-item:last-child .page-link{border-top-right-radius:.15rem;border-bottom-right-radius:.15rem}.pagination-md .page-link{padding:.625rem 1.25rem;font-size:1.125rem;line-height:1.5}.pagination-md .page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.pagination-md .page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-xl .page-link{padding:1rem 2rem;font-size:1.5rem;line-height:1.5}.pagination-xl .page-item:first-child .page-link{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.pagination-xl .page-item:last-child .page-link{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-primary{background-color:#0d6efd}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-secondary{background-color:#6c757d}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-success{background-color:#198754}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-info{background-color:#0dcaf0}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-warning{background-color:#ffc107}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-danger{background-color:#dc3545}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-light{background-color:#f8f9fa}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-dark{background-color:#212529}.b-page-progress .b-page-progress-indicator.b-page-progress-indicator-link{background-color:#3273dc}.progress{position:relative}.progress-indeterminate .progress-bar:before,.progress-linear .progress-bar:before{content:"";position:absolute;top:0;left:0;bottom:0;background-color:inherit;animation:animation-indeterminate 2s ease infinite}.progress-indeterminate .progress-bar:after,.progress-linear .progress-bar:after{content:"";position:absolute;top:0;left:0;bottom:0;background-color:inherit;animation:animation-indeterminate-short 2s ease .5s infinite}@keyframes animation-indeterminate{0%{left:-5%;width:5%}100%{left:130%;width:100%}}@keyframes animation-indeterminate-short{0%{left:-80%;width:80%}100%{left:110%;width:10%}}.rating:not(.rating-disabled):not(.rating-readonly):hover .rating-item{cursor:pointer}.rating.rating-disabled{opacity:.65}.rating .rating-item.rating-item-primary{color:#0d6efd}.rating .rating-item.rating-item-secondary{color:#6c757d}.rating .rating-item.rating-item-success{color:#198754}.rating .rating-item.rating-item-info{color:#0dcaf0}.rating .rating-item.rating-item-warning{color:#ffc107}.rating .rating-item.rating-item-danger{color:#dc3545}.rating .rating-item.rating-item-light{color:#f8f9fa}.rating .rating-item.rating-item-dark{color:#212529}.rating .rating-item.rating-item-link{color:#3273dc}.rating .rating-item.rating-item-hover{opacity:.7}.steps{padding:0;margin:0;list-style:none;display:flex;overflow-x:auto}.steps .step:first-child{margin-left:auto}.steps .step:last-child{margin-right:auto}.step:first-of-type .step-circle::before{display:none}.step:last-of-type .step-container{padding-right:0}.step-container{box-sizing:content-box;display:flex;align-items:center;flex-direction:column;width:5rem;min-width:5rem;max-width:5rem;padding-top:.5rem;padding-right:1rem}.step-circle{position:relative;display:flex;justify-content:center;align-items:center;width:1.5rem;height:1.5rem;color:#adb5bd;border:2px solid #adb5bd;border-radius:100%;background-color:#fff}.step-circle::before{content:"";display:block;position:absolute;top:50%;left:-2px;width:calc(5rem + 1rem - 1.5rem);height:2px;transform:translate(-100%,-50%);color:#adb5bd;background-color:currentColor}.step-text{color:#adb5bd;word-break:keep-all;text-align:center;margin-top:.25em}.step-completed .step-circle{color:#fff;background-color:#198754;border-color:#198754}.step-completed .step-circle::before{color:#198754}.step-completed .step-text{color:#198754}.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-active .step-circle::before{color:#0d6efd}.step-active .step-text{color:#0d6efd}.step-primary .step-circle{color:#0d6efd;border-color:#0d6efd}.step-primary.step-completed .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-primary.step-completed .step-circle::before{color:#0d6efd}.step-primary.step-completed .step-text{color:#0d6efd}.step-primary.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-primary.step-active::before{color:#0d6efd}.step-primary.step-active .step-text{color:#0d6efd}.step-secondary .step-circle{color:#6c757d;border-color:#6c757d}.step-secondary.step-completed .step-circle{color:#fff;background-color:#6c757d;border-color:#6c757d}.step-secondary.step-completed .step-circle::before{color:#6c757d}.step-secondary.step-completed .step-text{color:#6c757d}.step-secondary.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-secondary.step-active::before{color:#0d6efd}.step-secondary.step-active .step-text{color:#0d6efd}.step-success .step-circle{color:#198754;border-color:#198754}.step-success.step-completed .step-circle{color:#fff;background-color:#198754;border-color:#198754}.step-success.step-completed .step-circle::before{color:#198754}.step-success.step-completed .step-text{color:#198754}.step-success.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-success.step-active::before{color:#0d6efd}.step-success.step-active .step-text{color:#0d6efd}.step-info .step-circle{color:#0dcaf0;border-color:#0dcaf0}.step-info.step-completed .step-circle{color:#fff;background-color:#0dcaf0;border-color:#0dcaf0}.step-info.step-completed .step-circle::before{color:#0dcaf0}.step-info.step-completed .step-text{color:#0dcaf0}.step-info.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-info.step-active::before{color:#0d6efd}.step-info.step-active .step-text{color:#0d6efd}.step-warning .step-circle{color:#ffc107;border-color:#ffc107}.step-warning.step-completed .step-circle{color:#fff;background-color:#ffc107;border-color:#ffc107}.step-warning.step-completed .step-circle::before{color:#ffc107}.step-warning.step-completed .step-text{color:#ffc107}.step-warning.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-warning.step-active::before{color:#0d6efd}.step-warning.step-active .step-text{color:#0d6efd}.step-danger .step-circle{color:#dc3545;border-color:#dc3545}.step-danger.step-completed .step-circle{color:#fff;background-color:#dc3545;border-color:#dc3545}.step-danger.step-completed .step-circle::before{color:#dc3545}.step-danger.step-completed .step-text{color:#dc3545}.step-danger.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-danger.step-active::before{color:#0d6efd}.step-danger.step-active .step-text{color:#0d6efd}.step-light .step-circle{color:#f8f9fa;border-color:#f8f9fa}.step-light.step-completed .step-circle{color:#fff;background-color:#f8f9fa;border-color:#f8f9fa}.step-light.step-completed .step-circle::before{color:#f8f9fa}.step-light.step-completed .step-text{color:#f8f9fa}.step-light.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-light.step-active::before{color:#0d6efd}.step-light.step-active .step-text{color:#0d6efd}.step-dark .step-circle{color:#212529;border-color:#212529}.step-dark.step-completed .step-circle{color:#fff;background-color:#212529;border-color:#212529}.step-dark.step-completed .step-circle::before{color:#212529}.step-dark.step-completed .step-text{color:#212529}.step-dark.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-dark.step-active::before{color:#0d6efd}.step-dark.step-active .step-text{color:#0d6efd}.step-link .step-circle{color:#3273dc;border-color:#3273dc}.step-link.step-completed .step-circle{color:#fff;background-color:#3273dc;border-color:#3273dc}.step-link.step-completed .step-circle::before{color:#3273dc}.step-link.step-completed .step-text{color:#3273dc}.step-link.step-active .step-circle{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.step-link.step-active::before{color:#0d6efd}.step-link.step-active .step-text{color:#0d6efd}.steps-content{margin:1rem 0}.steps-content>.step-panel{display:none}.steps-content>.active{display:block}.form-check.form-switch .form-check-input.form-check-input-primary:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check.form-switch .form-check-input.form-check-input-secondary:checked{background-color:#6c757d;border-color:#6c757d}.form-check.form-switch .form-check-input.form-check-input-success:checked{background-color:#198754;border-color:#198754}.form-check.form-switch .form-check-input.form-check-input-info:checked{background-color:#0dcaf0;border-color:#0dcaf0}.form-check.form-switch .form-check-input.form-check-input-warning:checked{background-color:#ffc107;border-color:#ffc107}.form-check.form-switch .form-check-input.form-check-input-danger:checked{background-color:#dc3545;border-color:#dc3545}.form-check.form-switch .form-check-input.form-check-input-light:checked{background-color:#f8f9fa;border-color:#f8f9fa}.form-check.form-switch .form-check-input.form-check-input-dark:checked{background-color:#212529;border-color:#212529}.form-check.form-switch .form-check-input.form-check-input-link:checked{background-color:#3273dc;border-color:#3273dc}.form-check.form-switch .form-check-input.form-check-input-xs{width:calc(.75rem + (.5rem/2));height:.5rem;margin-left:-2.5em}.form-check.form-switch .form-check-input.form-check-input-xs+.form-check-label{line-height:1rem;vertical-align:middle;padding-left:0}.form-check.form-switch .form-check-input.form-check-input-xs:checked~.form-check-label::after{transform:translateX(calc(.75rem - (.5rem/2)))}.form-check.form-switch .form-check-input.form-check-input-sm{width:calc(1rem + (.75rem/2));height:.75rem;margin-left:-2.5em}.form-check.form-switch .form-check-input.form-check-input-sm+.form-check-label{line-height:1.25rem;vertical-align:middle;padding-left:.75rem}.form-check.form-switch .form-check-input.form-check-input-sm:checked~.form-check-label::after{transform:translateX(calc(1rem - (.75rem/2)))}.form-check.form-switch .form-check-input.form-check-input-md{width:calc(2rem + (1.5rem/2));height:1.5rem;margin-left:-2.5em}.form-check.form-switch .form-check-input.form-check-input-md+.form-check-label{line-height:2rem;vertical-align:middle;padding-left:.75rem}.form-check.form-switch .form-check-input.form-check-input-md:checked~.form-check-label::after{transform:translateX(calc(2rem - (1.5rem/2)))}.form-check.form-switch .form-check-input.form-check-input-lg{width:calc(3rem + (2rem/2));height:2rem;margin-left:-2.5em}.form-check.form-switch .form-check-input.form-check-input-lg+.form-check-label{line-height:2.5rem;vertical-align:middle;padding-left:.75rem}.form-check.form-switch .form-check-input.form-check-input-lg:checked~.form-check-label::after{transform:translateX(calc(3rem - (2rem/2)))}.form-check.form-switch .form-check-input.form-check-input-xl{width:calc(4rem + (2.5rem/2));height:2.5rem;margin-left:-2.5em}.form-check.form-switch .form-check-input.form-check-input-xl+.form-check-label{line-height:3rem;vertical-align:middle;padding-left:.75rem}.form-check.form-switch .form-check-input.form-check-input-xl:checked~.form-check-label::after{transform:translateX(calc(4rem - (2.5rem/2)))}table.table tbody tr:not(.table-group).selected{background-color:var(--bs-primary)}table.table tbody tr.table-group{cursor:pointer;background-color:var(--b-theme-light,var(--bs-light,#f5f5f5));font-weight:700}tr.table-row-selectable:hover{cursor:pointer}tr.table-row-selectable:focus[tabindex="0"]{outline:0}.table-fixed-header{overflow-y:auto}.table-fixed-header>.table{border-collapse:separate;border-spacing:0}.table-fixed-header>.table>thead:not(.table-thead-theme)>tr>th{background:#fff}.table-fixed-header>.table>thead>tr>th{border-top:0;position:sticky;z-index:10}.table-fixed-header>.table>thead>tr:nth-child(1)>th{top:0}.table-fixed-header>.table-bordered>:not(caption)>*>*{border-width:1px 1px}.table-fixed-columns{width:100%;overflow-x:auto;white-space:nowrap;position:relative}.table-fixed-columns .table{table-layout:fixed;overflow-x:auto;white-space:nowrap;border-collapse:separate;border-spacing:0}.table-fixed-columns .table .table-header-cell-fixed-start,.table-fixed-columns .table .table-row-header-fixed-start,.table-fixed-columns .table .table-row-cell-fixed-start{position:sticky;border-left:0;z-index:11;background-color:#fff;border-inline-start-width:0;left:0}.table-fixed-columns .table .table-header-cell-fixed-end,.table-fixed-columns .table .table-row-header-fixed-end,.table-fixed-columns .table .table-row-cell-fixed-end{position:sticky;border-left:0;z-index:11;background-color:#fff;border-inline-start-width:0;right:0}.table-fixed-columns .table.table-bordered td:not(.table-header-cell-fixed-start):not(.table-row-header-fixed-start):not(.table-row-cell-fixed-start),.table-fixed-columns .table.table-bordered th:not(.table-header-cell-fixed-start):not(.table-row-header-fixed-start):not(.table-row-cell-fixed-start){border-left:1px;border-inline-start-width:1px}.snackbar-stack{z-index:1069!important}.snackbar{z-index:1070!important}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}0%{opacity:0}}@keyframes slideIn{0%{transform:translateY(1rem);opacity:0}100%{transform:translateY(0);opacity:1}0%{transform:translateY(1rem);opacity:0}}.border-1{border:1px solid #dee2e6!important}.border-1.border-primary{border-color:#0d6efd!important}.border-1.border-secondary{border-color:#6c757d!important}.border-1.border-success{border-color:#198754!important}.border-1.border-info{border-color:#0dcaf0!important}.border-1.border-warning{border-color:#ffc107!important}.border-1.border-danger{border-color:#dc3545!important}.border-1.border-light{border-color:#f8f9fa!important}.border-1.border-dark{border-color:#212529!important}.border-1.border-link{border-color:#3273dc!important}.border-primary-1{border:1px solid #0d6efd!important}.border-secondary-1{border:1px solid #6c757d!important}.border-success-1{border:1px solid #198754!important}.border-info-1{border:1px solid #0dcaf0!important}.border-warning-1{border:1px solid #ffc107!important}.border-danger-1{border:1px solid #dc3545!important}.border-light-1{border:1px solid #f8f9fa!important}.border-dark-1{border:1px solid #212529!important}.border-link-1{border:1px solid #3273dc!important}.border-top-1{border-top:1px solid #dee2e6!important}.border-primary-top-1{border-top:1px solid #0d6efd!important}.border-secondary-top-1{border-top:1px solid #6c757d!important}.border-success-top-1{border-top:1px solid #198754!important}.border-info-top-1{border-top:1px solid #0dcaf0!important}.border-warning-top-1{border-top:1px solid #ffc107!important}.border-danger-top-1{border-top:1px solid #dc3545!important}.border-light-top-1{border-top:1px solid #f8f9fa!important}.border-dark-top-1{border-top:1px solid #212529!important}.border-link-top-1{border-top:1px solid #3273dc!important}.border-end-1{border-right:1px solid #dee2e6!important}.border-primary-end-1{border-right:1px solid #0d6efd!important}.border-secondary-end-1{border-right:1px solid #6c757d!important}.border-success-end-1{border-right:1px solid #198754!important}.border-info-end-1{border-right:1px solid #0dcaf0!important}.border-warning-end-1{border-right:1px solid #ffc107!important}.border-danger-end-1{border-right:1px solid #dc3545!important}.border-light-end-1{border-right:1px solid #f8f9fa!important}.border-dark-end-1{border-right:1px solid #212529!important}.border-link-end-1{border-right:1px solid #3273dc!important}.border-bottom-1{border-bottom:1px solid #dee2e6!important}.border-primary-bottom-1{border-bottom:1px solid #0d6efd!important}.border-secondary-bottom-1{border-bottom:1px solid #6c757d!important}.border-success-bottom-1{border-bottom:1px solid #198754!important}.border-info-bottom-1{border-bottom:1px solid #0dcaf0!important}.border-warning-bottom-1{border-bottom:1px solid #ffc107!important}.border-danger-bottom-1{border-bottom:1px solid #dc3545!important}.border-light-bottom-1{border-bottom:1px solid #f8f9fa!important}.border-dark-bottom-1{border-bottom:1px solid #212529!important}.border-link-bottom-1{border-bottom:1px solid #3273dc!important}.border-start-1{border-left:1px solid #dee2e6!important}.border-primary-start-1{border-left:1px solid #0d6efd!important}.border-secondary-start-1{border-left:1px solid #6c757d!important}.border-success-start-1{border-left:1px solid #198754!important}.border-info-start-1{border-left:1px solid #0dcaf0!important}.border-warning-start-1{border-left:1px solid #ffc107!important}.border-danger-start-1{border-left:1px solid #dc3545!important}.border-light-start-1{border-left:1px solid #f8f9fa!important}.border-dark-start-1{border-left:1px solid #212529!important}.border-link-start-1{border-left:1px solid #3273dc!important}.border-2{border:2px solid #dee2e6!important}.border-2.border-primary{border-color:#0d6efd!important}.border-2.border-secondary{border-color:#6c757d!important}.border-2.border-success{border-color:#198754!important}.border-2.border-info{border-color:#0dcaf0!important}.border-2.border-warning{border-color:#ffc107!important}.border-2.border-danger{border-color:#dc3545!important}.border-2.border-light{border-color:#f8f9fa!important}.border-2.border-dark{border-color:#212529!important}.border-2.border-link{border-color:#3273dc!important}.border-primary-2{border:2px solid #0d6efd!important}.border-secondary-2{border:2px solid #6c757d!important}.border-success-2{border:2px solid #198754!important}.border-info-2{border:2px solid #0dcaf0!important}.border-warning-2{border:2px solid #ffc107!important}.border-danger-2{border:2px solid #dc3545!important}.border-light-2{border:2px solid #f8f9fa!important}.border-dark-2{border:2px solid #212529!important}.border-link-2{border:2px solid #3273dc!important}.border-top-2{border-top:2px solid #dee2e6!important}.border-primary-top-2{border-top:2px solid #0d6efd!important}.border-secondary-top-2{border-top:2px solid #6c757d!important}.border-success-top-2{border-top:2px solid #198754!important}.border-info-top-2{border-top:2px solid #0dcaf0!important}.border-warning-top-2{border-top:2px solid #ffc107!important}.border-danger-top-2{border-top:2px solid #dc3545!important}.border-light-top-2{border-top:2px solid #f8f9fa!important}.border-dark-top-2{border-top:2px solid #212529!important}.border-link-top-2{border-top:2px solid #3273dc!important}.border-end-2{border-right:2px solid #dee2e6!important}.border-primary-end-2{border-right:2px solid #0d6efd!important}.border-secondary-end-2{border-right:2px solid #6c757d!important}.border-success-end-2{border-right:2px solid #198754!important}.border-info-end-2{border-right:2px solid #0dcaf0!important}.border-warning-end-2{border-right:2px solid #ffc107!important}.border-danger-end-2{border-right:2px solid #dc3545!important}.border-light-end-2{border-right:2px solid #f8f9fa!important}.border-dark-end-2{border-right:2px solid #212529!important}.border-link-end-2{border-right:2px solid #3273dc!important}.border-bottom-2{border-bottom:2px solid #dee2e6!important}.border-primary-bottom-2{border-bottom:2px solid #0d6efd!important}.border-secondary-bottom-2{border-bottom:2px solid #6c757d!important}.border-success-bottom-2{border-bottom:2px solid #198754!important}.border-info-bottom-2{border-bottom:2px solid #0dcaf0!important}.border-warning-bottom-2{border-bottom:2px solid #ffc107!important}.border-danger-bottom-2{border-bottom:2px solid #dc3545!important}.border-light-bottom-2{border-bottom:2px solid #f8f9fa!important}.border-dark-bottom-2{border-bottom:2px solid #212529!important}.border-link-bottom-2{border-bottom:2px solid #3273dc!important}.border-start-2{border-left:2px solid #dee2e6!important}.border-primary-start-2{border-left:2px solid #0d6efd!important}.border-secondary-start-2{border-left:2px solid #6c757d!important}.border-success-start-2{border-left:2px solid #198754!important}.border-info-start-2{border-left:2px solid #0dcaf0!important}.border-warning-start-2{border-left:2px solid #ffc107!important}.border-danger-start-2{border-left:2px solid #dc3545!important}.border-light-start-2{border-left:2px solid #f8f9fa!important}.border-dark-start-2{border-left:2px solid #212529!important}.border-link-start-2{border-left:2px solid #3273dc!important}.border-3{border:3px solid #dee2e6!important}.border-3.border-primary{border-color:#0d6efd!important}.border-3.border-secondary{border-color:#6c757d!important}.border-3.border-success{border-color:#198754!important}.border-3.border-info{border-color:#0dcaf0!important}.border-3.border-warning{border-color:#ffc107!important}.border-3.border-danger{border-color:#dc3545!important}.border-3.border-light{border-color:#f8f9fa!important}.border-3.border-dark{border-color:#212529!important}.border-3.border-link{border-color:#3273dc!important}.border-primary-3{border:3px solid #0d6efd!important}.border-secondary-3{border:3px solid #6c757d!important}.border-success-3{border:3px solid #198754!important}.border-info-3{border:3px solid #0dcaf0!important}.border-warning-3{border:3px solid #ffc107!important}.border-danger-3{border:3px solid #dc3545!important}.border-light-3{border:3px solid #f8f9fa!important}.border-dark-3{border:3px solid #212529!important}.border-link-3{border:3px solid #3273dc!important}.border-top-3{border-top:3px solid #dee2e6!important}.border-primary-top-3{border-top:3px solid #0d6efd!important}.border-secondary-top-3{border-top:3px solid #6c757d!important}.border-success-top-3{border-top:3px solid #198754!important}.border-info-top-3{border-top:3px solid #0dcaf0!important}.border-warning-top-3{border-top:3px solid #ffc107!important}.border-danger-top-3{border-top:3px solid #dc3545!important}.border-light-top-3{border-top:3px solid #f8f9fa!important}.border-dark-top-3{border-top:3px solid #212529!important}.border-link-top-3{border-top:3px solid #3273dc!important}.border-end-3{border-right:3px solid #dee2e6!important}.border-primary-end-3{border-right:3px solid #0d6efd!important}.border-secondary-end-3{border-right:3px solid #6c757d!important}.border-success-end-3{border-right:3px solid #198754!important}.border-info-end-3{border-right:3px solid #0dcaf0!important}.border-warning-end-3{border-right:3px solid #ffc107!important}.border-danger-end-3{border-right:3px solid #dc3545!important}.border-light-end-3{border-right:3px solid #f8f9fa!important}.border-dark-end-3{border-right:3px solid #212529!important}.border-link-end-3{border-right:3px solid #3273dc!important}.border-bottom-3{border-bottom:3px solid #dee2e6!important}.border-primary-bottom-3{border-bottom:3px solid #0d6efd!important}.border-secondary-bottom-3{border-bottom:3px solid #6c757d!important}.border-success-bottom-3{border-bottom:3px solid #198754!important}.border-info-bottom-3{border-bottom:3px solid #0dcaf0!important}.border-warning-bottom-3{border-bottom:3px solid #ffc107!important}.border-danger-bottom-3{border-bottom:3px solid #dc3545!important}.border-light-bottom-3{border-bottom:3px solid #f8f9fa!important}.border-dark-bottom-3{border-bottom:3px solid #212529!important}.border-link-bottom-3{border-bottom:3px solid #3273dc!important}.border-start-3{border-left:3px solid #dee2e6!important}.border-primary-start-3{border-left:3px solid #0d6efd!important}.border-secondary-start-3{border-left:3px solid #6c757d!important}.border-success-start-3{border-left:3px solid #198754!important}.border-info-start-3{border-left:3px solid #0dcaf0!important}.border-warning-start-3{border-left:3px solid #ffc107!important}.border-danger-start-3{border-left:3px solid #dc3545!important}.border-light-start-3{border-left:3px solid #f8f9fa!important}.border-dark-start-3{border-left:3px solid #212529!important}.border-link-start-3{border-left:3px solid #3273dc!important}.border-4{border:4px solid #dee2e6!important}.border-4.border-primary{border-color:#0d6efd!important}.border-4.border-secondary{border-color:#6c757d!important}.border-4.border-success{border-color:#198754!important}.border-4.border-info{border-color:#0dcaf0!important}.border-4.border-warning{border-color:#ffc107!important}.border-4.border-danger{border-color:#dc3545!important}.border-4.border-light{border-color:#f8f9fa!important}.border-4.border-dark{border-color:#212529!important}.border-4.border-link{border-color:#3273dc!important}.border-primary-4{border:4px solid #0d6efd!important}.border-secondary-4{border:4px solid #6c757d!important}.border-success-4{border:4px solid #198754!important}.border-info-4{border:4px solid #0dcaf0!important}.border-warning-4{border:4px solid #ffc107!important}.border-danger-4{border:4px solid #dc3545!important}.border-light-4{border:4px solid #f8f9fa!important}.border-dark-4{border:4px solid #212529!important}.border-link-4{border:4px solid #3273dc!important}.border-top-4{border-top:4px solid #dee2e6!important}.border-primary-top-4{border-top:4px solid #0d6efd!important}.border-secondary-top-4{border-top:4px solid #6c757d!important}.border-success-top-4{border-top:4px solid #198754!important}.border-info-top-4{border-top:4px solid #0dcaf0!important}.border-warning-top-4{border-top:4px solid #ffc107!important}.border-danger-top-4{border-top:4px solid #dc3545!important}.border-light-top-4{border-top:4px solid #f8f9fa!important}.border-dark-top-4{border-top:4px solid #212529!important}.border-link-top-4{border-top:4px solid #3273dc!important}.border-end-4{border-right:4px solid #dee2e6!important}.border-primary-end-4{border-right:4px solid #0d6efd!important}.border-secondary-end-4{border-right:4px solid #6c757d!important}.border-success-end-4{border-right:4px solid #198754!important}.border-info-end-4{border-right:4px solid #0dcaf0!important}.border-warning-end-4{border-right:4px solid #ffc107!important}.border-danger-end-4{border-right:4px solid #dc3545!important}.border-light-end-4{border-right:4px solid #f8f9fa!important}.border-dark-end-4{border-right:4px solid #212529!important}.border-link-end-4{border-right:4px solid #3273dc!important}.border-bottom-4{border-bottom:4px solid #dee2e6!important}.border-primary-bottom-4{border-bottom:4px solid #0d6efd!important}.border-secondary-bottom-4{border-bottom:4px solid #6c757d!important}.border-success-bottom-4{border-bottom:4px solid #198754!important}.border-info-bottom-4{border-bottom:4px solid #0dcaf0!important}.border-warning-bottom-4{border-bottom:4px solid #ffc107!important}.border-danger-bottom-4{border-bottom:4px solid #dc3545!important}.border-light-bottom-4{border-bottom:4px solid #f8f9fa!important}.border-dark-bottom-4{border-bottom:4px solid #212529!important}.border-link-bottom-4{border-bottom:4px solid #3273dc!important}.border-start-4{border-left:4px solid #dee2e6!important}.border-primary-start-4{border-left:4px solid #0d6efd!important}.border-secondary-start-4{border-left:4px solid #6c757d!important}.border-success-start-4{border-left:4px solid #198754!important}.border-info-start-4{border-left:4px solid #0dcaf0!important}.border-warning-start-4{border-left:4px solid #ffc107!important}.border-danger-start-4{border-left:4px solid #dc3545!important}.border-light-start-4{border-left:4px solid #f8f9fa!important}.border-dark-start-4{border-left:4px solid #212529!important}.border-link-start-4{border-left:4px solid #3273dc!important}.border-5{border:5px solid #dee2e6!important}.border-5.border-primary{border-color:#0d6efd!important}.border-5.border-secondary{border-color:#6c757d!important}.border-5.border-success{border-color:#198754!important}.border-5.border-info{border-color:#0dcaf0!important}.border-5.border-warning{border-color:#ffc107!important}.border-5.border-danger{border-color:#dc3545!important}.border-5.border-light{border-color:#f8f9fa!important}.border-5.border-dark{border-color:#212529!important}.border-5.border-link{border-color:#3273dc!important}.border-primary-5{border:5px solid #0d6efd!important}.border-secondary-5{border:5px solid #6c757d!important}.border-success-5{border:5px solid #198754!important}.border-info-5{border:5px solid #0dcaf0!important}.border-warning-5{border:5px solid #ffc107!important}.border-danger-5{border:5px solid #dc3545!important}.border-light-5{border:5px solid #f8f9fa!important}.border-dark-5{border:5px solid #212529!important}.border-link-5{border:5px solid #3273dc!important}.border-top-5{border-top:5px solid #dee2e6!important}.border-primary-top-5{border-top:5px solid #0d6efd!important}.border-secondary-top-5{border-top:5px solid #6c757d!important}.border-success-top-5{border-top:5px solid #198754!important}.border-info-top-5{border-top:5px solid #0dcaf0!important}.border-warning-top-5{border-top:5px solid #ffc107!important}.border-danger-top-5{border-top:5px solid #dc3545!important}.border-light-top-5{border-top:5px solid #f8f9fa!important}.border-dark-top-5{border-top:5px solid #212529!important}.border-link-top-5{border-top:5px solid #3273dc!important}.border-end-5{border-right:5px solid #dee2e6!important}.border-primary-end-5{border-right:5px solid #0d6efd!important}.border-secondary-end-5{border-right:5px solid #6c757d!important}.border-success-end-5{border-right:5px solid #198754!important}.border-info-end-5{border-right:5px solid #0dcaf0!important}.border-warning-end-5{border-right:5px solid #ffc107!important}.border-danger-end-5{border-right:5px solid #dc3545!important}.border-light-end-5{border-right:5px solid #f8f9fa!important}.border-dark-end-5{border-right:5px solid #212529!important}.border-link-end-5{border-right:5px solid #3273dc!important}.border-bottom-5{border-bottom:5px solid #dee2e6!important}.border-primary-bottom-5{border-bottom:5px solid #0d6efd!important}.border-secondary-bottom-5{border-bottom:5px solid #6c757d!important}.border-success-bottom-5{border-bottom:5px solid #198754!important}.border-info-bottom-5{border-bottom:5px solid #0dcaf0!important}.border-warning-bottom-5{border-bottom:5px solid #ffc107!important}.border-danger-bottom-5{border-bottom:5px solid #dc3545!important}.border-light-bottom-5{border-bottom:5px solid #f8f9fa!important}.border-dark-bottom-5{border-bottom:5px solid #212529!important}.border-link-bottom-5{border-bottom:5px solid #3273dc!important}.border-start-5{border-left:5px solid #dee2e6!important}.border-primary-start-5{border-left:5px solid #0d6efd!important}.border-secondary-start-5{border-left:5px solid #6c757d!important}.border-success-start-5{border-left:5px solid #198754!important}.border-info-start-5{border-left:5px solid #0dcaf0!important}.border-warning-start-5{border-left:5px solid #ffc107!important}.border-danger-start-5{border-left:5px solid #dc3545!important}.border-light-start-5{border-left:5px solid #f8f9fa!important}.border-dark-start-5{border-left:5px solid #212529!important}.border-link-start-5{border-left:5px solid #3273dc!important}.cursor-pointer{cursor:pointer}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows,1),1fr);grid-template-columns:repeat(var(--bs-columns,12),1fr);gap:var(--bs-gap,1.5rem)}.grid.g-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid.g-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid.g-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid.g-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid.g-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid.g-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid.g-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid.g-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.g-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.g-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.g-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid.g-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid.g-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid.g-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid.g-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid.g-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid.g-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid.g-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}@media(min-width:576px){.grid.g-rows-sm-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid.g-rows-sm-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid.g-rows-sm-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid.g-rows-sm-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid.g-rows-sm-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid.g-rows-sm-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid.g-cols-sm-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid.g-cols-sm-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.g-cols-sm-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.g-cols-sm-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.g-cols-sm-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid.g-cols-sm-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid.g-cols-sm-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid.g-cols-sm-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid.g-cols-sm-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid.g-cols-sm-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid.g-cols-sm-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid.g-cols-sm-12{grid-template-columns:repeat(12,minmax(0,1fr))}}@media(min-width:768px){.grid.g-rows-md-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid.g-rows-md-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid.g-rows-md-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid.g-rows-md-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid.g-rows-md-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid.g-rows-md-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid.g-cols-md-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid.g-cols-md-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.g-cols-md-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.g-cols-md-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.g-cols-md-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid.g-cols-md-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid.g-cols-md-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid.g-cols-md-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid.g-cols-md-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid.g-cols-md-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid.g-cols-md-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid.g-cols-md-12{grid-template-columns:repeat(12,minmax(0,1fr))}}@media(min-width:992px){.grid.g-rows-lg-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid.g-rows-lg-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid.g-rows-lg-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid.g-rows-lg-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid.g-rows-lg-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid.g-rows-lg-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid.g-cols-lg-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid.g-cols-lg-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.g-cols-lg-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.g-cols-lg-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.g-cols-lg-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid.g-cols-lg-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid.g-cols-lg-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid.g-cols-lg-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid.g-cols-lg-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid.g-cols-lg-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid.g-cols-lg-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid.g-cols-lg-12{grid-template-columns:repeat(12,minmax(0,1fr))}}@media(min-width:1200px){.grid.g-rows-xl-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid.g-rows-xl-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid.g-rows-xl-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid.g-rows-xl-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid.g-rows-xl-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid.g-rows-xl-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid.g-cols-xl-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid.g-cols-xl-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.g-cols-xl-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.g-cols-xl-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.g-cols-xl-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid.g-cols-xl-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid.g-cols-xl-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid.g-cols-xl-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid.g-cols-xl-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid.g-cols-xl-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid.g-cols-xl-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid.g-cols-xl-12{grid-template-columns:repeat(12,minmax(0,1fr))}}@media(min-width:1400px){.grid.g-rows-xxl-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid.g-rows-xxl-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid.g-rows-xxl-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid.g-rows-xxl-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid.g-rows-xxl-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid.g-rows-xxl-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid.g-cols-xxl-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid.g-cols-xxl-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.g-cols-xxl-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.g-cols-xxl-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid.g-cols-xxl-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid.g-cols-xxl-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid.g-cols-xxl-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid.g-cols-xxl-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid.g-cols-xxl-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid.g-cols-xxl-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid.g-cols-xxl-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid.g-cols-xxl-12{grid-template-columns:repeat(12,minmax(0,1fr))}}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width:576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width:768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width:992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width:1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width:1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}ol.ordered-list-lower-alpha{list-style-type:lower-alpha}ol.ordered-list-lower-roman{list-style-type:lower-roman}ol.ordered-list-upper-alpha{list-style-type:upper-alpha}ol.ordered-list-upper-roman{list-style-type:upper-roman}.overflow-auto-auto{overflow:auto auto!important}.overflow-auto-hidden{overflow:auto hidden!important}.overflow-auto-visible{overflow:auto visible!important}.overflow-auto-scroll{overflow:auto scroll!important}.overflow-hidden-auto{overflow:hidden auto!important}.overflow-hidden-hidden{overflow:hidden hidden!important}.overflow-hidden-visible{overflow:hidden visible!important}.overflow-hidden-scroll{overflow:hidden scroll!important}.overflow-visible-auto{overflow:visible auto!important}.overflow-visible-hidden{overflow:visible hidden!important}.overflow-visible-visible{overflow:visible visible!important}.overflow-visible-scroll{overflow:visible scroll!important}.overflow-scroll-auto{overflow:scroll auto!important}.overflow-scroll-hidden{overflow:scroll hidden!important}.overflow-scroll-visible{overflow:scroll visible!important}.overflow-scroll-scroll{overflow:scroll scroll!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.w-33{width:33.333333%!important}.w-66{width:66.666667%!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.h-33{height:33.333333%!important}.h-66{height:66.666667%!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}@media(min-width:576px){.w-sm-25{width:25%!important}.w-sm-50{width:50%!important}.w-sm-75{width:75%!important}.w-sm-100{width:100%!important}.w-sm-auto{width:auto!important}.w-sm-33{width:33.333333%!important}.w-sm-66{width:66.666667%!important}.mw-sm-100{max-width:100%!important}.vw-sm-100{width:100vw!important}.min-vw-sm-100{min-width:100vw!important}.h-sm-25{height:25%!important}.h-sm-50{height:50%!important}.h-sm-75{height:75%!important}.h-sm-100{height:100%!important}.h-sm-auto{height:auto!important}.h-sm-33{height:33.333333%!important}.h-sm-66{height:66.666667%!important}.mh-sm-100{max-height:100%!important}.vh-sm-100{height:100vh!important}.min-vh-sm-100{min-height:100vh!important}}@media(min-width:768px){.w-md-25{width:25%!important}.w-md-50{width:50%!important}.w-md-75{width:75%!important}.w-md-100{width:100%!important}.w-md-auto{width:auto!important}.w-md-33{width:33.333333%!important}.w-md-66{width:66.666667%!important}.mw-md-100{max-width:100%!important}.vw-md-100{width:100vw!important}.min-vw-md-100{min-width:100vw!important}.h-md-25{height:25%!important}.h-md-50{height:50%!important}.h-md-75{height:75%!important}.h-md-100{height:100%!important}.h-md-auto{height:auto!important}.h-md-33{height:33.333333%!important}.h-md-66{height:66.666667%!important}.mh-md-100{max-height:100%!important}.vh-md-100{height:100vh!important}.min-vh-md-100{min-height:100vh!important}}@media(min-width:992px){.w-lg-25{width:25%!important}.w-lg-50{width:50%!important}.w-lg-75{width:75%!important}.w-lg-100{width:100%!important}.w-lg-auto{width:auto!important}.w-lg-33{width:33.333333%!important}.w-lg-66{width:66.666667%!important}.mw-lg-100{max-width:100%!important}.vw-lg-100{width:100vw!important}.min-vw-lg-100{min-width:100vw!important}.h-lg-25{height:25%!important}.h-lg-50{height:50%!important}.h-lg-75{height:75%!important}.h-lg-100{height:100%!important}.h-lg-auto{height:auto!important}.h-lg-33{height:33.333333%!important}.h-lg-66{height:66.666667%!important}.mh-lg-100{max-height:100%!important}.vh-lg-100{height:100vh!important}.min-vh-lg-100{min-height:100vh!important}}@media(min-width:1200px){.w-xl-25{width:25%!important}.w-xl-50{width:50%!important}.w-xl-75{width:75%!important}.w-xl-100{width:100%!important}.w-xl-auto{width:auto!important}.w-xl-33{width:33.333333%!important}.w-xl-66{width:66.666667%!important}.mw-xl-100{max-width:100%!important}.vw-xl-100{width:100vw!important}.min-vw-xl-100{min-width:100vw!important}.h-xl-25{height:25%!important}.h-xl-50{height:50%!important}.h-xl-75{height:75%!important}.h-xl-100{height:100%!important}.h-xl-auto{height:auto!important}.h-xl-33{height:33.333333%!important}.h-xl-66{height:66.666667%!important}.mh-xl-100{max-height:100%!important}.vh-xl-100{height:100vh!important}.min-vh-xl-100{min-height:100vh!important}}@media(min-width:1400px){.w-xxl-25{width:25%!important}.w-xxl-50{width:50%!important}.w-xxl-75{width:75%!important}.w-xxl-100{width:100%!important}.w-xxl-auto{width:auto!important}.w-xxl-33{width:33.333333%!important}.w-xxl-66{width:66.666667%!important}.mw-xxl-100{max-width:100%!important}.vw-xxl-100{width:100vw!important}.min-vw-xxl-100{min-width:100vw!important}.h-xxl-25{height:25%!important}.h-xxl-50{height:50%!important}.h-xxl-75{height:75%!important}.h-xxl-100{height:100%!important}.h-xxl-auto{height:auto!important}.h-xxl-33{height:33.333333%!important}.h-xxl-66{height:66.666667%!important}.mh-xxl-100{max-height:100%!important}.vh-xxl-100{height:100vh!important}.min-vh-xxl-100{min-height:100vh!important}}.gap-y-0{row-gap:0!important}.gap-x-0{column-gap:0!important}.gap-y-1{row-gap:.25rem!important}.gap-x-1{column-gap:.25rem!important}.gap-y-2{row-gap:.5rem!important}.gap-x-2{column-gap:.5rem!important}.gap-y-3{row-gap:1rem!important}.gap-x-3{column-gap:1rem!important}.gap-y-4{row-gap:1.5rem!important}.gap-x-4{column-gap:1.5rem!important}.gap-y-5{row-gap:3rem!important}.gap-x-5{column-gap:3rem!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fs-xs{font-size:.75rem!important}.fs-sm{font-size:.925rem!important}.fs-md{font-size:1.125rem!important}.fs-lg{font-size:1.25rem!important}.fs-xl{font-size:calc(1.275rem + .3vw)!important}@media(min-width:576px){.fs-sm-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-sm-2{font-size:calc(1.325rem + .9vw)!important}.fs-sm-3{font-size:calc(1.3rem + .6vw)!important}.fs-sm-4{font-size:calc(1.275rem + .3vw)!important}.fs-sm-5{font-size:1.25rem!important}.fs-sm-6{font-size:1rem!important}.fs-sm-xs{font-size:.75rem!important}.fs-sm-sm{font-size:.925rem!important}.fs-sm-md{font-size:1.125rem!important}.fs-sm-lg{font-size:1.25rem!important}.fs-sm-xl{font-size:calc(1.275rem + .3vw)!important}}@media(min-width:768px){.fs-md-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-md-2{font-size:calc(1.325rem + .9vw)!important}.fs-md-3{font-size:calc(1.3rem + .6vw)!important}.fs-md-4{font-size:calc(1.275rem + .3vw)!important}.fs-md-5{font-size:1.25rem!important}.fs-md-6{font-size:1rem!important}.fs-md-xs{font-size:.75rem!important}.fs-md-sm{font-size:.925rem!important}.fs-md-md{font-size:1.125rem!important}.fs-md-lg{font-size:1.25rem!important}.fs-md-xl{font-size:calc(1.275rem + .3vw)!important}}@media(min-width:992px){.fs-lg-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-lg-2{font-size:calc(1.325rem + .9vw)!important}.fs-lg-3{font-size:calc(1.3rem + .6vw)!important}.fs-lg-4{font-size:calc(1.275rem + .3vw)!important}.fs-lg-5{font-size:1.25rem!important}.fs-lg-6{font-size:1rem!important}.fs-lg-xs{font-size:.75rem!important}.fs-lg-sm{font-size:.925rem!important}.fs-lg-md{font-size:1.125rem!important}.fs-lg-lg{font-size:1.25rem!important}.fs-lg-xl{font-size:calc(1.275rem + .3vw)!important}}@media(min-width:1200px){.fs-xl-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-xl-2{font-size:calc(1.325rem + .9vw)!important}.fs-xl-3{font-size:calc(1.3rem + .6vw)!important}.fs-xl-4{font-size:calc(1.275rem + .3vw)!important}.fs-xl-5{font-size:1.25rem!important}.fs-xl-6{font-size:1rem!important}.fs-xl-xs{font-size:.75rem!important}.fs-xl-sm{font-size:.925rem!important}.fs-xl-md{font-size:1.125rem!important}.fs-xl-lg{font-size:1.25rem!important}.fs-xl-xl{font-size:calc(1.275rem + .3vw)!important}}@media(min-width:1400px){.fs-xxl-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-xxl-2{font-size:calc(1.325rem + .9vw)!important}.fs-xxl-3{font-size:calc(1.3rem + .6vw)!important}.fs-xxl-4{font-size:calc(1.275rem + .3vw)!important}.fs-xxl-5{font-size:1.25rem!important}.fs-xxl-6{font-size:1rem!important}.fs-xxl-xs{font-size:.75rem!important}.fs-xxl-sm{font-size:.925rem!important}.fs-xxl-md{font-size:1.125rem!important}.fs-xxl-lg{font-size:1.25rem!important}.fs-xxl-xl{font-size:calc(1.275rem + .3vw)!important}}.flatpickr-months{margin:.5rem 0}.flatpickr-months .flatpickr-month,.flatpickr-months .flatpickr-next-month,.flatpickr-months .flatpickr-prev-month{height:auto;position:relative}.flatpickr-months .flatpickr-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg,.flatpickr-months .flatpickr-prev-month:hover svg{fill:#0d6efd}.flatpickr-months .flatpickr-month{color:#212529}.flatpickr-current-month{padding:13px 0 0 0;font-size:115%}.flatpickr-current-month span.cur-month{font-weight:700}.flatpickr-current-month span.cur-month:hover{background:rgba(13,110,253,.15)}.numInputWrapper:hover{background:rgba(13,110,253,.15)}.flatpickr-day{border-radius:.375rem;font-weight:500;color:#212529}.flatpickr-day.today{border-color:#0d6efd}.flatpickr-day.today:hover{background:#0d6efd;border-color:#0d6efd}.flatpickr-day:hover{background:rgba(13,110,253,.1);border-color:rgba(0,0,0,0)}span.flatpickr-weekday{color:#212529}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#0d6efd;border-color:#0d6efd}.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)){box-shadow:-10px 0 0 #0d6efd}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:.375rem 0 0 .375rem}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 .375rem .375rem 0}.flatpickr-monthSelect-month:hover,.flatpickr-monthSelect-month:focus{background:rgba(13,110,253,.1)}.flatpickr-monthSelect-month.selected{background-color:#0d6efd} .snackbar{align-items:center;background-color:var(--b-snackbar-background,#323232);color:var(--b-snackbar-text-color,#fff);font-size:.875rem;line-height:1.428572;opacity:0;padding:.875rem 1.5rem;position:fixed;bottom:0;left:0;transform:translateY(100%);transition:opacity 0s var(--transition-duration-mobile-leaving,.195s),transform var(--transition-duration-mobile-leaving,.195s) cubic-bezier(.4,0,1,1);width:100%;z-index:60}@media(min-width:768px){.snackbar{border-radius:2px;max-width:35.5rem;min-width:18rem;left:50%;transform:translate(-50%,100%);width:auto}}@media(min-width:768px){.snackbar{transition:opacity 0s var(--transition-duration-tablet-leaving,.2535s),transform var(--transition-duration-tablet-leaving,.2535s) cubic-bezier(.4,0,1,1)}}@media(min-width:1200px){.snackbar{transition:opacity 0s var(--transition-duration-desktop-leaving,.13s),transform var(--transition-duration-desktop-leaving,.13s) cubic-bezier(.4,0,1,1)}}@media screen and (prefers-reduced-motion:reduce){.snackbar{transition:none}}.snackbar.snackbar-show{transition-duration:var(--transition-duration-mobile-entering,.225s);transition-property:transform;transition-timing-function:cubic-bezier(0,0,.2,1);opacity:1;transform:translateY(0)}@media(min-width:768px){.snackbar.snackbar-show{transition-duration:var(--transition-duration-tablet-entering,.2925s)}}@media(min-width:1200px){.snackbar.snackbar-show{transition-duration:var(--transition-duration-desktop-entering,.15s)}}@media screen and (prefers-reduced-motion:reduce){.snackbar.snackbar-show{transition:none}}@media(min-width:768px){.snackbar.snackbar-show{transform:translate(-50%,-1.5rem)}}.snackbar-header{display:flex;-ms-flex-pack:justify;justify-content:space-between;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:DARKEN(var(--b-snackbar-background,#323232),30%);margin-right:auto;min-width:0;font-weight:bold;padding-bottom:.875rem}.snackbar-footer{display:flex;-ms-flex-pack:justify;justify-content:space-between;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:DARKEN(var(--b-snackbar-background,#323232),30%);margin-right:auto;min-width:0;padding-top:.875rem}.snackbar-body{display:flex;-ms-flex-pack:justify;justify-content:space-between;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-right:auto;max-height:100%;min-width:0}.snackbar-action-button{transition-duration:var(--transition-duration-mobile,.3s);transition-property:background-color,background-image;transition-timing-function:cubic-bezier(.4,0,.2,1);background-color:transparent;background-image:none;border:0;color:var(--b-snackbar-button-color,var(--b-snackbar-button-color,#ff4081));cursor:pointer;display:block;flex-shrink:0;font-size:inherit;font-weight:500;line-height:inherit;padding:0;text-transform:uppercase;white-space:nowrap}@media(min-width:768px){.snackbar-action-button{transition-duration:var(--transition-duration-tablet,.39s)}}@media(min-width:1200px){.snackbar-action-button{transition-duration:var(--transition-duration-desktop,.2s)}}@media screen and (prefers-reduced-motion:reduce){.snackbar-action-button{transition:none}}.snackbar-action-button:focus,.snackbar-action-button:hover{color:var(--b-snackbar-button-hover-color,var(--b-snackbar-button-hover-color,#ff80ab));text-decoration:none}@media(min-width:768px){.snackbar-action-button{margin-left:3rem}}.snackbar-action-button:focus{outline:0}@media(min-width:768px){.snackbar-bottom-start,.snackbar-bottom-end{transform:translateY(100%)}.snackbar-bottom-start.snackbar-show,.snackbar-bottom-end.snackbar-show{transform:translateY(-1.5rem)}}@media(min-width:768px){.snackbar-bottom-start{left:1.5rem}}@media(min-width:768px){.snackbar-bottom-end{right:1.5rem;left:auto}}.snackbar-top{top:0;bottom:auto;transform:translateY(-100%)}@media(min-width:768px){.snackbar-top{transform:translateX(-50%) translateY(-100%)}.snackbar-top.snackbar-show{transform:translate(-50%,1.5rem)}}.snackbar-top-start{top:0;bottom:auto;transform:translateY(-100%);left:0}@media(min-width:768px){.snackbar-top-start{transform:translateY(-100%);left:1.5rem}.snackbar-top-start.snackbar-show{transform:translateY(1.5rem)}}.snackbar-top-end{top:0;bottom:auto;transform:translateY(-100%)}@media(min-width:768px){.snackbar-top-end{transform:translateY(-100%);right:1.5rem;left:auto}.snackbar-top-end.snackbar-show{transform:translateY(1.5rem)}}.snackbar-multi-line{padding-top:1.25rem;padding-bottom:1.25rem}.snackbar-multi-line .snackbar-body{white-space:normal}.snackbar-primary{background-color:var(--b-snackbar-background-primary,#cce5ff);color:var(--b-snackbar-text-primary,#004085)}.snackbar-action-button-primary{color:var(--b-snackbar-button-primary,#ff4081)}.snackbar-action-button-primary:focus,.snackbar-action-button-primary:hover{color:var(--b-snackbar-button-hover-primary,#ff80ab)}.snackbar-secondary{background-color:var(--b-snackbar-background-secondary,#e2e3e5);color:var(--b-snackbar-text-secondary,#383d41)}.snackbar-action-button-secondary{color:var(--b-snackbar-button-secondary,#ff4081)}.snackbar-action-button-secondary:focus,.snackbar-action-button-secondary:hover{color:var(--b-snackbar-button-hover-secondary,#ff80ab)}.snackbar-success{background-color:var(--b-snackbar-background-success,#d4edda);color:var(--b-snackbar-text-success,#155724)}.snackbar-action-button-success{color:var(--b-snackbar-button-success,#ff4081)}.snackbar-action-button-success:focus,.snackbar-action-button-success:hover{color:var(--b-snackbar-button-hover-success,#ff80ab)}.snackbar-danger{background-color:var(--b-snackbar-background-danger,#f8d7da);color:var(--b-snackbar-text-danger,#721c24)}.snackbar-action-button-danger{color:var(--b-snackbar-button-danger,#ff4081)}.snackbar-action-button-danger:focus,.snackbar-action-button-danger:hover{color:var(--b-snackbar-button-hover-danger,#ff80ab)}.snackbar-warning{background-color:var(--b-snackbar-background-warning,#fff3cd);color:var(--b-snackbar-text-warning,#856404)}.snackbar-action-button-warning{color:var(--b-snackbar-button-warning,#ff4081)}.snackbar-action-button-warning:focus,.snackbar-action-button-warning:hover{color:var(--b-snackbar-button-hover-warning,#ff80ab)}.snackbar-info{background-color:var(--b-snackbar-background-info,#d1ecf1);color:var(--b-snackbar-text-info,#0c5460)}.snackbar-action-button-info{color:var(--b-snackbar-button-info,#ff4081)}.snackbar-action-button-info:focus,.snackbar-action-button-info:hover{color:var(--b-snackbar-button-hover-info,#ff80ab)}.snackbar-light{background-color:var(--b-snackbar-background-light,#fefefe);color:var(--b-snackbar-text-light,#818182)}.snackbar-action-button-light{color:var(--b-snackbar-button-light,#ff4081)}.snackbar-action-button-light:focus,.snackbar-action-button-light:hover{color:var(--b-snackbar-button-hover-light,#ff80ab)}.snackbar-dark{background-color:var(--b-snackbar-background-dark,#d6d8d9);color:var(--b-snackbar-text-dark,#1b1e21)}.snackbar-action-button-dark{color:var(--b-snackbar-button-dark,#ff4081)}.snackbar-action-button-dark:focus,.snackbar-action-button-dark:hover{color:var(--b-snackbar-button-hover-dark,#ff80ab)}.snackbar-stack-bottom-end,.snackbar-stack-bottom-start,.snackbar-stack-bottom{display:flex;flex-direction:column;position:fixed;z-index:1090!important;bottom:0}.snackbar-stack-bottom-end .snackbar,.snackbar-stack-bottom-start .snackbar,.snackbar-stack-bottom .snackbar{position:relative;flex-direction:row;margin-bottom:0}.snackbar-stack-bottom-end .snackbar:not(:last-child),.snackbar-stack-bottom-start .snackbar:not(:last-child),.snackbar-stack-bottom .snackbar:not(:last-child){margin-bottom:1.5rem}.snackbar-stack-top-end,.snackbar-stack-top-start,.snackbar-stack-top{display:flex;flex-direction:column;align-items:center;justify-content:center;align-content:center;position:fixed;z-index:1090!important;top:0}.snackbar-stack-top-end .snackbar,.snackbar-stack-top-start .snackbar,.snackbar-stack-top .snackbar{position:relative;flex-direction:row;margin-bottom:0}.snackbar-stack-top-end .snackbar:not(:last-child),.snackbar-stack-top-start .snackbar:not(:last-child),.snackbar-stack-top .snackbar:not(:last-child){margin-bottom:1.5rem}.snackbar-stack-top .snackbar.snackbar-show,.snackbar-stack-top-start .snackbar.snackbar-show,.snackbar-stack-top-end .snackbar.snackbar-show{transition:all var(--stack-transition-duration,1000);animation:showTop var(--stack-animation-duration,500) forwards}.snackbar-stack-top .snackbar-hide,.snackbar-stack-top-start .snackbar-hide,.snackbar-stack-top-end .snackbar-hide{transition:all var(--stack-transition-duration,1000);animation:hideTop var(--stack-animation-duration,500) backwards}.snackbar-stack-bottom .snackbar.snackbar-show,.snackbar-stack-bottom-start .snackbar.snackbar-show,.snackbar-stack-bottom-end .snackbar.snackbar-show{transition:all var(--stack-transition-duration,1000);animation:showBottom var(--stack-animation-duration,500) forwards}.snackbar-stack-bottom .snackbar-hide,.snackbar-stack-bottom-start .snackbar-hide,.snackbar-stack-bottom-end .snackbar-hide{transition:all var(--stack-transition-duration,1000);animation:hideBottom var(--stack-animation-duration,500) backwards}@keyframes showTop{0%{opacity:0}100%{opacity:1}}@keyframes hideTop{0%{opacity:1;top:0}100%{opacity:0;top:-100px}}@keyframes showBottom{0%{opacity:0}100%{opacity:1}}@keyframes hideBottom{0%{opacity:1}100%{opacity:0}}@media(min-width:576px){.snackbar-stack-bottom{left:50%;transform:translate(-50%,0%)}.snackbar-stack-bottom-start{left:1.5rem}.snackbar-stack-bottom-end{right:1.5rem}.snackbar-stack-top-start{left:1.5rem;top:1.5rem}.snackbar-stack-top-end{right:1.5rem;top:1.5rem}.snackbar-stack-top{left:50%;transform:translate(-50%,0%);top:1.5rem}}@media(max-width:576px){.snackbar-stack{right:0;left:0}} .radar-spinner,.radar-spinner *{box-sizing:border-box}.radar-spinner{height:60px;width:60px;position:relative}.radar-spinner .circle{position:absolute;height:100%;width:100%;top:0;left:0;animation:radar-spinner-animation 2s infinite}.radar-spinner .circle:nth-child(1){padding:calc(60px*5*2*0/110);animation-delay:300ms}.radar-spinner .circle:nth-child(2){padding:calc(60px*5*2*1/110);animation-delay:300ms}.radar-spinner .circle:nth-child(3){padding:calc(60px*5*2*2/110);animation-delay:300ms}.radar-spinner .circle:nth-child(4){padding:calc(60px*5*2*3/110);animation-delay:0ms}.radar-spinner .circle-inner,.radar-spinner .circle-inner-container{height:100%;width:100%;border-radius:50%;border:calc(60px*5/110) solid transparent}.radar-spinner .circle-inner{border-left-color:var(--secondary,#ff1d5e);border-right-color:var(--secondary,#ff1d5e)}@keyframes radar-spinner-animation{50%{transform:rotate(180deg)}100%{transform:rotate(0deg)}} @keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0} diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/wwwroot/global.js b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/wwwroot/global.js index a25bd0ac39..64ebbe6cfa 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/wwwroot/global.js +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/wwwroot/global.js @@ -12,7 +12,7 @@ var abp=abp||{};(function(){abp.utils=abp.utils||{};abp.utils.updateHTMLDirAndLa */ (function(n,t){typeof exports=="object"&&typeof module!="undefined"?module.exports=t():typeof define=="function"&&define.amd?define(t):(n=typeof globalThis!="undefined"?globalThis:n||self,n.bootstrap=t())})(this,function(){"use strict";function oe(n,t){return t&&`${t}::${fe++}`||n.uidEvent||fe++}function se(n){const t=oe(n);return n.uidEvent=t,su[t]=su[t]||{},su[t]}function yl(t,i){return function r(u){return u.delegateTarget=t,r.oneOff&&n.off(t,u.type,i),i.apply(t,[u])}}function pl(t,i,r){return function u(f){const e=t.querySelectorAll(i);for(let{target:o}=f;o&&o!==this;o=o.parentNode)for(let s=e.length;s--;)if(e[s]===o)return f.delegateTarget=o,u.oneOff&&n.off(t,f.type,i,r),r.apply(o,[f]);return null}}function he(n,t,i=null){const r=Object.keys(n);for(let u=0,f=r.length;ufunction(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return n.call(this,t)};r?r=n(r):i=n(i)}const[e,o,s]=ce(t,i,r),c=se(n),l=c[s]||(c[s]={}),h=he(l,o,e?i:null);if(h){h.oneOff=h.oneOff&&u;return}const a=oe(o,t.replace(hl,"")),f=e?pl(n,i,r):yl(n,i);f.delegationSelector=e?i:null;f.originalHandler=o;f.oneOff=u;f.uidEvent=a;l[a]=f;n.addEventListener(s,f,e)}}function hu(n,t,i,r,u){const f=he(t[i],r,u);f&&(n.removeEventListener(i,f,Boolean(u)),delete t[i][f.uidEvent])}function wl(n,t,i,r){const u=t[i]||{};Object.keys(u).forEach(f=>{if(f.includes(r)){const r=u[f];hu(n,t,i,r.originalHandler,r.delegationSelector)}})}function ae(n){return n=n.replace(cl,""),al[n]||n}function pe(n){return n==="true"?!0:n==="false"?!1:n===Number(n).toString()?Number(n):n===""||n==="null"?null:n}function cu(n){return n.replace(/[A-Z]/g,n=>`-${n.toLowerCase()}`)}function w(n){return n?(n.nodeName||"").toLowerCase():null}function y(n){if(n==null)return window;if(n.toString()!=="[object Window]"){var t=n.ownerDocument;return t?t.defaultView||window:window}return n}function yi(n){var t=y(n).Element;return n instanceof t||n instanceof Element}function c(n){var t=y(n).HTMLElement;return n instanceof t||n instanceof HTMLElement}function wo(n){if(typeof ShadowRoot=="undefined")return!1;var t=y(n).ShadowRoot;return n instanceof t||n instanceof ShadowRoot}function oy(n){var t=n.state;Object.keys(t.elements).forEach(function(n){var u=t.styles[n]||{},r=t.attributes[n]||{},i=t.elements[n];c(i)&&w(i)&&(Object.assign(i.style,u),Object.keys(r).forEach(function(n){var t=r[n];t===!1?i.removeAttribute(n):i.setAttribute(n,t===!0?"":t)}))})}function sy(n){var t=n.state,i={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,i.popper),t.styles=i,t.elements.arrow&&Object.assign(t.elements.arrow.style,i.arrow),function(){Object.keys(t.elements).forEach(function(n){var r=t.elements[n],u=t.attributes[n]||{},f=Object.keys(t.styles.hasOwnProperty(n)?t.styles[n]:i[n]),e=f.reduce(function(n,t){return n[t]="",n},{});c(r)&&w(r)&&(Object.assign(r.style,e),Object.keys(u).forEach(function(n){r.removeAttribute(n)}))})}}function b(n){return n.split("-")[0]}function ri(n){var t=n.getBoundingClientRect(),i=1,r=1;return{width:t.width/i,height:t.height/r,top:t.top/r,right:t.right/i,bottom:t.bottom/r,left:t.left/i,x:t.left/i,y:t.top/r}}function bu(n){var t=ri(n),i=n.offsetWidth,r=n.offsetHeight;return Math.abs(t.width-i)<=1&&(i=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:n.offsetLeft,y:n.offsetTop,width:i,height:r}}function bo(n,t){var r=t.getRootNode&&t.getRootNode(),i;if(n.contains(t))return!0;if(r&&wo(r)){i=t;do{if(i&&n.isSameNode(i))return!0;i=i.parentNode||i.host}while(i)}return!1}function nt(n){return y(n).getComputedStyle(n)}function hy(n){return["table","td","th"].indexOf(w(n))>=0}function ut(n){return((yi(n)?n.ownerDocument:n.document)||window.document).documentElement}function ar(n){return w(n)==="html"?n:n.assignedSlot||n.parentNode||(wo(n)?n.host:null)||ut(n)}function ko(n){return!c(n)||nt(n).position==="fixed"?null:n.offsetParent}function cy(n){var r=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,f=navigator.userAgent.indexOf("Trident")!==-1,u,i,t;if(f&&c(n)&&(u=nt(n),u.position==="fixed"))return null;for(i=ar(n);c(i)&&["html","body"].indexOf(w(i))<0;){if(t=nt(i),t.transform!=="none"||t.perspective!=="none"||t.contain==="paint"||["transform","perspective"].indexOf(t.willChange)!==-1||r&&t.willChange==="filter"||r&&t.filter&&t.filter!=="none")return i;i=i.parentNode}return null}function pi(n){for(var i=y(n),t=ko(n);t&&hy(t)&&nt(t).position==="static";)t=ko(t);return t&&(w(t)==="html"||w(t)==="body"&&nt(t).position==="static")?i:t||cy(n)||i}function ku(n){return["top","bottom"].indexOf(n)>=0?"x":"y"}function yr(n,t,i){return ft(n,wi(t,i))}function go(){return{top:0,right:0,bottom:0,left:0}}function ns(n){return Object.assign({},go(),n)}function ts(n,t){return t.reduce(function(t,i){return t[i]=n,t},{})}function ly(n){var r,t=n.state,d=n.name,g=n.options,h=t.elements.arrow,c=t.modifiersData.popperOffsets,a=b(t.placement),i=ku(a),nt=[f,s].indexOf(a)>=0,e=nt?"height":"width";if(h&&c){var v=is(g.padding,t),y=bu(h),tt=i==="y"?u:f,it=i==="y"?o:s,rt=t.rects.reference[e]+t.rects.reference[i]-c[i]-t.rects.popper[e],ut=c[i]-t.rects.reference[i],l=pi(h),p=l?i==="y"?l.clientHeight||0:l.clientWidth||0:0,ft=rt/2-ut/2,et=v[tt],ot=p-y[e]-v[it],w=p/2-y[e]/2+ft,k=yr(et,w,ot),st=i;t.modifiersData[d]=(r={},r[st]=k,r.centerOffset=k-w,r)}}function ay(n){var i=n.state,u=n.options,r=u.element,t=r===void 0?"[data-popper-arrow]":r;t!=null&&(typeof t!="string"||(t=i.elements.popper.querySelector(t),t))&&bo(i.elements.popper,t)&&(i.elements.arrow=t)}function ui(n){return n.split("-")[1]}function vy(n){var i=n.x,r=n.y,u=window,t=u.devicePixelRatio||1;return{x:vr(vr(i*t)/t)||0,y:vr(vr(r*t)/t)||0}}function fs(n){var r,a=n.popper,d=n.popperRect,i=n.placement,g=n.variation,e=n.offsets,tt=n.position,v=n.gpuAcceleration,it=n.adaptive,p=n.roundOffsets,rt=p===!0?vy(e):typeof p=="function"?p(e):e,ft=rt.x,h=ft===void 0?0:ft,et=rt.y,c=et===void 0?0:et,ot=e.hasOwnProperty("x"),st=e.hasOwnProperty("y"),w=f,b=u,lt=window,k,l;if(it){var t=pi(a),ht="clientHeight",ct="clientWidth";t===y(a)&&(t=ut(a),nt(t).position!=="static"&&tt==="absolute"&&(ht="scrollHeight",ct="scrollWidth"));t=t;(i===u||(i===f||i===s)&&g===ti)&&(b=o,c-=t[ht]-d.height,c*=v?1:-1);(i===f||(i===u||i===o)&&g===ti)&&(w=s,h-=t[ct]-d.width,h*=v?1:-1)}return(k=Object.assign({position:tt},it&&us),v)?Object.assign({},k,(l={},l[b]=st?"0":"",l[w]=ot?"0":"",l.transform=(lt.devicePixelRatio||1)<=1?"translate("+h+"px, "+c+"px)":"translate3d("+h+"px, "+c+"px, 0)",l)):Object.assign({},k,(r={},r[b]=st?c+"px":"",r[w]=ot?h+"px":"",r.transform="",r))}function yy(n){var t=n.state,i=n.options,r=i.gpuAcceleration,s=r===void 0?!0:r,u=i.adaptive,h=u===void 0?!0:u,f=i.roundOffsets,e=f===void 0?!0:f,o={placement:b(t.placement),variation:ui(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:s};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,fs(Object.assign({},o,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:h,roundOffsets:e}))));t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,fs(Object.assign({},o,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:e}))));t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}function py(n){var i=n.state,t=n.instance,r=n.options,u=r.scroll,f=u===void 0?!0:u,e=r.resize,o=e===void 0?!0:e,s=y(i.elements.popper),h=[].concat(i.scrollParents.reference,i.scrollParents.popper);return f&&h.forEach(function(n){n.addEventListener("scroll",t.update,bi)}),o&&s.addEventListener("resize",t.update,bi),function(){f&&h.forEach(function(n){n.removeEventListener("scroll",t.update,bi)});o&&s.removeEventListener("resize",t.update,bi)}}function pr(n){return n.replace(/left|right|bottom|top/g,function(n){return es[n]})}function ss(n){return n.replace(/start|end/g,function(n){return os[n]})}function nf(n){var t=y(n),i=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:i,scrollTop:r}}function tf(n){return ri(ut(n)).left+nf(n).scrollLeft}function wy(n){var o=y(n),i=ut(n),t=o.visualViewport,r=i.clientWidth,u=i.clientHeight,f=0,e=0;return t&&(r=t.width,u=t.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(f=t.offsetLeft,e=t.offsetTop)),{width:r,height:u,x:f+tf(n),y:e}}function by(n){var r,i=ut(n),u=nf(n),t=(r=n.ownerDocument)==null?void 0:r.body,f=ft(i.scrollWidth,i.clientWidth,t?t.scrollWidth:0,t?t.clientWidth:0),o=ft(i.scrollHeight,i.clientHeight,t?t.scrollHeight:0,t?t.clientHeight:0),e=-u.scrollLeft+tf(n),s=-u.scrollTop;return nt(t||i).direction==="rtl"&&(e+=ft(i.clientWidth,t?t.clientWidth:0)-f),{width:f,height:o,x:e,y:s}}function rf(n){var t=nt(n),i=t.overflow,r=t.overflowX,u=t.overflowY;return/auto|scroll|overlay|hidden/.test(i+u+r)}function hs(n){return["html","body","#document"].indexOf(w(n))>=0?n.ownerDocument.body:c(n)&&rf(n)?n:hs(ar(n))}function ki(n,t){var r;t===void 0&&(t=[]);var i=hs(n),u=i===((r=n.ownerDocument)==null?void 0:r.body),f=y(i),e=u?[f].concat(f.visualViewport||[],rf(i)?i:[]):i,o=t.concat(e);return u?o:o.concat(ki(ar(e)))}function uf(n){return Object.assign({},n,{left:n.x,top:n.y,right:n.x+n.width,bottom:n.y+n.height})}function ky(n){var t=ri(n);return t.top=t.top+n.clientTop,t.left=t.left+n.clientLeft,t.bottom=t.top+n.clientHeight,t.right=t.left+n.clientWidth,t.width=n.clientWidth,t.height=n.clientHeight,t.x=t.left,t.y=t.top,t}function cs(n,t){return t===vu?uf(wy(n)):c(t)?ky(t):uf(by(ut(n)))}function dy(n){var i=ki(ar(n)),r=["absolute","fixed"].indexOf(nt(n).position)>=0,t=r&&c(n)?pi(n):n;return yi(t)?i.filter(function(n){return yi(n)&&bo(n,t)&&w(n)!=="body"}):[]}function gy(n,t,i){var f=t==="clippingParents"?dy(n):[].concat(t),u=[].concat(f,[i]),e=u[0],r=u.reduce(function(t,i){var r=cs(n,i);return t.top=ft(r.top,t.top),t.right=wi(r.right,t.right),t.bottom=wi(r.bottom,t.bottom),t.left=ft(r.left,t.left),t},cs(n,e));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}function ls(n){var t=n.reference,e=n.element,c=n.placement,l=c?b(c):null,y=c?ui(c):null,a=t.x+t.width/2-e.width/2,v=t.y+t.height/2-e.height/2,i,r,h;switch(l){case u:i={x:a,y:t.y-e.height};break;case o:i={x:a,y:t.y+t.height};break;case s:i={x:t.x+t.width,y:v};break;case f:i={x:t.x-e.width,y:v};break;default:i={x:t.x,y:t.y}}if(r=l?ku(l):null,r!=null){h=r==="y"?"height":"width";switch(y){case yt:i[r]=i[r]-(t[h]/2-e[h]/2);break;case ti:i[r]=i[r]+(t[h]/2-e[h]/2)}}return i}function fi(n,t){var it;t===void 0&&(t={});var i=t,v=i.placement,y=v===void 0?n.placement:v,p=i.boundary,rt=p===void 0?uo:p,w=i.rootBoundary,ft=w===void 0?vu:w,b=i.elementContext,r=b===void 0?ii:b,k=i.altBoundary,et=k===void 0?!1:k,d=i.padding,c=d===void 0?0:d,f=ns(typeof c!="number"?c:ts(c,ni)),ot=r===ii?fo:ii,g=n.rects.popper,l=n.elements[et?ot:r],e=gy(yi(l)?l:l.contextElement||ut(n.elements.popper),rt,ft),nt=ri(n.elements.reference),st=ls({reference:nt,element:g,strategy:"absolute",placement:y}),ht=uf(Object.assign({},g,st)),h=r===ii?ht:nt,a={top:e.top-h.top+f.top,bottom:h.bottom-e.bottom+f.bottom,left:e.left-h.left+f.left,right:h.right-e.right+f.right},tt=n.modifiersData.offset;return r===ii&&tt&&(it=tt[y],Object.keys(a).forEach(function(n){var t=[s,o].indexOf(n)>=0?1:-1,i=[u,o].indexOf(n)>=0?"y":"x";a[n]+=it[i]*t})),a}function np(n,t){var r;t===void 0&&(t={});var i=t,s=i.placement,h=i.boundary,c=i.rootBoundary,l=i.padding,a=i.flipVariations,f=i.allowedAutoPlacements,v=f===void 0?pu:f,e=ui(s),o=e?a?yu:yu.filter(function(n){return ui(n)===e}):ni,u=o.filter(function(n){return v.indexOf(n)>=0});return u.length===0&&(u=o),r=u.reduce(function(t,i){return t[i]=fi(n,{placement:i,boundary:h,rootBoundary:c,padding:l})[b(i)],t},{}),Object.keys(r).sort(function(n,t){return r[n]-r[t]})}function tp(n){if(b(n)===lr)return[];var t=pr(n);return[ss(n),t,ss(t)]}function ip(n){var t=n.state,i=n.options,k=n.name,a,ct,h,lt,at,y,vt;if(!t.modifiersData[k]._skip){var d=i.mainAxis,pt=d===void 0?!0:d,g=i.altAxis,wt=g===void 0?!0:g,bt=i.fallbackPlacements,nt=i.padding,tt=i.boundary,it=i.rootBoundary,kt=i.altBoundary,rt=i.flipVariations,p=rt===void 0?!0:rt,dt=i.allowedAutoPlacements,r=t.options.placement,gt=b(r),ni=gt===r,ti=bt||(ni||!p?[pr(r)]:tp(r)),c=[r].concat(ti).reduce(function(n,i){return n.concat(b(i)===lr?np(t,{placement:i,boundary:tt,rootBoundary:it,padding:nt,flipVariations:p,allowedAutoPlacements:dt}):i)},[]),ii=t.rects.reference,ri=t.rects.popper,ut=new Map,ft=!0,l=c[0];for(a=0;a=0,ht=st?"width":"height",w=fi(t,{placement:e,boundary:tt,rootBoundary:it,altBoundary:kt,padding:nt}),v=st?ot?s:f:ot?o:u;if(ii[ht]>ri[ht]&&(v=pr(v)),ct=pr(v),h=[],pt&&h.push(w[et]<=0),wt&&h.push(w[v]<=0,w[ct]<=0),h.every(function(n){return n})){l=e;ft=!1;break}ut.set(e,h)}if(ft)for(lt=p?3:1,at=function(n){var t=c.find(function(t){var i=ut.get(t);if(i)return i.slice(0,n).every(function(n){return n})});if(t)return l=t,"break"},y=lt;y>0;y--)if(vt=at(y),vt==="break")break;t.placement!==l&&(t.modifiersData[k]._skip=!0,t.placement=l,t.reset=!0)}}function vs(n,t,i){return i===void 0&&(i={x:0,y:0}),{top:n.top-t.height-i.y,right:n.right-t.width+i.x,bottom:n.bottom-t.height+i.y,left:n.left-t.width-i.x}}function ys(n){return[u,s,o,f].some(function(t){return n[t]>=0})}function rp(n){var t=n.state,e=n.name,o=t.rects.reference,s=t.rects.popper,h=t.modifiersData.preventOverflow,c=fi(t,{elementContext:"reference"}),l=fi(t,{altBoundary:!0}),i=vs(c,o),r=vs(l,s,h),u=ys(i),f=ys(r);t.modifiersData[e]={referenceClippingOffsets:i,popperEscapeOffsets:r,isReferenceHidden:u,hasPopperEscaped:f};t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":f})}function up(n,t,i){var o=b(n),c=[f,u].indexOf(o)>=0?-1:1,h=typeof i=="function"?i(Object.assign({},t,{placement:n})):i,r=h[0],e=h[1];return r=r||0,e=(e||0)*c,[f,s].indexOf(o)>=0?{x:e,y:r}:{x:r,y:e}}function fp(n){var t=n.state,f=n.options,e=n.name,i=f.offset,o=i===void 0?[0,0]:i,r=pu.reduce(function(n,i){return n[i]=up(i,t.rects,o),n},{}),u=r[t.placement],s=u.x,h=u.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=s,t.modifiersData.popperOffsets.y+=h);t.modifiersData[e]=r}function ep(n){var t=n.state,i=n.name;t.modifiersData[i]=ls({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}function op(n){return n==="x"?"y":"x"}function sp(n){var t=n.state,h=n.options,hi=n.name,rt=h.mainAxis,ut=rt===void 0?!0:rt,et=h.altAxis,ot=et===void 0?!1:et,ci=h.boundary,li=h.rootBoundary,ai=h.altBoundary,vi=h.padding,st=h.tether,c=st===void 0?!0:st,ht=h.tetherOffset,w=ht===void 0?0:ht,a=fi(t,{boundary:ci,rootBoundary:li,padding:vi,altBoundary:ai}),yi=b(t.placement),k=ui(t.placement),ct=!k,i=ku(yi),d=op(i),r=t.modifiersData.popperOffsets,l=t.rects.reference,g=t.rects.popper,v=typeof w=="function"?w(Object.assign({},t.rects,{placement:t.placement})):w,nt={x:0,y:0},it;if(r){if(ut||ot){var lt=i==="y"?u:f,at=i==="y"?o:s,e=i==="y"?"height":"width",vt=r[i],pt=r[i]+a[lt],wt=r[i]-a[at],bt=c?-g[e]/2:0,bi=k===yt?l[e]:g[e],ki=k===yt?-g[e]:-l[e],kt=t.elements.arrow,di=c&&kt?bu(kt):{width:0,height:0},dt=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:go(),gt=dt[lt],ni=dt[at],y=yr(0,l[e],di[e]),gi=ct?l[e]/2-bt-y-gt-v:bi-y-gt-v,nr=ct?-l[e]/2+bt+y+ni+v:ki+y+ni+v,tt=t.elements.arrow&&pi(t.elements.arrow),tr=tt?i==="y"?tt.clientTop||0:tt.clientLeft||0:0,ti=t.modifiersData.offset?t.modifiersData.offset[t.placement][i]:0,ii=r[i]+gi-ti-tr,ri=r[i]+nr-ti;if(ut&&(it=yr(c?wi(pt,ii):pt,vt,c?ft(wt,ri):wt),r[i]=it,nt[i]=it-vt),ot){var ir=i==="x"?u:f,rr=i==="x"?o:s,p=r[d],ei=p+a[ir],oi=p-a[rr],si=yr(c?wi(ei,ii):ei,p,c?ft(oi,ri):oi);r[d]=si;nt[d]=si-p}}t.modifiersData[hi]=nt}}function hp(n){return{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}}function cp(n){return n!==y(n)&&c(n)?hp(n):nf(n)}function lp(n){var t=n.getBoundingClientRect(),i=t.width/n.offsetWidth||1,r=t.height/n.offsetHeight||1;return i!==1||r!==1}function ap(n,t,i){var f;i===void 0&&(i=!1);f=c(t);c(t)&&lp(t);var e=ut(t),u=ri(n),o={scrollLeft:0,scrollTop:0},r={x:0,y:0};return!f&&(f||i)||((w(t)!=="body"||rf(e))&&(o=cp(t)),c(t)?(r=ri(t),r.x+=t.clientLeft,r.y+=t.clientTop):e&&(r.x=tf(e))),{x:u.left+o.scrollLeft-r.x,y:u.top+o.scrollTop-r.y,width:u.width,height:u.height}}function vp(n){function u(n){t.add(n.name);var f=[].concat(n.requires||[],n.requiresIfExists||[]);f.forEach(function(n){if(!t.has(n)){var r=i.get(n);r&&u(r)}});r.push(n)}var i=new Map,t=new Set,r=[];return n.forEach(function(n){i.set(n.name,n)}),n.forEach(function(n){t.has(n.name)||u(n)}),r}function yp(n){var t=vp(n);return po.reduce(function(n,i){return n.concat(t.filter(function(n){return n.phase===i}))},[])}function pp(n){var t;return function(){return t||(t=new Promise(function(i){Promise.resolve().then(function(){t=undefined;i(n())})})),t}}function wp(n){var t=n.reduce(function(n,t){var i=n[t.name];return n[t.name]=i?Object.assign({},i,t,{options:Object.assign({},i.options,t.options),data:Object.assign({},i.data,t.data)}):t,n},{});return Object.keys(t).map(function(n){return t[n]})}function ks(){for(var t=arguments.length,i=new Array(t),n=0;n{lk(n,e)||i.removeAttribute(n.nodeName)})}return r.body.innerHTML}var is,us,bi,es,os,ef;const rl=1e6,ul=1e3,fu="transitionend",fl=n=>n===null||n===undefined?`${n}`:{}.toString.call(n).match(/\s([a-z]+)/i)[1].toLowerCase(),el=n=>{do n+=Math.floor(Math.random()*rl);while(document.getElementById(n));return n},gf=n=>{let t=n.getAttribute("data-bs-target");if(!t||t==="#"){let i=n.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`);t=i&&i!=="#"?i.trim():null}return t},eu=n=>{const t=gf(n);return t?document.querySelector(t)?t:null:null},tt=n=>{const t=gf(n);return t?document.querySelector(t):null},ol=n=>{if(!n)return 0;let{transitionDuration:t,transitionDelay:i}=window.getComputedStyle(n);const r=Number.parseFloat(t),u=Number.parseFloat(i);return!r&&!u?0:(t=t.split(",")[0],i=i.split(",")[0],(Number.parseFloat(t)+Number.parseFloat(i))*ul)},ne=n=>{n.dispatchEvent(new Event(fu))},ot=n=>!n||typeof n!="object"?!1:(typeof n.jquery!="undefined"&&(n=n[0]),typeof n.nodeType!="undefined"),it=n=>ot(n)?n.jquery?n[0]:n:typeof n=="string"&&n.length>0?document.querySelector(n):null,p=(n,t,i)=>{Object.keys(i).forEach(r=>{const f=i[r],u=t[r],e=u&&ot(u)?"element":fl(u);if(!new RegExp(f).test(e))throw new TypeError(`${n.toUpperCase()}: Option "${r}" provided type "${e}" but expected type "${f}".`);})},ci=n=>!ot(n)||n.getClientRects().length===0?!1:getComputedStyle(n).getPropertyValue("visibility")==="visible",st=n=>!n||n.nodeType!==Node.ELEMENT_NODE?!0:n.classList.contains("disabled")?!0:typeof n.disabled!="undefined"?n.disabled:n.hasAttribute("disabled")&&n.getAttribute("disabled")!=="false",te=n=>{if(!document.documentElement.attachShadow)return null;if(typeof n.getRootNode=="function"){const t=n.getRootNode();return t instanceof ShadowRoot?t:null}return n instanceof ShadowRoot?n:n.parentNode?te(n.parentNode):null},fr=()=>{},kt=n=>{n.offsetHeight},ie=()=>{const{jQuery:n}=window;return n&&!document.body.hasAttribute("data-bs-no-jquery")?n:null},ou=[],sl=n=>{document.readyState==="loading"?(ou.length||document.addEventListener("DOMContentLoaded",()=>{ou.forEach(n=>n())}),ou.push(n)):n()},r=()=>document.documentElement.dir==="rtl",h=n=>{sl(()=>{const t=ie();if(t){const i=n.NAME,r=t.fn[i];t.fn[i]=n.jQueryInterface;t.fn[i].Constructor=n;t.fn[i].noConflict=()=>(t.fn[i]=r,n.jQueryInterface)}})},ht=n=>{typeof n=="function"&&n()},re=(n,t,i=true)=>{if(!i){ht(n);return}const f=ol(t)+5;let r=!1;const u=({target:i})=>{i===t&&(r=!0,t.removeEventListener(fu,u),ht(n))};t.addEventListener(fu,u);setTimeout(()=>{r||ne(t)},f)},ue=(n,t,i,r)=>{let u=n.indexOf(t);if(u===-1)return n[!i&&r?n.length-1:0];const f=n.length;return u+=i?1:-1,r&&(u=(u+f)%f),n[Math.max(0,Math.min(u,f-1))]},hl=/[^.]*(?=\..*)\.|.*/,cl=/\..*/,ll=/::\d+$/,su={};let fe=1;const al={mouseenter:"mouseover",mouseleave:"mouseout"},vl=/^(mouseenter|mouseleave)/i,ee=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);const n={on(n,t,i,r){le(n,t,i,r,!1)},one(n,t,i,r){le(n,t,i,r,!0)},off(n,t,i,r){if(typeof t=="string"&&n){const[s,e,f]=ce(t,i,r),h=f!==t,u=se(n),c=t.startsWith(".");if(typeof e!="undefined"){if(!u||!u[f])return;hu(n,u,f,e,s?i:null);return}c&&Object.keys(u).forEach(i=>{wl(n,u,i,t.slice(1))});const o=u[f]||{};Object.keys(o).forEach(i=>{const r=i.replace(ll,"");if(!h||t.includes(r)){const t=o[i];hu(n,u,f,t.originalHandler,t.delegationSelector)}})}},trigger(n,t,i){if(typeof t!="string"||!n)return null;const f=ie(),e=ae(t),c=t!==e,l=ee.has(e);let u,o=!0,s=!0,h=!1,r=null;return c&&f&&(u=f.Event(t,i),f(n).trigger(u),o=!u.isPropagationStopped(),s=!u.isImmediatePropagationStopped(),h=u.isDefaultPrevented()),l?(r=document.createEvent("HTMLEvents"),r.initEvent(e,o,!0)):r=new CustomEvent(t,{bubbles:o,cancelable:!0}),typeof i!="undefined"&&Object.keys(i).forEach(n=>{Object.defineProperty(r,n,{get(){return i[n]}})}),h&&r.preventDefault(),s&&n.dispatchEvent(r),r.defaultPrevented&&typeof u!="undefined"&&u.preventDefault(),r}},rt=new Map,li={set(n,t,i){rt.has(n)||rt.set(n,new Map);const r=rt.get(n);if(!r.has(t)&&r.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(r.keys())[0]}.`);return}r.set(t,i)},get(n,t){return rt.has(n)?rt.get(n).get(t)||null:null},remove(n,t){if(rt.has(n)){const i=rt.get(n);i.delete(t);i.size===0&&rt.delete(n)}}},bl="5.1.3";class v{constructor(n){(n=it(n),n)&&(this._element=n,li.set(this._element,this.constructor.DATA_KEY,this))}dispose(){li.remove(this._element,this.constructor.DATA_KEY);n.off(this._element,this.constructor.EVENT_KEY);Object.getOwnPropertyNames(this).forEach(n=>{this[n]=null})}_queueCallback(n,t,i=true){re(n,t,i)}static getInstance(n){return li.get(it(n),this.DATA_KEY)}static getOrCreateInstance(n,t={}){return this.getInstance(n)||new this(n,typeof t=="object"?t:null)}static get VERSION(){return bl}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!');}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}}const er=(t,i="hide")=>{const u=`click.dismiss${t.EVENT_KEY}`,r=t.NAME;n.on(document,u,`[data-bs-dismiss="${r}"]`,function(n){if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),!st(this)){const u=tt(this)||this.closest(`.${r}`),f=t.getOrCreateInstance(u);f[i]()}})},kl="alert",ve=`.${"bs.alert"}`,dl=`close${ve}`,gl=`closed${ve}`,na="fade",ta="show";class or extends v{static get NAME(){return kl}close(){const t=n.trigger(this._element,dl);if(!t.defaultPrevented){this._element.classList.remove(ta);const i=this._element.classList.contains(na);this._queueCallback(()=>this._destroyElement(),this._element,i)}}_destroyElement(){this._element.remove();n.trigger(this._element,gl);this.dispose()}static jQueryInterface(n){return this.each(function(){const t=or.getOrCreateInstance(this);if(typeof n=="string"){if(t[n]===undefined||n.startsWith("_")||n==="constructor")throw new TypeError(`No method named "${n}"`);t[n](this)}})}}er(or,"close");h(or);const ia="button",ra=`.${"bs.button"}`,ua="active",ye='[data-bs-toggle="button"]',fa=`click${ra}${".data-api"}`;class sr extends v{static get NAME(){return ia}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(ua))}static jQueryInterface(n){return this.each(function(){const t=sr.getOrCreateInstance(this);n==="toggle"&&t[n]()})}}n.on(document,fa,ye,n=>{n.preventDefault();const t=n.target.closest(ye),i=sr.getOrCreateInstance(t);i.toggle()});h(sr);const i={setDataAttribute(n,t,i){n.setAttribute(`data-bs-${cu(t)}`,i)},removeDataAttribute(n,t){n.removeAttribute(`data-bs-${cu(t)}`)},getDataAttributes(n){if(!n)return{};const t={};return Object.keys(n.dataset).filter(n=>n.startsWith("bs")).forEach(i=>{let r=i.replace(/^bs/,"");r=r.charAt(0).toLowerCase()+r.slice(1,r.length);t[r]=pe(n.dataset[i])}),t},getDataAttribute(n,t){return pe(n.getAttribute(`data-bs-${cu(t)}`))},offset(n){const t=n.getBoundingClientRect();return{top:t.top+window.pageYOffset,left:t.left+window.pageXOffset}},position(n){return{top:n.offsetTop,left:n.offsetLeft}}},ea=3,t={find(n,t=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(t,n))},findOne(n,t=document.documentElement){return Element.prototype.querySelector.call(t,n)},children(n,t){return[].concat(...n.children).filter(n=>n.matches(t))},parents(n,t){const r=[];let i=n.parentNode;while(i&&i.nodeType===Node.ELEMENT_NODE&&i.nodeType!==ea)i.matches(t)&&r.push(i),i=i.parentNode;return r},prev(n,t){let i=n.previousElementSibling;while(i){if(i.matches(t))return[i];i=i.previousElementSibling}return[]},next(n,t){let i=n.nextElementSibling;while(i){if(i.matches(t))return[i];i=i.nextElementSibling}return[]},focusableChildren(n){const t=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(n=>`${n}:not([tabindex^="-"])`).join(", ");return this.find(t,n).filter(n=>!st(n)&&ci(n))}},we="carousel",e=`.${"bs.carousel"}`,be=".data-api",oa=500,sa=40,ke={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},ha={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},ct="next",lt="prev",at="left",ai="right",ca={["ArrowLeft"]:ai,["ArrowRight"]:at},la=`slide${e}`,de=`slid${e}`,aa=`keydown${e}`,va=`mouseenter${e}`,ya=`mouseleave${e}`,pa=`touchstart${e}`,wa=`touchmove${e}`,ba=`touchend${e}`,ka=`pointerdown${e}`,da=`pointerup${e}`,ga=`dragstart${e}`,nv=`load${e}${be}`,tv=`click${e}${be}`,iv="carousel",vt="active",rv="slide",uv="carousel-item-end",fv="carousel-item-start",ev="carousel-item-next",ov="carousel-item-prev",sv="pointer-event",hv=".active",hr=".active.carousel-item",cv=".carousel-item",lv=".carousel-item img",av=".carousel-item-next, .carousel-item-prev",vv=".carousel-indicators",yv="[data-bs-target]",pv='[data-bs-ride="carousel"]',wv="touch",bv="pen";class g extends v{constructor(n,i){super(n);this._items=null;this._interval=null;this._activeElement=null;this._isPaused=!1;this._isSliding=!1;this.touchTimeout=null;this.touchStartX=0;this.touchDeltaX=0;this._config=this._getConfig(i);this._indicatorsElement=t.findOne(vv,this._element);this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0;this._pointerEvent=Boolean(window.PointerEvent);this._addEventListeners()}static get Default(){return ke}static get NAME(){return we}next(){this._slide(ct)}nextWhenVisible(){!document.hidden&&ci(this._element)&&this.next()}prev(){this._slide(lt)}pause(n){n||(this._isPaused=!0);t.findOne(av,this._element)&&(ne(this._element),this.cycle(!0));clearInterval(this._interval);this._interval=null}cycle(n){n||(this._isPaused=!1);this._interval&&(clearInterval(this._interval),this._interval=null);this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(i){this._activeElement=t.findOne(hr,this._element);const r=this._getItemIndex(this._activeElement);if(!(i>this._items.length-1)&&!(i<0)){if(this._isSliding){n.one(this._element,de,()=>this.to(i));return}if(r===i){this.pause();this.cycle();return}const u=i>r?ct:lt;this._slide(u,this._items[i])}}_getConfig(n){return n={...ke,...i.getDataAttributes(this._element),...(typeof n=="object"?n:{})},p(we,n,ha),n}_handleSwipe(){const n=Math.abs(this.touchDeltaX);if(!(n<=sa)){const t=n/this.touchDeltaX;(this.touchDeltaX=0,t)&&this._slide(t>0?ai:at)}}_addEventListeners(){if(this._config.keyboard)n.on(this._element,aa,n=>this._keydown(n));if(this._config.pause==="hover"){n.on(this._element,va,n=>this.pause(n));n.on(this._element,ya,n=>this.cycle(n))}this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const i=n=>this._pointerEvent&&(n.pointerType===bv||n.pointerType===wv),r=n=>{i(n)?this.touchStartX=n.clientX:this._pointerEvent||(this.touchStartX=n.touches[0].clientX)},f=n=>{this.touchDeltaX=n.touches&&n.touches.length>1?0:n.touches[0].clientX-this.touchStartX},u=n=>{i(n)&&(this.touchDeltaX=n.clientX-this.touchStartX),this._handleSwipe(),this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(n=>this.cycle(n),oa+this._config.interval))};if(t.find(lv,this._element).forEach(t=>{n.on(t,ga,n=>n.preventDefault())}),this._pointerEvent){n.on(this._element,ka,n=>r(n));n.on(this._element,da,n=>u(n));this._element.classList.add(sv)}else{n.on(this._element,pa,n=>r(n));n.on(this._element,wa,n=>f(n));n.on(this._element,ba,n=>u(n))}}_keydown(n){if(!/input|textarea/i.test(n.target.tagName)){const t=ca[n.key];t&&(n.preventDefault(),this._slide(t))}}_getItemIndex(n){return this._items=n&&n.parentNode?t.find(cv,n.parentNode):[],this._items.indexOf(n)}_getItemByOrder(n,t){const i=n===ct;return ue(this._items,t,i,this._config.wrap)}_triggerSlideEvent(i,r){const u=this._getItemIndex(i),f=this._getItemIndex(t.findOne(hr,this._element));return n.trigger(this._element,la,{relatedTarget:i,direction:r,from:f,to:u})}_setActiveIndicatorElement(n){if(this._indicatorsElement){const r=t.findOne(hv,this._indicatorsElement);r.classList.remove(vt);r.removeAttribute("aria-current");const i=t.find(yv,this._indicatorsElement);for(let t=0;t{n.trigger(this._element,de,{relatedTarget:u,direction:l,from:v,to:y})};if(this._element.classList.contains(rv)){u.classList.add(s);kt(u);f.classList.add(e);u.classList.add(e);const n=()=>{u.classList.remove(e,s),u.classList.add(vt),f.classList.remove(vt,s,e),this._isSliding=!1,setTimeout(a,0)};this._queueCallback(n,f,!0)}else f.classList.remove(vt),u.classList.add(vt),this._isSliding=!1,a();h&&this.cycle()}}}_directionToOrder(n){return[ai,at].includes(n)?r()?n===at?lt:ct:n===at?ct:lt:n}_orderToDirection(n){return[ct,lt].includes(n)?r()?n===lt?at:ai:n===lt?ai:at:n}static carouselInterface(n,t){const i=g.getOrCreateInstance(n,t);let{_config:r}=i;typeof t=="object"&&(r={...r,...t});const u=typeof t=="string"?t:r.slide;if(typeof t=="number")i.to(t);else if(typeof u=="string"){if(typeof i[u]=="undefined")throw new TypeError(`No method named "${u}"`);i[u]()}else r.interval&&r.ride&&(i.pause(),i.cycle())}static jQueryInterface(n){return this.each(function(){g.carouselInterface(this,n)})}static dataApiClickHandler(n){const t=tt(this);if(t&&t.classList.contains(iv)){const u={...i.getDataAttributes(t),...i.getDataAttributes(this)},r=this.getAttribute("data-bs-slide-to");r&&(u.interval=!1);g.carouselInterface(t,u);r&&g.getInstance(t).to(r);n.preventDefault()}}}n.on(document,tv,"[data-bs-slide], [data-bs-slide-to]",g.dataApiClickHandler);n.on(window,nv,()=>{const n=t.find(pv);for(let t=0,i=n.length;tn===this._element);i!==null&&f.length&&(this._selector=i,this._triggerArray.push(u))}this._initializeChildren();this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown());this._config.toggle&&this.toggle()}static get Default(){return to}static get NAME(){return ge}toggle(){this._isShown()?this.hide():this.show()}show(){if(!this._isTransitioning&&!this._isShown()){let r=[],u;if(this._config.parent){const n=t.find(ro,this._config.parent);r=t.find(ey,this._config.parent).filter(t=>!n.includes(t))}const f=t.findOne(this._selector);if(r.length){const n=r.find(n=>f!==n);if(u=n?gt.getInstance(n):null,u&&u._isTransitioning)return}const e=n.trigger(this._element,dv);if(!e.defaultPrevented){r.forEach(n=>{f!==n&>.getOrCreateInstance(n,{toggle:!1}).hide(),u||li.set(n,no,null)});const i=this._getDimension();this._element.classList.remove(dt);this._element.classList.add(cr);this._element.style[i]=0;this._addAriaAndCollapsedClass(this._triggerArray,!0);this._isTransitioning=!0;const o=()=>{this._isTransitioning=!1,this._element.classList.remove(cr),this._element.classList.add(dt,lu),this._element.style[i]="",n.trigger(this._element,gv)},s=i[0].toUpperCase()+i.slice(1),h=`scroll${s}`;this._queueCallback(o,this._element,!0);this._element.style[i]=`${this._element[h]}px`}}}hide(){if(!this._isTransitioning&&this._isShown()){const i=n.trigger(this._element,ny);if(!i.defaultPrevented){const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`;kt(this._element);this._element.classList.add(cr);this._element.classList.remove(dt,lu);const r=this._triggerArray.length;for(let n=0;n{this._isTransitioning=!1,this._element.classList.remove(cr),this._element.classList.add(dt),n.trigger(this._element,ty)};this._element.style[t]="";this._queueCallback(u,this._element,!0)}}}_isShown(n=this._element){return n.classList.contains(lu)}_getConfig(n){return n={...to,...i.getDataAttributes(this._element),...n},n.toggle=Boolean(n.toggle),n.parent=it(n.parent),p(ge,n,kv),n}_getDimension(){return this._element.classList.contains(ry)?uy:fy}_initializeChildren(){if(this._config.parent){const n=t.find(ro,this._config.parent);t.find(au,this._config.parent).filter(t=>!n.includes(t)).forEach(n=>{const t=tt(n);t&&this._addAriaAndCollapsedClass([n],this._isShown(t))})}}_addAriaAndCollapsedClass(n,t){n.length&&n.forEach(n=>{t?n.classList.remove(io):n.classList.add(io),n.setAttribute("aria-expanded",t)})}static jQueryInterface(n){return this.each(function(){const t={};typeof n=="string"&&/show|hide/.test(n)&&(t.toggle=!1);const i=gt.getOrCreateInstance(this,t);if(typeof n=="string"){if(typeof i[n]=="undefined")throw new TypeError(`No method named "${n}"`);i[n]()}})}}n.on(document,iy,au,function(n){(n.target.tagName==="A"||n.delegateTarget&&n.delegateTarget.tagName==="A")&&n.preventDefault();const i=eu(this),r=t.find(i);r.forEach(n=>{gt.getOrCreateInstance(n,{toggle:!1}).toggle()})});h(gt);var u="top",o="bottom",s="right",f="left",lr="auto",ni=[u,o,s,f],yt="start",ti="end",uo="clippingParents",vu="viewport",ii="popper",fo="reference",yu=ni.reduce(function(n,t){return n.concat([t+"-"+yt,t+"-"+ti])},[]),pu=[].concat(ni,[lr]).reduce(function(n,t){return n.concat([t,t+"-"+yt,t+"-"+ti])},[]),eo="beforeRead",oo="read",so="afterRead",ho="beforeMain",co="main",lo="afterMain",ao="beforeWrite",vo="write",yo="afterWrite",po=[eo,oo,so,ho,co,lo,ao,vo,yo];const wu={name:"applyStyles",enabled:!0,phase:"write",fn:oy,effect:sy,requires:["computeStyles"]};var ft=Math.max,wi=Math.min,vr=Math.round;is=function(n,t){return n=typeof n=="function"?n(Object.assign({},t.rects,{placement:t.placement})):n,ns(typeof n!="number"?n:ts(n,ni))};const rs={name:"arrow",enabled:!0,phase:"main",fn:ly,effect:ay,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};us={top:"auto",right:"auto",bottom:"auto",left:"auto"};const du={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:yy,data:{}};bi={passive:!0};const gu={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:py,data:{}};es={left:"right",right:"left",bottom:"top",top:"bottom"};os={start:"end",end:"start"};const as={name:"flip",enabled:!0,phase:"main",fn:ip,requiresIfExists:["offset"],data:{_skip:!1}};const ps={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:rp};const ws={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:fp};const ff={name:"popperOffsets",enabled:!0,phase:"read",fn:ep,data:{}};const bs={name:"preventOverflow",enabled:!0,phase:"main",fn:sp,requiresIfExists:["offset"]};ef={placement:"bottom",modifiers:[],strategy:"absolute"};var bp=wr(),kp=[gu,ff,du,wu],dp=wr({defaultModifiers:kp}),gp=[gu,ff,du,wu,ws,as,bs,rs,ps],sf=wr({defaultModifiers:gp});const ds=Object.freeze({__proto__:null,popperGenerator:wr,detectOverflow:fi,createPopperBase:bp,createPopper:sf,createPopperLite:dp,top:u,bottom:o,right:s,left:f,auto:lr,basePlacements:ni,start:yt,end:ti,clippingParents:uo,viewport:vu,popper:ii,reference:fo,variationPlacements:yu,placements:pu,beforeRead:eo,read:oo,afterRead:so,beforeMain:ho,main:co,afterMain:lo,beforeWrite:ao,write:vo,afterWrite:yo,modifierPhases:po,applyStyles:wu,arrow:rs,computeStyles:du,eventListeners:gu,flip:as,hide:ps,offset:ws,popperOffsets:ff,preventOverflow:bs}),hf="dropdown",pt=`.${"bs.dropdown"}`,cf=".data-api",br="Escape",gs="Space",nh="Tab",lf="ArrowUp",kr="ArrowDown",nw=2,tw=new RegExp(`${lf}|${kr}|${br}`),iw=`hide${pt}`,rw=`hidden${pt}`,uw=`show${pt}`,fw=`shown${pt}`,th=`click${pt}${cf}`,ih=`keydown${pt}${cf}`,ew=`keyup${pt}${cf}`,ei="show",ow="dropup",sw="dropend",hw="dropstart",cw="navbar",di='[data-bs-toggle="dropdown"]',af=".dropdown-menu",lw=".navbar-nav",aw=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",vw=r()?"top-end":"top-start",yw=r()?"top-start":"top-end",pw=r()?"bottom-end":"bottom-start",ww=r()?"bottom-start":"bottom-end",bw=r()?"left-start":"right-start",kw=r()?"right-start":"left-start",dw={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},gw={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class l extends v{constructor(n,t){super(n);this._popper=null;this._config=this._getConfig(t);this._menu=this._getMenuElement();this._inNavbar=this._detectNavbar()}static get Default(){return dw}static get DefaultType(){return gw}static get NAME(){return hf}toggle(){return this._isShown()?this.hide():this.show()}show(){if(!st(this._element)&&!this._isShown(this._menu)){const t={relatedTarget:this._element},u=n.trigger(this._element,uw,t);if(!u.defaultPrevented){const r=l.getParentFromElement(this._element);this._inNavbar?i.setDataAttribute(this._menu,"popper","none"):this._createPopper(r);"ontouchstart"in document.documentElement&&!r.closest(lw)&&[].concat(...document.body.children).forEach(t=>n.on(t,"mouseover",fr));this._element.focus();this._element.setAttribute("aria-expanded",!0);this._menu.classList.add(ei);this._element.classList.add(ei);n.trigger(this._element,fw,t)}}}hide(){if(!st(this._element)&&this._isShown(this._menu)){const n={relatedTarget:this._element};this._completeHide(n)}}dispose(){this._popper&&this._popper.destroy();super.dispose()}update(){this._inNavbar=this._detectNavbar();this._popper&&this._popper.update()}_completeHide(t){const r=n.trigger(this._element,iw,t);r.defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>n.off(t,"mouseover",fr)),this._popper&&this._popper.destroy(),this._menu.classList.remove(ei),this._element.classList.remove(ei),this._element.setAttribute("aria-expanded","false"),i.removeDataAttribute(this._menu,"popper"),n.trigger(this._element,rw,t))}_getConfig(n){if(n={...this.constructor.Default,...i.getDataAttributes(this._element),...n},p(hf,n,this.constructor.DefaultType),typeof n.reference=="object"&&!ot(n.reference)&&typeof n.reference.getBoundingClientRect!="function")throw new TypeError(`${hf.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return n}_createPopper(n){if(typeof ds=="undefined")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;this._config.reference==="parent"?t=n:ot(this._config.reference)?t=it(this._config.reference):typeof this._config.reference=="object"&&(t=this._config.reference);const r=this._getPopperConfig(),u=r.modifiers.find(n=>n.name==="applyStyles"&&n.enabled===!1);this._popper=sf(t,this._menu,r);u&&i.setDataAttribute(this._menu,"popper","static")}_isShown(n=this._element){return n.classList.contains(ei)}_getMenuElement(){return t.next(this._element,af)[0]}_getPlacement(){const n=this._element.parentNode;if(n.classList.contains(sw))return bw;if(n.classList.contains(hw))return kw;const t=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return n.classList.contains(ow)?t?yw:vw:t?ww:pw}_detectNavbar(){return this._element.closest(`.${cw}`)!==null}_getOffset(){const{offset:n}=this._config;return typeof n=="string"?n.split(",").map(n=>Number.parseInt(n,10)):typeof n=="function"?t=>n(t,this._element):n}_getPopperConfig(){const n={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return this._config.display==="static"&&(n.modifiers=[{name:"applyStyles",enabled:!1}]),{...n,...(typeof this._config.popperConfig=="function"?this._config.popperConfig(n):this._config.popperConfig)}}_selectMenuItem({key:n,target:i}){const r=t.find(aw,this._menu).filter(ci);r.length&&ue(r,i,n===kr,!r.includes(i)).focus()}static jQueryInterface(n){return this.each(function(){const t=l.getOrCreateInstance(this,n);if(typeof n=="string"){if(typeof t[n]=="undefined")throw new TypeError(`No method named "${n}"`);t[n]()}})}static clearMenus(n){if(!n||n.button!==nw&&(n.type!=="keyup"||n.key===nh)){const i=t.find(di);for(let t=0,r=i.length;tt+n);this._setElementAttributes(rh,"paddingRight",t=>t+n);this._setElementAttributes(uh,"marginRight",t=>t-n)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow");this._element.style.overflow="hidden"}_setElementAttributes(n,t,i){const r=this.getWidth(),u=n=>{if(n===this._element||!(window.innerWidth>n.clientWidth+r)){this._saveInitialAttribute(n,t);const u=window.getComputedStyle(n)[t];n.style[t]=`${i(Number.parseFloat(u))}px`}};this._applyManipulationCallback(n,u)}reset(){this._resetElementAttributes(this._element,"overflow");this._resetElementAttributes(this._element,"paddingRight");this._resetElementAttributes(rh,"paddingRight");this._resetElementAttributes(uh,"marginRight")}_saveInitialAttribute(n,t){const r=n.style[t];r&&i.setDataAttribute(n,t,r)}_resetElementAttributes(n,t){const r=n=>{const r=i.getDataAttribute(n,t);typeof r=="undefined"?n.style.removeProperty(t):(i.removeDataAttribute(n,t),n.style[t]=r)};this._applyManipulationCallback(n,r)}_applyManipulationCallback(n,i){ot(n)?i(n):t.find(n,this._element).forEach(i)}isOverflowing(){return this.getWidth()>0}}const nb={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},tb={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},fh="backdrop",ib="fade",eh="show",oh=`mousedown.bs.${fh}`;class sh{constructor(n){this._config=this._getConfig(n);this._isAppended=!1;this._element=null}show(n){if(!this._config.isVisible){ht(n);return}this._append();this._config.isAnimated&&kt(this._getElement());this._getElement().classList.add(eh);this._emulateAnimation(()=>{ht(n)})}hide(n){if(!this._config.isVisible){ht(n);return}this._getElement().classList.remove(eh);this._emulateAnimation(()=>{this.dispose(),ht(n)})}_getElement(){if(!this._element){const n=document.createElement("div");n.className=this._config.className;this._config.isAnimated&&n.classList.add(ib);this._element=n}return this._element}_getConfig(n){return n={...nb,...(typeof n=="object"?n:{})},n.rootElement=it(n.rootElement),p(fh,n,tb),n}_append(){if(!this._isAppended){this._config.rootElement.append(this._getElement());n.on(this._getElement(),oh,()=>{ht(this._config.clickCallback)});this._isAppended=!0}}dispose(){this._isAppended&&(n.off(this._element,oh),this._element.remove(),this._isAppended=!1)}_emulateAnimation(n){re(n,this._getElement(),this._config.isAnimated)}}const rb={trapElement:null,autofocus:!0},ub={trapElement:"element",autofocus:"boolean"},fb="focustrap",dr=`.${"bs.focustrap"}`,eb=`focusin${dr}`,ob=`keydown.tab${dr}`,sb="Tab",hb="forward",hh="backward";class ch{constructor(n){this._config=this._getConfig(n);this._isActive=!1;this._lastTabNavDirection=null}activate(){const{trapElement:t,autofocus:i}=this._config;if(!this._isActive){i&&t.focus();n.off(document,dr);n.on(document,eb,n=>this._handleFocusin(n));n.on(document,ob,n=>this._handleKeydown(n));this._isActive=!0}}deactivate(){this._isActive&&(this._isActive=!1,n.off(document,dr))}_handleFocusin(n){const{target:u}=n,{trapElement:i}=this._config;if(u!==document&&u!==i&&!i.contains(u)){const r=t.focusableChildren(i);r.length===0?i.focus():this._lastTabNavDirection===hh?r[r.length-1].focus():r[0].focus()}}_handleKeydown(n){n.key===sb&&(this._lastTabNavDirection=n.shiftKey?hh:hb)}_getConfig(n){return n={...rb,...(typeof n=="object"?n:{})},p(fb,n,ub),n}}const lh="modal",a=`.${"bs.modal"}`,ah="Escape",vh={backdrop:!0,keyboard:!0,focus:!0},cb={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},lb=`hide${a}`,ab=`hidePrevented${a}`,yh=`hidden${a}`,ph=`show${a}`,vb=`shown${a}`,wh=`resize${a}`,bh=`click.dismiss${a}`,kh=`keydown.dismiss${a}`,yb=`mouseup.dismiss${a}`,dh=`mousedown.dismiss${a}`,pb=`click${a}${".data-api"}`,gh="modal-open",wb="fade",nc="show",yf="modal-static",bb=".modal.show",kb=".modal-dialog",db=".modal-body";class oi extends v{constructor(n,i){super(n);this._config=this._getConfig(i);this._dialog=t.findOne(kb,this._element);this._backdrop=this._initializeBackDrop();this._focustrap=this._initializeFocusTrap();this._isShown=!1;this._ignoreBackdropClick=!1;this._isTransitioning=!1;this._scrollBar=new vf}static get Default(){return vh}static get NAME(){return lh}toggle(n){return this._isShown?this.hide():this.show(n)}show(t){if(!this._isShown&&!this._isTransitioning){const i=n.trigger(this._element,ph,{relatedTarget:t});if(!i.defaultPrevented){this._isShown=!0;this._isAnimated()&&(this._isTransitioning=!0);this._scrollBar.hide();document.body.classList.add(gh);this._adjustDialog();this._setEscapeEvent();this._setResizeEvent();n.on(this._dialog,dh,()=>{n.one(this._element,yb,n=>{n.target===this._element&&(this._ignoreBackdropClick=!0)})});this._showBackdrop(()=>this._showElement(t))}}}hide(){if(this._isShown&&!this._isTransitioning){const i=n.trigger(this._element,lb);if(!i.defaultPrevented){this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0);this._setEscapeEvent();this._setResizeEvent();this._focustrap.deactivate();this._element.classList.remove(nc);n.off(this._element,bh);n.off(this._dialog,dh);this._queueCallback(()=>this._hideModal(),this._element,t)}}}dispose(){[window,this._dialog].forEach(t=>n.off(t,a));this._backdrop.dispose();this._focustrap.deactivate();super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new sh({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new ch({trapElement:this._element})}_getConfig(n){return n={...vh,...i.getDataAttributes(this._element),...(typeof n=="object"?n:{})},p(lh,n,cb),n}_showElement(i){const r=this._isAnimated(),u=t.findOne(db,this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.append(this._element);this._element.style.display="block";this._element.removeAttribute("aria-hidden");this._element.setAttribute("aria-modal",!0);this._element.setAttribute("role","dialog");this._element.scrollTop=0;u&&(u.scrollTop=0);r&&kt(this._element);this._element.classList.add(nc);const f=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,n.trigger(this._element,vb,{relatedTarget:i})};this._queueCallback(f,this._dialog,r)}_setEscapeEvent(){if(this._isShown)n.on(this._element,kh,n=>{this._config.keyboard&&n.key===ah?(n.preventDefault(),this.hide()):this._config.keyboard||n.key!==ah||this._triggerBackdropTransition()});else n.off(this._element,kh)}_setResizeEvent(){if(this._isShown)n.on(window,wh,()=>this._adjustDialog());else n.off(window,wh)}_hideModal(){this._element.style.display="none";this._element.setAttribute("aria-hidden",!0);this._element.removeAttribute("aria-modal");this._element.removeAttribute("role");this._isTransitioning=!1;this._backdrop.hide(()=>{document.body.classList.remove(gh),this._resetAdjustments(),this._scrollBar.reset(),n.trigger(this._element,yh)})}_showBackdrop(t){n.on(this._element,bh,n=>{if(this._ignoreBackdropClick){this._ignoreBackdropClick=!1;return}n.target===n.currentTarget&&(this._config.backdrop===!0?this.hide():this._config.backdrop==="static"&&this._triggerBackdropTransition())});this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains(wb)}_triggerBackdropTransition(){const u=n.trigger(this._element,ab);if(!u.defaultPrevented){const{classList:t,scrollHeight:f,style:i}=this._element,r=f>document.documentElement.clientHeight;(r||i.overflowY!=="hidden")&&!t.contains(yf)&&(r||(i.overflowY="hidden"),t.add(yf),this._queueCallback(()=>{t.remove(yf),r||this._queueCallback(()=>{i.overflowY=""},this._dialog)},this._dialog),this._element.focus())}}_adjustDialog(){const n=this._element.scrollHeight>document.documentElement.clientHeight,i=this._scrollBar.getWidth(),t=i>0;(!t&&n&&!r()||t&&!n&&r())&&(this._element.style.paddingLeft=`${i}px`);(t&&!n&&!r()||!t&&n&&r())&&(this._element.style.paddingRight=`${i}px`)}_resetAdjustments(){this._element.style.paddingLeft="";this._element.style.paddingRight=""}static jQueryInterface(n,t){return this.each(function(){const i=oi.getOrCreateInstance(this,n);if(typeof n=="string"){if(typeof i[n]=="undefined")throw new TypeError(`No method named "${n}"`);i[n](t)}})}}n.on(document,pb,'[data-bs-toggle="modal"]',function(i){const r=tt(this);["A","AREA"].includes(this.tagName)&&i.preventDefault();n.one(r,ph,t=>{if(!t.defaultPrevented)n.one(r,yh,()=>{ci(this)&&this.focus()})});const u=t.findOne(bb);u&&oi.getInstance(u).hide();const f=oi.getOrCreateInstance(r);f.toggle(this)});er(oi);h(oi);const tc="offcanvas",wt=`.${"bs.offcanvas"}`,ic=".data-api",gb=`load${wt}${ic}`,nk="Escape",rc={backdrop:!0,keyboard:!0,scroll:!1},tk={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},uc="show",ik="offcanvas-backdrop",fc=".offcanvas.show",rk=`show${wt}`,uk=`shown${wt}`,fk=`hide${wt}`,ec=`hidden${wt}`,ek=`click${wt}${ic}`,ok=`keydown.dismiss${wt}`;class bt extends v{constructor(n,t){super(n);this._config=this._getConfig(t);this._isShown=!1;this._backdrop=this._initializeBackDrop();this._focustrap=this._initializeFocusTrap();this._addEventListeners()}static get NAME(){return tc}static get Default(){return rc}toggle(n){return this._isShown?this.hide():this.show(n)}show(t){if(!this._isShown){const i=n.trigger(this._element,rk,{relatedTarget:t});if(!i.defaultPrevented){this._isShown=!0;this._element.style.visibility="visible";this._backdrop.show();this._config.scroll||(new vf).hide();this._element.removeAttribute("aria-hidden");this._element.setAttribute("aria-modal",!0);this._element.setAttribute("role","dialog");this._element.classList.add(uc);const r=()=>{this._config.scroll||this._focustrap.activate(),n.trigger(this._element,uk,{relatedTarget:t})};this._queueCallback(r,this._element,!0)}}}hide(){if(this._isShown){const t=n.trigger(this._element,fk);if(!t.defaultPrevented){this._focustrap.deactivate();this._element.blur();this._isShown=!1;this._element.classList.remove(uc);this._backdrop.hide();const i=()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new vf).reset(),n.trigger(this._element,ec)};this._queueCallback(i,this._element,!0)}}}dispose(){this._backdrop.dispose();this._focustrap.deactivate();super.dispose()}_getConfig(n){return n={...rc,...i.getDataAttributes(this._element),...(typeof n=="object"?n:{})},p(tc,n,tk),n}_initializeBackDrop(){return new sh({className:ik,isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new ch({trapElement:this._element})}_addEventListeners(){n.on(this._element,ok,n=>{this._config.keyboard&&n.key===nk&&this.hide()})}static jQueryInterface(n){return this.each(function(){const t=bt.getOrCreateInstance(this,n);if(typeof n=="string"){if(t[n]===undefined||n.startsWith("_")||n==="constructor")throw new TypeError(`No method named "${n}"`);t[n](this)}})}}n.on(document,ek,'[data-bs-toggle="offcanvas"]',function(i){const r=tt(this);if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),!st(this)){n.one(r,ec,()=>{ci(this)&&this.focus()});const u=t.findOne(fc);u&&u!==r&&bt.getInstance(u).hide();const f=bt.getOrCreateInstance(r);f.toggle(this)}});n.on(window,gb,()=>t.find(fc).forEach(n=>bt.getOrCreateInstance(n).show()));er(bt);h(bt);const sk=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),hk=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,ck=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,lk=(n,t)=>{const i=n.nodeName.toLowerCase();if(t.includes(i))return sk.has(i)?Boolean(hk.test(n.nodeValue)||ck.test(n.nodeValue)):!0;const r=t.filter(n=>n instanceof RegExp);for(let n=0,t=r.length;n
<\/div>
<\/div><\/div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},bk={HIDE:`hide${k}`,HIDDEN:`hidden${k}`,SHOW:`show${k}`,SHOWN:`shown${k}`,INSERTED:`inserted${k}`,CLICK:`click${k}`,FOCUSIN:`focusin${k}`,FOCUSOUT:`focusout${k}`,MOUSEENTER:`mouseenter${k}`,MOUSELEAVE:`mouseleave${k}`},gr="fade",gi="show",nr="show",pf="out",hc=".tooltip-inner",cc=`.${"modal"}`,lc="hide.bs.modal",tr="hover",wf="focus",kk="click",dk="manual";class si extends v{constructor(n,t){if(typeof ds=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(n);this._isEnabled=!0;this._timeout=0;this._hoverState="";this._activeTrigger={};this._popper=null;this._config=this._getConfig(t);this.tip=null;this._setListeners()}static get Default(){return wk}static get NAME(){return sc}static get Event(){return bk}static get DefaultType(){return yk}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(n){if(this._isEnabled)if(n){const t=this._initializeOnDelegatedTarget(n);t._activeTrigger.click=!t._activeTrigger.click;t._isWithActiveTrigger()?t._enter(null,t):t._leave(null,t)}else{if(this.getTipElement().classList.contains(gi)){this._leave(null,this);return}this._enter(null,this)}}dispose(){clearTimeout(this._timeout);n.off(this._element.closest(cc),lc,this._hideModalHandler);this.tip&&this.tip.remove();this._disposePopper();super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(this.isWithContent()&&this._isEnabled){const e=n.trigger(this._element,this.constructor.Event.SHOW),i=te(this._element),o=i===null?this._element.ownerDocument.documentElement.contains(this._element):i.contains(this._element);if(!e.defaultPrevented&&o){this.constructor.NAME==="tooltip"&&this.tip&&this.getTitle()!==this.tip.querySelector(hc).innerHTML&&(this._disposePopper(),this.tip.remove(),this.tip=null);const t=this.getTipElement(),r=el(this.constructor.NAME);t.setAttribute("id",r);this._element.setAttribute("aria-describedby",r);this._config.animation&&t.classList.add(gr);const s=typeof this._config.placement=="function"?this._config.placement.call(this,t,this._element):this._config.placement,u=this._getAttachment(s);this._addAttachmentClass(u);const{container:h}=this._config;li.set(t,this.constructor.DATA_KEY,this);this._element.ownerDocument.documentElement.contains(this.tip)||(h.append(t),n.trigger(this._element,this.constructor.Event.INSERTED));this._popper?this._popper.update():this._popper=sf(this._element,t,this._getPopperConfig(u));t.classList.add(gi);const f=this._resolvePossibleFunction(this._config.customClass);f&&t.classList.add(...f.split(" "));"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>{n.on(t,"mouseover",fr)});const c=()=>{const t=this._hoverState;this._hoverState=null;n.trigger(this._element,this.constructor.Event.SHOWN);t===pf&&this._leave(null,this)},l=this.tip.classList.contains(gr);this._queueCallback(c,this.tip,l)}}}hide(){if(this._popper){const t=this.getTipElement(),i=()=>{this._isWithActiveTrigger()||(this._hoverState!==nr&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),n.trigger(this._element,this.constructor.Event.HIDDEN),this._disposePopper())},r=n.trigger(this._element,this.constructor.Event.HIDE);if(!r.defaultPrevented){t.classList.remove(gi);"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>n.off(t,"mouseover",fr));this._activeTrigger[kk]=!1;this._activeTrigger[wf]=!1;this._activeTrigger[tr]=!1;const u=this.tip.classList.contains(gr);this._queueCallback(i,this.tip,u);this._hoverState=""}}}update(){this._popper!==null&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");t.innerHTML=this._config.template;const n=t.children[0];return this.setContent(n),n.classList.remove(gr,gi),this.tip=n,this.tip}setContent(n){this._sanitizeAndSetContent(n,this.getTitle(),hc)}_sanitizeAndSetContent(n,i,r){const u=t.findOne(r,n);if(!i&&u){u.remove();return}this.setElementContent(u,i)}setElementContent(n,t){if(n!==null){if(ot(t)){t=it(t);this._config.html?t.parentNode!==n&&(n.innerHTML="",n.append(t)):n.textContent=t.textContent;return}this._config.html?(this._config.sanitize&&(t=oc(t,this._config.allowList,this._config.sanitizeFn)),n.innerHTML=t):n.textContent=t}}getTitle(){const n=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(n)}updateAttachment(n){return n==="right"?"end":n==="left"?"start":n}_initializeOnDelegatedTarget(n,t){return t||this.constructor.getOrCreateInstance(n.delegateTarget,this._getDelegateConfig())}_getOffset(){const{offset:n}=this._config;return typeof n=="string"?n.split(",").map(n=>Number.parseInt(n,10)):typeof n=="function"?t=>n(t,this._element):n}_resolvePossibleFunction(n){return typeof n=="function"?n.call(this._element):n}_getPopperConfig(n){const t={placement:n,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:n=>this._handlePopperPlacementChange(n)}],onFirstUpdate:n=>{n.options.placement!==n.placement&&this._handlePopperPlacementChange(n)}};return{...t,...(typeof this._config.popperConfig=="function"?this._config.popperConfig(t):this._config.popperConfig)}}_addAttachmentClass(n){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(n)}`)}_getAttachment(n){return pk[n.toUpperCase()]}_setListeners(){const t=this._config.trigger.split(" ");t.forEach(t=>{if(t==="click")n.on(this._element,this.constructor.Event.CLICK,this._config.selector,n=>this.toggle(n));else if(t!==dk){const i=t===tr?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,r=t===tr?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;n.on(this._element,i,this._config.selector,n=>this._enter(n));n.on(this._element,r,this._config.selector,n=>this._leave(n))}});this._hideModalHandler=()=>{this._element&&this.hide()};n.on(this._element.closest(cc),lc,this._hideModalHandler);this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const n=this._element.getAttribute("title"),t=typeof this._element.getAttribute("data-bs-original-title");(n||t!=="string")&&(this._element.setAttribute("data-bs-original-title",n||""),!n||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",n),this._element.setAttribute("title",""))}_enter(n,t){if(t=this._initializeOnDelegatedTarget(n,t),n&&(t._activeTrigger[n.type==="focusin"?wf:tr]=!0),t.getTipElement().classList.contains(gi)||t._hoverState===nr){t._hoverState=nr;return}if(clearTimeout(t._timeout),t._hoverState=nr,!t._config.delay||!t._config.delay.show){t.show();return}t._timeout=setTimeout(()=>{t._hoverState===nr&&t.show()},t._config.delay.show)}_leave(n,t){if(t=this._initializeOnDelegatedTarget(n,t),n&&(t._activeTrigger[n.type==="focusout"?wf:tr]=t._element.contains(n.relatedTarget)),!t._isWithActiveTrigger()){if(clearTimeout(t._timeout),t._hoverState=pf,!t._config.delay||!t._config.delay.hide){t.hide();return}t._timeout=setTimeout(()=>{t._hoverState===pf&&t.hide()},t._config.delay.hide)}}_isWithActiveTrigger(){for(const n in this._activeTrigger)if(this._activeTrigger[n])return!0;return!1}_getConfig(n){const t=i.getDataAttributes(this._element);return Object.keys(t).forEach(n=>{vk.has(n)&&delete t[n]}),n={...this.constructor.Default,...t,...(typeof n=="object"&&n?n:{})},n.container=n.container===!1?document.body:it(n.container),typeof n.delay=="number"&&(n.delay={show:n.delay,hide:n.delay}),typeof n.title=="number"&&(n.title=n.title.toString()),typeof n.content=="number"&&(n.content=n.content.toString()),p(sc,n,this.constructor.DefaultType),n.sanitize&&(n.template=oc(n.template,n.allowList,n.sanitizeFn)),n}_getDelegateConfig(){const n={};for(const t in this._config)this.constructor.Default[t]!==this._config[t]&&(n[t]=this._config[t]);return n}_cleanTipClass(){const t=this.getTipElement(),i=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),n=t.getAttribute("class").match(i);n!==null&&n.length>0&&n.map(n=>n.trim()).forEach(n=>t.classList.remove(n))}_getBasicClassPrefix(){return ak}_handlePopperPlacementChange(n){const{state:t}=n;t&&(this.tip=t.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(t.placement)))}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(n){return this.each(function(){const t=si.getOrCreateInstance(this,n);if(typeof n=="string"){if(typeof t[n]=="undefined")throw new TypeError(`No method named "${n}"`);t[n]()}})}}h(si);const gk="popover",d=`.${"bs.popover"}`,nd="bs-popover",td={...si.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:'