# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/vc/v1/keyapis_vc_camera_access_v1.proto, keyapis/vc/v1/keyapis_vc_camera_group_v1.proto, keyapis/vc/v1/keyapis_vc_camera_location_data_v1.proto, keyapis/vc/v1/keyapis_vc_camera_v1.proto, keyapis/vc/v1/keyapis_vc_camera_video_data_v1.proto, keyapis/vc/v1/keyapis_vc_company_v1.proto, keyapis/vc/v1/keyapis_vc_events_v1.proto
# plugin: python-betterproto
# This file has been @generated

from collections.abc import AsyncIterator
from datetime import datetime
from typing import TYPE_CHECKING

import betterproto
import grpclib
from betterproto.grpc.grpclib_server import ServiceBase
from pydantic import model_validator
from pydantic.dataclasses import (
    dataclass,
    rebuild_dataclass,
)

if TYPE_CHECKING:
    import grpclib.server
    from betterproto.grpc.grpclib_client import MetadataLike
    from grpclib.metadata import Deadline


class CameraRoomPagingDirectionType(betterproto.Enum):
    """
    Справочник типов направлений сортировки.
     # Тип: byte
    """

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CameraRoomPagingOrderByType(betterproto.Enum):
    """
    Справочник типов значений сортировки.
     # Тип: byte
    """

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    CAMERA_UID = 1
    """По Идентификатору камеры"""

    ORPON_ROOM_NUMBER = 2
    """По ОРПОН и номеру квартиры"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CameraType(betterproto.Enum):
    """Справочник типов камер"""

    TYPE_UNKNOWN = 0
    """Значение не указано"""

    DVR = 1
    """Регистратор"""

    VMS = 2
    """Система управления видео"""

    ROSE = 3
    """RTSP-камера"""

    VIOLET = 4
    """IP-камера"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CameraPagingDirectionType(betterproto.Enum):
    """
    Справочник типов направлений сортировки.
     # Тип: byte
    """

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CameraPagingOrderByType(betterproto.Enum):
    """
    Справочник типов значений сортировки.
     # Тип: byte
    """

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    UID = 1
    """По идентификатору"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CameraCollectionPagingOrderByType(betterproto.Enum):
    """
    Справочник типов значений сортировки.
     Тип: byte
    """

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    ID = 1
    """По идентификатору"""

    NAME = 2
    """По имени"""

    CHANGED_AT = 3
    """По времени изменения"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CameraCollectionPagingDirectionType(betterproto.Enum):
    """
    Справочник типов направлений сортировки.
     Тип: byte
    """

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CameraAccessAccessorType(betterproto.Enum):
    """Тип субъекта доступа"""

    ACCESSOR_TYPE_UNKNOWN = 0
    """Значение не указно"""

    USER = 1
    """Пользователь"""

    GROUP = 2
    """ГРуппа"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CameraLocationDataStatusType(betterproto.Enum):
    """Справочник статусов устройства"""

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    OFFLINE = 1
    """Не в сети"""

    ONLINE = 2
    """В сети"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CameraLocationDataDeviceType(betterproto.Enum):
    """Тип устройства"""

    DEVICE_TYPE_UNKNOWN = 0
    """Значение не указано"""

    INTERCOM = 1
    """Домофон"""

    VIDEOCAMERA = 2
    """Видеокамера"""

    BARRIER = 3
    """Шлагбаум"""

    GATE = 4
    """Калитка"""

    ACCESS_CONTROL_PANEL = 5
    """СКУД"""

    OUTDOOR_CAMERA = 6
    """Наружняя видеокамера"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CameraVideoDataPagingDirectionType(betterproto.Enum):
    """
    Справочник типов направлений сортировки.
     # Тип: byte
    """

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CameraVideoDataPagingOrderByType(betterproto.Enum):
    """
    Справочник типов значений сортировки.
     # Тип: byte
    """

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    CREATED_AT = 1
    """По дате создания"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraRoom(betterproto.Message):
    """Связь камеры и квартиры"""

    camera_uid: str = betterproto.string_field(1)
    """Идентификатор камеры"""

    orpon: int = betterproto.int64_field(2)
    """ОРПОН дома"""

    room_number: str = betterproto.string_field(3)
    """
    Номер квартиры.
     # Диапазон: 1..4
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraRoomFilter(betterproto.Message):
    """
    Фильтр связок камеры и квартиры.
     При передаче массива в параметр фильтра элементы массива работают в выборке через ИЛИ.
     При передаче нескольких разных параметров фильтра они работают в выборке через И
    """

    camera_uids: "list[str]" = betterproto.string_field(1)
    """
    По Идентификаторам камер.
     # Диапазон: 0..100
    """

    orpons: "list[int]" = betterproto.int64_field(2)
    """
    По ОРПОНам.
     # Диапазон: 0..100
    """

    room_numbers: "list[str]" = betterproto.string_field(3)
    """
    По квартирам.
     # Диапазон: 0..100
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraRoomPaging(betterproto.Message):
    """Постраничный вывод"""

    order_by_type: "CameraRoomPagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки.
     Если значение не передано, то будет взято значение по умолчанию CAMERA_UID
    """

    direction_type: "CameraRoomPagingDirectionType" = betterproto.enum_field(2)
    """
    Тип направления сортировки.
     # По умолчанию: DESC
    """

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу.
     Если значение 0 (не передано), то будет взято значение по умолчанию.
     # Диапазон: 0..100.
     # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     # Диапазон: 0..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Camera(betterproto.Message):
    """Камера"""

    id: str = betterproto.string_field(1)
    """Идентификатор камеры"""

    uid: str = betterproto.string_field(2)
    """uid камеры"""

    name: str = betterproto.string_field(3)
    """Название камеры"""

    is_online: bool = betterproto.bool_field(4)
    """Признак: онлайн камера или нет"""

    is_active_user_camera: bool = betterproto.bool_field(5)
    """Признак: Есть ли у камеры активный пользователь"""

    status_changed_at: datetime = betterproto.message_field(6)
    """Дата и время изменения статуса камеры"""

    mac: str = betterproto.string_field(7)
    """MAC-адрес камеры"""

    ip: str = betterproto.string_field(8)
    """IP камеры"""

    remote_ip: str = betterproto.string_field(9)
    """Внешний IP камеры"""

    tariff_started_at: datetime = betterproto.message_field(10)
    """Дата начала действия текущего тарифа"""

    tariff_ended_at: datetime = betterproto.message_field(11)
    """Дата окончания действия текущего тарифа"""

    tariff_title: str = betterproto.string_field(12)
    """Наименование тарифа"""

    type: "CameraType" = betterproto.enum_field(13)
    """Тип камеры"""

    camera_category_id: int = betterproto.int32_field(14)
    """
    Идентификатор категории.
     Камера - 1, домофон - 2, скуд - 3, шлагбаум - 4
    """

    rtsp_url: str = betterproto.string_field(15)
    """РТСП-ссылка"""

    serial_number: str = betterproto.string_field(16)
    """Серийный номер"""

    company_id: int = betterproto.int32_field(17)
    """Идентификатор компании"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraValidationError(betterproto.Message):
    """Ошибки валидации"""

    rtsp_url_required: "CameraValidationErrorRtspUrlRequired | None" = (
        betterproto.message_field(1, optional=True, group="reason")
    )
    """Поле rtsp_url должно быть заполнено"""

    one_field_mac_or_serial_number_required: (
        "CameraValidationErrorOneFieldMacOrSerialNumberRequired | None"
    ) = betterproto.message_field(2, optional=True, group="reason")
    """Только одно поле обязательно к заполнению mac или serial_number"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraValidationErrorRtspUrlRequired(betterproto.Message):
    """
    Поле rtsp_url должно быть заполнено.
     Только для камер с типом ROSE
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraValidationErrorOneFieldMacOrSerialNumberRequired(betterproto.Message):
    """
    Только одно поле обязательно к заполнению mac или serial_number.
     Для камер с типом VIOLET и DVR
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraFilter(betterproto.Message):
    """Фильтр камер"""

    is_active: "bool | None" = betterproto.message_field(1, wraps=betterproto.TYPE_BOOL)
    """Признак активности камеры"""

    is_channel_alive: "bool | None" = betterproto.message_field(
        2, wraps=betterproto.TYPE_BOOL
    )
    """Признак активности канала"""

    is_online: "bool | None" = betterproto.message_field(3, wraps=betterproto.TYPE_BOOL)
    """Статус камеры"""

    camera_type: "CameraType" = betterproto.enum_field(4)
    """Тип камеры"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraPaging(betterproto.Message):
    """Постраничный вывод"""

    order_by_type: "CameraPagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки.
     Если значение не передано, то будет взято значение по умолчанию
    """

    direction_type: "CameraPagingDirectionType" = betterproto.enum_field(2)
    """
    Тип направления сортировки.
     # По умолчанию: DESC
    """

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу.
     Если значение 0 (не передано), то будет взято значение по умолчанию.
     # Диапазон: 0..100.
     # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     # Диапазон: 0..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraScope(betterproto.Message):
    """Ограничение выборки камер"""

    vc_company_id: int = betterproto.int32_field(1)
    """Внешний идентификатор компании"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraListRequest(betterproto.Message):
    """Запрос на получение списка камер"""

    scope: "CameraScope" = betterproto.message_field(1)
    """Ограничение выборки"""

    filter: "CameraFilter" = betterproto.message_field(2)
    """Фильтр"""

    paging: "CameraPaging | None" = betterproto.message_field(
        3, optional=True, group="pagination"
    )
    """Постраничный вывод"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraListResponse(betterproto.Message):
    """Ответ на получение списка камер"""

    data: "GetCameraListResponseData | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Список"""

    error: "GetCameraListResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraListResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraListResponseData(betterproto.Message):
    """Список"""

    items: "list[Camera]" = betterproto.message_field(1)
    """Список Camera"""

    total: int = betterproto.int32_field(2)
    """Всего количество"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraRequest(betterproto.Message):
    """Запрос получения камеры"""

    scope: "CameraScope" = betterproto.message_field(1)
    """Ограничение выборки"""

    uid: str = betterproto.string_field(2)
    """uid камеры"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraResponse(betterproto.Message):
    """Ответ на запрос получения камеры"""

    data: "Camera | None" = betterproto.message_field(1, optional=True, group="type")
    """Камера"""

    error: "GetCameraResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraRtspUrlExternalIdRequest(betterproto.Message):
    """Запрос получения камеры"""

    external_id: str = betterproto.string_field(1)
    """
    Идентификатор камеры в vcfront.
     # Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraRtspUrlExternalIdResponse(betterproto.Message):
    """
    Ответ на запрос получения RTSP-ссылки по идентификатору камеры в vcfront
    """

    data: "GetCameraRtspUrlExternalIdResponseCameraRtspUrl | None" = (
        betterproto.message_field(1, optional=True, group="type")
    )
    """RTSP-ссылка"""

    error: "GetCameraRtspUrlExternalIdResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraRtspUrlExternalIdResponseCameraRtspUrl(betterproto.Message):
    """RTSP-ссылка"""

    rtsp_url: str = betterproto.string_field(1)
    """RTSP-ссылка"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraRtspUrlExternalIdResponseError(betterproto.Message):
    """Ошибка запроса получения списка камер"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutCameraRoomAttachRequest(betterproto.Message):
    """Запрос привязки камеры и квартиры"""

    data: "CameraRoom" = betterproto.message_field(1)
    """Связь Camera и Room"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutCameraRoomAttachResponse(betterproto.Message):
    """Ответ привязки камеры и квартиры"""

    error: "PutCameraRoomAttachResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutCameraRoomAttachResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutCameraRoomAttachListRequest(betterproto.Message):
    """Запрос пакетной привязки камер и квартир"""

    data: "list[CameraRoom]" = betterproto.message_field(1)
    """Массив связей Camera и Room"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutCameraRoomAttachListResponse(betterproto.Message):
    """Ответ на запрос пакетной привязки камер и квартир"""

    error: "PutCameraRoomAttachListResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutCameraRoomAttachListResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutCameraRoomDetachRequest(betterproto.Message):
    """Запрос отвязки камеры и квартиры"""

    data: "CameraRoom" = betterproto.message_field(1)
    """Связь Camera и Room"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutCameraRoomDetachResponse(betterproto.Message):
    """Ответ отвязки камеры и квартиры"""

    error: "PutCameraRoomDetachResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutCameraRoomDetachResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutCameraRoomDetachListRequest(betterproto.Message):
    """Запрос пакетной отвязки камер и квартир"""

    data: "list[CameraRoom]" = betterproto.message_field(1)
    """Массив связей Camera и Room"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutCameraRoomDetachListResponse(betterproto.Message):
    """Ответ на запрос пакетной отвязки камер и квартир"""

    error: "PutCameraRoomDetachListResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutCameraRoomDetachListResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraRoomCountRequest(betterproto.Message):
    """Запрос получения количества связей камеры и квартиры"""

    filter: "CameraRoomFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraRoomCountResponse(betterproto.Message):
    """Ответ получения количества связей камеры и квартиры"""

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Всего количество"""

    error: "GetCameraRoomCountResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraRoomCountResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraRoomListRequest(betterproto.Message):
    """Запрос получения списка связей камеры и квартиры"""

    filter: "CameraRoomFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "CameraRoomPaging | None" = betterproto.message_field(
        2, optional=True, group="pagination"
    )
    """Постраничный вывод"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraRoomListResponse(betterproto.Message):
    """Ответ получения списка связей камеры и квартиры"""

    data: "CameraRoom | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Связь камеры и квартиры"""

    error: "GetCameraRoomListResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraRoomListResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCameraRequest(betterproto.Message):
    """Запрос удаления камеры"""

    uid: str = betterproto.string_field(1)
    """
    Идентификатор камеры в vcfront.
     # Тип: Guid
    """

    is_delete_permanently: bool = betterproto.bool_field(2)
    """Флаг полного (безвозвратного) удаления камеры"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCameraResponse(betterproto.Message):
    """Ответ на запрос удаления камеры"""

    error: "DeleteCameraResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCameraResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCameraRequest(betterproto.Message):
    """Запрос создания камеры"""

    data: "Camera" = betterproto.message_field(1)
    """Камера"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCameraResponse(betterproto.Message):
    """Ответ на запрос создания камеры"""

    error: "PostCameraResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCameraResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    camera_validation: "CameraValidationError | None" = betterproto.message_field(
        2, optional=True, group="reason"
    )
    """Ошибка валидации"""

    vc: "PostCameraResponseErrorVcError | None" = betterproto.message_field(
        3, optional=True, group="reason"
    )
    """Ошибка в сервисе ВН"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCameraResponseErrorVcError(betterproto.Message):
    """Ошибка в сервисе ВН"""

    text: str = betterproto.string_field(1)
    """Текст ошибки"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCalendarRequest(betterproto.Message):
    """Запрос получения дней, когда доступны записи"""

    uid: str = betterproto.string_field(1)
    """
    Идентификатор камеры в vcfront.
     # Тип: Guid
    """

    offset: "int | None" = betterproto.message_field(2, wraps=betterproto.TYPE_INT32)
    """Смещение от UTC в минутах"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCalendarResponse(betterproto.Message):
    """Ответ на запрос получения дней, когда доступны записи"""

    data: "GetCameraCalendarResponseCaledar | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Дни с записями"""

    error: "GetCameraCalendarResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCalendarResponseCaledar(betterproto.Message):
    """Дни с записями"""

    items: "list[str]" = betterproto.string_field(1)
    """День с записью"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCalendarResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    vc: "GetCameraCalendarResponseErrorVcError | None" = betterproto.message_field(
        2, optional=True, group="reason"
    )
    """Ошибка в сервисе ВН"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCalendarResponseErrorVcError(betterproto.Message):
    """Ошибка в сервисе ВН"""

    text: str = betterproto.string_field(1)
    """Текст ошибки"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraIntervalsRequest(betterproto.Message):
    """Запрос получения интервалов, когда доступны записи"""

    uid: str = betterproto.string_field(1)
    """
    Идентификатор камеры в vcfront.
     # Тип: Guid
    """

    offset: "int | None" = betterproto.message_field(2, wraps=betterproto.TYPE_INT32)
    """Смещение от UTC в минутах"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraIntervalsResponse(betterproto.Message):
    """Ответ на запрос получения интервалов, когда доступны записи"""

    data: "GetCameraIntervalsResponseInterval | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Интервалы"""

    error: "GetCameraIntervalsResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraIntervalsResponseInterval(betterproto.Message):
    """Интервалы"""

    items: "list[GetCameraIntervalsResponseIntervalItem]" = betterproto.message_field(1)
    """Список интервалов"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraIntervalsResponseIntervalItem(betterproto.Message):
    """Интервал"""

    since_at: datetime = betterproto.message_field(1)
    """
    Значение интервала с.
     # Тип: DateTime
    """

    till_at: datetime = betterproto.message_field(2)
    """
    Значение интервала до.
     # Тип: DateTime
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraIntervalsResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    vc: "GetCameraIntervalsResponseErrorVcError | None" = betterproto.message_field(
        2, optional=True, group="reason"
    )
    """Ошибка в сервисе ВН"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraIntervalsResponseErrorVcError(betterproto.Message):
    """Ошибка в сервисе ВН"""

    text: str = betterproto.string_field(1)
    """Текст ошибки"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ValidationError(betterproto.Message):
    """
    Ошибки валидации.
     Эти проверки выполняются до обращения в базу данных
    """

    path: str = betterproto.string_field(1)
    """Путь к полю в формате наименования прото"""

    message: str = betterproto.string_field(2)
    """Валидационное сообщение"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCollectionCountRequest(betterproto.Message):
    """Запрос получения количества коллекций камер"""

    filter: "CameraCollectionFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCollectionCountResponse(betterproto.Message):
    """Ответ на запрос получения количества коллекций камер"""

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Всего"""

    error: "GetCameraCollectionCountResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCollectionCountResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCollectionRequest(betterproto.Message):
    """Запрос получения коллекции камер"""

    id: str = betterproto.string_field(1)
    """
    Идентификатор коллекции камер.
     Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCollectionResponse(betterproto.Message):
    """Ответ на запрос получения коллекции камер"""

    data: "CameraCollection | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Коллекция камер"""

    error: "GetCameraCollectionResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCollectionResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCollectionListRequest(betterproto.Message):
    """Запрос получения списка коллекций камер"""

    filter: "CameraCollectionFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "CameraCollectionPaging | None" = betterproto.message_field(
        2, optional=True, group="pagination"
    )
    """Постраничный вывод"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraCollectionFilter(betterproto.Message):
    """Фильтр коллекций камер"""

    text: str = betterproto.string_field(1)
    """
    По тексту.
     Если значение не передано то поиск по нему не производится.
     # Диапазон: 3..64.
     # Поиск производится по полям:
     # - Наименование.
     # - Описание.
     # - Теги коллекции
    """

    tags: "list[str]" = betterproto.string_field(2)
    """
    По тегам.
     Диапазон: 0..10
    """

    company_ids: "list[int]" = betterproto.int64_field(3)
    """
    По компаниям.
     Диапазон: 0..10
    """

    is_deleted: "bool | None" = betterproto.message_field(
        4, wraps=betterproto.TYPE_BOOL
    )
    """
    Показывать удаленные.
     Если поле не передано, по умолчанию false, фильтр исключает удаленные
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraCollectionPaging(betterproto.Message):
    """Постраничный вывод"""

    order_by_type: "CameraCollectionPagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки.
     Если значение не передано, то будет взято значение по умолчанию.
     По умолчанию: CHANGED_AT
    """

    direction_type: "CameraCollectionPagingDirectionType" = betterproto.enum_field(2)
    """
    Тип направления сортировки.
     По умолчанию: DESC
    """

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу.
     Если значение 0 (не передано), то будет взято значение по умолчанию.
     Диапазон: 0..100.
     По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     Диапазон: 0..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCollectionListResponse(betterproto.Message):
    """Ответ на запрос получения списка коллекций камер"""

    data: "CameraCollection | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Коллекция камер"""

    error: "GetCameraCollectionListResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraCollectionListResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class SaveCameraCollectionRequest(betterproto.Message):
    """Запрос на создание коллекции камер"""

    data: "CameraCollection" = betterproto.message_field(1)
    """Коллекция камер"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class SaveCameraCollectionResponse(betterproto.Message):
    """Ответ на запрос на создание коллекции камер"""

    data: "CameraCollection | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Коллекция камер"""

    error: "SaveCameraCollectionResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class SaveCameraCollectionResponseError(betterproto.Message):
    """Ошибка запроса создания"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    saving: "CameraCollectionSavingError | None" = betterproto.message_field(
        2, optional=True, group="reason"
    )
    """Ошибка сохранения"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraCollection(betterproto.Message):
    """Коллекция камер"""

    id: str = betterproto.string_field(1)
    """
    Идентификатор коллекции камер.
     Тип: Guid
    """

    name: str = betterproto.string_field(2)
    """
    Наименование.
     Диапазон: 3..256
    """

    changed_at: datetime = betterproto.message_field(3)
    """
    Дата изменения коллекции камер.
     Поле используется при редактировании и создании для контроля актуальности изменяемой версии
    """

    company_id: int = betterproto.int64_field(4)
    """Идентификатор компании"""

    deleted_at: datetime = betterproto.message_field(5)
    """
    Дата удаления коллекции камер.
     Поле изменяется через методы Delete и Restore
    """

    description: str = betterproto.string_field(6)
    """
    Описание.
     Диапазон: 0..256
    """

    tags: "list[str]" = betterproto.string_field(7)
    """
    Теги коллекции.
     Диапазон: 0..10
    """

    external_camera_ids: "list[str]" = betterproto.string_field(8)
    """Привязанные к коллекции камеры"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraCollectionSavingError(betterproto.Message):
    """Ошибка сохранения"""

    conflict: "CameraCollectionSavingErrorConflict | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Конфликт версий"""

    wrong_company_id: "CameraCollectionSavingErrorWrongCompanyId | None" = (
        betterproto.message_field(2, optional=True, group="reason")
    )
    """Попытка сохранить коллекцию камер с company_id не своей компании"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraCollectionSavingErrorConflict(betterproto.Message):
    """
    Конфликт версий.
     Причины:
     - В базе хранится другая версия строки, значения changed_at отличаются
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraCollectionSavingErrorWrongCompanyId(betterproto.Message):
    """
    Попытка сохранить коллекцию камер с company_id не своей компании.
     Для ролей owner, employee сохранение разрешено только с company_id своей компании
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCameraCollectionRequest(betterproto.Message):
    """Запрос удаления коллекции камер"""

    id: str = betterproto.string_field(1)
    """
    Идентификатор коллекции камер.
     Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCameraCollectionRestoreRequest(betterproto.Message):
    """Запрос восстановления удаленной коллекции камер"""

    id: str = betterproto.string_field(1)
    """
    Идентификатор коллекции камер.
     Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCameraCollectionResponse(betterproto.Message):
    """Ответ на запрос удаления коллекции камер"""

    error: "DeleteCameraCollectionResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCameraCollectionResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCameraCollectionRestoreResponse(betterproto.Message):
    """Ответ на запрос восстановления удаленной коллекции камер"""

    error: "PostCameraCollectionRestoreResponseError | None" = (
        betterproto.message_field(1, optional=True, group="type")
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCameraCollectionRestoreResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraAccess(betterproto.Message):
    """
    Доступ к камере.
     # Описание модели
    """

    external_id: str = betterproto.string_field(1)
    """
    Идентификатор камеры в vcfront.
     # Тип: Guid
    """

    accessor_type: "CameraAccessAccessorType" = betterproto.enum_field(2)
    """Тип субъекта доступа"""

    accessor_id: str = betterproto.string_field(3)
    """
    Идентификатор субъекта доступа.
     # Диапазон: 1..36
    """

    vc_company_id: int = betterproto.int32_field(4)
    """
    Идентификатор компании в vcfront.
     # Диапазон: 1..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CreateCameraAccessTask(betterproto.Message):
    """
    Задача на создание доступа к камере.
     Очередь key.vc.create_camera_access
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    external_ids: "list[str]" = betterproto.string_field(2)
    """
    Идентификаторы камер в vcfront.
     # Тип: Guid
    """

    camera_access_accessor_type: "CameraAccessAccessorType" = betterproto.enum_field(3)
    """Тип субъекта доступа"""

    accessor_id: str = betterproto.string_field(4)
    """
    Идентификатор субъекта доступа.
     # Диапазон: 1..36
    """

    vc_company_id: int = betterproto.int32_field(5)
    """
    Идентификатор компании в vcfront.
     # Диапазон: 1..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCameraAccessTask(betterproto.Message):
    """
    Задача на удаление доступа к камере.
     Очередь key.vc.delete_camera_access
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    external_ids: "list[str]" = betterproto.string_field(2)
    """
    Идентификаторы камер в vcfront.
     # Тип: Guid
    """

    camera_access_accessor_type: "CameraAccessAccessorType" = betterproto.enum_field(3)
    """Тип субъекта доступа"""

    accessor_id: str = betterproto.string_field(4)
    """
    Идентификатор субъекта доступа.
     # Диапазон: 1..36
    """

    vc_company_id: int = betterproto.int32_field(5)
    """
    Идентификатор компании в vcfront.
     # Диапазон: 1..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DetachCameraFromDeviceTask(betterproto.Message):
    """
    Задача на отвязку камеры от устройств.
     Отправляется при удалении камеры.
     Очередь key.vc.detach_camera_from_devices
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    external_id: str = betterproto.string_field(2)
    """
    Идентификатор камер в vcfront.
     # Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DetachCameraFromAccessPointTask(betterproto.Message):
    """
    Задача на отвязку камеры от точек доступа.
     Отправляется при удалении камеры.
     Очередь key.vc.detach_camera_from_access_points
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    external_id: str = betterproto.string_field(2)
    """
    Идентификатор камер в vcfront.
     # Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraLocationDataRequest(betterproto.Message):
    """Запрос на получение данных o местонахождении камеры"""

    uid: str = betterproto.string_field(1)
    """uid видеопотока камеры"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraLocationDataResponse(betterproto.Message):
    """Ответ на запрос на получение данных o местонахождении камеры"""

    data: "CameraLocationData | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Данные o местонахождении камеры"""

    error: "GetCameraLocationDataResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraLocationDataResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraLocationData(betterproto.Message):
    """Данные o местонахождении камеры"""

    uid: str = betterproto.string_field(1)
    """
    Идентификатор видеопотока в системе Видеокомфорт.
     Тип: Guid
    """

    device_type: "CameraLocationDataDeviceType" = betterproto.enum_field(2)
    """
    Тип устройства.
     # Тип: byte
    """

    model: str = betterproto.string_field(3)
    """Модель устройства"""

    serial_number: str = betterproto.string_field(4)
    """Серийный номер устройства"""

    hw_version: str = betterproto.string_field(5)
    """Версия аппаратного обеспечения"""

    sw_version: str = betterproto.string_field(6)
    """Версия программного обеспечения"""

    mac: str = betterproto.string_field(7)
    """
    MAC-адрес.
     # Диапазон: 17..17.
     # Паттерн: /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/
    """

    title: str = betterproto.string_field(8)
    """
    Наименование устройства.
     # Диапазон: 3..256
    """

    host: str = betterproto.string_field(9)
    """
    Сетевой адрес.
     # Диапазон: 0..250
    """

    status_type: "CameraLocationDataStatusType" = betterproto.enum_field(10)
    """Статус устройства"""

    entrance_numbers: "list[int]" = betterproto.int32_field(11)
    """
    Номер подъезда.
     # Диапазон: 1..100
    """

    flatgramm_id: int = betterproto.int32_field(12)
    """
    Идентификатор квартирограммы.
     # Диапазон: 1..2147483647
    """

    company: "CameraLocationDataCompany" = betterproto.message_field(13)
    """Компания владелец устройства"""

    buildings: "list[CameraLocationDataBuilding]" = betterproto.message_field(14)
    """Массив домов камеры"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraLocationDataBuilding(betterproto.Message):
    """Дом"""

    id: int = betterproto.int32_field(1)
    """Идентификатор дома"""

    rf_id: int = betterproto.int32_field(2)
    """Идентификатор РФ"""

    mrf_id: int = betterproto.int32_field(3)
    """Идентификатор МРФ"""

    orpon: int = betterproto.int64_field(4)
    """ОРПОН"""

    city: str = betterproto.string_field(5)
    """Город"""

    street: str = betterproto.string_field(6)
    """Улица"""

    number: str = betterproto.string_field(7)
    """Номер дома"""

    part: str = betterproto.string_field(8)
    """Корпус"""

    company_id: int = betterproto.int32_field(9)
    """Идентификатор компании"""

    prefix: str = betterproto.string_field(10)
    """Префикс"""

    created_at: datetime = betterproto.message_field(11)
    """
    Дата создания.
     # Тип: DateTime
    """

    deleted_at: datetime = betterproto.message_field(12)
    """
    Дата удаления.
     # Тип: DateTime
    """

    flatgramm_id: int = betterproto.int32_field(13)
    """Идентификатор квартирограммы"""

    city_orpon: int = betterproto.int64_field(14)
    """ОРПОН города, в котором находится дом"""

    fias: str = betterproto.string_field(15)
    """
    Идентификатор в федеральной информационной адресной системе.
     Тип: Guid
    """

    district: str = betterproto.string_field(16)
    """
    Наименования района.
     # Диапазон: 0..200
    """

    unom: str = betterproto.string_field(17)
    """
    Уникальный номер адреса.
     # Диапазон: 0..9999999999
    """

    region_orpon: int = betterproto.int64_field(18)
    """ОРПОН региона"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraLocationDataCompany(betterproto.Message):
    """Компания"""

    id: int = betterproto.int32_field(1)
    """
    Идентификатор компании.
     # Диапазон: 1..2147483647
    """

    vc_company_id: int = betterproto.int64_field(2)
    """Идентификатор компании в системе Видеокомфорт"""

    name: str = betterproto.string_field(3)
    """Наименование компании"""

    inn: str = betterproto.string_field(4)
    """ИНН"""

    kpp: str = betterproto.string_field(5)
    """КПП"""

    ogrn: str = betterproto.string_field(6)
    """ОГРН"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraVideoData(betterproto.Message):
    """Камера"""

    uid: str = betterproto.string_field(1)
    """
    Идентификатор камеры в системе Видеокомфорт.
     Тип: Guid
    """

    category: "CameraVideoDataCategory" = betterproto.message_field(2)
    """Категория камеры"""

    title: str = betterproto.string_field(3)
    """Наименование камеры"""

    serial_number: str = betterproto.string_field(4)
    """Серийный номер камеры"""

    ip: str = betterproto.string_field(5)
    """IP камеры"""

    streamer_url: str = betterproto.string_field(6)
    """Адрес видео-потока (https соединение)"""

    mac: str = betterproto.string_field(7)
    """MAC-адрес камеры"""

    model: str = betterproto.string_field(8)
    """Модель камеры"""

    vendor: str = betterproto.string_field(9)
    """Производитель камеры"""

    status: "CameraVideoDataStatus" = betterproto.message_field(10)
    """Статус камеры"""

    screenshot_url_template: str = betterproto.string_field(11)
    """URL скриншотов разных размеров в JPG-формате"""

    screenshot_precise_url_template: str = betterproto.string_field(12)
    """Шаблон для “точных” скриншотов. Выдаёт скриншоты всех размеров"""

    user_token: str = betterproto.string_field(13)
    """U-Токен, кука, которая выдается Умному Дому"""

    streamer_token: str = betterproto.string_field(14)
    """Токен для воспроизведения видео с камеры"""

    screenshot_token: str = betterproto.string_field(15)
    """Токен для получения контента с cdn (например, файлов изображений)"""

    archive_length: int = betterproto.int32_field(16)
    """Глубина хранения видео в минутах"""

    location: "CameraVideoDataLocation" = betterproto.message_field(17)
    """Координаты месторасположения"""

    created_at: datetime = betterproto.message_field(18)
    """Дата создания"""

    updated_at: datetime = betterproto.message_field(19)
    """Дата обновления"""

    utc_offset: int = betterproto.int32_field(20)
    """
    Смещение таймзоны в минутах.
     # Диапазон: -720..840
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraVideoDataCategory(betterproto.Message):
    """Категория камеры"""

    id: int = betterproto.int32_field(1)
    """Идентификатор группы"""

    type: str = betterproto.string_field(2)
    """Тип группы"""

    title: str = betterproto.string_field(3)
    """Имя группы"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraVideoDataLocation(betterproto.Message):
    """Координаты месторасположения"""

    lat: float = betterproto.double_field(1)
    """Широта"""

    lng: float = betterproto.double_field(2)
    """Долгота"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraVideoDataStatus(betterproto.Message):
    """Статус камеры"""

    id: int = betterproto.int32_field(1)
    """Идентификатор статуса"""

    type: str = betterproto.string_field(2)
    """online/offline"""

    title: str = betterproto.string_field(3)
    """Доступна/Не доступна"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraVideoDataFilter(betterproto.Message):
    """Фильтр камер"""

    uids: "list[str]" = betterproto.string_field(1)
    """
    Идентификатор камеры в системе Видеокомфорт.
     Тип: Guid
    """

    title: "list[str]" = betterproto.string_field(2)
    """Наименование камеры"""

    mac: "list[str]" = betterproto.string_field(3)
    """MAC-адрес камеры"""

    ip: "list[str]" = betterproto.string_field(4)
    """IP камеры"""

    serial_number: "list[str]" = betterproto.string_field(5)
    """Серийный номер камеры"""

    category: "list[str]" = betterproto.string_field(6)
    """Категория камеры"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraVideoDataPaging(betterproto.Message):
    """Постраничный вывод"""

    order_by_type: "CameraVideoDataPagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки.
     Если значение не передано, то будет взято значение по умолчанию.
     По умолчанию: UID
    """

    direction_type: "CameraVideoDataPagingDirectionType" = betterproto.enum_field(2)
    """
    Тип направления сортировки.
     # По умолчанию: DESC
    """

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу.
     Если значение 0 (не передано), то будет взято значение по умолчанию.
     # Диапазон: 0..100.
     # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     # Диапазон: 0..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraVideoDataScope(betterproto.Message):
    """Ограничение выборки камер"""

    company_id: "int | None" = betterproto.int64_field(1, optional=True, group="scope")
    """Идентификатор компании"""

    user_id: "int | None" = betterproto.int32_field(2, optional=True, group="scope")
    """Идентификатор пользователя"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraVideoDataCountRequest(betterproto.Message):
    """Запрос на получение количества камер"""

    scope: "CameraVideoDataScope" = betterproto.message_field(1)
    """Ограничение выборки"""

    filter: "CameraVideoDataFilter" = betterproto.message_field(2)
    """Фильтр"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraVideoDataCountResponse(betterproto.Message):
    """Ответ на получение количества камер"""

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Всего количество"""

    error: "GetCameraVideoDataCountResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraVideoDataCountResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraVideoDataListRequest(betterproto.Message):
    """Запрос на получение списка камер"""

    scope: "CameraVideoDataScope" = betterproto.message_field(1)
    """Ограничение выборки"""

    filter: "CameraVideoDataFilter" = betterproto.message_field(2)
    """Фильтр"""

    paging: "CameraVideoDataPaging | None" = betterproto.message_field(
        3, optional=True, group="pagination"
    )
    """Постраничный вывод"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraVideoDataListResponse(betterproto.Message):
    """Ответ на получение списка камер"""

    data: "list[CameraVideoData]" = betterproto.message_field(1)
    """Камера"""

    error: "GetCameraVideoDataListResponseError" = betterproto.message_field(2)
    """Ошибка"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCameraVideoDataListResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCompanyImpersonationRequest(betterproto.Message):
    """Запрос генерации имперсонационной ссылки для компании"""

    company_id: int = betterproto.int32_field(1)
    """
    Идентификатор компании.
     # Диапазон: 1..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCompanyImpersonationResponse(betterproto.Message):
    """Ответ на запрос генерации имперсонационной ссылки для компании"""

    data: "PostCompanyImpersonationResponseCompanyImpersonation | None" = (
        betterproto.message_field(1, optional=True, group="type")
    )
    """Имперсонационная ссылка"""

    error: "PostCompanyImpersonationResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCompanyImpersonationResponseError(betterproto.Message):
    """Ошибка генерации имперсонационной ссылки для компании"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    owner_not_found: "PostCompanyImpersonationResponseErrorOwnerNotFound | None" = (
        betterproto.message_field(2, optional=True, group="reason")
    )
    """Владелец компании не найден"""

    user_service_error: (
        "PostCompanyImpersonationResponseErrorUserServiceError | None"
    ) = betterproto.message_field(3, optional=True, group="reason")
    """Ошибка взаимодействия с сервисом User"""

    vcfront_service_error: (
        "PostCompanyImpersonationResponseErrorVcfrontServiceError | None"
    ) = betterproto.message_field(4, optional=True, group="reason")
    """Ошибка взаимодействия с сервисом vcfront"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCompanyImpersonationResponseErrorOwnerNotFound(betterproto.Message):
    """Владелец компании не найден"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCompanyImpersonationResponseErrorUserServiceError(betterproto.Message):
    """Ошибка взаимодействия с сервисом User"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCompanyImpersonationResponseErrorVcfrontServiceError(betterproto.Message):
    """Ошибка взаимодействия с сервисом vcfront"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCompanyImpersonationResponseCompanyImpersonation(betterproto.Message):
    """Имперсонационная ссылка"""

    url: str = betterproto.string_field(1)
    """Одноразовая ссылка для имперсонации"""


class CameraServiceStub(betterproto.ServiceStub):
    async def get_camera_room_count(
        self,
        get_camera_room_count_request: "GetCameraRoomCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCameraRoomCountResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraService/GetCameraRoomCount",
            get_camera_room_count_request,
            GetCameraRoomCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_camera_room_list(
        self,
        get_camera_room_list_request: "GetCameraRoomListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetCameraRoomListResponse]":
        async for response in self._unary_stream(
            "/keyapis.vc.v1.CameraService/GetCameraRoomList",
            get_camera_room_list_request,
            GetCameraRoomListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_camera(
        self,
        get_camera_request: "GetCameraRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCameraResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraService/GetCamera",
            get_camera_request,
            GetCameraResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_camera_list(
        self,
        get_camera_list_request: "GetCameraListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCameraListResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraService/GetCameraList",
            get_camera_list_request,
            GetCameraListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_camera_rtsp_url_external_id(
        self,
        get_camera_rtsp_url_external_id_request: "GetCameraRtspUrlExternalIdRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCameraRtspUrlExternalIdResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraService/GetCameraRtspUrlExternalId",
            get_camera_rtsp_url_external_id_request,
            GetCameraRtspUrlExternalIdResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_camera_room_attach(
        self,
        put_camera_room_attach_request: "PutCameraRoomAttachRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PutCameraRoomAttachResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraService/PutCameraRoomAttach",
            put_camera_room_attach_request,
            PutCameraRoomAttachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_camera_room_detach(
        self,
        put_camera_room_detach_request: "PutCameraRoomDetachRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PutCameraRoomDetachResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraService/PutCameraRoomDetach",
            put_camera_room_detach_request,
            PutCameraRoomDetachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_camera_room_attach_list(
        self,
        put_camera_room_attach_list_request: "PutCameraRoomAttachListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PutCameraRoomAttachListResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraService/PutCameraRoomAttachList",
            put_camera_room_attach_list_request,
            PutCameraRoomAttachListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_camera_room_detach_list(
        self,
        put_camera_room_detach_list_request: "PutCameraRoomDetachListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PutCameraRoomDetachListResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraService/PutCameraRoomDetachList",
            put_camera_room_detach_list_request,
            PutCameraRoomDetachListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_camera(
        self,
        delete_camera_request: "DeleteCameraRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeleteCameraResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraService/DeleteCamera",
            delete_camera_request,
            DeleteCameraResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_camera(
        self,
        post_camera_request: "PostCameraRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostCameraResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraService/PostCamera",
            post_camera_request,
            PostCameraResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_camera_calendar(
        self,
        get_camera_calendar_request: "GetCameraCalendarRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCameraCalendarResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraService/GetCameraCalendar",
            get_camera_calendar_request,
            GetCameraCalendarResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_camera_intervals(
        self,
        get_camera_intervals_request: "GetCameraIntervalsRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCameraIntervalsResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraService/GetCameraIntervals",
            get_camera_intervals_request,
            GetCameraIntervalsResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class CameraCollectionServiceStub(betterproto.ServiceStub):
    async def get_camera_collection(
        self,
        get_camera_collection_request: "GetCameraCollectionRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCameraCollectionResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraCollectionService/GetCameraCollection",
            get_camera_collection_request,
            GetCameraCollectionResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_camera_collection_list(
        self,
        get_camera_collection_list_request: "GetCameraCollectionListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetCameraCollectionListResponse]":
        async for response in self._unary_stream(
            "/keyapis.vc.v1.CameraCollectionService/GetCameraCollectionList",
            get_camera_collection_list_request,
            GetCameraCollectionListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_camera_collection_count(
        self,
        get_camera_collection_count_request: "GetCameraCollectionCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCameraCollectionCountResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraCollectionService/GetCameraCollectionCount",
            get_camera_collection_count_request,
            GetCameraCollectionCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def save_camera_collection(
        self,
        save_camera_collection_request: "SaveCameraCollectionRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "SaveCameraCollectionResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraCollectionService/SaveCameraCollection",
            save_camera_collection_request,
            SaveCameraCollectionResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_camera_collection(
        self,
        delete_camera_collection_request: "DeleteCameraCollectionRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeleteCameraCollectionResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraCollectionService/DeleteCameraCollection",
            delete_camera_collection_request,
            DeleteCameraCollectionResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_camera_collection_restore(
        self,
        post_camera_collection_restore_request: "PostCameraCollectionRestoreRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostCameraCollectionRestoreResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraCollectionService/PostCameraCollectionRestore",
            post_camera_collection_restore_request,
            PostCameraCollectionRestoreResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class CameraLocationDataServiceStub(betterproto.ServiceStub):
    async def get_camera_location_data(
        self,
        get_camera_location_data_request: "GetCameraLocationDataRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCameraLocationDataResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraLocationDataService/GetCameraLocationData",
            get_camera_location_data_request,
            GetCameraLocationDataResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class CameraVideoDataServiceStub(betterproto.ServiceStub):
    async def get_camera_video_data_count(
        self,
        get_camera_video_data_count_request: "GetCameraVideoDataCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCameraVideoDataCountResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraVideoDataService/GetCameraVideoDataCount",
            get_camera_video_data_count_request,
            GetCameraVideoDataCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_camera_video_data_list(
        self,
        get_camera_video_data_list_request: "GetCameraVideoDataListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCameraVideoDataListResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CameraVideoDataService/GetCameraVideoDataList",
            get_camera_video_data_list_request,
            GetCameraVideoDataListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class CompanyServiceStub(betterproto.ServiceStub):
    async def post_company_impersonation(
        self,
        post_company_impersonation_request: "PostCompanyImpersonationRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostCompanyImpersonationResponse":
        return await self._unary_unary(
            "/keyapis.vc.v1.CompanyService/PostCompanyImpersonation",
            post_company_impersonation_request,
            PostCompanyImpersonationResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class CameraServiceBase(ServiceBase):

    async def get_camera_room_count(
        self, get_camera_room_count_request: "GetCameraRoomCountRequest"
    ) -> "GetCameraRoomCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_camera_room_list(
        self, get_camera_room_list_request: "GetCameraRoomListRequest"
    ) -> "AsyncIterator[GetCameraRoomListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetCameraRoomListResponse()

    async def get_camera(
        self, get_camera_request: "GetCameraRequest"
    ) -> "GetCameraResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_camera_list(
        self, get_camera_list_request: "GetCameraListRequest"
    ) -> "GetCameraListResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_camera_rtsp_url_external_id(
        self,
        get_camera_rtsp_url_external_id_request: "GetCameraRtspUrlExternalIdRequest",
    ) -> "GetCameraRtspUrlExternalIdResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_camera_room_attach(
        self, put_camera_room_attach_request: "PutCameraRoomAttachRequest"
    ) -> "PutCameraRoomAttachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_camera_room_detach(
        self, put_camera_room_detach_request: "PutCameraRoomDetachRequest"
    ) -> "PutCameraRoomDetachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_camera_room_attach_list(
        self, put_camera_room_attach_list_request: "PutCameraRoomAttachListRequest"
    ) -> "PutCameraRoomAttachListResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_camera_room_detach_list(
        self, put_camera_room_detach_list_request: "PutCameraRoomDetachListRequest"
    ) -> "PutCameraRoomDetachListResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_camera(
        self, delete_camera_request: "DeleteCameraRequest"
    ) -> "DeleteCameraResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_camera(
        self, post_camera_request: "PostCameraRequest"
    ) -> "PostCameraResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_camera_calendar(
        self, get_camera_calendar_request: "GetCameraCalendarRequest"
    ) -> "GetCameraCalendarResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_camera_intervals(
        self, get_camera_intervals_request: "GetCameraIntervalsRequest"
    ) -> "GetCameraIntervalsResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_camera_room_count(
        self,
        stream: "grpclib.server.Stream[GetCameraRoomCountRequest, GetCameraRoomCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_camera_room_count(request)
        await stream.send_message(response)

    async def __rpc_get_camera_room_list(
        self,
        stream: "grpclib.server.Stream[GetCameraRoomListRequest, GetCameraRoomListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_camera_room_list,
            stream,
            request,
        )

    async def __rpc_get_camera(
        self, stream: "grpclib.server.Stream[GetCameraRequest, GetCameraResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_camera(request)
        await stream.send_message(response)

    async def __rpc_get_camera_list(
        self,
        stream: "grpclib.server.Stream[GetCameraListRequest, GetCameraListResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_camera_list(request)
        await stream.send_message(response)

    async def __rpc_get_camera_rtsp_url_external_id(
        self,
        stream: "grpclib.server.Stream[GetCameraRtspUrlExternalIdRequest, GetCameraRtspUrlExternalIdResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_camera_rtsp_url_external_id(request)
        await stream.send_message(response)

    async def __rpc_put_camera_room_attach(
        self,
        stream: "grpclib.server.Stream[PutCameraRoomAttachRequest, PutCameraRoomAttachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_camera_room_attach(request)
        await stream.send_message(response)

    async def __rpc_put_camera_room_detach(
        self,
        stream: "grpclib.server.Stream[PutCameraRoomDetachRequest, PutCameraRoomDetachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_camera_room_detach(request)
        await stream.send_message(response)

    async def __rpc_put_camera_room_attach_list(
        self,
        stream: "grpclib.server.Stream[PutCameraRoomAttachListRequest, PutCameraRoomAttachListResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_camera_room_attach_list(request)
        await stream.send_message(response)

    async def __rpc_put_camera_room_detach_list(
        self,
        stream: "grpclib.server.Stream[PutCameraRoomDetachListRequest, PutCameraRoomDetachListResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_camera_room_detach_list(request)
        await stream.send_message(response)

    async def __rpc_delete_camera(
        self, stream: "grpclib.server.Stream[DeleteCameraRequest, DeleteCameraResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_camera(request)
        await stream.send_message(response)

    async def __rpc_post_camera(
        self, stream: "grpclib.server.Stream[PostCameraRequest, PostCameraResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_camera(request)
        await stream.send_message(response)

    async def __rpc_get_camera_calendar(
        self,
        stream: "grpclib.server.Stream[GetCameraCalendarRequest, GetCameraCalendarResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_camera_calendar(request)
        await stream.send_message(response)

    async def __rpc_get_camera_intervals(
        self,
        stream: "grpclib.server.Stream[GetCameraIntervalsRequest, GetCameraIntervalsResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_camera_intervals(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.vc.v1.CameraService/GetCameraRoomCount": grpclib.const.Handler(
                self.__rpc_get_camera_room_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCameraRoomCountRequest,
                GetCameraRoomCountResponse,
            ),
            "/keyapis.vc.v1.CameraService/GetCameraRoomList": grpclib.const.Handler(
                self.__rpc_get_camera_room_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetCameraRoomListRequest,
                GetCameraRoomListResponse,
            ),
            "/keyapis.vc.v1.CameraService/GetCamera": grpclib.const.Handler(
                self.__rpc_get_camera,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCameraRequest,
                GetCameraResponse,
            ),
            "/keyapis.vc.v1.CameraService/GetCameraList": grpclib.const.Handler(
                self.__rpc_get_camera_list,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCameraListRequest,
                GetCameraListResponse,
            ),
            "/keyapis.vc.v1.CameraService/GetCameraRtspUrlExternalId": grpclib.const.Handler(
                self.__rpc_get_camera_rtsp_url_external_id,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCameraRtspUrlExternalIdRequest,
                GetCameraRtspUrlExternalIdResponse,
            ),
            "/keyapis.vc.v1.CameraService/PutCameraRoomAttach": grpclib.const.Handler(
                self.__rpc_put_camera_room_attach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutCameraRoomAttachRequest,
                PutCameraRoomAttachResponse,
            ),
            "/keyapis.vc.v1.CameraService/PutCameraRoomDetach": grpclib.const.Handler(
                self.__rpc_put_camera_room_detach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutCameraRoomDetachRequest,
                PutCameraRoomDetachResponse,
            ),
            "/keyapis.vc.v1.CameraService/PutCameraRoomAttachList": grpclib.const.Handler(
                self.__rpc_put_camera_room_attach_list,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutCameraRoomAttachListRequest,
                PutCameraRoomAttachListResponse,
            ),
            "/keyapis.vc.v1.CameraService/PutCameraRoomDetachList": grpclib.const.Handler(
                self.__rpc_put_camera_room_detach_list,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutCameraRoomDetachListRequest,
                PutCameraRoomDetachListResponse,
            ),
            "/keyapis.vc.v1.CameraService/DeleteCamera": grpclib.const.Handler(
                self.__rpc_delete_camera,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteCameraRequest,
                DeleteCameraResponse,
            ),
            "/keyapis.vc.v1.CameraService/PostCamera": grpclib.const.Handler(
                self.__rpc_post_camera,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostCameraRequest,
                PostCameraResponse,
            ),
            "/keyapis.vc.v1.CameraService/GetCameraCalendar": grpclib.const.Handler(
                self.__rpc_get_camera_calendar,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCameraCalendarRequest,
                GetCameraCalendarResponse,
            ),
            "/keyapis.vc.v1.CameraService/GetCameraIntervals": grpclib.const.Handler(
                self.__rpc_get_camera_intervals,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCameraIntervalsRequest,
                GetCameraIntervalsResponse,
            ),
        }


class CameraCollectionServiceBase(ServiceBase):

    async def get_camera_collection(
        self, get_camera_collection_request: "GetCameraCollectionRequest"
    ) -> "GetCameraCollectionResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_camera_collection_list(
        self, get_camera_collection_list_request: "GetCameraCollectionListRequest"
    ) -> "AsyncIterator[GetCameraCollectionListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetCameraCollectionListResponse()

    async def get_camera_collection_count(
        self, get_camera_collection_count_request: "GetCameraCollectionCountRequest"
    ) -> "GetCameraCollectionCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def save_camera_collection(
        self, save_camera_collection_request: "SaveCameraCollectionRequest"
    ) -> "SaveCameraCollectionResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_camera_collection(
        self, delete_camera_collection_request: "DeleteCameraCollectionRequest"
    ) -> "DeleteCameraCollectionResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_camera_collection_restore(
        self,
        post_camera_collection_restore_request: "PostCameraCollectionRestoreRequest",
    ) -> "PostCameraCollectionRestoreResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_camera_collection(
        self,
        stream: "grpclib.server.Stream[GetCameraCollectionRequest, GetCameraCollectionResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_camera_collection(request)
        await stream.send_message(response)

    async def __rpc_get_camera_collection_list(
        self,
        stream: "grpclib.server.Stream[GetCameraCollectionListRequest, GetCameraCollectionListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_camera_collection_list,
            stream,
            request,
        )

    async def __rpc_get_camera_collection_count(
        self,
        stream: "grpclib.server.Stream[GetCameraCollectionCountRequest, GetCameraCollectionCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_camera_collection_count(request)
        await stream.send_message(response)

    async def __rpc_save_camera_collection(
        self,
        stream: "grpclib.server.Stream[SaveCameraCollectionRequest, SaveCameraCollectionResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.save_camera_collection(request)
        await stream.send_message(response)

    async def __rpc_delete_camera_collection(
        self,
        stream: "grpclib.server.Stream[DeleteCameraCollectionRequest, DeleteCameraCollectionResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_camera_collection(request)
        await stream.send_message(response)

    async def __rpc_post_camera_collection_restore(
        self,
        stream: "grpclib.server.Stream[PostCameraCollectionRestoreRequest, PostCameraCollectionRestoreResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_camera_collection_restore(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.vc.v1.CameraCollectionService/GetCameraCollection": grpclib.const.Handler(
                self.__rpc_get_camera_collection,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCameraCollectionRequest,
                GetCameraCollectionResponse,
            ),
            "/keyapis.vc.v1.CameraCollectionService/GetCameraCollectionList": grpclib.const.Handler(
                self.__rpc_get_camera_collection_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetCameraCollectionListRequest,
                GetCameraCollectionListResponse,
            ),
            "/keyapis.vc.v1.CameraCollectionService/GetCameraCollectionCount": grpclib.const.Handler(
                self.__rpc_get_camera_collection_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCameraCollectionCountRequest,
                GetCameraCollectionCountResponse,
            ),
            "/keyapis.vc.v1.CameraCollectionService/SaveCameraCollection": grpclib.const.Handler(
                self.__rpc_save_camera_collection,
                grpclib.const.Cardinality.UNARY_UNARY,
                SaveCameraCollectionRequest,
                SaveCameraCollectionResponse,
            ),
            "/keyapis.vc.v1.CameraCollectionService/DeleteCameraCollection": grpclib.const.Handler(
                self.__rpc_delete_camera_collection,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteCameraCollectionRequest,
                DeleteCameraCollectionResponse,
            ),
            "/keyapis.vc.v1.CameraCollectionService/PostCameraCollectionRestore": grpclib.const.Handler(
                self.__rpc_post_camera_collection_restore,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostCameraCollectionRestoreRequest,
                PostCameraCollectionRestoreResponse,
            ),
        }


class CameraLocationDataServiceBase(ServiceBase):

    async def get_camera_location_data(
        self, get_camera_location_data_request: "GetCameraLocationDataRequest"
    ) -> "GetCameraLocationDataResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_camera_location_data(
        self,
        stream: "grpclib.server.Stream[GetCameraLocationDataRequest, GetCameraLocationDataResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_camera_location_data(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.vc.v1.CameraLocationDataService/GetCameraLocationData": grpclib.const.Handler(
                self.__rpc_get_camera_location_data,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCameraLocationDataRequest,
                GetCameraLocationDataResponse,
            ),
        }


class CameraVideoDataServiceBase(ServiceBase):

    async def get_camera_video_data_count(
        self, get_camera_video_data_count_request: "GetCameraVideoDataCountRequest"
    ) -> "GetCameraVideoDataCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_camera_video_data_list(
        self, get_camera_video_data_list_request: "GetCameraVideoDataListRequest"
    ) -> "GetCameraVideoDataListResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_camera_video_data_count(
        self,
        stream: "grpclib.server.Stream[GetCameraVideoDataCountRequest, GetCameraVideoDataCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_camera_video_data_count(request)
        await stream.send_message(response)

    async def __rpc_get_camera_video_data_list(
        self,
        stream: "grpclib.server.Stream[GetCameraVideoDataListRequest, GetCameraVideoDataListResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_camera_video_data_list(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.vc.v1.CameraVideoDataService/GetCameraVideoDataCount": grpclib.const.Handler(
                self.__rpc_get_camera_video_data_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCameraVideoDataCountRequest,
                GetCameraVideoDataCountResponse,
            ),
            "/keyapis.vc.v1.CameraVideoDataService/GetCameraVideoDataList": grpclib.const.Handler(
                self.__rpc_get_camera_video_data_list,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCameraVideoDataListRequest,
                GetCameraVideoDataListResponse,
            ),
        }


class CompanyServiceBase(ServiceBase):

    async def post_company_impersonation(
        self, post_company_impersonation_request: "PostCompanyImpersonationRequest"
    ) -> "PostCompanyImpersonationResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_company_impersonation(
        self,
        stream: "grpclib.server.Stream[PostCompanyImpersonationRequest, PostCompanyImpersonationResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_company_impersonation(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.vc.v1.CompanyService/PostCompanyImpersonation": grpclib.const.Handler(
                self.__rpc_post_company_impersonation,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostCompanyImpersonationRequest,
                PostCompanyImpersonationResponse,
            ),
        }


rebuild_dataclass(CameraRoomPaging)  # type: ignore
rebuild_dataclass(Camera)  # type: ignore
rebuild_dataclass(CameraValidationError)  # type: ignore
rebuild_dataclass(CameraFilter)  # type: ignore
rebuild_dataclass(CameraPaging)  # type: ignore
rebuild_dataclass(GetCameraListRequest)  # type: ignore
rebuild_dataclass(GetCameraListResponse)  # type: ignore
rebuild_dataclass(GetCameraListResponseError)  # type: ignore
rebuild_dataclass(GetCameraListResponseData)  # type: ignore
rebuild_dataclass(GetCameraRequest)  # type: ignore
rebuild_dataclass(GetCameraResponse)  # type: ignore
rebuild_dataclass(GetCameraResponseError)  # type: ignore
rebuild_dataclass(GetCameraRtspUrlExternalIdResponse)  # type: ignore
rebuild_dataclass(GetCameraRtspUrlExternalIdResponseError)  # type: ignore
rebuild_dataclass(PutCameraRoomAttachRequest)  # type: ignore
rebuild_dataclass(PutCameraRoomAttachResponse)  # type: ignore
rebuild_dataclass(PutCameraRoomAttachResponseError)  # type: ignore
rebuild_dataclass(PutCameraRoomAttachListRequest)  # type: ignore
rebuild_dataclass(PutCameraRoomAttachListResponse)  # type: ignore
rebuild_dataclass(PutCameraRoomAttachListResponseError)  # type: ignore
rebuild_dataclass(PutCameraRoomDetachRequest)  # type: ignore
rebuild_dataclass(PutCameraRoomDetachResponse)  # type: ignore
rebuild_dataclass(PutCameraRoomDetachResponseError)  # type: ignore
rebuild_dataclass(PutCameraRoomDetachListRequest)  # type: ignore
rebuild_dataclass(PutCameraRoomDetachListResponse)  # type: ignore
rebuild_dataclass(PutCameraRoomDetachListResponseError)  # type: ignore
rebuild_dataclass(GetCameraRoomCountRequest)  # type: ignore
rebuild_dataclass(GetCameraRoomCountResponse)  # type: ignore
rebuild_dataclass(GetCameraRoomCountResponseError)  # type: ignore
rebuild_dataclass(GetCameraRoomListRequest)  # type: ignore
rebuild_dataclass(GetCameraRoomListResponse)  # type: ignore
rebuild_dataclass(GetCameraRoomListResponseError)  # type: ignore
rebuild_dataclass(DeleteCameraResponse)  # type: ignore
rebuild_dataclass(DeleteCameraResponseError)  # type: ignore
rebuild_dataclass(PostCameraRequest)  # type: ignore
rebuild_dataclass(PostCameraResponse)  # type: ignore
rebuild_dataclass(PostCameraResponseError)  # type: ignore
rebuild_dataclass(GetCameraCalendarRequest)  # type: ignore
rebuild_dataclass(GetCameraCalendarResponse)  # type: ignore
rebuild_dataclass(GetCameraCalendarResponseError)  # type: ignore
rebuild_dataclass(GetCameraIntervalsRequest)  # type: ignore
rebuild_dataclass(GetCameraIntervalsResponse)  # type: ignore
rebuild_dataclass(GetCameraIntervalsResponseInterval)  # type: ignore
rebuild_dataclass(GetCameraIntervalsResponseIntervalItem)  # type: ignore
rebuild_dataclass(GetCameraIntervalsResponseError)  # type: ignore
rebuild_dataclass(GetCameraCollectionCountRequest)  # type: ignore
rebuild_dataclass(GetCameraCollectionCountResponse)  # type: ignore
rebuild_dataclass(GetCameraCollectionCountResponseError)  # type: ignore
rebuild_dataclass(GetCameraCollectionResponse)  # type: ignore
rebuild_dataclass(GetCameraCollectionResponseError)  # type: ignore
rebuild_dataclass(GetCameraCollectionListRequest)  # type: ignore
rebuild_dataclass(CameraCollectionFilter)  # type: ignore
rebuild_dataclass(CameraCollectionPaging)  # type: ignore
rebuild_dataclass(GetCameraCollectionListResponse)  # type: ignore
rebuild_dataclass(GetCameraCollectionListResponseError)  # type: ignore
rebuild_dataclass(SaveCameraCollectionRequest)  # type: ignore
rebuild_dataclass(SaveCameraCollectionResponse)  # type: ignore
rebuild_dataclass(SaveCameraCollectionResponseError)  # type: ignore
rebuild_dataclass(CameraCollection)  # type: ignore
rebuild_dataclass(CameraCollectionSavingError)  # type: ignore
rebuild_dataclass(DeleteCameraCollectionResponse)  # type: ignore
rebuild_dataclass(DeleteCameraCollectionResponseError)  # type: ignore
rebuild_dataclass(PostCameraCollectionRestoreResponse)  # type: ignore
rebuild_dataclass(PostCameraCollectionRestoreResponseError)  # type: ignore
rebuild_dataclass(CameraAccess)  # type: ignore
rebuild_dataclass(CreateCameraAccessTask)  # type: ignore
rebuild_dataclass(DeleteCameraAccessTask)  # type: ignore
rebuild_dataclass(GetCameraLocationDataResponse)  # type: ignore
rebuild_dataclass(GetCameraLocationDataResponseError)  # type: ignore
rebuild_dataclass(CameraLocationData)  # type: ignore
rebuild_dataclass(CameraLocationDataBuilding)  # type: ignore
rebuild_dataclass(CameraVideoData)  # type: ignore
rebuild_dataclass(CameraVideoDataPaging)  # type: ignore
rebuild_dataclass(GetCameraVideoDataCountRequest)  # type: ignore
rebuild_dataclass(GetCameraVideoDataCountResponse)  # type: ignore
rebuild_dataclass(GetCameraVideoDataCountResponseError)  # type: ignore
rebuild_dataclass(GetCameraVideoDataListRequest)  # type: ignore
rebuild_dataclass(GetCameraVideoDataListResponse)  # type: ignore
rebuild_dataclass(GetCameraVideoDataListResponseError)  # type: ignore
rebuild_dataclass(PostCompanyImpersonationResponse)  # type: ignore
rebuild_dataclass(PostCompanyImpersonationResponseError)  # type: ignore
