<?xml version="1.0"?>
<doc>
    <assembly>
        <name>TTAR.API</name>
    </assembly>
    <members>
        <member name="T:TTAR.API.Auth.AccountService">
            <summary>
            User's internal operations. Need to think about union with Players kind of operations.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.#ctor(Microsoft.Extensions.Logging.ILoggerFactory,System.String,TTAR.API.Auth.ITokenManager,TTAR.API.Auth.IRoleResolver,TTAR.DataProviders.Abstractions.IPlayerRepository,TTAR.DataProviders.Abstractions.IDbService,TTAR.Services.Abstractions.IEmailService,TTAR.Services.Abstractions.IEmailCooldownService,TTAR.Services.Abstractions.IPasswordHasher,TTAR.API.Configuration.AuthOptions,Telegram.Bot.ITelegramBotClient,TTAR.Configuration.TtarConfiguration,System.TimeProvider,TTAR.DataProviders.Abstractions.IPlayerBansStore)">
            <summary>
            User's internal operations. Need to think about union with Players kind of operations.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.AccountService.MinPasswordLength">
            <summary>
            Minimum length enforced for new passwords (set or reset).
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.AuthenticateAsync(TTAR.API.Models.Requests.AuthenticateRequest,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.VerifyCredentialsAsync(System.String,System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.AuthenticateOrCreateAsync(System.String,System.String,System.Boolean,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.CreateAuthenticateResponseAsync(TTAR.DataProviders.Models.PlayerModel,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.ThrowIfBanned(System.Int32)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.RefreshTokenAsync(System.String,System.String,System.Version,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.RevokeTokenAsync(System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.RevokeAllAuthTokensAsync(TTAR.DataProviders.Models.PlayerModel,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.RequestRemoval(System.String,System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.ChangeProfileAsync(System.Int32,System.String,System.String,System.Nullable{System.Boolean},System.String,System.Nullable{System.Boolean},System.Nullable{TTAR.Types.HandSide},System.Nullable{TTAR.Types.Gender},TTAR.DataProviders.PlayerPersonalInfo,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.AuthenticateByTelegramTokenAsync(System.Guid,System.Boolean,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.AuthenticateOrCreateByTelegramAsync(TTAR.API.Auth.TelegramIdentity,System.Boolean,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.IssueTelegramLinkTokenAsync(TTAR.API.Auth.TelegramIdentity,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.IssueLoginCodeAsync(System.Int32,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.RedeemLoginCodeAsync(System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.IsAccountRemovedAsync(System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.RequestPasswordResetAsync(System.String,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.MayResetPassword(TTAR.DataProviders.Models.PlayerModel)">
            <summary>
            Whether a password-reset link may go to the account's address. For a password-less account (SSO, merged) the
            link sets the first credential and confirms the address, so only a verified address gets it.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.IssueAndSendPasswordResetAsync(TTAR.DataProviders.Models.TTRatingDB,TTAR.DataProviders.Models.PlayerModel,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <summary>
            Issues a fresh password-reset token for <paramref name="user"/> (voiding the outstanding ones) and emails the
            link to the account address. No-op within the cooldown window.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.ResetPasswordAsync(System.String,System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.StampPlayerAfterRotationAsync(TTAR.DataProviders.Models.PlayerModel,System.DateTime,System.Version,System.Threading.CancellationToken)">
            <summary>
            Stamps <see cref="P:TTAR.DataProviders.Models.PlayerModel.LastTokenDate"/> (and, when the client reported a newer app
            <paramref name="appVersion"/>, <see cref="P:TTAR.DataProviders.Models.PlayerModel.Version"/>) in its own committed statement, separate
            from the token rotation. It must NOT share the rotation transaction: that txn INSERTs a child token row
            which takes a shared lock on the parent Players row, and an X-lock UPDATE of the same row then deadlocks
            concurrent same-player rotations (InnoDB S->X upgrade, error 1213). Done as a standalone keyed ExecuteUpdate
            on a fresh context, it only ever X-locks the single Players row by PK (no child-FK shared lock in scope, and
            both fields in one statement so the refresh path touches that row once), so it cannot form that cycle.
            LastTokenDate is a soft "has this account ever minted a token" marker (read only via HasValue), so the exact
            value — and a rare lost write — does not matter.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.RegisterAsync(System.String,System.String,System.String,System.Func{System.String,System.String},System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.ConfirmEmailAsync(System.String,TTAR.API.Auth.ClientDescriptor,System.Boolean,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.ResendConfirmationAsync(System.String,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.SendEmailVerificationAsync(System.Int32,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.ChangePasswordAsync(System.Int32,System.String,System.String,System.Boolean,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.RequestEmailChangeAsync(System.Int32,System.String,System.String,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.ConfirmEmailChangeAsync(System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.ResendEmailChangeConfirmationAsync(System.Int32,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.CancelEmailChangeAsync(System.Int32,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.IssueAndSendConfirmationAsync(TTAR.DataProviders.Models.TTRatingDB,TTAR.DataProviders.Models.PlayerModel,System.String,System.String,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <summary>
            Issues a fresh confirmation token (invalidating prior ones of the same kind) and sends the email.
            </summary>
            <param name="context">Database context used for token persistence.</param>
            <param name="user">The player for whom the confirmation token is issued.</param>
            <param name="newEmail">Target address for a change-email token, or <c>null</c> for a registration token.</param>
            <param name="recipient">Address the email is sent to.</param>
            <param name="confirmLinkFactory">Factory that builds the confirmation URL from a raw token string.</param>
            <param name="preferredLanguageCode">Language from the request; falls back to the user's stored preference.</param>
            <param name="cancellationToken">Token to observe for cancellation requests.</param>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.InvalidateOutstandingConfirmationsAsync(TTAR.DataProviders.Models.TTRatingDB,System.Int32,System.Boolean,System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Marks unused confirmation tokens for the player as used, so only the newest link works.
            </summary>
            <param name="newEmailOnly"><c>true</c> to target change-email tokens; <c>false</c> for registration tokens.</param>
            <param name="except">Token id to keep untouched (the one just created/used), if any.</param>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.UpdateVersionInformationAsync(System.Int32,System.Version,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.UpdateLocationAsync(System.Int32,NetTopologySuite.Geometries.Point,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.RefreshBySessionAsync(System.String,TTAR.API.Auth.ClientDescriptor,System.Version,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.RevokeSessionAsync(System.String,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.AccountService.RevokeAllSessionsAsync(TTAR.DataProviders.Models.PlayerModel,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="T:TTAR.API.Auth.AuthorizationPolicies">
            <summary>
            Role-based authorization policies. Each policy passes when the caller holds the policy's own role OR
            <see cref="F:TTAR.Types.Role.Admin"/> — so an admin satisfies every role-gated endpoint without being granted the other roles
            explicitly (the "Admin implies all" rule lives here, in one place, not scattered across <c>[Authorize]</c> lists
            or duplicated in the JWT claims). Names are referenced from <c>[Authorize(Policy = ...)]</c> — keep them here.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.AuthorizationPolicies.StatsAccess">
            <summary>Read admin statistics — <see cref="F:TTAR.Types.Role.StatsViewer"/> or <see cref="F:TTAR.Types.Role.Admin"/>.</summary>
        </member>
        <member name="F:TTAR.API.Auth.AuthorizationPolicies.VenueModeration">
            <summary>Moderate any venue — <see cref="F:TTAR.Types.Role.VenueModerator"/> or <see cref="F:TTAR.Types.Role.Admin"/>.</summary>
        </member>
        <member name="F:TTAR.API.Auth.AuthorizationPolicies.ChatModeration">
            <summary>Moderate our chat surface — <see cref="F:TTAR.Types.Role.ChatModerator"/> or <see cref="F:TTAR.Types.Role.Admin"/>.</summary>
        </member>
        <member name="M:TTAR.API.Auth.AuthorizationPolicies.AddTtarRolePolicies(Microsoft.AspNetCore.Authorization.AuthorizationOptions)">
            <summary>Registers all role policies. Adds one policy per privileged role, each admitting Admin as well.</summary>
        </member>
        <member name="M:TTAR.API.Auth.AuthorizationPolicies.RoleNamesSatisfying(TTAR.Types.Role)">
            <summary>
            The single definition of the "Admin implies every role" rule: the role names that satisfy a check for
            <paramref name="role"/> — the role itself plus <see cref="F:TTAR.Types.Role.Admin"/>. Both the policies above and
            <c>TtarControllerBase.IsInRole</c> resolve through here, so the super-role rule lives in exactly one place.
            </summary>
        </member>
        <member name="T:TTAR.API.Auth.AuthRedirectUrls">
            <summary>
            Builds the client callback URLs of the redirect-based external sign-ins (Google, Telegram). The result travels in
            the fragment so it never reaches a server log.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.AuthRedirectUrls.Failure(System.String,TTAR.Types.ApiResponses.ErrorCode)">
            <summary>
            Callback URL reporting a failed sign-in.
            </summary>
            <param name="redirectUri">Allowlisted client callback URI.</param>
            <param name="errorCode">The failure reason.</param>
            <returns>The callback URL with the error in its fragment.</returns>
        </member>
        <member name="T:TTAR.API.Auth.CachedStateDataFormat">
            <summary>
            Keeps the OIDC <see cref="T:Microsoft.AspNetCore.Authentication.AuthenticationProperties"/> server-side and puts only a random key into <c>state</c>.
            Telegram rejects a <c>state</c> longer than 256 characters ("state too long"), while the default data-protected
            properties (callback URL, PKCE verifier, correlation id) take ~700.
            </summary>
            <remarks>In-process cache: every instance of the API must handle both legs of a sign-in (single-instance hosting).</remarks>
        </member>
        <member name="M:TTAR.API.Auth.CachedStateDataFormat.#ctor(Microsoft.Extensions.Caching.Memory.IMemoryCache,System.TimeSpan,System.TimeProvider,Microsoft.Extensions.Logging.ILogger)">
            <summary>
            Keeps the OIDC <see cref="T:Microsoft.AspNetCore.Authentication.AuthenticationProperties"/> server-side and puts only a random key into <c>state</c>.
            Telegram rejects a <c>state</c> longer than 256 characters ("state too long"), while the default data-protected
            properties (callback URL, PKCE verifier, correlation id) take ~700.
            </summary>
            <remarks>In-process cache: every instance of the API must handle both legs of a sign-in (single-instance hosting).</remarks>
        </member>
        <member name="T:TTAR.API.Auth.ClientDescriptor">
            <summary>
            The client a session is issued to, one fact per field (persisted on <see cref="T:TTAR.DataProviders.Models.PlayerSessionModel"/>): which TTAR
            app, its version, the device the app described, the HTTP User-Agent and the IP address.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.ClientDescriptor.AppHeader">
            <summary>Request header naming the TTAR app, a <see cref="T:TTAR.Types.ClientApp"/> member name (e.g. <c>Web</c>).</summary>
        </member>
        <member name="F:TTAR.API.Auth.ClientDescriptor.VersionHeader">
            <summary>Request header carrying the client app version (e.g. <c>3.1.5.0</c>).</summary>
        </member>
        <member name="P:TTAR.API.Auth.ClientDescriptor.App">
            <summary>The TTAR app, <c>null</c> when the client did not identify itself.</summary>
        </member>
        <member name="P:TTAR.API.Auth.ClientDescriptor.AppVersion">
            <summary>Normalized app version (<see cref="T:System.Version"/> format).</summary>
        </member>
        <member name="P:TTAR.API.Auth.ClientDescriptor.Device">
            <summary>Device description reported by the mobile app, without the owner-chosen device name.</summary>
        </member>
        <member name="P:TTAR.API.Auth.ClientDescriptor.UserAgent">
            <summary>User-Agent header of the current request.</summary>
        </member>
        <member name="P:TTAR.API.Auth.ClientDescriptor.IpAddress">
            <summary>Client IP address.</summary>
        </member>
        <member name="M:TTAR.API.Auth.ClientDescriptor.FromRequest(Microsoft.AspNetCore.Http.HttpRequest,System.String,System.String,System.String,System.String)">
            <summary>
            Describes the caller of <paramref name="request"/>. Explicit values (body / query) win over the
            <see cref="F:TTAR.API.Auth.ClientDescriptor.AppHeader"/> / <see cref="F:TTAR.API.Auth.ClientDescriptor.VersionHeader"/> headers; <paramref name="clientInfo"/> may still be in a
            pre-header format, which is unpacked into the matching fields.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.ClientDescriptor.FromExternalSignIn(Microsoft.AspNetCore.Authentication.AuthenticationProperties,Microsoft.AspNetCore.Http.HttpRequest,System.String)">
            <summary>
            Describes the caller of an external sign-in callback: the app, version and device come from what
            <see cref="M:TTAR.API.Auth.ClientDescriptor.StashInto(Microsoft.AspNetCore.Authentication.AuthenticationProperties)"/> saved at the challenge, the User-Agent and IP from the callback request itself.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.ClientDescriptor.StashInto(Microsoft.AspNetCore.Authentication.AuthenticationProperties)">
            <summary>
            Saves the app, version and device into the round-trip properties of an external sign-in challenge, to be
            read back by <see cref="M:TTAR.API.Auth.ClientDescriptor.FromExternalSignIn(Microsoft.AspNetCore.Authentication.AuthenticationProperties,Microsoft.AspNetCore.Http.HttpRequest,System.String)"/>.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.ClientDescriptor.ForRotation(TTAR.API.Auth.ClientDescriptor,TTAR.DataProviders.Models.PlayerSessionModel)">
            <summary>
            The client of a rotated session: every field the current request reported, the rest carried over from the
            session being replaced (the same device).
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.ClientDescriptor.WithoutDeviceName(System.String)">
            <summary>
            Drops the owner-chosen device name from the app's device JSON; any other value is returned unchanged.
            </summary>
        </member>
        <member name="T:TTAR.API.Auth.ExternalSignInFailureAttribute">
            <summary>
            For the callback of an external sign-in, which is a top-level browser navigation: an unexpected failure returns the
            user to the client with <see cref="F:TTAR.Types.ApiResponses.ErrorCode.Exception"/> instead of a bare 500 on the API host, and is still
            logged and reported to the admin like any unhandled exception. Expected outcomes (e.g. a removed account) stay in the
            action.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.ExternalSignInFailureAttribute.#ctor(System.String)">
            <summary>
            Creates the filter for the callback of <paramref name="scheme"/>.
            </summary>
            <param name="scheme">The external authentication scheme whose callback the action completes.</param>
        </member>
        <member name="T:TTAR.API.Auth.IAccountService">
            <summary>
            User's internal operations. Need to think about union with Players kind of operations.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.AuthenticateAsync(TTAR.API.Models.Requests.AuthenticateRequest,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <summary>
            Authenticates a user by email/password
            </summary>
            <param name="request">Authentication request</param>
            <param name="client">The client, recorded on the session when one is created</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Claims and tokens</returns>
            <exception cref="T:TTAR.Exceptions.AccountRemovedException">Exception thrown when an account has been removed and cannot be authenticated</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.VerifyCredentialsAsync(System.String,System.String,System.Threading.CancellationToken)">
            <summary>
            Verifies email/password and account state (removed, email-confirmed) WITHOUT minting any token, for the
            interactive OIDC login page which establishes only a cookie — so it does not orphan an unused refresh token.
            </summary>
            <param name="email">Account email.</param>
            <param name="password">Account password.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>The player when the credentials are valid; otherwise <c>null</c>.</returns>
            <exception cref="T:TTAR.Exceptions.AccountRemovedException">Thrown when the account has been removed.</exception>
            <exception cref="T:TTAR.Exceptions.EmailNotConfirmedException">Thrown when the email is not confirmed.</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.AuthenticateOrCreateAsync(System.String,System.String,System.Boolean,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <summary>
            Authenticates a user by already validated (by SSO) email
            Creates new record if not exists.
            </summary>
            <param name="email">Email</param>
            <param name="name">User name, will be specified on creating new user</param>
            <param name="rememberMe">Whether to issue a long-lived session token</param>
            <param name="client">The client for the session record (when <paramref name="rememberMe"/> is <c>true</c>)</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Claims and tokens, session token included when <paramref name="rememberMe"/> is <c>true</c></returns>
            <exception cref="T:TTAR.Exceptions.AccountRemovedException">Exception thrown when an account has been removed and cannot be authenticated</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.CreateAuthenticateResponseAsync(TTAR.DataProviders.Models.PlayerModel,System.Threading.CancellationToken)">
            <summary>
            Authenticates a user, nothing verified
            </summary>
            <param name="user">Already authenticated user</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Claims and tokens</returns>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.CreateAuthenticateResponseAsync(TTAR.DataProviders.Models.PlayerModel,System.Boolean,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <summary>
            Authenticates a user, nothing verified. Optionally creates a long-lived session token.
            </summary>
            <param name="user">Already authenticated user</param>
            <param name="rememberMe">Whether to issue a long-lived session token</param>
            <param name="client">The client for the session record</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Claims and tokens, session token included when <paramref name="rememberMe"/> is <c>true</c></returns>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.RefreshTokenAsync(System.String,System.String,System.Version,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <summary>
            Authenticates a user with Refresh Token
            </summary>
            <param name="token">Refresh token</param>
            <param name="sessionToken">Session token value</param>
            <param name="appVersion">Latest client app version, folded into the same post-rotation Players write when newer</param>
            <param name="client">The current client, recorded on the rotated session; fields it lacks are kept from the old session</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Claims and tokens</returns>
            <exception cref="T:TTAR.Exceptions.AccountRemovedException">Exception thrown when an account has been removed and cannot be authenticated</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.RevokeTokenAsync(System.String,System.Threading.CancellationToken)">
            <summary>
            Revokes Refresh Token
            </summary>
            <param name="token">Refresh token</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Revocation result</returns>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.RevokeAllAuthTokensAsync(TTAR.DataProviders.Models.PlayerModel,System.Threading.CancellationToken)">
            <summary>
            Revokes all user's Refresh tokens
            </summary>
            <param name="player">Target user</param>
            <param name="cancellationToken">Cancellation token</param>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.RequestRemoval(System.String,System.String,System.Threading.CancellationToken)">
            <summary>
            Requests removal of a user account.
            </summary>
            <param name="email">The email address of the user.</param>
            <param name="reason">The reason for account removal.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>Status of the account removal request.</returns>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.ChangeProfileAsync(System.Int32,System.String,System.String,System.Nullable{System.Boolean},System.String,System.Nullable{System.Boolean},System.Nullable{TTAR.Types.HandSide},System.Nullable{TTAR.Types.Gender},TTAR.DataProviders.PlayerPersonalInfo,System.Threading.CancellationToken)">
            <summary>
            Changes a profile of the user
            </summary>
            <param name="userId">User id</param>
            <param name="name">User name, if specified</param>
            <param name="password">Password, if specified</param>
            <param name="shouldCopyPmToTelegram">Indicates whether private messages should be copied to Telegram</param>
            <param name="preferredLanguageCode">Preferred language code, if specified</param>
            <param name="useRttfName">Whether the displayed name follows the RTTF profile; ignored unless the link is confirmed</param>
            <param name="mainHand">
            The player's physical main hand. Storing a value sets the profile label (never moves ratings between axes)
            and dismisses the "please confirm" prompt. It is a ONE-TIME, IRREVERSIBLE choice: once set, re-sending the
            same value is an idempotent no-op, but a different value throws <see cref="T:TTAR.Exceptions.MainHandAlreadySetException"/>.
            <c>null</c> leaves it untouched (it is NOT a way to clear the hand back to "not set").
            </param>
            <param name="gender">
            The player's gender — a one-time choice like <paramref name="mainHand"/>: re-sending the same value is a no-op,
            a different one throws <see cref="T:TTAR.Exceptions.GenderAlreadySetException"/>. <c>null</c> leaves it untouched.
            </param>
            <param name="personal">
            The "Contacts and about" block, replaced as a whole (a <c>null</c> field inside clears it, including the
            other-rating links). <c>null</c> leaves the whole block untouched.
            </param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Updated player's profile</returns>
            <remarks>The login email cannot be changed here; use <see cref="M:TTAR.API.Auth.IAccountService.RequestEmailChangeAsync(System.Int32,System.String,System.String,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)"/> instead.</remarks>
            <exception cref="T:TTAR.Exceptions.PlayerNotFoundException">Thrown if either the sender or recipient is not found in the database</exception>
            <exception cref="T:TTAR.Exceptions.MainHandAlreadySetException">Thrown when changing an already-set main hand to a different value.</exception>
            <exception cref="T:System.ArgumentOutOfRangeException">Thrown when <paramref name="mainHand"/> is not a defined <see cref="T:TTAR.Types.HandSide"/>.</exception>
            <exception cref="T:TTAR.Exceptions.GenderAlreadySetException">Thrown when changing an already-set gender to a different value.</exception>
            <exception cref="T:TTAR.Exceptions.ProfileValidationException">Thrown when a field of <paramref name="personal"/> is invalid.</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.AuthenticateByTelegramTokenAsync(System.Guid,System.Boolean,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <summary>
            Authenticates a user by custom Telegram token
            </summary>
            <param name="token">Custom Telegram token</param>
            <param name="rememberMe">Whether to issue a long-lived session token</param>
            <param name="client">The client for the session record (when <paramref name="rememberMe"/> is <c>true</c>)</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Claims and tokens, session token included when <paramref name="rememberMe"/> is <c>true</c></returns>
            <exception cref="T:TTAR.Exceptions.PlayerNotFoundException">Thrown if either the sender or recipient is not found in the database</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.AuthenticateOrCreateByTelegramAsync(TTAR.API.Auth.TelegramIdentity,System.Boolean,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <summary>
            Authenticates a user signed in through Telegram OpenID Connect, creating the player on first sign-in.
            </summary>
            <param name="identity">The Telegram user asserted by the validated ID token</param>
            <param name="rememberMe">Whether to issue a long-lived session token</param>
            <param name="client">The client for the session record (when <paramref name="rememberMe"/> is <c>true</c>)</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Claims and tokens, session token included when <paramref name="rememberMe"/> is <c>true</c></returns>
            <exception cref="T:TTAR.Exceptions.AccountRemovedException">Thrown if the player's account has been removed</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.IssueTelegramLinkTokenAsync(TTAR.API.Auth.TelegramIdentity,System.Threading.CancellationToken)">
            <summary>
            Issues a server-generated custom Telegram token for the player behind a Telegram OpenID Connect sign-in
            (creating the player on first sign-in). The token proves Telegram ownership to the existing merge flow.
            </summary>
            <param name="identity">The Telegram user asserted by the validated ID token</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>The custom Telegram token accepted by <c>POST /Account/Telegram</c> and <c>PUT /Players/merge</c></returns>
            <exception cref="T:TTAR.Exceptions.AccountRemovedException">Thrown if the player's account has been removed</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.IssueLoginCodeAsync(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Mints a one-time, short-lived code for the web-delegated OIDC login handoff. Bound to the given player;
            redeemed once at <c>/connect/login-callback</c> to establish the IdP cookie.
            </summary>
            <param name="playerId">The authenticated player the code is minted for.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>The opaque code value.</returns>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.RedeemLoginCodeAsync(System.String,System.Threading.CancellationToken)">
            <summary>
            Redeems a one-time login-exchange code (single-use) and returns the associated player id.
            </summary>
            <param name="code">The code to redeem.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>The player id if the code was valid and is now consumed; otherwise <c>null</c>.</returns>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.IsAccountRemovedAsync(System.String,System.Threading.CancellationToken)">
            <summary>
            Returns whether the account is currently removed (an outstanding AccountRemovals record simulates deletion
            until it is manually cleared), so the OIDC endpoints can deny access the same way native auth does.
            </summary>
            <param name="email">The account email to check.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns><c>true</c> when a removal record exists for the email.</returns>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.RequestPasswordResetAsync(System.String,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <summary>
            Initiates a password reset: generates a single-use token and sends a reset link by email.
            Does nothing (no error) when the email is unknown, or the account has no password credential and its address
            is not verified (the link would set its first credential), so callers must not reveal account existence to the client.
            </summary>
            <param name="email">The account email.</param>
            <param name="resetLinkFactory">Builds the reset link from the generated token (e.g. a deep link).</param>
            <param name="languageCode">Preferred language for the reset email; falls back to the user's stored preference.</param>
            <param name="cancellationToken">Cancellation token</param>
            <exception cref="T:TTAR.Exceptions.AccountRemovedException">Thrown when the account has been removed.</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.ResetPasswordAsync(System.String,System.String,System.Threading.CancellationToken)">
            <summary>
            Completes a password reset using a previously issued token.
            On success, sets the new password and revokes all refresh tokens and sessions.
            </summary>
            <param name="token">The reset token received by email.</param>
            <param name="newPassword">The new password to set.</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns><c>true</c> if the password was reset; <c>false</c> if the token is invalid, expired, already used, or the password is too short.</returns>
            <exception cref="T:TTAR.Exceptions.AccountRemovedException">Thrown when the account has been removed.</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.RegisterAsync(System.String,System.String,System.String,System.Func{System.String,System.String},System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <summary>
            Registers a new account with an email and password and sends an email-confirmation link.
            The account is created unverified and cannot be authenticated until the email is confirmed.
            If the email already belongs to a password-less account (created via SSO), no password is set: the address
            owner is emailed a set-password (reset) link instead — only to a verified address, as by
            <see cref="M:TTAR.API.Auth.IAccountService.RequestPasswordResetAsync(System.String,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)"/> — so knowing an address never yields its account.
            </summary>
            <param name="email">The account email.</param>
            <param name="password">The password to set on a new account (hashed before storage).</param>
            <param name="name">Optional display name for a newly created account.</param>
            <param name="confirmLinkFactory">Builds the confirmation link from the generated token.</param>
            <param name="resetLinkFactory">Builds the set-password link for an existing password-less account.</param>
            <param name="languageCode">Preferred language for the email; falls back to English when omitted.</param>
            <param name="cancellationToken">Cancellation token</param>
            <exception cref="T:TTAR.Exceptions.AccountRemovedException">Thrown when the account has been removed.</exception>
            <exception cref="T:TTAR.Exceptions.EmailAlreadyRegisteredException">Thrown when an account with this email and a password already exists.</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.ConfirmEmailAsync(System.String,TTAR.API.Auth.ClientDescriptor,System.Boolean,System.Threading.CancellationToken)">
            <summary>
            Confirms an account email using a token from the confirmation email and logs the user in.
            </summary>
            <param name="token">The confirmation token received by email.</param>
            <param name="client">The client, recorded on the session when one is created.</param>
            <param name="rememberMe">Whether to issue a long-lived session token.</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Claims and tokens on success; <c>null</c> if the token is invalid, expired or already used.</returns>
            <exception cref="T:TTAR.Exceptions.AccountRemovedException">Thrown when the account has been removed.</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.ResendConfirmationAsync(System.String,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <summary>
            Re-sends the email-confirmation link for an unverified account.
            Does nothing (no error) when the email is unknown, already verified, or the account has no password,
            so callers must not reveal account existence to the client.
            </summary>
            <param name="email">The account email.</param>
            <param name="confirmLinkFactory">Builds the confirmation link from the generated token.</param>
            <param name="languageCode">Preferred language for the confirmation email; falls back to the user's stored preference.</param>
            <param name="cancellationToken">Cancellation token</param>
            <exception cref="T:TTAR.Exceptions.AccountRemovedException">Thrown when the account has been removed.</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.SendEmailVerificationAsync(System.Int32,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <summary>
            Sends the signed-in player a link confirming their current address, password or not — notification emails go
            only to a confirmed one. The link is an email change to the same address (<see cref="M:TTAR.API.Auth.IAccountService.ConfirmEmailChangeAsync(System.String,System.Threading.CancellationToken)"/>),
            which signs nobody in. Does nothing when the player has no address, it is already confirmed or a change of
            it is pending; throttled like <see cref="M:TTAR.API.Auth.IAccountService.RequestEmailChangeAsync(System.Int32,System.String,System.String,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)"/>.
            </summary>
            <param name="userId">The signed-in player.</param>
            <param name="confirmEmailChangeLinkFactory">Builds the email-change confirmation link from the generated token.</param>
            <param name="languageCode">Preferred language for the email; falls back to the user's stored preference.</param>
            <param name="cancellationToken">Cancellation token</param>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.ChangePasswordAsync(System.Int32,System.String,System.String,System.Boolean,TTAR.API.Auth.ClientDescriptor,System.Threading.CancellationToken)">
            <summary>
            Changes the password of an authenticated user.
            Verifies the current password first (unless the account has no password yet — e.g. SSO-only — in
            which case it sets the initial password). On success, revokes <b>all</b> existing refresh tokens and
            sessions (logging the account out everywhere) and issues a fresh set of tokens for the current device,
            so the caller stays signed in without re-authenticating.
            </summary>
            <param name="userId">User id.</param>
            <param name="currentPassword">The current password; ignored when the account has no password yet.</param>
            <param name="newPassword">The new password to set.</param>
            <param name="rememberMe">Whether the re-issued tokens include a long-lived session token for the current device.</param>
            <param name="client">The client for the re-issued session (when <paramref name="rememberMe"/> is <c>true</c>); its User-Agent and IP also go to the security audit log.</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>
            A fresh <see cref="T:TTAR.API.Models.Responses.AuthenticateResponse"/> (new JWT, refresh token, and session token when
            <paramref name="rememberMe"/> is <c>true</c>) on success; <c>null</c> if the current password is wrong
            or the new password is too short.
            </returns>
            <exception cref="T:TTAR.Exceptions.PlayerNotFoundException">Thrown when the user is not found.</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.RequestEmailChangeAsync(System.Int32,System.String,System.String,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <summary>
            Starts the change-email flow: stores the new address as pending and sends a confirmation link to it.
            The login email is only switched once the new address is confirmed (see <see cref="M:TTAR.API.Auth.IAccountService.ConfirmEmailChangeAsync(System.String,System.Threading.CancellationToken)"/>).
            Requires the account to already have a password and verifies the supplied current password first; a
            password-less (SSO/Telegram) account is refused with <see cref="F:TTAR.API.Models.EmailChangeResult.PasswordRequired"/> and
            must set a password before changing its login email.
            </summary>
            <param name="userId">User id.</param>
            <param name="newEmail">The new email address to switch to.</param>
            <param name="currentPassword">The current password; required. The request fails with <see cref="F:TTAR.API.Models.EmailChangeResult.InvalidPassword"/> if it is null/empty or incorrect.</param>
            <param name="confirmLinkFactory">Builds the confirmation link from the generated token.</param>
            <param name="languageCode">Preferred language for the confirmation email; falls back to the user's stored preference.</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>
            The outcome of the request: <see cref="F:TTAR.API.Models.EmailChangeResult.ConfirmationSent"/>,
            <see cref="F:TTAR.API.Models.EmailChangeResult.InvalidPassword"/>, <see cref="F:TTAR.API.Models.EmailChangeResult.EmailTaken"/>, or
            <see cref="F:TTAR.API.Models.EmailChangeResult.PasswordRequired"/> for a password-less account.
            </returns>
            <exception cref="T:TTAR.Exceptions.PlayerNotFoundException">Thrown when the user is not found.</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.ConfirmEmailChangeAsync(System.String,System.Threading.CancellationToken)">
            <summary>
            Completes the change-email flow using a token from the confirmation email.
            Sets the login email to the previously pending address and marks it confirmed.
            </summary>
            <param name="token">The confirmation token received by email at the new address.</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns><c>true</c> on success; <c>false</c> if the token is invalid, expired, already used, or the address became taken.</returns>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.ResendEmailChangeConfirmationAsync(System.Int32,System.Func{System.String,System.String},System.String,System.Threading.CancellationToken)">
            <summary>
            Re-sends the email-change confirmation link to the pending address for an authenticated user.
            Does nothing (no error) when no email change is pending, so callers must not reveal internal state to the client.
            Subject to the same rate-limiting as the initial request.
            </summary>
            <param name="userId">The authenticated user's id.</param>
            <param name="confirmLinkFactory">Builds the confirmation link from the generated token.</param>
            <param name="languageCode">Preferred language for the confirmation email; falls back to the user's stored preference.</param>
            <param name="cancellationToken">Cancellation token</param>
            <exception cref="T:TTAR.Exceptions.PlayerNotFoundException">Thrown when the user is not found.</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.CancelEmailChangeAsync(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Cancels a pending email change initiated by the user: clears <c>PendingEmail</c> and invalidates
            any outstanding change-email confirmation tokens. Does nothing when no change is pending.
            </summary>
            <param name="userId">The authenticated user's id.</param>
            <param name="cancellationToken">Cancellation token</param>
            <exception cref="T:TTAR.Exceptions.PlayerNotFoundException">Thrown when the user is not found.</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.UpdateVersionInformationAsync(System.Int32,System.Version,System.Threading.CancellationToken)">
            <summary>
            Updates version information
            </summary>
            <param name="userId">User id</param>
            <param name="version">Version of the mobile application</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Updated <seealso cref="T:TTAR.DataProviders.Models.PlayerModel"/></returns>
            <exception cref="T:TTAR.Exceptions.PlayerNotFoundException">Thrown if either the sender or recipient is not found in the database</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.UpdateLocationAsync(System.Int32,NetTopologySuite.Geometries.Point,System.Threading.CancellationToken)">
            <summary>
            Updates user geographical information
            </summary>
            <param name="userId">User id</param>
            <param name="location">User's location</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Updated <seealso cref="T:TTAR.DataProviders.Models.PlayerModel"/> or <c>null</c> if <paramref name="location"/> not set</returns>
            <exception cref="T:TTAR.Exceptions.PlayerNotFoundException">Thrown if either the sender or recipient is not found in the database</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.RefreshBySessionAsync(System.String,TTAR.API.Auth.ClientDescriptor,System.Version,System.Threading.CancellationToken)">
            <summary>
            Re-issues JWT and refresh tokens using a long-lived session token.
            Rotates the session token on success (sliding session).
            </summary>
            <param name="sessionToken">Session token value</param>
            <param name="client">The current client, recorded on the rotated session; fields it lacks are kept from the old session</param>
            <param name="appVersion">Latest client app version, folded into the same post-rotation Players write when newer</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>New claims and tokens, or <c>null</c> if the session token is invalid/expired</returns>
            <exception cref="T:TTAR.Exceptions.AccountRemovedException">Thrown when the account has been removed</exception>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.RevokeSessionAsync(System.String,System.Threading.CancellationToken)">
            <summary>
            Revokes a single session token (e.g. logout on one device).
            </summary>
            <param name="sessionToken">Session token value</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns><c>true</c> if revoked; <c>false</c> if not found or already inactive</returns>
        </member>
        <member name="M:TTAR.API.Auth.IAccountService.RevokeAllSessionsAsync(TTAR.DataProviders.Models.PlayerModel,System.Threading.CancellationToken)">
            <summary>
            Revokes all active session tokens for the given player (e.g. account deletion).
            </summary>
            <param name="player">Target player</param>
            <param name="cancellationToken">Cancellation token</param>
        </member>
        <member name="T:TTAR.API.Auth.IRoleResolver">
            <summary>
            Single source of truth for the privileged roles a player holds. Centralised so every profile-returning
            endpoint (login, profile read, profile edit, RTTF reload) exposes the same roles for the same player.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.IRoleResolver.GetRoles(TTAR.DataProviders.Models.PlayerModel)">
            <summary>
            Resolves the roles the given player holds.
            </summary>
            <param name="player">The player to resolve roles for.</param>
            <returns>The roles held; empty for an ordinary user.</returns>
        </member>
        <member name="T:TTAR.API.Auth.ITokenManager">
            <summary>
            Operates with different tokens, including SSO
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.ITokenManager.GenerateRefreshToken">
            <summary>
            Generates Refresh token
            </summary>
            <returns>Refresh token</returns>
        </member>
        <member name="M:TTAR.API.Auth.ITokenManager.GenerateSessionToken(System.Int32,TTAR.API.Auth.ClientDescriptor)">
            <summary>
            Generates a long-lived session token for "remember me" functionality
            </summary>
            <param name="playerId">Player id to associate the session with</param>
            <param name="client">The client the session is issued to, <c>null</c> when unknown</param>
            <returns>Session token model</returns>
        </member>
        <member name="M:TTAR.API.Auth.ITokenManager.GetBearerToken(TTAR.DataProviders.Models.PlayerModel)">
            <summary>
            Creates Bearer token
            </summary>
            <param name="user">User settings</param>
            <returns>Bearer token</returns>
        </member>
        <member name="M:TTAR.API.Auth.ITokenManager.GoogleAuthenticateAsync(Microsoft.AspNetCore.Http.HttpRequest)">
            <summary>
            Performs Google web authentication
            </summary>
            <param name="request">Original HTTP request</param>
            <returns>List of claims if authenticated; <c>null</c> otherwise</returns>
        </member>
        <member name="T:TTAR.API.Auth.OpenId.AvatarUrlBuilder">
            <summary>
            Builds the absolute avatar URL for the OIDC <c>picture</c> claim. The app otherwise serves avatars via the
            relative <c>Images/avatar/{name}</c> path (see ImagesController); partners need an absolute URL, so it is
            prefixed with the issuer.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.OpenId.AvatarUrlBuilder.Build(TTAR.DataProviders.Models.PlayerModel,System.String)">
            <summary>
            Returns the absolute avatar URL for the player, or <c>null</c> when the player has no avatar image.
            </summary>
            <param name="player">The player whose avatar is resolved (Images must be loaded).</param>
            <param name="issuer">Absolute issuer base URL (e.g. <c>https://ttar.app</c>).</param>
        </member>
        <member name="T:TTAR.API.Auth.OpenId.IdpSession">
            <summary>
            The "Login with TTAR" IdP session: the principal kept in the default cookie scheme by the sign-in points (Razor
            login page, web-delegated login callback) and read back by <c>/connect/authorize</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.OpenId.IdpSession.CreatePrincipal(System.Int32,System.DateTimeOffset,System.Collections.Generic.IEnumerable{System.Security.Claims.Claim})">
            <summary>
            Builds the cookie principal for a player who has just signed in interactively.
            </summary>
            <param name="playerId">The signed-in player.</param>
            <param name="authenticatedAt">The moment of the interactive sign-in (becomes the OIDC <c>auth_time</c>).</param>
            <param name="extraClaims">Additional claims to keep in the cookie.</param>
        </member>
        <member name="M:TTAR.API.Auth.OpenId.IdpSession.GetAuthTime(System.Security.Claims.ClaimsPrincipal)">
            <summary>
            Reads the interactive sign-in time from a cookie (or authorization/refresh token) principal.
            </summary>
            <returns>The sign-in time, or <c>null</c> for a session established before <c>auth_time</c> was stamped.</returns>
        </member>
        <member name="M:TTAR.API.Auth.OpenId.IdpSession.CreateAuthTimeClaim(System.DateTimeOffset)">
            <summary>
            Creates the OIDC <c>auth_time</c> claim (Unix seconds) destined for the identity token.
            </summary>
        </member>
        <member name="T:TTAR.API.Auth.OpenId.IOpenIdClaimsService">
            <summary>
            Maps a <see cref="T:TTAR.DataProviders.Models.PlayerModel"/> to the OpenID Connect claims granted by a set of scopes, and assigns each
            claim its token destinations (id_token and/or access_token).
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.OpenId.IOpenIdClaimsService.BuildClaims(TTAR.DataProviders.Models.PlayerModel,System.Collections.Generic.IEnumerable{System.String})">
            <summary>
            Builds the claims identity for the given player and granted scopes. The <c>sub</c> claim (player id) is
            always present; other claims are added only when their scope is granted and the underlying value exists.
            </summary>
            <param name="player">The authenticated player (Hands and Images should be loaded for full claims).</param>
            <param name="grantedScopes">The scopes granted to the client for this authorization.</param>
            <returns>A list of claims with per-claim <see cref="P:System.Security.Claims.Claim.Properties"/> destinations set.</returns>
        </member>
        <member name="T:TTAR.API.Auth.OpenId.OpenIdClaimsService">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.OpenId.OpenIdClaimsService.#ctor(TTAR.API.Configuration.OpenIddictOptions)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.OpenId.OpenIdClaimsService.BuildClaims(TTAR.DataProviders.Models.PlayerModel,System.Collections.Generic.IEnumerable{System.String})">
            <inheritdoc/>
        </member>
        <member name="T:TTAR.API.Auth.OpenId.TtarClaims">
            <summary>
            Custom claim names surfaced by the "Login with TTAR" provider, in addition to the standard OIDC claims.
            Distinct from the scope names in <see cref="T:TTAR.API.Auth.OpenId.TtarScopes"/> (the scope gates the claim; the claim is the payload
            key). Underscore form (not the colon'd scope name) so the key is a plain JWT/JSON identifier.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.OpenId.TtarClaims.Rating">
            <summary>
            Per-hand rating data as a JSON array string. Gated by the <see cref="F:TTAR.API.Auth.OpenId.TtarScopes.Rating"/> scope; surfaced
            in <c>/userinfo</c> (access-token destination), kept out of the id_token.
            </summary>
        </member>
        <member name="T:TTAR.API.Auth.OpenId.TtarScopes">
            <summary>
            Custom OpenIddict scope names exposed by the "Login with TTAR" provider, in addition to the standard
            <c>openid</c>/<c>profile</c>/<c>email</c>/<c>offline_access</c>.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.OpenId.TtarScopes.Rating">
            <summary>
            Grants the player's rating data (per-hand rating, games, qualification) in <c>/userinfo</c>.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.OpenId.TtarScopes.Games">
            <summary>
            Grants the player's aggregate game statistics in <c>/userinfo</c>.
            </summary>
        </member>
        <member name="T:TTAR.API.Auth.RoleResolver">
            <summary>
            The single place player roles are resolved. Roles come from the persisted <see cref="T:TTAR.DataProviders.Abstractions.IPlayerRolesStore"/> (the
            <c>PlayerRoles</c> table), unioned with a hard-wired safety net: the configured super administrator is always an
            <see cref="F:TTAR.Types.Role.Admin"/>, so a bad/empty/unreadable role table can never lock the operator out of the admin
            surface. The "Admin implies every other role" rule is NOT applied here (it would bloat the JWT with all roles) —
            it lives in the authorization policies, which OR Admin into each role check.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.RoleResolver.#ctor(TTAR.Configuration.TtarConfiguration,TTAR.DataProviders.Abstractions.IPlayerRolesStore,Microsoft.Extensions.Logging.ILogger{TTAR.API.Auth.RoleResolver})">
            <summary>Composed-host constructor: the persisted store is required, so a mis-wired host fails fast.</summary>
        </member>
        <member name="M:TTAR.API.Auth.RoleResolver.#ctor(TTAR.Configuration.TtarConfiguration)">
            <summary>Test-only constructor: super-admin-by-id behaviour with no database.</summary>
        </member>
        <member name="M:TTAR.API.Auth.RoleResolver.GetRoles(TTAR.DataProviders.Models.PlayerModel)">
            <inheritdoc/>
        </member>
        <member name="T:TTAR.API.Auth.TelegramIdentity">
            <summary>
            A Telegram user as asserted by a validated Telegram OpenID Connect ID token.
            </summary>
            <param name="TelegramUserId">Numeric Telegram user id (the same id the bot sees).</param>
            <param name="Name">Display name from the Telegram profile.</param>
            <param name="Username">Telegram <c>@username</c> without the <c>@</c>; <c>null</c> when the user has none.</param>
            <param name="PictureUrl">Profile photo URL, if any.</param>
            <param name="PhoneNumber">Telegram-verified phone number in E.164 (<c>+&lt;digits&gt;</c>), if the user shared it.</param>
            <param name="BotAccessGranted">Whether the user allowed the bot to message them (<c>telegram:bot_access</c>).</param>
        </member>
        <member name="M:TTAR.API.Auth.TelegramIdentity.#ctor(System.Int64,System.String,System.String,System.String,System.String,System.Boolean)">
            <summary>
            A Telegram user as asserted by a validated Telegram OpenID Connect ID token.
            </summary>
            <param name="TelegramUserId">Numeric Telegram user id (the same id the bot sees).</param>
            <param name="Name">Display name from the Telegram profile.</param>
            <param name="Username">Telegram <c>@username</c> without the <c>@</c>; <c>null</c> when the user has none.</param>
            <param name="PictureUrl">Profile photo URL, if any.</param>
            <param name="PhoneNumber">Telegram-verified phone number in E.164 (<c>+&lt;digits&gt;</c>), if the user shared it.</param>
            <param name="BotAccessGranted">Whether the user allowed the bot to message them (<c>telegram:bot_access</c>).</param>
        </member>
        <member name="P:TTAR.API.Auth.TelegramIdentity.TelegramUserId">
            <summary>Numeric Telegram user id (the same id the bot sees).</summary>
        </member>
        <member name="P:TTAR.API.Auth.TelegramIdentity.Name">
            <summary>Display name from the Telegram profile.</summary>
        </member>
        <member name="P:TTAR.API.Auth.TelegramIdentity.Username">
            <summary>Telegram <c>@username</c> without the <c>@</c>; <c>null</c> when the user has none.</summary>
        </member>
        <member name="P:TTAR.API.Auth.TelegramIdentity.PictureUrl">
            <summary>Profile photo URL, if any.</summary>
        </member>
        <member name="P:TTAR.API.Auth.TelegramIdentity.PhoneNumber">
            <summary>Telegram-verified phone number in E.164 (<c>+&lt;digits&gt;</c>), if the user shared it.</summary>
        </member>
        <member name="P:TTAR.API.Auth.TelegramIdentity.BotAccessGranted">
            <summary>Whether the user allowed the bot to message them (<c>telegram:bot_access</c>).</summary>
        </member>
        <member name="F:TTAR.API.Auth.TelegramIdentity.BotAccessClaim">
            <summary>
            Claim added to the sign-in principal when the token endpoint reported <c>telegram:bot_access</c> as granted.
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.TelegramIdentity.FromClaims(System.Security.Claims.ClaimsPrincipal)">
            <summary>
            Builds the identity from the claims of a Telegram OIDC sign-in (raw JWT claim names, no inbound mapping).
            </summary>
            <param name="user">The principal produced by the Telegram OIDC handler.</param>
            <returns>The identity, or <c>null</c> when no numeric Telegram user id is present.</returns>
        </member>
        <member name="M:TTAR.API.Auth.TelegramIdentity.NormalizePhoneNumber(System.String)">
            <summary>
            Normalizes a phone number to E.164 (<c>+</c> followed by 7–15 digits); Telegram sends digits without <c>+</c>.
            </summary>
            <param name="phoneNumber">Raw phone number.</param>
            <returns>The normalized number, or <c>null</c> when absent or not a plausible phone number.</returns>
        </member>
        <member name="T:TTAR.API.Auth.TelegramOidcDefaults">
            <summary>
            Constants of the Telegram OpenID Connect sign-in (Telegram Login in OIDC mode, configured in BotFather).
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.TelegramOidcDefaults.AuthenticationScheme">
            <summary>
            Authentication scheme name of the Telegram OIDC handler.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.TelegramOidcDefaults.SignInScheme">
            <summary>
            Short-lived cookie scheme holding the Telegram result between the OIDC callback and the response endpoint.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.TelegramOidcDefaults.Authority">
            <summary>
            OIDC issuer / discovery authority.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.TelegramOidcDefaults.CallbackPath">
            <summary>
            Redirect URI registered in BotFather ("Allowed URLs") for every API environment.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.TelegramOidcDefaults.BotAccessScope">
            <summary>
            Scope that lets the bot message the user after sign-in.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.TelegramOidcDefaults.ClientRedirectItem">
            <summary>
            Authentication-properties item carrying the client's (already allowlisted) redirect URI through the round
            trip, so a failed or cancelled sign-in can still be reported back to the client.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.TelegramOidcDefaults.FlowIdItem">
            <summary>
            Authentication-properties item carrying a short random id of one sign-in attempt, so its log lines (started,
            returned, failed, abandoned) can be joined.
            </summary>
        </member>
        <member name="T:TTAR.API.Auth.TelegramOidcMode">
            <summary>
            What a Telegram OIDC sign-in is used for.
            </summary>
        </member>
        <member name="F:TTAR.API.Auth.TelegramOidcMode.Login">
            <summary>Sign in (or sign up) and return the TTAR tokens.</summary>
        </member>
        <member name="F:TTAR.API.Auth.TelegramOidcMode.Link">
            <summary>Prove Telegram ownership and return a custom Telegram token for merging into the current account.</summary>
        </member>
        <member name="T:TTAR.API.Auth.TokenManager">
            <summary>
            Operates with different tokens, including SSO
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.TokenManager.#ctor(TTAR.API.Configuration.AuthOptions,TTAR.API.Auth.IRoleResolver)">
            <summary>
            Operates with different tokens, including SSO
            </summary>
        </member>
        <member name="M:TTAR.API.Auth.TokenManager.GoogleAuthenticateAsync(Microsoft.AspNetCore.Http.HttpRequest)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.TokenManager.GetBearerToken(System.Collections.Generic.List{System.Security.Claims.Claim})">
            <summary>
            Creates Bearer token
            </summary>
            <param name="claims">List of user's claims</param>
            <returns>Bearer token</returns>
        </member>
        <member name="M:TTAR.API.Auth.TokenManager.GetBearerToken(TTAR.DataProviders.Models.PlayerModel)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.TokenManager.GenerateRefreshToken">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Auth.TokenManager.GenerateSessionToken(System.Int32,TTAR.API.Auth.ClientDescriptor)">
            <inheritdoc/>
        </member>
        <member name="T:TTAR.API.Configuration.AppSettings">
            <summary>
            The application settings
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AppSettings.BotName">
            <summary>
            Telegram bot name
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AppSettings.MobileAppScheme">
            <summary>
            Mobile application scheme name for organizing callbacks
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AppSettings.PasswordResetWebUrl">
            <summary>
            Base web URL used to build the password reset link sent by email
            (e.g. <c>https://ttar.app</c>). The link opens the mobile app via
            Universal/App Links when installed, otherwise the web reset page.
            </summary>
        </member>
        <member name="M:TTAR.API.Configuration.AppSettings.ConfirmEmailUrl(System.String)">
            <summary>The emailed link confirming the account's address by its <paramref name="token"/>.</summary>
        </member>
        <member name="M:TTAR.API.Configuration.AppSettings.ConfirmEmailChangeUrl(System.String)">
            <summary>The emailed link confirming an address change (or the current address) by its <paramref name="token"/>.</summary>
        </member>
        <member name="M:TTAR.API.Configuration.AppSettings.PasswordResetUrl(System.String)">
            <summary>
            The emailed link setting a new password by its <paramref name="token"/>: an https link that opens the mobile app
            via Universal/App Links when installed, otherwise the web reset page.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AppSettings.Cors">
            <summary>
            Gets or sets the list of allowed CORS origins for the application.
            </summary>
            <remarks>Each origin should be specified as a valid URI. Use "*" to allow all origins, but be
            cautious as this  may expose the application to security risks. If the array is empty, no origins will be
            allowed.</remarks>
        </member>
        <member name="P:TTAR.API.Configuration.AppSettings.AllowedAuthRedirectUris">
            <summary>
            Web callback URIs (e.g. <c>https://ttar.app/auth</c>) that an external sign-in (Google, Telegram) may return
            its tokens to. The mobile default <c>{MobileAppScheme}://auth</c> is always allowed and need not be listed.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AppSettings.DefaultAuthRedirectUri">
            <summary>
            Default callback of an external sign-in when the client passes no <c>redirectUri</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Configuration.AppSettings.IsAllowedAuthRedirectUri(System.String)">
            <summary>
            Checks whether an external sign-in may hand its tokens to <paramref name="redirectUri"/>: <c>null</c> (the
            mobile default) or an exact scheme + host + port + path match against the allowlist, with no query or fragment.
            </summary>
            <param name="redirectUri">The client-supplied redirect URI.</param>
            <returns><c>true</c> when the URI is allowed.</returns>
        </member>
        <member name="T:TTAR.API.Configuration.AuthOptions">
            <summary>
            Options to configure Bearer token
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AuthOptions.Issuer">
            <summary>
            The token issuer
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AuthOptions.Audience">
            <summary>
            The token consumer
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AuthOptions.SecretKey">
            <summary>
            Secret key for token encoding
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AuthOptions.TokenExpirationMinutes">
            <summary>
            Bearer token expiration time in minutes
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AuthOptions.RefreshTokenExpirationDays">
            <summary>
            Refresh Token expiration time in days
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AuthOptions.TokenGracePeriodSeconds">
            <summary>
            Grace period in seconds during which a recently revoked refresh or session token can be reused.
            Protects against connection drops during token refresh.
            Set to 0 to disable.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AuthOptions.UnusedReplacementGraceSeconds">
            <summary>
            Longer window (seconds since revocation) during which a rotated refresh or session token can still be replayed
            while its replacement has never been used. Covers a response lost after the rotation (e.g. the web's
            server-side refresh whose page never reached the browser). Set to 0 to disable.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AuthOptions.SessionIdLifetimeDays">
            <summary>
            Session token (remember me) expiration time in days.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AuthOptions.PasswordResetTokenExpirationMinutes">
            <summary>
            Password reset token expiration time in minutes.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AuthOptions.EmailConfirmationTokenExpirationMinutes">
            <summary>
            Email confirmation token expiration time in minutes (registration and change-email flows).
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.AuthOptions.LoginExchangeTokenExpirationSeconds">
            <summary>
            One-time login-exchange code lifetime in seconds (web-delegated OIDC login handoff). Kept very short —
            the code only needs to survive the single callback hop from the web client to the API.
            </summary>
        </member>
        <member name="M:TTAR.API.Configuration.AuthOptions.GetSymmetricSecurityKey">
            <summary>
            Security keys for signing credentials
            </summary>
            <returns>Security keys</returns>
        </member>
        <member name="T:TTAR.API.Configuration.DonationOptions">
            <summary>
            Project expenses and support (section <c>Donations</c>).
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationOptions.MonthlyExpenses">
            <summary>
            Operating expenses of the running month, US dollars. When a month is over, the value of that moment is fixed
            as its expenses for good. <c>0</c> switches the section off: the endpoints return 204 and nothing is fixed.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationOptions.Methods">
            <summary>
            The payment methods of the support sheet, in the order shown (those meant for the caller's country first).
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationOptions.IsValid">
            <summary>
            The value fits <c>DonationMonths.Expenses</c>, <c>decimal(10, 2)</c>: a closed month keeps it exactly.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationOptions.MethodsAreValid">
            <summary>
            Every method has a unique id; an external one has an address, a transfer a phone, an address or a card. An
            address is absolute https, a phone E.164, a card 13–19 digits passing Luhn, a holder Latin letters, a country
            a known upper-case ISO alpha-2 code; a method lists either its countries or its excepted ones.
            </summary>
        </member>
        <member name="M:TTAR.API.Configuration.DonationOptions.PhonePattern">
            <remarks>
            Pattern:<br/>
            <code>^\\+[1-9][0-9]{7,14}\\z</code><br/>
            Explanation:<br/>
            <code>
            ○ Match if at the beginning of the string.<br/>
            ○ Match '+'.<br/>
            ○ Match a character in the set [1-9].<br/>
            ○ Match a character in the set [0-9] atomically at least 7 and at most 14 times.<br/>
            ○ Match if at the end of the string.<br/>
            </code>
            </remarks>
        </member>
        <member name="M:TTAR.API.Configuration.DonationOptions.CardPattern">
            <remarks>
            Pattern:<br/>
            <code>^[0-9]{13,19}\\z</code><br/>
            Explanation:<br/>
            <code>
            ○ Match if at the beginning of the string.<br/>
            ○ Match a character in the set [0-9] atomically at least 13 and at most 19 times.<br/>
            ○ Match if at the end of the string.<br/>
            </code>
            </remarks>
        </member>
        <member name="M:TTAR.API.Configuration.DonationOptions.HolderPattern">
            <remarks>
            Pattern:<br/>
            <code>^[A-Za-z][A-Za-z .'-]*\\z</code><br/>
            Explanation:<br/>
            <code>
            ○ Match if at the beginning of the string.<br/>
            ○ Match an ASCII letter.<br/>
            ○ Match a character in the set [ '\-.A-Za-z] atomically any number of times.<br/>
            ○ Match if at the end of the string.<br/>
            </code>
            </remarks>
        </member>
        <member name="M:TTAR.API.Configuration.DonationOptions.CountryPattern">
            <remarks>
            Pattern:<br/>
            <code>^[A-Z]{2}\\z</code><br/>
            Explanation:<br/>
            <code>
            ○ Match if at the beginning of the string.<br/>
            ○ Match a character in the set [A-Z] exactly 2 times.<br/>
            ○ Match if at the end of the string.<br/>
            </code>
            </remarks>
        </member>
        <member name="T:TTAR.API.Configuration.DonationMethodOptions">
            <summary>
            A payment method of the support sheet.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationMethodOptions.Id">
            <summary>
            The client's key of the method: <c>boosty</c>, <c>flitt</c>, <c>bog</c>, <c>gpay</c>, <c>erip-phone</c>,
            <c>erip-qr</c>, <c>card-belkart</c>, <c>card-belkart-by</c>, <c>card-mastercard</c>, <c>card-visa</c>.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationMethodOptions.Kind">
            <summary>How the method is paid.</summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationMethodOptions.Url">
            <summary>
            The page an <see cref="F:TTAR.API.Configuration.DonationMethodKind.External"/> method opens, or the payment link (shown as a QR code) of a
            <see cref="F:TTAR.API.Configuration.DonationMethodKind.Transfer"/>. A fixed address: nothing about the player is ever added to it
            (payments are anonymous).
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationMethodOptions.Phone">
            <summary>The recipient's phone of a <see cref="F:TTAR.API.Configuration.DonationMethodKind.Transfer"/>, E.164 (<c>+375291234567</c>).</summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationMethodOptions.Bank">
            <summary>The recipient's bank of a <see cref="F:TTAR.API.Configuration.DonationMethodKind.Transfer"/>, as the payer finds it in their bank app.</summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationMethodOptions.Card">
            <summary>The recipient's card number of a <see cref="F:TTAR.API.Configuration.DonationMethodKind.Transfer"/>, digits only.</summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationMethodOptions.Holder">
            <summary>
            The cardholder's name in Latin letters as on the card: a cross-border card transfer is declined without it.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationMethodOptions.Countries">
            <summary>
            ISO 3166-1 alpha-2 codes, upper case: the method is offered only to callers in these countries, ahead of the
            methods for everyone. Empty — offered to everyone. Never sent to the client.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.DonationMethodOptions.ExceptCountries">
            <summary>
            ISO 3166-1 alpha-2 codes, upper case: a method for everyone withheld from callers in these countries (still
            offered when the caller's country is unknown). Not combined with <see cref="P:TTAR.API.Configuration.DonationMethodOptions.Countries"/>. Never sent to the client.
            </summary>
        </member>
        <member name="T:TTAR.API.Configuration.DonationMethodKind">
            <summary>
            How a payment method is paid.
            </summary>
        </member>
        <member name="F:TTAR.API.Configuration.DonationMethodKind.External">
            <summary>An external site that chooses the amount and the frequency itself (Boosty).</summary>
        </member>
        <member name="F:TTAR.API.Configuration.DonationMethodKind.Acquiring">
            <summary>Card acquiring; the amount and the frequency are chosen in the sheet.</summary>
        </member>
        <member name="F:TTAR.API.Configuration.DonationMethodKind.Wallet">
            <summary>A wallet (Google Pay); the amount and the frequency are chosen in the sheet.</summary>
        </member>
        <member name="F:TTAR.API.Configuration.DonationMethodKind.Transfer">
            <summary>
            A transfer the payer makes in their own bank app (ЕРИП in Belarus, a card-to-card transfer): the sheet shows the
            recipient's phone and bank, a QR code of the payment link or a card and its holder; the amount is entered in
            the app.
            </summary>
        </member>
        <member name="T:TTAR.API.Configuration.IdempotencyOptions">
            <summary>
            <c>Idempotency-Key</c> support of the API writes (section <c>Idempotency</c>).
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.IdempotencyOptions.Enabled">
            <summary>
            Master switch. When <c>false</c>, the key is ignored and <c>Idempotency-Supported</c> is not sent, so clients
            stop retrying writes.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.IdempotencyOptions.Retention">
            <summary>
            How long a key is remembered. Clients rely on at least a day.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.IdempotencyOptions.InProgressTimeout">
            <summary>
            How long a running request holds its key. A duplicate gets 409 in-progress meanwhile; afterwards the attempt
            is presumed dead (process killed mid-request) and a retry runs the request again.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.IdempotencyOptions.MaxResponseBytes">
            <summary>
            Largest response body that is remembered. A larger response is not stored, so its retry runs again.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.IdempotencyOptions.CleanupInterval">
            <summary>
            How often expired keys are deleted.
            </summary>
        </member>
        <member name="T:TTAR.API.Configuration.OpenIddictOptions">
            <summary>
            Options for the "Login with TTAR" OpenID Connect provider (OpenIddict server). Kept separate from
            <see cref="T:TTAR.API.Configuration.AuthOptions"/>, whose HS256 secret drives the internal mobile/SPA JWT — a different mechanism.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictOptions.Issuer">
            <summary>
            Absolute issuer URL of this IdP (the API origin, e.g. <c>https://api.ttar.app</c>). Also used to build
            absolute URLs (avatar <c>picture</c> claim) and must match what partners configure. Required.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictOptions.WebLoginUrl">
            <summary>
            Base URL of the web client's dedicated OIDC-handoff login page (e.g. <c>https://ttar.app/oidc/login</c>).
            When set, an unauthenticated <c>/connect/authorize</c> redirects here (carrying <c>returnUrl</c>) instead of
            the built-in Razor login page. When empty (local dev / tests), the Razor login page is used.
            </summary>
        </member>
        <member name="F:TTAR.API.Configuration.OpenIddictOptions.WebClientId">
            <summary>
            The <c>client_id</c> the web client sends to <c>/connect/logout</c>. A first-party, end-session-only client:
            it has no redirect URIs and no grants, so it can end the IdP session but never obtain tokens.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictOptions.WebPostLogoutRedirectUris">
            <summary>
            Web pages the browser may return to after the web client's own logout ends the IdP session (e.g.
            <c>https://ttar.app/login</c>). Registered as the post-logout redirect URIs of <see cref="F:TTAR.API.Configuration.OpenIddictOptions.WebClientId"/>, matched
            exactly. When empty, that client is not registered (and removed if it exists), so the web cannot end the session.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictOptions.AccessTokenLifetimeMinutes">
            <summary>
            Access-token lifetime in minutes.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictOptions.RefreshTokenLifetimeDays">
            <summary>
            Refresh-token lifetime in days (issued to partners that request <c>offline_access</c>).
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictOptions.DataProtectionKeysPath">
            <summary>
            Filesystem path where Data Protection keys are persisted (must survive restarts so the interactive
            authorize/consent flow's cookie stays valid). Required in non-Development environments.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictOptions.SigningCertificatePath">
            <summary>
            Path to the X.509 PFX used to sign tokens (production). When null, a development signing certificate is used.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictOptions.SigningCertificatePassword">
            <summary>
            Password for <see cref="P:TTAR.API.Configuration.OpenIddictOptions.SigningCertificatePath"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictOptions.EncryptionCertificatePath">
            <summary>
            Path to the X.509 PFX used to encrypt tokens (production). When null, a development encryption certificate is used.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictOptions.EncryptionCertificatePassword">
            <summary>
            Password for <see cref="P:TTAR.API.Configuration.OpenIddictOptions.EncryptionCertificatePath"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictOptions.Clients">
            <summary>
            Trusted partner clients seeded on startup. Self-service registration is out of scope; these are entered by hand.
            </summary>
        </member>
        <member name="T:TTAR.API.Configuration.OpenIddictClientRegistration">
            <summary>
            A single trusted OAuth2/OIDC client (partner site) seeded from configuration.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictClientRegistration.ClientId">
            <summary>
            The client identifier the partner uses in the authorize/token requests. Required.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictClientRegistration.ClientSecret">
            <summary>
            Client secret for a confidential client. Leave empty for a public (PKCE-only) client.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictClientRegistration.DisplayName">
            <summary>
            Human-readable name shown on the consent screen.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictClientRegistration.RedirectUris">
            <summary>
            Allowed redirect URIs (exact match). At least one is required for the authorization-code flow.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.OpenIddictClientRegistration.PostLogoutRedirectUris">
            <summary>
            Allowed post-logout redirect URIs.
            </summary>
        </member>
        <member name="T:TTAR.API.Configuration.RateLimitOptions">
            <summary>
            Centralized rate-limiting configuration. Values are intentionally tunable from configuration
            (appsettings) so limits can be adjusted from production logs without a code change.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RateLimitOptions.Enabled">
            <summary>
            Master switch. When <c>false</c>, no rate limiting is applied at all
            (useful for local development / load testing).
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RateLimitOptions.Global">
            <summary>
            Global per-client token-bucket policy applied to all "normal" (DB-cheap) endpoints.
            Partitioned by authenticated player id when available, otherwise by client IP.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RateLimitOptions.Heavy">
            <summary>
            Stricter per-client policy applied to DB-heavy endpoints (search, top) via the
            <c>heavy-db</c> named policy.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RateLimitOptions.Avatars">
            <summary>
            Very lenient per-client policy for the avatar image endpoint, applied via the
            <c>avatars</c> named policy. This endpoint just streams a cached PNG (a static-file
            emulator), so it must not share the normal budget — a profile page can fan out to many
            avatar requests at once.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RateLimitOptions.Places">
            <summary>
            Per-client policy for the map-link import (<c>places</c> named policy). Each request makes outbound calls to
            map services from the server's IP, so it is budgeted on its own and kept out of the DB concurrency ceiling.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RateLimitOptions.AnnounceTopic">
            <summary>
            Per-client policy for the announce-topic check (<c>announce-topic</c> named policy). Every miss of its result
            cache posts (and deletes) a real message in the chat, so the budget is a few taps a minute.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RateLimitOptions.Badges">
            <summary>
            Per-client policy for the menu badge counts (<c>badges</c> named policy). The client re-reads them on resume,
            on related pushes (debounced) and after its own actions, and polls every few minutes; a guest gets 401 anyway.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RateLimitOptions.LanguageRequests">
            <summary>
            Per-client policy for the new-language request (<c>language-requests</c> named policy). Every call messages the
            admin and the endpoint is open to anonymous callers, so the budget is a few requests an hour.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RateLimitOptions.PhotoUploads">
            <summary>
            Per-client policy for the photo upload (<c>photo-uploads</c> named policy). Each upload decodes and re-encodes
            an image of up to tens of megapixels, so a client gets a few uploads per ten minutes.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RateLimitOptions.HeavyConcurrency">
            <summary>
            Global concurrency ceiling for DB-heavy endpoints. Protects the MySQL connection pool
            from being exhausted even by a distributed flood across many IPs: only this many heavy
            requests run against the DB at once, the rest queue (and then get rejected).
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RateLimitOptions.RejectionReport">
            <summary>
            Telegram-report throttling for rate-limit rejections. A report is sent to the super-admin
            when a client first gets throttled, then suppressed per client for a cooldown — and never
            more than a global ceiling per window — so a flood can't turn the alerting into its own
            flood against the bot.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RateLimitOptions.KnownProxies">
            <summary>
            Optional list of trusted reverse-proxy IP addresses (e.g. the Apache front-end) whose
            <c>X-Forwarded-For</c> header is honored when resolving the real client IP. Loopback is
            always trusted. If the proxy is not on loopback this MUST be set, otherwise every request
            shares the proxy IP and per-IP limits collapse into a single global bucket.
            </summary>
        </member>
        <member name="T:TTAR.API.Configuration.TokenBucketSettings">
            <summary>
            Token-bucket settings expressed per fixed window. The bucket is refilled with
            <see cref="P:TTAR.API.Configuration.TokenBucketSettings.AnonymousPermitsPerWindow"/> / <see cref="P:TTAR.API.Configuration.TokenBucketSettings.AuthenticatedPermitsPerWindow"/> tokens
            every <see cref="P:TTAR.API.Configuration.TokenBucketSettings.WindowSeconds"/> seconds. The bucket capacity (the largest momentary spike a client may
            make) is the per-window amount, raised to <see cref="P:TTAR.API.Configuration.TokenBucketSettings.BurstSize"/> when that is larger.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.TokenBucketSettings.WindowSeconds">
            <summary>Length of the refill window, in seconds.</summary>
        </member>
        <member name="P:TTAR.API.Configuration.TokenBucketSettings.AnonymousPermitsPerWindow">
            <summary>Tokens granted per window to anonymous (unauthenticated) clients.</summary>
        </member>
        <member name="P:TTAR.API.Configuration.TokenBucketSettings.AuthenticatedPermitsPerWindow">
            <summary>Tokens granted per window to authenticated clients (more lenient).</summary>
        </member>
        <member name="P:TTAR.API.Configuration.TokenBucketSettings.BurstSize">
            <summary>
            Bucket capacity (burst). Defaults to the anonymous per-window amount when 0, so that short spikes are
            absorbed but sustained flooding is throttled to the refill rate. It only ever raises the capacity: a value
            below the caller's per-window amount has no effect, since the bucket never holds less than one refill.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.TokenBucketSettings.QueueLimit">
            <summary>Number of requests allowed to wait in queue once the bucket is empty.</summary>
        </member>
        <member name="T:TTAR.API.Configuration.RejectionReportSettings">
            <summary>
            Throttling for the Telegram alert sent to the super-admin when a client is rate-limited.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RejectionReportSettings.Enabled">
            <summary>Master switch for sending rate-limit rejection alerts to Telegram.</summary>
        </member>
        <member name="P:TTAR.API.Configuration.RejectionReportSettings.PerClientCooldownSeconds">
            <summary>
            Per-client cooldown, in seconds. After a client (player id or IP) triggers an alert, further
            rejections from the same client are silent for this long.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RejectionReportSettings.GlobalMaxPerWindow">
            <summary>
            Absolute ceiling of alerts sent within <see cref="P:TTAR.API.Configuration.RejectionReportSettings.GlobalWindowSeconds"/> across all clients,
            so a distributed flood can't spawn one alert per attacker.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.RejectionReportSettings.GlobalWindowSeconds">
            <summary>Length of the window over which <see cref="P:TTAR.API.Configuration.RejectionReportSettings.GlobalMaxPerWindow"/> is counted, in seconds.</summary>
        </member>
        <member name="T:TTAR.API.Configuration.ConcurrencySettings">
            <summary>
            Concurrency-limiter settings: how many requests may execute simultaneously and how many
            may wait in queue before being rejected with 429.
            </summary>
        </member>
        <member name="P:TTAR.API.Configuration.ConcurrencySettings.PermitLimit">
            <summary>Maximum number of concurrently executing requests.</summary>
        </member>
        <member name="P:TTAR.API.Configuration.ConcurrencySettings.QueueLimit">
            <summary>Maximum number of requests allowed to wait in queue.</summary>
        </member>
        <member name="T:TTAR.API.Controllers.AccountController">
            <summary>
            Authentication methods
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.#ctor(Microsoft.Extensions.Logging.ILogger{TTAR.API.Controllers.AccountController},TTAR.API.Auth.IAccountService,TTAR.API.Configuration.AppSettings,TTAR.API.Auth.ITokenManager,Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider)">
            <summary>
            Authentication methods
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.Authenticate(TTAR.API.Models.Requests.AuthenticateRequest,System.Threading.CancellationToken)">
            <summary>
            Authenticates a user by email and password.
            </summary>
            <param name="request">Authentication request containing email and password.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>
            Returns <see cref="T:TTAR.API.Models.Responses.AuthenticateResponse"/> with claims and tokens if authentication is successful.
            Returns <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 400 if the request is invalid.
            Returns <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 403 if credentials are invalid or the account has been deleted.
            </returns>
            <remarks>
            If the account has been removed, the response will have status code 403 and a message indicating the account is deleted.
            </remarks>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.Register(TTAR.API.Models.Requests.RegisterRequest,System.Threading.CancellationToken)">
            <summary>
            Registers a new account with email and password and sends a confirmation link.
            The account cannot be used to sign in until the email is confirmed.
            </summary>
            <param name="request">Registration request with email, password and optional name.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>
            200 if the account was created and a confirmation email was sent (for an existing password-less account — a
            set-password link instead).
            <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 409 if an account with this email is already registered.
            <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 403 if the account has been removed.
            </returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.ConfirmEmail(TTAR.API.Models.Requests.EmailConfirmationRequest,System.Threading.CancellationToken)">
            <summary>
            Confirms an account email using a token from the confirmation email and signs the user in.
            </summary>
            <param name="request">Request containing the confirmation token.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>
            200 with <see cref="T:TTAR.API.Models.Responses.AuthenticateResponse"/> on success.
            <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 400 if the token is invalid, expired or already used.
            </returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.ResendConfirmation(TTAR.API.Models.Requests.ResendConfirmationRequest,System.Threading.CancellationToken)">
            <summary>
            Re-sends the email-confirmation link for an unverified account.
            </summary>
            <param name="request">Request containing the account email.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>Always <see cref="T:Microsoft.AspNetCore.Mvc.NoContentResult"/> (204) for any well-formed request, so account existence is never revealed.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.ChangePassword(TTAR.API.Models.Requests.ChangePasswordRequest,System.Threading.CancellationToken)">
            <summary>
            Changes the password of the authenticated user.
            Requires the current password unless the account has no password yet (e.g. SSO-only).
            On success, all existing sessions and refresh tokens are revoked (every device is logged out) and a
            fresh set of tokens is returned for the current device, so the caller stays signed in.
            </summary>
            <param name="request">Request with the current and new password.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>
            200 with a fresh <see cref="T:TTAR.API.Models.Responses.AuthenticateResponse"/> (new JWT, refresh token, and session token when
            <c>rememberMe</c> is set) on success.
            <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 400 if the current password is wrong or the new password is too short.
            </returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.ChangeEmail(TTAR.API.Models.Requests.ChangeEmailRequest,System.Threading.CancellationToken)">
            <summary>
            Starts changing the authenticated user's email. A confirmation link is sent to the new address;
            the login email is switched only after that link is followed.
            Requires the current password; an account with no password yet (SSO/Telegram) must set one first.
            </summary>
            <param name="request">Request with the new email and current password.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>
            200 if a confirmation email was sent to the new address.
            <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 400 if the current password is wrong.
            <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 409 (<see cref="F:TTAR.Types.ApiResponses.ErrorCode.EmailTaken"/>) if the new email is already used by another account.
            <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 409 (<see cref="F:TTAR.Types.ApiResponses.ErrorCode.PasswordRequired"/>) if the account has no password yet and must set one before changing its email.
            </returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.ConfirmEmailChange(TTAR.API.Models.Requests.ConfirmEmailChangeRequest,System.Threading.CancellationToken)">
            <summary>
            Completes the change-email flow using a token from the confirmation email sent to the new address.
            </summary>
            <param name="request">Request containing the confirmation token.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>
            200 on success.
            <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 400 if the token is invalid, expired, already used, or the address became taken.
            </returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.ResendEmailChangeConfirmation(TTAR.API.Models.Requests.ResendEmailChangeConfirmationRequest,System.Threading.CancellationToken)">
            <summary>
            Re-sends the email-change confirmation link to the pending address of the authenticated user.
            Returns 204 regardless of whether a change was pending, so the response never reveals internal state.
            </summary>
            <param name="request">Optional language preference for the confirmation email.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>Always <see cref="T:Microsoft.AspNetCore.Mvc.NoContentResult"/> (204) for any well-formed request.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.CancelEmailChange(System.Threading.CancellationToken)">
            <summary>
            Cancels a pending email change: clears the stored pending address and invalidates any
            outstanding confirmation tokens. Returns 204 even when no change was pending.
            </summary>
            <param name="cancellationToken">Cancellation token.</param>
            <returns><see cref="T:Microsoft.AspNetCore.Mvc.NoContentResult"/> (204).</returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.RestorePassword(TTAR.API.Models.Requests.PasswordRestoreRequest,System.Threading.CancellationToken)">
            <summary>
            Starts the password reset flow: sends an email with a reset link if the account exists.
            </summary>
            <param name="request">Request containing the account email.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>Always <see cref="T:Microsoft.AspNetCore.Mvc.NoContentResult"/> (204) for any well-formed request, so account existence is never revealed.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.ResetPassword(TTAR.API.Models.Requests.PasswordResetRequest,System.Threading.CancellationToken)">
            <summary>
            Completes the password reset flow using a token from the reset email.
            </summary>
            <param name="request">Request containing the reset token and the new password.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>
            200 if the password was reset.
            <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 400 if the token is invalid, expired, already used, or the password is too short.
            </returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.RefreshToken(System.String,System.String,System.Version,System.Threading.CancellationToken)">
            <summary>
            Authenticates a user with a refresh token.
            </summary>
            <param name="refreshToken">Refresh token.</param>
            <param name="sessionToken">Session token value.</param>
            <param name="version">Latest mobile application version.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>
            Returns <see cref="T:TTAR.API.Models.Responses.AuthenticateResponse"/> with claims and tokens if refresh is successful.
            Returns <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 401 if the token is invalid.
            Returns <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 403 if the account has been deleted.
            </returns>
            <remarks>
            If the account has been removed, the response will have status code 403 and a message indicating the account is deleted.
            </remarks>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.RevokeToken(System.String,System.String,System.Threading.CancellationToken)">
            <summary>
            Revokes Refresh Token, and optionally the long-lived session token issued alongside it.
            </summary>
            <param name="token">Refresh token</param>
            <param name="sessionToken">Optional session token to revoke together with the refresh token (logout on the current device).</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Revocation result</returns>
            <remarks>
            Succeeds when at least one of the supplied tokens is revoked. Returns 404 only when neither
            the refresh token nor the session token could be revoked (already inactive or not found).
            </remarks>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.RefreshSession(System.String,System.String,System.Version,System.Threading.CancellationToken)">
            <summary>
            Re-issues JWT and refresh tokens using a long-lived session token (remember me).
            Rotates the session token on success.
            </summary>
            <param name="sessionToken">Session token.</param>
            <param name="clientInfo">Optional device description (mobile app). The web omits it: it is identified by the <c>User-Agent</c> header.</param>
            <param name="version">Latest mobile application version.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>
            Returns <see cref="T:TTAR.API.Models.Responses.AuthenticateResponse"/> with claims and tokens if the session is valid.
            Returns <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 401 if the session token is invalid or expired.
            Returns <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 403 if the account has been deleted.
            </returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.RequestAccountRemoval(System.String,System.Threading.CancellationToken)">
            <summary>
            Requests removal of a user account
            </summary>
            <param name="reason">The reason for account removal</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Status of the account removal request</returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.GoogleLogin(System.String,System.Boolean,System.String,System.String,System.String)">
            <summary>
            Authenticates though Google
            </summary>
            <param name="redirectUri">Custom redirect URI (optional)</param>
            <param name="rememberMe">When <c>true</c>, a long-lived session token is issued alongside the refresh token (default <c>true</c>)</param>
            <param name="clientApp">The TTAR app starting the sign-in (<see cref="T:TTAR.Types.ClientApp"/> name) — the full-page navigation cannot send the <c>X-Client-App</c> header</param>
            <param name="clientVersion">Version of that app — in place of the <c>X-Client-Version</c> header</param>
            <param name="clientInfo">Device description (mobile app only)</param>
            <returns>Redirects to callback <seealso cref="M:TTAR.API.Controllers.AccountController.GoogleResponse(System.String,System.Boolean,System.Boolean)"/></returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.GoogleResponse(System.String,System.Boolean,System.Boolean)">
            <summary>
            Handles the response after Google authentication
            </summary>
            <param name="redirectUri">Optional custom redirect URI to return to after authentication</param>
            <param name="showData">If true, returns the authentication response as JSON instead of redirecting</param>
            <param name="rememberMe">When <c>true</c>, a long-lived session token is issued and included in the response (default <c>true</c>)</param>
            <returns>
            If <paramref name="showData"/> is true, returns <see cref="T:Microsoft.AspNetCore.Mvc.OkObjectResult"/> with the authentication response.
            Otherwise, redirects to the specified or default URI with authentication information.
            Returns <see cref="T:Microsoft.AspNetCore.Mvc.UnauthorizedResult"/> if no email is detected.
            Returns <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 400 if <paramref name="redirectUri"/> is not allowlisted.
            </returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.TelegramOidcLogin(System.String,System.Boolean,TTAR.API.Auth.TelegramOidcMode,System.String,System.String,System.String)">
            <summary>
            Starts a Telegram sign-in (Telegram Login in OpenID Connect mode).
            </summary>
            <param name="redirectUri">Client callback URI (optional, must be allowlisted); defaults to the mobile app callback</param>
            <param name="rememberMe">When <c>true</c>, a long-lived session token is issued alongside the refresh token (default <c>true</c>)</param>
            <param name="mode"><see cref="F:TTAR.API.Auth.TelegramOidcMode.Login"/> returns TTAR tokens; <see cref="F:TTAR.API.Auth.TelegramOidcMode.Link"/> returns a
            custom Telegram token for <c>PUT /Players/merge</c></param>
            <param name="clientApp">The TTAR app starting the sign-in (<see cref="T:TTAR.Types.ClientApp"/> name) — the full-page navigation cannot send the <c>X-Client-App</c> header</param>
            <param name="clientVersion">Version of that app — in place of the <c>X-Client-Version</c> header</param>
            <param name="clientInfo">Device description (mobile app only)</param>
            <returns>Redirects to Telegram, which returns to <see cref="M:TTAR.API.Controllers.AccountController.TelegramOidcResponse(System.String,System.Boolean,TTAR.API.Auth.TelegramOidcMode,System.Threading.CancellationToken)"/></returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.TelegramOidcResponse(System.String,System.Boolean,TTAR.API.Auth.TelegramOidcMode,System.Threading.CancellationToken)">
            <summary>
            Completes a Telegram sign-in started at <see cref="M:TTAR.API.Controllers.AccountController.TelegramOidcLogin(System.String,System.Boolean,TTAR.API.Auth.TelegramOidcMode,System.String,System.String,System.String)"/> and redirects back to the client.
            </summary>
            <param name="redirectUri">Client callback URI (optional, must be allowlisted); defaults to the mobile app callback</param>
            <param name="rememberMe">When <c>true</c>, a long-lived session token is issued and included in the response (default <c>true</c>)</param>
            <param name="mode">Sign-in purpose, see <see cref="M:TTAR.API.Controllers.AccountController.TelegramOidcLogin(System.String,System.Boolean,TTAR.API.Auth.TelegramOidcMode,System.String,System.String,System.String)"/></param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>
            Redirect to <paramref name="redirectUri"/> with <c>PlayerId/Token/RefreshToken/SessionToken</c> (login) or
            <c>TelegramToken</c> (link) in the fragment, or with <c>ErrorCode</c> on failure.
            Returns <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> with status 400 if <paramref name="redirectUri"/> is not allowlisted.
            </returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.UploadAvatarAsync(System.String,System.Int32)">
            <summary>
            Downloads and stores the player's avatar. Runs as a fire-and-forget background task from
            <see cref="M:TTAR.API.Controllers.AccountController.GoogleResponse(System.String,System.Boolean,System.Boolean)"/> and <see cref="M:TTAR.API.Controllers.AccountController.TelegramOidcResponse(System.String,System.Boolean,TTAR.API.Auth.TelegramOidcMode,System.Threading.CancellationToken)"/>, so it owns its own DI scope (the request scope is gone by then) and observes
            its own exceptions instead of surfacing them as unobserved task exceptions.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.CheckTelegramToken(System.Guid,System.Boolean,System.String,System.Threading.CancellationToken)">
            <summary>
            Authenticates a user by custom Telegram token
            </summary>
            <param name="token">Custom Telegram token</param>
            <param name="rememberMe">When <c>true</c>, a long-lived session token is issued and included in the response (default <c>true</c>)</param>
            <param name="clientInfo">Optional device description (mobile app).</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns></returns>
            <remarks>Legacy "sign in via the bot" flow, kept only for app versions released before Telegram OIDC. Use
            <c>GET /Account/TelegramOidc</c> to sign in and <c>GET /Players/merge</c> to preview a link token.</remarks>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.LoginExchange(System.Threading.CancellationToken)">
            <summary>
            Mints a one-time exchange code for the web-delegated "Login with TTAR" OIDC handoff. The caller must be an
            authenticated player (Bearer JWT); the code is bound to that player and redeemed once at
            <c>/connect/login-callback</c> to establish the IdP session. This lets the web client (ttar.app) own the
            login UI while the API (the OIDC provider) owns the session.
            </summary>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>200 with the one-time <see cref="P:TTAR.API.Models.Responses.LoginExchangeResponse.Code"/>.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.AuthenticateSSO(System.String,System.Threading.CancellationToken)">
            <summary>
            SSO authentications for the mobile application
            </summary>
            <param name="scheme">e.g.: Microsoft, Facebook, Apple, etc</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Redirect back to the mobile application with auth information</returns>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.UpdateVersion(System.Version,System.Threading.CancellationToken)">
            <summary>
            Updates version information for current user
            </summary>
            <param name="version">Version of the mobile application</param>
            <param name="cancellationToken">Cancellation token</param>
        </member>
        <member name="M:TTAR.API.Controllers.AccountController.UpdateLocation(TTAR.API.Models.GeoPoint,System.Threading.CancellationToken)">
            <summary>
            Updates geographical information for current user
            </summary>
            <param name="geoPoint">Geographical point containing longitude and latitude</param>
            <param name="cancellationToken">Cancellation token</param>
        </member>
        <member name="T:TTAR.API.Controllers.AdminDonationsController">
            <summary>
            Admin page "Поддержка проекта": support payments entered by hand (each adds to the month's sum, a mistake is
            deleted) and the anonymous counters of the "Expenses and support" page. Admin only. Sums are US dollars with cents;
            only the running month (UTC) takes new payments and deletions.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AdminDonationsController.#ctor(TTAR.API.Services.IDonationAdminService)">
            <summary>
            Admin page "Поддержка проекта": support payments entered by hand (each adds to the month's sum, a mistake is
            deleted) and the anonymous counters of the "Expenses and support" page. Admin only. Sums are US dollars with cents;
            only the running month (UTC) takes new payments and deletions.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AdminDonationsController.GetDonationPageStatsAsync(System.DateOnly,System.DateOnly,TTAR.API.Models.Donations.DonationStatsBucket,System.Threading.CancellationToken)">
            <summary>
            Visits and taps of the support page per day or per month (UTC), within <c>[from, to]</c>. Days without events
            are left out — the client fills them with zeros.
            </summary>
            <param name="from">First day, <c>YYYY-MM-DD</c>.</param>
            <param name="to">Last day, <c>YYYY-MM-DD</c>.</param>
            <param name="bucket"><c>day</c> (default) or <c>month</c> (dated by the month's first day).</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.AdminDonationsController.GetDonationMonthAsync(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            The payments of a month, newest first, with its support and expenses.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AdminDonationsController.AddDonationAsync(System.Int32,System.Int32,TTAR.API.Models.Donations.DonationItemRequest,System.Threading.CancellationToken)">
            <summary>
            Adds one payment to the running month: net of the payment service's fee, another currency converted at the
            rate of the day. A retry with the same <c>Idempotency-Key</c> adds nothing.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AdminDonationsController.DeleteDonationAsync(System.Int32,System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Deletes a payment of the running month (kept in the database for the audit, counted nowhere).
            </summary>
        </member>
        <member name="T:TTAR.API.Controllers.AdminStatsController">
            <summary>
            Admin registration statistics (page "Статистика регистраций"). All data is precomputed by a nightly job; these
            endpoints only read snapshots. Access is gated by the <see cref="F:TTAR.API.Auth.AuthorizationPolicies.StatsAccess"/> policy —
            a caller with the StatsViewer role (or Admin) passes; anyone else gets a framework 403 before the action runs.
            A not-yet-computed snapshot returns 204 so the client can show the "статистика появится после ночного
            пересчёта" empty state (distinct from a 403 no-access).
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AdminStatsController.#ctor(TTAR.Services.Abstractions.IStatsService)">
            <summary>
            Admin registration statistics (page "Статистика регистраций"). All data is precomputed by a nightly job; these
            endpoints only read snapshots. Access is gated by the <see cref="F:TTAR.API.Auth.AuthorizationPolicies.StatsAccess"/> policy —
            a caller with the StatsViewer role (or Admin) passes; anyone else gets a framework 403 before the action runs.
            A not-yet-computed snapshot returns 204 so the client can show the "статистика появится после ночного
            пересчёта" empty state (distinct from a 403 no-access).
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AdminStatsController.GetRegistrationStatsAsync(System.String,System.Threading.CancellationToken)">
            <summary>
            Registration funnel over a range (nested series registered ⊇ played ⊇ qualified), with on-date and cohort
            points and the play-mix split. See REGSTATS.md §4.
            </summary>
            <param name="range">3m | 12m | all (default 12m).</param>
        </member>
        <member name="M:TTAR.API.Controllers.AdminStatsController.GetCountryStatsAsync(System.String,System.Threading.CancellationToken)">
            <summary>
            Per-country registration counts and growth over a range, plus the "other" tail and the "country not
            determined" row. See REGSTATS.md §4.
            </summary>
            <param name="range">3m | 12m | all (default 12m).</param>
        </member>
        <member name="M:TTAR.API.Controllers.AdminStatsController.RecalculateStatsAsync(System.Threading.CancellationToken)">
            <summary>
            Forces an immediate recalculation of all snapshots (admin only), bypassing the nightly timer's
            once-per-day guard. Returns the new "as of" stamp. Heavy — intended for manual use after data fixes.
            </summary>
        </member>
        <member name="T:TTAR.API.Controllers.AuthorizationController">
            <summary>
            OpenID Connect provider endpoints for "Login with TTAR" (authorize / token / userinfo / logout). Not an
            <c>[ApiController]</c>: these use redirects and form-posts driven by OpenIddict passthrough, not JSON model binding.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AuthorizationController.#ctor(TTAR.DataProviders.Abstractions.IPlayerRepository,TTAR.API.Auth.OpenId.IOpenIdClaimsService,TTAR.API.Auth.IAccountService,TTAR.API.Configuration.OpenIddictOptions,System.TimeProvider,Microsoft.Extensions.Logging.ILogger{TTAR.API.Controllers.AuthorizationController})">
            <summary>
            OpenID Connect provider endpoints for "Login with TTAR" (authorize / token / userinfo / logout). Not an
            <c>[ApiController]</c>: these use redirects and form-posts driven by OpenIddict passthrough, not JSON model binding.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AuthorizationController.Authorize(System.Threading.CancellationToken)">
            <summary>
            Authorization endpoint: authenticates the resource owner via the IdP cookie (challenging the login page
            when absent, or when <c>prompt=login</c> / <c>prompt=select_account</c> / <c>max_age</c> demand a fresh
            sign-in), then issues an authorization code for the granted scopes.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AuthorizationController.LoginCallback(System.String,System.String,System.String,System.Threading.CancellationToken)">
            <summary>
            Web-delegated login handoff: the web client, after signing the user in, redirects here with a one-time
            exchange code. Redeems the code (single-use), establishes the IdP cookie, and returns to the original
            authorize URL so the OAuth code can be issued.
            </summary>
            <param name="code">The one-time login-exchange code minted at <c>/Account/login-exchange</c>.</param>
            <param name="returnUrl">The original relative <c>/connect/authorize</c> URL to resume.</param>
            <param name="state">The anti-CSRF state echoed back by the web login; must match the cookie set at authorize.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>Redirect to <paramref name="returnUrl"/> on success; back to the web login on an invalid code; 400 on a bad returnUrl/state.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.AuthorizationController.Exchange(System.Threading.CancellationToken)">
            <summary>
            Token endpoint: exchanges an authorization code or a refresh token for fresh tokens. On refresh, the
            player's claims are re-read from the database so rating/profile changes propagate.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AuthorizationController.UserInfo(System.Threading.CancellationToken)">
            <summary>
            UserInfo endpoint: returns the player profile claims allowed by the access token's scopes.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.AuthorizationController.LogOut">
            <summary>
            End-session (logout) endpoint: clears the IdP cookie and completes the OpenIddict sign-out.
            </summary>
        </member>
        <member name="T:TTAR.API.Controllers.BlocksController">
            <summary>
            Personal blocks. A blocked player's geo chat messages, mentions and private messages do not reach the
            caller, the caller cannot write to them either, and neither side sees the other's contacts
            (<c>PlayerResponse.isBlockedByMe</c> / <c>hasBlockedMe</c>). Blocking is one-way and takes effect at once.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.BlocksController.#ctor(TTAR.Services.Abstractions.IPlayerSafetyService)">
            <summary>
            Personal blocks. A blocked player's geo chat messages, mentions and private messages do not reach the
            caller, the caller cannot write to them either, and neither side sees the other's contacts
            (<c>PlayerResponse.isBlockedByMe</c> / <c>hasBlockedMe</c>). Blocking is one-way and takes effect at once.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.BlocksController.GetBlocks(System.Threading.CancellationToken)">
            <summary>The players the caller blocked, newest first.</summary>
            <response code="200">The list</response>
        </member>
        <member name="M:TTAR.API.Controllers.BlocksController.BlockPlayer(System.Int32,System.Threading.CancellationToken)">
            <summary>Blocks a player. Idempotent.</summary>
            <response code="204">Blocked</response>
            <response code="404">No such player</response>
            <response code="422">The caller themselves</response>
        </member>
        <member name="M:TTAR.API.Controllers.BlocksController.UnblockPlayer(System.Int32,System.Threading.CancellationToken)">
            <summary>Lifts a block. Idempotent.</summary>
            <response code="204">Not blocked any more</response>
        </member>
        <member name="T:TTAR.API.Controllers.ReportsController">
            <summary>Reports to the moderators. The report keeps a snapshot of what the reporter saw.</summary>
        </member>
        <member name="M:TTAR.API.Controllers.ReportsController.#ctor(TTAR.Services.Abstractions.IPlayerSafetyService)">
            <summary>Reports to the moderators. The report keeps a snapshot of what the reporter saw.</summary>
        </member>
        <member name="M:TTAR.API.Controllers.ReportsController.FileReport(TTAR.API.Models.Requests.ReportRequest,System.Threading.CancellationToken)">
            <summary>
            Files a report about a player: a geo chat message (the quote is attached) or a private conversation (the
            last 20 messages of the pair are attached). With <c>alsoBlock</c> the player is blocked in the same call.
            </summary>
            <response code="200">Filed</response>
            <response code="404">No such player or message</response>
            <response code="422">The caller themselves, or no comment for the reason "Other"</response>
        </member>
        <member name="T:TTAR.API.Controllers.BookingsController">
            <summary>
            Booking-scoped actions addressed by booking id (DATA_API §4): the player cancels their own booking; the venue
            confirms / declines / marks a booking played. Venue-scoped booking creation and listing live in
            <see cref="T:TTAR.API.Controllers.VenuesController"/>.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.BookingsController.#ctor(TTAR.Venues.IVenueService)">
            <summary>
            Booking-scoped actions addressed by booking id (DATA_API §4): the player cancels their own booking; the venue
            confirms / declines / marks a booking played. Venue-scoped booking creation and listing live in
            <see cref="T:TTAR.API.Controllers.VenuesController"/>.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.BookingsController.GetMyBookingsAllVenues(System.Threading.CancellationToken)">
            <summary>
            The authenticated caller's active bookings across all venues (Requested + Confirmed, ending now or later),
            ordered by start. Each row carries its venue name for the cross-venue "my bookings" banner/screen (SCREENS §1).
            </summary>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.BookingsController.CancelBooking(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Cancels a booking (the whole group). Cancelling before the start releases the hold; after the start it
            captures per the venue's late-cancel policy. The booking player may cancel their own; the venue any.
            </summary>
            <param name="bookingId">Booking id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.BookingsController.ConfirmBooking(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Confirms a pending booking (venue manager).
            </summary>
            <param name="bookingId">Booking id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.BookingsController.DeclineBooking(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Declines a booking (venue manager): releases the hold and cancels it.
            </summary>
            <param name="bookingId">Booking id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.BookingsController.CompleteBooking(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Marks a booking played (venue manager): captures the held funds.
            </summary>
            <param name="bookingId">Booking id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="T:TTAR.API.Controllers.DashboardController">
            <summary>
            Home-page dashboard data for the authenticated player. Kept as a dedicated controller (rather than a member of
            <see cref="T:TTAR.API.Controllers.PlayersController"/>) so the dashboard can grow independent, separately-loadable modules later
            without bloating the player CRUD surface.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.DashboardController.#ctor(TTAR.Services.Abstractions.IDashboardService)">
            <summary>
            Home-page dashboard data for the authenticated player. Kept as a dedicated controller (rather than a member of
            <see cref="T:TTAR.API.Controllers.PlayersController"/>) so the dashboard can grow independent, separately-loadable modules later
            without bloating the player CRUD surface.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.DashboardController.GetDashboard(System.Int32,TTAR.Types.HandType,System.Boolean,System.Threading.CancellationToken)">
            <summary>
            Returns the aggregated home-dashboard data for the authenticated player.
            </summary>
            <remarks>Everything the dashboard widgets need is collected server-side in a single request: rating and
            rank progress, per-period deltas/sparkline, all-time W/L/D and streaks, head-to-head, recent games, yearly
            activity heatmap and the nearest upcoming tournament. Achievements are not yet sourced and come back empty.</remarks>
            <param name="playerId">The player's id. Must be the caller unless the caller is an admin.</param>
            <param name="handType">The hand to build the dashboard for (Main by default).</param>
            <param name="includeLadders">True — the client supports ladders. Omitted, the nearest tournament is the nearest non-ladder one: apps released before ladders cannot read a ladder.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>The dashboard data.</returns>
        </member>
        <member name="T:TTAR.API.Controllers.DonationsController">
            <summary>
            Project expenses and the players' support covering them (the "Expenses and support" page and its menu banner).
            Sums are US dollars; the client computes the coverage. Open to guests. While the section is switched off in the
            configuration every endpoint returns 204, and the client shows no banner.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.DonationsController.#ctor(TTAR.API.Services.IDonationService)">
            <summary>
            Project expenses and the players' support covering them (the "Expenses and support" page and its menu banner).
            Sums are US dollars; the client computes the coverage. Open to guests. While the section is switched off in the
            configuration every endpoint returns 204, and the client shows no banner.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.DonationsController.GetCurrentDonationsAsync(System.Threading.CancellationToken)">
            <summary>
            Expenses and support of the running month — the menu banner.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.DonationsController.GetDonationSummaryAsync(System.Threading.CancellationToken)">
            <summary>
            The coverage of the running month, the running year and the whole history, with the start of the history
            and today's date.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.DonationsController.GetDonationMonthsAsync(System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            The months of a year within the history (before its start and after the running month there are none).
            </summary>
            <param name="year">The year; the running one by default.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.DonationsController.GetDonationYearsAsync(System.Threading.CancellationToken)">
            <summary>
            Every year of the history.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.DonationsController.GetDonationMethodsAsync(System.Threading.CancellationToken)">
            <summary>
            The payment methods of the "Support TTAR" sheet offered in the caller's country, those meant for it first, and
            that country. It comes from the signed-in player's declared country of residence, else their stored location,
            else the request's IP address — a guest's only source. The address is not kept.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.DonationsController.RecordDonationPageEventAsync(TTAR.API.Models.Donations.DonationPageEventRequest,System.Threading.CancellationToken)">
            <summary>
            Counts an opening of the page (<c>View</c>) or a tap on "Support the project" (<c>Click</c>) in today's
            counters (UTC). Anonymous: only the day's numbers are kept, never who sent the event. Always 204.
            </summary>
        </member>
        <member name="T:TTAR.API.Controllers.EmailPreferencesController">
            <summary>
            Email preferences through the link every notification email carries, without signing in: the RFC 8058 one-click
            unsubscribe a mail client calls itself, and what the preferences page reads and changes. The signed-in player has
            <c>me/email-preferences</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.EmailPreferencesController.#ctor(TTAR.Services.Abstractions.IEmailPreferencesService,TTAR.Configuration.TtarConfiguration)">
            <summary>
            Email preferences through the link every notification email carries, without signing in: the RFC 8058 one-click
            unsubscribe a mail client calls itself, and what the preferences page reads and changes. The signed-in player has
            <c>me/email-preferences</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.EmailPreferencesController.UnsubscribeOneClick(System.String,System.Nullable{TTAR.Types.NotificationTopic},System.Threading.CancellationToken)">
            <summary>
            Turns the topic off — the RFC 8058 one-click unsubscribe a mail client calls from the email's
            <c>List-Unsubscribe</c> header, with the fixed body <c>List-Unsubscribe=One-Click</c> (any body is ignored).
            </summary>
            <param name="token">The token of the email's links.</param>
            <param name="topic">The email's topic.</param>
            <param name="cancellationToken">Cancellation token</param>
            <response code="200">The topic is off; the new preferences, with the address masked</response>
            <response code="400">The link is not valid anymore (<c>InvalidEmailPreferencesToken</c>), or the topic is missing, unknown or can't be turned off</response>
        </member>
        <member name="M:TTAR.API.Controllers.EmailPreferencesController.OpenUnsubscribe(System.String,System.Nullable{TTAR.Types.NotificationTopic},System.Threading.CancellationToken)">
            <summary>
            The unsubscribe link opened as a page (a mail client without RFC 8058, a link preview): redirects to the
            preferences page offering to turn the topic off, in the player's language, and changes nothing itself.
            </summary>
            <param name="token">The token of the email's links.</param>
            <param name="topic">The email's topic.</param>
            <param name="cancellationToken">Cancellation token</param>
            <response code="302">To the preferences page</response>
        </member>
        <member name="M:TTAR.API.Controllers.EmailPreferencesController.GetEmailPreferencesByToken(System.String,System.Threading.CancellationToken)">
            <summary>The preferences of the player the emailed link is for, with the address masked.</summary>
            <param name="token">The token of the email's links.</param>
            <param name="cancellationToken">Cancellation token</param>
            <response code="200">The preferences</response>
            <response code="400">The link is not valid anymore (<c>InvalidEmailPreferencesToken</c>): the player has to sign in</response>
        </member>
        <member name="M:TTAR.API.Controllers.EmailPreferencesController.UpdateEmailPreferencesByToken(TTAR.API.Models.Requests.EmailPreferencesByTokenRequest,System.Threading.CancellationToken)">
            <summary>
            Turns topics on or off through the emailed link: only the listed ones change, the rest keep their state.
            </summary>
            <param name="request">The link's token and the topics to change</param>
            <param name="cancellationToken">Cancellation token</param>
            <response code="200">The new preferences, with the address masked</response>
            <response code="400">The link is not valid anymore (<c>InvalidEmailPreferencesToken</c>), or a topic is unknown or can't be turned off</response>
        </member>
        <member name="T:TTAR.API.Controllers.GamesController">
            <summary>
            Search within database
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.GamesController.#ctor(Microsoft.Extensions.Logging.ILogger{TTAR.API.Controllers.GamesController},TTAR.DataProviders.Abstractions.IGameRepository,TTAR.DataProviders.Abstractions.IDbService,TTAR.Actions.Abstractions.IConfirmAction,TTAR.Actions.Abstractions.IDiscardAction,TTAR.Services.Abstractions.IPlayerService,TTAR.DataProviders.Abstractions.IChatService,TTAR.API.Services.IGameRegistrationService,TTAR.RatingSystems.IRatingCalculator,TTAR.Configuration.TtarConfiguration)">
            <summary>
            Search within database
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.GamesController.GetGames(System.Int32,TTAR.Types.HandType,System.Int32,System.Nullable{System.Int32},System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Returns list of all confirmed games for specified user
            </summary>
            <param name="playerId">Player's Id</param>
            <param name="handType">Player's hand type</param>
            <param name="currentPage">A page to be returned</param>
            <param name="pageSize">Amount of items per page. Default value is <seealso cref="P:TTAR.Configuration.TtarConfiguration.PageSize"/></param>
            <param name="opponentId">Optional opponent id. When provided, only joint games between the player's
            <paramref name="handType"/> hand and all hands of the opponent are returned (same as the filtered history in
            the Telegram bot). When omitted, the full history of the hand is returned.</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>List of games; External rating importing information, if exists</returns>
        </member>
        <member name="M:TTAR.API.Controllers.GamesController.CreateNewGames(System.Collections.Generic.List{TTAR.API.Models.Requests.NewGameRequest},System.Threading.CancellationToken)">
            <summary>
            Registers new unconfirmed game(s)
            </summary>
            <param name="request">Game parameters</param>
            <param name="cancellationToken">Cancellation token</param>
        </member>
        <member name="M:TTAR.API.Controllers.GamesController.GetGameForecast(System.Int32,TTAR.Types.HandType,TTAR.Types.HandType,System.Nullable{System.Int32},System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Forecasts the caller's rating change after a game against the opponent, as if the game were confirmed now.
            Read-only: nothing is persisted and a missing hand is not created (it is forecast from its starting values).
            </summary>
            <param name="opponentId">The opponent player id.</param>
            <param name="playerHand">The caller's rating axis.</param>
            <param name="opponentHand">The opponent's rating axis (may differ from <paramref name="playerHand"/>).</param>
            <param name="score1">Optional sets won by the caller; with <paramref name="score2"/> fills
            <see cref="P:TTAR.API.Models.Responses.GameForecastResponse.ScoreDelta"/>.</param>
            <param name="score2">Optional sets won by the opponent.</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>The caller's rating deltas for the reference win/loss and, optionally, for the exact score.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.GamesController.GetUnconfirmedGames(System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Returns list of unconfirmed games corresponding to specified <paramref name="playerId"/>
            </summary>
            <param name="playerId">Player id to filter, the logged user by default.
            Only admins can get someone else's unconfirmed games</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>The list of unconfirmed games</returns>
        </member>
        <member name="M:TTAR.API.Controllers.GamesController.ConfirmGame(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Accepts a confirmation from one of the player. Updates ConfirmationDate if both players confirmed the game
            </summary>
            <param name="gameId">A game id to confirm</param>
            <param name="playerId">A player id (not TelegramId) who confirming the game.
            Only admins can confirm someone else's game</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Returns updated game record, or <c>null</c> if not found</returns>
        </member>
        <member name="M:TTAR.API.Controllers.GamesController.DiscardGame(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Discards unconfirmed game
            </summary>
            <param name="gameId">A game id to discard</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Returns updated game record, or <c>null</c> if not found</returns>
        </member>
        <member name="T:TTAR.API.Controllers.GeoChatController">
            <summary>
            The players-nearby chat ("Geo chat" tab of Messages). The feed is served from memory and filtered per reader:
            own messages always, a blocked author's never, anyone else's when it mentions the reader or was sent within
            the reader's radius. Positions are kept as ~500 m cells and never returned.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.GeoChatController.#ctor(TTAR.Services.Abstractions.IGeoChatService)">
            <summary>
            The players-nearby chat ("Geo chat" tab of Messages). The feed is served from memory and filtered per reader:
            own messages always, a blocked author's never, anyone else's when it mentions the reader or was sent within
            the reader's radius. Positions are kept as ~500 m cells and never returned.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.GeoChatController.GetGeoChatFeed(TTAR.API.Models.Requests.GeoChatFeedRequest,System.Threading.CancellationToken)">
            <summary>
            A page of the caller's feed, oldest first. Pass the first shown message's id as <c>before</c> to load the
            previous page while <c>hasMore</c> is true. Live updates come through the chat hub (<c>GeoChatMessage</c>).
            </summary>
            <response code="200">The page</response>
        </member>
        <member name="M:TTAR.API.Controllers.GeoChatController.SendGeoChatMessage(TTAR.API.Models.Requests.SendGeoChatMessageRequest,System.Threading.CancellationToken)">
            <summary>
            Sends a message from the caller's position. Mentions (<c>@[playerId]</c> tokens) reach the mentioned
            players whatever their radius, except across a block. Limits: one message per 15 s, 20 per hour, no
            repeat of the previous text, links only with games on the record.
            </summary>
            <response code="200">The message as the sender sees it</response>
            <response code="403">No position, the chat is off, links are not allowed yet, or a moderator restricted the caller's chat (<c>GeoChatBanned</c>)</response>
            <response code="422">Empty or too long text, or too many mentions</response>
            <response code="429">Sent too often, or the same text again</response>
        </member>
        <member name="M:TTAR.API.Controllers.GeoChatController.GetGeoChatSettings(System.Threading.CancellationToken)">
            <summary>The caller's radius and the marks of the tab (unread mention, new messages).</summary>
            <response code="200">The settings</response>
        </member>
        <member name="M:TTAR.API.Controllers.GeoChatController.SetGeoChatSettings(TTAR.API.Models.Requests.GeoChatSettingsRequest,System.Threading.CancellationToken)">
            <summary>Sets the caller's radius (0 turns the chat off; mentions still arrive; -1 = "all", chat moderators only).</summary>
            <response code="200">The settings</response>
            <response code="403">The "all" radius (-1) without the chat moderator role (<c>ChatModerationRequired</c>)</response>
            <response code="422">The radius is not one of the allowed values</response>
        </member>
        <member name="M:TTAR.API.Controllers.GeoChatController.MarkGeoChatRead(System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            The tab was opened (or new messages arrived while it is open): moves the read marker to <c>upToId</c>
            (the newest visible message when omitted) and gives the others' messages their first "seen" tick.
            </summary>
            <response code="200">The settings after the read</response>
        </member>
        <member name="M:TTAR.API.Controllers.GeoChatController.GetGeoChatActivity(TTAR.API.Models.Requests.GeoChatActivityRequest,System.Threading.CancellationToken)">
            <summary>
            The guest teaser: how many messages and authors the last day had within 10 km of the point (global
            counts without a point). No content is returned to anyone here.
            </summary>
            <response code="200">The counts</response>
        </member>
        <member name="T:TTAR.API.Controllers.ImagesController">
            <summary>
            Serves player avatars and manages the photo a player uploads.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.ImagesController.#ctor(Microsoft.Extensions.Logging.ILogger{TTAR.API.Controllers.ImagesController},TTAR.Services.Abstractions.IImageStore,Microsoft.Extensions.DependencyInjection.IServiceScopeFactory)">
            <summary>
            Serves player avatars and manages the photo a player uploads.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.ImagesController.GetAvatarImage(System.Guid)">
            <summary>
            Returns avatar image: the preview of the player's photo (JPEG) or the provider avatar (PNG)
            </summary>
            <param name="filename">Avatar id</param>
            <returns>Requested image</returns>
        </member>
        <member name="M:TTAR.API.Controllers.ImagesController.GetFullAvatarImage(System.Guid)">
            <summary>
            Returns the full-size avatar image: the player's photo (JPEG, longer side up to 640 px), or the provider
            avatar (PNG), which has a single size
            </summary>
            <param name="filename">Avatar id</param>
            <returns>Requested image</returns>
        </member>
        <member name="M:TTAR.API.Controllers.ImagesController.UploadAvatarImage(Microsoft.AspNetCore.Http.IFormFile,System.Nullable{System.Int32},System.Nullable{System.Double},System.Nullable{System.Double},System.Threading.CancellationToken)">
            <summary>
            Uploads the player's photo. It replaces the avatar from Telegram/Google, which is no longer synced while the
            photo exists. Stored as a JPEG without metadata, aspect ratio kept.
            </summary>
            <param name="file">Uploaded image: JPEG, PNG or WebP, up to 10 MB</param>
            <param name="playerId">Target player id, logged used by default.
            Only admins can set someone else's avatars.</param>
            <param name="focusX">The avatar centre in fractions (0…1) of the photo width, clamped; centre by default</param>
            <param name="focusY">The avatar centre in fractions (0…1) of the photo height, clamped; centre by default</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Generated file id. Its preview is the square around the focus, up to 256 px.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.ImagesController.SetAvatarFocus(TTAR.API.Models.Requests.AvatarFocusRequest,System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Moves the avatar centre of the player's photo: the preview is re-cut from the stored photo, nothing is uploaded.
            </summary>
            <param name="request">The new avatar centre</param>
            <param name="playerId">Target player id, logged used by default.
            Only admins can change someone else's photo.</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>The new avatar id (avatars are cached as immutable); its <c>/full</c> is the same photo</returns>
        </member>
        <member name="M:TTAR.API.Controllers.ImagesController.DeleteAvatarImage(System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Removes the player's photo. The avatar from Telegram is fetched again right away; the one from Google comes
            with the next Google sign-in. Succeeds when there is no photo (or no such player) too.
            </summary>
            <param name="playerId">Target player id, logged used by default.
            Only admins can remove someone else's photo.</param>
            <param name="cancellationToken">Cancellation token</param>
        </member>
        <member name="M:TTAR.API.Controllers.ImagesController.SyncProviderAvatarAsync(System.Int32)">
            <summary>
            Fetches the Telegram avatar of a player who has just removed their photo. Removing the photo reset the last
            avatar check, so the update interval does not hold it back.
            </summary>
        </member>
        <member name="T:TTAR.API.Controllers.InternalController">
            <summary>
            Internal-only endpoints called by the bot/timer worker (which has no SignalR hub) to reach the API's real
            hub-backed broadcaster. Guarded by loopback + a shared secret, NOT by user auth — the caller is a co-hosted
            process, not a signed-in user. Never expose this route through the reverse proxy.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.InternalController.#ctor(TTAR.PushNotifications.ITournamentLiveBroadcaster,TTAR.Cache.ITournamentReadCache,TTAR.Configuration.TtarConfiguration,Microsoft.Extensions.Logging.ILogger{TTAR.API.Controllers.InternalController})">
            <summary>
            Internal-only endpoints called by the bot/timer worker (which has no SignalR hub) to reach the API's real
            hub-backed broadcaster. Guarded by loopback + a shared secret, NOT by user auth — the caller is a co-hosted
            process, not a signed-in user. Never expose this route through the reverse proxy.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.InternalController.LiveRefresh(TTAR.PushNotifications.HttpTournamentLiveBroadcaster.LiveRefreshRequest,System.Threading.CancellationToken)">
            <summary>
            Broadcast a live-refresh signal to the tournament's SignalR group. Called by the worker after a
            timer/bot-originated change (auto-confirm, auto-call, Telegram confirm) so open web pages refresh at once
            instead of waiting out the silent-poll fallback.
            </summary>
        </member>
        <member name="T:TTAR.API.Controllers.LanguagesController">
            <summary>
            Interface languages.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.LanguagesController.#ctor(TTAR.API.Services.ILanguageRequestService)">
            <summary>
            Interface languages.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.LanguagesController.RequestLanguage(TTAR.API.Models.Requests.NewLanguageRequest,System.Threading.CancellationToken)">
            <summary>
            Asks for a new interface language: the request goes to the administrator by Telegram and email. Open to
            anonymous callers (the language menu is on the login screen too); an authenticated caller is named in it.
            </summary>
            <param name="request">The requested language and optional details.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="T:TTAR.API.Controllers.MeController">
            <summary>
            The caller's own state that is not part of the profile
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.MeController.#ctor(TTAR.DataProviders.Abstractions.INavBadgesRepository,TTAR.Services.Abstractions.IGeoChatService,TTAR.Services.Abstractions.IEmailPreferencesService,TTAR.API.Auth.IAccountService,TTAR.API.Configuration.AppSettings)">
            <summary>
            The caller's own state that is not part of the profile
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.MeController.GetMyEmailPreferences(System.Threading.CancellationToken)">
            <summary>
            The caller's email switches by topic, with their address in full (<c>null</c> without one: the switches are kept
            for when they add it).
            </summary>
            <param name="cancellationToken">Cancellation token</param>
            <response code="200">The preferences</response>
            <response code="401">Not authenticated</response>
            <response code="404">The caller's profile is gone</response>
        </member>
        <member name="M:TTAR.API.Controllers.MeController.UpdateMyEmailPreferences(TTAR.API.Models.Requests.EmailPreferencesRequest,System.Threading.CancellationToken)">
            <summary>Turns the caller's email topics on or off: only the listed ones change, the rest keep their state.</summary>
            <param name="request">The topics to change</param>
            <param name="cancellationToken">Cancellation token</param>
            <response code="200">The new preferences</response>
            <response code="400">A topic is unknown or can't be turned off</response>
            <response code="401">Not authenticated</response>
            <response code="404">The caller's profile is gone</response>
        </member>
        <member name="M:TTAR.API.Controllers.MeController.SendMyEmailVerification(System.Threading.CancellationToken)">
            <summary>
            Emails the caller a link confirming their current address — notification emails go only to a confirmed one.
            The link is the email-change one (<c>confirm-email-change?token=</c>, to the same address): it signs nobody in.
            Sends nothing without an address, for a confirmed one, while a change of it is pending, or within the cooldown.
            </summary>
            <param name="cancellationToken">Cancellation token</param>
            <response code="204">Done (whether or not an email went out)</response>
            <response code="401">Not authenticated</response>
        </member>
        <member name="M:TTAR.API.Controllers.MeController.GetBadges(System.Threading.CancellationToken)">
            <summary>
            Returns the menu badge counts: how many items in each menu section wait for the caller's answer, and whether
            the geo chat has something new (<c>messagesNew</c>, the "Geo chat" tab's dot).
            Not cached — the counts change right after the caller's own actions; the client polls it and re-reads it on
            the related pushes.
            </summary>
            <param name="cancellationToken">Cancellation token</param>
            <response code="200">The counts</response>
            <response code="401">Not authenticated (a guest has no badges)</response>
            <response code="429">Polled too often</response>
        </member>
        <member name="T:TTAR.API.Controllers.MessagesController">
            <summary>
            Private messages. Live updates come through the chat hub (<c>/hubs/chat</c>): <c>PrivateMessage</c> to the
            recipient, <c>PrivateRead</c> to the author.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.MessagesController.#ctor(Microsoft.Extensions.Logging.ILogger{TTAR.API.Controllers.MessagesController},TTAR.Services.Abstractions.IMessagesService,TTAR.API.Auth.IAccountService,TTAR.Services.Abstractions.IPlayerService,TTAR.Services.Abstractions.IPlayerSafetyService)">
            <summary>
            Private messages. Live updates come through the chat hub (<c>/hubs/chat</c>): <c>PrivateMessage</c> to the
            recipient, <c>PrivateRead</c> to the author.
            </summary>
        </member>
        <member name="F:TTAR.API.Controllers.MessagesController.DefaultThreadPageSize">
            <summary>The thread page size when <c>take</c> is omitted.</summary>
        </member>
        <member name="F:TTAR.API.Controllers.MessagesController.MaxThreadPageSize">
            <summary>The largest thread page a client may ask for.</summary>
        </member>
        <member name="M:TTAR.API.Controllers.MessagesController.GetPrivateConversations(System.Threading.CancellationToken)">
            <summary>
            Retrieves conversations list of private messages grouped by senders. A blocked player's conversation stays
            listed (<c>sender.isBlockedByMe</c>); the client shows "you blocked this player" instead of the preview.
            </summary>
            <returns>List of top messages from each conversation</returns>
        </member>
        <member name="M:TTAR.API.Controllers.MessagesController.GetPrivateMessages(System.Int32,System.Nullable{System.Int32},System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Retrieves a page of the private messages with a player, oldest first. Pass the first shown message's id as
            <c>before</c> to load the previous page. <c>pageInfo.totalItems</c> is the whole thread's size on the first
            page only (no <c>before</c>); a scroll-back page leaves it 0 rather than recount the thread.
            </summary>
            <param name="fromId">Sender id (from)</param>
            <param name="before">Only messages older than this id; omitted = the newest page</param>
            <param name="take">Page size, at most 200; omitted = 50</param>
            <param name="cancellationToken">Cancellation token</param>
            <response code="200">The page</response>
            <response code="404">If the player with the specified ID is not found</response>
            <returns>List of messages</returns>
        </member>
        <member name="M:TTAR.API.Controllers.MessagesController.SendPrivateMessage(System.Int32,TTAR.API.Models.Requests.SendPrivateMessageRequest,System.Threading.CancellationToken)">
            <summary>
            Sends private message
            </summary>
            <param name="recipientId">Recipient id (to)</param>
            <param name="request">Request model containing geoPoint and content</param>
            <param name="cancellationToken">Cancellation token</param>
            <response code="200">Message sent successfully</response>
            <response code="403">A block stands between the two players (<c>PlayerBlocked</c>: by the caller; <c>BlockedByPlayer</c>: by the recipient)</response>
            <response code="404">If the player with the specified ID is not found</response>
            <response code="422">Invalid message content</response>
        </member>
        <member name="M:TTAR.API.Controllers.MessagesController.MarkPrivateMessagesRead(System.Int32,System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Marks the unread messages from <paramref name="fromId"/> to the caller as read, up to
            <paramref name="upToId"/>. The client calls it when the conversation is opened. Idempotent: a repeated call
            (or an unknown sender) changes nothing.
            </summary>
            <param name="fromId">Sender id (from)</param>
            <param name="upToId">
            The newest message id the client has shown; a message that arrived later stays unread. Omitted: all of them.
            </param>
            <param name="cancellationToken">Cancellation token</param>
            <response code="204">The conversation is read</response>
        </member>
        <member name="T:TTAR.API.Controllers.ModerationController">
            <summary>
            Chat moderation (ChatModerator or Admin): the queue of reported players, the decisions and their journal, the
            bans in force, the moderator's own settings. A decision from the geo chat's author menu lands here too.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.ModerationController.#ctor(TTAR.Services.Abstractions.IModerationService,TTAR.Configuration.TtarConfiguration,System.TimeProvider)">
            <summary>
            Chat moderation (ChatModerator or Admin): the queue of reported players, the decisions and their journal, the
            bans in force, the moderator's own settings. A decision from the geo chat's author menu lands here too.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.ModerationController.GetModerationQueue(System.Threading.CancellationToken)">
            <summary>The open reports grouped by player: threats first, then more reporters, then newer.</summary>
            <response code="200">The queue</response>
        </member>
        <member name="M:TTAR.API.Controllers.ModerationController.Decide(TTAR.API.Models.Requests.ModerationDecisionRequest,System.Threading.CancellationToken)">
            <summary>
            Decides on a player: every open report on them is closed; a ban is set (<c>BanChat</c> for the term, or
            until lifted; <c>BanAll</c> ends their sessions) and the messages asked for are deleted. "No violation" gives
            an auto-hidden message back; a ban hides the player's chat messages from everyone while it lasts.
            </summary>
            <response code="200">The journal row</response>
            <response code="404">No such player, or the message is not theirs</response>
            <response code="409">Decided already by another moderator, or an equal or wider ban in force (the body says which)</response>
            <response code="422">A ban without a reason, "Other" without a comment, a term outside a chat ban, a purge that does not fit</response>
        </member>
        <member name="M:TTAR.API.Controllers.ModerationController.RevertDecision(System.Int32,System.Threading.CancellationToken)">
            <summary>Undoes a decision: its ban is lifted, its deleted messages return, its reports are open again.</summary>
            <response code="204">Reverted</response>
            <response code="404">No such decision</response>
            <response code="409">Reverted already, or a lifted ban (nothing to undo)</response>
        </member>
        <member name="M:TTAR.API.Controllers.ModerationController.GetDecisions(System.Nullable{System.Int32},System.Int32,System.Threading.CancellationToken)">
            <summary>The journal, newest first; pass the last row's id as <c>before</c> for the next page.</summary>
            <response code="200">The page</response>
        </member>
        <member name="M:TTAR.API.Controllers.ModerationController.GetBans(System.Threading.CancellationToken)">
            <summary>The bans in force, newest first.</summary>
            <response code="200">The bans</response>
        </member>
        <member name="M:TTAR.API.Controllers.ModerationController.LiftBan(System.Int32,TTAR.Types.BanScope,System.Threading.CancellationToken)">
            <summary>Lifts the player's ban of that scope by hand; the reports it closed stay closed.</summary>
            <response code="204">Lifted</response>
            <response code="404">No active ban of that scope</response>
        </member>
        <member name="M:TTAR.API.Controllers.ModerationController.GetModerationSettings(System.Threading.CancellationToken)">
            <summary>The caller's moderation settings.</summary>
            <response code="200">The settings</response>
        </member>
        <member name="M:TTAR.API.Controllers.ModerationController.SetModerationSettings(TTAR.API.Models.Requests.ModerationSettingsRequest,System.Threading.CancellationToken)">
            <summary>Sets the caller's moderation settings.</summary>
            <response code="200">The settings</response>
        </member>
        <member name="T:TTAR.API.Controllers.PlacesController">
            <summary>
            Places on public maps as a source of venue fields: the "the club is already on the map" step of creating a venue.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.PlacesController.#ctor(TTAR.Places.IPlaceSuggestionService)">
            <summary>
            Places on public maps as a source of venue fields: the "the club is already on the map" step of creating a venue.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.PlacesController.ParsePlace(TTAR.API.Models.Places.ParsePlaceRequest,System.Threading.CancellationToken)">
            <summary>
            Reads a map link (Google Maps, Yandex Maps, 2GIS, OpenStreetMap, Apple Maps; short links and "share" text
            included) and suggests venue fields from the place's card. The response is a hint for the form and is not
            stored. Rating and reviews are never suggested.
            </summary>
            <param name="request">The link and, optionally, the card HTML the client loaded itself.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="T:TTAR.API.Controllers.PlayersController">
            <summary>
            Players profiles and settings
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.#ctor(Microsoft.Extensions.Logging.ILogger{TTAR.API.Controllers.PlayersController},TTAR.Services.Abstractions.IPlayerService,TTAR.API.Auth.IAccountService,TTAR.DataProviders.Abstractions.IGameRepository,TTAR.DataProviders.Abstractions.IPlayerTournamentsRepository,TTAR.Cache.IPlayerReadCache,TTAR.API.Auth.IRoleResolver,TTAR.ExternalRatings.Abstractions.IRatingConverter,TTAR.Services.Abstractions.IPlayerSafetyService,TTAR.DataProviders.Abstractions.IPlayerBansStore,System.TimeProvider)">
            <summary>
            Players profiles and settings
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.GetPlayer(System.Int32,System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Returns a player record with ratings
            </summary>
            <param name="playerId">Player's Id</param>
            <param name="jointGamesWithPlayerId">When provided, the amount of games played between <paramref name="playerId"/>
            and this player is calculated and exposed via <seealso cref="P:TTAR.API.Models.Responses.PlayerResponse.JointGames"/>. When omitted, no
            joint games are computed (the field stays <c>null</c>).</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>The player record with games</returns>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.GetJointGamesAsync(TTAR.DataProviders.Models.PlayerModel,System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Counts joint games between <paramref name="player"/> and the player identified by <paramref name="jointGamesWithPlayerId"/>.
            </summary>
            <param name="player">The player (with hands loaded) the games are counted for.</param>
            <param name="jointGamesWithPlayerId">The other player id, or <c>null</c> to skip the calculation.</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>The joint games breakdown, or <c>null</c> when no other player is requested or it is the player itself.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.GetPlayerTournaments(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Returns the tournaments a player took part in, newest first (by held date).
            </summary>
            <remarks>
            Public (player card is anonymous). Includes both native tournaments the player is a participant of and
            external (imported) tournaments they played in; each entry counts toward one rating axis. An unknown
            player simply yields an empty list — the card itself 404s via <see cref="M:TTAR.API.Controllers.PlayersController.GetPlayer(System.Int32,System.Nullable{System.Int32},System.Threading.CancellationToken)"/>.
            </remarks>
            <param name="playerId">Player's Id</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>The player's tournament participations, newest first.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.GetPlayerProfile(System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Returns player profile
            </summary>
            <param name="playerId">Target player id, logged used by default.
            Only admins can get someone else's profile.</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>The player profile</returns>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.GetPlayerChats(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Returns player associated chats
            </summary>
            <param name="playerId">Player's Id</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Collection of chats with the player's activity</returns>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.GetCommonChats(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Returns the accessible Telegram chats both the caller and the opponent are active in — the chats a game with
            the opponent can be registered in. Unlike <see cref="M:TTAR.API.Controllers.PlayersController.GetPlayerChats(System.Int32,System.Threading.CancellationToken)"/>, the rest of the opponent's chats stay hidden.
            </summary>
            <param name="opponentId">The opponent player id.</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>The common accessible chats; empty when there are none.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.GetRecentOpponents(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Returns the caller's latest distinct opponents, newest first — from the caller's games, both confirmed and still
            pending (discarded ones are skipped). Each row carries the same <see cref="P:TTAR.API.Models.Responses.SearchPlayerResponse.Distance"/> and
            <see cref="P:TTAR.API.Models.Responses.SearchPlayerResponse.NoConfirm"/> as the player search.
            </summary>
            <param name="limit">Maximum amount of opponents (1–20).</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>The recent opponents, the most recent first.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.GetMergeCandidate(System.Guid,System.Threading.CancellationToken)">
            <summary>
            Returns the profile of the player behind a custom Telegram token, so the client can preview a merge
            (see <see cref="M:TTAR.API.Controllers.PlayersController.MergePlayers(System.Guid,System.Threading.CancellationToken)"/>) without the token being redeemed as a login.
            </summary>
            <param name="token">Custom Telegram token issued by the Telegram sign-in in link mode</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>The profile of the player to be merged into the current one</returns>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.MergePlayers(System.Guid,System.Threading.CancellationToken)">
            <summary>
            Merges player profiles
            </summary>
            <param name="token">Custom Telegram token, identifies a profile to merge</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>The player record with games</returns>
            <remarks>If player id was changed, need to do refresh token action</remarks>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.ChangeProfileV1(System.Int32,TTAR.API.Models.Requests.ChangeProfileRequest,System.Threading.CancellationToken)">
            <summary>
            Changes a user profile
            </summary>
            <param name="playerId">User id</param>
            <param name="request">To change profile fields, set the field value to <c>null</c> if you wish to leave it unchanged</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns><c>false</c> if user not found (todo: or is admin)</returns>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.ChangeProfileV2(System.Int32,TTAR.API.Models.Requests.ChangeProfileRequest,System.Threading.CancellationToken)">
            <summary>
            Changes a user profile
            </summary>
            <param name="playerId">User id</param>
            <param name="request">
            Top-level fields: <c>null</c> leaves the field unchanged. The <c>personal</c> block is the exception: when
            present it is replaced AS A WHOLE (an omitted or <c>null</c> field inside clears the stored value, an omitted flag
            is <c>false</c>, <c>otherRatings</c> replaces the whole list); <c>null</c> leaves the block unchanged.
            </param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Updated player's profile</returns>
            <response code="400">A field is invalid (<c>ValidationFailed</c>, the message names the field).</response>
            <response code="409">The main hand or the gender is already set to another value (<c>MainHandAlreadySet</c> / <c>GenderAlreadySet</c>).</response>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.AddFcmToken(System.Int32,System.String,TTAR.PushNotifications.FcmPlatform,System.Threading.CancellationToken)">
            <summary>
            Adds FCM token to the user
            </summary>
            <param name="playerId">User id</param>
            <param name="token">FCM token</param>
            <param name="platform">The client platform the token was registered from. Web tokens receive
            data-only pushes (no browser auto-banner); Android/iOS keep the native notification block.
            Omitted/Unknown preserves the legacy visible-banner behaviour.</param>
            <param name="cancellationToken">Cancellation token</param>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.RemoveFcmToken(System.Int32,System.String,System.Threading.CancellationToken)">
            <summary>
            Removes the specified Firebase Cloud Messaging (FCM) token for the given player
            </summary>
            <remarks>Only administrators can remove FCM tokens for other players. Non-admin users can only
            remove their own tokens.</remarks>
            <param name="playerId">The unique identifier of the player whose FCM token is to be removed</param>
            <param name="token">The FCM token to be removed. This value cannot be null or empty</param>
            <param name="cancellationToken">A token to monitor for cancellation requests</param>
        </member>
        <member name="M:TTAR.API.Controllers.PlayersController.GetRatingHistory(System.Int32,TTAR.Types.HandType,System.Threading.CancellationToken)">
            <summary>
            Returns the rating history for a player
            </summary>
            <param name="playerId">The unique identifier of the player</param>
            <param name="handType">The type of hand for which to retrieve the rating history</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>A response containing the player's rating history</returns>
        </member>
        <member name="T:TTAR.API.Controllers.PushController">
            <summary>
            Manages push notifications on mobile clients.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.PushController.#ctor(TTAR.PushNotifications.IFcmNotificationService)">
            <summary>
            Manages push notifications on mobile clients.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.PushController.SendPushNotification(System.String,System.String,TTAR.PushNotifications.PushType,System.String)">
            <summary>
            Test method to send push notification to Emulator
            </summary>
            <param name="title">Notification title</param>
            <param name="body">Notification text</param>
            <param name="pushType">Type of push message, can be parsed by mobile app</param>
            <param name="token">Target device FCM token. If not provided, a default emulator token is used</param>
            <returns>Returns the message ID string if the push notification was sent successfully, otherwise null</returns>
        </member>
        <member name="T:TTAR.API.Controllers.RttfController">
            <summary>
            RTTF profile operations: preview a profile, link/unlink it to a player, and run the ownership confirmation.
            Linking may be done by the player themselves, an admin, or an organizer/co-organizer of a tournament the
            player takes part in; the link is created unconfirmed until the player proves ownership by posting the code
            on rttf.ru.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.RttfController.#ctor(Microsoft.Extensions.Logging.ILogger{TTAR.API.Controllers.RttfController},TTAR.ExternalRatings.Abstractions.IExternalProfileProvider,TTAR.ExternalRatings.Abstractions.IRttfThrottle,TTAR.DataProviders.Abstractions.IRttfRepository,TTAR.DataProviders.Abstractions.ITournamentRepository,TTAR.Tournaments.ITournamentService,TTAR.Services.Abstractions.IPlayerService,TTAR.Configuration.TtarConfiguration,TTAR.API.Auth.IRoleResolver,System.Collections.Generic.IEnumerable{TTAR.Notifications.INotificationService})">
            <summary>
            RTTF profile operations: preview a profile, link/unlink it to a player, and run the ownership confirmation.
            Linking may be done by the player themselves, an admin, or an organizer/co-organizer of a tournament the
            player takes part in; the link is created unconfirmed until the player proves ownership by posting the code
            on rttf.ru.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.RttfController.GetRttfProfile(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Loads a preview of an RTTF profile by id (used by the organizer dialog before linking).
            </summary>
            <param name="rttfId">RTTF profile id.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>The scraped profile preview, or an error if it cannot be loaded.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.RttfController.LinkRttfProfile(System.Int32,TTAR.API.Models.Rttf.LinkRttfRequest,System.Threading.CancellationToken)">
            <summary>
            Links an RTTF profile to a player as unconfirmed. Allowed for the player themselves, an admin, or an
            organizer/co-organizer of a tournament the player takes part in — for the organizer path the participant
            must have confirmed their participation (unless <see cref="P:TTAR.Configuration.TtarConfiguration.AllowStartWithoutConfirmation"/>).
            </summary>
            <param name="playerId">The player to link the profile to.</param>
            <param name="request">The RTTF profile id to link.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>The updated player profile.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.RttfController.DispatchProfileLinkedNotification(System.Int32,System.Int32)">
            <summary>
            Fans out the "an organizer linked your RTTF profile" notice across all channels without blocking or
            failing the request. Detached task on <see cref="P:System.Threading.CancellationToken.None"/> — the request token is
            cancelled once the response returns and would abort in-flight sends. Each channel self-gates.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.RttfController.UnlinkRttfProfile(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Unlinks the RTTF profile from a player. A confirmed link can only be removed by the player themselves;
            an unconfirmed link can be removed by the player or by whoever created it.
            </summary>
            <param name="playerId">The player to unlink.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>The updated player profile.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.RttfController.ConfirmRttfProfile(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Runs the ownership confirmation check for the caller's own RTTF link (reads the code posted on rttf.ru).
            </summary>
            <param name="playerId">The player confirming their own link.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>The updated player profile (check <see cref="P:TTAR.API.Models.Responses.PlayerProfileResponse.IsRttfProfileConfirmed"/>).</returns>
        </member>
        <member name="M:TTAR.API.Controllers.RttfController.CheckMayLinkAsync(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Checks whether the requester may link an RTTF profile on the target player's behalf: self, admin, or an
            organizer/co-organizer of a tournament the player takes part in. For the organizer path the participant
            must have confirmed their participation, unless <see cref="P:TTAR.Configuration.TtarConfiguration.AllowStartWithoutConfirmation"/>
            waives the confirmation gate (as it does for starting a tournament).
            </summary>
            <returns><c>null</c> if linking is allowed; otherwise the 403 error naming the reason.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.RttfController.ReloadProfileAsync(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Reloads the player profile after a mutation. The owner and admins get the full profile (the confirmation code
            only for the owner); anyone else allowed to link/unlink (an organizer, the link's creator) gets only the RTTF
            view, never the player's contacts or private profile fields.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.RttfController.MapLoadErrorAsync(TTAR.ExternalRatings.Abstractions.LoadProfileError,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Maps an RTTF load failure to an appropriate error response.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.RttfController.RttfRateLimited(System.TimeSpan)">
            <summary>
            rttf.ru limits our requests: 503 with <c>Retry-After</c> (seconds) left in its window.
            </summary>
        </member>
        <member name="T:TTAR.API.Controllers.SearchController">
            <summary>
            Search within database
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.SearchController.#ctor(Microsoft.Extensions.Logging.ILogger{TTAR.API.Controllers.SearchController},TTAR.DataProviders.Abstractions.IDbService,TTAR.API.Services.ICachedTopService,TTAR.Services.Abstractions.IPlayerService,TTAR.API.Auth.IAccountService,TTAR.Services.Abstractions.IPlayerSafetyService)">
            <summary>
            Search within database
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.SearchController.SearchPlayer(TTAR.API.Models.Requests.SearchPlayerRequest,System.Threading.CancellationToken)">
            <summary>
            Search a player though name, login, etc.
            </summary>
            <param name="request">Search parameters including pattern, page, and optional location</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Search results, 50 results by default</returns>
        </member>
        <member name="M:TTAR.API.Controllers.SearchController.SearchTelegramChat(TTAR.API.Models.Requests.SearchTelegramChatRequest,System.Threading.CancellationToken)">
            <summary>
            Searches for Telegram chats based on the specified request parameters.
            </summary>
            <param name="request">The search parameters including page, page size, and optional location.</param>
            <param name="cancellationToken">A token to monitor for cancellation requests.</param>
            <returns>A paged response containing the list of Telegram chats.</returns>
        </member>
        <member name="T:TTAR.API.Controllers.SitemapController">
            <summary>
            The web app's sitemap: its public tournaments and venues
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.SitemapController.#ctor(TTAR.DataProviders.Abstractions.ISitemapRepository,Microsoft.Extensions.Caching.Memory.IMemoryCache)">
            <summary>
            The web app's sitemap: its public tournaments and venues
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.SitemapController.GetSitemap">
            <summary>
            Returns the public tournaments and venues worth indexing. Built for everyone at once, so a new page shows up in
            it up to an hour late.
            </summary>
            <response code="200">The pages</response>
        </member>
        <member name="T:TTAR.API.Controllers.SystemController">
            <summary>
            Provides endpoints for system-related operations, including retrieving the current system status
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.SystemController.#ctor(TTAR.Services.Abstractions.ISystemService)">
            <summary>
            Provides endpoints for system-related operations, including retrieving the current system status
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.SystemController.GetSystemStatusAsync">
            <summary>
            Retrieves the current system status
            </summary>
            <returns>A <see cref="T:TTAR.Types.ApiResponses.SystemStatusResponse"/> object</returns>
        </member>
        <member name="M:TTAR.API.Controllers.SystemController.LogException(TTAR.API.Models.Requests.ExceptionLogRequest)">
            <summary>
            Logs an exception and sends the details to the SuperAdmin via Telegram
            </summary>
            <param name="request">The exception log request containing details about the exception</param>
            <returns>A task representing the asynchronous operation</returns>
        </member>
        <member name="M:TTAR.API.Controllers.SystemController.GetRankMapping(TTAR.Core.BotSettings)">
            <summary>
            Retrieves the mapping between <see cref="T:TTAR.Services.Rank"/> and their corresponding rating values
            </summary>
            <param name="botSettings">The bot settings containing the rank-rating mapping</param>
            <returns>A dictionary mapping each <see cref="T:TTAR.Services.Rank"/> to its rating value</returns>
        </member>
        <member name="T:TTAR.API.Controllers.TestController">
            <summary>
            Test controller
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TestController.#ctor">
            <summary>
            Test controller
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TestController.GetBot">
            <summary>
            Test useless controller to verify DB connection
            </summary>
            <returns>Just a bot name</returns>
        </member>
        <member name="M:TTAR.API.Controllers.TestController.GetCurrentAddress">
            <summary>
            Returns the request's URL
            </summary>
            <returns>URL</returns>
        </member>
        <member name="M:TTAR.API.Controllers.TestController.NotAuthenticated">
            <summary>
            Always 401
            </summary>
            <returns></returns>
        </member>
        <member name="T:TTAR.API.Controllers.TopController">
            <summary>
            Top players
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TopController.#ctor(TTAR.API.Services.ICachedTopService,TTAR.Services.Abstractions.IPlayerService)">
            <summary>
            Top players
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TopController.GetFullTop(System.Int32,System.Nullable{System.Int32},System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Returns top of players
            </summary>
            <param name="currentPage">A page to be returned</param>
            <param name="playerId">Display position of specified player in returned results</param>
            <param name="pageSize">Amount of items per page. Default value is <seealso cref="P:TTAR.Configuration.TtarConfiguration.PageSize"/></param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Top of players with position of specified player</returns>
        </member>
        <member name="M:TTAR.API.Controllers.TopController.GetFullTop(TTAR.API.Models.Requests.TopFullRequest,System.Threading.CancellationToken)">
            <summary>
            Returns top of players
            </summary>
            <param name="request">Search data</param>
            <param name="cancellationToken">Cancellation token</param>
            <returns>Top of players with position of specified player</returns>
        </member>
        <member name="M:TTAR.API.Controllers.TopController.GetActiveTop(TTAR.Types.TopInterval,System.Nullable{System.Int32},System.Int32,System.Nullable{System.Int32},System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Retrieves the active top players for a specified chat and interval
            </summary>
            <param name="topInterval">The interval over which to calculate the top players</param>
            <param name="chatId">The unique identifier of the chat for which to retrieve the active top players</param>
            <param name="currentPage">The current page number of the results to retrieve. Defaults to 1.</param>
            <param name="playerId">An optional player ID to include specific player position of specified player in returned results</param>
            <param name="pageSize">The number of players to include per page. If null, a default page size is used.</param>
            <param name="cancellationToken">A token to monitor for cancellation requests.</param>
            <returns>A <see cref="T:TTAR.API.Models.Responses.TopPageResponse"/> containing the list of active top players for the specified chat and
            interval</returns>
        </member>
        <member name="T:TTAR.API.Controllers.TournamentGuestLinkController">
            <summary>
            Guest link: merging a tournament guest (a profile-less participant) into a TTAR profile. Only the organizer merges
            (co-organizers do not), on their own pick or a player's "this guest is me" request, until the finish and 7 more
            days. Irreversible. The requests and the window come with <c>GET /tournaments/{id}</c> (<c>guestLinkRequests</c>,
            <c>guestLinkWindow</c>), the trace with each participant (<c>linkedFrom</c>). See Docs/Tournaments/guest-link.md.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentGuestLinkController.#ctor(TTAR.Tournaments.ITournamentService,System.TimeProvider)">
            <summary>
            Guest link: merging a tournament guest (a profile-less participant) into a TTAR profile. Only the organizer merges
            (co-organizers do not), on their own pick or a player's "this guest is me" request, until the finish and 7 more
            days. Irreversible. The requests and the window come with <c>GET /tournaments/{id}</c> (<c>guestLinkRequests</c>,
            <c>guestLinkWindow</c>), the trace with each participant (<c>linkedFrom</c>). See Docs/Tournaments/guest-link.md.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentGuestLinkController.GetGuestLinkPreview(System.Int32,System.Int32,System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>
            What merging the guest into a player would do — the "Что произойдёт" card of both sheets. Without
            <paramref name="playerId"/> — for the caller (the player's "Это вы?" sheet); another player's preview is the
            organizer's (or an admin's) only.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentGuestLinkController.GetGuestLinkCandidates(System.Int32,System.Int32,System.String,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Players the organizer may merge the guest into (organizer / admin only). An empty <paramref name="q"/> gives the
            players with a name like the guest's, then the latest registered; a query searches the names in both scripts
            (Cyrillic finds Latin and back), the look-alikes first and the tournament's participants last
            (<c>inTournament</c>, not pickable). Neither the organizer nor guests are listed.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentGuestLinkController.RequestGuestLink(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            The caller's "this guest is me" request; the organizer is notified. One Pending request per player in a
            tournament; a rejected one cannot be repeated for the same guest. 400 — the window is closed, the caller takes
            part under their own profile, already has a request, or was rejected.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentGuestLinkController.WithdrawGuestLinkRequest(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>The author withdraws their Pending request.</summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentGuestLinkController.RejectGuestLinkRequest(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>The organizer (or an admin) rejects a Pending request; the player is notified and may not repeat it.</summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentGuestLinkController.LinkGuest(System.Int32,System.Int32,TTAR.API.Models.Tournaments.LinkGuestRequest,System.Threading.CancellationToken)">
            <summary>
            The organizer (or an admin) merges the guest into a player — irreversible. Before the guest's games are rated
            the player takes its seat (Replace); after, a player without games takes the guest's games and rating
            (Transfer), any other gets the games without a recalculation (Append). With <c>requestId</c> it approves that
            request; the player's other requests and the guest's other ones close. The player is notified. Returns the
            participant row, now the player's (<c>linkedFrom</c> set). 409 — the window is closed, the player takes part,
            the guest was already merged, or the request was decided.
            </summary>
        </member>
        <member name="T:TTAR.API.Controllers.TournamentLadderController">
            <summary>
            Ladder tournaments: the players record their games — the score of a match, or of several at once — and confirm
            each other's; at the finish what was confirmed goes to the rating, and what still waits becomes ordinary games
            waiting for confirmation. Every endpoint answers 400 <c>TournamentTypeMismatch</c> for an ordinary tournament.
            See Docs/Tournaments/ladder.md.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.#ctor(TTAR.Tournaments.ITournamentService,System.TimeProvider)">
            <summary>
            Ladder tournaments: the players record their games — the score of a match, or of several at once — and confirm
            each other's; at the finish what was confirmed goes to the rating, and what still waits becomes ordinary games
            waiting for confirmation. Every endpoint answers 400 <c>TournamentTypeMismatch</c> for an ordinary tournament.
            See Docs/Tournaments/ladder.md.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.RegisterForLadder(System.Int32,TTAR.API.Models.Tournaments.RegisterRequest,System.Threading.CancellationToken)">
            <summary>
            Sign the caller up for a ladder — in Registration or while it runs (joining a running ladder from the bottom
            table). An ordinary or a running ladder seats the caller like <c>POST /register</c>. An even-only ladder before
            its start decides atomically: the caller either gets into the roster together with the player who waited for a
            pair (<c>pairedWithPlayerId</c>), completes an odd roster, or waits in the waitlist for a pair
            (<c>WaitingPair</c>; a repeated call updates the hand and phone and keeps the place). 400 <c>TournamentFull</c> —
            no seat is left: offer <c>POST /waitlist</c> (Registration only). The other errors are those of
            <c>POST /register</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.StartLadder(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Start a ladder now (organizer / co-organizer / admin; Draft or Registration) instead of waiting for its start
            time, when it starts by itself. Like an ordinary start, needs <c>minParticipants</c> and every participant
            confirmed (400 <c>UnconfirmedParticipants</c>, waived on Staging). No schedule or tables.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.SetLadderAutoStart(System.Int32,TTAR.API.Models.Tournaments.LadderAutoStartRequest,System.Threading.CancellationToken)">
            <summary>
            Turn the ladder's auto-start on or off (organizer / co-organizer / admin; Draft or Registration, else 400
            <c>InvalidTournamentStatus</c>). With it on, the ladder starts by itself at its start time — or, short of
            participants or confirmations then, as soon as the roster is complete (the managers are told once that it did
            not start). Starting earlier by hand still works. Either way, a ladder is closed 12 hours after its scheduled
            start: cancelled if not started, finished if running.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.FinishLadder(System.Int32,TTAR.API.Models.Tournaments.LadderFinishRequest,System.Threading.CancellationToken)">
            <summary>
            Finish a running ladder (organizer, admin, or a co-organizer with the finish right). Closes the records — no new
            games — and registers them all for rating by <c>regMode</c>. The confirmed ones are rated now: Total (default) —
            one game per pair with the sum of its confirmed games; Each — every confirmed game on its own. What still waits
            becomes ordinary games waiting for the opponent's confirmation (<c>GET /games/unconfirmed</c>, the bot's
            confirmation cards, the ladder's chat): Each — every Pending game on its own; Total — one game per author with
            the sum of their Pending games against that opponent. With
            <c>autoConfirmDays</c> (1 or 3) the waiting games count automatically that many days later; without it they
            expire like ordinary games. The body may be omitted — Total, no auto-confirm.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.SetLadderAutoConfirm(System.Int32,TTAR.API.Models.Tournaments.LadderAutoConfirmRequest,System.Threading.CancellationToken)">
            <summary>
            Change the auto-confirm period of a running or finished ladder (organizer / co-organizer / admin; before the
            start it is part of <c>PUT /tournaments/{id}</c>). The waiting games of a finished ladder whose new deadline has
            already passed count right away, in this call.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.UpdateLadderRules(System.Int32,TTAR.API.Models.Tournaments.UpdateLadderRulesRequest,System.Threading.CancellationToken)">
            <summary>
            Change the game rules of a running ladder (organizer / co-organizer / admin): sets in a game (1–5), the balance
            at 10:10, the draw rule (an even number of sets only, stored false otherwise), the seating of the draw at the
            tables (the draw is not reshuffled). A null field stays as it is. The recorded games are not touched; the
            announcement is redrawn. Before the start the rules are part of
            <c>PUT /tournaments/{id}</c>; the roster rule, date, venue and admission do not change while the ladder runs.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.RecordLadderGame(System.Int32,TTAR.API.Models.Tournaments.RecordLadderGameRequest,System.Threading.CancellationToken)">
            <summary>
            Record a game of the caller (an active, confirmed participant) against another participant while the ladder
            runs: the score of one match or, entered as a free score, of several at once. By the rules every set is played
            (<c>setsMine + setsOpponent</c> = the ladder's <c>setsInMatch</c>, or a multiple of it), but a score off the rules
            is accepted too: the client warns and asks, the opponent confirms what was really played. 400
            <c>LadderScoreInvalid</c> only for no sets at all or more than 99 a side. The opponent is asked to confirm it; it
            goes to the rating at the finish. Every record is decided on its own: no duplicate check (the client offers to
            confirm the opponent's Pending record against the caller instead), the opponent rejects a duplicate.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.RecordLadderGames(System.Int32,TTAR.API.Models.Tournaments.RecordLadderGamesRequest,System.Threading.CancellationToken)">
            <summary>
            Record several games of the caller at once, atomically — the same rules as <c>POST …/games</c> for each. Any
            invalid item fails the whole call.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.ConfirmLadderGame(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            The opponent confirms a Pending game. While the ladder runs it goes to the rating at the finish; after the
            finish this confirms (and rates) the ordinary game it waits as — in a Total ladder the game of all the author's
            waiting records against the caller. 409 <c>LadderGameNotPending</c> — already decided: reload, show no error.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.ConfirmAllLadderGames(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Confirm every Pending game waiting for the caller ("Подтвердить все"); after the finish — every game of the
            ladder waiting for the caller. Returns the games this call confirmed (possibly none).
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.RejectLadderGame(System.Int32,System.Int32,TTAR.API.Models.Tournaments.RejectLadderGameRequest,System.Threading.CancellationToken)">
            <summary>
            The opponent rejects a Pending game (not played / a different score / a duplicate); its author is notified. A
            rejected game never counts. After the finish this discards the ordinary game it waits as (in a Total ladder all
            the author's waiting records against the caller go with it). Same errors as confirm.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentLadderController.WithdrawLadderGame(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            The author withdraws their undecided record (Pending, or Expired) — also after the finish, when the ordinary game
            it waits as is discarded (in a Total ladder with all the author's waiting records against that opponent); it is
            deleted.
            </summary>
        </member>
        <member name="T:TTAR.API.Controllers.TournamentsController">
            <summary>
            Native tournaments management
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.#ctor(TTAR.DataProviders.Abstractions.ITournamentRepository,TTAR.DataProviders.Abstractions.IPlayerRepository,TTAR.Tournaments.ITournamentCalculator,TTAR.Tournaments.ITournamentService,TTAR.Tournaments.ITournamentParticipationTokenService,TTAR.Tournaments.Rttf.IRttfExportService,TTAR.Configuration.TtarConfiguration,TTAR.Cache.ITournamentReadCache,System.TimeProvider)">
            <summary>
            Native tournaments management
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.CanManage(TTAR.DataProviders.Models.TournamentModel,System.Int32)">
            <summary>
            Whether <paramref name="playerId"/> may run the tournament — the organizer, any co-organizer, or an admin.
            This is the broadened "organizer" check every organizer endpoint authorizes against (finishing is stricter:
            it also needs the co-organizer's <c>CanFinish</c> flag, enforced in the service). Returns <c>false</c> for a
            null tournament. Requires the tournament to have been loaded via <c>GetTournamentAsync</c>, which always
            includes the co-organizer roster.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.MaySeeParticipantRttfPii(TTAR.DataProviders.Models.TournamentModel,System.Int32)">
            <summary>
            Whether <paramref name="callerId"/> may see this tournament's participant RTTF PII: a manager
            (organizer / co-organizer / admin) or a confirmed participant of the same tournament. Others (outside
            viewers, anonymous callerId 0, unconfirmed participants) may not. Requires the tournament to have been
            loaded with its participants. This only decides the caller's eligibility — each row still ANDs it with
            its own <c>Confirmed</c> flag inside <see cref="M:TTAR.API.Models.Tournaments.ParticipantResponse.From(TTAR.DataProviders.Models.TournamentParticipantModel,System.Boolean,System.Nullable{System.Int32},System.Int32,System.Boolean,System.Boolean)"/>.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.MayContainActive(System.Nullable{TTAR.Types.TournamentStatus},TTAR.Types.TournamentStatus[])">
            <summary>
            Whether the requested status filter can yield an Active tournament: no status filter at all (mixed feed),
            or one that explicitly includes <see cref="F:TTAR.Types.TournamentStatus.Active"/>. Drives whether the list query pays
            to load matches (see <see cref="P:TTAR.DataProviders.TournamentFilter.IncludeMatchesForActive"/>).
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.GetTournaments(System.Nullable{TTAR.Types.TournamentStatus},TTAR.Types.TournamentStatus[],System.Nullable{TTAR.Types.TournamentType},System.Nullable{TTAR.Types.TournamentAccess},System.Nullable{System.Int32},System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Nullable{System.Double},System.Nullable{System.Double},System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Returns a paginated list of tournaments. All filters are optional and combine with AND;
            <paramref name="status"/> and <paramref name="statuses"/> combine with each other as a union.
            </summary>
            <param name="status">Single status filter.</param>
            <param name="statuses">Status set filter (repeatable query param, e.g. statuses=Finished&amp;statuses=Cancelled). Unioned with <paramref name="status"/>.</param>
            <param name="tournamentType">Tournament format filter.</param>
            <param name="access">Access-mode filter: <c>Open</c> or <c>Invite</c>. Omitted returns both ("any"). The spec's default-hide-others'-closed rule is part of the (out-of-scope) list-filters work.</param>
            <param name="chatId">Linked Telegram chat id filter.</param>
            <param name="mine">When true and the caller is authenticated, returns only tournaments the caller organizes, co-organizes, actively participates in or waits in the waitlist of (including their own drafts). Ignored for anonymous callers.</param>
            <param name="freeSeatsOnly">When true, hides tournaments without a free seat (active participants + waitlist ≥ limit: seats held for the queue are not free) — except those the caller organizes, co-organizes, participates in or waits in the waitlist of. Uncapped tournaments always pass.</param>
            <param name="hideExpired">When true, hides registrations whose start date is already in the past.</param>
            <param name="hideEmptyCancelled">When true, hides Cancelled tournaments that never had any participant (HadParticipants=false). Keeps the Past feed pagination even.</param>
            <param name="includeLadders">True — the client supports ladders. Omitted, ladders are hidden: apps released before ladders cannot read such a response.</param>
            <param name="longitude">Optional longitude for distance calculation.</param>
            <param name="latitude">Optional latitude for distance calculation.</param>
            <param name="currentPage">1-based page number.</param>
            <param name="pageSize">Page size, clamped to 1..100.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.GetTournament(System.Int32,System.Nullable{System.Double},System.Nullable{System.Double},System.Boolean,System.Boolean,System.Boolean,System.Threading.CancellationToken)">
            <summary>
            Returns full tournament details including participants and schedule
            </summary>
            <param name="tournamentId">Tournament id</param>
            <param name="longitude">Optional longitude for distance calculation</param>
            <param name="latitude">Optional latitude for distance calculation</param>
            <param name="includeQueue">Fold the live table board + call queue into <c>TournamentResponse.Queue</c> so an open page loads it in one request instead of a second GET /queue. Populated only for an Active tournament; ignored otherwise.</param>
            <param name="includeStandings">Fold the current/final standings into <c>TournamentResponse.Standings</c> so an open page loads them in one request instead of a second GET /standings. Populated only for Active / Finished / cancelled-with-matches; ignored otherwise.</param>
            <param name="includeLadders">True — the client supports ladders. Omitted, a ladder answers 404 <c>TournamentNotFound</c>: apps released before ladders cannot read such a response.</param>
            <param name="cancellationToken">Cancellation token</param>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.GetMatches(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Returns list of matches for a tournament
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.GetQueue(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Returns the live table board and waiting call queue for a tournament: which live match sits on each
            table, which pair to call onto a free table, and the ordered queue of waiting pairs. The order is the
            call priority — clients render it as-is and must not re-sort. Available to everyone (same as the
            tournament details): organizer and spectator get the same, non-personalized response.
            </summary>
            <param name="tournamentId">Tournament id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.GetParticipants(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Returns list of active participants for a tournament
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.GetStandings(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Returns current or final tournament standings
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.ExportRttf(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Exports a finished tournament as a TournamentManager <c>.rttf</c> file (XML) with every played game.
            The organizer opens it in TM, checks the players' RTTF links there, and pushes the results to rttf.ru.
            Restricted to the organizer, a co-organizer, or an admin; only for a Finished tournament.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.GetTournamentCalendar(System.Int32,System.String,System.Threading.CancellationToken)">
            <summary>
            The tournament as an event of the caller's calendar: time span (duration from the schema calculator), place,
            localized description and the Google / Outlook "add event" links. Only for a tournament open for
            registration with a start date, and only for a player of its roster (not the waitlist) or its organizers.
            </summary>
            <param name="tournamentId">Tournament ID.</param>
            <param name="lang">Language of the texts (the client's UI language, e.g. <c>pt-BR</c>); falls back to
            Accept-Language, then the player's language, then the default.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.GetTournamentCalendarIcs(System.Int32,System.String,System.String,System.Threading.CancellationToken)">
            <summary>
            The same event as <see cref="M:TTAR.API.Controllers.TournamentsController.GetTournamentCalendar(System.Int32,System.String,System.Threading.CancellationToken)"/> as an iCalendar (<c>.ics</c>) file, with one reminder
            per value of <paramref name="alarms"/>.
            </summary>
            <param name="tournamentId">Tournament ID.</param>
            <param name="alarms">Reminder lead times in minutes, comma-separated (<c>30,45</c>): up to 3 values, 0–1440
            each. Empty — no reminders.</param>
            <param name="lang">Language of the texts, as in <see cref="M:TTAR.API.Controllers.TournamentsController.GetTournamentCalendar(System.Int32,System.String,System.Threading.CancellationToken)"/>.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.GetTournamentCalendarCancelIcs(System.Int32,System.String,System.Threading.CancellationToken)">
            <summary>
            The caller's event of <see cref="M:TTAR.API.Controllers.TournamentsController.GetTournamentCalendar(System.Int32,System.String,System.Threading.CancellationToken)"/> cancelled, as an iCalendar (<c>.ics</c>) file
            (same UID, METHOD:CANCEL, STATUS:CANCELLED): imported, it removes the added event or marks it cancelled. Only
            once the event no longer stands for the caller — the tournament is cancelled, or the caller is out of its roster
            (removed, left, on the waitlist, or never in it) and does not run it; the tournament must have a start date.
            </summary>
            <param name="tournamentId">Tournament ID.</param>
            <param name="lang">Language of the texts, as in <see cref="M:TTAR.API.Controllers.TournamentsController.GetTournamentCalendar(System.Int32,System.String,System.Threading.CancellationToken)"/>.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.Calculate(TTAR.API.Models.Tournaments.TournamentCalculatorRequest)">
            <summary>
            Calculates tournament duration and table recommendations (legacy flat format). Kept for backward
            compatibility; values now follow the schema engine (§8-C). Prefer the POST variant for the configurable
            schema and the per-stage breakdown.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.CalculateBySchema(TTAR.API.Models.Tournaments.TournamentCalculatorSchemaRequest)">
            <summary>
            Calculates tournament duration, per-stage breakdown, table recommendation and warnings for a
            configurable schema. Formulas match the client's calcSchema 1:1 (ТЗ §5).
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.Register(System.Int32,TTAR.API.Models.Tournaments.RegisterRequest,System.Threading.CancellationToken)">
            <summary>
            Register current player in the tournament
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.CancelRegistration(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Cancel registration for current player. A running ladder may be left too, open or closed, whatever its
            even-only rule: the player leaves the roster, while the games they recorded or were recorded against stay — they
            can still be decided (by the player too) and are registered at the finish. Signing up again is possible.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.JoinWaitlist(System.Int32,TTAR.API.Models.Tournaments.RegisterRequest,System.Threading.CancellationToken)">
            <summary>
            Join the waitlist ("запас") of a full open tournament. Only while registration is open and no seat is free for
            the caller — free seats are held for those already queued, so a tournament with a queue is full for a newcomer
            even below the limit. With a seat free for the caller the call is refused (409 <c>WaitlistNotFull</c>) and the
            client should offer the ordinary registration. Same body as <c>POST /register</c>: the hand is carried over to
            the participant, the phone goes to the managers. When the caller's turn comes, the server moves them into the
            roster itself (confirmed). A repeated call updates the hand/phone and keeps the place in the queue. 409
            <c>AlreadyRegistered</c> also when a seat freed at that very moment and this call moved the caller straight into
            the roster — reload the tournament instead of showing an error.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.LeaveWaitlist(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Leave the waitlist (the current player).
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.RemoveFromWaitlist(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Take a player off the waitlist (organizer / co-organizer / admin).
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.PreviewLimitCut(System.Int32,System.Byte,System.Nullable{System.Boolean},System.Nullable{TTAR.Types.TournamentAccess},System.Threading.CancellationToken)">
            <summary>
            Who saving the edit form with these values would move from the roster to the waitlist now (organizer /
            co-organizer / admin) — the same rule as <c>PUT /tournaments/{id}</c>: only when the edit takes seats away
            (an even-only ladder's odd limit counts as the even one below it) in an open tournament before its start; the
            unconfirmed first, then the latest to register; guests stay. Otherwise an empty answer.
            </summary>
            <param name="tournamentId">Tournament id.</param>
            <param name="maxParticipants">The limit in the form.</param>
            <param name="evenOnly">A ladder's even-roster rule in the form; the stored one when omitted. Ignored for other tournaments.</param>
            <param name="access">The access in the form; the stored one when omitted.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.PromoteFromWaitlist(System.Int32,System.Int32,TTAR.API.Models.Tournaments.PromoteFromWaitlistRequest,System.Threading.CancellationToken)">
            <summary>
            Move a waiting player into the roster out of the queue order (organizer / co-organizer / admin, before start) —
            free seats already go to the queue head automatically. The participant is confirmed right away — the player
            queued up themselves. When no seat is left for this player (the roster is full, or the free seats are held for
            those queued ahead of them), <c>overLimit: false</c> is refused with 409 <c>ParticipantLimitReached</c>: the
            client shows the "over the limit" warning and repeats the call with <c>overLimit: true</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.SubmitScore(System.Int32,System.Int32,TTAR.API.Models.Tournaments.SubmitMatchScoreRequest,System.Threading.CancellationToken)">
            <summary>
            Submit match score
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.EditMatchScore(System.Int32,System.Int32,TTAR.API.Models.Tournaments.SubmitMatchScoreRequest,System.Threading.CancellationToken)">
             <summary>
             Edit the score of an already-completed match — an organizer / co-organizer correction of a past result.
             Allowed while the tournament is Active or Finished.
            
             Active: one-day formats register games for rating only at finish, so the corrected score simply overwrites
             the stored result without a rating recalculation; a match already rated (multi-day/League — a game was
             registered) returns 409 until the tournament finishes. When the correction flips the winner: if the
             tournament had already moved on the score is saved but nothing is replayed and the response warns that the
             edit no longer affects the tournament (<see cref="P:TTAR.API.Models.Tournaments.EditMatchScoreResponse.DoesNotAffectTournament"/>); if the
             downstream was still merely queued, the stale advancement is rolled back and the correct winner/loser advanced.
            
             Finished: the linked game is re-rated in place (real Elo for the new score) for the two players only; the
             registered results (places, other players' deltas) stay frozen and the two players + the registration chat
             are notified. A finished match with no rated game (a walkover) returns 400 (match-not-rated); a game
             previously cancelled here is re-registered fresh. A non-admin correction is allowed only within
             <see cref="P:TTAR.Configuration.TtarConfiguration.TournamentEditTimeoutDays"/> of the finish, else 403 (edit-window-expired).
             </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.CancelMatch(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Cancel the rated game of a match — the equivalent of <c>/revert</c> for a single tournament game. Rolls the
            game's rating fully back off both players, marks the game discarded and detaches it from the match so it
            reads as unplayed (for rating) and cannot be cancelled again. The match's own status and recorded score are
            left untouched, and the tournament's registered results (places, other players' deltas) never move — only
            the two players' rating is rolled back. Organizer / co-organizer only, and — for a non-admin — only within
            <see cref="P:TTAR.Configuration.TtarConfiguration.TournamentEditTimeoutDays"/> of the finish (else 403, edit-window-expired). The
            two players and the registration chat are notified. A match with no rated game (a walkover) returns 400.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.ConfirmScore(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Confirm opponent's submitted score
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.MayLinkChatAsync(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Whether the caller may link a tournament to the chat: an admin, or a player active in it (the chats the client
            offers, <c>GET players/chats/{id}</c>).
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.NewAnnounceTarget(TTAR.DataProviders.Models.TournamentModel,TTAR.API.Models.Tournaments.UpdateTournamentRequest)">
            <summary>
            The chat an edit newly points the announcement at — another chat, or another own topic of the linked one; null
            when it points nowhere new (unchanged, unlinked, or back to the chat's settings).
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.CheckAnnounceTopic(TTAR.API.Models.Tournaments.CheckAnnounceTopicRequest,System.Threading.CancellationToken)">
            <summary>
            Checks the bot can post into the topic of the chat — the check a save runs on <c>announceTopicId</c>, so the
            form can tell the user before saving. The save checks again: the bot's rights may change in between.
            </summary>
            <remarks>
            The check posts a silent message into the topic and deletes it at once; a success is remembered for two
            minutes, for this endpoint and the save alike. Only a player active in the chat or an admin may check it.
            </remarks>
            <response code="204">The bot can post into the topic (or there is nothing to check: General, an inaccessible chat).</response>
            <response code="400"><c>AnnounceTopicUnavailable</c> — the bot cannot post there; <c>ValidationFailed</c> — bad ids.</response>
            <response code="403"><c>ChatLinkForbidden</c> — the caller is not active in the chat.</response>
            <response code="429">Too many checks.</response>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.CreateTournament(TTAR.API.Models.Tournaments.CreateTournamentRequest,System.Threading.CancellationToken)">
            <summary>
            Create a new tournament
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.UpdateTournament(System.Int32,TTAR.API.Models.Tournaments.UpdateTournamentRequest,System.Threading.CancellationToken)">
            <summary>
            Update tournament settings (only before start).
            Changing critical fields (start date/time, place, entry fee) resets participant confirmations
            for everyone but the organizer and notifies them.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.AnnounceFormError(TTAR.Tournaments.TournamentServiceError)">
            <summary>Maps an announce-topic error of the create / update form to a 400, or null when the error is not one.</summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.LadderFormError(TTAR.Tournaments.TournamentServiceError)">
            <summary>
            Maps a ladder-rule error of the create / update form to a 400, or null when the error is not one of them.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.CoOrganizerFormError(TTAR.Tournaments.TournamentServiceError)">
            <summary>
            Maps a co-organizer validation error raised while accepting the roster inline in the create / update form
            to a 400 with the same <see cref="T:TTAR.Types.ApiResponses.ErrorCode"/> as the CRUD co-organizer endpoints, so the client handles
            both paths identically.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.StartTournament(System.Int32,TTAR.API.Models.Tournaments.StartTournamentRequest,System.Threading.CancellationToken)">
            <summary>
            Start the tournament: generate schedule and assign tables
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.CancelTournament(System.Int32,System.Boolean,System.Threading.CancellationToken)">
            <summary>
            Cancel the tournament. By default the tournament is marked "not held" and no rating is affected.
            When <paramref name="registerCompleted"/> is true (only meaningful for a running tournament), the
            matches already played out (Completed — walkovers never count) are registered as games and fed into
            the Elo recalculation before the tournament moves to Cancelled.
            </summary>
            <param name="tournamentId">Tournament id.</param>
            <param name="registerCompleted">When true, register the games already played for a rating recalculation. Default false (backward compatible: plain cancel, no games).</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.FinishTournament(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Finish the tournament (organizer confirms after reviewing results)
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.CallMatch(System.Int32,System.Int32,TTAR.API.Models.Tournaments.CallMatchRequest,System.Threading.CancellationToken)">
            <summary>
            Call players to a specific table for a match. The organizer chooses the table via the request body
            (required on the first call; optional on a recall to keep the current table). A recall bumps the call
            counter and re-notifies the players.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.MoveMatch(System.Int32,System.Int32,TTAR.API.Models.Tournaments.MoveMatchRequest,System.Threading.CancellationToken)">
            <summary>
            Move a called match to another table. If the target table hosts another live match, the two matches
            swap tables. Organizer only.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.UnassignMatch(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Release a called match from its table: the pair returns to the queue as Scheduled with no table.
            Organizer only.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.SetTablesCount(System.Int32,TTAR.API.Models.Tournaments.SetTablesCountRequest,System.Threading.CancellationToken)">
            <summary>
            Change the number of tables of a running tournament. Growing always succeeds. Shrinking removes tables from
            the top of the list: it is rejected when the new count is below the number of tables currently in use
            (free some tables first), and any live pair sitting on a table above the new count is renumbered down onto
            a freed low table so no pair is left out of range. Organizer, co-organizer or admin only.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.FillFreeTables(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Manually seat the next ready pairs onto the free tables — the "call now" action — independent of the
            tournament's auto-call flag. Runs the same fairness-ordered fill the automatic auto-call uses across every
            currently-free table; each seated pair is called and both players notified. Idempotent: with no free table
            or no ready pair nothing changes and the tournament is returned unchanged. Organizer, co-organizer or admin
            only, Active only.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.SetStageSets(System.Int32,TTAR.API.Models.Tournaments.SetStageSetsRequest,System.Threading.CancellationToken)">
            <summary>
            Change the sets-to-win of one stage of a running tournament (e.g. bump the bracket to best-of-5 mid-event).
            Applies to that stage's unplayed matches only — matches already completed, forfeited or awaiting score
            confirmation keep the value they were played under; the stored schema for the stage is updated so a
            not-yet-generated second stage inherits the new value. Organizer, co-organizer or admin only, Active only.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.ChangeFormat(System.Int32,TTAR.API.Models.Tournaments.ChangeFormatRequest,System.Threading.CancellationToken)">
            <summary>
            Replace the format of a RUNNING tournament with what its played matches still allow — see
            <c>TournamentResponse.FormatEditScope</c>. Nothing played (<c>Full</c>): the whole format (type, stages,
            sets) is replaced and the schedule regenerated over the roster; pairs already called to a table are
            released. Group matches played (<c>SecondStage</c>): only the second stage (the finals) is replaced — rebuilt
            at once if the groups are complete, else when they finish. Second-stage or single-stage matches played
            (<c>None</c>): only the sets-to-win apply, to unplayed matches. The body is the start request's pair (type +
            schema, no tables); a request that alters a locked part is refused with 409 FormatLocked and nothing is
            touched. Organizer, co-organizer or admin only, Active only. Bumps the version so open clients reload.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.SetRecap(System.Int32,TTAR.API.Models.Tournaments.SetRecapRequest,System.Threading.CancellationToken)">
            <summary>
            Set (or clear) the organizer's finish recap — the free-text summary shown on a finished tournament's page.
            Organizer or any co-organizer (no finish right required); allowed only while the tournament is Finished. An
            empty or whitespace-only body clears the recap. Bumps the tournament version so open clients refresh.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.AddCoOrganizer(System.Int32,TTAR.API.Models.Tournaments.AddCoOrganizerRequest,System.Threading.CancellationToken)">
            <summary>
            Adds a co-organizer to the tournament, or updates the finish right of an existing one (idempotent on the
            player). The target must be an existing, non-guest player other than the organizer; the roster is capped
            at 5. Allowed while the tournament is Draft / Registration / Active, by the organizer, any co-organizer,
            or an admin. Notifies the assignee. Does not reset participant confirmations.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.SetCoOrganizerCanFinish(System.Int32,System.Int32,TTAR.API.Models.Tournaments.SetCoOrganizerCanFinishRequest,System.Threading.CancellationToken)">
            <summary>
            Changes a co-organizer's finish right. Same authorization and status rules as
            <see cref="M:TTAR.API.Controllers.TournamentsController.AddCoOrganizer(System.Int32,TTAR.API.Models.Tournaments.AddCoOrganizerRequest,System.Threading.CancellationToken)"/>. Notifies the co-organizer.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.RemoveCoOrganizer(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Removes a co-organizer. Same authorization and status rules as <see cref="M:TTAR.API.Controllers.TournamentsController.AddCoOrganizer(System.Int32,TTAR.API.Models.Tournaments.AddCoOrganizerRequest,System.Threading.CancellationToken)"/>. Notifies the
            removed co-organizer.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.CoOrganizerResult(System.Int32,TTAR.DataProviders.Models.TournamentModel,System.Nullable{TTAR.Tournaments.TournamentServiceError})">
            <summary>
            Maps the shared result shape of the three co-organizer endpoints (add / set-right / remove) to an
            HTTP response. On success returns the updated tournament so the client re-renders the roster in one round-trip.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.StartMatch(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Confirm match start (optional — records StartedAt for statistics)
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.EndMatch(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Record match end time (optional — can be called before score submission)
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.AddParticipant(System.Int32,System.Int32,TTAR.Types.HandType,System.Threading.CancellationToken)">
            <summary>
            Manually add a participant (organizer only)
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.AddGuestParticipant(System.Int32,TTAR.API.Models.Tournaments.AddGuestParticipantRequest,System.Threading.CancellationToken)">
            <summary>
            Add a one-off tournament guest (organizer only): creates a profile-less, name-only player that cannot log
            in and adds it as an already-confirmed participant. The guest is rated as an ordinary newcomer (starts at
            1000, no qualification points) and exists only for this tournament — it never appears in search or tops.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.ConfirmParticipation(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Confirm participation for a manually added participant.
            Callable by the participant themselves, the organizer or an admin.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.ConfirmParticipationByToken(TTAR.API.Models.Tournaments.ConfirmByTokenRequest,System.Threading.CancellationToken)">
            <summary>
            Confirm participation using the one-time token from an invitation email. Anonymous: the token itself
            authorizes the confirmation (mirrors the password-reset flow), so it does not rely on the caller's session.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.SetParticipantHand(System.Int32,System.Int32,TTAR.API.Models.Tournaments.UpdateParticipantRequest,System.Threading.CancellationToken)">
            <summary>
            Change a participant's rating hand (organizer/admin only, before start).
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.SetParticipantSeedRating(System.Int32,System.Int32,TTAR.API.Models.Tournaments.SetParticipantSeedRatingRequest,System.Threading.CancellationToken)">
            <summary>
            Set a participant's seeding rating (organizer/admin only, before start). Used only for group split /
            bracket placement — it does not affect the rating delta. Null clears the override.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.SetParticipantPaid(System.Int32,System.Int32,TTAR.API.Models.Tournaments.SetParticipantPaidRequest,System.Threading.CancellationToken)">
            <summary>
            Set a participant's "entry fee received" mark (organizer/co-organizer/admin). Public bookkeeping mark
            only — no cashier, no amounts. Allowed at any status except cancelled (after the finish too) and, unlike confirmation,
            never reset when critical tournament fields change.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.RemoveParticipant(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Remove a participant (before start). Behaviour depends on who calls:
            <list type="bullet">
            <item>An invited player removing THEIR OWN row in a closed (Invite) tournament <b>declines</b> the invitation:
            the row moves to the manager-only "Отказались" list (kept, re-invitable) and the response carries
            <c>{ declined: true }</c> so the client shows the decline group.</item>
            <item>Otherwise (organizer removing someone / a self-cancel in an open tournament) it removes the participant:
            self-removal hard-deletes (the player may re-register freely), an organizer removing someone else soft-deletes
            (that player cannot rejoin on their own). Returns 204.</item>
            <item>A running ladder: the organizer may take off anyone — the soft removal keeps the games played (they are
            still decided and registered at the finish), like a disqualification. Any participant (but an invited one who
            has not accepted yet — that is the decline above) taking off themselves leaves it as <c>DELETE /register</c>
            does. 400 once the ladder is over.</item>
            </list>
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.DropDeclined(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Remove a player from the closed tournament's declined list (the "убрать из списка отказов" ✕). The
            (tournamentId, playerId) declined row is hard-deleted so the slot is free to be invited fresh later.
            Organizer / co-organizer / admin only, before start.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentsController.RecordWalkover(System.Int32,System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Record walkover (forfeit) for a match
            </summary>
        </member>
        <member name="T:TTAR.API.Controllers.TournamentTemplatesController">
            <summary>
            Tournament templates: the create form's settings saved under a name (Docs/Tournaments/templates.md). A personal
            template is its author's only; a club one is shared by the venue's owner and representatives on equal terms.
            Applying a template is client-side — the server stores, normalizes and counts applications.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentTemplatesController.#ctor(TTAR.Tournaments.Templates.ITournamentTemplateService)">
            <summary>
            Tournament templates: the create form's settings saved under a name (Docs/Tournaments/templates.md). A personal
            template is its author's only; a club one is shared by the venue's owner and representatives on equal terms.
            Applying a template is client-side — the server stores, normalizes and counts applications.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentTemplatesController.GetMyTournamentTemplates(System.Threading.CancellationToken)">
            <summary>The caller's personal templates and the club templates of every venue the caller owns or represents.</summary>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentTemplatesController.CreateTournamentTemplate(TTAR.API.Models.Tournaments.CreateTournamentTemplateRequest,System.Threading.CancellationToken)">
            <summary>Saves a new template — personal, or for a club the caller owns or represents.</summary>
            <param name="request">The template's name, scope, kind and create-form settings.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentTemplatesController.UpdateTournamentTemplate(System.Int32,TTAR.API.Models.Tournaments.UpdateTournamentTemplateRequest,System.Threading.CancellationToken)">
            <summary>Renames a template and/or replaces its settings.</summary>
            <param name="templateId">Template id.</param>
            <param name="request">The fields to change; omitted ones stay.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentTemplatesController.DeleteTournamentTemplate(System.Int32,System.Threading.CancellationToken)">
            <summary>Deletes a template — a club one for every representative. Tournaments created from it do not change.</summary>
            <param name="templateId">Template id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TournamentTemplatesController.UseTournamentTemplate(System.Int32,System.Threading.CancellationToken)">
            <summary>Counts an application of the template to the create form (<c>uses</c> + 1).</summary>
            <param name="templateId">Template id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="T:TTAR.API.Controllers.TtarControllerBase">
            <summary>
            Base controllers' methods
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TtarControllerBase.IsAdmin(System.Security.Claims.ClaimsPrincipal)">
            <summary>
            Checks administrator permissions of logged user
            </summary>
            <param name="user"><seealso cref="P:Microsoft.AspNetCore.Mvc.ControllerBase.User"/> by default, if not set</param>
            <returns><c>true</c> if the user has admin role</returns>
        </member>
        <member name="M:TTAR.API.Controllers.TtarControllerBase.IsInRole(TTAR.Types.Role,System.Security.Claims.ClaimsPrincipal)">
            <summary>
            Checks whether the caller holds the given role. Admin is a super-role: an admin satisfies every role.
            Use this for mixed endpoints where a role changes behaviour (not access) — for pure access gating prefer a
            <c>[Authorize(Policy = ...)]</c> from <see cref="T:TTAR.API.Auth.AuthorizationPolicies"/>, which applies the same rule.
            </summary>
            <param name="role">The role required.</param>
            <param name="user"><seealso cref="P:Microsoft.AspNetCore.Mvc.ControllerBase.User"/> by default, if not set.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TtarControllerBase.GetVenueGlobalRole(System.Security.Claims.ClaimsPrincipal)">
            <summary>
            The caller's strongest venue-relevant global role (Admin over VenueModerator), or null for neither. Venue
            writes use it both for access checks and as the role snapshot in the venue history.
            </summary>
            <param name="user"><seealso cref="P:Microsoft.AspNetCore.Mvc.ControllerBase.User"/> by default, if not set.</param>
        </member>
        <member name="M:TTAR.API.Controllers.TtarControllerBase.GetUserId(System.Security.Claims.ClaimsPrincipal)">
            <summary>
            Returns Player id of authenticated user
            </summary>
            <param name="user"><seealso cref="P:Microsoft.AspNetCore.Mvc.ControllerBase.User"/> by default, if not set</param>
            <returns>Player id, <c>0</c> if not authenticated</returns>
        </member>
        <member name="M:TTAR.API.Controllers.TtarControllerBase.GetEmail(System.Security.Claims.ClaimsPrincipal)">
            <summary>
            Returns the email address of the authenticated user.
            </summary>
            <param name="user"><seealso cref="P:Microsoft.AspNetCore.Mvc.ControllerBase.User"/> by default, if not set</param>
            <returns>Email address of the user, or <c>null</c> if not found</returns>
        </member>
        <member name="M:TTAR.API.Controllers.TtarControllerBase.Error(TTAR.Types.ApiResponses.ErrorCode,System.String,System.Int32,System.String)">
            <summary>
            Creates an <see cref="T:Microsoft.AspNetCore.Mvc.ObjectResult"/> representing an error response with the specified details.
            </summary>
            <param name="errorCode">The error code representing the type of error.</param>
            <param name="detail">A detailed description of the error.</param>
            <param name="status">The HTTP status code to associate with the error response.</param>
            <param name="title">An optional title for the error. If not provided, the display name of <paramref name="errorCode"/> is used.</param>
            <returns>An <see cref="T:Microsoft.AspNetCore.Mvc.ObjectResult"/> containing the error response, including the specified error code, detail,
            status, and title.</returns>
        </member>
        <member name="M:TTAR.API.Controllers.TtarControllerBase.ErrorResult(TTAR.Types.ApiResponses.ErrorCode,System.String,System.Int32,System.String)">
            <inheritdoc cref="M:TTAR.API.Controllers.TtarControllerBase.Error(TTAR.Types.ApiResponses.ErrorCode,System.String,System.Int32,System.String)"/>
            <remarks>For code outside a controller action, e.g. a filter.</remarks>
        </member>
        <member name="M:TTAR.API.Controllers.TtarControllerBase.MapError(TTAR.Venues.VenueServiceError)">
            <summary>
            Maps a venue-service business error to its ErrorCode + HTTP status via <see cref="T:TTAR.API.Models.Venues.VenueErrorMap"/>.
            Shared by the venue and booking controllers so both return the same payload for the same error.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.TtarControllerBase.MapError(TTAR.Services.Abstractions.EmailPreferencesError)">
            <summary>Maps a refused change of email preferences to its ErrorCode + HTTP status, for both ways to make it.</summary>
        </member>
        <member name="T:TTAR.API.Controllers.VenueClaimsController">
            <summary>
            Venue-claim moderation: the pending-claims queue grouped by venue, a resolve (approve/reject) endpoint, and the
            append-only moderator note history. Every action requires the <see cref="F:TTAR.API.Auth.AuthorizationPolicies.VenueModeration"/>
            policy (a venue moderator or an admin); anyone else gets a framework 403. The claim-submission endpoint stays on
            <see cref="T:TTAR.API.Controllers.VenuesController"/>; representative requests on owned venues are the owner's (VenueRepresentativesController).
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.VenueClaimsController.#ctor(TTAR.Venues.IVenueService,TTAR.Services.Abstractions.IPlayerService,TTAR.DataProviders.Abstractions.IDbService,Telegram.Bot.ITelegramBotClient,Microsoft.Extensions.Logging.ILogger{TTAR.API.Controllers.VenueClaimsController})">
            <summary>
            Venue-claim moderation: the pending-claims queue grouped by venue, a resolve (approve/reject) endpoint, and the
            append-only moderator note history. Every action requires the <see cref="F:TTAR.API.Auth.AuthorizationPolicies.VenueModeration"/>
            policy (a venue moderator or an admin); anyone else gets a framework 403. The claim-submission endpoint stays on
            <see cref="T:TTAR.API.Controllers.VenuesController"/>; representative requests on owned venues are the owner's (VenueRepresentativesController).
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.VenueClaimsController.GetClaims(TTAR.Types.VenueClaimStatus,TTAR.Venues.VenueClaimOriginFilter,System.Threading.CancellationToken)">
            <summary>
            The moderation queue: claims in the given status grouped by venue, venues ordered by their freshest claim.
            </summary>
            <param name="status">Claim status to list (default Pending).</param>
            <param name="originFilter">Origin chip: users | import | dispute | all (default all).</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenueClaimsController.ResolveClaim(System.Int32,TTAR.API.Models.Venues.ResolveVenueClaimRequest,System.Threading.CancellationToken)">
            <summary>
            Resolves a claim (approve/reject). Approve makes the claimant the owner whatever role they named, verifies the
            venue and drops its representatives (a dispute takes the live owner's rights); reject requires a valid
            reasonCode and changes nothing on the venue. An internalNote is appended to the claim's note history. The
            claimant, the previous owner (on a transfer) and the dropped representatives are notified. A request to become
            a representative of an owned venue is the owner's decision and returns 409 VenueClaimOwnerDecision.
            </summary>
            <param name="claimId">Claim id.</param>
            <param name="request">Approve flag, reason, claimant message and optional internal note.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenueClaimsController.GetClaimNotes(System.Int32,System.Threading.CancellationToken)">
            <summary>The claim's moderator-only note history, oldest first.</summary>
            <param name="claimId">Claim id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenueClaimsController.AddClaimNote(System.Int32,TTAR.API.Models.Venues.AddVenueClaimNoteRequest,System.Threading.CancellationToken)">
            <summary>Appends a moderator note to a claim.</summary>
            <param name="claimId">Claim id.</param>
            <param name="request">The note text.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="T:TTAR.API.Controllers.VenueRepresentativesController">
            <summary>
            A venue's representatives, managed by its OWNER: the list with extra rights, add / change rights / remove, and
            the owner's decision on requests to become a representative (those never reach moderation). A representative
            may also remove themselves. Admins get no override here.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.VenueRepresentativesController.#ctor(TTAR.Venues.IVenueService,TTAR.Services.Abstractions.IPlayerService,TTAR.DataProviders.Abstractions.IDbService,Telegram.Bot.ITelegramBotClient,Microsoft.Extensions.Logging.ILogger{TTAR.API.Controllers.VenueRepresentativesController})">
            <summary>
            A venue's representatives, managed by its OWNER: the list with extra rights, add / change rights / remove, and
            the owner's decision on requests to become a representative (those never reach moderation). A representative
            may also remove themselves. Admins get no override here.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.VenueRepresentativesController.GetRepresentatives(System.Int32,System.Threading.CancellationToken)">
            <summary>The venue's representatives with their extra rights. Owner only.</summary>
            <param name="venueId">Venue id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenueRepresentativesController.AddRepresentative(System.Int32,TTAR.API.Models.Venues.AddVenueRepresentativeRequest,System.Threading.CancellationToken)">
            <summary>Adds a player as a representative, optionally with extra rights. Owner only.</summary>
            <param name="venueId">Venue id.</param>
            <param name="request">The player and the extra rights.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenueRepresentativesController.UpdateRepresentative(System.Int32,System.Int32,TTAR.API.Models.Venues.UpdateVenueRepresentativeRequest,System.Threading.CancellationToken)">
            <summary>Replaces a representative's extra rights. Owner only.</summary>
            <param name="venueId">Venue id.</param>
            <param name="playerId">Representative player id.</param>
            <param name="request">The full new set of extra rights.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenueRepresentativesController.RemoveRepresentative(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>Removes a representative. The owner may remove anyone; a representative may remove themselves.</summary>
            <param name="venueId">Venue id.</param>
            <param name="playerId">Representative player id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenueRepresentativesController.GetRepresentativeClaims(System.Int32,System.Threading.CancellationToken)">
            <summary>Pending requests to become a representative of the venue, newest first. Owner only.</summary>
            <param name="venueId">Venue id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenueRepresentativesController.ResolveRepresentativeClaim(System.Int32,System.Int32,TTAR.API.Models.Venues.ResolveRepresentativeClaimRequest,System.Threading.CancellationToken)">
            <summary>
            The owner's decision on a request to become a representative: approve adds the claimant as a representative
            (no extra rights), reject leaves the venue as is. The claimant is notified.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="claimId">Claim id.</param>
            <param name="request">Approve flag and an optional message to the claimant.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="T:TTAR.API.Controllers.VenuesController">
            <summary>
            Venues (clubs): the club directory, a public venue page, creation, ownership claims, availability, per-venue
            wallet, availability blocks, announcements and chat linking. Booking-scoped actions (confirm/decline/
            complete/cancel a specific booking) live in <see cref="T:TTAR.API.Controllers.BookingsController"/>. Management actions authorize
            against the venue's owner/representative (or an admin) via the service.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.#ctor(TTAR.Venues.IVenueService,TTAR.DataProviders.Abstractions.ITournamentRepository,TTAR.Services.Abstractions.IPlayerService,TTAR.Services.Abstractions.IEmailService,TTAR.Services.Abstractions.IEmailCooldownService,TTAR.DataProviders.Abstractions.IDbService,Telegram.Bot.ITelegramBotClient,Microsoft.Extensions.Logging.ILogger{TTAR.API.Controllers.VenuesController},TTAR.Configuration.TtarConfiguration,TTAR.IpGeo.IIpGeoLocator)">
            <summary>
            Venues (clubs): the club directory, a public venue page, creation, ownership claims, availability, per-venue
            wallet, availability blocks, announcements and chat linking. Booking-scoped actions (confirm/decline/
            complete/cancel a specific booking) live in <see cref="T:TTAR.API.Controllers.BookingsController"/>. Management actions authorize
            against the venue's owner/representative (or an admin) via the service.
            </summary>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.GetVenues(System.String,System.Boolean,System.Boolean,System.Nullable{System.Double},System.Nullable{System.Double},System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Returns a paginated list of venues. All filters are optional and combine with AND.
            </summary>
            <param name="query">Free-text match on name / place.</param>
            <param name="mine">When true, only venues the authenticated caller owns or represents.</param>
            <param name="bookableOnly">When true, only venues with booking enabled (owner + price + pool).</param>
            <param name="longitude">Optional longitude for distance sorting/exposure. Without coordinates the list is
            ordered from the city of the client's IP when it is known (no distances then), else by name.</param>
            <param name="latitude">Optional latitude for distance sorting/exposure.</param>
            <param name="currentPage">1-based page number.</param>
            <param name="pageSize">Page size, clamped to 1..100.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.GetManagedVenues(System.Threading.CancellationToken)">
            <summary>
            The venues the caller owns or represents (the <c>mine=true</c> list, by name, unpaged), each with what awaits
            the caller's decision there — the "my venues" strip in one request. Empty for a player who runs no venue.
            </summary>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.GetDuplicates(System.String,System.Nullable{System.Double},System.Nullable{System.Double},System.Threading.CancellationToken)">
            <summary>
            Returns up to ~3 venues that look like duplicates of the given name/point (same-ish name OR within ~300 m),
            for the create-time "a similar venue already exists" warning (DATA_API §6). Empty list = no duplicates.
            </summary>
            <param name="name">Candidate venue name (a blank name yields an empty result).</param>
            <param name="longitude">Optional longitude of the candidate point.</param>
            <param name="latitude">Optional latitude of the candidate point.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.GetVenue(System.Int32,System.Nullable{System.Double},System.Nullable{System.Double},System.Threading.CancellationToken)">
            <summary>
            Returns full venue details (public). Tables and announcements are included by default.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="longitude">Optional longitude for distance exposure.</param>
            <param name="latitude">Optional latitude for distance exposure.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.GetVenueTournaments(System.Int32,System.Nullable{TTAR.Types.TournamentStatus},System.Boolean,System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Tournaments held at this venue (linked via the structured <c>VenueId</c>), newest first — for the venue
            page's tournaments tab (SCREENS §2). Reuses the tournament list item.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="status">Optional single status filter (e.g. Registration / Finished).</param>
            <param name="includeLadders">True — the client supports ladders. Omitted, ladders are hidden: apps released before ladders cannot read such a response.</param>
            <param name="currentPage">1-based page number.</param>
            <param name="pageSize">Page size, clamped to 1..100.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.CreateVenue(TTAR.API.Models.Venues.CreateVenueRequest,System.Threading.CancellationToken)">
            <summary>
            Creates a venue. Only a name and a location (a point or a place) are required. Optionally submits an
            ownership claim in the same step; creating never auto-grants ownership.
            </summary>
            <param name="request">Venue fields.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.UpdateVenue(System.Int32,TTAR.API.Models.Venues.UpdateVenueRequest,System.Threading.CancellationToken)">
            <summary>
            Edits a venue. Only the owner/representative (or an admin) may edit.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="request">Fields to change (null = unchanged).</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.ClaimVenue(System.Int32,TTAR.API.Models.Venues.ClaimVenueRequest,System.Threading.CancellationToken)">
            <summary>
            Submits an ownership/representation claim for a venue; it shows as pending until resolved. A request to become
            a representative of an OWNED venue goes to its owner (who is notified); any other claim goes to moderation.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="request">Claim role and optional contact.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.GetAvailability(System.Int32,System.Nullable{System.DateOnly},System.Threading.CancellationToken)">
            <summary>
            Per-hour availability for the venue over a date (in the venue's time zone).
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="date">Local calendar date; defaults to today (UTC) when omitted.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.CreateBooking(System.Int32,TTAR.API.Models.Venues.CreateBookingRequest,System.Threading.CancellationToken)">
            <summary>
            Creates a booking of one or more pool seats over an interval. Money is held immediately (DATA_API §2).
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="request">Interval and quantity.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.GetMyBookings(System.Int32,System.Threading.CancellationToken)">
            <summary>
            The authenticated caller's own bookings at this venue.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.GetVenueBookings(System.Int32,System.Threading.CancellationToken)">
            <summary>
            The venue's player bookings for its console, not over yet: Requested ones awaiting the venue's decision and
            Confirmed ones, ordered by start (Cancelled and Completed are left out); each row carries the booking
            <see cref="P:TTAR.API.Models.Venues.VenueBookingResponse.Player"/>. The clubs menu badge counts the
            Requested rows of other players — the caller's own request is one they wait for. Owner, representative or
            admin only.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.GetWallet(System.Int32,System.Threading.CancellationToken)">
            <summary>
            The authenticated caller's wallet at this venue: folded balance plus the append-only journal.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.TopUp(System.Int32,TTAR.API.Models.Venues.TopUpRequest,System.Threading.CancellationToken)">
            <summary>
            Credits a player's balance at this venue (venue admin only — no online payments yet).
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="request">Target player and amount.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.BlockRange(System.Int32,TTAR.API.Models.Venues.BlockRangeRequest,System.Threading.CancellationToken)">
            <summary>
            Closes an interval for booking (owner block / отпуск-ремонт), cancelling and refunding any hit bookings,
            optionally publishing a closing announcement.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="request">Interval, reason and whether to publish an announcement.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.Unblock(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Removes an availability block.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="blockId">Block (booking row) id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.GetAnnouncements(System.Int32,System.Threading.CancellationToken)">
            <summary>
            The venue's announcements (pinned first, then newest).
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.CreateAnnouncement(System.Int32,TTAR.API.Models.Venues.CreateAnnouncementRequest,System.Threading.CancellationToken)">
            <summary>
            Publishes a venue announcement. A closing announcement also blocks bookings for its interval.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="request">Announcement fields.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.RemoveAnnouncement(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Removes a venue announcement.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="announcementId">Announcement id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.LinkChat(System.Int32,TTAR.API.Models.Venues.LinkChatRequest,System.Threading.CancellationToken)">
            <summary>
            Links a chat to the venue. The link is instant when the caller is a bot-admin of the chat, otherwise it
            awaits confirmation (§8.1 anti-hijack).
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="request">Chat id and optional thread id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="M:TTAR.API.Controllers.VenuesController.UnlinkChat(System.Int32,System.Threading.CancellationToken)">
            <summary>
            Unlinks the venue's chat.
            </summary>
            <param name="venueId">Venue id.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="T:TTAR.API.Data.OpenIddictDbContext">
            <summary>
            Dedicated EF Core context that holds only the OpenIddict entity sets (applications, authorizations, scopes,
            tokens). It is registered through <see cref="N:Microsoft.Extensions.DependencyInjection"/> via
            <c>AddDbContext</c> because OpenIddict resolves its stores from a DI-managed context — unlike the business
            <c>TTRatingDB</c>, which is created by hand (<c>SqlServicesBase.GetContext()</c>). It targets the same MySQL
            schema; the link to <c>Players</c> is logical only (<c>sub</c> = player id), so there is no FK to the business
            tables and no reason to mix these sets into <c>TTRatingDB</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Data.OpenIddictDbContext.#ctor(Microsoft.EntityFrameworkCore.DbContextOptions{TTAR.API.Data.OpenIddictDbContext})">
            <summary>
            Dedicated EF Core context that holds only the OpenIddict entity sets (applications, authorizations, scopes,
            tokens). It is registered through <see cref="N:Microsoft.Extensions.DependencyInjection"/> via
            <c>AddDbContext</c> because OpenIddict resolves its stores from a DI-managed context — unlike the business
            <c>TTRatingDB</c>, which is created by hand (<c>SqlServicesBase.GetContext()</c>). It targets the same MySQL
            schema; the link to <c>Players</c> is logical only (<c>sub</c> = player id), so there is no FK to the business
            tables and no reason to mix these sets into <c>TTRatingDB</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.DI.ApiBehaviorExtensions.ConfigureApiBehavior(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
            <summary>
            Makes automatic model-validation failures (HTTP 400 from <c>[ApiController]</c>) return the same
            <see cref="T:TTAR.Types.ApiResponses.ErrorResponse"/> shape as every other error, so clients can always read a numeric
            <c>errorCode</c> instead of falling back to a bare <see cref="T:Microsoft.AspNetCore.Mvc.ValidationProblemDetails"/>.
            </summary>
        </member>
        <member name="M:TTAR.API.DI.AuthConfiguration.AddTelegramOidc(Microsoft.AspNetCore.Authentication.AuthenticationBuilder,System.String,System.String)">
            <summary>
            Registers the Telegram Login (OpenID Connect mode) handler with its own short-lived external cookie.
            </summary>
        </member>
        <member name="T:TTAR.API.DI.IdempotencyConfiguration">
            <summary>
            <c>Idempotency-Key</c> support of the API writes: the key store, its cleanup and the two pipeline pieces.
            </summary>
        </member>
        <member name="M:TTAR.API.DI.IdempotencyConfiguration.UseIdempotencySupportedHeader(Microsoft.AspNetCore.Builder.IApplicationBuilder)">
            <summary>
            Adds <see cref="F:TTAR.API.Idempotency.IdempotencyHeaders.Supported"/> to every response, errors and 429s included: until a client
            sees it, the client sends each write once.
            </summary>
        </member>
        <member name="M:TTAR.API.DI.IdempotencyConfiguration.UseIdempotency(Microsoft.AspNetCore.Builder.IApplicationBuilder)">
            <summary>
            Handles the <see cref="F:TTAR.API.Idempotency.IdempotencyHeaders.Key"/> of controller writes (<see cref="T:TTAR.API.Idempotency.IdempotencyMiddleware"/>).
            </summary>
        </member>
        <member name="T:TTAR.API.DI.NoIndexExtensions">
            <summary>
            Keeps search engines off every host except Production (stage.api.ttar.app), on its own in case the IP
            restriction in front of it is lifted or fails. Production is left untouched.
            </summary>
        </member>
        <member name="M:TTAR.API.DI.NoIndexExtensions.UseNoIndexOutsideProduction(Microsoft.AspNetCore.Builder.WebApplication)">
            <summary>
            Outside Production adds <see cref="F:TTAR.API.DI.NoIndexExtensions.RobotsTagHeader"/> to every response (static files, Swagger's 403 and
            errors included) and answers <see cref="F:TTAR.API.DI.NoIndexExtensions.RobotsTxtPath"/>. Must precede anything that can end the request.
            </summary>
        </member>
        <member name="T:TTAR.API.DI.OpenIddictClientSeeder">
            <summary>
            Idempotently seeds the custom scopes (<c>ttar:rating</c>, <c>ttar:games</c>), the trusted partner clients
            listed in <see cref="P:TTAR.API.Configuration.OpenIddictOptions.Clients"/> and the first-party web logout client
            (<see cref="F:TTAR.API.Configuration.OpenIddictOptions.WebClientId"/>) on startup. Self-service client registration is out of scope;
            partners are entered by hand in configuration.
            </summary>
        </member>
        <member name="M:TTAR.API.DI.OpenIddictClientSeeder.#ctor(System.IServiceProvider,TTAR.API.Configuration.OpenIddictOptions,Microsoft.Extensions.Logging.ILogger{TTAR.API.DI.OpenIddictClientSeeder})">
            <summary>
            Idempotently seeds the custom scopes (<c>ttar:rating</c>, <c>ttar:games</c>), the trusted partner clients
            listed in <see cref="P:TTAR.API.Configuration.OpenIddictOptions.Clients"/> and the first-party web logout client
            (<see cref="F:TTAR.API.Configuration.OpenIddictOptions.WebClientId"/>) on startup. Self-service client registration is out of scope;
            partners are entered by hand in configuration.
            </summary>
        </member>
        <member name="M:TTAR.API.DI.OpenIddictClientSeeder.CreateWebClientDescriptor(System.Collections.Generic.IEnumerable{System.String})">
            <summary>
            Builds the end-session-only descriptor of the first-party web client (<see cref="F:TTAR.API.Configuration.OpenIddictOptions.WebClientId"/>).
            </summary>
        </member>
        <member name="T:TTAR.API.DI.RateLimitConfiguration">
            <summary>
            Centralized protection against repetitive / abusive requests that would otherwise overload the
            database (the application's main bottleneck). Combines a per-client token-bucket limiter on all
            endpoints with a stricter named policy (<see cref="F:TTAR.API.DI.RateLimitConfiguration.HeavyPolicy"/>) plus a global concurrency cap
            on DB-heavy endpoints (search, top).
            </summary>
        </member>
        <member name="F:TTAR.API.DI.RateLimitConfiguration.HeavyPolicy">
            <summary>
            Name of the stricter policy applied to DB-heavy endpoints via
            <c>[EnableRateLimiting(RateLimitConfiguration.HeavyPolicy)]</c>.
            </summary>
        </member>
        <member name="F:TTAR.API.DI.RateLimitConfiguration.AvatarsPolicy">
            <summary>
            Name of the very lenient policy applied to the avatar image endpoint (a static-file
            emulator) via <c>[EnableRateLimiting(RateLimitConfiguration.AvatarsPolicy)]</c>.
            </summary>
        </member>
        <member name="F:TTAR.API.DI.RateLimitConfiguration.PlacesPolicy">
            <summary>
            Name of the policy applied to the map-link import (outbound requests to map services) via
            <c>[EnableRateLimiting(RateLimitConfiguration.PlacesPolicy)]</c>.
            </summary>
        </member>
        <member name="F:TTAR.API.DI.RateLimitConfiguration.AnnounceTopicPolicy">
            <summary>
            Name of the policy applied to the announce-topic check (each call may post a probe message into a chat) via
            <c>[EnableRateLimiting(RateLimitConfiguration.AnnounceTopicPolicy)]</c>.
            </summary>
        </member>
        <member name="F:TTAR.API.DI.RateLimitConfiguration.BadgesPolicy">
            <summary>
            Name of the policy applied to the menu badge counts (polled by the client while it is open) via
            <c>[EnableRateLimiting(RateLimitConfiguration.BadgesPolicy)]</c>.
            </summary>
        </member>
        <member name="F:TTAR.API.DI.RateLimitConfiguration.LanguageRequestsPolicy">
            <summary>
            Name of the policy applied to the new-language request (each call notifies the admin by Telegram and email) via
            <c>[EnableRateLimiting(RateLimitConfiguration.LanguageRequestsPolicy)]</c>.
            </summary>
        </member>
        <member name="F:TTAR.API.DI.RateLimitConfiguration.PhotoUploadsPolicy">
            <summary>
            Name of the policy applied to the photo upload (an image decode and re-encode per call) via
            <c>[EnableRateLimiting(RateLimitConfiguration.PhotoUploadsPolicy)]</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.DI.RateLimitConfiguration.ConfigureForwardedHeaders(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Configuration.IConfiguration)">
            <summary>
            Configures <see cref="T:Microsoft.AspNetCore.Builder.ForwardedHeadersOptions"/> so the real client IP is resolved from
            <c>X-Forwarded-For</c> set by the trusted reverse proxy (Apache). Without this, per-IP
            partitioning collapses because every request appears to come from the proxy.
            </summary>
        </member>
        <member name="M:TTAR.API.DI.RateLimitConfiguration.TryGetPlayerId(Microsoft.AspNetCore.Http.HttpContext,System.String@)">
            <summary>
            Returns <c>true</c> and the player id when the request carries a valid authenticated
            PlayerId claim (matching <c>TtarControllerBase.GetUserId</c> semantics, where 0 = anonymous).
            </summary>
        </member>
        <member name="M:TTAR.API.DI.RateLimitConfiguration.IsHeavyEndpoint(Microsoft.AspNetCore.Http.HttpContext)">
            <summary>
            Detects whether the endpoint matched for this request carries the <see cref="F:TTAR.API.DI.RateLimitConfiguration.HeavyPolicy"/>
            named policy. Used by the chained global limiter to decide which sub-limiter applies, so the
            global token bucket and the heavy policy never double-count the same client.
            </summary>
        </member>
        <member name="M:TTAR.API.DI.RateLimitConfiguration.HasNamedPolicy(Microsoft.AspNetCore.Http.HttpContext)">
            <summary>
            Whether the matched endpoint carries any named rate-limiting policy. Such endpoints opt out of the global token
            bucket so they aren't double-counted.
            </summary>
        </member>
        <member name="T:TTAR.API.DI.NullableParameterFilter">
            <summary>
            Propagates C# nullable reference type annotations to OpenAPI parameter schemas.
            SupportNonNullableReferenceTypes/NonNullableReferenceTypesAsRequired only affect
            request body schemas — not individual query/route/header parameters.
            </summary>
        </member>
        <member name="T:TTAR.API.DI.EnumsDocumentFilter">
            <summary>
            Overrides the OpenAPI schema for enums that go on the wire as their numeric value (via a
            per-property <c>JsonNumberEnumConverter</c>) rather than the member name. The global
            <c>JsonStringEnumConverter</c> otherwise makes Swashbuckle describe every enum as a string,
            which for <see cref="T:TTAR.Types.ApiResponses.ErrorCode"/> is a lie: the response carries <c>"errorCode": 21</c>, not
            <c>"TournamentNotFound"</c>. This emits an integer enum plus <c>x-enum-varnames</c> (the
            NSwag / openapi-generator convention) so a client can map the number back to a stable name.
            </summary>
        </member>
        <member name="T:TTAR.API.DI.SwaggerIpRestrictionExtensions">
            <summary>
            Wires up Swagger with an IP allow-list so non-production environments (e.g. Staging) expose the
            endpoint catalog only to whitelisted developer networks, not to everyone who guesses the URL.
            Production keeps Swagger fully off; Development uses a broad range to admit all.
            </summary>
        </member>
        <member name="M:TTAR.API.DI.SwaggerIpRestrictionExtensions.UseSwaggerWithIpRestriction(Microsoft.AspNetCore.Builder.WebApplication)">
            <summary>
            Enables Swagger and its UI, guarded by the CIDR ranges in the <c>Swagger:AllowedNetworks</c>
            config section. Fail-closed: an empty/missing list means no one is allowed. Requests to
            <c>/swagger*</c> from an address outside every configured range get a 403 before the docs render.
            </summary>
        </member>
        <member name="T:TTAR.API.Extensions.GameModelExtensions">
            <summary>
            <seealso cref="T:TTAR.DataProviders.Models.GameModel"/> extensions
            </summary>
        </member>
        <member name="M:TTAR.API.Extensions.GameModelExtensions.ToGameList(System.Collections.Generic.IEnumerable{TTAR.DataProviders.Models.GameModel})">
            <summary>
            Converts <seealso cref="T:TTAR.DataProviders.Models.GameModel"/> collection to <seealso cref="T:TTAR.API.Models.Responses.GameResponse"/> list
            </summary>
            <param name="games"><seealso cref="T:TTAR.DataProviders.Models.GameModel"/> collection</param>
            <returns><seealso cref="T:TTAR.API.Models.Responses.GameResponse"/> list</returns>
        </member>
        <member name="M:TTAR.API.Extensions.GameModelExtensions.ToUnconfirmedGameList(System.Collections.Generic.IEnumerable{TTAR.DataProviders.Models.GameModel},System.TimeSpan)">
            <summary>
            Converts games waiting for confirmation to <seealso cref="T:TTAR.API.Models.Responses.GameResponse"/> list, with their
            <see cref="P:TTAR.API.Models.Responses.GameResponse.ConfirmDeadline"/> and what happens then.
            </summary>
            <param name="games">Unconfirmed, not discarded games, loaded with their <see cref="P:TTAR.DataProviders.Models.GameModel.FinishedLadder"/>.</param>
            <param name="confirmTimeout">The confirmation period of an ordinary game.</param>
        </member>
        <member name="T:TTAR.API.Extensions.LogValueExtensions">
            <summary>
            Makes request-supplied text safe to put into a log entry.
            </summary>
        </member>
        <member name="M:TTAR.API.Extensions.LogValueExtensions.ForLog(System.String,System.Int32)">
            <summary>
            Escapes control characters (a CR/LF in a request value would otherwise forge a separate log entry) and cuts the
            value to <paramref name="maxLength"/> characters.
            </summary>
            <param name="value">Text taken from the request (query, body, a decoded URL part).</param>
            <param name="maxLength">Maximum number of source characters kept.</param>
            <returns>The loggable text, or <c>null</c> for <c>null</c>.</returns>
        </member>
        <member name="T:TTAR.API.Extensions.RetryAfterExtensions">
            <summary>
            The <c>Retry-After</c> header of the API's "come back later" responses.
            </summary>
        </member>
        <member name="M:TTAR.API.Extensions.RetryAfterExtensions.SetRetryAfter(Microsoft.AspNetCore.Http.HttpResponse,System.TimeSpan)">
            <summary>
            Sets <c>Retry-After</c> to <paramref name="retryAfter"/> in whole seconds, rounded up and at least one: a zero
            would invite an immediate retry.
            </summary>
        </member>
        <member name="T:TTAR.API.Hubs.ChatHub">
             <summary>
             Real-time channel of the Messages section. Every authenticated connection is addressed by its player id
             (<see cref="T:TTAR.API.Hubs.PlayerIdUserIdProvider"/>), so a private message, a read receipt or a "seen" tick needs no group:
             the broadcaster sends to <c>Clients.User(playerId)</c>. The geo chat fan-out goes only to the connections that
             called <see cref="M:TTAR.API.Hubs.ChatHub.JoinGeoChat"/> (the tab is open), each checked against its reader's radius and blocks.
            
             Client methods: <c>PrivateMessage(PrivateMessageResponse)</c>, <c>PrivateRead(otherPlayerId, upToId?)</c>,
             <c>GeoChatMessage(GeoChatMessageResponse)</c>, <c>GeoChatSeen(int[] messageIds)</c>,
             <c>GeoChatMessagesHidden(int[] messageIds)</c> (the reader's feed lost them), <c>GeoChatBan(ChatBanResponse?)</c>
             (the reader's own ban was set or lifted).
             </summary>
        </member>
        <member name="M:TTAR.API.Hubs.ChatHub.#ctor(TTAR.API.Hubs.IGeoChatWatchers,TTAR.Messages.IGeoChatReaderResolver)">
             <summary>
             Real-time channel of the Messages section. Every authenticated connection is addressed by its player id
             (<see cref="T:TTAR.API.Hubs.PlayerIdUserIdProvider"/>), so a private message, a read receipt or a "seen" tick needs no group:
             the broadcaster sends to <c>Clients.User(playerId)</c>. The geo chat fan-out goes only to the connections that
             called <see cref="M:TTAR.API.Hubs.ChatHub.JoinGeoChat"/> (the tab is open), each checked against its reader's radius and blocks.
            
             Client methods: <c>PrivateMessage(PrivateMessageResponse)</c>, <c>PrivateRead(otherPlayerId, upToId?)</c>,
             <c>GeoChatMessage(GeoChatMessageResponse)</c>, <c>GeoChatSeen(int[] messageIds)</c>,
             <c>GeoChatMessagesHidden(int[] messageIds)</c> (the reader's feed lost them), <c>GeoChatBan(ChatBanResponse?)</c>
             (the reader's own ban was set or lifted).
             </summary>
        </member>
        <member name="M:TTAR.API.Hubs.ChatHub.JoinGeoChat">
            <summary>The geo chat tab opened: this connection receives its reader's feed updates.</summary>
        </member>
        <member name="M:TTAR.API.Hubs.ChatHub.LeaveGeoChat">
            <summary>The geo chat tab closed.</summary>
        </member>
        <member name="M:TTAR.API.Hubs.ChatHub.OnDisconnectedAsync(System.Exception)">
            <inheritdoc />
        </member>
        <member name="T:TTAR.API.Hubs.PlayerIdUserIdProvider">
            <summary>SignalR user id = the <c>PlayerId</c> claim, so <c>Clients.User("123")</c> reaches every device of player 123.</summary>
        </member>
        <member name="M:TTAR.API.Hubs.PlayerIdUserIdProvider.GetUserId(Microsoft.AspNetCore.SignalR.HubConnectionContext)">
            <inheritdoc />
        </member>
        <member name="T:TTAR.API.Hubs.IGeoChatWatchers">
            <summary>
            The connections watching the geo chat feed. Singleton: hub instances are per call, and the broadcaster
            needs the set outside any call.
            </summary>
        </member>
        <member name="M:TTAR.API.Hubs.IGeoChatWatchers.Add(System.String,System.Int32)">
            <summary>The connection opened the geo chat tab as this player.</summary>
        </member>
        <member name="M:TTAR.API.Hubs.IGeoChatWatchers.Remove(System.String)">
            <summary>The connection closed the tab or dropped.</summary>
        </member>
        <member name="P:TTAR.API.Hubs.IGeoChatWatchers.PlayerIds">
            <summary>Distinct players with at least one watching connection.</summary>
        </member>
        <member name="T:TTAR.API.Hubs.GeoChatWatchers">
            <inheritdoc />
        </member>
        <member name="M:TTAR.API.Hubs.GeoChatWatchers.Add(System.String,System.Int32)">
            <inheritdoc />
        </member>
        <member name="M:TTAR.API.Hubs.GeoChatWatchers.Remove(System.String)">
            <inheritdoc />
        </member>
        <member name="P:TTAR.API.Hubs.GeoChatWatchers.PlayerIds">
            <inheritdoc />
        </member>
        <member name="T:TTAR.API.Hubs.SignalRChatLiveBroadcaster">
            <summary>
            API-side <see cref="T:TTAR.Messages.IChatLiveBroadcaster"/> over <see cref="T:TTAR.API.Hubs.ChatHub"/>. A geo chat message is resolved per
            watching player from the in-memory caches (no MySQL for a primed reader) and sent with that reader's own
            distance; players whose feed hides it get nothing, so the content never reaches a reader who blocked the author.
            </summary>
        </member>
        <member name="M:TTAR.API.Hubs.SignalRChatLiveBroadcaster.#ctor(Microsoft.AspNetCore.SignalR.IHubContext{TTAR.API.Hubs.ChatHub},TTAR.API.Hubs.IGeoChatWatchers,TTAR.Messages.IGeoChatReaderResolver,Microsoft.Extensions.Logging.ILogger{TTAR.API.Hubs.SignalRChatLiveBroadcaster})">
            <summary>
            API-side <see cref="T:TTAR.Messages.IChatLiveBroadcaster"/> over <see cref="T:TTAR.API.Hubs.ChatHub"/>. A geo chat message is resolved per
            watching player from the in-memory caches (no MySQL for a primed reader) and sent with that reader's own
            distance; players whose feed hides it get nothing, so the content never reaches a reader who blocked the author.
            </summary>
        </member>
        <member name="F:TTAR.API.Hubs.SignalRChatLiveBroadcaster.PrivateMessageMethod">
            <summary>Client method: a new private message (<c>PrivateMessageResponse</c>).</summary>
        </member>
        <member name="F:TTAR.API.Hubs.SignalRChatLiveBroadcaster.PrivateReadMethod">
            <summary>Client method: the other player read the thread (<c>otherPlayerId, upToId?</c>).</summary>
        </member>
        <member name="F:TTAR.API.Hubs.SignalRChatLiveBroadcaster.GeoChatMessageMethod">
            <summary>Client method: a geo chat message the reader's feed shows (<c>GeoChatMessageResponse</c>).</summary>
        </member>
        <member name="F:TTAR.API.Hubs.SignalRChatLiveBroadcaster.GeoChatSeenMethod">
            <summary>Client method: the author's messages got their first "seen" tick (<c>int[]</c>).</summary>
        </member>
        <member name="F:TTAR.API.Hubs.SignalRChatLiveBroadcaster.GeoChatMessagesHiddenMethod">
            <summary>Client method: messages the reader's feed lost (<c>int[]</c>); the client drops them by id.</summary>
        </member>
        <member name="F:TTAR.API.Hubs.SignalRChatLiveBroadcaster.GeoChatBanMethod">
            <summary>Client method: the reader's own ban was set or lifted (<c>ChatBanResponse?</c>).</summary>
        </member>
        <member name="M:TTAR.API.Hubs.SignalRChatLiveBroadcaster.PrivateMessageAsync(TTAR.DataProviders.Models.PrivateMessagesModel,System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:TTAR.API.Hubs.SignalRChatLiveBroadcaster.PrivateReadAsync(System.Int32,System.Int32,System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:TTAR.API.Hubs.SignalRChatLiveBroadcaster.GeoChatMessageAsync(TTAR.DataProviders.Models.GeoChatMessageModel,System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:TTAR.API.Hubs.SignalRChatLiveBroadcaster.GeoChatSeenAsync(System.Int32,System.Collections.Generic.IReadOnlyCollection{System.Int32},System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:TTAR.API.Hubs.SignalRChatLiveBroadcaster.GeoChatMessagesHiddenAsync(System.Collections.Generic.IReadOnlyCollection{System.Int32},System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:TTAR.API.Hubs.SignalRChatLiveBroadcaster.GeoChatBanAsync(System.Int32,TTAR.Messages.PlayerBan,System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="T:TTAR.API.Hubs.SignalRTournamentLiveBroadcaster">
            <summary>
            API-side <see cref="T:TTAR.PushNotifications.ITournamentLiveBroadcaster"/>: pushes the change to the tournament's SignalR group via
            <see cref="T:Microsoft.AspNetCore.SignalR.IHubContext`1"/>. The client method name is <c>TournamentChanged</c>; the arguments are the
            <see cref="T:TTAR.PushNotifications.TournamentChange"/> member NAME (matching the <c>ttar.change</c> string the push carried) and the
            tournament's current monotonic version, so the client parses it exactly as it already parses the push
            payload and can discard a signal older than what it already renders.
            </summary>
        </member>
        <member name="M:TTAR.API.Hubs.SignalRTournamentLiveBroadcaster.#ctor(Microsoft.AspNetCore.SignalR.IHubContext{TTAR.API.Hubs.TournamentHub})">
            <summary>
            API-side <see cref="T:TTAR.PushNotifications.ITournamentLiveBroadcaster"/>: pushes the change to the tournament's SignalR group via
            <see cref="T:Microsoft.AspNetCore.SignalR.IHubContext`1"/>. The client method name is <c>TournamentChanged</c>; the arguments are the
            <see cref="T:TTAR.PushNotifications.TournamentChange"/> member NAME (matching the <c>ttar.change</c> string the push carried) and the
            tournament's current monotonic version, so the client parses it exactly as it already parses the push
            payload and can discard a signal older than what it already renders.
            </summary>
        </member>
        <member name="M:TTAR.API.Hubs.SignalRTournamentLiveBroadcaster.BroadcastAsync(System.Int32,TTAR.PushNotifications.TournamentChange,System.Int64,System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="T:TTAR.API.Hubs.TournamentHub">
             <summary>
             Real-time channel that live-refreshes an OPEN tournament detail/projector page. A client that opens a
             tournament calls <see cref="M:TTAR.API.Hubs.TournamentHub.JoinTournament(System.Int32)"/> to subscribe to that tournament's group; the server pushes a
             <c>TournamentChanged</c> message to the group whenever the tournament's live state changes (score
             submitted/confirmed, tournament started/finished/cancelled, roster changed). This replaces the silent
             <c>TournamentDataChanged</c> FCM push for the open-page case, which a browser can throttle/drop
             (Firefox's silent web-push quota) — the exact reason a confirm/finish refresh went missing.
            
             Open to anonymous connections so the web-only projector screen (opened by an unauthenticated guest via a
             shared link) can receive push, not just the 45s silent-poll fallback. The push carries NO data — only a
             change-name + monotonic version; the guest fetches the actual data from the already-<c>[AllowAnonymous]</c>
             GET endpoints. Because there is no <c>[Authorize]</c> gate any more, <see cref="M:TTAR.API.Hubs.TournamentHub.JoinTournament(System.Int32)"/> is the
             sole guard against abuse and MUST validate its input (see below).
             </summary>
        </member>
        <member name="M:TTAR.API.Hubs.TournamentHub.#ctor(TTAR.DataProviders.Abstractions.ITournamentRepository)">
             <summary>
             Real-time channel that live-refreshes an OPEN tournament detail/projector page. A client that opens a
             tournament calls <see cref="M:TTAR.API.Hubs.TournamentHub.JoinTournament(System.Int32)"/> to subscribe to that tournament's group; the server pushes a
             <c>TournamentChanged</c> message to the group whenever the tournament's live state changes (score
             submitted/confirmed, tournament started/finished/cancelled, roster changed). This replaces the silent
             <c>TournamentDataChanged</c> FCM push for the open-page case, which a browser can throttle/drop
             (Firefox's silent web-push quota) — the exact reason a confirm/finish refresh went missing.
            
             Open to anonymous connections so the web-only projector screen (opened by an unauthenticated guest via a
             shared link) can receive push, not just the 45s silent-poll fallback. The push carries NO data — only a
             change-name + monotonic version; the guest fetches the actual data from the already-<c>[AllowAnonymous]</c>
             GET endpoints. Because there is no <c>[Authorize]</c> gate any more, <see cref="M:TTAR.API.Hubs.TournamentHub.JoinTournament(System.Int32)"/> is the
             sole guard against abuse and MUST validate its input (see below).
             </summary>
        </member>
        <member name="F:TTAR.API.Hubs.TournamentHub.MaxGroupsPerConnection">
            <summary>
            Max distinct tournament groups a single connection may join. The projector/detail page holds exactly
            one group at a time (the client leaves before it joins another), so a small cap has ample headroom
            while stopping an anonymous connection from stuffing the lifetime manager with arbitrary ids.
            </summary>
        </member>
        <member name="F:TTAR.API.Hubs.TournamentHub._connectionGroups">
            <summary>
            Per-connection set of joined tournament ids, used to enforce <see cref="F:TTAR.API.Hubs.TournamentHub.MaxGroupsPerConnection"/>.
            Static because Hub instances are created per method invocation, not per connection — the state must
            outlive a single call. Cleaned up in <see cref="M:TTAR.API.Hubs.TournamentHub.OnDisconnectedAsync(System.Exception)"/>.
            </summary>
        </member>
        <member name="M:TTAR.API.Hubs.TournamentHub.JoinTournament(System.Int32)">
            <summary>Subscribe this connection to a tournament's live updates (called when its page opens).</summary>
        </member>
        <member name="M:TTAR.API.Hubs.TournamentHub.LeaveTournament(System.Int32)">
            <summary>Unsubscribe (called when the page closes). Disconnect also cleans groups automatically.</summary>
        </member>
        <member name="M:TTAR.API.Hubs.TournamentHub.OnDisconnectedAsync(System.Exception)">
            <inheritdoc />
        </member>
        <member name="T:TTAR.API.Idempotency.IdempotencyCleanupService">
            <summary>
            Deletes the idempotency keys past <see cref="P:TTAR.API.Configuration.IdempotencyOptions.Retention"/> every
            <see cref="P:TTAR.API.Configuration.IdempotencyOptions.CleanupInterval"/>. Expired keys are ignored on lookup anyway; this only keeps the
            table small.
            </summary>
        </member>
        <member name="M:TTAR.API.Idempotency.IdempotencyCleanupService.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,Microsoft.Extensions.Options.IOptions{TTAR.API.Configuration.IdempotencyOptions},System.TimeProvider,Microsoft.Extensions.Logging.ILogger{TTAR.API.Idempotency.IdempotencyCleanupService})">
            <summary>
            Deletes the idempotency keys past <see cref="P:TTAR.API.Configuration.IdempotencyOptions.Retention"/> every
            <see cref="P:TTAR.API.Configuration.IdempotencyOptions.CleanupInterval"/>. Expired keys are ignored on lookup anyway; this only keeps the
            table small.
            </summary>
        </member>
        <member name="M:TTAR.API.Idempotency.IdempotencyCleanupService.ExecuteAsync(System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="T:TTAR.API.Idempotency.IdempotencyHeaders">
            <summary>
            The <c>Idempotency-Key</c> contract with the clients (HTTP headers only, not part of swagger).
            </summary>
        </member>
        <member name="F:TTAR.API.Idempotency.IdempotencyHeaders.Key">
            <summary>Request header: one key per logical user action, the same on every retry of it.</summary>
        </member>
        <member name="F:TTAR.API.Idempotency.IdempotencyHeaders.Supported">
            <summary>Response header on every response while the key is honoured; clients retry writes only after it.</summary>
        </member>
        <member name="F:TTAR.API.Idempotency.IdempotencyHeaders.Status">
            <summary>Response header of a 409: <see cref="F:TTAR.API.Idempotency.IdempotencyHeaders.InProgress"/> while the same key is still running.</summary>
        </member>
        <member name="F:TTAR.API.Idempotency.IdempotencyHeaders.InProgress">
            <summary>The <see cref="F:TTAR.API.Idempotency.IdempotencyHeaders.Status"/> value of a duplicate that arrived while the first request runs.</summary>
        </member>
        <member name="F:TTAR.API.Idempotency.IdempotencyHeaders.Replayed">
            <summary>Response header of a stored response replayed to a retry.</summary>
        </member>
        <member name="T:TTAR.API.Idempotency.IdempotencyMiddleware">
            <summary>
            Runs a controller write (POST/PUT/PATCH/DELETE) sent with an <see cref="F:TTAR.API.Idempotency.IdempotencyHeaders.Key"/> at most once per
            caller and key: a retry of the same request gets the stored response, a duplicate arriving while the first runs
            gets 409 in-progress, the key reused for another request gets 422. 5xx and 429 are not stored. The contract is in
            <c>Docs/API/idempotency.md</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Idempotency.IdempotencyMiddleware.#ctor(Microsoft.AspNetCore.Http.RequestDelegate,Microsoft.Extensions.Options.IOptions{TTAR.API.Configuration.IdempotencyOptions},System.TimeProvider,Microsoft.Extensions.Logging.ILogger{TTAR.API.Idempotency.IdempotencyMiddleware})">
            <summary>
            Runs a controller write (POST/PUT/PATCH/DELETE) sent with an <see cref="F:TTAR.API.Idempotency.IdempotencyHeaders.Key"/> at most once per
            caller and key: a retry of the same request gets the stored response, a duplicate arriving while the first runs
            gets 409 in-progress, the key reused for another request gets 422. 5xx and 429 are not stored. The contract is in
            <c>Docs/API/idempotency.md</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Idempotency.IdempotencyMiddleware.InvokeAsync(Microsoft.AspNetCore.Http.HttpContext,TTAR.DataProviders.Abstractions.IIdempotencyRepository)">
            <summary>
            Handles the request under its idempotency key, or passes it through when it has none or is not covered.
            </summary>
        </member>
        <member name="T:TTAR.API.Idempotency.SkipIdempotencyAttribute">
            <summary>
            Excludes a controller or action from <c>Idempotency-Key</c> handling: the key is ignored and the request runs as
            sent. For endpoints the API client does not call (OIDC, server-to-server), whose responses carry cookies or
            protocol headers a replay would not restore.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationItemRequest">
            <summary>
            A support payment entered by an administrator.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationItemRequest.Amount">
            <summary>Net US dollars after the payment service's fee: more than 0, at most 99 999.99, cents at most.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationPageEventRequest">
            <summary>
            An event of the "Expenses and support" page. Carries nothing about the visitor.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationPageEventRequest.Type">
            <summary><c>View</c> — the page was opened; <c>Click</c> — "Support the project" was tapped.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationStatsBucket">
            <summary>
            The bucket of the page statistics.
            </summary>
        </member>
        <member name="F:TTAR.API.Models.Donations.DonationStatsBucket.Day">
            <summary>One row per day.</summary>
        </member>
        <member name="F:TTAR.API.Models.Donations.DonationStatsBucket.Month">
            <summary>One row per month, dated by its first day.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationTotals">
            <summary>
            Expenses of a period and the support collected in it, US dollars (support is net of the payment service's fee).
            The client computes the coverage from the two sums.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationTotals.Expenses">
            <summary>Operating expenses.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationTotals.Donations">
            <summary>Support collected.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationMonthResponse">
            <summary>
            One month of the history.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationMonthResponse.Year">
            <summary>The year.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationMonthResponse.Month">
            <summary>The month, 1–12.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationYearResponse">
            <summary>
            One year of the history: its months from the start of the history up to the running one.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationYearResponse.Year">
            <summary>The year.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationYearMonth">
            <summary>
            A calendar month.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationYearMonth.Year">
            <summary>The year.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationYearMonth.Month">
            <summary>The month, 1–12.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationToday">
            <summary>
            Today, UTC: the running month and how much of it is left.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationToday.Day">
            <summary>Day of the month, 1-based.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationToday.DaysInMonth">
            <summary>Number of days in the running month.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationSummaryResponse">
            <summary>
            The three coverage scales: the running month, the running year and the whole history.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationSummaryResponse.FirstMonth">
            <summary>The first month of the history (the month of the first game).</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationSummaryResponse.Now">
            <summary>Today.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationSummaryResponse.Month">
            <summary>The running month.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationSummaryResponse.Year">
            <summary>The running year, its months of the history up to the running one.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationSummaryResponse.AllTime">
            <summary>The whole history up to the running month.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationMethodsResponse">
            <summary>
            What the support sheet offers the caller.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationMethodsResponse.Country">
            <summary>
            The caller's country, ISO 3166-1 alpha-2 (<c>GE</c>): from the profile or the stored location, for a guest
            from the IP address; <c>null</c> when unknown.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationMethodsResponse.Methods">
            <summary>
            The methods offered in the caller's country, in the order to show: those meant for that country first, then
            those for everyone, each in the configured order.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationMethodResponse">
            <summary>
            A payment method of the support sheet.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationMethodResponse.Id">
            <summary>
            The client's key of the method: <c>boosty</c>, <c>flitt</c>, <c>bog</c>, <c>gpay</c>, <c>erip-phone</c>,
            <c>erip-qr</c>, <c>card-belkart</c>, <c>card-belkart-by</c>, <c>card-mastercard</c>, <c>card-visa</c>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationMethodResponse.Kind">
            <summary>
            <c>External</c> opens <see cref="P:TTAR.API.Models.Donations.DonationMethodResponse.Url"/>, which chooses the amount and the frequency itself; <c>Acquiring</c>
            and <c>Wallet</c> take them from the sheet; <c>Transfer</c> is paid in the payer's bank app to
            <see cref="P:TTAR.API.Models.Donations.DonationMethodResponse.Phone"/> at <see cref="P:TTAR.API.Models.Donations.DonationMethodResponse.Bank"/>, by the QR code of <see cref="P:TTAR.API.Models.Donations.DonationMethodResponse.Url"/> or to <see cref="P:TTAR.API.Models.Donations.DonationMethodResponse.Card"/> of
            <see cref="P:TTAR.API.Models.Donations.DonationMethodResponse.Holder"/>, with no amount or frequency in the sheet.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationMethodResponse.Url">
            <summary>
            The page of an external method or the payment link of a transfer (to draw as a QR code and open on a phone),
            as is: nothing about the player is added to it.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationMethodResponse.Phone">
            <summary>The recipient's phone of a transfer, E.164 (<c>+375291234567</c>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationMethodResponse.Bank">
            <summary>The recipient's bank of a transfer, as the payer finds it in their bank app.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationMethodResponse.Card">
            <summary>The recipient's card number of a transfer, 13–19 digits with no separators.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationMethodResponse.Holder">
            <summary>The cardholder's name in Latin letters as on the card, which a cross-border card transfer asks for.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationAdminMonthResponse">
            <summary>
            A month in the admin page "Поддержка проекта": its support payments and the sums.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationAdminMonthResponse.Year">
            <summary>The year.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationAdminMonthResponse.Month">
            <summary>The month, 1–12.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationAdminMonthResponse.Total">
            <summary>Support collected: the sum of the payments, with cents. The banner and the page show the same.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationAdminMonthResponse.Expenses">
            <summary>Operating expenses of the month (<c>0</c> while the section is switched off).</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationAdminMonthResponse.Items">
            <summary>The payments, newest first.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationItemResponse">
            <summary>
            One support payment entered by an administrator.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationItemResponse.Id">
            <summary>Payment id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationItemResponse.Amount">
            <summary>Net US dollars, with cents.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationItemResponse.CreatedAt">
            <summary>When it was entered, UTC.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationItemResponse.CreatedBy">
            <summary>The administrator who entered it; <c>null</c> for a payment not entered by hand.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationAdminResponse">
            <summary>
            An administrator in the payment log.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationAdminResponse.Id">
            <summary>Player id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationAdminResponse.Name">
            <summary>Display name.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationItemAddedResponse">
            <summary>
            A payment just added and the new support of its month.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationItemAddedResponse.Item">
            <summary>The payment.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationItemAddedResponse.Total">
            <summary>Support collected in the month now.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationTotalResponse">
            <summary>
            The support of a month after a payment was deleted.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationTotalResponse.Total">
            <summary>Support collected in the month now.</summary>
        </member>
        <member name="T:TTAR.API.Models.Donations.DonationPageStatResponse">
            <summary>
            Anonymous counters of the "Expenses and support" page for a day or a month (UTC).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationPageStatResponse.Date">
            <summary>The day; for a month, its first day.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationPageStatResponse.Views">
            <summary>Openings of the page.</summary>
        </member>
        <member name="P:TTAR.API.Models.Donations.DonationPageStatResponse.Clicks">
            <summary>Taps on "Support the project".</summary>
        </member>
        <member name="T:TTAR.API.Models.GeoPoint">
            <summary>
            Represents a geographic point defined by its longitude and latitude
            </summary>
            <param name="Longitude">Longitude</param>
            <param name="Latitude">Latitude</param>
        </member>
        <member name="M:TTAR.API.Models.GeoPoint.#ctor(System.Double,System.Double)">
            <summary>
            Represents a geographic point defined by its longitude and latitude
            </summary>
            <param name="Longitude">Longitude</param>
            <param name="Latitude">Latitude</param>
        </member>
        <member name="P:TTAR.API.Models.GeoPoint.Longitude">
            <summary>Longitude</summary>
        </member>
        <member name="P:TTAR.API.Models.GeoPoint.Latitude">
            <summary>Latitude</summary>
        </member>
        <member name="M:TTAR.API.Models.GeoPoint.ToNtsPoint">
            <summary>
            Converts the current geographic coordinates into a NetTopologySuite <see cref="T:NetTopologySuite.Geometries.Point"/>.
            </summary>
            <returns>A <see cref="T:NetTopologySuite.Geometries.Point"/> representing the geographic location defined by the current longitude and latitude.</returns>
        </member>
        <member name="T:TTAR.API.Models.Hand">
            <summary>
            Player hand rating (e.g. rating for Main hand, or for Weak hand)
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Hand.#ctor(TTAR.DataProviders.Models.HandModel)">
            <summary>
            Player hand rating (e.g. rating for Main hand, or for Weak hand)
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.Id">
            <summary>
            Id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.PlayerId">
            <summary>
            Player profile id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.Name">
            <summary>
            Player name, or Telegram login with "@" prefix when the player profile
            has no name yet (e.g. a game registered by Telegram login, not confirmed yet).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.AvatarPath">
            <summary>
            Avatar URL
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.HandType">
            <summary>
            Hand type (Main, Weak)
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.Rating">
            <summary>
            Elo rating value
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.Games">
            <summary>
            Amount of games (not sets)
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.QualificationPoints">
            <summary>
            Amount of qualification points
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.QualificationTarget">
            <summary>
            Qualification points a hand needs to be qualified; the same for every hand.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.IsRated">
            <summary>
            Indicated whether a player was rated once. 
            Due to inactivity the player may have to get qualification points again, but it is displayed in a top anyway.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.IsInactive">
            <summary>
            True for a rated hand whose <seealso cref="P:TTAR.API.Models.Hand.QualificationPoints"/> were reset below <see cref="P:TTAR.API.Models.Hand.QualificationTarget"/>
            for inactivity; it is active again once the points reach the target.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.IsTournamentGuest">
            <summary>
            True when this hand belongs to a one-off tournament guest (no TTAR profile, no login). A guest is
            rated as a normal newcomer; the game history shows it with a silhouette avatar and a "guest" marker
            and does not link its name to a profile page. Distinct from <c>IsExternal</c> (RTTF import).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.IsExternal">
            <summary>
            True when this hand belongs to an RTTF-imported player (an RTTF profile only, no TTAR login). Unlike a
            guest, an external player carries a real imported rating (shown normally); the history/dashboard mark it
            with an "RTTF" pill + globe badge and do not link its name to a TTAR profile page.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Hand.MainHand">
            <summary>
            The owning player's physical main hand (Left/Right). Lets the client render the "left hand" badge for
            this record from <see cref="P:TTAR.API.Models.Hand.HandType"/> + this side. <c>null</c> when never set (treated as Right) or
            for a tournament guest (no profile hand).
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Places.ParsePlaceRequest">
            <summary>A map link to read venue fields from.</summary>
        </member>
        <member name="P:TTAR.API.Models.Places.ParsePlaceRequest.Url">
            <summary>
            Link to a place on Google Maps, Yandex Maps, 2GIS, OpenStreetMap or Apple Maps — short links included. The
            whole text of a "share" action is accepted too: the first place link in it is used (else the first short
            link, else the first map link).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Places.ParsePlaceRequest.Html">
            <summary>
            Optional HTML of the card page as the client loaded it (a mobile WebView on the user's own connection), for
            when the server's own request is refused. Read for Yandex, 2GIS and Apple; for Google only its preview link
            is taken (the server fetches the preview itself); ignored for OpenStreetMap.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Places.PlaceSuggestionResponse">
            <summary>
            Venue fields suggested from a map card, named and shaped as in <c>POST /venues</c> so the chosen ones can be put
            into the form as they are. A hint only: nothing is stored until the venue itself is created.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Places.PlaceSuggestionResponse.Source">
            <summary>The card — pass it as <c>source</c> of <c>POST /venues</c>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Places.PlaceSuggestionResponse.CardLoaded">
            <summary>
            True when the card itself was read. False = only the link could be read (the service refused or changed its
            page): the fields below are then limited to what the link carries, and a missing one is unknown rather than
            absent from the card.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Places.PlaceSuggestionResponse.Name">
            <summary>Place name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Places.PlaceSuggestionResponse.Place">
            <summary>Address as one line, "city, street".</summary>
        </member>
        <member name="P:TTAR.API.Models.Places.PlaceSuggestionResponse.Latitude">
            <summary>Latitude of the place's point.</summary>
        </member>
        <member name="P:TTAR.API.Models.Places.PlaceSuggestionResponse.Longitude">
            <summary>Longitude of the place's point.</summary>
        </member>
        <member name="P:TTAR.API.Models.Places.PlaceSuggestionResponse.Phone">
            <summary>Phone number as the card shows it.</summary>
        </member>
        <member name="P:TTAR.API.Models.Places.PlaceSuggestionResponse.Site">
            <summary>Web site.</summary>
        </member>
        <member name="P:TTAR.API.Models.Places.PlaceSuggestionResponse.Telegram">
            <summary>Telegram handle (<c>@name</c>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Places.PlaceSuggestionResponse.OpeningHours">
            <summary>Opening hours (7 pipe-separated day strings, Mon..Sun; empty segment = closed).</summary>
        </member>
        <member name="P:TTAR.API.Models.Places.PlaceSuggestionResponse.TimeZone">
            <summary>IANA time zone of the place, when the card states one.</summary>
        </member>
        <member name="T:TTAR.API.Models.PlayerImage">
            <summary>
            Player's images
            </summary>
        </member>
        <member name="M:TTAR.API.Models.PlayerImage.#ctor(TTAR.DataProviders.Models.ImageModel)">
            <summary>
            Player's images
            </summary>
        </member>
        <member name="P:TTAR.API.Models.PlayerImage.ImagePath">
            <summary>
            Relative path to the image
            </summary>
        </member>
        <member name="P:TTAR.API.Models.PlayerImage.Type">
            <summary>
            The image type. A photo the player uploaded comes as <see cref="F:TTAR.Types.ImageType.Avatar"/> (it is the avatar shown);
            whether it is one is <c>PlayerProfileResponse.HasPhoto</c>.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.RankMappingModel">
            <summary>
            Represents a mapping between a <see cref="T:TTAR.Services.Rank"/> and its associated rating value
            </summary>
        </member>
        <member name="P:TTAR.API.Models.RankMappingModel.Rank">
            <summary>
            Gets the rank
            </summary>
        </member>
        <member name="P:TTAR.API.Models.RankMappingModel.Rating">
            <summary>
            Gets the rating value associated with the rank
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.AuthenticateRequest.RememberMe">
            <summary>
            When <c>true</c>, a long-lived session token is issued alongside the refresh token.
            Omit or set to <c>false</c> for regular (non-persistent) sessions.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.AuthenticateRequest.ClientInfo">
            <summary>
            Optional device description (mobile app). The app and its version go in the <c>X-Client-App</c> /
            <c>X-Client-Version</c> headers; the web omits this field and is identified by the <c>User-Agent</c> header.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.AvatarFocusRequest">
            <summary>
            The new avatar centre of the player's photo.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.AvatarFocusRequest.FocusX">
            <summary>
            The avatar centre in fractions (0…1) of the photo width; clamped to the range
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.AvatarFocusRequest.FocusY">
            <summary>
            The avatar centre in fractions (0…1) of the photo height; clamped to the range
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.ChangeEmailRequest">
            <summary>
            Request to start changing the email address of the authenticated user.
            A confirmation link is sent to the new address; the login email is switched only after confirmation.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangeEmailRequest.NewEmail">
            <summary>
            The new email address. Must be a valid email format and is required.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangeEmailRequest.CurrentPassword">
            <summary>
            The current password. Required: the email can only be changed on an account that has a password.
            A password-less (SSO/Telegram) account must set a password first; otherwise the request is rejected
            with <c>ErrorCode.PasswordRequired</c>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangeEmailRequest.LanguageCode">
            <summary>
            Preferred language code for the confirmation email (e.g. "en", "ru", "pl").
            Falls back to the user's stored language preference when omitted.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.ChangePasswordRequest">
            <summary>
            Request to change the password of the authenticated user.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangePasswordRequest.CurrentPassword">
            <summary>
            The current password. Required for accounts that already have a password;
            may be omitted for password-less (SSO/Telegram) accounts setting their first password.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangePasswordRequest.NewPassword">
            <summary>
            The new password. Must be at least 8 characters long and is required.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangePasswordRequest.RememberMe">
            <summary>
            When <c>true</c>, the fresh tokens returned for the current device include a long-lived session token
            ("remember me"). Pass the same value the current session was created with so the device keeps its
            persistence after the password change. Omit or set to <c>false</c> for non-persistent sessions.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangePasswordRequest.ClientInfo">
            <summary>
            Optional device description (mobile app) for the re-issued session. The app and its version go in the
            <c>X-Client-App</c> / <c>X-Client-Version</c> headers; the web omits this field.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.ChangeProfileRequest">
            <summary>
            Request model for ChangeProfile method
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangeProfileRequest.Name">
            <summary>
            Displayed user name
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangeProfileRequest.Password">
            <summary>
            User password
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangeProfileRequest.ShouldCopyPmToTelegram">
            <summary>
            Indicates whether private messages should be copied to Telegram
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangeProfileRequest.PreferredLanguageCode">
            <summary>
            User-defined language code override. Set to empty string to reset to Telegram language.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangeProfileRequest.UseRttfName">
            <summary>
            Whether the displayed name follows the linked RTTF profile (<c>true</c>) or the account name
            (<c>false</c>). Ignored unless the player has a confirmed RTTF link. <c>null</c> means "don't touch".
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangeProfileRequest.MainHand">
            <summary>
            The player's physical main hand (Left/Right). Setting it changes only the profile label — ratings,
            history and qualification never move between axes. Sending an explicit value (including the default
            Right) is itself the confirmation that dismisses the soft "please confirm" prompt. <c>null</c> means
            "don't touch".
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangeProfileRequest.Gender">
            <summary>
            The player's gender ("Male" / "Female"). A one-time choice: once set, re-sending the same value is a no-op and
            a different one is refused with 409 <c>GenderAlreadySet</c>. <c>null</c> means "don't touch" (it never clears).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ChangeProfileRequest.Personal">
            <summary>
            The "Contacts and about" block with its visibility flags and the other-rating links. Unlike the fields above it
            is replaced AS A WHOLE: when present, an omitted or <c>null</c> field inside clears the stored value and an
            omitted flag is <c>false</c>. <c>null</c> means "don't touch the block".
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.ConfirmEmailChangeRequest">
            <summary>
            Request to complete the change-email flow using a token from the confirmation email.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ConfirmEmailChangeRequest.Token">
            <summary>
            The token from the confirmation email. Must be provided and is required.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.EmailConfirmationRequest">
            <summary>
            Request to confirm an account email using a token from the confirmation email.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.EmailConfirmationRequest.Token">
            <summary>
            The token from the confirmation email. Must be provided and is required.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.EmailConfirmationRequest.RememberMe">
            <summary>
            When <c>true</c>, a long-lived session token is issued alongside the refresh token.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.EmailConfirmationRequest.ClientInfo">
            <summary>
            Optional device description (mobile app). The app and its version go in the <c>X-Client-App</c> /
            <c>X-Client-Version</c> headers; the web omits this field.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.EmailPreferencesRequest">
            <summary>Turns email topics on or off: only the listed ones change, the rest keep their state.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.EmailPreferencesRequest.Topics">
            <summary>The topics to change; one at a time is the usual case.</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.EmailPreferencesByTokenRequest">
            <summary><see cref="T:TTAR.API.Models.Requests.EmailPreferencesRequest"/> made through the emailed link, without signing in.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.EmailPreferencesByTokenRequest.Token">
            <summary>The token of the emailed preferences link.</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.EmailTopicToggle">
            <summary>One topic to turn on or off.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.EmailTopicToggle.Topic">
            <summary>The topic.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.EmailTopicToggle.Enabled">
            <summary>Whether its emails are to be sent.</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.ExceptionLogRequest">
            <summary>
            Represents a request to log an exception
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ExceptionLogRequest.Message">
            <summary>
            Gets or sets the exception message
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ExceptionLogRequest.AppVersion">
            <summary>
            Gets or sets the application version where the exception occurred
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ExceptionLogRequest.DeviceInfo">
            <summary>
            Gets or sets device information, if available
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ExceptionLogRequest.StackTrace">
            <summary>
            Gets or sets the stack trace of the exception, if available
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ExceptionLogRequest.AdditionalInfo">
            <summary>
            Gets or sets additional information related to the exception (e.g. page, API call, arguments)
            </summary>
            <remarks>String values on purpose: an <c>object?</c> value type is emitted by Swagger as an empty enum,
            which makes the NSwag-generated client unable to send anything.</remarks>
        </member>
        <member name="T:TTAR.API.Models.Requests.GeoChatFeedRequest">
            <summary>A page of the geo chat feed.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.GeoChatFeedRequest.Before">
            <summary>Only messages older than this id (the first message of the page shown); omitted = the newest.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.GeoChatFeedRequest.Take">
            <summary>Page size, at most 100.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.GeoChatFeedRequest.GeoPoint">
            <summary>The reader's current position; refreshes their stored position when it moved to another ~500 m cell.</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.SendGeoChatMessageRequest">
            <summary>A geo chat message.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.SendGeoChatMessageRequest.Content">
            <summary>Text with <c>@[playerId]</c> mention tokens, at most 3 distinct, 400 characters in all.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.SendGeoChatMessageRequest.GeoPoint">
            <summary>The sender's position (the message is stored with its ~500 m cell); without it the send is refused with 403 <c>GeoChatLocationRequired</c>.</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.GeoChatSettingsRequest">
            <summary>The reader's geo chat settings.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.GeoChatSettingsRequest.RadiusKm">
            <summary>One of 0 (off), 5, 10, 50, 100, 500, 1000, or -1 ("all", chat moderators only).</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.GeoChatActivityRequest">
            <summary>The guest teaser's point.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.GeoChatActivityRequest.GeoPoint">
            <summary>The viewer's position; omitted = global counts.</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.ReportRequest">
            <summary>A report about a player.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ReportRequest.TargetPlayerId">
            <summary>The reported player.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ReportRequest.Context">
            <summary>Where the report is filed from.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ReportRequest.MessageId">
            <summary>The reported geo chat message (<see cref="F:TTAR.Types.ReportContext.Geo"/> only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ReportRequest.Reason">
            <summary>The reason.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ReportRequest.Comment">
            <summary>Free text, at most 1000 characters; required for <see cref="F:TTAR.Types.ReportReason.Other"/>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ReportRequest.AlsoBlock">
            <summary>Also block the reported player.</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.ModerationDecisionRequest">
            <summary>A decision about a player: closes all their open reports, bans or deletes as asked.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ModerationDecisionRequest.TargetPlayerId">
            <summary>The player decided on.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ModerationDecisionRequest.Action">
            <summary><c>None</c> (no violation), <c>DeleteMessages</c>, <c>BanChat</c>, <c>BanAll</c>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ModerationDecisionRequest.Reason">
            <summary>Required for a ban; <c>Other</c> needs a comment.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ModerationDecisionRequest.Comment">
            <summary>The moderator's comment; the player sees it with the reason.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ModerationDecisionRequest.Term">
            <summary>A chat ban's length: <c>1d</c>, <c>7d</c> or <c>30d</c>; <c>null</c> = until lifted. Only for <c>BanChat</c>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ModerationDecisionRequest.Purge">
            <summary>Which messages to delete: <c>None</c>, <c>Message</c> (needs <c>messageId</c>), <c>Reported</c>, <c>All</c>. <c>DeleteMessages</c> defaults to <c>Reported</c>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ModerationDecisionRequest.MessageId">
            <summary>The geo chat message the decision was opened from.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ModerationDecisionRequest.Source">
            <summary>Where the decision is made: <c>Admin</c> (the "Reports" page) or <c>Chat</c> (the author menu).</summary>
        </member>
        <member name="M:TTAR.API.Models.Requests.ModerationDecisionRequest.TryGetTerm(System.Nullable{System.TimeSpan}@)">
            <summary>The term as a span, or <c>null</c> for none; <c>false</c> when the text is not a term.</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.ModerationSettingsRequest">
            <summary>A moderator's own settings.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ModerationSettingsRequest.TelegramNotify">
            <summary>New reports come to the moderator's Telegram, with the decision buttons.</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.NewGameRequest">
            <summary>
            Template to create new unconfirmed game
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewGameRequest.TempGameId">
            <summary>
            Temporary identifier for the game, used for callbacks
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewGameRequest.Player1Id">
            <summary>
            Player 1 id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewGameRequest.Player1HandType">
            <summary>
            Player 1 hand type
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewGameRequest.Player2Id">
            <summary>
            Player 2 id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewGameRequest.Player2HandType">
            <summary>
            Player 2 hand type
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewGameRequest.Score1">
            <summary>
            Player 1 score
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewGameRequest.Score2">
            <summary>
            Player 2 score
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewGameRequest.ChatId">
            <summary>
            Telegram chat for notifications
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.NewLanguageRequest">
            <summary>
            A user's request for a new interface language, sent from the language menu.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewLanguageRequest.Language">
            <summary>The requested language, free text as the user typed it (e.g. <c>Polski</c>, <c>Vietnamese</c>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewLanguageRequest.Comment">
            <summary>Optional comment.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewLanguageRequest.ContactEmail">
            <summary>
            Optional address to reply to, mainly for anonymous users; an authenticated caller's account email is used when
            omitted. Send <c>null</c> rather than an empty string, which fails the email check.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewLanguageRequest.CanHelpTranslate">
            <summary>Whether the user offers to help with or proofread the translation.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.NewLanguageRequest.UiLanguage">
            <summary>The current interface language code (e.g. <c>ru</c>, <c>pt-BR</c>), for context.</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.PasswordResetRequest">
            <summary>
            Request to complete the password reset flow using a token from the reset email.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.PasswordRestoreRequest">
            <summary>
            Request to start the password reset flow by email.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PasswordRestoreRequest.Email">
            <summary>
            Email address of the user requesting password reset. Must be a valid email format and is required.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PasswordRestoreRequest.LanguageCode">
            <summary>
            Preferred language code for the reset email (e.g. "en", "ru", "pl").
            Falls back to the default (English) when omitted.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.PersonalInfoRequest">
            <summary>
            The "Contacts and about" profile block, sent as a whole (see <see cref="P:TTAR.API.Models.Requests.ChangeProfileRequest.Personal"/>). Every
            field is optional. Each visibility flag governs what OTHER users get; the owner always sees everything.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.ContactPhone">
            <summary>Contact phone: digits, '+', '-', spaces and brackets, 5–15 digits. Never shown to anonymous viewers.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.ShowPhoneToOrganizers">
            <summary>Pass <see cref="P:TTAR.API.Models.Requests.PersonalInfoRequest.ContactPhone"/> to the managers of tournaments the player registers for themselves.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.ShowPhoneToPlayers">
            <summary>
            Show <see cref="P:TTAR.API.Models.Requests.PersonalInfoRequest.ContactPhone"/> to other authenticated players on the player card (never to anonymous viewers;
            a minor's phone stays hidden from others regardless). Implies <see cref="P:TTAR.API.Models.Requests.PersonalInfoRequest.ShowPhoneToOrganizers"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.LiveCountryCode">
            <summary>Country of residence, ISO 3166-1 alpha-2 (the name is localized on the client).</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.LiveCity">
            <summary>City of residence, free text up to 60 characters.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.ShowLivePlace">
            <summary>Show the residence country/city to everyone.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.BirthCountryCode">
            <summary>Country of birth, ISO 3166-1 alpha-2.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.BirthCity">
            <summary>City of birth, free text up to 60 characters.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.ShowBirthPlace">
            <summary>Show the birth country/city to everyone.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.BirthYear">
            <summary>Birth year (only the year is asked), from 1900 to the current year.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.ShowBirthYear">
            <summary>Show the birth year to everyone (a minor's year stays hidden from others regardless).</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.ShowTelegram">
            <summary>Show the Telegram username to other authenticated players (never to anonymous viewers).</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.ShowRttf">
            <summary>
            Show the RTTF link to everyone on the player card. Managers and confirmed participants of a tournament the
            player confirmed participation in see the link regardless.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.ShowOtherRatings">
            <summary>Show <see cref="P:TTAR.API.Models.Requests.PersonalInfoRequest.OtherRatings"/> to everyone.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.PersonalInfoRequest.OtherRatings">
            <summary>Links to the player's profiles in other rating systems, in display order (at most 10).</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.OtherRatingRequest">
            <summary>A link to the player's profile in another rating system.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.OtherRatingRequest.System">
            <summary>The rating system ("Ittf", "Fntr", "Ttw", "Other").</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.OtherRatingRequest.Name">
            <summary>System name, required for "Other" (up to 50 characters); ignored for a listed system.</summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.OtherRatingRequest.Url">
            <summary>Profile link shaped like <c>host.tld/...</c>; the <c>https://</c> scheme is optional.</summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.RegisterRequest">
            <summary>
            Request to register a new account with an email and password.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.RegisterRequest.Email">
            <summary>
            The email address used to identify and authenticate the account.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.RegisterRequest.Password">
            <summary>
            The password used to authenticate the account. Must be at least 8 characters long.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.RegisterRequest.Name">
            <summary>
            Optional display name for the new account.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.RegisterRequest.LanguageCode">
            <summary>
            Preferred language code for the confirmation email (e.g. "en", "ru", "pl").
            Falls back to the default (English) when omitted.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.ResendConfirmationRequest">
            <summary>
            Request to re-send the email-confirmation link for an unverified account.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ResendConfirmationRequest.Email">
            <summary>
            The email address used to identify and authenticate the account.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ResendConfirmationRequest.LanguageCode">
            <summary>
            Preferred language code for the confirmation email (e.g. "en", "ru", "pl").
            Falls back to the default (English) when omitted.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.ResendEmailChangeConfirmationRequest">
            <summary>
            Request to re-send the email-change confirmation link for an authenticated user with a pending email change.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.ResendEmailChangeConfirmationRequest.LanguageCode">
            <summary>
            Preferred language code for the confirmation email (e.g. "en", "ru", "pl").
            Falls back to the user's stored language preference when omitted.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.SearchPlayerRequest">
            <summary>
            Request model for searching players
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.SearchPlayerRequest.Pattern">
            <summary>
            Pattern to search, wild-cards allowed
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.SearchPlayerRequest.IncludeEmptyPlayers">
            <summary>
            Should include players without any rating, just registered
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.SearchPlayerRequest.CurrentPage">
            <summary>
            Page of returned results
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.SearchPlayerRequest.PageSize">
            <summary>
            Returning results' page size.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.SearchPlayerRequest.GeoPoint">
            <summary>
            Geographical point containing longitude and latitude
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.SearchTelegramChatRequest">
            <summary>
            Request model for searching Telegram chats
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.SearchTelegramChatRequest.CurrentPage">
            <summary>
            Page of returned results
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.SearchTelegramChatRequest.PageSize">
            <summary>
            Returning results' page size.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.SearchTelegramChatRequest.GeoPoint">
            <summary>
            Geographical point containing longitude and latitude
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.SendPrivateMessageRequest">
            <summary>
            Request model for sending a private message
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.SendPrivateMessageRequest.Content">
            <summary>
            The message content
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.SendPrivateMessageRequest.GeoPoint">
            <summary>
            Geographical point containing longitude and latitude
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Requests.TopFullRequest">
            <summary>
            Request model for retrieving top players with optional filtering and pagination
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.TopFullRequest.CurrentPage">
            <summary>
            Gets or sets the current page number for pagination
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.TopFullRequest.PlayerId">
            <summary>
            Display position of specified player in returned results
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.TopFullRequest.PageSize">
            <summary>
            Gets or sets the page size for pagination
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.TopFullRequest.Location">
            <summary>
            Gets or sets the optional geographic location for proximity filtering
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Requests.TopFullRequest.DistanceKm">
            <summary>
            Gets or sets the optional distance in kilometers for location-based filtering
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.AuthenticateResponse.SessionToken">
            <summary>
            Long-lived session token for "remember me" functionality.
            Present only when the client requested session persistence.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.ChatResponse">
            <summary>
            Telegram chat model
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.ChatResponse.#ctor(TTAR.DataProviders.Models.ChatModel)">
            <summary>
            Telegram chat model
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ChatResponse.Id">
            <summary>
            Chat id (not Telegram id!)
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ChatResponse.Name">
            <summary>
            Chat name
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ChatResponse.ChatLink">
            <summary>
            Chat invitation link
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ChatResponse.LanguageCode">
            <summary>
            Chat default language
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ChatResponse.IsForum">
            <summary>
            The supergroup has topics enabled (known once the bot has seen a message there): the client then offers a
            tournament its own announce topic.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ChatResponse.DefaultTopicId">
            <summary>
            The bot's default topic for the chat — where it posts games and, unless a tournament has its own topic, tournament
            announcements and results. Null — General.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ChatResponse.IsTopicManual">
            <summary>True — an admin pinned <see cref="P:TTAR.API.Models.Responses.ChatResponse.DefaultTopicId"/> in the bot's chat settings; false — the bot picks the most used topic.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ChatResponse.MessageLinkChatId">
            <summary>
            The chat's id in message links <c>t.me/c/&lt;id&gt;/…</c> (a supergroup's Telegram id without the -100 prefix), to
            tell a link to another chat's message; null for a basic group.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.ConfirmDeadlineOutcome">
            <summary>What happens to a game still waiting for confirmation at its <see cref="P:TTAR.API.Models.Responses.GameResponse.ConfirmDeadline"/>.</summary>
        </member>
        <member name="F:TTAR.API.Models.Responses.ConfirmDeadlineOutcome.Expire">
            <summary>The confirmation expires: the game never counts.</summary>
        </member>
        <member name="F:TTAR.API.Models.Responses.ConfirmDeadlineOutcome.AutoConfirm">
            <summary>The game counts by itself, as if confirmed (a finished ladder's waiting game with auto-confirm on).</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.ConversationInfoResponse">
            <summary>
            Conversation header information
            </summary>
            <param name="Sender">Sender information (ever if there is no any message from the sender)</param>
            <param name="LatestMessage">Latest message information</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.ConversationInfoResponse.#ctor(TTAR.API.Models.Responses.PlayerResponse,TTAR.API.Models.Responses.PrivateMessageResponse)">
            <summary>
            Conversation header information
            </summary>
            <param name="Sender">Sender information (ever if there is no any message from the sender)</param>
            <param name="LatestMessage">Latest message information</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.ConversationInfoResponse.Sender">
            <summary>Sender information (ever if there is no any message from the sender)</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ConversationInfoResponse.LatestMessage">
            <summary>Latest message information</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.DashboardResponse">
            <summary>
            Aggregated home-dashboard payload for the authenticated player and a single hand. Widgets build their charts
            and messages from these numbers (design handoff "Главная / Dashboard"). Guest landing needs no data.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardResponse.Rating">
            <summary>
            Rating widget: current rating, rank progress and all-time record.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardResponse.Periods">
            <summary>
            Per-period rating delta, games and normalized sparkline (week/month/year).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardResponse.Stats">
            <summary>
            All-time win/loss/draw, winrate and win streaks.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardResponse.HeadToHead">
            <summary>
            Head-to-head: most-beaten opponent (favorite) and worst matchup (nemesis). Each side may be null.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardResponse.Recent">
            <summary>
            Up to four most recent games, newest first.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardResponse.Activity">
            <summary>
            Yearly activity heatmap (52×7 daily levels 0..4) and totals.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardResponse.Tournament">
            <summary>
            Nearest upcoming tournament open for registration, or null (widget hidden).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardResponse.Achievements">
            <summary>
            Achievements badges. Empty in this iteration — there is no achievements source yet (see handoff §9);
            the client renders the locked-only state until a rules/storage contract is added.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardResponse.Quips">
            <summary>
            Server-computed inputs for the client-side "humorous fact" widget. The client owns the phrase templates;
            the server supplies only the numbers the client cannot derive from the rest of the payload.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.DashboardResponse.#ctor(TTAR.Types.ApiResponses.DashboardData)">
            <summary>
            Builds the response from the aggregated dashboard data.
            </summary>
            <param name="data">The dashboard data produced by the dashboard service.</param>
        </member>
        <member name="T:TTAR.API.Models.Responses.DashboardQuipsResponse">
            <summary>
            Server-computed inputs for the client-side humorous facts. Each field is nullable: null means the server has
            no data for that quip and the client skips it. Quips derivable on the client (period delta, streak,
            points-to-next-rank) are intentionally absent — the client already has those numbers.
            </summary>
            <param name="quips">The source quip inputs.</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.DashboardQuipsResponse.#ctor(TTAR.Types.ApiResponses.DashboardQuips)">
            <summary>
            Server-computed inputs for the client-side humorous facts. Each field is nullable: null means the server has
            no data for that quip and the client skips it. Quips derivable on the client (period delta, streak,
            points-to-next-rank) are intentionally absent — the client already has those numbers.
            </summary>
            <param name="quips">The source quip inputs.</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardQuipsResponse.MostActiveWeekday">
            <summary>
            The weekday the player plays most (last year), or null when there are no games. Feeds the
            "most games on {weekday}" quip.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.DashboardRatingResponse">
            <summary>
            Rating widget data.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRatingResponse.Current">
            <summary>
            Current rating for the hand.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRatingResponse.HandType">
            <summary>
            The hand the dashboard is built for.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRatingResponse.IsRated">
            <summary>
            Whether the hand has been rated (passed qualification).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRatingResponse.QualificationPoints">
            <summary>
            Current qualification points.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRatingResponse.QualificationTarget">
            <summary>
            Qualification points a hand needs to be qualified.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRatingResponse.Games">
            <summary>
            Total games for the hand.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRatingResponse.CurrentRank">
            <summary>
            Current rank and its starting rating threshold.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRatingResponse.NextRank">
            <summary>
            Next rank and its threshold, or null when at the top rank.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRatingResponse.Record">
            <summary>
            Peak rating reached (from the rating history).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRatingResponse.RecordDate">
            <summary>
            Date the record rating was reached, or null when no history.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.DashboardRatingResponse.#ctor(TTAR.Types.ApiResponses.DashboardData)">
            <summary>
            Builds the rating widget data from the aggregated dashboard data.
            </summary>
            <param name="data">The dashboard data.</param>
        </member>
        <member name="T:TTAR.API.Models.Responses.DashboardRankResponse">
            <summary>
            A rank plus its starting rating threshold.
            </summary>
            <param name="rank">The source rank data.</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.DashboardRankResponse.#ctor(TTAR.Types.ApiResponses.DashboardRank)">
            <summary>
            A rank plus its starting rating threshold.
            </summary>
            <param name="rank">The source rank data.</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRankResponse.Rank">
            <summary>
            The rank.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRankResponse.Rating">
            <summary>
            The lowest rating that maps to this rank.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.DashboardPeriodsResponse">
            <summary>
            Per-period rating stats.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardPeriodsResponse.Week">
            <summary>
            Last 7 days.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardPeriodsResponse.Month">
            <summary>
            Last 30 days.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardPeriodsResponse.Year">
            <summary>
            Last 365 days.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.DashboardPeriodsResponse.#ctor(System.Collections.Generic.IReadOnlyDictionary{TTAR.Types.ApiResponses.DashboardPeriodKind,TTAR.Types.ApiResponses.DashboardPeriod})">
            <summary>
            Builds the per-period stats from the aggregated period map.
            </summary>
            <param name="periods">The per-period aggregates keyed by period kind.</param>
        </member>
        <member name="T:TTAR.API.Models.Responses.DashboardPeriodResponse">
            <summary>
            Rating stats for one period.
            </summary>
            <param name="period">The source period aggregate.</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.DashboardPeriodResponse.#ctor(TTAR.Types.ApiResponses.DashboardPeriod)">
            <summary>
            Rating stats for one period.
            </summary>
            <param name="period">The source period aggregate.</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardPeriodResponse.Delta">
            <summary>
            Rating change over the period.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardPeriodResponse.Games">
            <summary>
            Games played within the period.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardPeriodResponse.Series">
            <summary>
            Rating series normalized to 0..1 for the sparkline.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.DashboardStatsResponse">
            <summary>
            All-time statistics and streaks.
            </summary>
            <param name="stats">The source statistics.</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.DashboardStatsResponse.#ctor(TTAR.Types.ApiResponses.DashboardStats)">
            <summary>
            All-time statistics and streaks.
            </summary>
            <param name="stats">The source statistics.</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardStatsResponse.Games">
            <summary>
            Total games for the hand.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardStatsResponse.Wins">
            <summary>
            All-time wins.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardStatsResponse.Losses">
            <summary>
            All-time losses.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardStatsResponse.Draws">
            <summary>
            All-time draws.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardStatsResponse.Winrate">
            <summary>
            All-time winrate, whole percent.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardStatsResponse.Streak">
            <summary>
            Current trailing win streak (last year).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardStatsResponse.BestStreak">
            <summary>
            Best win streak (last year).
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.DashboardHeadToHeadResponse">
            <summary>
            Favorite/nemesis head-to-head records; each side may be null when nobody qualifies.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardHeadToHeadResponse.Favorite">
            <summary>
            The most-beaten opponent, or null.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardHeadToHeadResponse.Nemesis">
            <summary>
            The worst matchup, or null.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.DashboardHeadToHeadResponse.#ctor(TTAR.Types.ApiResponses.DashboardHeadToHead,TTAR.Types.ApiResponses.DashboardHeadToHead)">
            <summary>
            Builds the head-to-head widget from the favorite and nemesis records.
            </summary>
            <param name="favorite">The most-beaten opponent, or null.</param>
            <param name="nemesis">The worst matchup, or null.</param>
        </member>
        <member name="T:TTAR.API.Models.Responses.DashboardH2HEntryResponse">
            <summary>
            A single head-to-head record against an opponent.
            </summary>
            <param name="h2h">The source head-to-head record.</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.DashboardH2HEntryResponse.#ctor(TTAR.Types.ApiResponses.DashboardHeadToHead)">
            <summary>
            A single head-to-head record against an opponent.
            </summary>
            <param name="h2h">The source head-to-head record.</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardH2HEntryResponse.Opponent">
            <summary>
            The opponent (name, avatar, player id).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardH2HEntryResponse.Wins">
            <summary>
            Wins against the opponent.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardH2HEntryResponse.Losses">
            <summary>
            Losses against the opponent.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.DashboardRecentGameResponse">
            <summary>
            A single recent game from the current player's point of view.
            </summary>
            <param name="game">The source recent game.</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.DashboardRecentGameResponse.#ctor(TTAR.Types.ApiResponses.DashboardRecentGame)">
            <summary>
            A single recent game from the current player's point of view.
            </summary>
            <param name="game">The source recent game.</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRecentGameResponse.Opponent">
            <summary>
            The opponent (name, avatar, player id).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRecentGameResponse.MyScore">
            <summary>
            The current player's score.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRecentGameResponse.OpponentScore">
            <summary>
            The opponent's score.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRecentGameResponse.Result">
            <summary>
            Outcome for the current player.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRecentGameResponse.MyDelta">
            <summary>
            The current player's rating change in this game.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardRecentGameResponse.Date">
            <summary>
            Confirmation date of the game.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.DashboardActivityResponse">
            <summary>
            Yearly activity heatmap.
            </summary>
            <param name="activity">The source activity data.</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.DashboardActivityResponse.#ctor(TTAR.Types.ApiResponses.DashboardActivity)">
            <summary>
            Yearly activity heatmap.
            </summary>
            <param name="activity">The source activity data.</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardActivityResponse.Days">
            <summary>
            364 daily buckets (52 weeks × 7 days), intensity level 0..4 each (heatmap colour).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardActivityResponse.DayGames">
            <summary>
            364 daily buckets aligned with <see cref="P:TTAR.API.Models.Responses.DashboardActivityResponse.Days"/>, each the actual (uncapped) number of games that day.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardActivityResponse.Total">
            <summary>
            Total games played over the year.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.DashboardActivityResponse.ActiveWeeks">
            <summary>
            Number of weeks with at least one game.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.EmailPreferencesResponse">
            <summary>The player's email switches by topic.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.EmailPreferencesResponse.Email">
            <summary>
            The address emails go to; <c>null</c> without one. Masked (<c>v***@gmail.com</c>) when read through the emailed
            link, which anyone the email reached may open; in full for the signed-in player.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.EmailPreferencesResponse.EmailVerified">
            <summary>Whether the address is confirmed: notification emails go only to a confirmed one.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.EmailPreferencesResponse.Topics">
            <summary>Every topic, in a stable order. A client ignores the topics it does not know.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.EmailPreferencesResponse.Mask(System.String)">
            <summary>The address with all of its local part but the first letter hidden.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.EmailTopicResponse">
            <summary>One topic's switch.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.EmailTopicResponse.Topic">
            <summary>The topic.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.EmailTopicResponse.Enabled">
            <summary>Whether its emails are sent; always <c>true</c> for a locked topic.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.EmailTopicResponse.Locked">
            <summary>
            The player may not turn it off: account emails they asked for, or the news of a tournament they joined (leaving
            the tournament is the way out).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.EmailTopicResponse.HasEmails">
            <summary>Whether any email belongs to the topic today; a switch without emails changes nothing yet.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.GameBatchEntityResponse">
            <summary>
            Represents the result of a game registration attempt
            </summary>
            <param name="TempGameId">Temporary identifier for the game, used for callbacks</param>
            <param name="Game">New game model if registration was successful; otherwise <c>null</c></param>
            <param name="Status">Game registration status</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.GameBatchEntityResponse.#ctor(System.Guid,TTAR.API.Models.Responses.GameResponse,TTAR.Types.GameRegistrationStatus)">
            <summary>
            Represents the result of a game registration attempt
            </summary>
            <param name="TempGameId">Temporary identifier for the game, used for callbacks</param>
            <param name="Game">New game model if registration was successful; otherwise <c>null</c></param>
            <param name="Status">Game registration status</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameBatchEntityResponse.TempGameId">
            <summary>Temporary identifier for the game, used for callbacks</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameBatchEntityResponse.Game">
            <summary>New game model if registration was successful; otherwise <c>null</c></summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameBatchEntityResponse.Status">
            <summary>Game registration status</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.GameBatchEntityResponse.#ctor(TTAR.Types.GameBatchEntity)">
            <summary>
            Initializes a new instance of the <see cref="T:TTAR.API.Models.Responses.GameBatchEntityResponse"/> record from a <see cref="T:TTAR.Types.GameBatchEntity"/>.
            </summary>
            <param name="entity">The <see cref="T:TTAR.Types.GameBatchEntity"/> to convert.</param>
        </member>
        <member name="T:TTAR.API.Models.Responses.GameForecastResponse">
            <summary>
            What the caller's rating would do after a game against the opponent if it were confirmed now (nothing is
            persisted). Computed by the same pipeline as a real confirmation: K-factor by games count, the "rule 400" and the
            qualification rules.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameForecastResponse.OpponentId">
            <summary>
            The opponent the forecast is made against.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameForecastResponse.PlayerHand">
            <summary>
            The caller's rating axis.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameForecastResponse.OpponentHand">
            <summary>
            The opponent's rating axis.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameForecastResponse.WinDelta">
            <summary>
            The caller's rating delta for the reference win <c>WinsDivider:0</c> (currently 2:0) — one full Elo step,
            <c>K·(1−E)</c>. Positive or 0.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameForecastResponse.LossDelta">
            <summary>
            The caller's rating delta for the reference loss <c>0:WinsDivider</c> (currently 0:2) — one full Elo step,
            <c>−K·E</c>. Negative or 0.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameForecastResponse.ScoreDelta">
            <summary>
            The caller's rating delta for the exact <c>score1:score2</c>, when both were passed; <c>null</c> otherwise.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameForecastResponse.IsQualifying">
            <summary>
            The qualification multiplier (<c>EloQualificationCoefficient</c>) would apply to this game: exactly one side is
            still qualifying and the multiplier was not applied to this pair of hands within <c>QualificationTimeout</c>.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.GameResponse">
            <summary>
            Game information
            </summary>
            <param name="game">DB Game model to convert</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.GameResponse.#ctor(TTAR.DataProviders.Models.GameModel)">
            <summary>
            Game information
            </summary>
            <param name="game">DB Game model to convert</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.Id">
            <summary>
            Game id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.Score1">
            <summary>
            Score of Player 1
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.Score2">
            <summary>
            Score of player 2
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.SubmitDate">
            <summary>
            Game submit date
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.ConfirmDate">
            <summary>
            Game confirm date
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.RatingDelta1">
            <summary>
            Player 1 rating modification in this game
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.RatingDelta2">
            <summary>
            Player 2 rating modification in this game
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.StartRatingPlayer1">
            <summary>
            Player 1 rating before the game
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.StartRatingPlayer2">
            <summary>
            Player 2 rating before the game
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.RatingNotApplied1">
            <summary>
            Player 1's side belongs to a tournament guest later merged into a player with a rating of their own: the game
            did not move that player's rating — show "без пересчёта" instead of the delta and keep it off the rating chart.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.RatingNotApplied2">
            <summary>Player 2's side, see <see cref="P:TTAR.API.Models.Responses.GameResponse.RatingNotApplied1"/>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.IsQualifying">
            <summary>
            Is the game qualified
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.IsQualifyingMultiplierApplied">
            <summary>
            Rating calculation rules
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.IsConfirmed1">
            <summary>
            Player 1 confirmation
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.IsConfirmed2">
            <summary>
            Player 1 confirmation
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.ExternalTournamentId">
            <summary>
            External (imported) tournament id, if the game was imported in scope of one.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.TournamentId">
            <summary>
            Native in-app tournament id, if the game belongs to one.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.DiscardedById">
            <summary>
            Who discarded the game
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.PlayerHand1Id">
            <summary>
            Player 1 id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.PlayerHand2Id">
            <summary>
            Player 2 id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.PlayerHand1">
            <summary>
            Player 1
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.PlayerHand2">
            <summary>
            Player 2
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.ConfirmDeadline">
            <summary>
            When the game stops waiting for confirmation (UTC); what happens then is <see cref="P:TTAR.API.Models.Responses.GameResponse.OnConfirmDeadline"/>.
            Filled only by <c>GET /games/unconfirmed</c>, null elsewhere.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GameResponse.OnConfirmDeadline">
            <summary>What happens at <see cref="P:TTAR.API.Models.Responses.GameResponse.ConfirmDeadline"/>: the confirmation expires, or the game counts by itself. Null with it.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.GamesPageResponse">
            <summary>
            Paged list of <seealso cref="T:TTAR.API.Models.Responses.GameResponse"/> collection
            </summary>
            <param name="Games">Collection of games</param>
            <param name="PageInfo">Page details</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.GamesPageResponse.#ctor(System.Collections.Generic.List{TTAR.API.Models.Responses.GameResponse},TTAR.Pagination.PageInfo)">
            <summary>
            Paged list of <seealso cref="T:TTAR.API.Models.Responses.GameResponse"/> collection
            </summary>
            <param name="Games">Collection of games</param>
            <param name="PageInfo">Page details</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.GamesPageResponse.Games">
            <summary>Collection of games</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GamesPageResponse.PageInfo">
            <summary>Page details</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.GeoChatMentionResponse">
            <summary>A mentioned player: the client renders <c>@Name</c> for the <c>@[playerId]</c> token of the text.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.GeoChatMentionResponse.#ctor(TTAR.DataProviders.Models.GeoChatMentionModel)">
            <summary>A mentioned player: the client renders <c>@Name</c> for the <c>@[playerId]</c> token of the text.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatMentionResponse.PlayerId">
            <summary>The mentioned player.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatMentionResponse.Name">
            <summary>Their current display name.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.GeoChatMentionResponse.OfTokens(System.String,System.Collections.Generic.IReadOnlyDictionary{System.Int32,TTAR.DataProviders.Models.PlayerModel})">
            <summary>Every token of the text whose player is known, in order of appearance (the moderators' view, blocks ignored).</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.GeoChatMessageResponse">
            <summary>
            A geo chat message as one reader sees it. The author's position is never exposed: only the rounded distance
            to the reader.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.GeoChatMessageResponse.#ctor(TTAR.DataProviders.Models.GeoChatMessageModel,TTAR.Messages.GeoChatView,System.Int32)">
            <summary>
            A geo chat message as one reader sees it. The author's position is never exposed: only the rounded distance
            to the reader.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatMessageResponse.Id">
            <summary>Message id (the paging cursor).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatMessageResponse.Sender">
            <summary>The author; an author who blocked the reader is shown without contacts (<c>hasBlockedMe</c>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatMessageResponse.Content">
            <summary>Text with <c>@[playerId]</c> mention tokens.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatMessageResponse.SentAt">
            <summary>When it was sent (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatMessageResponse.Mentions">
            <summary>The players the message reaches by mention; render the <c>@[id]</c> tokens from here.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatMessageResponse.DistanceKm">
            <summary>Distance from the author's position at send time to the reader, in km, a 0.5 km step (0.5 = "&lt; 1 km"); <c>null</c> for own messages or an unknown reader position.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatMessageResponse.IsMention">
            <summary>Whether the message mentions the reader.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatMessageResponse.IsOwn">
            <summary>Whether this is the reader's own message.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatMessageResponse.SeenByAny">
            <summary>Own messages only: whether at least one reader has seen it (the double tick); <c>null</c> for others' messages.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatMessageResponse.Moderation">
            <summary>The moderator's marks (open reports, hidden from the players, the author's ban); <c>null</c> for a player.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.GeoChatFeedResponse">
            <summary>A page of the reader's geo chat feed.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatFeedResponse.Messages">
            <summary>Oldest first, as the thread reads.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatFeedResponse.HasMore">
            <summary>Whether older messages exist: pass the first message's id as <c>before</c> to load them.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatFeedResponse.RadiusKm">
            <summary>The reader's radius; 0 = the chat is off (only own messages and mentions are listed); -1 = "all" (moderators only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatFeedResponse.LastReadMessageId">
            <summary>The reader's read marker: messages after it are "new" (the divider).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatFeedResponse.HasLocation">
            <summary>Whether the reader's position is known; without it nothing but own messages and mentions is listed.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatFeedResponse.ChatBan">
            <summary>The reader's ban in force (the banner replaces the composer); <c>null</c> without one.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.GeoChatFeedResponse.From(TTAR.Services.Abstractions.GeoChatFeedPage,System.Int32)">
            <summary>Maps a service page for the viewer.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.GeoChatSettingsResponse">
            <summary>The reader's geo chat settings and the marks of the "Geo chat" tab.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatSettingsResponse.RadiusKm">
            <summary>Radius in km; 0 = off; -1 = "all" (moderators only; a player who lost the role reads 1000).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatSettingsResponse.LastReadMessageId">
            <summary>The read marker.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatSettingsResponse.HasUnreadMention">
            <summary>A mention of the reader newer than the marker: the red "@" on the tab (and +1 on the envelope).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatSettingsResponse.HasNewMessages">
            <summary>A visible message newer than the marker: the dot on the tab.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatSettingsResponse.ChatBan">
            <summary>The reader's ban in force (the banner replaces the composer); <c>null</c> without one.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.GeoChatSettingsResponse.From(TTAR.Services.Abstractions.GeoChatStatus)">
            <summary>Maps the service status.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.GeoChatActivityResponse">
            <summary>The guest teaser: the chat's activity around a point over the last day, no content.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatActivityResponse.MessagesToday">
            <summary>Messages of the last 24 hours.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatActivityResponse.AuthorsToday">
            <summary>Distinct authors of those messages.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatActivityResponse.LastMessageAt">
            <summary>When the newest of them was sent (UTC), or <c>null</c>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatActivityResponse.RadiusKm">
            <summary>The radius the counts cover; <c>null</c> when no point was given (then the counts are global).</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.GeoChatActivityResponse.From(TTAR.Services.Abstractions.GeoChatActivity)">
            <summary>Maps the service result.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.BlockedPlayerResponse">
            <summary>A player the caller blocked.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.BlockedPlayerResponse.#ctor(TTAR.DataProviders.Models.PlayerBlockModel)">
            <summary>A player the caller blocked.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.BlockedPlayerResponse.Player">
            <summary>The blocked player (contacts hidden).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.BlockedPlayerResponse.BlockedAt">
            <summary>When the block was set (UTC).</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.ReportResponse">
            <summary>The filed report.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ReportResponse.Id">
            <summary>The report id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ReportResponse.Blocked">
            <summary>Whether the reported player is blocked by the caller now.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.JointGamesResponse">
            <summary>
            Amount of confirmed games played between a player and an opponent, broken down by the player's hands.
            Mirrors the "joint games" note shown in the Telegram player profile (history) view: for a given hand of the
            player, it counts games against all hands of the opponent.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.JointGamesResponse.OpponentId">
            <summary>
            The opponent the joint games are counted against.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.JointGamesResponse.Total">
            <summary>
            Total amount of joint games across all of the player's hands.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.JointGamesResponse.ViewerWins">
            <summary>
            Head-to-head wins of the viewer (the requesting <c>jointGamesWithPlayerId</c> player) against the viewed
            player. The left side of the "личные встречи" score X:Y. Draws count for neither side (see <see cref="P:TTAR.API.Models.Responses.JointGamesResponse.Draws"/>).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.JointGamesResponse.OpponentWins">
            <summary>
            Head-to-head wins of the viewed player (this profile's <c>playerId</c>). The right side of the score X:Y.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.JointGamesResponse.Draws">
            <summary>
            Joint games that ended in a draw (equal score). <see cref="P:TTAR.API.Models.Responses.JointGamesResponse.ViewerWins"/> + <see cref="P:TTAR.API.Models.Responses.JointGamesResponse.OpponentWins"/> +
            <see cref="P:TTAR.API.Models.Responses.JointGamesResponse.Draws"/> equals <see cref="P:TTAR.API.Models.Responses.JointGamesResponse.Total"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.JointGamesResponse.ByHand">
            <summary>
            Per-hand breakdown. Hands without joint games are included with a zero count.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.JointGamesResponse.Create(TTAR.DataProviders.Models.PlayerModel,System.Int32,System.Collections.Generic.IReadOnlyDictionary{System.Int32,System.Int32},TTAR.DataProviders.Models.HeadToHeadScore)">
            <summary>
            Builds the response for <paramref name="player"/> against <paramref name="opponentId"/>.
            </summary>
            <param name="player">The viewed player (this profile) whose hands are listed. Hands must be included.</param>
            <param name="opponentId">The viewer (requesting) player id the games are counted against.</param>
            <param name="countsByHandId">Map of player hand id to joint games count (e.g. from
            <seealso cref="M:TTAR.DataProviders.Abstractions.IGameRepository.GetGamesCountForBothByHandAsync(TTAR.DataProviders.Models.PlayerModel,TTAR.DataProviders.Models.PlayerModel,System.Threading.CancellationToken)"/>).</param>
            <param name="score">Head-to-head win split with <paramref name="player"/> as side 1 (from
            <seealso cref="M:TTAR.DataProviders.Abstractions.IGameRepository.GetHeadToHeadScoreAsync(TTAR.DataProviders.Models.PlayerModel,TTAR.DataProviders.Models.PlayerModel,System.Threading.CancellationToken)"/>). Player1Wins is
            the viewed player's wins (<see cref="P:TTAR.API.Models.Responses.JointGamesResponse.OpponentWins"/>); Player2Wins is the viewer's (<see cref="P:TTAR.API.Models.Responses.JointGamesResponse.ViewerWins"/>).</param>
            <returns>The populated joint games response.</returns>
        </member>
        <member name="T:TTAR.API.Models.Responses.JointGamesByHand">
            <summary>
            Joint games count for a single hand type.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.JointGamesByHand.HandType">
            <summary>
            Hand type (Main, Weak).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.JointGamesByHand.Count">
            <summary>
            Amount of confirmed games for this hand against the opponent (all opponent hands).
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.LoginExchangeResponse">
            <summary>
            Response of <c>POST /Account/login-exchange</c>: the one-time code the web client hands to
            <c>/connect/login-callback</c> to establish the OIDC IdP session.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.LoginExchangeResponse.Code">
            <summary>
            The opaque, single-use, short-lived login-exchange code.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.ChatBanResponse">
            <summary>A moderator's ban in force: where, why, until when.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.ChatBanResponse.#ctor(TTAR.Messages.PlayerBan)">
            <summary>A moderator's ban in force: where, why, until when.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ChatBanResponse.Scope">
            <summary><c>Chat</c>: no writing or mentioning in the geo chat; <c>All</c>: no sign-in at all.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ChatBanResponse.Reason">
            <summary>The reason the player is shown.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ChatBanResponse.Comment">
            <summary>The moderator's comment (always present for <c>Other</c>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ChatBanResponse.Until">
            <summary>The end (UTC); <c>null</c> = until lifted.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.GeoChatModerationResponse">
            <summary>The marks under a geo chat message a moderator sees (<c>null</c> for everyone else).</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.GeoChatModerationResponse.#ctor(TTAR.Messages.GeoChatModerationMark)">
            <summary>The marks under a geo chat message a moderator sees (<c>null</c> for everyone else).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatModerationResponse.OpenReports">
            <summary>Open reports on the message ("⚑ N reports · review").</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatModerationResponse.AutoHidden">
            <summary>Hidden from the players by its reports until a decision.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.GeoChatModerationResponse.AuthorBan">
            <summary>The author's ban in force, or <c>null</c>.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.ReportSnapshotResponse">
            <summary>A message as it was when the report was filed.</summary>
            <param name="mentioned">The players the card's tokens point at; <c>null</c> for a private message (no tokens there).</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.ReportSnapshotResponse.#ctor(TTAR.Messages.MessageSnapshot,System.Collections.Generic.IReadOnlyDictionary{System.Int32,TTAR.DataProviders.Models.PlayerModel})">
            <summary>A message as it was when the report was filed.</summary>
            <param name="mentioned">The players the card's tokens point at; <c>null</c> for a private message (no tokens there).</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.ReportSnapshotResponse.Mentions">
            <summary>The players the <c>@[id]</c> tokens of a geo chat quote name (blocks ignored); <c>null</c> for a private message.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.ReportDetailsResponse">
            <summary>One report as the queue shows it: the reporter, the reason, the evidence taken at filing time.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.ReportDetailsResponse.#ctor(TTAR.DataProviders.Models.PlayerReportModel,System.Collections.Generic.IReadOnlyDictionary{System.Int32,TTAR.DataProviders.Models.PlayerModel})">
            <summary>One report as the queue shows it: the reporter, the reason, the evidence taken at filing time.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ReportDetailsResponse.MessageId">
            <summary>The reported geo chat message (geo reports only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ReportDetailsResponse.MessageSnapshot">
            <summary>The quoted geo chat message as it was (geo reports only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ReportDetailsResponse.AttachedMessages">
            <summary>The last messages of the pair, oldest first (private reports only; the rest of the thread is never shown).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ReportDetailsResponse.AlsoBlocked">
            <summary>Whether the reporter blocked the player along with the report.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.ModerationChatMessageResponse">
            <summary>A reported geo chat message on the queue card.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.ModerationChatMessageResponse.#ctor(TTAR.DataProviders.Models.GeoChatMessageModel,System.Int32,System.Collections.Generic.IReadOnlyDictionary{System.Int32,TTAR.DataProviders.Models.PlayerModel})">
            <summary>A reported geo chat message on the queue card.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationChatMessageResponse.Mentions">
            <summary>The players the <c>@[id]</c> tokens of the text name, blocks ignored (unlike the feed's stored mentions).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationChatMessageResponse.IsDeleted">
            <summary>Deleted by a decision (shown with the "deleted" pill).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationChatMessageResponse.AutoHidden">
            <summary>Hidden from the players by its reports.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.ModerationDecisionResponse">
            <summary>A journal row: who decided what about whom, and whether it was undone.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.ModerationDecisionResponse.#ctor(TTAR.DataProviders.Models.ModerationDecisionModel,System.Int32)">
            <summary>A journal row: who decided what about whom, and whether it was undone.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationDecisionResponse.Until">
            <summary>A chat ban's end (UTC); <c>null</c> = until lifted.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationDecisionResponse.MessageId">
            <summary>The geo chat message the decision was opened from.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationDecisionResponse.ReportsCount">
            <summary>How many reports the decision closed.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationDecisionResponse.DeletedMessages">
            <summary>How many messages (geo chat and private) the decision deleted; kept as of the decision after a revert.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationDecisionResponse.RevertedAt">
            <summary>When the decision was undone; the row stays in the journal, muted.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.ModerationQueueItemResponse">
            <summary>One card of the "Reports" queue: a player and all open reports on them.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.ModerationQueueItemResponse.#ctor(TTAR.Services.Abstractions.ModerationQueueItem,System.DateTime,System.Int32)">
            <summary>One card of the "Reports" queue: a player and all open reports on them.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationQueueItemResponse.IsNewWithoutGames">
            <summary>Younger than a week with no game: the "new account without games" pill and the "ban from TTAR" default.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationQueueItemResponse.Reports">
            <summary>The open reports, oldest first.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationQueueItemResponse.Reasons">
            <summary>How many reports gave each reason (the reason's name is the key).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationQueueItemResponse.LastAt">
            <summary>When the newest report came (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationQueueItemResponse.ChatMessages">
            <summary>The reported geo chat messages, oldest first (one entry however many reports a message has).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationQueueItemResponse.History">
            <summary>The last decisions on the player that stand ("earlier: …"), newest first.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationQueueItemResponse.ActiveBan">
            <summary>The ban in force, or <c>null</c>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationQueueItemResponse.GeoMessagesCount">
            <summary>The player's geo chat messages a <c>purge: All</c> deletes now (not deleted yet).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationQueueItemResponse.PrivateMessagesCount">
            <summary>The private messages the player sent that a <c>purge: All</c> deletes now (not deleted yet).</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.PlayerBanResponse">
            <summary>A ban in force, as the "Bans" tab lists it.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.PlayerBanResponse.#ctor(TTAR.DataProviders.Models.PlayerBanModel)">
            <summary>A ban in force, as the "Bans" tab lists it.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerBanResponse.Until">
            <summary>The end (UTC); <c>null</c> = until lifted.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerBanResponse.DecisionId">
            <summary>The decision that set it (the journal row to revert).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerBanResponse.Source">
            <summary>Where that decision was made: the "Reports" page, the geo chat, or the bot's alert.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.ModerationSettingsResponse">
            <summary>A moderator's own settings, and the moderation constants the page explains.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.ModerationSettingsResponse.#ctor(TTAR.DataProviders.Models.ModeratorSettingsModel,System.Int32)">
            <summary>A moderator's own settings, and the moderation constants the page explains.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationSettingsResponse.TelegramNotify">
            <summary>New reports come to the moderator's Telegram, with the decision buttons.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.ModerationSettingsResponse.AutoHideReporters">
            <summary>Open reports from this many distinct players hide a geo chat message from the players until a decision (read-only).</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.NavBadgesResponse">
            <summary>
            Menu badge counts: how many items in each menu section wait for the caller's answer. Each number equals the
            rows marked inside that section; what the caller waits for themselves (their own game record, booking, draft)
            is never counted. Numbers are not capped — the client draws "99+".
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.NavBadgesResponse.Messages">
            <summary>
            Conversations with an unread incoming message (one per conversation, however many messages; senders the
            caller blocked are left out), plus 1 when the geo chat holds an unread mention of the caller (the red "@" of
            the "Geo chat" tab: one "row", however many mentions).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.NavBadgesResponse.MessagesNew">
            <summary>
            Whether the geo chat holds a message newer than the caller's read marker that their feed shows: another
            player's, within the caller's radius of their stored position (or mentioning them), by an author they did
            not block — the dot of the "Geo chat" tab, <c>GeoChatSettingsResponse.HasNewMessages</c>. The menu draws its
            dot from it only when <see cref="P:TTAR.API.Models.Responses.NavBadgesResponse.Messages"/> is 0. <c>false</c> with the chat off (radius 0) or without a
            stored position, mentions aside; messages older than the chat's in-memory window never set it.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.NavBadgesResponse.NewGames">
            <summary>
            Games waiting for the caller's side to confirm, not discarded and not expired — the "waiting for you" rows
            of <c>GET /Games/unconfirmed</c>. A ladder's records are no games until its pairs are registered: they count
            in <see cref="P:TTAR.API.Models.Responses.NavBadgesResponse.Tournaments"/> only.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.NavBadgesResponse.Tournaments">
            <summary>
            Tournaments waiting for the caller, one per tournament: participation to confirm
            (<c>TournamentListItem.MyParticipationUnconfirmed</c>), a ladder game to confirm, or a match called to a table.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.NavBadgesResponse.Clubs">
            <summary>
            Requests to the venues the caller owns or represents: other players' booking requests awaiting the venue's
            decision (the Requested rows of <c>GET /venues/{venueId}/venue-bookings</c> not booked by the caller), plus
            representative requests (owner only). <c>null</c> when the caller runs no venue; <c>0</c> when they do but
            nothing waits.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.NavBadgesResponse.Admin">
            <summary>
            The venue-claim moderation queue (<c>GET /venue-claims?status=Pending</c>). <c>null</c> without the
            VenueModerator or Admin role; <c>0</c> with it and an empty queue.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.NavBadgesResponse.Reports">
            <summary>
            The "Reports" moderation queue (<c>GET /Moderation/reports</c>): players with open reports, not reports.
            <c>null</c> without the ChatModerator or Admin role; <c>0</c> with it and an empty queue.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.NavBadgesResponse.From(TTAR.DataProviders.NavBadges,System.Boolean)">
            <summary>Maps the counts and the geo chat's "new" mark to the response.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.OtherRatingResponse">
            <summary>A link to the player's profile in another rating system (display-only).</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.OtherRatingResponse.#ctor(TTAR.DataProviders.Models.PlayerOtherRatingModel)">
            <summary>A link to the player's profile in another rating system (display-only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.OtherRatingResponse.System">
            <summary>The rating system.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.OtherRatingResponse.Name">
            <summary>System name typed by the player; set only for <see cref="F:TTAR.Types.OtherRatingSystem.Other"/>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.OtherRatingResponse.Url">
            <summary>Profile link (always with a scheme).</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.PlayerPhotoResponse">
            <summary>The photo the player uploaded: its full size and the avatar centre the preview is cut around.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.PlayerPhotoResponse.#ctor(System.Int32,System.Int32,TTAR.Services.PhotoFocus)">
            <summary>The photo the player uploaded: its full size and the avatar centre the preview is cut around.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerPhotoResponse.Width">
            <summary>Width of the full photo (<c>{avatarPath}/full</c>), up to 640 px.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerPhotoResponse.Height">
            <summary>Height of the full photo, up to 640 px.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerPhotoResponse.FocusX">
            <summary>The avatar centre in fractions (0…1) of the photo width; 0.5 when never chosen.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerPhotoResponse.FocusY">
            <summary>The avatar centre in fractions (0…1) of the photo height; 0.5 when never chosen.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.PlayerProfileResponse">
            <summary>
            Player profile info. Should be available only for profile owner or admins!
            </summary>
            <param name="player">The player to expose.</param>
            <param name="includeConfirmationCode">
            When <c>true</c>, exposes the RTTF confirmation code. Callers MUST set this only on self-scoped
            responses (the owner requesting their own profile) — the code is a secret and must never leak to others.
            </param>
            <param name="roles">
            The privileged roles this player holds (empty for an ordinary user). Computed by the caller, as role
            membership is not a property of <see cref="T:TTAR.DataProviders.Models.PlayerModel"/>.
            </param>
            <param name="otherRatings">
            The player's other-rating links, or <c>null</c> when the endpoint did not load them. <see cref="P:TTAR.API.Models.Responses.PlayerProfileResponse.OtherRatings"/> then
            stays <c>null</c> ("not loaded"), so a client never mistakes an unloaded list for an empty one and wipes it on save.
            </param>
        </member>
        <member name="M:TTAR.API.Models.Responses.PlayerProfileResponse.#ctor(TTAR.DataProviders.Models.PlayerModel,System.Boolean,System.Collections.Generic.IEnumerable{TTAR.Types.Role},System.Collections.Generic.IEnumerable{TTAR.DataProviders.Models.PlayerOtherRatingModel})">
            <summary>
            Player profile info. Should be available only for profile owner or admins!
            </summary>
            <param name="player">The player to expose.</param>
            <param name="includeConfirmationCode">
            When <c>true</c>, exposes the RTTF confirmation code. Callers MUST set this only on self-scoped
            responses (the owner requesting their own profile) — the code is a secret and must never leak to others.
            </param>
            <param name="roles">
            The privileged roles this player holds (empty for an ordinary user). Computed by the caller, as role
            membership is not a property of <see cref="T:TTAR.DataProviders.Models.PlayerModel"/>.
            </param>
            <param name="otherRatings">
            The player's other-rating links, or <c>null</c> when the endpoint did not load them. <see cref="P:TTAR.API.Models.Responses.PlayerProfileResponse.OtherRatings"/> then
            stays <c>null</c> ("not loaded"), so a client never mistakes an unloaded list for an empty one and wipes it on save.
            </param>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.Id">
            <summary>
            Id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.Name">
            <summary>
            Displayed name
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.ChatBan">
            <summary>
            Own profile only: the moderator's ban in force (the banner replaces the geo chat composer); <c>null</c>
            without one. Set by the caller from the bans store.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.Roles">
            <summary>
            Privileged roles the player holds. Empty for an ordinary user; may contain several at once (a client can
            be both a chat moderator and a tournament supervisor). Serialized as member names ("Admin", …) by the
            global JsonStringEnumConverter — a per-property enum [JsonConverter] is rejected on a collection type.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.TelegramUserId">
            <summary>
            Telegram user id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.TelegramUsername">
            <summary>
            Telegram username
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.TelegramName">
            <summary>
            Telegram display name
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.Email">
            <summary>
            Email
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.IsEmailVerified">
            <summary>
            Whether the <see cref="P:TTAR.API.Models.Responses.PlayerProfileResponse.Email"/> has been confirmed. Accounts created via Google SSO are confirmed automatically.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.PendingEmail">
            <summary>
            A new email address awaiting confirmation (change-email flow). <c>null</c> when no change is pending.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.IsPasswordSet">
            <summary>
            Whether the account has a password credential set. <c>false</c> for accounts created via Google SSO or
            Telegram that have never set a password — the UI can show "Set password" instead of "Change password"
            and skip asking for the current password.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.ShouldCopyPmToTelegram">
            <summary>
            Indicates whether private messages should be copied to Telegram
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.MainHand">
            <summary>
            The player's physical main hand (Left/Right). A profile label only — it does not move ratings between
            axes. <c>null</c> means never set (treated as Right, soft "please confirm" prompt) or a tournament guest
            (no profile hand) — matching the sibling player DTOs.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.Gender">
            <summary>Declared gender, <c>null</c> = not specified. Once set it is read-only (409 <c>GenderAlreadySet</c>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.ContactPhone">
            <summary>
            Contact phone (owner only). Pre-filled once from the Telegram-verified phone; the client also offers it as the
            default phone at tournament registration.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.ShowPhoneToOrganizers">
            <summary>Whether <see cref="P:TTAR.API.Models.Responses.PlayerProfileResponse.ContactPhone"/> is passed to managers of tournaments the player registers for.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.ShowPhoneToPlayers">
            <summary>Whether <see cref="P:TTAR.API.Models.Responses.PlayerProfileResponse.ContactPhone"/> is shown to other authenticated players on the player card.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.LiveCountryCode">
            <summary>Country of residence, ISO 3166-1 alpha-2.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.LiveCity">
            <summary>City of residence.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.ShowLivePlace">
            <summary>Whether the residence country/city are shown to everyone.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.BirthCountryCode">
            <summary>Country of birth, ISO 3166-1 alpha-2.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.BirthCity">
            <summary>City of birth.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.ShowBirthPlace">
            <summary>Whether the birth country/city are shown to everyone.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.BirthYear">
            <summary>Declared birth year.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.ShowBirthYear">
            <summary>Whether the birth year is shown to everyone.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.ShowTelegram">
            <summary>Whether the Telegram username is shown to other authenticated players.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.ShowRttf">
            <summary>Whether the RTTF link is shown to everyone on the player card.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.ShowOtherRatings">
            <summary>Whether <see cref="P:TTAR.API.Models.Responses.PlayerProfileResponse.OtherRatings"/> are shown to everyone.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.OtherRatings">
            <summary>
            Links to the player's profiles in other rating systems, in display order. <c>null</c> means "not loaded by this
            endpoint" (e.g. the login payload) — fetch <c>GET /Players/profile</c> before editing them.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.RttfUserId">
            <summary>
            RTTF user id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.RttfUsername">
            <summary>
            RTTF username
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.UseRttfName">
            <summary>
            Whether the displayed name follows the linked RTTF profile (vs. the account name). Only takes effect
            once <see cref="P:TTAR.API.Models.Responses.PlayerProfileResponse.IsRttfProfileConfirmed"/> is true — see <c>GetDisplayName</c>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.IsRttfProfileConfirmed">
            <summary>
            RTTF profile confirmation
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.RttfCity">
            <summary>
            City cached from the RTTF profile, or <c>null</c>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.RttfBornYear">
            <summary>
            Birth year cached from the RTTF profile, or <c>null</c>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.RttfLinkedByPlayerId">
            <summary>
            Player who created the still-unconfirmed RTTF link (history once the link is confirmed).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.RttfConfirmationCode">
            <summary>
            Secret code the owner posts on rttf.ru to confirm the link. Present ONLY on the owner's own profile
            response (never for other viewers) — see the <c>includeConfirmationCode</c> constructor flag.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.Location">
            <summary>
            Latest location (longitude and latitude)
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.Version">
            <summary>
            Latest mobile application version
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.TelegramLanguageCode">
            <summary>
            Language code provided by Telegram
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.PreferredLanguageCode">
            <summary>
            User-defined language override. Null means not set (Telegram language is used).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.Chats">
            <summary>
            List of chats with user's activity
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.Hands">
            <summary>
            Player's rating
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.Images">
            <summary>
            Related images: the avatar shown (the uploaded photo, else the provider avatar), at most one
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.HasPhoto">
            <summary>
            Whether the avatar is a photo the player uploaded (it can be removed), not one synced from Telegram/Google
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerProfileResponse.Photo">
            <summary>
            The size and avatar centre of the photo the player uploaded. <c>null</c> without a photo, and for a photo
            stored before its size was kept (only before the photo focus came out). The full photo is <c>{avatarPath}/full</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.PlayerProfileResponse.ForRttfLinker(TTAR.DataProviders.Models.PlayerModel)">
            <summary>
            The profile as a non-owner who may manage the player's RTTF link (an organizer, the link's creator) gets it:
            only the identity, hand, images and RTTF link id/name/state — no contacts, login data, places, birth year (the
            roster shows the RTTF city/born under its own minor rule), settings or roles. The Roles invariant
            (Docs/Auth/roles.md) does not apply: roles are deliberately withheld here.
            </summary>
            <param name="player">The target player (hands and images loaded).</param>
        </member>
        <member name="T:TTAR.API.Models.Responses.PlayerResponse">
            <summary>
            Player profile info
            </summary>
            <param name="player">The player to expose.</param>
            <param name="includeRttf">
            When <c>true</c>, exposes the RTTF block (id, name, confirmed, and — if <paramref name="includeRttfPii"/> —
            city/born). Only the detailed player card sets this; search/top rows and messages must NOT show RTTF data.
            </param>
            <param name="includeRttfPii">
            When <c>true</c>, additionally exposes the RTTF id, name, city and birth year (PII). Callers MUST pass
            <c>true</c> only when the viewer is the profile owner or an admin — the card is public, so an arbitrary
            (even authenticated) viewer must not see another player's PII. The id alone is also exposed when the player
            opted in (<see cref="P:TTAR.DataProviders.Models.PlayerModel.ShowRttf"/>).
            </param>
            <param name="currentYear">
            Current UTC year from the injected <see cref="T:System.TimeProvider"/>, used to decide whether a minor's birth
            year must be hidden (§7). Null skips the check for the RTTF year, and hides the declared year from others.
            </param>
            <param name="isSelfOrAdmin">
            When <c>true</c>, the caller is the player themselves or an admin: every profile field is exposed regardless of
            the player's visibility flags, and a minor's birth year stays visible.
            </param>
            <param name="isAuthenticatedViewer">
            Whether the request is authenticated. The Telegram username and the contact phone are never exposed to an anonymous
            viewer, and to an authenticated one only when the player allows it (<see cref="P:TTAR.DataProviders.Models.PlayerModel.ShowTelegram"/>,
            <see cref="P:TTAR.DataProviders.Models.PlayerModel.ShowPhoneToPlayers"/>).
            </param>
            <param name="includeProfileFacts">
            When <c>true</c>, exposes the "about" facts (places, birth year, gender, other ratings, contact phone) the player
            made public. Only the detailed player card sets this.
            </param>
            <param name="rttfRating">
            The player's rating on the RTTF scale (converted back from the TTAR main-hand rating), exposed together with
            <see cref="P:TTAR.API.Models.Responses.PlayerResponse.RttfUserId"/> only.
            </param>
            <param name="otherRatings">The player's other-rating links (card only); ignored unless they are public or the viewer is self/admin.</param>
            <param name="isBlockedByMe">Whether the viewer blocked this player. Either block flag hides the contacts (Telegram, phone).</param>
            <param name="hasBlockedMe">Whether this player blocked the viewer.</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.PlayerResponse.#ctor(TTAR.DataProviders.Models.PlayerModel,System.Boolean,System.Boolean,System.Nullable{System.Int32},System.Boolean,System.Boolean,System.Boolean,System.Nullable{System.Int32},System.Collections.Generic.IEnumerable{TTAR.DataProviders.Models.PlayerOtherRatingModel},System.Boolean,System.Boolean)">
            <summary>
            Player profile info
            </summary>
            <param name="player">The player to expose.</param>
            <param name="includeRttf">
            When <c>true</c>, exposes the RTTF block (id, name, confirmed, and — if <paramref name="includeRttfPii"/> —
            city/born). Only the detailed player card sets this; search/top rows and messages must NOT show RTTF data.
            </param>
            <param name="includeRttfPii">
            When <c>true</c>, additionally exposes the RTTF id, name, city and birth year (PII). Callers MUST pass
            <c>true</c> only when the viewer is the profile owner or an admin — the card is public, so an arbitrary
            (even authenticated) viewer must not see another player's PII. The id alone is also exposed when the player
            opted in (<see cref="P:TTAR.DataProviders.Models.PlayerModel.ShowRttf"/>).
            </param>
            <param name="currentYear">
            Current UTC year from the injected <see cref="T:System.TimeProvider"/>, used to decide whether a minor's birth
            year must be hidden (§7). Null skips the check for the RTTF year, and hides the declared year from others.
            </param>
            <param name="isSelfOrAdmin">
            When <c>true</c>, the caller is the player themselves or an admin: every profile field is exposed regardless of
            the player's visibility flags, and a minor's birth year stays visible.
            </param>
            <param name="isAuthenticatedViewer">
            Whether the request is authenticated. The Telegram username and the contact phone are never exposed to an anonymous
            viewer, and to an authenticated one only when the player allows it (<see cref="P:TTAR.DataProviders.Models.PlayerModel.ShowTelegram"/>,
            <see cref="P:TTAR.DataProviders.Models.PlayerModel.ShowPhoneToPlayers"/>).
            </param>
            <param name="includeProfileFacts">
            When <c>true</c>, exposes the "about" facts (places, birth year, gender, other ratings, contact phone) the player
            made public. Only the detailed player card sets this.
            </param>
            <param name="rttfRating">
            The player's rating on the RTTF scale (converted back from the TTAR main-hand rating), exposed together with
            <see cref="P:TTAR.API.Models.Responses.PlayerResponse.RttfUserId"/> only.
            </param>
            <param name="otherRatings">The player's other-rating links (card only); ignored unless they are public or the viewer is self/admin.</param>
            <param name="isBlockedByMe">Whether the viewer blocked this player. Either block flag hides the contacts (Telegram, phone).</param>
            <param name="hasBlockedMe">Whether this player blocked the viewer.</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.Id">
            <summary>
            Id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.Name">
            <summary>
            Displayed name
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.IsTelegramUser">
            <summary>
            Indicates whether the player is a Telegram user
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.TelegramUsername">
            <summary>
            Username in Telegram. <c>null</c> for an anonymous viewer, and for others unless the player shows it.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.IsPMAllowed">
            <summary>
            Indicates whether the player allows private messages in Telegram
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.LastTokenDate">
            <summary>
            The date and time of the player's last token activity
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.AvatarPath">
            <summary>
            Avatar URL
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.Hands">
            <summary>
            Set of a player hand ratings (e.g. rating for Main hand, or for Weak hand)
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.MainHand">
            <summary>
            The player's physical main hand (Left/Right). Only a profile label — the client derives the "left hand"
            badge from it plus the rating axis. <c>null</c> when never set (treated as Right) or for a tournament
            guest (no profile, no hand).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.HasRttfLink">
            <summary>
            Whether the player has a linked RTTF profile (RTTF block only). The bare fact is safe for any viewer;
            the concrete <see cref="P:TTAR.API.Models.Responses.PlayerResponse.RttfUserId"/> is gated to the owner / admins unless the player made it public, and
            the rest of the RTTF PII always is.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.RttfUserId">
            <summary>RTTF profile id (a link to the external profile); owner / admins, or everyone when the player shows it.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.RttfRating">
            <summary>
            Rating on the RTTF scale, converted back from the TTAR main-hand rating (rttf.ru is not polled). Exposed only
            alongside <see cref="P:TTAR.API.Models.Responses.PlayerResponse.RttfUserId"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.RttfUsername">
            <summary>
            RTTF display name (full "Фамилия Имя Отчество") — PII, owner / admins only. The visible name a viewer
            needs is already in <see cref="P:TTAR.API.Models.Responses.PlayerResponse.Name"/> (GetDisplayName picks the RTTF name when the player opted in),
            so gating this raw field does not affect what an ordinary viewer sees.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.IsRttfProfileConfirmed">
            <summary>Whether the RTTF link was confirmed by the player (vs. created by an organizer).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.RttfCity">
            <summary>City cached from the RTTF profile (RTTF block, PII, owner / admins only), or <c>null</c>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.RttfBornYear">
            <summary>
            Birth year cached from the RTTF profile (RTTF block, PII, owner / admins only), or <c>null</c>.
            (The minor check in <see cref="T:TTAR.API.Models.RttfPrivacy"/> (§7) is now subsumed by that gate but kept for defence.)
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.LiveCountryCode">
            <summary>Country of residence (ISO 3166-1 alpha-2), if the player shows the residence place (card only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.LiveCity">
            <summary>City of residence, if the player shows the residence place (card only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.BirthCountryCode">
            <summary>Country of birth (ISO 3166-1 alpha-2), if the player shows the birth place (card only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.BirthCity">
            <summary>City of birth, if the player shows the birth place (card only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.BirthYear">
            <summary>
            Declared birth year, if the player shows it (card only). A minor's year is hidden from others even then (§7);
            without a known current year it is hidden from others too.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.ContactPhone">
            <summary>
            Contact phone (card only): for the owner / admins, and for an authenticated viewer when the player shows it to
            players and is not a minor. <c>null</c> for an anonymous viewer.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.IsBlockedByMe">
            <summary>Whether the viewer blocked this player (then the viewer does not write to them and sees no contacts).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.HasBlockedMe">
            <summary>Whether this player blocked the viewer: the viewer's messages and mentions do not reach them.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.Gender">
            <summary>Declared gender, if specified (card only). Public by design: "not specified" is how a player hides it.</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.OtherRatings">
            <summary>Links to the player's profiles in other rating systems, if the player shows them (card only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PlayerResponse.JointGames">
            <summary>
            Amount of games played between this player and an opponent, broken down by hand.
            Populated only when an opponent is known (the authenticated caller, or an explicitly requested opponent);
            <c>null</c> otherwise.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.PlayerResponse.GetAvatarPath(System.Collections.Generic.IList{TTAR.DataProviders.Models.ImageModel})">
            <summary>
            Extracts avatar image: the uploaded photo, else the provider avatar
            </summary>
            <param name="images">List of player's images</param>
            <returns>Avatar URL or <c>null</c></returns>
        </member>
        <member name="T:TTAR.API.Models.Responses.PrivateMessageResponse">
            <summary>
            Private message
            </summary>
            <param name="message">The message.</param>
            <param name="blocks">The viewer's block relations, for the sender's block flags; <c>null</c> = none.</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.PrivateMessageResponse.#ctor(TTAR.DataProviders.Models.PrivateMessagesModel,TTAR.Messages.BlockRelations)">
            <summary>
            Private message
            </summary>
            <param name="message">The message.</param>
            <param name="blocks">The viewer's block relations, for the sender's block flags; <c>null</c> = none.</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.PrivateMessageResponse.Id">
            <summary>
            Private message id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PrivateMessageResponse.SenderId">
            <summary>
            Sender id
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PrivateMessageResponse.Sender">
            <summary>
            Sender's profile info
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PrivateMessageResponse.Content">
            <summary>
            The message content; empty for a message a moderator deleted (<see cref="P:TTAR.API.Models.Responses.PrivateMessageResponse.IsDeleted"/>).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PrivateMessageResponse.IsDeleted">
            <summary>
            Deleted by a moderator: the thread and the conversation preview show "Message deleted by a moderator".
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PrivateMessageResponse.SentAt">
            <summary>
            The message's sent date
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PrivateMessageResponse.IsRead">
            <summary>
            Indicates whether the message was read by recipient
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PrivateMessageResponse.IsLastMessage">
            <summary>
            Latest message in the list
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.PrivateMesssagesPageResponse">
            <summary>
            Represents a paginated response containing private messages, pagination details, and participant information
            </summary>
            <param name="Messages">The collection of private messages included in the current page</param>
            <param name="PageInfo">The pagination details for the current page, including total pages and current page number</param>
            <param name="Participant">The participant associated with the private messages in this response</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.PrivateMesssagesPageResponse.#ctor(System.Collections.Generic.List{TTAR.API.Models.Responses.PrivateMessageResponse},TTAR.Pagination.PageInfo,TTAR.API.Models.Responses.PlayerResponse)">
            <summary>
            Represents a paginated response containing private messages, pagination details, and participant information
            </summary>
            <param name="Messages">The collection of private messages included in the current page</param>
            <param name="PageInfo">The pagination details for the current page, including total pages and current page number</param>
            <param name="Participant">The participant associated with the private messages in this response</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.PrivateMesssagesPageResponse.Messages">
            <summary>The collection of private messages included in the current page</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PrivateMesssagesPageResponse.PageInfo">
            <summary>The pagination details for the current page, including total pages and current page number</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.PrivateMesssagesPageResponse.Participant">
            <summary>The participant associated with the private messages in this response</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.RatingHistoryResponse">
            <summary>
            Represents a response containing the rating history
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.RatingHistoryResponse.RatingHistory">
            <summary>
            Gets or sets the list of rating points representing the rating history
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.SearchPlayerPageResponse">
            <summary>
            Paged list of <seealso cref="T:TTAR.API.Models.Responses.SearchPlayerResponse"/> collection
            </summary>
            <param name="Players">Collection of players</param>
            <param name="PageInfo">Page details</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.SearchPlayerPageResponse.#ctor(System.Collections.Generic.IEnumerable{TTAR.API.Models.Responses.SearchPlayerResponse},TTAR.Pagination.PageInfo)">
            <summary>
            Paged list of <seealso cref="T:TTAR.API.Models.Responses.SearchPlayerResponse"/> collection
            </summary>
            <param name="Players">Collection of players</param>
            <param name="PageInfo">Page details</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.SearchPlayerPageResponse.Players">
            <summary>Collection of players</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.SearchPlayerPageResponse.PageInfo">
            <summary>Page details</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.SearchPlayerResponse">
            <summary>
            Search player results
            </summary>
            <param name="searchPlayerResults">The search hit.</param>
            <param name="noConfirm">Why the caller's confirmation request would not reach this player, if it would not.</param>
            <param name="isAuthenticatedViewer">Whether the search is authenticated (gates the Telegram username).</param>
            <param name="blocks">The caller's block relations, for the block flags (contacts hidden across a block); <c>null</c> = none.</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.SearchPlayerResponse.#ctor(TTAR.Types.SearchPlayerResults,System.Nullable{TTAR.Types.NoConfirmReason},System.Boolean,TTAR.Messages.BlockRelations)">
            <summary>
            Search player results
            </summary>
            <param name="searchPlayerResults">The search hit.</param>
            <param name="noConfirm">Why the caller's confirmation request would not reach this player, if it would not.</param>
            <param name="isAuthenticatedViewer">Whether the search is authenticated (gates the Telegram username).</param>
            <param name="blocks">The caller's block relations, for the block flags (contacts hidden across a block); <c>null</c> = none.</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.SearchPlayerResponse.Player">
            <summary>
            Player profile info
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.SearchPlayerResponse.Distance">
            <summary>
            Distance to the player
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.SearchPlayerResponse.NoConfirm">
            <summary>
            Why the caller's game confirmation request would not reach this player; <c>null</c> when it would (or when the
            request is anonymous — there is no caller to be relative to).
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.SearchTelegramChatPageResponse">
            <summary>
            Paged list of <seealso cref="T:TTAR.Types.ApiResponses.TopChats"/> collection
            </summary>
            <param name="Chats">Collection of chats</param>
            <param name="PageInfo">Page details</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.SearchTelegramChatPageResponse.#ctor(System.Collections.Generic.IEnumerable{TTAR.Types.ApiResponses.TopChats},TTAR.Pagination.PageInfo)">
            <summary>
            Paged list of <seealso cref="T:TTAR.Types.ApiResponses.TopChats"/> collection
            </summary>
            <param name="Chats">Collection of chats</param>
            <param name="PageInfo">Page details</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.SearchTelegramChatPageResponse.Chats">
            <summary>Collection of chats</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.SearchTelegramChatPageResponse.PageInfo">
            <summary>Page details</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.SitemapResponse">
            <summary>
            The public pages of the web app worth indexing besides its static sections. The site builds the addresses
            (<c>/tt/tournaments/{id}</c>, <c>/tt/venues/{id}</c>) and their language versions itself.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.SitemapResponse.Tournaments">
            <summary>
            Tournaments in registration, running or finished, invite-only ones included, ascending by id. Not listed:
            drafts (unpublished) and cancelled ones (dead pages).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.SitemapResponse.Venues">
            <summary>Every venue (club), ascending by id.</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.SitemapResponse.From(TTAR.DataProviders.Sitemap)">
            <summary>Maps the sitemap to the response.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.SitemapItem">
            <summary>
            A page of the sitemap. An object rather than a bare id, so that a field (e.g. the last change) can be added without
            breaking the client.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.SitemapItem.Id">
            <summary>Id of the tournament or venue.</summary>
        </member>
        <member name="T:TTAR.API.Models.Responses.TopDeltaPageResponse">
            <summary>
            Represents top players
            </summary>
            <param name="Top">A collection of players with their ratings and deltas, ordered by rating and amount of games</param>
            <param name="PlayerPositions">Available top positions of target player</param>
            <param name="PageInfo">Current page with actual <seealso cref="P:TTAR.Pagination.PageInfo.TotalItems"/> information</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.TopDeltaPageResponse.#ctor(System.Collections.Generic.IEnumerable{TTAR.API.Models.Responses.TopPosition},System.Collections.Generic.IEnumerable{System.Int32},TTAR.Pagination.PageInfo)">
            <summary>
            Represents top players
            </summary>
            <param name="Top">A collection of players with their ratings and deltas, ordered by rating and amount of games</param>
            <param name="PlayerPositions">Available top positions of target player</param>
            <param name="PageInfo">Current page with actual <seealso cref="P:TTAR.Pagination.PageInfo.TotalItems"/> information</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.TopDeltaPageResponse.Top">
            <summary>A collection of players with their ratings and deltas, ordered by rating and amount of games</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.TopDeltaPageResponse.PlayerPositions">
            <summary>Available top positions of target player</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.TopDeltaPageResponse.PageInfo">
            <summary>Current page with actual <seealso cref="P:TTAR.Pagination.PageInfo.TotalItems"/> information</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.TopDeltaPageResponse.#ctor(TTAR.Types.TopFull)">
            <summary>
            Initializes a new instance of the <see cref="T:TTAR.API.Models.Responses.TopPageResponse"/> class using the specified top-level data
            </summary>
            <param name="top">The top-level data containing player positions, page information, and hand details</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.TopDeltaPageResponse.#ctor(TTAR.Types.TopActive)">
            <summary>
            Initializes a new instance of the <see cref="T:TTAR.API.Models.Responses.TopPageResponse"/> class using the specified top active data
            </summary>
            <param name="top">The top active data containing player information and ratings</param>
        </member>
        <member name="T:TTAR.API.Models.Responses.TopPageResponse">
            <summary>
            Represents top players
            </summary>
            <param name="Top">A collection of players with their ratings, ordered by rating and amount of games</param>
            <param name="PlayerPositions">Available top positions of target player</param>
            <param name="PageInfo">Current page with actual <seealso cref="P:TTAR.Pagination.PageInfo.TotalItems"/> information</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.TopPageResponse.#ctor(System.Collections.Generic.Dictionary{System.Int32,TTAR.API.Models.Hand},System.Collections.Generic.IEnumerable{System.Int32},TTAR.Pagination.PageInfo)">
            <summary>
            Represents top players
            </summary>
            <param name="Top">A collection of players with their ratings, ordered by rating and amount of games</param>
            <param name="PlayerPositions">Available top positions of target player</param>
            <param name="PageInfo">Current page with actual <seealso cref="P:TTAR.Pagination.PageInfo.TotalItems"/> information</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.TopPageResponse.Top">
            <summary>A collection of players with their ratings, ordered by rating and amount of games</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.TopPageResponse.PlayerPositions">
            <summary>Available top positions of target player</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.TopPageResponse.PageInfo">
            <summary>Current page with actual <seealso cref="P:TTAR.Pagination.PageInfo.TotalItems"/> information</summary>
        </member>
        <member name="M:TTAR.API.Models.Responses.TopPageResponse.#ctor(TTAR.Types.TopFull)">
            <summary>
            Initializes a new instance of the <see cref="T:TTAR.API.Models.Responses.TopPageResponse"/> class using the specified top-level data
            </summary>
            <param name="top">The top-level data containing player positions, page information, and hand details</param>
        </member>
        <member name="T:TTAR.API.Models.Responses.TopPosition">
            <summary>
            Represents the top position in a ranking, including the position number, associated hand,
            optional rating delta and optional games played for desired period of time
            </summary>
            <param name="Position">The position number in the ranking, where a lower number indicates a higher rank</param>
            <param name="Hand">The player's hand associated with this position</param>
            <param name="RatingDelta">The change in rating associated with this position, or <see langword="null"/> if no change is applicable</param>
            <param name="GamesInPeriod">The number of games played within the selected period (chat-scoped when filtered), or <see langword="null"/> for the all-time top where no period applies</param>
        </member>
        <member name="M:TTAR.API.Models.Responses.TopPosition.#ctor(System.Int32,TTAR.API.Models.Hand,System.Nullable{System.Int32},System.Nullable{System.Int32})">
            <summary>
            Represents the top position in a ranking, including the position number, associated hand,
            optional rating delta and optional games played for desired period of time
            </summary>
            <param name="Position">The position number in the ranking, where a lower number indicates a higher rank</param>
            <param name="Hand">The player's hand associated with this position</param>
            <param name="RatingDelta">The change in rating associated with this position, or <see langword="null"/> if no change is applicable</param>
            <param name="GamesInPeriod">The number of games played within the selected period (chat-scoped when filtered), or <see langword="null"/> for the all-time top where no period applies</param>
        </member>
        <member name="P:TTAR.API.Models.Responses.TopPosition.Position">
            <summary>The position number in the ranking, where a lower number indicates a higher rank</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.TopPosition.Hand">
            <summary>The player's hand associated with this position</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.TopPosition.RatingDelta">
            <summary>The change in rating associated with this position, or <see langword="null"/> if no change is applicable</summary>
        </member>
        <member name="P:TTAR.API.Models.Responses.TopPosition.GamesInPeriod">
            <summary>The number of games played within the selected period (chat-scoped when filtered), or <see langword="null"/> for the all-time top where no period applies</summary>
        </member>
        <member name="T:TTAR.API.Models.RttfPrivacy">
            <summary>
            Privacy rules for the RTTF PII we cache and re-expose. Shared by the response DTOs so the participant list and
            the player card apply the same gate. See <c>Docs/privacy-policy-code-followups.md</c> and privacy policy §7.
            </summary>
        </member>
        <member name="F:TTAR.API.Models.RttfPrivacy.MajorityAge">
            <summary>
            Age of majority. A player younger than this is a minor whose birth year is hidden from other users (§7).
            Computed from the birth YEAR only (day/month are not stored), so a player counts as an adult for the whole
            calendar year in which they turn 18 — the safe direction for a border case.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.RttfPrivacy.IsMinorBornYear(System.Nullable{System.Int32},System.Int32)">
            <summary>
            Whether <paramref name="bornYear"/> belongs to a minor as of <paramref name="currentYear"/>. Null year is
            treated as not-a-minor (nothing to hide). <paramref name="currentYear"/> must come from the injected
            <see cref="T:System.TimeProvider"/>, never <c>DateTime.UtcNow</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.RttfPrivacy.ShouldHideBornYear(System.Nullable{System.Int32},System.Int32,System.Boolean)">
            <summary>
            Whether a minor's birth year must be suppressed for this viewer: hidden from everyone EXCEPT the player
            themselves (and admins). Adults' birth years are never suppressed by this rule.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Rttf.LinkRttfRequest">
            <summary>
            Request to link an RTTF profile to a player. The link is created unconfirmed; the player then proves
            ownership by posting the returned confirmation code on rttf.ru.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Rttf.LinkRttfRequest.RttfId">
            <summary>The RTTF profile id to link. Must be a positive number.</summary>
        </member>
        <member name="T:TTAR.API.Models.Rttf.RttfProfileResponse">
            <summary>
            A scraped RTTF profile preview shown before linking (organizer dialog).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Rttf.RttfProfileResponse.Id">
            <summary>RTTF profile id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Rttf.RttfProfileResponse.Fio">
            <summary>Full name (ФИО) from RTTF.</summary>
        </member>
        <member name="P:TTAR.API.Models.Rttf.RttfProfileResponse.Rating">
            <summary>Main-hand RTTF rating, or <c>null</c> when the profile has no rating yet.</summary>
        </member>
        <member name="P:TTAR.API.Models.Rttf.RttfProfileResponse.City">
            <summary>City from RTTF, or <c>null</c>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Rttf.RttfProfileResponse.Born">
            <summary>Birth year from RTTF, or <c>null</c>.</summary>
        </member>
        <member name="M:TTAR.API.Models.Rttf.RttfProfileResponse.From(TTAR.ExternalRatings.Models.ExternalProfile)">
            <summary>Maps a scraped external profile to the preview response.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.AddCoOrganizerRequest">
            <summary>
            Request to add a co-organizer to a tournament (or update the finish right of an existing one — idempotent).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.AddCoOrganizerRequest.PlayerId">
            <summary>Player id to make a co-organizer. Must be an existing, non-guest player other than the organizer.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.AddCoOrganizerRequest.CanFinish">
            <summary>Whether the co-organizer may finish the tournament. Defaults to false.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.AddGuestParticipantRequest">
            <summary>
            Request to add a one-off tournament guest: a profile-less, name-only participant the organizer runs the
            tournament with (rated as a normal newcomer). See <see cref="P:TTAR.DataProviders.Models.PlayerModel.IsTournamentGuest"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.AddGuestParticipantRequest.Name">
            <summary>Guest's display name (required).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.AddGuestParticipantRequest.HandType">
            <summary>Guest's playing hand.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.AddGuestParticipantRequest.SeedRating">
            <summary>
            Optional seed rating (100–3000) used only for seeding — a guest has no established rating, so this lets
            the organizer place them by real strength. Null falls back to the newcomer default.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.CallMatchRequest">
            <summary>
            Request to call a pair to a table. On a recall (match already Called) the table may be omitted to keep
            the current table.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CallMatchRequest.TableNumber">
            <summary>Table number to call the pair to (1–50). Optional only when recalling a match already on a table.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.ChangeFormatRequest">
            <summary>
            Request to replace the format of a RUNNING tournament (<c>PUT /tournaments/{id}/format</c>): the same pair the
            start request carries, without the tables. What of it may differ from the current format is told by
            <c>TournamentResponse.FormatEditScope</c>; a locked part that differs is refused with 409 FormatLocked.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ChangeFormatRequest.TournamentType">
            <summary>The engine type of the new format (as at start). Required.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ChangeFormatRequest.Schema">
            <summary>
            The new battle schema. When null, defaults are derived from <see cref="P:TTAR.API.Models.Tournaments.ChangeFormatRequest.TournamentType"/>; when its own
            <c>Type</c> is empty, <see cref="P:TTAR.API.Models.Tournaments.ChangeFormatRequest.TournamentType"/> is used. Validated against the actual participant count.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.CheckAnnounceTopicRequest">
            <summary>
            Request to check that the bot can post into a topic of a chat before the tournament form is saved.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CheckAnnounceTopicRequest.ChatId">
            <summary>Internal chat id, as <see cref="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.ChatId"/>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CheckAnnounceTopicRequest.TopicId">
            <summary>The topic id, as <see cref="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.AnnounceTopicId"/> (the General topic is 1).</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.ConfirmByTokenRequest">
            <summary>
            Request to confirm tournament participation using the one-time token from an invitation email.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ConfirmByTokenRequest.Token">
            <summary>The token embedded in the confirmation deep-link.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.CoOrganizerEntry">
            <summary>
            One co-organizer entry accepted inline in the create / update tournament form — the same tuple as
            <see cref="T:TTAR.API.Models.Tournaments.AddCoOrganizerRequest"/> ({ PlayerId, CanFinish }).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CoOrganizerEntry.PlayerId">
            <summary>Player id to make a co-organizer. Must be an existing, non-guest player other than the organizer.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CoOrganizerEntry.CanFinish">
            <summary>Whether the co-organizer may finish the tournament. Defaults to false.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.CoOrganizerResponse">
            <summary>
            A tournament co-organizer: a player who runs the tournament alongside the organizer, with an optional
            right to finish it.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CoOrganizerResponse.PlayerId">
            <summary>Co-organizer player ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CoOrganizerResponse.PlayerName">
            <summary>Display name of the co-organizer.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CoOrganizerResponse.CanFinish">
            <summary>Whether this co-organizer may finish the tournament (register games + recalculate rating).</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.CoOrganizerResponse.From(TTAR.DataProviders.Models.TournamentCoOrganizerModel)">
            <summary>
            Maps a co-organizer model to a response.
            </summary>
            <param name="m">The co-organizer to map (its <c>Player</c> should be loaded for the display name).</param>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.CreateTournamentRequest">
            <summary>
            Request to create a new native tournament
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.Name">
            <summary>Tournament name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.Description">
            <summary>Optional description of the tournament.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.TournamentType">
            <summary>
            Tournament format type. Optional since v4 — the format may be decided at start ("decide at start").
            When a <see cref="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.Plan"/> is supplied its type is used for the reference calculation; the binding
            format is fixed at start.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.Plan">
            <summary>
            Reference schema (the plan) chosen at creation: used only by the calculator ("how long will this take
            with N players and T tables"). Never published to the announcement and may be null. The binding schema
            is chosen at start.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.LongRounds">
            <summary>
            ConsolationMixed only: the number of trailing pre-final upper rounds that follow long rules (their
            losers feed the connected lower bracket toward the 3rd-place match). Ignored for other formats
            (forced to null on create). Clamped to a valid range against the actual field size at start.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.IsOneDayFormat">
            <summary>Whether the tournament is completed in a single day.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.SetsInMatch">
            <summary>Number of sets per match (1–7).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.StartDate">
            <summary>
            Scheduled start date. Send an ISO-8601 value with the organizer's offset (e.g. "2026-07-24T11:00:00+04:00");
            the instant is stored as UTC and the offset is kept so the local time can be shown in Telegram announcements.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.RegistrationDeadline">
            <summary>Registration deadline.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.PlaceAddress">
            <summary>
            Free-text venue address. The place when no structured <see cref="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.VenueId"/> is linked — changing it later
            then resets participant confirmations; under a venue it is only an annotation.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.VenueId">
            <summary>
            Optional link to a structured venue (a hall). When set, the tournament's address, point and distance are
            taken from the venue; the free-text <see cref="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.PlaceAddress"/> stays as a fallback. Re-linking to another venue
            later resets participant confirmations.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.ChatId">
            <summary>
            Telegram chat ID linked to the tournament: one the caller is active in (<c>GET players/chats/{id}</c>), unless an
            admin (403 <c>ChatLinkForbidden</c>).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.AnnounceTopicId">
            <summary>
            Where the bot posts the announcement and results in <see cref="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.ChatId"/>: null or 0 — by the chat's settings (the
            topic the bot posts the chat's games into: pinned by an admin or auto-picked); any other value — the tournament's
            own topic, a Telegram topic id taken from a message link (the General topic is 1). Games are registered and
            confirmed by the chat's settings either way. The server checks the bot can post into the own topic
            (400 <c>AnnounceTopicUnavailable</c>). Ignored without a chat; never changes the chat's settings.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.AnnounceRepostAfterMessages">
            <summary>
            Repost the announcement once this many chat messages followed it; null — no reposts. A repost is silent, replaces
            the previous announcement and happens only while registration is open.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.AnnounceRepostAfterHours">
            <summary>
            Also repost the announcement this many hours after it was posted, provided someone wrote after it; null — no
            time trigger. Read only together with <see cref="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.AnnounceRepostAfterMessages"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.Access">
            <summary>
            Who may join: Open (default — anyone self-registers) or Invite (closed — the organizer builds the roster,
            self-registration is refused). Invite forces the rating window off (MinRating/MaxRating/OnlyRated cleared).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.MinRating">
            <summary>Minimum player rating required to participate.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.MaxRating">
            <summary>Maximum player rating allowed to participate.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.OnlyRated">
            <summary>Restrict participation to rated players only.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.OnlyChatMembers">
            <summary>Restrict participation to members of the linked chat only.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.MinParticipants">
            <summary>Minimum number of participants (2–255).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.MaxParticipants">
            <summary>Maximum number of participants (2–255).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.EntryFeeNote">
            <summary>Optional note: participation cost and other conditions. Not a critical field — never resets confirmations; blank is stored as null.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.ResultInputMode">
            <summary>Controls who is allowed to submit match results.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.AutoCallEnabled">
            <summary>
            Whether the server auto-calls the next ready pair onto a freed table (and pushes "you're called to
            table N"). <c>null</c> (field omitted) means the server default of <c>true</c>; the organizer can flip
            it live via <c>PUT /tournaments/{id}</c>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.WalkoverScore">
            <summary>Score string assigned for walkovers, e.g. "11:0".</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.CoOrganizers">
            <summary>
            Optional initial co-organizer roster set straight from the form (so the client need not send N separate
            <c>POST .../co-organizers</c> calls after create). Each element is validated as in the CRUD endpoint
            (existing non-guest player other than the organizer, no duplicates, at most 5); an invalid element fails
            the whole create with a 400 and no tournament is persisted. Each assignee is notified. Null or empty means
            "no co-organizers".
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.Ladder">
            <summary>
            Ladder rules, read only when <see cref="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.TournamentType"/> is <c>Ladder</c> (null — the defaults). A ladder takes
            its sets from <see cref="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.SetsInMatch"/> (1–5) and gets no plan, schedule or auto-call; its result mode is
            <c>Players</c>, which an ordinary tournament may not use.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentRequest.SourceTournamentId">
            <summary>
            The tournament whose settings fill this form (the "create the same" button), for analytics only — the copy
            is not linked to it. The hint never fails the create: null, 0 or a negative value mean no source, and an id
            of no existing tournament is silently stored as null. The client fills the form from
            <c>GET /tournaments/{id}</c> itself.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.EditMatchScoreResponse">
            <summary>
            Result of editing an already-completed match's score. Carries the updated match plus the downstream impact
            of the edit, so the client can surface the right message (a warning when the change no longer affects the
            tournament, or a note that the queue was rebuilt).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.EditMatchScoreResponse.Match">
            <summary>The updated match with its corrected score.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.EditMatchScoreResponse.Impact">
            <summary>
            The downstream effect of the edit. <see cref="F:TTAR.Tournaments.ScoreEditImpact.NoDownstreamEffect"/> — pure correction;
            <see cref="F:TTAR.Tournaments.ScoreEditImpact.WarnAlreadyFinalized"/> — winner flipped but the tournament had already moved
            on, so nothing was replayed (<see cref="P:TTAR.API.Models.Tournaments.EditMatchScoreResponse.Warning"/> is set); <see cref="F:TTAR.Tournaments.ScoreEditImpact.RebuiltQueue"/> —
            winner flipped and the still-queued bracket/queue was rebuilt for the correct winner/loser.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.EditMatchScoreResponse.DoesNotAffectTournament">
            <summary>
            Whether the corrected result no longer affects the tournament (the downstream was already finalized):
            true only for <see cref="F:TTAR.Tournaments.ScoreEditImpact.WarnAlreadyFinalized"/>. The client shows <see cref="P:TTAR.API.Models.Tournaments.EditMatchScoreResponse.Warning"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.EditMatchScoreResponse.Warning">
            <summary>
            A human-readable warning when the edit does not affect the tournament outcome, else null. The client may
            localize its own message from <see cref="P:TTAR.API.Models.Tournaments.EditMatchScoreResponse.Impact"/> instead.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.EditMatchScoreResponse.From(TTAR.DataProviders.Models.TournamentMatchModel,TTAR.Tournaments.ScoreEditImpact)">
            <summary>Maps the service result to a response.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.GuestLinkWindowResponse">
            <summary>
            When a guest of the tournament may still be linked to a TTAR profile (requested or merged): until the finish and
            7 more days. The server's rule — the client shows it as is.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkWindowResponse.Open">
            <summary>Whether a link request or a merge is possible now. False for a cancelled tournament and a ladder.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkWindowResponse.Until">
            <summary>
            The last moment (UTC) of a finished tournament's window — the end of the 7th day after the finish day, in the
            organizer's time zone. Null while the tournament is not finished (open until the finish).
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.GuestLinkWindowResponse.From(TTAR.Tournaments.GuestLinkWindow)">
            <summary>Maps the window rule.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.GuestLinkPlayerResponse">
            <summary>A player as the guest-link screens show them: name, avatar, rating, games, registration date.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPlayerResponse.Id">
            <summary>Player id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPlayerResponse.Name">
            <summary>Display name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPlayerResponse.AvatarPath">
            <summary>Relative path to the avatar photo, or null.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPlayerResponse.Rating">
            <summary>Rating of the main hand (1000 when the player has never played).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPlayerResponse.Games">
            <summary>Games on both hands.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPlayerResponse.CreatedAt">
            <summary>When the profile was registered (UTC) — "профиль создан вчера".</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPlayerResponse.IsNew">
            <summary>
            No games and no rated hand (an imported rating counts as rated): would take the guest's games and rating
            ("новый профиль").
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.GuestLinkPlayerResponse.From(TTAR.DataProviders.Models.PlayerModel)">
            <summary>Maps a player loaded with hands and images.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.GuestLinkSignalsResponse">
            <summary>Hints for the organizer that a player is the guest.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkSignalsResponse.SimilarName">
            <summary>The name looks like the guest's (a shared word or its first four letters, in either script).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkSignalsResponse.CreatedAfterTournament">
            <summary>The profile was registered after the tournament (its finish, else its start).</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.GuestLinkRequestResponse">
            <summary>A player's request "this guest is me".</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkRequestResponse.Id">
            <summary>Request id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkRequestResponse.ParticipantId">
            <summary>The guest's participant id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkRequestResponse.Player">
            <summary>The requester.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkRequestResponse.Status">
            <summary>Pending, Approved, Rejected, Withdrawn, Superseded (the guest went to someone else) or Expired.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkRequestResponse.CreatedAt">
            <summary>When it was sent (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkRequestResponse.DecidedAt">
            <summary>When it was decided (UTC), or null while Pending.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkRequestResponse.Signals">
            <summary>Hints for the organizer that the requester is the guest; both false in the requester's own copy.</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.GuestLinkRequestResponse.From(TTAR.DataProviders.Models.TournamentGuestLinkRequestModel,TTAR.DataProviders.Models.TournamentModel,System.String)">
            <summary>
            Maps a request loaded with its player (hands, images). The signals need the tournament and the guest's name;
            without them they stay false.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LinkedFromResponse">
            <summary>The trace of a guest merged into the participant's player — kept on the participant for good.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LinkedFromResponse.GuestName">
            <summary>The guest's name ("ранее — временный «…»").</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LinkedFromResponse.At">
            <summary>When the guest was merged (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LinkedFromResponse.Mode">
            <summary>
            Replace — the player took the guest's seat before its games were rated; Transfer — the player had no games and
            took the guest's games and rating; Append — the games joined the player's history without a recalculation.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LinkedFromResponse.Via">
            <summary>The organizer's own pick, or an approved request.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LinkedFromResponse.RatingBefore">
            <summary>Transfer only: the guest's rating before its games (the 1000 start).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LinkedFromResponse.RatingAfter">
            <summary>Transfer only: the guest's rating after its games — the player's at the merge.</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.LinkedFromResponse.From(TTAR.DataProviders.Models.TournamentParticipantModel)">
            <summary>The trace of a participant, or null when it was no linked guest.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse">
            <summary>What merging the guest into one player would do — one calculation for the organizer's and the player's sheets.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.Mode">
            <summary>The mode the merge would take now (see <see cref="P:TTAR.API.Models.Tournaments.LinkedFromResponse.Mode"/>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.AppendReason">
            <summary>Append only: HasGames — the player has games of their own; ImportedRating — none, but an imported rating.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.RatingBefore">
            <summary>Transfer only: the guest's rating before its games.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.RatingAfter">
            <summary>Transfer only: the guest's rating now — the player's after the merge.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.RatingDelta">
            <summary>Transfer only: <see cref="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.RatingAfter"/> − <see cref="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.RatingBefore"/>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.Games">
            <summary>Matches the guest played in the tournament (walkovers excluded).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.Wins">
            <summary>Of <see cref="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.Games"/>, won by the guest.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.Losses">
            <summary>Of <see cref="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.Games"/>, lost by the guest.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.Placement">
            <summary>The guest's final place, or null before the finish.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.PlayerRating">
            <summary>The player's rating by the hand the guest played.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.PlayerGames">
            <summary>The player's games on both hands.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.QualificationPoints">
            <summary>Transfer only, while the guest is not qualified: its qualification points (of <see cref="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.QualificationTarget"/>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.QualificationTarget">
            <summary>The qualification points that make a hand qualified.</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.GuestLinkPreviewResponse.From(TTAR.Tournaments.GuestLinkPreview)">
            <summary>Maps the service preview.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.GuestLinkCandidateResponse">
            <summary>A player the organizer may merge the guest into.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkCandidateResponse.Player">
            <summary>The player.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkCandidateResponse.IsNew">
            <summary>Same as <see cref="P:TTAR.API.Models.Tournaments.GuestLinkPlayerResponse.IsNew"/>; kept for compatibility.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkCandidateResponse.InTournament">
            <summary>An active participant of the tournament — shown disabled ("уже участник этого турнира").</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.GuestLinkCandidateResponse.Signals">
            <summary>Hints that the player is the guest.</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.GuestLinkCandidateResponse.From(TTAR.Tournaments.GuestLinkCandidate)">
            <summary>Maps a service candidate.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LinkGuestRequest">
            <summary>Body of <c>POST /tournaments/{id}/participants/{participantId}/link</c>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LinkGuestRequest.PlayerId">
            <summary>The player to merge the guest into.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LinkGuestRequest.RequestId">
            <summary>The player's Pending request this merge approves, if any.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LadderSettingsRequest">
            <summary>
            The rules of a ladder tournament, set on create and replaced as a whole by <c>PUT /tournaments/{id}</c> (before the
            start only). The number of sets is the tournament's <c>setsInMatch</c> (1–5 for a ladder; every set is played).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsRequest.Balance">
            <summary>At 10:10 a set goes on until one side leads by two; false — the 11th point decides.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsRequest.Tiebreak">
            <summary>
            A draw on sets (an even <c>setsInMatch</c> only) is settled for the table move by one extra point that is not
            recorded — the game is rated as a draw; false — both keep their tables. Stored as false for an odd number of sets.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsRequest.EvenOnly">
            <summary>
            Only an even roster at the start: a player without a pair waits in the waitlist (<c>pair: true</c>) until the
            next one signs up; an odd <c>maxParticipants</c> leaves its last seat empty. Once the ladder runs the rule is
            over: players join and leave one by one, and whoever waited for a pair is seated at the start.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsRequest.AutoConfirmDays">
            <summary>
            The games still unconfirmed this many days after the finish count automatically (1 or 3); null — they expire
            like ordinary games, the ordinary confirmation timeout after the finish.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsRequest.AutoStart">
            <summary>
            The ladder starts by itself at its start time — the same switch as <c>PUT …/ladder/auto-start</c>. Null leaves
            it as it is (on create — off), so a client that does not send the field never turns it off.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsRequest.Seating">
            <summary>
            How the client seats the draw at the tables (a view choice; the draw is never reordered). Null leaves it as it
            is (on create — Rating). A running ladder changes it by <c>PATCH …/ladder</c>.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LadderSettingsResponse">
            <summary>The rules and timeline of a ladder tournament.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.Balance">
            <summary>At 10:10 a set goes on until one side leads by two; false — the 11th point decides.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.Tiebreak">
            <summary>A draw on sets is settled for the table move by one extra, unrecorded point (even <c>setsInMatch</c> only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.EvenOnly">
            <summary>Only an even roster until the start; players waiting for a pair carry <c>pair: true</c> in the waitlist.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.AutoConfirmDays">
            <summary>Days after the finish when the unconfirmed games count automatically (1 or 3), or null — never.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.StartedAt">
            <summary>When the ladder started (UTC), or null before the start.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.FinishedAt">
            <summary>When the ladder was finished (UTC), or null while it has not.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.AutoConfirmAt">
            <summary>
            <see cref="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.FinishedAt"/> + <see cref="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.AutoConfirmDays"/>: when the games still waiting since the finish count
            automatically, or null.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.RegMode">
            <summary>How the finish registers the games for rating (chosen by the organizer at the finish); null before it.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.AutoStart">
            <summary>
            The ladder starts by itself at its start time (set by <c>PUT …/ladder/auto-start</c> or the form's
            <c>ladder.autoStart</c>). Either way, it is closed
            12 hours after its scheduled start: cancelled if not started, finished if running.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.Draw">
            <summary>
            The table draw: participant ids of the confirmed roster, in random order (pairs by two, the first pair at table 1).
            Drawn once — when the registration deadline comes while the ladder is still in Registration, otherwise at the
            start — and never changed after (not by the start, nor by <see cref="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.Seating"/>); so it may already be there in
            Registration. Null before it and for ladders started before the draw existed. Confirmed participants missing
            from it came in later; an id in it may be of a participant no longer active. A view hint only — it affects no
            game or rating.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.Seating">
            <summary>How the client seats <see cref="P:TTAR.API.Models.Tournaments.LadderSettingsResponse.Draw"/> at the tables: by rating, in the draw's random order, or freely switched.</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.LadderSettingsResponse.From(TTAR.DataProviders.Models.TournamentModel)">
            <summary>The ladder part of a tournament, or null for an ordinary tournament.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LadderGameResponse">
            <summary>
            A game recorded in a ladder — the score of one match, or of several at once: one participant records it, the
            other confirms or rejects it.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderGameResponse.Id">
            <summary>Ladder game id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderGameResponse.RecordedByParticipantId">
            <summary>The participant who recorded the game.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderGameResponse.OpponentParticipantId">
            <summary>The participant who confirms or rejects it.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderGameResponse.SetsRecorder">
            <summary>Sets won by the recorder.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderGameResponse.SetsOpponent">
            <summary>Sets won by the opponent.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderGameResponse.CreatedAt">
            <summary>When the game was recorded (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderGameResponse.Status">
            <summary>
            Pending, Confirmed, Rejected, AutoConfirmed or Expired (a finished ladder without auto-confirm: its game was not
            decided within the ordinary confirmation timeout; it never counts). A game confirmed while the ladder runs goes
            to the rating at the finish (see <c>ladderPairs</c>); one still Pending then waits as an ordinary game
            (<see cref="P:TTAR.API.Models.Tournaments.LadderGameResponse.GameId"/>) and follows it.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderGameResponse.RejectReason">
            <summary>Why the opponent rejected it; null unless Rejected.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderGameResponse.DecidedAt">
            <summary>When it was confirmed, rejected, auto-confirmed or expired (UTC); null while Pending.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderGameResponse.GameId">
            <summary>
            The game the record was registered with at the finish (the "game history" row): its own (Each), or one shared
            with the records it was summed with (Total) — the pair's game of its confirmed records, or the game of all the
            author's waiting records against this opponent. Null before the finish.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderGameResponse.RatingDeltaRecorder">
            <summary>The recorder's rating change from <see cref="P:TTAR.API.Models.Tournaments.LadderGameResponse.GameId"/>; null until it is rated.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderGameResponse.RatingDeltaOpponent">
            <summary>The opponent's rating change from <see cref="P:TTAR.API.Models.Tournaments.LadderGameResponse.GameId"/>; null until it is rated.</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.LadderGameResponse.From(TTAR.DataProviders.Models.TournamentLadderGameModel)">
            <summary>Maps a ladder game.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LadderPairResponse">
            <summary>
            Two participants of a ladder with any record against each other. Computed by the server, so the client never
            works out the registration itself.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderPairResponse.Participant1">
            <summary>The participant with the lower id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderPairResponse.Participant2">
            <summary>The participant with the higher id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderPairResponse.Sets1">
            <summary>The pair's score on sets, participant 1's side: the sum of its confirmed games.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderPairResponse.Sets2">
            <summary>The pair's score on sets, participant 2's side.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderPairResponse.PendingCount">
            <summary>The pair's games still waiting for a decision. After the finish they wait as ordinary games and are decided as such.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderPairResponse.Registered">
            <summary>
            The pair went to the rating — once, at the finish: its confirmed games were rated, those still waiting became
            games waiting for confirmation (<see cref="P:TTAR.API.Models.Tournaments.LadderPairResponse.PendingCount"/>).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderPairResponse.RatingDelta1">
            <summary>Participant 1's rating change from the pair's rated games; null when none was rated.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderPairResponse.RatingDelta2">
            <summary>Participant 2's rating change from the pair's rated games; null when none was rated.</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.LadderPairResponse.ListFrom(System.Collections.Generic.IEnumerable{TTAR.DataProviders.Models.TournamentLadderGameModel},System.Boolean)">
            <summary>The pairs of a ladder, in the order of their first record.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LadderListSummary">
            <summary>The records of a ladder for its card in the tournament list.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderListSummary.GamesCount">
            <summary>All recorded games (rejected ones included).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderListSummary.RatedCount">
            <summary>
            Games in the rating (after the finish; ladders that ran before rated each game on confirmation). A reverted one
            does not count.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderListSummary.ConfirmedCount">
            <summary>Confirmed records: games confirmed or auto-confirmed.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderListSummary.PendingCount">
            <summary>Records waiting for a decision: Pending games.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderListSummary.AwaitingMeCount">
            <summary>
            Waiting records the caller is to decide ("ждут вас") while the ladder runs; 0 for anonymous callers and after
            the finish, when they wait as ordinary games (<c>GET /games/unconfirmed</c>).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderListSummary.MyGamesCount">
            <summary>The caller's games, rejected and expired ones excluded ("ваших игр: N"); 0 for anonymous callers.</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.LadderListSummary.From(TTAR.DataProviders.Models.TournamentModel,System.Int32)">
            <summary>The summary of a ladder, or null for an ordinary tournament.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.RecordLadderGameRequest">
            <summary>
            Records a ladder game of the caller against another participant: the score of one match or — a free score — of
            several at once.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.RecordLadderGameRequest.OpponentParticipantId">
            <summary>The opponent — an active participant of this ladder other than the caller.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.RecordLadderGameRequest.SetsMine">
            <summary>Sets the caller won.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.RecordLadderGameRequest.SetsOpponent">
            <summary>Sets the opponent won. By the rules the two add up to the ladder's <c>setsInMatch</c> (a multiple of it
            for several matches), but a score off the rules is accepted too; at least one set in total.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.RecordLadderGamesRequest">
            <summary>Records several ladder games of the caller at once.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.RecordLadderGamesRequest.Items">
            <summary>The games, each against its opponent; several against one opponent are allowed.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LadderRecordResponse">
            <summary>What a write of ladder records produced.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderRecordResponse.Games">
            <summary>The Pending games recorded.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.RejectLadderGameRequest">
            <summary>Rejects a ladder game.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.RejectLadderGameRequest.Reason">
            <summary>Why: not played, a different score, a duplicate.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LadderAutoConfirmRequest">
            <summary>The auto-confirm period of a ladder, changed after the start.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderAutoConfirmRequest.AutoConfirmDays">
            <summary>Days after the finish when the unconfirmed games count automatically (1 or 3); null — never.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LadderAutoStartRequest">
            <summary>Turns a ladder's auto-start on or off.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderAutoStartRequest.AutoStart">
            <summary>True — the ladder starts by itself at its start time; false — only the organizer starts it.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LadderFinishRequest">
            <summary>How to finish a ladder.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderFinishRequest.AutoConfirmDays">
            <summary>Days after the finish when the unconfirmed games count automatically (1 or 3); null — never.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderFinishRequest.RegMode">
            <summary>How the games go to the rating: Total (one game per pair with their sum, the default) or Each (as entered).</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.UpdateLadderRulesRequest">
            <summary>The game rules of a running ladder; a null field stays as it is.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateLadderRulesRequest.SetsInMatch">
            <summary>Sets in a game, 1–5. The recorded games are not touched; new ones are checked against it.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateLadderRulesRequest.Balance">
            <summary>At 10:10 a set goes on until one side leads by two; false — the 11th point decides.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateLadderRulesRequest.Tiebreak">
            <summary>A draw on sets is settled by one extra point (an even number of sets only; stored false otherwise).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateLadderRulesRequest.Seating">
            <summary>How the client seats the draw at the tables. The draw itself is not reshuffled.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LadderRegisterResponse">
            <summary>Outcome of signing up for a ladder.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderRegisterResponse.Status">
            <summary>In the roster, or (even-only ladder) waiting in the waitlist for a pair.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderRegisterResponse.Participant">
            <summary>The caller's participant row when <see cref="P:TTAR.API.Models.Tournaments.LadderRegisterResponse.Status"/> is Participant.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderRegisterResponse.WaitlistEntry">
            <summary>The caller's waitlist entry (<c>pair: true</c>) when <see cref="P:TTAR.API.Models.Tournaments.LadderRegisterResponse.Status"/> is WaitingPair.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LadderRegisterResponse.PairedWithPlayerId">
            <summary>The player who waited for a pair and got into the roster together with the caller, or null.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.LimitCutResponse">
            <summary>
            Who saving the edit form with a lower limit would move from the roster to the waitlist
            (<c>GET /tournaments/{id}/limit-cut</c>) — computed by the same rule the save applies.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LimitCutResponse.Overflow">
            <summary>Active participants minus the seats the new limit leaves; 0 when the edit would move nobody.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.LimitCutResponse.Players">
            <summary>
            The participants to be moved, in the order they would queue up. Fewer than <see cref="P:TTAR.API.Models.Tournaments.LimitCutResponse.Overflow"/> when only
            tournament guests are left to cut — guests are never moved.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.MoveMatchRequest">
            <summary>
            Request to move a called match to another table. If the target table hosts another live match the two
            matches swap tables.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.MoveMatchRequest.TableNumber">
            <summary>Target table number (1–50).</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.ParticipantResponse">
            <summary>
            Tournament participant info
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.Id">
            <summary>Participant record ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.TournamentId">
            <summary>ID of the tournament this participant belongs to.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.PlayerId">
            <summary>Player ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.PlayerName">
            <summary>Display name of the player.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.HandType">
            <summary>Player's playing hand.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.SeedNumber">
            <summary>Seeding number, if assigned.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.SeedRating">
            <summary>Organizer-set seed rating (used only for seeding), or null to use the live rating.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.Confirmed">
            <summary>
            Whether the player confirmed participation. Self-registered players are confirmed on sign-up;
            players added manually by the organizer must confirm before they take part.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.Paid">
            <summary>
            Organizer's "entry fee received" mark (no cashier in TTAR — no amounts). Public: everyone who sees the
            roster sees it. Shown by the client only for tournaments that actually charge a fee.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.RegisteredAt">
            <summary>Date and time when the participant registered.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.IsActive">
            <summary>
            Whether the participant is still active: not removed, not declined, and has not left the running ladder. An
            inactive row (<see cref="P:TTAR.API.Models.Tournaments.ParticipantResponse.LeftAt"/> / <see cref="P:TTAR.API.Models.Tournaments.ParticipantResponse.RemovedAt"/>) stays in <c>participants</c> so the ladder games
            it played in keep their names; the roster shows only active ones.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.DeclinedAt">
            <summary>
            When the invited player declined the invitation (closed tournaments), or null. Only ever populated on rows
            in <c>TournamentResponse.DeclinedParticipants</c> (a manager-only list). Drives the "Отказался · 10 июля" line.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.LeftAt">
            <summary>
            Ladder: when the player left the running ladder themselves while having games in it (they may sign up again),
            or null.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.RemovedAt">
            <summary>
            When the organizer took the participant off the roster (they cannot rejoin on their own), or null. In a running
            ladder the games played stay, like after a disqualification.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.RatingDelta">
            <summary>
            Net TTAR change over the tournament (by the played hand), snapshotted at finish. Null before finish; 0 for
            a no-show. A frozen snapshot — a later score edit does not recompute it for anyone but the two players of
            the edited game. The finish table shows "до → после Δ" from the current hand rating and this delta.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.Placement">
            <summary>
            Final place (1-based), snapshotted at finish per the bracket/standings rule. Null before finish. Frozen —
            not recomputed by a later score edit. Drives the finish page's podium and standings order.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.AvatarPath">
            <summary>Relative path to the player's avatar photo, or null (no photo / a guest). Rendered as the round avatar.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.PlayerHand">
            <summary>Rating stats for the registered hand. Null when hand data is not loaded.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.MainHand">
            <summary>
            The player's physical main hand (Left/Right), so the client can render the "left hand" badge next to the
            participant from <see cref="P:TTAR.API.Models.Tournaments.ParticipantResponse.HandType"/> + this side. Null when never set (treated as Right) or for a guest.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.IsTournamentGuest">
            <summary>
            True when the participant is a one-off tournament guest (no TTAR profile, no login).
            Guests start at 1000 TTAR and their games are scored by qualification rules.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.HasRttfLink">
            <summary>
            Whether the player has a linked RTTF profile. The bare "a link exists" fact is exposed to everyone; the
            RTTF details (id + name/city/born) are gated on confirmation and the caller's relationship — see <see cref="M:TTAR.API.Models.Tournaments.ParticipantResponse.From(TTAR.DataProviders.Models.TournamentParticipantModel,System.Boolean,System.Nullable{System.Int32},System.Int32,System.Boolean,System.Boolean)"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.RttfUserId">
            <summary>RTTF profile id — gated like the rest of the RTTF PII (confirmed participant, privileged caller).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.RttfUsername">
            <summary>RTTF display name, if the player has a linked profile.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.RttfCity">
            <summary>City cached from the RTTF profile, or <c>null</c>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.RttfBornYear">
            <summary>Birth year cached from the RTTF profile, or <c>null</c>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.IsRttfProfileConfirmed">
            <summary>Whether the RTTF link was confirmed by the player (vs. created by an organizer).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.ContactPhone">
            <summary>
            Phone for the organizers: present only for a manager (or the participant themselves) and only when the player
            registered on their own — the phone typed in at registration, else the profile phone they share with organizers.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ParticipantResponse.LinkedFrom">
            <summary>
            Set when this row was a tournament guest merged into <see cref="P:TTAR.API.Models.Tournaments.ParticipantResponse.PlayerId"/>: who the guest was and how the merge
            went ("ранее — временный «…»"). Public; null for any other row.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.ParticipantResponse.From(TTAR.DataProviders.Models.TournamentParticipantModel,System.Boolean,System.Nullable{System.Int32},System.Int32,System.Boolean,System.Boolean)">
            <summary>
            Maps a participant model to a response.
            </summary>
            <param name="m">The participant to map.</param>
            <param name="includeRttfPii">
            Whether the caller may see this tournament's RTTF details — pass <c>true</c> only for a privileged caller
            (organizer / co-organizer or a confirmed participant of the same tournament). It ANDs with the row's own
            confirmation: an unconfirmed participant's RTTF details are withheld from everyone, including the organizer.
            </param>
            <param name="currentYear">
            Current UTC year from the injected <see cref="T:System.TimeProvider"/>, used to hide a minor's birth year
            from other users (§7). Null skips the minor check.
            </param>
            <param name="callerId">The authenticated caller's player id (0 when anonymous); a row belonging to the caller is "self".</param>
            <param name="isAdmin">Whether the caller is an admin; admins keep seeing a minor's birth year like self.</param>
            <param name="includeContactPhone">
            Whether the caller manages the tournament (organizer / co-organizer / admin) and may see participants' phones.
            </param>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.PlayerTournamentResponse">
            <summary>
            One tournament a player took part in, for the "player tournaments" surface (summary on the player card and
            the full player-tournaments page). Two kinds: <see cref="F:TTAR.API.Models.Tournaments.PlayerTournamentKind.Own"/> — a tournament in our
            system (place, size, match balance, rank, rating delta; navigates to the tournament page) — and
            <see cref="F:TTAR.API.Models.Tournaments.PlayerTournamentKind.External"/> — imported from an open source (name, link, dates and rating
            delta only; no place/opponents). The whole entry counts toward ONE rating axis (<see cref="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Axis"/>); a
            tournament played on both axes is delivered as two entries.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Kind">
            <summary>Which kind of tournament this is (Own = in our system, External = imported).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.TournamentId">
            <summary>Own-tournament id in our system (drives navigation). 0 for external.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Name">
            <summary>Tournament name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Date">
            <summary>Date the tournament was held (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Axis">
            <summary>Rating axis the tournament counted toward (a hand, not a physical side).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.RatingDelta">
            <summary>
            Rating change credited for this tournament, on <see cref="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Axis"/>. Null while an Own tournament is still
            live (no result yet); present for external (the gain credited on import).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.RatingNotApplied">
            <summary>
            Own only: the player was merged in from a tournament guest after the guest's games were rated, and the player
            had a rating of their own — <see cref="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.RatingDelta"/> is the guest's and did not move the player's rating
            (shown as "без пересчёта"). False when the player also played rated games after the merge (a multi-day
            tournament, a league): <see cref="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.RatingDelta"/> is then those games' alone.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Status">
            <summary>Own-tournament status: Active while running (no rank yet) or Finished.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Rank">
            <summary>Final placement (1-based) among <see cref="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Size"/>; null while live.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Size">
            <summary>Number of participants (the final tournament size, not a bracket/group). 0 for external.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Place">
            <summary>Venue / place text (Own only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Wins">
            <summary>Match wins of the player in this Own tournament. Null for external.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Losses">
            <summary>Match losses of the player in this Own tournament. Null for external.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.Url">
            <summary>Source URL (External only), opened in a new tab.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PlayerTournamentResponse.ImportedDate">
            <summary>When the external result was imported into our system (External only).</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.PlayerTournamentResponse.From(TTAR.DataProviders.Models.PlayerTournamentEntry)">
            <summary>Maps a repository projection to the response.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.PlayerTournamentKind">
            <summary>Kind of a player-tournament entry.</summary>
        </member>
        <member name="F:TTAR.API.Models.Tournaments.PlayerTournamentKind.Own">
            <summary>A tournament in our "Tournaments" section.</summary>
        </member>
        <member name="F:TTAR.API.Models.Tournaments.PlayerTournamentKind.External">
            <summary>Imported from an open external source (RTTF, etc.).</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.PlayerTournamentStatus">
            <summary>Coarse status of an Own player-tournament entry (finer states collapse into these two).</summary>
        </member>
        <member name="F:TTAR.API.Models.Tournaments.PlayerTournamentStatus.Active">
            <summary>Still running — no final place yet.</summary>
        </member>
        <member name="F:TTAR.API.Models.Tournaments.PlayerTournamentStatus.Finished">
            <summary>Concluded — has a final place and rating delta.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.PromoteFromWaitlistRequest">
            <summary>
            Request to move a waiting player into the tournament roster (organizer / co-organizer / admin).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.PromoteFromWaitlistRequest.OverLimit">
            <summary>
            Add the player even when the roster is already full (the organizer confirmed the over-the-limit warning).
            False refuses a full roster with 409 <c>ParticipantLimitReached</c>.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.RegisterRequest">
            <summary>
            Request to register a participant in a tournament
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.RegisterRequest.HandType">
            <summary>Player's playing hand.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.RegisterRequest.ContactPhone">
            <summary>
            Optional phone for the organizers of THIS tournament (digits, '+', '-', spaces, brackets). Omit it to let them
            see the profile phone when the player shares it with organizers. Never published in the profile.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.RegisterRequest.RememberPhone">
            <summary>
            Also save <see cref="P:TTAR.API.Models.Tournaments.RegisterRequest.ContactPhone"/> to the profile and turn on passing it to organizers of later tournaments.
            Ignored without a phone.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.RemoveParticipantResponse">
            <summary>
            Result of DELETE .../participants/{id} when the caller declined their own invitation to a closed tournament.
            A plain removal returns 204 with no body; this body is returned only for the decline branch so the client can
            show the "Отказались" group without a second fetch.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.RemoveParticipantResponse.Declined">
            <summary>True when the row moved to the declined list (invited player declined), rather than being removed.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.SetCoOrganizerCanFinishRequest">
            <summary>
            Request to change a co-organizer's finish right.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.SetCoOrganizerCanFinishRequest.CanFinish">
            <summary>The new finish right for the co-organizer.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.SetParticipantPaidRequest">
            <summary>
            Request to set a participant's "entry fee received" mark (organizer/co-organizer/admin). There is no cashier
            in TTAR — this is a public bookkeeping mark only, no amounts are charged or reconciled.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.SetParticipantPaidRequest.Paid">
            <summary>Whether the entry fee is marked as received.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.SetParticipantSeedRatingRequest">
            <summary>
            Request to set a participant's seeding rating (organizer/admin, before start). Used only for group split /
            bracket placement — it never affects the rating delta. Null clears the override (falls back to live rating).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.SetParticipantSeedRatingRequest.SeedRating">
            <summary>Seed rating (100–3000), or <c>null</c> to clear the override.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.SetRecapRequest">
            <summary>
            Request to set (or clear) the organizer's finish recap on a finished tournament. An empty or whitespace-only
            <see cref="P:TTAR.API.Models.Tournaments.SetRecapRequest.Text"/> clears the recap.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.SetRecapRequest.Text">
            <summary>The recap text (2–3 paragraphs, blank-line separated), or empty/null to clear it.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.SetStageSetsRequest">
            <summary>
            Request to change the sets-to-win of one stage of a running tournament. Applies to that stage's unplayed
            matches only — matches already completed, forfeited or awaiting score confirmation keep their value.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.SetStageSetsRequest.Stage">
            <summary>
            Which stage to change: Groups (grouped formats' group stage), Bracket (the knockout / final stage of a
            grouped or flat bracket format), or Single (the round-robin stage of RoundRobin / RoundRobin2 / League).
            Rejected with 400 when the tournament's format does not have that stage.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.SetStageSetsRequest.SetsToWin">
            <summary>New sets-to-win for the stage (1–5, best-of = 2*SetsToWin-1).</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.SetTablesCountRequest">
            <summary>
            Request to change the number of tables of a running tournament.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.SetTablesCountRequest.TablesCount">
            <summary>
            New number of tables (1–50). Growing always succeeds; shrinking is rejected when it would drop below the
            number of tables currently in use — free the extra tables first. Live pairs sitting above the new count
            are renumbered down onto the freed low tables.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.StartTournamentRequest">
            <summary>
            Request to start a tournament
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.StartTournamentRequest.TablesCount">
            <summary>
            Number of tables available for the tournament (1–50). Ignored for asynchronous formats (League), where
            there is no shared table pool — any valid value is accepted.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.StartTournamentRequest.TournamentType">
            <summary>
            Final tournament format, chosen at start. Required — the binding format must be decided before the
            schedule can be generated.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.StartTournamentRequest.Schema">
            <summary>
            Final battle schema fixed for this tournament. When null, defaults are derived from
            <see cref="P:TTAR.API.Models.Tournaments.StartTournamentRequest.TournamentType"/>. When its own <c>Type</c> is empty, <see cref="P:TTAR.API.Models.Tournaments.StartTournamentRequest.TournamentType"/> is used.
            The schema is validated against the actual participant count on start.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.StartTournamentRequest.AutoCallEnabled">
            <summary>
            Auto-call state to start the tournament with. <c>null</c> keeps the tournament's saved value; a non-null
            value overwrites it before the schedule is generated (so the immediate table-fill honors it).
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.SubmitMatchScoreRequest">
            <summary>
            Request to submit match score
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.SubmitMatchScoreRequest.Score1">
            <summary>Score of participant 1.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.SubmitMatchScoreRequest.Score2">
            <summary>Score of participant 2.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.TournamentCalculatorRequest">
            <summary>
            Request to calculate tournament duration and table recommendations
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorRequest.ParticipantCount">
            <summary>Number of participants (2–255).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorRequest.TablesCount">
            <summary>Number of tables available.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorRequest.SetsInMatch">
            <summary>Number of sets per match (1–7).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorRequest.TournamentType">
            <summary>Tournament format type.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorRequest.TargetDurationMinutes">
            <summary>
            Target tournament duration in minutes for table recommendation
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.CalcStageResponse">
            <summary>Per-stage breakdown line in a calculator response.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CalcStageResponse.Key">
            <summary>Stable stage key (groups / bracket / rr / final).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CalcStageResponse.Label">
            <summary>Human-readable stage label.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CalcStageResponse.Note">
            <summary>Optional note.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CalcStageResponse.Matches">
            <summary>Number of matches in the stage.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CalcStageResponse.Sets">
            <summary>Sets-to-win used in the stage.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CalcStageResponse.Rounds">
            <summary>Number of sequential rounds in the stage.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CalcStageResponse.TablesUsed">
            <summary>Tables actually usable in parallel for this stage.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CalcStageResponse.DurationMinutes">
            <summary>Estimated stage duration in minutes.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.CalcWarningResponse">
            <summary>Advisory warning line in a calculator response. Text-free: the client localizes by <see cref="P:TTAR.API.Models.Tournaments.CalcWarningResponse.Code"/>,
            interpolating <see cref="P:TTAR.API.Models.Tournaments.CalcWarningResponse.Args"/> in code-specific order.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CalcWarningResponse.Tone">
            <summary>Severity: info / warn.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CalcWarningResponse.Code">
            <summary>Stable warning code (the client renders the localized text per code).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CalcWarningResponse.Args">
            <summary>Values to interpolate into the localized text, in code-specific order (stringified).</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.TournamentCalculatorResponse">
            <summary>
            Tournament duration and table recommendations. The four legacy aggregates are kept; v4 adds the per-stage
            breakdown, per-player match bounds, projected finish, table cap, warnings and a readable summary (ТЗ §5.1).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.MatchCount">
            <summary>Total number of matches in the tournament.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.TotalDurationMinutes">
            <summary>Estimated total duration in minutes.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.AverageWaitMinutes">
            <summary>Average wait time between matches per player, in minutes.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.RecommendedTablesCount">
            <summary>Recommended number of tables to reach the target duration. Null for async formats.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.PerPlayerMin">
            <summary>Minimum matches a single player will play.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.PerPlayerMax">
            <summary>Maximum matches a single player will play.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.FinishTime">
            <summary>Projected finish time, when a start time was supplied.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.CapMaxTables">
            <summary>Maximum tables that can ever be used in parallel across stages.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.Stages">
            <summary>Per-stage breakdown.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.Warnings">
            <summary>Advisory warnings.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.SchemaSummary">
            <summary>Readable one-line schema summary.</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.From(TTAR.Tournaments.TournamentEstimate)">
            <summary>Maps a legacy flat estimate to a response (the four aggregates only).</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.TournamentCalculatorResponse.From(TTAR.Tournaments.SchemaEstimate)">
            <summary>Maps a full schema estimate to a response.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.TournamentCalculatorSchemaRequest">
            <summary>
            Request body for the schema-based calculator (POST /tournaments/calculator). Carries the nested
            <see cref="T:TTAR.Tournaments.TournamentSchema"/> so the server can reproduce the client's <c>calcSchema</c> preview exactly.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorSchemaRequest.ParticipantCount">
            <summary>Number of participants (2–255).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorSchemaRequest.TablesCount">
            <summary>Number of tables available (1–50).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorSchemaRequest.TargetDurationMinutes">
            <summary>Target tournament duration in minutes for the table recommendation.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorSchemaRequest.Schema">
            <summary>The configurable schema to estimate. When null, a default RoundRobin schema is used.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalculatorSchemaRequest.StartTime">
            <summary>Optional start time; when set, the response includes a projected finish time.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.TournamentCalendarResponse">
            <summary>
            The tournament as an event of the caller's calendar (<c>GET /tournaments/{id}/calendar</c>): the card the client
            shows and the ready links. The same event as a file is <c>GET /tournaments/{id}/calendar.ics</c>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.Uid">
            <summary>Event UID, <c>tour-{tournamentId}-{playerId}@ttar.app</c>: re-adding the event replaces it.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.Sequence">
            <summary>The tournament's data version — the <c>.ics</c> SEQUENCE. Grows on any change, not only of the time.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.Title">
            <summary>Event title — the tournament name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.StartUtc">
            <summary>Start (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.EndUtc">
            <summary>End (UTC): start plus <see cref="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.DurationMinutes"/>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.UtcOffsetMinutes">
            <summary>
            Minutes east of UTC the organizer entered the start in (as <c>TournamentResponse.startDateUtcOffsetMinutes</c>),
            for showing the club's wall-clock time; null when unknown.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.TimeZoneId">
            <summary>IANA time zone of the linked venue; null when no venue is linked or it has no zone.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.DurationMinutes">
            <summary>Event length: the calculated duration rounded up to 30 minutes, or 120 when it can't be calculated.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.DurationCalculated">
            <summary>True when <see cref="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.DurationMinutes"/> comes from the schema calculator, false for the default.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.DurationNote">
            <summary>Localized basis of the duration with its prefix, e.g. "estimated: Round robin, players: up to 8, tables: 2".</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.PlaceName">
            <summary>Venue name; null without a linked venue.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.PlaceAddress">
            <summary>Venue address line, else the tournament's free-text place; null when the place is not known.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.Location">
            <summary>Place name and address in one line (the event's LOCATION); null when the place is not known.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.Latitude">
            <summary>
            Latitude of the linked venue (WGS 84), for a precise place in the device calendar (iOS
            <c>EKStructuredLocation</c>); null without a linked venue or its point. The <c>.ics</c> carries it as GEO.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.Longitude">
            <summary>Longitude of the linked venue (WGS 84); null whenever <see cref="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.Latitude"/> is.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.Description">
            <summary>Localized event description; lines are separated by <c>\n</c>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.Url">
            <summary>Short link to the tournament's web page.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.PhoneUrl">
            <summary><see cref="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.Url"/> that opens the "add to calendar" step (<c>?cal=1</c>) — the QR code target.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.GoogleUrl">
            <summary>Google Calendar "add event" link.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentCalendarResponse.OutlookUrl">
            <summary>Outlook.com "add event" link.</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.TournamentCalendarResponse.From(TTAR.Tournaments.Calendar.TournamentCalendarEvent)">
            <summary>Maps the built calendar event.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.TournamentMatchResponse">
            <summary>
            Tournament match info
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Id">
            <summary>Match record ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.TournamentId">
            <summary>Tournament this match belongs to.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant1Id">
            <summary>Participant 1 ID, or null if the slot is empty (bracket slot pending, or a bye's empty side).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant1PlayerId">
            <summary>Player record ID of participant 1, or null if the slot is empty.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant1Name">
            <summary>Display name of participant 1, or empty if the slot is empty.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant1AvatarPath">
            <summary>Relative path to participant 1 avatar, or null if not set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant2Id">
            <summary>Participant 2 ID, or null if the slot is empty (bracket slot pending, or a bye's empty side).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant2PlayerId">
            <summary>Player record ID of participant 2, or null if the slot is empty.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant2Name">
            <summary>Display name of participant 2, or empty if the slot is empty.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant2AvatarPath">
            <summary>Relative path to participant 2 avatar, or null if not set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Round">
            <summary>Round number, if applicable.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.GroupNumber">
            <summary>
            1-based group number for a group-stage match, or null for non-group matches (bracket / final / ungrouped
            formats). Decoded from the group-stage <see cref="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Round"/> tag; use it to bucket matches into per-group
            protocols on the client.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.RoundWithinGroup">
            <summary>
            1-based round (tour) number WITHIN the group for a group-stage match, or null for non-group matches.
            Decoded from the group-stage <see cref="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Round"/> tag (which is stored encoded/negative); use it to order
            matches by tour inside a group's protocol without decoding <see cref="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Round"/> on the client.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Bracket">
            <summary>Which sub-bracket this match belongs to (upper / lower / third-place / final).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.PlaceAwarded">
            <summary>The place this match awards its winner (place-fixing matches), or null.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.NextMatchId">
            <summary>Bracket link: the next-round match the WINNER advances to, or null (final / non-bracket).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.NextMatchSlot">
            <summary>Which slot of <see cref="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.NextMatchId"/> the winner fills (1 or 2), or null.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.LoserNextMatchId">
            <summary>Consolation link: the lower-bracket match the LOSER drops into, or null.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.LoserNextMatchSlot">
            <summary>Which slot of <see cref="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.LoserNextMatchId"/> the loser fills (1 or 2), or null.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.TableNumber">
            <summary>Table number the match is played on.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Status">
            <summary>Current match status.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.SetsToWin">
            <summary>
            Sets-to-win for this match (best-of = 2*SetsToWin-1), snapshotted at generation from the tournament
            schema by stage — group matches carry the groups value, bracket / final matches the bracket value.
            Prefer this over the tournament-level SetsInMatch when rendering a match. Null only for matches
            generated before per-match sets existed; fall back to the tournament's SetsInMatch in that case.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Score1">
            <summary>Score of participant 1.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Score2">
            <summary>Score of participant 2.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.IsWalkover">
            <summary>Whether the result was recorded as a walkover.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.WalkoverWinnerId">
            <summary>ID of the walkover winner, if applicable.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.GameId">
            <summary>Linked game record ID, if applicable.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant1RatingBefore">
            <summary>
            Participant 1's rating BEFORE this match, from the linked game's snapshot. Null for a walkover / a match not
            yet registered as a rated game. The finish page shows "after = before + delta"; delta is <see cref="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant1RatingDelta"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant1RatingDelta">
            <summary>
            Participant 1's rating change from this match (signed: win &gt; 0, loss &lt; 0), from the linked game.
            Null for a walkover / an unregistered match. A no-show contributes 0 via the walkover path (no game).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant2RatingBefore">
            <summary>Participant 2's rating BEFORE this match (see <see cref="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant1RatingBefore"/>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant2RatingDelta">
            <summary>Participant 2's rating change from this match (see <see cref="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant1RatingDelta"/>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant1RatingNotApplied">
            <summary>
            Participant 1's figures belong to a guest since merged into this player without recalculation: the match did
            not move the player's rating (show "без пересчёта"), and its score can no longer be corrected.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant2RatingNotApplied">
            <summary>Participant 2's side, see <see cref="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.Participant1RatingNotApplied"/>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.SubmittedByParticipantId">
            <summary>Participant ID of the player who submitted the score. Null until score is submitted.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.SubmitDate">
            <summary>
            When the current score was submitted (two-player confirm mode). The opponent's confirmation window runs
            from here; re-submitting a score moves this forward and restarts the window. Null until a score is submitted.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.ConfirmDeadline">
            <summary>
            Deadline for the opponent to confirm a submitted score before it is auto-confirmed
            (<see cref="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.SubmitDate"/> + 5 min). Only set for a match awaiting confirmation (InProgress); null otherwise.
            The client shows the countdown from here; the value moves whenever the score is re-submitted.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.ConfirmedBySystem">
            <summary>
            True when the result was auto-confirmed by the confirmation-timeout timer rather than by the opponent or an
            organizer (the opponent went silent). Lets the UI badge the result as auto-accepted.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.ScheduledAt">
            <summary>Scheduled start time of the match.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.CalledAt">
            <summary>When players were called to the table.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.StartedAt">
            <summary>When the match was confirmed as started.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.EndedAt">
            <summary>When the match ended (before score submission).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.CallAttempts">
            <summary>Number of times players were called.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.ConfirmDate">
            <summary>Date and time the result was confirmed.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.AffectsPlacement">
            <summary>
            For an OPEN match in an Active tournament being finished early: whether its outcome can still change
            some final place. Only set for the bracket family (where "affects" is crisp — the match still reaches
            a place-awarding node); null for round-robin matches and for any match with no verdict (the client
            then shows no "affects places / place decided" badge). Populated at the tournament level, not by the
            per-match <see cref="M:TTAR.API.Models.Tournaments.TournamentMatchResponse.From(TTAR.DataProviders.Models.TournamentMatchModel)"/> which lacks the bracket graph.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentMatchResponse.IsCarryOver">
            <summary>
            True when this is a group-stage match whose result is <em>carried over</em> into a round-robin final
            (the pair was not replayed in the final; the group result counts toward the final standings directly).
            Populated at the tournament level by the <c>GetMatches</c> endpoint; false by default on the per-match
            <see cref="M:TTAR.API.Models.Tournaments.TournamentMatchResponse.From(TTAR.DataProviders.Models.TournamentMatchModel)"/> path which lacks the schema context.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.TournamentMatchResponse.From(TTAR.DataProviders.Models.TournamentMatchModel)">
            <summary>Maps a match model to a response.</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.TournamentMatchResponse.MapRatingsToSlots(TTAR.DataProviders.Models.TournamentMatchModel)">
            <summary>
            Reads the linked game's per-hand rating snapshot and aligns it to the two participant slots by PlayerId
            (the game's hand order is independent of the match's slot order). Returns all-null when there is no rated
            game (walkover, or a one-day match not yet registered at finish). Requires the game's PlayerHands loaded.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.TournamentQueueResponse">
            <summary>
            The fully computed state of a tournament's tables and waiting queue at the moment of the request:
            which live match sits on each table, which pair is recommended for each free table, and the ordered
            call queue. The order IS the call priority (the shared fairness ranking — group balance, then
            matches-played, then rest) — clients render it as-is and must not re-sort. Built server-side by
            <see cref="T:TTAR.Tournaments.TableQueuePlanner"/> so the queue is a single, unambiguous invariant shared across all
            organizers and clients, and identical to the order the bot auto-calls pairs in.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentQueueResponse.Version">
            <summary>
            Revision counter of the tournament at the moment this snapshot was built (see
            <see cref="P:TTAR.API.Models.Tournaments.TournamentResponse.Version"/>). The same value comes back from <c>GET /tournaments/{id}</c>
            and rides the SignalR signal, letting the client keep matches and queue as one consistent state.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentQueueResponse.TablesCount">
            <summary>
            Total number of tables (capacity), as set by set-tables-count. The <see cref="P:TTAR.API.Models.Tournaments.TournamentQueueResponse.Tables"/> list can be
            LONGER than this if a live match sits on a table number above the current capacity (possible right
            after a shrink) — such a table is still shown.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentQueueResponse.Tables">
            <summary>State of each physical table, in table-number order (1..N).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentQueueResponse.Queue">
            <summary>
            Ordered queue of waiting pairs (Scheduled, both sides drawn), in fairness order: least-COMPLETE group
            first by progress (load/size, so uneven groups stay interleaved), then fewest matches played by the pair,
            then longest rested. <see cref="P:TTAR.API.Models.Tournaments.QueueEntry.IsReady"/> is a display flag, NOT the sort key — a pair blocked by a
            busy player keeps its fair position (marked not ready) rather than sinking to the bottom. The client
            renders it as-is and does NOT re-sort.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.TournamentQueueResponse.From(TTAR.DataProviders.Models.TournamentModel,System.DateTime)">
            <summary>
            Builds the queue snapshot from a fully-loaded tournament (participants + matches). Delegates the
            ordering to <see cref="T:TTAR.Tournaments.TableQueuePlanner"/> so the on-screen queue matches the bot's call order exactly
            (the shared fairness ranking). <paramref name="now"/> feeds the rest-time key; it cancels out between
            any two pairs, so a ticking clock never reorders the rendered list.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.QueueTable">
            <summary>State of one physical table: the live match on it (if any) and the recommended next pair.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueTable.TableNumber">
            <summary>1-based table number.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueTable.CurrentMatch">
            <summary>Match currently on the table (Called / Active / InProgress), or null when the table is free.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueTable.NextInQueue">
            <summary>
            Which pair to call onto this table if it is free. Populated ONLY when <see cref="P:TTAR.API.Models.Tournaments.QueueTable.CurrentMatch"/> is
            null AND a ready pair is available; otherwise null.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.QueueEntry">
            <summary>One row of the waiting queue: a Scheduled pair, its readiness, and who blocks it if not ready.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueEntry.Match">
            <summary>The waiting match.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueEntry.IsReady">
            <summary>True when both participants are idle (not in a live match) and the pair can be called now.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueEntry.BlockedBy">
            <summary>
            When <see cref="P:TTAR.API.Models.Tournaments.QueueEntry.IsReady"/> is false — this pair's participant(s) currently busy in another live match.
            Empty when the pair is ready. The client shows "waiting: {name}".
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.QueueBlocker">
            <summary>A participant of a queued pair who is currently busy elsewhere, blocking the pair's call.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueBlocker.ParticipantId">
            <summary>Participant id that is busy in another live match.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueBlocker.Name">
            <summary>Display name of the busy participant.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.QueueMatch">
            <summary>
            Compact match slice for the queue / table board — only the fields a queue row needs to render. Mirrors the
            relevant subset of <see cref="T:TTAR.API.Models.Tournaments.TournamentMatchResponse"/> (names, weak-hand tags, group/round context).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.MatchId">
            <summary>Match record id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.Status">
            <summary>Current match status.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.TableNumber">
            <summary>Table number the match is on, or null while queued.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.Round">
            <summary>Round number (may be a negative group-stage tag), or null.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.GroupNumber">
            <summary>1-based group number for a group-stage match, or null for non-group matches.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.RoundWithinGroup">
            <summary>1-based round (tour) within the group for a group-stage match, or null otherwise.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.CallAttempts">
            <summary>Number of times the pair has been called to a table (recall counter for the UI).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.Participant1Id">
            <summary>Participant 1 id, or null if the slot is empty.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.Participant1Name">
            <summary>Display name of participant 1, or empty if the slot is empty.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.Participant1AvatarPath">
            <summary>Relative path to participant 1 avatar, or null if not set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.Participant1WeakHand">
            <summary>True when participant 1 is registered on their weak (left) hand — a tag in the UI.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.Participant2Id">
            <summary>Participant 2 id, or null if the slot is empty.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.Participant2Name">
            <summary>Display name of participant 2, or empty if the slot is empty.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.Participant2AvatarPath">
            <summary>Relative path to participant 2 avatar, or null if not set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.QueueMatch.Participant2WeakHand">
            <summary>True when participant 2 is registered on their weak (left) hand — a tag in the UI.</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.QueueMatch.From(TTAR.DataProviders.Models.TournamentMatchModel)">
            <summary>Maps a match model to a compact queue entry (mirrors TournamentMatchResponse.From conventions).</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.MyNextMatchSummary">
            <summary>
            Brief info about the current player's nearest upcoming match in an active tournament.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.MyNextMatchSummary.Id">
            <summary>Match ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.MyNextMatchSummary.Status">
            <summary>Current match status.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.MyNextMatchSummary.TableNumber">
            <summary>Table number the match is assigned to, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.MyNextMatchSummary.OpponentName">
            <summary>Display name of the opponent, or empty if not yet determined.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.MyNextMatchSummary.OpponentParticipantId">
            <summary>Opponent participant ID, or null if the opponent is not yet determined (bracket slot pending).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.MyNextMatchSummary.SubmittedByMe">
            <summary>
            Whether the caller submitted this match's score and waits for the opponent ("ждёт соперника" instead of
            "Подтвердите счёт"). Always false unless <see cref="P:TTAR.API.Models.Tournaments.MyNextMatchSummary.Status"/> is InProgress.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.TournamentResponse">
            <summary>
            Full tournament info
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Id">
            <summary>Tournament ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Name">
            <summary>Tournament name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Description">
            <summary>Optional description.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Status">
            <summary>Current tournament status.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.TournamentType">
            <summary>Tournament format type. Null until the format is chosen (v4 "decide at start").</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Plan">
            <summary>Reference plan (calculator-only schema chosen at creation). Null when not set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Schema">
            <summary>Final battle schema fixed at start; drives schedule rendering. Null before start.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.LongRounds">
            <summary>
            ConsolationMixed only: number of trailing pre-final upper rounds following long rules. Null otherwise.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.IsOneDayFormat">
            <summary>Whether the tournament is completed in a single day.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.SetsInMatch">
            <summary>Number of sets per match.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.StartDate">
            <summary>Scheduled start date (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.StartDateUtcOffsetMinutes">
            <summary>
            Minutes east of UTC the organizer entered <see cref="P:TTAR.API.Models.Tournaments.TournamentResponse.StartDate"/> in (e.g. +240 for GMT+4), or null when
            the offset is unknown. Lets clients render the organizer's local start time even without the organizer's
            time zone (matching what Telegram announcements show).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.RegistrationDeadline">
            <summary>Registration deadline.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.PlaceAddress">
            <summary>Free-text venue address (fallback when no structured venue is linked).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.VenueId">
            <summary>Linked structured venue id, or null.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.VenueName">
            <summary>Linked venue's display name, if a venue is linked.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.ChatId">
            <summary>Telegram chat ID linked to the tournament.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.ChatName">
            <summary>Display name of the linked chat, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.ChatLink">
            <summary>Public link or invite link of the linked chat, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.AnnounceTopicId">
            <summary>Where the announcement and results go: null — by the chat's settings; a value — the tournament's own topic (General is 1).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.AnnounceRepostAfterMessages">
            <summary>The announcement is reposted after this many chat messages; null — no reposts.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.AnnounceRepostAfterHours">
            <summary>…or this many hours after it was posted, if someone wrote after it; null — no time trigger.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.DistanceMeters">
            <summary>
            Approximate distance from the provided geo coordinates to this tournament's location, in meters,
            rounded to GeoSearchPrecisionInMeters. Null when no geo was supplied or the tournament has no known location.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.OrganizerId">
            <summary>Organizer player ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.OrganizerName">
            <summary>Display name of the organizer.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Access">
            <summary>
            Who may join: Open (anyone self-registers) or Invite (closed — the organizer builds the roster, self-
            registration is refused with 403 InviteOnlyTournament). Invite forces the rating window off.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.MinRating">
            <summary>Minimum player rating required to participate.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.MaxRating">
            <summary>Maximum player rating allowed to participate.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.OnlyRated">
            <summary>Only rated players can participate.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.OnlyChatMembers">
            <summary>Only members of the linked chat can participate.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.MinParticipants">
            <summary>Minimum number of participants.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.MaxParticipants">
            <summary>Maximum number of participants.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.EntryFeeNote">
            <summary>Optional note: participation cost and other conditions; null when not set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Recap">
            <summary>
            Organizer's free-text summary of a finished tournament (2–3 paragraphs, blank-line separated). Null when
            not written. Editable by the organizer / co-organizers via PATCH .../recap while the tournament is Finished.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.ResultInputMode">
            <summary>Controls who is allowed to submit match results.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.AllowSelfScheduledScores">
            <summary>
            When true, participants may submit a match score without the pair being called to a table first
            (async formats such as League). The UI uses this to offer out-of-turn score entry.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.TablesCount">
            <summary>Number of tables used in the tournament.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.AutoCallEnabled">
            <summary>
            When true, a freed table automatically calls the next ready pair onto it; when false, the organizer calls
            the next pair manually. Editable via <c>PUT /tournaments/{id}</c> (<c>autoCallEnabled</c>); turning it on
            immediately fills the free tables.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.WalkoverScore">
            <summary>Score string assigned for walkovers.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.CreatedAt">
            <summary>Date and time the tournament was created.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.UpdatedAt">
            <summary>Date and time of the last update.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.ResultsPublishedAt">
            <summary>
            When the tournament's results were published (it was moved to Finished). Null until finished. The finish
            page shows "Итоги опубликованы …" from it; unlike <see cref="P:TTAR.API.Models.Tournaments.TournamentResponse.UpdatedAt"/> a later edit does not change it.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Version">
            <summary>
            Monotonically increasing revision counter for this tournament, bumped on every change that affects
            the tables/queue state (call, move, unassign, score, set-tables-count, registration/withdrawal).
            The same value is returned by <c>GET /tournaments/{id}/queue</c> and carried in the SignalR signal,
            so a client can treat matches and queue as one consistent snapshot and drop stale refreshes.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.CanFinishEarly">
            <summary>
            True when the tournament is Active with open matches remaining, yet the top-three podium is already
            mathematically decided — so it may be finished EARLY (the same rule <c>POST /finish</c> enforces).
            The client uses this to turn the finish button green and show the "podium decided" note without
            re-deriving the rule; false whenever there are no open matches (a normal finish) or the podium is
            still contestable. See <see cref="M:TTAR.Tournaments.PodiumLock.IsPodiumDecided(TTAR.DataProviders.Models.TournamentModel)"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.FormatEditScope">
            <summary>
            How much of a RUNNING tournament's format <c>PUT /tournaments/{id}/format</c> may still replace, decided by
            what has been played: <c>Full</c> — nothing played, the whole format; <c>SecondStage</c> — group matches
            played, the finals only; <c>None</c> — second-stage (or single-stage) matches played, only the sets-to-win
            of unplayed matches. Pairs merely called to a table lock nothing. <c>None</c> whenever the tournament is not
            Active (before start the plan is edited through <c>PUT /tournaments/{id}</c>). See Docs/Tournaments/format-change.md.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.CoOrganizers">
            <summary>
            Co-organizers running the tournament alongside the organizer, each with its own finish right. Empty when
            the organizer runs it alone. The organizer (<see cref="P:TTAR.API.Models.Tournaments.TournamentResponse.OrganizerId"/>) is never listed here.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Participants">
            <summary>List of registered participants (active roster: excludes removed and declined players).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.DeclinedParticipants">
            <summary>
            Players who declined an invitation to a closed tournament ("Отказались" block). MANAGER-ONLY: populated only
            when the caller is the organizer / a co-organizer / an admin; empty for everyone else. Not in the active
            roster (no counts, seeding or limit). Each carries its <c>DeclinedAt</c>. See CHANGE_closed_tournaments.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Waitlist">
            <summary>
            Players waiting for a seat ("Запас" block), in queue order. PUBLIC — everyone who sees the tournament sees who
            waits. Not in the active roster (no counts, seeding or limit). Emptied when the tournament starts, is cancelled
            or becomes closed. <see cref="P:TTAR.API.Models.Tournaments.WaitlistEntryResponse.ContactPhone"/> goes to managers (and the player) only.
            See CHANGE_waitlist.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.YourWaitlistPosition">
            <summary>The caller's 1-based place in <see cref="P:TTAR.API.Models.Tournaments.TournamentResponse.Waitlist"/>, or null when they are not in it (or anonymous).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.GuestLinkWindow">
            <summary>
            When a guest of this tournament may still be linked to a TTAR profile: until the finish and 7 more days. See
            Docs/Tournaments/guest-link.md.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.GuestLinkRequests">
            <summary>
            Players' "this guest is me" requests, any status, oldest first: all of them for the organizer (or an admin) —
            co-organizers do not decide guest links — and only the caller's own for anyone else.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Matches">
            <summary>List of tournament matches. Always empty for a ladder (see <see cref="P:TTAR.API.Models.Tournaments.TournamentResponse.LadderGames"/>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Ladder">
            <summary>The ladder's rules and timeline; null for an ordinary tournament.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.LadderGames">
            <summary>A ladder's recorded games, newest first; empty for an ordinary tournament.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.LadderPairs">
            <summary>
            A ladder's pairs (two participants with any record against each other): their score, what still waits and
            their registration for rating. Empty for an ordinary tournament.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Queue">
            <summary>
            The live table board + call queue, folded into this response when the caller passed <c>includeQueue=true</c>
            (an Active tournament only). Null when not requested, or requested for a non-Active tournament. Same shape as
            <c>GET /tournaments/{id}/queue</c>, so a client that receives it here can skip that extra round-trip.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentResponse.Standings">
            <summary>
            The current/final standings, folded into this response when the caller passed <c>includeStandings=true</c>
            (Active / Finished / cancelled-with-matches only). Null when not requested, or requested for a status that
            has no standings. Same shape as <c>GET /tournaments/{id}/standings</c>, so the client can skip that round-trip.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.TournamentResponse.From(TTAR.DataProviders.Models.TournamentModel,System.Int32,System.Boolean,System.Nullable{System.Int32},System.Int32,System.Boolean,TTAR.API.Models.Tournaments.TournamentQueueResponse,System.Collections.Generic.List{TTAR.API.Models.Tournaments.TournamentStandingEntry},System.Nullable{System.Double},System.Boolean,System.Nullable{System.DateTime})">
            <summary>Maps a tournament model to a full response.</summary>
            <param name="m">The tournament to map.</param>
            <param name="geoPrecision">Distance-blurring precision in meters.</param>
            <param name="includeRttfPii">
            Whether the caller may see participant RTTF PII (a manager or a confirmed participant of this tournament).
            Pass <c>false</c> for outside viewers and anonymous callers — it ANDs with each row's own confirmation.
            </param>
            <param name="currentYear">Current UTC year (from the injected TimeProvider), used to hide a minor's birth year from others (§7). Null skips the check.</param>
            <param name="callerId">Authenticated caller's player id (0 when anonymous); their own participant row keeps its birth year.</param>
            <param name="isAdmin">Whether the caller is an admin (admins keep seeing a minor's birth year).</param>
            <param name="queue">Optional pre-computed queue snapshot to fold into the response (see <see cref="P:TTAR.API.Models.Tournaments.TournamentResponse.Queue"/>). The endpoint gates it by status/flag and computes it from this same loaded model.</param>
            <param name="standings">Optional pre-computed standings to fold into the response (see <see cref="P:TTAR.API.Models.Tournaments.TournamentResponse.Standings"/>). Gated and computed by the endpoint from this same loaded model.</param>
            <param name="distanceMetersOverride">
            Raw distance (meters) to use instead of <c>m.DistanceMeters</c>. The detail endpoint caches the tournament
            graph WITHOUT a geo point (shared across callers), so it must not write distance onto the shared model —
            it passes the per-caller distance here instead. Null falls back to the model's own value.
            </param>
            <param name="canManage">
            Whether the caller is a manager (organizer / co-organizer / admin). Gates the manager-only
            <see cref="P:TTAR.API.Models.Tournaments.TournamentResponse.DeclinedParticipants"/> list — false leaves it empty. Others must never see who declined. Also gates
            the participants' <see cref="P:TTAR.API.Models.Tournaments.ParticipantResponse.ContactPhone"/>.
            </param>
            <param name="now">The current UTC time (from the injected TimeProvider) for <see cref="P:TTAR.API.Models.Tournaments.TournamentResponse.GuestLinkWindow"/>; null — the system clock.</param>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.TournamentResponse.BlurDistance(System.Nullable{System.Double},System.Int32)">
            <summary>
            Blurs a raw distance (meters, computed in MySQL by the repository) down to the configured precision so
            the exact venue location is never leaked. Shared by both response shapes. Returns null when no distance
            is available. A non-positive precision is treated as 1 so a misconfiguration cannot divide by zero.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.TournamentListItem">
            <summary>
            Summary tournament info for list endpoints
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.Id">
            <summary>Tournament ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.Name">
            <summary>Tournament name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.Status">
            <summary>Current tournament status.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.TournamentType">
            <summary>Tournament format type. Null until the format is chosen (v4 "decide at start").</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.Access">
            <summary>Access mode: Open or Invite (closed). Drives the lock badge next to the status on the card.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.IsOneDayFormat">
            <summary>Whether the tournament is completed in a single day.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.StartDate">
            <summary>Scheduled start date (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.StartDateUtcOffsetMinutes">
            <summary>
            Minutes east of UTC the organizer entered <see cref="P:TTAR.API.Models.Tournaments.TournamentListItem.StartDate"/> in, or null when unknown. Lets clients
            render the organizer's local start time even without the organizer's time zone.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.PlaceAddress">
            <summary>Free-text venue address.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.ChatName">
            <summary>Display name of the linked chat, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.ChatLink">
            <summary>Public link or invite link of the linked chat, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.OrganizerId">
            <summary>Organizer player ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.OrganizerName">
            <summary>Display name of the organizer.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.ParticipantCount">
            <summary>Number of active participants.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.HadParticipants">
            <summary>
            Whether the tournament ever had at least one participant, counting those later removed. Lets clients
            reliably hide truly empty Cancelled tournaments without guessing from ParticipantCount (which excludes
            removed participants and so reads 0 for a tournament that was cancelled after everyone left).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.AmIRegistered">
            <summary>Whether the current authenticated player is registered in this tournament. Null for anonymous requests.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.MyParticipationUnconfirmed">
            <summary>
            Whether the tournament waits for the caller to confirm participation ("Подтвердите участие" instead of
            "Вы участвуете"): an invitation, or a confirmation reset after the date/place/fee changed. Counted in the
            tournaments menu badge by the same rule. False for anonymous requests and for the organizer.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.AmICoOrganizer">
            <summary>
            Whether the current authenticated player is a co-organizer of this tournament (drives the "you are a
            co-organizer" list badge). Null for anonymous requests.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.CoOrganizerCount">
            <summary>Number of co-organizers of this tournament (0 when the organizer runs it alone).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.WaitlistCount">
            <summary>Number of players waiting for a seat ("запас N"). Not included in <see cref="P:TTAR.API.Models.Tournaments.TournamentListItem.ParticipantCount"/>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.YourWaitlistPosition">
            <summary>
            The caller's 1-based place in the waitlist ("В запасе · 3-й"), or null when they are not in it (or anonymous).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.MyNextMatch">
            <summary>
            Nearest upcoming match for the current player in this active tournament.
            Non-null only when Status=Active and AmIRegistered=true.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.DistanceMeters">
            <summary>
            Approximate distance from the provided geo coordinates to this tournament's location, in meters,
            rounded to GeoSearchPrecisionInMeters. Null when no geo was supplied or the tournament has no known location.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.MinRating">
            <summary>Minimum player rating required to participate. Null when the tournament is open.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.MaxRating">
            <summary>Maximum player rating allowed to participate. Null when the tournament is open.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.MaxParticipants">
            <summary>Maximum number of participants (the registration cap), or null when uncapped.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.CreatedAt">
            <summary>Date and time the tournament was created.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.Ladder">
            <summary>A ladder's games for the card ("N игр · в рейтинге M · ждут K", "ждут вас"); null for an ordinary tournament.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.PendingGuestLinkRequests">
            <summary>
            Pending guest-link requests waiting for the caller as the organizer ("N заявки на привязку"); 0 for anyone else.
            The same requests the tournaments menu badge counts.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentListItem.PendingScoreConfirmations">
            <summary>
            Matches of an active (non-ladder) tournament whose submitted score awaits confirmation, for the caller as
            the organizer or a co-organizer ("На подтверждении N матчей" on the card); 0 for anyone else.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.TournamentListItem.From(TTAR.DataProviders.Models.TournamentModel,System.Int32,System.Int32)">
            <summary>Maps a tournament model to a list item.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.TournamentsPageResponse">
            <summary>
            Paginated list of tournaments
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.TournamentsPageResponse.#ctor(System.Collections.Generic.List{TTAR.API.Models.Tournaments.TournamentListItem},TTAR.Pagination.PageInfo)">
            <summary>
            Paginated list of tournaments
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentsPageResponse.Items">
            <summary>Tournament list items for the current page.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentsPageResponse.PageInfo">
            <summary>Pagination metadata.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.TournamentStandingEntry">
            <summary>
            A single row of the tournament standings table. The standings endpoint returns a FLAT list with EXACTLY ONE
            entry per player — render it directly as the "положение в турнире" table, no deduping or bucketing needed.
            <see cref="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.Place"/> is the player's overall tournament place and <see cref="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.Stage"/> only says how it was
            decided (Bracket for a knockout, Single for round-robin/league, Groups for a grouped tournament that is still
            in its group phase). <see cref="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.GroupNumber"/> is always null here (the flat table is never split by group).
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.TournamentStandingEntry.From(TTAR.Tournaments.TournamentStandingEntry)">
            <summary>
            Maps a tournament standing entry from the core library to an API response model.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.Stage">
            <summary>
            How this player's place was decided, purely informational for the client:
            <see cref="F:TTAR.Types.TournamentStage.Bracket"/> for a knockout / consolation (place read off the bracket),
            <see cref="F:TTAR.Types.TournamentStage.Single"/> for round-robin / league (ranked by points), and
            <see cref="F:TTAR.Types.TournamentStage.Groups"/> for a grouped tournament that is STILL in its group phase (the bracket
            has not been generated yet, so the table is the current group-play snapshot). It never changes the "one row
            per player" shape.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.GroupNumber">
            <summary>
            Always null. The standings table is a single flat list and is never bucketed by group; the field is kept
            for backward compatibility of the response shape.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.Place">
            <summary>The player's overall tournament place (1-based).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.PlayerId">
            <summary>Player record ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.PlayerName">
            <summary>Display name of the player.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.AvatarPath">
            <summary>Relative path to the player's avatar image, or null if not set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.Wins">
            <summary>Number of matches won (excluding walkovers), across every stage the player took part in.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.Losses">
            <summary>Number of matches lost (excluding walkovers), across every stage the player took part in.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.SetsWon">
            <summary>Total sets won, across all completed matches.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.SetsLost">
            <summary>Total sets lost, across all completed matches (mirrors <see cref="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.SetsWon"/>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.PointsWon">
            <summary>
            DEPRECATED. Balls-in-set are not stored, so this is always 0. Kept only to preserve the response contract
            during the deprecation window (the field is still <c>required</c> in swagger); it will be removed once the
            generated client no longer expects it. Do not read it — the standings tie-break no longer uses balls.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.PointsLost">
            <summary>DEPRECATED. Always 0 (see <see cref="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.PointsWon"/>); slated for removal after the client is regenerated.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.WalkoverWins">
            <summary>
            Number of walkover wins (counted in tournament standings, not Elo). A walkover with no set score still
            counts toward <see cref="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.Place"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentStandingEntry.RankingPoints">
            <summary>
            ITTF match points across all stages: win = 2, played loss = 1, walkover loss = 0 — the "Очки" column. For a bracket the place
            is decided by structure, not by these points, but they are still filled so the column is not blank.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.TournamentTemplateResponse">
            <summary>A tournament template: named create-form settings, personal or shared by a club.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.Id">
            <summary>Template ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.Name">
            <summary>The template's own name (the tournament name is <c>data.name</c>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.Scope">
            <summary>Personal — only the author sees it; Club — the owner and representatives of <see cref="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.VenueId"/>.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.VenueId">
            <summary>The club of a club template; null for a personal one.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.VenueName">
            <summary>Name of <see cref="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.VenueId"/>; null for a personal template.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.AuthorId">
            <summary>Player ID of whoever created the template.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.AuthorName">
            <summary>The author's display name (login if none).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.Kind">
            <summary>Which create form the template fills.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.Uses">
            <summary>How many times the template was applied to the create form.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.CreatedAt">
            <summary>When the template was created (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.UpdatedAt">
            <summary>When the template was last edited (UTC); the list is ordered by it, newest first.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.Data">
            <summary>The saved create-form settings, already normalized for <see cref="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.Kind"/> and <see cref="P:TTAR.API.Models.Tournaments.TournamentTemplateResponse.Scope"/>.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.CreateTournamentTemplateRequest">
            <summary>Saves the create form as a new template.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentTemplateRequest.Name">
            <summary>The template's name, 2–100 characters.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentTemplateRequest.Scope">
            <summary>Personal (default) or Club; fixed for the template's lifetime.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentTemplateRequest.VenueId">
            <summary>
            Required for a club template: a venue the caller owns or represents. The template is then always held there
            (<c>data.venueId</c> is forced to it, <c>data.placeAddress</c> cleared).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentTemplateRequest.Kind">
            <summary>Which create form the template fills; Standard by default.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.CreateTournamentTemplateRequest.Data">
            <summary>The create-form settings; fields that do not apply to <see cref="P:TTAR.API.Models.Tournaments.CreateTournamentTemplateRequest.Kind"/> are dropped on save.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.UpdateTournamentTemplateRequest">
            <summary>Renames a template and/or replaces its settings; omitted fields stay. The scope never changes (copy instead).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentTemplateRequest.Name">
            <summary>New name, 2–100 characters; null keeps the current one.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentTemplateRequest.Kind">
            <summary>New create-form kind; null keeps it. Changing it alone also reshapes the stored settings.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentTemplateRequest.Data">
            <summary>Replaces the whole settings object.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.UpdateParticipantRequest">
            <summary>
            Request to change a participant's rating hand (organizer/admin, before start).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateParticipantRequest.HandType">
            <summary>Rating hand to use for the participant.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.UpdateTournamentRequest">
            <summary>
            Request to update a tournament (only allowed before start)
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.Name">
            <summary>New tournament name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.Description">
            <summary>New description of the tournament.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.Status">
            <summary>New tournament status.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.Access">
            <summary>
            New access mode (open / invite). Only settable before start (Draft/Registration) — 409 on Active/Finished.
            Setting Invite drops the rating window. Not a critical field — never resets participant confirmations.
            Null leaves it unchanged. See CHANGE_closed_tournaments.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.SetsInMatch">
            <summary>New number of sets per match (1–7).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.StartDate">
            <summary>
            New scheduled start date. Critical field — changing it resets participant confirmations. Send an
            ISO-8601 value with the organizer's offset (e.g. "2026-07-24T11:00:00+04:00"); the instant is stored as
            UTC and the offset is kept so the local time can be shown in Telegram announcements.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.RegistrationDeadline">
            <summary>New registration deadline.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.PlaceAddress">
            <summary>
            New free-text venue address; an empty string clears it. The place when no structured <see cref="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.VenueId"/> is
            linked — then a change resets participant confirmations; under a venue it is only an annotation.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.VenueId">
            <summary>
            New structured-venue link. A positive value links (or re-links) the tournament to that venue; a value of
            <c>0</c> clears the link (back to the free-text <see cref="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.PlaceAddress"/> fallback); null leaves it
            unchanged. Re-linking to another venue resets participant confirmations; linking one to an address, or
            clearing the link while the address stays, does not.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.MinRating">
            <summary>New minimum player rating required to participate.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.MaxRating">
            <summary>New maximum player rating allowed to participate.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.OnlyRated">
            <summary>Restrict participation to rated players only.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.OnlyChatMembers">
            <summary>Restrict participation to members of the linked chat only.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.MinParticipants">
            <summary>New minimum number of participants (2–255).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.MaxParticipants">
            <summary>New maximum number of participants (2–255).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.EntryFeeNote">
            <summary>Optional note: participation cost and other conditions. Not a critical field — never resets confirmations. Null leaves it unchanged; "" (or blank) clears it.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.ResultInputMode">
            <summary>New result input mode controlling who submits match scores.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.AutoCallEnabled">
            <summary>
            New auto-call state: whether the server automatically calls the next ready pair onto a freed table (and
            pushes "you're called to table N"). Null leaves it unchanged. Turning it on immediately fills any free
            tables. Not a critical field — never resets participant confirmations.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.ChatId">
            <summary>
            New announce channel (internal <c>Chats.Id</c>): a positive value links (or re-links) the tournament to
            that chat; <c>0</c> unlinks; null leaves it unchanged. Not a critical field — never resets participant
            confirmations. A new chat, or a new own topic in the linked one, must be a chat the caller is active in, unless an
            admin (403 <c>ChatLinkForbidden</c>).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.AnnounceTopicId">
            <summary>
            Where the announcement and results go: <c>0</c> — back to the chat's settings, any other value — the tournament's
            own topic (a Telegram topic id; the General topic is 1); null leaves it unchanged, but a <see cref="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.ChatId"/>
            change resets it to the chat's settings. The server checks the bot can post into the own topic
            (400 <c>AnnounceTopicUnavailable</c>); a moved topic re-posts the announcement there. Not a critical field.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.AnnounceRepostAfterMessages">
            <summary>Repost the announcement after this many chat messages: <c>0</c> turns reposts off, null leaves it unchanged.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.AnnounceRepostAfterHours">
            <summary>Also repost after this many hours: <c>0</c> drops the time trigger, null leaves it unchanged.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.WalkoverScore">
            <summary>New walkover score string, e.g. "11:0".</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.Plan">
            <summary>
            New reference plan (calculator-only schema, edited in Draft). Null leaves the stored plan unchanged.
            Not a critical field — editing it never resets participant confirmations.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.CoOrganizers">
            <summary>
            Desired co-organizer roster (replace-semantics): null leaves the roster untouched (backward compatible),
            a list drives the roster to exactly that state — assign the newcomers, remove the ones no longer listed,
            flip <see cref="P:TTAR.API.Models.Tournaments.CoOrganizerEntry.CanFinish"/> on the rest. Same validation and cap (5) as the CRUD
            endpoint; an invalid element fails the whole edit with a 400 and the roster is not touched. Allowed on
            Draft / Registration / Active. Not a critical field — never resets participant confirmations.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.UpdateTournamentRequest.Ladder">
            <summary>
            Ladder rules (replace-semantics: all four at once; <c>autoStart</c> null — unchanged). Null leaves them unchanged.
            Before the start only; the
            auto-confirm period of a running or finished ladder changes via <c>PUT .../ladder/auto-confirm</c>. Refused
            (400 <c>TournamentTypeMismatch</c>) for an ordinary tournament.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.WaitlistEntryResponse">
            <summary>
            A player waiting for a seat in a full tournament ("запас"). Not a participant: not counted in the limit, the
            roster or seeding. The queue is public — everyone who sees the tournament sees who waits and in what order.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.WaitlistEntryResponse.Position">
            <summary>1-based place in the queue (order of joining).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.WaitlistEntryResponse.PlayerId">
            <summary>Player ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.WaitlistEntryResponse.PlayerName">
            <summary>Display name of the player.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.WaitlistEntryResponse.HandType">
            <summary>The rating hand the player chose when joining; the participant gets it on promotion.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.WaitlistEntryResponse.JoinedAt">
            <summary>When the player joined the queue (UTC). Kept when the player re-joins to change the hand.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.WaitlistEntryResponse.AvatarPath">
            <summary>Relative path to the player's avatar photo, or null.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.WaitlistEntryResponse.PlayerHand">
            <summary>Rating stats for the chosen hand. Null when hand data is not loaded or the player has no such hand yet.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.WaitlistEntryResponse.MainHand">
            <summary>The player's physical main hand (Left/Right), for the "left hand" badge. Null when never set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.WaitlistEntryResponse.ContactPhone">
            <summary>
            Phone for the organizers: present only for a manager (or the player themselves) — the phone typed in when
            joining, else the profile phone the player shares.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.WaitlistEntryResponse.Pair">
            <summary>
            Even-only ladder: the player waits for a pair, not for a seat — the roster has room, and they get in together
            with the next player who signs up. False in a full tournament's queue and everywhere else.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.WaitlistEntryResponse.ListFrom(System.Collections.Generic.IEnumerable{TTAR.DataProviders.Models.TournamentWaitlistEntryModel},System.Int32,System.Boolean,System.Nullable{System.Int32})">
            <summary>Maps the whole queue in order, numbering the positions.</summary>
            <param name="waitlist">The tournament's waitlist (with Player, Hands and Images loaded for full rows).</param>
            <param name="callerId">The authenticated caller's player id (0 when anonymous); their own row carries their phone.</param>
            <param name="includeContactPhone">Whether the caller manages the tournament and may see every phone.</param>
            <param name="pairSeats">Even-only ladder: the free seats of the roster — the entries ahead of them wait for a pair. Null otherwise.</param>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.WaitlistEntryResponse.From(TTAR.DataProviders.Models.TournamentWaitlistEntryModel,System.Int32,System.Int32,System.Boolean)">
            <summary>Maps one queue entry at a known position.</summary>
        </member>
        <member name="T:TTAR.API.Models.Tournaments.ZeroOrRangeAttribute">
            <summary>
            An optional edit value where 0 clears the setting and anything else must lie in [<paramref name="minimum"/>,
            <paramref name="maximum"/>]. Null (unchanged) is valid.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.ZeroOrRangeAttribute.#ctor(System.Int32,System.Int32)">
            <summary>
            An optional edit value where 0 clears the setting and anything else must lie in [<paramref name="minimum"/>,
            <paramref name="maximum"/>]. Null (unchanged) is valid.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ZeroOrRangeAttribute.Minimum">
            <summary>Lowest allowed non-zero value (inclusive).</summary>
        </member>
        <member name="P:TTAR.API.Models.Tournaments.ZeroOrRangeAttribute.Maximum">
            <summary>Highest allowed value (inclusive).</summary>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.ZeroOrRangeAttribute.IsValid(System.Object)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Models.Tournaments.ZeroOrRangeAttribute.FormatErrorMessage(System.String)">
            <inheritdoc/>
        </member>
        <member name="T:TTAR.API.Models.Venues.CreateVenueRequest">
            <summary>
            Request to create a venue. Only <see cref="P:TTAR.API.Models.Venues.CreateVenueRequest.Name"/> and a location (a point or a place) are required.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.Name">
            <summary>Venue name (required).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.ShortName">
            <summary>Short name for tight strings.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.Latitude">
            <summary>Latitude of the venue's point. Required together with <see cref="P:TTAR.API.Models.Venues.CreateVenueRequest.Longitude"/> unless a place is given.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.Longitude">
            <summary>Longitude of the venue's point.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.Place">
            <summary>Human-readable place as one line ("city, street"), an alternative to a point.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.OpeningHours">
            <summary>Opening hours (7 pipe-separated day strings, Mon..Sun; empty segment = closed).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.Phone">
            <summary>Phone number.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.Telegram">
            <summary>Telegram handle/link.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.Site">
            <summary>Web site.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.Description">
            <summary>Free-text description.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.TablesCount">
            <summary>Number of identical tables the venue lets (pool capacity).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.PricePerHour">
            <summary>Hourly price; null keeps the venue in the directory with booking off.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.ReservedRemainder">
            <summary>Non-bookable remainder (0..tablesCount−1).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.AutoConfirmBookings">
            <summary>Whether bookings auto-confirm (default true).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.TimeZone">
            <summary>IANA time zone of the venue.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.ClaimOwner">
            <summary>When true, also submits an ownership/representation claim in the same step.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.ClaimRole">
            <summary>Claim role (owner / representative), used only when <see cref="P:TTAR.API.Models.Venues.CreateVenueRequest.ClaimOwner"/> is true.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.ClaimContact">
            <summary>Optional contact for moderation, used only when <see cref="P:TTAR.API.Models.Venues.CreateVenueRequest.ClaimOwner"/> is true.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateVenueRequest.Source">
            <summary>The map card the fields were taken from (<c>source</c> of <c>POST /places/parse</c>), if any.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.ManagedVenueResponse">
            <summary>
            A venue the caller owns or represents, for the "my venues" strip: the card fields of <see cref="T:TTAR.API.Models.Venues.VenueListItem"/>
            plus what awaits the caller's decision there. The pending counts of all the caller's venues add up to the
            <c>clubs</c> menu badge (<c>GET /me/badges</c>).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ManagedVenueResponse.Id">
            <summary>Venue ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ManagedVenueResponse.Name">
            <summary>Venue name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ManagedVenueResponse.ShortName">
            <summary>Short name, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ManagedVenueResponse.Place">
            <summary>Human-readable place as one line ("city, street").</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ManagedVenueResponse.TablesCount">
            <summary>Number of tables (pool capacity).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ManagedVenueResponse.PricePerHour">
            <summary>Hourly price, or null when booking is off.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ManagedVenueResponse.BookingEnabled">
            <summary>Whether online booking is available (owner + price + pool mode).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ManagedVenueResponse.IsOwner">
            <summary>True when the caller owns the venue; false when they represent it.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ManagedVenueResponse.CanTopUpWallet">
            <summary>Whether the caller may top up a player's wallet here (same as <see cref="P:TTAR.API.Models.Venues.VenueResponse.CanTopUpWallet"/>).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ManagedVenueResponse.PendingBookings">
            <summary>
            Other players' Requested bookings not over yet: the rows of <c>GET /venues/{venueId}/venue-bookings</c>
            marked "awaits decision" for the caller. The caller's own booking is not counted.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ManagedVenueResponse.PendingRepresentativeClaims">
            <summary>Pending representative requests (<c>GET /venues/{venueId}/representative-claims</c>); always 0 for a representative.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.ManagedVenueResponse.From(TTAR.Venues.ManagedVenue,System.Boolean)">
            <summary>Maps a managed venue; <paramref name="canTopUpWallet"/> is the caller's right, computed by the service.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.UpdateVenueRequest">
            <summary>
            Request to edit a venue. Every field is optional; a null field is left unchanged. Owner/verification and the
            claim are set through their own endpoints, not here.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.Name">
            <summary>New name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.ShortName">
            <summary>New short name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.Latitude">
            <summary>New latitude (send together with <see cref="P:TTAR.API.Models.Venues.UpdateVenueRequest.Longitude"/> to move the point).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.Longitude">
            <summary>New longitude.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.Place">
            <summary>New place line ("city, street").</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.OpeningHours">
            <summary>New opening hours.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.Phone">
            <summary>New phone.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.Telegram">
            <summary>New Telegram handle/link.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.Site">
            <summary>New web site.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.Description">
            <summary>New description.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.TablesCount">
            <summary>New table count (pool capacity).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.PricePerHour">
            <summary>New hourly price; send 0 or a value to enable booking, or omit to leave unchanged.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.ReservedRemainder">
            <summary>New non-bookable remainder (0..tablesCount−1).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.AutoConfirmBookings">
            <summary>New auto-confirm toggle.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRequest.TimeZone">
            <summary>New IANA time zone.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueAnnouncementResponse">
            <summary>
            A venue announcement (info notice or a closing notice tied to an interval).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAnnouncementResponse.Id">
            <summary>Announcement ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAnnouncementResponse.Kind">
            <summary>Info or Closed.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAnnouncementResponse.Title">
            <summary>Title.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAnnouncementResponse.Text">
            <summary>Body text, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAnnouncementResponse.FromUtc">
            <summary>Start of the affected interval (UTC), for a closing announcement.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAnnouncementResponse.ToUtc">
            <summary>End of the affected interval (UTC), for a closing announcement.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAnnouncementResponse.AuthorUserId">
            <summary>Author player ID, if known.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAnnouncementResponse.BlocksBooking">
            <summary>Whether this announcement blocks bookings.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAnnouncementResponse.IsPinned">
            <summary>Whether the announcement is pinned.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAnnouncementResponse.CreatedAt">
            <summary>Creation timestamp.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueAnnouncementResponse.From(TTAR.DataProviders.Models.VenueAnnouncementModel)">
            <summary>Maps an announcement model to its response DTO.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueAvailabilityResponse">
            <summary>
            Per-hour availability for a venue over a requested date, in the venue's time zone (each slot's
            <see cref="P:TTAR.API.Models.Venues.VenueSlotResponse.Hour"/> is the UTC start of a 1-hour slot).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAvailabilityResponse.VenueId">
            <summary>Venue ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAvailabilityResponse.Date">
            <summary>The requested calendar date (venue-local).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAvailabilityResponse.TablesCount">
            <summary>Total tables in the pool.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAvailabilityResponse.ReservedRemainder">
            <summary>Non-bookable remainder kept for walk-ins.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueAvailabilityResponse.Slots">
            <summary>Per-hour slots.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueSlotResponse">
            <summary>
            Availability of one 1-hour slot: capacity, free, blocked, booked (DATA_API §1 poolAt).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueSlotResponse.Hour">
            <summary>Slot start (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueSlotResponse.Capacity">
            <summary>Bookable capacity that hour (tablesCount − blocked − reservedRemainder).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueSlotResponse.Free">
            <summary>Free bookable tables that hour (capacity − booked).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueSlotResponse.Blocked">
            <summary>Tables removed by tournaments and owner blocks that hour.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueSlotResponse.Booked">
            <summary>Tables taken by player bookings that hour.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueSlotResponse.From(TTAR.Venues.VenueSlotAvailability)">
            <summary>Maps a calculator slot to its response DTO.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueBookingResponse">
            <summary>
            A player booking (a pool seat, or several via a group). Reservations and blocks are not exposed here.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.Id">
            <summary>Booking ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.VenueId">
            <summary>Venue ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.TableId">
            <summary>Specific table id, or null for a pool seat (the usual case).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.Quantity">
            <summary>Number of tables this booking occupies.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.GroupId">
            <summary>Group id when several tables were booked in one action; null otherwise.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.FromUtc">
            <summary>Start (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.ToUtc">
            <summary>End (UTC).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.PlayerId">
            <summary>Booking player ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.Status">
            <summary>Booking lifecycle status.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.Amount">
            <summary>Amount held for this booking.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.CreatedAt">
            <summary>Creation timestamp.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.VenueName">
            <summary>Venue name. Populated only by the cross-venue "my bookings" endpoint; null on venue-scoped responses.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.VenueShortName">
            <summary>Venue short name, when set. Populated only by the cross-venue "my bookings" endpoint.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueBookingResponse.Player">
            <summary>
            The booking player. Populated only by the venue console (<c>GET /venues/{venueId}/venue-bookings</c>); null
            on the other responses, where the caller is the booker.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueBookingResponse.From(TTAR.DataProviders.Models.VenueBookingModel)">
            <summary>Maps a booking model to its response DTO.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueBookingResponse.FromWithVenue(TTAR.DataProviders.Models.VenueBookingModel)">
            <summary>
            Like <see cref="M:TTAR.API.Models.Venues.VenueBookingResponse.From(TTAR.DataProviders.Models.VenueBookingModel)"/> but also copies the loaded venue's name/short name — for the
            cross-venue "my bookings" endpoint, whose rows span venues and must show which venue each belongs to.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueBookingResponse.FromWithPlayer(TTAR.DataProviders.Models.VenueBookingModel)">
            <summary>
            Like <see cref="M:TTAR.API.Models.Venues.VenueBookingResponse.From(TTAR.DataProviders.Models.VenueBookingModel)"/> but also maps the loaded player (hands and images included) — for
            the venue console, whose rows are other players' bookings.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.ResolveVenueClaimRequest">
            <summary>
            Request to resolve a venue claim. On a reject, <see cref="P:TTAR.API.Models.Venues.ResolveVenueClaimRequest.ReasonCode"/> is required (one of the fixed set:
            not_verified · no_contact · owner_confirmed · venue_closed · other); owner_confirmed is valid only for a venue
            that has an owner, and other requires a non-empty <see cref="P:TTAR.API.Models.Venues.ResolveVenueClaimRequest.UserMessage"/>.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ResolveVenueClaimRequest.Approve">
            <summary>True to approve (transfer ownership + verify), false to reject.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ResolveVenueClaimRequest.ReasonCode">
            <summary>Fixed-set reject reason. Required on a reject; ignored on approve.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ResolveVenueClaimRequest.UserMessage">
            <summary>Message shown to the claimant (a draft the moderator may edit). Required for the "other" reason.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ResolveVenueClaimRequest.InternalNote">
            <summary>Optional moderator note added to the claim's internal history on this decision.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.AddVenueClaimNoteRequest">
            <summary>Request to append a moderator note to a claim.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.AddVenueClaimNoteRequest.Text">
            <summary>The note text (required).</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueClaimsPageResponse">
            <summary>
            The moderation queue: pending claims grouped by venue, venues ordered by their freshest claim.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimsPageResponse.Groups">
            <summary>One group per venue that has at least one claim in the requested status.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueClaimsPageResponse.From(System.Collections.Generic.IEnumerable{TTAR.Venues.VenueClaimGroupData})">
            <summary>Projects the repository-level groups to the response shape.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueClaimGroup">
            <summary>One venue's group in the moderation queue: a compact venue header plus its claims (newest first).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimGroup.VenueId">
            <summary>Venue id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimGroup.Name">
            <summary>Venue name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimGroup.ShortName">
            <summary>Short name, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimGroup.Place">
            <summary>Place ("city, street").</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimGroup.Phone">
            <summary>Phone.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimGroup.ImportSource">
            <summary>Import source (!= null ⇒ the "Import" chip applies).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimGroup.OwnerUserId">
            <summary>Current owner player id (!= null ⇒ this is a dispute over a live owner).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimGroup.OwnerName">
            <summary>Current owner display name (the "current owner" line of a dispute), if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimGroup.CreatedByUserId">
            <summary>Player who added the venue to the directory (creating is not owning); null for an imported venue.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimGroup.CreatedByName">
            <summary>Display name of <see cref="P:TTAR.API.Models.Venues.VenueClaimGroup.CreatedByUserId"/>, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimGroup.Claims">
            <summary>The venue's claims in the requested status, newest first.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueClaimGroup.From(TTAR.Venues.VenueClaimGroupData)">
            <summary>Projects a repository group to the response.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueClaimItem">
            <summary>One claim in the moderation queue: the claim plus the claimant's mini-profile and folded note info.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.Id">
            <summary>Claim id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.VenueId">
            <summary>The venue this claim is on.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.Role">
            <summary>Owner / representative.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.Contact">
            <summary>Free-text contact the claimant left, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.CreatedAt">
            <summary>When the claim was filed.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.IsCreator">
            <summary>True when the claimant is also the venue's creator (the "venue creator" pill).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.UserId">
            <summary>Claimant player id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.UserName">
            <summary>Claimant display name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.UserNick">
            <summary>Claimant Telegram nick, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.UserRating">
            <summary>Claimant TTAR rating (main hand), if rated.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.UserGames">
            <summary>Claimant games played (main hand).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.UserJoinedAt">
            <summary>When the claimant joined TTAR (the "in TTAR since …" line).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.UserAvatarPath">
            <summary>Claimant avatar path, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.LastNote">
            <summary>The most recent moderator note on the claim, for the list's "last note" line.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimItem.NotesCount">
            <summary>Total moderator notes on the claim.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueClaimItem.From(TTAR.Venues.VenueClaimData)">
            <summary>Projects a repository claim (with claimant loaded) to the response.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueClaimNoteItem">
            <summary>One moderator note (append-only history). Internal — never returned to the claimant.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimNoteItem.Id">
            <summary>Note id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimNoteItem.AuthorId">
            <summary>Author player id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimNoteItem.AuthorName">
            <summary>Author display name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimNoteItem.CreatedAt">
            <summary>When the note was written.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueClaimNoteItem.Text">
            <summary>Note text.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueClaimNoteItem.From(TTAR.DataProviders.Models.VenueClaimNoteModel)">
            <summary>Projects a note (with author loaded) to the response.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueErrorMap">
            <summary>
            Maps a <see cref="T:TTAR.Venues.VenueServiceError"/> to the HTTP-facing <see cref="T:TTAR.Types.ApiResponses.ErrorCode"/>, status and default detail.
            Kept out of the controllers so both <c>VenuesController</c> and <c>BookingsController</c> map identically.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueErrorMap.Map(TTAR.Venues.VenueServiceError)">
            <summary>
            Maps a service business error to its HTTP-facing error code, default detail message and status code.
            </summary>
            <param name="error">The service error to translate.</param>
            <returns>The error code, a human-readable detail, and the HTTP status.</returns>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueRepresentativeItem">
            <summary>A venue representative as shown publicly on the venue page (the venue's contacts in TTAR).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeItem.PlayerId">
            <summary>Representative player id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeItem.Name">
            <summary>Display name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeItem.AvatarPath">
            <summary>Avatar path, if any.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueRepresentativeItem.From(TTAR.DataProviders.Models.VenueRepresentativeModel)">
            <summary>Projects a representative row; the name/avatar need its player loaded.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueRepresentativeResponse">
            <summary>A venue representative as the owner manages it: the public item plus the extra rights.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeResponse.Permissions">
            <summary>Extra rights granted by the owner (empty = base management rights only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeResponse.CreatedAt">
            <summary>When the player became a representative.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueRepresentativeResponse.From(TTAR.DataProviders.Models.VenueRepresentativeModel)">
            <summary>Projects a representative row (player loaded).</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueRepresentativeClaimItem">
            <summary>
            A pending request to become a representative, as the venue's owner sees it: the request plus the claimant's
            mini-profile. Moderator notes are never part of it.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeClaimItem.Id">
            <summary>Claim id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeClaimItem.VenueId">
            <summary>The venue the request is on.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeClaimItem.Contact">
            <summary>Free-text contact the claimant left, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeClaimItem.CreatedAt">
            <summary>When the request was filed.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeClaimItem.UserId">
            <summary>Claimant player id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeClaimItem.UserName">
            <summary>Claimant display name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeClaimItem.UserNick">
            <summary>Claimant Telegram nick, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeClaimItem.UserRating">
            <summary>Claimant TTAR rating (main hand), if rated.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeClaimItem.UserGames">
            <summary>Claimant games played (main hand).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeClaimItem.UserJoinedAt">
            <summary>When the claimant joined TTAR.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueRepresentativeClaimItem.UserAvatarPath">
            <summary>Claimant avatar path, if any.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueRepresentativeClaimItem.From(TTAR.DataProviders.Models.VenueClaimModel)">
            <summary>Projects a claim with its claimant (hands + images) loaded.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.AddVenueRepresentativeRequest">
            <summary>Request to add a representative to a venue (owner only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.AddVenueRepresentativeRequest.PlayerId">
            <summary>The player to add.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.AddVenueRepresentativeRequest.Permissions">
            <summary>Extra rights to grant (empty = base management rights only).</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.UpdateVenueRepresentativeRequest">
            <summary>Request to replace a representative's extra rights (owner only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.UpdateVenueRepresentativeRequest.Permissions">
            <summary>The full new set of extra rights (empty = revoke all).</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.ResolveRepresentativeClaimRequest">
            <summary>The owner's decision on a request to become a representative.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ResolveRepresentativeClaimRequest.Approve">
            <summary>True to add the claimant as a representative, false to decline.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ResolveRepresentativeClaimRequest.UserMessage">
            <summary>Optional message to the claimant.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueRepresentativePermissionList">
            <summary>Maps the stored permission bitmask to the wire shape (a list of single members) and back.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueRepresentativePermissionList.ToList(TTAR.Types.VenueRepresentativePermissions)">
            <summary>The set members of <paramref name="permissions"/>, excluding None.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueRepresentativePermissionList.FromList(System.Collections.Generic.IEnumerable{TTAR.Types.VenueRepresentativePermissions})">
            <summary>The bitmask of a wire list (null/empty = None).</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.ClaimVenueRequest">
            <summary>Request to claim ownership/representation of a venue (SCREENS §5).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ClaimVenueRequest.Role">
            <summary>Owner or representative.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.ClaimVenueRequest.Contact">
            <summary>Optional contact for moderation.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.CreateBookingRequest">
            <summary>Request to create a booking of a pool seat (or several) over an interval (DATA_API §4).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateBookingRequest.From">
            <summary>Interval start (UTC), on the whole-hour grid.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateBookingRequest.To">
            <summary>Interval end (UTC), exclusive, on the whole-hour grid.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateBookingRequest.Quantity">
            <summary>Number of tables to book (≥ 1). The limit is the minimum free across the whole window.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.TopUpRequest">
            <summary>Request to credit a player's venue balance (venue admin only).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.TopUpRequest.PlayerId">
            <summary>The player to credit.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.TopUpRequest.Amount">
            <summary>Amount to add (positive).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.TopUpRequest.RequestId">
            <summary>
            Optional client-generated idempotency key. When supplied, a retry / double-submit with the same key credits
            the balance at most once. Omit for a plain (non-idempotent) top-up.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.BlockRangeRequest">
            <summary>Request to close an interval for booking (owner block / отпуск-ремонт), DATA_API §4.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.BlockRangeRequest.From">
            <summary>Interval start (UTC), whole-hour grid.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.BlockRangeRequest.To">
            <summary>Interval end (UTC), whole-hour grid.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.BlockRangeRequest.Reason">
            <summary>Reason; goes into the closing announcement when <see cref="P:TTAR.API.Models.Venues.BlockRangeRequest.PublishAnnouncement"/> is set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.BlockRangeRequest.PublishAnnouncement">
            <summary>Whether to also publish a closing announcement for this interval.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.CreateAnnouncementRequest">
            <summary>Request to publish a venue announcement (DATA_API §4).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateAnnouncementRequest.Kind">
            <summary>Info or Closed. A closing announcement also lays down a booking block for its interval.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateAnnouncementRequest.Title">
            <summary>Title (required).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateAnnouncementRequest.Text">
            <summary>Body text.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateAnnouncementRequest.From">
            <summary>Interval start (UTC) for a closing announcement.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateAnnouncementRequest.To">
            <summary>Interval end (UTC) for a closing announcement.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.CreateAnnouncementRequest.IsPinned">
            <summary>Whether to pin this announcement to the top of the venue page.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.LinkChatRequest">
            <summary>Request to link a chat to the venue (§8.1).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.LinkChatRequest.ChatId">
            <summary>Internal chat id (Chats.Id), not the Telegram chat id.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.LinkChatRequest.ThreadId">
            <summary>Optional forum topic id within the chat.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueCallerAccess">
            <summary>What the current caller may do on a venue, as decided by the service (never re-derived client-side).</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueCallerAccess.#ctor(System.Boolean,System.Boolean)">
            <summary>What the current caller may do on a venue, as decided by the service (never re-derived client-side).</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueResponse">
            <summary>
            Full venue info for the venue page.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.Id">
            <summary>Venue ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.Name">
            <summary>Venue name (the only mandatory text field).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.ShortName">
            <summary>Short name for tight strings, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.Latitude">
            <summary>Latitude of the venue's point, if a point is set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.Longitude">
            <summary>Longitude of the venue's point, if a point is set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.Place">
            <summary>Human-readable place as one line ("city, street").</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.OpeningHours">
            <summary>Opening hours (7 pipe-separated day strings, Mon..Sun; empty segment = closed).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.Phone">
            <summary>Phone number.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.Telegram">
            <summary>Telegram handle/link.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.Site">
            <summary>Web site.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.Description">
            <summary>Free-text description.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.OwnerUserId">
            <summary>Owner player ID, or null for an ownerless venue.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.OwnerName">
            <summary>Owner display name, if the venue has an owner.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.OwnerAvatarPath">
            <summary>Owner avatar path, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.Representatives">
            <summary>Players who run the venue on the owner's behalf — public contacts in TTAR, oldest first.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.CanManage">
            <summary>True when the current caller may manage the venue (owner, representative or admin).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.CanTopUpWallet">
            <summary>True when the current caller may credit players' wallets here.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.CreatedByUserId">
            <summary>Player who added the venue (creating is not owning), if known.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.IsVerified">
            <summary>True once an ownership claim is approved.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.ImportSource">
            <summary>Import source (e.g. "OpenStreetMap"), shown as a "not verified" badge. Null for community venues.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.TablesCount">
            <summary>Number of identical tables the venue lets (pool capacity).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.PricePerHour">
            <summary>Hourly price, or null when booking is off.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.ReservedRemainder">
            <summary>Non-bookable remainder kept as a walk-in guarantee.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.AutoConfirmBookings">
            <summary>Whether bookings auto-confirm; false means each booking waits for the venue's decision.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.BookingMode">
            <summary>Rent mode (pool by default; per-table is not served by the API yet).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.BookingEnabled">
            <summary>Whether booking is currently available (owner + price + pool mode).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.TimeZone">
            <summary>IANA time zone of the venue, if set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.ChatId">
            <summary>Linked chat internal ID (not the Telegram chat id), if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.ChatName">
            <summary>Linked chat display name, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.ChatThreadId">
            <summary>Optional forum topic id within the linked chat.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.ChatLinkPending">
            <summary>Whether the chat link awaits confirmation.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.MyClaimStatus">
            <summary>
            The CURRENT CALLER's own claim status on this venue: null = no claim of theirs; Pending ⇒ show the
            "your claim is on review" pill and hide "I'm the owner" / "dispute". Other players' claims are never shown.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.DistanceMeters">
            <summary>
            Approximate distance from the provided geo coordinates to the venue, in meters, rounded to
            GeoSearchPrecisionInMeters. Null when no geo was supplied or the venue has no known location.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.Tables">
            <summary>Venue tables, when requested/loaded.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.Announcements">
            <summary>Venue announcements, when requested/loaded.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.CreatedAt">
            <summary>Creation timestamp.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueResponse.UpdatedAt">
            <summary>Last update timestamp.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueResponse.From(TTAR.DataProviders.Models.VenueModel,System.Int32,System.Nullable{System.Double},System.Nullable{TTAR.Types.VenueClaimStatus},TTAR.API.Models.Venues.VenueCallerAccess)">
            <summary>
            Maps a loaded venue to its response DTO. <paramref name="geoPrecision"/> blurs the exposed distance,
            <paramref name="distanceMetersOverride"/> supplies a per-caller distance computed on top of a shared model,
            <paramref name="myClaimStatus"/> is the CURRENT caller's own claim status on this venue and
            <paramref name="access"/> what that caller may do (null = nothing). Owner and representative names/avatars
            are filled only when those players were loaded with the venue.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueSourceDto">
            <summary>
            The map card a venue was filled from — as returned by <c>POST /places/parse</c> and passed back unchanged to
            <c>POST /venues</c>. Stored but never returned: no response reveals that a venue was filled from a map.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueSourceDto.Provider">
            <summary>Map service.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueSourceDto.PlaceId">
            <summary>The place's id within the provider (normalized by the server).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueSourceDto.Url">
            <summary>Link to the card.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenuesPageResponse">
            <summary>
            Paginated list of venues.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenuesPageResponse.#ctor(System.Collections.Generic.List{TTAR.API.Models.Venues.VenueListItem},TTAR.Pagination.PageInfo,TTAR.API.Models.Venues.VenuesOrigin)">
            <summary>
            Paginated list of venues.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenuesPageResponse.Items">
            <summary>Venue list items for the current page.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenuesPageResponse.PageInfo">
            <summary>Pagination metadata.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenuesPageResponse.Origin">
            <summary>The point the list is ordered from (nearest first), or null when it is ordered by name.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenuesOriginKind">
            <summary>
            Where the venue list is ordered from.
            </summary>
        </member>
        <member name="F:TTAR.API.Models.Venues.VenuesOriginKind.Device">
            <summary>The coordinates the client sent.</summary>
        </member>
        <member name="F:TTAR.API.Models.Venues.VenuesOriginKind.Ip">
            <summary>
            The client's IP, located to a city: the client sent no coordinates. Venue distances are then not returned.
            </summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenuesOrigin">
            <summary>
            The point the venue list is ordered from.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenuesOrigin.Kind">
            <summary>Where the point comes from.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenuesOrigin.Latitude">
            <summary>Latitude.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenuesOrigin.Longitude">
            <summary>Longitude.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenuesOrigin.CountryCode">
            <summary>ISO 3166-1 alpha-2 country of an <see cref="F:TTAR.API.Models.Venues.VenuesOriginKind.Ip"/> point; null for a device one.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueListItem">
            <summary>
            Compact venue card for the directory list.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.Id">
            <summary>Venue ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.Name">
            <summary>Venue name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.ShortName">
            <summary>Short name, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.Place">
            <summary>Human-readable place as one line ("city, street").</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.Latitude">
            <summary>Latitude, if a point is set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.Longitude">
            <summary>Longitude, if a point is set.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.TablesCount">
            <summary>Number of tables (pool capacity).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.PricePerHour">
            <summary>Hourly price, or null when booking is off.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.OwnerUserId">
            <summary>Owner player ID, or null for an ownerless venue.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.BookingEnabled">
            <summary>Whether booking is currently available.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.IsVerified">
            <summary>True once an ownership claim is approved.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.ImportSource">
            <summary>Import source, if imported.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.DistanceMeters">
            <summary>Blurred distance in meters, or null.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.IsBookable">
            <summary>
            Whether online booking is available (owner + price + pool mode). Semantic alias of
            <see cref="P:TTAR.API.Models.Venues.VenueListItem.BookingEnabled"/> — the "book strip" and map badge read this (DATA_API §5, booking as a distinct flag).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.OpeningHours">
            <summary>Opening hours (7 pipe-separated day strings, Mon..Sun; empty segment = closed), for the "Open now" pill/filter.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.TimeZone">
            <summary>IANA time zone of the venue, needed to evaluate opening hours / the next-slot window client-side.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueListItem.NextSlot">
            <summary>
            Nearest bookable slot with a free table no earlier than the travel window (freeFrom = now + travel buffer).
            Null when the venue is not bookable, or no free slot remains until end of the working day.
            </summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueListItem.From(TTAR.DataProviders.Models.VenueModel,System.Int32,TTAR.API.Models.Venues.VenueNextSlot)">
            <summary>Maps a venue model to a compact list item, blurring distance to <paramref name="geoPrecision"/>.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueNextSlot">
            <summary>
            The nearest bookable slot with a free table for a venue's "book strip" (DATA_API §5). Computed server-side in
            the venue's time zone; the hour is returned in UTC.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueNextSlot.HourUtc">
            <summary>UTC start of the one-hour slot.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueNextSlot.Free">
            <summary>Free tables in that slot (same grid as availability: bookings + tournaments + blocks − reservedRemainder).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueNextSlot.WithinWindow">
            <summary>True when the slot is inside freeFrom..freeTo (green "free from HH:mm" strip); false when it is a later fallback slot (amber).</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueTableResponse">
            <summary>
            A single venue table (number + optional name/type/price).
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueTableResponse.Id">
            <summary>Table ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueTableResponse.Number">
            <summary>Stable table number within the venue.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueTableResponse.Name">
            <summary>Optional display name.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueTableResponse.Type">
            <summary>Optional table type.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueTableResponse.PricePerHour">
            <summary>Per-table hourly price (per-table mode only; null in pool).</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueTableResponse.From(TTAR.DataProviders.Models.VenueTableModel)">
            <summary>Maps a table model to its response DTO.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueWalletResponse">
            <summary>
            A player's per-venue wallet: the folded balance plus the append-only journal.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueWalletResponse.VenueId">
            <summary>Venue ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueWalletResponse.PlayerId">
            <summary>Player ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueWalletResponse.Total">
            <summary>Total balance (ΣTopUp − ΣCapture).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueWalletResponse.Held">
            <summary>Amount currently held under bookings.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueWalletResponse.Available">
            <summary>Amount available to book (Total − Held).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueWalletResponse.Entries">
            <summary>The journal, oldest first.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueWalletResponse.From(System.Int32,System.Int32,TTAR.Venues.VenueBalance,System.Collections.Generic.IEnumerable{TTAR.DataProviders.Models.VenueWalletEntryModel})">
            <summary>Builds the wallet response from the folded balance and the journal entries.</summary>
        </member>
        <member name="T:TTAR.API.Models.Venues.VenueWalletEntryResponse">
            <summary>
            A single append-only wallet journal entry.
            </summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueWalletEntryResponse.Id">
            <summary>Entry ID.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueWalletEntryResponse.Kind">
            <summary>Entry kind (TopUp / Hold / Capture / Release).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueWalletEntryResponse.Amount">
            <summary>Amount (always positive; the kind gives the direction).</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueWalletEntryResponse.Note">
            <summary>Human-readable note.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueWalletEntryResponse.RefId">
            <summary>Booking id / group id this entry refers to, if any.</summary>
        </member>
        <member name="P:TTAR.API.Models.Venues.VenueWalletEntryResponse.CreatedAt">
            <summary>Creation timestamp.</summary>
        </member>
        <member name="M:TTAR.API.Models.Venues.VenueWalletEntryResponse.From(TTAR.DataProviders.Models.VenueWalletEntryModel)">
            <summary>Maps a wallet entry model to its response DTO.</summary>
        </member>
        <member name="T:TTAR.API.Pages.Connect.LoginModel">
            <summary>
            Interactive IdP login page for the OpenID Connect authorize flow. On success it establishes the cookie session
            (with the same PlayerId/Name/Email claims the API reads) and returns to the original authorize request.
            </summary>
        </member>
        <member name="M:TTAR.API.Pages.Connect.LoginModel.#ctor(TTAR.API.Auth.IAccountService,System.TimeProvider)">
            <summary>
            Interactive IdP login page for the OpenID Connect authorize flow. On success it establishes the cookie session
            (with the same PlayerId/Name/Email claims the API reads) and returns to the original authorize request.
            </summary>
        </member>
        <member name="P:TTAR.API.Pages.Connect.LoginModel.Email">
            <summary>Email entered on the login form.</summary>
        </member>
        <member name="P:TTAR.API.Pages.Connect.LoginModel.Password">
            <summary>Password entered on the login form.</summary>
        </member>
        <member name="P:TTAR.API.Pages.Connect.LoginModel.ReturnUrl">
            <summary>The original authorize URL to return to after a successful sign-in.</summary>
        </member>
        <member name="P:TTAR.API.Pages.Connect.LoginModel.ErrorMessage">
            <summary>Validation/authentication error shown on the form, if any.</summary>
        </member>
        <member name="M:TTAR.API.Pages.Connect.LoginModel.OnGet">
            <summary>Renders the empty login form.</summary>
        </member>
        <member name="M:TTAR.API.Pages.Connect.LoginModel.OnPostAsync(System.Threading.CancellationToken)">
            <summary>Validates the credentials, establishes the IdP cookie session and returns to the authorize request.</summary>
        </member>
        <member name="T:TTAR.API.Serialization.UtcDateTimeConverter">
            <summary>
            Normalizes every <see cref="T:System.DateTime"/> crossing the API boundary to UTC, upholding the project-wide
            invariant that the database always stores UTC.
            <para>
            On read: a value carrying an offset (e.g. "2026-07-24T20:00:00+03:00") is converted to UTC; a naive value
            (no offset) is assumed to already be UTC rather than reinterpreted in the server's local time zone. Either
            way the result is a flat <see cref="F:System.DateTimeKind.Utc"/> <see cref="T:System.DateTime"/>. Without this, deserializing
            an offset into a plain DateTime yields a server-timezone-dependent value, which then fails to compare equal
            to the UTC value stored in the DB (breaking, among other things, the tournament critical-field change check).
            </para>
            On write: the value (which comes from the DB as <see cref="F:System.DateTimeKind.Unspecified"/>) is emitted with an
            explicit "Z" suffix so clients receive an unambiguous UTC timestamp.
            </summary>
        </member>
        <member name="M:TTAR.API.Serialization.UtcDateTimeConverter.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Serialization.UtcDateTimeConverter.Write(System.Text.Json.Utf8JsonWriter,System.DateTime,System.Text.Json.JsonSerializerOptions)">
            <inheritdoc/>
        </member>
        <member name="T:TTAR.API.Serialization.NullableUtcDateTimeConverter">
            <summary>Nullable counterpart of <see cref="T:TTAR.API.Serialization.UtcDateTimeConverter"/>.</summary>
        </member>
        <member name="M:TTAR.API.Serialization.NullableUtcDateTimeConverter.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Serialization.NullableUtcDateTimeConverter.Write(System.Text.Json.Utf8JsonWriter,System.Nullable{System.DateTime},System.Text.Json.JsonSerializerOptions)">
            <inheritdoc/>
        </member>
        <member name="T:TTAR.API.Services.CachedTopService">
            <inheritdoc cref="T:TTAR.API.Services.ICachedTopService"/>
        </member>
        <member name="M:TTAR.API.Services.CachedTopService.#ctor(TTAR.DataProviders.Abstractions.ITopRepository,TTAR.Cache.IPlayerReadCache)">
            <inheritdoc cref="T:TTAR.API.Services.ICachedTopService"/>
        </member>
        <member name="M:TTAR.API.Services.CachedTopService.GetTopAsync(TTAR.Pagination.PageInfo,TTAR.DataProviders.Models.PlayerModel,System.Boolean,System.Boolean,NetTopologySuite.Geometries.Point,System.Nullable{System.Double},System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Services.CachedTopService.GetTopWithChatIdAsync(System.Nullable{System.Int32},TTAR.Pagination.PageInfo,TTAR.DataProviders.Models.PlayerModel,System.Boolean,System.Boolean,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Services.CachedTopService.GetTopActiveWithChatIdAsync(System.Nullable{System.Int32},System.Int32,TTAR.Pagination.PageInfo,TTAR.DataProviders.Models.PlayerModel,System.Boolean,System.Boolean,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Services.CachedTopService.GetTopChatsAsync(TTAR.DataProviders.Models.PlayerModel,TTAR.Pagination.PageInfo,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="T:TTAR.API.Services.ClientLogScopeMiddleware">
            <summary>
            Tags every log entry of a request with the TTAR app and version from the <see cref="F:TTAR.API.Auth.ClientDescriptor.AppHeader"/> /
            <see cref="F:TTAR.API.Auth.ClientDescriptor.VersionHeader"/> headers, so a failure can be traced to a stale web build or an old app
            release. Scopes reach the console only with <c>Logging:Console:FormatterOptions:IncludeScopes</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Services.ClientLogScopeMiddleware.#ctor(Microsoft.AspNetCore.Http.RequestDelegate,Microsoft.Extensions.Logging.ILogger{TTAR.API.Services.ClientLogScopeMiddleware})">
            <summary>
            Tags every log entry of a request with the TTAR app and version from the <see cref="F:TTAR.API.Auth.ClientDescriptor.AppHeader"/> /
            <see cref="F:TTAR.API.Auth.ClientDescriptor.VersionHeader"/> headers, so a failure can be traced to a stale web build or an old app
            release. Scopes reach the console only with <c>Logging:Console:FormatterOptions:IncludeScopes</c>.
            </summary>
        </member>
        <member name="M:TTAR.API.Services.ClientLogScopeMiddleware.InvokeAsync(Microsoft.AspNetCore.Http.HttpContext)">
            <summary>
            Runs the rest of the pipeline inside the client scope (or without one when the client sent neither header).
            </summary>
        </member>
        <member name="T:TTAR.API.Services.IDonationAdminService">
            <summary>
            Admin page "Поддержка проекта": support payments entered by hand (Boosty does not report them) and the anonymous
            counters of the "Expenses and support" page. Only the running month (UTC) takes new payments or deletions; a closed
            one stays as it is. A write is seen at once by the menu banner and the page.
            </summary>
        </member>
        <member name="M:TTAR.API.Services.IDonationAdminService.GetMonthAsync(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>The payments and the sums of a month; <c>null</c> for a month after the running one.</summary>
        </member>
        <member name="M:TTAR.API.Services.IDonationAdminService.AddDonationAsync(System.Int32,System.Int32,System.Decimal,System.Int32,System.Threading.CancellationToken)">
            <summary>Adds a payment to the running month.</summary>
        </member>
        <member name="M:TTAR.API.Services.IDonationAdminService.DeleteDonationAsync(System.Int32,System.Int32,System.Int32,System.Int32,System.Threading.CancellationToken)">
            <summary>Soft-deletes a payment of the running month.</summary>
        </member>
        <member name="M:TTAR.API.Services.IDonationAdminService.GetPageStatsAsync(TTAR.API.Models.Donations.DonationStatsBucket,System.DateOnly,System.DateOnly,System.Threading.CancellationToken)">
            <summary>
            The page counters of <c>[<paramref name="from"/>, <paramref name="to"/>]</c>: the days (or months) with any,
            in order; the client fills the gaps with zeros.
            </summary>
        </member>
        <member name="T:TTAR.API.Services.DonationAdminError">
            <summary>Why an admin write was refused.</summary>
        </member>
        <member name="F:TTAR.API.Services.DonationAdminError.InvalidAmount">
            <summary>The amount is not in (0, 99 999.99] or has fractions of a cent.</summary>
        </member>
        <member name="F:TTAR.API.Services.DonationAdminError.MonthNotCurrent">
            <summary>The month is not the running one.</summary>
        </member>
        <member name="F:TTAR.API.Services.DonationAdminError.NotFound">
            <summary>No such payment in the month (or it is deleted already).</summary>
        </member>
        <member name="T:TTAR.API.Services.DonationAdminResult`1">
            <summary>The outcome of an admin write: the response, or why it was refused.</summary>
        </member>
        <member name="M:TTAR.API.Services.DonationAdminResult`1.#ctor(`0,System.Nullable{TTAR.API.Services.DonationAdminError})">
            <summary>The outcome of an admin write: the response, or why it was refused.</summary>
        </member>
        <member name="M:TTAR.API.Services.DonationAdminResult`1.op_Implicit(TTAR.API.Services.DonationAdminError)~TTAR.API.Services.DonationAdminResult{`0}">
            <summary>A refused write.</summary>
        </member>
        <member name="T:TTAR.API.Services.DonationAdminService">
            <inheritdoc cref="T:TTAR.API.Services.IDonationAdminService"/>
        </member>
        <member name="M:TTAR.API.Services.DonationAdminService.#ctor(TTAR.DataProviders.Abstractions.IDonationRepository,TTAR.API.Services.IDonationService,Microsoft.Extensions.Options.IOptions{TTAR.API.Configuration.DonationOptions},System.TimeProvider)">
            <inheritdoc cref="T:TTAR.API.Services.IDonationAdminService"/>
        </member>
        <member name="F:TTAR.API.Services.DonationAdminService.MaxAmount">
            <summary>Fits <c>Donations.Amount</c>, <c>decimal(10, 2)</c>, with room to spare (DONATE.md §6).</summary>
        </member>
        <member name="M:TTAR.API.Services.DonationAdminService.GetMonthAsync(System.Int32,System.Int32,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Services.DonationAdminService.AddDonationAsync(System.Int32,System.Int32,System.Decimal,System.Int32,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Services.DonationAdminService.DeleteDonationAsync(System.Int32,System.Int32,System.Int32,System.Int32,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Services.DonationAdminService.GetPageStatsAsync(TTAR.API.Models.Donations.DonationStatsBucket,System.DateOnly,System.DateOnly,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="T:TTAR.API.Services.IDonationService">
            <summary>
            Project expenses and the players' support, month by month, from the earliest fixed month up to the running one.
            A closed month keeps the expenses fixed for it; one closed without them gets the configured
            <see cref="P:TTAR.API.Configuration.DonationOptions.MonthlyExpenses"/> fixed on the first read after it. Every method returns <c>null</c>
            while the section is switched off.
            </summary>
        </member>
        <member name="M:TTAR.API.Services.IDonationService.GetCurrentAsync(System.Threading.CancellationToken)">
            <summary>The running month (the menu banner).</summary>
        </member>
        <member name="M:TTAR.API.Services.IDonationService.GetSummaryAsync(System.Threading.CancellationToken)">
            <summary>The running month, the running year and the whole history (the coverage scales).</summary>
        </member>
        <member name="M:TTAR.API.Services.IDonationService.GetMonthsAsync(System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <summary>The months of <paramref name="year"/> (the running one by default) within the history; empty for a
            year outside it.</summary>
        </member>
        <member name="M:TTAR.API.Services.IDonationService.GetYearsAsync(System.Threading.CancellationToken)">
            <summary>Every year of the history.</summary>
        </member>
        <member name="M:TTAR.API.Services.IDonationService.GetMethodsAsync(System.Int32,System.Net.IPAddress,System.Threading.CancellationToken)">
            <summary>
            The payment methods of the support sheet offered in the caller's country, and that country: of
            <paramref name="playerId"/> (0 for a guest), else of <paramref name="clientAddress"/>.
            </summary>
        </member>
        <member name="M:TTAR.API.Services.IDonationService.RecordPageEventAsync(TTAR.DataProviders.Abstractions.DonationPageEvent,System.Threading.CancellationToken)">
            <summary>Counts an event of the support page in today's (UTC) anonymous counters.</summary>
            <returns><c>false</c> (nothing counted) while the section is switched off.</returns>
        </member>
        <member name="M:TTAR.API.Services.IDonationService.InvalidateLedger">
            <summary>Drops the cached ledger: the next read sees the payments just added or deleted.</summary>
        </member>
        <member name="T:TTAR.API.Services.DonationService">
            <inheritdoc cref="T:TTAR.API.Services.IDonationService"/>
        </member>
        <member name="M:TTAR.API.Services.DonationService.#ctor(TTAR.DataProviders.Abstractions.IDonationRepository,Microsoft.Extensions.Caching.Memory.IMemoryCache,Microsoft.Extensions.Options.IOptions{TTAR.API.Configuration.DonationOptions},TTAR.Services.Abstractions.IPlayerCountryResolver,System.TimeProvider)">
            <inheritdoc cref="T:TTAR.API.Services.IDonationService"/>
        </member>
        <member name="M:TTAR.API.Services.DonationService.GetCurrentAsync(System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Services.DonationService.GetSummaryAsync(System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Services.DonationService.GetMonthsAsync(System.Nullable{System.Int32},System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Services.DonationService.GetYearsAsync(System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Services.DonationService.GetMethodsAsync(System.Int32,System.Net.IPAddress,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Services.DonationService.RecordPageEventAsync(TTAR.DataProviders.Abstractions.DonationPageEvent,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:TTAR.API.Services.DonationService.InvalidateLedger">
            <inheritdoc/>
        </member>
        <member name="T:TTAR.API.Services.DonationService.Ledger">
            <summary>Every month of the history in order; the last one is the running month.</summary>
        </member>
        <member name="M:TTAR.API.Services.DonationService.Ledger.#ctor(System.Collections.Generic.IReadOnlyList{TTAR.API.Services.DonationService.LedgerMonth})">
            <summary>Every month of the history in order; the last one is the running month.</summary>
        </member>
        <member name="T:TTAR.API.Services.GameRegistrationService">
            <summary>
            Service responsible for registering games and handling game registration logic.
            </summary>
        </member>
        <member name="M:TTAR.API.Services.GameRegistrationService.#ctor(Microsoft.Extensions.Logging.ILogger{TTAR.API.Services.GameRegistrationService},TTAR.DataProviders.Abstractions.IGameRepository,TTAR.DataProviders.Abstractions.IDbService,TTAR.Actions.Abstractions.INewGameAction,TTAR.DataProviders.Abstractions.IChatService)">
            <summary>
            Service responsible for registering games and handling game registration logic.
            </summary>
        </member>
        <member name="M:TTAR.API.Services.GameRegistrationService.RegisterGamesAsync(System.Int32,System.Collections.Generic.List{TTAR.API.Models.Requests.NewGameRequest},System.Threading.CancellationToken)">
            <summary>
            Registers a batch of games for a player.
            </summary>
            <param name="playerId">The ID of the player registering the games.</param>
            <param name="requests">List of new game requests.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>List of game batch entity responses.</returns>
        </member>
        <member name="M:TTAR.API.Services.GameRegistrationService.GroupByChats(System.Collections.Generic.List{TTAR.API.Models.Requests.NewGameRequest},System.Collections.Generic.Dictionary{System.ValueTuple{System.Int32,TTAR.Types.HandType},TTAR.DataProviders.Models.HandModel},System.Collections.Generic.List{TTAR.API.Models.Responses.GameBatchEntityResponse})">
            <summary>
            Groups game requests by chat for batch processing.
            </summary>
            <param name="request">List of new game requests.</param>
            <param name="playerHands">Dictionary of player hands.</param>
            <param name="results">Current list of results to exclude already processed games.</param>
            <returns>List of grouped game requests.</returns>
        </member>
        <member name="M:TTAR.API.Services.GameRegistrationService.FilterCheaters(System.Collections.Generic.List{TTAR.API.Models.Requests.NewGameRequest},System.Collections.Generic.Dictionary{System.ValueTuple{System.Int32,TTAR.Types.HandType},TTAR.DataProviders.Models.HandModel})">
            <summary>
            Filters out game requests that are considered cheating or invalid.
            </summary>
            <param name="request">List of new game requests.</param>
            <param name="playerHands">Dictionary of player hands.</param>
            <returns>List of game batch entity responses for cheaters or invalid requests.</returns>
        </member>
        <member name="M:TTAR.API.Services.GameRegistrationService.ResolvePlayerHands(System.Collections.Generic.List{TTAR.API.Models.Requests.NewGameRequest},System.Threading.CancellationToken)">
            <summary>
            Resolves and retrieves player hands for all requests.
            </summary>
            <param name="request">List of new game requests.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>Dictionary of player hand pairs to hand models.</returns>
        </member>
        <member name="M:TTAR.API.Services.GameRegistrationService.RegisterSingleGameAsync(TTAR.API.Models.Requests.NewGameRequest,TTAR.DataProviders.Models.HandModel,TTAR.DataProviders.Models.HandModel,System.Int32,System.Threading.CancellationToken)">
            <summary>
            Registers a single game request.
            </summary>
            <param name="request">The new game request.</param>
            <param name="hand1">Player 1 hand model.</param>
            <param name="hand2">Player 2 hand model.</param>
            <param name="playerId">The ID of the player registering the game.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>Tuple containing the game response and registration status.</returns>
        </member>
        <member name="M:TTAR.API.Services.GameRegistrationService.ValidateCheating(TTAR.API.Models.Requests.NewGameRequest,TTAR.DataProviders.Models.HandModel,TTAR.DataProviders.Models.HandModel)">
            <summary>
            Validates a game request for cheating or invalid data.
            </summary>
            <param name="request">The new game request.</param>
            <param name="hand1">Player 1 hand model.</param>
            <param name="hand2">Player 2 hand model.</param>
            <returns>Game registration status if invalid, otherwise null.</returns>
        </member>
        <member name="T:TTAR.API.Services.ICachedTopService">
            <summary>
            API-only read cache in front of <see cref="T:TTAR.DataProviders.Abstractions.ITopRepository"/> for the /top
            endpoints. Caches the caller-independent, fully-ordered top list (one entry per scope + include flags) under a
            short TTL to absorb the open-the-top-page burst, then applies the per-caller target-player positions and paging
            on top. Geo-filtered requests (location + distance) bypass the cache and read fresh via SQL so the geodesic
            filter stays byte-identical to the current behavior. Mirrors the method shapes the controller already used, so
            the controller swaps the repository for this service with no other change. The Telegram bot keeps reading fresh
            straight from the repository — this service is not on its path.
            </summary>
        </member>
        <member name="M:TTAR.API.Services.ICachedTopService.GetTopAsync(TTAR.Pagination.PageInfo,TTAR.DataProviders.Models.PlayerModel,System.Boolean,System.Boolean,NetTopologySuite.Geometries.Point,System.Nullable{System.Double},System.Threading.CancellationToken)">
            <summary>Global/geo full top. When <paramref name="location"/>+<paramref name="distance"/> are set the read
            bypasses the cache (fresh SQL geo filter); otherwise it is served from the cached list.</summary>
        </member>
        <member name="M:TTAR.API.Services.ICachedTopService.GetTopWithChatIdAsync(System.Nullable{System.Int32},TTAR.Pagination.PageInfo,TTAR.DataProviders.Models.PlayerModel,System.Boolean,System.Boolean,System.Threading.CancellationToken)">
            <summary>Chat-scoped (or global when <paramref name="chatId"/> is null) full top, served from the cached list.</summary>
        </member>
        <member name="M:TTAR.API.Services.ICachedTopService.GetTopActiveWithChatIdAsync(System.Nullable{System.Int32},System.Int32,TTAR.Pagination.PageInfo,TTAR.DataProviders.Models.PlayerModel,System.Boolean,System.Boolean,System.Threading.CancellationToken)">
            <summary>Active top over the last <paramref name="days"/>, served from the cached list.</summary>
        </member>
        <member name="M:TTAR.API.Services.ICachedTopService.GetTopChatsAsync(TTAR.DataProviders.Models.PlayerModel,TTAR.Pagination.PageInfo,System.Threading.CancellationToken)">
            <summary>
            Chat selection list ordered by proximity. The expensive per-chat total-games aggregate is cached; the
            caller's per-chat game counts and the geodesic distances are read fresh and merged per request.
            </summary>
        </member>
        <member name="T:TTAR.API.Services.IGameRegistrationService">
            <summary>
            Service responsible for registering games and handling game registration logic.
            </summary>
        </member>
        <member name="M:TTAR.API.Services.IGameRegistrationService.RegisterGamesAsync(System.Int32,System.Collections.Generic.List{TTAR.API.Models.Requests.NewGameRequest},System.Threading.CancellationToken)">
            <summary>
            Registers a batch of games for a player.
            </summary>
            <param name="playerId">The ID of the player registering the games.</param>
            <param name="requests">List of new game requests.</param>
            <param name="cancellationToken">Cancellation token.</param>
            <returns>List of game batch entity responses.</returns>
        </member>
        <member name="T:TTAR.API.Services.ILanguageRequestService">
            <summary>
            Forwards users' requests for a new interface language to the admin (Telegram and email). Nothing is stored.
            </summary>
        </member>
        <member name="M:TTAR.API.Services.ILanguageRequestService.SubmitAsync(TTAR.API.Models.Requests.NewLanguageRequest,System.Int32,System.String,System.String,System.Threading.CancellationToken)">
            <summary>
            Notifies the admin of a language request. Each channel is tried on its own; the call fails only when neither
            delivered, so the client can retry instead of the request being lost.
            </summary>
            <param name="request">The request as the user submitted it.</param>
            <param name="playerId">The requesting player, <c>0</c> for an anonymous caller.</param>
            <param name="accountEmail">The caller's account email, the reply address when the form gives none.</param>
            <param name="client">The app and its version, e.g. <c>Web 3.0.24.0</c>.</param>
            <param name="cancellationToken">Cancellation token.</param>
        </member>
        <member name="T:TTAR.API.Services.LanguageRequestService">
            <inheritdoc />
        </member>
        <member name="M:TTAR.API.Services.LanguageRequestService.#ctor(TTAR.Services.Abstractions.IPlayerService,TTAR.Services.Abstractions.IEmailService,Telegram.Bot.ITelegramBotClient,TTAR.Configuration.TtarConfiguration,Microsoft.Extensions.Logging.ILogger{TTAR.API.Services.LanguageRequestService})">
            <inheritdoc />
        </member>
        <member name="M:TTAR.API.Services.LanguageRequestService.SubmitAsync(TTAR.API.Models.Requests.NewLanguageRequest,System.Int32,System.String,System.String,System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="T:TTAR.API.Services.IRateLimitRejectionReporter">
            <summary>
            Sends a throttled Telegram alert to the super-admin when a client trips the rate limiter.
            Reports carry only what is available on the spot (who is logged in, client IP, the offending
            path and the referring page) — no extra activity logging is introduced.
            </summary>
        </member>
        <member name="M:TTAR.API.Services.IRateLimitRejectionReporter.ReportAsync(Microsoft.AspNetCore.Http.HttpContext)">
            <summary>
            Reports a single rate-limit rejection. Silently coalesces bursts: at most one alert per
            client per cooldown, capped by a global ceiling per window so a flood can't self-amplify.
            </summary>
        </member>
        <member name="T:TTAR.API.Services.RateLimitRejectionReporter">
            <inheritdoc />
        </member>
        <member name="M:TTAR.API.Services.RateLimitRejectionReporter.#ctor(Microsoft.Extensions.Caching.Memory.IMemoryCache,Microsoft.Extensions.Options.IOptions{TTAR.API.Configuration.RateLimitOptions},TTAR.Services.Abstractions.IErrorReporting)">
            <inheritdoc />
        </member>
        <member name="M:TTAR.API.Services.RateLimitRejectionReporter.ReportAsync(Microsoft.AspNetCore.Http.HttpContext)">
            <inheritdoc />
        </member>
        <member name="T:Program">
            <summary>
            Auto-generated public partial Program class for top-level statement apps.
            </summary>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.PhonePattern_0">
            <summary>Custom <see cref="T:System.Text.RegularExpressions.Regex"/>-derived type for the PhonePattern method.</summary>
        </member>
        <member name="F:System.Text.RegularExpressions.Generated.PhonePattern_0.Instance">
            <summary>Cached, thread-safe singleton instance.</summary>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.PhonePattern_0.#ctor">
            <summary>Initializes the instance.</summary>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.PhonePattern_0.RunnerFactory">
            <summary>Provides a factory for creating <see cref="T:System.Text.RegularExpressions.RegexRunner"/> instances to be used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.PhonePattern_0.RunnerFactory.CreateInstance">
            <summary>Creates an instance of a <see cref="T:System.Text.RegularExpressions.RegexRunner"/> used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.PhonePattern_0.RunnerFactory.Runner">
            <summary>Provides the runner that contains the custom logic implementing the specified regular expression.</summary>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.PhonePattern_0.RunnerFactory.Runner.Scan(System.ReadOnlySpan{System.Char})">
            <summary>Scan the <paramref name="inputSpan"/> starting from base.runtextstart for the next match.</summary>
            <param name="inputSpan">The text being scanned by the regular expression.</param>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.PhonePattern_0.RunnerFactory.Runner.TryFindNextPossibleStartingPosition(System.ReadOnlySpan{System.Char})">
            <summary>Search <paramref name="inputSpan"/> starting from base.runtextpos for the next location a match could possibly start.</summary>
            <param name="inputSpan">The text being scanned by the regular expression.</param>
            <returns>true if a possible match was found; false if no more matches are possible.</returns>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.PhonePattern_0.RunnerFactory.Runner.TryMatchAtCurrentPosition(System.ReadOnlySpan{System.Char})">
            <summary>Determine whether <paramref name="inputSpan"/> at base.runtextpos is a match for the regular expression.</summary>
            <param name="inputSpan">The text being scanned by the regular expression.</param>
            <returns>true if the regular expression matches at the current position; otherwise, false.</returns>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.CardPattern_1">
            <summary>Custom <see cref="T:System.Text.RegularExpressions.Regex"/>-derived type for the CardPattern method.</summary>
        </member>
        <member name="F:System.Text.RegularExpressions.Generated.CardPattern_1.Instance">
            <summary>Cached, thread-safe singleton instance.</summary>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.CardPattern_1.#ctor">
            <summary>Initializes the instance.</summary>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.CardPattern_1.RunnerFactory">
            <summary>Provides a factory for creating <see cref="T:System.Text.RegularExpressions.RegexRunner"/> instances to be used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.CardPattern_1.RunnerFactory.CreateInstance">
            <summary>Creates an instance of a <see cref="T:System.Text.RegularExpressions.RegexRunner"/> used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.CardPattern_1.RunnerFactory.Runner">
            <summary>Provides the runner that contains the custom logic implementing the specified regular expression.</summary>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.CardPattern_1.RunnerFactory.Runner.Scan(System.ReadOnlySpan{System.Char})">
            <summary>Scan the <paramref name="inputSpan"/> starting from base.runtextstart for the next match.</summary>
            <param name="inputSpan">The text being scanned by the regular expression.</param>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.CardPattern_1.RunnerFactory.Runner.TryFindNextPossibleStartingPosition(System.ReadOnlySpan{System.Char})">
            <summary>Search <paramref name="inputSpan"/> starting from base.runtextpos for the next location a match could possibly start.</summary>
            <param name="inputSpan">The text being scanned by the regular expression.</param>
            <returns>true if a possible match was found; false if no more matches are possible.</returns>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.CardPattern_1.RunnerFactory.Runner.TryMatchAtCurrentPosition(System.ReadOnlySpan{System.Char})">
            <summary>Determine whether <paramref name="inputSpan"/> at base.runtextpos is a match for the regular expression.</summary>
            <param name="inputSpan">The text being scanned by the regular expression.</param>
            <returns>true if the regular expression matches at the current position; otherwise, false.</returns>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.HolderPattern_2">
            <summary>Custom <see cref="T:System.Text.RegularExpressions.Regex"/>-derived type for the HolderPattern method.</summary>
        </member>
        <member name="F:System.Text.RegularExpressions.Generated.HolderPattern_2.Instance">
            <summary>Cached, thread-safe singleton instance.</summary>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.HolderPattern_2.#ctor">
            <summary>Initializes the instance.</summary>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.HolderPattern_2.RunnerFactory">
            <summary>Provides a factory for creating <see cref="T:System.Text.RegularExpressions.RegexRunner"/> instances to be used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.HolderPattern_2.RunnerFactory.CreateInstance">
            <summary>Creates an instance of a <see cref="T:System.Text.RegularExpressions.RegexRunner"/> used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.HolderPattern_2.RunnerFactory.Runner">
            <summary>Provides the runner that contains the custom logic implementing the specified regular expression.</summary>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.HolderPattern_2.RunnerFactory.Runner.Scan(System.ReadOnlySpan{System.Char})">
            <summary>Scan the <paramref name="inputSpan"/> starting from base.runtextstart for the next match.</summary>
            <param name="inputSpan">The text being scanned by the regular expression.</param>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.HolderPattern_2.RunnerFactory.Runner.TryFindNextPossibleStartingPosition(System.ReadOnlySpan{System.Char})">
            <summary>Search <paramref name="inputSpan"/> starting from base.runtextpos for the next location a match could possibly start.</summary>
            <param name="inputSpan">The text being scanned by the regular expression.</param>
            <returns>true if a possible match was found; false if no more matches are possible.</returns>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.HolderPattern_2.RunnerFactory.Runner.TryMatchAtCurrentPosition(System.ReadOnlySpan{System.Char})">
            <summary>Determine whether <paramref name="inputSpan"/> at base.runtextpos is a match for the regular expression.</summary>
            <param name="inputSpan">The text being scanned by the regular expression.</param>
            <returns>true if the regular expression matches at the current position; otherwise, false.</returns>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.CountryPattern_3">
            <summary>Custom <see cref="T:System.Text.RegularExpressions.Regex"/>-derived type for the CountryPattern method.</summary>
        </member>
        <member name="F:System.Text.RegularExpressions.Generated.CountryPattern_3.Instance">
            <summary>Cached, thread-safe singleton instance.</summary>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.CountryPattern_3.#ctor">
            <summary>Initializes the instance.</summary>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.CountryPattern_3.RunnerFactory">
            <summary>Provides a factory for creating <see cref="T:System.Text.RegularExpressions.RegexRunner"/> instances to be used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.CountryPattern_3.RunnerFactory.CreateInstance">
            <summary>Creates an instance of a <see cref="T:System.Text.RegularExpressions.RegexRunner"/> used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.CountryPattern_3.RunnerFactory.Runner">
            <summary>Provides the runner that contains the custom logic implementing the specified regular expression.</summary>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.CountryPattern_3.RunnerFactory.Runner.Scan(System.ReadOnlySpan{System.Char})">
            <summary>Scan the <paramref name="inputSpan"/> starting from base.runtextstart for the next match.</summary>
            <param name="inputSpan">The text being scanned by the regular expression.</param>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.CountryPattern_3.RunnerFactory.Runner.TryFindNextPossibleStartingPosition(System.ReadOnlySpan{System.Char})">
            <summary>Search <paramref name="inputSpan"/> starting from base.runtextpos for the next location a match could possibly start.</summary>
            <param name="inputSpan">The text being scanned by the regular expression.</param>
            <returns>true if a possible match was found; false if no more matches are possible.</returns>
        </member>
        <member name="M:System.Text.RegularExpressions.Generated.CountryPattern_3.RunnerFactory.Runner.TryMatchAtCurrentPosition(System.ReadOnlySpan{System.Char})">
            <summary>Determine whether <paramref name="inputSpan"/> at base.runtextpos is a match for the regular expression.</summary>
            <param name="inputSpan">The text being scanned by the regular expression.</param>
            <returns>true if the regular expression matches at the current position; otherwise, false.</returns>
        </member>
        <member name="T:System.Text.RegularExpressions.Generated.Utilities">
            <summary>Helper methods used by generated <see cref="T:System.Text.RegularExpressions.Regex"/>-derived implementations.</summary>
        </member>
        <member name="F:System.Text.RegularExpressions.Generated.Utilities.s_defaultTimeout">
            <summary>Default timeout value set in <see cref="T:System.AppContext"/>, or <see cref="F:System.Text.RegularExpressions.Regex.InfiniteMatchTimeout"/> if none was set.</summary>
        </member>
        <member name="F:System.Text.RegularExpressions.Generated.Utilities.s_hasTimeout">
            <summary>Whether <see cref="F:System.Text.RegularExpressions.Generated.Utilities.s_defaultTimeout"/> is non-infinite.</summary>
        </member>
        <member name="F:System.Text.RegularExpressions.Generated.Utilities.s_ascii_81600000FEFFFF07FEFFFF07">
            <summary>Supports searching for characters in or not in " '-.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".</summary>
        </member>
        <member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.CreateDocumentationId(System.Type)">
            <summary>
            Generates a documentation comment ID for a type.
            Example: T:Namespace.Outer+Inner`1 becomes T:Namespace.Outer.Inner`1
            </summary>
        </member>
        <member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.CreateDocumentationId(System.Reflection.PropertyInfo)">
            <summary>
            Generates a documentation comment ID for a property.
            Example: P:Namespace.ContainingType.PropertyName or for an indexer P:Namespace.ContainingType.Item(System.Int32)
            </summary>
        </member>
        <member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.CreateDocumentationId(System.Type,System.String)">
            <summary>
            Generates a documentation comment ID for a property given its container type and property name.
            Example: P:Namespace.ContainingType.PropertyName
            </summary>
        </member>
        <member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.CreateDocumentationId(System.Reflection.MethodInfo)">
            <summary>
            Generates a documentation comment ID for a method (or constructor).
            For example:
              M:Namespace.ContainingType.MethodName(ParamType1,ParamType2)~ReturnType
              M:Namespace.ContainingType.#ctor(ParamType)
            </summary>
        </member>
        <member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.GetTypeDocId(System.Type,System.Boolean,System.Boolean)">
            <summary>
            Generates a documentation ID string for a type.
            This method handles nested types (replacing '+' with '.'),
            generic types, arrays, pointers, by-ref types, and generic parameters.
            The <paramref name="includeGenericArguments"/> flag controls whether
            constructed generic type arguments are emitted, while <paramref name="omitGenericArity"/>
            controls whether the generic arity marker (e.g. "`1") is appended.
            </summary>
        </member>
        <member name="M:Microsoft.AspNetCore.OpenApi.Generated.DocumentationCommentIdHelper.NormalizeDocId(System.String)">
            <summary>
            Normalizes a documentation comment ID to match the compiler-style format.
            Strips the return type suffix for ordinary methods but retains it for conversion operators.
            </summary>
            <param name="docId">The documentation comment ID to normalize.</param>
            <returns>The normalized documentation comment ID.</returns>
        </member>
    </members>
</doc>
