# FedRAMP Marketplace Authorization Monitor (`defenestrator/fedramp-marketplace-authorization-monitor`) Actor

Monitor official FedRAMP Marketplace product authorization/status data for vendor-risk, procurement, and compliance drift.

- **URL**: https://apify.com/defenestrator/fedramp-marketplace-authorization-monitor.md
- **Developed by:** [Defenestrator](https://apify.com/defenestrator) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 fedramp authorization product rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## FedRAMP Marketplace Authorization Monitor

Monitor official FedRAMP Marketplace product authorization and status data for vendor-risk, procurement, and compliance drift.

This Actor reads the public JSON data maintained by FedRAMP and returns decision-ready rows for Cloud Service Offerings (CSOs): current public status, impact level, authorization path, annual assessment dates, reuse counts, status timeline signals, and changes versus a previous snapshot.

### What it is good for

- Vendor-risk teams watching whether a cloud service moved from Ready/In Process to Authorized/Certified, or the reverse.
- Public-sector procurement teams monitoring specific CSPs and CSOs on an approved-products watchlist.
- GRC teams that want a scheduled FedRAMP Marketplace delta feed, not a one-off manual search.
- Partner or reseller teams watching high-impact or high-reuse products for procurement timing signals.

### Data source

The Actor uses official public FedRAMP Marketplace JSON files from `FedRAMP/marketplace-fedramp-gov-data`:

- `data.json` as the current Marketplace product source.
- `fedramp-status-changelog.json` for status timelines.
- `fedramp-products.json` only as legacy/enrichment data where it has fields not present in the current export.

The repository README says certification data is uploaded daily between 2-3 AM ET and the Marketplace status changelog between 3-4 AM ET. The Actor records source export timestamps in `OUTPUT`.

### Input

- `searchTerms` — vendor/product/category/agency terms to match. Empty means use the newest/recently changed Marketplace products up to `maxProducts`.
- `productIds` — exact FedRAMP IDs to include, such as `FR2000863987A`.
- `statuses`, `impactLevels`, `serviceModels` — optional filters.
- `changedSince` or `recentChangeWindowDays` — flags recent status updates.
- `assessmentDueWindowDays` — flags annual assessments due soon or overdue.
- `previousSnapshot` — optional prior rows from this Actor. Inline JSON comparison avoids requiring private Apify dataset access in this MVP.
- `includeAllRows` — false returns only alert rows.
- `maxProducts` — keeps scheduled runs cheap and reviewable.

### Output fields

Each dataset row includes:

- FedRAMP product ID, CSP, CSO, official Marketplace URL.
- Public/internal status, impact level, service/deployment/auth fields.
- Authorization date, status update date, annual assessment date and days-to-due.
- Reuse and authorization counts.
- Matched watch terms and latest status-timeline entry.
- Delta fields versus `previousSnapshot`.
- Alert flag, alert reasons, priority, recommendation, and stable row hash.

### Repeat-use loop

Run it on a schedule with the same watch terms/product IDs. Save the previous dataset rows or selected row hashes and pass them back as `previousSnapshot` on the next run to detect drift. Even without a previous snapshot, the Actor flags recent Marketplace status changes and assessment dates inside the configured windows.

### Pricing

from $2.00 / 1,000 FedRAMP authorization product rows

This Actor uses Apify Pay per Event pricing with platform usage included. The row event is charged only for useful rows written to the default dataset.

| Event | Price | Unit |
|---|---:|---|
| Actor start (`apify-actor-start`) | `$0.00005` | Once when the run starts. |
| FedRAMP authorization product row (`apify-default-dataset-item`) | `$0.002` | Per FedRAMP authorization product row. |

A row is one FedRAMP Marketplace cloud service offering / authorization status row. Apify plan discounts, user-configured max-charge limits, and any future Apify pricing UI changes may affect final charges.

### Limitations and responsible use

- Unofficial tool; not affiliated with, endorsed by, or sponsored by FedRAMP, GSA, or any listed vendor.
- Uses official public Marketplace data, but users should verify critical procurement/compliance decisions against FedRAMP.gov and the relevant agency/vendor records.
- Does not output vendor contact emails by default and is not positioned as a lead-generation list.
- No browser rendering, proxying, login, or paid API is used.
- `previousSnapshot` uses inline JSON so API users and scheduled runs can compare against selected prior rows without granting additional Apify storage permissions.

<!-- HERMES_PORTFOLIO_BUNDLE_START -->

### Related Actors in this portfolio

This Actor is part of the **Cloud platform drift monitors** group. These are narrow, source-specific Apify Actors intended for scheduled checks and repeatable dataset exports — not broad scraped-content feeds.

- [FedRAMP Marketplace Authorization Monitor](https://apify.com/defenestrator/fedramp-marketplace-authorization-monitor) — FedRAMP Marketplace authorization/status monitoring for vendor-risk workflows.
- [AWS IAM Service Authorization Drift Monitor](https://apify.com/defenestrator/aws-iam-service-authorization-drift-monitor) — AWS IAM Service Authorization Reference drift checks for cloud-security reviews.
- [CloudFormation Resource Spec Drift Monitor](https://apify.com/defenestrator/cloudformation-resource-spec-drift-monitor) — CloudFormation resource-spec drift checks for replacement-risk and required-property changes.

Each listing includes its own source notes, limits, pricing, and responsible-use caveats. Use the official source links in each Actor when decisions require verification.

<!-- HERMES_PORTFOLIO_BUNDLE_END -->

# Actor input Schema

## `searchTerms` (type: `array`):

Optional vendor, product, category, agency, or keyword filters. Empty means monitor the newest/recently changed Marketplace products up to maxProducts.
## `productIds` (type: `array`):

Optional exact product IDs, e.g. FR2000863987A. If provided, rows for these products are included even when searchTerms do not match.
## `statuses` (type: `array`):

Optional public status filters such as FedRAMP Authorized, FedRAMP Certified, FedRAMP Ready, FedRAMP In Process, or Agency Auth In Process.
## `impactLevels` (type: `array`):

Optional impact filters such as Low, Moderate, High, Class B (Low), Class C (Moderate), or Class D (High). Matching is case-insensitive and substring-based.
## `serviceModels` (type: `array`):

Optional service model filters such as SaaS, PaaS, or IaaS.
## `changedSince` (type: `string`):

Optional ISO date. If omitted, the Actor uses today minus recentChangeWindowDays. Used to flag recent status updates and status-timeline changes.
## `recentChangeWindowDays` (type: `integer`):

Used when changedSince is empty. Products with status updates or status-timeline entries inside this window are alert candidates.
## `assessmentDueWindowDays` (type: `integer`):

Flag authorized products whose annual assessment date is overdue or due within this many days.
## `minReuseCount` (type: `integer`):

Optional minimum reuse count to focus on widely reused services. Zero disables this filter.
## `previousSnapshot` (type: `array`):

Optional prior rows from this Actor's dataset. The Actor compares status, impact, assessment, authorization, reuse, and row hashes to flag drift. Inline JSON avoids requiring Apify storage permissions in this private MVP.
## `includeAllRows` (type: `boolean`):

If false, only alert rows are pushed to the dataset; OUTPUT still includes run counts.
## `maxProducts` (type: `integer`):

Upper bound after filtering and sorting. Keeps scheduled runs cheap and datasets reviewable.
## `requestTimeoutSecs` (type: `integer`):

Timeout for each official FedRAMP JSON request.

## Actor input object example

```json
{
  "searchTerms": [
    "Cloudflare",
    "DataRobot",
    "Anecdotes",
    "Secureframe"
  ],
  "productIds": [],
  "statuses": [],
  "impactLevels": [],
  "serviceModels": [],
  "changedSince": "",
  "recentChangeWindowDays": 30,
  "assessmentDueWindowDays": 90,
  "minReuseCount": 0,
  "previousSnapshot": [],
  "includeAllRows": true,
  "maxProducts": 100,
  "requestTimeoutSecs": 45
}
````

# Actor output Schema

## `results` (type: `string`):

Dataset rows: one official Marketplace product per matched result unless includeAllRows=false.

## `summary` (type: `string`):

Run-level summary including source timestamps, filter counts, alert counts, and limitations.

# 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 = {
    "searchTerms": [
        "Cloudflare",
        "DataRobot",
        "Anecdotes",
        "Secureframe"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("defenestrator/fedramp-marketplace-authorization-monitor").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 = { "searchTerms": [
        "Cloudflare",
        "DataRobot",
        "Anecdotes",
        "Secureframe",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("defenestrator/fedramp-marketplace-authorization-monitor").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 '{
  "searchTerms": [
    "Cloudflare",
    "DataRobot",
    "Anecdotes",
    "Secureframe"
  ]
}' |
apify call defenestrator/fedramp-marketplace-authorization-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=defenestrator/fedramp-marketplace-authorization-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "FedRAMP Marketplace Authorization Monitor",
        "description": "Monitor official FedRAMP Marketplace product authorization/status data for vendor-risk, procurement, and compliance drift.",
        "version": "0.0",
        "x-build-id": "tDCqcsU17K5ukAI7a"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/defenestrator~fedramp-marketplace-authorization-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-defenestrator-fedramp-marketplace-authorization-monitor",
                "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/defenestrator~fedramp-marketplace-authorization-monitor/runs": {
            "post": {
                "operationId": "runs-sync-defenestrator-fedramp-marketplace-authorization-monitor",
                "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/defenestrator~fedramp-marketplace-authorization-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-defenestrator-fedramp-marketplace-authorization-monitor",
                "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",
                "properties": {
                    "searchTerms": {
                        "title": "Watch terms",
                        "type": "array",
                        "description": "Optional vendor, product, category, agency, or keyword filters. Empty means monitor the newest/recently changed Marketplace products up to maxProducts.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "productIds": {
                        "title": "Specific FedRAMP product IDs",
                        "type": "array",
                        "description": "Optional exact product IDs, e.g. FR2000863987A. If provided, rows for these products are included even when searchTerms do not match.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "statuses": {
                        "title": "Certification statuses",
                        "type": "array",
                        "description": "Optional public status filters such as FedRAMP Authorized, FedRAMP Certified, FedRAMP Ready, FedRAMP In Process, or Agency Auth In Process.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "impactLevels": {
                        "title": "Impact levels",
                        "type": "array",
                        "description": "Optional impact filters such as Low, Moderate, High, Class B (Low), Class C (Moderate), or Class D (High). Matching is case-insensitive and substring-based.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "serviceModels": {
                        "title": "Service models",
                        "type": "array",
                        "description": "Optional service model filters such as SaaS, PaaS, or IaaS.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "changedSince": {
                        "title": "Changed since date",
                        "type": "string",
                        "description": "Optional ISO date. If omitted, the Actor uses today minus recentChangeWindowDays. Used to flag recent status updates and status-timeline changes.",
                        "default": ""
                    },
                    "recentChangeWindowDays": {
                        "title": "Recent change window in days",
                        "minimum": 1,
                        "maximum": 730,
                        "type": "integer",
                        "description": "Used when changedSince is empty. Products with status updates or status-timeline entries inside this window are alert candidates.",
                        "default": 30
                    },
                    "assessmentDueWindowDays": {
                        "title": "Annual assessment due window in days",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Flag authorized products whose annual assessment date is overdue or due within this many days.",
                        "default": 90
                    },
                    "minReuseCount": {
                        "title": "Minimum reuse count",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional minimum reuse count to focus on widely reused services. Zero disables this filter.",
                        "default": 0
                    },
                    "previousSnapshot": {
                        "title": "Previous snapshot rows",
                        "type": "array",
                        "description": "Optional prior rows from this Actor's dataset. The Actor compares status, impact, assessment, authorization, reuse, and row hashes to flag drift. Inline JSON avoids requiring Apify storage permissions in this private MVP.",
                        "default": []
                    },
                    "includeAllRows": {
                        "title": "Include all matched rows",
                        "type": "boolean",
                        "description": "If false, only alert rows are pushed to the dataset; OUTPUT still includes run counts.",
                        "default": true
                    },
                    "maxProducts": {
                        "title": "Maximum products to output",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Upper bound after filtering and sorting. Keeps scheduled runs cheap and datasets reviewable.",
                        "default": 100
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout seconds",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Timeout for each official FedRAMP JSON request.",
                        "default": 45
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
