Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Para crear un conector de datos con Codeless Connector Framework (CCF), use este documento como complemento a los documentos de referencia de la API REST de Microsoft Sentinel para definiciones de conectores de datos. En concreto, este documento de referencia se expande en la sección siguiente:
-
connectorUiConfig: define los elementos visuales y el texto que se muestran en la página del conector de datos de Microsoft Sentinel.
Para más información, consulte Creación de un conector sin código.
Definiciones del conector de datos: creación o actualización
Consulte la operación Crear o actualizar en los documentos de la API REST para encontrar la versión más reciente de la API estable o preliminar. Solo la update operación requiere el etag valor .
Método PUT
https://management.azure.com/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.OperationalInsights/workspaces/{{workspaceName}}/providers/Microsoft.SecurityInsights/dataConnectorDefinitions/{{dataConnectorDefinitionName}}?api-version={{apiVersion}}
Parámetros de URI
Para obtener más información sobre la versión más reciente de la API, consulte Definiciones de conectores de datos: creación o actualización de parámetros de URI.
| Nombre | Descripción |
|---|---|
| dataConnectorDefinitionName | La definición del conector de datos debe ser un nombre único y es el mismo que el name parámetro en el cuerpo de la solicitud. |
| resourceGroupName | Nombre del grupo de recursos, no distingue mayúsculas de minúsculas. |
| subscriptionId | Identificador de la suscripción de destino. |
| workspaceName |
Nombre del área de trabajo, no el identificador. Patrón de expresión regular: ^[A-Za-z0-9][A-Za-z0-9-]+[A-Za-z0-9]$. |
| api-version | Versión de la API que se va a usar para esta operación. |
Cuerpo de la solicitud
El cuerpo de la solicitud para crear una definición de conector de datos CCF con la API tiene la siguiente estructura:
{
"kind": "Customizable",
"properties": {
"connectorUIConfig": {}
}
}
dataConnectorDefinition tiene las siguientes propiedades:
| Nombre | Obligatorio | Tipo | Descripción |
|---|---|---|---|
| Amable | Cierto | Cuerda |
Customizable para el conector de datos de sondeo de API o Static en caso contrario |
| Propiedades. connectorUiConfig | Cierto | JSON anidado connectorUiConfig |
Las propiedades de configuración de la interfaz de usuario del conector de datos |
Configuración de la interfaz de usuario del conector
En esta sección se describen las opciones de configuración disponibles para personalizar la interfaz de usuario de la página del conector de datos.
En la captura de pantalla siguiente se muestra una página de conector de datos de ejemplo, resaltada con números que corresponden a áreas importantes de la interfaz de usuario.
Cada uno de los siguientes elementos de la connectorUiConfig sección necesarios para configurar la interfaz de usuario corresponde a la parte PersonalizableConnectorUiConfig de la API.
| Campo | Obligatorio | Tipo | Descripción | Captura de pantalla del área notable # |
|---|---|---|---|---|
| título | Cierto | cuerda / cadena | Título que se muestra en la página del conector de datos | 1 |
| ID | cuerda / cadena | Establece el identificador de conector personalizado para el uso interno. | ||
| logotipo | cuerda / cadena | Ruta de acceso al archivo de imagen en formato SVG. Si no se configura ningún valor, se usa un logotipo predeterminado. | 2 | |
| editor | Cierto | cuerda / cadena | Proveedor del conector | 3 |
| descriptionMarkdown | Cierto | string en Markdown | Descripción del conector con la capacidad de agregar el lenguaje Markdown para mejorarlo. | 4 |
| sampleQueries | Cierto | JSON anidado sampleQueries |
Consulta al cliente para comprender cómo buscar los datos en el registro de eventos. | |
| graphConsultas | Cierto | JSON anidado graphConsultas |
Consultas que presentan la ingesta de datos en las últimas dos semanas. Proporcione una consulta para todos los tipos de datos del conector de datos o una consulta diferente para cada tipo de datos. |
5 |
| graphQueriesTableName | Establece el nombre de la tabla en la que el conector inserta datos. Este nombre se puede usar en otras consultas especificando {{graphQueriesTableName}} el marcador de posición en graphQueries los valores y lastDataReceivedQuery . |
|||
| Datatypes | Cierto | JSON anidado Datatypes |
Lista de todos los tipos de datos del conector y una consulta para capturar la hora del último evento para cada tipo de datos. | 6 |
| criteriosDeConectividad | Cierto | JSON anidado criteriosDeConectividad |
Objeto que define cómo comprobar si el conector está conectado. | 7 |
| disponibilidad | JSON anidado disponibilidad |
Objeto que define el estado de disponibilidad del conector. | ||
| permisos | Cierto | JSON anidado permisos |
La información que se muestra en la sección Requisitos previos de la interfaz de usuario, que enumera los permisos necesarios para habilitar o deshabilitar el conector. | 8 |
| instructionSteps | Cierto | JSON anidado instrucciones |
Matriz de elementos de widget que explican cómo instalar el conector y controles accionables que se muestran en la pestaña Instrucciones . | 9 |
| isConnectivityCriteriasMatchSome | Booleano | Valor booleano que indica si se debe usar 'OR'(SOME) o 'AND' entre los elementos ConnectivityCriteria. |
connectivityCriteria
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
| Tipo | Cierto | Cuerda | Una de las dos opciones siguientes: HasDataConnectors : este valor es mejor para los conectores de datos de sondeo de API, como CCF. El conector se considera conectado con al menos una conexión activa.isConnectedQuery : este valor es el mejor para otros tipos de conectores de datos. El conector se considera conectado cuando la consulta proporcionada devuelve datos. |
| Importancia | True cuando el tipo es isConnectedQuery |
Cuerda | Consulta para determinar si los datos se reciben dentro de un período de tiempo determinado. Por ejemplo: CommonSecurityLog | where DeviceVendor == \"Vectra Networks\"\n| where DeviceProduct == \"X Series\"\n | summarize LastLogReceived = max(TimeGenerated)\n | project IsConnected = LastLogReceived > ago(7d)" |
tipos de datos
| Valor de matriz | Tipo | Descripción |
|---|---|---|
| nombre | Cuerda | Descripción significativa de ,lastDataReceivedQuery incluida la compatibilidad con la graphQueriesTableName variable . Ejemplo: {{graphQueriesTableName}} |
| lastDataReceivedQuery | Cuerda | Una consulta KQL que devuelve una fila e indica la última vez que se recibieron datos o ningún dato si no hay ningún resultado. Ejemplo: {{graphQueriesTableName}}\n | summarize Time = max(TimeGenerated)\n | where isnotempty(Time) |
graphConsultas
Define una consulta que presenta la ingesta de datos en las últimas dos semanas.
Proporcione una consulta para todos los tipos de datos del conector de datos o una consulta diferente para cada tipo de datos.
| Valor de matriz | Tipo | Descripción |
|---|---|---|
| metricName | Cuerda | Un nombre descriptivo para el grafo. Ejemplo: Total data received |
| leyenda | Cuerda | Cadena que aparece en la leyenda a la derecha del gráfico y que incluye una referencia de variable. Ejemplo: {{graphQueriesTableName}} |
| baseQuery | Cuerda | La consulta que filtra los eventos pertinentes, incluida una referencia a una variable. Por ejemplo, TableName_CL | where ProviderName == "myprovider" o {{graphQueriesTableName}}. |
availability
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
| estado | Integer | Estado de disponibilidad del conector. Disponible = 1 Marca de características = 2 Próximamente = 3 Interno = 4 |
|
| isPreview | Booleano | Valor booleano que indica si el conector está en modo de vista previa. |
permisos
| Valor de matriz | Tipo | Descripción |
|---|---|---|
| aduana | Cuerda | Describe los permisos personalizados necesarios para la conexión de datos, en la sintaxis siguiente: {"name":cadena,"description":cadena} Ejemplo: el valor aduanero se muestra en la sección Requisitos previos de Microsoft Sentinel con un icono informativo azul. En el ejemplo de GitHub, este valor se correlaciona con la línea Clave de token personal de la API de GitHub: Necesita acceso al token personal de GitHub... |
| Licencias | ENUM | Define las licencias necesarias, como uno de los siguientes valores: OfficeIRM,OfficeATP, Office365, AadP1P2, McasAatp, , Mdatp, , Mtp.IoT Ejemplo: El valor de licencias se muestra en Microsoft Sentinel como : Licencia: Obligatorio Azure AD Premium P2 |
| resourceProvider | resourceProvider | Describe los requisitos previos para el recurso de Azure. Ejemplo: el valor resourceProvider se muestra en la sección Requisitos previos de Microsoft Sentinel como: Área de trabajo: se requiere permiso de lectura y escritura. Claves: se requieren permisos de lectura para claves compartidas para el área de trabajo. |
| arrendatario | matriz de valores ENUM Ejemplo: "tenant": ["GlobalADmin","SecurityAdmin"] |
Define los permisos necesarios, como uno o varios de los siguientes valores: "GlobalAdmin", "SecurityAdmin", "SecurityReader", , "InformationProtection" Ejemplo: muestra el valor de inquilino en Microsoft Sentinel como: Permisos de inquilino: Requiere Global Administrator o Security Administrator en el inquilino del área de trabajo |
Importante
Microsoft recomienda usar roles con el menor número de permisos. Esto ayuda a mejorar la seguridad de su organización. El administrador global es un rol con privilegios elevados que debe limitarse a escenarios de emergencia cuando no se puede usar un rol existente.
proveedor de recursos
| valor de sub array | Tipo | Descripción |
|---|---|---|
| proveedor | ENUM | Describe el proveedor de recursos, con uno de los siguientes valores: - Microsoft.OperationalInsights/workspaces - Microsoft.OperationalInsights/solutions- Microsoft.OperationalInsights/workspaces/datasources- microsoft.aadiam/diagnosticSettings- Microsoft.OperationalInsights/workspaces/sharedKeys- Microsoft.Authorization/policyAssignments |
| providerDisplayName | Cuerda | Un elemento de lista en Requisitos previos que muestra una marca de verificación roja "x" o verde cuando los requiredPermissions se validan en la página del conector. Ejemplo "Workspace" |
| permissionsDisplayText | Cuerda | Mostrar texto para permisos de lectura, escritura o lectura y escritura que deben corresponder a los valores configurados en requiredPermissions |
| requiredPermissions | {"action":Booleano,"delete":Booleano,"read":Booleano,"write":Booleano} |
Describe los permisos mínimos necesarios para el conector. |
| de ámbito de | ENUM | Describe el ámbito del conector de datos, como uno de los siguientes valores: "Subscription", , "ResourceGroup""Workspace" |
sampleQueries
| valor de matriz | Tipo | Descripción |
|---|---|---|
| descripción | Cuerda | Descripción significativa de la consulta de ejemplo. Ejemplo: Top 10 vulnerabilities detected |
| consulta | Cuerda | Consulta de ejemplo usada para capturar los datos del tipo de datos. Ejemplo: {{graphQueriesTableName}}\n | sort by TimeGenerated\n | take 10 |
Configuración de otras opciones de vínculo
Para definir un vínculo insertado mediante Markdown, use el ejemplo siguiente.
{
"title": "",
"description": "Make sure to configure the machine's security according to your organization's security policy\n\n\n[Learn more >](https://aka.ms/SecureCEF)"
}
Para definir un vínculo como plantilla de ARM, use el ejemplo siguiente como guía:
{
"title": "Azure Resource Manager (ARM) template",
"description": "1. Click the **Deploy to Azure** button below.\n\n\t[]({URL to custom ARM template})"
}
instructionSteps
En esta sección se proporcionan parámetros que definen el conjunto de instrucciones que aparecen en la página del conector de datos de Microsoft Sentinel y que tiene la estructura siguiente:
"instructionSteps": [
{
"title": "",
"description": "",
"instructions": [
{
"type": "",
"parameters": {}
}
],
"innerSteps": {}
}
]
| Propiedad de Array | Obligatorio | Tipo | Descripción |
|---|---|---|---|
| título | Cuerda | Define un título para las instrucciones. | |
| descripción | Cuerda | Define una descripción significativa para tus instrucciones. | |
| innerSteps | Arreglo | Define una matriz de pasos de instrucción interna. | |
| instrucciones | Cierto | Matriz de instrucciones | Define una matriz de instrucciones de un tipo de parámetro específico. |
instrucciones
Muestra un grupo de instrucciones, con varios parámetros y la capacidad de anidar más instruccionesPasos en grupos. Los parámetros definidos aquí corresponden
| Tipo | Propiedad del array | Descripción |
|---|---|---|
| OAuthForm | OAuthForm | Conectar con OAuth |
| Cuadro de texto | Cuadro de texto | Esto empareja con ConnectionToggleButton. Hay 4 tipos disponibles:passwordtextnumberemail |
| ConnectionToggleButton | ConnectionToggleButton | Desencadene la implementación de DCR en función de la información de conexión proporcionada a través de parámetros de marcador de posición. Se admiten los siguientes parámetros:name :obligatoriodisabledisPrimaryconnectLabeldisconnectLabel |
| CopyableLabel | CopyableLabel | Muestra un campo de texto con un botón copiar al final. Cuando se selecciona el botón, se copia el valor del campo. |
| Lista desplegable | Lista desplegable | Muestra una lista desplegable de opciones para que el usuario la seleccione. |
| Markdown | Markdown | Muestra una sección de texto con formato Markdown. |
| DataConnectorsGrid | DataConnectorsGrid | Muestra una cuadrícula de conectores de datos. |
| ContextPane | ContextPane | Muestra un panel de información contextual. |
| MensajeInformativo | MensajeInformativo | Define un mensaje de información en línea. |
| InstructionStepsGroup | InstructionStepsGroup | Muestra un grupo de instrucciones, opcionalmente expandido o contraíble, en una sección de instrucciones independiente. |
| InstallAgent | InstallAgent | Muestra un vínculo a otras partes de Azure para cumplir varios requisitos de instalación. |
OAuthForm
Este componente requiere que el OAuth2 tipo esté presente en la auth propiedad de la plantilla del conector de datos.
"instructions": [
{
"type": "OAuthForm",
"parameters": {
"clientIdLabel": "Client ID",
"clientSecretLabel": "Client Secret",
"connectButtonLabel": "Connect",
"disconnectButtonLabel": "Disconnect"
}
}
]
Cuadro de texto
Estos son algunos ejemplos del Textbox tipo . Estos ejemplos corresponden a los parámetros usados en la sección de ejemplo auth de referencia de conectores de datos para Codeless Connector Framework. Para cada uno de los 4 tipos, cada uno tiene label, placeholdery name.
"instructions": [
{
"type": "Textbox",
"parameters": {
{
"label": "User name",
"placeholder": "User name",
"type": "text",
"name": "username"
}
}
},
{
"type": "Textbox",
"parameters": {
"label": "Secret",
"placeholder": "Secret",
"type": "password",
"name": "password"
}
}
]
ConnectionToggleButton
"instructions": [
{
"type": "ConnectionToggleButton",
"parameters": {
"connectLabel": "toggle",
"name": "toggle"
}
}
]
EtiquetaCopiable
Ejemplo:
Código de ejemplo:
{
"parameters": {
"fillWith": [
"WorkspaceId",
"PrimaryKey"
],
"label": "Here are some values you'll need to proceed.",
"value": "Workspace is {0} and PrimaryKey is {1}"
},
"type": "CopyableLabel"
}
| Valor de matriz | Obligatorio | Tipo | Descripción |
|---|---|---|---|
| fillWith | ENUM | Matriz de variables de entorno usadas para llenar un marcador de posición. Separe varios marcadores de posición con comas. Por ejemplo: {0},{1} Valores admitidos: workspaceId, workspaceName, primaryKey, MicrosoftAwsAccount, , subscriptionId |
|
| etiqueta | Cierto | Cuerda | Define el texto de la etiqueta encima de un cuadro de texto. |
| valor | Cierto | Cuerda | Define el valor que se va a presentar en el cuadro de texto, admite marcadores de posición. |
| Filas | Filas | Define las filas en el área de la interfaz de usuario. De forma predeterminada, establezca en 1. | |
| wideLabel | Booleano | Determina una etiqueta ancha para cadenas de texto largas. De forma predeterminada, establezca en false. |
Desplegable
{
"parameters": {
"label": "Select an option",
"name": "dropdown",
"options": [
{
"key": "Option 1",
"text": "option1"
},
{
"key": "Option 2",
"text": "option2"
}
],
"placeholder": "Select an option",
"isMultiSelect": false,
"required": true,
"defaultAllSelected": false
},
"type": "Dropdown"
}
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
| etiqueta | Cierto | Cuerda | Define el texto de la etiqueta encima de la lista desplegable. |
| nombre | Cierto | Cuerda | Define el nombre único de la lista desplegable. Esto se usa en configuración de sondeo. |
| Opciones | Cierto | Arreglo | Define la lista de opciones de la lista desplegable. |
| marcador | Cuerda | Define el texto del marcador de posición para la lista desplegable. | |
| isMultiSelect | Booleano | Determina si se pueden seleccionar varias opciones. De forma predeterminada, establezca en false. |
|
| requerido | Booleano | Si truees , es necesario rellenar la lista desplegable. |
|
| defaultAllSelected | Booleano | Si truees , todas las opciones se seleccionan de forma predeterminada. |
Markdown
{
"parameters": {
"content": "## This is a Markdown section\n\nYou can use **bold** text, _italic_ text, and even [links](https://www.example.com)."
},
"type": "Markdown"
}
DataConnectorsGrid
{
"type": "DataConnectorsGrid",
"parameters": {
"mapping": [
{
"columnName": "Column 1",
"columnValue": "Value 1"
},
{
"columnName": "Column 2",
"columnValue": "Value 2"
}
],
"menuItems": [
"MyConnector"
]
}
}
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
| mapping | Cierto | Arreglo | Define la asignación de columnas en la cuadrícula. |
| menuItems | Arreglo | Define los elementos de menú de la cuadrícula. |
ContextPane
{
"type": "ContextPane",
"parameters": {
"isPrimary": true,
"label": "Add Account",
"title": "Add Account",
"subtitle": "Add Account",
"contextPaneType": "DataConnectorsContextPane",
"instructionSteps": [
{
"instructions": [
{
"type": "Textbox",
"parameters": {
"label": "Snowflake Account Identifier",
"placeholder": "Enter Snowflake Account Identifier",
"type": "text",
"name": "accountId",
"validations": {
"required": true
}
}
},
{
"type": "Textbox",
"parameters": {
"label": "Snowflake PAT",
"placeholder": "Enter Snowflake PAT",
"type": "password",
"name": "apikey",
"validations": {
"required": true
}
}
}
]
}
]
}
}
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
| título | Cierto | Cuerda | Título del panel de contexto. |
| subtítulo | Cierto | Cuerda | Subtítulo del panel de contexto. |
| contextPaneType | Cierto | Cuerda | Tipo del panel de contexto. |
| instructionSteps | Cierto | Arreglo instructionSteps |
Los pasos de instrucción para el panel de contexto. |
| etiqueta | Cuerda | Etiqueta del panel de contexto. | |
| isPrimary | Booleano | Indica si se trata del panel de contexto principal. |
InfoMessage
Este es un ejemplo de un mensaje de información insertado:
En cambio, en la imagen siguiente se muestra un mensaje de información que no está insertado:
| Valor de matriz | Tipo | Descripción |
|---|---|---|
| Mensaje de texto | Cuerda | Defina el texto que se va a mostrar en el mensaje. |
| visible | Booleano | Determina si se muestra el mensaje. |
| Inline | Booleano | Determina cómo se muestra el mensaje de información. - true: (Recomendado) Muestra el mensaje de información incrustado en las instrucciones. - false: agrega un fondo azul. |
InstructionStepsGroup
Este es un ejemplo de un grupo de instrucciones expandible:
| Valor de matriz | Obligatorio | Tipo | Descripción |
|---|---|---|---|
| título | Cierto | Cuerda | Define el título del paso de instrucción. |
| descripción | Cuerda | Texto descriptivo opcional. | |
| canCollapseAllSections | Booleano | Determina si la sección es un acordeón plegable o no. | |
| noFxPadding | Booleano | Si el true, reduce el relleno de altura para ahorrar espacio. |
|
| Ampliado | Booleano | Si true se muestra como expandido de forma predeterminada. |
Para obtener un ejemplo detallado, consulte el código JSON de configuración para el conector dns de Windows.
Agente de Instalación
Algunos tipos InstallAgent aparecen como un botón; otros aparecen como un vínculo. Estos son ejemplos de ambos:
| Valores de matriz | Obligatorio | Tipo | Descripción |
|---|---|---|---|
| tipoDeEnlace | Cierto | ENUM | Determina el tipo de vínculo, como uno de los siguientes valores: InstallAgentOnWindowsVirtualMachineInstallAgentOnWindowsNonAzureInstallAgentOnLinuxVirtualMachineInstallAgentOnLinuxNonAzureOpenSyslogSettingsOpenCustomLogsSettingsOpenWafOpenAzureFirewall
OpenMicrosoftAzureMonitoring
OpenFrontDoors OpenCdnProfile AutomaticDeploymentCEF OpenAzureInformationProtection OpenAzureActivityLog OpenIotPricingModel OpenPolicyAssignment OpenAllAssignmentsBlade OpenCreateDataCollectionRule |
| policyDefinitionGuid | True cuando se usa OpenPolicyAssignment linkType. |
Cuerda | Para los conectores basados en directivas, define el GUID de la definición de directiva predefinida. |
| assignMode | ENUM | Para los conectores basados en directivas, define el modo de asignación, como uno de los siguientes valores: Initiative, Policy |
|
| dataCollectionRuleType | ENUM | Para los conectores basados en DCR, define el tipo de regla de recopilación de datos como SecurityEvent, o ForwardEvent. |
Definición del conector de datos de ejemplo
En el ejemplo siguiente se reúnen algunos de los componentes definidos en este artículo como formato de cuerpo JSON para usarlos con la API de definición de conector de datos Create Or Update.
Para obtener más ejemplos de la connectorUiConfig revisión de otros conectores de datos CCF. Incluso los conectores que usan el CCF heredado tienen ejemplos válidos de la creación de la interfaz de usuario.
{
"kind": "Customizable",
"properties": {
"connectorUiConfig": {
"title": "Example CCF Data Connector",
"publisher": "My Company",
"descriptionMarkdown": "This is an example of data connector",
"graphQueriesTableName": "ExampleConnectorAlerts_CL",
"graphQueries": [
{
"metricName": "Alerts received",
"legend": "My data connector alerts",
"baseQuery": "{{graphQueriesTableName}}"
},
{
"metricName": "Events received",
"legend": "My data connector events",
"baseQuery": "ASIMFileEventLogs"
}
],
"sampleQueries": [
{
"description": "All alert logs",
"query": "{{graphQueriesTableName}} \n | take 10"
}
],
"dataTypes": [
{
"name": "{{graphQueriesTableName}}",
"lastDataReceivedQuery": "{{graphQueriesTableName}} \n | summarize Time = max(TimeGenerated)\n | where isnotempty(Time)"
},
{
"name": "ASIMFileEventLogs",
"lastDataReceivedQuery": "ASIMFileEventLogs \n | summarize Time = max(TimeGenerated)\n | where isnotempty(Time)"
}
],
"connectivityCriteria": [
{
"type": "HasDataConnectors"
}
],
"permissions": {
"resourceProvider": [
{
"provider": "Microsoft.OperationalInsights/workspaces",
"permissionsDisplayText": "Read and Write permissions are required.",
"providerDisplayName": "Workspace",
"scope": "Workspace",
"requiredPermissions": {
"write": true,
"read": true,
"delete": true
}
},
],
"customs": [
{
"name": "Example Connector API Key",
"description": "The connector API key username and password is required"
}
]
},
"instructionSteps": [
{
"title": "Connect My Connector to Microsoft Sentinel",
"description": "To enable the connector provide the required information below and click on Connect.\n>",
"instructions": [
{
"type": "Textbox",
"parameters": {
"label": "User name",
"placeholder": "User name",
"type": "text",
"name": "username"
}
},
{
"type": "Textbox",
"parameters": {
"label": "Secret",
"placeholder": "Secret",
"type": "password",
"name": "password"
}
},
{
"type": "ConnectionToggleButton",
"parameters": {
"connectLabel": "toggle",
"name": "toggle"
}
}
]
}
]
}
}
}