Full Code of dotnetcore/CAP for AI

master 87a1a393b2be cached
495 files
2.3 MB
633.7k tokens
3122 symbols
1 requests
Download .txt
Showing preview only (2,526K chars total). Download the full file or copy to clipboard to get everything.
Repository: dotnetcore/CAP
Branch: master
Commit: 87a1a393b2be
Files: 495
Total size: 2.3 MB

Directory structure:
gitextract__fz6t0_d/

├── .flubu
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── feature_request.yml
│   │   └── question.yml
│   ├── pull_request_template.md
│   └── workflows/
│       └── deploy-docs-and-dashboard.yml
├── .gitignore
├── CAP.sln
├── CAP.sln.DotSettings
├── LICENSE.txt
├── README.md
├── README.zh-cn.md
├── appveyor.yml
├── build/
│   ├── BuildScript.Util.cs
│   ├── BuildScript.Version.cs
│   ├── BuildScript.cs
│   ├── BuildScript.csproj
│   ├── BuildVersion.cs
│   └── version.props
├── code-of-conduct.md
├── docs/
│   ├── content/
│   │   ├── CNAME
│   │   ├── about/
│   │   │   ├── contact-us.md
│   │   │   ├── license.md
│   │   │   └── release-notes.md
│   │   ├── index.md
│   │   └── user-guide/
│   │       ├── en/
│   │       │   ├── cap/
│   │       │   │   ├── configuration.md
│   │       │   │   ├── filter.md
│   │       │   │   ├── idempotence.md
│   │       │   │   ├── messaging.md
│   │       │   │   ├── serialization.md
│   │       │   │   └── transactions.md
│   │       │   ├── getting-started/
│   │       │   │   ├── contributing.md
│   │       │   │   ├── introduction.md
│   │       │   │   └── quick-start.md
│   │       │   ├── monitoring/
│   │       │   │   ├── consul.md
│   │       │   │   ├── dashboard.md
│   │       │   │   ├── diagnostics.md
│   │       │   │   ├── kubernetes.md
│   │       │   │   └── opentelemetry.md
│   │       │   ├── samples/
│   │       │   │   ├── eshoponcontainers.md
│   │       │   │   ├── faq.md
│   │       │   │   └── github.md
│   │       │   ├── storage/
│   │       │   │   ├── general.md
│   │       │   │   ├── in-memory-storage.md
│   │       │   │   ├── mongodb.md
│   │       │   │   ├── mysql.md
│   │       │   │   ├── postgresql.md
│   │       │   │   └── sqlserver.md
│   │       │   └── transport/
│   │       │       ├── aws-sqs.md
│   │       │       ├── azure-service-bus.md
│   │       │       ├── general.md
│   │       │       ├── in-memory-queue.md
│   │       │       ├── kafka.md
│   │       │       ├── nats.md
│   │       │       ├── pulsar.md
│   │       │       ├── rabbitmq.md
│   │       │       └── redis-streams.md
│   │       └── zh/
│   │           ├── cap/
│   │           │   ├── configuration.md
│   │           │   ├── filter.md
│   │           │   ├── idempotence.md
│   │           │   ├── messaging.md
│   │           │   ├── serialization.md
│   │           │   └── transactions.md
│   │           ├── getting-started/
│   │           │   ├── contributing.md
│   │           │   ├── introduction.md
│   │           │   └── quick-start.md
│   │           ├── monitoring/
│   │           │   ├── consul.md
│   │           │   ├── dashboard.md
│   │           │   ├── diagnostics.md
│   │           │   ├── kubernetes.md
│   │           │   └── opentelemetry.md
│   │           ├── samples/
│   │           │   ├── castle.dynamicproxy.md
│   │           │   ├── eshoponcontainers.md
│   │           │   ├── faq.md
│   │           │   └── github.md
│   │           ├── storage/
│   │           │   ├── general.md
│   │           │   ├── in-memory-storage.md
│   │           │   ├── mongodb.md
│   │           │   ├── mysql.md
│   │           │   ├── postgresql.md
│   │           │   └── sqlserver.md
│   │           └── transport/
│   │               ├── aws-sqs.md
│   │               ├── azure-service-bus.md
│   │               ├── general.md
│   │               ├── in-memory-queue.md
│   │               ├── kafka.md
│   │               ├── nats.md
│   │               ├── pulsar.md
│   │               ├── rabbitmq.md
│   │               └── redis-streams.md
│   ├── mkdocs.yml
│   └── readme.md
├── samples/
│   ├── Sample.AmazonSQS.InMemory/
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── Program.cs
│   │   ├── Sample.AmazonSQS.InMemory.csproj
│   │   └── appsettings.json
│   ├── Sample.AzureServiceBus.InMemory/
│   │   ├── Contracts/
│   │   │   ├── DomainEvents/
│   │   │   │   └── Contract.cs
│   │   │   └── IntegrationEvents/
│   │   │       └── Contract.cs
│   │   ├── Program.cs
│   │   ├── Sample.AzureServiceBus.InMemory.csproj
│   │   ├── SampleSubscriber.cs
│   │   ├── appsettings.Development.json
│   │   └── appsettings.json
│   ├── Sample.ConsoleApp/
│   │   ├── EventSubscriber.cs
│   │   ├── Program.cs
│   │   └── Sample.ConsoleApp.csproj
│   ├── Sample.Dashboard.Auth/
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── MyDashboardAuthenticationHandler.cs
│   │   ├── Program.cs
│   │   ├── Sample.Dashboard.Auth.csproj
│   │   ├── Startup.cs
│   │   └── appsettings.json
│   ├── Sample.Dashboard.Jwt/
│   │   ├── Data/
│   │   │   └── User.cs
│   │   ├── Dockerfile
│   │   ├── Program.cs
│   │   ├── Sample.Dashboard.Jwt.csproj
│   │   ├── appsettings.json
│   │   └── wwwroot/
│   │       ├── css/
│   │       │   └── site.css
│   │       ├── index.html
│   │       └── js/
│   │           └── site.js
│   ├── Sample.Kafka.PostgreSql/
│   │   ├── AppDbContext.cs
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── Program.cs
│   │   ├── Sample.Kafka.PostgreSql.csproj
│   │   └── appsettings.json
│   ├── Sample.Pulsar.InMemory/
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── Program.cs
│   │   ├── Sample.Pulsar.InMemory.csproj
│   │   └── appsettings.json
│   ├── Sample.RabbitMQ.MongoDB/
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── Program.cs
│   │   ├── Sample.RabbitMQ.MongoDB.csproj
│   │   ├── appsettings.json
│   │   └── docker-compose.yml
│   ├── Sample.RabbitMQ.MySql/
│   │   ├── AppDbContext.cs
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── Program.cs
│   │   ├── Sample.RabbitMQ.MySql.csproj
│   │   └── appsettings.json
│   ├── Sample.RabbitMQ.SqlServer/
│   │   ├── AppDbContext.cs
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── Messages/
│   │   │   ├── TestMessage.cs
│   │   │   ├── VeryFastProcessingReceiver.cs
│   │   │   └── XSlowProcessingReceiver.cs
│   │   ├── Migrations/
│   │   │   ├── 20191205032949_FirstMigration.Designer.cs
│   │   │   ├── 20191205032949_FirstMigration.cs
│   │   │   └── AppDbContextModelSnapshot.cs
│   │   ├── Program.cs
│   │   ├── Sample.RabbitMQ.SqlServer.csproj
│   │   ├── TypedConsumers/
│   │   │   ├── QueueHandler.cs
│   │   │   ├── QueueHandlerTopicAttribute.cs
│   │   │   ├── QueueHandlersExtensions.cs
│   │   │   └── TypedConsumerServiceSelector.cs
│   │   └── appsettings.json
│   └── Samples.Redis.SqlServer/
│       ├── Controllers/
│       │   └── HomeController.cs
│       ├── Dockerfile
│       ├── Program.cs
│       ├── Samples.Redis.SqlServer.csproj
│       ├── appsettings.json
│       └── docker-compose.yml
├── src/
│   ├── Directory.Build.props
│   ├── DotNetCore.CAP/
│   │   ├── BrokerConnectionException.cs
│   │   ├── CAP.Attribute.cs
│   │   ├── CAP.Builder.cs
│   │   ├── CAP.Options.cs
│   │   ├── CAP.ServiceCollectionExtensions.cs
│   │   ├── Diagnostics/
│   │   │   ├── CapDiagnosticListenerNames.cs
│   │   │   ├── EventCounterSource.Cap.cs
│   │   │   ├── EventData.Cap.P.cs
│   │   │   └── EventData.Cap.S.cs
│   │   ├── DotNetCore.CAP.csproj
│   │   ├── IBootstrapper.cs
│   │   ├── ICapOptionsExtension.cs
│   │   ├── ICapPublisher.cs
│   │   ├── ICapSubscribe.cs
│   │   ├── ICapTransaction.Base.cs
│   │   ├── ICapTransaction.cs
│   │   ├── Internal/
│   │   │   ├── ConsumerContext.cs
│   │   │   ├── ConsumerExecutedResult.cs
│   │   │   ├── ConsumerExecutorDescriptor.cs
│   │   │   ├── Filter/
│   │   │   │   ├── ExceptionContext.cs
│   │   │   │   ├── ExecutedContext.cs
│   │   │   │   ├── ExecutingContext.cs
│   │   │   │   ├── FilterContext.cs
│   │   │   │   ├── ISubscribeFilter.cs
│   │   │   │   └── SubscribeFilter.cs
│   │   │   ├── Helper.cs
│   │   │   ├── IBootstrapper.Default.cs
│   │   │   ├── ICapPublisher.Default.cs
│   │   │   ├── IConsumerRegister.Default.cs
│   │   │   ├── IConsumerRegister.cs
│   │   │   ├── IConsumerServiceSelector.Assembly.cs
│   │   │   ├── IConsumerServiceSelector.Default.cs
│   │   │   ├── IConsumerServiceSelector.cs
│   │   │   ├── IMessageSender.Default.cs
│   │   │   ├── IMessageSender.cs
│   │   │   ├── IProcessingServer.cs
│   │   │   ├── ISnowflakeId.Default.cs
│   │   │   ├── ISnowflakeId.cs
│   │   │   ├── ISubscribeExector.Default.cs
│   │   │   ├── ISubscribeExecutor.cs
│   │   │   ├── ISubscribeInvoker.Default.cs
│   │   │   ├── ISubscribeInvoker.cs
│   │   │   ├── LoggerExtensions.cs
│   │   │   ├── MethodMatcherCache.cs
│   │   │   ├── NoopTransaction.cs
│   │   │   ├── ObjectMethodExecutor/
│   │   │   │   ├── AwaitableInfo.cs
│   │   │   │   ├── CoercedAwaitableInfo.cs
│   │   │   │   ├── ObjectMethodExecutor.cs
│   │   │   │   ├── ObjectMethodExecutorAwaitable.cs
│   │   │   │   └── ObjectMethodExecutorFSharpSupport.cs
│   │   │   ├── PublisherSentFailedException.cs
│   │   │   ├── ScheduledMediumMessageQueue.cs
│   │   │   ├── StatusName.cs
│   │   │   ├── SubscriberExecutionFailedException.cs
│   │   │   └── TopicAttribute.cs
│   │   ├── Messages/
│   │   │   ├── FailedInfo.cs
│   │   │   ├── Headers.cs
│   │   │   ├── Message.cs
│   │   │   ├── MessageType.cs
│   │   │   └── TransportMessage.cs
│   │   ├── Monitoring/
│   │   │   ├── IMonitoringApi.cs
│   │   │   ├── MessageDto.cs
│   │   │   ├── MessageQueryDto.cs
│   │   │   ├── PagedQueryResult.cs
│   │   │   └── StatisticsDto.cs
│   │   ├── OperateResult.cs
│   │   ├── Persistence/
│   │   │   ├── IDataStorage.cs
│   │   │   ├── IStorageInitializer.cs
│   │   │   └── MediumMessage.cs
│   │   ├── Processor/
│   │   │   ├── IDispatcher.Default.cs
│   │   │   ├── IProcessingServer.Cap.cs
│   │   │   ├── IProcessor.Collector.cs
│   │   │   ├── IProcessor.Delayed.cs
│   │   │   ├── IProcessor.InfiniteRetry.cs
│   │   │   ├── IProcessor.NeedRetry.cs
│   │   │   ├── IProcessor.TransportCheck.cs
│   │   │   ├── IProcessor.cs
│   │   │   └── ProcessingContext.cs
│   │   ├── Serialization/
│   │   │   ├── ISerializer.JsonUtf8.cs
│   │   │   └── ISerializer.cs
│   │   ├── SubscriberNotFoundException.cs
│   │   └── Transport/
│   │       ├── BrokerAddress.cs
│   │       ├── IConsumerClient.cs
│   │       ├── IConsumerClientFactory.cs
│   │       ├── IDispatcher.cs
│   │       ├── ITransport.cs
│   │       └── MqLogType.cs
│   ├── DotNetCore.CAP.AmazonSQS/
│   │   ├── AmazonPolicyExtensions.cs
│   │   ├── AmazonSQSConsumerClient.cs
│   │   ├── AmazonSQSConsumerClientFactory.cs
│   │   ├── CAP.AmazonSQSOptions.cs
│   │   ├── CAP.AmazonSQSOptionsExtension.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.AmazonSQS.csproj
│   │   ├── ITransport.AmazonSQS.cs
│   │   ├── SQSReceivedMessage.cs
│   │   └── TopicNormalizer.cs
│   ├── DotNetCore.CAP.AzureServiceBus/
│   │   ├── AzureServiceBusConsumerClient.cs
│   │   ├── AzureServiceBusConsumerClientFactory.cs
│   │   ├── AzureServiceBusConsumerCommitInput.cs
│   │   ├── AzureServiceBusHeaders.cs
│   │   ├── CAP.AzureServiceBusOptions.cs
│   │   ├── CAP.AzureServiceBusOptionsExtension.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.AzureServiceBus.csproj
│   │   ├── Helpers/
│   │   │   └── ServiceBusHelpers.cs
│   │   ├── ITransport.AzureServiceBus.cs
│   │   ├── Producer/
│   │   │   ├── IServiceBusProducerDescriptor.cs
│   │   │   ├── IServiceBusProducerDescriptorFactory.cs
│   │   │   └── ServiceBusProducerDescriptorBuilder.cs
│   │   └── ServiceBusProcessorFacade.cs
│   ├── DotNetCore.CAP.Dashboard/
│   │   ├── CAP.BuilderExtension.cs
│   │   ├── CAP.DashboardOptions.cs
│   │   ├── CAP.DashboardOptionsExtensions.cs
│   │   ├── CAP.MetricsEventListener.cs
│   │   ├── CapCache.cs
│   │   ├── CircularBuffer.cs
│   │   ├── DotNetCore.CAP.Dashboard.csproj
│   │   ├── GatewayProxy/
│   │   │   ├── GatewayProxyAgent.cs
│   │   │   ├── IRequestMapper.Default.cs
│   │   │   ├── IRequestMapper.cs
│   │   │   └── Requester/
│   │   │       ├── HttpClientBuilder.cs
│   │   │       ├── HttpClientHttpRequester.cs
│   │   │       ├── IHttpClient.cs
│   │   │       ├── IHttpClientBuilder.cs
│   │   │       ├── IHttpClientCache.cs
│   │   │       ├── IHttpRequester.cs
│   │   │       └── MemoryHttpClientCache.cs
│   │   ├── HtmlHelper.cs
│   │   ├── NodeDiscovery/
│   │   │   ├── CAP.ConsulDiscoveryOptions.cs
│   │   │   ├── CAP.ConsulDiscoveryOptionsExtensions.cs
│   │   │   ├── INodeDiscoveryProvider.Consul.cs
│   │   │   ├── INodeDiscoveryProvider.cs
│   │   │   ├── IProcessingServer.Consul.cs
│   │   │   └── Node.cs
│   │   ├── RouteActionProvider.cs
│   │   └── wwwroot/
│   │       ├── .gitignore
│   │       ├── .vscode/
│   │       │   └── settings.json
│   │       ├── README.md
│   │       ├── dist/
│   │       │   ├── assets/
│   │       │   │   ├── Nodes.40464ac3.css
│   │       │   │   ├── Nodes.e12132f5.js
│   │       │   │   ├── Published.429cfade.css
│   │       │   │   ├── Published.a8d638e6.js
│   │       │   │   ├── Received.37160321.css
│   │       │   │   ├── Received.e36ea621.js
│   │       │   │   ├── Subscriber.300bed2c.css
│   │       │   │   ├── Subscriber.d66f9645.js
│   │       │   │   ├── index.2d8714a6.js
│   │       │   │   ├── index.856c0890.css
│   │       │   │   └── index.909977fe.js
│   │       │   └── index.html
│   │       ├── index.html
│   │       ├── package.json
│   │       ├── src/
│   │       │   ├── App.vue
│   │       │   ├── assets/
│   │       │   │   ├── language/
│   │       │   │   │   ├── en-us.js
│   │       │   │   │   └── zh-cn.js
│   │       │   │   └── uPlot.esm.js
│   │       │   ├── components/
│   │       │   │   ├── Footer.vue
│   │       │   │   └── Navigation.vue
│   │       │   ├── main.js
│   │       │   ├── pages/
│   │       │   │   ├── Home.vue
│   │       │   │   ├── Nodes.vue
│   │       │   │   ├── Published.vue
│   │       │   │   ├── Received.vue
│   │       │   │   └── Subscriber.vue
│   │       │   ├── router/
│   │       │   │   └── index.js
│   │       │   └── store/
│   │       │       └── store.js
│   │       └── vite.config.js
│   ├── DotNetCore.CAP.Dashboard.K8s/
│   │   ├── DotNetCore.CAP.Dashboard.K8s.csproj
│   │   ├── K8sDiscoveryOptions.cs
│   │   ├── K8sDiscoveryOptionsExtensions.cs
│   │   ├── K8sNodeDiscoveryProvider.cs
│   │   └── ServiceCollectionExtensions.cs
│   ├── DotNetCore.CAP.InMemoryStorage/
│   │   ├── CAP.InMemoryCapOptionsExtension.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.InMemoryStorage.csproj
│   │   ├── ICapTransaction.InMemory.cs
│   │   ├── IDataStorage.InMemory.cs
│   │   ├── IMonitoringApi.InMemory.cs
│   │   ├── IStorageInitializer.InMemory.cs
│   │   └── MemoryMessage.cs
│   ├── DotNetCore.CAP.Kafka/
│   │   ├── CAP.KafkaCapOptionsExtension.cs
│   │   ├── CAP.KafkaOptions.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.Kafka.csproj
│   │   ├── IConnectionPool.Default.cs
│   │   ├── IConnectionPool.cs
│   │   ├── ITransport.Kafka.cs
│   │   ├── KafkaConsumerClient.cs
│   │   ├── KafkaConsumerClientFactory.cs
│   │   └── KafkaHeaders.cs
│   ├── DotNetCore.CAP.MongoDB/
│   │   ├── CAP.MongoDBCapOptionsExtension.cs
│   │   ├── CAP.MongoDBOptions.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.MongoDB.csproj
│   │   ├── ICapTransaction.MongoDB.cs
│   │   ├── IClientSessionHandle.CAP.cs
│   │   ├── IDataStorage.MongoDB.cs
│   │   ├── IMonitoringApi.MongoDB.cs
│   │   ├── IStorageInitializer.MongoDB.cs
│   │   └── StorageMessage.cs
│   ├── DotNetCore.CAP.MySql/
│   │   ├── CAP.EFOptions.cs
│   │   ├── CAP.MySqlCapOptionsExtension.cs
│   │   ├── CAP.MySqlOptions.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.MySql.csproj
│   │   ├── ICapTransaction.MySql.cs
│   │   ├── IDataStorage.MySql.cs
│   │   ├── IDbConnection.Extensions.cs
│   │   ├── IDbContextTransaction.CAP.cs
│   │   ├── IMonitoringApi.MySql.cs
│   │   ├── IStorageInitializer.MySql.cs
│   │   └── ServerVersion.cs
│   ├── DotNetCore.CAP.NATS/
│   │   ├── CAP.NATSCapOptionsExtension.cs
│   │   ├── CAP.NATSOptions.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.NATS.csproj
│   │   ├── IConnectionPool.Default.cs
│   │   ├── IConnectionPool.cs
│   │   ├── ITransport.NATS.cs
│   │   ├── NATSConsumerClient.cs
│   │   └── NATSConsumerClientFactory.cs
│   ├── DotNetCore.CAP.OpenTelemetry/
│   │   ├── CapInstrumentation.cs
│   │   ├── DiagnosticListener.cs
│   │   ├── DiagnosticSourceSubscriber.cs
│   │   ├── DotNetCore.CAP.OpenTelemetry.csproj
│   │   └── TracerProviderBuilder.Extension.cs
│   ├── DotNetCore.CAP.PostgreSql/
│   │   ├── CAP.EFOptions.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── CAP.PostgreSqlCapOptionsExtension.cs
│   │   ├── CAP.PostgreSqlOptions.cs
│   │   ├── DotNetCore.CAP.PostgreSql.csproj
│   │   ├── ICapTransaction.PostgreSql.cs
│   │   ├── IDataStorage.PostgreSql.cs
│   │   ├── IDbConnection.Extensions.cs
│   │   ├── IDbContextTransaction.CAP.cs
│   │   ├── IMonitoringApi.PostgreSql.cs
│   │   └── IStorageInitializer.PostgreSql.cs
│   ├── DotNetCore.CAP.Pulsar/
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── CAP.PulsarCapOptionsExtension.cs
│   │   ├── CAP.PulsarOptions.cs
│   │   ├── DotNetCore.CAP.Pulsar.csproj
│   │   ├── IConnectionFactory.Default.cs
│   │   ├── IConnectionFactory.cs
│   │   ├── ITransport.Pulsar.cs
│   │   ├── PulsarConsumerClient.cs
│   │   ├── PulsarConsumerClientFactory.cs
│   │   └── PulsarHeaders.cs
│   ├── DotNetCore.CAP.RabbitMQ/
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── CAP.RabbiMQOptions.cs
│   │   ├── CAP.RabbitMQCapOptionsExtension.cs
│   │   ├── DotNetCore.CAP.RabbitMQ.csproj
│   │   ├── IConnectionChannelPool.Default.cs
│   │   ├── IConnectionChannelPool.cs
│   │   ├── ITransport.RabbitMQ.cs
│   │   ├── RabbitMQBasicConsumer.cs
│   │   ├── RabbitMQConsumerClient.cs
│   │   └── RabbitMQConsumerClientFactory.cs
│   ├── DotNetCore.CAP.RedisStreams/
│   │   ├── CapOptions.Redis.Extensions.cs
│   │   ├── CapOptions.Redis.cs
│   │   ├── DotNetCore.CAP.RedisStreams.csproj
│   │   ├── ICapOptionsExtension.Redis.cs
│   │   ├── IConnectionPool.Default.cs
│   │   ├── IConnectionPool.LazyConnection.cs
│   │   ├── IConnectionPool.cs
│   │   ├── IConsumerClient.Redis.cs
│   │   ├── IConsumerClientFactory.Redis.cs
│   │   ├── IRedis.Events.Logger.cs
│   │   ├── IRedis.Events.cs
│   │   ├── IRedisStream.Manager.Default.cs
│   │   ├── IRedisStream.Manager.Extensions.cs
│   │   ├── IRedisStream.Manager.cs
│   │   ├── ITransport.Redis.cs
│   │   ├── RedisErrorExtensions.cs
│   │   ├── TransportMessage.Redis.Exceptions.cs
│   │   └── TransportMessage.Redis.cs
│   └── DotNetCore.CAP.SqlServer/
│       ├── CAP.EFOptions.cs
│       ├── CAP.Options.Extensions.cs
│       ├── CAP.SqlServerCapOptionsExtension.cs
│       ├── CAP.SqlServerOptions.cs
│       ├── Diagnostics/
│       │   ├── DiagnosticObserver.cs
│       │   ├── DiagnosticProcessorObserver.cs
│       │   └── IProcessingServer.DiagnosticRegister.cs
│       ├── DotNetCore.CAP.SqlServer.csproj
│       ├── ICapTransaction.SqlServer.cs
│       ├── IDataStorage.SqlServer.cs
│       ├── IDbConnection.Extensions.cs
│       ├── IDbContextTransaction.CAP.cs
│       ├── IMonitoringApi.SqlServer.cs
│       └── IStorageInitializer.SqlServer.cs
└── test/
    ├── DotNetCore.CAP.AzureServiceBus.Test/
    │   ├── DotNetCore.CAP.AzureServiceBus.Test.csproj
    │   ├── Helpers/
    │   │   └── ServiceBusHelperTests.cs
    │   ├── Producer/
    │   │   └── ServiceBusProducerBuilderTests.cs
    │   └── ServiceBusTransportTests.cs
    ├── DotNetCore.CAP.MultiModuleSubscriberTests/
    │   ├── DotNetCore.CAP.MultiModuleSubscriberTests.csproj
    │   └── SubscriberClass.cs
    ├── DotNetCore.CAP.MySql.Test/
    │   ├── ConnectionUtil.cs
    │   ├── DatabaseTestHost.cs
    │   ├── DotNetCore.CAP.MySql.Test.csproj
    │   ├── MySqlStorageConnectionTest.cs
    │   ├── MySqlStorageTest.cs
    │   └── TestHost.cs
    └── DotNetCore.CAP.Test/
        ├── CAP.BuilderTest.cs
        ├── ConsumerServiceSelectorTest.cs
        ├── CustomConsumerSubscribeTest.cs
        ├── DispatcherTests.cs
        ├── DotNetCore.CAP.Test.csproj
        ├── FakeInMemoryQueue/
        │   ├── CAP.FakeQueueOptionsExtension.cs
        │   ├── CAP.Options.Extensions.cs
        │   ├── ITransport.FakeInMemory.cs
        │   ├── InMemoryConsumerClient.cs
        │   ├── InMemoryConsumerClientFactory.cs
        │   └── InMemoryQueue.cs
        ├── GenericConsumerServiceSelector.cs
        ├── HelperTest.cs
        ├── Helpers/
        │   ├── ObservableCollectionExtensions.cs
        │   ├── TestBootstrapService.cs
        │   ├── TestHostedServiceExtensions.cs
        │   ├── TestLogger.cs
        │   ├── TestLoggingExtensions.cs
        │   ├── TestLoggingProvider.cs
        │   ├── TestMessageCollector.cs
        │   ├── TestServiceCollectionExtensions.cs
        │   └── TestThreadSafeMessageSender.cs
        ├── IntegrationTests/
        │   ├── CancellationTokenSubscriberTest.cs
        │   └── IntegrationTestBase.cs
        ├── MessageExtensionTest.cs
        ├── MessageTest.cs
        ├── SnowflakeIdTest.cs
        ├── SubscribeInvokerTest.cs
        ├── SubscribeInvokerWithCancellation.cs
        └── SubscriberCollisionTests/
            ├── NewMethodTests.cs
            ├── OldMethodTests.cs
            └── SubscriberClass.cs

================================================
FILE CONTENTS
================================================

================================================
FILE: .flubu
================================================

build/BuildScript.csproj


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: 🐞 Bug Report
description: Report a reproducible issue or unexpected behavior in CAP
title: "[Bug] "
labels: [bug]
assignees: []
body:
  - type: markdown
    attributes:
      value: |
        ## Thanks for reporting a CAP issue!

        Before submitting:
        - Make sure you've read the documentation at [https://cap.dotnetcore.xyz](https://cap.dotnetcore.xyz).
        - It's **recommended** to submit a PR directly for typos or trivial fixes.
        - If this is a **feature request**, please use the *Feature Request* template instead.

  - type: input
    id: summary
    attributes:
      label: Summary
      description: A short, clear summary of the bug.
      placeholder: e.g. CAP fails to publish message after transaction commit
    validations:
      required: true

  - type: textarea
    id: reproduce_steps
    attributes:
      label: Steps to Reproduce
      description: Describe how to reproduce the issue step by step.
      placeholder: |
        1. Configure CAP with MySQL and RabbitMQ
        2. Publish message inside a transaction
        3. Commit transaction
        4. Observe error or missing message
    validations:
      required: true

  - type: textarea
    id: expected_behavior
    attributes:
      label: Expected Behavior
      description: What should have happened?
      placeholder: The message should be published and consumed successfully.

  - type: textarea
    id: actual_behavior
    attributes:
      label: Actual Behavior
      description: What actually happened?
      placeholder: Message not sent / consumer not triggered / error occurred

  - type: textarea
    id: logs
    attributes:
      label: Log Output
      description: Paste the relevant CAP logs or exception stack traces here.
      render: shell
      placeholder: |
        [Error] DotNetCore.CAP.Internal.SubscriberExecutor: Exception occurred while processing message
        System.NullReferenceException: Object reference not set to an instance of an object
          at DotNetCore.CAP...

  - type: textarea
    id: config
    attributes:
      label: CAP Configuration
      description: Paste your CAP configuration or initialization code.
      render: yaml
      placeholder: |
        {
          "UseDashboard": true,
          "UseMySql": "Server=localhost;Database=capdb;Uid=root;Pwd=123456;",
          "UseRabbitMQ": "HostName=localhost"
        }

  - type: dropdown
    id: transport
    attributes:
      label: Transport Used
      description: Which message broker are you using?
      options:
        - RabbitMQ
        - Kafka
        - Pulsar
        - Azure Service Bus
        - InMemory
        - Other

  - type: dropdown
    id: storage
    attributes:
      label: Storage Provider
      description: Which storage provider are you using?
      options:
        - MySQL
        - PostgreSQL
        - SQL Server
        - MongoDB
        - InMemory
        - Other

  - type: input
    id: environment
    attributes:
      label: Environment
      description: OS, .NET version, and CAP version.
      placeholder: e.g. Windows 11 / .NET 8.0 / CAP 7.2.1

  - type: textarea
    id: additional
    attributes:
      label: Additional Context
      description: Add any other information, configuration, or screenshots that may help.
      placeholder: e.g. This issue only occurs under heavy load or after multiple retries.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: ✨ Feature Request
description: Suggest a new feature or improvement for CAP
title: "[Feature] "
labels: [enhancement]
assignees: []
body:
  - type: markdown
    attributes:
      value: |
        ## Thanks for contributing ideas to CAP!

        Before submitting:
        - Please make sure your idea isn’t already discussed in [Issues](https://github.com/dotnetcore/CAP/issues) or [Discussions](https://github.com/dotnetcore/CAP/discussions).
        - For minor code changes (typos, docs, small improvements), submitting a PR directly is recommended.
        - Be specific — describe the **problem**, not just the solution.

  - type: input
    id: summary
    attributes:
      label: Summary
      description: A short, clear summary of your proposed feature.
      placeholder: e.g. Add native support for Azure Event Hubs
    validations:
      required: true

  - type: textarea
    id: motivation
    attributes:
      label: Motivation / Problem
      description: Explain why this feature is needed. What problem does it solve or what limitation does it remove?
      placeholder: |
        CAP currently doesn't support Azure Event Hubs as a transport layer.
        This feature would allow easier integration with Azure cloud environments.
    validations:
      required: true

  - type: textarea
    id: proposed_solution
    attributes:
      label: Proposed Solution
      description: Describe how you think the feature should work or be implemented.
      placeholder: |
        Add a new `UseEventHubs()` extension similar to `UseRabbitMQ()` and `UseKafka()`.
        It should handle publish and consume operations via Azure SDK.

  - type: textarea
    id: alternatives
    attributes:
      label: Alternatives Considered
      description: Have you considered any workarounds or alternative approaches?
      placeholder: |
        We can currently bridge Event Hubs via Kafka protocol, but it adds complexity.

  - type: textarea
    id: impact
    attributes:
      label: Expected Impact
      description: Describe how this feature would improve CAP or its usability.
      placeholder: |
        This would expand CAP’s support for Azure ecosystems and help enterprise users.

  - type: dropdown
    id: scope
    attributes:
      label: Feature Scope
      description: What area of CAP does this feature affect most?
      options:
        - Core
        - Transport (e.g., RabbitMQ, Kafka, Pulsar)
        - Storage (e.g., MySQL, PostgreSQL, MongoDB)
        - Dashboard / UI
        - Documentation
        - Other

  - type: textarea
    id: additional
    attributes:
      label: Additional Context
      description: Add any other relevant details, links, or references.
      placeholder: e.g. Related issue numbers, design documents, or PR references.


================================================
FILE: .github/ISSUE_TEMPLATE/question.yml
================================================
name: ❓ Question or Help
description: Ask a question or request usage help about CAP
title: "[Question] "
labels: [question]
assignees: []
body:
  - type: markdown
    attributes:
      value: |
        ## Need help or have a question?

        Before submitting, please:
        - Read the documentation: [https://cap.dotnetcore.xyz](https://cap.dotnetcore.xyz)
        - Check existing [Discussions](https://github.com/dotnetcore/CAP/discussions) and [Issues](https://github.com/dotnetcore/CAP/issues)
        - Use this form for **usage questions**, **configuration issues**, or **how-to** discussions.
        - If you think this is a **bug**, please use the *Bug Report* template instead.

  - type: input
    id: topic
    attributes:
      label: Question Summary
      description: A short summary of what you need help with.
      placeholder: e.g. How to retry messages when using RabbitMQ?
    validations:
      required: true

  - type: textarea
    id: context
    attributes:
      label: Context
      description: Explain your question, what you have tried, and what you expected.
      placeholder: |
        I'm using CAP with MySQL and RabbitMQ.
        The message was not retried after exception.
        Is there a configuration to enable retry?

  - type: textarea
    id: code
    attributes:
      label: Relevant Code or Configuration
      description: Provide related code snippets, config, or setup details.
      render: csharp
      placeholder: |
        builder.Services.AddCap(x =>
        {
            x.UseRabbitMQ("localhost");
            x.UseMySql("Server=127.0.0.1;Database=capdb;Uid=root;Pwd=123456;");
        });

  - type: dropdown
    id: environment
    attributes:
      label: Environment
      description: What environment are you using CAP in?
      options:
        - .NET 8.0
        - .NET 7.0
        - .NET 6.0
        - Other

  - type: textarea
    id: additional
    attributes:
      label: Additional Information
      description: Add any other context or reference links that may help answer your question.
      placeholder: e.g. Related GitHub issue, article, or code sample link.


================================================
FILE: .github/pull_request_template.md
================================================
### Description:
_Provide a more detailed description of the changes made in this PR. Explain the reason behind the changes and their expected impact on the project._

#### Issue(s) addressed:
- [Link to the related issue(s), if any]

#### Changes:
- _List the major changes made in this PR, preferably in bullet points._

#### Affected components:
- _List the components of the project that are affected by this PR._

#### How to test:
_Provide a step-by-step guide on how to test your changes. Include any relevant information like environment setup, dependencies, etc._

### Additional notes (optional):
_Provide any additional notes or context that may be relevant to the changes._

### Checklist:
- [ ] I have tested my changes locally
- [ ] I have added necessary documentation (if applicable)
- [ ] I have updated the relevant tests (if applicable)
- [ ] My changes follow the project's code style guidelines

### Reviewers:
- _Mention any reviewers you would like to review your PR. This can be helpful if you know someone who is familiar with the part of the codebase you're working on._


================================================
FILE: .github/workflows/deploy-docs-and-dashboard.yml
================================================
name: docs & dashboard-dist
on:
  push:
    branches:
      - master
jobs:
  changes:
    runs-on: ubuntu-latest
    outputs:
      docs: ${{ steps.filter.outputs.docs }}
      dashboard: ${{ steps.filter.outputs.dashboard }}
    steps:
    - name: Checkout 🛎️
      uses: actions/checkout@v3
      with:
        persist-credentials: false 
    - name: Check for changes 🎯
      uses: dorny/paths-filter@v2
      id: filter
      with:
        filters: |
          docs:
            - 'docs/**'
          dashboard:
            - 'src/DotNetCore.CAP.Dashboard/wwwroot/src/**'
  
  build-dashboard-and-push:
    needs: changes
    if: ${{ needs.changes.outputs.dashboard == 'true' }}    
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: src/DotNetCore.CAP.Dashboard/wwwroot  
    steps:
    - name: Checkout 🛎️
      uses: actions/checkout@v3
      with:
        persist-credentials: false 
    - name: Use Node.js 🥽
      uses: actions/setup-node@v3
      with:
        node-version: 16
    - name: Install dependencies 🧵
      run: npm install
    - name: Build to dist 🧨
      run: npm run build
    - name: Commit & Push dist changes 🚀
      uses: actions-js/push@master
      with:
        branch: master
        github_token: ${{ secrets.GITHUB_TOKEN }}

  build-docs-and-deploy:
    needs: changes
    if: ${{ needs.changes.outputs.docs == 'true' }}
    runs-on: ubuntu-latest
    steps:
    - name: Checkout 🛎️
      uses: actions/checkout@v3
      with:
        persist-credentials: false 
    - name: Deploy docs 🚀
      uses: mhausenblas/mkdocs-deploy-gh-pages@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        GOOGLE_ANALYTICS_KEY: ${{ secrets.GOOGLE_ANALYTICS_KEY }}
        CONFIG_FILE: docs/mkdocs.yml


================================================
FILE: .gitignore
================================================
node_modules
[Oo]bj/
[Bb]in/
TestResults/
.nuget/
_ReSharper.*/
packages/
artifacts/
PublishProfiles/
*.user
*.suo
*.cache
*.docstates
_ReSharper.*
*.[Rr]e[Ss]harper
*.DotSettings.user
nuget.exe
*k10.csproj
*.psess
*.vsp
*.pidb
*.userprefs
*DS_Store
*.ncrunchsolution
*.*sdf
*.ipch
*.sln.ide
.vs
.build/
/.idea/.idea.CAP
/.idea
Properties
/pack.bat
.vscode/*
site/
*.lock


================================================
FILE: CAP.sln
================================================

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31919.166
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9B2AE124-6636-4DE9-83A3-70360DABD0C4}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{C09CDAB0-6DD4-46E9-B7F3-3EF2A4741EA0}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{57A8A8E5-5715-41BF-A0A6-46B819933FBC}"
	ProjectSection(SolutionItems) = preProject
		.flubu = .flubu
		.gitignore = .gitignore
		appveyor.yml = appveyor.yml
		.github\workflows\deploy-docs-and-dashboard.yml = .github\workflows\deploy-docs-and-dashboard.yml
		.github\ISSUE_TEMPLATE = .github\ISSUE_TEMPLATE
		LICENSE.txt = LICENSE.txt
		README.md = README.md
		README.zh-cn.md = README.zh-cn.md
	EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP", "src\DotNetCore.CAP\DotNetCore.CAP.csproj", "{E8AF8611-0EA4-4B19-BC48-87C57A87DC66}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{3A6B6931-A123-477A-9469-8B468B5385AF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.Kafka", "src\DotNetCore.CAP.Kafka\DotNetCore.CAP.Kafka.csproj", "{C42CDE33-0878-4BA0-96F2-4CB7C8FDEAAD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.RabbitMQ", "src\DotNetCore.CAP.RabbitMQ\DotNetCore.CAP.RabbitMQ.csproj", "{9961B80E-0718-4280-B2A0-271B003DE26B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{10C0818D-9160-4B80-BB86-DDE925B64D43}"
	ProjectSection(SolutionItems) = preProject
		src\Directory.Build.props = src\Directory.Build.props
		build\version.props = build\version.props
	EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.SqlServer", "src\DotNetCore.CAP.SqlServer\DotNetCore.CAP.SqlServer.csproj", "{3B577468-6792-4EF1-9237-15180B176A24}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.MySql", "src\DotNetCore.CAP.MySql\DotNetCore.CAP.MySql.csproj", "{FA15685A-778A-4D2A-A2FE-27FAD2FFA65B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.MySql.Test", "test\DotNetCore.CAP.MySql.Test\DotNetCore.CAP.MySql.Test.csproj", "{80A84F62-1558-427B-BA74-B47AA8A665B5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.RabbitMQ.MySql", "samples\Sample.RabbitMQ.MySql\Sample.RabbitMQ.MySql.csproj", "{9F3F9BFE-7B6A-4A7A-A6E6-8B517D611873}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.PostgreSql", "src\DotNetCore.CAP.PostgreSql\DotNetCore.CAP.PostgreSql.csproj", "{82C403AB-ED68-4084-9A1D-11334F9F08F9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.MongoDB", "src\DotNetCore.CAP.MongoDB\DotNetCore.CAP.MongoDB.csproj", "{77C0AC02-C44B-49D5-B969-7D5305FC20A5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.RabbitMQ.MongoDB", "samples\Sample.RabbitMQ.MongoDB\Sample.RabbitMQ.MongoDB.csproj", "{4473DE19-E8D2-4B57-80A8-C8AAA2BFA20F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.AzureServiceBus", "src\DotNetCore.CAP.AzureServiceBus\DotNetCore.CAP.AzureServiceBus.csproj", "{63B2A464-FBEA-42FB-8EFA-98AFA39FC920}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.Dashboard", "src\DotNetCore.CAP.Dashboard\DotNetCore.CAP.Dashboard.csproj", "{56FB261C-67AF-4715-9A46-4FA4FAB91B2C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.RabbitMQ.SqlServer", "samples\Sample.RabbitMQ.SqlServer\Sample.RabbitMQ.SqlServer.csproj", "{F6C5C676-AF05-46D5-A45D-442137B31898}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Kafka.PostgreSql", "samples\Sample.Kafka.PostgreSql\Sample.Kafka.PostgreSql.csproj", "{F1EF1D26-8A6B-403E-85B0-250DF44A4A7C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuildScript", "build\BuildScript.csproj", "{F8EF381A-FE83-40B3-A63D-09D83851B0FB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.InMemoryStorage", "src\DotNetCore.CAP.InMemoryStorage\DotNetCore.CAP.InMemoryStorage.csproj", "{93176BAE-914B-4BED-9DE3-01FFB4F27FC5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.Test", "test\DotNetCore.CAP.Test\DotNetCore.CAP.Test.csproj", "{75CC45E6-BF06-40F4-977D-10DCC05B2EFA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.ConsoleApp", "samples\Sample.ConsoleApp\Sample.ConsoleApp.csproj", "{2B0F467E-ABBD-4A51-BF38-D4F609DB6266}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.AmazonSQS", "src\DotNetCore.CAP.AmazonSQS\DotNetCore.CAP.AmazonSQS.csproj", "{43475E00-51B7-443D-BC2D-FC21F9D8A0B4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.AmazonSQS.InMemory", "samples\Sample.AmazonSQS.InMemory\Sample.AmazonSQS.InMemory.csproj", "{B187DD15-092D-4B72-9807-50856607D237}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.NATS", "src\DotNetCore.CAP.NATS\DotNetCore.CAP.NATS.csproj", "{8B2FD3EA-E72B-4A82-B182-B87EC0C15D07}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.Redis.SqlServer", "samples\Samples.Redis.SqlServer\Samples.Redis.SqlServer.csproj", "{375AF85D-8C81-47C6-BE5B-D0874D4971EA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.RedisStreams", "src\DotNetCore.CAP.RedisStreams\DotNetCore.CAP.RedisStreams.csproj", "{54458B54-49CC-454C-82B2-4AED681D9D07}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Dashboard.Auth", "samples\Sample.Dashboard.Auth\Sample.Dashboard.Auth.csproj", "{6E059983-DE89-4D53-88F5-D9083BCE257F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.MultiModuleSubscriberTests", "test\DotNetCore.CAP.MultiModuleSubscriberTests\DotNetCore.CAP.MultiModuleSubscriberTests.csproj", "{23684403-7DA8-489A-8A1E-8056D7683E18}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.Pulsar", "src\DotNetCore.CAP.Pulsar\DotNetCore.CAP.Pulsar.csproj", "{AB7A10CB-2C7E-49CE-AA21-893772FF6546}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Pulsar.InMemory", "samples\Sample.Pulsar.InMemory\Sample.Pulsar.InMemory.csproj", "{B1D95CCD-0123-41D4-8CCB-9F834ED8D5C5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.OpenTelemetry", "src\DotNetCore.CAP.OpenTelemetry\DotNetCore.CAP.OpenTelemetry.csproj", "{83DDB126-A00B-4064-86E7-568322CA67EC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.AzureServiceBus.InMemory", "samples\Sample.AzureServiceBus.InMemory\Sample.AzureServiceBus.InMemory.csproj", "{0C734FB2-7D75-4FF3-B564-1E50E6280B14}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.AzureServiceBus.Test", "test\DotNetCore.CAP.AzureServiceBus.Test\DotNetCore.CAP.AzureServiceBus.Test.csproj", "{D9681967-DAC2-43EF-999F-3727F1046711}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Dashboard.Jwt", "samples\Sample.Dashboard.Jwt\Sample.Dashboard.Jwt.csproj", "{F739A8C9-565F-4B1D-8F91-FEE056C03FBD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.CAP.Dashboard.K8s", "src\DotNetCore.CAP.Dashboard.K8s\DotNetCore.CAP.Dashboard.K8s.csproj", "{48655118-CEC3-4BD9-B510-64C1195C2729}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{E8AF8611-0EA4-4B19-BC48-87C57A87DC66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{E8AF8611-0EA4-4B19-BC48-87C57A87DC66}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{E8AF8611-0EA4-4B19-BC48-87C57A87DC66}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{E8AF8611-0EA4-4B19-BC48-87C57A87DC66}.Release|Any CPU.Build.0 = Release|Any CPU
		{C42CDE33-0878-4BA0-96F2-4CB7C8FDEAAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{C42CDE33-0878-4BA0-96F2-4CB7C8FDEAAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{C42CDE33-0878-4BA0-96F2-4CB7C8FDEAAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{C42CDE33-0878-4BA0-96F2-4CB7C8FDEAAD}.Release|Any CPU.Build.0 = Release|Any CPU
		{9961B80E-0718-4280-B2A0-271B003DE26B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{9961B80E-0718-4280-B2A0-271B003DE26B}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{9961B80E-0718-4280-B2A0-271B003DE26B}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{9961B80E-0718-4280-B2A0-271B003DE26B}.Release|Any CPU.Build.0 = Release|Any CPU
		{3B577468-6792-4EF1-9237-15180B176A24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{3B577468-6792-4EF1-9237-15180B176A24}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{3B577468-6792-4EF1-9237-15180B176A24}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{3B577468-6792-4EF1-9237-15180B176A24}.Release|Any CPU.Build.0 = Release|Any CPU
		{FA15685A-778A-4D2A-A2FE-27FAD2FFA65B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{FA15685A-778A-4D2A-A2FE-27FAD2FFA65B}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{FA15685A-778A-4D2A-A2FE-27FAD2FFA65B}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{FA15685A-778A-4D2A-A2FE-27FAD2FFA65B}.Release|Any CPU.Build.0 = Release|Any CPU
		{80A84F62-1558-427B-BA74-B47AA8A665B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{80A84F62-1558-427B-BA74-B47AA8A665B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{80A84F62-1558-427B-BA74-B47AA8A665B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{80A84F62-1558-427B-BA74-B47AA8A665B5}.Release|Any CPU.Build.0 = Release|Any CPU
		{9F3F9BFE-7B6A-4A7A-A6E6-8B517D611873}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{9F3F9BFE-7B6A-4A7A-A6E6-8B517D611873}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{9F3F9BFE-7B6A-4A7A-A6E6-8B517D611873}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{9F3F9BFE-7B6A-4A7A-A6E6-8B517D611873}.Release|Any CPU.Build.0 = Release|Any CPU
		{82C403AB-ED68-4084-9A1D-11334F9F08F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{82C403AB-ED68-4084-9A1D-11334F9F08F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{82C403AB-ED68-4084-9A1D-11334F9F08F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{82C403AB-ED68-4084-9A1D-11334F9F08F9}.Release|Any CPU.Build.0 = Release|Any CPU
		{77C0AC02-C44B-49D5-B969-7D5305FC20A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{77C0AC02-C44B-49D5-B969-7D5305FC20A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{77C0AC02-C44B-49D5-B969-7D5305FC20A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{77C0AC02-C44B-49D5-B969-7D5305FC20A5}.Release|Any CPU.Build.0 = Release|Any CPU
		{4473DE19-E8D2-4B57-80A8-C8AAA2BFA20F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{4473DE19-E8D2-4B57-80A8-C8AAA2BFA20F}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{4473DE19-E8D2-4B57-80A8-C8AAA2BFA20F}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{4473DE19-E8D2-4B57-80A8-C8AAA2BFA20F}.Release|Any CPU.Build.0 = Release|Any CPU
		{63B2A464-FBEA-42FB-8EFA-98AFA39FC920}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{63B2A464-FBEA-42FB-8EFA-98AFA39FC920}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{63B2A464-FBEA-42FB-8EFA-98AFA39FC920}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{63B2A464-FBEA-42FB-8EFA-98AFA39FC920}.Release|Any CPU.Build.0 = Release|Any CPU
		{56FB261C-67AF-4715-9A46-4FA4FAB91B2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{56FB261C-67AF-4715-9A46-4FA4FAB91B2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{56FB261C-67AF-4715-9A46-4FA4FAB91B2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{56FB261C-67AF-4715-9A46-4FA4FAB91B2C}.Release|Any CPU.Build.0 = Release|Any CPU
		{F6C5C676-AF05-46D5-A45D-442137B31898}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{F6C5C676-AF05-46D5-A45D-442137B31898}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{F6C5C676-AF05-46D5-A45D-442137B31898}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{F6C5C676-AF05-46D5-A45D-442137B31898}.Release|Any CPU.Build.0 = Release|Any CPU
		{F1EF1D26-8A6B-403E-85B0-250DF44A4A7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{F1EF1D26-8A6B-403E-85B0-250DF44A4A7C}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{F1EF1D26-8A6B-403E-85B0-250DF44A4A7C}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{F1EF1D26-8A6B-403E-85B0-250DF44A4A7C}.Release|Any CPU.Build.0 = Release|Any CPU
		{F8EF381A-FE83-40B3-A63D-09D83851B0FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{F8EF381A-FE83-40B3-A63D-09D83851B0FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{F8EF381A-FE83-40B3-A63D-09D83851B0FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{F8EF381A-FE83-40B3-A63D-09D83851B0FB}.Release|Any CPU.Build.0 = Release|Any CPU
		{93176BAE-914B-4BED-9DE3-01FFB4F27FC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{93176BAE-914B-4BED-9DE3-01FFB4F27FC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{93176BAE-914B-4BED-9DE3-01FFB4F27FC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{93176BAE-914B-4BED-9DE3-01FFB4F27FC5}.Release|Any CPU.Build.0 = Release|Any CPU
		{75CC45E6-BF06-40F4-977D-10DCC05B2EFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{75CC45E6-BF06-40F4-977D-10DCC05B2EFA}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{75CC45E6-BF06-40F4-977D-10DCC05B2EFA}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{75CC45E6-BF06-40F4-977D-10DCC05B2EFA}.Release|Any CPU.Build.0 = Release|Any CPU
		{2B0F467E-ABBD-4A51-BF38-D4F609DB6266}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{2B0F467E-ABBD-4A51-BF38-D4F609DB6266}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{2B0F467E-ABBD-4A51-BF38-D4F609DB6266}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{2B0F467E-ABBD-4A51-BF38-D4F609DB6266}.Release|Any CPU.Build.0 = Release|Any CPU
		{43475E00-51B7-443D-BC2D-FC21F9D8A0B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{43475E00-51B7-443D-BC2D-FC21F9D8A0B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{43475E00-51B7-443D-BC2D-FC21F9D8A0B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{43475E00-51B7-443D-BC2D-FC21F9D8A0B4}.Release|Any CPU.Build.0 = Release|Any CPU
		{B187DD15-092D-4B72-9807-50856607D237}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{B187DD15-092D-4B72-9807-50856607D237}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{B187DD15-092D-4B72-9807-50856607D237}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{B187DD15-092D-4B72-9807-50856607D237}.Release|Any CPU.Build.0 = Release|Any CPU
		{8B2FD3EA-E72B-4A82-B182-B87EC0C15D07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{8B2FD3EA-E72B-4A82-B182-B87EC0C15D07}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{8B2FD3EA-E72B-4A82-B182-B87EC0C15D07}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{8B2FD3EA-E72B-4A82-B182-B87EC0C15D07}.Release|Any CPU.Build.0 = Release|Any CPU
		{375AF85D-8C81-47C6-BE5B-D0874D4971EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{375AF85D-8C81-47C6-BE5B-D0874D4971EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{375AF85D-8C81-47C6-BE5B-D0874D4971EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{375AF85D-8C81-47C6-BE5B-D0874D4971EA}.Release|Any CPU.Build.0 = Release|Any CPU
		{54458B54-49CC-454C-82B2-4AED681D9D07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{54458B54-49CC-454C-82B2-4AED681D9D07}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{54458B54-49CC-454C-82B2-4AED681D9D07}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{54458B54-49CC-454C-82B2-4AED681D9D07}.Release|Any CPU.Build.0 = Release|Any CPU
		{6E059983-DE89-4D53-88F5-D9083BCE257F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{6E059983-DE89-4D53-88F5-D9083BCE257F}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{6E059983-DE89-4D53-88F5-D9083BCE257F}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{6E059983-DE89-4D53-88F5-D9083BCE257F}.Release|Any CPU.Build.0 = Release|Any CPU
		{23684403-7DA8-489A-8A1E-8056D7683E18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{23684403-7DA8-489A-8A1E-8056D7683E18}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{23684403-7DA8-489A-8A1E-8056D7683E18}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{23684403-7DA8-489A-8A1E-8056D7683E18}.Release|Any CPU.Build.0 = Release|Any CPU
		{AB7A10CB-2C7E-49CE-AA21-893772FF6546}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{AB7A10CB-2C7E-49CE-AA21-893772FF6546}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{AB7A10CB-2C7E-49CE-AA21-893772FF6546}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{AB7A10CB-2C7E-49CE-AA21-893772FF6546}.Release|Any CPU.Build.0 = Release|Any CPU
		{B1D95CCD-0123-41D4-8CCB-9F834ED8D5C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{B1D95CCD-0123-41D4-8CCB-9F834ED8D5C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{B1D95CCD-0123-41D4-8CCB-9F834ED8D5C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{B1D95CCD-0123-41D4-8CCB-9F834ED8D5C5}.Release|Any CPU.Build.0 = Release|Any CPU
		{83DDB126-A00B-4064-86E7-568322CA67EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{83DDB126-A00B-4064-86E7-568322CA67EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{83DDB126-A00B-4064-86E7-568322CA67EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{83DDB126-A00B-4064-86E7-568322CA67EC}.Release|Any CPU.Build.0 = Release|Any CPU
		{0C734FB2-7D75-4FF3-B564-1E50E6280B14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{0C734FB2-7D75-4FF3-B564-1E50E6280B14}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{0C734FB2-7D75-4FF3-B564-1E50E6280B14}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{0C734FB2-7D75-4FF3-B564-1E50E6280B14}.Release|Any CPU.Build.0 = Release|Any CPU
		{D9681967-DAC2-43EF-999F-3727F1046711}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{D9681967-DAC2-43EF-999F-3727F1046711}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{D9681967-DAC2-43EF-999F-3727F1046711}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{D9681967-DAC2-43EF-999F-3727F1046711}.Release|Any CPU.Build.0 = Release|Any CPU
		{F739A8C9-565F-4B1D-8F91-FEE056C03FBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{F739A8C9-565F-4B1D-8F91-FEE056C03FBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{F739A8C9-565F-4B1D-8F91-FEE056C03FBD}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{F739A8C9-565F-4B1D-8F91-FEE056C03FBD}.Release|Any CPU.Build.0 = Release|Any CPU
		{48655118-CEC3-4BD9-B510-64C1195C2729}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{48655118-CEC3-4BD9-B510-64C1195C2729}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{48655118-CEC3-4BD9-B510-64C1195C2729}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{48655118-CEC3-4BD9-B510-64C1195C2729}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(NestedProjects) = preSolution
		{E8AF8611-0EA4-4B19-BC48-87C57A87DC66} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{C42CDE33-0878-4BA0-96F2-4CB7C8FDEAAD} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{9961B80E-0718-4280-B2A0-271B003DE26B} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{3B577468-6792-4EF1-9237-15180B176A24} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{FA15685A-778A-4D2A-A2FE-27FAD2FFA65B} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{80A84F62-1558-427B-BA74-B47AA8A665B5} = {C09CDAB0-6DD4-46E9-B7F3-3EF2A4741EA0}
		{9F3F9BFE-7B6A-4A7A-A6E6-8B517D611873} = {3A6B6931-A123-477A-9469-8B468B5385AF}
		{82C403AB-ED68-4084-9A1D-11334F9F08F9} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{77C0AC02-C44B-49D5-B969-7D5305FC20A5} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{4473DE19-E8D2-4B57-80A8-C8AAA2BFA20F} = {3A6B6931-A123-477A-9469-8B468B5385AF}
		{63B2A464-FBEA-42FB-8EFA-98AFA39FC920} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{56FB261C-67AF-4715-9A46-4FA4FAB91B2C} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{F6C5C676-AF05-46D5-A45D-442137B31898} = {3A6B6931-A123-477A-9469-8B468B5385AF}
		{F1EF1D26-8A6B-403E-85B0-250DF44A4A7C} = {3A6B6931-A123-477A-9469-8B468B5385AF}
		{F8EF381A-FE83-40B3-A63D-09D83851B0FB} = {10C0818D-9160-4B80-BB86-DDE925B64D43}
		{93176BAE-914B-4BED-9DE3-01FFB4F27FC5} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{75CC45E6-BF06-40F4-977D-10DCC05B2EFA} = {C09CDAB0-6DD4-46E9-B7F3-3EF2A4741EA0}
		{2B0F467E-ABBD-4A51-BF38-D4F609DB6266} = {3A6B6931-A123-477A-9469-8B468B5385AF}
		{43475E00-51B7-443D-BC2D-FC21F9D8A0B4} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{B187DD15-092D-4B72-9807-50856607D237} = {3A6B6931-A123-477A-9469-8B468B5385AF}
		{8B2FD3EA-E72B-4A82-B182-B87EC0C15D07} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{375AF85D-8C81-47C6-BE5B-D0874D4971EA} = {3A6B6931-A123-477A-9469-8B468B5385AF}
		{54458B54-49CC-454C-82B2-4AED681D9D07} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{6E059983-DE89-4D53-88F5-D9083BCE257F} = {3A6B6931-A123-477A-9469-8B468B5385AF}
		{23684403-7DA8-489A-8A1E-8056D7683E18} = {C09CDAB0-6DD4-46E9-B7F3-3EF2A4741EA0}
		{AB7A10CB-2C7E-49CE-AA21-893772FF6546} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{B1D95CCD-0123-41D4-8CCB-9F834ED8D5C5} = {3A6B6931-A123-477A-9469-8B468B5385AF}
		{83DDB126-A00B-4064-86E7-568322CA67EC} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
		{0C734FB2-7D75-4FF3-B564-1E50E6280B14} = {3A6B6931-A123-477A-9469-8B468B5385AF}
		{D9681967-DAC2-43EF-999F-3727F1046711} = {C09CDAB0-6DD4-46E9-B7F3-3EF2A4741EA0}
		{F739A8C9-565F-4B1D-8F91-FEE056C03FBD} = {3A6B6931-A123-477A-9469-8B468B5385AF}
		{48655118-CEC3-4BD9-B510-64C1195C2729} = {9B2AE124-6636-4DE9-83A3-70360DABD0C4}
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {2E70565D-94CF-40B4-BFE1-AC18D5F736AB}
	EndGlobalSection
EndGlobal


================================================
FILE: CAP.sln.DotSettings
================================================
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DB/@EntryIndexedValue">DB</s:String>
	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NATS/@EntryIndexedValue">NATS</s:String>
	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SNS/@EntryIndexedValue">SNS</s:String>
	<s:Boolean x:Key="/Default/UserDictionary/Words/=Mongo/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/UserDictionary/Words/=NATS/@EntryIndexedValue">True</s:Boolean>
	<s:Boolean x:Key="/Default/UserDictionary/Words/=Postgre/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

================================================
FILE: LICENSE.txt
================================================
MIT License

Copyright (c) 2016 Savorboard

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
<p align="center">
  <img height="140" src="https://raw.githubusercontent.com/dotnetcore/CAP/master/docs/content/img/logo.svg" alt="CAP Logo">
</p>

# CAP                     [中文](https://github.com/dotnetcore/CAP/blob/master/README.zh-cn.md)

[![Docs & Dashboard](https://github.com/dotnetcore/CAP/actions/workflows/deploy-docs-and-dashboard.yml/badge.svg?branch=master)](https://github.com/dotnetcore/CAP/actions/workflows/deploy-docs-and-dashboard.yml)
[![AppVeyor](https://ci.appveyor.com/api/projects/status/v8gfh6pe2u2laqoa/branch/master?svg=true)](https://ci.appveyor.com/project/yang-xiaodong/cap/branch/master)
[![NuGet](https://img.shields.io/nuget/v/DotNetCore.CAP.svg)](https://www.nuget.org/packages/DotNetCore.CAP/)
[![NuGet Preview](https://img.shields.io/nuget/vpre/DotNetCore.CAP.svg?label=nuget-pre)](https://www.nuget.org/packages/DotNetCore.CAP/)
[![Member project of .NET Core Community](https://img.shields.io/badge/member%20project%20of-NCC-9e20c9.svg)](https://github.com/dotnetcore)
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/dotnetcore/CAP/master/LICENSE.txt)

CAP is a .NET library that provides a lightweight, easy-to-use, and efficient solution for distributed transactions and event bus integration.

When building SOA or Microservice-based systems, services often need to be integrated via events. However, simply using a message queue cannot guarantee reliability. CAP leverages a local message table, integrated with your current database, to solve exceptions that can occur during distributed system communications. This ensures that event messages are never lost.

You can also use CAP as a standalone EventBus. It offers a simplified approach to event publishing and subscribing without requiring you to inherit or implement any specific interfaces.

## Key Features

*   **Core Functionality**
    *   **Distributed Transactions**: Guarantees data consistency across microservices using a local message table (Outbox Pattern).
    *   **Event Bus**: High-performance, lightweight event bus for decoupled communication.
    *   **Guaranteed Delivery**: Ensures messages are never lost, with automatic retries for failed messages.

*   **Advanced Messaging**
    *   **Delayed Messages**: Native support for publishing messages with a delay, without relying on message queue features.
    *   **Flexible Subscriptions**: Supports attribute-based, wildcard (`*`, `#`), and partial topic subscriptions.
    *   **Consumer Groups & Fan-Out**: Easily implement competing consumer or fan-out patterns for load balancing or broadcasting.
    *   **Parallel & Serial Processing**: Configure consumers for high-throughput parallel processing or ordered sequential execution.
    *   **Backpressure Mechanism**: Automatically manages processing speed to prevent memory overload (OOM) under high load.

*   **Extensibility & Integration**
    *   **Pluggable Architecture**: Supports a wide range of message queues (RabbitMQ, Kafka, Azure Service Bus, etc.) and databases (SQL Server, PostgreSQL, MongoDB, etc.).
    *   **Heterogeneous Systems**: Provides mechanisms to integrate with non-CAP or legacy systems.
    *   **Customizable Filters & Serialization**: Intercept the processing pipeline with custom filters and support various serialization formats.

*   **Monitoring & Observability**
    *   **Real-time Dashboard**: A built-in web dashboard to monitor messages, view status, and manually retry.
    *   **Service Discovery**: Integrates with Consul and Kubernetes for node discovery in a distributed environment.
    *   **OpenTelemetry Support**: Built-in instrumentation for distributed tracing, providing end-to-end visibility.

## Architecture Overview

![CAP Architecture](https://raw.githubusercontent.com/dotnetcore/CAP/master/docs/content/img/architecture-new.png)

> CAP implements the **Outbox Pattern** as described in the [eShop on .NET ebook](https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/multi-container-microservice-net-applications/subscribe-events#designing-atomicity-and-resiliency-when-publishing-to-the-event-bus).

## Getting Started

### 1. Installation

Install the main CAP package into your project using NuGet.

```shell
PM> Install-Package DotNetCore.CAP
```

Next, install the desired transport and storage providers.

**Transports (Message Queues):**

```shell
PM> Install-Package DotNetCore.CAP.Kafka
PM> Install-Package DotNetCore.CAP.RabbitMQ
PM> Install-Package DotNetCore.CAP.AzureServiceBus
PM> Install-Package DotNetCore.CAP.AmazonSQS
PM> Install-Package DotNetCore.CAP.NATS
PM> Install-Package DotNetCore.CAP.RedisStreams
PM> Install-Package DotNetCore.CAP.Pulsar
```

**Storage (Databases):**

The event log table will be integrated into the database you select.

```shell
PM> Install-Package DotNetCore.CAP.SqlServer
PM> Install-Package DotNetCore.CAP.MySql
PM> Install-Package DotNetCore.CAP.PostgreSql
PM> Install-Package DotNetCore.CAP.MongoDB     // Requires MongoDB 4.0+ cluster
```

### 2. Configuration

Configure CAP in your `Startup.cs` or `Program.cs`.

```csharp
public void ConfigureServices(IServiceCollection services)
{
    // If you are using EF as the ORM
    services.AddDbContext<AppDbContext>(); 
    
    // If you are using MongoDB
    services.AddSingleton<IMongoClient>(new MongoClient("..."));

    services.AddCap(x =>
    {
        // Using Entity Framework
        // CAP can auto-discover the connection string
        x.UseEntityFramework<AppDbContext>();

        // Using ADO.NET
        x.UseSqlServer("Your ConnectionString");
        x.UseMySql("Your ConnectionString");
        x.UsePostgreSql("Your ConnectionString");

        // Using MongoDB (requires a 4.0+ cluster)
        x.UseMongoDB("Your ConnectionString");

        // Choose your message transport
        x.UseRabbitMQ("HostName");
        x.UseKafka("ConnectionString");
        x.UseAzureServiceBus("ConnectionString");
        x.UseAmazonSQS(options => { /* ... */ });
        x.UseNATS("ConnectionString");
        x.UsePulsar("ConnectionString");
        x.UseRedisStreams("ConnectionString");
    });
}
```

### 3. Publish Messages

Inject `ICapPublisher` into your controller or service to publish events. As of version 7.0, you can also publish delayed messages.

```csharp
public class PublishController : Controller
{
    private readonly ICapPublisher _capBus;

    public PublishController(ICapPublisher capPublisher)
    {
        _capBus = capPublisher;
    }

    [Route("~/adonet/transaction")]
    public IActionResult AdonetWithTransaction()
    {
        using (var connection = new MySqlConnection(ConnectionString))
        {
            // Start a transaction with auto-commit enabled
            using (var transaction = connection.BeginTransaction(_capBus, autoCommit: true))
            {
                // Your business logic...
                _capBus.Publish("xxx.services.show.time", DateTime.Now);
            }
        }
        return Ok();
    }

    [Route("~/ef/transaction")]
    public IActionResult EntityFrameworkWithTransaction([FromServices] AppDbContext dbContext)
    {
        using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: true))
        {
            // Your business logic...
            _capBus.Publish("xxx.services.show.time", DateTime.Now);
        }
        return Ok();
    }

    [Route("~/publish/delay")]
    public async Task<IActionResult> PublishWithDelay()
    {
        // Publish a message with a 30-second delay
        await _capBus.PublishDelayAsync(TimeSpan.FromSeconds(30), "xxx.services.show.time", DateTime.Now);
        return Ok();
    }
}
```

### 4. Subscribe to Messages

#### In a Controller Action

Add the `[CapSubscribe]` attribute to a controller action to subscribe to a topic.

```csharp
public class SubscriptionController : Controller
{
    [CapSubscribe("xxx.services.show.time")]
    public void CheckReceivedMessage(DateTime messageTime)
    {
        Console.WriteLine($"Message received: {messageTime}");
    }
}
```

#### In a Business Logic Service

If your subscriber is not in a controller, the class must implement the `ICapSubscribe` interface.

```csharp
namespace BusinessCode.Service
{
    public interface ISubscriberService
    {
        void CheckReceivedMessage(DateTime datetime);
    }

    public class SubscriberService : ISubscriberService, ICapSubscribe
    {
        [CapSubscribe("xxx.services.show.time")]
        public void CheckReceivedMessage(DateTime datetime)
        {
            // Handle the message
        }
    }
}
```

Remember to register your service in `Startup.cs`:

```csharp
public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<ISubscriberService, SubscriberService>();

    services.AddCap(x =>
    {
        // ...
    });
}
```

#### Asynchronous Subscriptions

For async operations, your subscription method should return a `Task` and can accept a `CancellationToken`.

```csharp
public class AsyncSubscriber : ICapSubscribe
{
    [CapSubscribe("topic.name")]
    public async Task ProcessAsync(Message message, CancellationToken cancellationToken)
    {
        await SomeOperationAsync(message, cancellationToken);
    }
}
```

#### Partial Topic Subscriptions

Group topic subscriptions by defining a partial topic on the class level. The final topic will be a combination of the class-level and method-level topics. In this example, the `Create` method subscribes to `customers.create`.

```csharp
[CapSubscribe("customers")]
public class CustomersSubscriberService : ICapSubscribe
{
    [CapSubscribe("create", isPartial: true)]
    public void Create(Customer customer)
    {
        // ...
    }
}
```

#### Subscription Groups

Subscription groups are similar to consumer groups in Kafka. They allow you to load-balance message processing across multiple instances of a service.

By default, CAP uses the assembly name as the group name. If multiple subscribers in the same group subscribe to the same topic, only one will receive the message (competing consumers). If they are in different groups, all will receive the message (fan-out).

You can specify a group directly in the attribute:

```csharp
[CapSubscribe("xxx.services.show.time", Group = "group1")]
public void ShowTime1(DateTime datetime)
{
    // ...
}

[CapSubscribe("xxx.services.show.time", Group = "group2")]
public void ShowTime2(DateTime datetime)
{
    // ...
}
```

You can also set a default group name in the configuration:

```csharp
services.AddCap(x =>
{
    x.DefaultGroup = "my-default-group";  
});
```

### Azure Service Bus Emulator Support

The [Azure Service Bus Emulator](https://learn.microsoft.com/en-us/azure/service-bus-messaging/overview-emulator) uses separate ports for AMQP messaging (5672) and the HTTP Admin API (5300). Because CAP uses a single connection string for both the `ServiceBusClient` (AMQP) and the `ServiceBusAdministrationClient` (HTTP), it cannot target both ports simultaneously.

To work around this, set `AutoProvision` to `false` to skip automatic creation of topics, subscriptions, and rules via the Admin API. You must pre-create the required entities in the emulator's configuration instead.

```csharp
services.AddCap(x =>
{
    x.UseAzureServiceBus(opt =>
    {
        opt.ConnectionString = "Endpoint=sb://localhost;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;";
        opt.AutoProvision = false;
    });
});
```

> **Note:** When `AutoProvision` is `false`, topics, subscriptions, and subscription filter rules must already exist before the application starts. This option is also useful when entities are managed externally (e.g., via Infrastructure as Code).

## Dashboard

CAP provides a real-time dashboard to view sent and received messages and their status.

```shell
PM> Install-Package DotNetCore.CAP.Dashboard
```

The dashboard is accessible by default at `http://localhost:xxx/cap`. You can customize the path via options: `x.UseDashboard(opt => { opt.PathMatch = "/my-cap"; });`.

For distributed environments, the dashboard supports service discovery to view data from all nodes.
- **Consul:** [View Consul config docs](https://cap.dotnetcore.xyz/user-guide/en/monitoring/consul/)
- **Kubernetes:** Use the `DotNetCore.CAP.Dashboard.K8s` package. [View Kubernetes config docs](https://cap.dotnetcore.xyz/user-guide/en/monitoring/kubernetes/)

## Contribute

We welcome contributions! Participating in discussions, reporting issues, and submitting pull requests are all great ways to help. Please read our [contributing guidelines](CONTRIBUTING.md) (we can create this file if it doesn't exist) to get started.

### License

CAP is licensed under the [MIT License](https://github.com/dotnetcore/CAP/blob/master/LICENSE.txt).

================================================
FILE: README.zh-cn.md
================================================
<p align="center">
  <img height="140" src="https://raw.githubusercontent.com/dotnetcore/CAP/master/docs/content/img/logo.svg">
</p>

# CAP                     [English](https://github.com/dotnetcore/CAP/blob/master/README.md)
[![Docs&Dashboard](https://github.com/dotnetcore/CAP/actions/workflows/deploy-docs-and-dashboard.yml/badge.svg?branch=master)](https://github.com/dotnetcore/CAP/actions/workflows/deploy-docs-and-dashboard.yml)
[![AppVeyor](https://ci.appveyor.com/api/projects/status/v8gfh6pe2u2laqoa?svg=true)](https://ci.appveyor.com/project/yang-xiaodong/cap)
[![NuGet](https://img.shields.io/nuget/v/DotNetCore.CAP.svg)](https://www.nuget.org/packages/DotNetCore.CAP/)
[![NuGet Preview](https://img.shields.io/nuget/vpre/DotNetCore.CAP.svg?label=nuget-pre)](https://www.nuget.org/packages/DotNetCore.CAP/)
[![Member project of .NET Core Community](https://img.shields.io/badge/member%20project%20of-NCC-9e20c9.svg)](https://github.com/dotnetcore)
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/dotnetcore/CAP/master/LICENSE.txt)

CAP 是一个基于 .NET Standard 的 C# 库,它是一种处理分布式事务的解决方案,同样具有 EventBus 的功能,它具有轻量级、易使用、高性能等特点。

你可以在这里 [CAP docs](http://cap.dotnetcore.xyz) 看到更多详细资料。

你可以在这里看到 [CAP 视频教程](https://www.cnblogs.com/savorboard/p/cap-video-1.html),学习如何在项目中集成CAP。

在我们构建 SOA 或者 微服务系统的过程中,我们通常需要使用事件来对各个服务进行集成,在这过程中简单的使用消息队列并不能保证数据的最终一致性,
CAP 采用的是和当前数据库集成的本地消息表的方案来解决在分布式系统互相调用的各个环节可能出现的异常,它能够保证任何情况下事件消息都是不会丢失的。

你同样可以把 CAP 当做 EventBus 来使用,CAP提供了一种更加简单的方式来实现事件消息的发布和订阅,在订阅以及发布的过程中,你不需要继承或实现任何接口。

这是 CAP 集在ASP.NET Core 微服务架构中的一个示意图:

## 架构预览

![architecture.png](https://raw.githubusercontent.com/dotnetcore/CAP/master/docs/content/img/architecture-new.png)

> CAP 实现了 [eShop 电子书](https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/multi-container-microservice-net-applications/subscribe-events#designing-atomicity-and-resiliency-when-publishing-to-the-event-bus) 中描述的发件箱模式

## Getting Started

### NuGet 

你可以运行以下下命令在你的项目中安装 CAP。

```
PM> Install-Package DotNetCore.CAP
```

CAP 支持主流的消息队列作为传输器,你可以按需选择下面的包进行安装:

```
PM> Install-Package DotNetCore.CAP.Kafka
PM> Install-Package DotNetCore.CAP.RabbitMQ
PM> Install-Package DotNetCore.CAP.AzureServiceBus
PM> Install-Package DotNetCore.CAP.AmazonSQS
PM> Install-Package DotNetCore.CAP.NATS
PM> Install-Package DotNetCore.CAP.RedisStreams
PM> Install-Package DotNetCore.CAP.Pulsar
```

CAP 提供了主流数据库作为存储,你可以按需选择下面的包进行安装:

```
// 按需选择安装你正在使用的数据库
PM> Install-Package DotNetCore.CAP.SqlServer
PM> Install-Package DotNetCore.CAP.MySql
PM> Install-Package DotNetCore.CAP.PostgreSql
PM> Install-Package DotNetCore.CAP.MongoDB
```

### Configuration

首先配置CAP到 Startup.cs 文件中,如下:

```c#
public void ConfigureServices(IServiceCollection services)
{
    ......

    services.AddDbContext<AppDbContext>();

    services.AddCap(x =>
    {
        //如果你使用的 EF 进行数据操作,你需要添加如下配置:
        x.UseEntityFramework<AppDbContext>();  //可选项,你不需要再次配置 x.UseSqlServer 了
		
        //如果你使用的ADO.NET,根据数据库选择进行配置:
        x.UseSqlServer("数据库连接字符串");
        x.UseMySql("数据库连接字符串");
        x.UsePostgreSql("数据库连接字符串");

        //如果你使用的 MongoDB,你可以添加如下配置:
        x.UseMongoDB("ConnectionStrings");  //注意,仅支持MongoDB 4.0+集群
	
        //CAP支持 RabbitMQ、Kafka、AzureServiceBus、AmazonSQS 等作为MQ,根据使用选择配置:
        x.UseRabbitMQ("ConnectionStrings");
        x.UseKafka("ConnectionStrings");
        x.UseAzureServiceBus("ConnectionStrings");
        x.UseAmazonSQS();
    });
}

```

### 发布

在 Controller 中注入 `ICapPublisher` 然后使用 `ICapPublisher` 进行消息发送。

> 版本 7.0+ 支持发送延迟消息。

```c#

public class PublishController : Controller
{
    private readonly ICapPublisher _capBus;

    public PublishController(ICapPublisher capPublisher)
    {
        _capBus = capPublisher;
    }
    
    //不使用事务
    [Route("~/without/transaction")]
    public IActionResult WithoutTransaction()
    {
        _capBus.Publish("xxx.services.show.time", DateTime.Now);

        // Publish delay message
        _capBus.PublishDelayAsync(TimeSpan.FromSeconds(delaySeconds), "xxx.services.show.time", DateTime.Now);
	
        return Ok();
    }

    //Ado.Net 中使用事务,自动提交
    [Route("~/adonet/transaction")]
    public IActionResult AdonetWithTransaction()
    {
        using (var connection = new MySqlConnection(ConnectionString))
        {
            using (var transaction = connection.BeginTransaction(_capBus, autoCommit: true))
            {
                //业务代码

                _capBus.Publish("xxx.services.show.time", DateTime.Now);
            }
        }
        return Ok();
    }

    //EntityFramework 中使用事务,自动提交
    [Route("~/ef/transaction")]
    public IActionResult EntityFrameworkWithTransaction([FromServices]AppDbContext dbContext)
    {
        using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: true))
        {
            //业务代码

            _capBus.Publish("xxx.services.show.time", DateTime.Now);
        }
        return Ok();
    }
}

```

### 订阅

**Action Method**

在 Action 上添加 CapSubscribeAttribute 来订阅相关消息。

```c#
public class PublishController : Controller
{
    [CapSubscribe("xxx.services.show.time")]
    public void CheckReceivedMessage(DateTime datetime)
    {
        Console.WriteLine(datetime);
    }
}

```

**Service Method**

如果你的订阅方法没有位于 Controller 中,则你订阅的类需要继承 `ICapSubscribe`:

```c#

namespace xxx.Service
{
    public interface ISubscriberService
    {
        void CheckReceivedMessage(DateTime datetime);
    }

    public class SubscriberService: ISubscriberService, ICapSubscribe
    {
        [CapSubscribe("xxx.services.show.time")]
        public void CheckReceivedMessage(DateTime datetime)
        {
        }
    }
}

```

然后在 Startup.cs 中的 `ConfigureServices()` 中注入你的  `ISubscriberService` 类

```c#
public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<ISubscriberService,SubscriberService>();
	
    services.AddCap(x=>{});
}
```

#### 异步订阅

你能够实现异步订阅。订阅方法应返回 `Task` 并接收 `CancellationToken` 作为参数。

```c#
public class AsyncSubscriber : ICapSubscribe
{
    [CapSubscribe("name")]
    public async Task ProcessAsync(Message message, CancellationToken cancellationToken)
    {
        await SomeOperationAsync(message, cancellationToken);
    }
}
```

#### 使用多部分订阅名

要在类级别对订阅的Topic进行分组,您可以将在方法上的订阅设置为部分订阅。 消息队列上的订阅将是类上定义的topic加上方法上定义的topic的拼合。 
在下面的示例中,当收到关于 `customers.create` 的消息时,将调用 `Create(..)` 函数

```c#
[CapSubscribe("customers")]
public class CustomersSubscriberService : ICapSubscribe
{
    [CapSubscribe("create", isPartial: true)]
    public void Create(Customer customer)
    {
    }
}
```

#### 订阅者组

订阅者组的概念类似于 Kafka 中的消费者组,它和消息队列中的广播模式相同,用来处理不同微服务实例之间同时消费相同的消息。

当CAP启动的时候,她将创建一个默认的消费者组,如果多个相同消费者组的消费者消费同一个Topic消息的时候,只会有一个消费者被执行。
相反,如果消费者都位于不同的消费者组,则所有的消费者都会被执行。

相同的实例中,你可以通过下面的方式来指定他们位于不同的消费者组。

```C#

[CapSubscribe("xxx.services.show.time", Group = "group1" )]
public void ShowTime1(DateTime datetime)
{
}

[CapSubscribe("xxx.services.show.time", Group = "group2")]
public void ShowTime2(DateTime datetime)
{
}

```

`ShowTime1` 和 `ShowTime2` 将被同时调用。

PS,你可以通过下面的方式来指定默认的消费者组名称:

```C#
services.AddCap(x =>
{
    x.DefaultGroup = "default-group-name";  
});

```

### Dashboard

CAP 同时提供了仪表盘(Dashboard)功能,你可以很方便的查看发出和接收到的消息。 除此之外,你还可以在仪表盘中实时查看发送或者接收到的消息。 

使用以下命令安装 Dashboard:

```
PM> Install-Package DotNetCore.CAP.Dashboard
```

在分布式环境中,仪表盘内置集成了 [Consul](http://consul.io) 作为节点的注册发现,同时实现了网关代理功能,你同样可以方便的查看本节点或者其他节点的数据,它就像你访问本地资源一样。

[查看 Consul 配置文档](https://cap.dotnetcore.xyz/user-guide/en/monitoring/consul)

如果你的服务部署在Kubernetes中,请使用我们为Kubernetes专门提供的发现包。

```
PM> Install-Package DotNetCore.CAP.Dashboard.K8s
```

[查看 Kubernetes 配置文档](https://cap.dotnetcore.xyz/user-guide/en/monitoring/kubernetes/)

仪表盘默认的访问地址是:[http://localhost:xxx/cap](http://localhost:xxx/cap),你可以在`d.MatchPath`配置项中修改`cap`路径后缀为其他的名字。

## 贡献

贡献的最简单的方法之一就是是参与讨论和讨论问题(issue)。你也可以通过提交的 Pull Request 代码变更作出贡献。

### License

MIT


================================================
FILE: appveyor.yml
================================================
version: '{build}'
os: Visual Studio 2022
environment:
  BUILDING_ON_PLATFORM: win
  BuildEnvironment: appveyor
  Cap_MySql_ConnectionString: Server=localhost;Database=cap_test;Uid=root;Pwd=Password12!;Allow User Variables=True;SslMode=Required
  DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
  DOTNET_NOLOGO: true
install:
  - ps: |
      Invoke-WebRequest -Uri 'https://dot.net/v1/dotnet-install.ps1' -UseBasicParsing -OutFile $env:TEMP\dotnet-install.ps1
      & $env:TEMP\dotnet-install.ps1 -Architecture x64 -Version '10.0.100' -InstallDir "$env:ProgramFiles\dotnet"
init:
  - ps: Start-Service MySQL80
before_build:
  - ps: |
      dotnet tool install --global FlubuCore.Tool --version 8.0.0
      # optional: expose tools path for this step if needed later
      $toolPath = Join-Path $env:USERPROFILE ".dotnet\tools"
      if (Test-Path $toolPath) { $env:PATH = "$toolPath;$env:PATH" }
build_script:
  - ps: flubu
test: off
artifacts:
  - path: artifacts/**
deploy:
  provider: NuGet
  on:
    appveyor_repo_tag: true
  api_key:
    secure: Q1wqF+LkkmABBflkQILr0cJidpEsD/ov1qoGrWGh9LdPZTZytIaxo+98mGndD/Ip
  skip_symbols: false
  artifact: '/artifacts\/.+\.s?nupkg/'


================================================
FILE: build/BuildScript.Util.cs
================================================
using System;

namespace BuildScript
{
    public partial class BuildScript
    {
        public string CreateStamp()
        {
            var seconds = (long)(DateTime.UtcNow - new DateTime(2017, 1, 1)).TotalSeconds;
            return seconds.ToString();
        }
    }
}


================================================
FILE: build/BuildScript.Version.cs
================================================
using System.IO;
using System.Xml;
using FlubuCore.Context;
using FlubuCore.Scripting.Attributes;

namespace BuildScript
{
    [Reference("System.Xml.XmlDocument, System.Xml, Version=4.0.0.0, Culture=neutral, publicKeyToken=b77a5c561934e089")]
    public partial class BuildScript
    {
        public BuildVersion FetchBuildVersion(ITaskContext context)
        {
            var content = File.ReadAllText(RootDirectory.CombineWith("build/version.props"));

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(content);

            var versionMajor = doc.DocumentElement!.SelectSingleNode("/Project/PropertyGroup/VersionMajor")!.InnerText;
            var versionMinor = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionMinor")!.InnerText;
            var versionPatch = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionPatch")!.InnerText;
            var versionQuality = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionQuality")!.InnerText;
            versionQuality = string.IsNullOrWhiteSpace(versionQuality) ? null : versionQuality;

            var suffix = versionQuality;

            var isCi = false;
            var isTagged = false;
            if (!context.BuildServers().IsLocalBuild)
            {
                isCi = true;
                var isTagAppveyor = context.BuildServers().AppVeyor().IsTag;
                if (context.BuildServers().RunningOn == BuildServerType.AppVeyor && isTagAppveyor ||
                    context.BuildServers().RunningOn == BuildServerType.TravisCI && string.IsNullOrWhiteSpace(context.BuildServers().Travis().TagName))
                {
                    isTagged = true;
                }
            }

            if (!isTagged)
            {
                suffix += (isCi ? "preview-" : "dv-") + CreateStamp();
            }

            suffix = string.IsNullOrWhiteSpace(suffix) ? null : suffix;

            var version = new BuildVersion
            {
                Major = int.Parse(versionMajor),
                Minor = int.Parse(versionMinor),
                Patch = int.Parse(versionPatch),
                Quality = versionQuality,
                Suffix = suffix
            };

            return version;
        }
    }
}


================================================
FILE: build/BuildScript.cs
================================================
using System.Collections.Generic;
using FlubuCore.Context;
using FlubuCore.Context.Attributes.BuildProperties;
using FlubuCore.IO;
using FlubuCore.Scripting;
using FlubuCore.Scripting.Attributes;

namespace BuildScript
{
    [Include("./build/BuildVersion.cs")]
    public partial class BuildScript : DefaultBuildScript
    {
        [FromArg("c|configuration")]
        [BuildConfiguration]
        public string Configuration { get; set; } = "Release";

        [SolutionFileName] public string SolutionFileName { get; set; } = "CAP.sln";

        protected BuildVersion BuildVersion { get; set; }

        protected string ArtifactsDir => RootDirectory.CombineWith("artifacts");
        
        protected List<FileFullPath> ProjectFiles { get; set; }

        protected List<FileFullPath> TestProjectFiles { get; set; }

        protected override void BeforeBuildExecution(ITaskContext context)
        {
            BuildVersion = FetchBuildVersion(context);
            TestProjectFiles = context.GetFiles(RootDirectory.CombineWith("test"), "*/*.csproj");
            ProjectFiles = context.GetFiles(RootDirectory.CombineWith("src"), "*/*.csproj");
        }

        protected override void ConfigureTargets(ITaskContext context)
        {
            var clean = context.CreateTarget("Clean")
                .SetDescription("Cleans the output of all projects in the solution.")
                .AddCoreTask(x => x.Clean()
                    .AddDirectoryToClean(ArtifactsDir, true));

            var restore = context.CreateTarget("Restore")
                .SetDescription("Restores the dependencies and tools of all projects in the solution.")
                .DependsOn(clean)
                .AddCoreTask(x => x.Restore());

            var build = context.CreateTarget("Build")
                .SetDescription("Builds all projects in the solution.")
                .DependsOn(restore)
                .AddCoreTask(x => x.Build()
                    .InformationalVersion(BuildVersion.VersionWithSuffix()));

            var tests = context.CreateTarget("Tests")
                .SetDescription("Runs all Cap tests.")
                .ForEach(TestProjectFiles,
                    (projectFile, target) =>
                    {
                        target.AddCoreTask(x => x.Test()
                            .Project(projectFile)
                            .NoBuild());
                    });

          var pack = context.CreateTarget("Pack")
              .SetDescription("Creates nuget packages for Cap.")
                .ForEach(ProjectFiles, (projectFile, target) =>
                {
                    target.AddCoreTask(x => x.Pack()
                        .NoBuild()
                        .Project(projectFile)
                        .IncludeSymbols()
                        .VersionSuffix(BuildVersion.Suffix)
                        .OutputDirectory(ArtifactsDir));
                });

          context.CreateTarget("Default")
              .SetDescription("Runs all targets.")
              .SetAsDefault()
              .DependsOn(clean, restore, build, tests, pack);
        }
    }
}


================================================
FILE: build/BuildScript.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <NoWarn>1701;1702;NU1903</NoWarn>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <NoWarn>1701;1702;NU1903</NoWarn>
  </PropertyGroup>
 
  <ItemGroup>
    <None Remove="version.props" />
  </ItemGroup>

  <ItemGroup>
	  <PackageReference Include="FlubuCore" Version="9.0.0" />
  </ItemGroup>

</Project>


================================================
FILE: build/BuildVersion.cs
================================================
namespace BuildScript
{
    public class BuildVersion
    {
        public int Major { get; init; }

        public int Minor { get; init; }

        public int Patch { get; init; } 

        public string Quality { get; init; }

        public string Suffix { get; set; }

        public string VersionWithoutQuality()
        {
            return $"{Major}.{Minor}.{Patch}";
        }

        public string Version()
        {
            return VersionWithoutQuality() + (Quality == null ? string.Empty : $"-{Quality}");
        }

        public string VersionWithSuffix()
        {
            return Version() + (Suffix == null ? string.Empty : $"-{Suffix}");
        }
    }
}


================================================
FILE: build/version.props
================================================
<Project>
	<PropertyGroup>
		<VersionMajor>10</VersionMajor>
		<VersionMinor>0</VersionMinor>
		<VersionPatch>2</VersionPatch>
		<VersionQuality></VersionQuality>
		<VersionPrefix>$(VersionMajor).$(VersionMinor).$(VersionPatch)</VersionPrefix>
	</PropertyGroup>
</Project>


================================================
FILE: code-of-conduct.md
================================================
# MEMBER CODE OF CONDUCT

The .NET Core Community (NCC) was created to doster an open, innovative, inclusive and welcoming community around open source .NET/.NET Core. To clarify expected behaviour in our communities we have adopted the [Contributor Covenant](contributor-covenant.org). This code of conduct has been adopted by [many other open source communities](contributor-covenant.org/adopters) and we feel it expresses our values well.

### Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.

### Our Standards

Examples of behavior that contributes to creating a positive environment include:

- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

- The use of sexualized language or imagery and unwelcome sexual attention or advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others’ private information, such as a physical or electronic address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting

### Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

### Scope

This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

### Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [dotnet-community@outlook.com](dotnet-community@outlook.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project’s leadership.

### Attribution

This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html


================================================
FILE: docs/content/CNAME
================================================
cap.dotnetcore.xyz

================================================
FILE: docs/content/about/contact-us.md
================================================
---
hide:
  - feedback
---

# Contact Us

## Authors

* Author: [@yang-xiaodong](https://github.com/yang-xiaodong)
* Email: yangxiaodong1214@126.com
* Blogs: https://savorboard.cnblogs.com

## NCC Organization

* Email: dotnetcn@outlook.com
* Twitter: https://twitter.com/ncc_community
* Weibo: https://weibo.com/dotnetcore




================================================
FILE: docs/content/about/license.md
================================================
---
hide:
  - feedback
---

# License

**MIT License**

Copyright (c) 2016 - 2024 Savorboard

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

================================================
FILE: docs/content/about/release-notes.md
================================================
---
hide:
  - feedback
---

# Release Notes

## Version 8.2.0 (Jun 23, 2024)

**Features:**
- Add support CustomHeadersBuilder option for NATS. (#1519)
- Add GroupConcurrent option for [CapSubscribe] to support subscriber concurrent execution. (#1537)
- Add option for controlling reponse from CapHeader. (#1541)
- Improvements to the "EnablePublishParallelSend" option to "true" will put tasks into the .NET thread pool in batches. (#1540)

**Bug Fixed:**
- Fixed issue where CapTransaction was not disposed when the transaction failed for Sql Server. (#1521)
- Fixed NATS reconnection publish issue after restarting server. (#1542)

**What's Changed:**
- Upgrade dashboard npm package to vue2 latest minor version.
- Upgrade Ngpsql to 8.0.3 to fix "Npgsql vulnerable to SQL Injection via Protocol Message Size Overflow".
- Simplify code using deconstruction. by @xiangxiren in #1533

## Version 8.1.2 (May 7, 2024)

**Bug Fixed:**
* Fixed publish exception when event outside of transaction finishing scope. (#1521) Thanks @NikolozGob
* Fixed PublishDelay synchronization method did not wait internally.

## Version 8.1.1 (Apr 21, 2024)

**Features:**
- Add more granular option for AzureServiceBus. (#1514)
- Add new options SubscriberParallelExecuteThreadCount,SubscriberParallelExecuteBufferFactor to better support parallel execte subscriber. (#1513)
- Delete obsolete option CustomerHeader.

## Version 8.0.0 (Dec 14, 2023)

**Breaking Changes**
Removed `DefaultAuthenticationScheme`, `UseChallengeOnAuth`, `DefaultChallengeScheme` and `AuthorizationPolicy` options of DotNetCore.CAP.Dashboard.
Now CAP dashboard auth/authz mechanism to leverage the "ASP.NET Core" way of doing it, see #1428.

* Streamlined auth via asp.net middlewares. (#1434) Thanks @mviegas
  
**Features:**

* Fully Support .NET 8.
* Add `FallbackWindowLookbackSeconds` option to configure the retry processor to pick up the backtrack time window for Scheduled or Failed status messages. (#1455) Thanks @apatozi
* Update IConsumerRegister.Default.cs to make dispose thread safe. (#1438) Thanks @blashbul
* Compatible with .NET 8's dependency injection KeyedService. (#1436) Thanks @EashShow
* Add virtual method to custom delay backtrack time window during delayed publishing large messges. (#1429) Thanks @PoteRii

**Bug Fixed:**

* Fixed message infinite retry of messages after subscriber is removed. (#1456) Thanks @bschwehn
* Fixed open telemetry context lost on consumer retry and Baggage Propagation. (#1452) Thanks @bschwehn
* Fixed NATS do not handle reconnect if the nats server is forcibly shutdown and then restarted. (#1449) Thanks @davidterins
* Fixed outbox pattern messages does not recovery when using DotNetCore.CAP.InMemoryStorage. (#1439) Thanks @davidterins
* Fixed open telemetry subscriber thows null reference when using azure service bus without connection string. (#1432) Thanks @demorgi
* Fixed double registration of event handler for azure service bus. (#1427) Thanks @demorgi
* Fixed publish delay message not working in sql server transaction. (#1422) Thanks @xiangxiren

## Version 7.2.2 (Nov 1, 2023)

**Features:**

* NATS support consumer config DeliverPolicy, default to New. (#1404)
* Be able to configure if to subscribe to custom producer topic. (#1409)  @demorgi
  
**Bug Fixed:**

* Try to fixes RabbitMQ basicConsume TimeOutException. (#1405) @yang-xiaodong
* Change MongoDb index from descending to ascending. (#1415) Thanks @ustaserdar
* Fixed parent span for "Event Persistence" activity trace. (#1407) Thanks @blashbul
* Fixed OpenTelemetry Dynatrace IsRemote flag. (#1402) Thanks @phmonte
* Mark Mongo time serialized to local instance time by default. (#1400) 
* Fixed k8s dashboard meta query error in standalone mode. @yang-xiaodong
* Azure Service Bus, consumer fails if subscription has session enabled. (#1396, #1397)  Thanks @demorgi

## Version 7.2.1 (Sep 8, 2023)

**Features:**

*  The options `EnableConsumerPrefetch` and `UseDispatchingPerGroup` will work together without interference. (#1399)

**Bug Fixed:**

* Fixed SqlServer sql case sensitive in dashboard query.  (#1389)
* Fixed Redis endpoint is null in DotNetCore.CAP.OpenTelemetry. (#1384)
  

## Version 7.2.0 (Jul 30, 2023)

**Breaking Changes**

* Remove `ProducerThreadCount` configuration option. Now automatically send task managed by the .NET thread pool. (#1380)
* Change the SnowflakeId from static singleton to dependency injection singleton. (#1322)

**Features:**

* Add support for kubernetes discovery in dashboard. (#1362) 
* Message send task and consumer execute task managed by .net thread pool. (#1380)
* Upgrade dependencies of NuGet packages.

**Bug Fixed:**

* Fixed BasicQosOptions not working as expected for RabbitMQ transport. (#1318)
* Revert BeginTransactionAsync support. (#1376)
* Fixed SqlServer transaction rollback message still sent out.  (#1378)
* 
## Version 7.1.4 (Jun 17, 2023)

**Features:**

* Add suppport `AutoDeleteOnIdle` option for Azure Service Bus. (#1350) Thanks @StevenDevooght

**Bug Fixed:**

* Keep the originall stack when consumer exception occurs. (#1341) Thanks @tomyangOK
* Fixed multiple invocations caused when the retry processor exceeded the `FailedRetryInterval`. (#1359) Thanks @li-zheng-hao
* Fixed thread blocking when enable `UseDispatchingPerGroup` option. (#1356) Thanks @sampsonye @li-zheng-hao
* 
## Version 7.1.3 (May 17, 2023)

**Features:**

* Allow Explicit to set AllowAnonymous for the dashboard API. (#1335)
* Update dashboard UI style
* Add Cancellation token for BeginTransactionAsync. (#1317)  Thanks @denis-tsv

**Bug Fixed:**

* Fixed postgresql AcquireLockAsync sql error. (#1320) Thanks @guochen2
* Fixed redis transport order pool connections non-lazy created connections. (#1332) Thanks @MahmoudSamir101
* Fixed mysql 8.0 storage skip locked not available bug. (#1330) Thanks @yang-xiaodong

## Version 7.1.2 (Apr 25, 2023)

**Bug Fixed:**

* Optimizing consumer duplicate detection warning logs. (#1314)
* Fixes NATS consumption repeat when multiple consumer threads.
* Fixes NATS transport infinity reconnect race condition. (#1311)

## Version 7.1.1 (Apr 7, 2023)

**Features:**

* Add support topic config for kafka. (#1303)
* Log in to dashboard with JWT authentication. (#1306) 

**Bug Fixed:**

* Fixed sqlserver character string convert to datetime2 exception. (#1302)
* Fixed dashboard consul node proxy switch bug. (#1307)

## Version 7.1.0 (Mar 5, 2023)

**Features:**

* Add option to support distributed locks for retry processor. (#1272) Thanks @li-zheng-hao
* Add option to support set BasicQos for RabbitMQ. (#1267) Thanks @nunorelvao
* Add option to set queue type for RabbitMQ. (#1281) Thanks @PaulCousinsTTEducation
* Add support publish to mutiple topics for Azure Service Bus. (#1283) Thanks @jonekdahl @mviegas

**Bug Fixed:**

* Fixed dashboard re-execute message throw null exception for MongoDB. (#1279) Thanks @cagataykiziltan

## Version 7.0.3 (Feb 2, 2023)

**Features:**

* Add SQL Filters option on topic subscribtion for AzureServiceBus. (#1263) Thanks @giorgilekveishvili-meama
* Add EF BeginTransaction extensions overload with isolationlevel and async version. (#1266) @xshaheen

**Bug Fixed:**

* Fixed dashboard re-execute message throw null exception for SqlServer and Postgres. (#1259) Thanks @coolyuwk

## Version 7.0.2 (Jan 9, 2023)

**Features:**

* Change AzureServiceBus nuget package from Microsoft.Azure.ServiceBus to Azure.Messaging.ServiceBus. (https://github.com/dotnetcore/CAP/pull/1253)

**Bug Fixed:**

* Fixed redis streams json serialize exception. (#1254)
* Fixed dashboard route in balzor server app. (not support wasm) (#1244)

## Version 7.0.1 (2022-12-16)

**Bug Fixed:**

* Fixed dashboard not working in balzor app. (#1244)
* Fixed error when published Winform with 'Produce Single File'. (#1245)

## Version 7.0.0 (2022-11-27)

**Breaking Changes:**

* `SubscribeFilter` method to asynchronous.
* `IConsumerClient` interface `OnMessage` and `OnLog` is from event to delegate.

**Features:**

* Performance improvement
* Add support publish delay message. (#1237)
* Dashbord support viewing and immediately publish for delayed messages.
* Add support for metrics diagnostics. (#1230)
* Dashboard support real-time metric graph viewing.
* Add support manual start/stop CAP process. (#1238)
* Add EnableConsumerPrefetch option of consumer. (#1240)
* Add PublishConfirms options for RabbitMQ.

**Others:**

* Change framework target from netstandard to net6.
* Upgrade NuGet to the latest version.

**Bug Fixed:**

* RabbitMQ cluster connection failed without using default ports. (#1232)

## Version 6.2.1 (2022-10-15)

**Bug Fixed:**

* Fixed EnvironmentVariableTarget.Machine only supported on windows. (#1220) Thanks @cuibty
* Fixed RedisStream TryGetOrCreateStreamGroupAsync to create ConsumerGroup when not found. (#1212) Thanks @mlatoszek

## Version 6.2.0 (2022-09-19)

**Features:**

* Add Chinese support for dashboard localization.  (#1157)  Thanks @tetris1128
* Make DbTransaction property virtual for extend of CapTransactionBase. (#1179)  @yang-xiaodong 
* Add logs for duplicate subscriber in same group. (#1186)  @yang-xiaodong 
* Record the Instance Id in the executed received messages. (#1187)  @yang-xiaodong 

**Bug Fixed:**

* SnowflakeId excludes virtual and loopback and non-working NICs. (#1163)  Thanks @xiatiandegaga
* Fixed the health check could not get the status correctly when RabbitMQ lost connection and quickly recovered. (#1193) Thanks @rpenha
* Fixed dashboard gateway proxy request missing QueryString (#1168) Thanks @wwwu
* Fixed the disconnect detection of RabbitMQ connection abnormality. (#1178)
* Fixed Mongo queries not returning results when a element convention name is registered. (#1193) Thanks @rpenha
* Fixed subscriber lookup in scoped lifecycle of factory mode. (#1204) Thanks @sampsonye
  
## Version 6.1.0 (2022-06-10)

**Features:**

* Optimize snowflake algorithm. (#1065)  Thanks @Allen-dududu
* Add authorization policy option feature to CAP dashboard. (#1113)  Thanks @albertopm19
* Added support of ScheduledEnqueueTimeUtc for AzureServiceBus transport. (#1137)  Thanks @webinex
* Add option to configure failed messages expiration term. (#1142) Thanks @dima-zhemkov

**Bug Fixed:**

* Fixed sequence validation error when both enable Challenge and Auth of dashboard authentication. (#1097)
* Used concurrentdictionary since PublishedMessages and ReceivedMessages are public and accessed from various places. (#1104) Thanks @wakiter
* Fixed the health check could not get the status correctly when RabbitMQ lost connection and quickly recovered. (#1140)
* Fixed date file format bug when retrying query from database. (#1143)
* Change reading/creating streams and consumer groups to handle non idempotent operations. (#1150) Thanks @MahmoudSamir101

## Version 6.0.1 (2022-02-15)

**Bug Fixed:**

* Fixed kafka consume excepiton for GroupLoadInProress errcode (#1085)
* Fixed deserialization exception when message body is empty byte array. (#1087)
* Fixed dashboard authentication challenge bug. (#1077)
  
## Version 6.0.0 (2022-01-06)

**Features:**

* Fully support .NET 6.
* Add support for OpenTelemetry. (#885)
* Improve support for NATS JetStream wildcard topic. (#1047)
* Add support customer header options for Azure Service Bus. (#1063) Thanks [@Mateus Viegas](https://github.com/mviegas)

## Version 5.2.0 (2021-11-12)

**Features:**

* Add support for NATS JetStream. (#983)
* Add support for Apache Pulsar. (#610)
* Add possibility to process messages for each consumer group indepedently. (#1027)

**Bug Fixed:**

* Fixed message content of bigint type cannot be displayed correctly in dashboard. (#1028)
* Fixed unobserved tasks of async method calls in Amazon SQS. (#1033)
* Fixed RabbitMQ federation plugin message header object values cause exceptions. (#1036)

## Version 5.1.2 (2021-07-26)

**Bug Fixed:**

* Fixed consumer register cancellation token source null referencee bug. (#952)
* Fixed redis streams transport cluster keys cross-hashslot bug. (#944)


## Version 5.1.1 (2021-07-09)

**Features:**

* Improve flow control for message cache of in memory. (#935)
* Add cancellation token support to subscribers. (#912)
* Add pathbase options for dashboard. (#901)
* Add custom authorization scheme support for dashboard. (#906)

**Bug Fixed:**

* Fixed mysql connect timeout expired bug. (#931)
* Fixed consul health check path invalid bug. (#921)
* Fixed mongo dashboard query bug. (#909)

## Version 5.1.0 (2021-06-07)

**Features:**

* Add configure options for json serialization. (#879)
* Add Redis Streams transport support. (#817)
* New dashboard build with vue. (#880)
* Add subscribe filter support. (#894)

**Bug Fixed:**

* Fixed use CapEFDbTransaction to get dbtransaction extension method bug. (#868)
* Fixed pending message has not been deleted from buffer list in SQL Server. (#889)
* Fixed dispatcher processing when storage message exception bug. (#900)


## Version 5.0.3 (2021-05-14)

**Bug Fixed:**

* Fix the bug of getting db transaction through the IDbContextTransaction for SQLServer. (#867)
* Fix RabbitMQ Connection close forced. (#861)

## Version 5.0.2 (2021-04-28)

**Features:**

* Add support for Azure Service Bus sessions. (#829)
* Add custom message headers support for RabbitMQ consumer. (#818)

**Bug Fixed:**

* Downgrading Microsoft.Data.SqlClient to 2.0.1. (#839)
* DiagnosticObserver does not use null connection. (#845)
* Fix null reference in AmazonSQSTransport. (#846)

## Version 5.0.1 (2021-04-07)

**Features:**

* Add KafkaOptions.MainConfig to AutoCreateTopic. (#810)
* Add support rewriting the default configuration of Kafka consumer. (#822)
* Add DefaultChallengeScheme dashboard options to specify dashboard auth challenge scheme. (#815)

**Bug Fixed:**
 
* Fixed topic selector in IConsumerServiceSelector. (#806)
* Update AWS topic subscription and SQS access policy generation. (#808)
* Fixed memory leak when using transction to publish message. (#816)
* Fixed SQL content filter on IMonitoringApi.PostgreSql.cs. (#814)
* Fixed the expiration time display problem in the dashboard due to time zone issues (#820)
* Fixed the creation timing of Kafka automatically creating Topic. (#823)
* Fixed Dashboard metric not update. (#819)

## Version 5.0.0 (2021-03-23)
 
**Features:**

* Upgrade to .NET Standard 2.1 and support .NET 5. (#727)
* Replace Newtonsoft.Json to System.Text.Json. (#740)
* Support NATS Transport. (#595,#743)
* Enabling publiser confirms for RabbitMQ. (#730)
* Support query subscription from DI implementation factory. (#756)
* Add options to create lazy queue for RabbitMQ. (#772)
* Support to add custom tags for Consul. (#786)
* Support custom group and topic prefiex. (#780)
* Renemae DefaultGroup option to DefaultGroupName.
* Add auto create topic at startup for Kafka. (#795,#744)

**Bug Fixed:**

* Fixed retrying process earlier than consumer registration to DI. (#760)
* Fixed Amazon SQS missing pagination topics. (#765)
* Fixed RabbitMQ MessageTTL option to int type. (#787)
* Fixed Dashboard auth. (#793)
* Fixed ClientProvidedName could not be renamed for RabbitMQ. (#791)
* Fixed EntityFramework transaction will not rollback when exception occurred. (#798)

## Version 3.1.2 (2020-12-03)

**Features:**
* Support record the exception message in the headers. (#679)
* Support consul service check for https. (#722)
* Support custom producer threads count options for sending. (#731)
* Upgrade dependent nuget packages to latest.

**Bug Fixed:**

* Fixed InmemoryQueue expired messages are not removed bug. (#691)
* Fixed Executor key change lead to possible null reference exception. (#698)
* Fixed Postgresql delete expires data logic error. (#714)

## Version 3.1.1 (2020-09-23)

**Features:**

* Add consumer parameter with interface suppport. (#669)
* Add custom correlation id and message id support. (#668)
* Enhanced custom serialization support. (#641)

**Bug Fixed:**

* Solve the issue of being duplicated executors from different assemblies. (#666)
* Added comparer to remove duplicate ConsumerExecutors. (#653)
* Add re-enable the auto create topics configuration item for Kafka, it's false by default. now is true. (#635)
* Fixed postgresql transaction rollback invoke bug. (#640)
* Fixed SQLServer table name customize bug. (#632)

## Version 3.1.0 (2020-08-15)

**Features:**

* Add Amazon SQS support. (#597)
* Remove Dapper and replace with ADO.NET in storage project. (#583)
* Add debug symbols package to nuget.
* Upgrade dependent nuget package version to latest.
* English docs grammar correction. Thanks @mzorec

**Bug Fixed:**

* Fix mysql transaction rollback bug. (#598)
* Fix dashboard query bug. (#600)
* Fix mongo db query bug. (#611)
* Fix dashboard browser language detection bug. (#631)

## Version 3.0.4 (2020-05-27)

**Bug Fixed:**

* Fix kafka consumer group does not works bug. (#541)
* Fix cast object to primitive types failed bug. (#547)
* Fix subscriber primitive types convert exception. (#568)
* Add conosole app sample.
* Upgrade Confluent.Kafka to 1.4.3


## Version 3.0.3 (2020-04-01)

**Bug Fixed:**

* Change ISubscribeInvoker interface access modifier to public. (#537)
* Fix rabbitmq connection may be reused when close forced. (#533)
* Fix dashboard message reexecute button throws exception bug. (#525)

## Version 3.0.2 (2020-02-05)

**Bug Fixed:**

- Fixed diagnostics event data object error. (#504 )
- Fixed RabbitMQ transport check not working. (#503 )
- Fixed Azure Service Bus subscriber error. (#502  )

## Version 3.0.1 (2020-01-19)

**Bug Fixed:**

* Fixed Dashboard requeue and reconsume failed bug.  (#482 )
* Fixed Azure service bus null reference exception. (#483 )
* Fixed type cast exception from storage. (#473 )
* Fixed SqlServer  connection undisponse bug. (#477 )

## Version 3.0.0 (2019-12-30)

**Breaking Changes:**

In this version, we have made major improvements to the code structure, which have introduced some destructive changes.

* Publisher and Consumer are not compatible with older versions
This version is not compatible with older versions of the message protocol because we have improved the format in which messages are published and stored.

* Interface changes
We have done a lot of refactoring of the code, and some of the interfaces may be incompatible with older versions

* Detach the dashboard project

**Features:**

* Supports .NET Core 3.1.
* Upgrade dependent packages.
* New serialization interface `ISerializer` to support serialization of message body sent to MQ.
* Add new api for `ICapPublisher` to publish message with headers.
* Diagnostics event structure and names improved. #378
* Support consumer method to read the message headers. #472
* Support rename message storage tables. #435
* Support for Kafka to write such as Offset and Partition to the header. #374
* Improved the processor retry interval time. #444

**Bug Fixed:**

* Fixed SqlServer dashboard sql query bug. #470
* Fixed Kafka health check bug. #436
* Fixed dashboard bugs. #412 #404
* Fixed transaction bug for sql server when using EF. #402


## Version 2.6.0 (2019-08-29)

**Features:**

* Improvement Diagnostic support. Thanks [@gfx687](https://github.com/gfx687) 
* Improvement documention. https://cap.dotnetcore.xyz
* Improvement `ConsumerInvoker` implementation. Thanks [@hetaoos](https://github.com/hetaoos)
* Support multiple consumer threads. (#295)
* Change DashboardMiddleware to async. (#390) Thanks [@liuzhenyulive](https://github.com/liuzhenyulive) 

**Bug Fixed:**

* SQL Server Options Bug.
* Fix transaction scope disposed bug. (#365)
* Fix thread safe issue of ICapPublisher bug. (#371)
* Improved Ctrl+C action raised exception issue.
* Fixed asynchronous exception catching bug of sending.
* Fix MatchPoundUsingRegex "." not escaped bug (#373)

## Version 2.5.1 (2019-06-21)

**Features:**

* Improved logs record.
* Upgrade dependent nuget packages version. (MySqlConnector, confluent-kafka-dotnet-1.0 )
* NodeId type change to string of DiscoveryOptions for Consul. (#314)
* Change the IConsumerServiceSelector interface access modifier to public. (#333)
* Improved RabbitMQOptions to provide extensions option to configure the client original configuration. (#350)
* Add index for MongoDB CAP collections. (#353)

**Bugs Fixed:**

* Fixed consumer re-register transport bug. (#329)
* Handle messages retrieval failure. (#324)
* Fixed DiagnosticListener  null reference exception bug. (#335)
* Add subscription name validation for the AzureServerBus. (#344)
* Fixed thread safety issues of publisher. (#331)

## Version 2.5.0 (2019-03-30)

**Features:**

* Support Azure Service Bus. (#307)
* Support In-Memory Storage. (#296)
* Upgrade Dapper to version 1.60.1
* Support read environment variables CAP_WORKERID and CAP_DATACENTERID as the snowflake algorithm workerid and datacenterid.

**Bug Fixed:**

* Modify MySQL cap table encoding to utf8mb4. (#305)
* Move CapSubscribeAttribute class to DotNetCore.CAP project.
* Fixed multiple instance snowflake algorithm generating primary key conflicts. (#294)

## Version 2.4.2 (2019-01-08)

**Features:**

* Startup the CAP with the .NET Core 2.1 BackgroundService. (#265)
* Improved message delivery performance. #261

**Bug Fixed:**

* Fixed PostgreSql version isolation feature bug. (#256)
* Fixed SQL Server sql bug for dashboard search. (#266)

## Version 2.4.1 (2018-12-19)

**Bug Fixed:**

* Fixed MongoDB version isolation feature bug. (#253)

## Version 2.4.0 (2018-12-08)

**Features:**

* Supported version options. (#220)
* Upgrade nuget package to .net core 2.2.

**Breaking Changes:**

In order to support the "version isolation" feature, we introduced a new version field in version 2.4.0 to isolate different versions of the message, so this requires some adjustments to the database table structure. You can use the following SQL to add a version field to your database CAP related table.

**MySQL**
```sql
ALTER TABLE `cap.published` ADD Version VARCHAR(20) NULL;
ALTER TABLE `cap.received` ADD Version VARCHAR(20) NULL;
```

**SQL Server**
```sql
ALTER TABLE Cap.[Published] ADD Version VARCHAR(20) NULL;
ALTER TABLE Cap.[Received] ADD Version VARCHAR(20) NULL;
```

**PostgreSQL**
```sql
ALTER TABLE cap.published ADD  "Version" VARCHAR(20) NULL;
ALTER TABLE cap.received ADD "Version" VARCHAR(20) NULL;
```

**MongoDb**
```
db.CapPublishedMessage.update({},{"$set" : {"Version" : "1"}});
db.CapReceivedMessage.update({},{"$set" : {"Version" : "1"}});
```

**Bug Fixed:**

- Fixed different groups of the same topic name in one instance will cause routing bug. (#235)
- Fixed message presistence bug. (#240)
- Fixed RabbitMQ topic name contains numbers will cause exception bug. (#181)

## Version 2.3.1 (2018-10-29)

**Features:**

- Add Source Link Support
- Upgrade dependent NuGet packages.

**Bug Fixed:**

- Fixed dashboard messages requeue error. (#205)
- Adjustment snowflake workerId to random id.
- Fixed flush unclaer data bug.

## Version 2.3.0 (2018-08-30)

In this version, we made some breaking changes for the publisher API, you can see this blog to understand the story behind.

If you have any migration question, please comment in issue (#190).

**Breaking Changes:**

- Removed app.UseCap() from Startup.cs
- Message table primary key data type has been modified to Bigint and non auto-Increment. (#180)
- New publisher Api. (#188)

**Features:**

- MongoDb supported. (#143)
- Automatic commit transaction. (#191)

**Bug Fixed:**

- Fix message still sent if transaction faild bug. (#118)
- Multiple events in one transaction. (#171)

## Version 2.2.5 (2018-07-19)

**Features:**
- Performance improvement

**Bug Fixed:**

- Fixed message enqueue exception.
- Fixed Retry processor bugs.
- Fixed Kafka producer exception log without logging when publish message.
- Fixed Incorrect local IP address judgment of IPv6. (#140)
- Fixed DateTime localization format conversion error to sql. (#139)
- Fixed dashboard message page re-requeue and re-executed operate bug. (#158)
- Fixed SendAsync or ExecuteAsync recursion retries bug. (#160)
- Fixed configuration options of FailedThresholdCallback could not be invoke when the value less then three. (#161)

## Version 2.2.4 (2018-06-05)

Because version 2.2.3 was not released to nuget, so released 2.2.4.

## Version 2.2.3 (2018-06-05)

**Features:**

- Improved log output.
- Upgrade nuget packages.
- Support pattern matching for consumer. (#132)

**Bug Fixed:**

- Fixed exception thrown when terminate the program with Ctrl+C. (#130)

## Version 2.2.2 (2018-04-28)

**Features:**

- Improved log output. #114
- Add default timeout configuration for kafka client.
- Rename configuration options FailedCallback to FailedThresholdCallback.

**Bug Fixed:**

- Fixed message enqueue exception.
- Fixed retry processor bugs.
- Fixed kafka producer exception log without logging when publish message.

## Version 2.2.1 (2018-04-18)

**Bug Fixed:**

- Fixed message enqueue bug in v2.2


## Version 2.2.0 (2018-04-17)

**Features:**

- Remove database queue mode. (#102)
- Support for Diagnostics. (#112)
- Upgrade dependent nuget packages.

**Bug Fixed:**

- Fixed bug of the FailedRetryCount does not increase when raised SubscribeNotFoundException. (#90)

## Version 2.1.4 (2018-03-16)

**Features:**

- Remove TableNamePrefix option from MySqlOptions to EFOptions.
- Upgrade nuget package

**Bug Fixed:**

- Fixed the connection bug of getting message from table. (#83)
- Fixed entityframework rename table name prefix bug. (#84)
- Fixed sql server scripts bug of create table scheme. (#85)
- Fixed thread safety issue about KafkaOptions.(#89)

## Version 2.1.3 (2018-01-24)

**Features:**

- Upgrade dependent nuget packages version.
- NuGet package include xml doc now.
- NuGet now contains the CAP symbol files.

**Bug Fixed:**

- Fixed thread conflict issue when sending messages with PublishAsync. (#80)
- Fixed kafka received message sava failed may caused the mssage loss bug. (#78)
- Fixed dashboard js syntax issue. (#77)

## Version 2.1.2 (2017-12-18)

**Bug Fixed:**

- Fixed and improve the performance of mysql processing messages. (#68) (#36)
- Fixed dashboard manually trigger reconsumption bug. (#67)
- Fixed mysql 5.5 table initialization bug. (#65)
- Fixed mysql message queue executor bug. (#66)

## Version 2.1.1 (2017-11-28)

**Bug Fixed:**

- Fixed 'dotnet.exe' process incomplete quit when shutdown application (Ctrl+C). (#64)
- Fixed failure to issue as expected of RabbitMQ SubscriberNotFoundException. (#63)
- Fixed Sent async message in the loop causes an exception. (#62)

## Version 2.1.0 (2017-11-17)

**Features:**

- Interface display optimization of dashboard.
- Adds a more friendly display when looks at the message content.
- Now you can see the exception infomation in the message conent filed when message send or executed failed.
- Optimize LAN to see Dashboard without authentication.
- Add IContentSerializer interface, you can customize the serialized message content.
- Add IMessagePacker interface, you can customize wapper of the message.
- Upgrade the dependent package.

**Bug Fixed:**

- Fixed dashboard query bugs.
- Fixed dashboard multilanguage display bugs.
- Fixed RabbitMQ connection pool bug.
- Fixed dashboard display bugs on mobile.

## Version 2.0.2 (2017-09-29)

**Bug Fixed:**

- Fixed asp.net core 2.0 startup error of MySql and PostgreSql. (#44

## Version 2.0.1 (2017-09-16)

**Bug Fixed:**

- DbContext services bug. (#44)
- Dependency injection bug. (#45)

## Version 2.0.0 (2017-09-01)

**Features:**

* Supported .net standard 2.0.
* Supported PostgreSQL 9.5+.
* Supported asynchronous function subscriptions.
* `ICapPublisher` api supported callback subsrciber.

**Bug Fixed:**

* Fixed multiple subscriber subscribe bug. (#38)
* Fixed model binde bug. (#17) (#18)
* Fixed database connection disposed bug. (#25)
* Fixed consumer method injection context bug. (#34)

## Version 1.1.0 (2017-08-04)

**Features:**

- Support MySQL database persistent message.
- Add message failed call-back in CapOptions.
- Remove publish messages API of string name at `ICapPublisher`.

**Bug Fixed:**

- Fixed can not send message for string type. (#17)
- Fixed model bind for type like datetime guid always failed. (#18)

## Version 1.0.1 (2017-07-25)

**Features:**

- ICapPublisher interface added synchronous publish API.
- Add infinity retry failed processor.

## Version 1.0.0 (2017-07-19)

- Project published

================================================
FILE: docs/content/index.md
================================================
---
hide:
  - feedback
---

Title: CAP - A distributed transaction solution in micro-service base on eventually consistency, also an eventbus with Outbox pattern

# CAP

<img width="140" align="right" src="img/logo.svg">
[![Docs&Dashboard](https://github.com/dotnetcore/CAP/actions/workflows/deploy-docs-and-dashboard.yml/badge.svg?branch=master)](https://github.com/dotnetcore/CAP/actions/workflows/deploy-docs-and-dashboard.yml)
[![AppVeyor](https://ci.appveyor.com/api/projects/status/v8gfh6pe2u2laqoa/branch/master?svg=true)](https://ci.appveyor.com/project/yuleyule66/cap/branch/master)
[![NuGet](https://img.shields.io/nuget/v/DotNetCore.CAP.svg)](https://www.nuget.org/packages/DotNetCore.CAP/)
[![NuGet Preview](https://img.shields.io/nuget/vpre/DotNetCore.CAP.svg?label=nuget-pre)](https://www.nuget.org/packages/DotNetCore.CAP/)
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/dotnetcore/CAP/master/LICENSE.txt)
[![Member project of .NET Core Community](https://img.shields.io/badge/member%20project%20of-NCC-9e20c9.svg)](https://github.com/dotnetcore)

CAP is a library based on .net standard, which is a solution to deal with distributed transactions, also has the function of EventBus, it is lightweight, easy to use, and efficient.

## Introduction

In the process of building an SOA or MicroService system, we usually need to use the event to integrate each service. In the process, simple use of message queue does not guarantee reliability. CAP adopts local message table program integrated with the current database to solve exceptions that may occur in the process of the distributed system calling each other. It can ensure that the event messages are not lost in any case.

You can also use CAP as an EventBus. CAP provides a simpler way to implement event publishing and subscriptions. You do not need to inherit or implement any interface during subscription and sending process.

!!! Tip "CAP implements the Outbox Pattern described in the [eShop ebook](https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/multi-container-microservice-net-applications/subscribe-events#designing-atomicity-and-resiliency-when-publishing-to-the-event-bus)"
    <img src="img/architecture-eshop.png">

    > Atomicity when publishing events to the event bus with a worker microservice


For detailed instructions see the [Getting Started Guide][1].

  [1]: user-guide/en/getting-started/quick-start.md

## Contributing

One of the easiest ways to contribute is to participate in discussions and discuss issues. You can also contribute by submitting pull requests with code changes.

If you have any question or problems, please report them on the CAP repository:

<a href="https://github.com/dotnetcore/cap/issues/new"><button data-md-color-primary="purple"><i class="fa fa-github fa-2x"></i> Report Issue</button></a>
<a href="https://github.com/dotnetcore/cap/issues"><button data-md-color-primary="purple" type="submit"> Active Issues <i class="fa fa-github fa-2x"></i></button></a>

## License

CAP is licensed under the [MIT license](about/license.md).


================================================
FILE: docs/content/user-guide/en/cap/configuration.md
================================================
# Configuration

By default, you specify configurations when registering CAP services in the DI container for an ASP.NET Core project.

```c#
services.AddCap(config =>
{
    // config.XXX
});
```

`services` is an `IServiceCollection` interface, which can be found in the `Microsoft.Extensions.DependencyInjection` package.

## Minimum Configuration Required

You must configure at least one transport and one storage. If you want to get started quickly, you can use the following configuration:

```C#
services.AddCap(capOptions => 
{
     capOptions.UseInMemoryQueue();  // Requires the Savorboard.CAP.InMemoryMessageQueue NuGet package.
     capOptions.UseInMemoryStorage();
});
```

For transport and storage configuration options provided by specific components, see the [Transports](../transport/general.md) and [Storage](../storage/general.md) sections.

## Configuration in Subscribers

Subscribers use the `[CapSubscribe]` attribute to mark themselves as subscribers. They can be located in an ASP.NET Core Controller or Service.

When you declare `[CapSubscribe]`, you can change the behavior of the subscriber by specifying the following parameters.

### Name

> string, required

Subscribe to messages by specifying the `Name` parameter. This corresponds to the name specified when publishing the message through `_cap.Publish("Name")`.

This name corresponds to different items in different message brokers:

- In RabbitMQ, it corresponds to the Routing Key.
- In Kafka, it corresponds to the Topic.
- In Azure Service Bus, it corresponds to the Subject.
- In NATS, it corresponds to the Subject.
- In Redis Streams, it corresponds to the Stream.

### Group

> string, optional

Specify the `Group` parameter to place subscribers within a separate consumer group, a concept similar to consumer groups in Kafka. If this parameter is not specified, the current assembly name (`DefaultGroupName`) is used as the default.

Subscribers with the same `Name` but set to **different** groups will all receive messages. Conversely, if subscribers with the same `Name` are set to the **same** group, only one will receive the message.

It also makes sense for subscribers with different `Names` to be set to **different** groups; they can have independent threads for execution. Conversely, if subscribers with different `Names` are set to the **same** group, they will share consumption threads.

Group corresponds to different items in different message brokers:

- In RabbitMQ, it corresponds to Queue.
- In Kafka, it corresponds to Consumer Group.
- In Azure Service Bus, it corresponds to Subscription Name.
- In NATS, it corresponds to Queue Group.
- In Redis Streams, it corresponds to Consumer Group.

###  GroupConcurrent

> byte, optional

Set the parallelism of concurrent execution for subscribers by specifying the value of the `GroupConcurrent` parameter. Concurrent execution means that it needs to run on an independent thread, so if you do not specify the `Group` parameter, CAP will automatically create a Group using the value of `Name`.

!!! Note
    If you have multiple subscribers configured with the same Group and have also set the `GroupConcurrent` value for them, the degree of parallelism is the sum of the values in the group.  
    This setting applies only to new messages; retried messages are not subject to the concurrency limit.

## Custom Configuration

The `CapOptions` class is used to store configuration information. By default, all options have default values. Sometimes you may need to customize them.

#### DefaultGroupName

> Default: cap.queue.{assembly name}

The default consumer group name. It corresponds to different names in different transports. You can customize this value to customize the names in different transports for easy viewing.

!!! info "Mapping"
    Maps to [Queue Names](https://www.rabbitmq.com/queues.html#names) in RabbitMQ.  
    Maps to [Consumer Group Id](http://kafka.apache.org/documentation/#group.id) in Apache Kafka.  
    Maps to Subscription Name in Azure Service Bus.  
    Maps to [Queue Group Name](https://docs.nats.io/nats-concepts/queue) in NATS.
    Maps to [Consumer Group](https://redis.io/topics/streams-intro#creating-a-consumer-group) in Redis Streams.

#### GroupNamePrefix

> Default: Null

Add unified prefixes to consumer group names. https://github.com/dotnetcore/CAP/pull/780

#### TopicNamePrefix

> Default: Null

Add unified prefixes to topic/queue names. https://github.com/dotnetcore/CAP/pull/780

#### Version

> Default: v1

Used to specify a version for a message to isolate messages of different versions across services. This is useful for A/B testing or multi-service version scenarios. The following are application scenarios that require versioning:

!!! info "Business Iteration and Backward Compatibility"
    Due to rapid iteration of business logic, the message data structure may change during service integration. Sometimes we add or modify data structures to accommodate new requirements. If you have a brand new system, this is not a problem. However, if your system is already deployed to production and serving customers, new features can become incompatible with old data structures when released online, which can cause serious issues. To work around this problem, you would need to clear all message queues and persistent messages before restarting the application, which is obviously unacceptable for production environments.

!!! info "Multiple Server Versions"
    Sometimes, the server needs to provide multiple sets of interfaces to support different versions of the client application. The data structures for the same interface interactions between different app versions and the server may differ, so the server typically provides different routing addresses to accommodate different client versions.

!!! info "Different Instances Using the Same Storage Table/Collection"
    If you want multiple service instances to share the same database, you can isolate database tables for different instances by specifying different table names. This can be achieved through CAP configuration by setting different table name prefixes.

> Check out the blog to learn more about the Version feature: https://www.cnblogs.com/savorboard/p/cap-2-4.html

#### FailedRetryInterval

> Default: 60 sec

During the message sending process, if message transmission fails, CAP will retry sending. This configuration option specifies the interval between each retry attempt.

During the message consumption process, if the consumer method fails, CAP will retry execution. This configuration option specifies the interval between each retry attempt.

!!! WARNING "Retry & Interval"
    By default, if a failure occurs during send or consume operations, retry will begin after **4 minutes** (FallbackWindowLookbackSeconds) to avoid potential issues caused by message state delays.    
    Send and consume failures are retried 3 times immediately. After the initial 3 attempts, retries follow a polling schedule, at which point the FailedRetryInterval configuration takes effect.

!!! WARNING "Multi-instance Concurrent Retries"
    Version 7.1.0 introduced database-based distributed locks to solve the problem of concurrent database fetches during retry operations across multiple instances. You must explicitly set `UseStorageLock` to true to enable this.

#### UseStorageLock

> Default: false

If set to true, we will use a database-based distributed lock to handle concurrent data fetches by retry processes across multiple instances. This will generate the cap.lock table in the database.

#### CollectorCleaningInterval

> Default: 300 sec

The interval at which the collector deletes expired messages.

#### SchedulerBatchSize

> Default: 1000

Maximum number of delayed or queued messages fetched per scheduler cycle.

#### ConsumerThreadCount

> Default: 1

Number of consumer threads. When this value is greater than 1, the order of message execution cannot be guaranteed.

#### FailedRetryCount

> Default: 50

Maximum number of retries. When this count is reached, retries will stop. You can modify this parameter to set the maximum retry attempts.

#### FallbackWindowLookbackSeconds

> Default: 240 sec

Configures the retry processor to pick up messages with `Scheduled` or `Failed` status within the lookback time window.

#### FailedThresholdCallback

> Default: NULL

Type: `Action<FailedInfo>`

Failure threshold callback. This action is invoked when retry attempts reach the value set by `FailedRetryCount`. You can use this callback to receive notifications and take manual intervention. For example, send an email or notification. 

#### SucceedMessageExpiredAfter

> Default: 24*3600 sec (1 day)

Expiration time (in seconds) for successfully sent or consumed messages. When a message is sent or consumed successfully, it will be removed from the database after `SucceedMessageExpiredAfter` seconds. You can set the expiration time by modifying this value.

#### FailedMessageExpiredAfter

> Default: 15*24*3600 sec (15 days)

Expiration time (in seconds) for failed messages. When a message fails to send or consume, it will be removed from the database after `FailedMessageExpiredAfter` seconds. You can set the expiration time by modifying this value.

#### [Removed] UseDispatchingPerGroup 

> Default: false

> Removed in version 8.2, now default behavior

If multiple consumers are within the same group, each consumer group pushes received messages to its own dispatching pipeline channel. Each channel has a thread count set to the `ConsumerThreadCount` value.

#### [Obsolete] EnableConsumerPrefetch

> Default: false (Before version 7.0, the default was true)

This option has been renamed to `EnableSubscriberParallelExecute`. Please use the new option instead.

#### EnableSubscriberParallelExecute

> Default: false

If set to `true`, CAP will prefetch a batch of messages from the broker and buffer them, then execute the subscriber method. After execution completes, it fetches the next batch for processing.

!!! note "Precautions"
    Setting this to true may cause issues. If the subscriber method executes slowly and takes a long time, the retry thread may pick up messages that have not yet been executed. The retry thread picks up messages from 4 minutes ago (FallbackWindowLookbackSeconds) by default. If the consumer side has more than 4 minutes (FallbackWindowLookbackSeconds) of message backlog, those messages will be picked up again and executed again.

#### SubscriberParallelExecuteThreadCount

> Default: `Environment.ProcessorCount`

Specifies the number of threads for parallel task execution when `EnableSubscriberParallelExecute` is enabled.

#### SubscriberParallelExecuteBufferFactor

> Default: 1

Multiplier used to determine the buffered capacity size during parallel subscriber execution when `EnableSubscriberParallelExecute` is enabled. The buffer capacity is calculated by multiplying this factor with `SubscriberParallelExecuteThreadCount`, which represents the number of threads allocated for parallel processing.

#### EnablePublishParallelSend

> Default: false (In versions 7.2 <= Version < 8.1, the default is true)

By default, sent messages are placed into a single in-memory channel and then processed linearly.
If set to true, message sending tasks will be processed in parallel by the .NET thread pool, which will greatly improve sending performance.


================================================
FILE: docs/content/user-guide/en/cap/filter.md
================================================
# Filter

Subscriber filters are similar to ASP.NET MVC filters and are mainly used to perform additional work before and after the subscriber method executes, such as transaction management or logging.

## Creating a Subscriber Filter

### Create Filter

Create a new filter class that inherits from the `SubscribeFilter` abstract class.

```C#
public class MyCapFilter : SubscribeFilter
{
    public override Task OnSubscribeExecutingAsync(ExecutingContext context)
    {
        // Execute before the subscriber method runs
    }

    public override Task OnSubscribeExecutedAsync(ExecutedContext context)
    {
        // Execute after the subscriber method completes
    }

    public override Task OnSubscribeExceptionAsync(ExceptionContext context)
    {
        // Handle exceptions during subscriber method execution
    }
}
```

In some scenarios, if you want to terminate the subscriber method execution, you can throw an exception in `OnSubscribeExecutingAsync`, and choose to handle the exception in `OnSubscribeExceptionAsync`.

To ignore exceptions, set `context.ExceptionHandled = true` in `ExceptionContext`:

```C#
public override Task OnSubscribeExceptionAsync(ExceptionContext context)
{
    context.ExceptionHandled = true;
}
```

### Registering a Filter

Use `AddSubscribeFilter<>` to register a filter.

```C#
services.AddCap(opt =>
{
    // ...
}).AddSubscribeFilter<MyCapFilter>();
```

Currently, multiple filters are not supported.


================================================
FILE: docs/content/user-guide/en/cap/idempotence.md
================================================
# Idempotence

Idempotence (which you can read a formal definition of on [Wikipedia](https://en.wikipedia.org/wiki/Idempotence)) in messaging systems means that a message redelivery can be handled without resulting in an unintended state.

## Delivery Guarantees[^1]

[^1]: The chapter refers to the [Delivery guarantees](https://github.com/rebus-org/Rebus/wiki/Delivery-guarantees) of rebus, which I think is described very good.

Before discussing idempotency, let's discuss message delivery guarantees on the consumer side.

Since CAP doesn't use MS DTC or other 2PC (Two-Phase Commit) distributed transaction mechanisms, there is an inherent limitation: messages are delivered at least once. Specifically, in a message-based system, there are three possibilities:

* Exactly Once (*)  
* At Most Once 
* At Least Once  

Exactly Once has a (*) next to it because, in the general case, it is simply not possible.

### At Most Once

The At Most Once delivery guarantee ensures that you receive all messages either once or not at all.

This type of delivery guarantee can arise from your messaging system and your code performing actions in the following order:

```
1. Remove message from queue
2. Start work transaction
3. Handle message (your code)
4. Success?
    Yes:
        1. Commit work transaction
    No: 
        1. Roll back work transaction
        2. Put message back into the queue
```

In the best case scenario, this works well – your messages will be received, work transactions will be committed, and you will be happy.

However, things can fail – especially if you do a lot of work. For example, consider what happens if anything fails after step (1), and then – when you try to execute step (4)/(2) (i.e., put the message back into the queue) – the network becomes temporarily unavailable, the message broker restarts, or the host machine reboots due to a system update.

This might be acceptable if that's what you want, but most things in CAP revolve around the concept of DURABLE messages – messages whose contents are as important as the data in your database.

### At Least Once

The At Least Once delivery guarantee ensures that you receive all messages one or more times if something fails.

This requires a slight change in the order of execution and requires that the message queue system supports transactions, either through the traditional begin-commit-rollback protocol (MSMQ does this) or through a receive-ack-nack protocol (RabbitMQ, Azure Service Bus, etc. do this).

Consider this approach:

```
1. Grab lease on message in queue
2. Start work transaction
3. Handle message (your code)
4. Success?
    Yes: 
        1. Commit work transaction
        2. Delete message from queue
    No: 
        1. Roll back work transaction
        2. Release lease on message
```

If the "lease" grabbed in step (1) has an appropriate timeout associated with it, then we are guaranteed that no matter how wrong things go, we will only actually remove the message from the queue (step 4/2) if we have successfully committed our "work transaction".

### What is a "Work Transaction"?

It depends on what you're doing 😄 Maybe it's a transaction in a relational database (which traditionally have good support for this), maybe it's a transaction in a document database that supports transactions (like RavenDB or PostgreSQL), or maybe it's a conceptual transaction representing the work you perform as a consequence of handling a message, e.g., updating documents in MongoDB, moving files in the file system, or modifying in-memory data structures.

The fact that the "work transaction" is conceptual makes it impossible to support Exactly Once delivery – it's simply not generally possible to commit or roll back a "work transaction" and a "queue transaction" (the protocol with the message queue system) atomically and consistently.

## Idempotence in CAP

In CAP, the **At Least Once** delivery guarantee is used.

Since CAP uses a temporary storage medium (database table), At Most Once could theoretically be achieved, but to strictly guarantee that messages are not lost, we do not provide related functions or configurations.

### Why We Don't Provide (Achieve) Idempotency

1. Message successfully written, but Consumer method execution failed.  

    There are many reasons why the Consumer method might fail. Without knowing the specific scenario, it's unclear whether retrying blindly or not retrying is the correct choice.
    For example, if the consumer is a debit service and the debit execution succeeds but fails to write the debit log, CAP will consider the consumer failed and retry. If the client doesn't guarantee idempotency, the framework will retry, inevitably leading to serious consequences like multiple debits.

2. Consumer method execution succeeded, but the same message is received again.  

    This scenario is also possible. If the Consumer has already executed successfully but for some reason (e.g., broker recovery), the same message is received again, CAP will treat it as a new message. Message will be executed again by the Consumer. Because it is a new message, CAP cannot ensure idempotency at this point.

3. Current data storage mode cannot guarantee idempotency.  

    Since the CAP message table for successfully consumed messages is deleted after 1 hour, historical messages cannot be verified for idempotency. If the broker has been maintained or manually processed some messages for some reason, there's no way to verify if they were already processed.

4. Industry practices.

    Many event-driven frameworks require users to ensure idempotent operations, such as ENode, RocketMQ, etc.

From an implementation perspective, CAP could provide some less stringent idempotency, but strict idempotency cannot be guaranteed.

### Naturally Idempotent Message Processing

Generally, the best way to handle message redeliveries is to make the processing of each message naturally idempotent.

Natural idempotence occurs when processing a message consists of calling an idempotent method on a domain object, like:

```
obj.MarkAsDeleted();
```

or

```
obj.UpdatePeriod(message.NewPeriod);
```

You can use `INSERT ON DUPLICATE KEY UPDATE` provided by the database to achieve this easily.

### Explicitly Handling Redeliveries

Another way to make message processing idempotent is to explicitly track IDs of processed messages and then handle redeliveries in your code.

Assuming you track message IDs using an `IMessageTracker` that uses the same transactional data store as the rest of your work, your code might look like this:

```c#
readonly IMessageTracker _messageTracker;

public SomeMessageHandler(IMessageTracker messageTracker)
{
    _messageTracker = messageTracker;
}

[CapSubscribe]
public async Task Handle(SomeMessage message) 
{
    if (await _messageTracker.HasProcessed(message.Id))
    {
        return;
    }

    // Do the actual work here
    // ...

    // Record that this message has been processed
    await _messageTracker.MarkAsProcessed(message.Id);
}
```

For the `IMessageTracker` implementation, you can use a message ID storage system like Redis or a database with a corresponding processing state.

================================================
FILE: docs/content/user-guide/en/cap/messaging.md
================================================
# Message

The data sent using the `ICapPublisher` interface is called a `Message`.

!!! WARNING "TimeoutException thrown in consumer using HTTPClient"
    By default, if the consumer throws an `OperationCanceledException` (including `TaskCanceledException`), it is considered normal user behavior, and the exception is ignored. However, if you use `HttpClient` in the consumer method and configure a request timeout, you may need to handle exceptions separately and re-throw non-`OperationCanceledException` exceptions due to a [design issue](https://github.com/dotnet/runtime/issues/21965) in `HttpClient`. Refer to issue #1368 for more details.

## Compensating Transaction

Wiki: [Compensating Transaction](https://en.wikipedia.org/wiki/Compensating_transaction)

In some cases, consumers need to return an execution result to notify the publisher, allowing the publisher to perform compensation actions. This process is called message compensation.

Typically, you can notify the upstream system by publishing a new message in the consumer code. CAP simplifies this by allowing you to specify the `callbackName` parameter when publishing a message. This feature is generally applicable to point-to-point consumption. Here is an example:

For instance, in an e-commerce application, an order's initial status is "pending." The status is updated to "succeeded" when the product quantity is successfully deducted; otherwise, it is marked as "failed."

```C#
// =============  Publisher =================

_capBus.Publish("place.order.qty.deducted", 
    contentObj: new { OrderId = 1234, ProductId = 23255, Qty = 1 }, 
    callbackName: "place.order.mark.status");    

// publisher using `callbackName` to subscribe consumer result

[CapSubscribe("place.order.mark.status")]
public void MarkOrderStatus(JsonElement param)
{
    var orderId = param.GetProperty("OrderId").GetInt32();
    var isSuccess = param.GetProperty("IsSuccess").GetBoolean();
    
    if(isSuccess){
        // mark order status to succeeded
    }
    else{
       // mark order status to failed
    }
}

// =============  Consumer ===================

[CapSubscribe("place.order.qty.deducted")]
public object DeductProductQty(JsonElement param)
{
    var orderId = param.GetProperty("OrderId").GetInt32();
    var productId = param.GetProperty("ProductId").GetInt32();
    var qty = param.GetProperty("Qty").GetInt32();

    //business logic 

    return new { OrderId = orderId, IsSuccess = true };
}
```

### Controlling Callback Response

You can inject the `CapHeader` parameter in the subscription method using the `[FromCap]` attribute and use its methods to add extra headers to the callback context or terminate the callback.

Example:

```cs
[CapSubscribe("place.order.qty.deducted")]
public object DeductProductQty(JsonElement param, [FromCap] CapHeader header)
{
    var orderId = param.GetProperty("OrderId").GetInt32();
    var productId = param.GetProperty("ProductId").GetInt32();
    var qty = param.GetProperty("Qty").GetInt32();

    // Add additional headers to the response message
    header.AddResponseHeader("some-message-info", "this is the test");
    // Or add a callback to the response
    header.AddResponseHeader(DotNetCore.CAP.Messages.Headers.CallbackName, "place.order.qty.deducted-callback");

    // If you no longer want to follow the sender's specified callback and want to modify it, use the RewriteCallback method.
    header.RewriteCallback("new-callback-name");

    // If you want to terminate/stop, or no longer respond to the sender, call RemoveCallback to remove the callback.
    header.RemoveCallback();

    return new { OrderId = orderId, IsSuccess = true };
}
```

## Heterogeneous system integration

In version 3.0+, we reconstructed the message structure. We used the Header in the message protocol in the message queue to transmit some additional information, so that we can do it in the Body without modifying or packaging the user’s original The message data format and content are sent.

This approach facilitates better integration with heterogeneous systems. Compared to previous versions, users no longer need to understand the internal message structure used by CAP to complete integration tasks.

Now we divide the message into Header and Body for transmission.

The data in the body is the content of the original message sent by the user, that is, the content sent by calling the Publish method. We do not perform any packaging, but send it to the message queue after serialization.

In the Header, we need to pass some additional information so that the CAP can extract the key features for operation when the message is received.

The following is the content that needs to be written into the header of the message when sending a message in a heterogeneous system:

 | Key           | DataType | Description                                                    |
 | ------------- | -------- | -------------------------------------------------------------- |
 | cap-msg-id    | long     | Message Id, Generated by snowflake algorithm                   |
 | cap-msg-name  | string   | The name of the message                                        |
 | cap-msg-type  | string   | The type of message, `typeof(T).FullName`(not required)        |
 | cap-senttime  | string   | sending time (not required)                                    |
 | cap-kafka-key | string   | Partitioning by Kafka Key                                      |

### Custom headers

To consume messages sent without CAP headers, Azure Service Bus, Kafka, and RabbitMQ consumers can inject a minimal set of headers using the `CustomHeadersBuilder` property as shown below (RabbitMQ example):
```C#
container.AddCap(x =>
{
    x.UseRabbitMQ(z =>
    {
        z.ExchangeName = "TestExchange";
        z.CustomHeadersBuilder = (msg, sp) =>
        [
            new(DotNetCore.CAP.Messages.Headers.MessageId, sp.GetRequiredService<ISnowflakeId>().NextId().ToString()),
            new(DotNetCore.CAP.Messages.Headers.MessageName, msg.RoutingKey)
        ];
    });
});
```

After adding `cap-msg-id` and `cap-msg-name`, CAP consumers can receive messages sent directly from external systems, such as the RabbitMQ management tool when using RabbitMQ as a transport.

To publish messages with CAP headers:

```C#
var headers = new Dictionary<string, string?>()
{
    { "cap-kafka-key", request.OrderId }
};
_publisher.Publish<OrderRequest>("OrderRequest", request, headers);
```

## Scheduling

After CAP receives a message, it sends the message to Transport (RabbitMQ, Kafka...), which handles the transportation.
 
When you send a message using the `ICapPublisher` interface, CAP dispatches it to the corresponding Transport. Currently, bulk messaging is not supported.

For more information on transports, see the [Transports](../transport/general.md) section.

## Storage 

CAP stores messages after receiving them. For more information on storage, see the [Storage](../storage/general.md) section.

## Retry

Retrying is a crucial aspect of the CAP architecture. CAP retries messages that fail to send or consume, employing several retry strategies throughout its design.

### Send Retry

When the broker crashes, connection fails, or an abnormality occurs during message sending, CAP retries the send. It performs 3 immediate retries, then after 4 minutes (FallbackWindowLookbackSeconds), it retries every minute with a +1 increment. When the total number of retries reaches 50, CAP stops retrying.

You can adjust the total number of retries by setting [FailedRetryCount](configuration.md#failedretrycount) in CapOptions or use [FailedThresholdCallback](configuration.md#failedthresholdcallback) to receive notifications when the maximum retry count is reached.

Retries will stop when the maximum is reached. You can see the failure reason in Dashboard and choose whether to manually retry.

### Consumption Retry

When the Consumer receives a message, the consumer method is executed and will retry if an exception occurs. This retry strategy is the same as the send retry.

Version 7.1.0 introduced database-based distributed locks to handle concurrent database fetches during retry operations across multiple instances. You need to explicitly configure the `UseStorageLock` option to true.

Whether sending or consumption fails, the exception message is stored in the cap-exception field within the message header. You can find it in the Content field's JSON in the database table.

## Data Cleanup

The database message table has an `ExpiresAt` field indicating the message expiration time. When a message is sent successfully, its status changes to `Successed`, and `ExpiresAt` is set to **1 day** later. 

When consumption fails, the message status changes to `Failed` and `ExpiresAt` is set to **15 days** later (you can customize this using the [FailedMessageExpiredAfter](configuration.md#failedmessageexpiredafter) configuration option).

By default, messages in the table are deleted every **5 minutes** to prevent performance degradation from excessive data. The cleanup process is performed when the `ExpiresAt` field is not empty and is less than the current time. 

That is, messages with `Failed` status (by default, they have been retried 50 times) will also be cleaned up after **15 days** if you do not manually intervene.

You can customize the cleanup interval time using the [CollectorCleaningInterval](configuration.md#collectorcleaninginterval) configuration option.


================================================
FILE: docs/content/user-guide/en/cap/serialization.md
================================================
# Serialization

We provide the `ISerializer` interface to support message serialization. By default, JSON is used to serialize messages and store them in the database.

## Custom Serialization

```C#
public class YourSerializer : ISerializer
{
    Task<TransportMessage> SerializeAsync(Message message)
    {

    }
 
    Task<Message> DeserializeAsync(TransportMessage transportMessage, Type valueType)
    {

    }
}
```

Then register your serializer implementation in the container:

```C#
services.AddSingleton<ISerializer, YourSerializer>();

services.AddCap( /* ... */ );
```


================================================
FILE: docs/content/user-guide/en/cap/transactions.md
================================================
# Transaction

## Distributed Transactions?

CAP does not provide out-of-the-box MS DTC or 2PC (Two-Phase Commit) based distributed transactions. Instead, we provide a solution to handle problems encountered in distributed transactions.

In a distributed environment, using 2PC or DTC-based distributed transactions can be expensive due to communication overhead, which affects performance. Additionally, distributed transactions based on 2PC or DTC are subject to the **CAP theorem** – when network partitioning occurs, you must sacrifice availability (the A in CAP).

> A distributed transaction is a very complex process with many moving parts that can fail. Moreover, if these parts run on different machines or in different data centers, the process of committing a transaction can become very long and unreliable.

> This can seriously affect user experience and overall system bandwidth. So **one of the best ways to solve distributed transaction problems is to avoid them completely**.[^1]

For handling distributed transactions, CAP uses the "Eventual Consistency and Compensation" approach.

### Eventual Consistency and Compensation [^1]

[^1]: This chapter is quoted from: https://www.baeldung.com/transactions-across-microservices

By far, one of the most feasible models of handling consistency across microservices is [eventual consistency](https://en.wikipedia.org/wiki/Eventual_consistency).

This model doesn’t enforce distributed ACID transactions across microservices. Instead, it proposes to use some mechanisms of ensuring that the system would be eventually consistent at some point in the future.

#### A Case for Eventual Consistency

For example, suppose we need to solve the following task:

* register a user profile  
* do some automated background check that the user can actually access the system

Second task is to ensure, for example, that this user wasn’t banned from our servers for some reason.

But it could take time, and we’d like to extract it to a separate microservice. It wouldn’t be reasonable to keep the user waiting for so long just to know that he was registered successfully.

**One way to solve it would be with a message-driven approach including compensation**. Let’s consider the following architecture:

* the user microservice tasked with registering a user profile  
* the validation microservice tasked with doing a background check  
* the messaging platform that supports persistent queues  

The messaging platform could ensure that the messages sent by the microservices are persisted. Then they would be delivered at a later time if the receiver wasn't currently available

#### Best case scenario

In this architecture, best case scenario would be:

* the user microservice registers a user, saving information about him in its local database
* the user microservice marks this user with a flag. It could signify that this user hasn’t yet been validated and doesn’t have access to full system functionality
* a confirmation of registration is sent to the user with a warning that not all functionality of the system is accessible right away
* the user microservice sends a message to the validation microservice to do the background check of a user
* the validation microservice runs the background check and sends a message to the user microservice with the results of the check
* if the results are positive, the user microservice unblocks the user
* if the results are negative, the user microservice deletes the user account

After we’ve gone through all these steps, the system should be in a consistent state. However, for some period of time, user entity appeared to be in an incomplete state.

The last step, when the user microservice removes the invalid account, is a compensation phase.

#### Failure Scenarios

Now let’s consider some failure scenarios:

* if the validation microservice is not accessible, then the messaging platform with its persistent queue functionality ensures that the validation microservice would receive this message at some later time
* suppose the messaging platform fails, then the user microservice tries to send the message again at some later time, for example, by scheduled batch-processing of all users that were not yet validated
* if the validation microservice receives the message, validates the user but can’t send the answer back due to the messaging platform failure, the validation microservice also retries sending the message at some later time
* if one of the messages got lost, or some other failure happened, the user microservice finds all non-validated users by scheduled batch-processing and sends requests for validation again

Even if some of the messages were issued multiple times, this wouldn’t affect the consistency of the data in the microservices’ databases.

**By carefully considering all possible failure scenarios, we can ensure that our system would satisfy the conditions of eventual consistency. At the same time, we wouldn’t need to deal with the costly distributed transactions.**

But we have to be aware that ensuring eventual consistency is a complex task. It doesn’t have a single solution for all cases.

================================================
FILE: docs/content/user-guide/en/getting-started/contributing.md
================================================
# Contributing

One of the easiest ways to contribute is to participate in discussions and address issues. 

If you have any questions or problems, please report them on the CAP repository:

<a href="https://github.com/dotnetcore/cap/issues/new"><button data-md-color-primary="purple"><i class="fa fa-github fa-2x"></i> Report Issue</button></a>
<a href="https://github.com/dotnetcore/cap/issues"><button data-md-color-primary="purple" type="submit"> Active Issues <i class="fa fa-github fa-2x"></i></button></a>

## Submitting Changes

You can also contribute by submitting pull requests with code changes.

> Pull requests let you tell others about changes you've pushed to a GitHub repository. Once a pull request is opened, you can discuss and review the potential changes with collaborators and add follow-up commits before the changes are merged into the repository.

## Additional Resources

* [Filtering issues and pull requests](https://help.github.com/articles/filtering-issues-and-pull-requests/)

* [Using search to filter issues and pull requests](https://help.github.com/articles/using-search-to-filter-issues-and-pull-requests/)

================================================
FILE: docs/content/user-guide/en/getting-started/introduction.md
================================================
# Introduction

CAP is an EventBus and a solution for solving distributed transaction problems in microservices or SOA systems. It helps you create a microservices system that is scalable, reliable, and easy to modify.

In Microsoft's [eShop](https://github.com/dotnet/eShop) microservices sample project, CAP is recommended as the EventBus for production environments.

!!! question "What is EventBus?"

    An EventBus is a mechanism that allows different components to communicate with each other without knowing each other. A component can send an Event to the EventBus without knowing who will pick it up or how many others will. Components can also listen to Events on an EventBus without knowing who sent them. This way, components can communicate without depending on each other. Also, it's very easy to substitute a component – as long as the new component understands the events being sent and received, other components will never know about the substitution.

Compared to other service buses or event buses, CAP has its own characteristics. It does not require users to implement or inherit any interface when sending or processing messages, providing very high flexibility. We believe that convention is greater than configuration, so CAP is very simple to use, very friendly to beginners, and lightweight.

CAP is modular in design and highly scalable. You have many options to choose from, including message queues, storage, serialization, and more. Many system elements can be replaced with custom implementations.

## Related videos

[Video: bilibili Tutorial](https://www.bilibili.com/video/av31582401/)

[Video: Youtube Tutorial](https://youtu.be/K1e4e0eddNE)

[Video: Youtube Tutorial - @CodeOpinion](https://www.youtube.com/watch?v=dnhPzILvgeo) 

[Video: Tencent Tutorial](https://www.cnblogs.com/savorboard/p/7243609.html)

## Related articles

[Article: Introduction and how to use](http://www.cnblogs.com/savorboard/p/cap.html)

[Article: New features in version 7.0](https://www.cnblogs.com/savorboard/p/cap-7-0.html)

[Article: New features in version 6.0](https://www.cnblogs.com/savorboard/p/cap-6-0.html)

[Article: New features in version 5.0](https://www.cnblogs.com/savorboard/p/cap-5-0.html)

[Article: New features in version 3.0](https://www.cnblogs.com/savorboard/p/cap-3-0.html)

[Article: New features in version 2.6](https://www.cnblogs.com/savorboard/p/cap-2-6.html)

[Article: New features in version 2.5](https://www.cnblogs.com/savorboard/p/cap-2-5.html)

[Article: New features in version 2.4](http://www.cnblogs.com/savorboard/p/cap-2-4.html)

[Article: New features in version 2.3](http://www.cnblogs.com/savorboard/p/cap-2-3.html)

[Article: .NET Core Community The first thousand-star project was born: CAP](https://www.cnblogs.com/forerunner/p/ncc-cap-with-over-thousand-stars.html)


================================================
FILE: docs/content/user-guide/en/getting-started/quick-start.md
================================================
# Quick Start

Learn how to build a microservices event bus architecture using CAP. This offers advantages over directly integrating message queues and provides many out-of-the-box features.

## Installation

```powershell
PM> Install-Package DotNetCore.CAP
```

## Integrated in ASP.NET Core

For a quick start, we use memory-based event storage and message transport.

```powershell
PM> Install-Package DotNetCore.CAP.InMemoryStorage
PM> Install-Package Savorboard.CAP.InMemoryMessageQueue
```

In `Startup.cs`, add the following configuration:

```c#
public void ConfigureServices(IServiceCollection services)
{
    services.AddCap(x =>
    {
        x.UseInMemoryStorage();
        x.UseInMemoryMessageQueue();
    });
}
```

## Publishing a Message

```c#
public class PublishController : Controller
{
    [Route("~/send")]
    public IActionResult SendMessage([FromServices] ICapPublisher capBus)
    {
        capBus.Publish("test.show.time", DateTime.Now);

        return Ok();
    }
}
```

### Publishing a Delayed Message

```c#
public class PublishController : Controller
{
    [Route("~/send/delay")]
    public IActionResult SendDelayMessage([FromServices] ICapPublisher capBus)
    {
        capBus.PublishDelay(TimeSpan.FromSeconds(100), "test.show.time", DateTime.Now);

        return Ok();
    }
}
```

### Publishing with Extra Headers

```c#
var header = new Dictionary<string, string>()
{
    ["my.header.first"] = "first",
    ["my.header.second"] = "second"
};

capBus.Publish("test.show.time", DateTime.Now, header);
```

## Processing a Message

```C#
public class ConsumerController : Controller
{
    [NonAction]
    [CapSubscribe("test.show.time")]
    public void ReceiveMessage(DateTime time)
    {
        Console.WriteLine("message time is: " + time);
    }
}
```

### Processing with Extra Headers

```c#
[CapSubscribe("test.show.time")]
public void ReceiveMessage(DateTime time, [FromCap] CapHeader header)
{
    Console.WriteLine("message time is: " + time);
    Console.WriteLine("message first header: " + header["my.header.first"]);
    Console.WriteLine("message second header: " + header["my.header.second"]);
}
```

## Summary

One of the most powerful advantages of asynchronous messaging over direct message queue integration is reliability. Failures in one part of the system don't propagate or cause the entire system to crash. Messages are stored inside CAP to ensure message reliability, and strategies such as retries are used to achieve eventual consistency of data between services.

================================================
FILE: docs/content/user-guide/en/monitoring/consul.md
================================================
# Consul

[Consul](https://www.consul.io/) is a distributed service mesh tool to connect, secure, and configure services across any runtime platform and public or private cloud.

## Consul Configuration for Dashboard

CAP's Dashboard uses Consul for service discovery to retrieve data from other nodes. You can switch to the Servers page to view other nodes.

![](https://camo.githubusercontent.com/54c00c6ae65ce1d7b9109ed8cbcdca703a050c47/687474703a2f2f696d61676573323031372e636e626c6f67732e636f6d2f626c6f672f3235303431372f3230313731302f3235303431372d32303137313030343232313030313838302d313136323931383336322e706e67)

Click the `Switch` button to switch to a different node. CAP will use a proxy to retrieve the data from that node.

The following is a configuration example that you need to configure on each node:

```C#
services.AddCap(x =>
{
    x.UseMySql(Configuration.GetValue<string>("ConnectionString"));
    x.UseRabbitMQ("localhost");
    x.UseDashboard();
    x.UseConsulDiscovery(_ =>
    {
        _.DiscoveryServerHostName = "localhost";
        _.DiscoveryServerPort = 8500;
        _.CurrentNodeHostName = Configuration.GetValue<string>("ASPNETCORE_HOSTNAME");
        _.CurrentNodePort = Configuration.GetValue<int>("ASPNETCORE_PORT");
        _.NodeId = Configuration.GetValue<string>("NodeId");
        _.NodeName = Configuration.GetValue<string>("NodeName");
    });
});
```

Running Consul 1.6.2:

```
consul agent -dev
```

Windows 10 with ASP.NET Core 3.1:

```sh
set ASPNETCORE_HOSTNAME=localhost&& set ASPNETCORE_PORT=5001&& dotnet run --urls=http://localhost:5001 NodeId=1 NodeName=CAP-1 ConnectionString="Server=localhost;Database=aaa;UserId=xxx;Password=xxx;"
set ASPNETCORE_HOSTNAME=localhost&& set ASPNETCORE_PORT=5002&& dotnet run --urls=http://localhost:5002 NodeId=2 NodeName=CAP-2 ConnectionString="Server=localhost;Database=bbb;UserId=xxx;Password=xxx;"
```

================================================
FILE: docs/content/user-guide/en/monitoring/dashboard.md
================================================
# Dashboard

CAP provides a Dashboard for viewing messages. The features provided by the Dashboard make it easy to view and manage messages.

!!! WARNING "Usage Limit"
    The Dashboard is only supported for ASP.NET Core. Console applications are not supported.
    
## Enable Dashboard

By default, the Dashboard middleware is not launched. To enable Dashboard functionality, add the following code to your configuration:

```C#
services.AddCap(x =>
{
    // ...

    // Register Dashboard
    x.UseDashboard();
});
```

By default, you can access the Dashboard at the URL `http://localhost:xxx/cap`.

### Dashboard Configuration

* **PathMatch**

> Default: '/cap'

Change the path of the Dashboard by modifying this configuration option.

* **StatsPollingInterval**

> Default: 2000ms

Configures the polling interval for the Dashboard frontend to get the status from the /stats interface.

* **AllowAnonymousExplicit**

> Default: true

Explicitly allows anonymous access for the CAP dashboard API by passing AllowAnonymous to the ASP.NET Core global authorization filter.

* **AuthorizationPolicy**

> Default: null

Authorization policy for the Dashboard. Required if `AllowAnonymousExplicit` is false.

### Custom Authentication

From version 8.0.0, the CAP Dashboard leverages ASP.NET Core authentication mechanisms, allowing extensibility through custom authorization policies and ASP.NET Core authentication and authorization middlewares. For more details on ASP.NET Core authentication, see [the official documentation](https://learn.microsoft.com/en-us/aspnet/core/security/authentication/?view=aspnetcore-8.0).

You can view the examples below in the `Sample.Dashboard.Auth` sample project.

#### Example: Anonymous Access

```csharp
services.AddCap(cap =>
    {
        cap.UseDashboard(d =>
        {
            d.AllowAnonymousExplicit = true;
        });
        cap.UseInMemoryStorage();
        cap.UseInMemoryMessageQueue();
    });
```

#### Example: Open ID Connect

```csharp
services
    .AddAuthorization(options =>
        { 
            options.AddPolicy(DashboardAuthorizationPolicy, policy => policy
                .AddAuthenticationSchemes(OpenIdConnectDefaults.AuthenticationScheme)
                .RequireAuthenticatedUser());
        })
        .AddAuthentication(opt => opt.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie()
        .AddOpenIdConnect(options =>
        {
            ...
        });
    
    services.AddCap(cap =>
    {
        cap.UseDashboard(d =>
        {
            d.AuthorizationPolicy = DashboardAuthorizationPolicy;
        });
        cap.UseInMemoryStorage();
        cap.UseInMemoryMessageQueue();
    });
```

#### Example: Custom Authentication Scheme

```csharp
const string MyDashboardAuthenticationPolicy = "MyDashboardAuthenticationPolicy";
    
services.AddAuthorization(options =>
    { 
        options.AddPolicy(MyDashboardAuthenticationPolicy, policy => policy
            .AddAuthenticationSchemes(MyDashboardAuthenticationSchemeDefaults.Scheme)
            .RequireAuthenticatedUser());
    })
    .AddAuthentication()
    .AddScheme<MyDashboardAuthenticationSchemeOptions, MyDashboardAuthenticationHandler>(MyDashboardAuthenticationSchemeDefaults.Scheme, null);
    
services.AddCap(cap =>
    {
        cap.UseDashboard(d =>
        {
            d.AuthorizationPolicy = MyDashboardAuthenticationPolicy;
        });
        cap.UseInMemoryStorage();
        cap.UseInMemoryMessageQueue();
    });
```


================================================
FILE: docs/content/user-guide/en/monitoring/diagnostics.md
================================================
# Diagnostics

Diagnostics provides a set of features that make it easy to document critical operations that occur during application execution, their execution time, etc., allowing administrators to find the root cause of problems, especially in production environments.

## Tracing

CAP provides support for `DiagnosticSource` with a listener name of `CapDiagnosticListener`.

Diagnostics provides the following tracing event information:

* Before the message is persisted
* After the message is persisted
* Message persistence exception
* Before the message is sent to the message queue
* After the message is sent to the message queue
* Message sending exception to the message queue
* Messages saved from message queue consumption before persistence
* After messages are saved from message queue consumption
* Before the subscriber method is executed
* After the subscriber method is executed
* Subscriber method execution exception

Related objects can be found in the `DotNetCore.CAP.Diagnostics` namespace.

### Tracing with Apache Skywalking

Skywalking's C# client provides support for CAP Diagnostics. You can use [SkyAPM-dotnet](https://github.com/SkyAPM/SkyAPM-dotnet) for tracking.

Read the [README](https://github.com/SkyAPM/SkyAPM-dotnet/blob/master/README.md) to integrate it into your project.

Example tracking images:

![](https://user-images.githubusercontent.com/8205994/71006463-51025980-2120-11ea-82dc-bffa5530d515.png)

![](https://user-images.githubusercontent.com/8205994/71006589-7b541700-2120-11ea-910b-7e0f2dfddce8.png)

### Other APM Support

Currently, we only support Skywalking. If you want to support CAP diagnostic events in other APMs, you can refer to the code [here](https://github.com/SkyAPM/SkyAPM-dotnet/tree/master/src/SkyApm.Diagnostics.CAP) for implementation. We also welcome Pull Requests.

## Metrics

Metrics are numerical measurements reported over time. They are typically used to monitor application health and generate alerts. For example, a web service might track the number of requests it receives each second, how many milliseconds it takes to respond, and how many responses return an error to the user.

CAP 7.0 is support for `EventSource`, and the counters name is `DotNetCore.CAP.EventCounter`.

CAP provides the following metrics:

* Publish rate pre seconds
* Consume rate pre seconds
* Invoke Subscriber rate pre seconds
* Subscriber elpased time mean pre seconds 

### Monitor with dotnet-counters

[dotnet-counters](https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-counters) is a performance monitoring tool for ad-hoc health monitoring and first-level performance investigation. It can observe performance counter values that are published via the EventCounter API or the Meter API. 

Use the following commands to monitor metrics in CAP:

```ps
dotnet-counters ps
dotnet-counters monitor --process-id=25496 --counters=DotNetCore.CAP.EventCounter
```

process-id: The ID of the CAP process to collect counter data from.

![img](../../../img/dotnet-counters.gif)

### Monitor with dashboard

You can configure `x.UseDashboard()` to open the dashboard to view Metrics graph charts.

![img](../../../img/dashboard-metrics.gif)

In the Realtime Metric Graph, the time axis will scroll in real time over time so that you can see the rate of publishing and consuming messages per second, And the consumer execution time is "dotted" on the Y1 axis (Y0 axis is the rates, and the Y1 axis is the execution elpsed time).
 



================================================
FILE: docs/content/user-guide/en/monitoring/kubernetes.md
================================================
# Kubernetes

[Kubernetes](https://kubernetes.io), also known as K8s, is an open-source system for automating deployment, scaling, and management of containerized applications.

## Kubernetes in the Dashboard

The Dashboard has supported Kubernetes as a service discovery mechanism since version 7.2.0. You can navigate to the Nodes page, select a Kubernetes namespace, and CAP will list all Services within that namespace. After clicking the Switch button, the Dashboard will check if the CAP service of that node is available. If it is, the Dashboard will proxy to the switched node to display data.

Here is a configuration example:

```cs
services.AddCap(x =>
{
    // ...
    x.UseDashboard();
    x.UseK8sDiscovery();
});
```

## UseK8sDiscovery Configuration

This configuration option controls whether the Dashboard/Nodes page lists every K8s `Service` by default. If set to `True`, only services with the `dotnetcore.cap.visibility: show` label will be listed. See the **Kubernetes Labels Configuration** section for more information about labels.

* **ShowOnlyExplicitVisibleNodes** 

> Default: false

```cs
services.AddCap(x =>
{
    // ...
    x.UseK8sDiscovery(opt =>
    {
        opt.ShowOnlyExplicitVisibleNodes = true;
    });
});
```

The component automatically detects whether it is running inside a Kubernetes cluster. If it is, the Pod must be granted Kubernetes API permissions. Refer to the next section.

## Assigning Pod Access to Kubernetes API 

If the ServiceAccount associated with your Deployment does not have access to the Kubernetes API, you must grant `namespaces` and `services` resources with `get` and `list` permissions.

Here is an example YAML. First, create a ServiceAccount and ClusterRole with the appropriate permissions, then bind them using ClusterRoleBinding. Finally, use `serviceAccountName: api-access` in your Deployment.

```
apiVersion: v1
kind: ServiceAccount
metadata:
  name: api-access

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: ns-svc-reader
rules:
- apiGroups: [""]
  resources: ["namespaces", "services"]
  verbs: ["get", "watch", "list"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-pods
subjects:
- kind: ServiceAccount
  name: api-access
  namespace: default
roleRef:
  kind: ClusterRole
  name: ns-svc-reader
  apiGroup: rbac.authorization.k8s.io
  
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-access-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: api-access-app
  template:
    metadata:
      labels:
        app: api-access-app
    spec:
      serviceAccountName: api-access
      containers:
      - name: api-access-container
        image: your_image
        
---
apiVersion: v1
kind: Service
metadata:
  name: api-access-service
spec:
  selector:
    app: api-access-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
```

From version `8.3.0` and onwards you can use a `Role` instead of `ClusterRole` to allow discovery of services only inside the namespace that the dashboard is running. Kubernetes Roles has limited jurisdiction inside the namespace. In the above example just remove ClusterRole and ClusterRoleBinding and instead use the following: 

```
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: ns-svc-reader
rules:
- apiGroups: [""]
  resources: ["services"]
  verbs: ["get", "watch", "list"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-pods
subjects:
- kind: ServiceAccount
  name: api-access
  namespace: default
roleRef:
  kind: ClusterRole
  name: ns-svc-reader
  apiGroup: rbac.authorization.k8s.io

```

## Kubernetes Labels Configuration

The list of Nodes showed in the dashboard can be controlled by adding labels to the to your kubernetes services. 


- `dotnetcore.cap.visibility` label is used to show or hide a service from the list. 

    > Allowed Values: show | hide

    > Examples: `dotnetcore.cap.visibility: show` or `dotnetcore.cap.visibility: hide`

By default every k8s service is listed with the first port found in the service. However if more ports are present on the service you can select the wanted by using the following labels: 

- `dotnetcore.cap.portName` label is used to filter the wanted port of the service. 

    > Allowed Values: string

    > Examples: `dotnetcore.cap.portName: grpc` or `dotnetcore.cap.portName: http`

If not found any port with the given name, it will try to match the next label portIndex

- `dotnetcore.cap.portIndex` label is used to filter the wanted port of the service. This filter is taken into consideration only if no label portName is set or a non matching portName is set.

    > Allowed Values: number represented as string ex: '2' or '14'

    > Examples: `dotnetcore.cap.portIndex: '1'` or `dotnetcore.cap.portIndex: '3'`

  If the provided index is outside of bounds then it will fallback to the first port (index:0)





## Using Dashboard Standalone

You can use the Dashboard standalone without configuring CAP, in this case, the Dashboard can be deployed as a separate Pod in the Kubernetes cluster just for data viewing. The service to be viewed no longer needs to configure the `cap.UseK8sDiscovery()` option.

```
services.AddCapDashboardStandalone();
```

Similarly, you need to configure the access for the ServiceAccount for this Pod.

================================================
FILE: docs/content/user-guide/en/monitoring/opentelemetry.md
================================================
# OpenTelemetry

[https://opentelemetry.io/](https://opentelemetry.io/)

OpenTelemetry is a collection of tools, APIs, and SDKs that helps you instrument, generate, collect, and export telemetry data (metrics, logs, and traces). This data helps you analyze your software's performance and behavior.nTelemetry 

https://opentelemetry.io/

OpenTelemetry is a collection of tools, APIs, and SDKs. Use it to instrument, generate, collect, and export telemetry data (metrics, logs, and traces) to help you analyze your software’s performance and behavior.

## Integration

You can find information about using OpenTelemetry in console applications or ASP.NET Core [here](https://opentelemetry.io/docs/instrumentation/net/getting-started/). Here we mainly describe how to trace CAP data to OpenTelemetry.

### Configuration

Install the CAP OpenTelemetry package into your project:

```C#
dotnet add package DotNetCore.CAP.OpenTelemetry
```

OpenTelemetry data comes from [Diagnostics](diagnostics.md). Add the CAP instrumentation to your OpenTelemetry configuration:

```C#
services.AddOpenTelemetryTracing((builder) => builder
    .AddAspNetCoreInstrumentation()
    .AddCapInstrumentation()    // <-- Add this line
    .AddZipkinExporter()
);
```

If you don't use a framework that handles this automatically (like ASP.NET Core), make sure you enable a listener. For example:

```C#
ActivitySource.AddActivityListener(new ActivityListener()
{
    ShouldListenTo = _ => true,
    Sample = (ref ActivityCreationOptions<ActivityContext> _) => ActivitySamplingResult.AllData,
    ActivityStarted = activity => Console.WriteLine($"{activity.ParentId}:{activity.Id} - Start"),
    ActivityStopped = activity => Console.WriteLine($"{activity.ParentId}:{activity.Id} - Stop")
});
```
Here is a diagram of CAP's tracking data in Zipkin:

<img src="/img/opentelemetry.png">

### Context Propagation

CAP supports [Context Propagation](https://opentelemetry.io/docs/instrumentation/js/propagation/) by injecting `traceparent` and `baggage` headers when sending messages and restoring the context from those headers when receiving messages.

CAP uses the configured `Propagators.DefaultTextMapPropagator` propagator, which is usually set to both `TraceContextPropagator` and `BaggagePropagator` by the [dotnet OpenTelemetry SDK](https://github.com/open-telemetry/opentelemetry-dotnet/blob/main/src/OpenTelemetry/Sdk.cs#L21), but can be configured in your client program. For example, to opt out of Baggage propagation, you can call:

```C#
OpenTelemetry.Sdk.SetDefaultTextMapPropagator(
    new TraceContextPropagator());
```

For more details, see the [dotnet OpenTelemetry.Api README](https://github.com/open-telemetry/opentelemetry-dotnet/blob/main/src/OpenTelemetry.Api/README.md?plain=1#L455).

================================================
FILE: docs/content/user-guide/en/samples/eshoponcontainers.md
================================================
# eShopOnContainers

eShopOnContainers is a sample application written in C# running on .NET Core that uses a microservice architecture and Domain Driven Design.

> A .NET Core reference application powered by Microsoft, based on a simplified microservices architecture with Docker containers.

> This reference application is cross-platform on both server and client sides, thanks to .NET Core services that can run on Linux or Windows containers depending on your Docker host, and Xamarin for mobile apps running on Android, iOS, or Windows/UWP, plus any browser for client web apps.

> The architecture demonstrates a microservice-oriented implementation with multiple autonomous microservices (each owning its own data/database) and implementing different approaches within each microservice (simple CRUD vs. DDD/CQRS patterns). It uses HTTP as the communication protocol between client apps and microservices, and supports asynchronous communication for data propagation across services based on Integration Events and an Event Bus (a lightweight message broker that you can choose between RabbitMQ or Azure Service Bus) plus other features in the roadmap.

## eShopOnContainers with CAP

You can see how to use CAP in eShopOnContainers in the GitHub repository:

https://github.com/yang-xiaodong/eShopOnContainers

================================================
FILE: docs/content/user-guide/en/samples/faq.md
================================================
# FAQ

!!! faq "Is there an IM group (e.g., Tencent QQ group) to learn and chat about CAP?"

    There is not. Instead of spending time in IM groups, I encourage developers to develop independent thinking skills and solve problems using the documentation. You can also create issues or send emails if problems persist.

!!! faq "Does each application need a separate database for producer and consumer in CAP?"

    Not necessarily. A recommendation is to use a dedicated database for each application. However, see the Q&A below for alternatives.

!!! faq "How can I use the same database for different applications?"
    
    Define a table prefix name in the `ConfigureServices` method.
    
    Code example:

    ```c#
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCap(x =>
        {
            x.UseKafka("");
            x.UseMySql(opt =>
            {
                opt.ConnectionString = "connection string";
                opt.TableNamePrefix = "appone"; // Use different table name prefix here
            });
        });
    }
    ```

!!! faq "Can CAP avoid using the database for event storage? I just want to send messages."

    Not yet. CAP's purpose is to ensure consistency in microservice or SOA architectures. The solution is based on ACID features of the database. There's no point in a simple message queue wrapper without database support.

!!! faq "If the consumer fails, can I roll back the SQL executed by the producer?"

    No, you cannot roll back. CAP provides eventual consistency, not immediate rollback.

    Consider a scenario where you call a third-party payment service. If you successfully call Alipay's interface but your own code fails afterward, will Alipay roll back? If not, what should you do? The same principle applies here.


================================================
FILE: docs/content/user-guide/en/samples/github.md
================================================
# GitHub Samples

You can find sample code in the GitHub repository:

https://github.com/dotnetcore/CAP/tree/master/samples

CAP + Aspire + Azure Service Bus + Azure SQL:

https://github.com/NikiforovAll/cap-aspire

================================================
FILE: docs/content/user-guide/en/storage/general.md
================================================
# General

CAP requires a storage medium with persistence capabilities to store event messages in databases or other NoSQL facilities. CAP uses this approach to protect against message loss in any environment or network issues. Reliability of messages is the cornerstone of distributed transactions, so messages must never be lost.

## Persistence

### Before Sent

Before the message enters the message queue, CAP persists the message in a local database table. This ensures that the message is not lost when the message queue is unavailable or a network error occurs.

To ensure the reliability of this mechanism, CAP uses the same database transactions as the business code to ensure that business operations and CAP messages are consistent during persistence. If any exception occurs during message persistence, the database will roll back.

### After Sent

After the message enters the message queue, CAP starts the persistence function of the message queue. Here's how CAP messages are persisted in RabbitMQ and Kafka.

For message persistence in RabbitMQ, CAP uses a consumer queue with message persistence, though exceptions may occur.

!!! info "Ready for Production?"
    By default, queues registered by CAP in RabbitMQ are persistent. For production use, we recommend that you start all consumers once to create persistent queues. This ensures all queues are created before messages are sent.

Since Kafka has built-in message persistence using files, it automatically ensures that messages are properly persisted without loss once they enter Kafka.

## Storage

### Supported storages

CAP supports the following types of transaction-enabled databases for storage:

* [SQL Server](sqlserver.md)
* [MySQL](mysql.md)
* [PostgreSql](postgresql.md)
* [MongoDB](mongodb.md)
* [In-Memory Storage](in-memory-storage.md)

After CAP is started, two tables are generated in used storage, by default the name is `Cap.Published` and `Cap.Received`.

### Storage Data Structure

Table structure of **Published** :

NAME | DESCRIPTION | TYPE
:---|:---|:---
Id | Message Id | int
Version | Message Version | string
Name | Topic Name | string
Content | Json Content | string
Added | Added Time | DateTime
ExpiresAt | Expire time | DateTime
Retries | Retry times | int
StatusName | Status Name | string
 
Table structure of **Received** :

NAME | DESCRIPTION | TYPE
:---|:---|:---
Id | Message Id | int
Version | Message Version | string
Name | Topic Name | string
Group | Group Name | string
Content | Json Content | string
Added | Added Time | DateTime
ExpiresAt | Expire time | DateTime
Retries | Retry times | int
StatusName | Status Name | string

Table structure of **Lock** (Optional):

NAME | DESCRIPTION | TYPE
:---|:---|:---
Key | Lock Id | string
Instance | Acquired instance of lock | string
LastLockTime | Last acquired lock time | DateTime

### Wapper Object

When CAP sends a message, it will store original message object in a second package in the `Content` field. 

The following is the **Wapper Object** data structure of Content field.

NAME | DESCRIPTION | TYPE
:---|:---|:---
Id	| Message Id	| string
Timestamp |	Message created time |	string
Content |	Message content |	string
CallbackName |	Consumer callback topic name | string

The `Id` field is generate using the mongo [objectid algorithm](https://www.mongodb.com/blog/post/generating-globally-unique-identifiers-for-use-with-mongodb).


## Community-supported extensions

Thanks to the community for supporting CAP, the following is the implementation of community-supported storage

* SQLite ([@colinin](https://github.com/colinin)) :https://github.com/colinin/DotNetCore.CAP.Sqlite   

* LiteDB ([@maikebing](https://github.com/maikebing)) :https://github.com/maikebing/CAP.Extensions

* SQLite & Oracle ([@cocosip](https://github.com/cocosip)) :https://github.com/cocosip/CAP-Extensions   


================================================
FILE: docs/content/user-guide/en/storage/in-memory-storage.md
================================================
# In-Memory Storage

In-memory storage is commonly used in development and test environments. However, if you use memory-based storage, you lose the reliability guarantee of local transaction messages.

## Configuration

To use in-memory storage, you need to install the following package from NuGet:

```powershell
PM> Install-Package DotNetCore.CAP.InMemoryStorage
```

Next, add configuration items to the `ConfigureServices` method of `Startup.cs`.

```csharp

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddCap(x =>
    {
        x.UseInMemoryStorage();
        // x.UseXXX ...
    });
}

```

CAP will clean successful messages from memory every 5 minutes.

## Publish with transaction

In-memory storage does **not support** transactional message publishing.


================================================
FILE: docs/content/user-guide/en/storage/mongodb.md
================================================
# MongoDB

MongoDB is a cross-platform, document-oriented database program. Classified as a NoSQL database, MongoDB uses JSON-like documents with dynamic schema.

CAP has supported MongoDB since version 2.3. MongoDB supports ACID transactions starting from version 4.0, so CAP requires MongoDB 4.0 or higher. Additionally, MongoDB must be deployed as a cluster because ACID transactions require a replica set.

For a quick development of the MongoDB 4.0+ cluster for the development environment, you can refer to [this article](https://www.cnblogs.com/savorboard/p/mongodb-4-cluster-install.html).

## Configuration

To use MongoDB storage, you need to install the following package from NuGet:

```powershell
PM> Install-Package DotNetCore.CAP.MongoDB

```

Next, add configuration items to the `ConfigureServices` method of `Startup.cs`.

```csharp

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddCap(x =>
    {
        x.UseMongoDB(opt=>{
            //MongoDBOptions
        });
        // x.UseXXX ...
    });
}

```

#### MongoDB Options

NAME | DESCRIPTION | TYPE | DEFAULT
:---|:---|---|:---
DatabaseName | Database name | string | cap 
DatabaseConnection | Database connection string | string | mongodb://localhost:27017
ReceivedCollection | Database received message collection name | string | cap.received
PublishedCollection | Database published message collection name | string | cap.published

## Publish with transaction

The following example shows how to integrate CAP with MongoDB for local transactions:

```csharp
// NOTE: Before testing, you need to create the database and collection first.
// MongoDB cannot automatically create databases and collections within transactions,
// so you must create them separately. For example, insert a record to auto-create the collection.

// var mycollection = _client.GetDatabase("test")
//          .GetCollection<BsonDocument>("test.collection");
// mycollection.InsertOne(new BsonDocument { { "test", "test" } });

using (var session = _client.StartTransaction(_capBus, autoCommit: false))
{
    var collection = _client.GetDatabase("test")
            .GetCollection<BsonDocument>("test.collection");

    collection.InsertOne(session, new BsonDocument { { "hello", "world" } });

    _capBus.Publish("sample.rabbitmq.mongodb", DateTime.Now);

    session.CommitTransaction();
}
```

================================================
FILE: docs/content/user-guide/en/storage/mysql.md
================================================
# MySQL

MySQL is an open-source relational database management system. CAP fully supports MySQL. 

## Configuration

To use MySQL storage, you need to install the following package from NuGet:
```powershell
PM> Install-Package DotNetCore.CAP.MySql

```

Next, add configuration items to the `ConfigureServices` method of `Startup.cs`.

```csharp

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddCap(x =>
    {
        x.UseMySql(opt=>{
            //MySqlOptions
        });
        // x.UseXXX ...
    });
}

```

#### MySqlOptions

NAME | DESCRIPTION | TYPE | DEFAULT
:---|:---|---|:---
TableNamePrefix | CAP table name prefix | string | cap 
ConnectionString | Database connection string | string | null

## Publish with transaction

### ADO.NET with Transaction

```csharp
private readonly ICapPublisher _capBus;

using (var connection = new MySqlConnection(AppDbContext.ConnectionString))
{
    using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false))
    {
        // Your business code
        connection.Execute("insert into test(name) values('test')", 
            transaction: (IDbTransaction)transaction.DbTransaction);
        
        _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);

        transaction.Commit();
    }
}
```

### Entity Framework with Transaction

```csharp
private readonly ICapPublisher _capBus;

using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: false))
{
    dbContext.Persons.Add(new Person() { Name = "ef.transaction" });
    
    _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);

    dbContext.SaveChanges();
    trans.Commit();
}
```

================================================
FILE: docs/content/user-guide/en/storage/postgresql.md
================================================
# PostgreSQL

PostgreSQL is an open-source relational database management system. CAP fully supports PostgreSQL. 

## Configuration

To use PostgreSQL storage, you need to install the following package from NuGet:

```powershell
PM> Install-Package DotNetCore.CAP.PostgreSql

```

Next, add configuration items to the `ConfigureServices` method of `Startup.cs`.

```csharp

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddCap(x =>
    {
        x.UsePostgreSql(opt=>{
            //PostgreSqlOptions
        }); 
        // x.UseXXX ...
    });
}

```

#### PostgreSqlOptions

NAME | DESCRIPTION                | TYPE                 | DEFAULT
:---|:---------------------------|----------------------|:---
Schema | Database schema            | string               | cap 
ConnectionString | Database connection string | string               |
DataSource | [Data source](https://www.npgsql.org/doc/basic-usage.html#data-source) | [NpgsqlDataSource](https://www.npgsql.org/doc/api/Npgsql.NpgsqlDataSource.html) |

## Publish with transaction

### ADO.NET with Transaction

```csharp
private readonly ICapPublisher _capBus;

using (var connection = new NpgsqlConnection("ConnectionString"))
{
    using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false))
    {
        // Your business code
        connection.Execute("insert into test(name) values('test')", 
            transaction: (IDbTransaction)transaction.DbTransaction);
        
        _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);

        transaction.Commit();
    }
}
```

### Entity Framework with Transaction

```csharp
private readonly ICapPublisher _capBus;

using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: false))
{
    dbContext.Persons.Add(new Person() { Name = "ef.transaction" });
    
    _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);

    dbContext.SaveChanges();
    trans.Commit();
}
```

================================================
FILE: docs/content/user-guide/en/storage/sqlserver.md
================================================
# SQL Server

SQL Server is a relational database management system developed by Microsoft. CAP fully supports SQL Server. 

!!! warning "Warning"
    We currently use `Microsoft.Data.SqlClient` as the database driver, which is the future of SQL Server drivers. We have deprecated `System.Data.SqlClient` and recommend upgrading to the new driver.

## Configuration

To use SQL Server storage, you need to install the following package from NuGet:

```powershell
PM> Install-Package DotNetCore.CAP.SqlServer

```

Next, add configuration items to the `ConfigureServices` method of `Startup.cs`.

```csharp

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddCap(x =>
    {
        x.UseSqlServer(opt=>{
            //SqlServerOptions
        }); 
        // x.UseXXX ...
    });
}

```

#### SqlServerOptions

NAME | DESCRIPTION | TYPE | DEFAULT
:---|:---|---|:---
Schema | Database schema | string | Cap
ConnectionString | Database connection string | string | 

## Publish with transaction

### ADO.NET with Transaction

```csharp
private readonly ICapPublisher _capBus;

using (var connection = new SqlConnection("ConnectionString"))
{
    using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false))
    {
        // Your business code
        connection.Execute("insert into test(name) values('test')", 
            transaction: (IDbTransaction)transaction.DbTransaction);
        
        _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);

        transaction.Commit();
    }
}
```

### Entity Framework with Transaction

```csharp
private readonly ICapPublisher _capBus;

using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: false))
{
    dbContext.Persons.Add(new Person() { Name = "ef.transaction" });
    
    _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);

    dbContext.SaveChanges();
    trans.Commit();
}
```


================================================
FILE: docs/content/user-guide/en/transport/aws-sqs.md
================================================
# Amazon SQS

AWS SQS is a fully managed message queuing service that enables you to decouple and scale microservices, distributed systems, and serverless applications.

AWS SNS is a highly available, durable, secure, fully managed pub/sub messaging service that enables you to decouple microservices, distributed systems, and serverless applications.

## How CAP Uses AWS SNS and SQS

### SNS

Because CAP works based on the topic pattern, it requires AWS SNS, which simplifies the publish-subscribe architecture for messaging.

When CAP starts, all subscription names are registered as SNS topics. You will see a list of all registered topics in the AWS management console.

SNS does not support certain characters such as `.`, `:` in topic names, so CAP replaces them. It replaces `.` with `-` and `:` with `_`.

!!! note "Precautions"
    Amazon SNS currently limits published messages to a maximum size of 256 KB.

For example, you have the following two subscriber methods in your current project

```C#
[CapSubscribe("sample.sns.foo")]
public void TestFoo(DateTime value)
{
}

[CapSubscribe("sample.sns.bar")]
public void TestBar(DateTime value)
{
}
```
After CAP startups, you will see in SNS management console:

![img](../../../img/aws-sns-demo.png)

### SQS

For each consumer group, CAP will create a corresponding SQS queue. The queue name is the value of `DefaultGroup` in the configuration options, and the queue type is Standard.

The SQS queue will subscribe to the SNS topic as shown below:

![img](../../../img/aws-sns-demo.png)

!!! warning "Precautions"
    Due to AWS SNS limitations, when you remove a subscription method, CAP will not automatically delete the topics or queues in AWS SNS or SQS. You need to delete them manually.


## Configuration

To use AWS SQS as a transporter, you need to install the following package from NuGet:

```shell

Install-Package DotNetCore.CAP.AmazonSQS

```

Next, add configuration items to the `ConfigureServices` method of `Startup.cs`:

```csharp

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddCap(x =>
    {
        x.UseAmazonSQS(opt=>
        {
            //AmazonSQSOptions
        });
        // x.UseXXX ...
    });
}

```

#### AmazonSQS Options

The SQS configuration parameters provided directly by the CAP:

NAME | DESCRIPTION | TYPE | DEFAULT
:---|:---|---|:---
Region | AWS Region | Amazon.RegionEndpoint | 
Credentials | AWS AK SK Information | Amazon.Runtime.AWSCredentials | 

If your application runs on AWS EC2, you don't need to set credentials. Instead, you can directly apply an IAM policy to the EC2 instance.

Credentials require SNS and SQS IAM permissions.

================================================
FILE: docs/content/user-guide/en/transport/azure-service-bus.md
================================================
# Azure Service Bus

Microsoft Azure Service Bus is a fully managed enterprise integration message broker. Service Bus is most commonly used to decouple applications and services, and is a reliable and secure platform for asynchronous data and state transfer.

Azure Service Bus can be used in CAP as a message transporter.

## Configuration

!!! warning "Requirement"
    For the Service Bus pricing tier, CAP requires "Standard" or "Premium" to support Topic functionality.

To use Azure Service Bus as a message transporter, you need to install the following package from NuGet:

```powershell
PM> Install-Package DotNetCore.CAP.AzureServiceBus
```

Next, add configuration items to the `ConfigureServices` method of `Startup.cs`:

```csharp

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddCap(x =>
    {
        x.UseAzureServiceBus(opt=>
        {
            //AzureServiceBusOptions
        });
        // x.UseXXX ...
    });
}

```

#### Azure Service Bus Options

The Azure Service Bus configuration options provided by CAP:

| NAME                                 | DESCRIPTION                                                                                                                                                           | TYPE                                                                   | DEFAULT                          |
| :----------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | :------------------------------- |
| ConnectionString                     | Endpoint address                                                                                                                                                      | string                                                                 |                                  |
| TopicPath                            | Topic entity path                                                                                                                                                     | string                                                                 | cap                              |
| EnableSessions                       | Enable [Service bus sessions](https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-sessions)                                                          | bool                                                                   | false                            |
| MaxConcurrentSessions                | The maximum number of concurrent sessions that the processor can handle. Not applicable when EnableSessions is false.                                                 | int                                                                    | 8                                |
| SessionIdleTimeout                   | The maximum time to wait for a new message before the session is closed. If not specified, 60 seconds will be used by Azure Service Bus.                              | TimeSpan                                                               | null                             |
| SubscriptionAutoDeleteOnIdle         | Automatically delete subscription after a certain idle interval.                                                                                                      | TimeSpan                                                               | TimeSpan.MaxValue                |
| SubscriptionMessageLockDuration      | The amount of time the message is locked by a given receiver so that no other receiver receives the same message.                                                     | TimeSpan                                                               | 60 seconds                       |
| SubscriptionDefaultMessageTimeToLive | The default message time to live value for a subscription. This is the duration after which the message expires.                                                      | TimeSpan                                                               | TimeSpan.MaxValue                |
| SubscriptionMaxDeliveryCount         | The maximum number of times a message is delivered to the subscription before it is dead-lettered.                                                                    | int                                                                    | 10                               |
| MaxAutoLockRenewalDuration           | The maximum duration within which the lock will be renewed automatically. This value should be greater than the longest message lock duration.                        | TimeSpan                                                               | 5 minutes                        |
| ManagementTokenProvider              | Token provider                                                                                                                                                        | ITokenProvider                                                         | null                             |
| AutoCompleteMessages                 | Gets a value that indicates whether the processor should automatically complete messages after the message handler has completed processing                           | bool                                                                   | false                            |
| CustomHeadersBuilder                 | Adds custom and/or mandatory Headers for incoming messages from heterogeneous systems.                                                                                | `Func<Message, IServiceProvider, List<KeyValuePair<string, string>>>?` | null                             |
| Namespace                            | Namespace of Servicebus , Needs to be set when using with TokenCredential Property                                                                                    | string                                                                 | null                             |
| DefaultCorrelationHeaders            | Adds additional correlation properties to all [correlation filters](https://learn.microsoft.com/en-us/azure/service-bus-messaging/topic-filters#correlation-filters). | IDictionary<string, string>                                            | Dictionary<string, string>.Empty |
| SQLFilters                           | Custom SQL Filters by name and expression on Topic Subscribtion                                                                                                       | List<KeyValuePair<string, string>>                                     | null                             |

#### Sessions

When sessions are enabled (see the `EnableSessions` option above), every message sent will have a session ID. To control the session ID, include an extra header with the name `AzureServiceBusHeaders.SessionId` when publishing events:

```C#
ICapPublisher capBus = ...;
string yourEventName = ...;
YourEventType yourEvent = ...;

Dictionary<string, string> extraHeaders = new Dictionary<string, string>();
extraHeaders.Add(AzureServiceBusHeaders.SessionId, <your-session-id>);

capBus.Publish(yourEventName, yourEvent, extraHeaders);
```

If no session ID header is present, the message ID will be used as the session ID.

#### Heterogeneous Systems

Sometimes you might want to listen to a message published by an external system. In this case, you need to add a set of two mandatory headers for CAP compatibility, as shown below:

```C#
c.UseAzureServiceBus(asb =>
{
    asb.ConnectionString = ...
    asb.CustomHeadersBuilder = (msg, sp) =>
    [
        new(DotNetCore.CAP.Messages.Headers.MessageId, sp.GetRequiredService<ISnowflakeId>().NextId().ToString()),
        new(DotNetCore.CAP.Messages.Headers.MessageName, msg.RoutingKey)
    ];
});
```

#### SQL Filters

You can set SQL filters on the subscription level to get desired messages without having custom logic on the business side. For more information, see [Azure Service Bus SQL Filters](https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-sql-filter).

`SQLFilters` is a list of `KeyValuePair<string, string>`, where the key is the filter name and the value is the SQL expression.

```C#
c.UseAzureServiceBus(asb =>
{
    asb.ConnectionString = ...
    asb.SQLFilters = new List<KeyValuePair<string, string>> {
            
            new KeyValuePair<string,string>("IOTFilter","FromIOTHub='true'"),  // The message will be handled if ApplicationProperties contains IOTFilter and value is true
            new KeyValuePair<string,string>("SequenceFilter","sys.enqueuedSequenceNumber >= 300")
        };
});
```


================================================
FILE: docs/content/user-guide/en/transport/general.md
================================================
# Transports

Transports move data between different parts of the system – between message producers and message brokers, between message brokers and the entity database, and even between message brokers and external systems.

## Supported transports

CAP supports several transport methods:

* [RabbitMQ](rabbitmq.md)
* [Kafka](kafka.md)
* [Azure Service Bus](azure-service-bus.md)
* [Amazon SQS](aws-sqs.md)
* [NATS](nats.md)
* [In-Memory Queue](in-memory-queue.md)
* [Redis Streams](redis-streams.md)
* [Apache Pulsar](pulsar.md)

## Selecting a Transport

 Feature | RabbitMQ | Kafka | Azure Service Bus | In-Memory
:--   |   :--:    | :--: | :--:               | :--  :
**Use Case** | Reliable message transmission | Real-time data processing | Cloud integration | Testing and development
**Distributed**   | ✔   | ✔    | ✔ |❌
**Persistence** | ✔ | ✔ | ✔ | ❌
**Performance**  |  Medium  |  High | Medium | High


For more comparisons:

- [Azure Service Bus vs RabbitMQ](http://geekswithblogs.net/michaelstephenson/archive/2012/08/12/150399.aspx)
- [Kafka vs RabbitMQ](https://stackoverflow.com/questions/42151544/is-there-any-reason-to-use-rabbitmq-over-kafka)

Thanks to the community for contributing to CAP! The following transport extensions are community-supported:

* ActiveMQ ([@Lukas Zhang](https://github.com/lukazh/Lukaz.CAP.ActiveMQ)): https://github.com/lukazh

* RedisMQ ([@木木](https://github.com/difudotnet)): https://github.com/difudotnet/CAP.RedisMQ.Extensions

* ZeroMQ ([@maikebing](https://github.com/maikebing)): https://github.com/maikebing/CAP.Extensions

* MQTT ([@john jiang](https://github.com/jinzaz)): https://github.com/jinzaz/jinzaz.CAP.MQTT





================================================
FILE: docs/content/user-guide/en/transport/in-memory-queue.md
================================================
# In-Memory Queue

In-Memory Queue is a memory-based message queue provided by the [community](https://github.com/yang-xiaodong/Savorboard.CAP.InMemoryMessageQueue).

## Configuration

To use in-memory queue as a message transporter, you need to install the following package from NuGet:

```powershell
PM> Install-Package Savorboard.CAP.InMemoryMessageQueue

```

Next, add configuration options to the `ConfigureServices` method of `Startup.cs`:

```csharp

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddCap(x =>
    {
        x.UseInMemoryMessageQueue();
        // x.UseXXX ...
    });
}

```

================================================
FILE: docs/content/user-guide/en/transport/kafka.md
================================================
# Apache Kafka

[Apache Kafka](https://kafka.apache.org/) is an open-source event streaming platform developed by LinkedIn and donated to the Apache Software Foundation. It is written in Scala and Java.

Kafka can be used in CAP as a message transporter. 

## Configuration

To use Kafka as a transporter, you need to install the following package from NuGet:

```powershell
PM> Install-Package DotNetCore.CAP.Kafka

```

Then you can add configuration items to the `ConfigureServices` method of `Startup.cs`.

```csharp

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddCap(x =>
    {
        x.UseKafka(opt=>{
            //KafkaOptions
        });
        // x.UseXXX ...
    });
}

```

#### Kafka Options

The Kafka configuration parameters provided directly by the CAP:

NAME | DESCRIPTION | TYPE | DEFAULT
:---|:---|---|:---
Servers | Broker server address | string | 
MainConfig | librdkafka configuration parameters | Dictionary<string, string> | See below
ConnectionPoolSize | connection pool size | int | 10
CustomHeadersBuilder | Custom subscribe headers |  Func<> |  N/A
RetriableErrorCodes | Retriable error codes when ConsumeException  | IList<ErrorCode> |  See code
TopicOptions | The configuraiton of NumPartitions and ReplicationFactor | KafkaTopicOptions |  -1

#### Kafka Main Configuration Options

If you need additional native Kafka configuration options, you can set them in the `MainConfig` configuration option:

```csharp
services.AddCap(capOptions => 
{
    capOptions.UseKafka(kafkaOption=>
    {
        // kafka options.
        // kafkaOptions.MainConfig.Add("", "");
    });
});
```

`MainConfig` is a configuration dictionary. You can find a list of supported configuration options at the following link:

[https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md)

To prevent CAP from creating topics automatically, disable topic auto creation:

```csharp
services.AddCap(capOptions =>
{
    capOptions.UseKafka(kafkaOption =>
    {
        kafkaOption.MainConfig.Add("allow.auto.create.topics", "false");
    });
});
```

#### Custom Headers Builder Options

When messages are sent from a heterogeneous system, CAP requires additional headers to be defined. By providing this parameter, you can set custom headers to ensure the subscriber works correctly.

You can find the description of heterogeneous system integration [here](../cap/messaging.md#heterogeneous-system-integration).

Sometimes, if you want to add additional context information from the broker to messages, you can also do this through this option. For example, you can add information such as offset or partition.

Example:

```C#
x.UseKafka(opt =>
{
    //...

   
Download .txt
gitextract__fz6t0_d/

├── .flubu
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── feature_request.yml
│   │   └── question.yml
│   ├── pull_request_template.md
│   └── workflows/
│       └── deploy-docs-and-dashboard.yml
├── .gitignore
├── CAP.sln
├── CAP.sln.DotSettings
├── LICENSE.txt
├── README.md
├── README.zh-cn.md
├── appveyor.yml
├── build/
│   ├── BuildScript.Util.cs
│   ├── BuildScript.Version.cs
│   ├── BuildScript.cs
│   ├── BuildScript.csproj
│   ├── BuildVersion.cs
│   └── version.props
├── code-of-conduct.md
├── docs/
│   ├── content/
│   │   ├── CNAME
│   │   ├── about/
│   │   │   ├── contact-us.md
│   │   │   ├── license.md
│   │   │   └── release-notes.md
│   │   ├── index.md
│   │   └── user-guide/
│   │       ├── en/
│   │       │   ├── cap/
│   │       │   │   ├── configuration.md
│   │       │   │   ├── filter.md
│   │       │   │   ├── idempotence.md
│   │       │   │   ├── messaging.md
│   │       │   │   ├── serialization.md
│   │       │   │   └── transactions.md
│   │       │   ├── getting-started/
│   │       │   │   ├── contributing.md
│   │       │   │   ├── introduction.md
│   │       │   │   └── quick-start.md
│   │       │   ├── monitoring/
│   │       │   │   ├── consul.md
│   │       │   │   ├── dashboard.md
│   │       │   │   ├── diagnostics.md
│   │       │   │   ├── kubernetes.md
│   │       │   │   └── opentelemetry.md
│   │       │   ├── samples/
│   │       │   │   ├── eshoponcontainers.md
│   │       │   │   ├── faq.md
│   │       │   │   └── github.md
│   │       │   ├── storage/
│   │       │   │   ├── general.md
│   │       │   │   ├── in-memory-storage.md
│   │       │   │   ├── mongodb.md
│   │       │   │   ├── mysql.md
│   │       │   │   ├── postgresql.md
│   │       │   │   └── sqlserver.md
│   │       │   └── transport/
│   │       │       ├── aws-sqs.md
│   │       │       ├── azure-service-bus.md
│   │       │       ├── general.md
│   │       │       ├── in-memory-queue.md
│   │       │       ├── kafka.md
│   │       │       ├── nats.md
│   │       │       ├── pulsar.md
│   │       │       ├── rabbitmq.md
│   │       │       └── redis-streams.md
│   │       └── zh/
│   │           ├── cap/
│   │           │   ├── configuration.md
│   │           │   ├── filter.md
│   │           │   ├── idempotence.md
│   │           │   ├── messaging.md
│   │           │   ├── serialization.md
│   │           │   └── transactions.md
│   │           ├── getting-started/
│   │           │   ├── contributing.md
│   │           │   ├── introduction.md
│   │           │   └── quick-start.md
│   │           ├── monitoring/
│   │           │   ├── consul.md
│   │           │   ├── dashboard.md
│   │           │   ├── diagnostics.md
│   │           │   ├── kubernetes.md
│   │           │   └── opentelemetry.md
│   │           ├── samples/
│   │           │   ├── castle.dynamicproxy.md
│   │           │   ├── eshoponcontainers.md
│   │           │   ├── faq.md
│   │           │   └── github.md
│   │           ├── storage/
│   │           │   ├── general.md
│   │           │   ├── in-memory-storage.md
│   │           │   ├── mongodb.md
│   │           │   ├── mysql.md
│   │           │   ├── postgresql.md
│   │           │   └── sqlserver.md
│   │           └── transport/
│   │               ├── aws-sqs.md
│   │               ├── azure-service-bus.md
│   │               ├── general.md
│   │               ├── in-memory-queue.md
│   │               ├── kafka.md
│   │               ├── nats.md
│   │               ├── pulsar.md
│   │               ├── rabbitmq.md
│   │               └── redis-streams.md
│   ├── mkdocs.yml
│   └── readme.md
├── samples/
│   ├── Sample.AmazonSQS.InMemory/
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── Program.cs
│   │   ├── Sample.AmazonSQS.InMemory.csproj
│   │   └── appsettings.json
│   ├── Sample.AzureServiceBus.InMemory/
│   │   ├── Contracts/
│   │   │   ├── DomainEvents/
│   │   │   │   └── Contract.cs
│   │   │   └── IntegrationEvents/
│   │   │       └── Contract.cs
│   │   ├── Program.cs
│   │   ├── Sample.AzureServiceBus.InMemory.csproj
│   │   ├── SampleSubscriber.cs
│   │   ├── appsettings.Development.json
│   │   └── appsettings.json
│   ├── Sample.ConsoleApp/
│   │   ├── EventSubscriber.cs
│   │   ├── Program.cs
│   │   └── Sample.ConsoleApp.csproj
│   ├── Sample.Dashboard.Auth/
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── MyDashboardAuthenticationHandler.cs
│   │   ├── Program.cs
│   │   ├── Sample.Dashboard.Auth.csproj
│   │   ├── Startup.cs
│   │   └── appsettings.json
│   ├── Sample.Dashboard.Jwt/
│   │   ├── Data/
│   │   │   └── User.cs
│   │   ├── Dockerfile
│   │   ├── Program.cs
│   │   ├── Sample.Dashboard.Jwt.csproj
│   │   ├── appsettings.json
│   │   └── wwwroot/
│   │       ├── css/
│   │       │   └── site.css
│   │       ├── index.html
│   │       └── js/
│   │           └── site.js
│   ├── Sample.Kafka.PostgreSql/
│   │   ├── AppDbContext.cs
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── Program.cs
│   │   ├── Sample.Kafka.PostgreSql.csproj
│   │   └── appsettings.json
│   ├── Sample.Pulsar.InMemory/
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── Program.cs
│   │   ├── Sample.Pulsar.InMemory.csproj
│   │   └── appsettings.json
│   ├── Sample.RabbitMQ.MongoDB/
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── Program.cs
│   │   ├── Sample.RabbitMQ.MongoDB.csproj
│   │   ├── appsettings.json
│   │   └── docker-compose.yml
│   ├── Sample.RabbitMQ.MySql/
│   │   ├── AppDbContext.cs
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── Program.cs
│   │   ├── Sample.RabbitMQ.MySql.csproj
│   │   └── appsettings.json
│   ├── Sample.RabbitMQ.SqlServer/
│   │   ├── AppDbContext.cs
│   │   ├── Controllers/
│   │   │   └── ValuesController.cs
│   │   ├── Messages/
│   │   │   ├── TestMessage.cs
│   │   │   ├── VeryFastProcessingReceiver.cs
│   │   │   └── XSlowProcessingReceiver.cs
│   │   ├── Migrations/
│   │   │   ├── 20191205032949_FirstMigration.Designer.cs
│   │   │   ├── 20191205032949_FirstMigration.cs
│   │   │   └── AppDbContextModelSnapshot.cs
│   │   ├── Program.cs
│   │   ├── Sample.RabbitMQ.SqlServer.csproj
│   │   ├── TypedConsumers/
│   │   │   ├── QueueHandler.cs
│   │   │   ├── QueueHandlerTopicAttribute.cs
│   │   │   ├── QueueHandlersExtensions.cs
│   │   │   └── TypedConsumerServiceSelector.cs
│   │   └── appsettings.json
│   └── Samples.Redis.SqlServer/
│       ├── Controllers/
│       │   └── HomeController.cs
│       ├── Dockerfile
│       ├── Program.cs
│       ├── Samples.Redis.SqlServer.csproj
│       ├── appsettings.json
│       └── docker-compose.yml
├── src/
│   ├── Directory.Build.props
│   ├── DotNetCore.CAP/
│   │   ├── BrokerConnectionException.cs
│   │   ├── CAP.Attribute.cs
│   │   ├── CAP.Builder.cs
│   │   ├── CAP.Options.cs
│   │   ├── CAP.ServiceCollectionExtensions.cs
│   │   ├── Diagnostics/
│   │   │   ├── CapDiagnosticListenerNames.cs
│   │   │   ├── EventCounterSource.Cap.cs
│   │   │   ├── EventData.Cap.P.cs
│   │   │   └── EventData.Cap.S.cs
│   │   ├── DotNetCore.CAP.csproj
│   │   ├── IBootstrapper.cs
│   │   ├── ICapOptionsExtension.cs
│   │   ├── ICapPublisher.cs
│   │   ├── ICapSubscribe.cs
│   │   ├── ICapTransaction.Base.cs
│   │   ├── ICapTransaction.cs
│   │   ├── Internal/
│   │   │   ├── ConsumerContext.cs
│   │   │   ├── ConsumerExecutedResult.cs
│   │   │   ├── ConsumerExecutorDescriptor.cs
│   │   │   ├── Filter/
│   │   │   │   ├── ExceptionContext.cs
│   │   │   │   ├── ExecutedContext.cs
│   │   │   │   ├── ExecutingContext.cs
│   │   │   │   ├── FilterContext.cs
│   │   │   │   ├── ISubscribeFilter.cs
│   │   │   │   └── SubscribeFilter.cs
│   │   │   ├── Helper.cs
│   │   │   ├── IBootstrapper.Default.cs
│   │   │   ├── ICapPublisher.Default.cs
│   │   │   ├── IConsumerRegister.Default.cs
│   │   │   ├── IConsumerRegister.cs
│   │   │   ├── IConsumerServiceSelector.Assembly.cs
│   │   │   ├── IConsumerServiceSelector.Default.cs
│   │   │   ├── IConsumerServiceSelector.cs
│   │   │   ├── IMessageSender.Default.cs
│   │   │   ├── IMessageSender.cs
│   │   │   ├── IProcessingServer.cs
│   │   │   ├── ISnowflakeId.Default.cs
│   │   │   ├── ISnowflakeId.cs
│   │   │   ├── ISubscribeExector.Default.cs
│   │   │   ├── ISubscribeExecutor.cs
│   │   │   ├── ISubscribeInvoker.Default.cs
│   │   │   ├── ISubscribeInvoker.cs
│   │   │   ├── LoggerExtensions.cs
│   │   │   ├── MethodMatcherCache.cs
│   │   │   ├── NoopTransaction.cs
│   │   │   ├── ObjectMethodExecutor/
│   │   │   │   ├── AwaitableInfo.cs
│   │   │   │   ├── CoercedAwaitableInfo.cs
│   │   │   │   ├── ObjectMethodExecutor.cs
│   │   │   │   ├── ObjectMethodExecutorAwaitable.cs
│   │   │   │   └── ObjectMethodExecutorFSharpSupport.cs
│   │   │   ├── PublisherSentFailedException.cs
│   │   │   ├── ScheduledMediumMessageQueue.cs
│   │   │   ├── StatusName.cs
│   │   │   ├── SubscriberExecutionFailedException.cs
│   │   │   └── TopicAttribute.cs
│   │   ├── Messages/
│   │   │   ├── FailedInfo.cs
│   │   │   ├── Headers.cs
│   │   │   ├── Message.cs
│   │   │   ├── MessageType.cs
│   │   │   └── TransportMessage.cs
│   │   ├── Monitoring/
│   │   │   ├── IMonitoringApi.cs
│   │   │   ├── MessageDto.cs
│   │   │   ├── MessageQueryDto.cs
│   │   │   ├── PagedQueryResult.cs
│   │   │   └── StatisticsDto.cs
│   │   ├── OperateResult.cs
│   │   ├── Persistence/
│   │   │   ├── IDataStorage.cs
│   │   │   ├── IStorageInitializer.cs
│   │   │   └── MediumMessage.cs
│   │   ├── Processor/
│   │   │   ├── IDispatcher.Default.cs
│   │   │   ├── IProcessingServer.Cap.cs
│   │   │   ├── IProcessor.Collector.cs
│   │   │   ├── IProcessor.Delayed.cs
│   │   │   ├── IProcessor.InfiniteRetry.cs
│   │   │   ├── IProcessor.NeedRetry.cs
│   │   │   ├── IProcessor.TransportCheck.cs
│   │   │   ├── IProcessor.cs
│   │   │   └── ProcessingContext.cs
│   │   ├── Serialization/
│   │   │   ├── ISerializer.JsonUtf8.cs
│   │   │   └── ISerializer.cs
│   │   ├── SubscriberNotFoundException.cs
│   │   └── Transport/
│   │       ├── BrokerAddress.cs
│   │       ├── IConsumerClient.cs
│   │       ├── IConsumerClientFactory.cs
│   │       ├── IDispatcher.cs
│   │       ├── ITransport.cs
│   │       └── MqLogType.cs
│   ├── DotNetCore.CAP.AmazonSQS/
│   │   ├── AmazonPolicyExtensions.cs
│   │   ├── AmazonSQSConsumerClient.cs
│   │   ├── AmazonSQSConsumerClientFactory.cs
│   │   ├── CAP.AmazonSQSOptions.cs
│   │   ├── CAP.AmazonSQSOptionsExtension.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.AmazonSQS.csproj
│   │   ├── ITransport.AmazonSQS.cs
│   │   ├── SQSReceivedMessage.cs
│   │   └── TopicNormalizer.cs
│   ├── DotNetCore.CAP.AzureServiceBus/
│   │   ├── AzureServiceBusConsumerClient.cs
│   │   ├── AzureServiceBusConsumerClientFactory.cs
│   │   ├── AzureServiceBusConsumerCommitInput.cs
│   │   ├── AzureServiceBusHeaders.cs
│   │   ├── CAP.AzureServiceBusOptions.cs
│   │   ├── CAP.AzureServiceBusOptionsExtension.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.AzureServiceBus.csproj
│   │   ├── Helpers/
│   │   │   └── ServiceBusHelpers.cs
│   │   ├── ITransport.AzureServiceBus.cs
│   │   ├── Producer/
│   │   │   ├── IServiceBusProducerDescriptor.cs
│   │   │   ├── IServiceBusProducerDescriptorFactory.cs
│   │   │   └── ServiceBusProducerDescriptorBuilder.cs
│   │   └── ServiceBusProcessorFacade.cs
│   ├── DotNetCore.CAP.Dashboard/
│   │   ├── CAP.BuilderExtension.cs
│   │   ├── CAP.DashboardOptions.cs
│   │   ├── CAP.DashboardOptionsExtensions.cs
│   │   ├── CAP.MetricsEventListener.cs
│   │   ├── CapCache.cs
│   │   ├── CircularBuffer.cs
│   │   ├── DotNetCore.CAP.Dashboard.csproj
│   │   ├── GatewayProxy/
│   │   │   ├── GatewayProxyAgent.cs
│   │   │   ├── IRequestMapper.Default.cs
│   │   │   ├── IRequestMapper.cs
│   │   │   └── Requester/
│   │   │       ├── HttpClientBuilder.cs
│   │   │       ├── HttpClientHttpRequester.cs
│   │   │       ├── IHttpClient.cs
│   │   │       ├── IHttpClientBuilder.cs
│   │   │       ├── IHttpClientCache.cs
│   │   │       ├── IHttpRequester.cs
│   │   │       └── MemoryHttpClientCache.cs
│   │   ├── HtmlHelper.cs
│   │   ├── NodeDiscovery/
│   │   │   ├── CAP.ConsulDiscoveryOptions.cs
│   │   │   ├── CAP.ConsulDiscoveryOptionsExtensions.cs
│   │   │   ├── INodeDiscoveryProvider.Consul.cs
│   │   │   ├── INodeDiscoveryProvider.cs
│   │   │   ├── IProcessingServer.Consul.cs
│   │   │   └── Node.cs
│   │   ├── RouteActionProvider.cs
│   │   └── wwwroot/
│   │       ├── .gitignore
│   │       ├── .vscode/
│   │       │   └── settings.json
│   │       ├── README.md
│   │       ├── dist/
│   │       │   ├── assets/
│   │       │   │   ├── Nodes.40464ac3.css
│   │       │   │   ├── Nodes.e12132f5.js
│   │       │   │   ├── Published.429cfade.css
│   │       │   │   ├── Published.a8d638e6.js
│   │       │   │   ├── Received.37160321.css
│   │       │   │   ├── Received.e36ea621.js
│   │       │   │   ├── Subscriber.300bed2c.css
│   │       │   │   ├── Subscriber.d66f9645.js
│   │       │   │   ├── index.2d8714a6.js
│   │       │   │   ├── index.856c0890.css
│   │       │   │   └── index.909977fe.js
│   │       │   └── index.html
│   │       ├── index.html
│   │       ├── package.json
│   │       ├── src/
│   │       │   ├── App.vue
│   │       │   ├── assets/
│   │       │   │   ├── language/
│   │       │   │   │   ├── en-us.js
│   │       │   │   │   └── zh-cn.js
│   │       │   │   └── uPlot.esm.js
│   │       │   ├── components/
│   │       │   │   ├── Footer.vue
│   │       │   │   └── Navigation.vue
│   │       │   ├── main.js
│   │       │   ├── pages/
│   │       │   │   ├── Home.vue
│   │       │   │   ├── Nodes.vue
│   │       │   │   ├── Published.vue
│   │       │   │   ├── Received.vue
│   │       │   │   └── Subscriber.vue
│   │       │   ├── router/
│   │       │   │   └── index.js
│   │       │   └── store/
│   │       │       └── store.js
│   │       └── vite.config.js
│   ├── DotNetCore.CAP.Dashboard.K8s/
│   │   ├── DotNetCore.CAP.Dashboard.K8s.csproj
│   │   ├── K8sDiscoveryOptions.cs
│   │   ├── K8sDiscoveryOptionsExtensions.cs
│   │   ├── K8sNodeDiscoveryProvider.cs
│   │   └── ServiceCollectionExtensions.cs
│   ├── DotNetCore.CAP.InMemoryStorage/
│   │   ├── CAP.InMemoryCapOptionsExtension.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.InMemoryStorage.csproj
│   │   ├── ICapTransaction.InMemory.cs
│   │   ├── IDataStorage.InMemory.cs
│   │   ├── IMonitoringApi.InMemory.cs
│   │   ├── IStorageInitializer.InMemory.cs
│   │   └── MemoryMessage.cs
│   ├── DotNetCore.CAP.Kafka/
│   │   ├── CAP.KafkaCapOptionsExtension.cs
│   │   ├── CAP.KafkaOptions.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.Kafka.csproj
│   │   ├── IConnectionPool.Default.cs
│   │   ├── IConnectionPool.cs
│   │   ├── ITransport.Kafka.cs
│   │   ├── KafkaConsumerClient.cs
│   │   ├── KafkaConsumerClientFactory.cs
│   │   └── KafkaHeaders.cs
│   ├── DotNetCore.CAP.MongoDB/
│   │   ├── CAP.MongoDBCapOptionsExtension.cs
│   │   ├── CAP.MongoDBOptions.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.MongoDB.csproj
│   │   ├── ICapTransaction.MongoDB.cs
│   │   ├── IClientSessionHandle.CAP.cs
│   │   ├── IDataStorage.MongoDB.cs
│   │   ├── IMonitoringApi.MongoDB.cs
│   │   ├── IStorageInitializer.MongoDB.cs
│   │   └── StorageMessage.cs
│   ├── DotNetCore.CAP.MySql/
│   │   ├── CAP.EFOptions.cs
│   │   ├── CAP.MySqlCapOptionsExtension.cs
│   │   ├── CAP.MySqlOptions.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.MySql.csproj
│   │   ├── ICapTransaction.MySql.cs
│   │   ├── IDataStorage.MySql.cs
│   │   ├── IDbConnection.Extensions.cs
│   │   ├── IDbContextTransaction.CAP.cs
│   │   ├── IMonitoringApi.MySql.cs
│   │   ├── IStorageInitializer.MySql.cs
│   │   └── ServerVersion.cs
│   ├── DotNetCore.CAP.NATS/
│   │   ├── CAP.NATSCapOptionsExtension.cs
│   │   ├── CAP.NATSOptions.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── DotNetCore.CAP.NATS.csproj
│   │   ├── IConnectionPool.Default.cs
│   │   ├── IConnectionPool.cs
│   │   ├── ITransport.NATS.cs
│   │   ├── NATSConsumerClient.cs
│   │   └── NATSConsumerClientFactory.cs
│   ├── DotNetCore.CAP.OpenTelemetry/
│   │   ├── CapInstrumentation.cs
│   │   ├── DiagnosticListener.cs
│   │   ├── DiagnosticSourceSubscriber.cs
│   │   ├── DotNetCore.CAP.OpenTelemetry.csproj
│   │   └── TracerProviderBuilder.Extension.cs
│   ├── DotNetCore.CAP.PostgreSql/
│   │   ├── CAP.EFOptions.cs
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── CAP.PostgreSqlCapOptionsExtension.cs
│   │   ├── CAP.PostgreSqlOptions.cs
│   │   ├── DotNetCore.CAP.PostgreSql.csproj
│   │   ├── ICapTransaction.PostgreSql.cs
│   │   ├── IDataStorage.PostgreSql.cs
│   │   ├── IDbConnection.Extensions.cs
│   │   ├── IDbContextTransaction.CAP.cs
│   │   ├── IMonitoringApi.PostgreSql.cs
│   │   └── IStorageInitializer.PostgreSql.cs
│   ├── DotNetCore.CAP.Pulsar/
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── CAP.PulsarCapOptionsExtension.cs
│   │   ├── CAP.PulsarOptions.cs
│   │   ├── DotNetCore.CAP.Pulsar.csproj
│   │   ├── IConnectionFactory.Default.cs
│   │   ├── IConnectionFactory.cs
│   │   ├── ITransport.Pulsar.cs
│   │   ├── PulsarConsumerClient.cs
│   │   ├── PulsarConsumerClientFactory.cs
│   │   └── PulsarHeaders.cs
│   ├── DotNetCore.CAP.RabbitMQ/
│   │   ├── CAP.Options.Extensions.cs
│   │   ├── CAP.RabbiMQOptions.cs
│   │   ├── CAP.RabbitMQCapOptionsExtension.cs
│   │   ├── DotNetCore.CAP.RabbitMQ.csproj
│   │   ├── IConnectionChannelPool.Default.cs
│   │   ├── IConnectionChannelPool.cs
│   │   ├── ITransport.RabbitMQ.cs
│   │   ├── RabbitMQBasicConsumer.cs
│   │   ├── RabbitMQConsumerClient.cs
│   │   └── RabbitMQConsumerClientFactory.cs
│   ├── DotNetCore.CAP.RedisStreams/
│   │   ├── CapOptions.Redis.Extensions.cs
│   │   ├── CapOptions.Redis.cs
│   │   ├── DotNetCore.CAP.RedisStreams.csproj
│   │   ├── ICapOptionsExtension.Redis.cs
│   │   ├── IConnectionPool.Default.cs
│   │   ├── IConnectionPool.LazyConnection.cs
│   │   ├── IConnectionPool.cs
│   │   ├── IConsumerClient.Redis.cs
│   │   ├── IConsumerClientFactory.Redis.cs
│   │   ├── IRedis.Events.Logger.cs
│   │   ├── IRedis.Events.cs
│   │   ├── IRedisStream.Manager.Default.cs
│   │   ├── IRedisStream.Manager.Extensions.cs
│   │   ├── IRedisStream.Manager.cs
│   │   ├── ITransport.Redis.cs
│   │   ├── RedisErrorExtensions.cs
│   │   ├── TransportMessage.Redis.Exceptions.cs
│   │   └── TransportMessage.Redis.cs
│   └── DotNetCore.CAP.SqlServer/
│       ├── CAP.EFOptions.cs
│       ├── CAP.Options.Extensions.cs
│       ├── CAP.SqlServerCapOptionsExtension.cs
│       ├── CAP.SqlServerOptions.cs
│       ├── Diagnostics/
│       │   ├── DiagnosticObserver.cs
│       │   ├── DiagnosticProcessorObserver.cs
│       │   └── IProcessingServer.DiagnosticRegister.cs
│       ├── DotNetCore.CAP.SqlServer.csproj
│       ├── ICapTransaction.SqlServer.cs
│       ├── IDataStorage.SqlServer.cs
│       ├── IDbConnection.Extensions.cs
│       ├── IDbContextTransaction.CAP.cs
│       ├── IMonitoringApi.SqlServer.cs
│       └── IStorageInitializer.SqlServer.cs
└── test/
    ├── DotNetCore.CAP.AzureServiceBus.Test/
    │   ├── DotNetCore.CAP.AzureServiceBus.Test.csproj
    │   ├── Helpers/
    │   │   └── ServiceBusHelperTests.cs
    │   ├── Producer/
    │   │   └── ServiceBusProducerBuilderTests.cs
    │   └── ServiceBusTransportTests.cs
    ├── DotNetCore.CAP.MultiModuleSubscriberTests/
    │   ├── DotNetCore.CAP.MultiModuleSubscriberTests.csproj
    │   └── SubscriberClass.cs
    ├── DotNetCore.CAP.MySql.Test/
    │   ├── ConnectionUtil.cs
    │   ├── DatabaseTestHost.cs
    │   ├── DotNetCore.CAP.MySql.Test.csproj
    │   ├── MySqlStorageConnectionTest.cs
    │   ├── MySqlStorageTest.cs
    │   └── TestHost.cs
    └── DotNetCore.CAP.Test/
        ├── CAP.BuilderTest.cs
        ├── ConsumerServiceSelectorTest.cs
        ├── CustomConsumerSubscribeTest.cs
        ├── DispatcherTests.cs
        ├── DotNetCore.CAP.Test.csproj
        ├── FakeInMemoryQueue/
        │   ├── CAP.FakeQueueOptionsExtension.cs
        │   ├── CAP.Options.Extensions.cs
        │   ├── ITransport.FakeInMemory.cs
        │   ├── InMemoryConsumerClient.cs
        │   ├── InMemoryConsumerClientFactory.cs
        │   └── InMemoryQueue.cs
        ├── GenericConsumerServiceSelector.cs
        ├── HelperTest.cs
        ├── Helpers/
        │   ├── ObservableCollectionExtensions.cs
        │   ├── TestBootstrapService.cs
        │   ├── TestHostedServiceExtensions.cs
        │   ├── TestLogger.cs
        │   ├── TestLoggingExtensions.cs
        │   ├── TestLoggingProvider.cs
        │   ├── TestMessageCollector.cs
        │   ├── TestServiceCollectionExtensions.cs
        │   └── TestThreadSafeMessageSender.cs
        ├── IntegrationTests/
        │   ├── CancellationTokenSubscriberTest.cs
        │   └── IntegrationTestBase.cs
        ├── MessageExtensionTest.cs
        ├── MessageTest.cs
        ├── SnowflakeIdTest.cs
        ├── SubscribeInvokerTest.cs
        ├── SubscribeInvokerWithCancellation.cs
        └── SubscriberCollisionTests/
            ├── NewMethodTests.cs
            ├── OldMethodTests.cs
            └── SubscriberClass.cs
Download .txt
Showing preview only (312K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3122 symbols across 325 files)

FILE: build/BuildScript.Util.cs
  class BuildScript (line 5) | public partial class BuildScript
    method CreateStamp (line 7) | public string CreateStamp()

FILE: build/BuildScript.Version.cs
  class BuildScript (line 8) | [Reference("System.Xml.XmlDocument, System.Xml, Version=4.0.0.0, Culture...
    method FetchBuildVersion (line 11) | public BuildVersion FetchBuildVersion(ITaskContext context)

FILE: build/BuildScript.cs
  class BuildScript (line 10) | [Include("./build/BuildVersion.cs")]
    method BeforeBuildExecution (line 27) | protected override void BeforeBuildExecution(ITaskContext context)
    method ConfigureTargets (line 34) | protected override void ConfigureTargets(ITaskContext context)

FILE: build/BuildVersion.cs
  class BuildVersion (line 3) | public class BuildVersion
    method VersionWithoutQuality (line 15) | public string VersionWithoutQuality()
    method Version (line 20) | public string Version()
    method VersionWithSuffix (line 25) | public string VersionWithSuffix()

FILE: samples/Sample.AmazonSQS.InMemory/Controllers/ValuesController.cs
  class ValuesController (line 8) | [Route("api/[controller]")]
    method ValuesController (line 13) | public ValuesController(ICapPublisher producer)
    method WithoutTransaction (line 18) | [Route("~/without/transaction")]
    method SubscribeInMemoryTopic (line 26) | [CapSubscribe("sample.aws.in-memory")]

FILE: samples/Sample.AzureServiceBus.InMemory/Contracts/DomainEvents/Contract.cs
  type EntityCreated (line 3) | public record EntityCreated(Guid Id);
  type EntityDeleted (line 5) | public record EntityDeleted(Guid Id);

FILE: samples/Sample.AzureServiceBus.InMemory/Contracts/IntegrationEvents/Contract.cs
  type EntityCreatedForIntegration (line 3) | public record EntityCreatedForIntegration(Guid Id);
  type EntityDeletedForIntegration (line 5) | public record EntityDeletedForIntegration(Guid Id);

FILE: samples/Sample.AzureServiceBus.InMemory/SampleSubscriber.cs
  class SampleSubscriber (line 5) | public class SampleSubscriber : ICapSubscribe
    type Message (line 7) | public record Message(string Content);
    method Handle (line 9) | [CapSubscribe("cap.sample.tests")]

FILE: samples/Sample.ConsoleApp/EventSubscriber.cs
  class EventSubscriber (line 7) | public class EventSubscriber : ICapSubscribe
    method ShowTime (line 9) | [CapSubscribe("sample.console.showtime")]

FILE: samples/Sample.ConsoleApp/Program.cs
  class Program (line 11) | public class Program
    method Main (line 13) | public static void Main(string[] args)
  class Filter (line 52) | public class Filter : SubscribeFilter
    method OnSubscribeExceptionAsync (line 54) | public override Task OnSubscribeExceptionAsync(ExceptionContext context)

FILE: samples/Sample.Dashboard.Auth/Controllers/ValuesController.cs
  class ValuesController (line 10) | [Authorize]
    method ValuesController (line 18) | public ValuesController(ICapPublisher capPublisher, ILogger<ValuesCont...
    method Publish (line 24) | [Route("publish")]
    method Subscribe (line 36) | [NonAction]
    class Person (line 43) | public class Person

FILE: samples/Sample.Dashboard.Auth/MyDashboardAuthenticationHandler.cs
  class MyDashboardAuthenticationSchemeDefaults (line 12) | public static class MyDashboardAuthenticationSchemeDefaults
  class MyDashboardAuthenticationSchemeOptions (line 17) | public class MyDashboardAuthenticationSchemeOptions : AuthenticationSche...
  class MyDashboardAuthenticationHandler (line 22) | public class MyDashboardAuthenticationHandler : AuthenticationHandler<My...
    method MyDashboardAuthenticationHandler (line 24) | public MyDashboardAuthenticationHandler(IOptionsMonitor<MyDashboardAut...
    method HandleAuthenticateAsync (line 30) | protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    method HandleChallengeAsync (line 39) | protected override Task HandleChallengeAsync(AuthenticationProperties ...
    method CreateAuthenticatonTicket (line 48) | private AuthenticateResult CreateAuthenticatonTicket()

FILE: samples/Sample.Dashboard.Auth/Program.cs
  class Program (line 6) | public class Program
    method Main (line 8) | public static void Main(string[] args)
    method CreateHostBuilder (line 13) | public static IHostBuilder CreateHostBuilder(string[] args) =>

FILE: samples/Sample.Dashboard.Auth/Startup.cs
  class Startup (line 9) | public class Startup
    method ConfigureServices (line 11) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 29) | public void Configure(IApplicationBuilder app)
    method AddCapWithOpenIdAuthorization (line 42) | private IServiceCollection AddCapWithOpenIdAuthorization(IServiceColle...
    method AddCapWithCustomAuthorization (line 83) | private IServiceCollection AddCapWithCustomAuthorization(IServiceColle...
    method AddCapWithOpenIdAndCustomAuthorization (line 110) | private IServiceCollection AddCapWithOpenIdAndCustomAuthorization(ISer...
    method AddCapWithAnonymousAccess (line 152) | private IServiceCollection AddCapWithAnonymousAccess(IServiceCollectio...

FILE: samples/Sample.Dashboard.Jwt/Data/User.cs
  class User (line 3) | public class User

FILE: samples/Sample.Dashboard.Jwt/wwwroot/js/site.js
  function logIn (line 6) | function logIn() {

FILE: samples/Sample.Kafka.PostgreSql/AppDbContext.cs
  class Person (line 13) | public class Person
    method ToString (line 21) | public override string ToString()
  class AppDbContext (line 27) | public class AppDbContext : DbContext
    method AppDbContext (line 29) | public AppDbContext(DbContextOptions<AppDbContext> options)
  class CapNpgsqlRelationalConnection (line 39) | public class CapNpgsqlRelationalConnection : NpgsqlRelationalConnection
    method CapNpgsqlRelationalConnection (line 43) | protected CapNpgsqlRelationalConnection(RelationalConnectionDependenci...
    method CommitTransaction (line 50) | public override void CommitTransaction()
    method CommitTransactionAsync (line 62) | public override Task CommitTransactionAsync(CancellationToken cancella...
    method RollbackTransaction (line 74) | public override void RollbackTransaction()
    method RollbackTransactionAsync (line 86) | public override Task RollbackTransactionAsync(CancellationToken cancel...

FILE: samples/Sample.Kafka.PostgreSql/Controllers/ValuesController.cs
  class ValuesController (line 12) | [Route("api/[controller]")]
    method Start (line 15) | [Route("~/control/start")]
    method Stop (line 22) | [Route("~/control/stop")]
    method Delay (line 30) | [Route("~/delay/{delaySeconds:int}")]
    method WithoutTransaction (line 39) | [Route("~/without/transaction")]
    method AdonetWithTransaction (line 47) | [Route("~/adonet/transaction")]
    method EntityFrameworkWithTransaction (line 68) | [Route("~/ef/transaction")]
    method Test2 (line 85) | [CapSubscribe("sample.kafka.postgrsql")]

FILE: samples/Sample.Kafka.PostgreSql/Program.cs
  class AppConstants (line 55) | public static class AppConstants

FILE: samples/Sample.Pulsar.InMemory/Controllers/ValuesController.cs
  class ValuesController (line 8) | [Route("api/[controller]")]
    method ValuesController (line 13) | public ValuesController(ICapPublisher producer)
    method WithoutTransaction (line 18) | [Route("~/without/transaction")]
    method Test2T2 (line 26) | [CapSubscribe("persistent://public/default/captesttopic")]

FILE: samples/Sample.RabbitMQ.MongoDB/Controllers/ValuesController.cs
  class ValuesController (line 10) | [Route("api/[controller]")]
    method ValuesController (line 17) | public ValuesController(IMongoClient client, ICapPublisher capBus)
    method WithoutTransaction (line 23) | [Route("~/without/transaction")]
    method Delay (line 32) | [Route("~/delay/{delaySeconds:int}")]
    method PublishNotAutoCommit (line 40) | [Route("~/transaction/not/autocommit")]
    method PublishWithoutTrans (line 60) | [Route("~/transaction/autocommit")]
    method ReceiveMessage (line 79) | [NonAction]

FILE: samples/Sample.RabbitMQ.MySql/AppDbContext.cs
  class Person (line 5) | public class Person
    method ToString (line 13) | public override string ToString()
  class AppDbContext (line 19) | public class AppDbContext : DbContext
    method OnConfiguring (line 24) | protected override void OnConfiguring(DbContextOptionsBuilder optionsB...

FILE: samples/Sample.RabbitMQ.MySql/Controllers/ValuesController.cs
  class ValuesController (line 11) | [Route("api/[controller]")]
    method ValuesController (line 16) | public ValuesController(ICapPublisher capPublisher)
    method Start (line 21) | [Route("~/control/start")]
    method Stop (line 28) | [Route("~/control/stop")]
    method WithoutTransactionAsync (line 35) | [Route("~/without/transaction")]
    method Delay (line 43) | [Route("~/delay/{delaySeconds:int}")]
    method AdonetWithTransaction (line 51) | [Route("~/adonet/transaction")]
    method EntityFrameworkWithTransaction (line 64) | [Route("~/ef/transaction")]
    method Subscriber (line 77) | [NonAction]
    method Subscriber2 (line 84) | [NonAction]

FILE: samples/Sample.RabbitMQ.SqlServer/AppDbContext.cs
  class Person (line 5) | public class Person
    method ToString (line 13) | public override string ToString()
  class AppDbContext (line 19) | public class AppDbContext : DbContext
    method OnConfiguring (line 25) | protected override void OnConfiguring(DbContextOptionsBuilder optionsB...

FILE: samples/Sample.RabbitMQ.SqlServer/Controllers/ValuesController.cs
  class ValuesController (line 13) | [Route("api/[controller]")]
    method ValuesController (line 18) | public ValuesController(ICapPublisher capPublisher)
    method Start (line 23) | [Route("~/control/start")]
    method Stop (line 30) | [Route("~/control/stop")]
    method WithoutTransaction (line 37) | [Route("~/without/transaction")]
    method Delay (line 49) | [Route("~/delay/{delaySeconds:int}")]
    method DelayWithTransaction (line 62) | [Route("~/delay/transaction/{delaySeconds:int}")]
    method AdonetWithTransaction (line 88) | [Route("~/adonet/transaction")]
    method EntityFrameworkWithTransaction (line 119) | [Route("~/ef/transaction")]
    method TypePublish (line 135) | [Route("~/typed/subscribe")]
    method Subscriber (line 157) | [NonAction]

FILE: samples/Sample.RabbitMQ.SqlServer/Messages/TestMessage.cs
  class TestMessage (line 3) | public class TestMessage
    method Create (line 5) | public static TestMessage Create(string text) => new()

FILE: samples/Sample.RabbitMQ.SqlServer/Messages/VeryFastProcessingReceiver.cs
  class VeryFastProcessingReceiver (line 8) | [QueueHandlerTopic("fasttopic")]
    method VeryFastProcessingReceiver (line 13) | public VeryFastProcessingReceiver(ILogger<VeryFastProcessingReceiver> ...
    method Handle (line 18) | public async Task Handle(TestMessage value)

FILE: samples/Sample.RabbitMQ.SqlServer/Messages/XSlowProcessingReceiver.cs
  class XSlowProcessingReceiver (line 8) | [QueueHandlerTopic("slowtopic")]
    method XSlowProcessingReceiver (line 13) | public XSlowProcessingReceiver(ILogger<XSlowProcessingReceiver> logger)
    method Handle (line 18) | public async Task Handle(TestMessage value)

FILE: samples/Sample.RabbitMQ.SqlServer/Migrations/20191205032949_FirstMigration.Designer.cs
  class FirstMigration (line 11) | [DbContext(typeof(AppDbContext))]
    method BuildTargetModel (line 15) | protected override void BuildTargetModel(ModelBuilder modelBuilder)

FILE: samples/Sample.RabbitMQ.SqlServer/Migrations/20191205032949_FirstMigration.cs
  class FirstMigration (line 5) | public partial class FirstMigration : Migration
    method Up (line 7) | protected override void Up(MigrationBuilder migrationBuilder)
    method Down (line 23) | protected override void Down(MigrationBuilder migrationBuilder)

FILE: samples/Sample.RabbitMQ.SqlServer/Migrations/AppDbContextModelSnapshot.cs
  class AppDbContextModelSnapshot (line 10) | [DbContext(typeof(AppDbContext))]
    method BuildModel (line 13) | protected override void BuildModel(ModelBuilder modelBuilder)

FILE: samples/Sample.RabbitMQ.SqlServer/TypedConsumers/QueueHandler.cs
  class QueueHandler (line 3) | public abstract class QueueHandler { }

FILE: samples/Sample.RabbitMQ.SqlServer/TypedConsumers/QueueHandlerTopicAttribute.cs
  class QueueHandlerTopicAttribute (line 5) | [AttributeUsage(AttributeTargets.Class)]
    method QueueHandlerTopicAttribute (line 10) | public QueueHandlerTopicAttribute(string topic)

FILE: samples/Sample.RabbitMQ.SqlServer/TypedConsumers/QueueHandlersExtensions.cs
  class QueueHandlersExtensions (line 8) | internal static class QueueHandlersExtensions
    method AddQueueHandlers (line 12) | public static IServiceCollection AddQueueHandlers(this IServiceCollect...
    method FilterHandlers (line 24) | private static bool FilterHandlers(Type t)

FILE: samples/Sample.RabbitMQ.SqlServer/TypedConsumers/TypedConsumerServiceSelector.cs
  class TypedConsumerServiceSelector (line 12) | internal class TypedConsumerServiceSelector : ConsumerServiceSelector
    method TypedConsumerServiceSelector (line 16) | public TypedConsumerServiceSelector(IServiceProvider serviceProvider) ...
    method FindConsumersFromInterfaceTypes (line 21) | protected override IEnumerable<ConsumerExecutorDescriptor> FindConsume...
    method GetMyDescription (line 41) | private IEnumerable<ConsumerExecutorDescriptor> GetMyDescription(TypeI...

FILE: samples/Samples.Redis.SqlServer/Controllers/HomeController.cs
  class HomeController (line 8) | [ApiController]
    method HomeController (line 16) | public HomeController(ILogger<HomeController> logger, ICapPublisher pu...
    method Publish (line 23) | [HttpGet]
    method Subscribe (line 29) | [CapSubscribe("test-message")]
  class Person (line 41) | public class Person
    method ToString (line 47) | public override string ToString()

FILE: src/DotNetCore.CAP.AmazonSQS/AmazonPolicyExtensions.cs
  class AmazonPolicyExtensions (line 11) | public static class AmazonPolicyExtensions
    method HasSqsPermission (line 20) | public static bool HasSqsPermission(this Policy policy, string topicAr...
    method AddSqsPermissions (line 76) | public static void AddSqsPermissions(this Policy policy, IEnumerable<s...
    method CompactSqsPermissions (line 166) | public static void CompactSqsPermissions(this Policy policy, string sq...
    method GetArnGroupPrefix (line 204) | private static string? GetArnGroupPrefix(string arn)
    method GetGroupName (line 224) | private static string? GetGroupName(string arn)

FILE: src/DotNetCore.CAP.AmazonSQS/AmazonSQSConsumerClient.cs
  class AmazonSQSConsumerClient (line 22) | internal sealed class AmazonSQSConsumerClient : IConsumerClient
    method AmazonSQSConsumerClient (line 34) | public AmazonSQSConsumerClient(string groupId, byte groupConcurrent, I...
    method FetchTopicsAsync (line 48) | public async Task<ICollection<string>> FetchTopicsAsync(IEnumerable<st...
    method SubscribeAsync (line 69) | public async Task SubscribeAsync(IEnumerable<string> topics)
    method ListeningAsync (line 78) | public async Task ListeningAsync(TimeSpan timeout, CancellationToken c...
    method CommitAsync (line 126) | public async Task CommitAsync(object? sender)
    method RejectAsync (line 139) | public async Task RejectAsync(object? sender)
    method DisposeAsync (line 153) | public ValueTask DisposeAsync()
    method ConnectAsync (line 161) | private async Task ConnectAsync(bool initSNS = true, bool initSQS = true)
    method InvalidIdFormatLog (line 217) | private void InvalidIdFormatLog(string exceptionMessage)
    method MessageNotInflightLog (line 228) | private void MessageNotInflightLog(string exceptionMessage)
    method GenerateSqsAccessPolicyAsync (line 239) | private async Task GenerateSqsAccessPolicyAsync(IEnumerable<string> to...
    method SubscribeToTopics (line 264) | private async Task SubscribeToTopics(IEnumerable<string> topics)

FILE: src/DotNetCore.CAP.AmazonSQS/AmazonSQSConsumerClientFactory.cs
  class AmazonSQSConsumerClientFactory (line 11) | internal sealed class AmazonSQSConsumerClientFactory : IConsumerClientFa...
    method AmazonSQSConsumerClientFactory (line 15) | public AmazonSQSConsumerClientFactory(IOptions<AmazonSQSOptions> amazo...
    method CreateAsync (line 20) | public Task<IConsumerClient> CreateAsync(string groupName, byte groupC...

FILE: src/DotNetCore.CAP.AmazonSQS/CAP.AmazonSQSOptions.cs
  class AmazonSQSOptions (line 11) | public class AmazonSQSOptions

FILE: src/DotNetCore.CAP.AmazonSQS/CAP.AmazonSQSOptionsExtension.cs
  class AmazonSQSOptionsExtension (line 12) | internal sealed class AmazonSQSOptionsExtension : ICapOptionsExtension
    method AmazonSQSOptionsExtension (line 16) | public AmazonSQSOptionsExtension(Action<AmazonSQSOptions> configure)
    method AddServices (line 21) | public void AddServices(IServiceCollection services)

FILE: src/DotNetCore.CAP.AmazonSQS/CAP.Options.Extensions.cs
  class CapOptionsExtensions (line 11) | public static class CapOptionsExtensions
    method UseAmazonSQS (line 13) | public static CapOptions UseAmazonSQS(this CapOptions options, RegionE...
    method UseAmazonSQS (line 18) | public static CapOptions UseAmazonSQS(this CapOptions options, Action<...

FILE: src/DotNetCore.CAP.AmazonSQS/ITransport.AmazonSQS.cs
  class AmazonSQSTransport (line 21) | internal sealed class AmazonSQSTransport : ITransport
    method AmazonSQSTransport (line 29) | public AmazonSQSTransport(ILogger<AmazonSQSTransport> logger, IOptions...
    method SendAsync (line 37) | public async Task<OperateResult> SendAsync(TransportMessage message)
    method FetchExistingTopicArns (line 90) | private async Task FetchExistingTopicArns()
    method TryGetOrCreateTopicArn (line 138) | private bool TryGetOrCreateTopicArn(string topicName, [NotNullWhen(tru...

FILE: src/DotNetCore.CAP.AmazonSQS/SQSReceivedMessage.cs
  class SQSReceivedMessage (line 8) | internal class SQSReceivedMessage
  class SQSReceivedMessageAttributes (line 15) | internal class SQSReceivedMessageAttributes

FILE: src/DotNetCore.CAP.AmazonSQS/TopicNormalizer.cs
  class TopicNormalizer (line 8) | internal static class TopicNormalizer
    method NormalizeForAws (line 10) | public static string NormalizeForAws(this string origin)

FILE: src/DotNetCore.CAP.AzureServiceBus/AzureServiceBusConsumerClient.cs
  class AzureServiceBusConsumerClient (line 19) | internal sealed class AzureServiceBusConsumerClient : IConsumerClient
    method AzureServiceBusConsumerClient (line 33) | public AzureServiceBusConsumerClient(
    method SubscribeAsync (line 54) | public async Task SubscribeAsync(IEnumerable<string> topics)
    method ListeningAsync (line 112) | public async Task ListeningAsync(TimeSpan timeout, CancellationToken c...
    method CommitAsync (line 130) | public async Task CommitAsync(object? sender)
    method RejectAsync (line 138) | public async Task RejectAsync(object? sender)
    method DisposeAsync (line 145) | public async ValueTask DisposeAsync()
    method _serviceBusProcessor_ProcessErrorAsync (line 151) | private Task _serviceBusProcessor_ProcessErrorAsync(ProcessErrorEventA...
    method _serviceBusProcessor_ProcessMessageAsync (line 170) | private async Task _serviceBusProcessor_ProcessMessageAsync(ProcessMes...
    method _serviceBusProcessor_ProcessSessionMessageAsync (line 185) | private async Task _serviceBusProcessor_ProcessSessionMessageAsync(Pro...
    method ConnectAsync (line 192) | public async Task ConnectAsync()
    method ConvertMessage (line 285) | private TransportMessage ConvertMessage(ServiceBusReceivedMessage mess...

FILE: src/DotNetCore.CAP.AzureServiceBus/AzureServiceBusConsumerClientFactory.cs
  class AzureServiceBusConsumerClientFactory (line 12) | internal sealed class AzureServiceBusConsumerClientFactory : IConsumerCl...
    method AzureServiceBusConsumerClientFactory (line 18) | public AzureServiceBusConsumerClientFactory(
    method CreateAsync (line 28) | public async Task<IConsumerClient> CreateAsync(string groupName, byte ...

FILE: src/DotNetCore.CAP.AzureServiceBus/AzureServiceBusConsumerCommitInput.cs
  class AzureServiceBusConsumerCommitInput (line 9) | public class AzureServiceBusConsumerCommitInput
    method AzureServiceBusConsumerCommitInput (line 11) | public AzureServiceBusConsumerCommitInput(ProcessMessageEventArgs proc...
    method AzureServiceBusConsumerCommitInput (line 16) | public AzureServiceBusConsumerCommitInput(ProcessSessionMessageEventAr...
    method CompleteMessageAsync (line 26) | public Task CompleteMessageAsync()
    method AbandonMessageAsync (line 33) | public Task AbandonMessageAsync()

FILE: src/DotNetCore.CAP.AzureServiceBus/AzureServiceBusHeaders.cs
  class AzureServiceBusHeaders (line 6) | public static class AzureServiceBusHeaders

FILE: src/DotNetCore.CAP.AzureServiceBus/CAP.AzureServiceBusOptions.cs
  class AzureServiceBusOptions (line 18) | public class AzureServiceBusOptions
    method ConfigureCustomProducer (line 159) | public AzureServiceBusOptions ConfigureCustomProducer<T>(

FILE: src/DotNetCore.CAP.AzureServiceBus/CAP.AzureServiceBusOptionsExtension.cs
  class AzureServiceBusOptionsExtension (line 12) | internal sealed class AzureServiceBusOptionsExtension : ICapOptionsExten...
    method AzureServiceBusOptionsExtension (line 16) | public AzureServiceBusOptionsExtension(Action<AzureServiceBusOptions> ...
    method AddServices (line 21) | public void AddServices(IServiceCollection services)

FILE: src/DotNetCore.CAP.AzureServiceBus/CAP.Options.Extensions.cs
  class CapOptionsExtensions (line 10) | public static class CapOptionsExtensions
    method UseAzureServiceBus (line 17) | public static CapOptions UseAzureServiceBus(this CapOptions options, s...
    method UseAzureServiceBus (line 29) | public static CapOptions UseAzureServiceBus(this CapOptions options, A...

FILE: src/DotNetCore.CAP.AzureServiceBus/Helpers/ServiceBusHelpers.cs
  class ServiceBusHelpers (line 6) | public static class ServiceBusHelpers
    method GetBrokerAddress (line 8) | public static BrokerAddress GetBrokerAddress(string? connectionString,...
    method TryGetEndpointFromConnectionString (line 28) | private static bool TryGetEndpointFromConnectionString(string? connect...

FILE: src/DotNetCore.CAP.AzureServiceBus/ITransport.AzureServiceBus.cs
  class AzureServiceBusTransport (line 20) | internal class AzureServiceBusTransport : ITransport, IServiceBusProduce...
    method AzureServiceBusTransport (line 30) | public AzureServiceBusTransport(
    method CreateProducerForMessage (line 44) | public IServiceBusProducerDescriptor CreateProducerForMessage(Transpor...
    method SendAsync (line 57) | public async Task<OperateResult> SendAsync(TransportMessage transportM...
    method GetSenderForProducer (line 111) | private ServiceBusSender GetSenderForProducer(IServiceBusProducerDescr...

FILE: src/DotNetCore.CAP.AzureServiceBus/Producer/IServiceBusProducerDescriptor.cs
  type IServiceBusProducerDescriptor (line 8) | public interface IServiceBusProducerDescriptor
  class ServiceBusProducerDescriptor (line 16) | public class ServiceBusProducerDescriptor : IServiceBusProducerDescriptor
    method ServiceBusProducerDescriptor (line 18) | public ServiceBusProducerDescriptor(Type type, string topicPath, bool ...
    method ServiceBusProducerDescriptor (line 26) | public ServiceBusProducerDescriptor(string typeName, string topicPath,...
    method ServiceBusProducerDescriptor (line 43) | public ServiceBusProducerDescriptor(string topicPath, bool createSubsc...
  class ServiceBusProducerDescriptor (line 41) | public class ServiceBusProducerDescriptor<T> : ServiceBusProducerDescriptor
    method ServiceBusProducerDescriptor (line 18) | public ServiceBusProducerDescriptor(Type type, string topicPath, bool ...
    method ServiceBusProducerDescriptor (line 26) | public ServiceBusProducerDescriptor(string typeName, string topicPath,...
    method ServiceBusProducerDescriptor (line 43) | public ServiceBusProducerDescriptor(string topicPath, bool createSubsc...

FILE: src/DotNetCore.CAP.AzureServiceBus/Producer/IServiceBusProducerDescriptorFactory.cs
  type IServiceBusProducerDescriptorFactory (line 8) | public interface IServiceBusProducerDescriptorFactory
    method CreateProducerForMessage (line 10) | IServiceBusProducerDescriptor CreateProducerForMessage(TransportMessag...

FILE: src/DotNetCore.CAP.AzureServiceBus/Producer/ServiceBusProducerDescriptorBuilder.cs
  class ServiceBusProducerDescriptorBuilder (line 8) | public class ServiceBusProducerDescriptorBuilder<T>
    method UseTopic (line 14) | public ServiceBusProducerDescriptorBuilder<T> UseTopic(string topicPath)
    method WithSubscription (line 20) | public ServiceBusProducerDescriptorBuilder<T> WithSubscription()
    method WithSessions (line 26) | public ServiceBusProducerDescriptorBuilder<T> WithSessions()
    method Build (line 32) | public ServiceBusProducerDescriptor<T> Build()

FILE: src/DotNetCore.CAP.AzureServiceBus/ServiceBusProcessorFacade.cs
  class ServiceBusProcessorFacade (line 11) | public class ServiceBusProcessorFacade : IAsyncDisposable
    method ServiceBusProcessorFacade (line 26) | public ServiceBusProcessorFacade(ServiceBusProcessor? serviceBusProces...
    method StartProcessingAsync (line 41) | public Task StartProcessingAsync(CancellationToken cancellationToken =...
    method DisposeAsync (line 90) | public async ValueTask DisposeAsync()

FILE: src/DotNetCore.CAP.Dashboard.K8s/K8sDiscoveryOptions.cs
  class K8sDiscoveryOptions (line 12) | public class K8sDiscoveryOptions
    method K8sDiscoveryOptions (line 14) | public K8sDiscoveryOptions()

FILE: src/DotNetCore.CAP.Dashboard.K8s/K8sDiscoveryOptionsExtensions.cs
  class K8sDiscoveryOptionsExtension (line 14) | internal sealed class K8sDiscoveryOptionsExtension : ICapOptionsExtension
    method K8sDiscoveryOptionsExtension (line 18) | public K8sDiscoveryOptionsExtension(Action<K8sDiscoveryOptions>? option)
    method AddServices (line 23) | public void AddServices(IServiceCollection services)
  class CapDiscoveryOptionsExtensions (line 41) | public static class CapDiscoveryOptionsExtensions
    method UseK8sDiscovery (line 48) | public static CapOptions UseK8sDiscovery(this CapOptions capOptions)
    method UseK8sDiscovery (line 60) | public static CapOptions UseK8sDiscovery(this CapOptions capOptions, A...

FILE: src/DotNetCore.CAP.Dashboard.K8s/K8sNodeDiscoveryProvider.cs
  class K8sNodeDiscoveryProvider (line 12) | public class K8sNodeDiscoveryProvider : INodeDiscoveryProvider
    method K8sNodeDiscoveryProvider (line 18) | public K8sNodeDiscoveryProvider(ILoggerFactory logger, K8sDiscoveryOpt...
    method GetNode (line 24) | public async Task<Node?> GetNode(string svcName, string ns, Cancellati...
    method GetNodes (line 50) | public async Task<IList<Node>> GetNodes(string? ns, CancellationToken ...
    method GetNamespaces (line 74) | public async Task<List<string>> GetNamespaces(CancellationToken cancel...
    method ListServices (line 93) | public async Task<IList<Node>> ListServices(string? ns = null)
    method GetPortByNameOrIndex (line 136) | private static int GetPortByNameOrIndex(V1Service? service, string fil...
    method GetPortByIndex (line 171) | private static int GetPortByIndex(IList<V1ServicePort> servicePorts, i...
    method GetPortByName (line 191) | private static int GetPortByName(IList<V1ServicePort> servicePorts, st...
    type TagFilterResult (line 207) | private record TagFilterResult(bool hideNode, int filteredPortIndex, s...
    method FilterNodesByTags (line 209) | private TagFilterResult FilterNodesByTags(IDictionary<string, string> ...
    method CheckFilterPortIndex (line 265) | private int? CheckFilterPortIndex(KeyValuePair<string, string> tag, st...
    method IsNodeHidden (line 281) | private bool IsNodeHidden(KeyValuePair<string, string> tag, string cap...
    method GetTagScope (line 305) | private string GetTagScope(KeyValuePair<string, string> tag)

FILE: src/DotNetCore.CAP.Dashboard.K8s/ServiceCollectionExtensions.cs
  class ServiceCollectionExtensions (line 13) | public static class ServiceCollectionExtensions
    method AddCapDashboardStandalone (line 22) | public static IServiceCollection AddCapDashboardStandalone(this IServi...

FILE: src/DotNetCore.CAP.Dashboard/CAP.BuilderExtension.cs
  class CapBuilderExtension (line 23) | public static class CapBuilderExtension
    method UseCapDashboard (line 27) | internal static IApplicationBuilder UseCapDashboard(this IApplicationB...
    method AllowAnonymousIf (line 84) | internal static IEndpointConventionBuilder AllowAnonymousIf(this IEndp...

FILE: src/DotNetCore.CAP.Dashboard/CAP.DashboardOptions.cs
  class DashboardOptions (line 12) | public class DashboardOptions
    method DashboardOptions (line 14) | public DashboardOptions()

FILE: src/DotNetCore.CAP.Dashboard/CAP.DashboardOptionsExtensions.cs
  class DashboardOptionsExtension (line 13) | internal sealed class DashboardOptionsExtension : ICapOptionsExtension
    method DashboardOptionsExtension (line 17) | public DashboardOptionsExtension(Action<DashboardOptions> option)
    method AddServices (line 22) | public void AddServices(IServiceCollection services)
  class CapStartupFilter (line 32) | internal sealed class CapStartupFilter : IStartupFilter
    method Configure (line 34) | public Action<IApplicationBuilder> Configure(Action<IApplicationBuilde...
  class CapOptionsExtensions (line 48) | public static class CapOptionsExtensions
    method UseDashboard (line 50) | public static CapOptions UseDashboard(this CapOptions capOptions)
    method UseDashboard (line 55) | public static CapOptions UseDashboard(this CapOptions capOptions, Acti...

FILE: src/DotNetCore.CAP.Dashboard/CAP.MetricsEventListener.cs
  class CapMetricsEventListener (line 12) | internal class CapMetricsEventListener : EventListener
    method CapMetricsEventListener (line 16) | public CapMetricsEventListener()
    method GetRealTimeMetrics (line 32) | public CircularBuffer<int?>[] GetRealTimeMetrics()
    method OnEventSourceCreated (line 53) | protected override void OnEventSourceCreated(EventSource source)
    method OnEventWritten (line 64) | protected override void OnEventWritten(EventWrittenEventArgs eventData)

FILE: src/DotNetCore.CAP.Dashboard/CapCache.cs
  class Cache (line 18) | public class Cache<K, T> : IDisposable
    method Dispose (line 35) | public void Dispose()
    method Dispose (line 47) | protected virtual void Dispose(bool disposing)
    method Clear (line 67) | public void Clear()
    method CheckTimer (line 97) | private void CheckTimer(K key, TimeSpan? cacheTimeout, bool restartTim...
    method RemoveByTimer (line 120) | private void RemoveByTimer(object state)
    method AddOrUpdate (line 143) | public void AddOrUpdate(K key, T cacheObject, TimeSpan? cacheTimeout, ...
    method AddOrUpdate (line 169) | public void AddOrUpdate(K key, T cacheObject)
    method Get (line 186) | public T Get(K key)
    method TryGet (line 208) | public bool TryGet(K key, out T value)
    method Remove (line 231) | public void Remove(Predicate<K> keyPattern)
    method Remove (line 267) | public void Remove(K key)
    method Exists (line 299) | public bool Exists(K key)
  class CapCache (line 336) | public class CapCache : Cache<string, object>

FILE: src/DotNetCore.CAP.Dashboard/CircularBuffer.cs
  class CircularBuffer (line 14) | internal class CircularBuffer<T> : ICollection<T>
    method CircularBuffer (line 30) | public CircularBuffer(int capacity)
    method WrapIndex (line 79) | private int WrapIndex(int zeroBasedIndex)
    method ToArray (line 91) | public T[] ToArray()
    method GetEnumerator (line 100) | public IEnumerator<T> GetEnumerator()
    method GetEnumerator (line 108) | IEnumerator IEnumerable.GetEnumerator()
    method Add (line 127) | public void Add(T item)
    method Clear (line 147) | public void Clear()
    method Contains (line 153) | public bool Contains(T item)
    method CopyTo (line 158) | public void CopyTo(T[] array, int arrayIndex)
    method Remove (line 173) | public bool Remove(T item)

FILE: src/DotNetCore.CAP.Dashboard/GatewayProxy/GatewayProxyAgent.cs
  class GatewayProxyAgent (line 20) | public class GatewayProxyAgent
    method GatewayProxyAgent (line 32) | public GatewayProxyAgent(
    method Invoke (line 48) | public async Task<bool> Invoke(HttpContext context)
    method SetResponseOnHttpContext (line 119) | private async Task SetResponseOnHttpContext(HttpContext context, HttpR...
    method SetDownStreamRequestUri (line 144) | private void SetDownStreamRequestUri(Node node, string requestPath, st...
    method AddHeaderIfDoesntExist (line 158) | private static void AddHeaderIfDoesntExist(HttpContext context, KeyVal...

FILE: src/DotNetCore.CAP.Dashboard/GatewayProxy/IRequestMapper.Default.cs
  class RequestMapper (line 16) | public class RequestMapper : IRequestMapper
    method Map (line 21) | public async Task<HttpRequestMessage> Map(HttpRequest request)
    method BuildAbsolute (line 42) | private string BuildAbsolute(
    method GetEncodedUrl (line 72) | private string GetEncodedUrl(HttpRequest request)
    method MapContent (line 77) | private async Task<HttpContent> MapContent(HttpRequest request)
    method MapMethod (line 88) | private HttpMethod MapMethod(HttpRequest request)
    method MapUri (line 93) | private Uri MapUri(HttpRequest request)
    method MapHeaders (line 98) | private void MapHeaders(HttpRequest request, HttpRequestMessage reques...
    method ToByteArray (line 107) | private async Task<byte[]> ToByteArray(Stream stream)
    method IsSupportedHeader (line 119) | private bool IsSupportedHeader(KeyValuePair<string, StringValues> header)

FILE: src/DotNetCore.CAP.Dashboard/GatewayProxy/IRequestMapper.cs
  type IRequestMapper (line 10) | public interface IRequestMapper
    method Map (line 12) | Task<HttpRequestMessage> Map(HttpRequest request);

FILE: src/DotNetCore.CAP.Dashboard/GatewayProxy/Requester/HttpClientBuilder.cs
  class HttpClientBuilder (line 12) | internal class HttpClientBuilder : IHttpClientBuilder
    method Create (line 16) | public IHttpClient Create()
    method CreateHttpMessageHandler (line 25) | private HttpMessageHandler CreateHttpMessageHandler(HttpMessageHandler...
  class HttpClientWrapper (line 45) | internal class HttpClientWrapper : IHttpClient
    method HttpClientWrapper (line 47) | public HttpClientWrapper(HttpClient client)
    method SendAsync (line 54) | public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)

FILE: src/DotNetCore.CAP.Dashboard/GatewayProxy/Requester/HttpClientHttpRequester.cs
  class HttpClientHttpRequester (line 11) | public class HttpClientHttpRequester : IHttpRequester
    method HttpClientHttpRequester (line 16) | public HttpClientHttpRequester(ILoggerFactory loggerFactory, IHttpClie...
    method GetResponse (line 22) | public async Task<HttpResponseMessage> GetResponse(HttpRequestMessage ...
    method GetHttpClient (line 45) | private IHttpClient GetHttpClient(string cacheKey, IHttpClientBuilder ...
    method GetCacheKey (line 54) | private string GetCacheKey(HttpRequestMessage request, IHttpClientBuil...

FILE: src/DotNetCore.CAP.Dashboard/GatewayProxy/Requester/IHttpClient.cs
  type IHttpClient (line 9) | public interface IHttpClient
    method SendAsync (line 13) | Task<HttpResponseMessage> SendAsync(HttpRequestMessage request);

FILE: src/DotNetCore.CAP.Dashboard/GatewayProxy/Requester/IHttpClientBuilder.cs
  type IHttpClientBuilder (line 8) | public interface IHttpClientBuilder
    method Create (line 13) | IHttpClient Create();

FILE: src/DotNetCore.CAP.Dashboard/GatewayProxy/Requester/IHttpClientCache.cs
  type IHttpClientCache (line 8) | public interface IHttpClientCache
    method Exists (line 10) | bool Exists(string id);
    method Get (line 12) | IHttpClient Get(string id);
    method Remove (line 14) | void Remove(string id);
    method Set (line 16) | void Set(string id, IHttpClient handler, TimeSpan expirationTime);

FILE: src/DotNetCore.CAP.Dashboard/GatewayProxy/Requester/IHttpRequester.cs
  type IHttpRequester (line 9) | public interface IHttpRequester
    method GetResponse (line 11) | Task<HttpResponseMessage> GetResponse(HttpRequestMessage request);

FILE: src/DotNetCore.CAP.Dashboard/GatewayProxy/Requester/MemoryHttpClientCache.cs
  class MemoryHttpClientCache (line 9) | public class MemoryHttpClientCache : IHttpClientCache
    method Set (line 13) | public void Set(string id, IHttpClient client, TimeSpan expirationTime)
    method Exists (line 27) | public bool Exists(string id)
    method Get (line 32) | public IHttpClient Get(string id)
    method Remove (line 40) | public void Remove(string id)

FILE: src/DotNetCore.CAP.Dashboard/HtmlHelper.cs
  class HtmlHelper (line 11) | public class HtmlHelper
    method MethodEscaped (line 13) | public static string MethodEscaped(MethodInfo method)
    method WrapType (line 56) | private static string WrapType(Type type)
    method WrapIdentifier (line 70) | private static string WrapIdentifier(string value)
    method WrapKeyword (line 75) | private static string WrapKeyword(string value)
    method WrapType (line 80) | private static string WrapType(string value)
    method Span (line 85) | private static string Span(string @class, string value)

FILE: src/DotNetCore.CAP.Dashboard/NodeDiscovery/CAP.ConsulDiscoveryOptions.cs
  class ConsulDiscoveryOptions (line 6) | public class ConsulDiscoveryOptions

FILE: src/DotNetCore.CAP.Dashboard/NodeDiscovery/CAP.ConsulDiscoveryOptionsExtensions.cs
  class ConsulDiscoveryOptionsExtension (line 14) | internal sealed class ConsulDiscoveryOptionsExtension : ICapOptionsExten...
    method ConsulDiscoveryOptionsExtension (line 18) | public ConsulDiscoveryOptionsExtension(Action<ConsulDiscoveryOptions> ...
    method AddServices (line 23) | public void AddServices(IServiceCollection services)
  class CapDiscoveryOptionsExtensions (line 42) | public static class CapDiscoveryOptionsExtensions
    method UseConsulDiscovery (line 47) | public static CapOptions UseConsulDiscovery(this CapOptions capOptions)
    method UseConsulDiscovery (line 52) | public static CapOptions UseConsulDiscovery(this CapOptions capOptions...

FILE: src/DotNetCore.CAP.Dashboard/NodeDiscovery/INodeDiscoveryProvider.Consul.cs
  class ConsulNodeDiscoveryProvider (line 15) | public class ConsulNodeDiscoveryProvider : INodeDiscoveryProvider
    method ConsulNodeDiscoveryProvider (line 20) | public ConsulNodeDiscoveryProvider(ILoggerFactory logger, ConsulDiscov...
    method GetNode (line 26) | public async Task<Node> GetNode(string nodeName, string ns, Cancellati...
    method GetNodes (line 57) | public async Task<IList<Node>> GetNodes(string ns, CancellationToken c...
    method RegisterNode (line 103) | public async Task RegisterNode(CancellationToken cancellationToken)

FILE: src/DotNetCore.CAP.Dashboard/NodeDiscovery/INodeDiscoveryProvider.cs
  type INodeDiscoveryProvider (line 11) | public interface INodeDiscoveryProvider
    method GetNodes (line 13) | Task<IList<Node>> GetNodes(string ns = null, CancellationToken cancell...
    method GetNode (line 15) | Task<Node> GetNode(string nodeName, string ns = null, CancellationToke...
    method RegisterNode (line 17) | Task RegisterNode(CancellationToken cancellationToken = default)
    method GetNamespaces (line 22) | Task<List<string>> GetNamespaces(CancellationToken cancellationToken)
    method ListServices (line 27) | Task<IList<Node>> ListServices(string ns = null)

FILE: src/DotNetCore.CAP.Dashboard/NodeDiscovery/IProcessingServer.Consul.cs
  class ConsulProcessingNodeServer (line 10) | internal class ConsulProcessingNodeServer : IProcessingServer
    method ConsulProcessingNodeServer (line 14) | public ConsulProcessingNodeServer(INodeDiscoveryProvider discoveryProv...
    method StartAsync (line 19) | public async ValueTask StartAsync(CancellationToken stoppingToken)
    method Dispose (line 24) | public void Dispose()

FILE: src/DotNetCore.CAP.Dashboard/NodeDiscovery/Node.cs
  class Node (line 6) | public class Node

FILE: src/DotNetCore.CAP.Dashboard/RouteActionProvider.cs
  class RouteActionProvider (line 28) | public class RouteActionProvider
    method RouteActionProvider (line 35) | public RouteActionProvider(IEndpointRouteBuilder builder, DashboardOpt...
    method MapDashboardRoutes (line 46) | public void MapDashboardRoutes()
    method Metrics (line 70) | public async Task Metrics(HttpContext httpContext)
    method MetaInfo (line 78) | public async Task MetaInfo(HttpContext httpContext)
    method Stats (line 94) | public async Task Stats(HttpContext httpContext)
    method MetricsHistory (line 120) | public async Task MetricsHistory(HttpContext httpContext)
    method Health (line 152) | public Task Health(HttpContext httpContext)
    method PublishedMessageDetails (line 158) | public async Task PublishedMessageDetails(HttpContext httpContext)
    method ReceivedMessageDetails (line 179) | public async Task ReceivedMessageDetails(HttpContext httpContext)
    method PublishedRequeue (line 200) | public async Task PublishedRequeue(HttpContext httpContext)
    method PublishedDelete (line 221) | public async Task PublishedDelete(HttpContext httpContext)
    method ReceivedRequeue (line 238) | public async Task ReceivedRequeue(HttpContext httpContext)
    method ReceivedDelete (line 259) | public async Task ReceivedDelete(HttpContext httpContext)
    method PublishedList (line 277) | public async Task PublishedList(HttpContext httpContext)
    method ReceivedList (line 303) | public async Task ReceivedList(HttpContext httpContext)
    method Subscribers (line 331) | public async Task Subscribers(HttpContext httpContext)
    method Nodes (line 363) | public async Task Nodes(HttpContext httpContext)
    method ListNamespaces (line 378) | public async Task ListNamespaces(HttpContext httpContext)
    method ListServices (line 395) | public async Task ListServices(HttpContext httpContext)
    method PingServices (line 414) | public async Task PingServices(HttpContext httpContext)
    method BadRequest (line 449) | private void BadRequest(HttpContext httpContext)
  class WarpResult (line 455) | public class WarpResult
    class SubInfo (line 463) | public class SubInfo
  class IntExtension (line 473) | public static class IntExtension
    method ToInt32OrDefault (line 475) | public static int ToInt32OrDefault(this StringValues value, int defaul...

FILE: src/DotNetCore.CAP.Dashboard/wwwroot/dist/assets/Nodes.e12132f5.js
  method data (line 1) | data(){return{pinging:!1,selected:null,nsList:[],isBusy:!1,items:[]}}
  method fields (line 1) | fields(){return[{key:"id",label:this.$t("Id")},{key:"name",label:this.$t...
  method mounted (line 1) | mounted(){this.fetchNsOptions(),this.fetchData()}
  method colWidth (line 1) | colWidth(n){switch(n){case"address":return"320px";case"actions":return"8...
  method fetchNsOptions (line 1) | fetchNsOptions(){this.isBusy=!0,i.get("/list-ns").then(e=>{e.data.length...
  method fetchSvcs (line 1) | fetchSvcs(){if(!!this.selected){this.isBusy=!0;var n=this.getCookie("cap...
  method pingSvcs (line 1) | async pingSvcs(){var t;this.pinging=!0;for(var n of this.items)try{var e...
  method fetchData (line 1) | fetchData(){this.isBusy=!0;var n=this.getCookie("cap.node");i.get("/node...
  method switchNode (line 1) | switchNode(n){n._ping=!0,i.get("/ping",{params:{endpoint:n.address+":"+n...
  method getCookie (line 1) | getCookie(n){for(var e=n+"=",t=decodeURIComponent(document.cookie),s=t.s...

FILE: src/DotNetCore.CAP.Dashboard/wwwroot/dist/assets/Published.a8d638e6.js
  method data (line 1) | data(){return{subMens:[{variant:"secondary",text:"Succeeded",num:"publis...
  method onMetric (line 1) | onMetric(){return this.$store.getters.getMetric}
  method fields (line 1) | fields(){return[{key:"checkbox",label:""},{key:"id",label:this.$t("IdNam...
  method mounted (line 1) | mounted(){this.fetchData(),window.abc=this}
  method fetchData (line 1) | fetchData(){this.isBusy=!0,l.get(`/published/${this.status}`,{params:thi...
  method selectAll (line 1) | selectAll(s){s?(this.selectedItems=[...this.items.map(t=>({...t,selected...
  method select (line 1) | select(s){const{id:t}=s;this.selectedItems.some(e=>e.id==t)?this.selecte...
  method clearSelected (line 1) | clearSelected(){this.allSelected=!1,this.selectedItems=[]}
  method info (line 1) | info(s,t){this.infoModal.title=s.id.toString(),this.infoModal.content=u....
  method clear (line 1) | clear(){this.items=this.items.map(s=>({...s,selected:!1})),this.selected...

FILE: src/DotNetCore.CAP.Dashboard/wwwroot/dist/assets/Received.e36ea621.js
  method data (line 1) | data(){return{subMens:[{variant:"secondary",text:"Succeeded",num:"receiv...
  method onMetric (line 1) | onMetric(){return this.$store.getters.getMetric}
  method fields (line 1) | fields(){return[{key:"checkbox",label:""},{key:"id",label:this.$t("IdNam...
  method mounted (line 1) | mounted(){this.fetchData()}
  method fetchData (line 1) | fetchData(){this.isBusy=!0,n.get(`/received/${this.status}`,{params:this...
  method selectAll (line 1) | selectAll(a){a?(this.selectedItems=[...this.items.map(t=>({...t,selected...
  method select (line 1) | select(a){const{id:t}=a;this.selectedItems.some(e=>e.id==t)?this.selecte...
  method clearSelected (line 1) | clearSelected(){this.allSelected=!1,this.selectedItems=[]}
  method info (line 1) | info(a,t){this.infoModal.title=a.id.toString(),this.infoModal.content=d....
  method clear (line 1) | clear(){this.items=this.items.map(a=>({...a,selected:!1})),this.selected...

FILE: src/DotNetCore.CAP.Dashboard/wwwroot/dist/assets/Subscriber.d66f9645.js
  method data (line 1) | data(){return{subscribers:{}}}
  method mounted (line 1) | mounted(){_.get("/subscriber").then(r=>{this.subscribers=r.data})}

FILE: src/DotNetCore.CAP.Dashboard/wwwroot/dist/assets/index.2d8714a6.js
  function K (line 1) | function K(E){var m,F,j,g=h.prototype={constructor:h,toString:null,value...
  function O (line 1) | function O(E){var m=E|0;return E>0||E===m?m:m-1}
  function x (line 1) | function x(E){for(var m,F,j=1,g=E.length,b=E[0]+"";j<g;){for(m=E[j++]+""...
  function I (line 1) | function I(E,m){var F,j,g=E.c,b=m.c,M=E.s,U=m.s,Q=E.e,Z=m.e;if(!M||!U)re...
  function w (line 1) | function w(E,m,F,j){if(E<m||E>F||E!==T(E))throw Error(D+(j||"Argument")+...
  function J (line 1) | function J(E){var m=E.c.length-1;return O(E.e/N)==m&&E.c[m]%2!=0}
  function ne (line 1) | function ne(E,m){return(E.length>1?E.charAt(0)+"."+E.slice(1):E)+(m<0?"e...
  function V (line 1) | function V(E,m,F){var j,g;if(m<0){for(g=F+".";++m;g+=F);E=g+E}else if(j=...
  function H (line 1) | function H(C){return A.lastIndex=0,A.test(C)?'"'+C.replace(A,function(X)...
  function N (line 1) | function N(C,X){var B,_,K,O,x=$,I,w=X[C],J=w!=null&&(w instanceof L||L.i...

FILE: src/DotNetCore.CAP.Dashboard/wwwroot/dist/assets/index.909977fe.js
  function r (line 1) | function r(i){const a={};return i.integrity&&(a.integrity=i.integrity),i...
  function n (line 1) | function n(i){if(i.ep)return;i.ep=!0;const a=r(i);fetch(i.href,a)}
  function Oe (line 5) | function Oe(t){return t==null}
  function L (line 5) | function L(t){return t!=null}
  function _t (line 5) | function _t(t){return t===!0}
  function vI (line 5) | function vI(t){return t===!1}
  function ju (line 5) | function ju(t){return typeof t=="string"||typeof t=="number"||typeof t==...
  function gt (line 5) | function gt(t){return typeof t=="function"}
  function gr (line 5) | function gr(t){return t!==null&&typeof t=="object"}
  function On (line 5) | function On(t){return rb.call(t)==="[object Object]"}
  function mI (line 5) | function mI(t){return rb.call(t)==="[object RegExp]"}
  function m1 (line 5) | function m1(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===...
  function pm (line 5) | function pm(t){return L(t)&&typeof t.then=="function"&&typeof t.catch=="...
  function gI (line 5) | function gI(t){return t==null?"":Array.isArray(t)||On(t)&&t.toString===r...
  function bI (line 5) | function bI(t,e){return e&&e.__v_isRef?e.value:e}
  function _u (line 5) | function _u(t){var e=parseFloat(t);return isNaN(e)?t:e}
  function Jn (line 5) | function Jn(t,e){for(var r=Object.create(null),n=t.split(","),i=0;i<n.le...
  function Ma (line 5) | function Ma(t,e){var r=t.length;if(r){if(e===t[r-1]){t.length=r-1;return...
  function Cr (line 5) | function Cr(t,e){return OI.call(t,e)}
  function No (line 5) | function No(t){var e=Object.create(null);return function(n){var i=e[n];r...
  function SI (line 5) | function SI(t,e){function r(n){var i=arguments.length;return i?i>1?t.app...
  function PI (line 5) | function PI(t,e){return t.bind(e)}
  function hm (line 5) | function hm(t,e){e=e||0;for(var r=t.length-e,n=new Array(r);r--;)n[r]=t[...
  function ut (line 5) | function ut(t,e){for(var r in e)t[r]=e[r];return t}
  function b1 (line 5) | function b1(t){for(var e={},r=0;r<t.length;r++)t[r]&&ut(e,t[r]);return e}
  function Qt (line 5) | function Qt(t,e,r){}
  function _o (line 5) | function _o(t,e){if(t===e)return!0;var r=gr(t),n=gr(e);if(r&&n)try{var i...
  function O1 (line 5) | function O1(t,e){for(var r=0;r<t.length;r++)if(_o(t[r],e))return r;retur...
  function jf (line 5) | function jf(t){var e=!1;return function(){e||(e=!0,t.apply(this,argument...
  function EI (line 5) | function EI(t,e){return t===e?t===0&&1/t!==1/e:t===t||e===e}
  function w1 (line 5) | function w1(t){var e=(t+"").charCodeAt(0);return e===36||e===95}
  function ga (line 5) | function ga(t,e,r,n){Object.defineProperty(t,e,{value:r,enumerable:!!n,w...
  function DI (line 5) | function DI(t){if(!CI.test(t)){var e=t.split(".");return function(r){for...
  function Cs (line 5) | function Cs(t){return typeof t=="function"&&/native code/.test(t.toStrin...
  function t (line 5) | function t(){this.set=Object.create(null)}
  function Sa (line 5) | function Sa(t){t===void 0&&(t=null),t||Ds&&Ds._scope.off(),Ds=t,t&&t._sc...
  function t (line 5) | function t(e,r,n,i,a,o,s,l){this.tag=e,this.data=r,this.children=n,this....
  function ys (line 5) | function ys(t){return new _n(void 0,void 0,void 0,String(t))}
  function mm (line 5) | function mm(t){var e=new _n(t.tag,t.data,t.children&&t.children.slice(),...
  function t (line 5) | function t(){this._pending=!1,this.id=xI++,this.subs=[]}
  function Zs (line 5) | function Zs(t){rf.push(t),Pa.target=t}
  function Qs (line 5) | function Qs(){rf.pop(),Pa.target=rf[rf.length-1]}
  function Ea (line 5) | function Ea(t){ib=t}
  function t (line 5) | function t(e,r,n){if(r===void 0&&(r=!1),n===void 0&&(n=!1),this.value=e,...
  function Gi (line 5) | function Gi(t,e,r){if(t&&Cr(t,"__ob__")&&t.__ob__ instanceof BO)return t...
  function wo (line 5) | function wo(t,e,r,n,i,a,o){o===void 0&&(o=!1);var s=new Pa,l=Object.getO...
  function ab (line 5) | function ab(t,e,r){if(!ob(t)){var n=t.__ob__;return Ne(t)&&m1(e)?(t.leng...
  function E1 (line 5) | function E1(t,e){if(Ne(t)&&m1(e)){t.splice(e,1);return}var r=t.__ob__;t....
  function $1 (line 5) | function $1(t){for(var e=void 0,r=0,n=t.length;r<n;r++)e=t[r],e&&e.__ob_...
  function C1 (line 5) | function C1(t){return BI(t,!0),ga(t,"__v_isShallow",!0),t}
  function BI (line 5) | function BI(t,e){ob(t)||Gi(t,e,Hu())}
  function ob (line 5) | function ob(t){return!!(t&&t.__v_isReadonly)}
  function hi (line 5) | function hi(t){return!!(t&&t.__v_isRef===!0)}
  function gm (line 5) | function gm(t,e,r){Object.defineProperty(t,r,{enumerable:!0,configurable...
  function t (line 5) | function t(e){e===void 0&&(e=!1),this.detached=e,this.active=!0,this.eff...
  function LI (line 5) | function LI(t,e){e===void 0&&(e=Ur),e&&e.active&&e.effects.push(t)}
  function FI (line 5) | function FI(){return Ur}
  function jI (line 5) | function jI(t){var e=t._provided,r=t.$parent&&t.$parent._provided;return...
  function bm (line 5) | function bm(t,e){function r(){var n=r.fns;if(Ne(n))for(var i=n.slice(),a...
  function D1 (line 5) | function D1(t,e,r,n,i,a){var o,s,l,u;for(o in t)s=t[o],l=e[o],u=kO(o),Oe...
  function pa (line 5) | function pa(t,e,r){t instanceof _n&&(t=t.data.hook||(t.data.hook={}));va...
  function VI (line 5) | function VI(t,e,r){var n=e.options.props;if(!Oe(n)){var i={},a=t.attrs,o...
  function LO (line 5) | function LO(t,e,r,n,i){if(L(e)){if(Cr(e,r))return t[r]=e[r],i||delete e[...
  function HI (line 5) | function HI(t){for(var e=0;e<t.length;e++)if(Ne(t[e]))return Array.proto...
  function sb (line 5) | function sb(t){return ju(t)?[ys(t)]:Ne(t)?A1(t):void 0}
  function wl (line 5) | function wl(t){return L(t)&&L(t.text)&&vI(t.isComment)}
  function A1 (line 5) | function A1(t,e){var r=[],n,i,a,o;for(n=0;n<t.length;n++)i=t[n],!(Oe(i)|...
  function zI (line 5) | function zI(t,e){var r=null,n,i,a,o;if(Ne(t)||typeof t=="string")for(r=n...
  function UI (line 5) | function UI(t,e,r,n){var i=this.$scopedSlots[t],a;i?(r=r||{},n&&(r=ut(ut...
  function GI (line 5) | function GI(t){return Yf(this.$options,"filters",t)||y1}
  function FO (line 5) | function FO(t,e){return Ne(t)?t.indexOf(e)===-1:t!==e}
  function WI (line 5) | function WI(t,e,r,n,i){var a=Bn.keyCodes[e]||r;return i&&n&&!Bn.keyCodes...
  function KI (line 5) | function KI(t,e,r,n,i){if(r&&gr(r)){Ne(r)&&(r=b1(r));var a=void 0,o=func...
  function YI (line 5) | function YI(t,e){var r=this._staticTrees||(this._staticTrees=[]),n=r[t];...
  function qI (line 5) | function qI(t,e,r){return R1(t,"__once__".concat(e).concat(r?"_".concat(...
  function R1 (line 5) | function R1(t,e,r){if(Ne(t))for(var n=0;n<t.length;n++)t[n]&&typeof t[n]...
  function jO (line 5) | function jO(t,e,r){t.isStatic=!0,t.key=e,t.isOnce=r}
  function XI (line 5) | function XI(t,e){if(e&&On(e)){var r=t.on=t.on?ut({},t.on):{};for(var n i...
  function x1 (line 5) | function x1(t,e,r,n){e=e||{$stable:!r};for(var i=0;i<t.length;i++){var a...
  function JI (line 5) | function JI(t,e){for(var r=0;r<e.length;r+=2){var n=e[r];typeof n=="stri...
  function ZI (line 5) | function ZI(t,e){return typeof t=="string"?e+t:t}
  function M1 (line 5) | function M1(t){t._o=qI,t._n=_u,t._s=gI,t._l=zI,t._t=UI,t._q=_o,t._i=O1,t...
  function lb (line 5) | function lb(t,e){if(!t||!t.length)return{};for(var r={},n=0,i=t.length;n...
  function QI (line 5) | function QI(t){return t.isComment&&!t.asyncFactory||t.text===" "}
  function Tu (line 5) | function Tu(t){return t.isComment&&t.asyncFactory}
  function uu (line 5) | function uu(t,e,r,n){var i,a=Object.keys(r).length>0,o=e?!!e.$stable:!a,...
  function eB (line 5) | function eB(t,e,r,n){var i=function(){var a=Ds;Sa(t);var o=arguments.len...
  function tB (line 5) | function tB(t,e){return function(){return t[e]}}
  function rB (line 5) | function rB(t){var e=t.$options,r=e.setup;if(r){var n=t._setupContext=nB...
  function nB (line 5) | function nB(t){return{get attrs(){if(!t._attrsProxy){var e=t._attrsProxy...
  function zf (line 5) | function zf(t,e,r,n,i){var a=!1;for(var o in e)o in t?e[o]!==r[o]&&(a=!0...
  function iB (line 5) | function iB(t,e,r,n){Object.defineProperty(t,e,{enumerable:!0,configurab...
  function aB (line 5) | function aB(t){return t._slotsProxy||N1(t._slotsProxy={},t.$scopedSlots)...
  function N1 (line 5) | function N1(t,e){for(var r in e)t[r]=e[r];for(var r in t)r in e||delete ...
  function oB (line 5) | function oB(t){t._vnode=null,t._staticTrees=null;var e=t.$options,r=t.$v...
  function sB (line 5) | function sB(t){M1(t.prototype),t.prototype.$nextTick=function(e){return ...
  function Bh (line 5) | function Bh(t,e){return(t.__esModule||zu&&t[Symbol.toStringTag]==="Modul...
  function lB (line 5) | function lB(t,e,r,n,i){var a=co();return a.asyncFactory=t,a.asyncMeta={d...
  function uB (line 5) | function uB(t,e){if(_t(t.error)&&L(t.errorComp))return t.errorComp;if(L(...
  function I1 (line 5) | function I1(t){if(Ne(t))for(var e=0;e<t.length;e++){var r=t[e];if(L(r)&&...
  function Uf (line 5) | function Uf(t,e,r,n,i,a){return(Ne(r)||ju(r))&&(i=n,n=r,r=void 0),_t(a)&...
  function fB (line 5) | function fB(t,e,r,n,i){if(L(r)&&L(r.__ob__)||(L(r)&&L(r.is)&&(e=r.is),!e...
  function k1 (line 5) | function k1(t,e,r){if(t.ns=e,t.tag==="foreignObject"&&(e=void 0,r=!0),L(...
  function dB (line 5) | function dB(t){gr(t.style)&&Gf(t.style),gr(t.class)&&Gf(t.class)}
  function To (line 5) | function To(t,e,r){Zs();try{if(e)for(var n=e;n=n.$parent;){var i=n.$opti...
  function $a (line 5) | function $a(t,e,r,n,i){var a;try{a=r?t.apply(e,r):t.call(e),a&&!a._isVue...
  function VO (line 5) | function VO(t,e,r){if(Bn.errorHandler)try{return Bn.errorHandler.call(nu...
  function HO (line 5) | function HO(t,e,r){if(wn&&typeof console<"u")console.error(t);else throw t}
  function wc (line 5) | function wc(){_m=!1;var t=Om.slice(0);Om.length=0;for(var e=0;e<t.length...
  function ub (line 5) | function ub(t,e){var r;if(Om.push(function(){if(t)try{t.call(e)}catch(n)...
  function Gf (line 5) | function Gf(t){return af(t,UO),UO.clear(),t}
  function af (line 5) | function af(t,e){var r,n,i=Ne(t);if(!(!i&&!gr(t)||t.__v_skip||Object.isF...
  function t (line 5) | function t(e,r,n,i,a){LI(this,Ur&&!Ur._vm?Ur:e?e._scope:void 0),(this.vm...
  function gB (line 5) | function gB(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t....
  function bB (line 5) | function bB(t,e){Su.$on(t,e)}
  function yB (line 5) | function yB(t,e){Su.$off(t,e)}
  function OB (line 5) | function OB(t,e){var r=Su;return function n(){var i=e.apply(null,argumen...
  function L1 (line 5) | function L1(t,e,r){Su=t,D1(e,r||{},bB,yB,OB,t),Su=void 0}
  function _B (line 5) | function _B(t){var e=/^hook:/;t.prototype.$on=function(r,n){var i=this;i...
  function F1 (line 5) | function F1(t){var e=fo;return fo=t,function(){fo=e}}
  function wB (line 5) | function wB(t){var e=t.$options,r=e.parent;if(r&&!e.abstract){for(;r.$op...
  function TB (line 5) | function TB(t){t.prototype._update=function(e,r){var n=this,i=n.$el,a=n....
  function SB (line 5) | function SB(t,e,r){t.$el=e,t.$options.render||(t.$options.render=co),Wn(...
  function PB (line 5) | function PB(t,e,r,n,i){var a=n.data.scopedSlots,o=t.$scopedSlots,s=!!(a&...
  function j1 (line 5) | function j1(t){for(;t&&(t=t.$parent);)if(t._inactive)return!0;return!1}
  function fb (line 5) | function fb(t,e){if(e){if(t._directInactive=!1,j1(t))return}else if(t._d...
  function V1 (line 5) | function V1(t,e){if(!(e&&(t._directInactive=!0,j1(t)))&&!t._inactive){t....
  function Wn (line 5) | function Wn(t,e,r,n){n===void 0&&(n=!0),Zs();var i=Ds,a=FI();n&&Sa(t);va...
  function EB (line 5) | function EB(){Os=Bi.length=db.length=0,Wf={},wm=pb=!1}
  function CB (line 5) | function CB(){H1=Tm(),pb=!0;var t,e;for(Bi.sort($B),Os=0;Os<Bi.length;Os...
  function DB (line 5) | function DB(t){for(var e=t.length;e--;){var r=t[e],n=r.vm;n&&n._watcher=...
  function AB (line 5) | function AB(t){t._inactive=!1,db.push(t)}
  function RB (line 5) | function RB(t){for(var e=0;e<t.length;e++)t[e]._inactive=!0,fb(t[e],!0)}
  function xB (line 5) | function xB(t){var e=t.id;if(Wf[e]==null&&!(t===Pa.target&&t.noRecurse))...
  function MB (line 5) | function MB(t){var e=t.$options.provide;if(e){var r=gt(e)?e.call(t):e;if...
  function NB (line 5) | function NB(t){var e=z1(t.$options.inject,t);e&&(Ea(!1),Object.keys(e).f...
  function z1 (line 5) | function z1(t,e){if(t){for(var r=Object.create(null),n=zu?Reflect.ownKey...
  function hb (line 5) | function hb(t,e,r,n,i){var a=this,o=i.options,s;Cr(n,"_uid")?(s=Object.c...
  function IB (line 5) | function IB(t,e,r,n,i){var a=t.options,o={},s=a.props;if(L(s))for(var l ...
  function GO (line 5) | function GO(t,e,r,n,i){var a=mm(t);return a.fnContext=r,a.fnOptions=n,e....
  function WO (line 5) | function WO(t,e){for(var r in e)t[Oo(r)]=e[r]}
  function Kf (line 5) | function Kf(t){return t.name||t.__name||t._componentTag}
  function YO (line 5) | function YO(t,e,r,n,i){if(!Oe(t)){var a=r.$options._base;if(gr(t)&&(t=a....
  function BB (line 5) | function BB(t,e){var r={_isComponent:!0,_parentVnode:t,parent:e},n=t.dat...
  function kB (line 5) | function kB(t){for(var e=t.hook||(t.hook={}),r=0;r<KO.length;r++){var n=...
  function LB (line 5) | function LB(t,e){var r=function(n,i){t(n,i),e(n,i)};return r._merged=!0,r}
  function FB (line 5) | function FB(t,e){var r=t.model&&t.model.prop||"value",n=t.model&&t.model...
  function Pu (line 5) | function Pu(t,e,r){if(r===void 0&&(r=!0),!e)return t;for(var n,i,a,o=zu?...
  function qO (line 5) | function qO(t,e,r){return r?function(){var i=gt(e)?e.call(r,r):e,a=gt(t)...
  function VB (line 5) | function VB(t,e){var r=e?t?t.concat(e):Ne(e)?e:[e]:t;return r&&HB(r)}
  function HB (line 5) | function HB(t){for(var e=[],r=0;r<t.length;r++)e.indexOf(t[r])===-1&&e.p...
  function zB (line 5) | function zB(t,e,r,n){var i=Object.create(t||null);return e?ut(i,e):i}
  function GB (line 5) | function GB(t,e){var r=t.props;if(!!r){var n={},i,a,o;if(Ne(r))for(i=r.l...
  function WB (line 5) | function WB(t,e){var r=t.inject;if(!!r){var n=t.inject={};if(Ne(r))for(v...
  function KB (line 5) | function KB(t){var e=t.directives;if(e)for(var r in e){var n=e[r];gt(n)&...
  function So (line 5) | function So(t,e,r){if(gt(e)&&(e=e.options),GB(e),WB(e),KB(e),!e._base&&(...
  function Yf (line 5) | function Yf(t,e,r,n){if(typeof r=="string"){var i=t[e];if(Cr(i,r))return...
  function mb (line 5) | function mb(t,e,r,n){var i=e[t],a=!Cr(r,t),o=r[t],s=JO(Boolean,i.type);i...
  function YB (line 5) | function YB(t,e,r){if(!!Cr(e,"default")){var n=e.default;return t&&t.$op...
  function Sm (line 5) | function Sm(t){var e=t&&t.toString().match(qB);return e?e[1]:""}
  function XO (line 5) | function XO(t,e){return Sm(t)===Sm(e)}
  function JO (line 5) | function JO(t,e){if(!Ne(e))return XO(e,t)?0:-1;for(var r=0,n=e.length;r<...
  function gb (line 5) | function gb(t,e,r){fa.get=function(){return this[e][r]},fa.set=function(...
  function XB (line 5) | function XB(t){var e=t.$options;if(e.props&&JB(t,e.props),rB(t),e.method...
  function JB (line 5) | function JB(t,e){var r=t.$options.propsData||{},n=t._props=C1({}),i=t.$o...
  function ZB (line 5) | function ZB(t){var e=t.$options.data;e=t._data=gt(e)?QB(e,t):e||{},On(e)...
  function QB (line 5) | function QB(t,e){Zs();try{return t.call(e,e)}catch(r){return To(r,e,"dat...
  function tk (line 5) | function tk(t,e){var r=t._computedWatchers=Object.create(null),n=Hu();fo...
  function U1 (line 5) | function U1(t,e,r){var n=!Hu();gt(r)?(fa.get=n?ZO(e):QO(r),fa.set=Qt):(f...
  function ZO (line 5) | function ZO(t){return function(){var r=this._computedWatchers&&this._com...
  function QO (line 5) | function QO(t){return function(){return t.call(this,this)}}
  function rk (line 5) | function rk(t,e){t.$options.props;for(var r in e)t[r]=typeof e[r]!="func...
  function nk (line 5) | function nk(t,e){for(var r in e){var n=e[r];if(Ne(n))for(var i=0;i<n.len...
  function Pm (line 5) | function Pm(t,e,r,n){return On(r)&&(n=r,r=r.handler),typeof r=="string"&...
  function ik (line 5) | function ik(t){var e={};e.get=function(){return this._data};var r={};r.g...
  function ok (line 5) | function ok(t){t.prototype._init=function(e){var r=this;r._uid=ak++,r._i...
  function sk (line 5) | function sk(t,e){var r=t.$options=Object.create(t.constructor.options),n...
  function bb (line 5) | function bb(t){var e=t.options;if(t.super){var r=bb(t.super),n=t.superOp...
  function lk (line 5) | function lk(t){var e,r=t.options,n=t.sealedOptions;for(var i in r)r[i]!=...
  function ye (line 5) | function ye(t){this._init(t)}
  function uk (line 5) | function uk(t){t.use=function(e){var r=this._installedPlugins||(this._in...
  function ck (line 5) | function ck(t){t.mixin=function(e){return this.options=So(this.options,e...
  function fk (line 5) | function fk(t){t.cid=0;var e=1;t.extend=function(r){r=r||{};var n=this,i...
  function dk (line 5) | function dk(t){var e=t.options.props;for(var r in e)gb(t.prototype,"_pro...
  function pk (line 5) | function pk(t){var e=t.options.computed;for(var r in e)U1(t.prototype,r,...
  function hk (line 5) | function hk(t){Qd.forEach(function(e){t[e]=function(r,n){return n?(e==="...
  function e_ (line 5) | function e_(t){return t&&(Kf(t.Ctor.options)||t.tag)}
  function Sc (line 5) | function Sc(t,e){return Ne(t)?t.indexOf(e)>-1:typeof t=="string"?t.split...
  function t_ (line 5) | function t_(t,e){var r=t.cache,n=t.keys,i=t._vnode,a=t.$vnode;for(var o ...
  function Em (line 5) | function Em(t,e,r,n){var i=t[e];i&&(!n||i.tag!==n.tag)&&i.componentInsta...
  function gk (line 5) | function gk(t){var e={};e.get=function(){return Bn},Object.definePropert...
  function Sk (line 5) | function Sk(t){for(var e=t.data,r=t,n=t;L(n.componentInstance);)n=n.comp...
  function n_ (line 5) | function n_(t,e){return{staticClass:Ob(t.staticClass,e.staticClass),clas...
  function Pk (line 5) | function Pk(t,e){return L(t)||L(e)?Ob(t,_b(e)):""}
  function Ob (line 5) | function Ob(t,e){return t?e?t+" "+e:t:e||""}
  function _b (line 5) | function _b(t){return Array.isArray(t)?Ek(t):gr(t)?$k(t):typeof t=="stri...
  function Ek (line 5) | function Ek(t){for(var e="",r,n=0,i=t.length;n<i;n++)L(r=_b(t[n]))&&r!==...
  function $k (line 5) | function $k(t){var e="";for(var r in t)t[r]&&(e&&(e+=" "),e+=r);return e}
  function Ak (line 5) | function Ak(t){if(wb(t))return"svg";if(t==="math")return"math"}
  function Rk (line 5) | function Rk(t){if(!wn)return!0;if(K1(t))return!1;if(t=t.toLowerCase(),Pc...
  function xk (line 5) | function xk(t){if(typeof t=="string"){var e=document.querySelector(t);re...
  function Mk (line 5) | function Mk(t,e){var r=document.createElement(t);return t!=="select"||e....
  function Nk (line 5) | function Nk(t,e){return document.createElementNS(Ck[t],e)}
  function Ik (line 5) | function Ik(t){return document.createTextNode(t)}
  function Bk (line 5) | function Bk(t){return document.createComment(t)}
  function kk (line 5) | function kk(t,e,r){t.insertBefore(e,r)}
  function Lk (line 5) | function Lk(t,e){t.removeChild(e)}
  function Fk (line 5) | function Fk(t,e){t.appendChild(e)}
  function jk (line 5) | function jk(t){return t.parentNode}
  function Vk (line 5) | function Vk(t){return t.nextSibling}
  function Hk (line 5) | function Hk(t){return t.tagName}
  function zk (line 5) | function zk(t,e){t.textContent=e}
  function Uk (line 5) | function Uk(t,e){t.setAttribute(e,"")}
  function _s (line 5) | function _s(t,e){var r=t.data.ref;if(!!L(r)){var n=t.context,i=t.compone...
  function i_ (line 5) | function i_(t,e,r){var n=t._setupState;n&&Cr(n,e)&&(hi(n[e])?n[e].value=...
  function Wa (line 5) | function Wa(t,e){return t.key===e.key&&t.asyncFactory===e.asyncFactory&&...
  function Kk (line 5) | function Kk(t,e){if(t.tag!=="input")return!0;var r,n=L(r=t.data)&&L(r=r....
  function Yk (line 5) | function Yk(t,e,r){var n,i,a={};for(n=e;n<=r;++n)i=t[n].key,L(i)&&(a[i]=...
  function qk (line 5) | function qk(t){var e,r,n={},i=t.modules,a=t.nodeOps;for(e=0;e<Tl.length;...
  function Lh (line 5) | function Lh(t,e){(t.data.directives||e.data.directives)&&Jk(t,e)}
  function Jk (line 5) | function Jk(t,e){var r=t===ha,n=e===ha,i=a_(t.data.directives,t.context)...
  function a_ (line 5) | function a_(t,e){var r=Object.create(null);if(!t)return r;var n,i;for(n=...
  function Qk (line 5) | function Qk(t){return t.rawName||"".concat(t.name,".").concat(Object.key...
  function Sl (line 5) | function Sl(t,e,r,n,i){var a=t.def&&t.def[e];if(a)try{a(r.elm,t,r,n,i)}c...
  function o_ (line 5) | function o_(t,e){var r=e.componentOptions;if(!(L(r)&&r.Ctor.options.inhe...
  function s_ (line 5) | function s_(t,e,r,n){n||t.tagName.indexOf("-")>-1?l_(t,e,r):Tk(e)?qf(r)?...
  function l_ (line 5) | function l_(t,e,r){if(qf(r))t.removeAttribute(e);else{if(Xs&&!Js&&t.tagN...
  function u_ (line 5) | function u_(t,e){var r=e.elm,n=e.data,i=t.data;if(!(Oe(n.staticClass)&&O...
  function nL (line 5) | function nL(t){if(L(t[Fh])){var e=Xs?"change":"input";t[e]=[].concat(t[F...
  function iL (line 5) | function iL(t,e,r){var n=Eu;return function i(){var a=e.apply(null,argum...
  function oL (line 5) | function oL(t,e,r,n){if(aL){var i=H1,a=e;e=a._wrapper=function(o){if(o.t...
  function Y1 (line 5) | function Y1(t,e,r,n){(n||Eu).removeEventListener(t,e._wrapper||e,r)}
  function Vh (line 5) | function Vh(t,e){if(!(Oe(t.data.on)&&Oe(e.data.on))){var r=e.data.on||{}...
  function c_ (line 5) | function c_(t,e){if(!(Oe(t.data.domProps)&&Oe(e.data.domProps))){var r,n...
  function lL (line 5) | function lL(t,e){return!t.composing&&(t.tagName==="OPTION"||uL(t,e)||cL(...
  function uL (line 5) | function uL(t,e){var r=!0;try{r=document.activeElement!==t}catch{}return...
  function cL (line 5) | function cL(t,e){var r=t.value,n=t._vModifiers;if(L(n)){if(n.number)retu...
  function Hh (line 5) | function Hh(t){var e=q1(t.style);return t.staticStyle?ut(t.staticStyle,e...
  function q1 (line 5) | function q1(t){return Array.isArray(t)?b1(t):typeof t=="string"?dL(t):t}
  function pL (line 5) | function pL(t,e){var r={},n;if(e)for(var i=t;i.componentInstance;)i=i.co...
  function h_ (line 5) | function h_(t,e){var r=e.data,n=t.data;if(!(Oe(r.staticStyle)&&Oe(r.styl...
  function J1 (line 5) | function J1(t,e){if(!(!e||!(e=e.trim())))if(t.classList)e.indexOf(" ")>-...
  function Z1 (line 5) | function Z1(t,e){if(!(!e||!(e=e.trim())))if(t.classList)e.indexOf(" ")>-...
  function Q1 (line 5) | function Q1(t){if(!!t){if(typeof t=="object"){var e={};return t.css!==!1...
  function r$ (line 5) | function r$(t){m_(function(){m_(t)})}
  function po (line 5) | function po(t,e){var r=t._transitionClasses||(t._transitionClasses=[]);r...
  function ki (line 5) | function ki(t,e){t._transitionClasses&&Ma(t._transitionClasses,e),Z1(t,e)}
  function n$ (line 5) | function n$(t,e,r){var n=i$(t,e),i=n.type,a=n.timeout,o=n.propCount;if(!...
  function i$ (line 5) | function i$(t,e){var r=window.getComputedStyle(t),n=(r[of+"Delay"]||"")....
  function g_ (line 5) | function g_(t,e){for(;t.length<e.length;)t=t.concat(t);return Math.max.a...
  function b_ (line 5) | function b_(t){return Number(t.slice(0,-1).replace(",","."))*1e3}
  function Am (line 5) | function Am(t,e){var r=t.elm;L(r._leaveCb)&&(r._leaveCb.cancelled=!0,r._...
  function a$ (line 5) | function a$(t,e){var r=t.elm;L(r._enterCb)&&(r._enterCb.cancelled=!0,r._...
  function o$ (line 5) | function o$(t){return typeof t=="number"&&!isNaN(t)}
  function Tb (line 5) | function Tb(t){if(Oe(t))return!1;var e=t.fns;return L(e)?Tb(Array.isArra...
  function y_ (line 5) | function y_(t,e){e.data.show!==!0&&Am(e)}
  function O_ (line 5) | function O_(t,e,r){__(t,e),(Xs||nb)&&setTimeout(function(){__(t,e)},0)}
  function __ (line 5) | function __(t,e,r){var n=e.value,i=t.multiple;if(!(i&&!Array.isArray(n))...
  function w_ (line 5) | function w_(t,e){return e.every(function(r){return!_o(r,t)})}
  function Jf (line 5) | function Jf(t){return"_value"in t?t._value:t.value}
  function wL (line 5) | function wL(t){t.target.composing=!0}
  function T_ (line 5) | function T_(t){!t.target.composing||(t.target.composing=!1,Sb(t.target,"...
  function Sb (line 5) | function Sb(t,e){var r=document.createEvent("HTMLEvents");r.initEvent(e,...
  function Rm (line 5) | function Rm(t){return t.componentInstance&&(!t.data||!t.data.transition)...
  function xm (line 5) | function xm(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abst...
  function u$ (line 5) | function u$(t){var e={},r=t.$options;for(var n in r.propsData)e[n]=t[n];...
  function S_ (line 5) | function S_(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{...
  function PL (line 5) | function PL(t){for(;t=t.parent;)if(t.data.transition)return!0}
  function EL (line 5) | function EL(t,e){return e.key===t.key&&e.tag===t.tag}
  function RL (line 5) | function RL(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._ent...
  function xL (line 5) | function xL(t){t.data.newPos=t.elm.getBoundingClientRect()}
  function ML (line 5) | function ML(t){var e=t.data.pos,r=t.data.newPos,n=e.left-r.left,i=e.top-...
  function IL (line 5) | function IL(t,e){return e?e.toUpperCase():""}
  function BL (line 5) | function BL(t){for(var e,r={},n=0,i=t.split(Uh.styleList);n<i.length;n++...
  function oe (line 5) | function oe(){for(var t,e,r={},n=arguments.length;n--;)for(var i=0,a=Obj...
  function P_ (line 5) | function P_(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Pl (line 5) | function Pl(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function kL (line 5) | function kL(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function LL (line 5) | function LL(t,e){if(t==null)return{};var r=FL(t,e),n,i;if(Object.getOwnP...
  function FL (line 5) | function FL(t,e){if(t==null)return{};var r={},n=Object.keys(t),i,a;for(a...
  function Zf (line 5) | function Zf(t){return Zf=typeof Symbol=="function"&&typeof Symbol.iterat...
  method passive (line 5) | get passive(){t=!0}
  function Mm (line 5) | function Mm(t){return Mm=typeof Symbol=="function"&&typeof Symbol.iterat...
  function ep (line 5) | function ep(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a...
  function tp (line 5) | function tp(t,e){if(typeof e!="function"&&e!==null)throw new TypeError("...
  function rp (line 5) | function rp(t){var e=y$();return function(){var n=Cu(t),i;if(e){var a=Cu...
  function TF (line 5) | function TF(t,e){if(e&&(Mm(e)==="object"||typeof e=="function"))return e...
  function SF (line 5) | function SF(t){if(t===void 0)throw new ReferenceError("this hasn't been ...
  function ed (line 5) | function ed(t){var e=typeof Map=="function"?new Map:void 0;return ed=fun...
  function lf (line 5) | function lf(t,e,r){return y$()?lf=Reflect.construct:lf=function(i,a,o){v...
  function y$ (line 5) | function y$(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.constru...
  function PF (line 5) | function PF(t){return Function.toString.call(t).indexOf("[native code]")...
  function $u (line 5) | function $u(t,e){return $u=Object.setPrototypeOf||function(n,i){return n...
  function Cu (line 5) | function Cu(t){return Cu=Object.setPrototypeOf?Object.getPrototypeOf:fun...
  function r (line 5) | function r(){return ep(this,r),e.apply(this,arguments)}
  function r (line 5) | function r(){return ep(this,r),e.apply(this,arguments)}
  function r (line 5) | function r(){return ep(this,r),e.apply(this,arguments)}
  function r (line 5) | function r(){return ep(this,r),e.apply(this,arguments)}
  function td (line 5) | function td(t){return td=typeof Symbol=="function"&&typeof Symbol.iterat...
  function D_ (line 5) | function D_(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Eo (line 5) | function Eo(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Uu (line 5) | function Uu(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function R_ (line 5) | function R_(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function x_ (line 5) | function x_(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function w$ (line 5) | function w$(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function RF (line 5) | function RF(t){return IF(t)||NF(t)||MF(t)||xF()}
  function xF (line 5) | function xF(){throw new TypeError(`Invalid attempt to spread non-iterabl...
  function MF (line 6) | function MF(t,e){if(!!t){if(typeof t=="string")return Nm(t,e);var r=Obje...
  function NF (line 6) | function NF(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iter...
  function IF (line 6) | function IF(t){if(Array.isArray(t))return Nm(t)}
  function Nm (line 6) | function Nm(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new A...
  function LF (line 6) | function LF(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a...
  function I_ (line 6) | function I_(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.e...
  function FF (line 6) | function FF(t,e,r){return e&&I_(t.prototype,e),r&&I_(t,r),Object.defineP...
  function t (line 6) | function t(){LF(this,t),this.$_config={}}
  function B_ (line 6) | function B_(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function k_ (line 6) | function k_(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function HF (line 6) | function HF(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function J_ (line 7) | function J_(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function vo (line 7) | function vo(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function jD (line 7) | function jD(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function j2 (line 7) | function j2(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function V2 (line 7) | function V2(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Z_ (line 7) | function Z_(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function ao (line 7) | function ao(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function z2 (line 7) | function z2(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Q_ (line 7) | function Q_(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function ew (line 7) | function ew(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function ql (line 7) | function ql(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function J2 (line 7) | function J2(t,e){return tV(t)||eV(t,e)||Q2(t,e)||Z2()}
  function Z2 (line 7) | function Z2(){throw new TypeError(`Invalid attempt to destructure non-it...
  function Q2 (line 8) | function Q2(t,e){if(!!t){if(typeof t=="string")return nw(t,e);var r=Obje...
  function nw (line 8) | function nw(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new A...
  function eV (line 8) | function eV(t,e){var r=t==null?null:typeof Symbol<"u"&&t[Symbol.iterator...
  function tV (line 8) | function tV(t){if(Array.isArray(t))return t}
  function Tt (line 8) | function Tt(t){return Nr?new Proxy(t,{get:function(r,n){return n in r?r[...
  function ow (line 8) | function ow(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function sw (line 8) | function sw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function lw (line 8) | function lw(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function fV (line 8) | function fV(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function hw (line 8) | function hw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function vw (line 8) | function vw(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function PV (line 8) | function PV(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function mw (line 8) | function mw(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function bw (line 8) | function bw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function RV (line 8) | function RV(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function xV (line 8) | function xV(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function yw (line 8) | function yw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Ow (line 8) | function Ow(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function IV (line 8) | function IV(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function LV (line 8) | function LV(t){return HV(t)||VV(t)||jV(t)||FV()}
  function FV (line 8) | function FV(){throw new TypeError(`Invalid attempt to spread non-iterabl...
  function jV (line 9) | function jV(t,e){if(!!t){if(typeof t=="string")return Km(t,e);var r=Obje...
  function VV (line 9) | function VV(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iter...
  function HV (line 9) | function HV(t){if(Array.isArray(t))return Km(t)}
  function Km (line 9) | function Km(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new A...
  function _w (line 9) | function _w(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Pr (line 9) | function Pr(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function nA (line 9) | function nA(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function ww (line 9) | function ww(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function cd (line 9) | function cd(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Qa (line 9) | function Qa(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Sw (line 9) | function Sw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function fd (line 9) | function fd(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function eo (line 9) | function eo(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Ew (line 9) | function Ew(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function $w (line 9) | function $w(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function QV (line 9) | function QV(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Dw (line 9) | function Dw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Aw (line 9) | function Aw(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function rH (line 9) | function rH(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Rw (line 9) | function Rw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function xw (line 9) | function xw(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function iH (line 9) | function iH(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Mw (line 9) | function Mw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Nw (line 9) | function Nw(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function vA (line 9) | function vA(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function vH (line 9) | function vH(t,e){return yH(t)||bH(t,e)||gH(t,e)||mH()}
  function mH (line 9) | function mH(){throw new TypeError(`Invalid attempt to destructure non-it...
  function gH (line 10) | function gH(t,e){if(!!t){if(typeof t=="string")return Lw(t,e);var r=Obje...
  function Lw (line 10) | function Lw(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new A...
  function bH (line 10) | function bH(t,e){var r=t==null?null:typeof Symbol<"u"&&t[Symbol.iterator...
  function yH (line 10) | function yH(t){if(Array.isArray(t))return t}
  function pf (line 10) | function pf(t,e,r){return OH()?pf=Reflect.construct:pf=function(i,a,o){v...
  function OH (line 10) | function OH(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.constru...
  function Xm (line 10) | function Xm(t,e){return Xm=Object.setPrototypeOf||function(n,i){return n...
  function jw (line 10) | function jw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function ui (line 10) | function ui(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Cn (line 10) | function Cn(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Vw (line 10) | function Vw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Dc (line 10) | function Dc(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function hf (line 10) | function hf(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Hw (line 10) | function Hw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function zw (line 10) | function zw(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function vf (line 10) | function vf(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Uw (line 10) | function Uw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Gw (line 10) | function Gw(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function mf (line 10) | function mf(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function ov (line 10) | function ov(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Ww (line 10) | function Ww(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Kw (line 10) | function Kw(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function CH (line 10) | function CH(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Yw (line 10) | function Yw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function es (line 10) | function es(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Jl (line 10) | function Jl(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function RH (line 10) | function RH(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a...
  function qw (line 10) | function qw(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.e...
  function xH (line 10) | function xH(t,e,r){return e&&qw(t.prototype,e),r&&qw(t,r),Object.defineP...
  function t (line 10) | function t(e,r){RH(this,t),this.el=e,this.callback=r.callback,this.margi...
  function Xw (line 10) | function Xw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function hd (line 10) | function hd(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Ts (line 10) | function Ts(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Jw (line 10) | function Jw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Zw (line 10) | function Zw(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function kH (line 10) | function kH(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Qw (line 10) | function Qw(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function GH (line 10) | function GH(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function WH (line 10) | function WH(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function eT (line 10) | function eT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function sv (line 10) | function sv(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Zl (line 10) | function Zl(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function e (line 10) | function e(){return t.apply(this,arguments)}
  function iT (line 10) | function iT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function vu (line 10) | function vu(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function t5 (line 10) | function t5(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function aT (line 10) | function aT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function fv (line 10) | function fv(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Jm (line 10) | function Jm(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function R5 (line 33) | function R5(t){var e=!1;return function(){e||(e=!0,window.Promise.resolv...
  function x5 (line 33) | function x5(t){var e=!1;return function(){e||(e=!0,setTimeout(function()...
  function LA (line 33) | function LA(t){var e={};return t&&e.toString.call(t)==="[object Function]"}
  function Bo (line 33) | function Bo(t,e){if(t.nodeType!==1)return[];var r=t.ownerDocument.defaul...
  function Jb (line 33) | function Jb(t){return t.nodeName==="HTML"?t:t.parentNode||t.host}
  function Zu (line 33) | function Zu(t){if(!t)return document.body;switch(t.nodeName){case"HTML":...
  function FA (line 33) | function FA(t){return t&&t.referenceNode?t.referenceNode:t}
  function rl (line 33) | function rl(t){return t===11?lT:t===10?uT:lT||uT}
  function ks (line 33) | function ks(t){if(!t)return document.documentElement;for(var e=rl(10)?do...
  function I5 (line 33) | function I5(t){var e=t.nodeName;return e==="BODY"?!1:e==="HTML"||ks(t.fi...
  function ig (line 33) | function ig(t){return t.parentNode!==null?ig(t.parentNode):t}
  function gd (line 33) | function gd(t,e){if(!t||!t.nodeType||!e||!e.nodeType)return document.doc...
  function Ls (line 33) | function Ls(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments...
  function B5 (line 33) | function B5(t,e){var r=arguments.length>2&&arguments[2]!==void 0?argumen...
  function cT (line 33) | function cT(t,e){var r=e==="x"?"Left":"Top",n=r==="Left"?"Right":"Bottom...
  function fT (line 33) | function fT(t,e,r,n){return Math.max(e["offset"+t],e["scroll"+t],r["clie...
  function jA (line 33) | function jA(t){var e=t.body,r=t.documentElement,n=rl(10)&&getComputedSty...
  function t (line 33) | function t(e,r){for(var n=0;n<r.length;n++){var i=r[n];i.enumerable=i.en...
  function xa (line 33) | function xa(t){return In({},t,{right:t.left+t.width,bottom:t.top+t.heigh...
  function ag (line 33) | function ag(t){var e={};try{if(rl(10)){e=t.getBoundingClientRect();var r...
  function Zb (line 33) | function Zb(t,e){var r=arguments.length>2&&arguments[2]!==void 0?argumen...
  function F5 (line 33) | function F5(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments...
  function VA (line 33) | function VA(t){var e=t.nodeName;if(e==="BODY"||e==="HTML")return!1;if(Bo...
  function HA (line 33) | function HA(t){if(!t||!t.parentElement||rl())return document.documentEle...
  function Qb (line 33) | function Qb(t,e,r,n){var i=arguments.length>4&&arguments[4]!==void 0?arg...
  function j5 (line 33) | function j5(t){var e=t.width,r=t.height;return e*r}
  function zA (line 33) | function zA(t,e,r,n,i){var a=arguments.length>5&&arguments[5]!==void 0?a...
  function UA (line 33) | function UA(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?argum...
  function GA (line 33) | function GA(t){var e=t.ownerDocument.defaultView,r=e.getComputedStyle(t)...
  function bd (line 33) | function bd(t){var e={left:"right",right:"left",bottom:"top",top:"bottom...
  function WA (line 33) | function WA(t,e,r){r=r.split("-")[0];var n=GA(t),i={width:n.width,height...
  function Qu (line 33) | function Qu(t,e){return Array.prototype.find?t.find(e):t.filter(e)[0]}
  function V5 (line 33) | function V5(t,e,r){if(Array.prototype.findIndex)return t.findIndex(funct...
  function KA (line 33) | function KA(t,e,r){var n=r===void 0?t:t.slice(0,V5(t,"name",r));return n...
  function H5 (line 33) | function H5(){if(!this.state.isDestroyed){var t={instance:this,styles:{}...
  function YA (line 33) | function YA(t,e){return t.some(function(r){var n=r.name,i=r.enabled;retu...
  function ey (line 33) | function ey(t){for(var e=[!1,"ms","Webkit","Moz","O"],r=t.charAt(0).toUp...
  function z5 (line 33) | function z5(){return this.state.isDestroyed=!0,YA(this.modifiers,"applyS...
  function qA (line 33) | function qA(t){var e=t.ownerDocument;return e?e.defaultView:window}
  function XA (line 33) | function XA(t,e,r,n){var i=t.nodeName==="BODY",a=i?t.ownerDocument.defau...
  function U5 (line 33) | function U5(t,e,r,n){r.updateBound=n,qA(t).addEventListener("resize",r.u...
  function G5 (line 33) | function G5(){this.state.eventsEnabled||(this.state=U5(this.reference,th...
  function W5 (line 33) | function W5(t,e){return qA(t).removeEventListener("resize",e.updateBound...
  function K5 (line 33) | function K5(){this.state.eventsEnabled&&(cancelAnimationFrame(this.sched...
  function ty (line 33) | function ty(t){return t!==""&&!isNaN(parseFloat(t))&&isFinite(t)}
  function og (line 33) | function og(t,e){Object.keys(e).forEach(function(r){var n="";["width","h...
  function Y5 (line 33) | function Y5(t,e){Object.keys(e).forEach(function(r){var n=e[r];n!==!1?t....
  function q5 (line 33) | function q5(t){return og(t.instance.popper,t.styles),Y5(t.instance.poppe...
  function X5 (line 33) | function X5(t,e,r,n,i){var a=UA(i,e,t,r.positionFixed),o=zA(r.placement,...
  function J5 (line 33) | function J5(t,e){var r=t.offsets,n=r.popper,i=r.reference,a=Math.round,o...
  function Q5 (line 33) | function Q5(t,e){var r=e.x,n=e.y,i=t.offsets.popper,a=Qu(t.instance.modi...
  function JA (line 33) | function JA(t,e,r){var n=Qu(t,function(s){var l=s.name;return l===e}),i=...
  function ez (line 33) | function ez(t,e){var r;if(!JA(t.instance.modifiers,"arrow","keepTogether...
  function tz (line 33) | function tz(t){return t==="end"?"start":t==="start"?"end":t}
  function dT (line 33) | function dT(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments...
  function rz (line 33) | function rz(t,e){if(YA(t.instance.modifiers,"inner")||t.flipped&&t.place...
  function nz (line 33) | function nz(t){var e=t.offsets,r=e.popper,n=e.reference,i=t.placement.sp...
  function iz (line 33) | function iz(t,e,r,n){var i=t.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),a=+i[1],...
  function az (line 33) | function az(t,e,r,n){var i=[0,0],a=["right","left"].indexOf(n)!==-1,o=t....
  function oz (line 33) | function oz(t,e){var r=e.offset,n=t.placement,i=t.offsets,a=i.popper,o=i...
  function sz (line 33) | function sz(t,e){var r=e.boundariesElement||ks(t.instance.popper);t.inst...
  function lz (line 33) | function lz(t){var e=t.placement,r=e.split("-")[0],n=e.split("-")[1];if(...
  function uz (line 33) | function uz(t){if(!JA(t.instance.modifiers,"hide","preventOverflow"))ret...
  function cz (line 33) | function cz(t){var e=t.placement,r=e.split("-")[0],n=t.offsets,i=n.poppe...
  function t (line 33) | function t(e,r){var n=this,i=arguments.length>2&&arguments[2]!==void 0?a...
  function yz (line 33) | function yz(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a...
  function pT (line 33) | function pT(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.e...
  function Oz (line 33) | function Oz(t,e,r){return e&&pT(t.prototype,e),r&&pT(t,r),Object.defineP...
  function t (line 33) | function t(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[...
  function hT (line 33) | function hT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function vT (line 33) | function vT(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Ez (line 33) | function Ez(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function gT (line 33) | function gT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Mi (line 33) | function Mi(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Rz (line 33) | function Rz(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function yT (line 33) | function yT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function yd (line 33) | function yd(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function eR (line 33) | function eR(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function _T (line 33) | function _T(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function wT (line 33) | function wT(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function lg (line 33) | function lg(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function TT (line 33) | function TT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function ST (line 33) | function ST(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function rR (line 33) | function rR(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function ET (line 33) | function ET(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function $T (line 33) | function $T(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Iz (line 33) | function Iz(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function DT (line 33) | function DT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Od (line 33) | function Od(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function kz (line 33) | function kz(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Fz (line 33) | function Fz(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function xT (line 33) | function xT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function MT (line 33) | function MT(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function nR (line 33) | function nR(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Hz (line 33) | function Hz(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function IT (line 33) | function IT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function BT (line 33) | function BT(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Yz (line 33) | function Yz(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Xz (line 33) | function Xz(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function jT (line 33) | function jT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function ci (line 33) | function ci(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Hr (line 33) | function Hr(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function VT (line 33) | function VT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function HT (line 33) | function HT(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Ss (line 33) | function Ss(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function zT (line 33) | function zT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function li (line 33) | function li(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function bf (line 33) | function bf(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function GT (line 33) | function GT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function WT (line 33) | function WT(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function fg (line 33) | function fg(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function YT (line 33) | function YT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function ns (line 33) | function ns(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function ms (line 33) | function ms(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function qT (line 33) | function qT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Ni (line 33) | function Ni(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Ql (line 33) | function Ql(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function ZT (line 33) | function ZT(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Ri (line 33) | function Ri(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function yf (line 33) | function yf(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function eS (line 33) | function eS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function jc (line 33) | function jc(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function eu (line 33) | function eu(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  method props (line 33) | get props(){return delete this.props,this.props=R3()}
  function tS (line 33) | function tS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Ps (line 33) | function Ps(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function x3 (line 33) | function x3(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  method props (line 33) | get props(){return delete this.props,this.props=I3()}
  function nS (line 33) | function nS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function iS (line 33) | function iS(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function gR (line 33) | function gR(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function oS (line 33) | function oS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function la (line 33) | function la(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function j3 (line 33) | function j3(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function uS (line 33) | function uS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Nl (line 33) | function Nl(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function _f (line 33) | function _f(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function pS (line 33) | function pS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function hS (line 33) | function hS(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function t8 (line 33) | function t8(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function vS (line 33) | function vS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function mS (line 33) | function mS(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function a8 (line 33) | function a8(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function gS (line 33) | function gS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Ya (line 33) | function Ya(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function s8 (line 33) | function s8(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function yS (line 33) | function yS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function fi (line 33) | function fi(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function tu (line 33) | function tu(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function wS (line 33) | function wS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function TS (line 33) | function TS(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function h8 (line 33) | function h8(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function SS (line 33) | function SS(t){return y8(t)||b8(t)||g8(t)||m8()}
  function m8 (line 33) | function m8(){throw new TypeError(`Invalid attempt to spread non-iterabl...
  function g8 (line 34) | function g8(t,e){if(!!t){if(typeof t=="string")return mg(t,e);var r=Obje...
  function b8 (line 34) | function b8(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iter...
  function y8 (line 34) | function y8(t){if(Array.isArray(t))return mg(t)}
  function mg (line 34) | function mg(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new A...
  function PS (line 34) | function PS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function dn (line 34) | function dn(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function wf (line 34) | function wf(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function DS (line 34) | function DS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function ua (line 34) | function ua(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function $8 (line 34) | function $8(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function RS (line 34) | function RS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function ru (line 34) | function ru(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function to (line 34) | function to(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function A8 (line 34) | function A8(t,e){return N8(t)||M8(t,e)||x8(t,e)||R8()}
  function R8 (line 34) | function R8(){throw new TypeError(`Invalid attempt to destructure non-it...
  function x8 (line 35) | function x8(t,e){if(!!t){if(typeof t=="string")return xS(t,e);var r=Obje...
  function xS (line 35) | function xS(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new A...
  function M8 (line 35) | function M8(t,e){var r=t==null?null:typeof Symbol<"u"&&t[Symbol.iterator...
  function N8 (line 35) | function N8(t){if(Array.isArray(t))return t}
  function NS (line 35) | function NS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Ii (line 35) | function Ii(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Tf (line 35) | function Tf(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function kS (line 35) | function kS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function LS (line 35) | function LS(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function K8 (line 35) | function K8(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function FS (line 35) | function FS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function jS (line 35) | function jS(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function q8 (line 35) | function q8(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function J8 (line 35) | function J8(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function tU (line 35) | function tU(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Bl (line 35) | function Bl(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function VS (line 35) | function VS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function HS (line 35) | function HS(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Sf (line 35) | function Sf(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  method props (line 35) | get props(){return delete this.props,this.props=lU(),this.props}
  function dU (line 35) | function dU(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function zS (line 35) | function zS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function US (line 35) | function US(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function nu (line 35) | function nu(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function yU (line 35) | function yU(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function $U (line 35) | function $U(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function GS (line 35) | function GS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function WS (line 35) | function WS(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function CU (line 35) | function CU(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function gg (line 35) | function gg(t){return gg=typeof Symbol=="function"&&typeof Symbol.iterat...
  function KS (line 35) | function KS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function YS (line 35) | function YS(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function MU (line 35) | function MU(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function NU (line 35) | function NU(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a...
  function qS (line 35) | function qS(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.e...
  function IU (line 35) | function IU(t,e,r){return e&&qS(t.prototype,e),r&&qS(t,r),Object.defineP...
  function Pf (line 35) | function Pf(){return typeof Reflect<"u"&&Reflect.get?Pf=Reflect.get:Pf=f...
  function BU (line 35) | function BU(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&(t=Vs(...
  function kU (line 35) | function kU(t,e){if(typeof e!="function"&&e!==null)throw new TypeError("...
  function bg (line 35) | function bg(t,e){return bg=Object.setPrototypeOf||function(n,i){return n...
  function LU (line 35) | function LU(t){var e=jU();return function(){var n=Vs(t),i;if(e){var a=Vs...
  function FU (line 35) | function FU(t,e){if(e&&(gg(e)==="object"||typeof e=="function"))return e...
  function zR (line 35) | function zR(t){if(t===void 0)throw new ReferenceError("this hasn't been ...
  function jU (line 35) | function jU(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.constru...
  function Vs (line 35) | function Vs(t){return Vs=Object.setPrototypeOf?Object.getPrototypeOf:fun...
  function r (line 35) | function r(n){var i,a=arguments.length>1&&arguments[1]!==void 0?argument...
  function JS (line 35) | function JS(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function da (line 35) | function da(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function un (line 35) | function un(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function iG (line 35) | function iG(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a...
  function QS (line 35) | function QS(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.e...
  function aG (line 35) | function aG(t,e,r){return e&&QS(t.prototype,e),r&&QS(t,r),Object.defineP...
  function eP (line 35) | function eP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Ci (line 35) | function Ci(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function oG (line 35) | function oG(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function sG (line 35) | function sG(t){return fG(t)||cG(t)||uG(t)||lG()}
  function lG (line 35) | function lG(){throw new TypeError(`Invalid attempt to spread non-iterabl...
  function uG (line 36) | function uG(t,e){if(!!t){if(typeof t=="string")return yg(t,e);var r=Obje...
  function cG (line 36) | function cG(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iter...
  function fG (line 36) | function fG(t){if(Array.isArray(t))return yg(t)}
  function yg (line 36) | function yg(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new A...
  function o (line 36) | function o(s){iG(this,o),Gu(this,{_vm:s,_root:Oi(s)}),ip(this,{_vm:xn(),...
  function rP (line 36) | function rP(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function nP (line 36) | function nP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function iP (line 36) | function iP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function bG (line 36) | function bG(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function aP (line 36) | function aP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Cd (line 36) | function Cd(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function TG (line 36) | function TG(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function EG (line 36) | function EG(t){return AG(t)||DG(t)||CG(t)||$G()}
  function $G (line 36) | function $G(){throw new TypeError(`Invalid attempt to spread non-iterabl...
  function CG (line 37) | function CG(t,e){if(!!t){if(typeof t=="string")return Og(t,e);var r=Obje...
  function DG (line 37) | function DG(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iter...
  function AG (line 37) | function AG(t){if(Array.isArray(t))return Og(t)}
  function Og (line 37) | function Og(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new A...
  function oP (line 37) | function oP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function sP (line 37) | function sP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function RG (line 37) | function RG(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Pv (line 37) | function Pv(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function lP (line 37) | function lP(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function uP (line 37) | function uP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function cP (line 37) | function cP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function LG (line 37) | function LG(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Ev (line 37) | function Ev(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function pP (line 37) | function pP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function kl (line 37) | function kl(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function WG (line 37) | function WG(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function hP (line 37) | function hP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function vP (line 37) | function vP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Df (line 37) | function Df(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function yP (line 37) | function yP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function OP (line 37) | function OP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function e4 (line 37) | function e4(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function TP (line 37) | function TP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Cv (line 37) | function Cv(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function i4 (line 37) | function i4(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function SP (line 37) | function SP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function PP (line 37) | function PP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function wg (line 37) | function wg(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function EP (line 37) | function EP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Dv (line 37) | function Dv(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function h4 (line 37) | function h4(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function CP (line 37) | function CP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function O4 (line 37) | function O4(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Xt (line 37) | function Xt(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function AP (line 37) | function AP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function RP (line 37) | function RP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function T4 (line 37) | function T4(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function xP (line 37) | function xP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function MP (line 37) | function MP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function E4 (line 37) | function E4(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function BP (line 37) | function BP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function kP (line 37) | function kP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function H4 (line 37) | function H4(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function LP (line 37) | function LP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function bu (line 37) | function bu(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function xi (line 37) | function xi(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Av (line 37) | function Av(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function jP (line 37) | function jP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function VP (line 37) | function VP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function vx (line 37) | function vx(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function d6 (line 37) | function d6(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function HP (line 37) | function HP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function v6 (line 37) | function v6(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function m6 (line 37) | function m6(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function GP (line 37) | function GP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function WP (line 37) | function WP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function y6 (line 37) | function y6(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function O6 (line 37) | function O6(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function YP (line 37) | function YP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function qP (line 37) | function qP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Tx (line 37) | function Tx(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function E6 (line 37) | function E6(t){return A6(t)||D6(t)||C6(t)||$6()}
  function $6 (line 37) | function $6(){throw new TypeError(`Invalid attempt to spread non-iterabl...
  function C6 (line 38) | function C6(t,e){if(!!t){if(typeof t=="string")return $g(t,e);var r=Obje...
  function D6 (line 38) | function D6(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iter...
  function A6 (line 38) | function A6(t){if(Array.isArray(t))return $g(t)}
  function $g (line 38) | function $g(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new A...
  function XP (line 38) | function XP(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function JP (line 38) | function JP(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Ex (line 38) | function Ex(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Wc (line 38) | function Wc(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function tE (line 38) | function tE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function rE (line 38) | function rE(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function fn (line 38) | function fn(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function X6 (line 38) | function X6(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function nE (line 38) | function nE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Rv (line 38) | function Rv(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function J6 (line 38) | function J6(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function iE (line 38) | function iE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function xv (line 38) | function xv(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Z6 (line 38) | function Z6(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function aE (line 38) | function aE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function jl (line 38) | function jl(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Ix (line 38) | function Ix(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function tW (line 38) | function tW(t){return aW(t)||iW(t)||nW(t)||rW()}
  function rW (line 38) | function rW(){throw new TypeError(`Invalid attempt to spread non-iterabl...
  function nW (line 39) | function nW(t,e){if(!!t){if(typeof t=="string")return Ag(t,e);var r=Obje...
  function iW (line 39) | function iW(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iter...
  function aW (line 39) | function aW(t){if(Array.isArray(t))return Ag(t)}
  function Ag (line 39) | function Ag(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new A...
  function oE (line 39) | function oE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Mv (line 39) | function Mv(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function sW (line 39) | function sW(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function sE (line 39) | function sE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function lE (line 39) | function lE(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function lW (line 39) | function lW(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function uE (line 39) | function uE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function cW (line 39) | function cW(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function fW (line 39) | function fW(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function pW (line 39) | function pW(t){return gW(t)||mW(t)||vW(t)||hW()}
  function hW (line 39) | function hW(){throw new TypeError(`Invalid attempt to spread non-iterabl...
  function vW (line 40) | function vW(t,e){if(!!t){if(typeof t=="string")return Rg(t,e);var r=Obje...
  function mW (line 40) | function mW(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iter...
  function gW (line 40) | function gW(t){if(Array.isArray(t))return Rg(t)}
  function Rg (line 40) | function Rg(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new A...
  function cE (line 40) | function cE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function fE (line 40) | function fE(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function bW (line 40) | function bW(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function dE (line 40) | function dE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Yt (line 40) | function Yt(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function _W (line 40) | function _W(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function pE (line 40) | function pE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Di (line 40) | function Di(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function SW (line 40) | function SW(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function hE (line 40) | function hE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function kv (line 40) | function kv(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function $W (line 40) | function $W(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function vE (line 40) | function vE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function xW (line 40) | function xW(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function MW (line 40) | function MW(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function gE (line 40) | function gE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Es (line 40) | function Es(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function Un (line 40) | function Un(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function yE (line 40) | function yE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function OE (line 40) | function OE(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function zr (line 40) | function zr(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Rf (line 40) | function Rf(t){return typeof Symbol=="function"&&typeof Symbol.iterator=...
  function XW (line 40) | function XW(t){return JW(t)||ZW(t)||QW()}
  function JW (line 40) | function JW(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e<...
  function ZW (line 40) | function ZW(t){if(Symbol.iterator in Object(t)||Object.prototype.toStrin...
  function QW (line 40) | function QW(){throw new TypeError("Invalid attempt to spread non-iterabl...
  function e7 (line 40) | function e7(t){return Array.isArray(t)||Rf(t)==="object"?Object.freeze(t...
  function t7 (line 40) | function t7(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments...
  function r7 (line 40) | function r7(t,e){return t.map(function(r,n){return[n,r]}).sort(function(...
  function wE (line 40) | function wE(t,e){return e.reduce(function(r,n){return t.hasOwnProperty(n...
  function TE (line 41) | function TE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function di (line 41) | function di(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function gs (line 41) | function gs(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function v7 (line 41) | function v7(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a...
  function PE (line 41) | function PE(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.e...
  function m7 (line 41) | function m7(t,e,r){return e&&PE(t.prototype,e),r&&PE(t,r),Object.defineP...
  function EE (line 41) | function EE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function Hl (line 41) | function Hl(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function g7 (line 41) | function g7(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function b7 (line 41) | function b7(t){return w7(t)||_7(t)||O7(t)||y7()}
  function y7 (line 41) | function y7(){throw new TypeError(`Invalid attempt to spread non-iterabl...
  function O7 (line 42) | function O7(t,e){if(!!t){if(typeof t=="string")return xg(t,e);var r=Obje...
  function _7 (line 42) | function _7(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iter...
  function w7 (line 42) | function w7(t){if(Array.isArray(t))return xg(t)}
  function xg (line 42) | function xg(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new A...
  function a (line 42) | function a(o){v7(this,a),Gu(this,{_vm:o,_root:Oi(o)}),ip(this,{_vm:xn(),...
  function CE (line 42) | function CE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function DE (line 42) | function DE(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function $7 (line 42) | function $7(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function xE (line 42) | function xE(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){v...
  function ME (line 42) | function ME(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=n...
  function K7 (line 42) | function K7(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enum...
  function Y7 (line 42) | function Y7(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a...
  function NE (line 42) | function NE(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.e...
  function q7 (line 42) | function q7(t,e,r){return e&&NE(t.prototype,e),r&&NE(t,r),Object.defineP...
  function t (line 42) | function t(e,r,n){Y7(this,t),this.$el=e,this.$scroller=null,this.$select...
  function Up (line 50) | function Up(t,e,r,n,i,a,o,s){var l=typeof t=="function"?t.options:t;e&&(...
  method onMetric (line 50) | onMetric(){return this.$store.getters.getMetric}
  method changeLang (line 50) | changeLang(t){localStorage.setItem("lang",t),this.$i18n.locale=t}
  method checkCurrentLang (line 50) | checkCurrentLang(t){return this.$i18n.locale==t}
  method data (line 50) | data(){return{i18nPrefix:"_.Navigation.",brandTitle:"CAP Dashboard",lang...
  function Jx (line 50) | function Jx(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.c...
  function La (line 50) | function La(t){return t=t.toLowerCase(),function(r){return Ay(r)===t}}
  function Gp (line 50) | function Gp(t){return Array.isArray(t)}
  function Mg (line 50) | function Mg(t){return typeof t>"u"}
  function $K (line 50) | function $K(t){return t!==null&&!Mg(t)&&t.constructor!==null&&!Mg(t.cons...
  function CK (line 50) | function CK(t){var e;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?e...
  function DK (line 50) | function DK(t){return typeof t=="string"}
  function tM (line 50) | function tM(t){return typeof t=="number"}
  function rM (line 50) | function rM(t){return t!==null&&typeof t=="object"}
  function xf (line 50) | function xf(t){if(Ay(t)!=="object")return!1;var e=Object.getPrototypeOf(...
  function AK (line 50) | function AK(t){return t&&Object.keys(t).length===0&&Object.getPrototypeO...
  function Ry (line 50) | function Ry(t){return Dy.call(t)==="[object Function]"}
  function IK (line 50) | function IK(t){return rM(t)&&Ry(t.pipe)}
  function BK (line 50) | function BK(t){var e="[object FormData]";return t&&(typeof FormData=="fu...
  function LK (line 50) | function LK(t){return t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uF...
  function FK (line 50) | function FK(){var t;return typeof navigator<"u"&&((t=navigator.product)=...
  function xy (line 50) | function xy(t,e){if(!(t===null||typeof t>"u"))if(typeof t!="object"&&(t=...
  function Ng (line 50) | function Ng(){var t={};function e(i,a){xf(t[a])&&xf(i)?t[a]=Ng(t[a],i):x...
  function jK (line 50) | function jK(t,e,r){return xy(e,function(i,a){r&&typeof i=="function"?t[a...
  function VK (line 50) | function VK(t){return t.charCodeAt(0)===65279&&(t=t.slice(1)),t}
  function HK (line 50) | function HK(t,e,r,n){t.prototype=Object.create(e.prototype,n),t.prototyp...
  function zK (line 50) | function zK(t,e,r,n){var i,a,o,s={};if(e=e||{},t==null)return e;do{for(i...
  function UK (line 50) | function UK(t,e,r){t=String(t),(r===void 0||r>t.length)&&(r=t.length),r-...
  function GK (line 50) | function GK(t){if(!t)return null;if(Gp(t))return t;var e=t.length;if(!tM...
  function KK (line 50) | function KK(t,e){for(var r=t&&t[Symbol.iterator],n=r.call(t),i;(i=n.next...
  function YK (line 50) | function YK(t,e){for(var r,n=[];(r=t.exec(e))!==null;)n.push(r);return n}
  function zs (line 50) | function zs(t,e,r,n,i){Error.call(this),Error.captureStackTrace?Error.ca...
  function Ig (line 50) | function Ig(t){return ot.isPlainObject(t)||ot.isArray(t)}
  function sM (line 50) | function sM(t){return ot.endsWith(t,"[]")?t.slice(0,-2):t}
  function kE (line 50) | function kE(t,e,r){return t?t.concat(e).map(function(i,a){return i=sM(i)...
  function e9 (line 50) | function e9(t){return ot.isArray(t)&&!t.some(Ig)}
  function r9 (line 50) | function r9(t){return t&&ot.isFunction(t.append)&&t[Symbol.toStringTag]=...
  function n9 (line 50) | function n9(t,e,r){if(!ot.isObject(t))throw new TypeError("target must b...
  function LE (line 50) | function LE(t){var e={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E",...
  function lM (line 50) | function lM(t,e){this._pairs=[],t&&i9(t,this,e)}
  function s9 (line 50) | function s9(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace...
  function rc (line 50) | function rc(){this.handlers=[]}
  function b9 (line 50) | function b9(t){return oa.matchAll(/\w+|\[(\w*)]/g,t).map(function(e){ret...
  function y9 (line 50) | function y9(t){var e={},r=Object.keys(t),n,i=r.length,a;for(n=0;n<i;n++)...
  function O9 (line 50) | function O9(t){function e(n,i,a,o){var s=n[o++],l=Number.isFinite(+s),u=...
  function _9 (line 50) | function _9(){if(jE)return Wv;jE=1;var t=Fo;return Wv=function(r,n,i){va...
  function w9 (line 50) | function w9(){if(VE)return Kv;VE=1;var t=Ht;return Kv=t.isStandardBrowse...
  function $9 (line 50) | function $9(){if(HE)return Yv;HE=1;var t=Ht,e=["age","authorization","co...
  function C9 (line 51) | function C9(){if(zE)return qv;zE=1;var t=Ht;return qv=t.isStandardBrowse...
  function Yp (line 51) | function Yp(){if(UE)return Xv;UE=1;var t=Fo,e=Ht;function r(n,i,a){t.cal...
  function D9 (line 51) | function D9(){return GE||(GE=1,Jv=function(e){var r=/^([-+\w]{1,25})(:?\...
  function KE (line 51) | function KE(){if(WE)return Zv;WE=1;var t=Ht,e=_9(),r=w9(),n=fM,i=vM,a=$9...
  function JE (line 51) | function JE(t,e){!Ft.isUndefined(t)&&Ft.isUndefined(t["Content-Type"])&&...
  function I9 (line 51) | function I9(){var t;return(typeof XMLHttpRequest<"u"||typeof process<"u"...
  function B9 (line 51) | function B9(t,e,r){if(Ft.isString(t))try{return(e||JSON.parse)(t),Ft.tri...
  function mM (line 51) | function mM(){return ZE||(ZE=1,Qv=function(e){return!!(e&&e.__CANCEL__)}...
  function tm (line 51) | function tm(t){if(t.cancelToken&&t.cancelToken.throwIfRequested(),t.sign...
  function i (line 51) | function i(f,d){return Sr.isPlainObject(f)&&Sr.isPlainObject(d)?Sr.merge...
  function a (line 51) | function a(f){if(Sr.isUndefined(r[f])){if(!Sr.isUndefined(e[f]))return i...
  function o (line 51) | function o(f){if(!Sr.isUndefined(r[f]))return i(void 0,r[f])}
  function s (line 51) | function s(f){if(Sr.isUndefined(r[f])){if(!Sr.isUndefined(e[f]))return i...
  function l (line 51) | function l(f){if(f in r)return i(e[f],r[f]);if(f in e)return i(void 0,e[...
  function bM (line 51) | function bM(){return t0||(t0=1,rm={version:"0.28.1"}),rm}
  function i (line 51) | function i(a,o){return"[Axios v"+U9+"] Transitional option '"+a+"'"+o+(n...
  function G9 (line 51) | function G9(t,e,r){if(typeof t!="object")throw new ca("options must be a...
  function Us (line 51) | function Us(t){this.defaults=t,this.interceptors={request:new n0,respons...
  function r (line 51) | function r(n){return function(a,o,s){return this.request(Xp(s||{},{metho...
  function X9 (line 51) | function X9(){if(a0)return nm;a0=1;var t=Yp();function e(r){if(typeof r!...
  function J9 (line 51) | function J9(){return o0||(o0=1,im=function(e){return function(n){return ...
  function Z9 (line 51) | function Z9(){if(s0)return am;s0=1;var t=Ht;return am=function(r){return...
  function yM (line 51) | function yM(t){var e=new Mf(t),r=Q9(Mf.prototype.request,e);return kg.ex...
  method data (line 51) | data(){return{nodeName:"",meta:{}}}
  method mounted (line 51) | async mounted(){this.nodeName=this.getCookie("cap.node"),await Xi.get("/...
  method getCookie (line 51) | getCookie(t){for(var e=t+"=",r=decodeURIComponent(document.cookie),n=r.s...
  method data (line 51) | data(){return{timer:""}}
  method getData (line 51) | getData(){window.pollingInterval=="%(pollingInterval)"&&(window.pollingI...
  method mounted (line 51) | mounted(){Xi.interceptors.response.use(t=>(t.status===500&&this.$bvToast...
  method beforeDestroy (line 51) | beforeDestroy(){clearInterval(this.timer)}
  function Gn (line 55) | function Gn(t,e){for(var r in e)t[r]=e[r];return t}
  function Lg (line 55) | function Lg(t){try{return decodeURIComponent(t)}catch{}return t}
  function bY (line 55) | function bY(t,e,r){e===void 0&&(e={});var n=r||yY,i;try{i=n(t||"")}catch...
  function yY (line 55) | function yY(t){var e={};return t=t.trim().replace(/^(\?|#|&)/,""),t&&t.s...
  function OY (line 55) | function OY(t){var e=t?Object.keys(t).map(function(r){var n=t[r];if(n===...
  function kd (line 55) | function kd(t,e,r,n){var i=n&&n.options.stringifyQuery,a=e.query||{};try...
  function Fg (line 55) | function Fg(t){if(Array.isArray(t))return t.map(Fg);if(t&&typeof t=="obj...
  function _Y (line 55) | function _Y(t){for(var e=[];t;)e.unshift(t),t=t.parent;return e}
  function c0 (line 55) | function c0(t,e){var r=t.path,n=t.query;n===void 0&&(n={});var i=t.hash;...
  function OM (line 55) | function OM(t,e,r){return e===Fa?t===e:e?t.path&&e.path?t.path.replace(B...
  function Nf (line 55) | function Nf(t,e){if(t===void 0&&(t={}),e===void 0&&(e={}),!t||!e)return ...
  function wY (line 55) | function wY(t,e){return t.path.replace(Bd,"/").indexOf(e.path.replace(Bd...
  function TY (line 55) | function TY(t,e){for(var r in e)if(!(r in t))return!1;return!0}
  function _M (line 55) | function _M(t){for(var e=0;e<t.matched.length;e++){var r=t.matched[e];fo...
  function f0 (line 55) | function f0(t,e,r,n){var i=e.props=PY(r,n);if(i){i=e.props=Gn({},i);var ...
  function PY (line 55) | function PY(t,e){switch(typeof e){case"undefined":return;case"object":re...
  function wM (line 55) | function wM(t,e,r){var n=t.charAt(0);if(n==="/")return t;if(n==="?"||n==...
  function EY (line 55) | function EY(t){var e="",r="",n=t.indexOf("#");n>=0&&(e=t.slice(n),t=t.sl...
  function _a (line 55) | function _a(t){return t.replace(/\/(?:\s*\/)+/g,"/")}
  function By (line 55) | function By(t,e){for(var r=[],n=0,i=0,a="",o=e&&e.delimiter||"/",s;(s=RY...
  function xY (line 55) | function xY(t,e){return TM(By(t,e),e)}
  function MY (line 55) | function MY(t){return encodeURI(t).replace(/[\/?#]/g,function(e){return"...
  function NY (line 55) | function NY(t){return encodeURI(t).replace(/[?#]/g,function(e){return"%"...
  function TM (line 55) | function TM(t,e){for(var r=new Array(t.length),n=0;n<t.length;n++)typeof...
  function If (line 55) | function If(t){return t.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}
  function IY (line 55) | function IY(t){return t.replace(/([=!:$\/()])/g,"\\$1")}
  function ky (line 55) | function ky(t,e){return t.keys=e,t}
  function Ly (line 55) | function Ly(t){return t&&t.sensitive?"":"i"}
  function BY (line 55) | function BY(t,e){var r=t.source.match(/\((?!\?)/g);if(r)for(var n=0;n<r....
  function kY (line 55) | function kY(t,e,r){for(var n=[],i=0;i<t.length;i++)n.push(PM(t[i],e,r).s...
  function LY (line 55) | function LY(t,e,r){return SM(By(t,r),e,r)}
  function SM (line 55) | function SM(t,e,r){Ld(e)||(r=e||r,e=[]),r=r||{};for(var n=r.strict,i=r.e...
  function PM (line 55) | function PM(t,e,r){return Ld(e)||(r=e||r,e=[]),r=r||{},t instanceof RegE...
  function Bf (line 55) | function Bf(t,e,r){e=e||{};try{var n=d0[t]||(d0[t]=nl.compile(t));return...
  function Fy (line 55) | function Fy(t,e,r,n){var i=typeof t=="string"?{path:t}:t;if(i._normalize...
  function h0 (line 55) | function h0(t){if(!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey)&&!t.defa...
  function EM (line 55) | function EM(t){if(t){for(var e,r=0;r<t.length;r++)if(e=t[r],e.tag==="a"|...
  function jg (line 55) | function jg(t){if(!(jg.installed&&Fd===t)){jg.installed=!0,Fd=t;var e=fu...
  function Xc (line 55) | function Xc(t,e,r,n,i){var a=e||[],o=r||Object.create(null),s=n||Object....
  function Vg (line 55) | function Vg(t,e,r,n,i,a){var o=n.path,s=n.name,l=n.pathToRegexpOptions||...
  function HY (line 55) | function HY(t,e){var r=nl(t,[],e);return r}
  function zY (line 55) | function zY(t,e,r){return r||(t=t.replace(/\/$/,"")),t[0]==="/"||e==null...
  function UY (line 55) | function UY(t,e){var r=Xc(t),n=r.pathList,i=r.pathMap,a=r.nameMap;functi...
  function GY (line 55) | function GY(t,e,r){var n=e.match(t);if(n){if(!r)return!0}else return!1;f...
  function WY (line 55) | function WY(t,e){return wM(t,e.parent?e.parent.path:"/",!0)}
  function $M (line 55) | function $M(){return KY.now().toFixed(3)}
  function Jp (line 55) | function Jp(){return CM}
  function DM (line 55) | function DM(t){return CM=t}
  function RM (line 55) | function RM(){"scrollRestoration"in window.history&&(window.history.scro...
  function wa (line 55) | function wa(t,e,r,n){if(!!t.app){var i=t.options.scrollBehavior;!i||t.ap...
  function xM (line 55) | function xM(){var t=Jp();t&&(AM[t]={x:window.pageXOffset,y:window.pageYO...
  function v0 (line 55) | function v0(t){xM(),t.state&&t.state.key&&DM(t.state.key)}
  function YY (line 55) | function YY(){var t=Jp();if(t)return AM[t]}
  function qY (line 55) | function qY(t,e){var r=document.documentElement,n=r.getBoundingClientRec...
  function m0 (line 55) | function m0(t){return Gs(t.x)||Gs(t.y)}
  function g0 (line 55) | function g0(t){return{x:Gs(t.x)?t.x:window.pageXOffset,y:Gs(t.y)?t.y:win...
  function XY (line 55) | function XY(t){return{x:Gs(t.x)?t.x:0,y:Gs(t.y)?t.y:0}}
  function Gs (line 55) | function Gs(t){return typeof t=="number"}
  function b0 (line 55) | function b0(t,e){var r=typeof t=="object";if(r&&typeof t.selector=="stri...
  function jd (line 55) | function jd(t,e){xM();var r=window.history;try{if(e){var n=Gn({},r.state...
  function Hg (line 55) | function Hg(t){jd(t,!0)}
  function ZY (line 55) | function ZY(t,e){return Zp(t,e,jo.redirected,'Redirected when going from...
  function QY (line 55) | function QY(t,e){var r=Zp(t,e,jo.duplicated,'Avoided redundant navigatio...
  function y0 (line 55) | function y0(t,e){return Zp(t,e,jo.cancelled,'Navigation cancelled from "...
  function eq (line 55) | function eq(t,e){return Zp(t,e,jo.aborted,'Navigation aborted from "'+t....
  function Zp (line 55) | function Zp(t,e,r,n){var i=new Error(n);return i._isRouter=!0,i.from=t,i...
  function rq (line 55) | function rq(t){if(typeof t=="string")return t;if("path"in t)return t.pat...
  function Vd (line 55) | function Vd(t){return Object.prototype.toString.call(t).indexOf("Error")...
  function Qp (line 55) | function Qp(t,e){return Vd(t)&&t._isRouter&&(e==null||t.type===e)}
  function O0 (line 55) | function O0(t,e,r){var n=function(i){i>=t.length?r():t[i]?e(t[i],functio...
  function nq (line 55) | function nq(t){return function(e,r,n){var i=!1,a=0,o=null;MM(t,function(...
  function MM (line 55) | function MM(t,e){return NM(t.map(function(r){return Object.keys(r.compon...
  function NM (line 55) | function NM(t){return Array.prototype.concat.apply([],t)}
  function aq (line 55) | function aq(t){return t.__esModule||iq&&t[Symbol.toStringTag]==="Module"}
  function _0 (line 55) | function _0(t){var e=!1;return function(){for(var r=[],n=arguments.lengt...
  function oq (line 55) | function oq(t){if(!t)if(nc){var e=document.querySelector("base");t=e&&e....
  function sq (line 55) | function sq(t,e){var r,n=Math.max(t.length,e.length);for(r=0;r<n&&t[r]==...
  function jy (line 55) | function jy(t,e,r,n){var i=MM(t,function(a,o,s,l){var u=lq(a,e);if(u)ret...
  function lq (line 55) | function lq(t,e){return typeof t!="function"&&(t=Fd.extend(t)),t.options...
  function uq (line 55) | function uq(t){return jy(t,"beforeRouteLeave",IM,!0)}
  function cq (line 55) | function cq(t){return jy(t,"beforeRouteUpdate",IM)}
  function IM (line 55) | function IM(t,e){if(e)return function(){return t.apply(e,arguments)}}
  function fq (line 55) | function fq(t){return jy(t,"beforeRouteEnter",function(e,r,n,i){return d...
  function dq (line 55) | function dq(t,e,r){return function(i,a,o){return t(i,a,function(s){typeo...
  function e (line 55) | function e(r,n){t.call(this,r,n),this._startLocation=au(this.base)}
  function au (line 55) | function au(t){var e=window.location.pathname,r=e.toLowerCase(),n=t.toLo...
  function e (line 55) | function e(r,n,i){t.call(this,r,n),!(i&&pq(this.base))&&w0()}
  function pq (line 55) | function pq(t){var e=au(t);if(!/^\/#/.test(e))return window.location.rep...
  function w0 (line 55) | function w0(){var t=kf();return t.charAt(0)==="/"?!0:(Lf("/"+t),!1)}
  function kf (line 55) | function kf(){var t=window.location.href,e=t.indexOf("#");return e<0?"":...
  function zg (line 55) | function zg(t){var e=window.location.href,r=e.indexOf("#"),n=r>=0?e.slic...
  function T0 (line 55) | function T0(t){Ta?jd(zg(t)):window.location.hash=t}
  function Lf (line 55) | function Lf(t){Ta?Hg(zg(t)):window.location.replace(zg(t))}
  function e (line 55) | function e(r,n){t.call(this,r,n),this.stack=[],this.index=-1}
  function Vy (line 55) | function Vy(t,e){return t.push(e),function(){var r=t.indexOf(e);r>-1&&t....
  function vq (line 55) | function vq(t,e,r){var n=r==="hash"?"#"+e:e;return t?_a(t+"/"+n):n}
  function Gg (line 55) | function Gg(){let t=devicePixelRatio;ze!=t&&(ze=t,Jc&&Kg(x0,Jc,Gg),Jc=ma...
  function cn (line 55) | function cn(t,e){if(e!=null){let r=t.classList;!r.contains(e)&&r.add(e)}}
  function Wg (line 55) | function Wg(t,e){let r=t.classList;r.contains(e)&&r.remove(e)}
  function mt (line 55) | function mt(t,e,r){t.style[e]=r+"px"}
  function Ai (line 55) | function Ai(t,e,r,n){let i=Ug.createElement(t);return e!=null&&cn(i,e),r...
  function Dn (line 55) | function Dn(t,e){return Ai("div",t,e)}
  function ds (line 55) | function ds(t,e,r,n,i){let a="translate("+e+"px,"+r+"px)",o=M0.get(t);a!...
  function Fq (line 55) | function Fq(t,e,r){let n=e+r,i=N0.get(t);n!=i&&(N0.set(t,n),t.style.back...
  function jq (line 55) | function jq(t,e,r,n){let i=e+""+r,a=I0.get(t);i!=a&&(I0.set(t,i),t.style...
  function mo (line 55) | function mo(t,e,r,n){e.addEventListener(t,r,n?jM:zy)}
  function Kg (line 55) | function Kg(t,e,r,n){e.removeEventListener(t,r,n?jM:zy)}
  function sa (line 55) | function sa(t,e,r,n){let i;r=r||0,n=n||e.length-1;let a=n<=2147483647;fo...
  function Ws (line 55) | function Ws(t,e,r,n){for(let i=n==1?e:r;i>=e&&i<=r;i+=n)if(t[i]!=null)re...
  function Vq (line 55) | function Vq(t,e,r,n){let i=Le,a=-Le;if(n==1)i=t[e],a=t[r];else if(n==-1)...
  function Hq (line 55) | function Hq(t,e,r){let n=Le,i=-Le;for(let a=e;a<=r;a++)t[a]>0&&(n=Wr(n,t...
  function eh (line 55) | function eh(t,e,r,n){let i=L0(t),a=L0(e),o=r==10?Hi:VM;t==e&&(i==-1?(t*=...
  function Uy (line 55) | function Uy(t,e,r,n){let i=eh(t,e,r,n);return t==0&&(i[0]=0),e==0&&(i[1]...
  function zd (line 55) | function zd(t,e,r,n){return rh(r)?k0(t,e,r):(yu.pad=r,yu.soft=n?0:null,y...
  function Ue (line 55) | function Ue(t,e){return t==null?e:t}
  function Uq (line 55) | function Uq(t,e,r){for(e=Ue(e,0),r=Ue(r,t.length-1);e<=r;){if(t[e]!=null...
  function k0 (line 55) | function k0(t,e,r){let n=r.min,i=r.max,a=Ue(n.pad,0),o=Ue(i.pad,0),s=Ue(...
  function F0 (line 55) | function F0(t){return(Hi((t^t>>31)-(t>>31))|0)+1}
  function ro (line 55) | function ro(t,e){return qt(t/e)*e}
  function j0 (line 55) | function j0(t,e,r){return Wr(Zt(t,e),r)}
  function Ve (line 55) | function Ve(t){return typeof t=="function"?t:()=>t}
  function go (line 55) | function go(t,e){return Ud(t/e)*e}
  function zM (line 55) | function zM(t,e){return kn(t/e)*e}
  function lt (line 55) | function lt(t,e=0){if(Jq(t))return t;let r=10**e,n=t*r*(1+Number.EPSILON...
  function Xq (line 55) | function Xq(t){return((""+t).split(".")[1]||"").length}
  function Lu (line 55) | function Lu(t,e,r,n){let i=[],a=n.map(Xq);for(let o=e;o<r;o++){let s=vr(...
  function z0 (line 55) | function z0(t){return typeof t=="string"}
  function rh (line 55) | function rh(t){let e=!1;if(t!=null){let r=t.constructor;e=r==null||r==Ob...
  function U0 (line 55) | function U0(t){return t!=null&&typeof t=="object"}
  function bo (line 55) | function bo(t,e=rh){let r;if(so(t)){let n=t.find(i=>i!=null);if(so(n)||e...
  function Bt (line 55) | function Bt(t){let e=arguments;for(let r=1;r<e.length;r++){let n=e[r];fo...
  function rX (line 55) | function rX(t,e,r){for(let n=0,i,a=-1;n<e.length;n++){let o=e[n];if(o>a)...
  function nX (line 55) | function nX(t,e){let r=new Set;for(let o=0;o<t.length;o++){let l=t[o][0]...
  function KM (line 55) | function KM(t){return t.slice(0,3)}
  function Gl (line 55) | function Gl(t){return(t<10?"0":"")+t}
  function lX (line 55) | function lX(t){return(t<10?"00":t<100?"0":"")+t}
  function Ky (line 55) | function Ky(t,e){e=e||sX;let r=[],n=/\{([a-z]+)\}|[^{]+/gi,i;for(;i=n.ex...
  function fX (line 55) | function fX(t,e){let r;return e=="UTC"||e=="Etc/UTC"?r=new Date(+t+t.get...
  function QM (line 56) | function QM(t){let e=t*1e3,r=e*60,n=r*60,i=n*24,a=i*30,o=i*365,l=(t==1?L...
  function Y0 (line 56) | function Y0(t,e){return t.map(r=>r.map((n,i)=>i==0||i==8||n==null?n:e(i=...
  function q0 (line 56) | function q0(t,e){return(r,n,i,a,o)=>{let s=e.find(b=>o>=b[0])||e[e.lengt...
  function wX (line 56) | function wX(t,e){let r=Ky(e);return(n,i,a,o,s)=>i.map(l=>r(t(l)))}
  function um (line 56) | function um(t,e,r){return new Date(t,e,r)}
  function X0 (line 56) | function X0(t,e){return e(t)}
  function J0 (line 56) | function J0(t,e){return(r,n)=>e(t(n))}
  function SX (line 56) | function SX(t,e){let r=t.series[e];return r.width?r.stroke(t,e):r.points...
  function PX (line 56) | function PX(t,e){return t.series[e].fill(t,e)}
  function $X (line 56) | function $X(t,e){let r=t.cursor.points,n=Dn(),i=r.size(t,e);mt(n,ou,i),m...
  function CX (line 56) | function CX(t,e){let r=t.series[e].points;return r._fill||r._stroke}
  function DX (line 56) | function DX(t,e){let r=t.series[e].points;return r._stroke||r._fill}
  function AX (line 56) | function AX(t,e){let r=t.series[e].points;return iN(r.width,1)}
  function RX (line 56) | function RX(t,e,r){return r}
  function xX (line 56) | function xX(t,e,r){return cm[0]=e,cm[1]=r,cm}
  function Qc (line 56) | function Qc(t,e,r){return n=>{n.button==0&&r(n)}}
  function fm (line 56) | function fm(t,e,r){return r}
  function kX (line 56) | function kX(t,e,r,n,i){return e.map(a=>a==null?"":Wy(a))}
  function LX (line 56) | function LX(t,e,r,n,i,a,o){let s=[],l=th.get(i)||0;r=o?r:lt(go(r,i),l);f...
  function Yg (line 56) | function Yg(t,e,r,n,i,a,o){const s=[],l=t.scales[t.axes[e].scale].log,u=...
  function FX (line 56) | function FX(t,e,r,n,i,a,o){let l=t.scales[t.axes[e].scale].asinh,u=n>l?Y...
  function UX (line 56) | function UX(t,e,r,n,i){let a=t.axes[r],o=a.scale,s=t.scales[o];if(s.dist...
  function GX (line 56) | function GX(t,e){return e==null?"":Wy(e)}
  function iN (line 56) | function iN(t,e){let r=3+(t||1)*2;return lt(r*e,3)}
  function WX (line 56) | function WX(t,e){let{scale:r,idxs:n}=t.series[0],i=t._data[0],a=t.valToP...
  function KX (line 56) | function KX(t,e,r,n,i){return r/10}
  function sN (line 56) | function sN(t,e){let r=i1[t];return r||(r={key:t,plots:[],sub(n){r.plots...
  function Vo (line 56) | function Vo(t,e,r){const n=t.mode,i=t.series[e],a=n==2?t._data[e]:t._dat...
  function nh (line 56) | function nh(t,e){let r=0,n=0,i=Ue(t.bands,UM);for(let a=0;a<i.length;a++...
  function qX (line 56) | function qX(t,e,r,n,i){let a=t.mode,o=t.series[e],s=a==2?o.facets[1].sca...
  function zi (line 56) | function zi(t,e,r,n,i,a){return Vo(t,e,(o,s,l,u,f,d,p,h,b,y,P)=>{let C=o...
  function ih (line 56) | function ih(t,e,r,n,i,a){let o=null;if(t.length>0){o=new Path2D;const s=...
  function XX (line 56) | function XX(t,e,r){let n=t[t.length-1];n&&n[0]==e?n[1]=r:t.push([e,r])}
  function Jy (line 56) | function Jy(t,e,r,n,i,a,o){let s=[];for(let l=i==1?r:n;l>=r&&l<=n;l+=i)i...
  function a1 (line 56) | function a1(t){return t==0?Yq:t==1?qt:e=>ro(e,t)}
  function lN (line 56) | function lN(t){let e=t==0?ah:oh,r=t==0?(i,a,o,s,l,u)=>{i.arcTo(a,o,s,l,u...
  function pN (line 56) | function pN(t){return(e,r,n,i,a)=>Vo(e,r,(o,s,l,u,f,d,p,h,b,y,P)=>{let{p...
  function hN (line 56) | function hN(t){return(e,r,n,i,a,o)=>{n!=i&&(a!=n&&o!=n&&t(e,r,n),a!=i&&o...
  function vN (line 56) | function vN(t){const e=Ue(t==null?void 0:t.alignGaps,0);return(r,n,i,a)=...
  function QX (line 56) | function QX(t){const e=Ue(t.align,1),r=Ue(t.ascDesc,!1),n=Ue(t.alignGaps...
  function eJ (line 56) | function eJ(t){t=t||Ou;const e=Ue(t.size,[.6,Le,1]),r=t.align||0,n=(t.ga...
  function tJ (line 56) | function tJ(t,e){const r=Ue(e==null?void 0:e.alignGaps,0);return(n,i,a,o...
  function rJ (line 56) | function rJ(t){return tJ(nJ,t)}
  function nJ (line 56) | function nJ(t,e,r,n,i,a){const o=t.length;if(o<2)return null;const s=new...
  function o1 (line 56) | function o1(){for(let t of qg)t.syncRect(!0)}
  function s1 (line 56) | function s1(t,e,r,n){return(n?[t[0],t[1]].concat(t.slice(2)):[t[0]].conc...
  function oJ (line 56) | function oJ(t,e){return t.map((r,n)=>n==0?null:Bt({},e,r))}
  function Xg (line 56) | function Xg(t,e,r,n){return Bt({},e==0?r:n,t)}
  function mN (line 56) | function mN(t,e,r){return e==null?Ys:[e,r]}
  function lJ (line 56) | function lJ(t,e,r){return e==null?Ys:zd(e,r,Gy,!0)}
  function gN (line 56) | function gN(t,e,r,n){return e==null?Ys:eh(e,r,t.scales[n].log,!1)}
  function bN (line 56) | function bN(t,e,r,n){return e==null?Ys:Uy(e,r,t.scales[n].log,!1)}
  function fJ (line 56) | function fJ(t,e,r,n,i){let a=Zt(F0(t),F0(e)),o=e-t,s=sa(i/n*o,r);do{let ...
  function l1 (line 56) | function l1(t){let e,r;return t=t.replace(/(\d+)px/,(n,i)=>(e=qt((r=+i)*...
  function dJ (line 56) | function dJ(t){t.show&&[t.font,t.labelFont].forEach(e=>{let r=lt(e[2]*ze...
  function cr (line 56) | function cr(t,e,r){const n={mode:Ue(t.mode,1)},i=n.mode;function a(m,O){...
  method data (line 57) | data(){return{timer:Number}}
  method mounted (line 57) | async mounted(){let e=new Proxy(new URLSearchParams(window.location.sear...
  method destroyed (line 62) | destroyed(){window.clearInterval(this.timer)}
  function o (line 64) | function o(s){return typeof Symbol=="function"&&typeof Symbol.iterator==...
  function b (line 64) | function b(v,w,$,M,F,X,Q,q){var K,U=typeof v=="function"?v.options:v;if(...
  function B (line 64) | function B(v){return Object.prototype.toString.call(v).slice(8,-1).toLow...
  function A (line 64) | function A(v){var w=arguments.length>1&&arguments[1]!==void 0?arguments[...
  function V (line 64) | function V(v){if(typeof Array.prototype.flat=="function")return v.flat()...
  function N (line 64) | function N(v){var w=arguments.length>1&&arguments[1]!==void 0?arguments[...
  function H (line 66) | function H(v,w){var $=Object.keys(v);if(Object.getOwnPropertySymbols){va...
  function W (line 66) | function W(v){for(var w=1;w<arguments.length;w++){var $=arguments[w]!=nu...
  function i (line 66) | function i(a){if(n[a])return n[a].exports;var o=n[a]={exports:{}};return...
  function _J (line 70) | function _J(t){var e=Number(t.version.split(".")[0]);if(e>=2)t.mixin({be...
  function TJ (line 70) | function TJ(t){!ps||(t._devtoolHook=ps,ps.emit("vuex:init",t),ps.on("vue...
  function SJ (line 70) | function SJ(t,e){return t.filter(e)[0]}
  function Jg (line 70) | function Jg(t,e){if(e===void 0&&(e=[]),t===null||typeof t!="object")retu...
  function sl (line 70) | function sl(t,e){Object.keys(t).forEach(function(r){return e(t[r],r)})}
  function ON (line 70) | function ON(t){return t!==null&&typeof t=="object"}
  function PJ (line 70) | function PJ(t){return t&&typeof t.then=="function"}
  function EJ (line 70) | function EJ(t,e){return function(){return t(e)}}
  function wN (line 70) | function wN(t,e,r){if(e.update(r),r.modules)for(var n in r.modules){if(!...
  function TN (line 70) | function TN(t,e,r){return e.indexOf(t)<0&&(r&&r.prepend?e.unshift(t):e.p...
  function SN (line 70) | function SN(t,e){t._actions=Object.create(null),t._mutations=Object.crea...
  function eO (line 70) | function eO(t,e,r){var n=t._vm;t.getters={},t._makeLocalGettersCache=Obj...
  function lh (line 70) | function lh(t,e,r,n,i){var a=!r.length,o=t._modules.getNamespace(r);if(n...
  function $J (line 70) | function $J(t,e,r){var n=e==="",i={dispatch:n?t.dispatch:function(a,o,s)...
  function CJ (line 70) | function CJ(t,e){if(!t._makeLocalGettersCache[e]){var r={},n=e.length;Ob...
  function DJ (line 70) | function DJ(t,e,r,n){var i=t._mutations[e]||(t._mutations[e]=[]);i.push(...
  function AJ (line 70) | function AJ(t,e,r,n){var i=t._actions[e]||(t._actions[e]=[]);i.push(func...
  function RJ (line 70) | function RJ(t,e,r,n){t._wrappedGetters[e]||(t._wrappedGetters[e]=functio...
  function xJ (line 70) | function xJ(t){t._vm.$watch(function(){return this._data.$$state},functi...
  function tO (line 70) | function tO(t,e){return e.reduce(function(r,n){return r[n]},t)}
  function Kd (line 70) | function Kd(t,e,r){return ON(t)&&t.type&&(r=e,e=t,t=t.type),{type:t,payl...
  function PN (line 70) | function PN(t){Kr&&t===Kr||(Kr=t,_J(Kr))}
  function uh (line 70) | function uh(t){return NJ(t)?Array.isArray(t)?t.map(function(e){return{ke...
  function NJ (line 70) | function NJ(t){return Array.isArray(t)||ON(t)}
  function ch (line 70) | function ch(t){return function(e,r){return typeof e!="string"?(r=e,e="")...
  function fh (line 70) | function fh(t,e,r){var n=t._modulesNamespaceMap[r];return n}
  function IJ (line 70) | function IJ(t){t===void 0&&(t={});var e=t.collapsed;e===void 0&&(e=!0);v...
  function u1 (line 70) | function u1(t,e,r){var n=r?t.groupCollapsed:t.group;try{n.call(t,e)}catc...
  function c1 (line 70) | function c1(t){try{t.groupEnd()}catch{t.log("\u2014\u2014 log end \u2014...
  function f1 (line 70) | function f1(){var t=new Date;return" @ "+ef(t.getHours(),2)+":"+ef(t.get...
  function BJ (line 70) | function BJ(t,e){return new Array(e+1).join(t)}
  function ef (line 70) | function ef(t,e){return BJ("0",e-t.toString().length)+t}
  method getMetric (line 70) | getMetric(t){return t.metric}
  method setMertic (line 70) | setMertic(t,e){t.metric=e}
  method setInfo (line 70) | setInfo(t,e){t.info=e}
  method pollingMertic (line 70) | pollingMertic({commit:t},e){t("setMertic",e)}
  method pollingInfo (line 70) | pollingInfo({commit:t},e){t("setInfo",e)}
  function qs (line 74) | function qs(t,e){typeof console<"u"&&(console.warn("[vue-i18n] "+t),e&&c...
  function jJ (line 74) | function jJ(t,e){typeof console<"u"&&(console.error("[vue-i18n] "+t),e&&...
  function Fn (line 74) | function Fn(t){return t!==null&&typeof t=="object"}
  function VJ (line 74) | function VJ(t){return typeof t=="boolean"}
  function nr (line 74) | function nr(t){return typeof t=="string"}
  function bi (line 74) | function bi(t){return HJ.call(t)===zJ}
  function qr (line 74) | function qr(t){return t==null}
  function Zg (line 74) | function Zg(t){return typeof t=="function"}
  function dh (line 74) | function dh(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];var...
  function ll (line 74) | function ll(t){return JSON.parse(JSON.stringify(t))}
  function UJ (line 74) | function UJ(t,e){if(t.delete(e))return t}
  function GJ (line 74) | function GJ(t){var e=[];return t.forEach(function(r){return e.push(r)}),e}
  function ic (line 74) | function ic(t,e){return!!~t.indexOf(e)}
  function KJ (line 74) | function KJ(t,e){return WJ.call(t,e)}
  function yo (line 74) | function yo(t){for(var e=arguments,r=Object(t),n=1;n<arguments.length;n+...
  function Yd (line 74) | function Yd(t,e){if(t===e)return!0;var r=Fn(t),n=Fn(e);if(r&&n)try{var i...
  function YJ (line 74) | function YJ(t){return t.replace(/</g,"&lt;").replace(/>/g,"&gt;").replac...
  function qJ (line 74) | function qJ(t){return t!=null&&Object.keys(t).forEach(function(e){typeof...
  function XJ (line 74) | function XJ(t){t.prototype.hasOwnProperty("$i18n")||Object.definePropert...
  function JJ (line 74) | function JJ(t){t===void 0&&(t=!1);function e(){this!==this.$root&&this.$...
  function ZJ (line 74) | function ZJ(t){var e;for(e in t)if(e!=="default")return!1;return Boolean...
  function QJ (line 74) | function QJ(t,e){var r=e?eZ(e):{};if(!t)return r;t=t.filter(function(i){...
  function eZ (line 74) | function eZ(t){return Array.isArray(t)?t.reduce(xN,{}):Object.assign({},t)}
  function tZ (line 74) | function tZ(t,e){return e.data&&e.data.attrs&&e.data.attrs.place&&(t[e.d...
  function xN (line 74) | function xN(t,e,r){return t[r]=e,t}
  function rZ (line 74) | function rZ(t){return Boolean(t.data&&t.data.attrs&&t.data.attrs.place)}
  function nZ (line 74) | function nZ(t,e,r){!MN(t,r)||NN(t,e,r)}
  function iZ (line 74) | function iZ(t,e,r,n){if(!!MN(t,r)){var i=r.context.$i18n;oZ(t,r)&&Yd(e.v...
  function aZ (line 74) | function aZ(t,e,r,n){var i=r.context;if(!i){qs("Vue instance does not ex...
  function MN (line 74) | function MN(t,e){var r=e.context;return r?r.$i18n?!0:(qs("VueI18n instan...
  function oZ (line 74) | function oZ(t,e){var r=e.context;return t._locale===r.$i18n.locale}
  function NN (line 74) | function NN(t,e,r){var n,i,a=e.value,o=sZ(a),s=o.path,l=o.locale,u=o.arg...
  function sZ (line 74) | function sZ(t){var e,r,n,i;return nr(t)?e=t:bi(t)&&(e=t.path,r=t.locale,...
  function h1 (line 74) | function h1(t,e){var r=[];return t&&r.push(t),e&&(Array.isArray(e)||bi(e...
  function rO (line 74) | function rO(t,e){e===void 0&&(e={bridge:!1}),rO.installed=!0,Er=t,Er.ver...
  function cZ (line 74) | function cZ(t){for(var e=[],r=0,n="";r<t.length;){var i=t[r++];if(i==="{...
  function fZ (line 74) | function fZ(t,e){var r=[],n=0,i=Array.isArray(e)?"list":Fn(e)?"named":"u...
  function pZ (line 74) | function pZ(t){return dZ.test(t)}
  function hZ (line 74) | function hZ(t){var e=t.charCodeAt(0),r=t.charCodeAt(t.length-1);return e...
  function vZ (line 74) | function vZ(t){if(t==null)return"eof";var e=t.charCodeAt(0);switch(e){ca...
  function mZ (line 74) | function mZ(t){var e=t.trim();return t.charAt(0)==="0"&&isNaN(t)?!1:pZ(e...
  function gZ (line 74) | function gZ(t){var e=[],r=-1,n=Qg,i=0,a,o,s,l,u,f,d,p=[];p[$s]=function(...

FILE: src/DotNetCore.CAP.Dashboard/wwwroot/src/assets/uPlot.esm.js
  constant FEAT_TIME (line 10) | const FEAT_TIME          = true;
  constant UPLOT (line 14) | const UPLOT          =       "uplot";
  constant ORI_HZ (line 15) | const ORI_HZ         = pre + "hz";
  constant ORI_VT (line 16) | const ORI_VT         = pre + "vt";
  constant TITLE (line 17) | const TITLE          = pre + "title";
  constant WRAP (line 18) | const WRAP           = pre + "wrap";
  constant UNDER (line 19) | const UNDER          = pre + "under";
  constant OVER (line 20) | const OVER           = pre + "over";
  constant AXIS (line 21) | const AXIS           = pre + "axis";
  constant OFF (line 22) | const OFF            = pre + "off";
  constant SELECT (line 23) | const SELECT         = pre + "select";
  constant CURSOR_X (line 24) | const CURSOR_X       = pre + "cursor-x";
  constant CURSOR_Y (line 25) | const CURSOR_Y       = pre + "cursor-y";
  constant CURSOR_PT (line 26) | const CURSOR_PT      = pre + "cursor-pt";
  constant LEGEND (line 27) | const LEGEND         = pre + "legend";
  constant LEGEND_LIVE (line 28) | const LEGEND_LIVE    = pre + "live";
  constant LEGEND_INLINE (line 29) | const LEGEND_INLINE  = pre + "inline";
  constant LEGEND_THEAD (line 30) | const LEGEND_THEAD   = pre + "thead";
  constant LEGEND_SERIES (line 31) | const LEGEND_SERIES  = pre + "series";
  constant LEGEND_MARKER (line 32) | const LEGEND_MARKER  = pre + "marker";
  constant LEGEND_LABEL (line 33) | const LEGEND_LABEL   = pre + "label";
  constant LEGEND_VALUE (line 34) | const LEGEND_VALUE   = pre + "value";
  constant WIDTH (line 36) | const WIDTH       = "width";
  constant HEIGHT (line 37) | const HEIGHT      = "height";
  constant TOP (line 38) | const TOP         = "top";
  constant BOTTOM (line 39) | const BOTTOM      = "bottom";
  constant LEFT (line 40) | const LEFT        = "left";
  constant RIGHT (line 41) | const RIGHT       = "right";
  function setPxRatio (line 67) | function setPxRatio() {
  function addClass (line 82) | function addClass(el, c) {
  function remClass (line 89) | function remClass(el, c) {
  function setStylePx (line 94) | function setStylePx(el, name, value) {
  function placeTag (line 98) | function placeTag(tag, cls, targ, refEl) {
  function placeDiv (line 110) | function placeDiv(cls, targ) {
  function elTrans (line 116) | function elTrans(el, xPos, yPos, xMax, yMax) {
  function elColor (line 133) | function elColor(el, background, borderColor) {
  function elSize (line 146) | function elSize(el, newWid, newHgt, centered) {
  function on (line 162) | function on(ev, el, cb, capt) {
  function off (line 166) | function off(ev, el, cb, capt) {
  function closestIdx (line 173) | function closestIdx(num, arr, lo, hi) {
  function nonNullIdx (line 194) | function nonNullIdx(data, _i0, _i1, dir) {
  function getMinMax (line 203) | function getMinMax(data, _i0, _i1, sorted) {
  function getMinMaxLog (line 229) | function getMinMaxLog(data, _i0, _i1) {
  function rangeLog (line 248) | function rangeLog(min, max, base, fullMags) {
  function rangeAsinh (line 292) | function rangeAsinh(min, max, base, fullMags) {
  function rangeNum (line 324) | function rangeNum(_min, _max, mult, extra) {
  function ifNull (line 336) | function ifNull(lh, rh) {
  function hasData (line 342) | function hasData(data, idx0, idx1) {
  function _rangeNum (line 355) | function _rangeNum(_min, _max, cfg) {
  function numIntDigits (line 445) | function numIntDigits(x) {
  function incrRound (line 449) | function incrRound(num, incr) {
  function clamp (line 453) | function clamp(num, _min, _max) {
  function fnOrSelf (line 457) | function fnOrSelf(v) {
  function incrRoundUp (line 473) | function incrRoundUp(num, incr) {
  function incrRoundDn (line 477) | function incrRoundDn(num, incr) {
  function roundDec (line 483) | function roundDec(val, dec = 0) {
  function guessDec (line 496) | function guessDec(num) {
  function genIncrs (line 500) | function genIncrs(base, minExp, maxExp, mults) {
  constant EMPTY_OBJ (line 523) | const EMPTY_OBJ = {};
  constant EMPTY_ARR (line 524) | const EMPTY_ARR = [];
  function isStr (line 531) | function isStr(v) {
  function isObj (line 535) | function isObj(v) {
  function fastIsObj (line 546) | function fastIsObj(v) {
  function copy (line 552) | function copy(o, _isObj = isObj) {
  function assign (line 579) | function assign(targ) {
  constant NULL_REMOVE (line 597) | const NULL_REMOVE = 0;
  constant NULL_RETAIN (line 598) | const NULL_RETAIN = 1;
  constant NULL_EXPAND (line 599) | const NULL_EXPAND = 2;
  function nullExpand (line 602) | function nullExpand(yVals, nullIdxs, alignedLen) {
  function join (line 620) | function join(tables, nullModes) {
  function slice3 (line 706) | function slice3(str) {
  function zeroPad2 (line 721) | function zeroPad2(int) {
  function zeroPad3 (line 725) | function zeroPad3(int) {
  function fmtDate (line 786) | function fmtDate(tpl, names) {
  function tzDate (line 808) | function tzDate(date, tz) {
  function genTimeStuffs (line 859) | function genTimeStuffs(ms) {
  function timeAxisStamps (line 1045) | function timeAxisStamps(stampCfg, fmtDate) {
  function timeAxisVals (line 1053) | function timeAxisVals(tzDate, stamps) {
  function timeAxisVal (line 1098) | function timeAxisVal(tzDate, dateTpl) {
  function mkDate (line 1103) | function mkDate(y, m, d) {
  function timeSeriesStamp (line 1107) | function timeSeriesStamp(stampCfg, fmtDate) {
  function timeSeriesVal (line 1112) | function timeSeriesVal(tzDate, stamp) {
  function legendStroke (line 1116) | function legendStroke(self, seriesIdx) {
  function legendFill (line 1121) | function legendFill(self, seriesIdx) {
  function cursorPointShow (line 1142) | function cursorPointShow(self, si) {
  function cursorPointFill (line 1161) | function cursorPointFill(self, si) {
  function cursorPointStroke (line 1166) | function cursorPointStroke(self, si) {
  function cursorPointSize (line 1171) | function cursorPointSize(self, si) {
  function dataIdx (line 1176) | function dataIdx(self, seriesIdx, cursorIdx) {
  function cursorMove (line 1182) | function cursorMove(self, mouseLeft1, mouseTop1) {
  function filtBtn0 (line 1188) | function filtBtn0(self, targ, handle) {
  function passThru (line 1194) | function passThru(self, targ, handle) {
  function numAxisVals (line 1306) | function numAxisVals(self, splits, axisIdx, foundSpace, foundIncr) {
  function numAxisSplits (line 1310) | function numAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, fou...
  function logAxisSplits (line 1324) | function logAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, fou...
  function asinhAxisSplits (line 1352) | function asinhAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, f...
  constant RE_ALL (line 1364) | const RE_ALL   = /./;
  constant RE_12357 (line 1365) | const RE_12357 = /[12357]/;
  constant RE_125 (line 1366) | const RE_125   = /[125]/;
  constant RE_1 (line 1367) | const RE_1     = /1/;
  function log10AxisValsFilt (line 1369) | function log10AxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {
  function numSeriesVal (line 1393) | function numSeriesVal(self, val) {
  function ptDia (line 1420) | function ptDia(width, mult) {
  function seriesPointsShow (line 1425) | function seriesPointsShow(self, si) {
  function clampScale (line 1492) | function clampScale(self, val, scaleMin, scaleMax, scaleKey) {
  function _sync (line 1523) | function _sync(key, opts) {
  constant BAND_CLIP_FILL (line 1549) | const BAND_CLIP_FILL   = 1 << 0;
  constant BAND_CLIP_STROKE (line 1550) | const BAND_CLIP_STROKE = 1 << 1;
  function orient (line 1552) | function orient(u, seriesIdx, cb) {
  function bandFillClipDirs (line 1610) | function bandFillClipDirs(self, seriesIdx) {
  function seriesFillTo (line 1644) | function seriesFillTo(self, seriesIdx, dataMin, dataMax, bandFillDir) {
  function clipBandLine (line 1663) | function clipBandLine(self, seriesIdx, idx0, idx1, strokePath, clipDir) {
  function clipGaps (line 1699) | function clipGaps(gaps, ori, plotLft, plotTop, plotWid, plotHgt) {
  function addGap (line 1730) | function addGap(gaps, fromX, toX) {
  function findGaps (line 1739) | function findGaps(xs, ys, idx0, idx1, dir, pixelForX, align) {
  function pxRoundGen (line 1782) | function pxRoundGen(pxAlign) {
  function rect (line 1786) | function rect(ori) {
  function points (line 1829) | function points(opts) {
  function _drawAcc (line 1891) | function _drawAcc(lineTo) {
  function linear (line 1907) | function linear(opts) {
  function stepped (line 2024) | function stepped(opts) {
  function bars (line 2139) | function bars(opts) {
  function splineInterp (line 2360) | function splineInterp(interp, opts) {
  function monotoneCubic (line 2460) | function monotoneCubic(opts) {
  function _monotoneCubic (line 2466) | function _monotoneCubic(xs, ys, moveTo, lineTo, bezierCurveTo, pxRound) {
  function invalidateRects (line 2529) | function invalidateRects() {
  function setDefaults (line 2543) | function setDefaults(d, xo, yo, initY) {
  function setDefaults2 (line 2548) | function setDefaults2(d, xyo) {
  function setDefault (line 2552) | function setDefault(o, i, xo, yo) {
  function snapNumX (line 2556) | function snapNumX(self, dataMin, dataMax) {
  function snapNumY (line 2564) | function snapNumY(self, dataMin, dataMax) {
  function snapLogY (line 2568) | function snapLogY(self, dataMin, dataMax, scale) {
  function snapAsinhY (line 2574) | function snapAsinhY(self, dataMin, dataMax, scale) {
  function findIncr (line 2581) | function findIncr(minVal, maxVal, incrs, dim, minSpace) {
  function pxRatioFont (line 2599) | function pxRatioFont(font) {
  function syncFontSize (line 2605) | function syncFontSize(axis) {
  function uPlot (line 2615) | function uPlot(opts, data, then) {

FILE: src/DotNetCore.CAP.Dashboard/wwwroot/src/store/store.js
  method getMetric (line 13) | getMetric(state) {
  method setMertic (line 18) | setMertic(state, val) {
  method setInfo (line 21) | setInfo(state, val) {
  method pollingMertic (line 26) | pollingMertic({ commit }, val) {
  method pollingInfo (line 29) | pollingInfo({ commit }, val) {

FILE: src/DotNetCore.CAP.InMemoryStorage/CAP.InMemoryCapOptionsExtension.cs
  class InMemoryCapOptionsExtension (line 11) | internal class InMemoryCapOptionsExtension : ICapOptionsExtension
    method AddServices (line 13) | public void AddServices(IServiceCollection services)

FILE: src/DotNetCore.CAP.InMemoryStorage/CAP.Options.Extensions.cs
  class CapOptionsExtensions (line 9) | public static class CapOptionsExtensions
    method UseInMemoryStorage (line 11) | public static CapOptions UseInMemoryStorage(this CapOptions options)

FILE: src/DotNetCore.CAP.InMemoryStorage/ICapTransaction.InMemory.cs
  class InMemoryCapTransaction (line 12) | internal class InMemoryCapTransaction : CapTransactionBase
    method InMemoryCapTransaction (line 14) | public InMemoryCapTransaction(IDispatcher dispatcher) : base(dispatcher)
    method Commit (line 18) | public override void Commit()
    method CommitAsync (line 23) | public override Task CommitAsync(CancellationToken cancellationToken =...
    method Rollback (line 28) | public override void Rollback()
    method RollbackAsync (line 33) | public override Task RollbackAsync(CancellationToken cancellationToken...

FILE: src/DotNetCore.CAP.InMemoryStorage/IDataStorage.InMemory.cs
  class InMemoryStorage (line 20) | internal class InMemoryStorage : IDataStorage
    method InMemoryStorage (line 26) | public InMemoryStorage(IOptions<CapOptions> capOptions, ISerializer se...
    method AcquireLockAsync (line 37) | public Task<bool> AcquireLockAsync(string key, TimeSpan ttl, string in...
    method ReleaseLockAsync (line 42) | public Task ReleaseLockAsync(string key, string instance, Cancellation...
    method RenewLockAsync (line 47) | public Task RenewLockAsync(string key, TimeSpan ttl, string instance, ...
    method ChangePublishStateToDelayedAsync (line 52) | public Task ChangePublishStateToDelayedAsync(string[] ids)
    method ChangePublishStateAsync (line 62) | public Task ChangePublishStateAsync(MediumMessage message, StatusName ...
    method ChangeReceiveStateAsync (line 70) | public Task ChangeReceiveStateAsync(MediumMessage message, StatusName ...
    method StoreMessageAsync (line 78) | public Task<MediumMessage> StoreMessageAsync(string name, Message cont...
    method StoreReceivedExceptionMessageAsync (line 105) | public Task StoreReceivedExceptionMessageAsync(string name, string gro...
    method StoreReceivedMessageAsync (line 125) | public Task<MediumMessage> StoreReceivedMessageAsync(string name, stri...
    method DeleteExpiresAsync (line 152) | public Task<int> DeleteExpiresAsync(string table, DateTime timeout, in...
    method GetPublishedMessagesOfNeedRetry (line 184) | public Task<IEnumerable<MediumMessage>> GetPublishedMessagesOfNeedRetr...
    method GetReceivedMessagesOfNeedRetry (line 201) | public Task<IEnumerable<MediumMessage>> GetReceivedMessagesOfNeedRetry...
    method DeleteReceivedMessageAsync (line 213) | public Task<int> DeleteReceivedMessageAsync(long id)
    method DeletePublishedMessageAsync (line 219) | public Task<int> DeletePublishedMessageAsync(long id)
    method ScheduleMessagesOfDelayedAsync (line 225) | public Task ScheduleMessagesOfDelayedAsync(Func<object, IEnumerable<Me...
    method GetMonitoringApi (line 237) | public IMonitoringApi GetMonitoringApi()

FILE: src/DotNetCore.CAP.InMemoryStorage/IMonitoringApi.InMemory.cs
  class InMemoryMonitoringApi (line 16) | internal class InMemoryMonitoringApi : IMonitoringApi
    method GetPublishedMessageAsync (line 18) | public Task<MediumMessage?> GetPublishedMessageAsync(long id)
    method GetReceivedMessageAsync (line 25) | public Task<MediumMessage?> GetReceivedMessageAsync(long id)
    method GetStatisticsAsync (line 32) | public Task<StatisticsDto> GetStatisticsAsync()
    method HourlyFailedJobs (line 47) | public Task<IDictionary<DateTime, int>> HourlyFailedJobs(MessageType t...
    method HourlySucceededJobs (line 52) | public Task<IDictionary<DateTime, int>> HourlySucceededJobs(MessageTyp...
    method GetMessagesAsync (line 57) | public Task<PagedQueryResult<MessageDto>> GetMessagesAsync(MessageQuer...
    method PublishedFailedCount (line 142) | public ValueTask<int> PublishedFailedCount()
    method PublishedSucceededCount (line 148) | public ValueTask<int> PublishedSucceededCount()
    method ReceivedFailedCount (line 154) | public ValueTask<int> ReceivedFailedCount()
    method ReceivedSucceededCount (line 160) | public ValueTask<int> ReceivedSucceededCount()
    method GetHourlyTimelineStats (line 166) | private Task<IDictionary<DateTime, int>> GetHourlyTimelineStats(Messag...

FILE: src/DotNetCore.CAP.InMemoryStorage/IStorageInitializer.InMemory.cs
  class InMemoryStorageInitializer (line 10) | internal class InMemoryStorageInitializer : IStorageInitializer
    method GetPublishedTableName (line 12) | public string GetPublishedTableName()
    method GetReceivedTableName (line 17) | public string GetReceivedTableName()
    method GetLockTableName (line 22) | public string GetLockTableName()
    method InitializeAsync (line 27) | public Task InitializeAsync(CancellationToken cancellationToken)

FILE: src/DotNetCore.CAP.InMemoryStorage/MemoryMessage.cs
  class MemoryMessage (line 9) | internal class MemoryMessage : MediumMessage

FILE: src/DotNetCore.CAP.Kafka/CAP.KafkaCapOptionsExtension.cs
  class KafkaCapOptionsExtension (line 12) | internal sealed class KafkaCapOptionsExtension : ICapOptionsExtension
    method KafkaCapOptionsExtension (line 16) | public KafkaCapOptionsExtension(Action<KafkaOptions> configure)
    method AddServices (line 21) | public void AddServices(IServiceCollection services)

FILE: src/DotNetCore.CAP.Kafka/CAP.KafkaOptions.cs
  class KafkaOptions (line 14) | public class KafkaOptions
    method KafkaOptions (line 24) | public KafkaOptions()
  class KafkaTopicOptions (line 70) | public class KafkaTopicOptions

FILE: src/DotNetCore.CAP.Kafka/CAP.Options.Extensions.cs
  class CapOptionsExtensions (line 10) | public static class CapOptionsExtensions
    method UseKafka (line 17) | public static CapOptions UseKafka(this CapOptions options, string boot...
    method UseKafka (line 28) | public static CapOptions UseKafka(this CapOptions options, Action<Kafk...

FILE: src/DotNetCore.CAP.Kafka/IConnectionPool.Default.cs
  class ConnectionPool (line 14) | public class ConnectionPool : IConnectionPool, IDisposable
    method ConnectionPool (line 21) | public ConnectionPool(ILogger<ConnectionPool> logger, IOptions<KafkaOp...
    method RentProducer (line 32) | public IProducer<string, byte[]> RentProducer()
    method Return (line 55) | public bool Return(IProducer<string, byte[]> producer)
    method Dispose (line 71) | public void Dispose()
    method BuildProducer (line 81) | protected virtual IProducer<string, byte[]> BuildProducer(ProducerConf...

FILE: src/DotNetCore.CAP.Kafka/IConnectionPool.cs
  type IConnectionPool (line 8) | public interface IConnectionPool
    method RentProducer (line 12) | IProducer<string, byte[]> RentProducer();
    method Return (line 14) | bool Return(IProducer<string, byte[]> producer);

FILE: src/DotNetCore.CAP.Kafka/ITransport.Kafka.cs
  class KafkaTransport (line 16) | internal class KafkaTransport : ITransport
    method KafkaTransport (line 21) | public KafkaTransport(ILogger<KafkaTransport> logger, IConnectionPool ...
    method SendAsync (line 29) | public async Task<OperateResult> SendAsync(TransportMessage message)

FILE: src/DotNetCore.CAP.Kafka/KafkaConsumerClient.cs
  class KafkaConsumerClient (line 20) | public class KafkaConsumerClient : IConsumerClient
    method KafkaConsumerClient (line 30) | public KafkaConsumerClient(string groupId, byte groupConcurrent,
    method FetchTopicsAsync (line 46) | public async Task<ICollection<string>> FetchTopicsAsync(IEnumerable<st...
    method SubscribeAsync (line 92) | public Task SubscribeAsync(IEnumerable<string> topics)
    method ListeningAsync (line 103) | public async Task ListeningAsync(TimeSpan timeout, CancellationToken c...
    method CommitAsync (line 143) | public Task CommitAsync(object? sender)
    method RejectAsync (line 150) | public Task RejectAsync(object? sender)
    method DisposeAsync (line 157) | public ValueTask DisposeAsync()
    method Connect (line 163) | public void Connect()
    method ConsumeAsync (line 184) | private async Task ConsumeAsync(ConsumeResult<string, byte[]> consumer...
    method BuildConsumer (line 209) | protected virtual IConsumer<string, byte[]> BuildConsumer(ConsumerConf...
    method ConsumerClient_OnConsumeError (line 216) | private void ConsumerClient_OnConsumeError(IConsumer<string, byte[]> c...

FILE: src/DotNetCore.CAP.Kafka/KafkaConsumerClientFactory.cs
  class KafkaConsumerClientFactory (line 11) | public class KafkaConsumerClientFactory : IConsumerClientFactory
    method KafkaConsumerClientFactory (line 16) | public KafkaConsumerClientFactory(IOptions<KafkaOptions> kafkaOptions,...
    method CreateAsync (line 22) | public virtual Task<IConsumerClient> CreateAsync(string groupName, byt...

FILE: src/DotNetCore.CAP.Kafka/KafkaHeaders.cs
  class KafkaHeaders (line 6) | public static class KafkaHeaders

FILE: src/DotNetCore.CAP.MongoDB/CAP.MongoDBCapOptionsExtension.cs
  class MongoDBCapOptionsExtension (line 14) | public class MongoDBCapOptionsExtension : ICapOptionsExtension
    method MongoDBCapOptionsExtension (line 18) | public MongoDBCapOptionsExtension(Action<MongoDBOptions> configure)
    method AddServices (line 23) | public void AddServices(IServiceCollection services)

FILE: src/DotNetCore.CAP.MongoDB/CAP.MongoDBOptions.cs
  class MongoDBOptions (line 7) | public class MongoDBOptions

FILE: src/DotNetCore.CAP.MongoDB/CAP.Options.Extensions.cs
  class CapOptionsExtensions (line 11) | public static class CapOptionsExtensions
    method UseMongoDB (line 13) | public static CapOptions UseMongoDB(this CapOptions options)
    method UseMongoDB (line 18) | public static CapOptions UseMongoDB(this CapOptions options, string co...
    method UseMongoDB (line 23) | public static CapOptions UseMongoDB(this CapOptions options, Action<Mo...

FILE: src/DotNetCore.CAP.MongoDB/ICapTransaction.MongoDB.cs
  class MongoDBCapTransaction (line 14) | public class MongoDBCapTransaction : CapTransactionBase
    method MongoDBCapTransaction (line 16) | public MongoDBCapTransaction(IDispatcher dispatcher)
    method Commit (line 21) | public override void Commit()
    method CommitAsync (line 30) | public override async Task CommitAsync(CancellationToken cancellationT...
    method Rollback (line 40) | public override void Rollback()
    method RollbackAsync (line 47) | public override async Task RollbackAsync(CancellationToken cancellatio...
  class CapTransactionExtensions (line 56) | public static class CapTransactionExtensions
    method Begin (line 58) | public static ICapTransaction Begin(this ICapTransaction transaction,
    method StartTransaction (line 76) | public static IClientSessionHandle StartTransaction(this IMongoClient ...
    method StartTransactionAsync (line 94) | public static Task<IClientSessionHandle> StartTransactionAsync(this IM...
    method StartTransaction (line 112) | public static IClientSessionHandle StartTransaction(this IMongoClient ...

FILE: src/DotNetCore.CAP.MongoDB/IClientSessionHandle.CAP.cs
  class CapMongoDbClientSessionHandle (line 14) | internal class CapMongoDbClientSessionHandle : IClientSessionHandle
    method CapMongoDbClientSessionHandle (line 19) | public CapMongoDbClientSessionHandle(ICapTransaction transaction)
    method Dispose (line 25) | public void Dispose()
    method AbortTransaction (line 30) | public void AbortTransaction(CancellationToken cancellationToken = def...
    method AbortTransactionAsync (line 35) | public Task AbortTransactionAsync(CancellationToken cancellationToken ...
    method AdvanceClusterTime (line 41) | public void AdvanceClusterTime(BsonDocument newClusterTime)
    method AdvanceOperationTime (line 46) | public void AdvanceOperationTime(BsonTimestamp newOperationTime)
    method CommitTransaction (line 51) | public void CommitTransaction(CancellationToken cancellationToken = de...
    method CommitTransactionAsync (line 56) | public Task CommitTransactionAsync(CancellationToken cancellationToken...
    method StartTransaction (line 62) | public void StartTransaction(TransactionOptions? transactionOptions = ...
    method Fork (line 76) | public IClientSessionHandle Fork()
    method WithTransaction (line 81) | public TResult WithTransaction<TResult>(Func<IClientSessionHandle, Can...
    method WithTransactionAsync (line 87) | public Task<TResult> WithTransactionAsync<TResult>(

FILE: src/DotNetCore.CAP.MongoDB/IDataStorage.MongoDB.cs
  class MongoDBDataStorage (line 21) | public class MongoDBDataStorage : IDataStorage
    method MongoDBDataStorage (line 31) | public MongoDBDataStorage(
    method AcquireLockAsync (line 48) | public async Task<bool> AcquireLockAsync(string key, TimeSpan ttl, str...
    method ReleaseLockAsync (line 79) | public async Task ReleaseLockAsync(string key, string instance, Cancel...
    method RenewLockAsync (line 88) | public async Task RenewLockAsync(string key, TimeSpan ttl, string inst...
    method ChangePublishStateToDelayedAsync (line 99) | public async Task ChangePublishStateToDelayedAsync(string[] ids)
    method ChangePublishStateAsync (line 108) | public async Task ChangePublishStateAsync(MediumMessage message, Statu...
    method ChangeReceiveStateAsync (line 130) | public async Task ChangeReceiveStateAsync(MediumMessage message, Statu...
    method StoreMessageAsync (line 143) | public async Task<MediumMessage> StoreMessageAsync(string name, Messag...
    method StoreReceivedExceptionMessageAsync (line 184) | public async Task StoreReceivedExceptionMessageAsync(string name, stri...
    method StoreReceivedMessageAsync (line 204) | public async Task<MediumMessage> StoreReceivedMessageAsync(string name...
    method DeleteExpiresAsync (line 236) | public async Task<int> DeleteExpiresAsync(string collection, DateTime ...
    method GetPublishedMessagesOfNeedRetry (line 261) | public async Task<IEnumerable<MediumMessage>> GetPublishedMessagesOfNe...
    method GetReceivedMessagesOfNeedRetry (line 282) | public async Task<IEnumerable<MediumMessage>> GetReceivedMessagesOfNee...
    method DeleteReceivedMessageAsync (line 303) | public async Task<int> DeleteReceivedMessageAsync(long id)
    method DeletePublishedMessageAsync (line 310) | public async Task<int> DeletePublishedMessageAsync(long id)
    method ScheduleMessagesOfDelayedAsync (line 317) | public async Task ScheduleMessagesOfDelayedAsync(Func<object, IEnumera...
    method GetMonitoringApi (line 385) | public IMonitoringApi GetMonitoringApi()

FILE: src/DotNetCore.CAP.MongoDB/IMonitoringApi.MongoDB.cs
  class MongoDBMonitoringApi (line 18) | public class MongoDBMonitoringApi : IMonitoringApi
    method MongoDBMonitoringApi (line 24) | public MongoDBMonitoringApi(IMongoClient client, IOptions<MongoDBOptio...
    method GetPublishedMessageAsync (line 32) | public async Task<MediumMessage?> GetPublishedMessageAsync(long id)
    method GetReceivedMessageAsync (line 47) | public async Task<MediumMessage?> GetReceivedMessageAsync(long id)
    method GetStatisticsAsync (line 62) | public async Task<StatisticsDto> GetStatisticsAsync()
    method HourlyFailedJobs (line 88) | public Task<IDictionary<DateTime, int>> HourlyFailedJobs(MessageType t...
    method HourlySucceededJobs (line 93) | public Task<IDictionary<DateTime, int>> HourlySucceededJobs(MessageTyp...
    method GetMessagesAsync (line 98) | public Task<PagedQueryResult<MessageDto>> GetMessagesAsync(MessageQuer...
    method PublishedFailedCount (line 105) | public ValueTask<int> PublishedFailedCount()
    method PublishedSucceededCount (line 110) | public ValueTask<int> PublishedSucceededCount()
    method ReceivedFailedCount (line 115) | public ValueTask<int> ReceivedFailedCount()
    method ReceivedSucceededCount (line 120) | public ValueTask<int> ReceivedSucceededCount()
    method FindReceivedMessages (line 125) | private async Task<PagedQueryResult<MessageDto>> FindReceivedMessages(...
    method FindPublishedMessages (line 165) | private async Task<PagedQueryResult<MessageDto>> FindPublishedMessages...
    method GetNumberOfMessage (line 205) | private ValueTask<int> GetNumberOfMessage(string collectionName, strin...
    method GetNumberOfReceivedMessages (line 212) | private async ValueTask<int> GetNumberOfReceivedMessages(string status...
    method GetNumberOfPublishedMessages (line 220) | private async ValueTask<int> GetNumberOfPublishedMessages(string statu...
    method GetHourlyTimelineStats (line 228) | private Task<IDictionary<DateTime, int>> GetHourlyTimelineStats(Messag...

FILE: src/DotNetCore.CAP.MongoDB/IStorageInitializer.MongoDB.cs
  class MongoDBStorageInitializer (line 16) | public class MongoDBStorageInitializer : IStorageInitializer
    method MongoDBStorageInitializer (line 23) | public MongoDBStorageInitializer(
    method GetPublishedTableName (line 34) | public string GetPublishedTableName()
    method GetReceivedTableName (line 39) | public string GetReceivedTableName()
    method GetLockTableName (line 44) | public string GetLockTableName()
    method InitializeAsync (line 49) | public async Task InitializeAsync(CancellationToken cancellationToken)

FILE: src/DotNetCore.CAP.MongoDB/StorageMessage.cs
  class ReceivedMessage (line 11) | internal class ReceivedMessage
  class PublishedMessage (line 34) | internal class PublishedMessage
  class Lock (line 58) | public class Lock

FILE: src/DotNetCore.CAP.MySql/CAP.EFOptions.cs
  class EFOptions (line 9) | public class EFOptions

FILE: src/DotNetCore.CAP.MySql/CAP.MySqlCapOptionsExtension.cs
  class MySqlCapOptionsExtension (line 14) | internal class MySqlCapOptionsExtension : ICapOptionsExtension
    method MySqlCapOptionsExtension (line 18) | public MySqlCapOptionsExtension(Action<MySqlOptions> configure)
    method AddServices (line 23) | public void AddServices(IServiceCollection services)

FILE: src/DotNetCore.CAP.MySql/CAP.MySqlOptions.cs
  class MySqlOptions (line 13) | public class MySqlOptions : EFOptions
  class ConfigureMySqlOptions (line 21) | internal class ConfigureMySqlOptions : IConfigureOptions<MySqlOptions>
    method ConfigureMySqlOptions (line 25) | public ConfigureMySqlOptions(IServiceScopeFactory serviceScopeFactory)
    method Configure (line 30) | public void Configure(MySqlOptions options)

FILE: src/DotNetCore.CAP.MySql/CAP.Options.Extensions.cs
  class CapOptionsExtensions (line 11) | public static class CapOptionsExtensions
    method UseMySql (line 13) | public static CapOptions UseMySql(this CapOptions options, string conn...
    method UseMySql (line 18) | public static CapOptions UseMySql(this CapOptions options, Action<MySq...
    method UseEntityFramework (line 29) | public static CapOptions UseEntityFramework<TContext>(this CapOptions ...
    method UseEntityFramework (line 35) | public static CapOptions UseEntityFramework<TContext>(this CapOptions ...

FILE: src/DotNetCore.CAP.MySql/ICapTransaction.MySql.cs
  class MySqlCapTransaction (line 18) | public class MySqlCapTransaction : CapTransactionBase
    method MySqlCapTransaction (line 20) | public MySqlCapTransaction(
    method Commit (line 25) | public override void Commit()
    method CommitAsync (line 42) | public override async Task CommitAsync(CancellationToken cancellationT...
    method Rollback (line 59) | public override void Rollback()
    method RollbackAsync (line 74) | public override async Task RollbackAsync(CancellationToken cancellatio...
  class CapTransactionExtensions (line 90) | public static class CapTransactionExtensions
    method BeginTransaction (line 99) | public static IDbContextTransaction BeginTransaction(this DatabaseFaca...
    method BeginTransaction (line 113) | public static IDbContextTransaction BeginTransaction(this DatabaseFaca...
    method BeginTransactionAsync (line 131) | public static Task<IDbContextTransaction> BeginTransactionAsync(this D...
    method BeginTransactionAsync (line 146) | public static Task<IDbContextTransaction> BeginTransactionAsync(this D...
    method BeginTransaction (line 163) | public static ICapTransaction BeginTransaction(this IDbConnection dbCo...
    method BeginTransaction (line 177) | public static ICapTransaction BeginTransaction(this IDbConnection dbCo...
    method BeginTransactionAsync (line 197) | public static ValueTask<ICapTransaction> BeginTransactionAsync(this ID...
    method BeginTransactionAsync (line 211) | public static ValueTask<ICapTransaction> BeginTransactionAsync(this ID...

FILE: src/DotNetCore.CAP.MySql/IDataStorage.MySql.cs
  class MySqlDataStorage (line 21) | public class MySqlDataStorage : IDataStorage
    method MySqlDataStorage (line 32) | public MySqlDataStorage(
    method AcquireLockAsync (line 51) | public async Task<bool> AcquireLockAsync(string key, TimeSpan ttl, str...
    method ReleaseLockAsync (line 69) | public async Task ReleaseLockAsync(string key, string instance, Cancel...
    method RenewLockAsync (line 84) | public async Task RenewLockAsync(string key, TimeSpan ttl, string inst...
    method ChangePublishStateToDelayedAsync (line 98) | public async Task ChangePublishStateToDelayedAsync(string[] ids)
    method ChangePublishStateAsync (line 107) | public async Task ChangePublishStateAsync(MediumMessage message, Statu...
    method ChangeReceiveStateAsync (line 112) | public async Task ChangeReceiveStateAsync(MediumMessage message, Statu...
    method StoreMessageAsync (line 117) | public async Task<MediumMessage> StoreMessageAsync(string name, Messag...
    method StoreReceivedExceptionMessageAsync (line 163) | public async Task StoreReceivedExceptionMessageAsync(string name, stri...
    method StoreReceivedMessageAsync (line 180) | public async Task<MediumMessage> StoreReceivedMessageAsync(string name...
    method DeleteExpiresAsync (line 207) | public async Task<int> DeleteExpiresAsync(string table, DateTime timeo...
    method GetPublishedMessagesOfNeedRetry (line 229) | public Task<IEnumerable<MediumMessage>> GetPublishedMessagesOfNeedRetr...
    method GetReceivedMessagesOfNeedRetry (line 234) | public Task<IEnumerable<MediumMessage>> GetReceivedMessagesOfNeedRetry...
    method DeleteReceivedMessageAsync (line 239) | public async Task<int> DeleteReceivedMessageAsync(long id)
    method DeletePublishedMessageAsync (line 249) | public async Task<int> DeletePublishedMessageAsync(long id)
    method ScheduleMessagesOfDelayedAsync (line 259) | public async Task ScheduleMessagesOfDelayedAsync(Func<object, IEnumera...
    method GetMonitoringApi (line 303) | public IMonitoringApi GetMonitoringApi()
    method ChangeMessageStateAsync (line 308) | private async Task ChangeMessageStateAsync(string tableName, MediumMes...
    method StoreReceivedMessage (line 336) | private async Task StoreReceivedMessage(object[] sqlParams)
    method GetMessagesOfNeedRetryAsync (line 347) | private async Task<IEnumerable<MediumMessage>> GetMessagesOfNeedRetryA...

FILE: src/DotNetCore.CAP.MySql/IDbConnection.Extensions.cs
  class DbConnectionExtensions (line 12) | internal static class DbConnectionExtensions
    method ExecuteNonQueryAsync (line 14) | public static async Task<int> ExecuteNonQueryAsync(this DbConnection c...
    method ExecuteReaderAsync (line 34) | public static async Task<T> ExecuteReaderAsync<T>(this DbConnection co...
    method ExecuteScalarAsync (line 58) | public static async Task<T> ExecuteScalarAsync<T>(this DbConnection co...

FILE: src/DotNetCore.CAP.MySql/IDbContextTransaction.CAP.cs
  class CapEFDbTransaction (line 15) | internal class CapEFDbTransaction : IDbContextTransaction, IInfrastructu...
    method CapEFDbTransaction (line 19) | public CapEFDbTransaction(ICapTransaction transaction)
    method Dispose (line 28) | public void Dispose()
    method Commit (line 33) | public void Commit()
    method CommitAsync (line 38) | public Task CommitAsync(CancellationToken cancellationToken = default)
    method Rollback (line 43) | public void Rollback()
    method RollbackAsync (line 48) | public Task RollbackAsync(CancellationToken cancellationToken = default)
    method DisposeAsync (line 53) | public ValueTask DisposeAsync()

FILE: src/DotNetCore.CAP.MySql/IMonitoringApi.MySql.cs
  class MySqlMonitoringApi (line 18) | internal class MySqlMonitoringApi : IMonitoringApi
    method MySqlMonitoringApi (line 25) | public MySqlMonitoringApi(IOptions<MySqlOptions> options, IStorageInit...
    method GetStatisticsAsync (line 33) | public async Task<StatisticsDto> GetStatisticsAsync()
    method HourlyFailedJobs (line 74) | public async Task<IDictionary<DateTime, int>> HourlyFailedJobs(Message...
    method HourlySucceededJobs (line 80) | public async Task<IDictionary<DateTime, int>> HourlySucceededJobs(Mess...
    method GetMessagesAsync (line 86) | public async Task<PagedQueryResult<MessageDto>> GetMessagesAsync(Messa...
    method PublishedFailedCount (line 148) | public ValueTask<int> PublishedFailedCount()
    method PublishedSucceededCount (line 153) | public ValueTask<int> PublishedSucceededCount()
    method ReceivedFailedCount (line 158) | public ValueTask<int> ReceivedFailedCount()
    method ReceivedSucceededCount (line 163) | public ValueTask<int> ReceivedSucceededCount()
    method GetPublishedMessageAsync (line 168) | public async Task<MediumMessage?> GetPublishedMessageAsync(long id)
    method GetReceivedMessageAsync (line 173) | public async Task<MediumMessage?> GetReceivedMessageAsync(long id)
    method GetNumberOfMessage (line 178) | private async ValueTask<int> GetNumberOfMessage(string tableName, stri...
    method GetHourlyTimelineStats (line 187) | private Task<Dictionary<DateTime, int>> GetHourlyTimelineStats(string ...
    method GetTimelineStats (line 202) | private async Task<Dictionary<DateTime, int>> GetTimelineStats(
    method GetMessageAsync (line 259) | private async Task<MediumMessage?> GetMessageAsync(string tableName, l...

FILE: src/DotNetCore.CAP.MySql/IStorageInitializer.MySql.cs
  class MySqlStorageInitializer (line 14) | public class MySqlStorageInitializer : IStorageInitializer
    method MySqlStorageInitializer (line 22) | public MySqlStorageInitializer(
    method GetPublishedTableName (line 32) | public virtual string GetPublishedTableName()
    method GetReceivedTableName (line 37) | public virtual string GetReceivedTableName()
    method GetLockTableName (line 42) | public virtual string GetLockTableName()
    method InitializeAsync (line 47) | public async Task InitializeAsync(CancellationToken cancellationToken)
    method IsSupportSkipLocked (line 69) | public virtual bool IsSupportSkipLocked()
    method CreateDbTablesScript (line 86) | protected virtual string CreateDbTablesScript()

FILE: src/DotNetCore.CAP.MySql/ServerVersion.cs
  class ServerVersion (line 9) | internal class ServerVersion
    type ServerType (line 11) | public enum ServerType
    method ServerVersion (line 19) | public ServerVersion(ServerType serverType, Version version)
    method Parse (line 29) | public static ServerVersion? Parse(string versionString)

FILE: src/DotNetCore.CAP.NATS/CAP.NATSCapOptionsExtension.cs
  class NATSCapOptionsExtension (line 12) | internal sealed class NATSCapOptionsExtension : ICapOptionsExtension
    method NATSCapOptionsExtension (line 16) | public NATSCapOptionsExtension(Action<NATSOptions> configure)
    method AddServices (line 21) | public void AddServices(IServiceCollection services)

FILE: src/DotNetCore.CAP.NATS/CAP.NATSOptions.cs
  class NATSOptions (line 15) | public class NATSOptions

FILE: src/DotNetCore.CAP.NATS/CAP.Options.Extensions.cs
  class CapOptionsExtensions (line 10) | public static class CapOptionsExtensions
    method UseNATS (line 17) | public static CapOptions UseNATS(this CapOptions options, string? boot...
    method UseNATS (line 32) | public static CapOptions UseNATS(this CapOptions options, Action<NATSO...

FILE: src/DotNetCore.CAP.NATS/IConnectionPool.Default.cs
  class ConnectionPool (line 13) | public class ConnectionPool : IConnectionPool, IDisposable
    method ConnectionPool (l
Condensed preview — 495 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,544K chars).
[
  {
    "path": ".flubu",
    "chars": 26,
    "preview": "\nbuild/BuildScript.csproj\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 3391,
    "preview": "name: 🐞 Bug Report\ndescription: Report a reproducible issue or unexpected behavior in CAP\ntitle: \"[Bug] \"\nlabels: [bug]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 2799,
    "preview": "name: ✨ Feature Request\ndescription: Suggest a new feature or improvement for CAP\ntitle: \"[Feature] \"\nlabels: [enhanceme"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/question.yml",
    "chars": 2149,
    "preview": "name: ❓ Question or Help\ndescription: Ask a question or request usage help about CAP\ntitle: \"[Question] \"\nlabels: [quest"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 1097,
    "preview": "### Description:\n_Provide a more detailed description of the changes made in this PR. Explain the reason behind the chan"
  },
  {
    "path": ".github/workflows/deploy-docs-and-dashboard.yml",
    "chars": 1772,
    "preview": "name: docs & dashboard-dist\non:\n  push:\n    branches:\n      - master\njobs:\n  changes:\n    runs-on: ubuntu-latest\n    out"
  },
  {
    "path": ".gitignore",
    "chars": 372,
    "preview": "node_modules\n[Oo]bj/\n[Bb]in/\nTestResults/\n.nuget/\n_ReSharper.*/\npackages/\nartifacts/\nPublishProfiles/\n*.user\n*.suo\n*.cac"
  },
  {
    "path": "CAP.sln",
    "chars": 21267,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.3191"
  },
  {
    "path": "CAP.sln.DotSettings",
    "chars": 916,
    "preview": "<wpf:ResourceDictionary xml:space=\"preserve\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:s=\"clr-namesp"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1067,
    "preview": "MIT License\n\nCopyright (c) 2016 Savorboard\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
  },
  {
    "path": "README.md",
    "chars": 12894,
    "preview": "<p align=\"center\">\n  <img height=\"140\" src=\"https://raw.githubusercontent.com/dotnetcore/CAP/master/docs/content/img/log"
  },
  {
    "path": "README.zh-cn.md",
    "chars": 7919,
    "preview": "<p align=\"center\">\n  <img height=\"140\" src=\"https://raw.githubusercontent.com/dotnetcore/CAP/master/docs/content/img/log"
  },
  {
    "path": "appveyor.yml",
    "chars": 1169,
    "preview": "version: '{build}'\nos: Visual Studio 2022\nenvironment:\n  BUILDING_ON_PLATFORM: win\n  BuildEnvironment: appveyor\n  Cap_My"
  },
  {
    "path": "build/BuildScript.Util.cs",
    "chars": 277,
    "preview": "using System;\n\nnamespace BuildScript\n{\n    public partial class BuildScript\n    {\n        public string CreateStamp()\n "
  },
  {
    "path": "build/BuildScript.Version.cs",
    "chars": 2284,
    "preview": "using System.IO;\nusing System.Xml;\nusing FlubuCore.Context;\nusing FlubuCore.Scripting.Attributes;\n\nnamespace BuildScrip"
  },
  {
    "path": "build/BuildScript.cs",
    "chars": 3133,
    "preview": "using System.Collections.Generic;\nusing FlubuCore.Context;\nusing FlubuCore.Context.Attributes.BuildProperties;\nusing Fl"
  },
  {
    "path": "build/BuildScript.csproj",
    "chars": 561,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n  </PropertyGroup>\n"
  },
  {
    "path": "build/BuildVersion.cs",
    "chars": 686,
    "preview": "namespace BuildScript\n{\n    public class BuildVersion\n    {\n        public int Major { get; init; }\n\n        public int"
  },
  {
    "path": "build/version.props",
    "chars": 273,
    "preview": "<Project>\n\t<PropertyGroup>\n\t\t<VersionMajor>10</VersionMajor>\n\t\t<VersionMinor>0</VersionMinor>\n\t\t<VersionPatch>2</Version"
  },
  {
    "path": "code-of-conduct.md",
    "chars": 3644,
    "preview": "# MEMBER CODE OF CONDUCT\n\nThe .NET Core Community (NCC) was created to doster an open, innovative, inclusive and welcomi"
  },
  {
    "path": "docs/content/CNAME",
    "chars": 18,
    "preview": "cap.dotnetcore.xyz"
  },
  {
    "path": "docs/content/about/contact-us.md",
    "chars": 326,
    "preview": "---\nhide:\n  - feedback\n---\n\n# Contact Us\n\n## Authors\n\n* Author: [@yang-xiaodong](https://github.com/yang-xiaodong)\n* Ema"
  },
  {
    "path": "docs/content/about/license.md",
    "chars": 1116,
    "preview": "---\nhide:\n  - feedback\n---\n\n# License\n\n**MIT License**\n\nCopyright (c) 2016 - 2024 Savorboard\n\nPermission is hereby grant"
  },
  {
    "path": "docs/content/about/release-notes.md",
    "chars": 28519,
    "preview": "---\nhide:\n  - feedback\n---\n\n# Release Notes\n\n## Version 8.2.0 (Jun 23, 2024)\n\n**Features:**\n- Add support CustomHeadersB"
  },
  {
    "path": "docs/content/index.md",
    "chars": 3144,
    "preview": "---\nhide:\n  - feedback\n---\n\nTitle: CAP - A distributed transaction solution in micro-service base on eventually consiste"
  },
  {
    "path": "docs/content/user-guide/en/cap/configuration.md",
    "chars": 11441,
    "preview": "# Configuration\n\nBy default, you specify configurations when registering CAP services in the DI container for an ASP.NET"
  },
  {
    "path": "docs/content/user-guide/en/cap/filter.md",
    "chars": 1460,
    "preview": "# Filter\n\nSubscriber filters are similar to ASP.NET MVC filters and are mainly used to perform additional work before an"
  },
  {
    "path": "docs/content/user-guide/en/cap/idempotence.md",
    "chars": 7199,
    "preview": "# Idempotence\n\nIdempotence (which you can read a formal definition of on [Wikipedia](https://en.wikipedia.org/wiki/Idemp"
  },
  {
    "path": "docs/content/user-guide/en/cap/messaging.md",
    "chars": 9506,
    "preview": "# Message\n\nThe data sent using the `ICapPublisher` interface is called a `Message`.\n\n!!! WARNING \"TimeoutException throw"
  },
  {
    "path": "docs/content/user-guide/en/cap/serialization.md",
    "chars": 584,
    "preview": "# Serialization\n\nWe provide the `ISerializer` interface to support message serialization. By default, JSON is used to se"
  },
  {
    "path": "docs/content/user-guide/en/cap/transactions.md",
    "chars": 5152,
    "preview": "# Transaction\n\n## Distributed Transactions?\n\nCAP does not provide out-of-the-box MS DTC or 2PC (Two-Phase Commit) based "
  },
  {
    "path": "docs/content/user-guide/en/getting-started/contributing.md",
    "chars": 1143,
    "preview": "# Contributing\n\nOne of the easiest ways to contribute is to participate in discussions and address issues. \n\nIf you have"
  },
  {
    "path": "docs/content/user-guide/en/getting-started/introduction.md",
    "chars": 2832,
    "preview": "# Introduction\n\nCAP is an EventBus and a solution for solving distributed transaction problems in microservices or SOA s"
  },
  {
    "path": "docs/content/user-guide/en/getting-started/quick-start.md",
    "chars": 2533,
    "preview": "# Quick Start\n\nLearn how to build a microservices event bus architecture using CAP. This offers advantages over directly"
  },
  {
    "path": "docs/content/user-guide/en/monitoring/consul.md",
    "chars": 1894,
    "preview": "# Consul\n\n[Consul](https://www.consul.io/) is a distributed service mesh tool to connect, secure, and configure services"
  },
  {
    "path": "docs/content/user-guide/en/monitoring/dashboard.md",
    "chars": 3521,
    "preview": "# Dashboard\n\nCAP provides a Dashboard for viewing messages. The features provided by the Dashboard make it easy to view "
  },
  {
    "path": "docs/content/user-guide/en/monitoring/diagnostics.md",
    "chars": 3500,
    "preview": "# Diagnostics\n\nDiagnostics provides a set of features that make it easy to document critical operations that occur durin"
  },
  {
    "path": "docs/content/user-guide/en/monitoring/kubernetes.md",
    "chars": 5426,
    "preview": "# Kubernetes\n\n[Kubernetes](https://kubernetes.io), also known as K8s, is an open-source system for automating deployment"
  },
  {
    "path": "docs/content/user-guide/en/monitoring/opentelemetry.md",
    "chars": 2783,
    "preview": "# OpenTelemetry\n\n[https://opentelemetry.io/](https://opentelemetry.io/)\n\nOpenTelemetry is a collection of tools, APIs, a"
  },
  {
    "path": "docs/content/user-guide/en/samples/eshoponcontainers.md",
    "chars": 1319,
    "preview": "# eShopOnContainers\n\neShopOnContainers is a sample application written in C# running on .NET Core that uses a microservi"
  },
  {
    "path": "docs/content/user-guide/en/samples/faq.md",
    "chars": 1819,
    "preview": "# FAQ\n\n!!! faq \"Is there an IM group (e.g., Tencent QQ group) to learn and chat about CAP?\"\n\n    There is not. Instead o"
  },
  {
    "path": "docs/content/user-guide/en/samples/github.md",
    "chars": 214,
    "preview": "# GitHub Samples\n\nYou can find sample code in the GitHub repository:\n\nhttps://github.com/dotnetcore/CAP/tree/master/samp"
  },
  {
    "path": "docs/content/user-guide/en/storage/general.md",
    "chars": 3868,
    "preview": "# General\n\nCAP requires a storage medium with persistence capabilities to store event messages in databases or other NoS"
  },
  {
    "path": "docs/content/user-guide/en/storage/in-memory-storage.md",
    "chars": 808,
    "preview": "# In-Memory Storage\n\nIn-memory storage is commonly used in development and test environments. However, if you use memory"
  },
  {
    "path": "docs/content/user-guide/en/storage/mongodb.md",
    "chars": 2389,
    "preview": "# MongoDB\n\nMongoDB is a cross-platform, document-oriented database program. Classified as a NoSQL database, MongoDB uses"
  },
  {
    "path": "docs/content/user-guide/en/storage/mysql.md",
    "chars": 1680,
    "preview": "# MySQL\n\nMySQL is an open-source relational database management system. CAP fully supports MySQL. \n\n## Configuration\n\nTo"
  },
  {
    "path": "docs/content/user-guide/en/storage/postgresql.md",
    "chars": 1973,
    "preview": "# PostgreSQL\n\nPostgreSQL is an open-source relational database management system. CAP fully supports PostgreSQL. \n\n## Co"
  },
  {
    "path": "docs/content/user-guide/en/storage/sqlserver.md",
    "chars": 1920,
    "preview": "# SQL Server\n\nSQL Server is a relational database management system developed by Microsoft. CAP fully supports SQL Serve"
  },
  {
    "path": "docs/content/user-guide/en/transport/aws-sqs.md",
    "chars": 2688,
    "preview": "# Amazon SQS\n\nAWS SQS is a fully managed message queuing service that enables you to decouple and scale microservices, d"
  },
  {
    "path": "docs/content/user-guide/en/transport/azure-service-bus.md",
    "chars": 8811,
    "preview": "# Azure Service Bus\n\nMicrosoft Azure Service Bus is a fully managed enterprise integration message broker. Service Bus i"
  },
  {
    "path": "docs/content/user-guide/en/transport/general.md",
    "chars": 1679,
    "preview": "# Transports\n\nTransports move data between different parts of the system – between message producers and message brokers"
  },
  {
    "path": "docs/content/user-guide/en/transport/in-memory-queue.md",
    "chars": 639,
    "preview": "# In-Memory Queue\n\nIn-Memory Queue is a memory-based message queue provided by the [community](https://github.com/yang-x"
  },
  {
    "path": "docs/content/user-guide/en/transport/kafka.md",
    "chars": 3362,
    "preview": "# Apache Kafka\n\n[Apache Kafka](https://kafka.apache.org/) is an open-source event streaming platform developed by Linked"
  },
  {
    "path": "docs/content/user-guide/en/transport/nats.md",
    "chars": 2752,
    "preview": "# NATS\n\n[NATS](https://nats.io/) is a simple, secure and performant communications system for digital systems, services "
  },
  {
    "path": "docs/content/user-guide/en/transport/pulsar.md",
    "chars": 978,
    "preview": "# Apache Pulsar\n\n[Apache Pulsar](https://pulsar.apache.org/) is a cloud-native, distributed messaging and streaming plat"
  },
  {
    "path": "docs/content/user-guide/en/transport/rabbitmq.md",
    "chars": 3611,
    "preview": "# RabbitMQ\n\nRabbitMQ is an open-source message broker software that implements the Advanced Message Queuing Protocol (AM"
  },
  {
    "path": "docs/content/user-guide/en/transport/redis-streams.md",
    "chars": 2228,
    "preview": "# Redis Streams\n\n[Redis](https://redis.io/) is an open-source, BSD-licensed, in-memory data structure store used as a da"
  },
  {
    "path": "docs/content/user-guide/zh/cap/configuration.md",
    "chars": 5748,
    "preview": "# 配置\n\n默认情况下,你在向DI容器中注册CAP服务的时候指定此配置。\n\n```c#\nservices.AddCap(config=> {\n    // config.XXX \n});\n```\n\n其中 `services` 代表的是 `I"
  },
  {
    "path": "docs/content/user-guide/zh/cap/filter.md",
    "chars": 1108,
    "preview": "# 过滤器\n\n从 5.1.0 版本后,我们引入了对订阅者过滤器的支持,以使在某些场景(如事务处理,日志记录等)中变得容易。\n\n## 自定义过滤器\n\n### 添加过滤器\n\n创建一个过滤器类,并继承 `SubscribeFilter` 抽象类。"
  },
  {
    "path": "docs/content/user-guide/zh/cap/idempotence.md",
    "chars": 2735,
    "preview": "# 幂等性\n\n幂等性(你可以在[Wikipedia](https://en.wikipedia.org/wiki/Idempotence)读到关于幂等性的定义),当我们谈论幂等时,一般是指可以重复处理传递的消息,而不会产生意外的结果。\n\n#"
  },
  {
    "path": "docs/content/user-guide/zh/cap/messaging.md",
    "chars": 5165,
    "preview": "# 消息\n\n使用 `ICapPublisher` 接口发送出去的数据称之为 Message (`消息`)。\n\n## 发送 & 处理消息\n\n你可以阅读 [quick-start](../getting-started/quick-start."
  },
  {
    "path": "docs/content/user-guide/zh/cap/serialization.md",
    "chars": 436,
    "preview": "# 序列化\n\nCAP 提供了 `ISerializer` 接口来支持对消息进行序列化,默认情况下我们使用 json 来对消息进行序列化处理并存储到数据库中。\n\n## 自定义序列化\n\n```C#\npublic class YourSerial"
  },
  {
    "path": "docs/content/user-guide/zh/cap/transactions.md",
    "chars": 838,
    "preview": "# 事务\n\n## 分布式事务?\n\nCAP 不直接提供开箱即用的基于 DTC 或者 2PC 的分布式事务,相反我们提供一种可以用于解决在分布式事务遇到的问题的一种解决方案。\n\n在分布式环境中,由于涉及通讯的开销,使用基于2PC或DTC的分布式"
  },
  {
    "path": "docs/content/user-guide/zh/getting-started/contributing.md",
    "chars": 734,
    "preview": "# 贡献\n\n贡献最简单的方式之一就是参与讨论和issue讨论。\n\n如果您有任何疑问或问题,请在CAP仓库中报告:\n\n<a href=\"https://github.com/dotnetcore/cap/issues/new\"><button"
  },
  {
    "path": "docs/content/user-guide/zh/getting-started/introduction.md",
    "chars": 1598,
    "preview": "# 介绍\n\nCAP 是一个EventBus,同时也是一个在微服务或者SOA系统中解决分布式事务问题的一个框架。它有助于创建可扩展,可靠并且易于更改的微服务系统。\n\n在微软的 [eShop](https://github.com/dotnet"
  },
  {
    "path": "docs/content/user-guide/zh/getting-started/quick-start.md",
    "chars": 1966,
    "preview": "# 快速开始\n\n了解如何使用 CAP 构建微服务事件总线架构,它比直接集成消息队列提供了哪些优势,它提供了哪些开箱即用的功能。\n\n## 安装\n\n```powershell\nPM> Install-Package DotNetCore.CAP"
  },
  {
    "path": "docs/content/user-guide/zh/monitoring/consul.md",
    "chars": 1599,
    "preview": "# Consul\n\n[Consul](https://www.consul.io/) 是一个分布式服务网格,用于跨任何运行时平台和公共或私有云连接,保护和配置服务。\n\n## Dashboard 中的 Consul 配置\n\nCAP的 Dash"
  },
  {
    "path": "docs/content/user-guide/zh/monitoring/dashboard.md",
    "chars": 4177,
    "preview": "# Dashboard\n\nCAP 原生提供了 Dashboard 供查看消息,利用 Dashboard 提供的功能可以很方便的查看和管理消息。\n\n!!! WARNING \"使用限制\"\n    Dashboard 只支持在 ASP.NET C"
  },
  {
    "path": "docs/content/user-guide/zh/monitoring/diagnostics.md",
    "chars": 1886,
    "preview": "# 诊断(Diagnostics)\n\nDiagnostics 提供一组功能使我们能够很方便的可以记录在应用程序运行期间发生的关键性操作以及他们的执行时间等,使管理员可以查找特别是生产环境中出现问题所在的根本原因。\n\n## 跟踪(Tracin"
  },
  {
    "path": "docs/content/user-guide/zh/monitoring/kubernetes.md",
    "chars": 3702,
    "preview": "# Kubernetes\n\n[Kubernetes](https://kubernetes.io),也称为 K8s,是一个开源系统,用于自动部署、扩展和管理容器化应用程序。\n\n## Dashboard 中的 Kubernetes\n\n我们的 "
  },
  {
    "path": "docs/content/user-guide/zh/monitoring/opentelemetry.md",
    "chars": 727,
    "preview": "# OpenTelemetry \n\nhttps://opentelemetry.io/\n\nOpenTelemetry是工具、api和sdk的集合。 使用它来检测、生成、收集和导出遥测数据(度量、日志和跟踪),以帮助您分析软件的性能和行为。\n"
  },
  {
    "path": "docs/content/user-guide/zh/samples/castle.dynamicproxy.md",
    "chars": 2870,
    "preview": "# 和 Castle DynamicProxy 集成\n\nCastle DynamicProxy 是一个用于在运行时动态生成轻量级.NET代理的库。代理对象允许在不修改类代码的情况下截取对对象成员的调用。可以代理类和接口,但是只能拦截虚拟成员"
  },
  {
    "path": "docs/content/user-guide/zh/samples/eshoponcontainers.md",
    "chars": 1320,
    "preview": "# eShopOnContainers\n\neShopOnContainers is a sample application written in C# running on .NET Core using a microservice a"
  },
  {
    "path": "docs/content/user-guide/zh/samples/faq.md",
    "chars": 929,
    "preview": "# FAQ\n\n!!! faq \"有没有学习和讨论 CAP 的即时通讯群组(例如腾讯 QQ 群)?\"\n\n回答: 暂时没有。与其浪费大量时间在即时通讯群组里,我更希望开发者能够培养独立思考能力,并通过查阅文档自行解决问题,甚至可以在遇到错误时创"
  },
  {
    "path": "docs/content/user-guide/zh/samples/github.md",
    "chars": 178,
    "preview": "# Github 上的示例\n\n你可以在下面的地址找到相关示例代码:\n\nhttps://github.com/dotnetcore/CAP/tree/master/samples\n\nCAP + Aspire + Azure Service B"
  },
  {
    "path": "docs/content/user-guide/zh/storage/general.md",
    "chars": 2456,
    "preview": "# 基本\n\nCAP 需要使用具有持久化功能的存储介质来存储事件消息,例如通过数据库或者其他NoSql设施。CAP 使用这种方式来应对一切环境或者网络异常导致消息丢失的情况,消息的可靠性是分布式事务的基石,所以在任何情况下消息都不能丢失。\n\n"
  },
  {
    "path": "docs/content/user-guide/zh/storage/in-memory-storage.md",
    "chars": 506,
    "preview": "# In-Memory Storage\n\n内存消息的持久化存储常用于开发和测试环境,如果使用基于内存的存储则你会失去本地事务消息可靠性保证。\n\n## 配置\n\n如果要使用内存存储,你需要从 NuGet 安装以下扩展包:\n\n```\nInstal"
  },
  {
    "path": "docs/content/user-guide/zh/storage/mongodb.md",
    "chars": 1701,
    "preview": "# MongoDB\n\nMongoDB 是一个跨平台的面向文档型的数据库程序,它被归为 NOSQL 数据库,CAP 从 2.3 版本开始支持 MongoDB 作为消息存储。 \n\nMongoDB 从 4.0 版本开始支持 ACID 事务,所以 "
  },
  {
    "path": "docs/content/user-guide/zh/storage/mysql.md",
    "chars": 1862,
    "preview": "# MySQL\n\nMySQL 是一个开源的关系型数据库,你可以使用 MySQL 来作为 CAP 消息的持久化。\n\n## 配置\n\n要使用 MySQL 存储,你需要从 NuGet 安装以下扩展包:\n\n```shell\nInstall-Packa"
  },
  {
    "path": "docs/content/user-guide/zh/storage/postgresql.md",
    "chars": 2060,
    "preview": "# Postgre SQL\n\nPostgreSQL 是一个开源的关系型数据库,它已经变得越来越流行,你可以使用 Postgre SQL 来作为 CAP 消息的持久化。\n\n## 配置\n\n要使用 PostgreSQL 存储,你需要从 NuGet"
  },
  {
    "path": "docs/content/user-guide/zh/storage/sqlserver.md",
    "chars": 2003,
    "preview": "# SQL Server\n\nSQL Server 是由微软开发的一个关系型数据库,你可以使用 SQL Server 来作为 CAP 消息的持久化。\n\n!!! warning \"注意\"\n    我们目前使用 `Microsoft.Data.S"
  },
  {
    "path": "docs/content/user-guide/zh/transport/aws-sqs.md",
    "chars": 1677,
    "preview": "# Amazon SQS\n\nAWS SQS 是一种完全托管的消息队列服务,可让您分离和扩展微服务、分布式系统和无服务器应用程序。\n\nAWS SNS 是一种高度可用、持久、安全、完全托管的发布/订阅消息收发服务,可以轻松分离微服务、分布式系统"
  },
  {
    "path": "docs/content/user-guide/zh/transport/azure-service-bus.md",
    "chars": 6581,
    "preview": "# Azure Service Bus\n\nAzure 服务总线是一种多租户云消息服务,可用于在应用程序和服务之间发送信息。 异步操作可实现灵活的中转消息传送、结构化的先进先出 (FIFO) 消息传送以及发布/订阅功能。\n\nCAP 支持使用 "
  },
  {
    "path": "docs/content/user-guide/zh/transport/general.md",
    "chars": 1310,
    "preview": "# 运输器\n\n通过运输将数据从一个地方移动到另一个地方-在采集程序和管道之间,管道与实体数据库之间,甚至在管道与外部系统之间。\n\n## 支持的运输器\n\nCAP 支持以下几种运输方式:\n\n* [RabbitMQ](rabbitmq.md)\n*"
  },
  {
    "path": "docs/content/user-guide/zh/transport/in-memory-queue.md",
    "chars": 506,
    "preview": "# In-Memory Queue\n\nIn Memory Queue 为基于内存的消息队列,该扩展由 [社区](https://github.com/yang-xiaodong/Savorboard.CAP.InMemoryMessageQ"
  },
  {
    "path": "docs/content/user-guide/zh/transport/kafka.md",
    "chars": 2423,
    "preview": "# Apache Kafka®\n\n[Apache Kafka®](https://kafka.apache.org/) 是一个开源流处理软件平台,由 LinkedIn 开发并捐赠给 Apache Software Foundation,用 "
  },
  {
    "path": "docs/content/user-guide/zh/transport/nats.md",
    "chars": 1927,
    "preview": "# NATS\n\n[NATS](https://nats.io/)是一个简单、安全、高性能的数字系统、服务和设备通信系统。NATS 是 CNCF 的一部分。\n\n!!! warning\n    自 CAP 5.2+ 的版本已经基于 [JetSt"
  },
  {
    "path": "docs/content/user-guide/zh/transport/pulsar.md",
    "chars": 741,
    "preview": "# Apache Pulsar\n\n[Apache Pulsar](https://pulsar.apache.org/) 是一个用于服务器到服务器的消息系统,具有多租户、高性能等优势。 Pulsar 最初由 Yahoo 开发,目前由 Apa"
  },
  {
    "path": "docs/content/user-guide/zh/transport/rabbitmq.md",
    "chars": 2520,
    "preview": "# RabbitMQ\n\nRabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ 服务器是用 Erlang 语言编写的,而聚类和故障转移是构建在开源的通讯平台框架上的。所有主要的编程语"
  },
  {
    "path": "docs/content/user-guide/zh/transport/redis-streams.md",
    "chars": 1501,
    "preview": "# Redis Streams\n\n[Redis](https://redis.io/) 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。\n\n[Redis Stream](https://redis."
  },
  {
    "path": "docs/mkdocs.yml",
    "chars": 6839,
    "preview": "# Project information\nsite_name: CAP\nsite_url: http://cap.dotnetcore.xyz\nsite_description: A distributed transaction sol"
  },
  {
    "path": "docs/readme.md",
    "chars": 576,
    "preview": "# CAP Documentation\n\nThe folder contains the documentation for CAP.\n\nWe are using [Github Pages](https://github.com/dotn"
  },
  {
    "path": "samples/Sample.AmazonSQS.InMemory/Controllers/ValuesController.cs",
    "chars": 839,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing DotNetCore.CAP;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace Sample.Ama"
  },
  {
    "path": "samples/Sample.AmazonSQS.InMemory/Program.cs",
    "chars": 456,
    "preview": "using Amazon;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.Extensions.DependencyInjection;\n\nvar builder = WebApp"
  },
  {
    "path": "samples/Sample.AmazonSQS.InMemory/Sample.AmazonSQS.InMemory.csproj",
    "chars": 570,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n  </PropertyGro"
  },
  {
    "path": "samples/Sample.AmazonSQS.InMemory/appsettings.json",
    "chars": 107,
    "preview": "{\n  \"Logging\": {\n    \"IncludeScopes\": false,\n    \"LogLevel\": {\n      \"Default\": \"Information\"\n    }\n  }\n}\n"
  },
  {
    "path": "samples/Sample.AzureServiceBus.InMemory/Contracts/DomainEvents/Contract.cs",
    "chars": 144,
    "preview": "namespace Sample.AzureServiceBus.InMemory.Contracts.DomainEvents;\n\npublic record EntityCreated(Guid Id);\n\npublic record "
  },
  {
    "path": "samples/Sample.AzureServiceBus.InMemory/Contracts/IntegrationEvents/Contract.cs",
    "chars": 177,
    "preview": "namespace Sample.AzureServiceBus.InMemory.Contracts.IntegrationEvents;\n\npublic record EntityCreatedForIntegration(Guid I"
  },
  {
    "path": "samples/Sample.AzureServiceBus.InMemory/Program.cs",
    "chars": 2507,
    "preview": "using DotNetCore.CAP;\nusing DotNetCore.CAP.Internal;\n\nusing Sample.AzureServiceBus.InMemory;\nusing Sample.AzureServiceBu"
  },
  {
    "path": "samples/Sample.AzureServiceBus.InMemory/Sample.AzureServiceBus.InMemory.csproj",
    "chars": 762,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n    <PropertyGroup>\n        <TargetFramework>net10.0</TargetFramework>\n        <"
  },
  {
    "path": "samples/Sample.AzureServiceBus.InMemory/SampleSubscriber.cs",
    "chars": 321,
    "preview": "using DotNetCore.CAP;\n\nnamespace Sample.AzureServiceBus.InMemory;\n\npublic class SampleSubscriber : ICapSubscribe\n{\n    p"
  },
  {
    "path": "samples/Sample.AzureServiceBus.InMemory/appsettings.Development.json",
    "chars": 119,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  }\n}\n"
  },
  {
    "path": "samples/Sample.AzureServiceBus.InMemory/appsettings.json",
    "chars": 142,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  "
  },
  {
    "path": "samples/Sample.ConsoleApp/EventSubscriber.cs",
    "chars": 356,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing DotNetCore.CAP;\n\nnamespace Sample.ConsoleApp\n{\n    public class Event"
  },
  {
    "path": "samples/Sample.ConsoleApp/Program.cs",
    "chars": 1860,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing DotNetCore.CAP;\nusing DotNetCore.CAP.Filter;\nusing Microsoft.Extensio"
  },
  {
    "path": "samples/Sample.ConsoleApp/Sample.ConsoleApp.csproj",
    "chars": 600,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n    <OutputType>Exe"
  },
  {
    "path": "samples/Sample.Dashboard.Auth/Controllers/ValuesController.cs",
    "chars": 1326,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing DotNetCore.CAP;\nusing Microsoft.AspNetCore.Authorization;\nusing Micro"
  },
  {
    "path": "samples/Sample.Dashboard.Auth/MyDashboardAuthenticationHandler.cs",
    "chars": 2291,
    "preview": "using System.Linq;\nusing System.Security.Claims;\nusing System.Text.Encodings.Web;\nusing System.Threading.Tasks;\nusing M"
  },
  {
    "path": "samples/Sample.Dashboard.Auth/Program.cs",
    "chars": 475,
    "preview": "using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Hosting;\n\nnamespace Sample.Dashboard.Auth\n{\n    public cl"
  },
  {
    "path": "samples/Sample.Dashboard.Auth/Sample.Dashboard.Auth.csproj",
    "chars": 722,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n    <PropertyGroup>\n        <TargetFramework>net10.0</TargetFramework>\n    </Pro"
  },
  {
    "path": "samples/Sample.Dashboard.Auth/Startup.cs",
    "chars": 5729,
    "preview": "using Microsoft.AspNetCore.Authentication.Cookies;\nusing Microsoft.AspNetCore.Authentication.OpenIdConnect;\nusing Micros"
  },
  {
    "path": "samples/Sample.Dashboard.Auth/appsettings.json",
    "chars": 319,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Warning\",\n      \"Microsoft.Hostin"
  },
  {
    "path": "samples/Sample.Dashboard.Jwt/Data/User.cs",
    "chars": 197,
    "preview": "namespace Sample.Dashboard.Jwt.Data\n{\n    public class User\n    {\n        public string UserName { get; set; } = string"
  },
  {
    "path": "samples/Sample.Dashboard.Jwt/Dockerfile",
    "chars": 113,
    "preview": "FROM mcr.microsoft.com/dotnet/aspnet:6.0\nWORKDIR /app\nCOPY . ./\nENTRYPOINT [\"dotnet\", \"Sample.Dashboard.Jwt.dll\"]"
  },
  {
    "path": "samples/Sample.Dashboard.Jwt/Program.cs",
    "chars": 3164,
    "preview": "using System.IdentityModel.Tokens.Jwt;\nusing System.Security.Claims;\nusing System.Text;\nusing Microsoft.AspNetCore.Authe"
  },
  {
    "path": "samples/Sample.Dashboard.Jwt/Sample.Dashboard.Jwt.csproj",
    "chars": 862,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n    <PropertyGroup>\n        <TargetFramework>net10.0</TargetFramework>\n        <"
  },
  {
    "path": "samples/Sample.Dashboard.Jwt/appsettings.json",
    "chars": 385,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Information\",\n      \"Microsoft.Ho"
  },
  {
    "path": "samples/Sample.Dashboard.Jwt/wwwroot/css/site.css",
    "chars": 177,
    "preview": "html {\n  font-size: 14px;\n}\n\n@media (min-width: 768px) {\n  html {\n    font-size: 16px;\n  }\n}\n\nhtml {\n  position: relativ"
  },
  {
    "path": "samples/Sample.Dashboard.Jwt/wwwroot/index.html",
    "chars": 1400,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width,"
  },
  {
    "path": "samples/Sample.Dashboard.Jwt/wwwroot/js/site.js",
    "chars": 617,
    "preview": "// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\n// for deta"
  },
  {
    "path": "samples/Sample.Kafka.PostgreSql/AppDbContext.cs",
    "chars": 2661,
    "preview": "using System.Data.Common;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing DotNetCore.CAP;\nusing Microsoft.E"
  },
  {
    "path": "samples/Sample.Kafka.PostgreSql/Controllers/ValuesController.cs",
    "chars": 2853,
    "preview": "using System;\nusing System.Data;\nusing System.Threading.Tasks;\nusing Dapper;\nusing DotNetCore.CAP;\nusing Microsoft.AspN"
  },
  {
    "path": "samples/Sample.Kafka.PostgreSql/Program.cs",
    "chars": 1961,
    "preview": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Storage;\nu"
  },
  {
    "path": "samples/Sample.Kafka.PostgreSql/Sample.Kafka.PostgreSql.csproj",
    "chars": 801,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n    <WarningsAsE"
  },
  {
    "path": "samples/Sample.Kafka.PostgreSql/appsettings.json",
    "chars": 108,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Warning\",\n      \"DotNetCore.CAP\": \"Debug\"\n    }\n  }\n}\n"
  },
  {
    "path": "samples/Sample.Pulsar.InMemory/Controllers/ValuesController.cs",
    "chars": 859,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing DotNetCore.CAP;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace Sample.Pul"
  },
  {
    "path": "samples/Sample.Pulsar.InMemory/Program.cs",
    "chars": 567,
    "preview": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInje"
  },
  {
    "path": "samples/Sample.Pulsar.InMemory/Sample.Pulsar.InMemory.csproj",
    "chars": 556,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n\t<PropertyGroup>\n\t\t<TargetFramework>net10.0</TargetFramework>\n\t</PropertyGroup>\n"
  },
  {
    "path": "samples/Sample.Pulsar.InMemory/appsettings.json",
    "chars": 231,
    "preview": "{\n  \"Logging\": {\n    \"IncludeScopes\": false,\n    \"LogLevel\": {\n      \"Default\": \"Debug\"\n    }\n  },\n  \"AppSettings\": {\n "
  },
  {
    "path": "samples/Sample.RabbitMQ.MongoDB/Controllers/ValuesController.cs",
    "chars": 3087,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing DotNetCore.CAP;\nusing Microsoft.AspNetCore.Mvc;\nusing MongoDB.Bson;\nu"
  },
  {
    "path": "samples/Sample.RabbitMQ.MongoDB/Program.cs",
    "chars": 642,
    "preview": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInje"
  },
  {
    "path": "samples/Sample.RabbitMQ.MongoDB/Sample.RabbitMQ.MongoDB.csproj",
    "chars": 547,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n  </PropertyGro"
  },
  {
    "path": "samples/Sample.RabbitMQ.MongoDB/appsettings.json",
    "chars": 353,
    "preview": "{\r\n  \"Logging\": {\r\n    \"LogLevel\": {\r\n      \"Default\": \"Debug\"\r\n    }\r\n  },\r\n  \"AllowedHosts\": \"*\",\r\n  \"ConnectionString"
  },
  {
    "path": "samples/Sample.RabbitMQ.MongoDB/docker-compose.yml",
    "chars": 941,
    "preview": "version: \"3.9\"\nservices:\n  \n  mongodb:\n    hostname: cap-mongodb\n    container_name: cap-mongodb\n    image: mongo:latest"
  },
  {
    "path": "samples/Sample.RabbitMQ.MySql/AppDbContext.cs",
    "chars": 755,
    "preview": "using Microsoft.EntityFrameworkCore;\n\nnamespace Sample.RabbitMQ.MySql\n{\n    public class Person\n    {\n        public in"
  },
  {
    "path": "samples/Sample.RabbitMQ.MySql/Controllers/ValuesController.cs",
    "chars": 3082,
    "preview": "using System;\nusing System.Data;\nusing System.Threading.Tasks;\nusing Dapper;\nusing DotNetCore.CAP;\nusing Microsoft.AspN"
  },
  {
    "path": "samples/Sample.RabbitMQ.MySql/Program.cs",
    "chars": 534,
    "preview": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.Extensions.DependencyInjection;\nusing Sample.RabbitMQ.MySql;\n\nvar b"
  },
  {
    "path": "samples/Sample.RabbitMQ.MySql/Sample.RabbitMQ.MySql.csproj",
    "chars": 899,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n\t<PropertyGroup>\n\t\t<TargetFramework>net8.0</TargetFramework>\n\t</PropertyGroup>\n\n"
  },
  {
    "path": "samples/Sample.RabbitMQ.MySql/appsettings.json",
    "chars": 222,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"DotNetCore.CAP\": \"Debug\",\n      \"Microsoft.As"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/AppDbContext.cs",
    "chars": 766,
    "preview": "using Microsoft.EntityFrameworkCore;\n\nnamespace Sample.RabbitMQ.SqlServer\n{\n    public class Person\n    {\n        publi"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/Controllers/ValuesController.cs",
    "chars": 5647,
    "preview": "using System;\nusing System.Data.Common;\nusing System.Threading.Tasks;\nusing Dapper;\nusing DotNetCore.CAP;\nusing Microso"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/Messages/TestMessage.cs",
    "chars": 248,
    "preview": "namespace Sample.RabbitMQ.SqlServer.Messages\n{\n    public class TestMessage\n    {\n        public static TestMessage Crea"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/Messages/VeryFastProcessingReceiver.cs",
    "chars": 807,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing Microsoft.Extensions.Logging;\nusing Sample.RabbitMQ.SqlServer.TypedCon"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/Messages/XSlowProcessingReceiver.cs",
    "chars": 798,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing Microsoft.Extensions.Logging;\nusing Sample.RabbitMQ.SqlServer.TypedCon"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/Migrations/20191205032949_FirstMigration.Designer.cs",
    "chars": 1475,
    "preview": "// <auto-generated />\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Mi"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/Migrations/20191205032949_FirstMigration.cs",
    "chars": 902,
    "preview": "using Microsoft.EntityFrameworkCore.Migrations;\n\nnamespace Sample.RabbitMQ.SqlServer.Migrations\n{\n    public partial cl"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/Migrations/AppDbContextModelSnapshot.cs",
    "chars": 1399,
    "preview": "// <auto-generated />\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Infrastructure;\nusing Mi"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/Program.cs",
    "chars": 2006,
    "preview": "using Dapper;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.Data.SqlClient;\nusing Microsoft.Extensions.Dependency"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/Sample.RabbitMQ.SqlServer.csproj",
    "chars": 799,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n  </PropertyGro"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/TypedConsumers/QueueHandler.cs",
    "chars": 97,
    "preview": "namespace Sample.RabbitMQ.SqlServer.TypedConsumers\n{\n    public abstract class QueueHandler { }\n}"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/TypedConsumers/QueueHandlerTopicAttribute.cs",
    "chars": 323,
    "preview": "using System;\n\nnamespace Sample.RabbitMQ.SqlServer.TypedConsumers\n{\n    [AttributeUsage(AttributeTargets.Class)]\n    pub"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/TypedConsumers/QueueHandlersExtensions.cs",
    "chars": 993,
    "preview": "using System;\nusing System.Linq;\nusing System.Reflection;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace Sam"
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/TypedConsumers/TypedConsumerServiceSelector.cs",
    "chars": 3344,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing DotNetCore.CAP;\nusing "
  },
  {
    "path": "samples/Sample.RabbitMQ.SqlServer/appsettings.json",
    "chars": 79,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\"\n    }\n  }\n}\n"
  },
  {
    "path": "samples/Samples.Redis.SqlServer/Controllers/HomeController.cs",
    "chars": 1364,
    "preview": "using DotNetCore.CAP;\nusing DotNetCore.CAP.Messages;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Options"
  },
  {
    "path": "samples/Samples.Redis.SqlServer/Dockerfile",
    "chars": 1660,
    "preview": "# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this D"
  },
  {
    "path": "samples/Samples.Redis.SqlServer/Program.cs",
    "chars": 886,
    "preview": "\nusing StackExchange.Redis;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services\n    .AddControllers();\n"
  },
  {
    "path": "samples/Samples.Redis.SqlServer/Samples.Redis.SqlServer.csproj",
    "chars": 963,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\t<PropertyGroup>\n\t\t<TargetFramework>net10.0</TargetFramework>\n\t\t<UserSecretsId>eb"
  },
  {
    "path": "samples/Samples.Redis.SqlServer/appsettings.json",
    "chars": 184,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Warning\",\n      \"Microsoft.Hostin"
  },
  {
    "path": "samples/Samples.Redis.SqlServer/docker-compose.yml",
    "chars": 2587,
    "preview": "services:\n  redis-node-0:\n    image: docker.io/bitnami/redis-cluster:7.0\n    volumes:\n      - redis-cluster_data-0:/bitn"
  },
  {
    "path": "src/Directory.Build.props",
    "chars": 1411,
    "preview": "<Project>\n\n  <Import Project=\"..\\build\\version.props\" />\n\n  <PropertyGroup Label=\"Package\">\n    <Product>CAP</Product>\n\t"
  },
  {
    "path": "src/DotNetCore.CAP/BrokerConnectionException.cs",
    "chars": 1669,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/CAP.Attribute.cs",
    "chars": 2739,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\r\n// Licensed under the MIT License. See License.txt in the p"
  },
  {
    "path": "src/DotNetCore.CAP/CAP.Builder.cs",
    "chars": 9362,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/CAP.Options.cs",
    "chars": 8971,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/CAP.ServiceCollectionExtensions.cs",
    "chars": 6128,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Diagnostics/CapDiagnosticListenerNames.cs",
    "chars": 1873,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Diagnostics/EventCounterSource.Cap.cs",
    "chars": 2766,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pro"
  },
  {
    "path": "src/DotNetCore.CAP/Diagnostics/EventData.Cap.P.cs",
    "chars": 925,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Diagnostics/EventData.Cap.S.cs",
    "chars": 1002,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/DotNetCore.CAP.csproj",
    "chars": 780,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n\t<PropertyGroup>\n\t\t<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>\n\t\t<Nul"
  },
  {
    "path": "src/DotNetCore.CAP/IBootstrapper.cs",
    "chars": 1947,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/ICapOptionsExtension.cs",
    "chars": 1898,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/ICapPublisher.cs",
    "chars": 6040,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/ICapSubscribe.cs",
    "chars": 1027,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/ICapTransaction.Base.cs",
    "chars": 6152,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/ICapTransaction.cs",
    "chars": 3462,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/ConsumerContext.cs",
    "chars": 1513,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/ConsumerExecutedResult.cs",
    "chars": 743,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/ConsumerExecutorDescriptor.cs",
    "chars": 3544,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/Filter/ExceptionContext.cs",
    "chars": 587,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/Filter/ExecutedContext.cs",
    "chars": 474,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/Filter/ExecutingContext.cs",
    "chars": 492,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/Filter/FilterContext.cs",
    "chars": 390,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/Filter/ISubscribeFilter.cs",
    "chars": 1125,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/Filter/SubscribeFilter.cs",
    "chars": 1381,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pro"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/Helper.cs",
    "chars": 4109,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/IBootstrapper.Default.cs",
    "chars": 5253,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/ICapPublisher.Default.cs",
    "chars": 8936,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/IConsumerRegister.Default.cs",
    "chars": 14809,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/IConsumerRegister.cs",
    "chars": 426,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/IConsumerServiceSelector.Assembly.cs",
    "chars": 1474,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/IConsumerServiceSelector.Default.cs",
    "chars": 10033,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/IConsumerServiceSelector.cs",
    "chars": 1213,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/IMessageSender.Default.cs",
    "chars": 6873,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/IMessageSender.cs",
    "chars": 351,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/IProcessingServer.cs",
    "chars": 471,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/ISnowflakeId.Default.cs",
    "chars": 5292,
    "preview": "// Copyright 2010-2012 Twitter, Inc.\n// An object that generates IDs. This is broken into a separate class in case we e"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/ISnowflakeId.cs",
    "chars": 264,
    "preview": "// Copyright 2010-2012 Twitter, Inc.\n// An object that generates IDs. This is broken into a separate class in case we ev"
  },
  {
    "path": "src/DotNetCore.CAP/Internal/ISubscribeExector.Default.cs",
    "chars": 10164,
    "preview": "// Copyright (c) .NET Core Community. All rights reserved.\n// Licensed under the MIT License. See License.txt in the pr"
  }
]

// ... and 295 more files (download for full content)

About this extraction

This page contains the full source code of the dotnetcore/CAP GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 495 files (2.3 MB), approximately 633.7k tokens, and a symbol index with 3122 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!