From c04d1782b7a09bfa75cb3e3c6c4a0ef06d839013 Mon Sep 17 00:00:00 2001 From: christineweng <18648970+christineweng@users.noreply.github.com> Date: Tue, 24 Jun 2025 16:17:21 -0500 Subject: [PATCH] [Security Solution][Tech Debt] Move remaining chart related components to alert KPI folder (#223570) ## Summary This PR moves the `chart_settings_popover` and `field_selections` to `~security_solution/public/detections/components/alerts_kpis` since they are used exclusively by the KPI charts. These were left out in the original folder reorg effort in https://github.com/elastic/kibana/pull/189234 ### Checklist - [x] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../styled_components_files.js | 1 - .../components/field_selection/index.tsx | 90 ------------------ .../alerts_kpis/alerts_count_panel/index.tsx | 2 +- .../alerts_histogram_panel/helpers.tsx | 2 +- .../alerts_treemap_panel/index.tsx | 2 +- .../chart_context_menu/index.test.tsx | 4 +- .../chart_panels/chart_context_menu/index.tsx | 4 +- .../configurations/default/index.test.tsx | 4 +- .../configurations/default/index.tsx | 2 +- .../configurations/default/translations.ts | 0 .../chart_settings_popover/index.test.tsx | 0 .../chart_settings_popover/index.tsx | 2 +- .../chart_settings_popover/translations.ts | 0 .../alerts_kpis/chart_panels/index.test.tsx | 4 +- .../common/field_selection.test.tsx} | 11 +-- .../alerts_kpis/common/field_selection.tsx | 91 +++++++++++++++++++ 16 files changed, 108 insertions(+), 111 deletions(-) delete mode 100644 x-pack/solutions/security/plugins/security_solution/public/common/components/field_selection/index.tsx rename x-pack/solutions/security/plugins/security_solution/public/{common/components => detections/components/alerts_kpis/chart_panels}/chart_settings_popover/configurations/default/index.test.tsx (93%) rename x-pack/solutions/security/plugins/security_solution/public/{common/components => detections/components/alerts_kpis/chart_panels}/chart_settings_popover/configurations/default/index.tsx (95%) rename x-pack/solutions/security/plugins/security_solution/public/{common/components => detections/components/alerts_kpis/chart_panels}/chart_settings_popover/configurations/default/translations.ts (100%) rename x-pack/solutions/security/plugins/security_solution/public/{common/components => detections/components/alerts_kpis/chart_panels}/chart_settings_popover/index.test.tsx (100%) rename x-pack/solutions/security/plugins/security_solution/public/{common/components => detections/components/alerts_kpis/chart_panels}/chart_settings_popover/index.tsx (95%) rename x-pack/solutions/security/plugins/security_solution/public/{common/components => detections/components/alerts_kpis/chart_panels}/chart_settings_popover/translations.ts (100%) rename x-pack/solutions/security/plugins/security_solution/public/{common/components/field_selection/index.test.tsx => detections/components/alerts_kpis/common/field_selection.test.tsx} (89%) create mode 100644 x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/common/field_selection.tsx diff --git a/packages/kbn-babel-preset/styled_components_files.js b/packages/kbn-babel-preset/styled_components_files.js index 0c881a5207c4..ef8e0b3eb4b2 100644 --- a/packages/kbn-babel-preset/styled_components_files.js +++ b/packages/kbn-babel-preset/styled_components_files.js @@ -185,7 +185,6 @@ module.exports = { /x-pack[\/\\]solutions[\/\\]security[\/\\]plugins[\/\\]security_solution[\/\\]public[\/\\]common[\/\\]components[\/\\]endpoint[\/\\]agents[\/\\]agent_status[\/\\]agent_status.tsx/, /x-pack[\/\\]solutions[\/\\]security[\/\\]plugins[\/\\]security_solution[\/\\]public[\/\\]common[\/\\]components[\/\\]events_viewer[\/\\]index.tsx/, /x-pack[\/\\]solutions[\/\\]security[\/\\]plugins[\/\\]security_solution[\/\\]public[\/\\]common[\/\\]components[\/\\]events_viewer[\/\\]summary_view_select[\/\\]index.tsx/, - /x-pack[\/\\]solutions[\/\\]security[\/\\]plugins[\/\\]security_solution[\/\\]public[\/\\]common[\/\\]components[\/\\]field_selection[\/\\]index.tsx/, /x-pack[\/\\]solutions[\/\\]security[\/\\]plugins[\/\\]security_solution[\/\\]public[\/\\]common[\/\\]components[\/\\]header_actions[\/\\]actions.tsx/, /x-pack[\/\\]solutions[\/\\]security[\/\\]plugins[\/\\]security_solution[\/\\]public[\/\\]common[\/\\]components[\/\\]health_truncate_text[\/\\]index.tsx/, /x-pack[\/\\]solutions[\/\\]security[\/\\]plugins[\/\\]security_solution[\/\\]public[\/\\]common[\/\\]components[\/\\]hover_visibility_container[\/\\]index.tsx/, diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/field_selection/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/common/components/field_selection/index.tsx deleted file mode 100644 index c7e6b0c06575..000000000000 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/field_selection/index.tsx +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { EuiComboBox } from '@elastic/eui'; -import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; -import React from 'react'; -import styled from 'styled-components'; - -import { StackByComboBox } from '../../../detections/components/alerts_kpis/common/components'; -import { - GROUP_BY_LABEL, - GROUP_BY_TOP_LABEL, -} from '../../../detections/components/alerts_kpis/common/translations'; - -const ChartOptionsFlexItem = styled(EuiFlexItem)` - margin-left: ${({ theme }) => theme.eui.euiSizeS}; -`; - -export interface Props { - chartOptionsContextMenu?: (queryId: string) => React.ReactNode; - setStackByField0: (stackBy: string) => void; - setStackByField0ComboboxInputRef?: (inputRef: HTMLInputElement | null) => void; - setStackByField1: (stackBy: string | undefined) => void; - setStackByField1ComboboxInputRef?: (inputRef: HTMLInputElement | null) => void; - stackByField0: string; - stackByField0ComboboxRef?: React.RefObject>; - stackByField1: string | undefined; - stackByField1ComboboxRef?: React.RefObject>; - stackByWidth?: number; - uniqueQueryId: string; - useLensCompatibleFields?: boolean; -} - -const FieldSelectionComponent: React.FC = ({ - chartOptionsContextMenu, - setStackByField0, - setStackByField0ComboboxInputRef, - setStackByField1, - setStackByField1ComboboxInputRef, - stackByField0, - stackByField0ComboboxRef, - stackByField1, - stackByField1ComboboxRef, - stackByWidth, - uniqueQueryId, - useLensCompatibleFields, -}: Props) => ( - - - - - - - - {chartOptionsContextMenu != null && ( - - {chartOptionsContextMenu(uniqueQueryId)} - - )} - - -); - -FieldSelectionComponent.displayName = 'FieldSelectionComponent'; - -export const FieldSelection = React.memo(FieldSelectionComponent); diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/index.tsx index a9d9821601d2..d70ed04403fd 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/index.tsx @@ -15,7 +15,7 @@ import { HeaderSection } from '../../../../common/components/header_section'; import { InspectButtonContainer } from '../../../../common/components/inspect'; import * as i18n from './translations'; import { KpiPanel } from '../common/components'; -import { FieldSelection } from '../../../../common/components/field_selection'; +import { FieldSelection } from '../common/field_selection'; import { getAlertsTableLensAttributes as getLensAttributes } from '../../../../common/components/visualization_actions/lens_attributes/common/alerts/alerts_table'; import { SourcererScopeName } from '../../../../sourcerer/store/model'; import { VisualizationEmbeddable } from '../../../../common/components/visualization_actions/visualization_embeddable'; diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/helpers.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/helpers.tsx index 5c254ee6255d..df9fde838514 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/helpers.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/helpers.tsx @@ -6,7 +6,7 @@ */ import type { Action, ActionExecutionContext } from '@kbn/ui-actions-plugin/public'; -import { RESET_GROUP_BY_FIELDS } from '../../../../common/components/chart_settings_popover/configurations/default/translations'; +import { RESET_GROUP_BY_FIELDS } from '../chart_panels/chart_settings_popover/configurations/default/translations'; import type { LensDataTableEmbeddable } from '../../../../common/components/visualization_actions/types'; interface LegacyLensEmbeddable { diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/alerts_treemap_panel/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/alerts_treemap_panel/index.tsx index daff3097acb4..043e931d79a9 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/alerts_treemap_panel/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/alerts_treemap_panel/index.tsx @@ -20,7 +20,7 @@ import { KpiPanel } from '../common/components'; import { useInspectButton } from '../common/hooks'; import { useQueryAlerts } from '../../../containers/detection_engine/alerts/use_query'; import { ALERTS_QUERY_NAMES } from '../../../containers/detection_engine/alerts/constants'; -import { FieldSelection } from '../../../../common/components/field_selection'; +import { FieldSelection } from '../common/field_selection'; import { HeaderSection } from '../../../../common/components/header_section'; import { InspectButtonContainer } from '../../../../common/components/inspect'; import { DEFAULT_STACK_BY_FIELD0_SIZE, getAlertsRiskQuery } from './alerts_treemap/query'; diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_context_menu/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_context_menu/index.test.tsx index f405244eff60..da87e1d05471 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_context_menu/index.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_context_menu/index.test.tsx @@ -9,8 +9,8 @@ import { fireEvent, render, screen } from '@testing-library/react'; import { waitForEuiPopoverOpen } from '@elastic/eui/lib/test/rtl'; import React from 'react'; -import { RESET_GROUP_BY_FIELDS } from '../../../../../common/components/chart_settings_popover/configurations/default/translations'; -import { CHART_SETTINGS_POPOVER_ARIA_LABEL } from '../../../../../common/components/chart_settings_popover/translations'; +import { RESET_GROUP_BY_FIELDS } from '../chart_settings_popover/configurations/default/translations'; +import { CHART_SETTINGS_POPOVER_ARIA_LABEL } from '../chart_settings_popover/translations'; import { INSPECT } from '../../../../../common/components/inspect/translations'; import { DEFAULT_STACK_BY_FIELD, DEFAULT_STACK_BY_FIELD1 } from '../../common/config'; import { TestProviders } from '../../../../../common/mock'; diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_context_menu/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_context_menu/index.tsx index 927acf86d1dd..9573f6260f40 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_context_menu/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_context_menu/index.tsx @@ -8,8 +8,8 @@ import { noop } from 'lodash/fp'; import React, { useCallback } from 'react'; -import { ChartSettingsPopover } from '../../../../../common/components/chart_settings_popover'; -import { useChartSettingsPopoverConfiguration } from '../../../../../common/components/chart_settings_popover/configurations/default'; +import { ChartSettingsPopover } from '../chart_settings_popover'; +import { useChartSettingsPopoverConfiguration } from '../chart_settings_popover/configurations/default'; interface Props { defaultStackByField: string; diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/configurations/default/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/configurations/default/index.test.tsx similarity index 93% rename from x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/configurations/default/index.test.tsx rename to x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/configurations/default/index.test.tsx index 9441975078e5..79f544fbd120 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/configurations/default/index.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/configurations/default/index.test.tsx @@ -8,13 +8,13 @@ import { renderHook } from '@testing-library/react'; import React from 'react'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../../../../../common/mock'; import * as i18n from './translations'; import { useChartSettingsPopoverConfiguration } from '.'; const mockHandleClick = jest.fn(); -jest.mock('../../../inspect/use_inspect', () => ({ +jest.mock('../../../../../../../common/components/inspect/use_inspect', () => ({ useInspect: () => ({ handleClick: mockHandleClick }), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/configurations/default/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/configurations/default/index.tsx similarity index 95% rename from x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/configurations/default/index.tsx rename to x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/configurations/default/index.tsx index 58b9ab25e008..52a729ada61c 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/configurations/default/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/configurations/default/index.tsx @@ -9,7 +9,7 @@ import type { EuiContextMenuPanelDescriptor } from '@elastic/eui'; import type { Dispatch, SetStateAction } from 'react'; import { useMemo, useState } from 'react'; -import { useInspect } from '../../../inspect/use_inspect'; +import { useInspect } from '../../../../../../../common/components/inspect/use_inspect'; import * as i18n from './translations'; diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/configurations/default/translations.ts b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/configurations/default/translations.ts similarity index 100% rename from x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/configurations/default/translations.ts rename to x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/configurations/default/translations.ts diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/index.test.tsx similarity index 100% rename from x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/index.test.tsx rename to x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/index.test.tsx diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/index.tsx similarity index 95% rename from x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/index.tsx rename to x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/index.tsx index 82d4a2506511..c15d17a1ea0d 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/index.tsx @@ -9,7 +9,7 @@ import type { EuiContextMenuPanelDescriptor } from '@elastic/eui'; import { EuiButtonIcon, EuiContextMenu, EuiPopover } from '@elastic/eui'; import React, { useCallback, useMemo } from 'react'; -import { BUTTON_CLASS } from '../inspect'; +import { BUTTON_CLASS } from '../../../../../common/components/inspect'; import * as i18n from './translations'; interface Props { diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/translations.ts b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/translations.ts similarity index 100% rename from x-pack/solutions/security/plugins/security_solution/public/common/components/chart_settings_popover/translations.ts rename to x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/chart_settings_popover/translations.ts diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/index.test.tsx index 38d68f2af0ad..5d812b647ac4 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/index.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/index.test.tsx @@ -10,8 +10,8 @@ import React from 'react'; import { useAlertsLocalStorage } from './alerts_local_storage'; import type { Status } from '../../../../../common/api/detection_engine'; -import { RESET_GROUP_BY_FIELDS } from '../../../../common/components/chart_settings_popover/configurations/default/translations'; -import { CHART_SETTINGS_POPOVER_ARIA_LABEL } from '../../../../common/components/chart_settings_popover/translations'; +import { RESET_GROUP_BY_FIELDS } from './chart_settings_popover/configurations/default/translations'; +import { CHART_SETTINGS_POPOVER_ARIA_LABEL } from './chart_settings_popover/translations'; import { mockBrowserFields } from '../../../../common/containers/source/mock'; import { useSourcererDataView } from '../../../../sourcerer/containers'; import { TestProviders } from '../../../../common/mock'; diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/components/field_selection/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/common/field_selection.test.tsx similarity index 89% rename from x-pack/solutions/security/plugins/security_solution/public/common/components/field_selection/index.test.tsx rename to x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/common/field_selection.test.tsx index 91cb4f7b581b..415ad53a4fc7 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/components/field_selection/index.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/common/field_selection.test.tsx @@ -8,13 +8,10 @@ import { render, screen } from '@testing-library/react'; import React from 'react'; -import { TestProviders } from '../../mock'; -import type { Props } from '.'; -import { FieldSelection } from '.'; -import { - GROUP_BY_LABEL, - GROUP_BY_TOP_LABEL, -} from '../../../detections/components/alerts_kpis/common/translations'; +import { TestProviders } from '../../../../common/mock'; +import type { Props } from './field_selection'; +import { FieldSelection } from './field_selection'; +import { GROUP_BY_LABEL, GROUP_BY_TOP_LABEL } from './translations'; jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); diff --git a/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/common/field_selection.tsx b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/common/field_selection.tsx new file mode 100644 index 000000000000..b19841efcddc --- /dev/null +++ b/x-pack/solutions/security/plugins/security_solution/public/detections/components/alerts_kpis/common/field_selection.tsx @@ -0,0 +1,91 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { EuiComboBox } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiSpacer, useEuiTheme } from '@elastic/eui'; +import { css } from '@emotion/react'; + +import { StackByComboBox } from './components'; +import { GROUP_BY_LABEL, GROUP_BY_TOP_LABEL } from './translations'; + +export interface Props { + chartOptionsContextMenu?: (queryId: string) => React.ReactNode; + setStackByField0: (stackBy: string) => void; + setStackByField0ComboboxInputRef?: (inputRef: HTMLInputElement | null) => void; + setStackByField1: (stackBy: string | undefined) => void; + setStackByField1ComboboxInputRef?: (inputRef: HTMLInputElement | null) => void; + stackByField0: string; + stackByField0ComboboxRef?: React.RefObject>; + stackByField1: string | undefined; + stackByField1ComboboxRef?: React.RefObject>; + stackByWidth?: number; + uniqueQueryId: string; + useLensCompatibleFields?: boolean; +} + +const FieldSelectionComponent: React.FC = ({ + chartOptionsContextMenu, + setStackByField0, + setStackByField0ComboboxInputRef, + setStackByField1, + setStackByField1ComboboxInputRef, + stackByField0, + stackByField0ComboboxRef, + stackByField1, + stackByField1ComboboxRef, + stackByWidth, + uniqueQueryId, + useLensCompatibleFields, +}: Props) => { + const { euiTheme } = useEuiTheme(); + return ( + + + + + + + + {chartOptionsContextMenu != null && ( + + {chartOptionsContextMenu(uniqueQueryId)} + + )} + + + ); +}; + +FieldSelectionComponent.displayName = 'FieldSelectionComponent'; + +export const FieldSelection = React.memo(FieldSelectionComponent);