> ## Documentation Index
> Fetch the complete documentation index at: https://docs.chariot.in/llms.txt
> Use this file to discover all available pages before exploring further.

# Multi-context TTS WebSocket

> Beta. Several independent speech streams (contexts) over one connection. Every message names its `context_id`. The first `input.text` for a new `context_id` opens the context; `input.flush` generates its buffered text as the next segment; `context.close` finishes it and `context.cancel` stops it immediately. Each context ends with one `context.done`, and nothing is sent for it afterwards. Up to 5 contexts can be open at once.
All messages are JSON text frames. Audio arrives in `audio.chunk` messages as base64-encoded raw PCM, signed 16-bit little-endian, mono.
Authenticate with the `chariotai-api-key` header, or with the `api_key` query parameter when your client cannot set handshake headers.
The connection closes with code `1000` after `session.close`, `1008` on an auth or parameter problem or the idle timeout, `1011` on an internal error, and `4402` when the workspace has insufficient credits. Every other error affects a single message or context and leaves the connection open.




## AsyncAPI

````yaml api-reference/asyncapi.yaml ttsMultiStream
id: ttsMultiStream
title: Multi-context text to speech stream (beta)
description: >
  Beta. Several independent speech streams (contexts) over one connection. Every
  message names its `context_id`. The first `input.text` for a new `context_id`
  opens the context; `input.flush` generates its buffered text as the next
  segment; `context.close` finishes it and `context.cancel` stops it
  immediately. Each context ends with one `context.done`, and nothing is sent
  for it afterwards. Up to 5 contexts can be open at once.

  All messages are JSON text frames. Audio arrives in `audio.chunk` messages as
  base64-encoded raw PCM, signed 16-bit little-endian, mono.

  Authenticate with the `chariotai-api-key` header, or with the `api_key` query
  parameter when your client cannot set handshake headers.

  The connection closes with code `1000` after `session.close`, `1008` on an
  auth or parameter problem or the idle timeout, `1011` on an internal error,
  and `4402` when the workspace has insufficient credits. Every other error
  affects a single message or context and leaves the connection open.
servers:
  - id: production
    protocol: wss
    host: api.chariot.in
    bindings: []
    variables: []
address: /v1/tts/ws-multi
parameters: []
bindings:
  - protocol: ws
    version: 0.1.0
    value:
      method: GET
      query:
        type: object
        properties:
          voice_id:
            type: string
            format: uuid
            description: >
              Default voice for contexts that do not set `voice_id` on their
              first message. Optional. Get one from `GET /v1/voices`.
            examples: &ref_0
              - bac7d666-094d-4698-91fa-741d60fce662
          model_type:
            type: string
            enum:
              - chariot-v0
              - chariot-multilingual-v1
            default: chariot-v0
            examples: &ref_1
              - chariot-multilingual-v1
            description: >
              Model for the whole connection. Defaults to `chariot-v0`. Every
              voice used must support it.
          speed:
            type: number
            default: 1
            minimum: 0.5
            maximum: 2
            examples: &ref_2
              - 1
            description: >
              Default speaking rate for contexts. Choose a value from the voice
              model's `speeds` list. `chariot-v0` supports only 1.0.
          optimize_streaming_latency:
            type: integer
            default: 0
            minimum: 0
            maximum: 4
            examples: &ref_3
              - 0
            description: >
              Latency-optimization level for the whole connection. Defaults to
              0, which applies all quality passes.
          idle_timeout:
            type: number
            default: 60
            exclusiveMinimum: 0
            maximum: 300
            examples: &ref_4
              - 60
            description: >
              Seconds the server waits for any client message before closing the
              connection as idle. Must be greater than 0 and at most 300.
          enable_logging:
            type: boolean
            default: false
            examples: &ref_5
              - false
            description: >
              When true, the audio for each generated segment is stored and you
              can retrieve it from your TTS history. Defaults to false.
          api_key:
            type: string
            description: >
              Your API key. Prefer the `chariotai-api-key` header where your
              client supports it.
    schemaProperties:
      - name: method
        type: string
        description: GET
        required: false
      - name: query
        type: object
        required: false
        properties:
          - name: voice_id
            type: string
            description: >
              Default voice for contexts that do not set `voice_id` on their
              first message. Optional. Get one from `GET /v1/voices`.
            examples: *ref_0
            required: false
          - name: model_type
            type: string
            description: >
              Model for the whole connection. Defaults to `chariot-v0`. Every
              voice used must support it.
            enumValues:
              - chariot-v0
              - chariot-multilingual-v1
            examples: *ref_1
            required: false
          - name: speed
            type: number
            description: >
              Default speaking rate for contexts. Choose a value from the voice
              model's `speeds` list. `chariot-v0` supports only 1.0.
            examples: *ref_2
            required: false
          - name: optimize_streaming_latency
            type: integer
            description: >
              Latency-optimization level for the whole connection. Defaults to
              0, which applies all quality passes.
            examples: *ref_3
            required: false
          - name: idle_timeout
            type: number
            description: >
              Seconds the server waits for any client message before closing the
              connection as idle. Must be greater than 0 and at most 300.
            examples: *ref_4
            required: false
          - name: enable_logging
            type: boolean
            description: >
              When true, the audio for each generated segment is stored and you
              can retrieve it from your TTS history. Defaults to false.
            examples: *ref_5
            required: false
          - name: api_key
            type: string
            description: >
              Your API key. Prefer the `chariotai-api-key` header where your
              client supports it.
            required: false
operations:
  - &ref_14
    id: sendToChariotMulti
    title: Client to server
    description: Messages you send to Chariot.
    type: receive
    messages:
      - &ref_16
        id: inputText
        payload:
          - name: Append text
            description: >
              Append text to a context's buffer. The first input.text for a
              context_id opens the context. Does not generate audio on its own.
            type: object
            properties:
              - name: type
                type: string
                description: input.text
                required: true
              - name: context_id
                type: string
                description: The context this message is for.
                examples: &ref_6
                  - turn-1
                required: false
              - name: text
                type: string
                description: >
                  Text to append. Each fragment must fit 500 characters for
                  `chariot-v0` or 1,000 for `chariot-multilingual-v1`. If the
                  context's unflushed text would exceed that limit, the buffered
                  text is generated as a segment first, so no text is dropped.
                  An empty string keeps the context alive without generating
                  anything.
                examples: &ref_7
                  - 'Your order shipped on Monday. '
                required: true
              - name: voice_id
                type: string
                description: >
                  Voice for this context. Only read on the context's first
                  message; defaults to the connection's `voice_id`.
                required: false
              - name: speed
                type: number
                description: >
                  Speaking rate for this context. Only read on the context's
                  first message; defaults to the connection's `speed`.
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          required:
            - type
            - text
          properties:
            type:
              type: string
              const: input.text
              x-parser-schema-id: <anonymous-schema-27>
            context_id:
              type: string
              pattern: ^[A-Za-z0-9_.:-]{1,128}$
              default: default
              description: The context this message is for.
              examples: *ref_6
              x-parser-schema-id: <anonymous-schema-28>
            text:
              type: string
              description: >
                Text to append. Each fragment must fit 500 characters for
                `chariot-v0` or 1,000 for `chariot-multilingual-v1`. If the
                context's unflushed text would exceed that limit, the buffered
                text is generated as a segment first, so no text is dropped. An
                empty string keeps the context alive without generating
                anything.
              examples: *ref_7
              x-parser-schema-id: <anonymous-schema-29>
            voice_id:
              type: string
              format: uuid
              description: >
                Voice for this context. Only read on the context's first
                message; defaults to the connection's `voice_id`.
              x-parser-schema-id: <anonymous-schema-30>
            speed:
              type: number
              description: >
                Speaking rate for this context. Only read on the context's first
                message; defaults to the connection's `speed`.
              x-parser-schema-id: <anonymous-schema-31>
          x-parser-schema-id: <anonymous-schema-26>
        title: Append text
        description: >
          Append text to a context's buffer. The first input.text for a
          context_id opens the context. Does not generate audio on its own.
        example: |-
          {
            "type": "<string>",
            "context_id": "<string>",
            "text": "<string>",
            "voice_id": "<string>",
            "speed": 123
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: inputText
      - &ref_17
        id: inputFlush
        payload:
          - name: Flush and generate
            description: >-
              Generate the context's buffered text as its next segment. The
              context stays open.
            type: object
            properties:
              - name: type
                type: string
                description: input.flush
                required: true
              - name: context_id
                type: string
                description: The context this message is for.
                examples: &ref_8
                  - turn-1
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          required:
            - type
          properties:
            type:
              type: string
              const: input.flush
              x-parser-schema-id: <anonymous-schema-33>
            context_id:
              type: string
              pattern: ^[A-Za-z0-9_.:-]{1,128}$
              default: default
              description: The context this message is for.
              examples: *ref_8
              x-parser-schema-id: <anonymous-schema-34>
          x-parser-schema-id: <anonymous-schema-32>
        title: Flush and generate
        description: >-
          Generate the context's buffered text as its next segment. The context
          stays open.
        example: |-
          {
            "type": "<string>",
            "context_id": "<string>"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: inputFlush
      - &ref_18
        id: contextClose
        payload:
          - name: Close context
            description: >
              No more text for this context. The rest of its buffer is
              generated, all audio is delivered, then context.done arrives with
              reason completed.
            type: object
            properties:
              - name: type
                type: string
                description: context.close
                required: true
              - name: context_id
                type: string
                description: The context this message is for.
                examples: &ref_9
                  - turn-1
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          required:
            - type
          properties:
            type:
              type: string
              const: context.close
              x-parser-schema-id: <anonymous-schema-36>
            context_id:
              type: string
              pattern: ^[A-Za-z0-9_.:-]{1,128}$
              default: default
              description: The context this message is for.
              examples: *ref_9
              x-parser-schema-id: <anonymous-schema-37>
          x-parser-schema-id: <anonymous-schema-35>
        title: Close context
        description: >
          No more text for this context. The rest of its buffer is generated,
          all audio is delivered, then context.done arrives with reason
          completed.
        example: |-
          {
            "type": "<string>",
            "context_id": "<string>"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: contextClose
      - &ref_19
        id: contextCancel
        payload:
          - name: Cancel context
            description: >
              End the context now: generation in progress is stopped, queued and
              unflushed text is discarded, and context.done arrives with reason
              cancelled. No audio for the context is sent after it. Ignored if
              the context has already ended.
            type: object
            properties:
              - name: type
                type: string
                description: context.cancel
                required: true
              - name: context_id
                type: string
                description: The context this message is for.
                examples: &ref_10
                  - turn-1
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          required:
            - type
          properties:
            type:
              type: string
              const: context.cancel
              x-parser-schema-id: <anonymous-schema-39>
            context_id:
              type: string
              pattern: ^[A-Za-z0-9_.:-]{1,128}$
              default: default
              description: The context this message is for.
              examples: *ref_10
              x-parser-schema-id: <anonymous-schema-40>
          x-parser-schema-id: <anonymous-schema-38>
        title: Cancel context
        description: >
          End the context now: generation in progress is stopped, queued and
          unflushed text is discarded, and context.done arrives with reason
          cancelled. No audio for the context is sent after it. Ignored if the
          context has already ended.
        example: |-
          {
            "type": "<string>",
            "context_id": "<string>"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: contextCancel
      - &ref_20
        id: sessionClose
        payload:
          - name: Close session
            description: >-
              Finish every open context as if each received context.close, then
              close the connection.
            type: object
            properties:
              - name: type
                type: string
                description: session.close
                required: true
        headers: []
        jsonPayloadSchema:
          type: object
          required:
            - type
          properties:
            type:
              type: string
              const: session.close
              x-parser-schema-id: <anonymous-schema-42>
          x-parser-schema-id: <anonymous-schema-41>
        title: Close session
        description: >-
          Finish every open context as if each received context.close, then
          close the connection.
        example: |-
          {
            "type": "<string>"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: sessionClose
      - &ref_21
        id: ping
        payload:
          - name: Ping
            description: Keep the connection alive. Answered with pong.
            type: object
            properties:
              - name: type
                type: string
                description: ping
                required: true
        headers: []
        jsonPayloadSchema:
          type: object
          required:
            - type
          properties:
            type:
              type: string
              const: ping
              x-parser-schema-id: <anonymous-schema-44>
          x-parser-schema-id: <anonymous-schema-43>
        title: Ping
        description: Keep the connection alive. Answered with pong.
        example: |-
          {
            "type": "<string>"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: ping
    bindings: []
    extensions: &ref_13
      - id: x-parser-unique-object-id
        value: ttsMultiStream
  - &ref_15
    id: receiveFromChariotMulti
    title: Server to client
    description: Messages Chariot sends back to you.
    type: send
    messages:
      - &ref_22
        id: sessionReady
        payload:
          - name: Session ready
            description: The connection is authenticated and ready.
            type: object
            properties:
              - name: type
                type: string
                description: session.ready
                required: false
              - name: session_id
                type: string
                required: false
              - name: max_contexts
                type: integer
                examples: &ref_11
                  - 5
                required: false
              - name: sample_rate
                type: integer
                examples: &ref_12
                  - 44100
                required: false
              - name: encoding
                type: string
                description: pcm_s16le
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          properties:
            type:
              type: string
              const: session.ready
              x-parser-schema-id: <anonymous-schema-46>
            session_id:
              type: string
              format: uuid
              x-parser-schema-id: <anonymous-schema-47>
            max_contexts:
              type: integer
              examples: *ref_11
              x-parser-schema-id: <anonymous-schema-48>
            sample_rate:
              type: integer
              examples: *ref_12
              x-parser-schema-id: <anonymous-schema-49>
            encoding:
              type: string
              const: pcm_s16le
              x-parser-schema-id: <anonymous-schema-50>
          x-parser-schema-id: <anonymous-schema-45>
        title: Session ready
        description: The connection is authenticated and ready.
        example: |-
          {
            "type": "<string>",
            "session_id": "<string>",
            "max_contexts": 123,
            "sample_rate": 123,
            "encoding": "<string>"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: sessionReady
      - &ref_23
        id: audioStart
        payload:
          - name: Segment started
            description: A segment of a context is about to stream.
            type: object
            properties:
              - name: type
                type: string
                description: audio.start
                required: false
              - name: context_id
                type: string
                required: false
              - name: segment
                type: integer
                description: Zero-based segment number within the context.
                required: false
              - name: sample_rate
                type: integer
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          properties:
            type:
              type: string
              const: audio.start
              x-parser-schema-id: <anonymous-schema-52>
            context_id:
              type: string
              x-parser-schema-id: <anonymous-schema-53>
            segment:
              type: integer
              description: Zero-based segment number within the context.
              x-parser-schema-id: <anonymous-schema-54>
            sample_rate:
              type: integer
              default: 44100
              x-parser-schema-id: <anonymous-schema-55>
          x-parser-schema-id: <anonymous-schema-51>
        title: Segment started
        description: A segment of a context is about to stream.
        example: |-
          {
            "type": "<string>",
            "context_id": "<string>",
            "segment": 123,
            "sample_rate": 123
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: audioStart
      - &ref_24
        id: audioChunk
        payload:
          - name: Audio
            description: Audio for a segment.
            type: object
            properties:
              - name: type
                type: string
                description: audio.chunk
                required: false
              - name: context_id
                type: string
                required: false
              - name: segment
                type: integer
                required: false
              - name: audio
                type: string
                description: Base64-encoded raw PCM, signed 16-bit little-endian, mono.
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          properties:
            type:
              type: string
              const: audio.chunk
              x-parser-schema-id: <anonymous-schema-57>
            context_id:
              type: string
              x-parser-schema-id: <anonymous-schema-58>
            segment:
              type: integer
              x-parser-schema-id: <anonymous-schema-59>
            audio:
              type: string
              contentEncoding: base64
              description: Base64-encoded raw PCM, signed 16-bit little-endian, mono.
              x-parser-schema-id: <anonymous-schema-60>
          x-parser-schema-id: <anonymous-schema-56>
        title: Audio
        description: Audio for a segment.
        example: |-
          {
            "type": "<string>",
            "context_id": "<string>",
            "segment": 123,
            "audio": "<string>"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: audioChunk
      - &ref_25
        id: audioDone
        payload:
          - name: Segment finished
            description: >-
              The segment has finished streaming. Carries the credits charged
              for it.
            type: object
            properties:
              - name: type
                type: string
                description: audio.done
                required: false
              - name: context_id
                type: string
                required: false
              - name: segment
                type: integer
                required: false
              - name: credits_utilized
                type: integer
                description: >-
                  Credits charged for this segment, at 1 credit per input
                  character.
                required: false
              - name: error
                type: boolean
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          properties:
            type:
              type: string
              const: audio.done
              x-parser-schema-id: <anonymous-schema-62>
            context_id:
              type: string
              x-parser-schema-id: <anonymous-schema-63>
            segment:
              type: integer
              x-parser-schema-id: <anonymous-schema-64>
            credits_utilized:
              type: integer
              description: >-
                Credits charged for this segment, at 1 credit per input
                character.
              x-parser-schema-id: <anonymous-schema-65>
            error:
              type: boolean
              x-parser-schema-id: <anonymous-schema-66>
          x-parser-schema-id: <anonymous-schema-61>
        title: Segment finished
        description: >-
          The segment has finished streaming. Carries the credits charged for
          it.
        example: |-
          {
            "type": "<string>",
            "context_id": "<string>",
            "segment": 123,
            "credits_utilized": 123,
            "error": true
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: audioDone
      - &ref_26
        id: contextDone
        payload:
          - name: Context ended
            description: The last message for a context, whatever ended it.
            type: object
            properties:
              - name: type
                type: string
                description: context.done
                required: false
              - name: context_id
                type: string
                required: false
              - name: reason
                type: string
                enumValues:
                  - completed
                  - cancelled
                  - expired
                  - error
                  - session_closed
                required: false
              - name: segments
                type: integer
                description: Segments of this context that finished.
                required: false
              - name: credits_utilized
                type: integer
                description: >
                  Total credits charged for this context. A segment that had
                  started generating when the context was cancelled is included.
                required: false
              - name: code
                type: string
                description: Present when reason is error.
                required: false
              - name: message
                type: string
                description: Present when reason is error.
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          properties:
            type:
              type: string
              const: context.done
              x-parser-schema-id: <anonymous-schema-68>
            context_id:
              type: string
              x-parser-schema-id: <anonymous-schema-69>
            reason:
              type: string
              enum:
                - completed
                - cancelled
                - expired
                - error
                - session_closed
              x-parser-schema-id: <anonymous-schema-70>
            segments:
              type: integer
              description: Segments of this context that finished.
              x-parser-schema-id: <anonymous-schema-71>
            credits_utilized:
              type: integer
              description: >
                Total credits charged for this context. A segment that had
                started generating when the context was cancelled is included.
              x-parser-schema-id: <anonymous-schema-72>
            code:
              type: string
              description: Present when reason is error.
              x-parser-schema-id: <anonymous-schema-73>
            message:
              type: string
              description: Present when reason is error.
              x-parser-schema-id: <anonymous-schema-74>
          x-parser-schema-id: <anonymous-schema-67>
        title: Context ended
        description: The last message for a context, whatever ended it.
        example: |-
          {
            "type": "<string>",
            "context_id": "<string>",
            "reason": "<string>",
            "segments": 123,
            "credits_utilized": 123,
            "code": "<string>",
            "message": "<string>"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: contextDone
      - &ref_27
        id: errorMessage
        payload:
          - name: Error
            description: >
              A message was rejected. The connection stays open unless code is
              insufficient_credits (closes with 4402) or idle_timeout (closes
              with 1008).
            type: object
            properties:
              - name: type
                type: string
                description: error
                required: false
              - name: code
                type: string
                enumValues:
                  - bad_request
                  - unknown_context
                  - context_limit
                  - context_closing
                  - session_closing
                  - text_too_long
                  - voice_unavailable
                  - concurrency_limit
                  - forbidden
                  - upstream_error
                  - insufficient_credits
                  - idle_timeout
                required: false
              - name: message
                type: string
                required: false
              - name: context_id
                type: string
                description: The context the error concerns, if any.
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          properties:
            type:
              type: string
              const: error
              x-parser-schema-id: <anonymous-schema-76>
            code:
              type: string
              enum:
                - bad_request
                - unknown_context
                - context_limit
                - context_closing
                - session_closing
                - text_too_long
                - voice_unavailable
                - concurrency_limit
                - forbidden
                - upstream_error
                - insufficient_credits
                - idle_timeout
              x-parser-schema-id: <anonymous-schema-77>
            message:
              type: string
              x-parser-schema-id: <anonymous-schema-78>
            context_id:
              type: string
              description: The context the error concerns, if any.
              x-parser-schema-id: <anonymous-schema-79>
          x-parser-schema-id: <anonymous-schema-75>
        title: Error
        description: >
          A message was rejected. The connection stays open unless code is
          insufficient_credits (closes with 4402) or idle_timeout (closes with
          1008).
        example: |-
          {
            "type": "<string>",
            "code": "<string>",
            "message": "<string>",
            "context_id": "<string>"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: errorMessage
      - &ref_28
        id: sessionDone
        payload:
          - name: Session complete
            description: >-
              Sent after session.close once every context has finished. The
              connection then closes with code 1000.
            type: object
            properties:
              - name: type
                type: string
                description: session.done
                required: false
              - name: contexts
                type: integer
                required: false
              - name: credits_utilized
                type: integer
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          properties:
            type:
              type: string
              const: session.done
              x-parser-schema-id: <anonymous-schema-81>
            contexts:
              type: integer
              x-parser-schema-id: <anonymous-schema-82>
            credits_utilized:
              type: integer
              x-parser-schema-id: <anonymous-schema-83>
          x-parser-schema-id: <anonymous-schema-80>
        title: Session complete
        description: >-
          Sent after session.close once every context has finished. The
          connection then closes with code 1000.
        example: |-
          {
            "type": "<string>",
            "contexts": 123,
            "credits_utilized": 123
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: sessionDone
      - &ref_29
        id: pong
        payload:
          - name: Pong
            description: Answer to ping.
            type: object
            properties:
              - name: type
                type: string
                description: pong
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          properties:
            type:
              type: string
              const: pong
              x-parser-schema-id: <anonymous-schema-85>
          x-parser-schema-id: <anonymous-schema-84>
        title: Pong
        description: Answer to ping.
        example: |-
          {
            "type": "<string>"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: pong
    bindings: []
    extensions: *ref_13
sendOperations:
  - *ref_14
receiveOperations:
  - *ref_15
sendMessages:
  - *ref_16
  - *ref_17
  - *ref_18
  - *ref_19
  - *ref_20
  - *ref_21
receiveMessages:
  - *ref_22
  - *ref_23
  - *ref_24
  - *ref_25
  - *ref_26
  - *ref_27
  - *ref_28
  - *ref_29
extensions:
  - id: x-parser-unique-object-id
    value: ttsMultiStream
securitySchemes: []

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.