# Twitter X Image Downloader (`solid-scraper/twitter-x-image-downloader`) Actor

📥 Download Twitter/X images fast with X Image Downloader! 🚀 Save posts, photos, and media in high quality in seconds. Perfect for creators, marketers, and researchers. 🔍 No hassle—start downloading now! ⚡️

- **URL**: https://apify.com/solid-scraper/twitter-x-image-downloader.md
- **Developed by:** [SolidScraper](https://apify.com/solid-scraper) (community)
- **Categories:** Social media, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

### Twitter (X.com) Image Downloader 🖼️

**Twitter (X.com) Image Downloader** extracts image metadata and high-quality thumbnails from Twitter/X post links. If you’re trying to **save Twitter images**, build media collections, or quickly analyze image content at scale, this actor streamlines the process using your provided Twitter/X status URLs—saving you hours of manual work. Whether you’re a marketer, data analyst, researcher, or media ops specialist, this **Twitter image downloader** helps you turn X links into structured, usable output—like the **X.com image downloader** workflow for bulk download and media-aware pipelines.

---

### Why choose Twitter (X.com) Image Downloader?

| Feature | Benefit |
| --- | --- |
| ✅ **Post URL support** | Lets you scrape Twitter/X post URLs directly (bulk-friendly) |
| ✅ **Structured JSON output** | Returns consistent fields like `metadata` and `images` for easy downstream use |
| ✅ **Built-in resilience** | Includes retries and fallbacks for resilience across runs |
| ✅ **Proxy support** | Helps with reliable scraping by using built-in proxy support for large batches |
| ✅ **Single-run batching** | Processes many links in one actor run and emits results as they’re ready |
| ✅ **Export-ready records** | Produces media data that can be exported (JSON/CSV) from Apify outputs |

---

### Key features

- 🧩 **Twitter/X status URL support**: Feed one or more post links via `post_urls`, including standard `.../status/<id>` URLs.
- 📊 **Image metadata + thumbnail extraction**: Each result includes `metadata` (title, `twitter_id`, thumbnail, and `image_count`) plus an `images` array.
- 💾 **Optional Key-Value Store URL generation**: When `key_value` is enabled, the actor generates `kv_store_url` entries instead of direct image URLs.
- 🔄 **Retry logic for reliability**: Uses up to **3 attempts** per post URL to improve success rates when extraction fails temporarily.
- 🛡️ **Proxy-friendly scraping**: Uses built-in proxy support to keep runs stable, especially for bulk requests.
- 🧠 **Clean, usable titles**: Normalizes the extracted title (removes newlines, extra whitespace, and formats it into a cleaner single line).
- ⚡ **Results streamed to output**: Each processed URL pushes its `result` immediately, so you can monitor progress during long runs.

---

### Input

Provide input via an `input.json` file. Example structure:

```json
{
  "post_urls": [
    "https://x.com/iamsrk/status/1994361290421383203"
  ],
  "key_value": false
}
````

#### Input Fields

| Field | Required | Description |
| --- | --- | --- |
| `post_urls` | ✅ | List of Twitter/X status URLs to scrape. Provide one URL per item (e.g., links containing `/status/<id>`). |
| `key_value` | ❌ | When set to `true`, the actor generates URLs pointing to records in a key-value store (simulated). When `false`, it returns direct image `url` values. |

***

### Output

The actor saves each post’s extracted data in JSON format.

Sample output:

```json
[
  {
    "success": true,
    "tweet_url": "https://x.com/iamsrk/status/1994361290421383203",
    "metadata": {
      "title": "Some post title",
      "twitter_id": "1994361290421383203",
      "thumbnail": "https://example.com/thumbnail.jpg",
      "image_count": 1
    },
    "images": [
      {
        "format": "jpg",
        "width": 1200,
        "height": 675,
        "resolution": "1200x675",
        "url": "https://example.com/image.jpg"
      }
    ]
  }
]
```

#### Output Fields

| Field | Type | Description |
| --- | --- | --- |
| `success` | boolean | `true` if the actor extracted the post successfully; `false` if it failed. |
| `tweet_url` | string | The original Twitter/X URL that was processed. |
| `metadata` | object | Post-level info including `title`, `twitter_id`, `thumbnail`, and `image_count`. |
| `metadata.title` | string | Cleaned title extracted from the post info. |
| `metadata.twitter_id` | string | The extracted status ID from the URL (or the `info.id` fallback). |
| `metadata.thumbnail` | string | A thumbnail URL for the post (parameters are stripped if present). |
| `metadata.image_count` | number | Number of image entries included in `images`. |
| `images` | array | Image objects for the selected thumbnail resolution. |
| `images[].format` | string | Image format (the actor sets `"jpg"`). |
| `images[].width` | number | Image width (set to `1200`). |
| `images[].height` | number | Image height (set to `675`). |
| `images[].resolution` | string | Resolution string in the form `1200x675`. |
| `images[].url` | string | Present when `key_value` is `false`: direct image URL from the extracted data. |
| `images[].kv_store_url` | string | Present when `key_value` is `true`: a generated key-value store record URL for the image. |
| `error` | string | Present when `success` is `false`: the error message text. |

> You can export results from Apify outputs (typically JSON/CSV depending on your workflow).

***

### How to use Twitter (X.com) Image Downloader (via Apify Console)

1. **Open Apify Console**\
   Log in at https://console.apify.com and go to the **Actors** page.

2. **Find Twitter (X.com) Image Downloader**\
   Search for **Twitter (X.com) Image Downloader** and open the actor details page.

3. **Click “Run”**\
   Start a new run using the input form.

4. **Enter your `post_urls`**\
   Paste one or many Twitter/X post links into `post_urls`. Each item should be a URL to a status (commonly includes `/status/<id>`).

5. **Optional: enable `key_value`**\
   If you want image entries to include `kv_store_url` instead of direct `url`, set `key_value` to `true`.

6. **Select proxy settings (if shown in the UI)**\
   The actor is designed to use built-in proxy support for more reliable extraction during bulk runs.

7. **Monitor logs and retries**\
   During the run, you’ll see processing messages per URL. If a URL fails, the actor attempts retries before recording a failure.

8. **Open the dataset output and export**\
   After the run, open the **OUTPUT** dataset to review results and export your data (JSON/CSV via Apify UI).

No coding required—get Twitter image downloader results in minutes.

***

### Advanced features & SEO optimization

- 🖼️ **Engineered for “save Twitter images” use cases**: The actor returns thumbnail URLs and a structured `images` array for easy media-aware workflows.
- 🌐 **Bulk-friendly Twitter photo downloader workflow**: Provide multiple X links in `post_urls` and get consistent, export-ready records.
- 🔄 **Resilient extraction behavior**: Includes retries (up to **3 attempts per URL**) to handle temporary extraction issues.
- 🛡️ **Proxy support for reliability**: Built-in proxy support helps keep large batches stable when scraping publicly available data.
- 🔎 **Use your keywords and filters in your pipeline**: While this actor focuses on link-based extraction, it’s designed to plug into lead-gen and research pipelines that also filter by domains, themes, or other business rules.

***

### Best use cases

- 📈 **Lead generation teams**: Build media-enriched lead research from batches of X post links for outreach research.
- 🧑‍🔬 **Market researchers**: Collect thumbnail and title metadata from Twitter (X.com) Image Downloader outputs to support qualitative analysis.
- 🎯 **Influencer marketers**: Quickly compile a visual snapshot library using a Twitter image downloader approach for campaign planning.
- 📰 **Content teams**: Organize image assets by post URL and export structured metadata to streamline curation workflows.
- 💻 **Developer pipelines**: Feed consistent JSON into downstream scripts for indexing, archiving, or media categorization.
- 📊 **Data analysts**: Compare title/thumbnail metadata across many posts using bulk download X images records.
- 🗂️ **Brand monitoring**: Track and save Twitter images from specific accounts’ posts to support recurring reporting.

***

### Technical specifications

- **Supported Input Formats**
  - ✅ `post_urls`: array of Twitter/X status URLs (string items)
- **Key fields required**
  - ✅ `post_urls`
- **Proxy Support**
  - ✅ Built-in proxy support for reliable scraping in bulk scenarios
- **Retry Mechanism**
  - ✅ Up to **3 attempts per URL**
- **Dataset Structure**
  - ✅ JSON records pushed per processed URL with:
    - `success`, `tweet_url`, `metadata`, `images` (or `error` on failure)
- **Rate Limits & Performance**
  - ✅ No hard limits are stated in the actor code; performance depends on public page accessibility and network conditions
- **Limitations**
  - ❌ If `post_urls` is empty or contains no valid URL strings, the actor logs an error and stops.
  - ❌ If extraction fails for a URL, the output record will include `success: false` and an `error` field.

***

### FAQ

#### Can I download multiple Twitter (X.com) images in one run?

✅ Yes. Add multiple Twitter/X status links to `post_urls`. The actor processes each URL and pushes a structured result for every processed link.

#### What does the actor return for each tweet link?

✅ Each processed URL returns `success`, the original `tweet_url`, a `metadata` object (including `title`, `twitter_id`, `thumbnail`, and `image_count`), and an `images` array containing the image entry fields.

#### Do I get direct image URLs or key-value store record URLs?

✅ It depends on your input: when `key_value` is `false`, image entries include `images[].url`. When `key_value` is `true`, image entries include `images[].kv_store_url` instead.

#### How does it handle failures?

✅ If extraction fails after the actor’s retry attempts, it outputs a record with `success: false`, the `tweet_url`, and an `error` field containing the error message.

#### Is authentication required for using this Twitter (X.com) Image Downloader?

✅ No authentication is described in the actor inputs. The actor is built to scrape publicly available data from provided post links.

#### Can I use this as part of a lead generation workflow?

✅ Yes. While this actor focuses on Twitter photo downloader-style media extraction from post URLs, you can combine its output with your own filtering logic in your pipeline (for example, matching themes or other business rules).

#### Does it support exporting data to other formats?

✅ In the Apify workflow, you can typically export dataset results from the **OUTPUT** tab (commonly as JSON/CSV depending on your setup).

***

### Support & feature requests

Want to improve your Twitter (X.com) Image Downloader results? Share feedback and feature requests—we’re building this Twitter image downloader for real-world extraction workflows.

- 💡 **Feature Requests**: Examples include adding more image resolutions, richer metadata fields, or different output shaping for bulk download X images workflows.
- 📧 **Contact**: For support or suggestions, email <dataforleads@gmail.com>.

Your feedback helps shape the roadmap for this Twitter (X.com) Image Downloader.

***

### Closing CTA / Final thoughts

*If you’re looking for an SEO-optimized way to extract media from Twitter/X links, Twitter (X.com) Image Downloader is built for fast, structured results at scale.* Try it today and turn post URLs into a clean media dataset in minutes.

***

### Disclaimer

**This tool accesses publicly accessible sources only.** It does not access private profiles, authenticated data, or password-protected pages. It’s your responsibility to comply with applicable laws (including GDPR/CCPA where relevant), spam regulations, and each platform’s Terms of Service.

If you need data removal, contact <dataforleads@gmail.com>. Always use Twitter (X.com) Image Downloader responsibly, ethically, and for legitimate purposes.

# Actor input Schema

## `post_urls` (type: `array`):

List of Twitter/X status URLs to scrape.

## `key_value` (type: `boolean`):

If true, generates URLs pointing to records in the key-value store (simulated).

## Actor input object example

```json
{
  "post_urls": [
    "https://x.com/iamsrk/status/1994361290421383203"
  ],
  "key_value": false
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "post_urls": [
        "https://x.com/iamsrk/status/1994361290421383203"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("solid-scraper/twitter-x-image-downloader").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "post_urls": ["https://x.com/iamsrk/status/1994361290421383203"] }

# Run the Actor and wait for it to finish
run = client.actor("solid-scraper/twitter-x-image-downloader").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "post_urls": [
    "https://x.com/iamsrk/status/1994361290421383203"
  ]
}' |
apify call solid-scraper/twitter-x-image-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solid-scraper/twitter-x-image-downloader",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Twitter X Image Downloader",
        "description": "📥 Download Twitter/X images fast with X Image Downloader! 🚀 Save posts, photos, and media in high quality in seconds. Perfect for creators, marketers, and researchers. 🔍 No hassle—start downloading now! ⚡️",
        "version": "0.1",
        "x-build-id": "gL8JD4yw7GuwudDgc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solid-scraper~twitter-x-image-downloader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solid-scraper-twitter-x-image-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/solid-scraper~twitter-x-image-downloader/runs": {
            "post": {
                "operationId": "runs-sync-solid-scraper-twitter-x-image-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/solid-scraper~twitter-x-image-downloader/run-sync": {
            "post": {
                "operationId": "run-sync-solid-scraper-twitter-x-image-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "post_urls"
                ],
                "properties": {
                    "post_urls": {
                        "title": "Post URLs",
                        "type": "array",
                        "description": "List of Twitter/X status URLs to scrape.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "key_value": {
                        "title": "Use Key-Value Store",
                        "type": "boolean",
                        "description": "If true, generates URLs pointing to records in the key-value store (simulated).",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
