From fe79c85ddde0dd7f2bb978286ecb56a71950fb39 Mon Sep 17 00:00:00 2001 From: Kevin Qualters <56408403+kqualters-elastic@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:34:12 -0400 Subject: [PATCH 001/146] [Security Solution] [Notes] Enable templated insights with all events, not just alerts (#197164) ## Summary Currently all notes that make use of the markdown based timeline data providers will render as a timeline template if the note is associated with an event, and not an alert. Mostly everything is in place to have everything work for both already, there's just no context that contains the event document in the tree in the notes list component currently. This pr adds that context, and everything else works as expected. ![event_insights](https://github.com/user-attachments/assets/72d25ef2-0c2c-4f82-974f-0f005c9b2d77) ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../document_details/left/components/notes_details.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.tsx index f97ca576d2385..5aca7ca389d11 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.tsx @@ -33,6 +33,8 @@ import { import { useDocumentDetailsContext } from '../../shared/context'; import { useUserPrivileges } from '../../../../common/components/user_privileges'; import { useWhichFlyout } from '../../shared/hooks/use_which_flyout'; +import { BasicAlertDataContext } from './investigation_guide_view'; +import { useInvestigationGuide } from '../../shared/hooks/use_investigation_guide'; export const FETCH_NOTES_ERROR = i18n.translate( 'xpack.securitySolution.flyout.left.notes.fetchNotesErrorLabel', @@ -55,6 +57,10 @@ export const NotesDetails = memo(() => { const dispatch = useDispatch(); const { eventId, dataFormattedForFieldBrowser } = useDocumentDetailsContext(); const { kibanaSecuritySolutionsPrivileges } = useUserPrivileges(); + const { basicAlertData: basicData } = useInvestigationGuide({ + dataFormattedForFieldBrowser, + }); + const canCreateNotes = kibanaSecuritySolutionsPrivileges.crud; // will drive the value we send to the AddNote component @@ -130,7 +136,7 @@ export const NotesDetails = memo(() => { ); return ( - <> + {fetchStatus === ReqStatus.Loading && ( )} @@ -156,7 +162,7 @@ export const NotesDetails = memo(() => { )} - + ); }); From 0a04e0674f3dd2561385c130202608cbdc007205 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Tue, 22 Oct 2024 09:36:04 -0500 Subject: [PATCH 002/146] Revert "[ci] Cache chromedriver (#196614)" This reverts commit b89941f3ab072135cc3c343f083e2669831ea4af. --- .buildkite/scripts/common/env.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.buildkite/scripts/common/env.sh b/.buildkite/scripts/common/env.sh index 2704f894cf2b6..511f6ead2d43c 100755 --- a/.buildkite/scripts/common/env.sh +++ b/.buildkite/scripts/common/env.sh @@ -8,7 +8,6 @@ KIBANA_DIR=$(pwd) export KIBANA_DIR export XPACK_DIR="$KIBANA_DIR/x-pack" -export XDG_CACHE_HOME="$HOME/.cache" export CACHE_DIR="$HOME/.kibana" export ES_CACHE_DIR="$HOME/.es-snapshot-cache" PARENT_DIR="$(cd "$KIBANA_DIR/.."; pwd)" @@ -111,6 +110,7 @@ export TEST_CORS_SERVER_PORT=6105 if [[ "$(which google-chrome-stable)" || "$(which google-chrome)" ]]; then echo "Chrome detected, setting DETECT_CHROMEDRIVER_VERSION=true" export DETECT_CHROMEDRIVER_VERSION=true + export CHROMEDRIVER_FORCE_DOWNLOAD=true else echo "Chrome not detected, installing default chromedriver binary for the package version" fi From 0c95fa3f2a3fc68c091ca9ccfc753bdba7daddd5 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Tue, 22 Oct 2024 16:36:59 +0200 Subject: [PATCH 003/146] [ML] Forecast api delete test: add retry to ensure forecast has time to complete before deletion (#197111) ## Summary Fixes https://github.com/elastic/kibana/issues/195602 This PR adds a retry for 10 seconds to the deleteForecast utility function to ensure the forecast has completed before a deletion attempt is made. Flaky test: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7201 ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../anomaly_detectors/forecast_with_spaces.ts | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/x-pack/test/api_integration/apis/ml/anomaly_detectors/forecast_with_spaces.ts b/x-pack/test/api_integration/apis/ml/anomaly_detectors/forecast_with_spaces.ts index 32e82c67e348d..a6bc0b0c99a86 100644 --- a/x-pack/test/api_integration/apis/ml/anomaly_detectors/forecast_with_spaces.ts +++ b/x-pack/test/api_integration/apis/ml/anomaly_detectors/forecast_with_spaces.ts @@ -15,6 +15,7 @@ export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertestWithoutAuth'); const ml = getService('ml'); const spacesService = getService('spaces'); + const retry = getService('retry'); const forecastJobId = 'fq_single_forecast'; const forecastJobDatafeedId = `datafeed-${forecastJobId}`; @@ -45,21 +46,22 @@ export default ({ getService }: FtrProviderContext) => { user: USER, expectedStatusCode: number ) { - const { body, status } = await supertest - .delete( - `${ - space ? `/s/${space}` : '' - }/internal/ml/anomaly_detectors/${jobId}/_forecast/${forecastId}` - ) - .auth(user, ml.securityCommon.getPasswordForUser(user)) - .set(getCommonRequestHeader('1')); - ml.api.assertResponseStatusCode(expectedStatusCode, status, body); - - return body; + await retry.tryForTime(10000, async () => { + const { body, status } = await supertest + .delete( + `${ + space ? `/s/${space}` : '' + }/internal/ml/anomaly_detectors/${jobId}/_forecast/${forecastId}` + ) + .auth(user, ml.securityCommon.getPasswordForUser(user)) + .set(getCommonRequestHeader('1')); + ml.api.assertResponseStatusCode(expectedStatusCode, status, body); + + return body; + }); } - // Failing see: https://github.com/elastic/kibana/issues/195602 - describe.skip('POST anomaly_detectors _forecast with spaces', function () { + describe('POST anomaly_detectors _forecast with spaces', function () { let forecastId: string; before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); @@ -110,11 +112,11 @@ export default ({ getService }: FtrProviderContext) => { }); it('should not delete forecast for user without permissions', async () => { - await await deleteForecast(forecastJobId, forecastId, idSpace1, USER.ML_VIEWER, 403); + await deleteForecast(forecastJobId, forecastId, idSpace1, USER.ML_VIEWER, 403); }); it('should delete forecast for user with permissions', async () => { - await await deleteForecast(forecastJobId, forecastId, idSpace1, USER.ML_POWERUSER, 200); + await deleteForecast(forecastJobId, forecastId, idSpace1, USER.ML_POWERUSER, 200); }); it('should not run forecast for open job with invalid duration', async () => { From 68b328d36ba6a178c27744c249b0cea7f4eaa00b Mon Sep 17 00:00:00 2001 From: Sergi Romeu Date: Tue, 22 Oct 2024 16:43:52 +0200 Subject: [PATCH 004/146] [APM] Use subfeature permissions for Labs settings (#197092) ## Summary Closes https://github.com/elastic/kibana/issues/197091 This PR uses the previously created (https://github.com/elastic/kibana/pull/194419) subfeature permissions for APM to be able to modify settings inside Labs flyout. ## Screenshots for unauthorized user | Before | After | |-------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------| |![image](https://github.com/user-attachments/assets/a405c0c5-765d-4a18-a26a-55ba0df1d343)|![image](https://github.com/user-attachments/assets/a57e68c2-10c8-428b-9fce-31309b7a9d6e)| ## How to test 1. Go under Stack Management -> Roles and create a new custom role. 2. For Kibana, select All spaces for the space selector, and Customize, you can get all the permissions you need. 3. Go into Observability and APM and User Experience. 4. Select Read and save the role. 5. Create a new user and assign that role and also the viewer role. 6. Login with an incognito / different browser into the new user. 7. Go into APM -> Settings, WARNING: if you are not able to see settings is because you don't have data, run node scripts/synthtrace many_services.ts --live --clean. 8. You should not be able to change the configuration on each tab. 9. Change the role privileges to have Read but with write access. 10. Test it, you should be able to modify the settings. 11. Do the same with All with and without the write permissions. --- .../labs/labs_flyout.tsx | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/observability_solution/apm/public/components/routing/app_root/apm_header_action_menu/labs/labs_flyout.tsx b/x-pack/plugins/observability_solution/apm/public/components/routing/app_root/apm_header_action_menu/labs/labs_flyout.tsx index 7eea2faf9f62c..bda1c7e4ee022 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/routing/app_root/apm_header_action_menu/labs/labs_flyout.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/routing/app_root/apm_header_action_menu/labs/labs_flyout.tsx @@ -20,6 +20,7 @@ import { EuiSpacer, EuiText, EuiTitle, + EuiToolTip, } from '@elastic/eui'; import { withSuspense } from '@kbn/shared-ux-utility'; import { i18n } from '@kbn/i18n'; @@ -42,7 +43,11 @@ interface Props { export function LabsFlyout({ onClose }: Props) { const trackApmEvent = useUiTracker({ app: 'apm' }); - const { docLinks, notifications } = useApmPluginContext().core; + const { docLinks, notifications, application } = useApmPluginContext().core; + + const canSave = + application.capabilities.advancedSettings.save && + (application.capabilities.apm['settings:save'] as boolean); const { data, status } = useFetcher( (callApmApi) => callApmApi('GET /internal/apm/settings/labs'), @@ -152,7 +157,7 @@ export function LabsFlyout({ onClose }: Props) { > @@ -172,16 +177,27 @@ export function LabsFlyout({ onClose }: Props) { - - {i18n.translate('xpack.apm.labs.reload', { - defaultMessage: 'Reload to apply changes', - })} - + + {i18n.translate('xpack.apm.labs.reload', { + defaultMessage: 'Reload to apply changes', + })} + + From d8fa996c5052d10da2f438b93723437f5631bbde Mon Sep 17 00:00:00 2001 From: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:53:37 +0100 Subject: [PATCH 005/146] [Index Management] Fix unhandled error in ds data retention modal (#196524) Fixes https://github.com/elastic/kibana/issues/196331 ## Summary This PR fixes the bug in the Edit ds data retention modal where we were comparing the max retention period with an undefined `value` (now the comparison happens only if `value` is defined). Also, the PR makes the data retention field get re-validated only when the time unit changes (otherwise, when we switch off the toggle to enable to data retention field, the field would get validated and would immediately show an error "A data retention value is required." which is not great UX). ### How to test: 1. Start serverless ES with `yarn es serverless --projectType=security -E data_streams.lifecycle.retention.max=200d` and kibana with `yarn serverless-security` 2. Navigate to Kibana, create a data stream using Dev Tools: ``` PUT _index_template/ds { "index_patterns": ["ds"], "data_stream": {} } POST ds/_doc { "@timestamp": "2020-01-27" } ``` 3. Navigate to Index Management. Find the data stream and select it --> Click "Manage" --> Click "Edit data retention" 4. Disable the toggle "Keep data up to maximum retention period" 5. Verify that the field is enabled correctly, there is not endless spinner, and no console error. https://github.com/user-attachments/assets/957e0869-ee23-46d9-8f20-134937f6f8cf --------- Co-authored-by: Matthew Kime --- .../edit_data_retention_modal.tsx | 109 ++++++++---------- .../validations.test.ts | 53 +++++++++ .../edit_data_retention_modal/validations.ts | 61 ++++++++++ 3 files changed, 161 insertions(+), 62 deletions(-) create mode 100644 x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/validations.test.ts create mode 100644 x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/validations.ts diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/edit_data_retention_modal.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/edit_data_retention_modal.tsx index ca3612bdab168..f747abca19f05 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/edit_data_retention_modal.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/edit_data_retention_modal.tsx @@ -23,6 +23,7 @@ import { has } from 'lodash'; import { ScopedHistory } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; +import { isBiggerThanGlobalMaxRetention } from './validations'; import { useForm, useFormData, @@ -34,6 +35,7 @@ import { UseField, ToggleField, NumericField, + fieldValidators, } from '../../../../../shared_imports'; import { reactRouterNavigate } from '../../../../../shared_imports'; @@ -53,35 +55,6 @@ interface Props { onClose: (data?: { hasUpdatedDataRetention: boolean }) => void; } -const convertToMinutes = (value: string) => { - const { size, unit } = splitSizeAndUnits(value); - const sizeNum = parseInt(size, 10); - - switch (unit) { - case 'd': - // days to minutes - return sizeNum * 24 * 60; - case 'h': - // hours to minutes - return sizeNum * 60; - case 'm': - // minutes to minutes - return sizeNum; - case 's': - // seconds to minutes - return sizeNum / 60; - default: - throw new Error(`Unknown unit: ${unit}`); - } -}; - -const isRetentionBiggerThan = (valueA: string, valueB: string) => { - const minutesA = convertToMinutes(valueA); - const minutesB = convertToMinutes(valueB); - - return minutesA > minutesB; -}; - const configurationFormSchema: FormSchema = { dataRetention: { type: FIELD_TYPES.TEXT, @@ -94,50 +67,62 @@ const configurationFormSchema: FormSchema = { formatters: [fieldFormatters.toInt], validations: [ { - validator: ({ value, formData, customData }) => { - // If infiniteRetentionPeriod is set, we dont need to validate the data retention field - if (formData.infiniteRetentionPeriod) { - return undefined; + validator: ({ value }) => { + // TODO: Replace with validator added in https://github.com/elastic/kibana/pull/196527/ + if (!Number.isInteger(Number(value ?? ''))) { + return { + message: i18n.translate( + 'xpack.idxMgmt.dataStreamsDetailsPanel.editDataRetentionModal.dataRetentionFieldIntegerError', + { + defaultMessage: 'Only integers are allowed.', + } + ), + }; } - - // If project level data retention is enabled, we need to enforce the global max retention - const { globalMaxRetention, enableProjectLevelRetentionChecks } = customData.value as any; - if (enableProjectLevelRetentionChecks) { - const currentValue = `${value}${formData.timeUnit}`; - if (globalMaxRetention && isRetentionBiggerThan(currentValue, globalMaxRetention)) { - return { - message: i18n.translate( - 'xpack.idxMgmt.dataStreamsDetailsPanel.editDataRetentionModal.dataRetentionFieldMaxError', - { - defaultMessage: - 'Maximum data retention period on this project is {maxRetention} days.', - // Remove the unit from the globalMaxRetention value - values: { maxRetention: globalMaxRetention.slice(0, -1) }, - } - ), - }; + }, + }, + { + validator: ({ value, formData, customData }) => { + // We only need to validate the data retention field if infiniteRetentionPeriod is set to false + if (!formData.infiniteRetentionPeriod) { + // If project level data retention is enabled, we need to enforce the global max retention + const { globalMaxRetention, enableProjectLevelRetentionChecks } = + customData.value as any; + if (enableProjectLevelRetentionChecks) { + return isBiggerThanGlobalMaxRetention(value, formData.timeUnit, globalMaxRetention); } } - - if (!value) { - return { - message: i18n.translate( + }, + }, + { + validator: (args) => { + // We only need to validate the data retention field if infiniteRetentionPeriod is set to false + if (!args.formData.infiniteRetentionPeriod) { + return fieldValidators.emptyField( + i18n.translate( 'xpack.idxMgmt.dataStreamsDetailsPanel.editDataRetentionModal.dataRetentionFieldRequiredError', { defaultMessage: 'A data retention value is required.', } - ), - }; + ) + )(args); } - if (value <= 0) { - return { + }, + }, + { + validator: (args) => { + // We only need to validate the data retention field if infiniteRetentionPeriod is set to false + if (!args.formData.infiniteRetentionPeriod) { + return fieldValidators.numberGreaterThanField({ + than: 0, + allowEquality: false, message: i18n.translate( 'xpack.idxMgmt.dataStreamsDetailsPanel.editDataRetentionModal.dataRetentionFieldNonNegativeError', { defaultMessage: `A positive value is required.`, } ), - }; + })(args); } }, }, @@ -258,11 +243,11 @@ export const EditDataRetentionModal: React.FunctionComponent = ({ const formHasErrors = form.getErrors().length > 0; const disableSubmit = formHasErrors || !isDirty || form.isValid === false; - // Whenever the formData changes, we need to re-validate the dataRetention field - // as it depends on the timeUnit field. + // Whenever the timeUnit field changes, we need to re-validate + // the dataRetention field useEffect(() => { form.validateFields(['dataRetention']); - }, [formData, form]); + }, [formData.timeUnit, form]); const onSubmitForm = async () => { const { isValid, data } = await form.submit(); diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/validations.test.ts b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/validations.test.ts new file mode 100644 index 0000000000000..0768d0990cdc0 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/validations.test.ts @@ -0,0 +1,53 @@ +/* + * 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 { isBiggerThanGlobalMaxRetention } from './validations'; + +describe('isBiggerThanGlobalMaxRetention', () => { + it('should return undefined if any argument is missing', () => { + expect(isBiggerThanGlobalMaxRetention('', 'd', '30d')).toBeUndefined(); + expect(isBiggerThanGlobalMaxRetention(10, '', '30d')).toBeUndefined(); + expect(isBiggerThanGlobalMaxRetention(10, 'd', '')).toBeUndefined(); + }); + + it('should return an error message if retention is bigger than global max retention (in days)', () => { + const result = isBiggerThanGlobalMaxRetention(40, 'd', '30d'); + expect(result).toEqual({ + message: 'Maximum data retention period on this project is 30 days.', + }); + }); + + it('should return undefined if retention is smaller than or equal to global max retention (in days)', () => { + expect(isBiggerThanGlobalMaxRetention(30, 'd', '30d')).toBeUndefined(); + expect(isBiggerThanGlobalMaxRetention(25, 'd', '30d')).toBeUndefined(); + }); + + it('should correctly compare retention in different time units against days', () => { + expect(isBiggerThanGlobalMaxRetention(24, 'h', '1d')).toBeUndefined(); + expect(isBiggerThanGlobalMaxRetention(23, 'h', '1d')).toBeUndefined(); + // 30 days = 720 hours + expect(isBiggerThanGlobalMaxRetention(800, 'h', '30d')).toEqual({ + message: 'Maximum data retention period on this project is 30 days.', + }); + + // 1 day = 1440 minutes + expect(isBiggerThanGlobalMaxRetention(1440, 'm', '1d')).toBeUndefined(); + expect(isBiggerThanGlobalMaxRetention(3000, 'm', '2d')).toEqual({ + message: 'Maximum data retention period on this project is 2 days.', + }); + + // 1 day = 86400 seconds + expect(isBiggerThanGlobalMaxRetention(1000, 's', '1d')).toBeUndefined(); + expect(isBiggerThanGlobalMaxRetention(87000, 's', '1d')).toEqual({ + message: 'Maximum data retention period on this project is 1 days.', + }); + }); + + it('should throw an error for unknown time units', () => { + expect(() => isBiggerThanGlobalMaxRetention(10, 'x', '30d')).toThrow('Unknown unit: x'); + }); +}); diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/validations.ts b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/validations.ts new file mode 100644 index 0000000000000..831ac2f4c26b9 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/edit_data_retention_modal/validations.ts @@ -0,0 +1,61 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { splitSizeAndUnits } from '../../../../../../common'; + +const convertToMinutes = (value: string) => { + const { size, unit } = splitSizeAndUnits(value); + const sizeNum = parseInt(size, 10); + + switch (unit) { + case 'd': + // days to minutes + return sizeNum * 24 * 60; + case 'h': + // hours to minutes + return sizeNum * 60; + case 'm': + // minutes to minutes + return sizeNum; + case 's': + // seconds to minutes (round up if any remainder) + return Math.ceil(sizeNum / 60); + default: + throw new Error(`Unknown unit: ${unit}`); + } +}; + +const isRetentionBiggerThan = (valueA: string, valueB: string) => { + const minutesA = convertToMinutes(valueA); + const minutesB = convertToMinutes(valueB); + + return minutesA > minutesB; +}; + +export const isBiggerThanGlobalMaxRetention = ( + retentionValue: string | number, + retentionTimeUnit: string, + globalMaxRetention: string +) => { + if (!retentionValue || !retentionTimeUnit || !globalMaxRetention) { + return undefined; + } + + return isRetentionBiggerThan(`${retentionValue}${retentionTimeUnit}`, globalMaxRetention) + ? { + message: i18n.translate( + 'xpack.idxMgmt.dataStreamsDetailsPanel.editDataRetentionModal.dataRetentionFieldMaxError', + { + defaultMessage: 'Maximum data retention period on this project is {maxRetention} days.', + // Remove the unit from the globalMaxRetention value + values: { maxRetention: globalMaxRetention.slice(0, -1) }, + } + ), + } + : undefined; +}; From 0055da5f39cbeabf426ffbec5b7e58e43c96cd57 Mon Sep 17 00:00:00 2001 From: seanrathier Date: Tue, 22 Oct 2024 10:55:47 -0400 Subject: [PATCH 006/146] [Cloud Security] Remove failsOnMKI tag from the Agentless agent tests in Serverless Quality Gates (#197094) ## Summary Enabling the Serverless Quality Gate test for the Agentless Agent now that the Agentless API downtime is completed --- .../ftr/cloud_security_posture/agentless_api/create_agent.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/x-pack/test_serverless/functional/test_suites/security/ftr/cloud_security_posture/agentless_api/create_agent.ts b/x-pack/test_serverless/functional/test_suites/security/ftr/cloud_security_posture/agentless_api/create_agent.ts index 8164fd39a81de..b26581fb46dfd 100644 --- a/x-pack/test_serverless/functional/test_suites/security/ftr/cloud_security_posture/agentless_api/create_agent.ts +++ b/x-pack/test_serverless/functional/test_suites/security/ftr/cloud_security_posture/agentless_api/create_agent.ts @@ -25,9 +25,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const AWS_SINGLE_ACCOUNT_TEST_ID = 'awsSingleTestId'; describe('Agentless API Serverless', function () { - // fails on MKI, see https://github.com/elastic/kibana/issues/196245 - this.tags(['failsOnMKI']); - let mockApiServer: http.Server; let cisIntegration: typeof pageObjects.cisAddIntegration; From 2b60d6f481fa79acfd56e4decb0fc58deaec9e4a Mon Sep 17 00:00:00 2001 From: Charlotte Alexandra Wilson Date: Tue, 22 Oct 2024 15:58:06 +0100 Subject: [PATCH 007/146] Update hello_world_plugin.mdx (#197104) ## Summary Changed import path for Kibana Core Public imports, previous was not working. New import path reflects what I found elsewhere in the codebase, and works. --- dev_docs/getting_started/hello_world_plugin.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev_docs/getting_started/hello_world_plugin.mdx b/dev_docs/getting_started/hello_world_plugin.mdx index 08fd7e4a721c2..29e6944f88150 100644 --- a/dev_docs/getting_started/hello_world_plugin.mdx +++ b/dev_docs/getting_started/hello_world_plugin.mdx @@ -90,7 +90,7 @@ And add the following to it: ```ts import React from 'react'; import ReactDOM from 'react-dom'; -import { AppMountParameters, CoreSetup, CoreStart, Plugin } from '../../../src/core/public'; +import { AppMountParameters, CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; export class HelloWorldPlugin implements Plugin { public setup(core: CoreSetup) { From aaf3539faf9dd637bc311cabcd9dfb37fd263119 Mon Sep 17 00:00:00 2001 From: Giorgos Bamparopoulos Date: Tue, 22 Oct 2024 18:03:10 +0300 Subject: [PATCH 008/146] [Onboarding] Add tech preview badge to the OTel k8s flow (#197229) Adds Tech Preview badges for the k8s OTel flow. ### Quickstart tile image ### Onboarding page image --- .../onboarding_flow_form/use_custom_cards_for_category.tsx | 1 + .../public/application/pages/otel_kubernetes.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.tsx index a31f835bae4d0..0ef775d4e3f6c 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.tsx @@ -191,6 +191,7 @@ export function useCustomCardsForCategory( version: '', integration: '', isQuickstart: true, + release: 'preview', }, ]; diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/otel_kubernetes.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/otel_kubernetes.tsx index c4fba1fd8ff0e..8939a9fdf678e 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/otel_kubernetes.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/otel_kubernetes.tsx @@ -28,6 +28,7 @@ export const OtelKubernetesPage = () => ( defaultMessage: 'Unified Kubernetes observability with the OpenTelemetry Operator', } )} + isTechnicalPreview={true} /> } > From a5e49e63eaab60d44b3c455b790e59931bc5a067 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 22 Oct 2024 08:04:09 -0700 Subject: [PATCH 009/146] [TopNav] Ability for menu items to collapse into popover at custom breakpoints (#195820) ## Summary Closes #154414 Allows customization of `popoverBreakpoints` that are passed to `EuiHeaderLinks`. See https://eui.elastic.co/#/layout/header#header-links BEFORE ![before-bldx7lhzrxkzrxkyzr](https://github.com/user-attachments/assets/798836b1-f254-4f11-bda4-803caf0e02e5) AFTER ![after-bldx7lhzrxkzrxkyzr](https://github.com/user-attachments/assets/c227746b-00b0-4a41-9982-00b7cfb7e084) ### Checklist Delete any items that are not applicable to this PR. - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) --- .../public/top_nav_menu/top_nav_menu.tsx | 26 ++++++++++++++----- .../top_nav_menu/top_nav_menu_items.tsx | 21 ++++++++++----- .../lens/public/app_plugin/lens_top_nav.tsx | 1 + 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx index 0d42b7c8f241a..6a3dabd9a0ceb 100644 --- a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx +++ b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx @@ -10,14 +10,15 @@ import React, { ReactElement } from 'react'; import classNames from 'classnames'; -import { MountPoint } from '@kbn/core/public'; +import type { MountPoint } from '@kbn/core/public'; import { MountPointPortal } from '@kbn/react-kibana-mount'; -import { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; -import { StatefulSearchBarProps } from '@kbn/unified-search-plugin/public'; -import { AggregateQuery, Query } from '@kbn/es-query'; -import { TopNavMenuData } from './top_nav_menu_data'; +import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; +import type { StatefulSearchBarProps } from '@kbn/unified-search-plugin/public'; +import type { AggregateQuery, Query } from '@kbn/es-query'; +import type { EuiBreakpointSize } from '@elastic/eui'; +import type { TopNavMenuData } from './top_nav_menu_data'; import { TopNavMenuItems } from './top_nav_menu_items'; -import { TopNavMenuBadgeProps, TopNavMenuBadges } from './top_nav_menu_badges'; +import { type TopNavMenuBadgeProps, TopNavMenuBadges } from './top_nav_menu_badges'; export type TopNavMenuProps = Omit< StatefulSearchBarProps, @@ -51,6 +52,11 @@ export type TopNavMenuProps = Omit< * ``` */ setMenuMountPoint?: (menuMount: MountPoint | undefined) => void; + + /** + * A list of named breakpoints at which to show the popover version. If not provided, it will use the default set of ['xs', 's'] that is internally provided by EUI. + */ + popoverBreakpoints?: EuiBreakpointSize[]; }; /* @@ -76,7 +82,13 @@ export function TopNavMenu( } function renderMenu(className: string): ReactElement | null { - return ; + return ( + + ); } function renderSearchBar(): ReactElement | null { diff --git a/src/plugins/navigation/public/top_nav_menu/top_nav_menu_items.tsx b/src/plugins/navigation/public/top_nav_menu/top_nav_menu_items.tsx index 48179f30ec276..e8d118dadff7d 100644 --- a/src/plugins/navigation/public/top_nav_menu/top_nav_menu_items.tsx +++ b/src/plugins/navigation/public/top_nav_menu/top_nav_menu_items.tsx @@ -7,21 +7,30 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { EuiHeaderLinks } from '@elastic/eui'; +import { EuiBreakpointSize, EuiHeaderLinks } from '@elastic/eui'; import React from 'react'; import type { TopNavMenuData } from './top_nav_menu_data'; import { TopNavMenuItem } from './top_nav_menu_item'; +interface TopNavMenuItemsProps { + config: TopNavMenuData[] | undefined; + className?: string; + popoverBreakpoints?: EuiBreakpointSize[]; +} + export const TopNavMenuItems = ({ config, className, -}: { - config: TopNavMenuData[] | undefined; - className?: string; -}) => { + popoverBreakpoints, +}: TopNavMenuItemsProps) => { if (!config || config.length === 0) return null; return ( - + {config.map((menuItem: TopNavMenuData, i: number) => { return ; })} diff --git a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx index da99d693539b8..d26ce3f01cf34 100644 --- a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx +++ b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx @@ -1071,6 +1071,7 @@ export const LensTopNavMenu = ({ return ( Date: Tue, 22 Oct 2024 17:04:44 +0200 Subject: [PATCH 010/146] Drop integration tiles for connectors in Enterprise Search (#196173) ## Closes https://github.com/elastic/search-team/issues/8406 ## Summary For 9.x we're removing connectors the way they are and switching to agent integrations - we already started work there. This PR removes the integrations from 9.X branch. ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels) - [ ] This will appear in the **Release Notes** and follow the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../apis/custom_integration/integrations.ts | 2 +- .../enterprise_search/server/integrations.ts | 31 +------------------ .../enterprise_search/server/plugin.ts | 7 +---- 3 files changed, 3 insertions(+), 37 deletions(-) diff --git a/test/api_integration/apis/custom_integration/integrations.ts b/test/api_integration/apis/custom_integration/integrations.ts index 26a8777e23800..e04a119aa06ea 100644 --- a/test/api_integration/apis/custom_integration/integrations.ts +++ b/test/api_integration/apis/custom_integration/integrations.ts @@ -25,7 +25,7 @@ export default function ({ getService }: FtrProviderContext) { expect(resp.body).to.be.an('array'); - expect(resp.body.length).to.be(55); + expect(resp.body.length).to.be(21); // Test for sample data card expect(resp.body.findIndex((c: { id: string }) => c.id === 'sample_data_all')).to.be.above( diff --git a/x-pack/plugins/enterprise_search/server/integrations.ts b/x-pack/plugins/enterprise_search/server/integrations.ts index 2918ef862dbdf..d66768e578732 100644 --- a/x-pack/plugins/enterprise_search/server/integrations.ts +++ b/x-pack/plugins/enterprise_search/server/integrations.ts @@ -6,17 +6,13 @@ */ import type { CustomIntegrationsPluginSetup } from '@kbn/custom-integrations-plugin/server'; import { i18n } from '@kbn/i18n'; -import { ConnectorServerSideDefinition } from '@kbn/search-connectors-plugin/server'; import { ConfigType } from '.'; export const registerEnterpriseSearchIntegrations = ( config: ConfigType, - customIntegrations: CustomIntegrationsPluginSetup, - isCloud: boolean, - connectors: ConnectorServerSideDefinition[] + customIntegrations: CustomIntegrationsPluginSetup ) => { - const nativeSearchTag = config.hasNativeConnectors && isCloud ? ['native_search'] : []; if (config.hasWebCrawler) { customIntegrations.registerCustomIntegration({ id: 'web_crawler', @@ -58,29 +54,4 @@ export const registerEnterpriseSearchIntegrations = ( shipper: 'search', isBeta: false, }); - - if (config.hasConnectors) { - connectors.forEach((connector) => { - const connectorType = connector.isNative && isCloud ? 'native' : 'connector_client'; - const categories = connector.isNative - ? [...(connector.categories || []), ...nativeSearchTag] - : connector.categories; - - customIntegrations.registerCustomIntegration({ - categories: categories || [], - description: connector.description || '', - icons: [ - { - src: connector.iconPath, - type: 'svg', - }, - ], - id: `${connector.serviceType}-${connector.name}`, - isBeta: connector.isBeta, - shipper: 'search', - title: connector.name, - uiInternalPath: `/app/enterprise_search/content/connectors/new_connector?connector_type=${connectorType}&service_type=${connector.serviceType}`, - }); - }); - } }; diff --git a/x-pack/plugins/enterprise_search/server/plugin.ts b/x-pack/plugins/enterprise_search/server/plugin.ts index c80216bc7a156..4900fe2af29a2 100644 --- a/x-pack/plugins/enterprise_search/server/plugin.ts +++ b/x-pack/plugins/enterprise_search/server/plugin.ts @@ -182,12 +182,7 @@ export class EnterpriseSearchPlugin implements Plugin { const isCloud = !!cloud?.cloudId; if (customIntegrations) { - registerEnterpriseSearchIntegrations( - config, - customIntegrations, - isCloud, - searchConnectors?.getConnectorTypes() || [] - ); + registerEnterpriseSearchIntegrations(config, customIntegrations); } /* From a3ba90c025c5b443c7d5d3e234f6f0abd17ca569 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Tue, 22 Oct 2024 17:05:14 +0200 Subject: [PATCH 011/146] [EDR Workflows] Add missing services to Osquery Cypress (#197213) --- x-pack/test/osquery_cypress/cli_config.ts | 4 ++-- x-pack/test/osquery_cypress/services.ts | 8 +------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/x-pack/test/osquery_cypress/cli_config.ts b/x-pack/test/osquery_cypress/cli_config.ts index a61951e405960..711bbe266db9f 100644 --- a/x-pack/test/osquery_cypress/cli_config.ts +++ b/x-pack/test/osquery_cypress/cli_config.ts @@ -6,14 +6,14 @@ */ import { FtrConfigProviderContext } from '@kbn/test'; - +import { services } from './services'; import { startOsqueryCypress } from './runner'; export default async function ({ readConfigFile }: FtrConfigProviderContext) { const osqueryCypressConfig = await readConfigFile(require.resolve('./config.ts')); return { ...osqueryCypressConfig.getAll(), - + services, testRunner: startOsqueryCypress, }; } diff --git a/x-pack/test/osquery_cypress/services.ts b/x-pack/test/osquery_cypress/services.ts index 95fd493e6f668..272cf7eb8da4e 100644 --- a/x-pack/test/osquery_cypress/services.ts +++ b/x-pack/test/osquery_cypress/services.ts @@ -5,10 +5,4 @@ * 2.0. */ -import { commonFunctionalServices } from '@kbn/ftr-common-functional-services'; -import { commonFunctionalUIServices } from '@kbn/ftr-common-functional-ui-services'; - -export const services = { - ...commonFunctionalServices, - ...commonFunctionalUIServices, -} as const; +export * from '@kbn/test-suites-src/common/services'; From 8e1fcc126ac1b5b012b5730d51ca1ba6304020d5 Mon Sep 17 00:00:00 2001 From: Saikat Sarkar <132922331+saikatsarkar056@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:10:40 -0600 Subject: [PATCH 012/146] Add watsonx icon for inference endpoints management page (#197116) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR adds IBM Watsonx ai support for the Inference Endpoints Management UI. Screenshot 2024-10-21 at 12 22 09 PM --- .../src/constants/trained_models.ts | 10 ++++++++++ .../public/assets/images/providers/watsonx_ai.svg | 3 +++ .../render_service_provider/service_provider.tsx | 5 +++++ .../public/components/all_inference_endpoints/types.ts | 1 + 4 files changed, 19 insertions(+) create mode 100644 x-pack/plugins/search_inference_endpoints/public/assets/images/providers/watsonx_ai.svg diff --git a/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts b/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts index 9fd3483771a9f..c2eb7d0ed8ef3 100644 --- a/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts +++ b/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts @@ -287,6 +287,16 @@ export type InferenceServiceSettings = }; }; } + | { + service: 'watsonxai'; + service_settings: { + api_key: string; + url: string; + model_id: string; + project_id: string; + api_version: string; + }; + } | { service: 'amazonbedrock'; service_settings: { diff --git a/x-pack/plugins/search_inference_endpoints/public/assets/images/providers/watsonx_ai.svg b/x-pack/plugins/search_inference_endpoints/public/assets/images/providers/watsonx_ai.svg new file mode 100644 index 0000000000000..29f7a735e6614 --- /dev/null +++ b/x-pack/plugins/search_inference_endpoints/public/assets/images/providers/watsonx_ai.svg @@ -0,0 +1,3 @@ + + + diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_service_provider/service_provider.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_service_provider/service_provider.tsx index 574b3881f121b..74f15f22762f1 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_service_provider/service_provider.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_service_provider/service_provider.tsx @@ -21,6 +21,7 @@ import googleAIStudioIcon from '../../../../assets/images/providers/google_ai_st import mistralIcon from '../../../../assets/images/providers/mistral.svg'; import amazonBedrockIcon from '../../../../assets/images/providers/amazon_bedrock.svg'; import alibabaCloudAISearchIcon from '../../../../assets/images/providers/alibaba_cloud_ai_search.svg'; +import watsonxAIIcon from '../../../../assets/images/providers/watsonx_ai.svg'; import { ServiceProviderKeys } from '../../types'; import * as i18n from './translations'; @@ -78,6 +79,10 @@ export const SERVICE_PROVIDERS: Record = ({ providerEndpoint }) => { diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/types.ts b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/types.ts index c1f23a3a4f2e3..b5c5fc49aa1fa 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/types.ts +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/types.ts @@ -21,6 +21,7 @@ export enum ServiceProviderKeys { hugging_face = 'hugging_face', mistral = 'mistral', openai = 'openai', + watsonxai = 'watsonxai', } export enum SortFieldInferenceEndpoint { From f629d96b85b222fbc3116e6a0a4308882d144aef Mon Sep 17 00:00:00 2001 From: Jusheng Huang <117657272+viajes7@users.noreply.github.com> Date: Tue, 22 Oct 2024 23:12:12 +0800 Subject: [PATCH 013/146] [Index Management] Fix Flashing error banner in Index Template form (#196786) ## Summary Fixes #194751 In `EuiForm`, if the value of `isInvalid` is true, it will render addressFormErrors tip messages. And In `step_logistics.tsx`, `isInValid` is setted by `isInvalid={isSubmitted && !isFormValid}` But form `submit` method set `isSubmitted` to true first, then validate form. At this time, `isSubmitted is true` and `isFormValid is unedfined`. So addressFormErrors shows immediately. ![image](https://github.com/user-attachments/assets/687a359d-ed33-4860-8d96-4543f2ef4898) **So, maybe when `isSubmitting` is true, addressFormErrors should not be shown.** Co-authored-by: Elastic Machine --- .../components/template_form/steps/step_logistics.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/index_management/public/application/components/template_form/steps/step_logistics.tsx b/x-pack/plugins/index_management/public/application/components/template_form/steps/step_logistics.tsx index 84cb0fa027ad1..d73d95600e5b1 100644 --- a/x-pack/plugins/index_management/public/application/components/template_form/steps/step_logistics.tsx +++ b/x-pack/plugins/index_management/public/application/components/template_form/steps/step_logistics.tsx @@ -194,6 +194,7 @@ export const StepLogistics: React.FunctionComponent = React.memo( const { submit, isSubmitted, + isSubmitting, isValid: isFormValid, getErrors: getFormErrors, getFormData, @@ -275,7 +276,7 @@ export const StepLogistics: React.FunctionComponent = React.memo(
From 2664ccf028ab8784e57a11f380cf6ae1d2b19c90 Mon Sep 17 00:00:00 2001 From: Tre Date: Tue, 22 Oct 2024 16:27:32 +0100 Subject: [PATCH 014/146] [FTR][Ownership] Assign ally/grps 1,2 & 3 (#195964) ## Summary Assign files within `x-pack/test/accessibility/apps/group[1|2|3]` ### Why I assigned them: Assigned advanced_settings due to https://github.com/elastic/kibana/pull/175255 Assigned dashboard_controls due to https://github.com/elastic/kibana/pull/190797 Assigned dashboard_links due to https://github.com/elastic/kibana/pull/174772 Assigned dashboard_panel_options due to https://github.com/elastic/kibana/pull/178596 Assigned grok_debugger due to https://github.com/elastic/kibana/blob/main/x-pack/plugins/grokdebugger/kibana.jsonc#L4 Assigned helpers due to https://github.com/elastic/kibana/pull/164341 (call site) Assigned home due to https://github.com/elastic/kibana/pull/103192 Assigned index_lifecycle_management due to https://github.com/elastic/kibana/pull/116207 Assigned ingest_node_pipelines due to https://github.com/elastic/kibana/pull/113783 Assigned kibana_overview due to https://github.com/elastic/kibana/blob/f00ac7a8a21463e6bb4a2784c3a3884f36c62900/x-pack/plugins/grokdebugger/kibana.jsonc#L4 Assigned management due to https://github.com/elastic/kibana/pull/165705 Assigned painless_lab due to https://github.com/elastic/kibana/blob/main/x-pack/plugins/painless_lab/kibana.jsonc#L4 Assigned search_profiler due to https://github.com/elastic/kibana/pull/195343 Assigned uptime due to https://github.com/elastic/kibana/blob/main/x-pack/plugins/observability_solution/uptime/kibana.jsonc#L4 Assigned lens due to https://github.com/elastic/kibana/pull/175893 Assigned ml_anomaly_detection due to https://github.com/elastic/kibana/pull/162126 Assigned canvas due to https://github.com/elastic/kibana/pull/164376 Assigned cc replication due to https://github.com/elastic/kibana/pull/149069 Assigned enterpise search due to https://github.com/elastic/kibana/issues/79359 Assigned graph to due https://github.com/elastic/kibana/pull/190797 Assigned license_management due to https://github.com/elastic/kibana/blob/main/x-pack/plugins/license_management/kibana.jsonc#L4 Assigned maps due to https://github.com/elastic/kibana/pull/155161 Assigned observability due to https://github.com/elastic/kibana/blob/main/x-pack/plugins/observability_solution/observability/kibana.jsonc#L4 Assigned remote clusters due to https://github.com/elastic/kibana/pull/96989 Assigned reporting due to https://github.com/elastic/kibana/pull/121435 Assigned rollup_jobs due to https://github.com/elastic/kibana/blob/d57bc9a5d7d64f86b550eff7997605a3090aee9a/x-pack/plugins/rollup/kibana.jsonc#L4 Assigned watcher due to https://github.com/elastic/kibana/pull/119717 Contributes to: https://github.com/elastic/kibana/issues/194817 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine Co-authored-by: Rodney Norris --- .github/CODEOWNERS | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c000628cf9c52..4dc62da409d25 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1088,6 +1088,8 @@ src/plugins/discover/public/context_awareness/profile_providers/security @elasti /x-pack/test_serverless/functional/test_suites/security/config.screenshots.ts @elastic/platform-docs # Visualizations +/x-pack/test/accessibility/apps/group3/graph.ts @elastic/kibana-visualizations +/x-pack/test/accessibility/apps/group2/lens.ts @elastic/kibana-visualizations /src/plugins/visualize/ @elastic/kibana-visualizations /x-pack/test/functional/apps/lens @elastic/kibana-visualizations /x-pack/test/api_integration/apis/lens/ @elastic/kibana-visualizations @@ -1115,6 +1117,7 @@ packages/kbn-monaco/src/esql @elastic/kibana-esql /docs/settings/reporting-settings.asciidoc @elastic/appex-sharedux /docs/setup/configuring-reporting.asciidoc @elastic/appex-sharedux /x-pack/test_serverless/**/test_suites/common/reporting/ @elastic/appex-sharedux +/x-pack/test/accessibility/apps/group3/reporting.ts @elastic/appex-sharedux ### Global Experience Tagging /x-pack/test/saved_object_tagging/ @elastic/appex-sharedux @@ -1201,6 +1204,8 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test/functional/apps/infra/logs @elastic/obs-ux-logs-team # Observability UX management team +/x-pack/test/accessibility/apps/group1/uptime.ts @elastic/obs-ux-management-team +/x-pack/test/accessibility/apps/group3/observability.ts @elastic/obs-ux-management-team /x-pack/packages/observability/alert_details @elastic/obs-ux-management-team /x-pack/test/observability_functional @elastic/obs-ux-management-team /x-pack/plugins/observability_solution/infra/public/alerting @elastic/obs-ux-management-team @@ -1217,6 +1222,8 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test/functional/apps/monitoring @elastic/stack-monitoring /x-pack/test/api_integration/apis/monitoring @elastic/stack-monitoring /x-pack/test/api_integration/apis/monitoring_collection @elastic/stack-monitoring +/x-pack/test/accessibility/apps/group1/kibana_overview.ts @elastic/stack-monitoring +/x-pack/test/accessibility/apps/group3/stack_monitoring.ts @elastic/stack-monitoring # Fleet /x-pack/test/fleet_api_integration @elastic/fleet @@ -1269,6 +1276,10 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai ### END Observability Plugins # Presentation +/x-pack/test/accessibility/apps/group3/maps.ts @elastic/kibana-presentation +/x-pack/test/accessibility/apps/group1/dashboard_panel_options.ts @elastic/kibana-presentation +/x-pack/test/accessibility/apps/group1/dashboard_links.ts @elastic/kibana-presentation +/x-pack/test/accessibility/apps/group1/dashboard_controls.ts @elastic/kibana-presentation /test/functional/apps/dashboard/ @elastic/kibana-presentation /test/functional/apps/dashboard_elements/ @elastic/kibana-presentation /test/functional/services/dashboard/ @elastic/kibana-presentation @@ -1342,6 +1353,9 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /.eslintignore @elastic/kibana-operations # Appex QA +/x-pack/test/accessibility/services.ts @elastic/appex-qa +/x-pack/test/accessibility/page_objects.ts @elastic/appex-qa +/x-pack/test/accessibility/ftr_provider_context.d.ts @elastic/appex-qa /x-pack/test_serverless/tsconfig.json @elastic/appex-qa /x-pack/test_serverless/kibana.jsonc @elastic/appex-qa /x-pack/test_serverless/functional/test_suites/common/README.md @elastic/appex-qa @@ -1458,6 +1472,7 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib #CC# /x-pack/plugins/security/ @elastic/kibana-security # Response Ops team +/x-pack/test/accessibility/apps/group3/rules_connectors.ts @elastic/response-ops /x-pack/test/functional/es_archives/cases/default @elastic/response-ops /x-pack/test_serverless/api_integration/test_suites/observability/config.ts @elastic/response-ops /x-pack/test_serverless/api_integration/test_suites/observability/index.ts @elastic/response-ops @@ -1530,10 +1545,26 @@ x-pack/test/api_integration/apis/management/index_management/inference_endpoints /x-pack/test/api_integration/apis/management/ @elastic/kibana-management /x-pack/test/functional/apps/rollup_job/ @elastic/kibana-management /x-pack/test/api_integration/apis/grok_debugger @elastic/kibana-management +/x-pack/test/accessibility/apps/group1/advanced_settings.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/**/grok_debugger.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group1/helpers.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group1/home.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group1/index_lifecycle_management.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group1/ingest_node_pipelines.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group1/management.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group1/painless_lab.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group1/search_profiler.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group3/cross_cluster_replication.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group3/license_management.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group3/remote_clusters.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group3/rollup_jobs.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group3/upgrade_assistant.ts @elastic/kibana-management +/x-pack/test/accessibility/apps/group3/watcher.ts @elastic/kibana-management #CC# /x-pack/plugins/cross_cluster_replication/ @elastic/kibana-management # Security Solution +/x-pack/test/accessibility/apps/group3/security_solution.ts @elastic/security-solution /x-pack/test_serverless/functional/test_suites/security/config.ts @elastic/security-solution @elastic/appex-qa /x-pack/test_serverless/functional/test_suites/security/config.feature_flags.ts @elastic/security-solution /x-pack/test_serverless/api_integration/test_suites/observability/config.feature_flags.ts @elastic/security-solution @@ -1890,6 +1921,7 @@ x-pack/plugins/security_solution/server/lib/security_integrations @elastic/secur # Ent. Search design /x-pack/plugins/enterprise_search/**/*.scss @elastic/search-design +/x-pack/test/accessibility/apps/group3/enterprise_search.ts @elastic/search-kibana # Security design /x-pack/plugins/endpoint/**/*.scss @elastic/security-design @@ -1917,6 +1949,8 @@ x-pack/plugins/observability_solution/observability_shared/public/components/pro # Shared UX /x-pack/test/api_integration/apis/content_management @elastic/appex-sharedux +/x-pack/test/accessibility/apps/group3/tags.ts @elastic/appex-sharedux +/x-pack/test/accessibility/apps/group3/snapshot_and_restore.ts @elastic/appex-sharedux /x-pack/test_serverless/functional/test_suites/common/spaces/spaces_selection.ts @elastic/appex-sharedux /x-pack/test_serverless/functional/test_suites/common/spaces/index.ts @elastic/appex-sharedux packages/react @elastic/appex-sharedux From 5e40320d9fe2d2c0b676071edf011c5831d43662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Tue, 22 Oct 2024 16:43:29 +0100 Subject: [PATCH 015/146] [Synthtrace][Inventory] K8s entities support (#197077) Part of https://github.com/elastic/kibana/issues/196155 New Synthtrace scenario created: [k8s_entities.ts](https://github.com/elastic/kibana/pull/197077/files#diff-33a935a5fb8848d743e40d89b018ed8ac82ae992c0778cd6cea072d091aa0647) ``` node scripts/synthtrace k8s_entities.ts --clean --live ``` Cluster sample data: ``` { "_index": ".entities.v1.latest.builtin_kubernetes_cluster_ecss_from_ecs_data", "_id": "2060900000000000", "_score": 1, "_source": { "entity": { "type": "kubernetes_cluster_ecs", "id": "2060900000000000", "definitionId": "builtin_kubernetes_cluster_ecs", "displayName": "cluster_foo", "lastSeenTimestamp": "2024-10-21T16:15:17.570Z" }, "orchestrator": { "cluster": { "name": "cluster_foo" } }, "event": { "ingested": "2024-10-21T16:15:17.570Z" } } }, { "_index": ".entities.v1.latest.builtin_kubernetes_cluster_semconvs_from_ecs_data", "_id": "2060900000000000", "_score": 1, "_source": { "entity": { "type": "kubernetes_cluster_semconv", "id": "2060900000000000", "definitionId": "builtin_kubernetes_cluster_semconv", "displayName": "cluster_foo", "lastSeenTimestamp": "2024-10-21T16:15:17.570Z" }, "k8s": { "cluster": { "uid": "cluster_foo" } }, "event": { "ingested": "2024-10-21T16:15:17.570Z" } } }, ``` --- .../src/lib/entities/index.ts | 29 +++- .../lib/entities/kubernetes/cluster_entity.ts | 39 +++++ .../entities/kubernetes/container_entity.ts | 39 +++++ .../entities/kubernetes/cron_job_entity.ts | 47 ++++++ .../entities/kubernetes/daemon_set_entity.ts | 47 ++++++ .../entities/kubernetes/deployment_entity.ts | 47 ++++++ .../src/lib/entities/kubernetes/index.ts | 76 +++++++++ .../lib/entities/kubernetes/job_set_entity.ts | 47 ++++++ .../lib/entities/kubernetes/node_entity.ts | 46 ++++++ .../src/lib/entities/kubernetes/pod_entity.ts | 47 ++++++ .../lib/entities/kubernetes/replica_set.ts | 47 ++++++ .../lib/entities/kubernetes/stateful_set.ts | 47 ++++++ .../entities/entities_synthtrace_es_client.ts | 3 +- .../src/scenarios/k8s_entities.ts | 155 ++++++++++++++++++ 14 files changed, 714 insertions(+), 2 deletions(-) create mode 100644 packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/cluster_entity.ts create mode 100644 packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/container_entity.ts create mode 100644 packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/cron_job_entity.ts create mode 100644 packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/daemon_set_entity.ts create mode 100644 packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/deployment_entity.ts create mode 100644 packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/index.ts create mode 100644 packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/job_set_entity.ts create mode 100644 packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/node_entity.ts create mode 100644 packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/pod_entity.ts create mode 100644 packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/replica_set.ts create mode 100644 packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/stateful_set.ts create mode 100644 packages/kbn-apm-synthtrace/src/scenarios/k8s_entities.ts diff --git a/packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts b/packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts index 10cf982ff41ee..4242476735a11 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts @@ -11,8 +11,19 @@ import { Fields } from '../entity'; import { serviceEntity } from './service_entity'; import { hostEntity } from './host_entity'; import { containerEntity } from './container_entity'; +import { k8sClusterJobEntity } from './kubernetes/cluster_entity'; +import { k8sCronJobEntity } from './kubernetes/cron_job_entity'; +import { k8sDaemonSetEntity } from './kubernetes/daemon_set_entity'; +import { k8sDeploymentEntity } from './kubernetes/deployment_entity'; +import { k8sJobSetEntity } from './kubernetes/job_set_entity'; +import { k8sNodeEntity } from './kubernetes/node_entity'; +import { k8sPodEntity } from './kubernetes/pod_entity'; +import { k8sReplicaSetEntity } from './kubernetes/replica_set'; +import { k8sStatefulSetEntity } from './kubernetes/stateful_set'; +import { k8sContainerEntity } from './kubernetes/container_entity'; export type EntityDataStreamType = 'metrics' | 'logs' | 'traces'; +export type Schema = 'ecs' | 'semconv'; export type EntityFields = Fields & Partial<{ @@ -32,4 +43,20 @@ export type EntityFields = Fields & [key: string]: any; }>; -export const entities = { serviceEntity, hostEntity, containerEntity }; +export const entities = { + serviceEntity, + hostEntity, + containerEntity, + k8s: { + k8sClusterJobEntity, + k8sCronJobEntity, + k8sDaemonSetEntity, + k8sDeploymentEntity, + k8sJobSetEntity, + k8sNodeEntity, + k8sPodEntity, + k8sReplicaSetEntity, + k8sStatefulSetEntity, + k8sContainerEntity, + }, +}; diff --git a/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/cluster_entity.ts b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/cluster_entity.ts new file mode 100644 index 0000000000000..9fa4c81d86ffb --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/cluster_entity.ts @@ -0,0 +1,39 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Schema } from '..'; +import { K8sEntity } from '.'; + +export function k8sClusterJobEntity({ + schema, + name, + entityId, + ...others +}: { + schema: Schema; + name: string; + entityId: string; + [key: string]: any; +}) { + if (schema === 'ecs') { + return new K8sEntity(schema, { + 'entity.type': 'cluster', + 'orchestrator.cluster.name': name, + 'entity.id': entityId, + ...others, + }); + } + + return new K8sEntity(schema, { + 'entity.type': 'cluster', + 'k8s.cluster.uid': name, + 'entity.id': entityId, + ...others, + }); +} diff --git a/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/container_entity.ts b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/container_entity.ts new file mode 100644 index 0000000000000..b05d412b0dd5c --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/container_entity.ts @@ -0,0 +1,39 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Schema } from '..'; +import { K8sEntity } from '.'; + +export function k8sContainerEntity({ + schema, + id, + entityId, + ...others +}: { + schema: Schema; + id: string; + entityId: string; + [key: string]: any; +}) { + if (schema === 'ecs') { + return new K8sEntity(schema, { + 'entity.type': 'container', + 'kubernetes.container.id': id, + 'entity.id': entityId, + ...others, + }); + } + + return new K8sEntity(schema, { + 'entity.type': 'container', + 'container.id': id, + 'entity.id': entityId, + ...others, + }); +} diff --git a/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/cron_job_entity.ts b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/cron_job_entity.ts new file mode 100644 index 0000000000000..8590378e699fb --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/cron_job_entity.ts @@ -0,0 +1,47 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Schema } from '..'; +import { K8sEntity } from '.'; + +export function k8sCronJobEntity({ + schema, + name, + uid, + clusterName, + entityId, + ...others +}: { + schema: Schema; + name: string; + uid?: string; + clusterName?: string; + entityId: string; + [key: string]: any; +}) { + if (schema === 'ecs') { + return new K8sEntity(schema, { + 'entity.type': 'cron_job', + 'kubernetes.cronjob.name': name, + 'kubernetes.cronjob.uid': uid, + 'kubernetes.namespace': clusterName, + 'entity.id': entityId, + ...others, + }); + } + + return new K8sEntity(schema, { + 'entity.type': 'cron_job', + 'k8s.cronjob.name': name, + 'k8s.cronjob.uid': uid, + 'k8s.cluster.name': clusterName, + 'entity.id': entityId, + ...others, + }); +} diff --git a/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/daemon_set_entity.ts b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/daemon_set_entity.ts new file mode 100644 index 0000000000000..7e20b1c6d506f --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/daemon_set_entity.ts @@ -0,0 +1,47 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Schema } from '..'; +import { K8sEntity } from '.'; + +export function k8sDaemonSetEntity({ + schema, + name, + uid, + clusterName, + entityId, + ...others +}: { + schema: Schema; + name: string; + uid?: string; + clusterName?: string; + entityId: string; + [key: string]: any; +}) { + if (schema === 'ecs') { + return new K8sEntity(schema, { + 'entity.type': 'daemon_set', + 'kubernetes.daemonset.name': name, + 'kubernetes.daemonset.uid': uid, + 'kubernetes.namespace': clusterName, + 'entity.id': entityId, + ...others, + }); + } + + return new K8sEntity(schema, { + 'entity.type': 'daemon_set', + 'k8s.daemonset.name': name, + 'k8s.daemonset.uid': uid, + 'k8s.cluster.name': clusterName, + 'entity.id': entityId, + ...others, + }); +} diff --git a/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/deployment_entity.ts b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/deployment_entity.ts new file mode 100644 index 0000000000000..7eabdd0827325 --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/deployment_entity.ts @@ -0,0 +1,47 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Schema } from '..'; +import { K8sEntity } from '.'; + +export function k8sDeploymentEntity({ + schema, + name, + uid, + clusterName, + entityId, + ...others +}: { + schema: Schema; + name: string; + uid?: string; + clusterName?: string; + entityId: string; + [key: string]: any; +}) { + if (schema === 'ecs') { + return new K8sEntity(schema, { + 'entity.type': 'deployment', + 'kubernetes.deployment.name': name, + 'kubernetes.deployment.uid': uid, + 'kubernetes.namespace': clusterName, + 'entity.id': entityId, + ...others, + }); + } + + return new K8sEntity(schema, { + 'entity.type': 'deployment', + 'k8s.deployment.name': name, + 'k8s.deployment.uid': uid, + 'k8s.cluster.name': clusterName, + 'entity.id': entityId, + ...others, + }); +} diff --git a/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/index.ts b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/index.ts new file mode 100644 index 0000000000000..36d7f8caf9601 --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/index.ts @@ -0,0 +1,76 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { EntityFields, Schema } from '..'; +import { Serializable } from '../../serializable'; + +const identityFieldsMap: Record> = { + ecs: { + pod: ['kubernetes.pod.name'], + cluster: ['orchestrator.cluster.name'], + cron_job: ['kubernetes.cronjob.name'], + daemon_set: ['kubernetes.daemonset.name'], + deployment: ['kubernetes.deployment.name'], + job: ['kubernetes.job.name'], + node: ['kubernetes.node.name'], + replica_set: ['kubernetes.replicaset.name'], + stateful_set: ['kubernetes.statefulset.name'], + container: ['kubernetes.container.id'], + }, + semconv: { + pod: ['k8s.pod.name'], + cluster: ['k8s.cluster.uid'], + cron_job: ['k8s.cronjob.name'], + daemon_set: ['k8s.daemonset.name'], + deployment: ['k8s.deployment.name'], + job: ['k8s.job.name'], + node: ['k8s.node.uid'], + replica_set: ['k8s.replicaset.name'], + stateful_set: ['k8s.statefulset.name'], + container: ['container.id'], + }, +}; + +export class K8sEntity extends Serializable { + constructor(schema: Schema, fields: EntityFields) { + const entityType = fields['entity.type']; + if (entityType === undefined) { + throw new Error(`Entity type not defined: ${entityType}`); + } + + const entityTypeWithSchema = `kubernetes_${entityType}_${schema}`; + const identityFields = identityFieldsMap[schema][entityType]; + if (identityFields === undefined || identityFields.length === 0) { + throw new Error( + `Identity fields not defined for schema: ${schema} and entity type: ${entityType}` + ); + } + + super({ + ...fields, + 'entity.type': entityTypeWithSchema, + 'entity.definitionId': `builtin_${entityTypeWithSchema}`, + 'entity.identityFields': identityFields, + 'entity.displayName': getDisplayName({ identityFields, fields }), + }); + } +} + +function getDisplayName({ + identityFields, + fields, +}: { + identityFields: string[]; + fields: EntityFields; +}) { + return identityFields + .map((field) => fields[field]) + .filter((_) => _) + .join(':'); +} diff --git a/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/job_set_entity.ts b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/job_set_entity.ts new file mode 100644 index 0000000000000..e0383563c7266 --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/job_set_entity.ts @@ -0,0 +1,47 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Schema } from '..'; +import { K8sEntity } from '.'; + +export function k8sJobSetEntity({ + schema, + name, + uid, + clusterName, + entityId, + ...others +}: { + schema: Schema; + name: string; + uid?: string; + clusterName?: string; + entityId: string; + [key: string]: any; +}) { + if (schema === 'ecs') { + return new K8sEntity(schema, { + 'entity.type': 'job', + 'kubernetes.job.name': name, + 'kubernetes.job.uid': uid, + 'kubernetes.namespace': clusterName, + 'entity.id': entityId, + ...others, + }); + } + + return new K8sEntity(schema, { + 'entity.type': 'job', + 'k8s.job.name': name, + 'k8s.job.uid': uid, + 'k8s.cluster.name': clusterName, + 'entity.id': entityId, + ...others, + }); +} diff --git a/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/node_entity.ts b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/node_entity.ts new file mode 100644 index 0000000000000..283df5250d41d --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/node_entity.ts @@ -0,0 +1,46 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Schema } from '..'; +import { K8sEntity } from '.'; + +export function k8sNodeEntity({ + schema, + name, + uid, + clusterName, + entityId, + ...others +}: { + schema: Schema; + name: string; + uid?: string; + clusterName?: string; + entityId: string; + [key: string]: any; +}) { + if (schema === 'ecs') { + return new K8sEntity(schema, { + 'entity.type': 'node', + 'kubernetes.node.name': name, + 'kubernetes.node.uid': uid, + 'kubernetes.namespace': clusterName, + 'entity.id': entityId, + ...others, + }); + } + + return new K8sEntity(schema, { + 'entity.type': 'node', + 'k8s.node.uid': uid, + 'k8s.cluster.name': clusterName, + 'entity.id': entityId, + ...others, + }); +} diff --git a/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/pod_entity.ts b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/pod_entity.ts new file mode 100644 index 0000000000000..1b71c4e39a4fc --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/pod_entity.ts @@ -0,0 +1,47 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Schema } from '..'; +import { K8sEntity } from '.'; + +export function k8sPodEntity({ + schema, + name, + uid, + clusterName, + entityId, + ...others +}: { + schema: Schema; + name: string; + uid?: string; + clusterName?: string; + entityId: string; + [key: string]: any; +}) { + if (schema === 'ecs') { + return new K8sEntity(schema, { + 'entity.type': 'pod', + 'kubernetes.pod.name': name, + 'kubernetes.pod.uid': uid, + 'kubernetes.namespace': clusterName, + 'entity.id': entityId, + ...others, + }); + } + + return new K8sEntity(schema, { + 'entity.type': 'pod', + 'k8s.pod.name': name, + 'k8s.pod.uid': uid, + 'k8s.cluster.name': clusterName, + 'entity.id': entityId, + ...others, + }); +} diff --git a/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/replica_set.ts b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/replica_set.ts new file mode 100644 index 0000000000000..fcf20c0530c30 --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/replica_set.ts @@ -0,0 +1,47 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Schema } from '..'; +import { K8sEntity } from '.'; + +export function k8sReplicaSetEntity({ + schema, + name, + uid, + clusterName, + entityId, + ...others +}: { + schema: Schema; + name: string; + uid?: string; + clusterName?: string; + entityId: string; + [key: string]: any; +}) { + if (schema === 'ecs') { + return new K8sEntity(schema, { + 'entity.type': 'replica_set', + 'kubernetes.replicaset.name': name, + 'kubernetes.replicaset.uid': uid, + 'kubernetes.namespace': clusterName, + 'entity.id': entityId, + ...others, + }); + } + + return new K8sEntity(schema, { + 'entity.type': 'replica_set', + 'k8s.replicaset.name': name, + 'k8s.replicaset.uid': uid, + 'k8s.cluster.name': clusterName, + 'entity.id': entityId, + ...others, + }); +} diff --git a/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/stateful_set.ts b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/stateful_set.ts new file mode 100644 index 0000000000000..58c603704ebc0 --- /dev/null +++ b/packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/stateful_set.ts @@ -0,0 +1,47 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { Schema } from '..'; +import { K8sEntity } from '.'; + +export function k8sStatefulSetEntity({ + schema, + name, + uid, + clusterName, + entityId, + ...others +}: { + schema: Schema; + name: string; + uid?: string; + clusterName?: string; + entityId: string; + [key: string]: any; +}) { + if (schema === 'ecs') { + return new K8sEntity(schema, { + 'entity.type': 'stateful_set', + 'kubernetes.statefulset.name': name, + 'kubernetes.statefulset.uid': uid, + 'kubernetes.namespace': clusterName, + 'entity.id': entityId, + ...others, + }); + } + + return new K8sEntity(schema, { + 'entity.type': 'stateful_set', + 'k8s.statefulset.name': name, + 'k8s.statefulset.uid': uid, + 'k8s.cluster.name': clusterName, + 'entity.id': entityId, + ...others, + }); +} diff --git a/packages/kbn-apm-synthtrace/src/lib/entities/entities_synthtrace_es_client.ts b/packages/kbn-apm-synthtrace/src/lib/entities/entities_synthtrace_es_client.ts index 684e3efc0f372..65bf290eae32f 100644 --- a/packages/kbn-apm-synthtrace/src/lib/entities/entities_synthtrace_es_client.ts +++ b/packages/kbn-apm-synthtrace/src/lib/entities/entities_synthtrace_es_client.ts @@ -82,7 +82,8 @@ function getRoutingTransform() { const entityIndexName = `${entityType}s`; document._action = { index: { - _index: `.entities.v1.latest.builtin_${entityIndexName}_from_ecs_data`, + _index: + `.entities.v1.latest.builtin_${entityIndexName}_from_ecs_data`.toLocaleLowerCase(), _id: document['entity.id'], }, }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/k8s_entities.ts b/packages/kbn-apm-synthtrace/src/scenarios/k8s_entities.ts new file mode 100644 index 0000000000000..7d94cc3180a7e --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/k8s_entities.ts @@ -0,0 +1,155 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { EntityFields, entities, generateShortId } from '@kbn/apm-synthtrace-client'; +import { Schema } from '@kbn/apm-synthtrace-client/src/lib/entities'; +import { Scenario } from '../cli/scenario'; +import { withClient } from '../lib/utils/with_client'; + +const CLUSTER_NAME = 'cluster_foo'; + +const CLUSTER_ENTITY_ID = generateShortId(); +const POD_ENTITY_ID = generateShortId(); +const POD_UID = generateShortId(); +const REPLICA_SET_ENTITY_ID = generateShortId(); +const REPLICA_SET_UID = generateShortId(); +const DEPLOYMENT_ENTITY_ID = generateShortId(); +const DEPLOYMENT_UID = generateShortId(); +const STATEFUL_SET_ENTITY_ID = generateShortId(); +const STATEFUL_SET_UID = generateShortId(); +const DAEMON_SET_ENTITY_ID = generateShortId(); +const DAEMON_SET_UID = generateShortId(); +const JOB_SET_ENTITY_ID = generateShortId(); +const JOB_SET_UID = generateShortId(); +const CRON_JOB_ENTITY_ID = generateShortId(); +const CRON_JOB_UID = generateShortId(); +const NODE_ENTITY_ID = generateShortId(); +const NODE_UID = generateShortId(); + +const scenario: Scenario> = async (runOptions) => { + const { logger } = runOptions; + + return { + bootstrap: async ({ entitiesKibanaClient }) => { + await entitiesKibanaClient.installEntityIndexPatterns(); + }, + generate: ({ range, clients: { entitiesEsClient } }) => { + const getK8sEntitiesEvents = (schema: Schema) => + range + .interval('1m') + .rate(1) + .generator((timestamp) => { + return [ + entities.k8s + .k8sClusterJobEntity({ + schema, + name: CLUSTER_NAME, + entityId: CLUSTER_ENTITY_ID, + }) + .timestamp(timestamp), + entities.k8s + .k8sPodEntity({ + schema, + clusterName: CLUSTER_NAME, + name: 'pod_foo', + uid: POD_UID, + entityId: POD_ENTITY_ID, + }) + .timestamp(timestamp), + entities.k8s + .k8sReplicaSetEntity({ + clusterName: CLUSTER_NAME, + name: 'replica_set_foo', + schema, + uid: REPLICA_SET_UID, + entityId: REPLICA_SET_ENTITY_ID, + }) + .timestamp(timestamp), + entities.k8s + .k8sDeploymentEntity({ + clusterName: CLUSTER_NAME, + name: 'deployment_foo', + schema, + uid: DEPLOYMENT_UID, + entityId: DEPLOYMENT_ENTITY_ID, + }) + .timestamp(timestamp), + entities.k8s + .k8sStatefulSetEntity({ + clusterName: CLUSTER_NAME, + name: 'stateful_set_foo', + schema, + uid: STATEFUL_SET_UID, + entityId: STATEFUL_SET_ENTITY_ID, + }) + .timestamp(timestamp), + entities.k8s + .k8sDaemonSetEntity({ + clusterName: CLUSTER_NAME, + name: 'daemon_set_foo', + schema, + uid: DAEMON_SET_UID, + entityId: DAEMON_SET_ENTITY_ID, + }) + .timestamp(timestamp), + entities.k8s + .k8sJobSetEntity({ + clusterName: CLUSTER_NAME, + name: 'job_set_foo', + schema, + uid: JOB_SET_UID, + entityId: JOB_SET_ENTITY_ID, + }) + .timestamp(timestamp), + entities.k8s + .k8sCronJobEntity({ + clusterName: CLUSTER_NAME, + name: 'cron_job_foo', + schema, + uid: CRON_JOB_UID, + entityId: CRON_JOB_ENTITY_ID, + }) + .timestamp(timestamp), + entities.k8s + .k8sNodeEntity({ + clusterName: CLUSTER_NAME, + name: 'node_job_foo', + schema, + uid: NODE_UID, + entityId: NODE_ENTITY_ID, + }) + .timestamp(timestamp), + entities.k8s + .k8sContainerEntity({ + id: '123', + schema, + entityId: NODE_ENTITY_ID, + }) + .timestamp(timestamp), + ]; + }); + + const ecsEntities = getK8sEntitiesEvents('ecs'); + const otelEntities = getK8sEntitiesEvents('semconv'); + + return [ + withClient( + entitiesEsClient, + logger.perf('generating_entities_ecs_events', () => ecsEntities) + ), + withClient( + entitiesEsClient, + logger.perf('generating_entities_otel_events', () => otelEntities) + ), + ]; + }, + }; +}; + +export default scenario; From b562288289f326084511c68759db84e20cee2791 Mon Sep 17 00:00:00 2001 From: Abhishek Bhatia <117628830+abhishekbhatia1710@users.noreply.github.com> Date: Tue, 22 Oct 2024 21:15:52 +0530 Subject: [PATCH 016/146] Kibana space scoped component-template for risk engine (#197170) ## Summary The component template used when enabling the risk engine is not Kibana space-agnostic, as the component template in every space is named `.risk-score-mappings`. This caused issues during the cleanup process, where it attempted to delete the same component template from each space but failed because other spaces' index templates were still referencing it. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels) - [ ] This will appear in the **Release Notes** and follow the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../risk_score/configurations.ts | 3 + .../risk_score/risk_score_data_client.test.ts | 676 +++++++++--------- .../risk_score/risk_score_data_client.ts | 45 +- .../init_and_status_apis.ts | 247 ++++++- 4 files changed, 641 insertions(+), 330 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/configurations.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/configurations.ts index 6dbf68c699fd5..610ada87f5159 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/configurations.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/configurations.ts @@ -129,6 +129,9 @@ export const riskScoreFieldMap: FieldMap = { } as const; export const mappingComponentName = '.risk-score-mappings'; +export const nameSpaceAwareMappingsComponentName = (namespace: string): string => { + return `${mappingComponentName}-${namespace}`; +}; export const totalFieldsLimit = 1000; export const getIndexPatternDataStream = (namespace: string): IIndexPatternString => ({ diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.test.ts index 2ddd04a766944..cec3330af52e6 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.test.ts @@ -40,6 +40,7 @@ jest.spyOn(transforms, 'scheduleTransformNow').mockResolvedValue(Promise.resolve describe('RiskScoreDataClient', () => { let riskScoreDataClient: RiskScoreDataClient; + let riskScoreDataClientWithNameSpace: RiskScoreDataClient; let mockSavedObjectClient: ReturnType; let logger: ReturnType; const esClient = elasticsearchServiceMock.createScopedClusterClient().asCurrentUser; @@ -56,6 +57,8 @@ describe('RiskScoreDataClient', () => { namespace: 'default', }; riskScoreDataClient = new RiskScoreDataClient(options); + const optionsWithNamespace = { ...options, namespace: 'space-1' }; + riskScoreDataClientWithNameSpace = new RiskScoreDataClient(optionsWithNamespace); }); afterEach(() => { @@ -80,369 +83,396 @@ describe('RiskScoreDataClient', () => { }); describe('init success', () => { - it('should initialize risk engine resources', async () => { - await riskScoreDataClient.init(); + it('should initialize risk engine resources in the appropriate space', async () => { + const assertComponentTemplate = (namespace: string) => { + expect(createOrUpdateComponentTemplate).toHaveBeenCalledWith( + expect.objectContaining({ + logger, + esClient, + template: expect.objectContaining({ + name: `.risk-score-mappings-${namespace}`, + _meta: { + managed: true, + }, + }), + totalFieldsLimit: 1000, + }) + ); + }; - expect(createOrUpdateComponentTemplate).toHaveBeenCalledWith( - expect.objectContaining({ + const assertIndexTemplate = (namespace: string) => { + expect(createOrUpdateIndexTemplate).toHaveBeenCalledWith({ logger, esClient, - template: expect.objectContaining({ - name: '.risk-score-mappings', - _meta: { - managed: true, - }, - }), - totalFieldsLimit: 1000, - }) - ); - expect((createOrUpdateComponentTemplate as jest.Mock).mock.lastCall[0].template.template) - .toMatchInlineSnapshot(` - Object { - "mappings": Object { - "dynamic": "strict", - "properties": Object { - "@timestamp": Object { - "ignore_malformed": false, - "type": "date", + template: { + name: `.risk-score.risk-score-${namespace}-index-template`, + body: { + data_stream: { hidden: true }, + index_patterns: [`risk-score.risk-score-${namespace}`], + composed_of: [`.risk-score-mappings-${namespace}`], + template: { + lifecycle: {}, + settings: { + 'index.mapping.total_fields.limit': totalFieldsLimit, + }, + mappings: { + dynamic: false, + _meta: { + kibana: { + version: '8.9.0', + }, + managed: true, + namespace, }, - "host": Object { - "properties": Object { - "name": Object { - "type": "keyword", - }, - "risk": Object { - "properties": Object { - "calculated_level": Object { - "type": "keyword", - }, - "calculated_score": Object { - "type": "float", - }, - "calculated_score_norm": Object { - "type": "float", - }, - "category_1_count": Object { - "type": "long", - }, - "category_1_score": Object { - "type": "float", - }, - "id_field": Object { - "type": "keyword", - }, - "id_value": Object { - "type": "keyword", - }, - "inputs": Object { - "properties": Object { - "category": Object { - "type": "keyword", - }, - "description": Object { - "type": "keyword", - }, - "id": Object { - "type": "keyword", - }, - "index": Object { - "type": "keyword", - }, - "risk_score": Object { - "type": "float", - }, - "timestamp": Object { - "type": "date", - }, + }, + }, + _meta: { + kibana: { + version: '8.9.0', + }, + managed: true, + namespace, + }, + }, + }, + }); + }; + + const assertDataStream = (namespace: string) => { + expect(createDataStream).toHaveBeenCalledWith({ + logger, + esClient, + totalFieldsLimit, + indexPatterns: { + template: `.risk-score.risk-score-${namespace}-index-template`, + alias: `risk-score.risk-score-${namespace}`, + }, + }); + }; + + const assertIndex = (namespace: string) => { + expect(createOrUpdateIndex).toHaveBeenCalledWith({ + logger, + esClient, + options: { + index: `risk-score.risk-score-latest-${namespace}`, + mappings: { + dynamic: false, + properties: { + '@timestamp': { + ignore_malformed: false, + type: 'date', + }, + host: { + properties: { + name: { + type: 'keyword', + }, + risk: { + properties: { + calculated_level: { + type: 'keyword', + }, + calculated_score: { + type: 'float', + }, + calculated_score_norm: { + type: 'float', + }, + category_1_count: { + type: 'long', + }, + category_1_score: { + type: 'float', + }, + id_field: { + type: 'keyword', + }, + id_value: { + type: 'keyword', + }, + inputs: { + properties: { + category: { + type: 'keyword', + }, + description: { + type: 'keyword', + }, + id: { + type: 'keyword', + }, + index: { + type: 'keyword', + }, + risk_score: { + type: 'float', + }, + timestamp: { + type: 'date', }, - "type": "object", - }, - "notes": Object { - "type": "keyword", }, + type: 'object', + }, + notes: { + type: 'keyword', }, - "type": "object", }, + type: 'object', }, }, - "user": Object { - "properties": Object { - "name": Object { - "type": "keyword", - }, - "risk": Object { - "properties": Object { - "calculated_level": Object { - "type": "keyword", - }, - "calculated_score": Object { - "type": "float", - }, - "calculated_score_norm": Object { - "type": "float", - }, - "category_1_count": Object { - "type": "long", - }, - "category_1_score": Object { - "type": "float", - }, - "id_field": Object { - "type": "keyword", - }, - "id_value": Object { - "type": "keyword", - }, - "inputs": Object { - "properties": Object { - "category": Object { - "type": "keyword", - }, - "description": Object { - "type": "keyword", - }, - "id": Object { - "type": "keyword", - }, - "index": Object { - "type": "keyword", - }, - "risk_score": Object { - "type": "float", - }, - "timestamp": Object { - "type": "date", - }, + }, + user: { + properties: { + name: { + type: 'keyword', + }, + risk: { + properties: { + calculated_level: { + type: 'keyword', + }, + calculated_score: { + type: 'float', + }, + calculated_score_norm: { + type: 'float', + }, + category_1_count: { + type: 'long', + }, + category_1_score: { + type: 'float', + }, + id_field: { + type: 'keyword', + }, + id_value: { + type: 'keyword', + }, + inputs: { + properties: { + category: { + type: 'keyword', + }, + description: { + type: 'keyword', + }, + id: { + type: 'keyword', + }, + index: { + type: 'keyword', + }, + risk_score: { + type: 'float', + }, + timestamp: { + type: 'date', }, - "type": "object", - }, - "notes": Object { - "type": "keyword", }, + type: 'object', + }, + notes: { + type: 'keyword', }, - "type": "object", }, + type: 'object', }, }, }, }, - "settings": Object {}, - } - `); + }, + }, + }); + }; - expect(createOrUpdateIndexTemplate).toHaveBeenCalledWith({ - logger, - esClient, - template: { - name: '.risk-score.risk-score-default-index-template', - body: { - data_stream: { hidden: true }, - index_patterns: ['risk-score.risk-score-default'], - composed_of: ['.risk-score-mappings'], - template: { - lifecycle: {}, - settings: { - 'index.mapping.total_fields.limit': totalFieldsLimit, - }, - mappings: { - dynamic: false, - _meta: { - kibana: { - version: '8.9.0', - }, - managed: true, - namespace: 'default', - }, + const assertTransform = (namespace: string) => { + expect(transforms.createTransform).toHaveBeenCalledWith({ + logger, + esClient, + transform: { + dest: { + index: `risk-score.risk-score-latest-${namespace}`, + }, + frequency: '1h', + latest: { + sort: '@timestamp', + unique_key: ['host.name', 'user.name'], + }, + source: { + index: [`risk-score.risk-score-${namespace}`], + }, + sync: { + time: { + delay: '0s', + field: '@timestamp', }, }, + transform_id: `risk_score_latest_transform_${namespace}`, + settings: { + unattended: true, + }, _meta: { - kibana: { - version: '8.9.0', - }, + version: 2, managed: true, - namespace: 'default', + managed_by: 'security-entity-analytics', }, }, - }, - }); + }); + }; - expect(createDataStream).toHaveBeenCalledWith({ - logger, - esClient, - totalFieldsLimit, - indexPatterns: { - template: `.risk-score.risk-score-default-index-template`, - alias: `risk-score.risk-score-default`, - }, - }); + // Default namespace + esClient.cluster.existsComponentTemplate.mockResolvedValue(false); + await riskScoreDataClient.init(); + assertComponentTemplate('default'); + assertIndexTemplate('default'); + assertDataStream('default'); + assertIndex('default'); + assertTransform('default'); - expect(createOrUpdateIndex).toHaveBeenCalledWith({ - logger, - esClient, - options: { - index: `risk-score.risk-score-latest-default`, - mappings: { - dynamic: false, - properties: { - '@timestamp': { - ignore_malformed: false, - type: 'date', - }, - host: { - properties: { - name: { - type: 'keyword', - }, - risk: { - properties: { - calculated_level: { - type: 'keyword', - }, - calculated_score: { - type: 'float', - }, - calculated_score_norm: { - type: 'float', - }, - category_1_count: { - type: 'long', - }, - category_1_score: { - type: 'float', - }, - id_field: { - type: 'keyword', - }, - id_value: { - type: 'keyword', - }, - inputs: { - properties: { - category: { - type: 'keyword', - }, - description: { - type: 'keyword', - }, - id: { - type: 'keyword', - }, - index: { - type: 'keyword', - }, - risk_score: { - type: 'float', - }, - timestamp: { - type: 'date', + // Space-1 namespace + esClient.cluster.existsComponentTemplate.mockResolvedValue(false); + await riskScoreDataClientWithNameSpace.init(); + assertComponentTemplate('space-1'); + assertIndexTemplate('space-1'); + assertDataStream('space-1'); + assertIndex('space-1'); + assertTransform('space-1'); + + expect((createOrUpdateComponentTemplate as jest.Mock).mock.lastCall[0].template.template) + .toMatchInlineSnapshot(` + Object { + "mappings": Object { + "dynamic": "strict", + "properties": Object { + "@timestamp": Object { + "ignore_malformed": false, + "type": "date", + }, + "host": Object { + "properties": Object { + "name": Object { + "type": "keyword", + }, + "risk": Object { + "properties": Object { + "calculated_level": Object { + "type": "keyword", + }, + "calculated_score": Object { + "type": "float", + }, + "calculated_score_norm": Object { + "type": "float", + }, + "category_1_count": Object { + "type": "long", + }, + "category_1_score": Object { + "type": "float", + }, + "id_field": Object { + "type": "keyword", + }, + "id_value": Object { + "type": "keyword", + }, + "inputs": Object { + "properties": Object { + "category": Object { + "type": "keyword", + }, + "description": Object { + "type": "keyword", + }, + "id": Object { + "type": "keyword", + }, + "index": Object { + "type": "keyword", + }, + "risk_score": Object { + "type": "float", + }, + "timestamp": Object { + "type": "date", + }, }, + "type": "object", + }, + "notes": Object { + "type": "keyword", }, - type: 'object', - }, - notes: { - type: 'keyword', }, + "type": "object", }, - type: 'object', }, }, - }, - user: { - properties: { - name: { - type: 'keyword', - }, - risk: { - properties: { - calculated_level: { - type: 'keyword', - }, - calculated_score: { - type: 'float', - }, - calculated_score_norm: { - type: 'float', - }, - category_1_count: { - type: 'long', - }, - category_1_score: { - type: 'float', - }, - id_field: { - type: 'keyword', - }, - id_value: { - type: 'keyword', - }, - inputs: { - properties: { - category: { - type: 'keyword', - }, - description: { - type: 'keyword', - }, - id: { - type: 'keyword', - }, - index: { - type: 'keyword', - }, - risk_score: { - type: 'float', - }, - timestamp: { - type: 'date', + "user": Object { + "properties": Object { + "name": Object { + "type": "keyword", + }, + "risk": Object { + "properties": Object { + "calculated_level": Object { + "type": "keyword", + }, + "calculated_score": Object { + "type": "float", + }, + "calculated_score_norm": Object { + "type": "float", + }, + "category_1_count": Object { + "type": "long", + }, + "category_1_score": Object { + "type": "float", + }, + "id_field": Object { + "type": "keyword", + }, + "id_value": Object { + "type": "keyword", + }, + "inputs": Object { + "properties": Object { + "category": Object { + "type": "keyword", + }, + "description": Object { + "type": "keyword", + }, + "id": Object { + "type": "keyword", + }, + "index": Object { + "type": "keyword", + }, + "risk_score": Object { + "type": "float", + }, + "timestamp": Object { + "type": "date", + }, }, + "type": "object", + }, + "notes": Object { + "type": "keyword", }, - type: 'object', - }, - notes: { - type: 'keyword', }, + "type": "object", }, - type: 'object', }, }, }, }, - }, - }, - }); - - expect(transforms.createTransform).toHaveBeenCalledWith({ - logger, - esClient, - transform: { - dest: { - index: 'risk-score.risk-score-latest-default', - }, - frequency: '1h', - latest: { - sort: '@timestamp', - unique_key: ['host.name', 'user.name'], - }, - source: { - index: ['risk-score.risk-score-default'], - }, - sync: { - time: { - delay: '0s', - field: '@timestamp', - }, - }, - transform_id: 'risk_score_latest_transform_default', - settings: { - unattended: true, - }, - _meta: { - version: 2, - managed: true, - managed_by: 'security-entity-analytics', - }, - }, - }); + "settings": Object {}, + } + `); }); }); @@ -479,7 +509,7 @@ describe('RiskScoreDataClient', () => { expect(esClient.transform.deleteTransform).toHaveBeenCalledTimes(1); expect(esClient.indices.deleteDataStream).toHaveBeenCalledTimes(1); expect(esClient.indices.deleteIndexTemplate).toHaveBeenCalledTimes(1); - expect(esClient.cluster.deleteComponentTemplate).toHaveBeenCalledTimes(1); + expect(esClient.cluster.deleteComponentTemplate).toHaveBeenCalledTimes(2); expect(errors).toEqual([]); }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts index 0b3c38f3602fd..2ae05e4c86227 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts @@ -22,6 +22,7 @@ import { getIndexPatternDataStream, getTransformOptions, mappingComponentName, + nameSpaceAwareMappingsComponentName, riskScoreFieldMap, totalFieldsLimit, } from './configurations'; @@ -114,12 +115,42 @@ export class RiskScoreDataClient { namespace, }; + // Check if there are any existing component templates with the namespace in the name + + const oldComponentTemplateExists = await esClient.cluster.existsComponentTemplate({ + name: mappingComponentName, + }); + // If present then copy the contents to a new component template with the namespace in the name + if (oldComponentTemplateExists) { + const oldComponentTemplateResponse = await esClient.cluster.getComponentTemplate( + { + name: mappingComponentName, + }, + { ignore: [404] } + ); + const oldComponentTemplate = oldComponentTemplateResponse?.component_templates[0]; + const newComponentTemplateName = nameSpaceAwareMappingsComponentName(namespace); + await esClient.cluster.putComponentTemplate({ + name: newComponentTemplateName, + body: oldComponentTemplate.component_template, + }); + } + + // Delete the component template without the namespace in the name + await esClient.cluster.deleteComponentTemplate( + { + name: mappingComponentName, + }, + { ignore: [404] } + ); + + // Update the new component template with the required data await Promise.all([ createOrUpdateComponentTemplate({ logger: this.options.logger, esClient, template: { - name: mappingComponentName, + name: nameSpaceAwareMappingsComponentName(namespace), _meta: { managed: true, }, @@ -132,6 +163,7 @@ export class RiskScoreDataClient { }), ]); + // Reference the new component template in the index template await createOrUpdateIndexTemplate({ logger: this.options.logger, esClient, @@ -140,7 +172,7 @@ export class RiskScoreDataClient { body: { data_stream: { hidden: true }, index_patterns: [indexPatterns.alias], - composed_of: [mappingComponentName], + composed_of: [nameSpaceAwareMappingsComponentName(namespace)], template: { lifecycle: {}, settings: { @@ -235,6 +267,15 @@ export class RiskScoreDataClient { ) .catch(addError); + await esClient.cluster + .deleteComponentTemplate( + { + name: nameSpaceAwareMappingsComponentName(namespace), + }, + { ignore: [404] } + ) + .catch(addError); + await esClient.cluster .deleteComponentTemplate( { diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts index dd1fe34cd050a..b793ec1cb1306 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts @@ -27,19 +27,30 @@ export default ({ getService }: FtrProviderContext) => { const es = getService('es'); const supertest = getService('supertest'); const kibanaServer = getService('kibanaServer'); + const spaces = getService('spaces'); + const customSpaceName = 'ea-customspace-it'; const riskEngineRoutes = riskEngineRouteHelpersFactory(supertest); + const riskEngineRoutesWithNamespace = riskEngineRouteHelpersFactory(supertest, customSpaceName); const log = getService('log'); - // Failing: See https://github.com/elastic/kibana/issues/196319 - describe.skip('@ess @serverless @serverlessQA init_and_status_apis', () => { + describe('@ess @serverless @serverlessQA init_and_status_apis', () => { before(async () => { + await spaces.create({ + id: customSpaceName, + name: customSpaceName, + description: 'Space for ${customSpaceName}', + disabledFeatures: [], + }); await riskEngineRoutes.cleanUp(); + await riskEngineRoutesWithNamespace.cleanUp(); }); afterEach(async () => { await riskEngineRoutes.cleanUp(); + await riskEngineRoutesWithNamespace.cleanUp(); await clearLegacyTransforms({ es, log }); await clearLegacyDashboards({ supertest, log }); + await spaces.delete(customSpaceName); }); describe('init api', () => { @@ -54,10 +65,21 @@ export default ({ getService }: FtrProviderContext) => { risk_engine_resources_installed: true, }, }); + + const customNamespaceResponse = await riskEngineRoutesWithNamespace.init(); + expect(customNamespaceResponse.body).to.eql({ + result: { + errors: [], + legacy_risk_engine_disabled: true, + risk_engine_configuration_created: true, + risk_engine_enabled: true, + risk_engine_resources_installed: true, + }, + }); }); - it('should install resources on init call', async () => { - const componentTemplateName = '.risk-score-mappings'; + it('should install resources on init call in the default namespace', async () => { + const componentTemplateName = '.risk-score-mappings-default'; const indexTemplateName = '.risk-score.risk-score-default-index-template'; const dataStreamName = 'risk-score.risk-score-default'; const latestIndexName = 'risk-score.risk-score-latest-default'; @@ -210,7 +232,7 @@ export default ({ getService }: FtrProviderContext) => { expect(indexTemplate.index_template.index_patterns).to.eql([ 'risk-score.risk-score-default', ]); - expect(indexTemplate.index_template.composed_of).to.eql(['.risk-score-mappings']); + expect(indexTemplate.index_template.composed_of).to.eql(['.risk-score-mappings-default']); expect(indexTemplate.index_template.template!.mappings?.dynamic).to.eql(false); expect(indexTemplate.index_template.template!.mappings?._meta?.managed).to.eql(true); expect(indexTemplate.index_template.template!.mappings?._meta?.namespace).to.eql('default'); @@ -267,6 +289,221 @@ export default ({ getService }: FtrProviderContext) => { expect(transformStats.transforms[0].state).to.eql('stopped'); }); + it('should install resources on init call in the custom namespace', async () => { + const componentTemplateName = `.risk-score-mappings-${customSpaceName}`; + const indexTemplateName = `.risk-score.risk-score-${customSpaceName}-index-template`; + const dataStreamName = `risk-score.risk-score-${customSpaceName}`; + const latestIndexName = `risk-score.risk-score-latest-${customSpaceName}`; + const transformId = `risk_score_latest_transform_${customSpaceName}`; + + await riskEngineRoutesWithNamespace.init(); + + const { component_templates: componentTemplates1 } = await es.cluster.getComponentTemplate({ + name: componentTemplateName, + }); + + expect(componentTemplates1.length).to.eql(1); + const componentTemplate = componentTemplates1[0]; + + expect(componentTemplate.name).to.eql(componentTemplateName); + expect(componentTemplate.component_template.template.mappings).to.eql({ + dynamic: 'strict', + properties: { + '@timestamp': { + ignore_malformed: false, + type: 'date', + }, + host: { + properties: { + name: { + type: 'keyword', + }, + risk: { + properties: { + calculated_level: { + type: 'keyword', + }, + calculated_score: { + type: 'float', + }, + calculated_score_norm: { + type: 'float', + }, + category_1_count: { + type: 'long', + }, + category_1_score: { + type: 'float', + }, + id_field: { + type: 'keyword', + }, + id_value: { + type: 'keyword', + }, + notes: { + type: 'keyword', + }, + inputs: { + properties: { + id: { + type: 'keyword', + }, + index: { + type: 'keyword', + }, + category: { + type: 'keyword', + }, + description: { + type: 'keyword', + }, + risk_score: { + type: 'float', + }, + timestamp: { + type: 'date', + }, + }, + type: 'object', + }, + }, + type: 'object', + }, + }, + }, + user: { + properties: { + name: { + type: 'keyword', + }, + risk: { + properties: { + calculated_level: { + type: 'keyword', + }, + calculated_score: { + type: 'float', + }, + calculated_score_norm: { + type: 'float', + }, + category_1_count: { + type: 'long', + }, + category_1_score: { + type: 'float', + }, + id_field: { + type: 'keyword', + }, + id_value: { + type: 'keyword', + }, + notes: { + type: 'keyword', + }, + inputs: { + properties: { + id: { + type: 'keyword', + }, + index: { + type: 'keyword', + }, + category: { + type: 'keyword', + }, + description: { + type: 'keyword', + }, + risk_score: { + type: 'float', + }, + timestamp: { + type: 'date', + }, + }, + type: 'object', + }, + }, + type: 'object', + }, + }, + }, + }, + }); + + const { index_templates: indexTemplates } = await es.indices.getIndexTemplate({ + name: indexTemplateName, + }); + expect(indexTemplates.length).to.eql(1); + const indexTemplate = indexTemplates[0]; + expect(indexTemplate.name).to.eql(indexTemplateName); + expect(indexTemplate.index_template.index_patterns).to.eql([ + `risk-score.risk-score-${customSpaceName}`, + ]); + expect(indexTemplate.index_template.composed_of).to.eql([ + `.risk-score-mappings-${customSpaceName}`, + ]); + expect(indexTemplate.index_template.template!.mappings?.dynamic).to.eql(false); + expect(indexTemplate.index_template.template!.mappings?._meta?.managed).to.eql(true); + expect(indexTemplate.index_template.template!.mappings?._meta?.namespace).to.eql( + customSpaceName + ); + expect(indexTemplate.index_template.template!.mappings?._meta?.kibana?.version).to.be.a( + 'string' + ); + + expect(indexTemplate.index_template.template!.settings).to.eql({ + index: { + mapping: { + total_fields: { + limit: '1000', + }, + }, + }, + }); + + expect(indexTemplate.index_template.template!.lifecycle).to.eql({ + enabled: true, + }); + + const dsResponse = await es.indices.get({ + index: dataStreamName, + }); + + const dataStream = Object.values(dsResponse).find( + (ds) => ds.data_stream === dataStreamName + ); + + expect(dataStream?.mappings?._meta?.managed).to.eql(true); + expect(dataStream?.mappings?._meta?.namespace).to.eql(customSpaceName); + expect(dataStream?.mappings?._meta?.kibana?.version).to.be.a('string'); + expect(dataStream?.mappings?.dynamic).to.eql('false'); + + expect(dataStream?.settings?.index?.mapping).to.eql({ + total_fields: { + limit: '1000', + }, + }); + + expect(dataStream?.settings?.index?.hidden).to.eql('true'); + expect(dataStream?.settings?.index?.number_of_shards).to.eql(1); + + const indexExist = await es.indices.exists({ + index: latestIndexName, + }); + + expect(indexExist).to.eql(true); + + const transformStats = await es.transform.getTransformStats({ + transform_id: transformId, + }); + + expect(transformStats.transforms[0].state).to.eql('stopped'); + }); + it('should create configuration saved object', async () => { await riskEngineRoutes.init(); const response = await kibanaServer.savedObjects.find({ From 2b270897a3f22ed5ca04ef173895cfa8660f9ea2 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Tue, 22 Oct 2024 16:52:43 +0100 Subject: [PATCH 017/146] [SecuritySolution][Onboarding] Send Telemetry when integration tabs or cards clicked (#196291) ## Summary https://github.com/elastic/kibana/issues/196145 To verify: 1. Add these lines to `kibana.dev.yml` ``` logging.browser.root.level: debug telemetry.optIn: true ``` 2. In the onboarding hub, expand the integration card. It should log `onboarding_tab_${tabId}` on tabs clicked. https://github.com/user-attachments/assets/bd30c9ed-7c99-4ca0-93e7-6d9bf0146e62 It should log `onboarding_card_${integrationId}` on integration cards clicked. https://github.com/user-attachments/assets/58750d88-7bbf-4b27-8e54-587f3f6f32c2 3. Manage integrations callout link clicked:: `onboarding_manage_integrations`; 4. Endpoint callout link clicked: `onboarding_endpoint_learn_more`; 5. Agentless callout link clicked: `onboarding_agentless_learn_more`; 6. Agent still required callout link clicked: `onboarding_agent_required`; ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../public/common/lib/telemetry/constants.ts | 2 + .../common/lib/__mocks__/telemetry.ts | 8 ++++ .../public/onboarding/common/lib/telemetry.ts | 12 ++++++ .../callouts/agent_required_callout.test.tsx | 10 +++++ .../callouts/agent_required_callout.tsx | 14 ++++-- .../agentless_available_callout.test.tsx | 16 +++++-- .../callouts/agentless_available_callout.tsx | 9 +++- .../callouts/endpoint_callout.test.tsx | 43 +++++++++++++++++++ .../callouts/endpoint_callout.tsx | 8 +++- .../callouts/manage_integrations_callout.tsx | 15 ++++++- .../cards/integrations/constants.ts | 6 +++ .../integration_card_grid_tabs.test.tsx | 29 +++++++++++++ .../integration_card_grid_tabs.tsx | 4 ++ .../use_integration_card_list.test.ts | 17 +++++++- .../integrations/use_integration_card_list.ts | 4 ++ 15 files changed, 185 insertions(+), 12 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/onboarding/common/lib/__mocks__/telemetry.ts create mode 100644 x-pack/plugins/security_solution/public/onboarding/common/lib/telemetry.ts create mode 100644 x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/endpoint_callout.test.tsx diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/constants.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/constants.ts index 5126d75178f5f..cb247891d79b3 100644 --- a/x-pack/plugins/security_solution/public/common/lib/telemetry/constants.ts +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/constants.ts @@ -35,6 +35,8 @@ export enum TELEMETRY_EVENT { DASHBOARD = 'navigate_to_dashboard', CREATE_DASHBOARD = 'create_dashboard', + ONBOARDING = 'onboarding', + // value list OPEN_VALUE_LIST_MODAL = 'open_value_list_modal', CREATE_VALUE_LIST_ITEM = 'create_value_list_item', diff --git a/x-pack/plugins/security_solution/public/onboarding/common/lib/__mocks__/telemetry.ts b/x-pack/plugins/security_solution/public/onboarding/common/lib/__mocks__/telemetry.ts new file mode 100644 index 0000000000000..5d1c3feb56ed9 --- /dev/null +++ b/x-pack/plugins/security_solution/public/onboarding/common/lib/__mocks__/telemetry.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export const trackOnboardingLinkClick = jest.fn(); diff --git a/x-pack/plugins/security_solution/public/onboarding/common/lib/telemetry.ts b/x-pack/plugins/security_solution/public/onboarding/common/lib/telemetry.ts new file mode 100644 index 0000000000000..a88ae651ae600 --- /dev/null +++ b/x-pack/plugins/security_solution/public/onboarding/common/lib/telemetry.ts @@ -0,0 +1,12 @@ +/* + * 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 { METRIC_TYPE, TELEMETRY_EVENT, track } from '../../../common/lib/telemetry'; + +export const trackOnboardingLinkClick = (linkId: string) => { + track(METRIC_TYPE.CLICK, `${TELEMETRY_EVENT.ONBOARDING}_${linkId}`); +}; diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/agent_required_callout.test.tsx b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/agent_required_callout.test.tsx index dbd0c105d27a1..53e8b6c34e8f2 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/agent_required_callout.test.tsx +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/agent_required_callout.test.tsx @@ -14,8 +14,10 @@ import React from 'react'; import { render } from '@testing-library/react'; import { AgentRequiredCallout } from './agent_required_callout'; import { TestProviders } from '../../../../../../common/mock/test_providers'; +import { trackOnboardingLinkClick } from '../../../../../common/lib/telemetry'; jest.mock('../../../../../../common/lib/kibana'); +jest.mock('../../../../../common/lib/telemetry'); describe('AgentRequiredCallout', () => { beforeEach(() => { @@ -30,4 +32,12 @@ describe('AgentRequiredCallout', () => { ).toBeInTheDocument(); expect(getByTestId('agentLink')).toBeInTheDocument(); }); + + it('should track the agent link click', () => { + const { getByTestId } = render(, { wrapper: TestProviders }); + + getByTestId('agentLink').click(); + + expect(trackOnboardingLinkClick).toHaveBeenCalledWith('agent_required'); + }); }); diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/agent_required_callout.tsx b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/agent_required_callout.tsx index aad22c959bc65..b1d18b138487b 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/agent_required_callout.tsx +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/agent_required_callout.tsx @@ -11,16 +11,22 @@ import { EuiIcon } from '@elastic/eui'; import { LinkAnchor } from '../../../../../../common/components/links'; import { CardCallOut } from '../../common/card_callout'; import { useNavigation } from '../../../../../../common/lib/kibana'; -import { FLEET_APP_ID, ADD_AGENT_PATH } from '../constants'; +import { FLEET_APP_ID, ADD_AGENT_PATH, TELEMETRY_AGENT_REQUIRED } from '../constants'; +import { trackOnboardingLinkClick } from '../../../../../common/lib/telemetry'; const fleetAgentLinkProps = { appId: FLEET_APP_ID, path: ADD_AGENT_PATH }; export const AgentRequiredCallout = React.memo(() => { const { getAppUrl, navigateTo } = useNavigation(); const addAgentLink = getAppUrl(fleetAgentLinkProps); - const onAddAgentClick = useCallback(() => { - navigateTo(fleetAgentLinkProps); - }, [navigateTo]); + const onAddAgentClick = useCallback( + (e: React.MouseEvent) => { + e.preventDefault(); + trackOnboardingLinkClick(TELEMETRY_AGENT_REQUIRED); + navigateTo(fleetAgentLinkProps); + }, + [navigateTo] + ); return ( ({ - useKibana: jest.fn(), -})); +jest.mock('../../../../../../common/lib/kibana'); +jest.mock('../../../../../common/lib/telemetry'); describe('AgentlessAvailableCallout', () => { const mockUseKibana = useKibana as jest.Mock; @@ -62,4 +62,14 @@ describe('AgentlessAvailableCallout', () => { ).toBeInTheDocument(); expect(getByTestId('agentlessLearnMoreLink')).toBeInTheDocument(); }); + + it('should track the agentless learn more link click', () => { + const { getByTestId } = render(, { + wrapper: TestProviders, + }); + + getByTestId('agentlessLearnMoreLink').click(); + + expect(trackOnboardingLinkClick).toHaveBeenCalledWith('agentless_learn_more'); + }); }); diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/agentless_available_callout.tsx b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/agentless_available_callout.tsx index f802f83efb7e5..eaf8cbaa3b287 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/agentless_available_callout.tsx +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/agentless_available_callout.tsx @@ -5,19 +5,25 @@ * 2.0. */ -import React from 'react'; +import React, { useCallback } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiIcon, useEuiTheme } from '@elastic/eui'; import { css } from '@emotion/react'; import { useKibana } from '../../../../../../common/lib/kibana'; import { LinkAnchor } from '../../../../../../common/components/links'; +import { trackOnboardingLinkClick } from '../../../../../common/lib/telemetry'; import { CardCallOut } from '../../common/card_callout'; +import { TELEMETRY_AGENTLESS_LEARN_MORE } from '../constants'; export const AgentlessAvailableCallout = React.memo(() => { const { euiTheme } = useEuiTheme(); const { docLinks } = useKibana().services; + const onClick = useCallback(() => { + trackOnboardingLinkClick(TELEMETRY_AGENTLESS_LEARN_MORE); + }, []); + /* @ts-expect-error: add the blog link to `packages/kbn-doc-links/src/get_doc_links.ts` when it is ready and remove this exit condition*/ if (!docLinks.links.fleet.agentlessBlog) { return null; @@ -54,6 +60,7 @@ export const AgentlessAvailableCallout = React.memo(() => { { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('renders the callout', () => { + const { getByTestId, getByText } = render(, { wrapper: TestProviders }); + + expect( + getByText('Orchestrate response across endpoint vendors with bidirectional integrations') + ).toBeInTheDocument(); + expect(getByTestId('endpointLearnMoreLink')).toBeInTheDocument(); + }); + + it('should track the agent link click', () => { + const { getByTestId } = render(, { wrapper: TestProviders }); + + getByTestId('endpointLearnMoreLink').click(); + + expect(trackOnboardingLinkClick).toHaveBeenCalledWith('endpoint_learn_more'); + }); +}); diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/endpoint_callout.tsx b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/endpoint_callout.tsx index 2ff48a1992d1d..d5b0199c9f401 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/endpoint_callout.tsx +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/callouts/endpoint_callout.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React from 'react'; +import React, { useCallback } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiIcon, useEuiTheme } from '@elastic/eui'; import { css } from '@emotion/react'; @@ -13,10 +13,15 @@ import { css } from '@emotion/react'; import { useKibana } from '../../../../../../common/lib/kibana/kibana_react'; import { LinkAnchor } from '../../../../../../common/components/links'; import { CardCallOut } from '../../common/card_callout'; +import { trackOnboardingLinkClick } from '../../../../../common/lib/telemetry'; +import { TELEMETRY_ENDPOINT_LEARN_MORE } from '../constants'; export const EndpointCallout = React.memo(() => { const { euiTheme } = useEuiTheme(); const { docLinks } = useKibana().services; + const onClick = useCallback(() => { + trackOnboardingLinkClick(TELEMETRY_ENDPOINT_LEARN_MORE); + }, []); return ( { data-test-subj="endpointLearnMoreLink" external={true} target="_blank" + onClick={onClick} > { const { href: integrationUrl, onClick: onAddIntegrationClicked } = useAddIntegrationsUrl(); + const onClick = useCallback( + (e: React.MouseEvent) => { + e.preventDefault(); + trackOnboardingLinkClick(TELEMETRY_MANAGE_INTEGRATIONS); + onAddIntegrationClicked(e); + }, + [onAddIntegrationClicked] + ); + if (!installedIntegrationsCount) { return null; } @@ -41,7 +52,7 @@ export const ManageIntegrationsCallout = React.memo( ), link: ( diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/constants.ts b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/constants.ts index e245de6129478..c748f5205e7aa 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/constants.ts +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/constants.ts @@ -24,3 +24,9 @@ export const SCROLL_ELEMENT_ID = 'integrations-scroll-container'; export const SEARCH_FILTER_CATEGORIES: CategoryFacet[] = []; export const WITH_SEARCH_BOX_HEIGHT = '568px'; export const WITHOUT_SEARCH_BOX_HEIGHT = '513px'; +export const TELEMETRY_MANAGE_INTEGRATIONS = `manage_integrations`; +export const TELEMETRY_ENDPOINT_LEARN_MORE = `endpoint_learn_more`; +export const TELEMETRY_AGENTLESS_LEARN_MORE = `agentless_learn_more`; +export const TELEMETRY_AGENT_REQUIRED = `agent_required`; +export const TELEMETRY_INTEGRATION_CARD = `card`; +export const TELEMETRY_INTEGRATION_TAB = `tab`; diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integration_card_grid_tabs.test.tsx b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integration_card_grid_tabs.test.tsx index f55cc8cd50b2d..c88ffb6a598b7 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integration_card_grid_tabs.test.tsx +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integration_card_grid_tabs.test.tsx @@ -15,9 +15,11 @@ import { useStoredIntegrationTabId, } from '../../../../hooks/use_stored_state'; import { DEFAULT_TAB } from './constants'; +import { trackOnboardingLinkClick } from '../../../../common/lib/telemetry'; jest.mock('../../../onboarding_context'); jest.mock('../../../../hooks/use_stored_state'); +jest.mock('../../../../common/lib/telemetry'); jest.mock('../../../../../common/lib/kibana', () => ({ ...jest.requireActual('../../../../../common/lib/kibana'), @@ -118,6 +120,33 @@ describe('IntegrationsCardGridTabsComponent', () => { expect(mockSetTabId).toHaveBeenCalledWith('user'); }); + it('tracks the tab clicks', () => { + (useStoredIntegrationTabId as jest.Mock).mockReturnValue(['recommended', mockSetTabId]); + + mockUseAvailablePackages.mockReturnValue({ + isLoading: false, + filteredCards: [], + setCategory: mockSetCategory, + setSelectedSubCategory: mockSetSelectedSubCategory, + setSearchTerm: mockSetSearchTerm, + }); + + const { getByTestId } = render( + + ); + + const tabButton = getByTestId('user'); + + act(() => { + fireEvent.click(tabButton); + }); + + expect(trackOnboardingLinkClick).toHaveBeenCalledWith('tab_user'); + }); + it('renders no search tools when showSearchTools is false', async () => { mockUseAvailablePackages.mockReturnValue({ isLoading: false, diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integration_card_grid_tabs.tsx b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integration_card_grid_tabs.tsx index fc30fb0d6c617..e1ce7f5cdecf1 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integration_card_grid_tabs.tsx +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integration_card_grid_tabs.tsx @@ -21,6 +21,7 @@ import { LOADING_SKELETON_TEXT_LINES, SCROLL_ELEMENT_ID, SEARCH_FILTER_CATEGORIES, + TELEMETRY_INTEGRATION_TAB, WITHOUT_SEARCH_BOX_HEIGHT, WITH_SEARCH_BOX_HEIGHT, } from './constants'; @@ -28,6 +29,7 @@ import { INTEGRATION_TABS, INTEGRATION_TABS_BY_ID } from './integration_tabs_con import { useIntegrationCardList } from './use_integration_card_list'; import { IntegrationTabId } from './types'; import { IntegrationCardTopCallout } from './callouts/integration_card_top_callout'; +import { trackOnboardingLinkClick } from '../../../../common/lib/telemetry'; export interface IntegrationsCardGridTabsProps { installedIntegrationsCount: number; @@ -55,8 +57,10 @@ export const IntegrationsCardGridTabsComponent = React.memo { const id = stringId as IntegrationTabId; + const trackId = `${TELEMETRY_INTEGRATION_TAB}_${id}`; scrollElement.current?.scrollTo?.(0, 0); setSelectedTabIdToStorage(id); + trackOnboardingLinkClick(trackId); }, [setSelectedTabIdToStorage] ); diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/use_integration_card_list.test.ts b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/use_integration_card_list.test.ts index 9c4e1978f27b7..19ab340276b83 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/use_integration_card_list.test.ts +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/use_integration_card_list.test.ts @@ -6,12 +6,14 @@ */ import { renderHook } from '@testing-library/react-hooks'; import { useIntegrationCardList } from './use_integration_card_list'; +import { trackOnboardingLinkClick } from '../../../../common/lib/telemetry'; +jest.mock('../../../../common/lib/telemetry'); jest.mock('../../../../../common/lib/kibana', () => ({ ...jest.requireActual('../../../../../common/lib/kibana'), useNavigation: jest.fn().mockReturnValue({ navigateTo: jest.fn(), - getAppUrl: jest.fn(), + getAppUrl: jest.fn().mockReturnValue(''), }), })); @@ -73,4 +75,17 @@ describe('useIntegrationCardList', () => { expect(result.current).toEqual([mockFilteredCards.featuredCards['epr:endpoint']]); }); + + it('tracks integration card click', () => { + const { result } = renderHook(() => + useIntegrationCardList({ + integrationsList: mockIntegrationsList, + }) + ); + + const card = result.current[0]; + card.onCardClick?.(); + + expect(trackOnboardingLinkClick).toHaveBeenCalledWith('card_epr:endpoint'); + }); }); diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/use_integration_card_list.ts b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/use_integration_card_list.ts index 2a9675f91e9a8..ccea5299551c1 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/use_integration_card_list.ts +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/use_integration_card_list.ts @@ -20,8 +20,10 @@ import { MAX_CARD_HEIGHT_IN_PX, ONBOARDING_APP_ID, ONBOARDING_LINK, + TELEMETRY_INTEGRATION_CARD, } from './constants'; import type { GetAppUrl, NavigateTo } from '../../../../../common/lib/kibana'; +import { trackOnboardingLinkClick } from '../../../../common/lib/telemetry'; const addPathParamToUrl = (url: string, onboardingLink: string) => { const encoded = encodeURIComponent(onboardingLink); @@ -97,6 +99,8 @@ const addSecuritySpecificProps = ({ showInstallationStatus: true, url, onCardClick: () => { + const trackId = `${TELEMETRY_INTEGRATION_CARD}_${card.id}`; + trackOnboardingLinkClick(trackId); if (url.startsWith(APP_INTEGRATIONS_PATH)) { navigateTo({ appId: INTEGRATION_APP_ID, From e1c4a604e1b66dfd7348cd28a451313c44c996df Mon Sep 17 00:00:00 2001 From: Thom Heymann <190132+thomheymann@users.noreply.github.com> Date: Tue, 22 Oct 2024 17:03:41 +0100 Subject: [PATCH 018/146] [Observability Onboarding] Fix EDOT collector permissions (#197248) ## Summary Fix EDOT collector permissions. ## Details Adds `traces-*-*` index privilege and removed unnecessary `apm` application privileges: ```json { "standalone_agent": { "cluster": [ "monitor" ], "indices": [ { "names": [ "logs-*-*", "metrics-*-*", "traces-*-*" ], "privileges": [ "auto_configure", "create_doc" ], "allow_restricted_indices": false } ], "applications": [] } } ``` --- .../server/lib/api_key/create_shipper_api_key.ts | 9 ++++++--- .../server/lib/api_key/has_log_monitoring_privileges.ts | 9 ++++++--- .../server/lib/api_key/privileges.ts | 9 ++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/create_shipper_api_key.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/create_shipper_api_key.ts index bdfdd202a962e..9279ae0e1dfd1 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/create_shipper_api_key.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/create_shipper_api_key.ts @@ -6,7 +6,11 @@ */ import { ElasticsearchClient } from '@kbn/core/server'; -import { MONITOR_CLUSTER, INDEX_LOGS_AND_METRICS, WRITE_APM_EVENTS } from './privileges'; +import { + MONITOR_CLUSTER, + INDEX_LOGS_AND_METRICS, + INDEX_LOGS_METRICS_AND_TRACES, +} from './privileges'; export function createShipperApiKey(esClient: ElasticsearchClient, name: string, withAPM = false) { // Based on https://www.elastic.co/guide/en/fleet/master/grant-access-to-elasticsearch.html#create-api-key-standalone-agent @@ -20,8 +24,7 @@ export function createShipperApiKey(esClient: ElasticsearchClient, name: string, role_descriptors: { standalone_agent: { cluster: [MONITOR_CLUSTER], - indices: [INDEX_LOGS_AND_METRICS], - applications: withAPM ? [WRITE_APM_EVENTS] : undefined, + indices: [withAPM ? INDEX_LOGS_METRICS_AND_TRACES : INDEX_LOGS_AND_METRICS], }, }, }, diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/has_log_monitoring_privileges.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/has_log_monitoring_privileges.ts index 0593a7f761e1e..ce5897936b741 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/has_log_monitoring_privileges.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/has_log_monitoring_privileges.ts @@ -6,14 +6,17 @@ */ import { ElasticsearchClient } from '@kbn/core/server'; -import { MONITOR_CLUSTER, INDEX_LOGS_AND_METRICS, WRITE_APM_EVENTS } from './privileges'; +import { + MONITOR_CLUSTER, + INDEX_LOGS_AND_METRICS, + INDEX_LOGS_METRICS_AND_TRACES, +} from './privileges'; export async function hasLogMonitoringPrivileges(esClient: ElasticsearchClient, withAPM = false) { const res = await esClient.security.hasPrivileges({ body: { cluster: [MONITOR_CLUSTER, 'manage_own_api_key'], - index: [INDEX_LOGS_AND_METRICS], - application: withAPM ? [WRITE_APM_EVENTS] : undefined, + index: [withAPM ? INDEX_LOGS_METRICS_AND_TRACES : INDEX_LOGS_AND_METRICS], }, }); diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/privileges.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/privileges.ts index 7c3b5999842bd..8a28849ef1003 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/privileges.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/privileges.ts @@ -18,9 +18,8 @@ export const INDEX_LOGS_AND_METRICS: estypes.SecurityIndicesPrivileges = { privileges: ['auto_configure', 'create_doc'], }; -// https://www.elastic.co/guide/en/observability/master/apm-api-key.html#apm-create-api-key-workflow-es -export const WRITE_APM_EVENTS: estypes.SecurityApplicationPrivileges = { - application: 'apm', - privileges: ['event:write', 'config_agent:read'], - resources: ['*'], +// https://www.elastic.co/guide/en/fleet/master/grant-access-to-elasticsearch.html#create-api-key-standalone-agent +export const INDEX_LOGS_METRICS_AND_TRACES: estypes.SecurityIndicesPrivileges = { + names: ['logs-*-*', 'metrics-*-*', 'traces-*-*'], + privileges: ['auto_configure', 'create_doc'], }; From 1e05086ea4ce850bf0c56ce7f8315d50fdfc4a01 Mon Sep 17 00:00:00 2001 From: Larry Gregory Date: Tue, 22 Oct 2024 12:04:01 -0400 Subject: [PATCH 019/146] Remove unused dependencies (#197058) ## Summary Removes the following unused dependencies: - `@cfworker/json-schema` - `flat` - `font-awesome` - `html2canvas` - `@formatjs/cli` - `@formatjs/cli-lib` - `@types/babel__core` - `@types/babel__generator` - `@types/babel__helper-plugin-utils` - `@types/event-stream` - `@types/flat` - `@types/md5` - `@types/pegjs` - `@types/tapable` - `@types/zen-observable` - `debug` - `html` Also removes `pbf` from `devDependencies`, as it already exists in the production `dependencies` list. --- package.json | 18 ----- yarn.lock | 184 +++++---------------------------------------------- 2 files changed, 17 insertions(+), 185 deletions(-) diff --git a/package.json b/package.json index 51d1b7472c6dc..f2eb15a482ae2 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,6 @@ "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@babel/runtime": "^7.24.7", - "@cfworker/json-schema": "^1.12.7", "@dagrejs/dagre": "^1.1.4", "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^8.0.0", @@ -1121,9 +1120,7 @@ "fastest-levenshtein": "^1.0.12", "fflate": "^0.6.9", "file-saver": "^1.3.8", - "flat": "5", "fnv-plus": "^1.3.1", - "font-awesome": "4.7.0", "formik": "^2.4.6", "fp-ts": "^2.3.1", "get-port": "^5.0.0", @@ -1136,7 +1133,6 @@ "he": "^1.2.0", "history": "^4.9.0", "hjson": "3.2.1", - "html2canvas": "^1.4.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.1", "i18n-iso-countries": "^4.3.1", @@ -1334,8 +1330,6 @@ "@elastic/synthetics": "^1.12.1", "@emotion/babel-preset-css-prop": "^11.11.0", "@emotion/jest": "^11.11.0", - "@formatjs/cli": "^6.2.8", - "@formatjs/cli-lib": "^6.3.8", "@frsource/cypress-plugin-visual-regression-diff": "^3.3.10", "@istanbuljs/nyc-config-typescript": "^1.0.2", "@istanbuljs/schema": "^0.1.2", @@ -1531,9 +1525,6 @@ "@types/archiver": "^5.3.1", "@types/async": "^3.2.3", "@types/aws4": "^1.5.0", - "@types/babel__core": "^7.20.5", - "@types/babel__generator": "^7.6.4", - "@types/babel__helper-plugin-utils": "^7.10.0", "@types/base64-js": "^1.2.5", "@types/byte-size": "^8.1.0", "@types/chance": "^1.0.0", @@ -1559,13 +1550,11 @@ "@types/ejs": "^3.0.6", "@types/enzyme": "^3.10.12", "@types/eslint": "^8.44.2", - "@types/event-stream": "^4.0.5", "@types/express": "^4.17.21", "@types/extract-zip": "^1.6.2", "@types/faker": "^5.1.5", "@types/fetch-mock": "^7.3.1", "@types/file-saver": "^2.0.0", - "@types/flat": "^5.0.5", "@types/flot": "^0.0.31", "@types/fnv-plus": "^1.3.0", "@types/geojson": "^7946.0.10", @@ -1594,7 +1583,6 @@ "@types/lz-string": "^1.3.34", "@types/mapbox__vector-tile": "1.3.0", "@types/markdown-it": "^12.2.3", - "@types/md5": "^2.2.0", "@types/micromatch": "^4.0.2", "@types/mime": "^2.0.1", "@types/mime-types": "^2.1.0", @@ -1617,7 +1605,6 @@ "@types/papaparse": "^5.0.3", "@types/pbf": "3.0.2", "@types/pdfmake": "^0.2.2", - "@types/pegjs": "^0.10.1", "@types/picomatch": "^2.3.0", "@types/pidusage": "^2.0.2", "@types/pixelmatch": "^5.2.4", @@ -1649,7 +1636,6 @@ "@types/stats-lite": "^2.2.0", "@types/styled-components": "^5.1.0", "@types/supertest": "^6.0.2", - "@types/tapable": "^1.0.6", "@types/textarea-caret": "^3.0.1", "@types/tinycolor2": "^1.4.1", "@types/tough-cookie": "^4.0.5", @@ -1667,7 +1653,6 @@ "@types/yargs": "^15.0.0", "@types/yauzl": "^2.9.1", "@types/yazl": "^2.4.2", - "@types/zen-observable": "^0.8.0", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "@typescript-eslint/typescript-estree": "^5.62.0", @@ -1708,7 +1693,6 @@ "cypress-real-events": "^1.11.0", "cypress-recurse": "^1.35.2", "date-fns": "^2.29.3", - "debug": "^2.6.9", "dependency-check": "^4.1.0", "ejs": "^3.1.10", "enzyme": "^3.11.0", @@ -1745,7 +1729,6 @@ "gulp-postcss": "^9.0.1", "gulp-terser": "^2.1.0", "has-ansi": "^3.0.0", - "html": "1.0.0", "html-loader": "^1.3.2", "http-proxy": "^1.18.1", "http2-proxy": "^5.0.53", @@ -1792,7 +1775,6 @@ "oboe": "^2.1.4", "openapi-types": "^10.0.0", "p-reflect": "2.1.0", - "pbf": "3.2.1", "peggy": "^1.2.0", "picomatch": "^2.3.1", "pidusage": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index b5b1294c39f7e..67d502560380f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -435,7 +435,7 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.10.3", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24.7": +"@babel/parser@^7.1.0", "@babel/parser@^7.10.3", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.21.8", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== @@ -1366,7 +1366,7 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/types@7.21.2", "@babel/types@^7.0.0", "@babel/types@^7.10.3", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": +"@babel/types@7.21.2", "@babel/types@^7.0.0", "@babel/types@^7.10.3", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== @@ -1460,11 +1460,6 @@ react-is "^18.2.0" react-shallow-renderer "^16.15.0" -"@cfworker/json-schema@^1.12.7": - version "1.12.7" - resolved "https://registry.yarnpkg.com/@cfworker/json-schema/-/json-schema-1.12.7.tgz#064d082a11881f684300bc7e6d3021e9d98f9a59" - integrity sha512-KEJUW22arGRQVoS6Ti8SvgXnme6NNMMcGBugdir1hf32ofWUXC8guwrFbepO2+YtqxNBUo5oO0pLYM5d4pyjOg== - "@cnakazawa/watch@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" @@ -2377,31 +2372,6 @@ resolved "https://registry.yarnpkg.com/@foliojs-fork/restructure/-/restructure-2.0.2.tgz#73759aba2aff1da87b7c4554e6839c70d43c92b4" integrity sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA== -"@formatjs/cli-lib@^6.3.8": - version "6.3.8" - resolved "https://registry.yarnpkg.com/@formatjs/cli-lib/-/cli-lib-6.3.8.tgz#10b685cf833c870d342f24de0f324acd7b02d31b" - integrity sha512-7+40WfAs9UE1BcjpUvtAkWk0REGchANpJZdHhXcMEVcKeDQKk0+OPhlueTnvFmYwENcJ+m7Leb26CRZDzGsc+Q== - dependencies: - "@formatjs/icu-messageformat-parser" "2.7.6" - "@formatjs/ts-transformer" "3.13.12" - "@types/estree" "^1.0.0" - "@types/fs-extra" "^9.0.1" - "@types/json-stable-stringify" "^1.0.32" - "@types/node" "14 || 16 || 17" - chalk "^4.0.0" - commander "8" - fast-glob "^3.2.7" - fs-extra "10" - json-stable-stringify "^1.0.1" - loud-rejection "^2.2.0" - tslib "^2.4.0" - typescript "5" - -"@formatjs/cli@^6.2.8": - version "6.2.8" - resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-6.2.8.tgz#df471f79b30935d6c5e5956ad1e8321076ade767" - integrity sha512-sGtFehlHpNL5xbCkP5/zz5lgIVPPdQFqhY6Pcc9+whpBawln6VDzbaGA5ttWjtBDVVKZbEukiCFk8HW2H0OVxQ== - "@formatjs/ecma402-abstract@1.18.2": version "1.18.2" resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz#bf103712a406874eb1e387858d5be2371ab3aa14" @@ -10165,7 +10135,7 @@ dependencies: "@types/node" "*" -"@types/babel__core@*", "@types/babel__core@^7.1.14": +"@types/babel__core@^7.1.14": version "7.1.20" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== @@ -10176,17 +10146,6 @@ "@types/babel__template" "*" "@types/babel__traverse" "*" -"@types/babel__core@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - "@types/babel__generator@*": version "7.0.2" resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" @@ -10194,20 +10153,6 @@ dependencies: "@babel/types" "^7.0.0" -"@types/babel__generator@^7.6.4": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__helper-plugin-utils@^7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@types/babel__helper-plugin-utils/-/babel__helper-plugin-utils-7.10.0.tgz#dcd2416f9c189d5837ab2a276368cf67134efe78" - integrity sha512-60YtHzhQ9HAkToHVV+TB4VLzBn9lrfgrsOjiJMtbv/c1jPdekBxaByd6DMsGBzROXWoIL6U3lEFvvbu69RkUoA== - dependencies: - "@types/babel__core" "*" - "@types/babel__template@*": version "7.0.2" resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" @@ -10537,13 +10482,6 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== -"@types/event-stream@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/event-stream/-/event-stream-4.0.5.tgz#29f1be5f4c0de2e0312cf3b5f7146c975c08d918" - integrity sha512-pQ/RR/iuBW8K8WmwYaaC1nkZH0cHonNAIw6ktG8BCNrNuqNeERfBzNIAOq6Z7tvLzpjcMV02SZ5pxAekAYQpWA== - dependencies: - "@types/node" "*" - "@types/expect@^1.20.4": version "1.20.4" resolved "https://registry.yarnpkg.com/@types/expect/-/expect-1.20.4.tgz#8288e51737bf7e3ab5d7c77bfa695883745264e5" @@ -10589,11 +10527,6 @@ resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.0.tgz#cbb49815a5e1129d5f23836a98d65d93822409af" integrity sha512-dxdRrUov2HVTbSRFX+7xwUPlbGYVEZK6PrSqClg2QPos3PNe0bCajkDDkDeeC1znjSH03KOEqVbXpnJuWa2wgQ== -"@types/flat@^5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@types/flat/-/flat-5.0.5.tgz#2304df0b2b1e6dde50d81f029593e0a1bc2474d3" - integrity sha512-nPLljZQKSnac53KDUDzuzdRfGI0TDb5qPrb+SrQyN3MtdQrOnGsKniHN1iYZsJEBIVQve94Y6gNz22sgISZq+Q== - "@types/flot@^0.0.31": version "0.0.31" resolved "https://registry.yarnpkg.com/@types/flot/-/flot-0.0.31.tgz#0daca37c6c855b69a0a7e2e37dd0f84b3db8c8c1" @@ -10606,13 +10539,6 @@ resolved "https://registry.yarnpkg.com/@types/fnv-plus/-/fnv-plus-1.3.0.tgz#0f43f0b7e7b4b24de3a1cab69bfa009508f4c084" integrity sha512-ijls8MsO6Q9JUSd5w1v4y2ijM6S4D/nmOyI/FwcepvrZfym0wZhLdYGFD5TJID7tga0O3I7SmtK69RzpSJ1Fcw== -"@types/fs-extra@^9.0.1": - version "9.0.13" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" - integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== - dependencies: - "@types/node" "*" - "@types/geojson@*", "@types/geojson@^7946.0.10", "@types/geojson@^7946.0.7": version "7946.0.10" resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" @@ -10918,13 +10844,6 @@ "@types/linkify-it" "*" "@types/mdurl" "*" -"@types/md5@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@types/md5/-/md5-2.2.0.tgz#cd82e16b95973f94bb03dee40c5b6be4a7fb7fb4" - integrity sha512-JN8OVL/wiDlCWTPzplsgMPu0uE9Q6blwp68rYsfk2G8aokRUQ8XD9MEhZwihfAiQvoyE+m31m6i3GFXwYWomKQ== - dependencies: - "@types/node" "*" - "@types/md5@^2.3.2": version "2.3.5" resolved "https://registry.yarnpkg.com/@types/md5/-/md5-2.3.5.tgz#481cef0a896e3a5dcbfc5a8a8b02c05958af48a5" @@ -11156,11 +11075,6 @@ "@types/node" "*" "@types/pdfkit" "*" -"@types/pegjs@^0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@types/pegjs/-/pegjs-0.10.1.tgz#9a2f3961dc62430fdb21061eb0ddbd890f9e3b94" - integrity sha512-ra8IchO9odGQmYKbm+94K58UyKCEKdZh9y0vxhG4pIpOJOBlC1C+ZtBVr6jLs+/oJ4pl+1p/4t3JtBA8J10Vvw== - "@types/picomatch@^2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@types/picomatch/-/picomatch-2.3.0.tgz#75db5e75a713c5a83d5b76780c3da84a82806003" @@ -11525,7 +11439,7 @@ "@types/methods" "^1.1.4" "@types/superagent" "^8.1.0" -"@types/tapable@^1", "@types/tapable@^1.0.5", "@types/tapable@^1.0.6": +"@types/tapable@^1", "@types/tapable@^1.0.5": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== @@ -11747,11 +11661,6 @@ dependencies: "@types/node" "*" -"@types/zen-observable@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" - integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== - "@typescript-eslint/eslint-plugin@^5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" @@ -13406,11 +13315,6 @@ bare-path@^2.0.0, bare-path@^2.1.0: dependencies: bare-os "^2.1.0" -base64-arraybuffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" - integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== - base64-js@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" @@ -14772,11 +14676,6 @@ commander@7, commander@^7.0.0, commander@^7.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@8: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - commander@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" @@ -14878,7 +14777,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@~1.6.0: +concat-stream@^1.5.0, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -15278,13 +15177,6 @@ css-in-js-utils@^2.0.0: hyphenate-style-name "^1.0.2" isobject "^3.0.1" -css-line-break@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" - integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w== - dependencies: - utrie "^1.0.2" - css-loader@^3.4.2, css-loader@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" @@ -15940,7 +15832,7 @@ dayjs@^1.10.4: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -18118,7 +18010,7 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.0.3, fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.2: +fast-glob@^3.0.3, fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -18465,7 +18357,7 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flat@5, flat@^5.0.2: +flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== @@ -18510,11 +18402,6 @@ follow-redirects@^1.0.0, follow-redirects@^1.15.6: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== -font-awesome@4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" - integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM= - for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -18710,15 +18597,6 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@10, fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -18730,6 +18608,15 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -19946,21 +19833,6 @@ html-webpack-plugin@^4.0.0: tapable "^1.1.3" util.promisify "1.0.0" -html2canvas@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" - integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== - dependencies: - css-line-break "^2.1.0" - text-segmentation "^1.0.3" - -html@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/html/-/html-1.0.0.tgz#a544fa9ea5492bfb3a2cca8210a10be7b5af1f61" - integrity sha1-pUT6nqVJK/s6LMqCEKEL57WvH2E= - dependencies: - concat-stream "^1.4.7" - htmlparser2@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78" @@ -22816,14 +22688,6 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -loud-rejection@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-2.2.0.tgz#4255eb6e9c74045b0edc021fa7397ab655a8517c" - integrity sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ== - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.2" - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -30500,13 +30364,6 @@ text-hex@1.0.x: resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== -text-segmentation@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" - integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw== - dependencies: - utrie "^1.0.2" - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -31631,13 +31488,6 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -utrie@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645" - integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw== - dependencies: - base64-arraybuffer "^1.0.2" - uuid-browser@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid-browser/-/uuid-browser-3.1.0.tgz#0f05a40aef74f9e5951e20efbf44b11871e56410" From c417196905278c590539476b72f6422104a1d4d7 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Tue, 22 Oct 2024 19:57:37 +0300 Subject: [PATCH 020/146] [Core] [UA] Support API Deprecations (#196081) # Summary Adds a new API deprecations feature inside core. This feature enabled plugin developers to mark their versioned and unversioned public routes as deprecated. These deprecations will be surfaced to the users through UA to help them understand the deprecation and address it before upgrading. This PR also surfaces these deprecations to UA. Closes https://github.com/elastic/kibana/issues/117241 1. Core service to flag deprecated routes 2. UA code to surface and resolve deprecated routes ## Flagging a deprecated Route ### The route deprecation option We have three types of route deprecations: - `type: bump`: A version bump deprecation means the API has a new version and the current version will be removed in the future in favor of the newer version. - `type: remove`: This API will be completely removed. You will no longer be able to use it in the future. - `type: migrate`: This API will be migrated to a different API and will be removed in the future in favor of the other API. All route deprecations expect a documentation link to help users navigate. We might add a generic documentation link and drop this requirement in the future but for now this is required. ### Deprecated Route Example Full examples can be found in the `routing_example` example plugin located in this directory: `examples/routing_example/server/routes/deprecated_routes` ```ts router[versioned?].get( { path: '/', options: { deprecated: { documentationUrl: 'https://google.com', severity: 'warning', reason: { type: 'bump', newApiVersion: '2024-10-13', }, }, }, }, async (context, req, res) => { ... ``` ## Surfaced API deprecations in UA The list of deprecated APIs will be listed inside Kibana deprecations along with the already supported config deprecations. image Users can click on the list item to learn more about each deprecation and mark it as resolved image ### Marking as resolved Users can click on mark as resolved button in the UA to hide the deprecation from the Kiban deprecations list. We keep track on when this button was clicked and how many times the API has been called. If the API is called again the deprecation will re-appear inside the list. We might add a feature in the future to permenantly supress the API deprecation from showing in the list through a configuration (https://github.com/elastic/kibana/issues/196089) If the API has been marked as resolved before we show this in the flyout message: > The API GET /api/deprecations/ has been called 25 times. The last time the API was called was on Monday, October 14, 2024 1:08 PM +03:00. > The api has been called 2 times since the last time it was marked as resolved on Monday, October 14, 2024 1:08 PM +03:00 Once marked as resolved the flyout exists and we show this to the user until they refresh the page image ## Telemetry: We keep track of 2 new things for telemetry purposes: 1. The number of times the deprecated API has been called 2. The number of times the deprecated API has been resolved (how many times the mark as resolved button in UA was clicked) ## Code review - [x] Core team is expected to review the whole PR - [ ] Docs team to review the copy and update the UA displayed texts (title, description, and manual steps) - [x] kibana-management team is expected to review the UA code changes and UI - [ ] A few teams are only required to approve this PR and update their `deprecated: true` route param to the new deprecationInfo object we now expect. There is an issue tracker to address those in separate PRs later on: https://github.com/elastic/kibana/issues/196095 ## Testing Run kibana locally with the test example plugin that has deprecated routes ``` yarn start --plugin-path=examples/routing_example --plugin-path=examples/developer_examples ``` The following comprehensive deprecated routes examples are registered inside the folder: `examples/routing_example/server/routes/deprecated_routes` Run them in the console to trigger the deprecation condition so they show up in the UA: ``` # Versioned routes: Version 1 is deprecated GET kbn:/api/routing_example/d/versioned?apiVersion=1 GET kbn:/api/routing_example/d/versioned?apiVersion=2 # Non-versioned routes GET kbn:/api/routing_example/d/removed_route POST kbn:/api/routing_example/d/migrated_route {} ``` 1. You can also mark as deprecated in the UA to remove the deprecation from the list. 2. Check the telemetry response to see the reported data about the deprecated route. 3. Calling version 2 of the API does not do anything since it is not deprecated unlike version `1` (`GET kbn:/api/routing_example/d/versioned?apiVersion=2`) 4. Internally you can see the deprecations counters from the dev console by running the following: ``` GET .kibana_usage_counters/_search { "query": { "bool": { "should": [ {"match": { "usage-counter.counterType": "deprecated_api_call:total"}}, {"match": { "usage-counter.counterType": "deprecated_api_call:resolved"}}, {"match": { "usage-counter.counterType": "deprecated_api_call:marked_as_resolved"}} ] } } } ``` --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: florent-leborgne Co-authored-by: Elastic Machine --- .buildkite/ftr_platform_stateful_configs.yml | 2 +- .eslintrc.js | 1 + examples/routing_example/common/index.ts | 6 + examples/routing_example/server/plugin.ts | 3 +- .../server/routes/deprecated_routes/index.ts | 17 + .../routes/deprecated_routes/unversioned.ts | 62 +++ .../routes/deprecated_routes/versioned.ts | 53 +++ .../routing_example/server/routes/index.ts | 1 + examples/routing_example/tsconfig.json | 1 + oas_docs/bundle.json | 11 - oas_docs/bundle.serverless.json | 11 - .../output/kibana.serverless.staging.yaml | 11 - oas_docs/output/kibana.serverless.yaml | 11 - oas_docs/output/kibana.staging.yaml | 11 - oas_docs/output/kibana.yaml | 11 - .../src/deprecations_client.test.ts | 2 +- .../src/deprecations_client.ts | 71 +++- .../core-deprecations-common/src/types.ts | 31 +- .../src/deprecations/api_deprecations.test.ts | 353 ++++++++++++++++++ .../src/deprecations/api_deprecations.ts | 96 +++++ .../deprecations/config_deprecations.test.ts | 115 ++++++ .../src/deprecations/config_deprecations.ts | 50 +++ .../src/deprecations/i18n_texts.ts | 132 +++++++ .../src/deprecations/index.ts | 11 + .../src/deprecations_service.test.mocks.ts | 8 + .../src/deprecations_service.test.ts | 106 +----- .../src/deprecations_service.ts | 54 +-- .../src/routes/index.ts | 14 +- .../src/routes/post_validation_handler.ts | 51 +++ .../src/routes/resolve_deprecated_api.ts | 52 +++ .../tsconfig.json | 5 + .../core-http-router-server-internal/index.ts | 8 +- .../src/request.ts | 16 +- .../src/router.test.ts | 14 +- .../src/router.ts | 78 ++-- .../core_versioned_route.test.ts | 2 +- .../versioned_router/core_versioned_route.ts | 16 +- .../core_versioned_router.test.ts | 5 +- .../versioned_router/core_versioned_router.ts | 14 +- .../src/versioned_router/index.ts | 2 +- .../src/versioned_router/mocks.ts | 1 + .../src/versioned_router/types.ts | 17 +- .../src/versioned_router.mock.ts | 15 +- .../src/http_server.test.ts | 2 + .../src/http_server.ts | 48 ++- .../src/http_service.ts | 8 +- .../core-http-server-internal/src/types.ts | 7 + .../src/http_service.mock.ts | 4 + packages/core/http/core-http-server/index.ts | 2 + .../core-http-server/src/http_contract.ts | 9 + .../http/core-http-server/src/router/index.ts | 2 +- .../core-http-server/src/router/request.ts | 9 +- .../http/core-http-server/src/router/route.ts | 51 ++- .../core-http-server/src/router/router.ts | 13 +- .../core-http-server/src/versioning/index.ts | 1 + .../core-http-server/src/versioning/types.ts | 29 +- .../core/http/core-http-server/tsconfig.json | 2 +- .../src/core_setup.mock.ts | 2 + .../src/plugin_context.ts | 2 + .../core-root-server-internal/src/server.ts | 9 +- .../src/mocks/internal_mocks.ts | 1 + .../src/routes/bulk_create.ts | 1 + .../src/routes/bulk_delete.ts | 1 + .../src/routes/bulk_get.ts | 1 + .../src/routes/bulk_resolve.ts | 1 + .../src/routes/bulk_update.ts | 1 + .../src/routes/create.ts | 1 + .../src/routes/delete.ts | 1 + .../src/routes/find.ts | 1 + .../src/routes/get.ts | 1 + .../src/routes/resolve.ts | 1 + .../src/routes/update.ts | 1 + .../src/usage_stats_client.ts | 9 +- .../src/core_usage_data_service.ts | 13 + .../src/core_usage_stats_client.test.ts | 1 + .../src/core_usage_stats_client.ts | 52 +++ .../src/core_usage_data_service.mock.ts | 1 + .../src/core_usage_stats_client.mock.ts | 1 + .../core-usage-data-server/index.ts | 2 + .../src/core_usage_stats.ts | 13 + .../core-usage-data-server/src/index.ts | 3 +- .../src/setup_contract.ts | 15 +- .../core-usage-data-server/tsconfig.json | 3 + .../__snapshots__/generate_oas.test.ts.snap | 1 + .../src/generate_oas.test.ts | 2 + .../src/generate_oas.test.util.ts | 14 +- .../src/process_router.ts | 3 +- .../src/process_versioned_router.test.ts | 7 +- .../src/process_versioned_router.ts | 7 +- .../http/request_representation.test.ts | 6 +- .../server/collectors/common/counters.test.ts | 1 - .../server/collectors/common/counters.ts | 2 +- .../core/fetch_deprecated_api_counters.ts | 69 ++++ .../server/collectors/core/index.ts | 1 + .../server/collectors/index.ts | 2 +- .../kibana_usage_collection/server/plugin.ts | 5 + .../test_suites/core/deprecations.ts | 2 +- .../actions/server/routes/legacy/create.ts | 1 + .../actions/server/routes/legacy/delete.ts | 1 + .../actions/server/routes/legacy/execute.ts | 1 + .../actions/server/routes/legacy/get.ts | 1 + .../actions/server/routes/legacy/get_all.ts | 1 + .../server/routes/legacy/list_action_types.ts | 1 + .../actions/server/routes/legacy/update.ts | 1 + .../alerting/server/routes/legacy/create.ts | 1 + .../alerting/server/routes/legacy/delete.ts | 1 + .../alerting/server/routes/legacy/disable.ts | 1 + .../alerting/server/routes/legacy/enable.ts | 1 + .../alerting/server/routes/legacy/find.ts | 1 + .../alerting/server/routes/legacy/get.ts | 1 + .../legacy/get_alert_instance_summary.ts | 1 + .../server/routes/legacy/get_alert_state.ts | 1 + .../alerting/server/routes/legacy/health.ts | 1 + .../server/routes/legacy/list_alert_types.ts | 1 + .../alerting/server/routes/legacy/mute_all.ts | 1 + .../server/routes/legacy/mute_instance.ts | 1 + .../server/routes/legacy/unmute_all.ts | 1 + .../server/routes/legacy/unmute_instance.ts | 1 + .../alerting/server/routes/legacy/update.ts | 1 + .../server/routes/legacy/update_api_key.ts | 1 + .../routes/api/comments/get_all_comment.ts | 1 + .../server/routes/api/stats/get_status.ts | 1 + .../api/user_actions/get_all_user_actions.ts | 1 + .../fleet/server/routes/agent/index.ts | 2 + .../plugins/fleet/server/routes/app/index.ts | 1 + .../server/routes/enrollment_api_key/index.ts | 4 + .../plugins/fleet/server/routes/epm/index.ts | 4 + x-pack/plugins/ml/server/routes/system.ts | 3 +- .../server/endpoint/routes/metadata/index.ts | 1 + .../endpoint/routes/suggestions/index.ts | 1 + x-pack/plugins/upgrade_assistant/README.md | 43 ++- .../deprecation_details_flyout.tsx | 44 ++- .../kibana_deprecations.tsx | 37 +- .../kibana_deprecations_table.tsx | 19 +- .../resolution_table_cell.tsx | 71 +++- x-pack/test/tsconfig.json | 4 +- .../{config.js => config.ts} | 13 +- .../upgrade_assistant/api_deprecations.ts | 162 ++++++++ .../upgrade_assistant/{index.js => index.ts} | 5 +- 139 files changed, 2057 insertions(+), 381 deletions(-) create mode 100644 examples/routing_example/server/routes/deprecated_routes/index.ts create mode 100644 examples/routing_example/server/routes/deprecated_routes/unversioned.ts create mode 100644 examples/routing_example/server/routes/deprecated_routes/versioned.ts create mode 100644 packages/core/deprecations/core-deprecations-server-internal/src/deprecations/api_deprecations.test.ts create mode 100644 packages/core/deprecations/core-deprecations-server-internal/src/deprecations/api_deprecations.ts create mode 100644 packages/core/deprecations/core-deprecations-server-internal/src/deprecations/config_deprecations.test.ts create mode 100644 packages/core/deprecations/core-deprecations-server-internal/src/deprecations/config_deprecations.ts create mode 100644 packages/core/deprecations/core-deprecations-server-internal/src/deprecations/i18n_texts.ts create mode 100644 packages/core/deprecations/core-deprecations-server-internal/src/deprecations/index.ts create mode 100644 packages/core/deprecations/core-deprecations-server-internal/src/routes/post_validation_handler.ts create mode 100644 packages/core/deprecations/core-deprecations-server-internal/src/routes/resolve_deprecated_api.ts create mode 100644 src/plugins/kibana_usage_collection/server/collectors/core/fetch_deprecated_api_counters.ts rename x-pack/test/upgrade_assistant_integration/{config.js => config.ts} (70%) create mode 100644 x-pack/test/upgrade_assistant_integration/upgrade_assistant/api_deprecations.ts rename x-pack/test/upgrade_assistant_integration/upgrade_assistant/{index.js => index.ts} (64%) diff --git a/.buildkite/ftr_platform_stateful_configs.yml b/.buildkite/ftr_platform_stateful_configs.yml index 6958ec4530ae8..244f04257ef92 100644 --- a/.buildkite/ftr_platform_stateful_configs.yml +++ b/.buildkite/ftr_platform_stateful_configs.yml @@ -344,7 +344,7 @@ enabled: - x-pack/test/task_manager_claimer_mget/config.ts - x-pack/test/ui_capabilities/security_and_spaces/config.ts - x-pack/test/ui_capabilities/spaces_only/config.ts - - x-pack/test/upgrade_assistant_integration/config.js + - x-pack/test/upgrade_assistant_integration/config.ts - x-pack/test/usage_collection/config.ts - x-pack/performance/journeys_e2e/aiops_log_rate_analysis.ts - x-pack/performance/journeys_e2e/ecommerce_dashboard.ts diff --git a/.eslintrc.js b/.eslintrc.js index 006f39ce1026c..3c67594513c0e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -643,6 +643,7 @@ module.exports = { 'x-pack/test/*/*config.*ts', 'x-pack/test/saved_object_api_integration/*/apis/**/*', 'x-pack/test/ui_capabilities/*/tests/**/*', + 'x-pack/test/upgrade_assistant_integration/**/*', 'x-pack/test/performance/**/*.ts', '**/cypress.config.{js,ts}', 'x-pack/test_serverless/**/config*.ts', diff --git a/examples/routing_example/common/index.ts b/examples/routing_example/common/index.ts index c86a994f469f1..b83582b66ff08 100644 --- a/examples/routing_example/common/index.ts +++ b/examples/routing_example/common/index.ts @@ -15,3 +15,9 @@ export const POST_MESSAGE_ROUTE_PATH = '/api/post_message'; // Internal APIs should use the `internal` prefix, instead of the `api` prefix. export const INTERNAL_GET_MESSAGE_BY_ID_ROUTE = '/internal/get_message'; + +export const DEPRECATED_ROUTES = { + REMOVED_ROUTE: '/api/routing_example/d/removed_route', + MIGRATED_ROUTE: '/api/routing_example/d/migrated_route', + VERSIONED_ROUTE: '/api/routing_example/d/versioned', +}; diff --git a/examples/routing_example/server/plugin.ts b/examples/routing_example/server/plugin.ts index cb6a00920dd05..d4036afc58b5b 100644 --- a/examples/routing_example/server/plugin.ts +++ b/examples/routing_example/server/plugin.ts @@ -8,13 +8,14 @@ */ import { Plugin, CoreSetup, CoreStart } from '@kbn/core/server'; -import { registerRoutes } from './routes'; +import { registerRoutes, registerDeprecatedRoutes } from './routes'; export class RoutingExamplePlugin implements Plugin<{}, {}> { public setup(core: CoreSetup) { const router = core.http.createRouter(); registerRoutes(router); + registerDeprecatedRoutes(router); return {}; } diff --git a/examples/routing_example/server/routes/deprecated_routes/index.ts b/examples/routing_example/server/routes/deprecated_routes/index.ts new file mode 100644 index 0000000000000..75dc0261ed1b9 --- /dev/null +++ b/examples/routing_example/server/routes/deprecated_routes/index.ts @@ -0,0 +1,17 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { IRouter } from '@kbn/core/server'; +import { registerDeprecatedRoute } from './unversioned'; +import { registerVersionedDeprecatedRoute } from './versioned'; + +export function registerDeprecatedRoutes(router: IRouter) { + registerDeprecatedRoute(router); + registerVersionedDeprecatedRoute(router); +} diff --git a/examples/routing_example/server/routes/deprecated_routes/unversioned.ts b/examples/routing_example/server/routes/deprecated_routes/unversioned.ts new file mode 100644 index 0000000000000..4e1451a91fc38 --- /dev/null +++ b/examples/routing_example/server/routes/deprecated_routes/unversioned.ts @@ -0,0 +1,62 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { IRouter } from '@kbn/core/server'; +import { schema } from '@kbn/config-schema'; +import { DEPRECATED_ROUTES } from '../../../common'; + +export const registerDeprecatedRoute = (router: IRouter) => { + router.get( + { + path: DEPRECATED_ROUTES.REMOVED_ROUTE, + validate: false, + options: { + access: 'public', + deprecated: { + documentationUrl: 'https://elastic.co/', + severity: 'critical', + reason: { type: 'remove' }, + }, + }, + }, + async (ctx, req, res) => { + return res.ok({ + body: { result: 'Called deprecated route. Check UA to see the deprecation.' }, + }); + } + ); + + router.post( + { + path: DEPRECATED_ROUTES.MIGRATED_ROUTE, + validate: { + body: schema.object({ + test: schema.maybe(schema.boolean()), + }), + }, + options: { + access: 'public', + deprecated: { + documentationUrl: 'https://elastic.co/', + severity: 'critical', + reason: { + type: 'migrate', + newApiMethod: 'GET', + newApiPath: `${DEPRECATED_ROUTES.VERSIONED_ROUTE}?apiVersion=2`, + }, + }, + }, + }, + async (ctx, req, res) => { + return res.ok({ + body: { result: 'Called deprecated route. Check UA to see the deprecation.' }, + }); + } + ); +}; diff --git a/examples/routing_example/server/routes/deprecated_routes/versioned.ts b/examples/routing_example/server/routes/deprecated_routes/versioned.ts new file mode 100644 index 0000000000000..54d6f779f77c3 --- /dev/null +++ b/examples/routing_example/server/routes/deprecated_routes/versioned.ts @@ -0,0 +1,53 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { RequestHandler } from '@kbn/core-http-server'; +import type { IRouter } from '@kbn/core/server'; +import { DEPRECATED_ROUTES } from '../../../common'; + +const createDummyHandler = + (version: string): RequestHandler => + (ctx, req, res) => { + return res.ok({ body: { result: `API version ${version}.` } }); + }; + +export const registerVersionedDeprecatedRoute = (router: IRouter) => { + const versionedRoute = router.versioned.get({ + path: DEPRECATED_ROUTES.VERSIONED_ROUTE, + description: 'Routing example plugin deprecated versioned route.', + access: 'internal', + options: { + excludeFromOAS: true, + }, + enableQueryVersion: true, + }); + + versionedRoute.addVersion( + { + options: { + deprecated: { + documentationUrl: 'https://elastic.co/', + severity: 'warning', + reason: { type: 'bump', newApiVersion: '2' }, + }, + }, + validate: false, + version: '1', + }, + createDummyHandler('1') + ); + + versionedRoute.addVersion( + { + version: '2', + validate: false, + }, + createDummyHandler('2') + ); +}; diff --git a/examples/routing_example/server/routes/index.ts b/examples/routing_example/server/routes/index.ts index 2f43c85b0d471..1c1ccb9e191ff 100644 --- a/examples/routing_example/server/routes/index.ts +++ b/examples/routing_example/server/routes/index.ts @@ -8,3 +8,4 @@ */ export { registerRoutes } from './register_routes'; +export { registerDeprecatedRoutes } from './deprecated_routes'; diff --git a/examples/routing_example/tsconfig.json b/examples/routing_example/tsconfig.json index b35e8dbd34f4a..86bfda9d3d529 100644 --- a/examples/routing_example/tsconfig.json +++ b/examples/routing_example/tsconfig.json @@ -20,5 +20,6 @@ "@kbn/core-http-browser", "@kbn/config-schema", "@kbn/react-kibana-context-render", + "@kbn/core-http-server", ] } diff --git a/oas_docs/bundle.json b/oas_docs/bundle.json index 098fb1de18699..6bca9024e77ea 100644 --- a/oas_docs/bundle.json +++ b/oas_docs/bundle.json @@ -6409,7 +6409,6 @@ }, "/api/fleet/agent-status": { "get": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fagent-status#0", "parameters": [ { @@ -17479,7 +17478,6 @@ ] }, "put": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fagents%2F%7BagentId%7D%2Freassign#0", "parameters": [ { @@ -18179,7 +18177,6 @@ }, "/api/fleet/enrollment-api-keys": { "get": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fenrollment-api-keys#0", "parameters": [ { @@ -18226,7 +18223,6 @@ "tags": [] }, "post": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fenrollment-api-keys#1", "parameters": [ { @@ -18283,7 +18279,6 @@ }, "/api/fleet/enrollment-api-keys/{keyId}": { "delete": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fenrollment-api-keys%2F%7BkeyId%7D#1", "parameters": [ { @@ -18322,7 +18317,6 @@ "tags": [] }, "get": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fenrollment-api-keys%2F%7BkeyId%7D#0", "parameters": [ { @@ -25053,7 +25047,6 @@ }, "/api/fleet/epm/packages/{pkgkey}": { "delete": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#3", "parameters": [ { @@ -25111,7 +25104,6 @@ "tags": [] }, "get": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#0", "parameters": [ { @@ -25173,7 +25165,6 @@ "tags": [] }, "post": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#2", "parameters": [ { @@ -25257,7 +25248,6 @@ "tags": [] }, "put": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#1", "parameters": [ { @@ -40472,7 +40462,6 @@ }, "/api/fleet/service-tokens": { "post": { - "deprecated": true, "description": "Create a service token", "operationId": "%2Fapi%2Ffleet%2Fservice-tokens#0", "parameters": [ diff --git a/oas_docs/bundle.serverless.json b/oas_docs/bundle.serverless.json index 479f79922fea8..a8d428d5404fc 100644 --- a/oas_docs/bundle.serverless.json +++ b/oas_docs/bundle.serverless.json @@ -6409,7 +6409,6 @@ }, "/api/fleet/agent-status": { "get": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fagent-status#0", "parameters": [ { @@ -17479,7 +17478,6 @@ ] }, "put": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fagents%2F%7BagentId%7D%2Freassign#0", "parameters": [ { @@ -18179,7 +18177,6 @@ }, "/api/fleet/enrollment-api-keys": { "get": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fenrollment-api-keys#0", "parameters": [ { @@ -18226,7 +18223,6 @@ "tags": [] }, "post": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fenrollment-api-keys#1", "parameters": [ { @@ -18283,7 +18279,6 @@ }, "/api/fleet/enrollment-api-keys/{keyId}": { "delete": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fenrollment-api-keys%2F%7BkeyId%7D#1", "parameters": [ { @@ -18322,7 +18317,6 @@ "tags": [] }, "get": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fenrollment-api-keys%2F%7BkeyId%7D#0", "parameters": [ { @@ -25053,7 +25047,6 @@ }, "/api/fleet/epm/packages/{pkgkey}": { "delete": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#3", "parameters": [ { @@ -25111,7 +25104,6 @@ "tags": [] }, "get": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#0", "parameters": [ { @@ -25173,7 +25165,6 @@ "tags": [] }, "post": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#2", "parameters": [ { @@ -25257,7 +25248,6 @@ "tags": [] }, "put": { - "deprecated": true, "operationId": "%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#1", "parameters": [ { @@ -40472,7 +40462,6 @@ }, "/api/fleet/service-tokens": { "post": { - "deprecated": true, "description": "Create a service token", "operationId": "%2Fapi%2Ffleet%2Fservice-tokens#0", "parameters": [ diff --git a/oas_docs/output/kibana.serverless.staging.yaml b/oas_docs/output/kibana.serverless.staging.yaml index b1f6938936fbd..3f37d19f8e5e3 100644 --- a/oas_docs/output/kibana.serverless.staging.yaml +++ b/oas_docs/output/kibana.serverless.staging.yaml @@ -15066,7 +15066,6 @@ paths: - Elastic Agents /api/fleet/agent-status: get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fagent-status#0' parameters: - description: The version of the API to use @@ -16769,7 +16768,6 @@ paths: tags: - Elastic Agent actions put: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fagents%2F%7BagentId%7D%2Freassign#0' parameters: - description: The version of the API to use @@ -18622,7 +18620,6 @@ paths: - Fleet enrollment API keys /api/fleet/enrollment-api-keys: get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys#0' parameters: - description: The version of the API to use @@ -18654,7 +18651,6 @@ paths: summary: '' tags: [] post: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys#1' parameters: - description: The version of the API to use @@ -18692,7 +18688,6 @@ paths: tags: [] /api/fleet/enrollment-api-keys/{keyId}: delete: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys%2F%7BkeyId%7D#1' parameters: - description: The version of the API to use @@ -18719,7 +18714,6 @@ paths: summary: '' tags: [] get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys%2F%7BkeyId%7D#0' parameters: - description: The version of the API to use @@ -20434,7 +20428,6 @@ paths: - Elastic Package Manager (EPM) /api/fleet/epm/packages/{pkgkey}: delete: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#3' parameters: - description: The version of the API to use @@ -20473,7 +20466,6 @@ paths: summary: '' tags: [] get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#0' parameters: - description: The version of the API to use @@ -20514,7 +20506,6 @@ paths: summary: '' tags: [] post: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#2' parameters: - description: The version of the API to use @@ -20570,7 +20561,6 @@ paths: summary: '' tags: [] put: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#1' parameters: - description: The version of the API to use @@ -33533,7 +33523,6 @@ paths: - Fleet service tokens /api/fleet/service-tokens: post: - deprecated: true description: Create a service token operationId: '%2Fapi%2Ffleet%2Fservice-tokens#0' parameters: diff --git a/oas_docs/output/kibana.serverless.yaml b/oas_docs/output/kibana.serverless.yaml index b1f6938936fbd..3f37d19f8e5e3 100644 --- a/oas_docs/output/kibana.serverless.yaml +++ b/oas_docs/output/kibana.serverless.yaml @@ -15066,7 +15066,6 @@ paths: - Elastic Agents /api/fleet/agent-status: get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fagent-status#0' parameters: - description: The version of the API to use @@ -16769,7 +16768,6 @@ paths: tags: - Elastic Agent actions put: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fagents%2F%7BagentId%7D%2Freassign#0' parameters: - description: The version of the API to use @@ -18622,7 +18620,6 @@ paths: - Fleet enrollment API keys /api/fleet/enrollment-api-keys: get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys#0' parameters: - description: The version of the API to use @@ -18654,7 +18651,6 @@ paths: summary: '' tags: [] post: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys#1' parameters: - description: The version of the API to use @@ -18692,7 +18688,6 @@ paths: tags: [] /api/fleet/enrollment-api-keys/{keyId}: delete: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys%2F%7BkeyId%7D#1' parameters: - description: The version of the API to use @@ -18719,7 +18714,6 @@ paths: summary: '' tags: [] get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys%2F%7BkeyId%7D#0' parameters: - description: The version of the API to use @@ -20434,7 +20428,6 @@ paths: - Elastic Package Manager (EPM) /api/fleet/epm/packages/{pkgkey}: delete: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#3' parameters: - description: The version of the API to use @@ -20473,7 +20466,6 @@ paths: summary: '' tags: [] get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#0' parameters: - description: The version of the API to use @@ -20514,7 +20506,6 @@ paths: summary: '' tags: [] post: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#2' parameters: - description: The version of the API to use @@ -20570,7 +20561,6 @@ paths: summary: '' tags: [] put: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#1' parameters: - description: The version of the API to use @@ -33533,7 +33523,6 @@ paths: - Fleet service tokens /api/fleet/service-tokens: post: - deprecated: true description: Create a service token operationId: '%2Fapi%2Ffleet%2Fservice-tokens#0' parameters: diff --git a/oas_docs/output/kibana.staging.yaml b/oas_docs/output/kibana.staging.yaml index ac76216c78801..76ccd5ef75775 100644 --- a/oas_docs/output/kibana.staging.yaml +++ b/oas_docs/output/kibana.staging.yaml @@ -18495,7 +18495,6 @@ paths: - Elastic Agents /api/fleet/agent-status: get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fagent-status#0' parameters: - description: The version of the API to use @@ -20198,7 +20197,6 @@ paths: tags: - Elastic Agent actions put: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fagents%2F%7BagentId%7D%2Freassign#0' parameters: - description: The version of the API to use @@ -22051,7 +22049,6 @@ paths: - Fleet enrollment API keys /api/fleet/enrollment-api-keys: get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys#0' parameters: - description: The version of the API to use @@ -22083,7 +22080,6 @@ paths: summary: '' tags: [] post: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys#1' parameters: - description: The version of the API to use @@ -22121,7 +22117,6 @@ paths: tags: [] /api/fleet/enrollment-api-keys/{keyId}: delete: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys%2F%7BkeyId%7D#1' parameters: - description: The version of the API to use @@ -22148,7 +22143,6 @@ paths: summary: '' tags: [] get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys%2F%7BkeyId%7D#0' parameters: - description: The version of the API to use @@ -23863,7 +23857,6 @@ paths: - Elastic Package Manager (EPM) /api/fleet/epm/packages/{pkgkey}: delete: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#3' parameters: - description: The version of the API to use @@ -23902,7 +23895,6 @@ paths: summary: '' tags: [] get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#0' parameters: - description: The version of the API to use @@ -23943,7 +23935,6 @@ paths: summary: '' tags: [] post: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#2' parameters: - description: The version of the API to use @@ -23999,7 +23990,6 @@ paths: summary: '' tags: [] put: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#1' parameters: - description: The version of the API to use @@ -36962,7 +36952,6 @@ paths: - Fleet service tokens /api/fleet/service-tokens: post: - deprecated: true description: Create a service token operationId: '%2Fapi%2Ffleet%2Fservice-tokens#0' parameters: diff --git a/oas_docs/output/kibana.yaml b/oas_docs/output/kibana.yaml index ac76216c78801..76ccd5ef75775 100644 --- a/oas_docs/output/kibana.yaml +++ b/oas_docs/output/kibana.yaml @@ -18495,7 +18495,6 @@ paths: - Elastic Agents /api/fleet/agent-status: get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fagent-status#0' parameters: - description: The version of the API to use @@ -20198,7 +20197,6 @@ paths: tags: - Elastic Agent actions put: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fagents%2F%7BagentId%7D%2Freassign#0' parameters: - description: The version of the API to use @@ -22051,7 +22049,6 @@ paths: - Fleet enrollment API keys /api/fleet/enrollment-api-keys: get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys#0' parameters: - description: The version of the API to use @@ -22083,7 +22080,6 @@ paths: summary: '' tags: [] post: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys#1' parameters: - description: The version of the API to use @@ -22121,7 +22117,6 @@ paths: tags: [] /api/fleet/enrollment-api-keys/{keyId}: delete: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys%2F%7BkeyId%7D#1' parameters: - description: The version of the API to use @@ -22148,7 +22143,6 @@ paths: summary: '' tags: [] get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fenrollment-api-keys%2F%7BkeyId%7D#0' parameters: - description: The version of the API to use @@ -23863,7 +23857,6 @@ paths: - Elastic Package Manager (EPM) /api/fleet/epm/packages/{pkgkey}: delete: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#3' parameters: - description: The version of the API to use @@ -23902,7 +23895,6 @@ paths: summary: '' tags: [] get: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#0' parameters: - description: The version of the API to use @@ -23943,7 +23935,6 @@ paths: summary: '' tags: [] post: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#2' parameters: - description: The version of the API to use @@ -23999,7 +23990,6 @@ paths: summary: '' tags: [] put: - deprecated: true operationId: '%2Fapi%2Ffleet%2Fepm%2Fpackages%2F%7Bpkgkey%7D#1' parameters: - description: The version of the API to use @@ -36962,7 +36952,6 @@ paths: - Fleet service tokens /api/fleet/service-tokens: post: - deprecated: true description: Create a service token operationId: '%2Fapi%2Ffleet%2Fservice-tokens#0' parameters: diff --git a/packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_client.test.ts b/packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_client.test.ts index bfb4f35fa93f1..38777474f136b 100644 --- a/packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_client.test.ts +++ b/packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_client.test.ts @@ -135,7 +135,7 @@ describe('DeprecationsClient', () => { expect(result).toMatchInlineSnapshot(` Object { - "reason": "This deprecation cannot be resolved automatically.", + "reason": "This deprecation cannot be resolved automatically or marked as resolved.", "status": "fail", } `); diff --git a/packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_client.ts b/packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_client.ts index f1f473d726b7e..bdcad406995a9 100644 --- a/packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_client.ts +++ b/packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_client.ts @@ -8,7 +8,7 @@ */ import { i18n } from '@kbn/i18n'; -import type { HttpStart } from '@kbn/core-http-browser'; +import type { HttpFetchOptionsWithPath, HttpStart } from '@kbn/core-http-browser'; import type { DomainDeprecationDetails, DeprecationsGetResponse, @@ -47,23 +47,15 @@ export class DeprecationsClient { return typeof details.correctiveActions.api === 'object'; }; - public resolveDeprecation = async ( + private getResolveFetchDetails = ( details: DomainDeprecationDetails - ): Promise => { + ): HttpFetchOptionsWithPath | undefined => { const { domainId, correctiveActions } = details; - // explicit check required for TS type guard - if (typeof correctiveActions.api !== 'object') { - return { - status: 'fail', - reason: i18n.translate('core.deprecations.noCorrectiveAction', { - defaultMessage: 'This deprecation cannot be resolved automatically.', - }), - }; - } - const { body, method, path, omitContextFromBody = false } = correctiveActions.api; - try { - await this.http.fetch({ + if (correctiveActions.api) { + const { body, method, path, omitContextFromBody = false } = correctiveActions.api; + + return { path, method, asSystemRequest: true, @@ -71,7 +63,54 @@ export class DeprecationsClient { ...body, ...(omitContextFromBody ? {} : { deprecationDetails: { domainId } }), }), - }); + }; + } + + if (correctiveActions.mark_as_resolved_api) { + const { routeMethod, routePath, routeVersion, apiTotalCalls, totalMarkedAsResolved } = + correctiveActions.mark_as_resolved_api; + const incrementBy = apiTotalCalls - totalMarkedAsResolved; + + return { + path: '/api/deprecations/mark_as_resolved', + method: 'POST', + asSystemRequest: true, + body: JSON.stringify({ + domainId, + routeMethod, + routePath, + routeVersion, + incrementBy, + }), + }; + } + }; + + public resolveDeprecation = async ( + details: DomainDeprecationDetails + ): Promise => { + const { correctiveActions } = details; + const noCorrectiveActionFail = { + status: 'fail' as const, + reason: i18n.translate('core.deprecations.noCorrectiveAction', { + defaultMessage: 'This deprecation cannot be resolved automatically or marked as resolved.', + }), + }; + + if ( + typeof correctiveActions.api !== 'object' && + typeof correctiveActions.mark_as_resolved_api !== 'object' + ) { + return noCorrectiveActionFail; + } + + try { + const fetchParams = this.getResolveFetchDetails(details); + if (!fetchParams) { + return noCorrectiveActionFail; + } + + await this.http.fetch(fetchParams); return { status: 'ok' }; } catch (err) { return { diff --git a/packages/core/deprecations/core-deprecations-common/src/types.ts b/packages/core/deprecations/core-deprecations-common/src/types.ts index bf9a4a673d721..85da30b2c1287 100644 --- a/packages/core/deprecations/core-deprecations-common/src/types.ts +++ b/packages/core/deprecations/core-deprecations-common/src/types.ts @@ -22,7 +22,7 @@ export interface BaseDeprecationDetails { * The description message to be displayed for the deprecation. * Check the README for writing deprecations in `src/core/server/deprecations/README.mdx` */ - message: string; + message: string | string[]; /** * levels: * - warning: will not break deployment upon upgrade @@ -39,7 +39,7 @@ export interface BaseDeprecationDetails { * Predefined types are necessary to reduce having similar definitions with different keywords * across kibana deprecations. */ - deprecationType?: 'config' | 'feature'; + deprecationType?: 'config' | 'api' | 'feature'; /** (optional) link to the documentation for more details on the deprecation. */ documentationUrl?: string; /** (optional) specify the fix for this deprecation requires a full kibana restart. */ @@ -70,9 +70,31 @@ export interface BaseDeprecationDetails { * Check the README for writing deprecations in `src/core/server/deprecations/README.mdx` */ manualSteps: string[]; + /** + * (optional) The api to be called to mark the deprecation as resolved + * This corrective action when called should not resolve the deprecation + * instead it helps users track manually deprecated apis + * If the API used does resolve the deprecation use `correctiveActions.api` + */ + mark_as_resolved_api?: { + apiTotalCalls: number; + totalMarkedAsResolved: number; + timestamp: Date | number | string; + routePath: string; + routeMethod: string; + routeVersion?: string; + }; }; } +/** + * @public + */ +export interface ApiDeprecationDetails extends BaseDeprecationDetails { + apiId: string; + deprecationType: 'api'; +} + /** * @public */ @@ -91,7 +113,10 @@ export interface FeatureDeprecationDetails extends BaseDeprecationDetails { /** * @public */ -export type DeprecationsDetails = ConfigDeprecationDetails | FeatureDeprecationDetails; +export type DeprecationsDetails = + | ConfigDeprecationDetails + | ApiDeprecationDetails + | FeatureDeprecationDetails; /** * @public diff --git a/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/api_deprecations.test.ts b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/api_deprecations.test.ts new file mode 100644 index 0000000000000..b431088152f3e --- /dev/null +++ b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/api_deprecations.test.ts @@ -0,0 +1,353 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { DeepPartial } from '@kbn/utility-types'; +import { mockDeprecationsRegistry, mockDeprecationsFactory } from '../mocks'; +import { + registerApiDeprecationsInfo, + buildApiDeprecationId, + createGetApiDeprecations, +} from './api_deprecations'; +import { RouterDeprecatedRouteDetails } from '@kbn/core-http-server'; +import { httpServiceMock } from '@kbn/core-http-server-mocks'; +import { + coreUsageDataServiceMock, + coreUsageStatsClientMock, +} from '@kbn/core-usage-data-server-mocks'; +import _ from 'lodash'; +import { CoreDeprecatedApiUsageStats } from '@kbn/core-usage-data-server'; + +describe('#registerApiDeprecationsInfo', () => { + const deprecationsFactory = mockDeprecationsFactory.create(); + const deprecationsRegistry = mockDeprecationsRegistry.create(); + let usageClientMock: ReturnType; + let http: ReturnType; + let coreUsageData: ReturnType; + + beforeEach(() => { + jest.clearAllMocks(); + usageClientMock = coreUsageStatsClientMock.create(); + http = httpServiceMock.createInternalSetupContract(); + coreUsageData = coreUsageDataServiceMock.createSetupContract(usageClientMock); + }); + + beforeAll(() => { + jest.useFakeTimers().setSystemTime(new Date('2024-10-17T12:06:41.224Z')); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + + it('registers api deprecations', async () => { + deprecationsFactory.getRegistry.mockReturnValue(deprecationsRegistry); + registerApiDeprecationsInfo({ deprecationsFactory, coreUsageData, http }); + + expect(deprecationsFactory.getRegistry).toBeCalledWith('core.api_deprecations'); + expect(deprecationsRegistry.registerDeprecations).toBeCalledTimes(1); + expect(deprecationsRegistry.registerDeprecations).toBeCalledWith({ + getDeprecations: expect.any(Function), + }); + }); + + describe('#createGetApiDeprecations', () => { + const createDeprecatedRouteDetails = ( + overrides?: DeepPartial + ): RouterDeprecatedRouteDetails => + _.merge( + { + routeDeprecationOptions: { + documentationUrl: 'https://fake-url', + severity: 'critical', + reason: { + type: 'remove', + }, + }, + routeMethod: 'get', + routePath: '/api/test/', + routeVersion: '123', + } as RouterDeprecatedRouteDetails, + overrides + ); + + const createApiUsageStat = ( + apiId: string, + overrides?: DeepPartial + ): CoreDeprecatedApiUsageStats => + _.merge( + { + apiId, + totalMarkedAsResolved: 1, + markedAsResolvedLastCalledAt: '2024-10-17T12:06:41.224Z', + apiTotalCalls: 13, + apiLastCalledAt: '2024-09-01T10:06:41.224Z', + }, + overrides + ); + + it('returns removed type deprecated route', async () => { + const getDeprecations = createGetApiDeprecations({ coreUsageData, http }); + const deprecatedRoute = createDeprecatedRouteDetails({ + routePath: '/api/test_removed/', + routeDeprecationOptions: { reason: { type: 'remove' } }, + }); + http.getRegisteredDeprecatedApis.mockReturnValue([deprecatedRoute]); + usageClientMock.getDeprecatedApiUsageStats.mockResolvedValue([ + createApiUsageStat(buildApiDeprecationId(deprecatedRoute)), + ]); + + const deprecations = await getDeprecations(); + expect(deprecations).toMatchInlineSnapshot(` + Array [ + Object { + "apiId": "123|get|/api/test_removed", + "correctiveActions": Object { + "manualSteps": Array [ + "Identify the origin of these API calls.", + "This API no longer exists and no replacement is available. Delete any requests you have that use this API.", + "Check that you are no longer using the old API in any requests, and mark this issue as resolved. It will no longer appear in the Upgrade Assistant unless another call using this API is detected.", + ], + "mark_as_resolved_api": Object { + "apiTotalCalls": 13, + "routeMethod": "get", + "routePath": "/api/test_removed/", + "routeVersion": "123", + "timestamp": 2024-10-17T12:06:41.224Z, + "totalMarkedAsResolved": 1, + }, + }, + "deprecationType": "api", + "documentationUrl": "https://fake-url", + "domainId": "core.routes-deprecations", + "level": "critical", + "message": Array [ + "The API \\"GET /api/test_removed/\\" has been called 13 times. The last call was on Sunday, September 1, 2024 6:06 AM -04:00.", + "This issue has been marked as resolved on Thursday, October 17, 2024 8:06 AM -04:00 but the API has been called 12 times since.", + ], + "title": "The \\"GET /api/test_removed/\\" route is removed", + }, + ] + `); + }); + + it('returns migrated type deprecated route', async () => { + const getDeprecations = createGetApiDeprecations({ coreUsageData, http }); + const deprecatedRoute = createDeprecatedRouteDetails({ + routePath: '/api/test_migrated/', + routeDeprecationOptions: { + reason: { type: 'migrate', newApiMethod: 'post', newApiPath: '/api/new_path' }, + }, + }); + http.getRegisteredDeprecatedApis.mockReturnValue([deprecatedRoute]); + usageClientMock.getDeprecatedApiUsageStats.mockResolvedValue([ + createApiUsageStat(buildApiDeprecationId(deprecatedRoute)), + ]); + + const deprecations = await getDeprecations(); + expect(deprecations).toMatchInlineSnapshot(` + Array [ + Object { + "apiId": "123|get|/api/test_migrated", + "correctiveActions": Object { + "manualSteps": Array [ + "Identify the origin of these API calls.", + "Update the requests to use the following new API instead: \\"POST /api/new_path\\".", + "Check that you are no longer using the old API in any requests, and mark this issue as resolved. It will no longer appear in the Upgrade Assistant unless another call using this API is detected.", + ], + "mark_as_resolved_api": Object { + "apiTotalCalls": 13, + "routeMethod": "get", + "routePath": "/api/test_migrated/", + "routeVersion": "123", + "timestamp": 2024-10-17T12:06:41.224Z, + "totalMarkedAsResolved": 1, + }, + }, + "deprecationType": "api", + "documentationUrl": "https://fake-url", + "domainId": "core.routes-deprecations", + "level": "critical", + "message": Array [ + "The API \\"GET /api/test_migrated/\\" has been called 13 times. The last call was on Sunday, September 1, 2024 6:06 AM -04:00.", + "This issue has been marked as resolved on Thursday, October 17, 2024 8:06 AM -04:00 but the API has been called 12 times since.", + ], + "title": "The \\"GET /api/test_migrated/\\" route is migrated to a different API", + }, + ] + `); + }); + + it('returns bumped type deprecated route', async () => { + const getDeprecations = createGetApiDeprecations({ coreUsageData, http }); + const deprecatedRoute = createDeprecatedRouteDetails({ + routePath: '/api/test_bumped/', + routeDeprecationOptions: { reason: { type: 'bump', newApiVersion: '444' } }, + }); + http.getRegisteredDeprecatedApis.mockReturnValue([deprecatedRoute]); + usageClientMock.getDeprecatedApiUsageStats.mockResolvedValue([ + createApiUsageStat(buildApiDeprecationId(deprecatedRoute)), + ]); + + const deprecations = await getDeprecations(); + expect(deprecations).toMatchInlineSnapshot(` + Array [ + Object { + "apiId": "123|get|/api/test_bumped", + "correctiveActions": Object { + "manualSteps": Array [ + "Identify the origin of these API calls.", + "Update the requests to use the following new version of the API instead: \\"444\\".", + "Check that you are no longer using the old API in any requests, and mark this issue as resolved. It will no longer appear in the Upgrade Assistant unless another call using this API is detected.", + ], + "mark_as_resolved_api": Object { + "apiTotalCalls": 13, + "routeMethod": "get", + "routePath": "/api/test_bumped/", + "routeVersion": "123", + "timestamp": 2024-10-17T12:06:41.224Z, + "totalMarkedAsResolved": 1, + }, + }, + "deprecationType": "api", + "documentationUrl": "https://fake-url", + "domainId": "core.routes-deprecations", + "level": "critical", + "message": Array [ + "The API \\"GET /api/test_bumped/\\" has been called 13 times. The last call was on Sunday, September 1, 2024 6:06 AM -04:00.", + "This issue has been marked as resolved on Thursday, October 17, 2024 8:06 AM -04:00 but the API has been called 12 times since.", + ], + "title": "The \\"GET /api/test_bumped/\\" route has a newer version available", + }, + ] + `); + }); + + it('does not return resolved deprecated route', async () => { + const getDeprecations = createGetApiDeprecations({ coreUsageData, http }); + const deprecatedRoute = createDeprecatedRouteDetails({ routePath: '/api/test_resolved/' }); + http.getRegisteredDeprecatedApis.mockReturnValue([deprecatedRoute]); + usageClientMock.getDeprecatedApiUsageStats.mockResolvedValue([ + createApiUsageStat(buildApiDeprecationId(deprecatedRoute), { + apiTotalCalls: 5, + totalMarkedAsResolved: 5, + }), + ]); + + const deprecations = await getDeprecations(); + expect(deprecations).toEqual([]); + }); + + it('returns never resolved deprecated route', async () => { + const getDeprecations = createGetApiDeprecations({ coreUsageData, http }); + const deprecatedRoute = createDeprecatedRouteDetails({ + routePath: '/api/test_never_resolved/', + }); + http.getRegisteredDeprecatedApis.mockReturnValue([deprecatedRoute]); + usageClientMock.getDeprecatedApiUsageStats.mockResolvedValue([ + createApiUsageStat(buildApiDeprecationId(deprecatedRoute), { + totalMarkedAsResolved: 0, + markedAsResolvedLastCalledAt: undefined, + }), + ]); + + const deprecations = await getDeprecations(); + expect(deprecations).toMatchInlineSnapshot(` + Array [ + Object { + "apiId": "123|get|/api/test_never_resolved", + "correctiveActions": Object { + "manualSteps": Array [ + "Identify the origin of these API calls.", + "This API no longer exists and no replacement is available. Delete any requests you have that use this API.", + "Check that you are no longer using the old API in any requests, and mark this issue as resolved. It will no longer appear in the Upgrade Assistant unless another call using this API is detected.", + ], + "mark_as_resolved_api": Object { + "apiTotalCalls": 13, + "routeMethod": "get", + "routePath": "/api/test_never_resolved/", + "routeVersion": "123", + "timestamp": 2024-10-17T12:06:41.224Z, + "totalMarkedAsResolved": 0, + }, + }, + "deprecationType": "api", + "documentationUrl": "https://fake-url", + "domainId": "core.routes-deprecations", + "level": "critical", + "message": Array [ + "The API \\"GET /api/test_never_resolved/\\" has been called 13 times. The last call was on Sunday, September 1, 2024 6:06 AM -04:00.", + ], + "title": "The \\"GET /api/test_never_resolved/\\" route is removed", + }, + ] + `); + }); + + it('does not return deprecated routes that have never been called', async () => { + const getDeprecations = createGetApiDeprecations({ coreUsageData, http }); + const deprecatedRoute = createDeprecatedRouteDetails({ + routePath: '/api/test_never_resolved/', + }); + http.getRegisteredDeprecatedApis.mockReturnValue([deprecatedRoute]); + usageClientMock.getDeprecatedApiUsageStats.mockResolvedValue([]); + expect(await getDeprecations()).toEqual([]); + + usageClientMock.getDeprecatedApiUsageStats.mockResolvedValue([ + createApiUsageStat(buildApiDeprecationId(deprecatedRoute), { + apiTotalCalls: 0, + apiLastCalledAt: undefined, + totalMarkedAsResolved: 0, + markedAsResolvedLastCalledAt: undefined, + }), + ]); + expect(await getDeprecations()).toEqual([]); + }); + }); +}); + +describe('#buildApiDeprecationId', () => { + it('returns apiDeprecationId string for versioned routes', () => { + const apiDeprecationId = buildApiDeprecationId({ + routeMethod: 'get', + routePath: '/api/test', + routeVersion: '10-10-2023', + }); + expect(apiDeprecationId).toBe('10-10-2023|get|/api/test'); + }); + + it('returns apiDeprecationId string for unversioned routes', () => { + const apiDeprecationId = buildApiDeprecationId({ + routeMethod: 'get', + routePath: '/api/test', + }); + expect(apiDeprecationId).toBe('unversioned|get|/api/test'); + }); + + it('gives the same ID the route method is capitalized or not', () => { + const apiDeprecationId = buildApiDeprecationId({ + // @ts-expect-error + routeMethod: 'GeT', + routePath: '/api/test', + routeVersion: '10-10-2023', + }); + + expect(apiDeprecationId).toBe('10-10-2023|get|/api/test'); + }); + + it('gives the same ID the route path has a trailing slash or not', () => { + const apiDeprecationId = buildApiDeprecationId({ + // @ts-expect-error + routeMethod: 'GeT', + routePath: '/api/test/', + routeVersion: '10-10-2023', + }); + + expect(apiDeprecationId).toBe('10-10-2023|get|/api/test'); + }); +}); diff --git a/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/api_deprecations.ts b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/api_deprecations.ts new file mode 100644 index 0000000000000..45893987ddf92 --- /dev/null +++ b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/api_deprecations.ts @@ -0,0 +1,96 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { InternalHttpServiceSetup } from '@kbn/core-http-server-internal'; +import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal'; +import type { RouterDeprecatedRouteDetails } from '@kbn/core-http-server'; +import { DeprecationsDetails } from '@kbn/core-deprecations-common'; +import type { DeprecationsFactory } from '../deprecations_factory'; +import { + getApiDeprecationMessage, + getApiDeprecationsManualSteps, + getApiDeprecationTitle, +} from './i18n_texts'; + +interface ApiDeprecationsServiceDeps { + deprecationsFactory: DeprecationsFactory; + http: InternalHttpServiceSetup; + coreUsageData: InternalCoreUsageDataSetup; +} + +export const buildApiDeprecationId = ({ + routePath, + routeMethod, + routeVersion, +}: Pick): string => { + return [ + routeVersion || 'unversioned', + routeMethod.toLocaleLowerCase(), + routePath.replace(/\/$/, ''), + ].join('|'); +}; + +export const createGetApiDeprecations = + ({ http, coreUsageData }: Pick) => + async (): Promise => { + const deprecatedRoutes = http.getRegisteredDeprecatedApis(); + const usageClient = coreUsageData.getClient(); + const deprecatedApiUsageStats = await usageClient.getDeprecatedApiUsageStats(); + + return deprecatedApiUsageStats + .filter(({ apiTotalCalls, totalMarkedAsResolved }) => { + return apiTotalCalls > totalMarkedAsResolved; + }) + .filter(({ apiId }) => + deprecatedRoutes.some((routeDetails) => buildApiDeprecationId(routeDetails) === apiId) + ) + .map((apiUsageStats) => { + const { apiId, apiTotalCalls, totalMarkedAsResolved } = apiUsageStats; + const routeDeprecationDetails = deprecatedRoutes.find( + (routeDetails) => buildApiDeprecationId(routeDetails) === apiId + )!; + const { routeVersion, routePath, routeDeprecationOptions, routeMethod } = + routeDeprecationDetails; + + const deprecationLevel = routeDeprecationOptions.severity || 'warning'; + + return { + apiId, + title: getApiDeprecationTitle(routeDeprecationDetails), + level: deprecationLevel, + message: getApiDeprecationMessage(routeDeprecationDetails, apiUsageStats), + documentationUrl: routeDeprecationOptions.documentationUrl, + correctiveActions: { + manualSteps: getApiDeprecationsManualSteps(routeDeprecationDetails), + mark_as_resolved_api: { + routePath, + routeMethod, + routeVersion, + apiTotalCalls, + totalMarkedAsResolved, + timestamp: new Date(), + }, + }, + deprecationType: 'api', + domainId: 'core.routes-deprecations', + }; + }); + }; + +export const registerApiDeprecationsInfo = ({ + deprecationsFactory, + http, + coreUsageData, +}: ApiDeprecationsServiceDeps): void => { + const deprecationsRegistery = deprecationsFactory.getRegistry('core.api_deprecations'); + + deprecationsRegistery.registerDeprecations({ + getDeprecations: createGetApiDeprecations({ http, coreUsageData }), + }); +}; diff --git a/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/config_deprecations.test.ts b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/config_deprecations.test.ts new file mode 100644 index 0000000000000..92d0703c8037e --- /dev/null +++ b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/config_deprecations.test.ts @@ -0,0 +1,115 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { registerConfigDeprecationsInfo } from './config_deprecations'; +import { mockDeprecationsRegistry, mockDeprecationsFactory } from '../mocks'; +import { mockCoreContext } from '@kbn/core-base-server-mocks'; +import { configServiceMock } from '@kbn/config-mocks'; + +describe('#registerConfigDeprecationsInfo', () => { + let coreContext: ReturnType; + + const deprecationsFactory = mockDeprecationsFactory.create(); + const deprecationsRegistry = mockDeprecationsRegistry.create(); + const getDeprecationsContext = mockDeprecationsRegistry.createGetDeprecationsContext(); + + beforeEach(() => { + const configService = configServiceMock.create({ + atPath: { skip_deprecated_settings: ['hello', 'world'] }, + }); + jest.clearAllMocks(); + coreContext = mockCoreContext.create({ configService }); + }); + + it('registers config deprecations', async () => { + coreContext.configService.getHandledDeprecatedConfigs.mockReturnValue([ + [ + 'testDomain', + [ + { + configPath: 'test', + level: 'critical', + message: 'testMessage', + documentationUrl: 'testDocUrl', + correctiveActions: { + manualSteps: [ + 'Using Kibana user management, change all users using the kibana_user role to the kibana_admin role.', + 'Using Kibana role-mapping management, change all role-mappings which assign the kibana_user role to the kibana_admin role.', + ], + }, + }, + ], + ], + ]); + + deprecationsFactory.getRegistry.mockReturnValue(deprecationsRegistry); + registerConfigDeprecationsInfo({ + deprecationsFactory, + configService: coreContext.configService, + }); + + expect(coreContext.configService.getHandledDeprecatedConfigs).toBeCalledTimes(1); + expect(deprecationsFactory.getRegistry).toBeCalledTimes(1); + expect(deprecationsFactory.getRegistry).toBeCalledWith('testDomain'); + expect(deprecationsRegistry.registerDeprecations).toBeCalledTimes(1); + const configDeprecations = + await deprecationsRegistry.registerDeprecations.mock.calls[0][0].getDeprecations( + getDeprecationsContext + ); + expect(configDeprecations).toMatchInlineSnapshot(` + Array [ + Object { + "configPath": "test", + "correctiveActions": Object { + "manualSteps": Array [ + "Using Kibana user management, change all users using the kibana_user role to the kibana_admin role.", + "Using Kibana role-mapping management, change all role-mappings which assign the kibana_user role to the kibana_admin role.", + ], + }, + "deprecationType": "config", + "documentationUrl": "testDocUrl", + "level": "critical", + "message": "testMessage", + "requireRestart": true, + "title": "testDomain has a deprecated setting", + }, + ] + `); + }); + + it('accepts `level` field overrides', async () => { + coreContext.configService.getHandledDeprecatedConfigs.mockReturnValue([ + [ + 'testDomain', + [ + { + configPath: 'test', + message: 'testMessage', + level: 'warning', + correctiveActions: { + manualSteps: ['step a'], + }, + }, + ], + ], + ]); + + deprecationsFactory.getRegistry.mockReturnValue(deprecationsRegistry); + registerConfigDeprecationsInfo({ + deprecationsFactory, + configService: coreContext.configService, + }); + + const configDeprecations = + await deprecationsRegistry.registerDeprecations.mock.calls[0][0].getDeprecations( + getDeprecationsContext + ); + expect(configDeprecations[0].level).toBe('warning'); + }); +}); diff --git a/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/config_deprecations.ts b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/config_deprecations.ts new file mode 100644 index 0000000000000..f9df0edacd9d1 --- /dev/null +++ b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/config_deprecations.ts @@ -0,0 +1,50 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { IConfigService } from '@kbn/config'; +import { DeprecationsFactory } from '../deprecations_factory'; + +interface RegisterConfigDeprecationsInfo { + deprecationsFactory: DeprecationsFactory; + configService: IConfigService; +} + +export const registerConfigDeprecationsInfo = ({ + deprecationsFactory, + configService, +}: RegisterConfigDeprecationsInfo) => { + const handledDeprecatedConfigs = configService.getHandledDeprecatedConfigs(); + + for (const [domainId, deprecationsContexts] of handledDeprecatedConfigs) { + const deprecationsRegistry = deprecationsFactory.getRegistry(domainId); + deprecationsRegistry.registerDeprecations({ + getDeprecations: () => { + return deprecationsContexts.map( + ({ + configPath, + title = `${domainId} has a deprecated setting`, + level, + message, + correctiveActions, + documentationUrl, + }) => ({ + configPath, + title, + level, + message, + correctiveActions, + documentationUrl, + deprecationType: 'config', + requireRestart: true, + }) + ); + }, + }); + } +}; diff --git a/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/i18n_texts.ts b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/i18n_texts.ts new file mode 100644 index 0000000000000..cb1dacc97bd91 --- /dev/null +++ b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/i18n_texts.ts @@ -0,0 +1,132 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { RouterDeprecatedRouteDetails } from '@kbn/core-http-server'; +import { CoreDeprecatedApiUsageStats } from '@kbn/core-usage-data-server'; +import { i18n } from '@kbn/i18n'; +import moment from 'moment'; + +export const getApiDeprecationTitle = (details: RouterDeprecatedRouteDetails) => { + const { routePath, routeMethod, routeDeprecationOptions } = details; + const deprecationType = routeDeprecationOptions.reason.type; + const routeWithMethod = `${routeMethod.toUpperCase()} ${routePath}`; + const deprecationTypeText = i18n.translate('core.deprecations.deprecations.apiDeprecationType', { + defaultMessage: + '{deprecationType, select, remove {is removed} bump {has a newer version available} migrate {is migrated to a different API} other {is deprecated}}', + values: { deprecationType }, + }); + + return i18n.translate('core.deprecations.deprecations.apiDeprecationInfoTitle', { + defaultMessage: 'The "{routeWithMethod}" route {deprecationTypeText}', + values: { + routeWithMethod, + deprecationTypeText, + }, + }); +}; + +export const getApiDeprecationMessage = ( + details: RouterDeprecatedRouteDetails, + apiUsageStats: CoreDeprecatedApiUsageStats +): string[] => { + const { routePath, routeMethod } = details; + const { apiLastCalledAt, apiTotalCalls, markedAsResolvedLastCalledAt, totalMarkedAsResolved } = + apiUsageStats; + + const diff = apiTotalCalls - totalMarkedAsResolved; + const wasResolvedBefore = totalMarkedAsResolved > 0; + const routeWithMethod = `${routeMethod.toUpperCase()} ${routePath}`; + + const messages = [ + i18n.translate('core.deprecations.deprecations.apiDeprecationApiCallsDetailsMessage', { + defaultMessage: + 'The API "{routeWithMethod}" has been called {apiTotalCalls} times. The last call was on {apiLastCalledAt}.', + values: { + routeWithMethod, + apiTotalCalls, + apiLastCalledAt: moment(apiLastCalledAt).format('LLLL Z'), + }, + }), + ]; + + if (wasResolvedBefore) { + messages.push( + i18n.translate( + 'core.deprecations.deprecations.apiDeprecationPreviouslyMarkedAsResolvedMessage', + { + defaultMessage: + 'This issue has been marked as resolved on {markedAsResolvedLastCalledAt} but the API has been called {timeSinceLastResolved, plural, one {# time} other {# times}} since.', + values: { + timeSinceLastResolved: diff, + markedAsResolvedLastCalledAt: moment(markedAsResolvedLastCalledAt).format('LLLL Z'), + }, + } + ) + ); + } + + return messages; +}; + +export const getApiDeprecationsManualSteps = (details: RouterDeprecatedRouteDetails): string[] => { + const { routeDeprecationOptions } = details; + const deprecationType = routeDeprecationOptions.reason.type; + + const manualSteps = [ + i18n.translate('core.deprecations.deprecations.manualSteps.apiIseprecatedStep', { + defaultMessage: 'Identify the origin of these API calls.', + }), + ]; + + switch (deprecationType) { + case 'bump': { + const { newApiVersion } = routeDeprecationOptions.reason; + manualSteps.push( + i18n.translate('core.deprecations.deprecations.manualSteps.bumpDetailsStep', { + defaultMessage: + 'Update the requests to use the following new version of the API instead: "{newApiVersion}".', + values: { newApiVersion }, + }) + ); + break; + } + + case 'remove': { + manualSteps.push( + i18n.translate('core.deprecations.deprecations.manualSteps.removeTypeExplainationStep', { + defaultMessage: + 'This API no longer exists and no replacement is available. Delete any requests you have that use this API.', + }) + ); + break; + } + case 'migrate': { + const { newApiPath, newApiMethod } = routeDeprecationOptions.reason; + const newRouteWithMethod = `${newApiMethod.toUpperCase()} ${newApiPath}`; + + manualSteps.push( + i18n.translate('core.deprecations.deprecations.manualSteps.migrateDetailsStep', { + defaultMessage: + 'Update the requests to use the following new API instead: "{newRouteWithMethod}".', + values: { newRouteWithMethod }, + }) + ); + break; + } + } + + manualSteps.push( + i18n.translate('core.deprecations.deprecations.manualSteps.markAsResolvedStep', { + defaultMessage: + 'Check that you are no longer using the old API in any requests, and mark this issue as resolved. It will no longer appear in the Upgrade Assistant unless another call using this API is detected.', + }) + ); + + return manualSteps; +}; diff --git a/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/index.ts b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/index.ts new file mode 100644 index 0000000000000..aecf3d5b299a2 --- /dev/null +++ b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations/index.ts @@ -0,0 +1,11 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export { buildApiDeprecationId, registerApiDeprecationsInfo } from './api_deprecations'; +export { registerConfigDeprecationsInfo } from './config_deprecations'; diff --git a/packages/core/deprecations/core-deprecations-server-internal/src/deprecations_service.test.mocks.ts b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations_service.test.mocks.ts index 9ce9f52fb7a50..93550539343e3 100644 --- a/packages/core/deprecations/core-deprecations-server-internal/src/deprecations_service.test.mocks.ts +++ b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations_service.test.mocks.ts @@ -14,6 +14,14 @@ export const DeprecationsFactoryMock = jest .fn() .mockImplementation(() => mockedDeprecationFactoryInstance); +export const registerConfigDeprecationsInfoMock = jest.fn(); +export const registerApiDeprecationsInfoMock = jest.fn(); + +jest.doMock('./deprecations', () => ({ + registerConfigDeprecationsInfo: registerConfigDeprecationsInfoMock, + registerApiDeprecationsInfo: registerApiDeprecationsInfoMock, +})); + jest.doMock('./deprecations_factory', () => ({ DeprecationsFactory: DeprecationsFactoryMock, })); diff --git a/packages/core/deprecations/core-deprecations-server-internal/src/deprecations_service.test.ts b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations_service.test.ts index 14a131ca8e563..39c299d980531 100644 --- a/packages/core/deprecations/core-deprecations-server-internal/src/deprecations_service.test.ts +++ b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations_service.test.ts @@ -7,22 +7,24 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { DeprecationsFactoryMock } from './deprecations_service.test.mocks'; - +import { + DeprecationsFactoryMock, + registerConfigDeprecationsInfoMock, +} from './deprecations_service.test.mocks'; import { mockCoreContext } from '@kbn/core-base-server-mocks'; import { httpServiceMock } from '@kbn/core-http-server-mocks'; +import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks'; import { configServiceMock } from '@kbn/config-mocks'; import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; import { DeprecationsService, DeprecationsSetupDeps } from './deprecations_service'; -import { mockDeprecationsRegistry, mockDeprecationsFactory } from './mocks'; -/* eslint-disable dot-notation */ describe('DeprecationsService', () => { let coreContext: ReturnType; let http: ReturnType; let router: ReturnType; let deprecationsCoreSetupDeps: DeprecationsSetupDeps; + let coreUsageData: ReturnType; beforeEach(() => { const configService = configServiceMock.create({ @@ -30,14 +32,16 @@ describe('DeprecationsService', () => { }); coreContext = mockCoreContext.create({ configService }); http = httpServiceMock.createInternalSetupContract(); + coreUsageData = coreUsageDataServiceMock.createSetupContract(); router = httpServiceMock.createRouter(); http.createRouter.mockReturnValue(router); - deprecationsCoreSetupDeps = { http }; + deprecationsCoreSetupDeps = { http, coreUsageData }; }); afterEach(() => { jest.clearAllMocks(); DeprecationsFactoryMock.mockClear(); + registerConfigDeprecationsInfoMock.mockClear(); }); describe('#setup', () => { @@ -53,10 +57,8 @@ describe('DeprecationsService', () => { it('calls registerConfigDeprecationsInfo', async () => { const deprecationsService = new DeprecationsService(coreContext); - const mockRegisterConfigDeprecationsInfo = jest.fn(); - deprecationsService['registerConfigDeprecationsInfo'] = mockRegisterConfigDeprecationsInfo; await deprecationsService.setup(deprecationsCoreSetupDeps); - expect(mockRegisterConfigDeprecationsInfo).toBeCalledTimes(1); + expect(registerConfigDeprecationsInfoMock).toBeCalledTimes(1); }); it('creates DeprecationsFactory with the correct parameters', async () => { @@ -89,92 +91,4 @@ describe('DeprecationsService', () => { }); }); }); - - describe('#registerConfigDeprecationsInfo', () => { - const deprecationsFactory = mockDeprecationsFactory.create(); - const deprecationsRegistry = mockDeprecationsRegistry.create(); - const getDeprecationsContext = mockDeprecationsRegistry.createGetDeprecationsContext(); - - it('registers config deprecations', async () => { - const deprecationsService = new DeprecationsService(coreContext); - coreContext.configService.getHandledDeprecatedConfigs.mockReturnValue([ - [ - 'testDomain', - [ - { - configPath: 'test', - level: 'critical', - message: 'testMessage', - documentationUrl: 'testDocUrl', - correctiveActions: { - manualSteps: [ - 'Using Kibana user management, change all users using the kibana_user role to the kibana_admin role.', - 'Using Kibana role-mapping management, change all role-mappings which assign the kibana_user role to the kibana_admin role.', - ], - }, - }, - ], - ], - ]); - - deprecationsFactory.getRegistry.mockReturnValue(deprecationsRegistry); - deprecationsService['registerConfigDeprecationsInfo'](deprecationsFactory); - - expect(coreContext.configService.getHandledDeprecatedConfigs).toBeCalledTimes(1); - expect(deprecationsFactory.getRegistry).toBeCalledTimes(1); - expect(deprecationsFactory.getRegistry).toBeCalledWith('testDomain'); - expect(deprecationsRegistry.registerDeprecations).toBeCalledTimes(1); - const configDeprecations = - await deprecationsRegistry.registerDeprecations.mock.calls[0][0].getDeprecations( - getDeprecationsContext - ); - expect(configDeprecations).toMatchInlineSnapshot(` - Array [ - Object { - "configPath": "test", - "correctiveActions": Object { - "manualSteps": Array [ - "Using Kibana user management, change all users using the kibana_user role to the kibana_admin role.", - "Using Kibana role-mapping management, change all role-mappings which assign the kibana_user role to the kibana_admin role.", - ], - }, - "deprecationType": "config", - "documentationUrl": "testDocUrl", - "level": "critical", - "message": "testMessage", - "requireRestart": true, - "title": "testDomain has a deprecated setting", - }, - ] - `); - }); - - it('accepts `level` field overrides', async () => { - const deprecationsService = new DeprecationsService(coreContext); - coreContext.configService.getHandledDeprecatedConfigs.mockReturnValue([ - [ - 'testDomain', - [ - { - configPath: 'test', - message: 'testMessage', - level: 'warning', - correctiveActions: { - manualSteps: ['step a'], - }, - }, - ], - ], - ]); - - deprecationsFactory.getRegistry.mockReturnValue(deprecationsRegistry); - deprecationsService['registerConfigDeprecationsInfo'](deprecationsFactory); - - const configDeprecations = - await deprecationsRegistry.registerDeprecations.mock.calls[0][0].getDeprecations( - getDeprecationsContext - ); - expect(configDeprecations[0].level).toBe('warning'); - }); - }); }); diff --git a/packages/core/deprecations/core-deprecations-server-internal/src/deprecations_service.ts b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations_service.ts index 4c8f564943ab1..c0a0ef0f88c7b 100644 --- a/packages/core/deprecations/core-deprecations-server-internal/src/deprecations_service.ts +++ b/packages/core/deprecations/core-deprecations-server-internal/src/deprecations_service.ts @@ -19,9 +19,11 @@ import type { DeprecationRegistryProvider, DeprecationsClient, } from '@kbn/core-deprecations-server'; +import { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal'; import { DeprecationsFactory } from './deprecations_factory'; import { registerRoutes } from './routes'; import { config as deprecationConfig, DeprecationConfigType } from './deprecation_config'; +import { registerApiDeprecationsInfo, registerConfigDeprecationsInfo } from './deprecations'; export interface InternalDeprecationsServiceStart { /** @@ -40,6 +42,7 @@ export type InternalDeprecationsServiceSetup = DeprecationRegistryProvider; /** @internal */ export interface DeprecationsSetupDeps { http: InternalHttpServiceSetup; + coreUsageData: InternalCoreUsageDataSetup; } /** @internal */ @@ -55,7 +58,10 @@ export class DeprecationsService this.configService = coreContext.configService; } - public async setup({ http }: DeprecationsSetupDeps): Promise { + public async setup({ + http, + coreUsageData, + }: DeprecationsSetupDeps): Promise { this.logger.debug('Setting up Deprecations service'); const config = await firstValueFrom( @@ -69,8 +75,18 @@ export class DeprecationsService }, }); - registerRoutes({ http }); - this.registerConfigDeprecationsInfo(this.deprecationsFactory); + registerRoutes({ http, coreUsageData }); + + registerConfigDeprecationsInfo({ + deprecationsFactory: this.deprecationsFactory, + configService: this.configService, + }); + + registerApiDeprecationsInfo({ + deprecationsFactory: this.deprecationsFactory, + http, + coreUsageData, + }); const deprecationsFactory = this.deprecationsFactory; return { @@ -87,6 +103,7 @@ export class DeprecationsService if (!this.deprecationsFactory) { throw new Error('`setup` must be called before `start`'); } + return { asScopedToClient: this.createScopedDeprecations(), }; @@ -107,35 +124,4 @@ export class DeprecationsService }; }; } - - private registerConfigDeprecationsInfo(deprecationsFactory: DeprecationsFactory) { - const handledDeprecatedConfigs = this.configService.getHandledDeprecatedConfigs(); - - for (const [domainId, deprecationsContexts] of handledDeprecatedConfigs) { - const deprecationsRegistry = deprecationsFactory.getRegistry(domainId); - deprecationsRegistry.registerDeprecations({ - getDeprecations: () => { - return deprecationsContexts.map( - ({ - configPath, - title = `${domainId} has a deprecated setting`, - level, - message, - correctiveActions, - documentationUrl, - }) => ({ - configPath, - title, - level, - message, - correctiveActions, - documentationUrl, - deprecationType: 'config', - requireRestart: true, - }) - ); - }, - }); - } - } } diff --git a/packages/core/deprecations/core-deprecations-server-internal/src/routes/index.ts b/packages/core/deprecations/core-deprecations-server-internal/src/routes/index.ts index e1a925610327f..f812bbfd15acd 100644 --- a/packages/core/deprecations/core-deprecations-server-internal/src/routes/index.ts +++ b/packages/core/deprecations/core-deprecations-server-internal/src/routes/index.ts @@ -8,10 +8,22 @@ */ import type { InternalHttpServiceSetup } from '@kbn/core-http-server-internal'; +import { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal'; import type { InternalDeprecationRequestHandlerContext } from '../internal_types'; import { registerGetRoute } from './get'; +import { registerMarkAsResolvedRoute } from './resolve_deprecated_api'; +import { registerApiDeprecationsPostValidationHandler } from './post_validation_handler'; -export function registerRoutes({ http }: { http: InternalHttpServiceSetup }) { +export function registerRoutes({ + http, + coreUsageData, +}: { + http: InternalHttpServiceSetup; + coreUsageData: InternalCoreUsageDataSetup; +}) { const router = http.createRouter('/api/deprecations'); registerGetRoute(router); + + registerApiDeprecationsPostValidationHandler({ http, coreUsageData }); + registerMarkAsResolvedRoute(router, { coreUsageData }); } diff --git a/packages/core/deprecations/core-deprecations-server-internal/src/routes/post_validation_handler.ts b/packages/core/deprecations/core-deprecations-server-internal/src/routes/post_validation_handler.ts new file mode 100644 index 0000000000000..b93c17af2f536 --- /dev/null +++ b/packages/core/deprecations/core-deprecations-server-internal/src/routes/post_validation_handler.ts @@ -0,0 +1,51 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-server-internal'; +import type { CoreKibanaRequest } from '@kbn/core-http-router-server-internal'; +import type { InternalHttpServiceSetup } from '@kbn/core-http-server-internal'; +import { isObject } from 'lodash'; +import { RouteDeprecationInfo } from '@kbn/core-http-server/src/router/route'; +import { buildApiDeprecationId } from '../deprecations'; + +interface Dependencies { + coreUsageData: InternalCoreUsageDataSetup; + http: InternalHttpServiceSetup; +} + +/** + * listens to http post validation events to increment deprecated api calls + * This will keep track of any called deprecated API. + */ +export const registerApiDeprecationsPostValidationHandler = ({ + coreUsageData, + http, +}: Dependencies) => { + http.registerOnPostValidation(createRouteDeprecationsHandler({ coreUsageData })); +}; + +export function createRouteDeprecationsHandler({ + coreUsageData, +}: { + coreUsageData: InternalCoreUsageDataSetup; +}) { + return (req: CoreKibanaRequest, { deprecated }: { deprecated?: RouteDeprecationInfo }) => { + if (deprecated && isObject(deprecated) && req.route.routePath) { + const counterName = buildApiDeprecationId({ + routeMethod: req.route.method, + routePath: req.route.routePath, + routeVersion: req.apiVersion, + }); + + const client = coreUsageData.getClient(); + // no await we just fire it off. + void client.incrementDeprecatedApi(counterName, { resolved: false }); + } + }; +} diff --git a/packages/core/deprecations/core-deprecations-server-internal/src/routes/resolve_deprecated_api.ts b/packages/core/deprecations/core-deprecations-server-internal/src/routes/resolve_deprecated_api.ts new file mode 100644 index 0000000000000..840bc5ac22d23 --- /dev/null +++ b/packages/core/deprecations/core-deprecations-server-internal/src/routes/resolve_deprecated_api.ts @@ -0,0 +1,52 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { schema } from '@kbn/config-schema'; +import { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal'; +import type { InternalDeprecationRouter } from '../internal_types'; +import { buildApiDeprecationId } from '../deprecations'; + +export const registerMarkAsResolvedRoute = ( + router: InternalDeprecationRouter, + { coreUsageData }: { coreUsageData: InternalCoreUsageDataSetup } +) => { + router.post( + { + path: '/mark_as_resolved', + validate: { + body: schema.object({ + domainId: schema.string(), + routePath: schema.string(), + routeMethod: schema.oneOf([ + schema.literal('post'), + schema.literal('put'), + schema.literal('delete'), + schema.literal('patch'), + schema.literal('get'), + schema.literal('options'), + ]), + routeVersion: schema.maybe(schema.string()), + incrementBy: schema.number(), + }), + }, + }, + async (_, req, res) => { + const usageClient = coreUsageData.getClient(); + const { routeMethod, routePath, routeVersion, incrementBy } = req.body; + const counterName = buildApiDeprecationId({ + routeMethod, + routePath, + routeVersion, + }); + + await usageClient.incrementDeprecatedApi(counterName, { resolved: true, incrementBy }); + return res.ok(); + } + ); +}; diff --git a/packages/core/deprecations/core-deprecations-server-internal/tsconfig.json b/packages/core/deprecations/core-deprecations-server-internal/tsconfig.json index ba06a3e9ec2f7..02be6b7cb8198 100644 --- a/packages/core/deprecations/core-deprecations-server-internal/tsconfig.json +++ b/packages/core/deprecations/core-deprecations-server-internal/tsconfig.json @@ -33,6 +33,11 @@ "@kbn/core-elasticsearch-server-mocks", "@kbn/core-http-server", "@kbn/core-elasticsearch-client-server-mocks", + "@kbn/core-usage-data-base-server-internal", + "@kbn/core-usage-data-server", + "@kbn/core-usage-data-server-internal", + "@kbn/core-usage-data-server-mocks", + "@kbn/core-http-router-server-internal", ], "exclude": [ "target/**/*", diff --git a/packages/core/http/core-http-router-server-internal/index.ts b/packages/core/http/core-http-router-server-internal/index.ts index 6c684d5f8169c..6aa6ac117f533 100644 --- a/packages/core/http/core-http-router-server-internal/index.ts +++ b/packages/core/http/core-http-router-server-internal/index.ts @@ -13,16 +13,10 @@ export { CoreVersionedRouter, ALLOWED_PUBLIC_VERSION, unwrapVersionedResponseBodyValidation, - type VersionedRouterRoute, type HandlerResolutionStrategy, } from './src/versioned_router'; export { Router } from './src/router'; -export type { - RouterOptions, - InternalRegistrar, - InternalRegistrarOptions, - InternalRouterRoute, -} from './src/router'; +export type { RouterOptions, InternalRegistrar, InternalRegistrarOptions } from './src/router'; export { isKibanaRequest, isRealRequest, ensureRawRequest, CoreKibanaRequest } from './src/request'; export { isSafeMethod } from './src/route'; export { HapiResponseAdapter } from './src/response_adapter'; diff --git a/packages/core/http/core-http-router-server-internal/src/request.ts b/packages/core/http/core-http-router-server-internal/src/request.ts index 286b900fc24f5..9f89f1a70bb47 100644 --- a/packages/core/http/core-http-router-server-internal/src/request.ts +++ b/packages/core/http/core-http-router-server-internal/src/request.ts @@ -143,6 +143,8 @@ export class CoreKibanaRequest< public readonly rewrittenUrl?: URL; /** {@inheritDoc KibanaRequest.httpVersion} */ public readonly httpVersion: string; + /** {@inheritDoc KibanaRequest.apiVersion} */ + public readonly apiVersion: undefined; /** {@inheritDoc KibanaRequest.protocol} */ public readonly protocol: HttpProtocol; /** {@inheritDoc KibanaRequest.authzResult} */ @@ -185,6 +187,7 @@ export class CoreKibanaRequest< }); this.httpVersion = isRealReq ? request.raw.req.httpVersion : '1.0'; + this.apiVersion = undefined; this.protocol = getProtocolFromHttpVersion(this.httpVersion); this.route = deepFreeze(this.getRouteInfo(request)); @@ -216,6 +219,7 @@ export class CoreKibanaRequest< }, route: this.route, authzResult: this.authzResult, + apiVersion: this.apiVersion, }; } @@ -252,7 +256,14 @@ export class CoreKibanaRequest< } = request.route?.settings?.payload || {}; // the socket is undefined when using @hapi/shot, or when a "fake request" is used - const socketTimeout = isRealRawRequest(request) ? request.raw.req.socket?.timeout : undefined; + let socketTimeout: undefined | number; + let routePath: undefined | string; + + if (isRealRawRequest(request)) { + socketTimeout = request.raw.req.socket?.timeout; + routePath = request.route.path; + } + const options = { authRequired: this.getAuthRequired(request), // TypeScript note: Casting to `RouterOptions` to fix the following error: @@ -266,6 +277,8 @@ export class CoreKibanaRequest< xsrfRequired: ((request.route?.settings as RouteOptions)?.app as KibanaRouteOptions)?.xsrfRequired ?? true, // some places in LP call KibanaRequest.from(request) manually. remove fallback to true before v8 + deprecated: ((request.route?.settings as RouteOptions)?.app as KibanaRouteOptions) + ?.deprecated, access: this.getAccess(request), tags: request.route?.settings?.tags || [], security: this.getSecurity(request), @@ -285,6 +298,7 @@ export class CoreKibanaRequest< return { path: request.path ?? '/', + routePath, method, options, }; diff --git a/packages/core/http/core-http-router-server-internal/src/router.test.ts b/packages/core/http/core-http-router-server-internal/src/router.test.ts index f611e3b6308fe..2c702fb3ef702 100644 --- a/packages/core/http/core-http-router-server-internal/src/router.test.ts +++ b/packages/core/http/core-http-router-server-internal/src/router.test.ts @@ -50,7 +50,11 @@ describe('Router', () => { path: '/', validate: { body: validation, query: validation, params: validation }, options: { - deprecated: true, + deprecated: { + documentationUrl: 'https://fake-url.com', + reason: { type: 'remove' }, + severity: 'warning', + }, discontinued: 'post test discontinued', summary: 'post test summary', description: 'post test description', @@ -72,7 +76,11 @@ describe('Router', () => { validationSchemas: { body: validation, query: validation, params: validation }, isVersioned: false, options: { - deprecated: true, + deprecated: { + documentationUrl: 'https://fake-url.com', + reason: { type: 'remove' }, + severity: 'warning', + }, discontinued: 'post test discontinued', summary: 'post test summary', description: 'post test description', @@ -93,7 +101,7 @@ describe('Router', () => { validate: { body: validation, query: validation, params: validation }, }, (context, req, res) => res.ok(), - { isVersioned: true } + { isVersioned: true, events: false } ); router.get( { diff --git a/packages/core/http/core-http-router-server-internal/src/router.ts b/packages/core/http/core-http-router-server-internal/src/router.ts index 36f324236a4d2..e7ad85fcda33a 100644 --- a/packages/core/http/core-http-router-server-internal/src/router.ts +++ b/packages/core/http/core-http-router-server-internal/src/router.ts @@ -7,6 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { EventEmitter } from 'node:events'; import type { Request, ResponseToolkit } from '@hapi/hapi'; import apm from 'elastic-apm-node'; import { isConfigSchema } from '@kbn/config-schema'; @@ -32,6 +33,7 @@ import { isZod } from '@kbn/zod'; import { validBodyOutput, getRequestValidation } from '@kbn/core-http-server'; import type { RouteSecurityGetter } from '@kbn/core-http-server'; import type { DeepPartial } from '@kbn/utility-types'; +import { RouteDeprecationInfo } from '@kbn/core-http-server/src/router/route'; import { RouteValidator } from './validator'; import { ALLOWED_PUBLIC_VERSION, CoreVersionedRouter } from './versioned_router'; import { CoreKibanaRequest } from './request'; @@ -52,7 +54,7 @@ export type ContextEnhancer< Context extends RequestHandlerContextBase > = (handler: RequestHandler) => RequestHandlerEnhanced; -function getRouteFullPath(routerPath: string, routePath: string) { +export function getRouteFullPath(routerPath: string, routePath: string) { // If router's path ends with slash and route's path starts with slash, // we should omit one of them to have a valid concatenated path. const routePathStartIndex = routerPath.endsWith('/') && routePath.startsWith('/') ? 1 : 0; @@ -147,7 +149,13 @@ export interface RouterOptions { /** @internal */ export interface InternalRegistrarOptions { + /** @default false */ isVersioned: boolean; + /** + * Whether this route should emit "route events" like postValidate + * @default true + */ + events: boolean; } /** @internal */ @@ -166,15 +174,9 @@ export type InternalRegistrar ReturnType>; /** @internal */ -export interface InternalRouterRoute extends RouterRoute { - readonly isVersioned: boolean; -} - -/** @internal */ -interface InternalGetRoutesOptions { - /** @default false */ - excludeVersionedRoutes?: boolean; -} +type RouterEvents = + /** Called after route validation, regardless of success or failure */ + 'onPostValidate'; /** * @internal @@ -182,7 +184,8 @@ interface InternalGetRoutesOptions { export class Router implements IRouter { - public routes: Array> = []; + private static ee = new EventEmitter(); + public routes: Array> = []; public pluginId?: symbol; public get: InternalRegistrar<'get', Context>; public post: InternalRegistrar<'post', Context>; @@ -202,25 +205,27 @@ export class Router( route: InternalRouteConfig, handler: RequestHandler, - { isVersioned }: InternalRegistrarOptions = { isVersioned: false } + { isVersioned, events }: InternalRegistrarOptions = { isVersioned: false, events: true } ) => { route = prepareRouteConfigValidation(route); const routeSchemas = routeSchemasFromRouteConfig(route, method); - const isPublicUnversionedApi = + const isPublicUnversionedRoute = !isVersioned && route.options?.access === 'public' && // We do not consider HTTP resource routes as APIs route.options?.httpResource !== true; this.routes.push({ - handler: async (req, responseToolkit) => - await this.handle({ + handler: async (req, responseToolkit) => { + return await this.handle({ routeSchemas, request: req, responseToolkit, - isPublicUnversionedApi, + isPublicUnversionedRoute, handler: this.enhanceWithContext(handler), - }), + emit: events ? { onPostValidation: this.emitPostValidate } : undefined, + }); + }, method, path: getRouteFullPath(this.routerPath, route.path), options: validOptions(method, route), @@ -229,6 +234,8 @@ export class Router, route.options), validationSchemas: route.validate, + // @ts-ignore using isVersioned: false in the type instead of boolean + // for typeguarding between versioned and unversioned RouterRoute types isVersioned, }); }; @@ -240,7 +247,15 @@ export class Router void) { + Router.ee.on(event, cb); + } + + public static off(event: RouterEvents, cb: (req: CoreKibanaRequest, ...args: any[]) => void) { + Router.ee.off(event, cb); + } + + public getRoutes({ excludeVersionedRoutes }: { excludeVersionedRoutes?: boolean } = {}) { if (excludeVersionedRoutes) { return this.routes.filter((route) => !route.isVersioned); } @@ -269,16 +284,29 @@ export class Router { + const postValidate: RouterEvents = 'onPostValidate'; + Router.ee.emit(postValidate, request, routeOptions); + }; + private async handle({ routeSchemas, request, responseToolkit, - isPublicUnversionedApi, + emit, + isPublicUnversionedRoute, handler, }: { request: Request; responseToolkit: ResponseToolkit; - isPublicUnversionedApi: boolean; + emit?: { + onPostValidation: (req: KibanaRequest, reqOptions: any) => void; + }; + isPublicUnversionedRoute: boolean; handler: RequestHandlerEnhanced< P, Q, @@ -300,18 +328,24 @@ export class Router { expect(router.post).toHaveBeenCalledWith( expect.objectContaining(expectedRouteConfig), expect.any(Function), - { isVersioned: true } + { isVersioned: true, events: false } ); }); diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.ts index e9a9e60de8193..45654696ba0cf 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.ts @@ -18,7 +18,6 @@ import type { KibanaRequest, KibanaResponseFactory, ApiVersion, - AddVersionOpts, VersionedRoute, VersionedRouteConfig, IKibanaResponse, @@ -26,9 +25,10 @@ import type { RouteSecurityGetter, RouteSecurity, RouteMethod, + VersionedRouterRoute, } from '@kbn/core-http-server'; import type { Mutable } from 'utility-types'; -import type { HandlerResolutionStrategy, Method, VersionedRouterRoute } from './types'; +import type { HandlerResolutionStrategy, Method, Options } from './types'; import { validate } from './validate'; import { @@ -46,8 +46,6 @@ import { prepareVersionedRouteValidation, unwrapVersionedResponseBodyValidation import type { RequestLike } from './route_version_utils'; import { Router } from '../router'; -type Options = AddVersionOpts; - interface InternalVersionedRouteConfig extends VersionedRouteConfig { isDev: boolean; useVersionResolutionStrategyForInternalPaths: Map; @@ -68,7 +66,7 @@ function extractValidationSchemaFromHandler(handler: VersionedRouterRoute['handl } export class CoreVersionedRoute implements VersionedRoute { - private readonly handlers = new Map< + public readonly handlers = new Map< ApiVersion, { fn: RequestHandler; @@ -127,7 +125,7 @@ export class CoreVersionedRoute implements VersionedRoute { security: this.getSecurity, }, this.requestHandler, - { isVersioned: true } + { isVersioned: true, events: false } ); } @@ -181,6 +179,7 @@ export class CoreVersionedRoute implements VersionedRoute { } const req = originalReq as Mutable; const version = this.getVersion(req); + req.apiVersion = version; if (!version) { return res.badRequest({ @@ -221,6 +220,8 @@ export class CoreVersionedRoute implements VersionedRoute { req.params = params; req.query = query; } catch (e) { + // Emit onPostValidation even if validation fails. + this.router.emitPostValidate(req, handler.options.options); return res.badRequest({ body: e.message, headers: getVersionHeader(version) }); } } else { @@ -230,6 +231,8 @@ export class CoreVersionedRoute implements VersionedRoute { req.query = {}; } + this.router.emitPostValidate(req, handler.options.options); + const response = await handler.fn(ctx, req, res); if (this.isDev && validation?.response?.[response.status]?.body) { @@ -280,7 +283,6 @@ export class CoreVersionedRoute implements VersionedRoute { public addVersion(options: Options, handler: RequestHandler): VersionedRoute { this.validateVersion(options.version); options = prepareVersionedRouteValidation(options); - this.handlers.set(options.version, { fn: handler, options, diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.test.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.test.ts index d56de36ba9a29..a3ffffc0ef219 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.test.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.test.ts @@ -36,7 +36,6 @@ describe('Versioned router', () => { versionedRouter.get({ path: '/test/{id}', access: 'internal', - deprecated: true, discontinued: 'x.y.z', }); versionedRouter.post({ @@ -50,16 +49,17 @@ describe('Versioned router', () => { Array [ Object { "handlers": Array [], + "isVersioned": true, "method": "get", "options": Object { "access": "internal", - "deprecated": true, "discontinued": "x.y.z", }, "path": "/test/{id}", }, Object { "handlers": Array [], + "isVersioned": true, "method": "post", "options": Object { "access": "internal", @@ -70,6 +70,7 @@ describe('Versioned router', () => { }, Object { "handlers": Array [], + "isVersioned": true, "method": "delete", "options": Object { "access": "internal", diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts index e9272e17ab18e..ef1f8255420ae 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts @@ -7,11 +7,16 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { VersionedRouter, VersionedRoute, VersionedRouteConfig } from '@kbn/core-http-server'; +import type { + VersionedRouter, + VersionedRoute, + VersionedRouteConfig, + VersionedRouterRoute, +} from '@kbn/core-http-server'; import { omit } from 'lodash'; import { CoreVersionedRoute } from './core_versioned_route'; -import type { HandlerResolutionStrategy, Method, VersionedRouterRoute } from './types'; -import type { Router } from '../router'; +import type { HandlerResolutionStrategy, Method } from './types'; +import { getRouteFullPath, type Router } from '../router'; /** @internal */ export interface VersionedRouterArgs { @@ -98,10 +103,11 @@ export class CoreVersionedRouter implements VersionedRouter { public getRoutes(): VersionedRouterRoute[] { return [...this.routes].map((route) => { return { - path: route.path, + path: getRouteFullPath(this.router.routerPath, route.path), method: route.method, options: omit(route.options, 'path'), handlers: route.getHandlers(), + isVersioned: true, }; }); } diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/index.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/index.ts index e283fcc2a590f..14c08076faae0 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/index.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/index.ts @@ -9,6 +9,6 @@ export { resolvers as versionHandlerResolvers } from './handler_resolvers'; export { CoreVersionedRouter } from './core_versioned_router'; -export type { HandlerResolutionStrategy, VersionedRouterRoute } from './types'; +export type { HandlerResolutionStrategy } from './types'; export { ALLOWED_PUBLIC_VERSION } from './route_version_utils'; export { unwrapVersionedResponseBodyValidation } from './util'; diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/mocks.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/mocks.ts index 5a958fa9251f7..36a672ca6a9f7 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/mocks.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/mocks.ts @@ -20,6 +20,7 @@ export function createRouter(opts: CreateMockRouterOptions = {}) { put: jest.fn(), getRoutes: jest.fn(), handleLegacyErrors: jest.fn(), + emitPostValidate: jest.fn(), patch: jest.fn(), routerPath: '', versioned: {} as any, diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/types.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/types.ts index aec1f8b0cf0ab..bdcaae486cd9c 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/types.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/types.ts @@ -7,25 +7,12 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { - AddVersionOpts, - RequestHandler, - RouteMethod, - VersionedRouteConfig, -} from '@kbn/core-http-server'; +import type { AddVersionOpts, RouteMethod } from '@kbn/core-http-server'; export type Method = Exclude; /** @internal */ -export interface VersionedRouterRoute { - method: string; - path: string; - options: Omit, 'path'>; - handlers: Array<{ - fn: RequestHandler; - options: AddVersionOpts; - }>; -} +export type Options = AddVersionOpts; /** * Specifies resolution strategy to use if a request does not provide a version. diff --git a/packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts b/packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts index 987288cf372bd..fec80b06963a0 100644 --- a/packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts +++ b/packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts @@ -14,6 +14,7 @@ import type { AddVersionOpts, RequestHandler, KibanaResponseFactory, + VersionedRouterRoute, } from '@kbn/core-http-server'; export type MockedVersionedRoute = jest.Mocked; @@ -24,14 +25,16 @@ const createMockVersionedRoute = (): MockedVersionedRoute => { return api; }; +type VersionedRouterMethods = keyof Omit; + export type MockedVersionedRouter = jest.Mocked> & { - getRoute: (method: keyof VersionedRouter, path: string) => RegisteredVersionedRoute; + getRoute: (method: VersionedRouterMethods, path: string) => RegisteredVersionedRoute; }; const createMethodHandler = () => jest.fn((_) => createMockVersionedRoute()); - +const createMockGetRoutes = () => jest.fn(() => [] as VersionedRouterRoute[]); export const createVersionedRouterMock = (): MockedVersionedRouter => { - const router: Omit = { + const router: Omit = { delete: createMethodHandler(), get: createMethodHandler(), patch: createMethodHandler(), @@ -42,6 +45,7 @@ export const createVersionedRouterMock = (): MockedVersionedRouter => { return { ...router, getRoute: getRoute.bind(null, router), + getRoutes: createMockGetRoutes(), }; }; @@ -54,9 +58,10 @@ export interface RegisteredVersionedRoute { }; }; } + const getRoute = ( - router: Omit, - method: keyof VersionedRouter, + router: Omit, + method: VersionedRouterMethods, path: string ): RegisteredVersionedRoute => { if (!router[method].mock.calls.length) { diff --git a/packages/core/http/core-http-server-internal/src/http_server.test.ts b/packages/core/http/core-http-server-internal/src/http_server.test.ts index c374ff7ca2107..69e69f784e65e 100644 --- a/packages/core/http/core-http-server-internal/src/http_server.test.ts +++ b/packages/core/http/core-http-server-internal/src/http_server.test.ts @@ -906,6 +906,7 @@ test('exposes route details of incoming request to a route handler', async () => .expect(200, { method: 'get', path: '/', + routePath: '/', options: { authRequired: true, xsrfRequired: false, @@ -1088,6 +1089,7 @@ test('exposes route details of incoming request to a route handler (POST + paylo .expect(200, { method: 'post', path: '/', + routePath: '/', options: { authRequired: true, xsrfRequired: true, diff --git a/packages/core/http/core-http-server-internal/src/http_server.ts b/packages/core/http/core-http-server-internal/src/http_server.ts index 46470bac7c504..1dee6a3286788 100644 --- a/packages/core/http/core-http-server-internal/src/http_server.ts +++ b/packages/core/http/core-http-server-internal/src/http_server.ts @@ -35,10 +35,12 @@ import type { HttpServerInfo, HttpAuth, IAuthHeadersStorage, + RouterDeprecatedRouteDetails, + RouteMethod, } from '@kbn/core-http-server'; import { performance } from 'perf_hooks'; import { isBoom } from '@hapi/boom'; -import { identity } from 'lodash'; +import { identity, isObject } from 'lodash'; import { IHttpEluMonitorConfig } from '@kbn/core-http-server/src/elu_monitor'; import { Env } from '@kbn/config'; import { CoreContext } from '@kbn/core-base-server-internal'; @@ -140,6 +142,7 @@ export interface HttpServerSetup { registerAuth: HttpServiceSetup['registerAuth']; registerOnPostAuth: HttpServiceSetup['registerOnPostAuth']; registerOnPreResponse: HttpServiceSetup['registerOnPreResponse']; + getDeprecatedRoutes: HttpServiceSetup['getDeprecatedRoutes']; authRequestHeaders: IAuthHeadersStorage; auth: HttpAuth; getServerInfo: () => HttpServerInfo; @@ -280,6 +283,7 @@ export class HttpServer { return { registerRouter: this.registerRouter.bind(this), + getDeprecatedRoutes: this.getDeprecatedRoutes.bind(this), registerRouterAfterListening: this.registerRouterAfterListening.bind(this), registerStaticDir: this.registerStaticDir.bind(this), staticAssets, @@ -385,6 +389,45 @@ export class HttpServer { } } + private getDeprecatedRoutes(): RouterDeprecatedRouteDetails[] { + const deprecatedRoutes: RouterDeprecatedRouteDetails[] = []; + + for (const router of this.registeredRouters) { + const allRouterRoutes = [ + // exclude so we dont get double entries. + // we need to call the versioned getRoutes to grab the full version options details + router.getRoutes({ excludeVersionedRoutes: true }), + router.versioned.getRoutes(), + ].flat(); + + deprecatedRoutes.push( + ...allRouterRoutes + .flat() + .map((route) => { + if (route.isVersioned === true) { + return [...route.handlers.entries()].map(([_, { options }]) => { + const deprecated = options.options?.deprecated; + return { route, version: `${options.version}`, deprecated }; + }); + } + return { route, version: undefined, deprecated: route.options.deprecated }; + }) + .flat() + .filter(({ deprecated }) => isObject(deprecated)) + .flatMap(({ route, deprecated, version }) => { + return { + routeDeprecationOptions: deprecated!, + routeMethod: route.method as RouteMethod, + routePath: route.path, + routeVersion: version, + }; + }) + ); + } + + return deprecatedRoutes; + } + private setupGracefulShutdownHandlers() { this.registerOnPreRouting((request, response, toolkit) => { if (this.stopping || this.stopped) { @@ -693,12 +736,13 @@ export class HttpServer { this.log.debug(`registering route handler for [${route.path}]`); // Hapi does not allow payload validation to be specified for 'head' or 'get' requests const validate = isSafeMethod(route.method) ? undefined : { payload: true }; - const { authRequired, tags, body = {}, timeout } = route.options; + const { authRequired, tags, body = {}, timeout, deprecated } = route.options; const { accepts: allow, override, maxBytes, output, parse } = body; const kibanaRouteOptions: KibanaRouteOptions = { xsrfRequired: route.options.xsrfRequired ?? !isSafeMethod(route.method), access: route.options.access ?? 'internal', + deprecated, security: route.security, }; // Log HTTP API target consumer. diff --git a/packages/core/http/core-http-server-internal/src/http_service.ts b/packages/core/http/core-http-server-internal/src/http_service.ts index 3f803b06f15fd..af310a6792057 100644 --- a/packages/core/http/core-http-server-internal/src/http_service.ts +++ b/packages/core/http/core-http-server-internal/src/http_service.ts @@ -162,7 +162,7 @@ export class HttpService return this.internalPreboot; } - public async setup(deps: SetupDeps) { + public async setup(deps: SetupDeps): Promise { this.requestHandlerContext = deps.context.createContextContainer(); this.configSubscription = this.config$.subscribe(() => { if (this.httpServer.isListening()) { @@ -185,9 +185,11 @@ export class HttpService this.internalSetup = { ...serverContract, - + registerOnPostValidation: (cb) => { + Router.on('onPostValidate', cb); + }, + getRegisteredDeprecatedApis: () => serverContract.getDeprecatedRoutes(), externalUrl: new ExternalUrlConfig(config.externalUrl), - createRouter: ( path: string, pluginId: PluginOpaqueId = this.coreContext.coreId diff --git a/packages/core/http/core-http-server-internal/src/types.ts b/packages/core/http/core-http-server-internal/src/types.ts index 70dde23f035d0..0706af9ad73a2 100644 --- a/packages/core/http/core-http-server-internal/src/types.ts +++ b/packages/core/http/core-http-server-internal/src/types.ts @@ -16,7 +16,10 @@ import type { IContextContainer, HttpServiceSetup, HttpServiceStart, + RouterDeprecatedRouteDetails, } from '@kbn/core-http-server'; +import { CoreKibanaRequest } from '@kbn/core-http-router-server-internal'; +import { RouteDeprecationInfo } from '@kbn/core-http-server/src/router/route'; import type { HttpServerSetup } from './http_server'; import type { ExternalUrlConfig } from './external_url'; import type { InternalStaticAssets } from './static_assets'; @@ -54,6 +57,9 @@ export interface InternalHttpServiceSetup path: string, plugin?: PluginOpaqueId ) => IRouter; + registerOnPostValidation( + cb: (req: CoreKibanaRequest, metadata: { deprecated: RouteDeprecationInfo }) => void + ): void; registerRouterAfterListening: (router: IRouter) => void; registerStaticDir: (path: string, dirPath: string) => void; authRequestHeaders: IAuthHeadersStorage; @@ -65,6 +71,7 @@ export interface InternalHttpServiceSetup contextName: ContextName, provider: IContextProvider ) => IContextContainer; + getRegisteredDeprecatedApis: () => RouterDeprecatedRouteDetails[]; } /** @internal */ diff --git a/packages/core/http/core-http-server-mocks/src/http_service.mock.ts b/packages/core/http/core-http-server-mocks/src/http_service.mock.ts index 4e803ee5f86a8..116db3648f120 100644 --- a/packages/core/http/core-http-server-mocks/src/http_service.mock.ts +++ b/packages/core/http/core-http-server-mocks/src/http_service.mock.ts @@ -171,6 +171,9 @@ const createInternalSetupContractMock = () => { createCookieSessionStorageFactory: jest.fn(), registerOnPreRouting: jest.fn(), registerOnPreAuth: jest.fn(), + getDeprecatedRoutes: jest.fn(), + getRegisteredDeprecatedApis: jest.fn(), + registerOnPostValidation: jest.fn(), registerAuth: jest.fn(), registerOnPostAuth: jest.fn(), registerRouteHandlerContext: jest.fn(), @@ -207,6 +210,7 @@ const createSetupContractMock = < createCookieSessionStorageFactory: internalMock.createCookieSessionStorageFactory, registerOnPreRouting: internalMock.registerOnPreRouting, registerOnPreAuth: jest.fn(), + getDeprecatedRoutes: jest.fn(), registerAuth: internalMock.registerAuth, registerOnPostAuth: internalMock.registerOnPostAuth, registerOnPreResponse: internalMock.registerOnPreResponse, diff --git a/packages/core/http/core-http-server/index.ts b/packages/core/http/core-http-server/index.ts index 4ba653fbd534c..7fe125c6aa9a7 100644 --- a/packages/core/http/core-http-server/index.ts +++ b/packages/core/http/core-http-server/index.ts @@ -93,6 +93,7 @@ export type { IRouter, RouteRegistrar, RouterRoute, + RouterDeprecatedRouteDetails, IKibanaSocket, KibanaErrorResponseFactory, KibanaRedirectionResponseFactory, @@ -170,6 +171,7 @@ export type { VersionedRouter, VersionedRouteCustomResponseBodyValidation, VersionedResponseBodyValidation, + VersionedRouterRoute, } from './src/versioning'; export type { IStaticAssets } from './src/static_assets'; diff --git a/packages/core/http/core-http-server/src/http_contract.ts b/packages/core/http/core-http-server/src/http_contract.ts index 72eb70149f529..e2f675bd8d0c0 100644 --- a/packages/core/http/core-http-server/src/http_contract.ts +++ b/packages/core/http/core-http-server/src/http_contract.ts @@ -12,6 +12,7 @@ import type { IContextProvider, IRouter, RequestHandlerContextBase, + RouterDeprecatedRouteDetails, } from './router'; import type { AuthenticationHandler, @@ -359,6 +360,14 @@ export interface HttpServiceSetup< * Provides common {@link HttpServerInfo | information} about the running http server. */ getServerInfo: () => HttpServerInfo; + + /** + * Provides a list of all registered deprecated routes {{@link RouterDeprecatedRouteDetails | information}}. + * The routers will be evaluated everytime this function gets called to + * accommodate for any late route registrations + * @returns {RouterDeprecatedRouteDetails[]} + */ + getDeprecatedRoutes: () => RouterDeprecatedRouteDetails[]; } /** @public */ diff --git a/packages/core/http/core-http-server/src/router/index.ts b/packages/core/http/core-http-server/src/router/index.ts index c26212fa0de81..8384ed838d5fc 100644 --- a/packages/core/http/core-http-server/src/router/index.ts +++ b/packages/core/http/core-http-server/src/router/index.ts @@ -80,7 +80,7 @@ export type { LazyValidator, } from './route_validator'; export { RouteValidationError } from './route_validator'; -export type { IRouter, RouteRegistrar, RouterRoute } from './router'; +export type { IRouter, RouteRegistrar, RouterRoute, RouterDeprecatedRouteDetails } from './router'; export type { IKibanaSocket } from './socket'; export type { KibanaErrorResponseFactory, diff --git a/packages/core/http/core-http-server/src/router/request.ts b/packages/core/http/core-http-server/src/router/request.ts index 5cb84a21be0c3..066372faca1e4 100644 --- a/packages/core/http/core-http-server/src/router/request.ts +++ b/packages/core/http/core-http-server/src/router/request.ts @@ -13,7 +13,7 @@ import type { Observable } from 'rxjs'; import type { RecursiveReadonly } from '@kbn/utility-types'; import type { HttpProtocol } from '../http_contract'; import type { IKibanaSocket } from './socket'; -import type { RouteMethod, RouteConfigOptions, RouteSecurity } from './route'; +import type { RouteMethod, RouteConfigOptions, RouteSecurity, RouteDeprecationInfo } from './route'; import type { Headers } from './headers'; export type RouteSecurityGetter = (request: { @@ -26,6 +26,7 @@ export type InternalRouteSecurity = RouteSecurity | RouteSecurityGetter; * @public */ export interface KibanaRouteOptions extends RouteOptionsApp { + deprecated?: RouteDeprecationInfo; xsrfRequired: boolean; access: 'internal' | 'public'; security?: InternalRouteSecurity; @@ -59,6 +60,7 @@ export interface KibanaRequestRoute { path: string; method: Method; options: KibanaRequestRouteOptions; + routePath?: string; } /** @@ -190,6 +192,11 @@ export interface KibanaRequest< */ readonly rewrittenUrl?: URL; + /** + * The versioned route API version of this request. + */ + readonly apiVersion: string | undefined; + /** * The path parameter of this request. */ diff --git a/packages/core/http/core-http-server/src/router/route.ts b/packages/core/http/core-http-server/src/router/route.ts index ac723db924a5a..6696babce41e1 100644 --- a/packages/core/http/core-http-server/src/router/route.ts +++ b/packages/core/http/core-http-server/src/router/route.ts @@ -113,6 +113,43 @@ export type RouteAccess = 'public' | 'internal'; export type Privilege = string; +/** + * Route Deprecation info + * This information will assist Kibana HTTP API users when upgrading to new versions + * of the Elastic stack (via Upgrade Assistant) and will be surfaced in documentation + * created from HTTP API introspection (like OAS). + */ +export interface RouteDeprecationInfo { + documentationUrl: string; + severity: 'warning' | 'critical'; + reason: VersionBumpDeprecationType | RemovalApiDeprecationType | MigrationApiDeprecationType; +} + +/** + * bump deprecation reason denotes a new version of the API is available + */ +interface VersionBumpDeprecationType { + type: 'bump'; + newApiVersion: string; +} + +/** + * remove deprecation reason denotes the API was fully removed with no replacement + */ +interface RemovalApiDeprecationType { + type: 'remove'; +} + +/** + * migrate deprecation reason denotes the API has been migrated to a different API path + * Please make sure that if you are only incrementing the version of the API to use 'bump' instead + */ +interface MigrationApiDeprecationType { + type: 'migrate'; + newApiPath: string; + newApiMethod: string; +} + /** * A set of privileges that can be used to define complex authorization requirements. * @@ -277,12 +314,18 @@ export interface RouteConfigOptions { description?: string; /** - * Setting this to `true` declares this route to be deprecated. Consumers SHOULD - * refrain from usage of this route. + * Description of deprecations for this HTTP API. * - * @remarks This will be surfaced in OAS documentation. + * @remark This will assist Kibana HTTP API users when upgrading to new versions + * of the Elastic stack (via Upgrade Assistant) and will be surfaced in documentation + * created from HTTP API introspection (like OAS). + * + * Setting this object marks the route as deprecated. + * + * @remarks This may be surfaced in OAS documentation. + * @public */ - deprecated?: boolean; + deprecated?: RouteDeprecationInfo; /** * Whether this route should be treated as "invisible" and excluded from router diff --git a/packages/core/http/core-http-server/src/router/router.ts b/packages/core/http/core-http-server/src/router/router.ts index ba2b5eb906a93..d8b79bee13025 100644 --- a/packages/core/http/core-http-server/src/router/router.ts +++ b/packages/core/http/core-http-server/src/router/router.ts @@ -10,7 +10,7 @@ import type { Request, ResponseObject, ResponseToolkit } from '@hapi/hapi'; import type Boom from '@hapi/boom'; import type { VersionedRouter } from '../versioning'; -import type { RouteConfig, RouteMethod } from './route'; +import type { RouteConfig, RouteDeprecationInfo, RouteMethod } from './route'; import type { RequestHandler, RequestHandlerWrapper } from './request_handler'; import type { RequestHandlerContextBase } from './request_handler_context'; import type { RouteConfigOptions } from './route'; @@ -98,7 +98,7 @@ export interface IRouter RouterRoute[]; + getRoutes: (options?: { excludeVersionedRoutes?: boolean }) => RouterRoute[]; /** * An instance very similar to {@link IRouter} that can be used for versioning HTTP routes @@ -139,4 +139,13 @@ export interface RouterRoute { req: Request, responseToolkit: ResponseToolkit ) => Promise>; + isVersioned: false; +} + +/** @public */ +export interface RouterDeprecatedRouteDetails { + routeDeprecationOptions: RouteDeprecationInfo; + routeMethod: RouteMethod; + routePath: string; + routeVersion?: string; } diff --git a/packages/core/http/core-http-server/src/versioning/index.ts b/packages/core/http/core-http-server/src/versioning/index.ts index 94b60bd105aac..8d8a664c769ac 100644 --- a/packages/core/http/core-http-server/src/versioning/index.ts +++ b/packages/core/http/core-http-server/src/versioning/index.ts @@ -19,4 +19,5 @@ export type { VersionedRouter, VersionedRouteCustomResponseBodyValidation, VersionedResponseBodyValidation, + VersionedRouterRoute, } from './types'; diff --git a/packages/core/http/core-http-server/src/versioning/types.ts b/packages/core/http/core-http-server/src/versioning/types.ts index 7998c9cc91fa9..63e1e37754803 100644 --- a/packages/core/http/core-http-server/src/versioning/types.ts +++ b/packages/core/http/core-http-server/src/versioning/types.ts @@ -20,7 +20,7 @@ import type { RouteValidationFunction, LazyValidator, } from '../..'; - +import type { RouteDeprecationInfo } from '../router/route'; type RqCtx = RequestHandlerContextBase; export type { ApiVersion }; @@ -89,17 +89,9 @@ export type VersionedRouteConfig = Omit< */ description?: string; - /** - * Declares this operation to be deprecated. Consumers SHOULD refrain from usage - * of this route. This will be surfaced in OAS documentation. - * - * @default false - */ - deprecated?: boolean; - /** * Release version or date that this route will be removed - * Use with `deprecated: true` + * Use with `deprecated: {@link RouteDeprecationInfo}` * * @default undefined */ @@ -234,6 +226,11 @@ export interface VersionedRouter { * @track-adoption */ delete: VersionedRouteRegistrar<'delete', Ctx>; + + /** + * @public + */ + getRoutes: () => VersionedRouterRoute[]; } /** @public */ @@ -341,6 +338,10 @@ export interface AddVersionOpts { validate: false | VersionedRouteValidation | (() => VersionedRouteValidation); // Provide a way to lazily load validation schemas security?: Exclude['security'], undefined>; + + options?: { + deprecated?: RouteDeprecationInfo; + }; } /** @@ -363,3 +364,11 @@ export interface VersionedRoute< handler: (...params: Parameters>) => MaybePromise ): VersionedRoute; } + +export interface VersionedRouterRoute

{ + method: string; + path: string; + options: Omit, 'path'>; + handlers: Array<{ fn: RequestHandler; options: AddVersionOpts }>; + isVersioned: true; +} diff --git a/packages/core/http/core-http-server/tsconfig.json b/packages/core/http/core-http-server/tsconfig.json index 64b2dacf2f292..50a0ce973eb4e 100644 --- a/packages/core/http/core-http-server/tsconfig.json +++ b/packages/core/http/core-http-server/tsconfig.json @@ -15,7 +15,7 @@ "@kbn/utility-types", "@kbn/core-base-common", "@kbn/core-http-common", - "@kbn/zod" + "@kbn/zod", ], "exclude": [ "target/**/*", diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts index b50e9279d4721..30f5958bd92c5 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts @@ -76,6 +76,8 @@ export function createCoreSetupMock({ userProfile: userProfileServiceMock.createSetup(), coreUsageData: { registerUsageCounter: coreUsageDataServiceMock.createSetupContract().registerUsageCounter, + registerDeprecatedUsageFetch: + coreUsageDataServiceMock.createSetupContract().registerDeprecatedUsageFetch, }, plugins: { onSetup: jest.fn(), diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts index 2fcdf384cb897..d7d40c9b792f7 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts @@ -225,6 +225,7 @@ export function createPluginSetupContext({ }, http: { createCookieSessionStorageFactory: deps.http.createCookieSessionStorageFactory, + getDeprecatedRoutes: deps.http.getDeprecatedRoutes, registerRouteHandlerContext: < Context extends RequestHandlerContext, ContextName extends keyof Omit @@ -283,6 +284,7 @@ export function createPluginSetupContext({ deprecations: deps.deprecations.getRegistry(plugin.name), coreUsageData: { registerUsageCounter: deps.coreUsageData.registerUsageCounter, + registerDeprecatedUsageFetch: deps.coreUsageData.registerDeprecatedUsageFetch, }, plugins: { onSetup: (...dependencyNames) => runtimeResolver.onSetup(plugin.name, dependencyNames), diff --git a/packages/core/root/core-root-server-internal/src/server.ts b/packages/core/root/core-root-server-internal/src/server.ts index 447db192c3048..5082a27930e87 100644 --- a/packages/core/root/core-root-server-internal/src/server.ts +++ b/packages/core/root/core-root-server-internal/src/server.ts @@ -276,10 +276,6 @@ export class Server { executionContext: executionContextSetup, }); - const deprecationsSetup = await this.deprecations.setup({ - http: httpSetup, - }); - // setup i18n prior to any other service, to have translations ready const i18nServiceSetup = await this.i18n.setup({ http: httpSetup, pluginPaths }); @@ -303,6 +299,11 @@ export class Server { changedDeprecatedConfigPath$: this.configService.getDeprecatedConfigPath$(), }); + const deprecationsSetup = await this.deprecations.setup({ + http: httpSetup, + coreUsageData: coreUsageDataSetup, + }); + const savedObjectsSetup = await this.savedObjects.setup({ http: httpSetup, elasticsearch: elasticsearchServiceSetup, diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/mocks/internal_mocks.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/mocks/internal_mocks.ts index 625c8ed77fb48..ff5fe86df1173 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/mocks/internal_mocks.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/mocks/internal_mocks.ts @@ -36,6 +36,7 @@ export const createCoreUsageDataSetupMock = () => { getClient: jest.fn(), registerUsageCounter: jest.fn(), incrementUsageCounter: jest.fn(), + registerDeprecatedUsageFetch: jest.fn(), }; return setupContract; }; diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_create.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_create.ts index b90aa0226d71c..c9a8656b3f753 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_create.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_create.ts @@ -38,6 +38,7 @@ export const registerBulkCreateRoute = ( summary: `Create saved objects`, tags: ['oas-tag:saved objects'], access, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, validate: { diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_delete.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_delete.ts index 0f33ddc384bed..65209a6072748 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_delete.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_delete.ts @@ -38,6 +38,7 @@ export const registerBulkDeleteRoute = ( summary: `Delete saved objects`, tags: ['oas-tag:saved objects'], access, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, validate: { diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_get.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_get.ts index 95fd9f5eab10a..3f87ca12248ae 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_get.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_get.ts @@ -38,6 +38,7 @@ export const registerBulkGetRoute = ( summary: `Get saved objects`, tags: ['oas-tag:saved objects'], access, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, validate: { diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_resolve.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_resolve.ts index d6b74131fb74d..8e19114e798e0 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_resolve.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_resolve.ts @@ -38,6 +38,7 @@ export const registerBulkResolveRoute = ( summary: `Resolve saved objects`, tags: ['oas-tag:saved objects'], access, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, description: `Retrieve multiple Kibana saved objects by ID, using any legacy URL aliases if they exist. Under certain circumstances, when Kibana is upgraded, saved object migrations may necessitate regenerating some object IDs to enable new features. When an object's ID is regenerated, a legacy URL alias is created for that object, preserving its old ID. In such a scenario, that object can be retrieved with the bulk resolve API using either its new ID or its old ID.`, diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_update.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_update.ts index 7a7ec340d98ca..825a5f95482c0 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_update.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/bulk_update.ts @@ -38,6 +38,7 @@ export const registerBulkUpdateRoute = ( summary: `Update saved objects`, tags: ['oas-tag:saved objects'], access, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, validate: { diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/create.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/create.ts index c8bfd4c0feaf9..57f4a10ed9377 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/create.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/create.ts @@ -38,6 +38,7 @@ export const registerCreateRoute = ( summary: `Create a saved object`, tags: ['oas-tag:saved objects'], access, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, validate: { diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/delete.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/delete.ts index 7ef8aac3fa1b1..69287821d8049 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/delete.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/delete.ts @@ -38,6 +38,7 @@ export const registerDeleteRoute = ( summary: `Delete a saved object`, tags: ['oas-tag:saved objects'], access, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, validate: { diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/find.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/find.ts index ac3b0555a7694..884ba1ed5c423 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/find.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/find.ts @@ -42,6 +42,7 @@ export const registerFindRoute = ( summary: `Search for saved objects`, tags: ['oas-tag:saved objects'], access, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, validate: { diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/get.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/get.ts index 9784ef1c79ff4..9fe3aa8ff20c7 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/get.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/get.ts @@ -38,6 +38,7 @@ export const registerGetRoute = ( summary: `Get a saved object`, tags: ['oas-tag:saved objects'], access, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, validate: { diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/resolve.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/resolve.ts index 295acacc0ba0e..28a6c82e9ffdf 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/resolve.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/resolve.ts @@ -34,6 +34,7 @@ export const registerResolveRoute = ( summary: `Resolve a saved object`, tags: ['oas-tag:saved objects'], access, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, description: `Retrieve a single Kibana saved object by ID, using any legacy URL alias if it exists. Under certain circumstances, when Kibana is upgraded, saved object migrations may necessitate regenerating some object IDs to enable new features. When an object's ID is regenerated, a legacy URL alias is created for that object, preserving its old ID. In such a scenario, that object can be retrieved with the resolve API using either its new ID or its old ID.`, diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/update.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/update.ts index 9eeea40a29b68..cfedc3ce03d2a 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/update.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/update.ts @@ -39,6 +39,7 @@ export const registerUpdateRoute = ( summary: `Update a saved object`, tags: ['oas-tag:saved objects'], access, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, validate: { diff --git a/packages/core/usage-data/core-usage-data-base-server-internal/src/usage_stats_client.ts b/packages/core/usage-data/core-usage-data-base-server-internal/src/usage_stats_client.ts index 649e972af2abc..044fb683fb69a 100644 --- a/packages/core/usage-data/core-usage-data-base-server-internal/src/usage_stats_client.ts +++ b/packages/core/usage-data/core-usage-data-base-server-internal/src/usage_stats_client.ts @@ -8,7 +8,7 @@ */ import type { KibanaRequest } from '@kbn/core-http-server'; -import type { CoreUsageStats } from '@kbn/core-usage-data-server'; +import type { CoreUsageStats, CoreDeprecatedApiUsageStats } from '@kbn/core-usage-data-server'; /** @internal */ export interface BaseIncrementOptions { @@ -38,6 +38,13 @@ export type IncrementSavedObjectsExportOptions = BaseIncrementOptions & { export interface ICoreUsageStatsClient { getUsageStats(): Promise; + getDeprecatedApiUsageStats(): Promise; + + incrementDeprecatedApi( + counterName: string, + options: { resolved?: boolean; incrementBy?: number } + ): Promise; + incrementSavedObjectsBulkCreate(options: BaseIncrementOptions): Promise; incrementSavedObjectsBulkGet(options: BaseIncrementOptions): Promise; diff --git a/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts index 2a10e06567d02..7ac7cbb7fbb57 100644 --- a/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts +++ b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts @@ -37,6 +37,7 @@ import type { CoreConfigUsageData, CoreIncrementCounterParams, CoreUsageCounter, + DeprecatedApiUsageFetcher, } from '@kbn/core-usage-data-server'; import { CORE_USAGE_STATS_TYPE, @@ -48,6 +49,7 @@ import { type SavedObjectsServiceStart, } from '@kbn/core-saved-objects-server'; +import { ISavedObjectsRepository } from '@kbn/core-saved-objects-api-server'; import { isConfigured } from './is_configured'; import { coreUsageStatsType } from './saved_objects'; import { CoreUsageStatsClient } from './core_usage_stats_client'; @@ -88,6 +90,7 @@ export class CoreUsageDataService private coreUsageStatsClient?: CoreUsageStatsClient; private deprecatedConfigPaths: ChangedDeprecatedPaths = { set: [], unset: [] }; private incrementUsageCounter: CoreIncrementUsageCounter = () => {}; // Initially set to noop + private deprecatedApiUsageFetcher: DeprecatedApiUsageFetcher = async () => []; // Initially set to noop constructor(core: CoreContext) { this.logger = core.logger.get('core-usage-stats-service'); @@ -513,12 +516,21 @@ export class CoreUsageDataService } }; + const registerDeprecatedUsageFetch = (fetchFn: DeprecatedApiUsageFetcher) => { + this.deprecatedApiUsageFetcher = fetchFn; + }; + + const fetchDeprecatedUsageStats = (params: { soClient: ISavedObjectsRepository }) => { + return this.deprecatedApiUsageFetcher(params); + }; + this.coreUsageStatsClient = new CoreUsageStatsClient({ debugLogger: (message: string) => this.logger.debug(message), basePath: http.basePath, repositoryPromise: internalRepositoryPromise, stop$: this.stop$, incrementUsageCounter, + fetchDeprecatedUsageStats, }); const contract: InternalCoreUsageDataSetup = { @@ -526,6 +538,7 @@ export class CoreUsageDataService getClient: () => this.coreUsageStatsClient!, registerUsageCounter, incrementUsageCounter, + registerDeprecatedUsageFetch, }; return contract; diff --git a/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.test.ts b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.test.ts index 948332c71f59a..9702e4b512345 100644 --- a/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.test.ts +++ b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.test.ts @@ -52,6 +52,7 @@ describe('CoreUsageStatsClient', () => { debugLogger: debugLoggerMock, basePath: basePathMock, repositoryPromise: Promise.resolve(repositoryMock), + fetchDeprecatedUsageStats: jest.fn(), stop$, incrementUsageCounter: incrementUsageCounterMock, }); diff --git a/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.ts b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.ts index 67ab6d9b30c9c..69eba9e1abf23 100644 --- a/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.ts +++ b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.ts @@ -37,6 +37,7 @@ import { takeUntil, tap, } from 'rxjs'; +import type { DeprecatedApiUsageFetcher } from '@kbn/core-usage-data-server'; export const BULK_CREATE_STATS_PREFIX = 'apiCalls.savedObjectsBulkCreate'; export const BULK_GET_STATS_PREFIX = 'apiCalls.savedObjectsBulkGet'; @@ -108,6 +109,16 @@ export interface CoreUsageEvent { types?: string[]; } +/** + * Interface that models core events triggered by API deprecations. (e.g. SO HTTP API calls) + * @internal + */ +export interface CoreUsageDeprecatedApiEvent { + id: string; + resolved: boolean; + incrementBy: number; +} + /** @internal */ export interface CoreUsageStatsClientParams { debugLogger: (message: string) => void; @@ -116,6 +127,7 @@ export interface CoreUsageStatsClientParams { stop$: Observable; incrementUsageCounter: (params: CoreIncrementCounterParams) => void; bufferTimeMs?: number; + fetchDeprecatedUsageStats: DeprecatedApiUsageFetcher; } /** @internal */ @@ -126,6 +138,8 @@ export class CoreUsageStatsClient implements ICoreUsageStatsClient { private readonly fieldsToIncrement$ = new Subject(); private readonly flush$ = new Subject(); private readonly coreUsageEvents$ = new Subject(); + private readonly coreUsageDeprecatedApiCalls$ = new Subject(); + private readonly fetchDeprecatedUsageStats: DeprecatedApiUsageFetcher; constructor({ debugLogger, @@ -134,10 +148,12 @@ export class CoreUsageStatsClient implements ICoreUsageStatsClient { stop$, incrementUsageCounter, bufferTimeMs = DEFAULT_BUFFER_TIME_MS, + fetchDeprecatedUsageStats, }: CoreUsageStatsClientParams) { this.debugLogger = debugLogger; this.basePath = basePath; this.repositoryPromise = repositoryPromise; + this.fetchDeprecatedUsageStats = fetchDeprecatedUsageStats; this.fieldsToIncrement$ .pipe( takeUntil(stop$), @@ -180,6 +196,28 @@ export class CoreUsageStatsClient implements ICoreUsageStatsClient { ) .subscribe(); + this.coreUsageDeprecatedApiCalls$ + .pipe( + takeUntil(stop$), + tap(({ id, incrementBy, resolved }) => { + incrementUsageCounter({ + counterName: id, + counterType: `deprecated_api_call:${resolved ? 'resolved' : 'total'}`, + incrementBy, + }); + + if (resolved) { + // increment number of times the marked_as_resolve has been called + incrementUsageCounter({ + counterName: id, + counterType: 'deprecated_api_call:marked_as_resolved', + incrementBy: 1, + }); + } + }) + ) + .subscribe(); + this.coreUsageEvents$ .pipe( takeUntil(stop$), @@ -215,6 +253,20 @@ export class CoreUsageStatsClient implements ICoreUsageStatsClient { return coreUsageStats; } + public async incrementDeprecatedApi( + id: string, + { resolved = false, incrementBy = 1 }: { resolved: boolean; incrementBy: number } + ) { + const deprecatedField = resolved ? 'deprecated_api_calls_resolved' : 'deprecated_api_calls'; + this.coreUsageDeprecatedApiCalls$.next({ id, resolved, incrementBy }); + this.fieldsToIncrement$.next([`${deprecatedField}.total`]); + } + + public async getDeprecatedApiUsageStats() { + const repository = await this.repositoryPromise; + return await this.fetchDeprecatedUsageStats({ soClient: repository }); + } + public async incrementSavedObjectsBulkCreate(options: BaseIncrementOptions) { await this.updateUsageStats([], BULK_CREATE_STATS_PREFIX, options); } diff --git a/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts b/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts index c85aee50653d2..57628901c1a60 100644 --- a/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts +++ b/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts @@ -17,6 +17,7 @@ import { coreUsageStatsClientMock } from './core_usage_stats_client.mock'; const createSetupContractMock = (usageStatsClient = coreUsageStatsClientMock.create()) => { const setupContract: jest.Mocked = { registerType: jest.fn(), + registerDeprecatedUsageFetch: jest.fn(), getClient: jest.fn().mockReturnValue(usageStatsClient), registerUsageCounter: jest.fn(), incrementUsageCounter: jest.fn(), diff --git a/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_stats_client.mock.ts b/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_stats_client.mock.ts index f6b11204ca040..8896e9066ef78 100644 --- a/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_stats_client.mock.ts +++ b/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_stats_client.mock.ts @@ -12,6 +12,7 @@ import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-int const createUsageStatsClientMock = () => ({ getUsageStats: jest.fn().mockResolvedValue({}), + getDeprecatedApiUsageStats: jest.fn().mockResolvedValue([]), incrementSavedObjectsBulkCreate: jest.fn().mockResolvedValue(null), incrementSavedObjectsBulkGet: jest.fn().mockResolvedValue(null), incrementSavedObjectsBulkResolve: jest.fn().mockResolvedValue(null), diff --git a/packages/core/usage-data/core-usage-data-server/index.ts b/packages/core/usage-data/core-usage-data-server/index.ts index 77fb0b1066750..45ed369ca8381 100644 --- a/packages/core/usage-data/core-usage-data-server/index.ts +++ b/packages/core/usage-data/core-usage-data-server/index.ts @@ -19,4 +19,6 @@ export type { CoreConfigUsageData, CoreServicesUsageData, CoreUsageStats, + CoreDeprecatedApiUsageStats, + DeprecatedApiUsageFetcher, } from './src'; diff --git a/packages/core/usage-data/core-usage-data-server/src/core_usage_stats.ts b/packages/core/usage-data/core-usage-data-server/src/core_usage_stats.ts index 36409a097129c..39df9d30d19c9 100644 --- a/packages/core/usage-data/core-usage-data-server/src/core_usage_stats.ts +++ b/packages/core/usage-data/core-usage-data-server/src/core_usage_stats.ts @@ -146,3 +146,16 @@ export interface CoreUsageStats { 'savedObjectsRepository.resolvedOutcome.notFound'?: number; 'savedObjectsRepository.resolvedOutcome.total'?: number; } + +/** + * @public + * + * CoreDeprecatedApiUsageStats are collected over time while Kibana is running. + */ +export interface CoreDeprecatedApiUsageStats { + apiId: string; + totalMarkedAsResolved: number; + markedAsResolvedLastCalledAt: string; + apiTotalCalls: number; + apiLastCalledAt: string; +} diff --git a/packages/core/usage-data/core-usage-data-server/src/index.ts b/packages/core/usage-data/core-usage-data-server/src/index.ts index 01cd52adbe986..05d0f02500053 100644 --- a/packages/core/usage-data/core-usage-data-server/src/index.ts +++ b/packages/core/usage-data/core-usage-data-server/src/index.ts @@ -12,11 +12,12 @@ export type { CoreEnvironmentUsageData, CoreConfigUsageData, } from './core_usage_data'; -export type { CoreUsageStats } from './core_usage_stats'; +export type { CoreUsageStats, CoreDeprecatedApiUsageStats } from './core_usage_stats'; export type { CoreUsageDataSetup, CoreUsageCounter, CoreIncrementUsageCounter, CoreIncrementCounterParams, + DeprecatedApiUsageFetcher, } from './setup_contract'; export type { CoreUsageData, ConfigUsageData, CoreUsageDataStart } from './start_contract'; diff --git a/packages/core/usage-data/core-usage-data-server/src/setup_contract.ts b/packages/core/usage-data/core-usage-data-server/src/setup_contract.ts index bd87563792e6d..30ed7edb6ce1d 100644 --- a/packages/core/usage-data/core-usage-data-server/src/setup_contract.ts +++ b/packages/core/usage-data/core-usage-data-server/src/setup_contract.ts @@ -7,12 +7,12 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import type { ISavedObjectsRepository } from '@kbn/core-saved-objects-api-server'; +import type { CoreDeprecatedApiUsageStats } from './core_usage_stats'; + /** * Internal API for registering the Usage Tracker used for Core's usage data payload. * - * @note This API should never be used to drive application logic and is only - * intended for telemetry purposes. - * * @public */ export interface CoreUsageDataSetup { @@ -21,6 +21,7 @@ export interface CoreUsageDataSetup { * when tracking events. */ registerUsageCounter: (usageCounter: CoreUsageCounter) => void; + registerDeprecatedUsageFetch: (fetchFn: DeprecatedApiUsageFetcher) => void; } /** @@ -49,3 +50,11 @@ export interface CoreIncrementCounterParams { * Method to call whenever an event occurs, so the counter can be increased. */ export type CoreIncrementUsageCounter = (params: CoreIncrementCounterParams) => void; + +/** + * @public + * Registers the deprecated API fetcher to be called to grab all the deprecated API usage details. + */ +export type DeprecatedApiUsageFetcher = (params: { + soClient: ISavedObjectsRepository; +}) => Promise; diff --git a/packages/core/usage-data/core-usage-data-server/tsconfig.json b/packages/core/usage-data/core-usage-data-server/tsconfig.json index 77d0aa6ade3b1..83abb04d150ac 100644 --- a/packages/core/usage-data/core-usage-data-server/tsconfig.json +++ b/packages/core/usage-data/core-usage-data-server/tsconfig.json @@ -12,5 +12,8 @@ ], "exclude": [ "target/**/*", + ], + "kbn_references": [ + "@kbn/core-saved-objects-api-server", ] } diff --git a/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap b/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap index 818c0502ad774..fef935624ae64 100644 --- a/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap +++ b/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap @@ -572,6 +572,7 @@ OK response oas-test-version-2", }, "/no-xsrf/{id}/{path*}": Object { "post": Object { + "deprecated": true, "operationId": "%2Fno-xsrf%2F%7Bid%7D%2F%7Bpath*%7D#1", "parameters": Array [ Object { diff --git a/packages/kbn-router-to-openapispec/src/generate_oas.test.ts b/packages/kbn-router-to-openapispec/src/generate_oas.test.ts index c3532312d3088..25b786ac7c2c7 100644 --- a/packages/kbn-router-to-openapispec/src/generate_oas.test.ts +++ b/packages/kbn-router-to-openapispec/src/generate_oas.test.ts @@ -189,6 +189,7 @@ describe('generateOpenApiDocument', () => { versionedRouters: { testVersionedRouter: { routes: [{}] } }, bodySchema: createSharedZodSchema(), }); + expect( generateOpenApiDocument( { @@ -240,6 +241,7 @@ describe('generateOpenApiDocument', () => { { method: 'get', path: '/test', + isVersioned: true, options: { access: 'public' }, handlers: [ { diff --git a/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts b/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts index 898f234cdc310..a39afb6357bfc 100644 --- a/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts +++ b/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts @@ -10,6 +10,7 @@ import type { ZodType } from '@kbn/zod'; import { schema, Type } from '@kbn/config-schema'; import type { CoreVersionedRouter, Router } from '@kbn/core-http-router-server-internal'; +import type { RouterRoute, VersionedRouterRoute } from '@kbn/core-http-server'; import { createLargeSchema } from './oas_converter/kbn_config_schema/lib.test.util'; type RoutesMeta = ReturnType[number]; @@ -27,7 +28,7 @@ export const createVersionedRouter = (args: { routes: VersionedRoutesMeta[] }) = } as unknown as CoreVersionedRouter; }; -export const getRouterDefaults = (bodySchema?: RuntimeSchema) => ({ +export const getRouterDefaults = (bodySchema?: RuntimeSchema): RouterRoute => ({ isVersioned: false, path: '/foo/{id}/{path*}', method: 'get', @@ -57,22 +58,29 @@ export const getRouterDefaults = (bodySchema?: RuntimeSchema) => ({ handler: jest.fn(), }); -export const getVersionedRouterDefaults = (bodySchema?: RuntimeSchema) => ({ +export const getVersionedRouterDefaults = (bodySchema?: RuntimeSchema): VersionedRouterRoute => ({ method: 'get', path: '/bar', options: { summary: 'versioned route', access: 'public', - deprecated: true, discontinued: 'route discontinued version or date', options: { tags: ['ignore-me', 'oas-tag:versioned'], }, }, + isVersioned: true, handlers: [ { fn: jest.fn(), options: { + options: { + deprecated: { + documentationUrl: 'https://fake-url', + reason: { type: 'remove' }, + severity: 'critical', + }, + }, validate: { request: { body: diff --git a/packages/kbn-router-to-openapispec/src/process_router.ts b/packages/kbn-router-to-openapispec/src/process_router.ts index 1884b6dddf863..f0d37fd208b7b 100644 --- a/packages/kbn-router-to-openapispec/src/process_router.ts +++ b/packages/kbn-router-to-openapispec/src/process_router.ts @@ -63,11 +63,12 @@ export const processRouter = ( parameters.push(...pathObjects, ...queryObjects); } + const hasDeprecations = !!route.options.deprecated; const operation: CustomOperationObject = { summary: route.options.summary ?? '', tags: route.options.tags ? extractTags(route.options.tags) : [], ...(route.options.description ? { description: route.options.description } : {}), - ...(route.options.deprecated ? { deprecated: route.options.deprecated } : {}), + ...(hasDeprecations ? { deprecated: true } : {}), ...(route.options.discontinued ? { 'x-discontinued': route.options.discontinued } : {}), requestBody: !!validationSchemas?.body ? { diff --git a/packages/kbn-router-to-openapispec/src/process_versioned_router.test.ts b/packages/kbn-router-to-openapispec/src/process_versioned_router.test.ts index 6452c2cf3c2cc..f9f4f4898c1d0 100644 --- a/packages/kbn-router-to-openapispec/src/process_versioned_router.test.ts +++ b/packages/kbn-router-to-openapispec/src/process_versioned_router.test.ts @@ -8,10 +8,7 @@ */ import { schema } from '@kbn/config-schema'; -import type { - CoreVersionedRouter, - VersionedRouterRoute, -} from '@kbn/core-http-router-server-internal'; +import type { CoreVersionedRouter } from '@kbn/core-http-router-server-internal'; import { get } from 'lodash'; import { OasConverter } from './oas_converter'; import { createOperationIdCounter } from './operation_id_counter'; @@ -20,6 +17,7 @@ import { extractVersionedResponses, extractVersionedRequestBodies, } from './process_versioned_router'; +import { VersionedRouterRoute } from '@kbn/core-http-server'; let oasConverter: OasConverter; beforeEach(() => { @@ -151,6 +149,7 @@ describe('processVersionedRouter', () => { const createTestRoute: () => VersionedRouterRoute = () => ({ path: '/foo', method: 'get', + isVersioned: true, options: { access: 'public', deprecated: true, diff --git a/packages/kbn-router-to-openapispec/src/process_versioned_router.ts b/packages/kbn-router-to-openapispec/src/process_versioned_router.ts index 5446f1409760d..7eee0d20c11d2 100644 --- a/packages/kbn-router-to-openapispec/src/process_versioned_router.ts +++ b/packages/kbn-router-to-openapispec/src/process_versioned_router.ts @@ -10,10 +10,9 @@ import { type CoreVersionedRouter, versionHandlerResolvers, - VersionedRouterRoute, unwrapVersionedResponseBodyValidation, } from '@kbn/core-http-router-server-internal'; -import type { RouteMethod } from '@kbn/core-http-server'; +import type { RouteMethod, VersionedRouterRoute } from '@kbn/core-http-server'; import type { OpenAPIV3 } from 'openapi-types'; import type { GenerateOpenApiDocumentOptionsFilters } from './generate_oas'; import type { OasConverter } from './oas_converter'; @@ -94,11 +93,13 @@ export const processVersionedRouter = ( const hasBody = Boolean(extractValidationSchemaFromVersionedHandler(handler)?.request?.body); const contentType = extractContentType(route.options.options?.body); const hasVersionFilter = Boolean(filters?.version); + // If any handler is deprecated we show deprecated: true in the spec + const hasDeprecations = route.handlers.some(({ options }) => !!options.options?.deprecated); const operation: OpenAPIV3.OperationObject = { summary: route.options.summary ?? '', tags: route.options.options?.tags ? extractTags(route.options.options.tags) : [], ...(route.options.description ? { description: route.options.description } : {}), - ...(route.options.deprecated ? { deprecated: route.options.deprecated } : {}), + ...(hasDeprecations ? { deprecated: true } : {}), ...(route.options.discontinued ? { 'x-discontinued': route.options.discontinued } : {}), requestBody: hasBody ? { diff --git a/src/core/server/integration_tests/http/request_representation.test.ts b/src/core/server/integration_tests/http/request_representation.test.ts index f180a3a49ce0f..82300eceec774 100644 --- a/src/core/server/integration_tests/http/request_representation.test.ts +++ b/src/core/server/integration_tests/http/request_representation.test.ts @@ -87,6 +87,7 @@ describe('request logging', () => { route: { method: 'get', path: '/', + routePath: '/', options: expect.any(Object), }, uuid: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', @@ -116,10 +117,12 @@ describe('request logging', () => { auth: { isAuthenticated: false }, route: { path: '/', + routePath: '/', method: 'get', options: { authRequired: true, xsrfRequired: false, + deprecated: undefined, access: 'internal', tags: [], security: undefined, @@ -127,7 +130,8 @@ describe('request logging', () => { body: undefined } }, - authzResult: undefined + authzResult: undefined, + apiVersion: undefined }" `); }); diff --git a/src/plugins/kibana_usage_collection/server/collectors/common/counters.test.ts b/src/plugins/kibana_usage_collection/server/collectors/common/counters.test.ts index 6a64e6b597e6a..33e9b68f59c4a 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/common/counters.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/common/counters.test.ts @@ -118,7 +118,6 @@ describe('createCounterFetcher', () => { dailyEvents, }) ); - // @ts-expect-error incomplete mock implementation const { dailyEvents } = await fetch({ soClient: soClientMock }); expect(dailyEvents).toHaveLength(5); const intersectingEntry = dailyEvents.find( diff --git a/src/plugins/kibana_usage_collection/server/collectors/common/counters.ts b/src/plugins/kibana_usage_collection/server/collectors/common/counters.ts index 9300ddcb959aa..df0ca67a85198 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/common/counters.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/common/counters.ts @@ -30,7 +30,7 @@ export function createCounterFetcher( filter: string, transform: (counters: CounterEvent[]) => T ) { - return async ({ soClient }: CollectorFetchContext) => { + return async ({ soClient }: Pick) => { const finder = soClient.createPointInTimeFinder({ type: USAGE_COUNTERS_SAVED_OBJECT_TYPE, namespaces: ['*'], diff --git a/src/plugins/kibana_usage_collection/server/collectors/core/fetch_deprecated_api_counters.ts b/src/plugins/kibana_usage_collection/server/collectors/core/fetch_deprecated_api_counters.ts new file mode 100644 index 0000000000000..1c90b23e40b16 --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/collectors/core/fetch_deprecated_api_counters.ts @@ -0,0 +1,69 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { Logger } from '@kbn/logging'; +import type { CoreDeprecatedApiUsageStats } from '@kbn/core-usage-data-server'; +import { USAGE_COUNTERS_SAVED_OBJECT_TYPE } from '@kbn/usage-collection-plugin/server'; + +import { createCounterFetcher, type CounterEvent } from '../common/counters'; + +const DEPRECATED_API_COUNTERS_FILTER = `${USAGE_COUNTERS_SAVED_OBJECT_TYPE}.attributes.counterType: deprecated_api_call\\:*`; + +const mergeCounter = (counter: CounterEvent, acc?: CoreDeprecatedApiUsageStats) => { + if (acc && acc?.apiId !== counter.counterName) { + throw new Error( + `Failed to merge mismatching counterNames: ${acc.apiId} with ${counter.counterName}` + ); + } + const isMarkedCounter = counter.counterType.endsWith(':marked_as_resolved'); + + const finalCounter = { + apiId: counter.counterName, + apiTotalCalls: 0, + apiLastCalledAt: 'unknown', + totalMarkedAsResolved: 0, + markedAsResolvedLastCalledAt: 'unknown', + ...(acc || {}), + }; + + if (isMarkedCounter) { + return finalCounter; + } + + const isResolvedCounter = counter.counterType.endsWith(':resolved'); + const totalKey = isResolvedCounter ? 'totalMarkedAsResolved' : 'apiTotalCalls'; + const lastUpdatedKey = isResolvedCounter ? 'markedAsResolvedLastCalledAt' : 'apiLastCalledAt'; + + const newPayload = { + [totalKey]: (finalCounter[totalKey] || 0) + counter.total, + [lastUpdatedKey]: counter.lastUpdatedAt, + }; + + return { + ...finalCounter, + ...newPayload, + }; +}; + +function mergeCounters(counters: CounterEvent[]): CoreDeprecatedApiUsageStats[] { + const mergedCounters = counters.reduce((acc, counter) => { + const { counterName } = counter; + const existingCounter = acc[counterName]; + + acc[counterName] = mergeCounter(counter, existingCounter); + + return acc; + }, {} as Record); + + return Object.values(mergedCounters); +} + +export const fetchDeprecatedApiCounterStats = (logger: Logger) => { + return createCounterFetcher(logger, DEPRECATED_API_COUNTERS_FILTER, mergeCounters); +}; diff --git a/src/plugins/kibana_usage_collection/server/collectors/core/index.ts b/src/plugins/kibana_usage_collection/server/collectors/core/index.ts index 0e0f783b0f847..e298560893ccb 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/core/index.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/core/index.ts @@ -8,3 +8,4 @@ */ export { registerCoreUsageCollector } from './core_usage_collector'; +export { fetchDeprecatedApiCounterStats } from './fetch_deprecated_api_counters'; diff --git a/src/plugins/kibana_usage_collection/server/collectors/index.ts b/src/plugins/kibana_usage_collection/server/collectors/index.ts index ef5287324ee59..c22fb3b5697f8 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/index.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/index.ts @@ -17,7 +17,7 @@ export { export { registerOpsStatsCollector } from './ops_stats'; export { registerCloudProviderUsageCollector } from './cloud'; export { registerCspCollector } from './csp'; -export { registerCoreUsageCollector } from './core'; +export { registerCoreUsageCollector, fetchDeprecatedApiCounterStats } from './core'; export { registerLocalizationUsageCollector } from './localization'; export { registerConfigUsageCollector } from './config_usage'; export { registerUiCountersUsageCollector } from './ui_counters'; diff --git a/src/plugins/kibana_usage_collection/server/plugin.ts b/src/plugins/kibana_usage_collection/server/plugin.ts index bbfc010c0e065..48fb1c6ff7b9b 100644 --- a/src/plugins/kibana_usage_collection/server/plugin.ts +++ b/src/plugins/kibana_usage_collection/server/plugin.ts @@ -43,6 +43,7 @@ import { registerUsageCountersUsageCollector, registerSavedObjectsCountUsageCollector, registerEventLoopDelaysCollector, + fetchDeprecatedApiCounterStats, } from './collectors'; interface KibanaUsageCollectionPluginsDepsSetup { @@ -74,6 +75,10 @@ export class KibanaUsageCollectionPlugin implements Plugin { registerEbtCounters(coreSetup.analytics, usageCollection); this.eventLoopUsageCounter = usageCollection.createUsageCounter('eventLoop'); coreSetup.coreUsageData.registerUsageCounter(usageCollection.createUsageCounter('core')); + const deprecatedUsageFetch = fetchDeprecatedApiCounterStats( + this.logger.get('deprecated-api-usage') + ); + coreSetup.coreUsageData.registerDeprecatedUsageFetch(deprecatedUsageFetch); this.registerUsageCollectors( usageCollection, coreSetup, diff --git a/test/plugin_functional/test_suites/core/deprecations.ts b/test/plugin_functional/test_suites/core/deprecations.ts index 081209e6c7dce..b41adc7ffefa5 100644 --- a/test/plugin_functional/test_suites/core/deprecations.ts +++ b/test/plugin_functional/test_suites/core/deprecations.ts @@ -151,7 +151,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide }); expect(resolveResult).to.eql({ - reason: 'This deprecation cannot be resolved automatically.', + reason: 'This deprecation cannot be resolved automatically or marked as resolved.', status: 'fail', }); }); diff --git a/x-pack/plugins/actions/server/routes/legacy/create.ts b/x-pack/plugins/actions/server/routes/legacy/create.ts index 6da0d25c2e59c..f667a9e003a77 100644 --- a/x-pack/plugins/actions/server/routes/legacy/create.ts +++ b/x-pack/plugins/actions/server/routes/legacy/create.ts @@ -38,6 +38,7 @@ export const createActionRoute = ( access: 'public', summary: `Create a connector`, tags: ['oas-tag:connectors'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, validate: { diff --git a/x-pack/plugins/actions/server/routes/legacy/delete.ts b/x-pack/plugins/actions/server/routes/legacy/delete.ts index 2204095e03801..c7e1e985cc6f0 100644 --- a/x-pack/plugins/actions/server/routes/legacy/delete.ts +++ b/x-pack/plugins/actions/server/routes/legacy/delete.ts @@ -32,6 +32,7 @@ export const deleteActionRoute = ( summary: `Delete a connector`, description: 'WARNING: When you delete a connector, it cannot be recovered.', tags: ['oas-tag:connectors'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, validate: { diff --git a/x-pack/plugins/actions/server/routes/legacy/execute.ts b/x-pack/plugins/actions/server/routes/legacy/execute.ts index 8083f884c1186..71b04262075d4 100644 --- a/x-pack/plugins/actions/server/routes/legacy/execute.ts +++ b/x-pack/plugins/actions/server/routes/legacy/execute.ts @@ -37,6 +37,7 @@ export const executeActionRoute = ( options: { access: 'public', summary: `Run a connector`, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, tags: ['oas-tag:connectors'], }, diff --git a/x-pack/plugins/actions/server/routes/legacy/get.ts b/x-pack/plugins/actions/server/routes/legacy/get.ts index 2adf6413b9248..571849ccaf478 100644 --- a/x-pack/plugins/actions/server/routes/legacy/get.ts +++ b/x-pack/plugins/actions/server/routes/legacy/get.ts @@ -31,6 +31,7 @@ export const getActionRoute = ( options: { access: 'public', summary: `Get connector information`, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, tags: ['oas-tag:connectors'], }, diff --git a/x-pack/plugins/actions/server/routes/legacy/get_all.ts b/x-pack/plugins/actions/server/routes/legacy/get_all.ts index 04ba20f4fb3c8..f0a17acb96691 100644 --- a/x-pack/plugins/actions/server/routes/legacy/get_all.ts +++ b/x-pack/plugins/actions/server/routes/legacy/get_all.ts @@ -23,6 +23,7 @@ export const getAllActionRoute = ( options: { access: 'public', summary: `Get all connectors`, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, tags: ['oas-tag:connectors'], }, diff --git a/x-pack/plugins/actions/server/routes/legacy/list_action_types.ts b/x-pack/plugins/actions/server/routes/legacy/list_action_types.ts index f42cd7479286c..cc3e9c23f240d 100644 --- a/x-pack/plugins/actions/server/routes/legacy/list_action_types.ts +++ b/x-pack/plugins/actions/server/routes/legacy/list_action_types.ts @@ -27,6 +27,7 @@ export const listActionTypesRoute = ( options: { access: 'public', summary: `Get connector types`, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, tags: ['oas-tag:connectors'], }, diff --git a/x-pack/plugins/actions/server/routes/legacy/update.ts b/x-pack/plugins/actions/server/routes/legacy/update.ts index 81106c2cdc73b..0bf1ec7ece55d 100644 --- a/x-pack/plugins/actions/server/routes/legacy/update.ts +++ b/x-pack/plugins/actions/server/routes/legacy/update.ts @@ -37,6 +37,7 @@ export const updateActionRoute = ( options: { access: 'public', summary: `Update a connector`, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, tags: ['oas-tag:connectors'], }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/create.ts b/x-pack/plugins/alerting/server/routes/legacy/create.ts index d8505fdc8453d..333877b7df49e 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/create.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/create.ts @@ -65,6 +65,7 @@ export const createAlertRoute = ({ access: isServerless ? 'internal' : 'public', summary: 'Create an alert', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/delete.ts b/x-pack/plugins/alerting/server/routes/legacy/delete.ts index f931af10ccbbf..2b63de9e4ee73 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/delete.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/delete.ts @@ -33,6 +33,7 @@ export const deleteAlertRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Delete an alert', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/disable.ts b/x-pack/plugins/alerting/server/routes/legacy/disable.ts index 486bef89dd197..0c6f3cf062a0c 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/disable.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/disable.ts @@ -34,6 +34,7 @@ export const disableAlertRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Disable an alert', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/enable.ts b/x-pack/plugins/alerting/server/routes/legacy/enable.ts index c5076b3de1a54..d52eaa784f670 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/enable.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/enable.ts @@ -35,6 +35,7 @@ export const enableAlertRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Enable an alert', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/find.ts b/x-pack/plugins/alerting/server/routes/legacy/find.ts index ad85f3c7333b0..fa309ae51f2e4 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/find.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/find.ts @@ -79,6 +79,7 @@ export const findAlertRoute = ( tags: ['oas-tag:alerting'], description: 'Gets a paginated set of alerts. Alert `params` are stored as a flattened field type and analyzed as keywords. As alerts change in Kibana, the results on each page of the response also change. Use the find API for traditional paginated results, but avoid using it to export large amounts of data.', + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/get.ts b/x-pack/plugins/alerting/server/routes/legacy/get.ts index 8437b888f7c0f..e5eff52bf02d6 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/get.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/get.ts @@ -33,6 +33,7 @@ export const getAlertRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Get an alert', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/get_alert_instance_summary.ts b/x-pack/plugins/alerting/server/routes/legacy/get_alert_instance_summary.ts index fd1fae64b538f..58a75dd68dce7 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/get_alert_instance_summary.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/get_alert_instance_summary.ts @@ -44,6 +44,7 @@ export const getAlertInstanceSummaryRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Get an alert summary', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/get_alert_state.ts b/x-pack/plugins/alerting/server/routes/legacy/get_alert_state.ts index 5943ab7203599..e952ef8719667 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/get_alert_state.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/get_alert_state.ts @@ -33,6 +33,7 @@ export const getAlertStateRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Get the state of an alert', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/health.ts b/x-pack/plugins/alerting/server/routes/legacy/health.ts index 90bfda371932a..8f67767941fd2 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/health.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/health.ts @@ -29,6 +29,7 @@ export function healthRoute( access: isServerless ? 'internal' : 'public', summary: 'Get the alerting framework health', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/list_alert_types.ts b/x-pack/plugins/alerting/server/routes/legacy/list_alert_types.ts index 6668ff219ade0..35d6a7efeeee3 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/list_alert_types.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/list_alert_types.ts @@ -25,6 +25,7 @@ export const listAlertTypesRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Get the alert types', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/mute_all.ts b/x-pack/plugins/alerting/server/routes/legacy/mute_all.ts index eaa989dc8fb6a..5c4fc1542ef5b 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/mute_all.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/mute_all.ts @@ -34,6 +34,7 @@ export const muteAllAlertRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Mute all alert instances', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/mute_instance.ts b/x-pack/plugins/alerting/server/routes/legacy/mute_instance.ts index c309dd36b7744..ab0b52d41de29 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/mute_instance.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/mute_instance.ts @@ -37,6 +37,7 @@ export const muteAlertInstanceRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Mute an alert', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/unmute_all.ts b/x-pack/plugins/alerting/server/routes/legacy/unmute_all.ts index 70dfd65e33c79..0681e7d2cf01e 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/unmute_all.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/unmute_all.ts @@ -34,6 +34,7 @@ export const unmuteAllAlertRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Unmute all alert instances', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/unmute_instance.ts b/x-pack/plugins/alerting/server/routes/legacy/unmute_instance.ts index 7990539d6c20d..1101a2b5092e7 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/unmute_instance.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/unmute_instance.ts @@ -35,6 +35,7 @@ export const unmuteAlertInstanceRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Unmute an alert', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/update.ts b/x-pack/plugins/alerting/server/routes/legacy/update.ts index b65579e17b087..01adeb5c634dc 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/update.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/update.ts @@ -61,6 +61,7 @@ export const updateAlertRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Update an alert', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/alerting/server/routes/legacy/update_api_key.ts b/x-pack/plugins/alerting/server/routes/legacy/update_api_key.ts index 06c466333967c..30c51d3cdcf5c 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/update_api_key.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/update_api_key.ts @@ -35,6 +35,7 @@ export const updateApiKeyRoute = ( access: isServerless ? 'internal' : 'public', summary: 'Update the API key for an alert', tags: ['oas-tag:alerting'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, }, diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts index a33b638f5310e..6e8ac79bffec9 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts @@ -31,6 +31,7 @@ export const getAllCommentsRoute = createCasesRoute({ summary: `Gets all case comments`, tags: ['oas-tag:cases'], // description: 'You must have `read` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases with the comments you\'re seeking.', + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, handler: async ({ context, request, response }) => { diff --git a/x-pack/plugins/cases/server/routes/api/stats/get_status.ts b/x-pack/plugins/cases/server/routes/api/stats/get_status.ts index 07d02c0b6713f..dce369e4a0f45 100644 --- a/x-pack/plugins/cases/server/routes/api/stats/get_status.ts +++ b/x-pack/plugins/cases/server/routes/api/stats/get_status.ts @@ -26,6 +26,7 @@ export const getStatusRoute: CaseRoute = createCasesRoute({ description: 'Returns the number of cases that are open, closed, and in progress in the default space.', // You must have `read` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases you're seeking. + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, handler: async ({ context, request, response }) => { diff --git a/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts b/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts index 5edc7a261b3c4..17fe0dcdb9012 100644 --- a/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts +++ b/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts @@ -30,6 +30,7 @@ export const getUserActionsRoute = createCasesRoute({ description: `Returns all user activity for a case.`, // You must have `read` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the case you're seeking. tags: ['oas-tag:cases'], + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }, handler: async ({ context, request, response }) => { diff --git a/x-pack/plugins/fleet/server/routes/agent/index.ts b/x-pack/plugins/fleet/server/routes/agent/index.ts index f3b6e28a90f37..fc45869dc1219 100644 --- a/x-pack/plugins/fleet/server/routes/agent/index.ts +++ b/x-pack/plugins/fleet/server/routes/agent/index.ts @@ -397,6 +397,7 @@ export const registerAPIRoutes = (router: FleetAuthzRouter, config: FleetConfigT fleetAuthz: { fleet: { allAgents: true }, }, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( @@ -618,6 +619,7 @@ export const registerAPIRoutes = (router: FleetAuthzRouter, config: FleetConfigT fleetAuthz: { fleet: { readAgents: true }, }, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( diff --git a/x-pack/plugins/fleet/server/routes/app/index.ts b/x-pack/plugins/fleet/server/routes/app/index.ts index ea5d7be8156d5..c0b7dbcfa1743 100644 --- a/x-pack/plugins/fleet/server/routes/app/index.ts +++ b/x-pack/plugins/fleet/server/routes/app/index.ts @@ -293,6 +293,7 @@ export const registerRoutes = (router: FleetAuthzRouter, config: FleetConfigType fleet: { allAgents: true }, }, description: `Create a service token`, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( diff --git a/x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts b/x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts index a93f63822e5b4..bcf4448420919 100644 --- a/x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts +++ b/x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts @@ -161,6 +161,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { readEnrollmentTokens: true }, }, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( @@ -177,6 +178,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { allAgents: true }, }, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( @@ -193,6 +195,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { readEnrollmentTokens: true }, }, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( @@ -209,6 +212,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { fleetAuthz: { fleet: { allAgents: true }, }, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( diff --git a/x-pack/plugins/fleet/server/routes/epm/index.ts b/x-pack/plugins/fleet/server/routes/epm/index.ts index c7eddee19b9e0..0e3c5e76eb825 100644 --- a/x-pack/plugins/fleet/server/routes/epm/index.ts +++ b/x-pack/plugins/fleet/server/routes/epm/index.ts @@ -659,6 +659,7 @@ export const registerRoutes = (router: FleetAuthzRouter, config: FleetConfigType fleetAuthz, getRouteRequiredAuthz('get', EPM_API_ROUTES.INFO_PATTERN_DEPRECATED) ).granted, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( @@ -687,6 +688,7 @@ export const registerRoutes = (router: FleetAuthzRouter, config: FleetConfigType fleetAuthz: { integrations: { writePackageSettings: true }, }, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( @@ -713,6 +715,7 @@ export const registerRoutes = (router: FleetAuthzRouter, config: FleetConfigType .post({ path: EPM_API_ROUTES.INSTALL_FROM_REGISTRY_PATTERN_DEPRECATED, fleetAuthz: INSTALL_PACKAGES_AUTHZ, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( @@ -741,6 +744,7 @@ export const registerRoutes = (router: FleetAuthzRouter, config: FleetConfigType fleetAuthz: { integrations: { removePackages: true }, }, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( diff --git a/x-pack/plugins/ml/server/routes/system.ts b/x-pack/plugins/ml/server/routes/system.ts index 0804a8dc02348..bf4fa3161f5b9 100644 --- a/x-pack/plugins/ml/server/routes/system.ts +++ b/x-pack/plugins/ml/server/routes/system.ts @@ -202,8 +202,9 @@ export function systemRoutes( options: { tags: ['access:ml:canGetJobs'], }, - deprecated: true, summary: 'ES Search wrapper', + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} + deprecated: true, }) .addVersion( { diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts index 9603e9e9a6d48..2f6e46d1d7727 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts @@ -95,6 +95,7 @@ export function registerEndpointRoutes( access: 'public', path: METADATA_TRANSFORMS_STATUS_ROUTE, options: { authRequired: true, tags: ['access:securitySolution'] }, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.ts b/x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.ts index a4853d9772ad7..677fb004ee862 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.ts @@ -43,6 +43,7 @@ export function registerEndpointSuggestionsRoutes( access: 'public', path: SUGGESTIONS_ROUTE, options: { authRequired: true, tags: ['access:securitySolution'] }, + // @ts-expect-error TODO(https://github.com/elastic/kibana/issues/196095): Replace {RouteDeprecationInfo} deprecated: true, }) .addVersion( diff --git a/x-pack/plugins/upgrade_assistant/README.md b/x-pack/plugins/upgrade_assistant/README.md index 30b403f6d6230..2acac8e3e734d 100644 --- a/x-pack/plugins/upgrade_assistant/README.md +++ b/x-pack/plugins/upgrade_assistant/README.md @@ -17,7 +17,7 @@ When we want to enable ML model snapshot deprecation warnings again we need to c * Migrating system indices (`featureSet.migrateSystemIndices`): Migrating system indices should only be enabled for major version upgrades. This config hides the second step from the UA UI for migrating system indices. * Reindex corrective actions (`featureSet.reindexCorrectiveActions`): Deprecations with reindexing corrective actions are only enabled for major version upgrades. Currently, the reindex actions include some logic that is specific to the [8.0 upgrade](https://github.com/elastic/kibana/blob/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/index_settings.ts). End users could get into a bad situation if this is enabled before this logic is fixed. -### Deprecations +## Deprecations There are three sources of deprecation information: @@ -275,6 +275,47 @@ PUT .reporting-*/_settings } ``` +#### Kibana API deprecations: +Run kibana locally with the test example plugin that has deprecated routes +``` +yarn start --plugin-path=examples/routing_example --plugin-path=examples/developer_examples +``` + +The following comprehensive deprecated routes examples are registered inside the folder: `examples/routing_example/server/routes/deprecated_routes` + +Run them in the console to trigger the deprecation condition so they show up in the UA: + +``` +# Versioned routes: Version 1 is deprecated +GET kbn:/api/routing_example/d/versioned?apiVersion=1 +GET kbn:/api/routing_example/d/versioned?apiVersion=2 + +# Non-versioned routes +GET kbn:/api/routing_example/d/removed_route +POST kbn:/api/routing_example/d/migrated_route +{} +``` + +1. You can also mark as deprecated in the UA to remove the deprecation from the list. +2. Check the telemetry response to see the reported data about the deprecated route. +3. Calling version 2 of the API does not do anything since it is not deprecated unlike version `1` (`GET kbn:/api/routing_example/d/versioned?apiVersion=2`) +4. Internally you can see the deprecations counters from the dev console by running the following: +``` +GET .kibana_usage_counters/_search +{ + "query": { + "bool": { + "should": [ + {"match": { "usage-counter.counterType": "deprecated_api_call:total"}}, + {"match": { "usage-counter.counterType": "deprecated_api_call:resolved"}}, + {"match": { "usage-counter.counterType": "deprecated_api_call:marked_as_resolved"}} + ] + } + } +} + +``` + For a complete list of Kibana deprecations, refer to the [8.0 Kibana deprecations meta issue](https://github.com/elastic/kibana/issues/109166). ### Errors diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/deprecation_details_flyout.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/deprecation_details_flyout.tsx index a6ea9a26c9bb8..beb4c7c0c678c 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/deprecation_details_flyout.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/deprecation_details_flyout.tsx @@ -50,6 +50,12 @@ const i18nTexts = { defaultMessage: 'Quick resolve', } ), + markAsResolvedButtonLabel: i18n.translate( + 'xpack.upgradeAssistant.kibanaDeprecations.flyout.quickResolveButtonLabel', + { + defaultMessage: 'Mark as Resolved', + } + ), retryQuickResolveButtonLabel: i18n.translate( 'xpack.upgradeAssistant.kibanaDeprecations.flyout.retryQuickResolveButtonLabel', { @@ -97,7 +103,15 @@ const i18nTexts = { ), }; -const getQuickResolveButtonLabel = (deprecationResolutionState?: DeprecationResolutionState) => { +interface AvailableCorrectiveActions { + api: boolean; + manual: boolean; + markAsResolved: boolean; +} +const getQuickResolveButtonLabel = ( + deprecationResolutionState: DeprecationResolutionState | undefined, + avilableCorrectiveActions: AvailableCorrectiveActions +) => { if (deprecationResolutionState?.resolveDeprecationStatus === 'in_progress') { return i18nTexts.quickResolveInProgressButtonLabel; } @@ -110,7 +124,13 @@ const getQuickResolveButtonLabel = (deprecationResolutionState?: DeprecationReso return i18nTexts.retryQuickResolveButtonLabel; } - return i18nTexts.quickResolveButtonLabel; + if (avilableCorrectiveActions.api) { + return i18nTexts.quickResolveButtonLabel; + } + + if (avilableCorrectiveActions.markAsResolved) { + return i18nTexts.markAsResolvedButtonLabel; + } }; export const DeprecationDetailsFlyout = ({ @@ -120,9 +140,19 @@ export const DeprecationDetailsFlyout = ({ deprecationResolutionState, }: DeprecationDetailsFlyoutProps) => { const { documentationUrl, message, correctiveActions, title } = deprecation; + const messages = Array.isArray(message) ? message : [message]; + const isCurrent = deprecationResolutionState?.id === deprecation.id; + const avilableCorrectiveActions: AvailableCorrectiveActions = { + api: !!correctiveActions.api, + manual: correctiveActions.manualSteps && correctiveActions.manualSteps.length > 0, + markAsResolved: !!correctiveActions.mark_as_resolved_api, + }; const isResolved = isCurrent && deprecationResolutionState?.resolveDeprecationStatus === 'ok'; + const hasResolveButton = + avilableCorrectiveActions.api || avilableCorrectiveActions.markAsResolved; + const onResolveDeprecation = useCallback(() => { uiMetricService.trackUiMetric(METRIC_TYPE.CLICK, UIM_KIBANA_QUICK_RESOLVE_CLICK); resolveDeprecation(deprecation); @@ -155,7 +185,11 @@ export const DeprecationDetailsFlyout = ({ )} -

{message}

+ {messages.map((m, i) => ( +

+ {m} +

+ ))} {documentationUrl && (

@@ -221,7 +255,7 @@ export const DeprecationDetailsFlyout = ({ {/* Only show the "Quick resolve" button if deprecation supports it and deprecation is not yet resolved */} - {correctiveActions.api && !isResolved && ( + {hasResolveButton && !isResolved && ( - {getQuickResolveButtonLabel(deprecationResolutionState)} + {getQuickResolveButtonLabel(deprecationResolutionState, avilableCorrectiveActions)} )} diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/kibana_deprecations.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/kibana_deprecations.tsx index d76f1afa9e612..0d433a59ee2d9 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/kibana_deprecations.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/kibana_deprecations.tsx @@ -126,9 +126,9 @@ export const KibanaDeprecationsList = ({ const [flyoutContent, setFlyoutContent] = useState( undefined ); - const [deprecationResolutionState, setDeprecationResolutionState] = useState< - DeprecationResolutionState | undefined - >(undefined); + const [deprecationResolutionStates, setDeprecationResolutionStates] = useState< + Record + >({}); const { services: { @@ -194,17 +194,25 @@ export const KibanaDeprecationsList = ({ const resolveDeprecation = useCallback( async (deprecationDetails: KibanaDeprecationDetails) => { - setDeprecationResolutionState({ - id: deprecationDetails.id, - resolveDeprecationStatus: 'in_progress', + setDeprecationResolutionStates((states) => { + states[deprecationDetails.id] = { + id: deprecationDetails.id, + resolveDeprecationStatus: 'in_progress', + }; + + return states; }); const response = await deprecations.resolveDeprecation(deprecationDetails); - setDeprecationResolutionState({ - id: deprecationDetails.id, - resolveDeprecationStatus: response.status, - resolveDeprecationError: response.status === 'fail' ? response.reason : undefined, + setDeprecationResolutionStates((states) => { + states[deprecationDetails.id] = { + id: deprecationDetails.id, + resolveDeprecationStatus: response.status, + resolveDeprecationError: response.status === 'fail' ? response.reason : undefined, + }; + + return states; }); closeFlyout(); @@ -221,10 +229,7 @@ export const KibanaDeprecationsList = ({ deprecation: flyoutContent, closeFlyout, resolveDeprecation, - deprecationResolutionState: - deprecationResolutionState && flyoutContent.id === deprecationResolutionState.id - ? deprecationResolutionState - : undefined, + deprecationResolutionState: deprecationResolutionStates[flyoutContent.id], }, flyoutProps: { onClose: closeFlyout, @@ -236,7 +241,7 @@ export const KibanaDeprecationsList = ({ }, [ addContentToGlobalFlyout, closeFlyout, - deprecationResolutionState, + deprecationResolutionStates, flyoutContent, resolveDeprecation, ]); @@ -310,7 +315,7 @@ export const KibanaDeprecationsList = ({ deprecations={kibanaDeprecations} reload={getAllDeprecations} toggleFlyout={toggleFlyout} - deprecationResolutionState={deprecationResolutionState} + deprecationResolutionStates={deprecationResolutionStates} /> ); diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/kibana_deprecations_table.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/kibana_deprecations_table.tsx index 6a757d0cb2b0b..8d223dedca490 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/kibana_deprecations_table.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/kibana_deprecations_table.tsx @@ -56,6 +56,12 @@ const i18nTexts = { defaultMessage: 'Feature', } ), + apiDeprecationTypeCellLabel: i18n.translate( + 'xpack.upgradeAssistant.kibanaDeprecations.table.apiDeprecationTypeCellLabel', + { + defaultMessage: 'API', + } + ), unknownDeprecationTypeCellLabel: i18n.translate( 'xpack.upgradeAssistant.kibanaDeprecations.table.unknownDeprecationTypeCellLabel', { @@ -86,14 +92,14 @@ interface Props { deprecations?: KibanaDeprecationDetails[]; reload: () => void; toggleFlyout: (newFlyoutContent?: KibanaDeprecationDetails) => void; - deprecationResolutionState?: DeprecationResolutionState; + deprecationResolutionStates: Record; } export const KibanaDeprecationsTable: React.FunctionComponent = ({ deprecations, reload, toggleFlyout, - deprecationResolutionState, + deprecationResolutionStates, }) => { const columns: Array> = [ { @@ -135,6 +141,8 @@ export const KibanaDeprecationsTable: React.FunctionComponent = ({ return i18nTexts.configDeprecationTypeCellLabel; case 'feature': return i18nTexts.featureDeprecationTypeCellLabel; + case 'api': + return i18nTexts.apiDeprecationTypeCellLabel; case 'uncategorized': default: return i18nTexts.unknownDeprecationTypeCellLabel; @@ -155,7 +163,8 @@ export const KibanaDeprecationsTable: React.FunctionComponent = ({ ); }, @@ -191,6 +200,10 @@ export const KibanaDeprecationsTable: React.FunctionComponent = ({ value: 'feature', name: i18nTexts.featureDeprecationTypeCellLabel, }, + { + value: 'api', + name: i18nTexts.apiDeprecationTypeCellLabel, + }, { value: 'uncategorized', name: i18nTexts.unknownDeprecationTypeCellLabel, diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/resolution_table_cell.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/resolution_table_cell.tsx index 373c9e7b43f52..502c31ae90744 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/resolution_table_cell.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/kibana_deprecations/resolution_table_cell.tsx @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; import type { DeprecationResolutionState } from './kibana_deprecations'; -const i18nTexts = { +const manualI18nTexts = { manualCellLabel: i18n.translate( 'xpack.upgradeAssistant.kibanaDeprecations.table.manualCellLabel', { @@ -32,31 +32,34 @@ const i18nTexts = { defaultMessage: 'This issue needs to be resolved manually.', } ), - automatedCellLabel: i18n.translate( +}; + +const automatedI18nTexts = { + resolutionTypeCellLabel: i18n.translate( 'xpack.upgradeAssistant.kibanaDeprecations.table.automatedCellLabel', { defaultMessage: 'Automated', } ), - automationInProgressCellLabel: i18n.translate( + resolutionProgressCellLabel: i18n.translate( 'xpack.upgradeAssistant.kibanaDeprecations.table.automationInProgressCellLabel', { defaultMessage: 'Resolution in progress…', } ), - automationCompleteCellLabel: i18n.translate( + resolutionCompleteCellLabel: i18n.translate( 'xpack.upgradeAssistant.kibanaDeprecations.table.automationCompleteCellLabel', { defaultMessage: 'Resolved', } ), - automationFailedCellLabel: i18n.translate( + resolutionFailedCellLabel: i18n.translate( 'xpack.upgradeAssistant.kibanaDeprecations.table.automationFailedCellLabel', { defaultMessage: 'Resolution failed', } ), - automatedCellTooltipLabel: i18n.translate( + resolutionCellTooltipLabel: i18n.translate( 'xpack.upgradeAssistant.kibanaDeprecations.table.automatedCellTooltipLabel', { defaultMessage: 'This issue can be resolved automatically.', @@ -64,18 +67,56 @@ const i18nTexts = { ), }; +const markAsResolvedI18nTexts = { + resolutionTypeCellLabel: i18n.translate( + 'xpack.upgradeAssistant.kibanaDeprecations.table.markAsResolvedCellLabel', + { + defaultMessage: 'Mark as resolved', + } + ), + resolutionProgressCellLabel: i18n.translate( + 'xpack.upgradeAssistant.kibanaDeprecations.table.markAsResolvedInProgressCellLabel', + { + defaultMessage: 'Marking as resolved…', + } + ), + resolutionCompleteCellLabel: i18n.translate( + 'xpack.upgradeAssistant.kibanaDeprecations.table.markAsResolvedCompleteCellLabel', + { + defaultMessage: 'Marked as resolved', + } + ), + resolutionFailedCellLabel: i18n.translate( + 'xpack.upgradeAssistant.kibanaDeprecations.table.markAsResolvedFailedCellLabel', + { + defaultMessage: 'Failed to mark as resolved', + } + ), + resolutionCellTooltipLabel: i18n.translate( + 'xpack.upgradeAssistant.kibanaDeprecations.table.markAsResolvedCellTooltipLabel', + { + defaultMessage: 'This issue can be marked as resolved.', + } + ), +}; + interface Props { deprecationId: string; isAutomated: boolean; + canBeMarkedAsResolved: boolean; deprecationResolutionState?: DeprecationResolutionState; } export const ResolutionTableCell: React.FunctionComponent = ({ deprecationId, isAutomated, + canBeMarkedAsResolved, deprecationResolutionState, }) => { - if (isAutomated) { + if (isAutomated || canBeMarkedAsResolved) { + const resolutionI18nTexts = isAutomated ? automatedI18nTexts : markAsResolvedI18nTexts; + const euiIconType = isAutomated ? 'indexSettings' : 'clickLeft'; + if (deprecationResolutionState?.id === deprecationId) { const { resolveDeprecationStatus } = deprecationResolutionState; @@ -87,7 +128,7 @@ export const ResolutionTableCell: React.FunctionComponent = ({ - {i18nTexts.automationInProgressCellLabel} + {resolutionI18nTexts.resolutionProgressCellLabel} ); @@ -98,7 +139,7 @@ export const ResolutionTableCell: React.FunctionComponent = ({ - {i18nTexts.automationFailedCellLabel} + {resolutionI18nTexts.resolutionFailedCellLabel} ); @@ -110,7 +151,7 @@ export const ResolutionTableCell: React.FunctionComponent = ({ - {i18nTexts.automationCompleteCellLabel} + {resolutionI18nTexts.resolutionCompleteCellLabel} ); @@ -118,13 +159,13 @@ export const ResolutionTableCell: React.FunctionComponent = ({ } return ( - + - + - {i18nTexts.automatedCellLabel} + {resolutionI18nTexts.resolutionTypeCellLabel} @@ -134,11 +175,11 @@ export const ResolutionTableCell: React.FunctionComponent = ({ return ( - {i18nTexts.manualCellLabel} + {manualI18nTexts.manualCellLabel} ); diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index 03fbddf161f00..2ba14ceb1218c 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -185,6 +185,8 @@ "@kbn/cloud-security-posture-common", "@kbn/saved-objects-management-plugin", "@kbn/alerting-types", - "@kbn/ai-assistant-common" + "@kbn/ai-assistant-common", + "@kbn/core-deprecations-common", + "@kbn/usage-collection-plugin" ] } diff --git a/x-pack/test/upgrade_assistant_integration/config.js b/x-pack/test/upgrade_assistant_integration/config.ts similarity index 70% rename from x-pack/test/upgrade_assistant_integration/config.js rename to x-pack/test/upgrade_assistant_integration/config.ts index 9529e4bc568d3..0794f4d0b9ada 100644 --- a/x-pack/test/upgrade_assistant_integration/config.js +++ b/x-pack/test/upgrade_assistant_integration/config.ts @@ -6,8 +6,10 @@ */ import { commonFunctionalServices } from '@kbn/ftr-common-functional-services'; +import { FtrConfigProviderContext } from '@kbn/test'; +import path from 'node:path'; -export default async function ({ readConfigFile }) { +export default async function ({ readConfigFile }: FtrConfigProviderContext) { // Read the Kibana API integration tests config file so that we can utilize its services. const kibanaAPITestsConfig = await readConfigFile( require.resolve('@kbn/test-suites-src/api_integration/config') @@ -26,7 +28,14 @@ export default async function ({ readConfigFile }) { junit: { reportName: 'X-Pack Upgrade Assistant Integration Tests', }, - kbnTestServer: xPackFunctionalTestsConfig.get('kbnTestServer'), + kbnTestServer: { + ...xPackFunctionalTestsConfig.get('kbnTestServer'), + serverArgs: [ + ...xPackFunctionalTestsConfig.get('kbnTestServer.serverArgs'), + `--plugin-path=${path.resolve(__dirname, '../../../examples/routing_example')}`, + `--plugin-path=${path.resolve(__dirname, '../../../examples/developer_examples')}`, + ], + }, esTestCluster: { ...xPackFunctionalTestsConfig.get('esTestCluster'), // this archive can not be loaded into 8.0+ diff --git a/x-pack/test/upgrade_assistant_integration/upgrade_assistant/api_deprecations.ts b/x-pack/test/upgrade_assistant_integration/upgrade_assistant/api_deprecations.ts new file mode 100644 index 0000000000000..f146bf38f5f26 --- /dev/null +++ b/x-pack/test/upgrade_assistant_integration/upgrade_assistant/api_deprecations.ts @@ -0,0 +1,162 @@ +/* + * 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 expect from '@kbn/expect'; +import { expect as expectExpect } from 'expect'; +import type { DomainDeprecationDetails } from '@kbn/core-deprecations-common'; +import { ApiDeprecationDetails } from '@kbn/core-deprecations-common/src/types'; +import { setTimeout as setTimeoutAsync } from 'timers/promises'; +import { UsageCountersSavedObject } from '@kbn/usage-collection-plugin/server'; +import _ from 'lodash'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +interface DomainApiDeprecationDetails extends ApiDeprecationDetails { + domainId: string; +} + +const getApiDeprecations = (allDeprecations: DomainDeprecationDetails[]) => { + return allDeprecations.filter( + (deprecation) => deprecation.deprecationType === 'api' + ) as unknown as DomainApiDeprecationDetails[]; +}; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + const retry = getService('retry'); + const es = getService('es'); + + describe('Kibana API Deprecations', () => { + before(async () => { + // await kibanaServer.savedObjects.cleanStandardList(); + await esArchiver.emptyKibanaIndex(); + }); + it('returns does not return api deprecations if the routes are not called', async () => { + const { deprecations } = (await supertest.get(`/api/deprecations/`).expect(200)).body; + const apiDeprecations = getApiDeprecations(deprecations); + expect(apiDeprecations.length).to.equal(0); + }); + + it('returns deprecated APIs when the api is called', async () => { + await supertest.get(`/api/routing_example/d/removed_route`).expect(200); + + // sleep a little until the usage counter is synced into ES + await setTimeoutAsync(3000); + await retry.tryForTime( + 15 * 1000, + async () => { + const { deprecations } = (await supertest.get(`/api/deprecations/`).expect(200)).body; + const apiDeprecations = getApiDeprecations(deprecations); + expect(apiDeprecations.length).to.equal(1); + + expectExpect(apiDeprecations[0].correctiveActions.mark_as_resolved_api).toEqual({ + routePath: '/api/routing_example/d/removed_route', + routeMethod: 'get', + apiTotalCalls: 1, + totalMarkedAsResolved: 0, + timestamp: expectExpect.any(String), + }); + + expectExpect(apiDeprecations[0].domainId).toEqual('core.api_deprecations'); + expectExpect(apiDeprecations[0].apiId).toEqual( + 'unversioned|get|/api/routing_example/d/removed_route' + ); + expectExpect(apiDeprecations[0].title).toEqual( + 'The "GET /api/routing_example/d/removed_route" route is removed' + ); + }, + undefined, + 2000 + ); + }); + + it('no longer returns deprecated API when it is marked as resolved', async () => { + await supertest + .post(`/api/deprecations/mark_as_resolved`) + .set('kbn-xsrf', 'xxx') + .send({ + domainId: 'core.api_deprecations', + routePath: '/api/routing_example/d/removed_route', + routeMethod: 'get', + incrementBy: 1, + }) + .expect(200); + + // sleep a little until the usage counter is synced into ES + await setTimeoutAsync(5000); + await retry.tryForTime(15 * 1000, async () => { + const { deprecations } = (await supertest.get(`/api/deprecations/`).expect(200)).body; + const apiDeprecations = getApiDeprecations(deprecations); + expect(apiDeprecations.length).to.equal(0); + }); + }); + + it('returns deprecated API when it is called again after resolved, but with a different message', async () => { + await supertest.get(`/api/routing_example/d/removed_route`).expect(200); + + // sleep a little until the usage counter is synced into ES + await setTimeoutAsync(3000); + await retry.tryForTime( + 15 * 1000, + async () => { + const { deprecations } = (await supertest.get(`/api/deprecations/`).expect(200)).body; + const apiDeprecations = getApiDeprecations(deprecations); + expect(apiDeprecations.length).to.equal(1); + + expectExpect(apiDeprecations[0].correctiveActions.mark_as_resolved_api).toEqual({ + routePath: '/api/routing_example/d/removed_route', + routeMethod: 'get', + apiTotalCalls: 2, + totalMarkedAsResolved: 1, + timestamp: expectExpect.any(String), + }); + }, + undefined, + 2000 + ); + }); + + it('keeps track of all counters via saved objects and core usage counters', async () => { + const should = ['total', 'resolved', 'marked_as_resolved'].map((type) => ({ + match: { 'usage-counter.counterType': `deprecated_api_call:${type}` }, + })); + + const { hits } = await es.search<{ 'usage-counter': UsageCountersSavedObject }>({ + index: '.kibana_usage_counters', + body: { + query: { bool: { should } }, + }, + }); + + expect(hits.hits.length).to.equal(3); + const counters = hits.hits.map((hit) => hit._source!['usage-counter']).sort(); + expectExpect(_.sortBy(counters, 'counterType')).toEqual([ + { + count: 1, + counterName: 'unversioned|get|/api/routing_example/d/removed_route', + counterType: 'deprecated_api_call:marked_as_resolved', + domainId: 'core', + source: 'server', + }, + { + count: 1, + counterName: 'unversioned|get|/api/routing_example/d/removed_route', + counterType: 'deprecated_api_call:resolved', + domainId: 'core', + source: 'server', + }, + { + count: 2, + counterName: 'unversioned|get|/api/routing_example/d/removed_route', + counterType: 'deprecated_api_call:total', + domainId: 'core', + source: 'server', + }, + ]); + }); + }); +} diff --git a/x-pack/test/upgrade_assistant_integration/upgrade_assistant/index.js b/x-pack/test/upgrade_assistant_integration/upgrade_assistant/index.ts similarity index 64% rename from x-pack/test/upgrade_assistant_integration/upgrade_assistant/index.js rename to x-pack/test/upgrade_assistant_integration/upgrade_assistant/index.ts index eb09d24b79b6a..2aaddc7d6f669 100644 --- a/x-pack/test/upgrade_assistant_integration/upgrade_assistant/index.js +++ b/x-pack/test/upgrade_assistant_integration/upgrade_assistant/index.ts @@ -5,8 +5,11 @@ * 2.0. */ -export default function ({ loadTestFile }) { +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { describe('upgrade assistant', function () { loadTestFile(require.resolve('./reindexing')); + loadTestFile(require.resolve('./api_deprecations')); }); } From ae0ac7410de3cfc311d3750d957a81e2a5785d33 Mon Sep 17 00:00:00 2001 From: Krzysztof Kowalczyk Date: Tue, 22 Oct 2024 19:42:20 +0200 Subject: [PATCH 021/146] [Reporting] Add searchSourceStart.create error handling (#197238) ## Summary This PR adds a new type of error (`ReportingSavedObjectNotFoundError`) which gets thrown when passed in saved object doesn't eixst. This produces a log like this: ``` [2024-10-22T15:09:26.768+02:00][ERROR][plugins.reporting.runTask] Error: ReportingError(code: reporting_saved_object_not_found) "Error: Saved object [index-pattern/ff959d40-b880-11e8-a6d9-e546fe2bba5f] not found" ``` Closes: #191548 Closes: #196620 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- packages/kbn-generate-csv/src/generate_csv.ts | 19 ++++++++++++++++++- packages/kbn-generate-csv/tsconfig.json | 1 + packages/kbn-reporting/common/errors.ts | 7 +++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/kbn-generate-csv/src/generate_csv.ts b/packages/kbn-generate-csv/src/generate_csv.ts index cafc6600f51a3..5ed92df84c581 100644 --- a/packages/kbn-generate-csv/src/generate_csv.ts +++ b/packages/kbn-generate-csv/src/generate_csv.ts @@ -26,10 +26,12 @@ import { byteSizeValueToNumber, CancellationToken, ReportingError, + ReportingSavedObjectNotFoundError, } from '@kbn/reporting-common'; import type { TaskInstanceFields, TaskRunResult } from '@kbn/reporting-common/types'; import type { ReportingConfigType } from '@kbn/reporting-server'; +import { TaskErrorSource, createTaskRunError } from '@kbn/task-manager-plugin/server'; import { CONTENT_TYPE_CSV } from '../constants'; import type { JobParamsCSV } from '../types'; import { getExportSettings, type CsvExportSettings } from './lib/get_export_settings'; @@ -235,6 +237,21 @@ export class CsvGenerator { public async generateData(): Promise { const logger = this.logger; + + const createSearchSource = async () => { + try { + const source = await this.dependencies.searchSourceStart.create(this.job.searchSource); + return source; + } catch (err) { + // Saved object not found + if (err?.output?.statusCode === 404) { + const reportingError = new ReportingSavedObjectNotFoundError(err); + throw createTaskRunError(reportingError, TaskErrorSource.USER); + } + throw err; + } + }; + const [settings, searchSource] = await Promise.all([ getExportSettings( this.clients.uiSettings, @@ -243,7 +260,7 @@ export class CsvGenerator { this.job.browserTimezone, logger ), - this.dependencies.searchSourceStart.create(this.job.searchSource), + createSearchSource(), ]); const { startedAt, retryAt } = this.taskInstanceFields; diff --git a/packages/kbn-generate-csv/tsconfig.json b/packages/kbn-generate-csv/tsconfig.json index b57990c20eb4a..4216438b6689a 100644 --- a/packages/kbn-generate-csv/tsconfig.json +++ b/packages/kbn-generate-csv/tsconfig.json @@ -30,5 +30,6 @@ "@kbn/es-types", "@kbn/data-views-plugin", "@kbn/search-types", + "@kbn/task-manager-plugin", ] } diff --git a/packages/kbn-reporting/common/errors.ts b/packages/kbn-reporting/common/errors.ts index 9f45a1b6ae1d5..45a299115bf1b 100644 --- a/packages/kbn-reporting/common/errors.ts +++ b/packages/kbn-reporting/common/errors.ts @@ -152,3 +152,10 @@ export class VisualReportingSoftDisabledError extends ReportingError { }); } } + +export class ReportingSavedObjectNotFoundError extends ReportingError { + static code = 'reporting_saved_object_not_found_error' as const; + public get code(): string { + return ReportingSavedObjectNotFoundError.code; + } +} From c25599ee983c65357a9d63eb843cec101c27f1ea Mon Sep 17 00:00:00 2001 From: Saarika Bhasi <55930906+saarikabhasi@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:59:28 -0400 Subject: [PATCH 022/146] [Search] Enable semantic_text feature in es3 (#197140) ## Summary Semantic text feature was disabled by default due to ML node unable to scale down. With the relevant [PR](https://github.com/elastic/elasticsearch/pull/114323) & subsequent [fix](https://github.com/elastic/elasticsearch/pull/115189) merged, ML node now auto scales when there is no activity. Therefore enabling semantic_text feature in es3. ### Testing instructions * start serverless instance * visit index management index details page -> mappings * Click Add field * Confirm `semantic_text` is shown in the field type form --- config/serverless.es.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/serverless.es.yml b/config/serverless.es.yml index eb3af92c89963..b3b953e5316ac 100644 --- a/config/serverless.es.yml +++ b/config/serverless.es.yml @@ -120,4 +120,4 @@ xpack.searchInferenceEndpoints.ui.enabled: false xpack.search.notebooks.catalog.url: https://elastic-enterprise-search.s3.us-east-2.amazonaws.com/serverless/catalog.json # Semantic text UI -xpack.index_management.dev.enableSemanticText: false +xpack.index_management.dev.enableSemanticText: true From 848c9f48dc101744c8fae69951916dc511dfdc8a Mon Sep 17 00:00:00 2001 From: Vadim Kibana <82822460+vadimkibana@users.noreply.github.com> Date: Tue, 22 Oct 2024 20:05:09 +0200 Subject: [PATCH 023/146] [ES|QL] Normalize multiplication by one when pretty-printing (#197182) ## Summary Partially addresses https://github.com/elastic/kibana/issues/189258 This change will likely supercede https://github.com/elastic/kibana/pull/196817 When parsing, currently ES|QL parsers adds extraneous multiply by 1 or multiply by -1 nodes when parsing arithmetic unary expressions. For example, `-(x)` is parsed as `-1 * x`. This change, reverts these when pretty-printing using the `BasicPrettyPrinter`: `-1 * x` is pretty printed as `-x`. ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels) --- packages/kbn-esql-ast/src/ast/helpers.ts | 27 ++++++- .../__tests__/basic_pretty_printer.test.ts | 62 ++++++++++++++- .../src/pretty_print/basic_pretty_printer.ts | 79 ++++++++++++++++++- .../kbn-esql-ast/src/pretty_print/helpers.ts | 2 +- packages/kbn-esql-ast/src/visitor/utils.ts | 4 + 5 files changed, 169 insertions(+), 5 deletions(-) diff --git a/packages/kbn-esql-ast/src/ast/helpers.ts b/packages/kbn-esql-ast/src/ast/helpers.ts index 9ca49dcb38822..74a7b5c0991e8 100644 --- a/packages/kbn-esql-ast/src/ast/helpers.ts +++ b/packages/kbn-esql-ast/src/ast/helpers.ts @@ -7,11 +7,22 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ESQLAstNode, ESQLBinaryExpression, ESQLFunction } from '../types'; +import type { + ESQLAstNode, + ESQLBinaryExpression, + ESQLColumn, + ESQLFunction, + ESQLIntegerLiteral, + ESQLLiteral, + ESQLProperNode, +} from '../types'; import { BinaryExpressionGroup } from './constants'; +export const isProperNode = (node: unknown): node is ESQLProperNode => + !!node && typeof node === 'object' && !Array.isArray(node); + export const isFunctionExpression = (node: unknown): node is ESQLFunction => - !!node && typeof node === 'object' && !Array.isArray(node) && (node as any).type === 'function'; + isProperNode(node) && node.type === 'function'; /** * Returns true if the given node is a binary expression, i.e. an operator @@ -28,6 +39,18 @@ export const isFunctionExpression = (node: unknown): node is ESQLFunction => export const isBinaryExpression = (node: unknown): node is ESQLBinaryExpression => isFunctionExpression(node) && node.subtype === 'binary-expression'; +export const isLiteral = (node: unknown): node is ESQLLiteral => + isProperNode(node) && node.type === 'literal'; + +export const isIntegerLiteral = (node: unknown): node is ESQLIntegerLiteral => + isLiteral(node) && node.literalType === 'integer'; + +export const isDoubleLiteral = (node: unknown): node is ESQLIntegerLiteral => + isLiteral(node) && node.literalType === 'double'; + +export const isColumn = (node: unknown): node is ESQLColumn => + isProperNode(node) && node.type === 'column'; + /** * Returns the group of a binary expression: * diff --git a/packages/kbn-esql-ast/src/pretty_print/__tests__/basic_pretty_printer.test.ts b/packages/kbn-esql-ast/src/pretty_print/__tests__/basic_pretty_printer.test.ts index 20db9e729f094..9e21c45f75b4b 100644 --- a/packages/kbn-esql-ast/src/pretty_print/__tests__/basic_pretty_printer.test.ts +++ b/packages/kbn-esql-ast/src/pretty_print/__tests__/basic_pretty_printer.test.ts @@ -16,7 +16,7 @@ const reprint = (src: string) => { const { root } = parse(src); const text = BasicPrettyPrinter.print(root); - // console.log(JSON.stringify(ast, null, 2)); + // console.log(JSON.stringify(root, null, 2)); return { text }; }; @@ -194,6 +194,66 @@ describe('single line query', () => { expect(text).toBe('ROW NOT a'); }); + + test('negative numbers', () => { + const { text } = reprint('ROW -1'); + + expect(text).toBe('ROW -1'); + }); + + test('negative numbers in brackets', () => { + const { text } = reprint('ROW -(1)'); + + expect(text).toBe('ROW -1'); + }); + + test('negative column names', () => { + const { text } = reprint('ROW -col'); + + expect(text).toBe('ROW -col'); + }); + + test('plus unary expression', () => { + const { text } = reprint('ROW +(23)'); + + expect(text).toBe('ROW 23'); + }); + + test('chained multiple unary expressions', () => { + const { text } = reprint('ROW ----+-+(23)'); + + expect(text).toBe('ROW -23'); + }); + + test('before another expression', () => { + const { text } = reprint('ROW ----+-+(1 + 1)'); + + expect(text).toBe('ROW -(1 + 1)'); + }); + + test('negative one from the right side', () => { + const { text } = reprint('ROW 2 * -1'); + + expect(text).toBe('ROW -2'); + }); + + test('two minuses is plus', () => { + const { text } = reprint('ROW --123'); + + expect(text).toBe('ROW 123'); + }); + + test('two minuses is plus (float)', () => { + const { text } = reprint('ROW --1.23'); + + expect(text).toBe('ROW 1.23'); + }); + + test('two minuses is plus (with brackets)', () => { + const { text } = reprint('ROW --(123)'); + + expect(text).toBe('ROW 123'); + }); }); describe('postfix unary expression', () => { diff --git a/packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts b/packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts index ec744c65f636e..2f1e3439cd3a3 100644 --- a/packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts +++ b/packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts @@ -7,9 +7,18 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { binaryExpressionGroup } from '../ast/helpers'; +import { + binaryExpressionGroup, + isBinaryExpression, + isColumn, + isDoubleLiteral, + isIntegerLiteral, + isLiteral, + isProperNode, +} from '../ast/helpers'; import { ESQLAstBaseItem, ESQLAstCommand, ESQLAstQueryExpression } from '../types'; import { ESQLAstExpressionNode, Visitor } from '../visitor'; +import { resolveItem } from '../visitor/utils'; import { LeafPrinter } from './leaf_printer'; export interface BasicPrettyPrinterOptions { @@ -152,6 +161,62 @@ export class BasicPrettyPrinter { return formatted; } + protected simplifyMultiplicationByOne( + node: ESQLAstExpressionNode, + minusCount: number = 0 + ): string | undefined { + if (isBinaryExpression(node) && node.name === '*') { + let [left, right] = node.args; + left = resolveItem(left); + right = resolveItem(right); + + if (isProperNode(left) && isProperNode(right)) { + if (!!left.formatting || !!right.formatting) { + return undefined; + } + if (isIntegerLiteral(left)) { + if (left.value === 1) { + return this.simplifyMultiplicationByOne(right, minusCount); + } else if (left.value === -1) { + return this.simplifyMultiplicationByOne(right, minusCount + 1); + } + } + if (isIntegerLiteral(right)) { + if (right.value === 1) { + return this.simplifyMultiplicationByOne(left, minusCount); + } else if (right.value === -1) { + return this.simplifyMultiplicationByOne(left, minusCount + 1); + } + } + return undefined; + } else { + return undefined; + } + } + + const isNegative = minusCount % 2 === 1; + + if (isNegative && (isIntegerLiteral(node) || isDoubleLiteral(node)) && node.value < 0) { + return BasicPrettyPrinter.expression( + { + ...node, + value: Math.abs(node.value), + }, + this.opts + ); + } + + let expression = BasicPrettyPrinter.expression(node, this.opts); + const sign = isNegative ? '-' : ''; + const needsBrackets = !!sign && !isColumn(node) && !isLiteral(node); + + if (needsBrackets) { + expression = `(${expression})`; + } + + return sign ? `${sign}${expression}` : expression; + } + protected readonly visitor: Visitor = new Visitor() .on('visitExpression', (ctx) => { return ''; @@ -237,6 +302,18 @@ export class BasicPrettyPrinter { const groupLeft = binaryExpressionGroup(left); const groupRight = binaryExpressionGroup(right); + if ( + node.name === '*' && + ((isIntegerLiteral(left) && Math.abs(left.value) === 1) || + (isIntegerLiteral(right) && Math.abs(right.value) === 1)) + ) { + const formatted = this.simplifyMultiplicationByOne(node); + + if (formatted) { + return formatted; + } + } + let leftFormatted = ctx.visitArgument(0); let rightFormatted = ctx.visitArgument(1); diff --git a/packages/kbn-esql-ast/src/pretty_print/helpers.ts b/packages/kbn-esql-ast/src/pretty_print/helpers.ts index f9d9daac84e7a..1b4a75a119cb2 100644 --- a/packages/kbn-esql-ast/src/pretty_print/helpers.ts +++ b/packages/kbn-esql-ast/src/pretty_print/helpers.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { ESQLAstBaseItem, ESQLProperNode } from '../types'; +import type { ESQLAstBaseItem, ESQLProperNode } from '../types'; import { Walker } from '../walker'; export interface QueryPrettyPrintStats { diff --git a/packages/kbn-esql-ast/src/visitor/utils.ts b/packages/kbn-esql-ast/src/visitor/utils.ts index 0dc95b73cf9d7..da8544ef46c90 100644 --- a/packages/kbn-esql-ast/src/visitor/utils.ts +++ b/packages/kbn-esql-ast/src/visitor/utils.ts @@ -36,6 +36,10 @@ export const firstItem = (items: ESQLAstItem[]): ESQLSingleAstItem | undefined = } }; +export const resolveItem = (items: ESQLAstItem | ESQLAstItem[]): ESQLAstItem => { + return Array.isArray(items) ? resolveItem(items[0]) : items; +}; + /** * Returns the last normalized "single item" from the "item" list. * From 6a764e726569ed2ec5cd1bccd113b20212a8fdab Mon Sep 17 00:00:00 2001 From: Samiul Monir <150824886+Samiul-TheSoccerFan@users.noreply.github.com> Date: Tue, 22 Oct 2024 14:17:15 -0400 Subject: [PATCH 024/146] [Search: Inference Management UI] Fixing design issues and Removing Duplicate Service Name (#196431) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary This PR includes: - Addressed the comments from https://github.com/elastic/kibana/pull/193642 - Fix CSS to display usage items of inference endpoints ![Screenshot 2024-10-22 at 9 50 47 AM](https://github.com/user-attachments/assets/02cd6323-f9aa-4af6-9a4a-c410ca38b2d9) - Aligned header buttons with title ![Screenshot 2024-10-22 at 9 51 18 AM](https://github.com/user-attachments/assets/98cea438-634d-4cfe-b55a-a07bf56ecc8c) - removed duplicate "Elasticsearch" from Service dropdown ![Screenshot 2024-10-22 at 9 51 54 AM](https://github.com/user-attachments/assets/e4eb0d91-9440-4730-bf63-28695d1060b2) ### Checklist Delete any items that are not applicable to this PR. - [X] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [X] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [X] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [X] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [X] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [X] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [X] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --------- Co-authored-by: Elastic Machine Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../all_inference_endpoints/constants.ts | 2 ++ .../filter/multi_select_filter.tsx | 14 +++++++---- .../component/list_usage_results.test.tsx | 4 ++-- .../actions/component/list_usage_results.tsx | 2 +- .../component/scan_usage_results.test.tsx | 10 ++++---- .../actions/component/scan_usage_results.tsx | 19 ++++++++------- .../actions/component/usage_item.test.tsx | 8 +++---- .../actions/component/usage_item.tsx | 19 +++++++++------ .../delete/confirm_delete_endpoint/index.tsx | 11 +++++---- .../confirm_delete_endpoint/translations.ts | 4 ++-- .../search/table_search.tsx | 1 + .../all_inference_endpoints/types.ts | 2 +- .../components/inference_endpoints_header.tsx | 24 ++++++++++++++----- .../search_inference_endpoints/tsconfig.json | 4 +++- 14 files changed, 77 insertions(+), 47 deletions(-) diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/constants.ts b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/constants.ts index 3e60bc33b049c..7ce1e578f1db0 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/constants.ts +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/constants.ts @@ -32,3 +32,5 @@ export const DEFAULT_INFERENCE_ENDPOINTS_TABLE_STATE: AllInferenceEndpointsTable filterOptions: DEFAULT_FILTER_OPTIONS, queryParams: DEFAULT_QUERY_PARAMS, }; + +export const PIPELINE_URL = 'ingest/ingest_pipelines'; diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/filter/multi_select_filter.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/filter/multi_select_filter.tsx index 84883c4e85432..790bb5ec09913 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/filter/multi_select_filter.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/filter/multi_select_filter.tsx @@ -18,6 +18,7 @@ import { } from '@elastic/eui'; import { css } from '@emotion/react'; import React, { useState } from 'react'; +import _ from 'lodash'; import * as i18n from './translations'; export interface MultiSelectFilterOption { @@ -44,11 +45,14 @@ export const MultiSelectFilter: React.FC = ({ const { euiTheme } = useEuiTheme(); const [isPopoverOpen, setIsPopoverOpen] = useState(false); const toggleIsPopoverOpen = () => setIsPopoverOpen((prevValue) => !prevValue); - const options: MultiSelectFilterOption[] = rawOptions.map(({ key, label }) => ({ - label, - key, - checked: selectedOptionKeys.includes(key) ? 'on' : undefined, - })); + const options: MultiSelectFilterOption[] = _.uniqBy( + rawOptions.map(({ key, label }) => ({ + label, + key, + checked: selectedOptionKeys.includes(key) ? 'on' : undefined, + })), + 'label' + ); return ( diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/list_usage_results.test.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/list_usage_results.test.tsx index 40f821bc104ae..2907cc7ef8014 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/list_usage_results.test.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/list_usage_results.test.tsx @@ -12,11 +12,11 @@ import { render, screen, fireEvent } from '@testing-library/react'; describe('ListUsageResults', () => { const items = [ { - label: 'index-1', + id: 'index-1', type: 'Index', }, { - label: 'pipeline-1', + id: 'pipeline-1', type: 'Pipeline', }, ]; diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/list_usage_results.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/list_usage_results.tsx index d20520345a8ba..d42b0f6735252 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/list_usage_results.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/list_usage_results.tsx @@ -34,7 +34,7 @@ export const ListUsageResults: React.FC = ({ list }) => { {list - .filter((item) => item.label.toLowerCase().includes(term.toLowerCase())) + .filter((item) => item.id.toLowerCase().includes(term.toLowerCase())) .map((item, id) => ( ))} diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/scan_usage_results.test.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/scan_usage_results.test.tsx index d2ec41680d249..a9cb3f1f8d389 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/scan_usage_results.test.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/scan_usage_results.test.tsx @@ -19,11 +19,11 @@ const mockOnCheckboxChange = jest.fn(); describe('ScanUsageResults', () => { const items = [ { - label: 'index-1', + id: 'index-1', type: 'Index', }, { - label: 'pipeline-1', + id: 'pipeline-1', type: 'Pipeline', }, ]; @@ -40,7 +40,7 @@ describe('ScanUsageResults', () => { ); }); @@ -58,9 +58,9 @@ describe('ScanUsageResults', () => { it('opens index management in a new tab', () => { fireEvent.click(screen.getByTestId('inferenceManagementOpenIndexManagement')); - expect(mockNavigateToApp).toHaveBeenCalledWith('enterprise_search', { + expect(mockNavigateToApp).toHaveBeenCalledWith('enterpriseSearchContent', { openInNewTab: true, - path: 'content/search_indices', + path: 'search_indices', }); }); diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/scan_usage_results.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/scan_usage_results.tsx index 0f4aa09c12be4..33d7a4dae891f 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/scan_usage_results.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/scan_usage_results.tsx @@ -17,30 +17,31 @@ import { import React from 'react'; import { euiThemeVars } from '@kbn/ui-theme'; import { css } from '@emotion/react'; +import { ENTERPRISE_SEARCH_CONTENT_APP_ID } from '@kbn/deeplinks-search'; + import { InferenceUsageInfo } from '../../../../types'; import { useKibana } from '../../../../../../hooks/use_kibana'; import { RenderMessageWithIcon } from './render_message_with_icon'; - import * as i18n from '../delete/confirm_delete_endpoint/translations'; import { ListUsageResults } from './list_usage_results'; interface ScanUsageResultsProps { list: InferenceUsageInfo[]; ignoreWarningCheckbox: boolean; - onCheckboxChange: (state: boolean) => void; + onIgnoreWarningCheckboxChange: (state: boolean) => void; } export const ScanUsageResults: React.FC = ({ list, ignoreWarningCheckbox, - onCheckboxChange, + onIgnoreWarningCheckboxChange, }) => { const { services: { application }, } = useKibana(); - const handleNavigateToIndex = () => { - application?.navigateToApp('enterprise_search', { - path: 'content/search_indices', + const handleNavigateToIndexManagement = () => { + application?.navigateToApp(ENTERPRISE_SEARCH_CONTENT_APP_ID, { + path: 'search_indices', openInNewTab: true, }); }; @@ -59,7 +60,7 @@ export const ScanUsageResults: React.FC = ({ - + = ({ = ({ id={'ignoreWarningCheckbox'} label={i18n.IGNORE_POTENTIAL_ERRORS_LABEL} checked={ignoreWarningCheckbox} - onChange={(e) => onCheckboxChange(e.target.checked)} + onChange={(e) => onIgnoreWarningCheckboxChange(e.target.checked)} /> diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/usage_item.test.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/usage_item.test.tsx index 7315de521a1c3..6c6899c71922d 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/usage_item.test.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/usage_item.test.tsx @@ -29,7 +29,7 @@ describe('UsageItem', () => { describe('index', () => { const item: InferenceUsageInfo = { - label: 'index-1', + id: 'index-1', type: 'Index', }; @@ -44,16 +44,16 @@ describe('UsageItem', () => { it('opens index in a new tab', () => { fireEvent.click(screen.getByRole('button')); - expect(mockNavigateToApp).toHaveBeenCalledWith('enterprise_search', { + expect(mockNavigateToApp).toHaveBeenCalledWith('enterpriseSearchContent', { openInNewTab: true, - path: 'content/search_indices/index-1', + path: 'search_indices/index-1', }); }); }); describe('pipeline', () => { const item: InferenceUsageInfo = { - label: 'pipeline-1', + id: 'pipeline-1', type: 'Pipeline', }; diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/usage_item.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/usage_item.tsx index 90bd050d67b81..577b9f8aa0e29 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/usage_item.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/component/usage_item.tsx @@ -14,11 +14,15 @@ import { EuiText, EuiTextTruncate, EuiIcon, + EuiSpacer, } from '@elastic/eui'; import React from 'react'; +import { ENTERPRISE_SEARCH_CONTENT_APP_ID } from '@kbn/deeplinks-search'; +import { MANAGEMENT_APP_ID } from '@kbn/deeplinks-management/constants'; import { useKibana } from '../../../../../../hooks/use_kibana'; import { InferenceUsageInfo } from '../../../../types'; +import { PIPELINE_URL } from '../../../../constants'; interface UsageProps { usageItem: InferenceUsageInfo; @@ -29,27 +33,27 @@ export const UsageItem: React.FC = ({ usageItem }) => { } = useKibana(); const handleNavigateToIndex = () => { if (usageItem.type === 'Index') { - application?.navigateToApp('enterprise_search', { - path: `content/search_indices/${usageItem.label}`, + application?.navigateToApp(ENTERPRISE_SEARCH_CONTENT_APP_ID, { + path: `search_indices/${usageItem.id}`, openInNewTab: true, }); } else if (usageItem.type === 'Pipeline') { - application?.navigateToApp('management', { - path: `ingest/ingest_pipelines?pipeline=${usageItem.label}`, + application?.navigateToApp(MANAGEMENT_APP_ID, { + path: `${PIPELINE_URL}?pipeline=${usageItem.id}`, openInNewTab: true, }); } }; return ( - + - + @@ -58,7 +62,7 @@ export const UsageItem: React.FC = ({ usageItem }) => { - + @@ -66,6 +70,7 @@ export const UsageItem: React.FC = ({ usageItem }) => { + ); diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/confirm_delete_endpoint/index.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/confirm_delete_endpoint/index.tsx index 965f512b32d7d..ea5c35178f9bf 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/confirm_delete_endpoint/index.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/confirm_delete_endpoint/index.tsx @@ -37,7 +37,7 @@ export const ConfirmDeleteEndpointModal: React.FC { + const onIgnoreWarningCheckboxChange = (state: boolean) => { setIgnoreWarningCheckbox(state); if (state) { setDeleteDisabled(false); @@ -50,8 +50,11 @@ export const ConfirmDeleteEndpointModal: React.FC ({ label: index, type: 'Index' })); - const pipelines = data.pipelines.map((pipeline, id) => ({ label: pipeline, type: 'Pipeline' })); + const indices = data.indexes.map((index, id) => ({ id: index, type: 'Index' })); + const pipelines = data.pipelines.map((pipeline, id) => ({ + id: pipeline, + type: 'Pipeline', + })); const usages: InferenceUsageInfo[] = [...indices, ...pipelines]; if (usages.length > 0) { setDeleteDisabled(true); @@ -106,7 +109,7 @@ export const ConfirmDeleteEndpointModal: React.FC )} diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/confirm_delete_endpoint/translations.ts b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/confirm_delete_endpoint/translations.ts index d606e6f3c1b0e..b82fbcdf6b425 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/confirm_delete_endpoint/translations.ts +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/confirm_delete_endpoint/translations.ts @@ -19,7 +19,7 @@ export const CONFIRM_DELETE_WARNING = i18n.translate( 'xpack.searchInferenceEndpoints.confirmDeleteEndpoint.confirmQuestion', { defaultMessage: - 'Deleting an inference endpoint currently in use will cause failures in the ingest and query attempts.', + 'Deleting an inference endpoint currently in use will cause failures in ingest and query attempts.', } ); @@ -54,7 +54,7 @@ export const POTENTIAL_FAILURE_LABEL = i18n.translate( export const IGNORE_POTENTIAL_ERRORS_LABEL = i18n.translate( 'xpack.searchInferenceEndpoints.confirmDeleteEndpoint.ignoreErrors', { - defaultMessage: 'Ignore potential errors and force deletion', + defaultMessage: 'Ignore errors and force deletion', } ); diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/search/table_search.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/search/table_search.tsx index b74e8050e5f92..b3989d60d9123 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/search/table_search.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/search/table_search.tsx @@ -29,6 +29,7 @@ export const TableSearch: React.FC = ({ searchKey, se onChange={(e) => setSearchKey(e.target.value)} onSearch={onSearch} value={searchKey} + data-test-subj="search-field-endpoints" /> ); }; diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/types.ts b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/types.ts index b5c5fc49aa1fa..0eec8a0cb177d 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/types.ts +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/types.ts @@ -64,6 +64,6 @@ export interface InferenceEndpointUI { } export interface InferenceUsageInfo { - label: string; + id: string; type: string; } diff --git a/x-pack/plugins/search_inference_endpoints/public/components/inference_endpoints_header.tsx b/x-pack/plugins/search_inference_endpoints/public/components/inference_endpoints_header.tsx index f12ef3e9fe8cd..acb7e82db13b2 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/inference_endpoints_header.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/inference_endpoints_header.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiPageTemplate, EuiLink } from '@elastic/eui'; +import { EuiPageTemplate, EuiButtonEmpty } from '@elastic/eui'; import React from 'react'; import * as i18n from '../../common/translations'; import { docLinks } from '../../common/doc_links'; @@ -21,16 +21,28 @@ export const InferenceEndpointsHeader: React.FC = () => { description={i18n.MANAGE_INFERENCE_ENDPOINTS_LABEL} bottomBorder={true} rightSideItems={[ - {i18n.API_DOCUMENTATION_LINK} - , - + , + {i18n.VIEW_YOUR_MODELS_LINK} - , + , ]} /> ); diff --git a/x-pack/plugins/search_inference_endpoints/tsconfig.json b/x-pack/plugins/search_inference_endpoints/tsconfig.json index 5b4a66e37d2f5..d454be99b65f0 100644 --- a/x-pack/plugins/search_inference_endpoints/tsconfig.json +++ b/x-pack/plugins/search_inference_endpoints/tsconfig.json @@ -31,7 +31,9 @@ "@kbn/test-jest-helpers", "@kbn/kibana-utils-plugin", "@kbn/features-plugin", - "@kbn/ui-theme" + "@kbn/ui-theme", + "@kbn/deeplinks-search", + "@kbn/deeplinks-management" ], "exclude": [ "target/**/*", From 790613f37b848ed83ebd41a3e07a61deb3d30513 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 22 Oct 2024 20:21:17 +0200 Subject: [PATCH 025/146] [ES|QL] Supports _index_mode in the metadata options (#197167) --- .../src/autocomplete/autocomplete.test.ts | 2 +- .../kbn-esql-validation-autocomplete/src/shared/constants.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts index e463902554074..deb4592428089 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -1123,7 +1123,7 @@ describe('autocomplete', () => { { filterText: '_source', text: '_source, ', command: TRIGGER_SUGGESTION_COMMAND }, ]); // no comma if there are no more fields - testSuggestions('FROM a METADATA _id, _ignored, _index, _source, _version/', [ + testSuggestions('FROM a METADATA _id, _ignored, _index, _source, _index_mode, _version/', [ { filterText: '_version', text: '_version | ', command: TRIGGER_SUGGESTION_COMMAND }, ]); }); diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/constants.ts b/packages/kbn-esql-validation-autocomplete/src/shared/constants.ts index c1942118a41e2..1a9f382d32a6d 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/constants.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/constants.ts @@ -15,4 +15,4 @@ export const SINGLE_TICK_REGEX = /`/g; export const DOUBLE_BACKTICK = '``'; export const SINGLE_BACKTICK = '`'; -export const METADATA_FIELDS = ['_version', '_id', '_index', '_source', '_ignored']; +export const METADATA_FIELDS = ['_version', '_id', '_index', '_source', '_ignored', '_index_mode']; From 87bda295e50aea4ec3372a2cbaed052b68c2c08f Mon Sep 17 00:00:00 2001 From: Rachel Shen Date: Tue, 22 Oct 2024 13:01:38 -0600 Subject: [PATCH 026/146] [Canvas] Update kbn/flot to remove table.replace() issue (#195643) ## Summary Closing https://github.com/elastic/kibana-team/issues/1132 to avoid an issue with Canvas, that is planned to be removed in 10.x. @kbn/flot is being used by the monitoring team so I'm not removing it from Kibana in this PR. --- packages/kbn-flot-charts/lib/jquery_flot.js | 2415 +++++++++++-------- 1 file changed, 1345 insertions(+), 1070 deletions(-) diff --git a/packages/kbn-flot-charts/lib/jquery_flot.js b/packages/kbn-flot-charts/lib/jquery_flot.js index 3b13b317c616c..50524fd8f4926 100644 --- a/packages/kbn-flot-charts/lib/jquery_flot.js +++ b/packages/kbn-flot-charts/lib/jquery_flot.js @@ -1,8 +1,6 @@ /* JavaScript plotting library for jQuery, version 0.8.3. - Copyright (c) 2007-2014 IOLA and Ole Laursen. Licensed under the MIT license. - */ // first an inline dependency, jquery.colorhelpers.js, we inline it here @@ -29,482 +27,602 @@ Licensed under the MIT license. * V. 1.1: Fix error handling so e.g. parsing an empty string does * produce a color rather than just crashing. */ + (function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return valuemax?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); // the actual Flot code +/* Javascript plotting library for jQuery, version 0.9.0-alpha. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +*/ + (function($) { - // Cache the prototype hasOwnProperty for faster access + // A jquery-esque isNumeric method since we currently support 1.4.4 + // and $.isNumeric was introduced on in 1.7 + var isNumeric = $.isNumeric || function(obj) { + return obj - parseFloat( obj ) >= 0; + }; + + /** + * The Canvas object is a wrapper around an HTML5 tag. + * + * @constructor + * @param {string} cls List of classes to apply to the canvas. + * @param {element} container Element onto which to append the canvas. + * + * Requiring a container is a little iffy, but unfortunately canvas + * operations don't work unless the canvas is attached to the DOM. + */ + function Canvas(cls, container) { + + var element = container.children("." + cls)[0]; - var hasOwnProperty = Object.prototype.hasOwnProperty; + if (element == null) { - // A shim to provide 'detach' to jQuery versions prior to 1.4. Using a DOM - // operation produces the same effect as detach, i.e. removing the element - // without touching its jQuery data. + element = document.createElement("canvas"); + element.className = cls; - // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+. + $(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 }) + .appendTo(container); - if (!$.fn.detach) { - $.fn.detach = function() { - return this.each(function() { - if (this.parentNode) { - this.parentNode.removeChild( this ); + // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas + + if (!element.getContext) { + if (window.G_vmlCanvasManager) { + element = window.G_vmlCanvasManager.initElement(element); + } else { + throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode."); } - }); - }; + } + } + + this.element = element; + + var context = this.context = element.getContext("2d"); + + // Determine the screen's ratio of physical to device-independent + // pixels. This is the ratio between the canvas width that the browser + // advertises and the number of pixels actually present in that space. + + // The iPhone 4, for example, has a device-independent width of 320px, + // but its screen is actually 640px wide. It therefore has a pixel + // ratio of 2, while most normal devices have a ratio of 1. + + var devicePixelRatio = window.devicePixelRatio || 1, + backingStoreRatio = + context.webkitBackingStorePixelRatio || + context.mozBackingStorePixelRatio || + context.msBackingStorePixelRatio || + context.oBackingStorePixelRatio || + context.backingStorePixelRatio || 1; + + this.pixelRatio = devicePixelRatio / backingStoreRatio; + + // Size the canvas to match the internal dimensions of its container + + this.resize(container.width(), container.height()); + + // Collection of HTML div layers for text overlaid onto the canvas + + this.textContainer = null; + this.text = {}; + + // Cache of text fragments and metrics, so we can avoid expensively + // re-calculating them when the plot is re-rendered in a loop. + + this._textCache = {}; } - /////////////////////////////////////////////////////////////////////////// - // The Canvas object is a wrapper around an HTML5 tag. - // - // @constructor - // @param {string} cls List of classes to apply to the canvas. - // @param {element} container Element onto which to append the canvas. - // - // Requiring a container is a little iffy, but unfortunately canvas - // operations don't work unless the canvas is attached to the DOM. + /** + * Resizes the canvas to the given dimensions. + * + * @param {number} width New width of the canvas, in pixels. + * @param {number} width New height of the canvas, in pixels. + */ + Canvas.prototype.resize = function(width, height) { + + if (width <= 0 || height <= 0) { + throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height); + } + + var element = this.element, + context = this.context, + pixelRatio = this.pixelRatio; + + // Resize the canvas, increasing its density based on the display's + // pixel ratio; basically giving it more pixels without increasing the + // size of its element, to take advantage of the fact that retina + // displays have that many more pixels in the same advertised space. + + // Resizing should reset the state (excanvas seems to be buggy though) + + if (this.width !== width) { + element.width = width * pixelRatio; + element.style.width = width + "px"; + this.width = width; + } + + if (this.height !== height) { + element.height = height * pixelRatio; + element.style.height = height + "px"; + this.height = height; + } + + // Save the context, so we can reset in case we get replotted. The + // restore ensure that we're really back at the initial state, and + // should be safe even if we haven't saved the initial state yet. + + context.restore(); + context.save(); + + // Scale the coordinate space to match the display density; so even though we + // may have twice as many pixels, we still want lines and other drawing to + // appear at the same size; the extra pixels will just make them crisper. + + context.scale(pixelRatio, pixelRatio); + }; + + /** + * Clears the entire canvas area, not including any overlaid HTML text + */ + Canvas.prototype.clear = function() { + this.context.clearRect(0, 0, this.width, this.height); + }; + + /** + * Finishes rendering the canvas, including managing the text overlay. + */ + Canvas.prototype.render = function() { + + var cache = this._textCache; + + // For each text layer, add elements marked as active that haven't + // already been rendered, and remove those that are no longer active. + + for (var layerKey in cache) { + if (Object.prototype.hasOwnProperty.call(cache, layerKey)) { + + var layer = this.getTextLayer(layerKey), + layerCache = cache[layerKey]; + + layer.hide(); + + for (var styleKey in layerCache) { + if (Object.prototype.hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey]; + for (var angleKey in styleCache) { + if (Object.prototype.hasOwnProperty.call(styleCache, angleKey)) { + var angleCache = styleCache[angleKey]; + for (var key in angleCache) { + if (Object.prototype.hasOwnProperty.call(angleCache, key)) { + + var positions = angleCache[key].positions; + + for (var i = 0, position; position = positions[i]; i++) { + if (position.active) { + if (!position.rendered) { + layer.append(position.element); + position.rendered = true; + } + } else { + positions.splice(i--, 1); + if (position.rendered) { + position.element.detach(); + } + } + } + + if (positions.length === 0) { + delete angleCache[key]; + } + } + } + } + } + } + } + + layer.show(); + } + } + }; + + /** + * Creates (if necessary) and returns the text overlay container. + * + * @param {string} classes String of space-separated CSS classes used to + * uniquely identify the text layer. + * @return {object} The jQuery-wrapped text-layer div. + */ + Canvas.prototype.getTextLayer = function(classes) { + + var layer = this.text[classes]; + + // Create the text layer if it doesn't exist + + if (layer == null) { + + // Create the text layer container, if it doesn't exist + + if (this.textContainer == null) { + this.textContainer = $("

") + .css({ + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0, + "font-size": "smaller", + color: "#545454" + }) + .insertAfter(this.element); + } + + layer = this.text[classes] = $("
") + .addClass(classes) + .css({ + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0 + }) + .appendTo(this.textContainer); + } - function Canvas(cls, container) { + return layer; + }; - var element = container.children("." + cls)[0]; + /** + * Creates (if necessary) and returns a text info object. + * + * The object looks like this: + * + * { + * width: Width of the text's wrapper div. + * height: Height of the text's wrapper div. + * element: The jQuery-wrapped HTML div containing the text. + * positions: Array of positions at which this text is drawn. + * } + * + * The positions array contains objects that look like this: + * + * { + * active: Flag indicating whether the text should be visible. + * rendered: Flag indicating whether the text is currently visible. + * element: The jQuery-wrapped HTML div containing the text. + * x: X coordinate at which to draw the text. + * y: Y coordinate at which to draw the text. + * } + * + * Each position after the first receives a clone of the original element. + * + * The idea is that that the width, height, and general 'identity' of the + * text is constant no matter where it is placed; the placements are a + * secondary property. + * + * Canvas maintains a cache of recently-used text info objects; getTextInfo + * either returns the cached element or creates a new entry. + * + * @param {string} layer A string of space-separated CSS classes uniquely + * identifying the layer containing this text. + * @param {string} text Text string to retrieve info for. + * @param {(string|object)=} font Either a string of space-separated CSS + * classes or a font-spec object, defining the text's font and style. + * @param {number=} angle Angle at which to rotate the text, in degrees. + * @param {number=} width Maximum width of the text before it wraps. + * @return {object} a text info object. + */ + Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) { + + var textStyle, layerCache, styleCache, angleCache, info; + + text = "" + text; // Cast to string in case we have a number or such + angle = (360 + (angle || 0)) % 360; // Normalize the angle to 0...359 + + // If the font is a font-spec object, generate a CSS font definition + + if (typeof font === "object") { + textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family; + } else { + textStyle = font; + } - if (element == null) { + // Retrieve or create the caches for the text's layer, style, and angle - element = document.createElement("canvas"); - element.className = cls; + layerCache = this._textCache[layer]; + if (layerCache == null) { + layerCache = this._textCache[layer] = {}; + } - $(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 }) - .appendTo(container); + styleCache = layerCache[textStyle]; + if (styleCache == null) { + styleCache = layerCache[textStyle] = {}; + } - // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas + angleCache = styleCache[angle]; + if (angleCache == null) { + angleCache = styleCache[angle] = {}; + } - if (!element.getContext) { - if (window.G_vmlCanvasManager) { - element = window.G_vmlCanvasManager.initElement(element); - } else { - throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode."); - } - } - } + info = angleCache[text]; - this.element = element; + // If we can't find a matching element in our cache, create a new one - var context = this.context = element.getContext("2d"); + if (info == null) { - // Determine the screen's ratio of physical to device-independent - // pixels. This is the ratio between the canvas width that the browser - // advertises and the number of pixels actually present in that space. + var element = $("
").html(text) + .css({ + position: "absolute", + "max-width": width, + top: -9999 + }) + .appendTo(this.getTextLayer(layer)); - // The iPhone 4, for example, has a device-independent width of 320px, - // but its screen is actually 640px wide. It therefore has a pixel - // ratio of 2, while most normal devices have a ratio of 1. + if (typeof font === "object") { + element.css({ + font: textStyle, + color: font.color + }); + } else if (typeof font === "string") { + element.addClass(font); + } + + // Save the original dimensions of the text; we'll modify these + // later to take into account rotation, if there is any. + + var textWidth = element.outerWidth(true), + textHeight = element.outerHeight(true); + + // Apply rotation to the text using CSS3/IE matrix transforms + + // Note how we also set the element's width, as a work-around for + // the way most browsers resize the div on rotate, which may cause + // the contents to wrap differently. The extra +1 is because IE + // rounds the width differently and needs a little extra help. + + if (angle) { + + var radians = angle * Math.PI / 180, + sin = Math.sin(radians), + cos = Math.cos(radians), + a = cos.toFixed(6), // Use fixed-point so these don't + b = (-sin).toFixed(6), // show up in scientific notation + c = sin.toFixed(6), // when we add them to the string + transformRule; + + if ($.support.leadingWhitespace) { + + // The transform origin defaults to '50% 50%', producing + // blurry text on some browsers (Chrome) when the width or + // height happens to be odd, making 50% fractional. Avoid + // this by setting the origin to rounded values. + + var cx = textWidth / 2, + cy = textHeight / 2, + transformOrigin = Math.floor(cx) + "px " + Math.floor(cy) + "px"; + + // Transforms alter the div's appearance without changing + // its origin. This will make it difficult to position it + // later, since we'll be positioning the new bounding box + // with respect to the old origin. We can work around this + // by adding a translation to align the new bounding box's + // top-left corner with the origin, using the same matrix. + + // Rather than examining all four points, we can use the + // angle to figure out in advance which two points are in + // the top-left quadrant; we can then use the x-coordinate + // of the first (left-most) point and the y-coordinate of + // the second (top-most) point as the bounding box corner. + + var x, y; + if (angle < 90) { + x = Math.floor(cx * cos + cy * sin - cx); + y = Math.floor(cx * sin + cy * cos - cy); + } else if (angle < 180) { + x = Math.floor(cy * sin - cx * cos - cx); + y = Math.floor(cx * sin - cy * cos - cy); + } else if (angle < 270) { + x = Math.floor(-cx * cos - cy * sin - cx); + y = Math.floor(-cx * sin - cy * cos - cy); + } else { + x = Math.floor(cx * cos - cy * sin - cx); + y = Math.floor(cy * cos - cx * sin - cy); + } + + transformRule = "matrix(" + a + "," + c + "," + b + "," + a + "," + x + "," + y + ")"; + + element.css({ + width: textWidth + 1, + transform: transformRule, + "-o-transform": transformRule, + "-ms-transform": transformRule, + "-moz-transform": transformRule, + "-webkit-transform": transformRule, + "transform-origin": transformOrigin, + "-o-transform-origin": transformOrigin, + "-ms-transform-origin": transformOrigin, + "-moz-transform-origin": transformOrigin, + "-webkit-transform-origin": transformOrigin + }); - var devicePixelRatio = window.devicePixelRatio || 1, - backingStoreRatio = - context.webkitBackingStorePixelRatio || - context.mozBackingStorePixelRatio || - context.msBackingStorePixelRatio || - context.oBackingStorePixelRatio || - context.backingStorePixelRatio || 1; + } else { - this.pixelRatio = devicePixelRatio / backingStoreRatio; + // The IE7/8 matrix filter produces very ugly aliasing for + // text with a transparent background. Using a solid color + // greatly improves text clarity, although it does result + // in ugly boxes for plots using a non-white background. - // Size the canvas to match the internal dimensions of its container + // TODO: Instead of white use the actual background color? + // This still wouldn't solve the problem when the plot has + // a gradient background, but it would at least help. - this.resize(container.width(), container.height()); + transformRule = "progid:DXImageTransform.Microsoft.Matrix(M11=" + a + ", M12=" + b + ", M21=" + c + ", M22=" + a + ",sizingMethod='auto expand')"; - // Collection of HTML div layers for text overlaid onto the canvas + element.css({ + width: textWidth + 1, + filter: transformRule, + "-ms-filter": transformRule, + "background-color": "#fff" + }); + } - this.textContainer = null; - this.text = {}; + // Compute the final dimensions of the text's bounding box - // Cache of text fragments and metrics, so we can avoid expensively - // re-calculating them when the plot is re-rendered in a loop. + var ac = Math.abs(cos), + as = Math.abs(sin), + originalWidth = textWidth; + textWidth = Math.round(ac * textWidth + as * textHeight); + textHeight = Math.round(as * originalWidth + ac * textHeight); + } - this._textCache = {}; - } + info = angleCache[text] = { + width: textWidth, + height: textHeight, + element: element, + positions: [] + }; - // Resizes the canvas to the given dimensions. - // - // @param {number} width New width of the canvas, in pixels. - // @param {number} width New height of the canvas, in pixels. + element.detach(); + } - Canvas.prototype.resize = function(width, height) { + return info; + }; - if (width <= 0 || height <= 0) { - throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height); - } + /** + * Adds a text string to the canvas text overlay. + * + * The text isn't drawn immediately; it is marked as rendering, which will + * result in its addition to the canvas on the next render pass. + * + * @param {string} layer A string of space-separated CSS classes uniquely + * identifying the layer containing this text. + * @param {number} x X coordinate at which to draw the text. + * @param {number} y Y coordinate at which to draw the text. + * @param {string} text Text string to draw. + * @param {(string|object)=} font Either a string of space-separated CSS + * classes or a font-spec object, defining the text's font and style. + * @param {number=} angle Angle at which to rotate the text, in degrees. + * @param {number=} width Maximum width of the text before it wraps. + * @param {string=} halign Horizontal alignment of the text; either "left", + * "center" or "right". + * @param {string=} valign Vertical alignment of the text; either "top", + * "middle" or "bottom". + */ + Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) { + + var info = this.getTextInfo(layer, text, font, angle, width), + positions = info.positions; + + // Tweak the div's position to match the text's alignment + + if (halign === "center") { + x -= info.width / 2; + } else if (halign === "right") { + x -= info.width; + } - var element = this.element, - context = this.context, - pixelRatio = this.pixelRatio; + if (valign === "middle") { + y -= info.height / 2; + } else if (valign === "bottom") { + y -= info.height; + } - // Resize the canvas, increasing its density based on the display's - // pixel ratio; basically giving it more pixels without increasing the - // size of its element, to take advantage of the fact that retina - // displays have that many more pixels in the same advertised space. + // Determine whether this text already exists at this position. + // If so, mark it for inclusion in the next render pass. - // Resizing should reset the state (excanvas seems to be buggy though) + for (var i = 0, position; position = positions[i]; i++) { + if (position.x === x && position.y === y) { + position.active = true; + return; + } + } - if (this.width != width) { - element.width = width * pixelRatio; - element.style.width = width + "px"; - this.width = width; - } + // If the text doesn't exist at this position, create a new entry - if (this.height != height) { - element.height = height * pixelRatio; - element.style.height = height + "px"; - this.height = height; - } + // For the very first position we'll re-use the original element, + // while for subsequent ones we'll clone it. - // Save the context, so we can reset in case we get replotted. The - // restore ensure that we're really back at the initial state, and - // should be safe even if we haven't saved the initial state yet. + position = { + active: true, + rendered: false, + element: positions.length ? info.element.clone() : info.element, + x: x, + y: y + }; - context.restore(); - context.save(); + positions.push(position); - // Scale the coordinate space to match the display density; so even though we - // may have twice as many pixels, we still want lines and other drawing to - // appear at the same size; the extra pixels will just make them crisper. + // Move the element to its final position within the container - context.scale(pixelRatio, pixelRatio); - }; + position.element.css({ + top: Math.round(y), + left: Math.round(x), + "text-align": halign // In case the text wraps + }); + }; - // Clears the entire canvas area, not including any overlaid HTML text - - Canvas.prototype.clear = function() { - this.context.clearRect(0, 0, this.width, this.height); - }; - - // Finishes rendering the canvas, including managing the text overlay. - - Canvas.prototype.render = function() { - - var cache = this._textCache; - - // For each text layer, add elements marked as active that haven't - // already been rendered, and remove those that are no longer active. - - for (var layerKey in cache) { - if (hasOwnProperty.call(cache, layerKey)) { - - var layer = this.getTextLayer(layerKey), - layerCache = cache[layerKey]; - - layer.hide(); - - for (var styleKey in layerCache) { - if (hasOwnProperty.call(layerCache, styleKey)) { - var styleCache = layerCache[styleKey]; - for (var key in styleCache) { - if (hasOwnProperty.call(styleCache, key)) { - - var positions = styleCache[key].positions; - - for (var i = 0, position; position = positions[i]; i++) { - if (position.active) { - if (!position.rendered) { - layer.append(position.element); - position.rendered = true; - } - } else { - positions.splice(i--, 1); - if (position.rendered) { - position.element.detach(); - } - } - } - - if (positions.length == 0) { - delete styleCache[key]; - } - } - } - } - } - - layer.show(); - } - } - }; - - // Creates (if necessary) and returns the text overlay container. - // - // @param {string} classes String of space-separated CSS classes used to - // uniquely identify the text layer. - // @return {object} The jQuery-wrapped text-layer div. - - Canvas.prototype.getTextLayer = function(classes) { - - var layer = this.text[classes]; - - // Create the text layer if it doesn't exist - - if (layer == null) { - - // Create the text layer container, if it doesn't exist - - if (this.textContainer == null) { - this.textContainer = $("
") - .css({ - position: "absolute", - top: 0, - left: 0, - bottom: 0, - right: 0, - 'font-size': "smaller", - color: "#545454" - }) - .insertAfter(this.element); - } - - layer = this.text[classes] = $("
") - .addClass(classes) - .css({ - position: "absolute", - top: 0, - left: 0, - bottom: 0, - right: 0 - }) - .appendTo(this.textContainer); - } - - return layer; - }; - - // Creates (if necessary) and returns a text info object. - // - // The object looks like this: - // - // { - // width: Width of the text's wrapper div. - // height: Height of the text's wrapper div. - // element: The jQuery-wrapped HTML div containing the text. - // positions: Array of positions at which this text is drawn. - // } - // - // The positions array contains objects that look like this: - // - // { - // active: Flag indicating whether the text should be visible. - // rendered: Flag indicating whether the text is currently visible. - // element: The jQuery-wrapped HTML div containing the text. - // x: X coordinate at which to draw the text. - // y: Y coordinate at which to draw the text. - // } - // - // Each position after the first receives a clone of the original element. - // - // The idea is that that the width, height, and general 'identity' of the - // text is constant no matter where it is placed; the placements are a - // secondary property. - // - // Canvas maintains a cache of recently-used text info objects; getTextInfo - // either returns the cached element or creates a new entry. - // - // @param {string} layer A string of space-separated CSS classes uniquely - // identifying the layer containing this text. - // @param {string} text Text string to retrieve info for. - // @param {(string|object)=} font Either a string of space-separated CSS - // classes or a font-spec object, defining the text's font and style. - // @param {number=} angle Angle at which to rotate the text, in degrees. - // Angle is currently unused, it will be implemented in the future. - // @param {number=} width Maximum width of the text before it wraps. - // @return {object} a text info object. - - Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) { - - var textStyle, layerCache, styleCache, info; - - // Cast the value to a string, in case we were given a number or such - - text = "" + text; - - // If the font is a font-spec object, generate a CSS font definition - - if (typeof font === "object") { - textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family; - } else { - textStyle = font; - } - - // Retrieve (or create) the cache for the text's layer and styles - - layerCache = this._textCache[layer]; - - if (layerCache == null) { - layerCache = this._textCache[layer] = {}; - } - - styleCache = layerCache[textStyle]; - - if (styleCache == null) { - styleCache = layerCache[textStyle] = {}; - } - - info = styleCache[text]; - - // If we can't find a matching element in our cache, create a new one - - if (info == null) { - - var element = $("
").text(text) - .css({ - position: "absolute", - 'max-width': width, - top: -9999 - }) - .appendTo(this.getTextLayer(layer)); - - if (typeof font === "object") { - element.css({ - font: textStyle, - color: font.color - }); - } else if (typeof font === "string") { - element.addClass(font); - } - - info = styleCache[text] = { - width: element.outerWidth(true), - height: element.outerHeight(true), - element: element, - positions: [] - }; - - element.detach(); - } - - return info; - }; - - // Adds a text string to the canvas text overlay. - // - // The text isn't drawn immediately; it is marked as rendering, which will - // result in its addition to the canvas on the next render pass. - // - // @param {string} layer A string of space-separated CSS classes uniquely - // identifying the layer containing this text. - // @param {number} x X coordinate at which to draw the text. - // @param {number} y Y coordinate at which to draw the text. - // @param {string} text Text string to draw. - // @param {(string|object)=} font Either a string of space-separated CSS - // classes or a font-spec object, defining the text's font and style. - // @param {number=} angle Angle at which to rotate the text, in degrees. - // Angle is currently unused, it will be implemented in the future. - // @param {number=} width Maximum width of the text before it wraps. - // @param {string=} halign Horizontal alignment of the text; either "left", - // "center" or "right". - // @param {string=} valign Vertical alignment of the text; either "top", - // "middle" or "bottom". - - Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) { - - var info = this.getTextInfo(layer, text, font, angle, width), - positions = info.positions; - - // Tweak the div's position to match the text's alignment - - if (halign == "center") { - x -= info.width / 2; - } else if (halign == "right") { - x -= info.width; - } - - if (valign == "middle") { - y -= info.height / 2; - } else if (valign == "bottom") { - y -= info.height; - } - - // Determine whether this text already exists at this position. - // If so, mark it for inclusion in the next render pass. - - for (var i = 0, position; position = positions[i]; i++) { - if (position.x == x && position.y == y) { - position.active = true; - return; - } - } - - // If the text doesn't exist at this position, create a new entry - - // For the very first position we'll re-use the original element, - // while for subsequent ones we'll clone it. - - position = { - active: true, - rendered: false, - element: positions.length ? info.element.clone() : info.element, - x: x, - y: y - }; - - positions.push(position); - - // Move the element to its final position within the container - - position.element.css({ - top: Math.round(y), - left: Math.round(x), - 'text-align': halign // In case the text wraps - }); - }; - - // Removes one or more text strings from the canvas text overlay. - // - // If no parameters are given, all text within the layer is removed. - // - // Note that the text is not immediately removed; it is simply marked as - // inactive, which will result in its removal on the next render pass. - // This avoids the performance penalty for 'clear and redraw' behavior, - // where we potentially get rid of all text on a layer, but will likely - // add back most or all of it later, as when redrawing axes, for example. - // - // @param {string} layer A string of space-separated CSS classes uniquely - // identifying the layer containing this text. - // @param {number=} x X coordinate of the text. - // @param {number=} y Y coordinate of the text. - // @param {string=} text Text string to remove. - // @param {(string|object)=} font Either a string of space-separated CSS - // classes or a font-spec object, defining the text's font and style. - // @param {number=} angle Angle at which the text is rotated, in degrees. - // Angle is currently unused, it will be implemented in the future. - - Canvas.prototype.removeText = function(layer, x, y, text, font, angle) { - if (text == null) { - var layerCache = this._textCache[layer]; - if (layerCache != null) { - for (var styleKey in layerCache) { - if (hasOwnProperty.call(layerCache, styleKey)) { - var styleCache = layerCache[styleKey]; - for (var key in styleCache) { - if (hasOwnProperty.call(styleCache, key)) { - var positions = styleCache[key].positions; - for (var i = 0, position; position = positions[i]; i++) { - position.active = false; - } - } - } - } - } - } - } else { - var positions = this.getTextInfo(layer, text, font, angle).positions; - for (var i = 0, position; position = positions[i]; i++) { - if (position.x == x && position.y == y) { - position.active = false; - } - } - } - }; - - /////////////////////////////////////////////////////////////////////////// - // The top-level container for the entire plot. + /** + * Removes one or more text strings from the canvas text overlay. + * + * If no parameters are given, all text within the layer is removed. + * + * Note that the text is not immediately removed; it is simply marked as + * inactive, which will result in its removal on the next render pass. + * This avoids the performance penalty for 'clear and redraw' behavior, + * where we potentially get rid of all text on a layer, but will likely + * add back most or all of it later, as when redrawing axes, for example. + * + * @param {string} layer A string of space-separated CSS classes uniquely + * identifying the layer containing this text. + * @param {number=} x X coordinate of the text. + * @param {number=} y Y coordinate of the text. + * @param {string=} text Text string to remove. + * @param {(string|object)=} font Either a string of space-separated CSS + * classes or a font-spec object, defining the text's font and style. + * @param {number=} angle Angle at which the text is rotated, in degrees. + * Angle is currently unused, it will be implemented in the future. + */ + Canvas.prototype.removeText = function(layer, x, y, text, font, angle) { + var i, positions, position; + if (text == null) { + var layerCache = this._textCache[layer]; + if (layerCache != null) { + for (var styleKey in layerCache) { + if (Object.prototype.hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey]; + for (var angleKey in styleCache) { + if (Object.prototype.hasOwnProperty.call(styleCache, angleKey)) { + var angleCache = styleCache[angleKey]; + for (var key in angleCache) { + if (Object.prototype.hasOwnProperty.call(angleCache, key)) { + positions = angleCache[key].positions; + for (i = 0; position = positions[i]; i++) { + position.active = false; + } + } + } + } + } + } + } + } + } else { + positions = this.getTextInfo(layer, text, font, angle).positions; + for (i = 0; position = positions[i]; i++) { + if (position.x === x && position.y === y) { + position.active = false; + } + } + } + }; + /** + * The top-level container for the entire plot. + */ function Plot(placeholder, data_, options_, plugins) { // data is on the form: // [ series1, series2 ... ] @@ -517,7 +635,7 @@ Licensed under the MIT license. colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], legend: { show: true, - noColumns: 1, // number of columns in legend table + noColumns: 1, // number of colums in legend table labelFormatter: null, // fn: string -> string labelBoxBorderColor: "#ccc", // border color for the little label boxes container: null, // container (as jQuery object) to put legend in, null means default on top of graph @@ -528,31 +646,45 @@ Licensed under the MIT license. sorted: null // default to no legend sorting }, xaxis: { - show: null, // null = auto-detect, true = always, false = never - position: "bottom", // or "top" - mode: null, // null or "time" - font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" } - color: null, // base color, labels, ticks - tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" - transform: null, // null or f: number -> number to transform axis + + show: null, // null = auto-detect, true = always, false = never + position: "bottom", // or "top" + mode: null, // null or "time" + + color: null, // base color, labels, ticks + font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" } + + min: null, // min. value to show, null means set automatically + max: null, // max. value to show, null means set automatically + autoscaleMargin: null, // margin in % to add if auto-setting min/max + + transform: null, // null or f: number -> number to transform axis inverseTransform: null, // if transform is set, this should be the inverse function - min: null, // min. value to show, null means set automatically - max: null, // max. value to show, null means set automatically - autoscaleMargin: null, // margin in % to add if auto-setting min/max - ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks - tickFormatter: null, // fn: number -> string - labelWidth: null, // size of tick labels in pixels - labelHeight: null, - reserveSpace: null, // whether to reserve space even if axis isn't shown - tickLength: null, // size in pixels of ticks, or "full" for whole line - alignTicksWithAxis: null, // axis number or null for no sync - tickDecimals: null, // no. of decimals, null means auto - tickSize: null, // number or [number, "unit"] - minTickSize: null // number or [number, "unit"] + + ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks + tickSize: null, // number or [number, "unit"] + minTickSize: null, // number or [number, "unit"] + tickFormatter: null, // fn: number -> string + tickDecimals: null, // no. of decimals, null means auto + + tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" + tickLength: null, // size in pixels of ticks, or "full" for whole line + + tickWidth: null, // width of tick labels in pixels + tickHeight: null, // height of tick labels in pixels + tickFont: null, // null or font-spec object (see font, above) + + label: null, // null or an axis label string + labelFont: null, // null or font-spec object (see font, above) + labelPadding: 2, // spacing between the axis and its label + + reserveSpace: null, // whether to reserve space even if axis isn't shown + alignTicksWithAxis: null // axis number or null for no sync }, yaxis: { + position: "left", // or "right" autoscaleMargin: 0.02, - position: "left" // or "right" + labelPadding: 2 }, xaxes: [], yaxes: [], @@ -563,6 +695,7 @@ Licensed under the MIT license. lineWidth: 2, // in pixels fill: true, fillColor: "#ffffff", + strokeColor: null, symbol: "circle" // or callback }, lines: { @@ -614,26 +747,26 @@ Licensed under the MIT license. }, hooks: {} }, - surface = null, // the canvas for the plot itself - overlay = null, // canvas for interactive stuff on top of plot - eventHolder = null, // jQuery object that events should be bound to - ctx = null, octx = null, - xaxes = [], yaxes = [], - plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, - plotWidth = 0, plotHeight = 0, - hooks = { - processOptions: [], - processRawData: [], - processDatapoints: [], - processOffset: [], - drawBackground: [], - drawSeries: [], - draw: [], - bindEvents: [], - drawOverlay: [], - shutdown: [] - }, - plot = this; + surface = null, // the canvas for the plot itself + overlay = null, // canvas for interactive stuff on top of plot + eventHolder = null, // jQuery object that events should be bound to + ctx = null, octx = null, + xaxes = [], yaxes = [], + plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, + plotWidth = 0, plotHeight = 0, + hooks = { + processOptions: [], + processRawData: [], + processDatapoints: [], + processOffset: [], + drawBackground: [], + drawSeries: [], + draw: [], + bindEvents: [], + drawOverlay: [], + shutdown: [] + }, + plot = this; // public functions plot.setData = setData; @@ -652,10 +785,11 @@ Licensed under the MIT license. }; plot.getData = function () { return series; }; plot.getAxes = function () { - var res = {}, i; + var res = {}; $.each(xaxes.concat(yaxes), function (_, axis) { - if (axis) - res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis; + if (axis) { + res[axis.direction + (axis.n !== 1 ? axis.n : "") + "axis"] = axis; + } }); return res; }; @@ -674,26 +808,9 @@ Licensed under the MIT license. }; }; plot.shutdown = shutdown; - plot.destroy = function () { - shutdown(); - placeholder.removeData("plot").empty(); - - series = []; - options = null; - surface = null; - overlay = null; - eventHolder = null; - ctx = null; - octx = null; - xaxes = []; - yaxes = []; - hooks = null; - highlights = []; - plot = null; - }; plot.resize = function () { - var width = placeholder.width(), - height = placeholder.height(); + var width = placeholder.width(), + height = placeholder.height(); surface.resize(width, height); overlay.resize(width, height); }; @@ -713,8 +830,9 @@ Licensed under the MIT license. function executeHooks(hook, args) { args = [plot].concat(args); - for (var i = 0; i < hook.length; ++i) + for (var i = 0; i < hook.length; ++i) { hook[i].apply(this, args); + } } function initPlugins() { @@ -728,8 +846,9 @@ Licensed under the MIT license. for (var i = 0; i < plugins.length; ++i) { var p = plugins[i]; p.init(plot, classes); - if (p.options) + if (p.options) { $.extend(true, options, p.options); + } } } @@ -743,23 +862,29 @@ Licensed under the MIT license. // not expected behavior; avoid it by replacing them here. if (opts && opts.colors) { - options.colors = opts.colors; + options.colors = opts.colors; } - if (options.xaxis.color == null) - options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); - if (options.yaxis.color == null) - options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + if (options.xaxis.color == null) { + options.xaxis.color = $.color.parse(options.grid.color).scale("a", 0.22).toString(); + } + if (options.yaxis.color == null) { + options.yaxis.color = $.color.parse(options.grid.color).scale("a", 0.22).toString(); + } - if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility + if (options.xaxis.tickColor == null) { // grid.tickColor for back-compatibility options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color; - if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility + } + if (options.yaxis.tickColor == null) { // grid.tickColor for back-compatibility options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color; + } - if (options.grid.borderColor == null) + if (options.grid.borderColor == null) { options.grid.borderColor = options.grid.color; - if (options.grid.tickColor == null) - options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + } + if (options.grid.tickColor == null) { + options.grid.tickColor = $.color.parse(options.grid.color).scale("a", 0.22).toString(); + } // Fill in defaults for axis options, including any unspecified // font-spec fields, if a font-spec was provided. @@ -768,16 +893,16 @@ Licensed under the MIT license. // since the rest of the code assumes that they exist. var i, axisOptions, axisCount, - fontSize = placeholder.css("font-size"), - fontSizeDefault = fontSize ? +fontSize.replace("px", "") : 13, fontDefaults = { style: placeholder.css("font-style"), - size: Math.round(0.8 * fontSizeDefault), + size: Math.round(0.8 * (+placeholder.css("font-size").replace("px", "") || 13)), variant: placeholder.css("font-variant"), weight: placeholder.css("font-weight"), family: placeholder.css("font-family") }; + fontDefaults.lineHeight = fontDefaults.size * 1.15; + axisCount = options.xaxes.length || 1; for (i = 0; i < axisCount; ++i) { @@ -786,17 +911,29 @@ Licensed under the MIT license. axisOptions.tickColor = axisOptions.color; } + // Compatibility with markrcote/flot-axislabels + + if (axisOptions) { + if (!axisOptions.label && axisOptions.axisLabel) { + axisOptions.label = axisOptions.axisLabel; + } + if (!axisOptions.labelPadding && axisOptions.axisLabelPadding) { + axisOptions.labelPadding = axisOptions.axisLabelPadding; + } + } + axisOptions = $.extend(true, {}, options.xaxis, axisOptions); options.xaxes[i] = axisOptions; + fontDefaults.color = axisOptions.color; if (axisOptions.font) { axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); - if (!axisOptions.font.color) { - axisOptions.font.color = axisOptions.color; - } - if (!axisOptions.font.lineHeight) { - axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15); - } + } + if (axisOptions.tickFont || axisOptions.font) { + axisOptions.tickFont = $.extend({}, axisOptions.font || fontDefaults, axisOptions.tickFont); + } + if (axisOptions.label && (axisOptions.labelFont || axisOptions.font)) { + axisOptions.labelFont = $.extend({}, axisOptions.font || fontDefaults, axisOptions.labelFont); } } @@ -808,72 +945,83 @@ Licensed under the MIT license. axisOptions.tickColor = axisOptions.color; } + // Compatibility with markrcote/flot-axislabels + + if (axisOptions) { + if (!axisOptions.label && axisOptions.axisLabel) { + axisOptions.label = axisOptions.axisLabel; + } + if (!axisOptions.labelPadding && axisOptions.axisLabelPadding) { + axisOptions.labelPadding = axisOptions.axisLabelPadding; + } + } + axisOptions = $.extend(true, {}, options.yaxis, axisOptions); options.yaxes[i] = axisOptions; + fontDefaults.color = axisOptions.color; if (axisOptions.font) { axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); - if (!axisOptions.font.color) { - axisOptions.font.color = axisOptions.color; - } - if (!axisOptions.font.lineHeight) { - axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15); - } + } + if (axisOptions.tickFont || axisOptions.font) { + axisOptions.tickFont = $.extend({}, axisOptions.font || fontDefaults, axisOptions.tickFont); + } + if (axisOptions.label && (axisOptions.labelFont || axisOptions.font)) { + axisOptions.labelFont = $.extend({}, axisOptions.font || fontDefaults, axisOptions.labelFont); } } // backwards compatibility, to be removed in future - if (options.xaxis.noTicks && options.xaxis.ticks == null) + if (options.xaxis.noTicks && options.xaxis.ticks == null) { options.xaxis.ticks = options.xaxis.noTicks; - if (options.yaxis.noTicks && options.yaxis.ticks == null) + } + if (options.yaxis.noTicks && options.yaxis.ticks == null) { options.yaxis.ticks = options.yaxis.noTicks; + } if (options.x2axis) { options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis); options.xaxes[1].position = "top"; - // Override the inherit to allow the axis to auto-scale - if (options.x2axis.min == null) { - options.xaxes[1].min = null; - } - if (options.x2axis.max == null) { - options.xaxes[1].max = null; - } } if (options.y2axis) { options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis); options.yaxes[1].position = "right"; - // Override the inherit to allow the axis to auto-scale - if (options.y2axis.min == null) { - options.yaxes[1].min = null; - } - if (options.y2axis.max == null) { - options.yaxes[1].max = null; - } } - if (options.grid.coloredAreas) + if (options.grid.coloredAreas) { options.grid.markings = options.grid.coloredAreas; - if (options.grid.coloredAreasColor) + } + if (options.grid.coloredAreasColor) { options.grid.markingsColor = options.grid.coloredAreasColor; - if (options.lines) + } + if (options.lines) { $.extend(true, options.series.lines, options.lines); - if (options.points) + } + if (options.points) { $.extend(true, options.series.points, options.points); - if (options.bars) + } + if (options.bars) { $.extend(true, options.series.bars, options.bars); - if (options.shadowSize != null) + } + if (options.shadowSize != null) { options.series.shadowSize = options.shadowSize; - if (options.highlightColor != null) + } + if (options.highlightColor != null) { options.series.highlightColor = options.highlightColor; + } // save options on axes for future reference - for (i = 0; i < options.xaxes.length; ++i) + for (i = 0; i < options.xaxes.length; ++i) { getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i]; - for (i = 0; i < options.yaxes.length; ++i) + } + for (i = 0; i < options.yaxes.length; ++i) { getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i]; + } // add hooks from options - for (var n in hooks) - if (options.hooks[n] && options.hooks[n].length) + for (var n in hooks) { + if (options.hooks[n] && options.hooks[n].length) { hooks[n] = hooks[n].concat(options.hooks[n]); + } + } executeHooks(hooks.processOptions, [options]); } @@ -896,9 +1044,9 @@ Licensed under the MIT license. $.extend(true, s, d[i]); d[i].data = s.data; - } - else + } else { s.data = d[i]; + } res.push(s); } @@ -907,10 +1055,12 @@ Licensed under the MIT license. function axisNumber(obj, coord) { var a = obj[coord + "axis"]; - if (typeof a == "object") // if we got a real axis, extract number + if (typeof a === "object") { // if we got a real axis, extract number a = a.n; - if (typeof a != "number") + } + if (!isNumeric(a)) { a = 1; // default to first axis + } return a; } @@ -924,20 +1074,24 @@ Licensed under the MIT license. var res = {}, i, axis; for (i = 0; i < xaxes.length; ++i) { axis = xaxes[i]; - if (axis && axis.used) + if (axis && axis.used) { res["x" + axis.n] = axis.c2p(pos.left); + } } for (i = 0; i < yaxes.length; ++i) { axis = yaxes[i]; - if (axis && axis.used) + if (axis && axis.used) { res["y" + axis.n] = axis.c2p(pos.top); + } } - if (res.x1 !== undefined) + if (res.x1 !== undefined) { res.x = res.x1; - if (res.y1 !== undefined) + } + if (res.y1 !== undefined) { res.y = res.y1; + } return res; } @@ -950,8 +1104,9 @@ Licensed under the MIT license. axis = xaxes[i]; if (axis && axis.used) { key = "x" + axis.n; - if (pos[key] == null && axis.n == 1) + if (pos[key] == null && axis.n === 1) { key = "x"; + } if (pos[key] != null) { res.left = axis.p2c(pos[key]); @@ -964,8 +1119,9 @@ Licensed under the MIT license. axis = yaxes[i]; if (axis && axis.used) { key = "y" + axis.n; - if (pos[key] == null && axis.n == 1) + if (pos[key] == null && axis.n === 1) { key = "y"; + } if (pos[key] != null) { res.top = axis.p2c(pos[key]); @@ -978,12 +1134,13 @@ Licensed under the MIT license. } function getOrCreateAxis(axes, number) { - if (!axes[number - 1]) + if (!axes[number - 1]) { axes[number - 1] = { n: number, // save the number for future reference - direction: axes == xaxes ? "x" : "y", - options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis) + direction: axes === xaxes ? "x" : "y", + options: $.extend(true, {}, axes === xaxes ? options.xaxis : options.yaxis) }; + } return axes[number - 1]; } @@ -999,7 +1156,7 @@ Licensed under the MIT license. var sc = series[i].color; if (sc != null) { neededColors--; - if (typeof sc == "number" && sc > maxIndex) { + if (isNumeric(sc) && sc > maxIndex) { maxIndex = sc; } } @@ -1030,15 +1187,19 @@ Licensed under the MIT license. // Reset the variation after every few cycles, or else // it will end up producing only white or black colors. - if (i % colorPoolSize == 0 && i) { + if (i % colorPoolSize === 0 && i) { if (variation >= 0) { if (variation < 0.5) { variation = -variation - 0.2; - } else variation = 0; - } else variation = -variation; + } else { + variation = 0; + } + } else { + variation = -variation; + } } - colors[i] = c.scale('rgb', 1 + variation); + colors[i] = c.scale("rgb", 1 + variation); } // Finalize the series options, filling in their colors @@ -1051,20 +1212,22 @@ Licensed under the MIT license. if (s.color == null) { s.color = colors[colori].toString(); ++colori; - } - else if (typeof s.color == "number") + } else if (isNumeric(s.color)) { s.color = colors[s.color].toString(); + } // turn on lines automatically in case nothing is set if (s.lines.show == null) { var v, show = true; - for (v in s) + for (v in s) { if (s[v] && s[v].show) { show = false; break; } - if (show) + } + if (show) { s.lines.show = true; + } } // If nothing was provided for lines.zero, default it to match @@ -1084,15 +1247,15 @@ Licensed under the MIT license. var topSentry = Number.POSITIVE_INFINITY, bottomSentry = Number.NEGATIVE_INFINITY, fakeInfinity = Number.MAX_VALUE, - i, j, k, m, length, - s, points, ps, x, y, axis, val, f, p, - data, format; + i, j, k, m, s, points, ps, val, f, p, data, format; function updateAxis(axis, min, max) { - if (min < axis.datamin && min != -fakeInfinity) + if (min < axis.datamin && min !== -fakeInfinity) { axis.datamin = min; - if (max > axis.datamax && max != fakeInfinity) + } + if (max > axis.datamax && max !== fakeInfinity) { axis.datamax = max; + } } $.each(allAxes(), function (_, axis) { @@ -1105,7 +1268,6 @@ Licensed under the MIT license. for (i = 0; i < series.length; ++i) { s = series[i]; s.datapoints = { points: [] }; - executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); } @@ -1134,8 +1296,9 @@ Licensed under the MIT license. s.datapoints.format = format; } - if (s.datapoints.pointsize != null) + if (s.datapoints.pointsize != null) { continue; // already filled in + } s.datapoints.pointsize = format.length; @@ -1157,20 +1320,23 @@ Licensed under the MIT license. if (f) { if (f.number && val != null) { val = +val; // convert to number - if (isNaN(val)) + if (isNaN(val)) { val = null; - else if (val == Infinity) + } else if (val === Infinity) { val = fakeInfinity; - else if (val == -Infinity) + } else if (val === -Infinity) { val = -fakeInfinity; + } } if (val == null) { - if (f.required) + if (f.required) { nullify = true; + } - if (f.defaultValue != null) + if (f.defaultValue != null) { val = f.defaultValue; + } } } @@ -1184,7 +1350,7 @@ Licensed under the MIT license. if (val != null) { f = format[m]; // extract min/max info - if (f.autoscale !== false) { + if (f.autoscale) { if (f.x) { updateAxis(s.xaxis, val, val); } @@ -1195,18 +1361,18 @@ Licensed under the MIT license. } points[k + m] = null; } - } - else { + } else { // a little bit of line specific stuff that // perhaps shouldn't be here, but lacking // better means... - if (insertSteps && k > 0 - && points[k - ps] != null - && points[k - ps] != points[k] - && points[k - ps + 1] != points[k + 1]) { + if (insertSteps && k > 0 && + points[k - ps] != null && + points[k - ps] !== points[k] && + points[k - ps + 1] !== points[k + 1]) { // copy the point to make room for a middle point - for (m = 0; m < ps; ++m) + for (m = 0; m < ps; ++m) { points[k + ps + m] = points[k + m]; + } // middle point has same y points[k + 1] = points[k - ps + 1]; @@ -1236,26 +1402,32 @@ Licensed under the MIT license. xmax = bottomSentry, ymax = bottomSentry; for (j = 0; j < points.length; j += ps) { - if (points[j] == null) + if (points[j] == null) { continue; + } for (m = 0; m < ps; ++m) { val = points[j + m]; f = format[m]; - if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity) + if (!f || f.autoscale === false || val === fakeInfinity || val === -fakeInfinity) { continue; + } if (f.x) { - if (val < xmin) + if (val < xmin) { xmin = val; - if (val > xmax) + } + if (val > xmax) { xmax = val; + } } if (f.y) { - if (val < ymin) + if (val < ymin) { ymin = val; - if (val > ymax) + } + if (val > ymax) { ymax = val; + } } } } @@ -1265,21 +1437,23 @@ Licensed under the MIT license. var delta; switch (s.bars.align) { - case "left": - delta = 0; - break; - case "right": - delta = -s.bars.barWidth; - break; - default: - delta = -s.bars.barWidth / 2; + case "left": + delta = 0; + break; + case "right": + delta = -s.bars.barWidth; + break; + case "center": + delta = -s.bars.barWidth / 2; + break; + default: + throw new Error("Invalid bar alignment: " + s.bars.align); } if (s.bars.horizontal) { ymin += delta; ymax += delta + s.bars.barWidth; - } - else { + } else { xmin += delta; xmax += delta + s.bars.barWidth; } @@ -1290,10 +1464,12 @@ Licensed under the MIT license. } $.each(allAxes(), function (_, axis) { - if (axis.datamin == topSentry) + if (axis.datamin === topSentry) { axis.datamin = null; - if (axis.datamax == bottomSentry) + } + if (axis.datamax === bottomSentry) { axis.datamax = null; + } }); } @@ -1303,12 +1479,11 @@ Licensed under the MIT license. // from a previous plot in this container that we'll try to re-use. placeholder.css("padding", 0) // padding messes up the positioning - .children().filter(function(){ - return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base'); - }).remove(); + .children(":not(.flot-base,.flot-overlay)").remove(); - if (placeholder.css("position") == 'static') + if (placeholder.css("position") === "static") { placeholder.css("position", "relative"); // for positioning labels and overlay + } surface = new Canvas("flot-base", placeholder); overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features @@ -1346,15 +1521,17 @@ Licensed under the MIT license. eventHolder.bind("mouseleave", onMouseLeave); } - if (options.grid.clickable) + if (options.grid.clickable) { eventHolder.click(onClick); + } executeHooks(hooks.bindEvents, [eventHolder]); } function shutdown() { - if (redrawTimeout) + if (redrawTimeout) { clearTimeout(redrawTimeout); + } eventHolder.unbind("mousemove", onMouseMove); eventHolder.unbind("mouseleave", onMouseLeave); @@ -1374,136 +1551,143 @@ Licensed under the MIT license. // precompute how much the axis is scaling a point // in canvas space - if (axis.direction == "x") { + if (axis.direction === "x") { s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min)); m = Math.min(t(axis.max), t(axis.min)); - } - else { + } else { s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min)); s = -s; m = Math.max(t(axis.max), t(axis.min)); } // data point to canvas coordinate - if (t == identity) // slight optimization + if (t === identity) { // slight optimization axis.p2c = function (p) { return (p - m) * s; }; - else + } else { axis.p2c = function (p) { return (t(p) - m) * s; }; + } // canvas coordinate to data point - if (!it) + if (!it) { axis.c2p = function (c) { return m + c / s; }; - else + } else { axis.c2p = function (c) { return it(m + c / s); }; + } } function measureTickLabels(axis) { var opts = axis.options, ticks = axis.ticks || [], - labelWidth = opts.labelWidth || 0, - labelHeight = opts.labelHeight || 0, - maxWidth = labelWidth || (axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null), - legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", - layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, - font = opts.font || "flot-tick-label tickLabel"; + // Label width & height are deprecated; remove in 1.0! + tickWidth = opts.tickWidth || opts.labelWidth || 0, + tickHeight = opts.tickHeight || opts.labelHeight || 0, + maxWidth = tickWidth || axis.direction === "x" ? Math.floor(surface.width / (ticks.length || 1)) : null, + layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + axis.direction + "Axis " + axis.direction + axis.n + "Axis", + font = opts.tickFont || "flot-tick-label tickLabel"; for (var i = 0; i < ticks.length; ++i) { var t = ticks[i]; - if (!t.label) + if (!t.label) { continue; + } var info = surface.getTextInfo(layer, t.label, font, null, maxWidth); - labelWidth = Math.max(labelWidth, info.width); - labelHeight = Math.max(labelHeight, info.height); + tickWidth = Math.max(tickWidth, info.width); + tickHeight = Math.max(tickHeight, info.height); } - axis.labelWidth = opts.labelWidth || labelWidth; - axis.labelHeight = opts.labelHeight || labelHeight; + axis.tickWidth = opts.tickWidth || opts.labelWidth || tickWidth; + axis.tickHeight = opts.tickHeight || opts.labelHeight || tickHeight; + + // Label width/height properties are deprecated; remove in 1.0! + + axis.labelWidth = axis.tickWidth; + axis.labelHeight = axis.tickHeight; } + /////////////////////////////////////////////////////////////////////// + // Compute the axis bounding box based on the dimensions of its label + // and tick labels, then adjust the plotOffset to make room for it. + // + // This first phase only considers one dimension per axis; the other + // dimension depends on the other axes, and will be calculated later. + function allocateAxisBoxFirstPhase(axis) { - // find the bounding box of the axis by looking at label - // widths/heights and ticks, make room by diminishing the - // plotOffset; this first phase only looks at one - // dimension per axis, the other dimension depends on the - // other axes so will have to wait - - var lw = axis.labelWidth, - lh = axis.labelHeight, - pos = axis.options.position, - isXAxis = axis.direction === "x", - tickLength = axis.options.tickLength, + + var contentWidth = axis.tickWidth, + contentHeight = axis.tickHeight, + axisOptions = axis.options, + tickLength = axisOptions.tickLength, + axisPosition = axisOptions.position, axisMargin = options.grid.axisMargin, padding = options.grid.labelMargin, - innermost = true, - outermost = true, - first = true, - found = false; - - // Determine the axis's position in its direction and on its side - - $.each(isXAxis ? xaxes : yaxes, function(i, a) { - if (a && (a.show || a.reserveSpace)) { - if (a === axis) { - found = true; - } else if (a.options.position === pos) { - if (found) { - outermost = false; - } else { - innermost = false; - } - } - if (!found) { - first = false; - } - } - }); + all = axis.direction === "x" ? xaxes : yaxes, + innermost; - // The outermost axis on each side has no margin + // Determine the margin around the axis - if (outermost) { - axisMargin = 0; + var samePosition = $.grep(all, function(axis) { + return axis && axis.options.position === axisPosition && axis.reserveSpace; + }); + if ($.inArray(axis, samePosition) === samePosition.length - 1) { + axisMargin = 0; // outermost } - // The ticks for the first axis in each direction stretch across + // Determine whether the axis is the first (innermost) on its side + + innermost = $.inArray(axis, samePosition) === 0; + + // Determine the length of the tick marks if (tickLength == null) { - tickLength = first ? "full" : 5; + if (innermost) { + tickLength = "full"; + } else { + tickLength = 5; + } } - if (!isNaN(+tickLength)) + if (!isNaN(+tickLength)) { padding += +tickLength; + } - if (isXAxis) { - lh += padding; + // Measure the dimensions of the axis label, if it has one - if (pos == "bottom") { - plotOffset.bottom += lh + axisMargin; - axis.box = { top: surface.height - plotOffset.bottom, height: lh }; - } - else { - axis.box = { top: plotOffset.top + axisMargin, height: lh }; - plotOffset.top += lh + axisMargin; - } + if (axisOptions.label) { + var layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + axis.direction + "Axis " + axis.direction + axis.n + "Axis", + font = axisOptions.labelFont || "flot-axis-label axisLabels " + axis.direction + axis.n + "axisLabel", + angle = axis.direction === "x" ? 0 : axisOptions.position === "right" ? 90 : -90, + labelInfo = surface.getTextInfo(layer, axisOptions.label, font, angle); + contentWidth += labelInfo.width + axisOptions.labelPadding; + contentHeight += labelInfo.height + axisOptions.labelPadding; } - else { - lw += padding; - if (pos == "left") { - axis.box = { left: plotOffset.left + axisMargin, width: lw }; - plotOffset.left += lw + axisMargin; + // Compute the axis bounding box and update the plot bounds + + if (axis.direction === "x") { + contentHeight += padding; + if (axisPosition === "top") { + axis.box = { top: plotOffset.top + axisMargin, height: contentHeight }; + plotOffset.top += contentHeight + axisMargin; + } else { + plotOffset.bottom += contentHeight + axisMargin; + axis.box = { top: surface.height - plotOffset.bottom, height: contentHeight }; } - else { - plotOffset.right += lw + axisMargin; - axis.box = { left: surface.width - plotOffset.right, width: lw }; + } else { + contentWidth += padding; + if (axisPosition === "right") { + plotOffset.right += contentWidth + axisMargin; + axis.box = { left: surface.width - plotOffset.right, width: contentWidth }; + } else { + axis.box = { left: plotOffset.left + axisMargin, width: contentWidth }; + plotOffset.left += contentWidth + axisMargin; } } - // save for future reference - axis.position = pos; + axis.position = axisPosition; axis.tickLength = tickLength; axis.box.padding = padding; axis.innermost = innermost; @@ -1512,13 +1696,12 @@ Licensed under the MIT license. function allocateAxisBoxSecondPhase(axis) { // now that all axis boxes have been placed in one // dimension, we can set the remaining dimension coordinates - if (axis.direction == "x") { - axis.box.left = plotOffset.left - axis.labelWidth / 2; - axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth; - } - else { - axis.box.top = plotOffset.top - axis.labelHeight / 2; - axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight; + if (axis.direction === "x") { + axis.box.left = plotOffset.left - axis.tickWidth / 2; + axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.tickWidth; + } else { + axis.box.top = plotOffset.top - axis.tickHeight / 2; + axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.tickHeight; } } @@ -1527,95 +1710,92 @@ Licensed under the MIT license. // inside the canvas and isn't clipped off var minMargin = options.grid.minBorderMargin, - axis, i; + margins = { x: 0, y: 0 }, i; // check stuff from the plot (FIXME: this should just read // a value from the series, otherwise it's impossible to // customize) if (minMargin == null) { minMargin = 0; - for (i = 0; i < series.length; ++i) + for (i = 0; i < series.length; ++i) { minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2)); + } } - var margins = { - left: minMargin, - right: minMargin, - top: minMargin, - bottom: minMargin - }; + margins.x = margins.y = Math.ceil(minMargin); // check axis labels, note we don't check the actual // labels but instead use the overall width/height to not // jump as much around with replots $.each(allAxes(), function (_, axis) { - if (axis.reserveSpace && axis.ticks && axis.ticks.length) { - if (axis.direction === "x") { - margins.left = Math.max(margins.left, axis.labelWidth / 2); - margins.right = Math.max(margins.right, axis.labelWidth / 2); - } else { - margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2); - margins.top = Math.max(margins.top, axis.labelHeight / 2); - } + var dir = axis.direction; + if (axis.reserveSpace) { + margins[dir] = Math.ceil(Math.max(margins[dir], (dir === "x" ? axis.tickWidth : axis.tickHeight) / 2)); } }); - plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left)); - plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right)); - plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top)); - plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom)); + plotOffset.left = Math.max(margins.x, plotOffset.left); + plotOffset.right = Math.max(margins.x, plotOffset.right); + plotOffset.top = Math.max(margins.y, plotOffset.top); + plotOffset.bottom = Math.max(margins.y, plotOffset.bottom); } function setupGrid() { - var i, axes = allAxes(), showGrid = options.grid.show; + var axes = allAxes(), + showGrid = options.grid.show, + margin = options.grid.margin || 0, + i, a; // Initialize the plot's offset from the edge of the canvas - for (var a in plotOffset) { - var margin = options.grid.margin || 0; - plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0; + for (a in plotOffset) { + if (Object.prototype.hasOwnProperty.call(plotOffset, a)) { + plotOffset[a] = isNumeric(margin) ? margin : margin[a] || 0; + } } executeHooks(hooks.processOffset, [plotOffset]); // If the grid is visible, add its border width to the offset - for (var a in plotOffset) { - if(typeof(options.grid.borderWidth) == "object") { + for (a in plotOffset) { + if(typeof(options.grid.borderWidth) === "object") { plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0; - } - else { + } else { plotOffset[a] += showGrid ? options.grid.borderWidth : 0; } } + // init axes $.each(axes, function (_, axis) { - var axisOpts = axis.options; - axis.show = axisOpts.show == null ? axis.used : axisOpts.show; - axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace; + axis.show = axis.options.show; + if (axis.show == null) { + axis.show = axis.used; // by default an axis is visible if it's got data + } + + axis.reserveSpace = axis.show || axis.options.reserveSpace; + setRange(axis); }); if (showGrid) { - var allocatedAxes = $.grep(axes, function (axis) { - return axis.show || axis.reserveSpace; - }); + var allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; }); $.each(allocatedAxes, function (_, axis) { // make the ticks setupTickGeneration(axis); setTicks(axis); snapRangeToTicks(axis, axis.ticks); - // find labelWidth/Height for axis measureTickLabels(axis); }); // with all dimensions calculated, we can compute the // axis bounding boxes, start from the outside // (reverse order) - for (i = allocatedAxes.length - 1; i >= 0; --i) + for (i = allocatedAxes.length - 1; i >= 0; --i) { allocateAxisBoxFirstPhase(allocatedAxes[i]); + } // make sure we've got enough space for things that // might stick out @@ -1647,18 +1827,19 @@ Licensed under the MIT license. max = +(opts.max != null ? opts.max : axis.datamax), delta = max - min; - if (delta == 0.0) { + if (delta === 0.0) { // degenerate case - var widen = max == 0 ? 1 : 0.01; + var widen = max === 0 ? 1 : 0.01; - if (opts.min == null) + if (opts.min == null) { min -= widen; + } // always widen max if we couldn't widen min to ensure we // don't fall into min == max which doesn't work - if (opts.max == null || opts.min != null) + if (opts.max == null || opts.min != null) { max += widen; - } - else { + } + } else { // consider autoscaling var margin = opts.autoscaleMargin; if (margin != null) { @@ -1666,13 +1847,15 @@ Licensed under the MIT license. min -= delta * margin; // make sure we don't go below zero if all values // are positive - if (min < 0 && axis.datamin != null && axis.datamin >= 0) + if (min < 0 && axis.datamin != null && axis.datamin >= 0) { min = 0; + } } if (opts.max == null) { max += delta * margin; - if (max > 0 && axis.datamax != null && axis.datamax <= 0) + if (max > 0 && axis.datamax != null && axis.datamax <= 0) { max = 0; + } } } } @@ -1685,12 +1868,13 @@ Licensed under the MIT license. // estimate number of ticks var noTicks; - if (typeof opts.ticks == "number" && opts.ticks > 0) + if (isNumeric(opts.ticks) && opts.ticks > 0) { noTicks = opts.ticks; - else + } else { // heuristic based on the model a*sqrt(x) fitted to // some data points that seemed reasonable - noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height); + noTicks = 0.3 * Math.sqrt(axis.direction === "x" ? surface.width : surface.height); + } var delta = (axis.max - axis.min) / noTicks, dec = -Math.floor(Math.log(delta) / Math.LN10), @@ -1729,10 +1913,10 @@ Licensed under the MIT license. axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); axis.tickSize = opts.tickSize || size; - // Time mode was moved to a plug-in in 0.8, and since so many people use it - // we'll add an especially friendly reminder to make sure they included it. + // Time mode was moved to a plug-in in 0.8, but since so many people use this + // we'll add an especially friendly make sure they remembered to include it. - if (opts.mode == "time" && !axis.tickGenerator) { + if (opts.mode === "time" && !axis.tickGenerator) { throw new Error("Time mode requires the flot.time plugin."); } @@ -1754,43 +1938,46 @@ Licensed under the MIT license. v = start + i * axis.tickSize; ticks.push(v); ++i; - } while (v < axis.max && v != prev); + } while (v < axis.max && v !== prev); return ticks; }; - axis.tickFormatter = function (value, axis) { + axis.tickFormatter = function (value, axis) { - var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1; - var formatted = "" + Math.round(value * factor) / factor; + var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1; + var formatted = "" + Math.round(value * factor) / factor; - // If tickDecimals was specified, ensure that we have exactly that - // much precision; otherwise default to the value's own precision. + // If tickDecimals was specified, ensure that we have exactly that + // much precision; otherwise default to the value's own precision. - if (axis.tickDecimals != null) { - var decimal = formatted.indexOf("."); - var precision = decimal == -1 ? 0 : formatted.length - decimal - 1; - if (precision < axis.tickDecimals) { - return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision); - } - } + if (axis.tickDecimals != null) { + var decimal = formatted.indexOf("."); + var precision = decimal === -1 ? 0 : formatted.length - decimal - 1; + if (precision < axis.tickDecimals) { + return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision); + } + } return formatted; }; } - if ($.isFunction(opts.tickFormatter)) + if ($.isFunction(opts.tickFormatter)) { axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; + } if (opts.alignTicksWithAxis != null) { - var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; - if (otherAxis && otherAxis.used && otherAxis != axis) { + var otherAxis = (axis.direction === "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; + if (otherAxis && otherAxis.used && otherAxis !== axis) { // consider snapping min/max to outermost nice ticks var niceTicks = axis.tickGenerator(axis); if (niceTicks.length > 0) { - if (opts.min == null) + if (opts.min == null) { axis.min = Math.min(axis.min, niceTicks[0]); - if (opts.max == null && niceTicks.length > 1) + } + if (opts.max == null && niceTicks.length > 1) { axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); + } } axis.tickGenerator = function (axis) { @@ -1813,8 +2000,9 @@ Licensed under the MIT license. // only proceed if the tick interval rounded // with an extra decimal doesn't give us a // zero at end - if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) + if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) { axis.tickDecimals = extraDec; + } } } } @@ -1822,14 +2010,15 @@ Licensed under the MIT license. function setTicks(axis) { var oticks = axis.options.ticks, ticks = []; - if (oticks == null || (typeof oticks == "number" && oticks > 0)) + if (oticks == null || (isNumeric(oticks) && oticks > 0)) { ticks = axis.tickGenerator(axis); - else if (oticks) { - if ($.isFunction(oticks)) + } else if (oticks) { + if ($.isFunction(oticks)) { // generate the ticks ticks = oticks(axis); - else + } else { ticks = oticks; + } } // clean up/labelify the supplied ticks, copy them over @@ -1838,27 +2027,32 @@ Licensed under the MIT license. for (i = 0; i < ticks.length; ++i) { var label = null; var t = ticks[i]; - if (typeof t == "object") { + if (typeof t === "object") { v = +t[0]; - if (t.length > 1) + if (t.length > 1) { label = t[1]; - } - else + } + } else { v = +t; - if (label == null) + } + if (label == null) { label = axis.tickFormatter(v, axis); - if (!isNaN(v)) + } + if (!isNaN(v)) { axis.ticks.push({ v: v, label: label }); + } } } function snapRangeToTicks(axis, ticks) { if (axis.options.autoscaleMargin && ticks.length > 0) { // snap to ticks - if (axis.options.min == null) + if (axis.options.min == null) { axis.min = Math.min(axis.min, ticks[0].v); - if (axis.options.max == null && ticks.length > 1) + } + if (axis.options.max == null && ticks.length > 1) { axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); + } } } @@ -1871,8 +2065,9 @@ Licensed under the MIT license. var grid = options.grid; // draw background, if any - if (grid.show && grid.backgroundColor) + if (grid.show && grid.backgroundColor) { drawBackground(); + } if (grid.show && !grid.aboveData) { drawGrid(); @@ -1902,10 +2097,11 @@ Licensed under the MIT license. for (var i = 0; i < axes.length; ++i) { axis = axes[i]; - if (axis.direction == coord) { + if (axis.direction === coord) { key = coord + axis.n + "axis"; - if (!ranges[key] && axis.n == 1) + if (!ranges[key] && axis.n === 1) { key = coord + "axis"; // support x1axis as xaxis + } if (ranges[key]) { from = ranges[key].from; to = ranges[key].to; @@ -1916,7 +2112,7 @@ Licensed under the MIT license. // backwards-compat stuff - to be removed in future if (!ranges[key]) { - axis = coord == "x" ? xaxes[0] : yaxes[0]; + axis = coord === "x" ? xaxes[0] : yaxes[0]; from = ranges[coord + "1"]; to = ranges[coord + "2"]; } @@ -1967,53 +2163,50 @@ Licensed under the MIT license. yrange = extractRange(m, "y"); // fill in missing - if (xrange.from == null) + if (xrange.from == null) { xrange.from = xrange.axis.min; - if (xrange.to == null) + } + if (xrange.to == null) { xrange.to = xrange.axis.max; - if (yrange.from == null) + } + if (yrange.from == null) { yrange.from = yrange.axis.min; - if (yrange.to == null) + } + if (yrange.to == null) { yrange.to = yrange.axis.max; + } // clip if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || - yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) + yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) { continue; + } xrange.from = Math.max(xrange.from, xrange.axis.min); xrange.to = Math.min(xrange.to, xrange.axis.max); yrange.from = Math.max(yrange.from, yrange.axis.min); yrange.to = Math.min(yrange.to, yrange.axis.max); - var xequal = xrange.from === xrange.to, - yequal = yrange.from === yrange.to; - - if (xequal && yequal) { + if (xrange.from === xrange.to && yrange.from === yrange.to) { continue; } // then draw - xrange.from = Math.floor(xrange.axis.p2c(xrange.from)); - xrange.to = Math.floor(xrange.axis.p2c(xrange.to)); - yrange.from = Math.floor(yrange.axis.p2c(yrange.from)); - yrange.to = Math.floor(yrange.axis.p2c(yrange.to)); - - if (xequal || yequal) { - var lineWidth = m.lineWidth || options.grid.markingsLineWidth, - subPixel = lineWidth % 2 ? 0.5 : 0; + xrange.from = xrange.axis.p2c(xrange.from); + xrange.to = xrange.axis.p2c(xrange.to); + yrange.from = yrange.axis.p2c(yrange.from); + yrange.to = yrange.axis.p2c(yrange.to); + + if (xrange.from === xrange.to || yrange.from === yrange.to) { + // draw line ctx.beginPath(); ctx.strokeStyle = m.color || options.grid.markingsColor; - ctx.lineWidth = lineWidth; - if (xequal) { - ctx.moveTo(xrange.to + subPixel, yrange.from); - ctx.lineTo(xrange.to + subPixel, yrange.to); - } else { - ctx.moveTo(xrange.from, yrange.to + subPixel); - ctx.lineTo(xrange.to, yrange.to + subPixel); - } + ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth; + ctx.moveTo(xrange.from, yrange.from); + ctx.lineTo(xrange.to, yrange.to); ctx.stroke(); } else { + // fill area ctx.fillStyle = m.color || options.grid.markingsColor; ctx.fillRect(xrange.from, yrange.to, xrange.to - xrange.from, @@ -2029,25 +2222,27 @@ Licensed under the MIT license. for (var j = 0; j < axes.length; ++j) { var axis = axes[j], box = axis.box, t = axis.tickLength, x, y, xoff, yoff; - if (!axis.show || axis.ticks.length == 0) + if (!axis.show || axis.ticks.length === 0) { continue; + } ctx.lineWidth = 1; // find the edges - if (axis.direction == "x") { + if (axis.direction === "x") { x = 0; - if (t == "full") - y = (axis.position == "top" ? 0 : plotHeight); - else - y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0); - } - else { + if (t === "full") { + y = (axis.position === "top" ? 0 : plotHeight); + } else { + y = box.top - plotOffset.top + (axis.position === "top" ? box.height : 0); + } + } else { y = 0; - if (t == "full") - x = (axis.position == "left" ? 0 : plotWidth); - else - x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0); + if (t === "full") { + x = (axis.position === "left" ? 0 : plotWidth); + } else { + x = box.left - plotOffset.left + (axis.position === "left" ? box.width : 0); + } } // draw tick bar @@ -2055,13 +2250,14 @@ Licensed under the MIT license. ctx.strokeStyle = axis.options.color; ctx.beginPath(); xoff = yoff = 0; - if (axis.direction == "x") + if (axis.direction === "x") { xoff = plotWidth + 1; - else + } else { yoff = plotHeight + 1; + } - if (ctx.lineWidth == 1) { - if (axis.direction == "x") { + if (ctx.lineWidth === 1) { + if (axis.direction === "x") { y = Math.floor(y) + 0.5; } else { x = Math.floor(x) + 0.5; @@ -2083,33 +2279,36 @@ Licensed under the MIT license. xoff = yoff = 0; - if (isNaN(v) || v < axis.min || v > axis.max + if (isNaN(v) || v < axis.min || v > axis.max || ( // skip those lying on the axes if we got a border - || (t == "full" - && ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0) - && (v == axis.min || v == axis.max))) + t === "full" && ((typeof bw === "object" && bw[axis.position] > 0) || bw > 0) && + (v === axis.min || v === axis.max) + )) { continue; + } - if (axis.direction == "x") { + if (axis.direction === "x") { x = axis.p2c(v); - yoff = t == "full" ? -plotHeight : t; + yoff = t === "full" ? -plotHeight : t; - if (axis.position == "top") + if (axis.position === "top") { yoff = -yoff; - } - else { + } + } else { y = axis.p2c(v); - xoff = t == "full" ? -plotWidth : t; + xoff = t === "full" ? -plotWidth : t; - if (axis.position == "left") + if (axis.position === "left") { xoff = -xoff; + } } - if (ctx.lineWidth == 1) { - if (axis.direction == "x") + if (ctx.lineWidth === 1) { + if (axis.direction === "x") { x = Math.floor(x) + 0.5; - else + } else { y = Math.floor(y) + 0.5; + } } ctx.moveTo(x, y); @@ -2125,7 +2324,7 @@ Licensed under the MIT license. // If either borderWidth or borderColor is an object, then draw the border // line by line instead of as one rectangle bc = options.grid.borderColor; - if(typeof bw == "object" || typeof bc == "object") { + if(typeof bw === "object" || typeof bc === "object") { if (typeof bw !== "object") { bw = {top: bw, right: bw, bottom: bw, left: bw}; } @@ -2168,8 +2367,7 @@ Licensed under the MIT license. ctx.lineTo(0- bw.left/2, 0); ctx.stroke(); } - } - else { + } else { ctx.lineWidth = bw; ctx.strokeStyle = options.grid.borderColor; ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); @@ -2182,31 +2380,48 @@ Licensed under the MIT license. function drawAxisLabels() { $.each(allAxes(), function (_, axis) { + if (!axis.show || axis.ticks.length === 0) { + return; + } + var box = axis.box, - legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", - layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, - font = axis.options.font || "flot-tick-label tickLabel", + axisOptions = axis.options, + layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + axis.direction + "Axis " + axis.direction + axis.n + "Axis", + labelFont = axisOptions.labelFont || "flot-axis-label axisLabels " + axis.direction + axis.n + "axisLabel", + tickFont = axisOptions.tickFont || "flot-tick-label tickLabel", tick, x, y, halign, valign; - // Remove text before checking for axis.show and ticks.length; - // otherwise plugins, like flot-tickrotor, that draw their own - // tick labels will end up with both theirs and the defaults. - surface.removeText(layer); - if (!axis.show || axis.ticks.length == 0) - return; + if (axisOptions.label) { + if (axis.direction === "x") { + if (axisOptions.position === "top") { + surface.addText(layer, box.left + box.width / 2, box.top, axisOptions.label, labelFont, 0, null, "center", "top"); + } else { + surface.addText(layer, box.left + box.width / 2, box.top + box.height, axisOptions.label, labelFont, 0, null, "center", "bottom"); + } + } else { + if (axisOptions.position === "right") { + surface.addText(layer, box.left + box.width, box.top + box.height / 2, axisOptions.label, labelFont, 90, null, "right", "middle"); + } else { + surface.addText(layer, box.left, box.top + box.height / 2, axisOptions.label, labelFont, -90, null, "left", "middle"); + } + } + } + + // Add labels for the ticks on this axis for (var i = 0; i < axis.ticks.length; ++i) { tick = axis.ticks[i]; - if (!tick.label || tick.v < axis.min || tick.v > axis.max) + if (!tick.label || tick.v < axis.min || tick.v > axis.max) { continue; + } - if (axis.direction == "x") { + if (axis.direction === "x") { halign = "center"; x = plotOffset.left + axis.p2c(tick.v); - if (axis.position == "bottom") { + if (axis.position === "bottom") { y = box.top + box.padding; } else { y = box.top + box.height - box.padding; @@ -2215,7 +2430,7 @@ Licensed under the MIT license. } else { valign = "middle"; y = plotOffset.top + axis.p2c(tick.v); - if (axis.position == "left") { + if (axis.position === "left") { x = box.left + box.width - box.padding; halign = "right"; } else { @@ -2223,18 +2438,21 @@ Licensed under the MIT license. } } - surface.addText(layer, x, y, tick.label, font, null, null, halign, valign); + surface.addText(layer, x, y, tick.label, tickFont, null, null, halign, valign); } }); } function drawSeries(series) { - if (series.lines.show) + if (series.lines.show) { drawSeriesLines(series); - if (series.bars.show) + } + if (series.bars.show) { drawSeriesBars(series); - if (series.points.show) + } + if (series.points.show) { drawSeriesPoints(series); + } } function drawSeriesLines(series) { @@ -2248,68 +2466,74 @@ Licensed under the MIT license. var x1 = points[i - ps], y1 = points[i - ps + 1], x2 = points[i], y2 = points[i + 1]; - if (x1 == null || x2 == null) + if (x1 == null || x2 == null) { continue; + } // clip with ymin if (y1 <= y2 && y1 < axisy.min) { - if (y2 < axisy.min) + if (y2 < axisy.min) { continue; // line segment is outside + } // compute new intersection point x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; y1 = axisy.min; - } - else if (y2 <= y1 && y2 < axisy.min) { - if (y1 < axisy.min) + } else if (y2 <= y1 && y2 < axisy.min) { + if (y1 < axisy.min) { continue; + } x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; y2 = axisy.min; } // clip with ymax if (y1 >= y2 && y1 > axisy.max) { - if (y2 > axisy.max) + if (y2 > axisy.max) { continue; + } x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; y1 = axisy.max; - } - else if (y2 >= y1 && y2 > axisy.max) { - if (y1 > axisy.max) + } else if (y2 >= y1 && y2 > axisy.max) { + if (y1 > axisy.max) { continue; + } x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; y2 = axisy.max; } // clip with xmin if (x1 <= x2 && x1 < axisx.min) { - if (x2 < axisx.min) + if (x2 < axisx.min) { continue; + } y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; x1 = axisx.min; - } - else if (x2 <= x1 && x2 < axisx.min) { - if (x1 < axisx.min) + } else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) { continue; + } y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; x2 = axisx.min; } // clip with xmax if (x1 >= x2 && x1 > axisx.max) { - if (x2 > axisx.max) + if (x2 > axisx.max) { continue; + } y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; x1 = axisx.max; - } - else if (x2 >= x1 && x2 > axisx.max) { - if (x1 > axisx.max) + } else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) { continue; + } y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; x2 = axisx.max; } - if (x1 != prevx || y1 != prevy) + if (x1 !== prevx || y1 !== prevy) { ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); + } prevx = x2; prevy = y2; @@ -2322,15 +2546,16 @@ Licensed under the MIT license. var points = datapoints.points, ps = datapoints.pointsize, bottom = Math.min(Math.max(0, axisy.min), axisy.max), - i = 0, top, areaOpen = false, + i = 0, areaOpen = false, ypos = 1, segmentStart = 0, segmentEnd = 0; // we process each segment in two turns, first forward // direction to sketch out top, then once we hit the // end we go backwards to sketch the bottom while (true) { - if (ps > 0 && i > points.length + ps) + if (ps > 0 && i > points.length + ps) { break; + } i += ps; // ps is negative if going backwards @@ -2347,7 +2572,7 @@ Licensed under the MIT license. continue; } - if (ps < 0 && i == segmentStart + ps) { + if (ps < 0 && i === segmentStart + ps) { // done with the reverse sweep ctx.fill(); areaOpen = false; @@ -2358,35 +2583,38 @@ Licensed under the MIT license. } } - if (x1 == null || x2 == null) + if (x1 == null || x2 == null) { continue; + } // clip x values // clip with xmin if (x1 <= x2 && x1 < axisx.min) { - if (x2 < axisx.min) + if (x2 < axisx.min) { continue; + } y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; x1 = axisx.min; - } - else if (x2 <= x1 && x2 < axisx.min) { - if (x1 < axisx.min) + } else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) { continue; + } y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; x2 = axisx.min; } // clip with xmax if (x1 >= x2 && x1 > axisx.max) { - if (x2 > axisx.max) + if (x2 > axisx.max) { continue; + } y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; x1 = axisx.max; - } - else if (x2 >= x1 && x2 > axisx.max) { - if (x1 > axisx.max) + } else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) { continue; + } y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; x2 = axisx.max; } @@ -2403,8 +2631,7 @@ Licensed under the MIT license. ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); continue; - } - else if (y1 <= axisy.min && y2 <= axisy.min) { + } else if (y1 <= axisy.min && y2 <= axisy.min) { ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); continue; @@ -2423,8 +2650,7 @@ Licensed under the MIT license. if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; y1 = axisy.min; - } - else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { + } else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; y2 = axisy.min; } @@ -2433,15 +2659,14 @@ Licensed under the MIT license. if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; y1 = axisy.max; - } - else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { + } else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; y2 = axisy.max; } // if the x value was changed we got a rectangle // to fill - if (x1 != x1old) { + if (x1 !== x1old) { ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); // it goes to (x1, y1), but we fill that below } @@ -2453,7 +2678,7 @@ Licensed under the MIT license. ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); // fill the other rectangle if it's there - if (x2 != x2old) { + if (x2 !== x2old) { ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2)); } @@ -2486,8 +2711,9 @@ Licensed under the MIT license. plotLineArea(series.datapoints, series.xaxis, series.yaxis); } - if (lw > 0) + if (lw > 0) { plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); + } ctx.restore(); } @@ -2497,16 +2723,18 @@ Licensed under the MIT license. for (var i = 0; i < points.length; i += ps) { var x = points[i], y = points[i + 1]; - if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) { continue; + } ctx.beginPath(); x = axisx.p2c(x); y = axisy.p2c(y) + offset; - if (symbol == "circle") + if (symbol === "circle") { ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false); - else + } else { symbol(ctx, x, y, radius, shadow); + } ctx.closePath(); if (fillStyle) { @@ -2530,8 +2758,9 @@ Licensed under the MIT license. // Doing the conditional here allows the shadow setting to still be // optional even with a lineWidth of 0. - if( lw == 0 ) + if( lw === 0 ) { lw = 0.0001; + } if (lw > 0 && sw > 0) { // draw shadow in two steps @@ -2547,14 +2776,14 @@ Licensed under the MIT license. } ctx.lineWidth = lw; - ctx.strokeStyle = series.color; + ctx.strokeStyle = series.points.strokeColor || series.color; plotPoints(series.datapoints, radius, getFillStyle(series.points, series.color), 0, false, series.xaxis, series.yaxis, symbol); ctx.restore(); } - function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { + function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { var left, right, bottom, top, drawLeft, drawRight, drawTop, drawBottom, tmp; @@ -2578,8 +2807,7 @@ Licensed under the MIT license. drawLeft = true; drawRight = false; } - } - else { + } else { drawLeft = drawRight = drawTop = true; drawBottom = false; left = x + barLeft; @@ -2599,8 +2827,9 @@ Licensed under the MIT license. // clip if (right < axisx.min || left > axisx.max || - top < axisy.min || bottom > axisy.max) + top < axisy.min || bottom > axisy.max) { return; + } if (left < axisx.min) { left = axisx.min; @@ -2629,8 +2858,13 @@ Licensed under the MIT license. // fill the bar if (fillStyleCallback) { + c.beginPath(); + c.moveTo(left, bottom); + c.lineTo(left, top); + c.lineTo(right, top); + c.lineTo(right, bottom); c.fillStyle = fillStyleCallback(bottom, top); - c.fillRect(left, top, right - left, bottom - top) + c.fill(); } // draw outline @@ -2638,35 +2872,40 @@ Licensed under the MIT license. c.beginPath(); // FIXME: inline moveTo is buggy with excanvas - c.moveTo(left, bottom); - if (drawLeft) - c.lineTo(left, top); - else - c.moveTo(left, top); - if (drawTop) - c.lineTo(right, top); - else - c.moveTo(right, top); - if (drawRight) - c.lineTo(right, bottom); - else - c.moveTo(right, bottom); - if (drawBottom) - c.lineTo(left, bottom); - else - c.moveTo(left, bottom); + c.moveTo(left, bottom + offset); + if (drawLeft) { + c.lineTo(left, top + offset); + } else { + c.moveTo(left, top + offset); + } + if (drawTop) { + c.lineTo(right, top + offset); + } else { + c.moveTo(right, top + offset); + } + if (drawRight) { + c.lineTo(right, bottom + offset); + } else { + c.moveTo(right, bottom + offset); + } + if (drawBottom) { + c.lineTo(left, bottom + offset); + } else { + c.moveTo(left, bottom + offset); + } c.stroke(); } } function drawSeriesBars(series) { - function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) { + function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) { var points = datapoints.points, ps = datapoints.pointsize; for (var i = 0; i < points.length; i += ps) { - if (points[i] == null) + if (points[i] == null) { continue; - drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); + } + drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); } } @@ -2680,53 +2919,53 @@ Licensed under the MIT license. var barLeft; switch (series.bars.align) { - case "left": - barLeft = 0; - break; - case "right": - barLeft = -series.bars.barWidth; - break; - default: - barLeft = -series.bars.barWidth / 2; + case "left": + barLeft = 0; + break; + case "right": + barLeft = -series.bars.barWidth; + break; + case "center": + barLeft = -series.bars.barWidth / 2; + break; + default: + throw new Error("Invalid bar alignment: " + series.bars.align); } var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; - plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis); + plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis); ctx.restore(); } function getFillStyle(filloptions, seriesColor, bottom, top) { var fill = filloptions.fill; - if (!fill) + if (!fill) { return null; + } - if (filloptions.fillColor) + if (filloptions.fillColor) { return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); + } var c = $.color.parse(seriesColor); - c.a = typeof fill == "number" ? fill : 0.4; + c.a = isNumeric(fill) ? fill : 0.4; c.normalize(); return c.toString(); } function insertLegend() { - if (options.legend.container != null) { - $(options.legend.container).html(""); - } else { - placeholder.find(".legend").remove(); - } + placeholder.find(".legend").remove(); if (!options.legend.show) { return; } - var fragments = [], entries = [], rowStarted = false, - lf = options.legend.labelFormatter, s, label; + var entries = [], lf = options.legend.labelFormatter, s, label, i; // Build a list of legend entries, with each having a label and a color - for (var i = 0; i < series.length; ++i) { + for (i = 0; i < series.length; ++i) { s = series[i]; if (s.label) { label = lf ? lf(s.label, s) : s.label; @@ -2739,18 +2978,24 @@ Licensed under the MIT license. } } + // No entries implies no legend + + if (entries.length === 0) { + return; + } + // Sort the legend using either the default or a custom comparator if (options.legend.sorted) { if ($.isFunction(options.legend.sorted)) { entries.sort(options.legend.sorted); - } else if (options.legend.sorted == "reverse") { - entries.reverse(); + } else if (options.legend.sorted === "reverse") { + entries.reverse(); } else { - var ascending = options.legend.sorted != "descending"; + var ascending = options.legend.sorted !== "descending"; entries.sort(function(a, b) { - return a.label == b.label ? 0 : ( - ((a.label < b.label) != ascending ? 1 : -1) // Logical XOR + return a.label === b.label ? 0 : ( + (a.label < b.label) !== ascending ? 1 : -1 // Logical XOR ); }); } @@ -2758,63 +3003,86 @@ Licensed under the MIT license. // Generate markup for the list of entries, in their final order - for (var i = 0; i < entries.length; ++i) { + var table = $("
").css({ + "font-size": "smaller", + "color": options.grid.color + }), rowBuffer = null; + + for (i = 0; i < entries.length; ++i) { var entry = entries[i]; - if (i % options.legend.noColumns == 0) { - if (rowStarted) - fragments.push(''); - fragments.push(''); - rowStarted = true; + if (i % options.legend.noColumns === 0) { + if (rowBuffer !== null) { + table.append(rowBuffer); + } + rowBuffer = $(""); } - fragments.push( - '
' + - '' + entry.label + '' + var colorbox = $("
").css({ + "width": "4px", + "height": 0, + "border": "5px solid " + entry.color, + "overflow": "hidden" + }), + + borderbox = $("
").css({ + "border": "1px solid " + options.legend.labelBoxBorderColor, + "padding": "1px" + }); + + rowBuffer.append( + $("").addClass("legendColorBox").append(borderbox.append(colorbox)), + $("").addClass("legendLabel").html(entry.label) ); } - if (rowStarted) - fragments.push(''); + table.append(rowBuffer); - if (fragments.length == 0) - return; - - var table = '' + fragments.join("") + '
'; - if (options.legend.container != null) + if (options.legend.container != null) { $(options.legend.container).html(table); - else { - var pos = "", + } else { + var pos = {"position": "absolute"}, p = options.legend.position, m = options.legend.margin; - if (m[0] == null) + if (m[0] == null) { m = [m, m]; - if (p.charAt(0) == "n") - pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; - else if (p.charAt(0) == "s") - pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; - if (p.charAt(1) == "e") - pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; - else if (p.charAt(1) == "w") - pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; - var legend = $('
' + table.replace('style="', 'style="position:absolute;' + pos +';') + '
').appendTo(placeholder); - if (options.legend.backgroundOpacity != 0.0) { + } + if (p.charAt(0) === "n") { + pos.top = (m[1] + plotOffset.top) + "px"; + } else if (p.charAt(0) === "s") { + pos.bottom = (m[1] + plotOffset.bottom) + "px"; + } + if (p.charAt(1) === "e") { + pos.right = (m[0] + plotOffset.right) + "px"; + } else if (p.charAt(1) === "w") { + pos.left = (m[0] + plotOffset.left) + "px"; + } + var legend = $("
").addClass("legend").append(table.css(pos)).appendTo(placeholder); + if (options.legend.backgroundOpacity !== 0.0) { // put in the transparent background // separately to avoid blended labels and // label boxes var c = options.legend.backgroundColor; if (c == null) { c = options.grid.backgroundColor; - if (c && typeof c == "string") + if (c && typeof c === "string") { c = $.color.parse(c); - else - c = $.color.extract(legend, 'background-color'); + } else { + c = $.color.extract(legend, "background-color"); + } c.a = 1; c = c.toString(); } var div = legend.children(); - $('
').prependTo(legend).css('opacity', options.legend.backgroundOpacity); + + // Position also applies to this + $("
").css(pos).css({ + "width": div.width() + "px", + "height": div.height() + "px", + "background-color": c, + "opacity": options.legend.backgroundOpacity + }).prependTo(legend); } } } @@ -2829,11 +3097,12 @@ Licensed under the MIT license. function findNearbyItem(mouseX, mouseY, seriesFilter) { var maxDistance = options.grid.mouseActiveRadius, smallestDistance = maxDistance * maxDistance + 1, - item = null, foundPoint = false, i, j, ps; + item = null, i, j, ps; for (i = series.length - 1; i >= 0; --i) { - if (!seriesFilter(series[i])) + if (!seriesFilter(series[i])) { continue; + } var s = series[i], axisx = s.xaxis, @@ -2842,27 +3111,35 @@ Licensed under the MIT license. mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster my = axisy.c2p(mouseY), maxx = maxDistance / axisx.scale, - maxy = maxDistance / axisy.scale; + maxy = maxDistance / axisy.scale, + x, y; ps = s.datapoints.pointsize; // with inverse transforms, we can't use the maxx/maxy // optimization, sadly - if (axisx.options.inverseTransform) + if (axisx.options.inverseTransform) { maxx = Number.MAX_VALUE; - if (axisy.options.inverseTransform) + } + if (axisy.options.inverseTransform) { maxy = Number.MAX_VALUE; + } if (s.lines.show || s.points.show) { for (j = 0; j < points.length; j += ps) { - var x = points[j], y = points[j + 1]; - if (x == null) + + x = points[j]; + y = points[j + 1]; + + if (x == null) { continue; + } // For points and lines, the cursor must be within a // certain distance to the data point if (x - mx > maxx || x - mx < -maxx || - y - my > maxy || y - my < -maxy) + y - my > maxy || y - my < -maxy) { continue; + } // We have to calculate distances in pixels, not in // data units, because the scales of the axes may be different @@ -2880,34 +3157,25 @@ Licensed under the MIT license. } if (s.bars.show && !item) { // no other point can be nearby - - var barLeft, barRight; - - switch (s.bars.align) { - case "left": - barLeft = 0; - break; - case "right": - barLeft = -s.bars.barWidth; - break; - default: - barLeft = -s.bars.barWidth / 2; - } - - barRight = barLeft + s.bars.barWidth; + var barLeft = s.bars.align === "left" ? 0 : -s.bars.barWidth/2, + barRight = barLeft + s.bars.barWidth; for (j = 0; j < points.length; j += ps) { - var x = points[j], y = points[j + 1], b = points[j + 2]; - if (x == null) + x = points[j]; + y = points[j + 1]; + var b = points[j + 2]; + if (x == null) { continue; + } // for a bar graph, the cursor must be inside the bar if (series[i].bars.horizontal ? (mx <= Math.max(b, x) && mx >= Math.min(b, x) && my >= y + barLeft && my <= y + barRight) : (mx >= x + barLeft && mx <= x + barRight && - my >= Math.min(b, y) && my <= Math.max(b, y))) - item = [i, j / ps]; + my >= Math.min(b, y) && my <= Math.max(b, y))) { + item = [i, j / ps]; + } } } } @@ -2927,20 +3195,22 @@ Licensed under the MIT license. } function onMouseMove(e) { - if (options.grid.hoverable) + if (options.grid.hoverable) { triggerClickHoverEvent("plothover", e, - function (s) { return s["hoverable"] != false; }); + function (s) { return s.hoverable !== false; }); + } } function onMouseLeave(e) { - if (options.grid.hoverable) + if (options.grid.hoverable) { triggerClickHoverEvent("plothover", e, - function (s) { return false; }); + function () { return false; }); + } } function onClick(e) { triggerClickHoverEvent("plotclick", e, - function (s) { return s["clickable"] != false; }); + function (s) { return s.clickable !== false; }); } // trigger click or hover event (they send the same parameters @@ -2966,15 +3236,18 @@ Licensed under the MIT license. // clear auto-highlights for (var i = 0; i < highlights.length; ++i) { var h = highlights[i]; - if (h.auto == eventname && - !(item && h.series == item.series && - h.point[0] == item.datapoint[0] && - h.point[1] == item.datapoint[1])) + if (h.auto === eventname && !( + item && h.series === item.series && + h.point[0] === item.datapoint[0] && + h.point[1] === item.datapoint[1] + )) { unhighlight(h.series, h.point); + } } - if (item) + if (item) { highlight(item.series, item.datapoint, eventname); + } } placeholder.trigger(eventname, [ pos, item ]); @@ -2982,13 +3255,14 @@ Licensed under the MIT license. function triggerRedrawOverlay() { var t = options.interaction.redrawOverlayInterval; - if (t == -1) { // skip event queue + if (t === -1) { // skip event queue drawOverlay(); return; } - if (!redrawTimeout) + if (!redrawTimeout) { redrawTimeout = setTimeout(drawOverlay, t); + } } function drawOverlay() { @@ -3003,10 +3277,11 @@ Licensed under the MIT license. for (i = 0; i < highlights.length; ++i) { hi = highlights[i]; - if (hi.series.bars.show) + if (hi.series.bars.show) { drawBarHighlight(hi.series, hi.point); - else + } else { drawPointHighlight(hi.series, hi.point); + } } octx.restore(); @@ -3014,22 +3289,22 @@ Licensed under the MIT license. } function highlight(s, point, auto) { - if (typeof s == "number") + if (isNumeric(s)) { s = series[s]; + } - if (typeof point == "number") { + if (isNumeric(point)) { var ps = s.datapoints.pointsize; point = s.datapoints.points.slice(ps * point, ps * (point + 1)); } var i = indexOfHighlight(s, point); - if (i == -1) { + if (i === -1) { highlights.push({ series: s, point: point, auto: auto }); - triggerRedrawOverlay(); - } - else if (!auto) + } else if (!auto) { highlights[i].auto = false; + } } function unhighlight(s, point) { @@ -3039,18 +3314,18 @@ Licensed under the MIT license. return; } - if (typeof s == "number") + if (isNumeric(s)) { s = series[s]; + } - if (typeof point == "number") { + if (isNumeric(point)) { var ps = s.datapoints.pointsize; point = s.datapoints.points.slice(ps * point, ps * (point + 1)); } var i = indexOfHighlight(s, point); - if (i != -1) { + if (i !== -1) { highlights.splice(i, 1); - triggerRedrawOverlay(); } } @@ -3058,9 +3333,9 @@ Licensed under the MIT license. function indexOfHighlight(s, p) { for (var i = 0; i < highlights.length; ++i) { var h = highlights[i]; - if (h.series == s && h.point[0] == p[0] - && h.point[1] == p[1]) + if (h.series === s && h.point[0] === p[0] && h.point[1] === p[1]) { return i; + } } return -1; } @@ -3068,54 +3343,52 @@ Licensed under the MIT license. function drawPointHighlight(series, point) { var x = point[0], y = point[1], axisx = series.xaxis, axisy = series.yaxis, - highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(); + highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale("a", 0.5).toString(); - if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) { return; + } - var pointRadius = series.points.radius + series.points.lineWidth / 2; + var pointRadius; + var radius; + if (series.points.show) { + pointRadius = series.points.radius + series.points.lineWidth / 2; + radius = 1.5 * pointRadius; + } else { + pointRadius = series.points.radius; + radius = 0.5 * pointRadius; + } octx.lineWidth = pointRadius; octx.strokeStyle = highlightColor; - var radius = 1.5 * pointRadius; x = axisx.p2c(x); y = axisy.p2c(y); octx.beginPath(); - if (series.points.symbol == "circle") + if (series.points.symbol === "circle") { octx.arc(x, y, radius, 0, 2 * Math.PI, false); - else + } else { series.points.symbol(octx, x, y, radius, false); + } octx.closePath(); octx.stroke(); } function drawBarHighlight(series, point) { - var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(), + var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale("a", 0.5).toString(), fillStyle = highlightColor, - barLeft; - - switch (series.bars.align) { - case "left": - barLeft = 0; - break; - case "right": - barLeft = -series.bars.barWidth; - break; - default: - barLeft = -series.bars.barWidth / 2; - } + barLeft = series.bars.align === "left" ? 0 : -series.bars.barWidth/2; octx.lineWidth = series.bars.lineWidth; octx.strokeStyle = highlightColor; drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, - function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); + 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); } function getColorOrGradient(spec, bottom, top, defaultColor) { - if (typeof spec == "string") + if (typeof spec === "string") { return spec; - else { + } else { // assume this is a gradient spec; IE currently only // supports a simple vertical gradient properly, so that's // what we support too @@ -3123,12 +3396,14 @@ Licensed under the MIT license. for (var i = 0, l = spec.colors.length; i < l; ++i) { var c = spec.colors[i]; - if (typeof c != "string") { + if (typeof c !== "string") { var co = $.color.parse(defaultColor); - if (c.brightness != null) - co = co.scale('rgb', c.brightness); - if (c.opacity != null) + if (c.brightness != null) { + co = co.scale("rgb", c.brightness); + } + if (c.opacity != null) { co.a *= c.opacity; + } c = co.toString(); } gradient.addColorStop(i / (l - 1), c); @@ -3148,7 +3423,7 @@ Licensed under the MIT license. return plot; }; - $.plot.version = "0.8.3"; + $.plot.version = "0.9.0-alpha"; $.plot.plugins = []; @@ -3165,4 +3440,4 @@ Licensed under the MIT license. return base * Math.floor(n / base); } -})(jQuery); +})(jQuery); \ No newline at end of file From cb56679c140138624e606bfe2ca8e91b3267a5fe Mon Sep 17 00:00:00 2001 From: Hannah Mudge Date: Tue, 22 Oct 2024 13:06:48 -0600 Subject: [PATCH 027/146] [Dashboard] [Collapsable Panels] Interact with real panel element (#196756) Closes https://github.com/elastic/kibana/issues/190647 ## Summary This PR swaps the interaction of `kbn-grid-layout` so that you are now dragging/resizing the **actual element** rather than the preview - i.e. the preview now shows the **real** / grid aligned location (i.e. where the panel will land once the interaction stops), while the element shows the non-grid-aligned location. **Dragging** | Before | After | |--------|--------| | ![Oct-18-2024 09-10-52](https://github.com/user-attachments/assets/f117124d-3200-4c7b-a5f7-6a4bc767ebff) | ![Oct-18-2024 09-07-25](https://github.com/user-attachments/assets/483d481a-a752-4455-b9bd-2d89ec273454) | **Resizing** | Before | After | |--------|--------| | ![Oct-18-2024 09-11-21](https://github.com/user-attachments/assets/64e4314d-b641-4b0c-a4a9-93e3f0d21cbc) | ![Oct-18-2024 09-07-55](https://github.com/user-attachments/assets/755be726-38bc-475b-a85d-7696262c4b4f) | This serves as more than just a visual update - because we are dragging the real element, the mouse stays "locked" to the drag and/or resize handler, which means we have introduced the possibility for an `onDrop` event. This is necessary in order to keep the current "unsaved changes" behaviour on Dashboard, where changes are triggered only once the panel is actually **dropped** and not when other panels move as a consequence of a drag event. To make this possible, I also removed the `GridOverlay` component - it was creating a transparent `div` **over the entire grid** on interaction, which meant that focus was lost as soon as the interaction started. If we want to restore the "scroll up" and "scroll down" buttons (which we were unsure about, anyway), we would need to rethink this (i.e. just render two fixed-position buttons without any overlay). ### Checklist - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels) - [ ] This will appear in the **Release Notes** and follow the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../grid/grid_height_smoother.tsx | 2 +- packages/kbn-grid-layout/grid/grid_layout.tsx | 15 +- .../kbn-grid-layout/grid/grid_overlay.tsx | 135 ---------------- packages/kbn-grid-layout/grid/grid_panel.tsx | 77 ++++----- packages/kbn-grid-layout/grid/grid_row.tsx | 77 +++++++-- packages/kbn-grid-layout/grid/types.ts | 18 ++- .../grid/use_grid_layout_events.ts | 22 +-- .../grid/use_grid_layout_state.ts | 150 ++++++++++++++---- 8 files changed, 239 insertions(+), 257 deletions(-) delete mode 100644 packages/kbn-grid-layout/grid/grid_overlay.tsx diff --git a/packages/kbn-grid-layout/grid/grid_height_smoother.tsx b/packages/kbn-grid-layout/grid/grid_height_smoother.tsx index 960fe4f52e735..7693fac72918a 100644 --- a/packages/kbn-grid-layout/grid/grid_height_smoother.tsx +++ b/packages/kbn-grid-layout/grid/grid_height_smoother.tsx @@ -24,7 +24,7 @@ export const GridHeightSmoother = ({ gridLayoutStateManager.interactionEvent$, ]).subscribe(([dimensions, interactionEvent]) => { if (!smoothHeightRef.current) return; - if (!interactionEvent) { + if (!interactionEvent || interactionEvent.type === 'drop') { smoothHeightRef.current.style.height = `${dimensions.height}px`; return; } diff --git a/packages/kbn-grid-layout/grid/grid_layout.tsx b/packages/kbn-grid-layout/grid/grid_layout.tsx index 7587e57e9dd1c..c6bbd94dabe56 100644 --- a/packages/kbn-grid-layout/grid/grid_layout.tsx +++ b/packages/kbn-grid-layout/grid/grid_layout.tsx @@ -7,10 +7,11 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; import React from 'react'; + +import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; + import { GridHeightSmoother } from './grid_height_smoother'; -import { GridOverlay } from './grid_overlay'; import { GridRow } from './grid_row'; import { GridLayoutData, GridSettings } from './types'; import { useGridLayoutEvents } from './use_grid_layout_events'; @@ -49,17 +50,17 @@ export const GridLayout = ({ key={rowData.title} rowIndex={rowIndex} runtimeSettings={runtimeSettings} - activePanelId={interactionEvent?.id} renderPanelContents={renderPanelContents} targetRowIndex={interactionEvent?.targetRowIndex} + gridLayoutStateManager={gridLayoutStateManager} toggleIsCollapsed={() => { const currentLayout = gridLayoutStateManager.gridLayout$.value; currentLayout[rowIndex].isCollapsed = !currentLayout[rowIndex].isCollapsed; gridLayoutStateManager.gridLayout$.next(currentLayout); }} setInteractionEvent={(nextInteractionEvent) => { - if (!nextInteractionEvent) { - gridLayoutStateManager.hideDragPreview(); + if (nextInteractionEvent?.type === 'drop') { + gridLayoutStateManager.activePanel$.next(undefined); } gridLayoutStateManager.interactionEvent$.next(nextInteractionEvent); }} @@ -69,10 +70,6 @@ export const GridLayout = ({ })} - ); }; diff --git a/packages/kbn-grid-layout/grid/grid_overlay.tsx b/packages/kbn-grid-layout/grid/grid_overlay.tsx deleted file mode 100644 index 958618d2f8f38..0000000000000 --- a/packages/kbn-grid-layout/grid/grid_overlay.tsx +++ /dev/null @@ -1,135 +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", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { EuiPortal, EuiText, transparentize } from '@elastic/eui'; -import { css } from '@emotion/react'; -import { i18n } from '@kbn/i18n'; -import { euiThemeVars } from '@kbn/ui-theme'; -import React, { useRef, useState } from 'react'; -import { GridLayoutStateManager, PanelInteractionEvent } from './types'; - -type ScrollDirection = 'up' | 'down'; - -const scrollLabels: { [key in ScrollDirection]: string } = { - up: i18n.translate('kbnGridLayout.overlays.scrollUpLabel', { defaultMessage: 'Scroll up' }), - down: i18n.translate('kbnGridLayout.overlays.scrollDownLabel', { defaultMessage: 'Scroll down' }), -}; - -const scrollOnInterval = (direction: ScrollDirection) => { - const interval = setInterval(() => { - window.scroll({ - top: window.scrollY + (direction === 'down' ? 50 : -50), - behavior: 'smooth', - }); - }, 100); - return interval; -}; - -const ScrollOnHover = ({ direction, hide }: { hide: boolean; direction: ScrollDirection }) => { - const [isActive, setIsActive] = useState(false); - const scrollInterval = useRef(null); - const stopScrollInterval = () => { - if (scrollInterval.current) { - clearInterval(scrollInterval.current); - } - }; - - return ( -
{ - setIsActive(true); - scrollInterval.current = scrollOnInterval(direction); - }} - onMouseLeave={() => { - setIsActive(false); - stopScrollInterval(); - }} - css={css` - width: 100%; - position: fixed; - display: flex; - align-items: center; - flex-direction: column; - justify-content: center; - opacity: ${hide ? 0 : 1}; - transition: opacity 100ms linear; - padding: ${euiThemeVars.euiSizeM}; - ${direction === 'down' ? 'bottom: 0;' : 'top: 0;'} - `} - > - {direction === 'up' && ( -
- )} -
- - {scrollLabels[direction]} - -
-
- ); -}; - -export const GridOverlay = ({ - interactionEvent, - gridLayoutStateManager, -}: { - interactionEvent?: PanelInteractionEvent; - gridLayoutStateManager: GridLayoutStateManager; -}) => { - return ( - -
- - -
-
- - ); -}; diff --git a/packages/kbn-grid-layout/grid/grid_panel.tsx b/packages/kbn-grid-layout/grid/grid_panel.tsx index 7bad4d1af037c..fbe34c4b68e15 100644 --- a/packages/kbn-grid-layout/grid/grid_panel.tsx +++ b/packages/kbn-grid-layout/grid/grid_panel.tsx @@ -7,63 +7,38 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import React, { forwardRef } from 'react'; + import { EuiIcon, EuiPanel, euiFullHeight, transparentize, useEuiOverflowScroll, + useEuiTheme, } from '@elastic/eui'; import { css } from '@emotion/react'; import { euiThemeVars } from '@kbn/ui-theme'; -import React, { useCallback, useRef } from 'react'; + import { GridPanelData, PanelInteractionEvent } from './types'; -export const GridPanel = ({ - activePanelId, - panelData, - renderPanelContents, - setInteractionEvent, -}: { - panelData: GridPanelData; - activePanelId: string | undefined; - renderPanelContents: (panelId: string) => React.ReactNode; - setInteractionEvent: (interactionData?: Omit) => void; -}) => { - const panelRef = useRef(null); +export const GridPanel = forwardRef< + HTMLDivElement, + { + panelData: GridPanelData; + activePanelId: string | undefined; + renderPanelContents: (panelId: string) => React.ReactNode; + interactionStart: ( + type: PanelInteractionEvent['type'], + e: React.MouseEvent + ) => void; + } +>(({ activePanelId, panelData, renderPanelContents, interactionStart }, panelRef) => { + const { euiTheme } = useEuiTheme(); const thisPanelActive = activePanelId === panelData.id; - const interactionStart = useCallback( - (type: 'drag' | 'resize', e: React.MouseEvent) => { - if (!panelRef.current) return; - e.preventDefault(); - e.stopPropagation(); - const panelRect = panelRef.current.getBoundingClientRect(); - setInteractionEvent({ - type, - id: panelData.id, - panelDiv: panelRef.current, - mouseOffsets: { - top: e.clientY - panelRect.top, - left: e.clientX - panelRect.left, - right: e.clientX - panelRect.right, - bottom: e.clientY - panelRect.bottom, - }, - }); - }, - [panelData.id, setInteractionEvent] - ); - return ( -
+
interactionStart('drag', e)} + onMouseUp={(e) => interactionStart('drop', e)} >
@@ -109,6 +93,7 @@ export const GridPanel = ({
interactionStart('resize', e)} + onMouseUp={(e) => interactionStart('drop', e)} css={css` right: 0; bottom: 0; @@ -139,4 +124,4 @@ export const GridPanel = ({
); -}; +}); diff --git a/packages/kbn-grid-layout/grid/grid_row.tsx b/packages/kbn-grid-layout/grid/grid_row.tsx index b2a9375c390b1..917f661c91740 100644 --- a/packages/kbn-grid-layout/grid/grid_row.tsx +++ b/packages/kbn-grid-layout/grid/grid_row.tsx @@ -7,13 +7,21 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import React, { forwardRef, useMemo, useRef } from 'react'; + import { EuiButtonIcon, EuiFlexGroup, EuiSpacer, EuiTitle, transparentize } from '@elastic/eui'; import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; import { euiThemeVars } from '@kbn/ui-theme'; -import React, { forwardRef, useMemo } from 'react'; +import { useStateFromPublishingSubject } from '@kbn/presentation-publishing'; + import { GridPanel } from './grid_panel'; -import { GridRowData, PanelInteractionEvent, RuntimeGridSettings } from './types'; +import { + GridLayoutStateManager, + GridRowData, + PanelInteractionEvent, + RuntimeGridSettings, +} from './types'; const gridColor = transparentize(euiThemeVars.euiColorSuccess, 0.2); const getGridBackgroundCSS = (settings: RuntimeGridSettings) => { @@ -32,28 +40,31 @@ export const GridRow = forwardRef< rowIndex: number; rowData: GridRowData; toggleIsCollapsed: () => void; - activePanelId: string | undefined; targetRowIndex: number | undefined; runtimeSettings: RuntimeGridSettings; renderPanelContents: (panelId: string) => React.ReactNode; setInteractionEvent: (interactionData?: PanelInteractionEvent) => void; + gridLayoutStateManager: GridLayoutStateManager; } >( ( { rowData, rowIndex, - activePanelId, targetRowIndex, runtimeSettings, toggleIsCollapsed, renderPanelContents, setInteractionEvent, + gridLayoutStateManager, }, gridRef ) => { + const dragPreviewRef = useRef(null); + const activePanel = useStateFromPublishingSubject(gridLayoutStateManager.activePanel$); + const { gutterSize, columnCount, rowHeight } = runtimeSettings; - const isGridTargeted = activePanelId && targetRowIndex === rowIndex; + const isGridTargeted = activePanel?.id && targetRowIndex === rowIndex; // calculate row count based on the number of rows needed to fit all panels const rowCount = useMemo(() => { @@ -107,20 +118,58 @@ export const GridRow = forwardRef< { - if (partialInteractionEvent) { - setInteractionEvent({ - ...partialInteractionEvent, - targetRowIndex: rowIndex, - }); - return; + interactionStart={(type, e) => { + e.preventDefault(); + e.stopPropagation(); + const panelRef = gridLayoutStateManager.panelRefs.current[rowIndex][panelData.id]; + if (!panelRef) return; + + const panelRect = panelRef.getBoundingClientRect(); + setInteractionEvent({ + type, + id: panelData.id, + panelDiv: panelRef, + targetRowIndex: rowIndex, + mouseOffsets: { + top: e.clientY - panelRect.top, + left: e.clientX - panelRect.left, + right: e.clientX - panelRect.right, + bottom: e.clientY - panelRect.bottom, + }, + }); + }} + ref={(element) => { + if (!gridLayoutStateManager.panelRefs.current[rowIndex]) { + gridLayoutStateManager.panelRefs.current[rowIndex] = {}; } - setInteractionEvent(); + gridLayoutStateManager.panelRefs.current[rowIndex][panelData.id] = element; }} /> ))} + + {/* render the drag preview if this row is currently being targetted */} + {isGridTargeted && ( +
+ )}
)} diff --git a/packages/kbn-grid-layout/grid/types.ts b/packages/kbn-grid-layout/grid/types.ts index 3d63c9f6ea01a..3a88eeb33baba 100644 --- a/packages/kbn-grid-layout/grid/types.ts +++ b/packages/kbn-grid-layout/grid/types.ts @@ -46,21 +46,25 @@ export interface GridSettings { */ export type RuntimeGridSettings = GridSettings & { columnPixelWidth: number }; -export interface GridLayoutStateManager { - hideDragPreview: () => void; - updatePreviewElement: (rect: { +export interface ActivePanel { + id: string; + position: { top: number; left: number; bottom: number; right: number; - }) => void; + }; +} +export interface GridLayoutStateManager { gridDimensions$: BehaviorSubject; gridLayout$: BehaviorSubject; runtimeSettings$: BehaviorSubject; - rowRefs: React.MutableRefObject>; - dragPreviewRef: React.MutableRefObject; + activePanel$: BehaviorSubject; interactionEvent$: BehaviorSubject; + + rowRefs: React.MutableRefObject>; + panelRefs: React.MutableRefObject>; } /** @@ -70,7 +74,7 @@ export interface PanelInteractionEvent { /** * The type of interaction being performed. */ - type: 'drag' | 'resize'; + type: 'drag' | 'resize' | 'drop'; /** * The id of the panel being interacted with. diff --git a/packages/kbn-grid-layout/grid/use_grid_layout_events.ts b/packages/kbn-grid-layout/grid/use_grid_layout_events.ts index 34fa84eeb131e..dfbd013d3642a 100644 --- a/packages/kbn-grid-layout/grid/use_grid_layout_events.ts +++ b/packages/kbn-grid-layout/grid/use_grid_layout_events.ts @@ -8,8 +8,9 @@ */ import { useEffect, useRef } from 'react'; + import { resolveGridRow } from './resolve_grid_row'; -import { GridPanelData, GridLayoutStateManager } from './types'; +import { GridLayoutStateManager, GridPanelData } from './types'; export const isGridDataEqual = (a?: GridPanelData, b?: GridPanelData) => { return ( @@ -35,12 +36,11 @@ export const useGridLayoutEvents = ({ useEffect(() => { const { runtimeSettings$, interactionEvent$, gridLayout$ } = gridLayoutStateManager; const calculateUserEvent = (e: Event) => { - if (!interactionEvent$.value) return; + if (!interactionEvent$.value || interactionEvent$.value.type === 'drop') return; e.preventDefault(); e.stopPropagation(); const gridRowElements = gridLayoutStateManager.rowRefs.current; - const previewElement = gridLayoutStateManager.dragPreviewRef.current; const interactionEvent = interactionEvent$.value; const isResize = interactionEvent?.type === 'resize'; @@ -53,7 +53,7 @@ export const useGridLayoutEvents = ({ } })(); - if (!runtimeSettings$.value || !previewElement || !gridRowElements || !currentGridData) { + if (!runtimeSettings$.value || !gridRowElements || !currentGridData) { return; } @@ -68,7 +68,7 @@ export const useGridLayoutEvents = ({ bottom: mouseTargetPixel.y - interactionEvent.mouseOffsets.bottom, right: mouseTargetPixel.x - interactionEvent.mouseOffsets.right, }; - gridLayoutStateManager.updatePreviewElement(previewRect); + gridLayoutStateManager.activePanel$.next({ id: interactionEvent.id, position: previewRect }); // find the grid that the preview rect is over const previewBottom = @@ -154,29 +154,19 @@ export const useGridLayoutEvents = ({ const resolvedOriginGrid = resolveGridRow(originGrid); nextLayout[lastRowIndex] = resolvedOriginGrid; } + gridLayout$.next(nextLayout); } }; - const onMouseUp = (e: MouseEvent) => { - if (!interactionEvent$.value) return; - e.preventDefault(); - e.stopPropagation(); - - interactionEvent$.next(undefined); - gridLayoutStateManager.hideDragPreview(); - }; - const onMouseMove = (e: MouseEvent) => { mouseClientPosition.current = { x: e.clientX, y: e.clientY }; calculateUserEvent(e); }; - document.addEventListener('mouseup', onMouseUp); document.addEventListener('mousemove', onMouseMove); document.addEventListener('scroll', calculateUserEvent); return () => { - document.removeEventListener('mouseup', onMouseUp); document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('scroll', calculateUserEvent); }; diff --git a/packages/kbn-grid-layout/grid/use_grid_layout_state.ts b/packages/kbn-grid-layout/grid/use_grid_layout_state.ts index e10ce12fe5b6b..cdb99a9ebbfd0 100644 --- a/packages/kbn-grid-layout/grid/use_grid_layout_state.ts +++ b/packages/kbn-grid-layout/grid/use_grid_layout_state.ts @@ -7,10 +7,12 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { i18n } from '@kbn/i18n'; import { useEffect, useMemo, useRef } from 'react'; -import { BehaviorSubject, debounceTime } from 'rxjs'; +import { BehaviorSubject, combineLatest, debounceTime, map, retry } from 'rxjs'; import useResizeObserver, { type ObservedSize } from 'use-resize-observer/polyfilled'; import { + ActivePanel, GridLayoutData, GridLayoutStateManager, GridSettings, @@ -27,7 +29,7 @@ export const useGridLayoutState = ({ setDimensionsRef: (instance: HTMLDivElement | null) => void; } => { const rowRefs = useRef>([]); - const dragPreviewRef = useRef(null); + const panelRefs = useRef>([]); // eslint-disable-next-line react-hooks/exhaustive-deps const { initialLayout, gridSettings } = useMemo(() => getCreationOptions(), []); @@ -36,6 +38,7 @@ export const useGridLayoutState = ({ const gridLayout$ = new BehaviorSubject(initialLayout); const gridDimensions$ = new BehaviorSubject({ width: 0, height: 0 }); const interactionEvent$ = new BehaviorSubject(undefined); + const activePanel$ = new BehaviorSubject(undefined); const runtimeSettings$ = new BehaviorSubject({ ...gridSettings, columnPixelWidth: 0, @@ -43,41 +46,21 @@ export const useGridLayoutState = ({ return { rowRefs, + panelRefs, gridLayout$, - dragPreviewRef, + activePanel$, gridDimensions$, runtimeSettings$, interactionEvent$, - updatePreviewElement: (previewRect: { - top: number; - bottom: number; - left: number; - right: number; - }) => { - if (!dragPreviewRef.current) return; - dragPreviewRef.current.style.opacity = '1'; - dragPreviewRef.current.style.left = `${previewRect.left}px`; - dragPreviewRef.current.style.top = `${previewRect.top}px`; - dragPreviewRef.current.style.width = `${Math.max( - previewRect.right - previewRect.left, - runtimeSettings$.value.columnPixelWidth - )}px`; - dragPreviewRef.current.style.height = `${Math.max( - previewRect.bottom - previewRect.top, - runtimeSettings$.value.rowHeight - )}px`; - }, - hideDragPreview: () => { - if (!dragPreviewRef.current) return; - dragPreviewRef.current.style.opacity = '0'; - }, }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { - // debounce width changes to avoid unnecessary column width recalculation. - const subscription = gridLayoutStateManager.gridDimensions$ + /** + * debounce width changes to avoid unnecessary column width recalculation. + */ + const resizeSubscription = gridLayoutStateManager.gridDimensions$ .pipe(debounceTime(250)) .subscribe((dimensions) => { const elementWidth = dimensions.width ?? 0; @@ -86,7 +69,116 @@ export const useGridLayoutState = ({ gridSettings.columnCount; gridLayoutStateManager.runtimeSettings$.next({ ...gridSettings, columnPixelWidth }); }); - return () => subscription.unsubscribe(); + + /** + * on layout change, update the styles of every panel so that it renders as expected + */ + const onLayoutChangeSubscription = combineLatest([ + gridLayoutStateManager.gridLayout$, + gridLayoutStateManager.activePanel$, + ]) + .pipe( + map(([gridLayout, activePanel]) => { + // wait for all panel refs to be ready before continuing + for (let rowIndex = 0; rowIndex < gridLayout.length; rowIndex++) { + const currentRow = gridLayout[rowIndex]; + Object.keys(currentRow.panels).forEach((key) => { + const panelRef = gridLayoutStateManager.panelRefs.current[rowIndex][key]; + if (!panelRef && !currentRow.isCollapsed) { + throw new Error( + i18n.translate('kbnGridLayout.panelRefNotFoundError', { + defaultMessage: 'Panel reference does not exist', // the retry will catch this error + }) + ); + } + }); + } + return { gridLayout, activePanel }; + }), + retry({ delay: 10 }) // retry until panel references all exist + ) + .subscribe(({ gridLayout, activePanel }) => { + const runtimeSettings = gridLayoutStateManager.runtimeSettings$.getValue(); + const currentInteractionEvent = gridLayoutStateManager.interactionEvent$.getValue(); + + for (let rowIndex = 0; rowIndex < gridLayout.length; rowIndex++) { + if (activePanel && rowIndex !== currentInteractionEvent?.targetRowIndex) { + /** + * If there is an interaction event happening but the current row is not being targetted, it + * does not need to be re-rendered; so, skip setting the panel styles of this row. + * + * If there is **no** interaction event, then this is the initial render so the styles of every + * panel should be initialized; so, don't skip setting the panel styles. + */ + continue; + } + + // re-render the targetted row + const currentRow = gridLayout[rowIndex]; + Object.keys(currentRow.panels).forEach((key) => { + const panel = currentRow.panels[key]; + const panelRef = gridLayoutStateManager.panelRefs.current[rowIndex][key]; + if (!panelRef) { + return; + } + + const isResize = currentInteractionEvent?.type === 'resize'; + if (panel.id === activePanel?.id) { + // if the current panel is active, give it fixed positioning depending on the interaction event + const { position: draggingPosition } = activePanel; + + if (isResize) { + // if the current panel is being resized, ensure it is not shrunk past the size of a single cell + panelRef.style.width = `${Math.max( + draggingPosition.right - draggingPosition.left, + runtimeSettings.columnPixelWidth + )}px`; + panelRef.style.height = `${Math.max( + draggingPosition.bottom - draggingPosition.top, + runtimeSettings.rowHeight + )}px`; + + // undo any "lock to grid" styles **except** for the top left corner, which stays locked + panelRef.style.gridColumnStart = `${panel.column + 1}`; + panelRef.style.gridRowStart = `${panel.row + 1}`; + panelRef.style.gridColumnEnd = ``; + panelRef.style.gridRowEnd = ``; + } else { + // if the current panel is being dragged, render it with a fixed position + size + panelRef.style.position = 'fixed'; + panelRef.style.left = `${draggingPosition.left}px`; + panelRef.style.top = `${draggingPosition.top}px`; + panelRef.style.width = `${draggingPosition.right - draggingPosition.left}px`; + panelRef.style.height = `${draggingPosition.bottom - draggingPosition.top}px`; + + // undo any "lock to grid" styles + panelRef.style.gridColumnStart = ``; + panelRef.style.gridRowStart = ``; + panelRef.style.gridColumnEnd = ``; + panelRef.style.gridRowEnd = ``; + } + } else { + // if the panel is not being dragged and/or resized, undo any fixed position styles + panelRef.style.position = ''; + panelRef.style.left = ``; + panelRef.style.top = ``; + panelRef.style.width = ``; + panelRef.style.height = ``; + + // and render the panel locked to the grid + panelRef.style.gridColumnStart = `${panel.column + 1}`; + panelRef.style.gridColumnEnd = `${panel.column + 1 + panel.width}`; + panelRef.style.gridRowStart = `${panel.row + 1}`; + panelRef.style.gridRowEnd = `${panel.row + 1 + panel.height}`; + } + }); + } + }); + + return () => { + resizeSubscription.unsubscribe(); + onLayoutChangeSubscription.unsubscribe(); + }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); From 6f44bf5b65843ce656c6b66e37403be91e19b96b Mon Sep 17 00:00:00 2001 From: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> Date: Tue, 22 Oct 2024 22:04:07 +0200 Subject: [PATCH 028/146] [Lens] dont use legacy metric in the suggestions (#197101) ## Summary Fixes https://github.com/elastic/kibana/issues/197078 --- .../legacy_metric/metric_suggestions.test.ts | 4 ++-- .../legacy_metric/metric_suggestions.ts | 2 +- .../visualizations/metric/suggestions.test.ts | 12 ++++++------ .../public/visualizations/metric/suggestions.ts | 13 +++++++++---- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.test.ts b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.test.ts index 794c8cedf5164..0de7fc26608d2 100644 --- a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.test.ts +++ b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.test.ts @@ -171,7 +171,7 @@ describe('metric_suggestions', () => { expect(rest).toHaveLength(0); expect(suggestion).toMatchInlineSnapshot(` Object { - "hide": false, + "hide": true, "previewIcon": [Function], "score": 0.1, "state": Object { @@ -207,7 +207,7 @@ describe('metric_suggestions', () => { expect(rest).toHaveLength(0); expect(suggestion).toMatchInlineSnapshot(` Object { - "hide": false, + "hide": true, "previewIcon": [Function], "score": 0.1, "state": Object { diff --git a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.ts b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.ts index 93e564cde841e..1b190cc0ce66f 100644 --- a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.ts +++ b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.ts @@ -52,7 +52,7 @@ function getSuggestion( return { title, - hide: datasourceId === 'textBased', + hide: true, score: 0.1, previewIcon: IconChartMetric, state: { diff --git a/x-pack/plugins/lens/public/visualizations/metric/suggestions.test.ts b/x-pack/plugins/lens/public/visualizations/metric/suggestions.test.ts index fff365e0e89dd..4f1c7b46d06be 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/suggestions.test.ts +++ b/x-pack/plugins/lens/public/visualizations/metric/suggestions.test.ts @@ -159,7 +159,7 @@ describe('metric suggestions', () => { // should ignore bucketed column for initial drag }, title: 'Metric', - hide: true, + hide: false, previewIcon: IconChartMetric, score: 0.51, }, @@ -189,7 +189,7 @@ describe('metric suggestions', () => { breakdownByAccessor: bucketColumn.columnId, }, title: 'Metric', - hide: true, + hide: false, previewIcon: IconChartMetric, score: 0.51, }, @@ -221,7 +221,7 @@ describe('metric suggestions', () => { breakdownByAccessor: bucketColumn.columnId, }, title: 'Metric', - hide: true, + hide: false, previewIcon: IconChartMetric, score: 0.51, }, @@ -294,7 +294,7 @@ describe('metric suggestions', () => { breakdownByAccessor: bucketColumn.columnId, }, title: 'Metric', - hide: true, + hide: false, previewIcon: IconChartMetric, score: 0.52, }, @@ -326,7 +326,7 @@ describe('metric suggestions', () => { breakdownByAccessor: bucketColumn.columnId, }, title: 'Metric', - hide: true, + hide: false, previewIcon: IconChartMetric, score: 0.52, }, @@ -357,7 +357,7 @@ describe('metric suggestions', () => { breakdownByAccessor: bucketColumn.columnId, }, title: 'Metric', - hide: true, + hide: false, previewIcon: IconChartMetric, score: 0.52, }, diff --git a/x-pack/plugins/lens/public/visualizations/metric/suggestions.ts b/x-pack/plugins/lens/public/visualizations/metric/suggestions.ts index b405ea646d980..877d2b45d66af 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/suggestions.ts +++ b/x-pack/plugins/lens/public/visualizations/metric/suggestions.ts @@ -30,6 +30,8 @@ export const getSuggestions: Visualization['getSuggest const bucketedColumns = table.columns.filter(({ operation }) => operation.isBucketed); + const hasInterval = bucketedColumns.some(({ operation }) => operation.scale === 'interval'); + const unsupportedColumns = table.columns.filter( ({ operation }) => !supportedDataTypes.has(operation.dataType) && !operation.isBucketed ); @@ -59,11 +61,10 @@ export const getSuggestions: Visualization['getSuggest layerId: table.layerId, layerType: LayerTypes.DATA, }, - title: metricLabel, + title: metricColumns[0]?.operation.label || metricLabel, previewIcon: IconChartMetric, score: 0.5, - // don't show suggestions since we're in tech preview - hide: true, + hide: hasInterval, }; const accessorMappings: Pick = @@ -72,7 +73,11 @@ export const getSuggestions: Visualization['getSuggest breakdownByAccessor: bucketedColumns[0]?.columnId, }; - baseSuggestion.score += 0.01 * Object.values(accessorMappings).filter(Boolean).length; + baseSuggestion.score = Number( + (baseSuggestion.score + 0.01 * Object.values(accessorMappings).filter(Boolean).length).toFixed( + 2 + ) + ); const suggestion = { ...baseSuggestion, From 5034558446d8350d0b5a81efc3100ee9cb7bda72 Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Tue, 22 Oct 2024 16:29:55 -0500 Subject: [PATCH 029/146] [Search][FTR] Fix / Improve tests (#197264) ## Summary Closes #196981 - Updated Search Index Details with data test suite to check for index documents first, this should help reduce flakey tests in MKI since we will ensure the documents are available before moving forward - Updated URL checks to use regex instead `.equal` with the mocked value. This should ensure the tests can pass in MKI and with integration testing - Removed the navigation check for the Maps page, this was causing intermittent failures due to a modal on the page. - Updated the getting started test suite to use `developer` role instead of `admin` ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed --- .../svl_search_elasticsearch_start_page.ts | 4 ++-- .../page_objects/svl_search_index_detail_page.ts | 4 ++-- .../test_suites/search/elasticsearch_start.ts | 3 --- .../test_suites/search/getting_started.ts | 2 +- .../functional/test_suites/search/navigation.ts | 15 --------------- .../test_suites/search/search_index_detail.ts | 9 +++------ 6 files changed, 8 insertions(+), 29 deletions(-) diff --git a/x-pack/test_serverless/functional/page_objects/svl_search_elasticsearch_start_page.ts b/x-pack/test_serverless/functional/page_objects/svl_search_elasticsearch_start_page.ts index 0e3bc4b82a298..1f4294d4c8f41 100644 --- a/x-pack/test_serverless/functional/page_objects/svl_search_elasticsearch_start_page.ts +++ b/x-pack/test_serverless/functional/page_objects/svl_search_elasticsearch_start_page.ts @@ -85,8 +85,8 @@ export function SvlSearchElasticsearchStartPageProvider({ getService }: FtrProvi }, async expectO11yTrialLink() { await testSubjects.existOrFail('startO11yTrialBtn'); - expect(await testSubjects.getAttribute('startO11yTrialBtn', 'href')).equal( - 'https://fake-cloud.elastic.co/projects/create/observability/start' + expect(await testSubjects.getAttribute('startO11yTrialBtn', 'href')).match( + /^https?\:\/\/.*\/projects\/create\/observability\/start/ ); expect(await testSubjects.getAttribute('startO11yTrialBtn', 'target')).equal('_blank'); }, diff --git a/x-pack/test_serverless/functional/page_objects/svl_search_index_detail_page.ts b/x-pack/test_serverless/functional/page_objects/svl_search_index_detail_page.ts index 656c75fb308bc..1b355138173d6 100644 --- a/x-pack/test_serverless/functional/page_objects/svl_search_index_detail_page.ts +++ b/x-pack/test_serverless/functional/page_objects/svl_search_index_detail_page.ts @@ -27,8 +27,8 @@ export function SvlSearchIndexDetailPageProvider({ getService }: FtrProviderCont }, async expectConnectionDetails() { await testSubjects.existOrFail('connectionDetailsEndpoint', { timeout: 2000 }); - expect(await (await testSubjects.find('connectionDetailsEndpoint')).getVisibleText()).to.be( - 'https://fakeprojectid.es.fake-domain.cld.elstc.co:443' + expect(await (await testSubjects.find('connectionDetailsEndpoint')).getVisibleText()).match( + /^https?\:\/\/.*(\:\d+)?/ ); }, async expectQuickStats() { diff --git a/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts b/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts index 7ff1505304761..129f769283b34 100644 --- a/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts +++ b/x-pack/test_serverless/functional/test_suites/search/elasticsearch_start.ts @@ -27,9 +27,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }; describe('Elasticsearch Start [Onboarding Empty State]', function () { - // fails on MKI, see https://github.com/elastic/kibana/issues/196981 - this.tags(['failsOnMKI']); - describe('developer', function () { before(async () => { await pageObjects.svlCommonPage.loginWithRole('developer'); diff --git a/x-pack/test_serverless/functional/test_suites/search/getting_started.ts b/x-pack/test_serverless/functional/test_suites/search/getting_started.ts index dac9b2d7dae94..4a2c34d98eebc 100644 --- a/x-pack/test_serverless/functional/test_suites/search/getting_started.ts +++ b/x-pack/test_serverless/functional/test_suites/search/getting_started.ts @@ -15,7 +15,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { describe('getting started', function () { before(async () => { - await pageObjects.svlCommonPage.loginAsAdmin(); + await pageObjects.svlCommonPage.loginWithRole('developer'); }); it('has serverless side nav', async () => { diff --git a/x-pack/test_serverless/functional/test_suites/search/navigation.ts b/x-pack/test_serverless/functional/test_suites/search/navigation.ts index 88f327d6f1ac2..a6da7b1467e9a 100644 --- a/x-pack/test_serverless/functional/test_suites/search/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/search/navigation.ts @@ -130,21 +130,6 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ deepLinkId: 'dashboards', }); - // check Other tools - // > Maps - await solutionNavigation.sidenav.clickLink({ - deepLinkId: 'maps', - }); - await solutionNavigation.sidenav.expectLinkActive({ - deepLinkId: 'maps', - }); - await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Other tools' }); - await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ - text: 'Maps', - }); - await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ - deepLinkId: 'maps', - }); // check Getting Started await solutionNavigation.sidenav.clickLink({ diff --git a/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts b/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts index e7831d1f91b3a..fae3abc3ad8d2 100644 --- a/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts +++ b/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts @@ -25,9 +25,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const indexName = 'test-my-index'; describe('Search index detail page', function () { - // fails on MKI, see https://github.com/elastic/kibana/issues/196981 - this.tags(['failsOnMKI']); - before(async () => { await pageObjects.svlCommonPage.loginWithRole('developer'); await pageObjects.svlApiKeys.deleteAPIKeys(); @@ -120,6 +117,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); await svlSearchNavigation.navigateToIndexDetailPage(indexName); }); + it('should have index documents', async () => { + await pageObjects.svlSearchIndexDetailPage.expectHasIndexDocuments(); + }); it('menu action item should be replaced with playground', async () => { await pageObjects.svlSearchIndexDetailPage.expectActionItemReplacedWhenHasDocs(); }); @@ -127,9 +127,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.svlSearchIndexDetailPage.clickMoreOptionsActionsButton(); await pageObjects.svlSearchIndexDetailPage.expectAPIReferenceDocLinkExistsInMoreOptions(); }); - it('should have index documents', async () => { - await pageObjects.svlSearchIndexDetailPage.expectHasIndexDocuments(); - }); it('should have one document in quick stats', async () => { await pageObjects.svlSearchIndexDetailPage.expectQuickStatsToHaveDocumentCount(1); }); From 3c3f748d8367774e364490753c37668eb2cd0672 Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 17:29:04 -0500 Subject: [PATCH 030/146] Update dependency @redocly/cli to ^1.25.6 (main) (#197146) Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index f2eb15a482ae2..500f587e1166d 100644 --- a/package.json +++ b/package.json @@ -1496,7 +1496,7 @@ "@octokit/rest": "^17.11.2", "@parcel/watcher": "^2.1.0", "@playwright/test": "=1.46.0", - "@redocly/cli": "^1.25.5", + "@redocly/cli": "^1.25.6", "@statoscope/webpack-plugin": "^5.28.2", "@storybook/addon-a11y": "^6.5.16", "@storybook/addon-actions": "^6.5.16", diff --git a/yarn.lock b/yarn.lock index 67d502560380f..92309a0bd0a34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8461,12 +8461,12 @@ require-from-string "^2.0.2" uri-js-replace "^1.0.1" -"@redocly/cli@^1.25.5": - version "1.25.5" - resolved "https://registry.yarnpkg.com/@redocly/cli/-/cli-1.25.5.tgz#258f6d23e8298814518ec4d24d023c1e21e3b081" - integrity sha512-sFh4A8wqwuig7mF/nYNVIyxSfKKZikWC+uVH6OB1IepYQXNsHFaLAU1VaNI9gS5mMvWmYx5SEuSCVB9LaNFBhw== +"@redocly/cli@^1.25.6": + version "1.25.8" + resolved "https://registry.yarnpkg.com/@redocly/cli/-/cli-1.25.8.tgz#fecd62d9ee1d564e6f0e1522f2c5648f514ce02b" + integrity sha512-oVFN3rpGFqupx57ZS0mF2B8grnk3i0xjTQrrMm1oftF3GEf7yTg5JzwnWi8KKRWuxin4qI7j+Id5AKgNQNmTKA== dependencies: - "@redocly/openapi-core" "1.25.5" + "@redocly/openapi-core" "1.25.8" abort-controller "^3.0.0" chokidar "^3.5.1" colorette "^1.2.0" @@ -8480,7 +8480,7 @@ pluralize "^8.0.0" react "^17.0.0 || ^18.2.0" react-dom "^17.0.0 || ^18.2.0" - redoc "~2.1.5" + redoc "~2.2.0" semver "^7.5.2" simple-websocket "^9.0.0" styled-components "^6.0.7" @@ -8491,10 +8491,10 @@ resolved "https://registry.yarnpkg.com/@redocly/config/-/config-0.12.1.tgz#7b905a17d710244550ef826542d0db164d5ace02" integrity sha512-RW3rSirfsPdr0uvATijRDU3f55SuZV3m7/ppdTDvGw4IB0cmeZRkFmqTrchxMqWP50Gfg1tpHnjdxUCNo0E2qg== -"@redocly/openapi-core@1.25.5", "@redocly/openapi-core@^1.4.0": - version "1.25.5" - resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.25.5.tgz#443b1488c8ef1ddcb8f407c3e7dd8cb7b388b427" - integrity sha512-BNgXjqesJu4L5f8F73c2hkkH5IdvjYCKYFgIl+m9oNgqGRIPBJjtiEGOx7jkQ6nElN4311z7Z4aTECtklaaHwg== +"@redocly/openapi-core@1.25.8", "@redocly/openapi-core@^1.4.0": + version "1.25.8" + resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.25.8.tgz#a3aff052b1d9d2db8ba86263ec994bbc85f6b8f1" + integrity sha512-eKKRqo2RYo7UIoDvIgcUB9ynhOjIWJnILXFz+VDevYeOBKd/CxvC0KbNRnuOrFqG3ip6363R/ONal2MyvuVrjg== dependencies: "@redocly/ajv" "^8.11.2" "@redocly/config" "^0.12.1" @@ -27328,10 +27328,10 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -redoc@~2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/redoc/-/redoc-2.1.5.tgz#421307b22036b244171095bfc7ea3cfd419563c8" - integrity sha512-POSbVg+7WLf+/5/c6GWLxL7+9t2D+1WlZdLN0a6qaCQc+ih3XYzteRBkXEN5kjrYrRNjdspfxTZkDLN5WV3Tzg== +redoc@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/redoc/-/redoc-2.2.0.tgz#1043812696683f23e4b0fbe66fb50236fbe8b5bb" + integrity sha512-52rz/xJtpUBc3Y/GAkaX03czKhQXTxoU7WnkXNzRLuGwiGb/iEO4OgwcgQqtwHWrYNaZXTyqZ4MAVXpi/e1gAg== dependencies: "@cfaester/enzyme-adapter-react-18" "^0.8.0" "@redocly/openapi-core" "^1.4.0" From f7f122c891f7a3678faa3883727bf85bff9adfb9 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 23 Oct 2024 09:51:05 +1100 Subject: [PATCH 031/146] skip failing test suite (#197342) --- test/functional/apps/discover/group3/_lens_vis.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/functional/apps/discover/group3/_lens_vis.ts b/test/functional/apps/discover/group3/_lens_vis.ts index 321486a40238e..db526fe978610 100644 --- a/test/functional/apps/discover/group3/_lens_vis.ts +++ b/test/functional/apps/discover/group3/_lens_vis.ts @@ -110,7 +110,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return seriesType; } - describe('discover lens vis', function () { + // Failing: See https://github.com/elastic/kibana/issues/197342 + describe.skip('discover lens vis', function () { before(async () => { await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); From bec3d23d65cc2af89d18f3fb662054a27c28c37d Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 23 Oct 2024 09:51:30 +1100 Subject: [PATCH 032/146] skip failing test suite (#181889) --- x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts index 6ea1acfebabce..f7585d32a2bba 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts @@ -18,6 +18,7 @@ import { import { closeModalIfVisible, closeToastIfVisible } from '../../tasks/integrations'; import { RESULTS_TABLE, RESULTS_TABLE_BUTTON } from '../../screens/live_query'; +// Failing: See https://github.com/elastic/kibana/issues/181889 // Failing: See https://github.com/elastic/kibana/issues/181889 describe.skip( 'Alert Event Details', From 800e39224eed1335519d00e62e423af241495be9 Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Tue, 22 Oct 2024 18:20:10 -0500 Subject: [PATCH 033/146] [Security Solution][Notes] - copy changes for note and timeline + move the unassociated note advanced setting under the Security Solution section (#197312) ## Summary This PR tackles 2 small tasks: - move the unassociated advanced settings introduced in [this PR](https://github.com/elastic/kibana/pull/194947) under the `Security Solution` category instead of `General` - make some copy changes on the notes functionality, mainly the following ([copy changes document](https://docs.google.com/document/d/10blyxRfkMIR8gk4cw6nFzajA-L63iUzQaxQXHauL8LM/edit#heading=h.mlyibn1i5q84)) - make sure we don't use a capital `N` for the word `note` - make sure that we use a capital `T` for the word `timeline` - change some of the no message and callout texts - prioritize using `attach` instead of `associate` All changes have been done with @nastasha-solomon. https://github.com/elastic/kibana/issues/193495 --- .../sections/investigations_translations.ts | 3 +- .../add_note_icon_item.test.tsx | 14 ++++----- .../header_actions/add_note_icon_item.tsx | 30 +++++++++++++++---- .../components/header_actions/translations.ts | 24 --------------- .../attach_to_active_timeline.test.tsx | 14 ++++----- .../components/attach_to_active_timeline.tsx | 12 ++++---- .../left/components/notes_details.tsx | 2 +- .../public/management/links.ts | 2 +- .../notes/components/open_flyout_button.tsx | 2 +- .../public/notes/components/search_row.tsx | 21 +++++++------ .../components/notes/save_timeline.test.tsx | 6 ++-- .../components/notes/save_timeline.tsx | 8 ++--- .../components/timeline/tabs/notes/index.tsx | 2 +- .../query_tab_unified_components.test.tsx | 4 +-- .../security_solution/server/ui_settings.ts | 1 + 15 files changed, 72 insertions(+), 73 deletions(-) diff --git a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/investigations_translations.ts b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/investigations_translations.ts index d70717783870a..931c3c20d4002 100644 --- a/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/investigations_translations.ts +++ b/x-pack/plugins/security_solution/public/app/solution_navigation/links/sections/investigations_translations.ts @@ -24,7 +24,8 @@ export const TIMELINE_DESCRIPTION = i18n.translate( export const NOTE_DESCRIPTION = i18n.translate( 'xpack.securitySolution.navLinks.investigations.note.title', { - defaultMessage: 'Oversee, revise and revisit the annotations within each document and timeline', + defaultMessage: + 'Oversee, revise, and revisit the notes attached to alerts, events and Timelines.', } ); diff --git a/x-pack/plugins/security_solution/public/common/components/header_actions/add_note_icon_item.test.tsx b/x-pack/plugins/security_solution/public/common/components/header_actions/add_note_icon_item.test.tsx index 98dfc83e9d3e8..b07aa7aedfcad 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_actions/add_note_icon_item.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_actions/add_note_icon_item.test.tsx @@ -37,7 +37,7 @@ const renderTestComponent = (props: Partial = { timelineType: TimelineTypeEnum.default, eventId: 'event-1', - ariaLabel: 'Add Note', + ariaLabel: 'Add note', toggleShowNotes: toggleShowNotesMock, notesCount: 2, ...props, @@ -76,12 +76,12 @@ describe('AddEventNoteAction', () => { expect(NotesButtonMock).toHaveBeenCalledWith( expect.objectContaining({ - ariaLabel: 'Add Note', + ariaLabel: 'Add note', 'data-test-subj': 'add-note', isDisabled: false, timelineType: TimelineTypeEnum.default, toggleShowNotes: expect.any(Function), - toolTip: '2 Notes available. Click to view them & add more.', + toolTip: '2 notes available. Click to view them and add more.', eventId: 'event-1', notesCount: 2, }), @@ -98,12 +98,12 @@ describe('AddEventNoteAction', () => { expect(NotesButtonMock).toHaveBeenCalledWith( expect.objectContaining({ - ariaLabel: 'Add Note', + ariaLabel: 'Add note', 'data-test-subj': 'add-note', isDisabled: false, timelineType: TimelineTypeEnum.default, toggleShowNotes: expect.any(Function), - toolTip: '1 Note available. Click to view it & add more.', + toolTip: '1 note available. Click to view it and add more.', eventId: 'event-2', notesCount: 1, }), @@ -120,12 +120,12 @@ describe('AddEventNoteAction', () => { expect(NotesButtonMock).toHaveBeenCalledWith( expect.objectContaining({ - ariaLabel: 'Add Note', + ariaLabel: 'Add note', 'data-test-subj': 'add-note', isDisabled: false, timelineType: TimelineTypeEnum.default, toggleShowNotes: expect.any(Function), - toolTip: 'Add Note', + toolTip: 'Add note', eventId: 'event-3', notesCount: 0, }), diff --git a/x-pack/plugins/security_solution/public/common/components/header_actions/add_note_icon_item.tsx b/x-pack/plugins/security_solution/public/common/components/header_actions/add_note_icon_item.tsx index f9539b9062331..f931042863a62 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_actions/add_note_icon_item.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_actions/add_note_icon_item.tsx @@ -6,12 +6,34 @@ */ import React, { useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; import { NotesButton } from '../../../timelines/components/timeline/properties/helpers'; import { type TimelineType, TimelineTypeEnum } from '../../../../common/api/timeline'; import { useUserPrivileges } from '../user_privileges'; -import * as i18n from './translations'; import { ActionIconItem } from './action_icon_item'; +const NOTES_DISABLE_TOOLTIP = i18n.translate( + 'xpack.securitySolution.timeline.body.notes.disableEventTooltip', + { + defaultMessage: 'Notes cannot be added here while editing a template Timeline.', + } +); +const NOTES_ADD_TOOLTIP = i18n.translate( + 'xpack.securitySolution.timeline.body.notes.addNoteTooltip', + { + defaultMessage: 'Add note', + } +); +const NOTES_COUNT_TOOLTIP = ({ notesCount }: { notesCount: number }) => + i18n.translate( + 'xpack.securitySolution.timeline.body.notes.addNote.multipleNotesAvailableTooltip', + { + values: { notesCount }, + defaultMessage: + '{notesCount} {notesCount, plural, one {note} other {notes} } available. Click to view {notesCount, plural, one {it} other {them}} and add more.', + } + ); + interface AddEventNoteActionProps { ariaLabel?: string; timelineType: TimelineType; @@ -33,7 +55,7 @@ const AddEventNoteActionComponent: React.FC = ({ const { kibanaSecuritySolutionsPrivileges } = useUserPrivileges(); const NOTES_TOOLTIP = useMemo( - () => (notesCount > 0 ? i18n.NOTES_COUNT_TOOLTIP({ notesCount }) : i18n.NOTES_ADD_TOOLTIP), + () => (notesCount > 0 ? NOTES_COUNT_TOOLTIP({ notesCount }) : NOTES_ADD_TOOLTIP), [notesCount] ); @@ -45,9 +67,7 @@ const AddEventNoteActionComponent: React.FC = ({ isDisabled={kibanaSecuritySolutionsPrivileges.crud === false} timelineType={timelineType} toggleShowNotes={toggleShowNotes} - toolTip={ - timelineType === TimelineTypeEnum.template ? i18n.NOTES_DISABLE_TOOLTIP : NOTES_TOOLTIP - } + toolTip={timelineType === TimelineTypeEnum.template ? NOTES_DISABLE_TOOLTIP : NOTES_TOOLTIP} eventId={eventId} notesCount={notesCount} /> diff --git a/x-pack/plugins/security_solution/public/common/components/header_actions/translations.ts b/x-pack/plugins/security_solution/public/common/components/header_actions/translations.ts index 10832ccfac1e5..03ff7503643c9 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_actions/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/header_actions/translations.ts @@ -14,30 +14,6 @@ export const OPEN_SESSION_VIEW = i18n.translate( } ); -export const NOTES_DISABLE_TOOLTIP = i18n.translate( - 'xpack.securitySolution.timeline.body.notes.disableEventTooltip', - { - defaultMessage: 'Notes may not be added here while editing a template timeline', - } -); - -export const NOTES_ADD_TOOLTIP = i18n.translate( - 'xpack.securitySolution.timeline.body.notes.addNoteTooltip', - { - defaultMessage: 'Add Note', - } -); - -export const NOTES_COUNT_TOOLTIP = ({ notesCount }: { notesCount: number }) => - i18n.translate( - 'xpack.securitySolution.timeline.body.notes.addNote.multipleNotesAvailableTooltip', - { - values: { notesCount }, - defaultMessage: - '{notesCount} {notesCount, plural, one {Note} other {Notes} } available. Click to view {notesCount, plural, one {it} other {them}} & add more.', - } - ); - export const SORT_FIELDS = i18n.translate('xpack.securitySolution.timeline.sortFieldsButton', { defaultMessage: 'Sort fields', }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.test.tsx index 610354f8af822..51f5641af0f9c 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.test.tsx @@ -50,13 +50,13 @@ describe('AttachToActiveTimeline', () => { expect(getByTestId(SAVE_TIMELINE_BUTTON_TEST_ID)).toBeInTheDocument(); expect(getByTestId(SAVE_TIMELINE_BUTTON_TEST_ID)).toHaveStyle('background-color: #FEC514'); - expect(getByTestId(SAVE_TIMELINE_BUTTON_TEST_ID)).toHaveTextContent('Save timeline'); + expect(getByTestId(SAVE_TIMELINE_BUTTON_TEST_ID)).toHaveTextContent('Save current Timeline'); expect(queryByTestId(ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID)).not.toBeInTheDocument(); expect(getByTestId(ATTACH_TO_TIMELINE_CALLOUT_TEST_ID)).toBeInTheDocument(); expect(getByTestId(ATTACH_TO_TIMELINE_CALLOUT_TEST_ID)).toHaveClass('euiCallOut--warning'); - expect(getByText('Attach to timeline')).toBeInTheDocument(); + expect(getByText('Attach to current Timeline')).toBeInTheDocument(); expect( - getByText('Before attaching a note to the timeline, you need to save the timeline first.') + getByText('You must save the current Timeline before attaching notes to it.') ).toBeInTheDocument(); }); @@ -76,7 +76,7 @@ describe('AttachToActiveTimeline', () => { }, }); - const { getByTestId, getByText, queryByTestId } = render( + const { getByTestId, getByText, getAllByText, queryByTestId } = render( { expect(getByTestId(ATTACH_TO_TIMELINE_CHECKBOX_TEST_ID)).toBeInTheDocument(); expect(getByTestId(ATTACH_TO_TIMELINE_CALLOUT_TEST_ID)).toBeInTheDocument(); expect(getByTestId(ATTACH_TO_TIMELINE_CALLOUT_TEST_ID)).toHaveClass('euiCallOut--primary'); - expect(getByText('Attach to timeline')).toBeInTheDocument(); - expect( - getByText('You can associate the newly created note to the active timeline.') - ).toBeInTheDocument(); + expect(getAllByText('Attach to current Timeline')).toHaveLength(2); + expect(getByText('Also attach this note to the current Timeline.')).toBeInTheDocument(); }); it('should call the callback when user click on the checkbox', () => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.tsx index 77b3404561275..c8cd360947881 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/attach_to_active_timeline.tsx @@ -26,31 +26,31 @@ const timelineCheckBoxId = 'xpack.securitySolution.flyout.notes.attachToTimeline export const ATTACH_TO_TIMELINE_CALLOUT_TITLE = i18n.translate( 'xpack.securitySolution.flyout.left.notes.attachToTimeline.calloutTitle', { - defaultMessage: 'Attach to timeline', + defaultMessage: 'Attach to current Timeline', } ); export const SAVED_TIMELINE_CALLOUT_CONTENT = i18n.translate( 'xpack.securitySolution.flyout.left.notes.attachToTimeline.calloutContent', { - defaultMessage: 'You can associate the newly created note to the active timeline.', + defaultMessage: 'Also attach this note to the current Timeline.', } ); export const UNSAVED_TIMELINE_CALLOUT_CONTENT = i18n.translate( 'xpack.securitySolution.flyout.left.notes.attachToTimeline.calloutContent', { - defaultMessage: 'Before attaching a note to the timeline, you need to save the timeline first.', + defaultMessage: 'You must save the current Timeline before attaching notes to it.', } ); export const ATTACH_TO_TIMELINE_CHECKBOX = i18n.translate( 'xpack.securitySolution.flyout.left.notes.attachToTimeline.checkboxLabel', { - defaultMessage: 'Attach to active timeline', + defaultMessage: 'Attach to current Timeline', } ); export const SAVE_TIMELINE_BUTTON = i18n.translate( - 'xpack.securitySolution.flyout.left.notes.savedTimelineButtonLabel', + 'xpack.securitySolution.flyout.left.notes.attachToTimeline.savedTimelineButtonLabel', { - defaultMessage: 'Save timeline', + defaultMessage: 'Save current Timeline', } ); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.tsx index 5aca7ca389d11..8877e1759c475 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/notes_details.tsx @@ -44,7 +44,7 @@ export const FETCH_NOTES_ERROR = i18n.translate( ); export const NO_NOTES = (isAlert: boolean) => i18n.translate('xpack.securitySolution.flyout.left.notes.noNotesLabel', { - defaultMessage: 'No notes have been created for this {value}', + defaultMessage: 'No notes have been created for this {value}.', values: { value: isAlert ? 'alert' : 'event' }, }); diff --git a/x-pack/plugins/security_solution/public/management/links.ts b/x-pack/plugins/security_solution/public/management/links.ts index c83a7360910fa..27b5b62eac6f8 100644 --- a/x-pack/plugins/security_solution/public/management/links.ts +++ b/x-pack/plugins/security_solution/public/management/links.ts @@ -223,7 +223,7 @@ export const links: LinkItem = { title: NOTES, description: i18n.translate('xpack.securitySolution.appLinks.notesDescription', { defaultMessage: - 'Oversee, revise and revisit the annotations within each document and timeline.', + 'Oversee, revise, and revisit the notes attached to alerts, events and Timelines.', }), landingIcon: 'filebeatApp', path: NOTES_PATH, diff --git a/x-pack/plugins/security_solution/public/notes/components/open_flyout_button.tsx b/x-pack/plugins/security_solution/public/notes/components/open_flyout_button.tsx index 34ae9405fdf86..85e9e24c6f26e 100644 --- a/x-pack/plugins/security_solution/public/notes/components/open_flyout_button.tsx +++ b/x-pack/plugins/security_solution/public/notes/components/open_flyout_button.tsx @@ -20,7 +20,7 @@ import { DocumentDetailsRightPanelKey } from '../../flyout/document_details/shar export const OPEN_FLYOUT_BUTTON = i18n.translate( 'xpack.securitySolution.notes.openFlyoutButtonLabel', { - defaultMessage: 'Expand event details', + defaultMessage: 'Expand alert/event details', } ); diff --git a/x-pack/plugins/security_solution/public/notes/components/search_row.tsx b/x-pack/plugins/security_solution/public/notes/components/search_row.tsx index f2f90b3ba7e0d..3c4093f913acf 100644 --- a/x-pack/plugins/security_solution/public/notes/components/search_row.tsx +++ b/x-pack/plugins/security_solution/public/notes/components/search_row.tsx @@ -21,8 +21,8 @@ import { ASSOCIATED_NOT_SELECT_TEST_ID, SEARCH_BAR_TEST_ID } from './test_ids'; import { userFilterAssociatedNotes, userSearchedNotes } from '..'; import { AssociatedFilter } from '../../../common/notes/constants'; -const FILTER_SELECT = i18n.translate('xpack.securitySolution.notes.management.filterSelect', { - defaultMessage: 'Select filter', +const ATTACH_FILTER = i18n.translate('xpack.securitySolution.notes.management.attachFilter', { + defaultMessage: 'Attached to', }); const searchBox = { @@ -31,11 +31,14 @@ const searchBox = { 'data-test-subj': SEARCH_BAR_TEST_ID, }; const associatedNoteSelectOptions: EuiSelectOption[] = [ - { value: AssociatedFilter.all, text: 'All' }, - { value: AssociatedFilter.documentOnly, text: 'Attached to document only' }, - { value: AssociatedFilter.savedObjectOnly, text: 'Attached to timeline only' }, - { value: AssociatedFilter.documentAndSavedObject, text: 'Attached to document and timeline' }, - { value: AssociatedFilter.orphan, text: 'Orphan' }, + { value: AssociatedFilter.all, text: 'Anything or nothing' }, + { value: AssociatedFilter.documentOnly, text: 'Alerts or events only' }, + { value: AssociatedFilter.savedObjectOnly, text: 'Timelines only' }, + { + value: AssociatedFilter.documentAndSavedObject, + text: 'Alerts or events and Timelines only', + }, + { value: AssociatedFilter.orphan, text: 'Nothing' }, ]; export const SearchRow = React.memo(() => { @@ -69,8 +72,8 @@ export const SearchRow = React.memo(() => { id={associatedSelectId} options={associatedNoteSelectOptions} onChange={onAssociatedNoteSelectChange} - prepend={FILTER_SELECT} - aria-label={FILTER_SELECT} + prepend={ATTACH_FILTER} + aria-label={ATTACH_FILTER} data-test-subj={ASSOCIATED_NOT_SELECT_TEST_ID} /> diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.test.tsx index 36a45e993674f..8a024aec79840 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.test.tsx @@ -42,11 +42,11 @@ describe('SaveTimelineCallout', () => { expect(getByTestId(SAVE_TIMELINE_BUTTON_TEST_ID)).toBeInTheDocument(); expect(getByTestId(SAVE_TIMELINE_BUTTON_TEST_ID)).toHaveStyle('background-color: #BD271E'); - expect(getByTestId(SAVE_TIMELINE_BUTTON_TEST_ID)).toHaveTextContent('Save timeline'); + expect(getByTestId(SAVE_TIMELINE_BUTTON_TEST_ID)).toHaveTextContent('Save Timeline'); expect(getByTestId(SAVE_TIMELINE_CALLOUT_TEST_ID)).toBeInTheDocument(); - expect(getAllByText('Save timeline')).toHaveLength(2); + expect(getAllByText('Save Timeline')).toHaveLength(2); expect( - getByText('You need to save your timeline before creating notes for it.') + getByText('You must save this Timeline before attaching notes to it.') ).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.tsx index 0c0a56f2699d3..12efd2db689b7 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/notes/save_timeline.tsx @@ -16,19 +16,19 @@ import { SaveTimelineButton } from '../modal/actions/save_timeline_button'; export const SAVE_TIMELINE_CALLOUT_TITLE = i18n.translate( 'xpack.securitySolution.timeline.notes.saveTimeline.calloutTitle', { - defaultMessage: 'Save timeline', + defaultMessage: 'Save Timeline', } ); export const SAVE_TIMELINE_CALLOUT_CONTENT = i18n.translate( 'xpack.securitySolution.timeline.notes.saveTimeline.calloutContent', { - defaultMessage: 'You need to save your timeline before creating notes for it.', + defaultMessage: 'You must save this Timeline before attaching notes to it.', } ); export const SAVE_TIMELINE_BUTTON = i18n.translate( - 'xpack.securitySolution.flyout.left.notes.savedTimelineButtonLabel', + 'xpack.securitySolution.flyout.left.notes.saveTimeline.buttonLabel', { - defaultMessage: 'Save timeline', + defaultMessage: 'Save Timeline', } ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/notes/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/notes/index.tsx index 737001125c990..aad74f15d4f62 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/notes/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/notes/index.tsx @@ -59,7 +59,7 @@ export const FETCH_NOTES_ERROR = i18n.translate( } ); export const NO_NOTES = i18n.translate('xpack.securitySolution.notes.noNotesLabel', { - defaultMessage: 'No notes have yet been created for this timeline', + defaultMessage: 'No notes have been created for this Timeline.', }); interface NotesTabContentProps { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/query_tab_unified_components.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/query_tab_unified_components.test.tsx index 9d450f46f4b01..107c166183647 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/query_tab_unified_components.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/query_tab_unified_components.test.tsx @@ -918,7 +918,7 @@ describe('query tab with unified timeline', () => { await waitFor(() => { expect(screen.getByTestId('timeline-notes-tool-tip')).toBeInTheDocument(); expect(screen.getByTestId('timeline-notes-tool-tip')).toHaveTextContent( - '1 Note available. Click to view it & add more.' + '1 note available. Click to view it and add more.' ); }); }, @@ -975,7 +975,7 @@ describe('query tab with unified timeline', () => { await waitFor(() => { expect(screen.getByTestId('timeline-notes-tool-tip')).toBeVisible(); expect(screen.getByTestId('timeline-notes-tool-tip')).toHaveTextContent( - '1 Note available. Click to view it & add more.' + '1 note available. Click to view it and add more.' ); }); }, diff --git a/x-pack/plugins/security_solution/server/ui_settings.ts b/x-pack/plugins/security_solution/server/ui_settings.ts index 842b8bbeceff8..6aeb86750be7a 100644 --- a/x-pack/plugins/security_solution/server/ui_settings.ts +++ b/x-pack/plugins/security_solution/server/ui_settings.ts @@ -343,6 +343,7 @@ export const initUiSettings = ( max: 1000, defaultValue: DEFAULT_MAX_UNASSOCIATED_NOTES, }), + category: [APP_ID], requiresPageReload: false, }, [EXCLUDED_DATA_TIERS_FOR_RULE_EXECUTION]: { From d8c3a6b274a9188f926480f2c1038bf6104a6bd9 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 23 Oct 2024 01:56:33 +0100 Subject: [PATCH 034/146] chore(NA): update versions after v7.17.26 bump (#197325) This PR is a simple update of our versions file after the recent bumps. --- versions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/versions.json b/versions.json index ff0e6d254f24e..ac2bcf4de9b8f 100644 --- a/versions.json +++ b/versions.json @@ -24,7 +24,7 @@ "previousMajor": true }, { - "version": "7.17.25", + "version": "7.17.26", "branch": "7.17" } ] From 0ca8627ab4b20974334fbe06177e3156d02d03f5 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 23 Oct 2024 03:04:11 +0100 Subject: [PATCH 035/146] chore(NA): added missing scheduled build for 8.16 on es-snapshots pipeline --- .../pipeline-resource-definitions/kibana-es-snapshots.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml b/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml index 7146363bcc552..5a2521bb23026 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml @@ -53,6 +53,10 @@ spec: cronline: 0 22 * * * America/New_York message: Daily build branch: '8.x' + Daily build (8.16): + cronline: 0 22 * * * America/New_York + message: Daily build + branch: '8.16' Daily build (8.15): cronline: 0 22 * * * America/New_York message: Daily build From 03fee89ab6ac8dac96bc6affd95241435ae70e0b Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 17 Oct 2024 01:56:17 +0100 Subject: [PATCH 036/146] skip flaky suite (#158318) --- .../group3/incompatible_cluster_routing_allocation.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts index ee6c499da7ce8..5493b8ef6ce6c 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts @@ -97,7 +97,8 @@ async function updateRoutingAllocations( }); } -describe('incompatible_cluster_routing_allocation', () => { +// FLAKY: https://github.com/elastic/kibana/issues/158318 +describe.skip('incompatible_cluster_routing_allocation', () => { let client: ElasticsearchClient; let root: Root; From c0f110e4b4ef4923fd13f0c1d13631caa5754680 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 23 Oct 2024 05:02:44 +0100 Subject: [PATCH 037/146] Revert "skip flaky suite (#158318)" This reverts commit 03fee89ab6ac8dac96bc6affd95241435ae70e0b. --- .../group3/incompatible_cluster_routing_allocation.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts index 5493b8ef6ce6c..ee6c499da7ce8 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts @@ -97,8 +97,7 @@ async function updateRoutingAllocations( }); } -// FLAKY: https://github.com/elastic/kibana/issues/158318 -describe.skip('incompatible_cluster_routing_allocation', () => { +describe('incompatible_cluster_routing_allocation', () => { let client: ElasticsearchClient; let root: Root; From 07ceed3e5c4c78e372b204cba590cc54030e9b5c Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 23 Oct 2024 05:17:27 +0100 Subject: [PATCH 038/146] skip flaky suite (#196724) --- .../management/hooks/artifacts/use_list_artifact.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_list_artifact.test.tsx b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_list_artifact.test.tsx index 8f6e5c4353206..52120153dd079 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_list_artifact.test.tsx +++ b/x-pack/plugins/security_solution/public/management/hooks/artifacts/use_list_artifact.test.tsx @@ -16,7 +16,8 @@ import { renderQuery, } from '../test_utils'; -describe('List artifact hook', () => { +// FLAKY: https://github.com/elastic/kibana/issues/196724 +describe.skip('List artifact hook', () => { let result: ReturnType; let searchableFields: string[]; let options: From 75a64065b538b7c61f83c6d5e00077c3ecf5dec0 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 23 Oct 2024 05:18:53 +0100 Subject: [PATCH 039/146] skip flaky suite (#197144) --- .../functional/test_suites/search/search_index_detail.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts b/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts index fae3abc3ad8d2..f6444bedc5bac 100644 --- a/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts +++ b/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts @@ -107,7 +107,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.embeddedConsole.clickEmbeddedConsoleControlBar(); }); - describe('With data', () => { + // FLAKY: https://github.com/elastic/kibana/issues/197144 + describe.skip('With data', () => { before(async () => { await es.index({ index: indexName, From 196cabad9bbd0511219fc7833a62cb8a0bb61514 Mon Sep 17 00:00:00 2001 From: Zacqary Adam Xeper Date: Wed, 23 Oct 2024 00:33:31 -0400 Subject: [PATCH 040/146] [ResponseOps][Rules] Remove unintended internal Find routes API with public access (#193757) ## Summary Fixes #192957 Removes the `internal/_find` route from public access by moving the hard-coded `options` into the route builder functions. --------- Co-authored-by: Elastic Machine --- .../plugins/alerting/server/routes/index.ts | 3 +- .../find/find_internal_rules_route.test.ts | 36 + .../apis/find/find_internal_rules_route.ts | 87 ++ .../rule/apis/find/find_rules_route.test.ts | 12 + .../routes/rule/apis/find/find_rules_route.ts | 116 +-- .../rule_management/api/api.test.ts | 17 +- .../rule_management/api/api.ts | 6 +- .../use_fetch_rules_snooze_settings_query.ts | 2 +- .../group1/tests/alerting/find.ts | 230 ++---- .../group1/tests/alerting/find_internal.ts | 762 ++++++++++++++++++ .../group1/tests/alerting/find_with_post.ts | 14 +- .../group1/tests/alerting/index.ts | 1 + .../tests/alerting/group1/create.ts | 13 +- .../spaces_only/tests/alerting/group1/find.ts | 160 ++-- .../tests/alerting/group1/find_internal.ts | 355 ++++++++ .../tests/alerting/group2/update.ts | 9 +- .../pages/alerts/custom_threshold.ts | 5 +- .../apps/observability/pages/rules_page.ts | 7 +- .../rule_actions/snoozing/rule_snoozing.cy.ts | 2 +- 19 files changed, 1450 insertions(+), 387 deletions(-) create mode 100644 x-pack/plugins/alerting/server/routes/rule/apis/find/find_internal_rules_route.test.ts create mode 100644 x-pack/plugins/alerting/server/routes/rule/apis/find/find_internal_rules_route.ts create mode 100644 x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find_internal.ts create mode 100644 x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/find_internal.ts diff --git a/x-pack/plugins/alerting/server/routes/index.ts b/x-pack/plugins/alerting/server/routes/index.ts index 97fdf8c90f8d6..1a274692cefe4 100644 --- a/x-pack/plugins/alerting/server/routes/index.ts +++ b/x-pack/plugins/alerting/server/routes/index.ts @@ -20,7 +20,8 @@ import { deleteRuleRoute } from './rule/apis/delete/delete_rule_route'; import { aggregateRulesRoute } from './rule/apis/aggregate/aggregate_rules_route'; import { disableRuleRoute } from './rule/apis/disable/disable_rule_route'; import { enableRuleRoute } from './rule/apis/enable/enable_rule_route'; -import { findRulesRoute, findInternalRulesRoute } from './rule/apis/find/find_rules_route'; +import { findRulesRoute } from './rule/apis/find/find_rules_route'; +import { findInternalRulesRoute } from './rule/apis/find/find_internal_rules_route'; import { getRuleAlertSummaryRoute } from './get_rule_alert_summary'; import { getRuleExecutionLogRoute } from './get_rule_execution_log'; import { getGlobalExecutionLogRoute } from './get_global_execution_logs'; diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/find/find_internal_rules_route.test.ts b/x-pack/plugins/alerting/server/routes/rule/apis/find/find_internal_rules_route.test.ts new file mode 100644 index 0000000000000..46ff2e8e96e12 --- /dev/null +++ b/x-pack/plugins/alerting/server/routes/rule/apis/find/find_internal_rules_route.test.ts @@ -0,0 +1,36 @@ +/* + * 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 { httpServiceMock } from '@kbn/core/server/mocks'; +import { licenseStateMock } from '../../../../lib/license_state.mock'; +import { findInternalRulesRoute } from './find_internal_rules_route'; + +jest.mock('../../../../lib/license_api_access', () => ({ + verifyApiAccess: jest.fn(), +})); + +jest.mock('../../../lib/track_legacy_terminology', () => ({ + trackLegacyTerminology: jest.fn(), +})); + +beforeEach(() => { + jest.resetAllMocks(); +}); + +describe('findInternalRulesRoute', () => { + it('registers the route without public access', async () => { + const licenseState = licenseStateMock.create(); + const router = httpServiceMock.createRouter(); + + findInternalRulesRoute(router, licenseState); + expect(router.post).toHaveBeenCalledWith( + expect.not.objectContaining({ + options: expect.objectContaining({ access: 'public' }), + }), + expect.any(Function) + ); + }); +}); diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/find/find_internal_rules_route.ts b/x-pack/plugins/alerting/server/routes/rule/apis/find/find_internal_rules_route.ts new file mode 100644 index 0000000000000..8ff8ce59192cf --- /dev/null +++ b/x-pack/plugins/alerting/server/routes/rule/apis/find/find_internal_rules_route.ts @@ -0,0 +1,87 @@ +/* + * 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 { IRouter } from '@kbn/core/server'; +import { UsageCounter } from '@kbn/usage-collection-plugin/server'; +import type { + FindRulesRequestQueryV1, + FindRulesResponseV1, +} from '../../../../../common/routes/rule/apis/find'; +import { findRulesRequestQuerySchemaV1 } from '../../../../../common/routes/rule/apis/find'; +import { RuleParamsV1 } from '../../../../../common/routes/rule/response'; +import { ILicenseState } from '../../../../lib'; +import { + AlertingRequestHandlerContext, + INTERNAL_ALERTING_API_FIND_RULES_PATH, +} from '../../../../types'; +import { verifyAccessAndContext } from '../../../lib'; +import { trackLegacyTerminology } from '../../../lib/track_legacy_terminology'; +import { transformFindRulesBodyV1, transformFindRulesResponseV1 } from './transforms'; + +export const findInternalRulesRoute = ( + router: IRouter, + licenseState: ILicenseState, + usageCounter?: UsageCounter +) => { + router.post( + { + path: INTERNAL_ALERTING_API_FIND_RULES_PATH, + options: { access: 'internal' }, + validate: { + body: findRulesRequestQuerySchemaV1, + }, + }, + router.handleLegacyErrors( + verifyAccessAndContext(licenseState, async function (context, req, res) { + const rulesClient = (await context.alerting).getRulesClient(); + + const body: FindRulesRequestQueryV1 = req.body; + + trackLegacyTerminology( + [req.body.search, req.body.search_fields, req.body.sort_field].filter( + Boolean + ) as string[], + usageCounter + ); + + const options = transformFindRulesBodyV1({ + ...body, + has_reference: body.has_reference || undefined, + search_fields: searchFieldsAsArray(body.search_fields), + }); + + if (req.body.fields) { + usageCounter?.incrementCounter({ + counterName: `alertingFieldsUsage`, + counterType: 'alertingFieldsUsage', + incrementBy: 1, + }); + } + + const findResult = await rulesClient.find({ + options, + excludeFromPublicApi: false, + includeSnoozeData: true, + }); + + const responseBody: FindRulesResponseV1['body'] = + transformFindRulesResponseV1(findResult, options.fields); + + return res.ok({ + body: responseBody, + }); + }) + ) + ); +}; + +function searchFieldsAsArray(searchFields: string | string[] | undefined): string[] | undefined { + if (!searchFields) { + return; + } + return Array.isArray(searchFields) ? searchFields : [searchFields]; +} diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/find/find_rules_route.test.ts b/x-pack/plugins/alerting/server/routes/rule/apis/find/find_rules_route.test.ts index 4e3c9b635ec3a..0e1f07a5ce543 100644 --- a/x-pack/plugins/alerting/server/routes/rule/apis/find/find_rules_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/rule/apis/find/find_rules_route.test.ts @@ -30,6 +30,18 @@ beforeEach(() => { }); describe('findRulesRoute', () => { + it('registers the route with public access', async () => { + const licenseState = licenseStateMock.create(); + const router = httpServiceMock.createRouter(); + + findRulesRoute(router, licenseState); + expect(router.get).toHaveBeenCalledWith( + expect.objectContaining({ + options: expect.objectContaining({ access: 'public' }), + }), + expect.any(Function) + ); + }); it('finds rules with proper parameters', async () => { const licenseState = licenseStateMock.create(); const router = httpServiceMock.createRouter(); diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/find/find_rules_route.ts b/x-pack/plugins/alerting/server/routes/rule/apis/find/find_rules_route.ts index b4384e9d8f4ef..90afde8f20813 100644 --- a/x-pack/plugins/alerting/server/routes/rule/apis/find/find_rules_route.ts +++ b/x-pack/plugins/alerting/server/routes/rule/apis/find/find_rules_route.ts @@ -7,40 +7,26 @@ import { IRouter } from '@kbn/core/server'; import { UsageCounter } from '@kbn/usage-collection-plugin/server'; -import { ILicenseState } from '../../../../lib'; -import { verifyAccessAndContext } from '../../../lib'; -import { findRulesRequestQuerySchemaV1 } from '../../../../../common/routes/rule/apis/find'; import type { FindRulesRequestQueryV1, FindRulesResponseV1, } from '../../../../../common/routes/rule/apis/find'; +import { findRulesRequestQuerySchemaV1 } from '../../../../../common/routes/rule/apis/find'; import { RuleParamsV1, ruleResponseSchemaV1 } from '../../../../../common/routes/rule/response'; -import { - AlertingRequestHandlerContext, - BASE_ALERTING_API_PATH, - INTERNAL_ALERTING_API_FIND_RULES_PATH, -} from '../../../../types'; +import { ILicenseState } from '../../../../lib'; +import { AlertingRequestHandlerContext, BASE_ALERTING_API_PATH } from '../../../../types'; +import { verifyAccessAndContext } from '../../../lib'; import { trackLegacyTerminology } from '../../../lib/track_legacy_terminology'; import { transformFindRulesBodyV1, transformFindRulesResponseV1 } from './transforms'; -interface BuildFindRulesRouteParams { - licenseState: ILicenseState; - path: string; - router: IRouter; - excludeFromPublicApi?: boolean; - usageCounter?: UsageCounter; -} - -const buildFindRulesRoute = ({ - licenseState, - path, - router, - excludeFromPublicApi = false, - usageCounter, -}: BuildFindRulesRouteParams) => { +export const findRulesRoute = ( + router: IRouter, + licenseState: ILicenseState, + usageCounter?: UsageCounter +) => { router.get( { - path, + path: `${BASE_ALERTING_API_PATH}/rules/_find`, options: { access: 'public', summary: 'Get information about rules', @@ -91,7 +77,7 @@ const buildFindRulesRoute = ({ const findResult = await rulesClient.find({ options, - excludeFromPublicApi, + excludeFromPublicApi: true, includeSnoozeData: true, }); @@ -104,86 +90,6 @@ const buildFindRulesRoute = ({ }) ) ); - if (path === INTERNAL_ALERTING_API_FIND_RULES_PATH) { - router.post( - { - path, - options: { access: 'internal' }, - validate: { - body: findRulesRequestQuerySchemaV1, - }, - }, - router.handleLegacyErrors( - verifyAccessAndContext(licenseState, async function (context, req, res) { - const rulesClient = (await context.alerting).getRulesClient(); - - const body: FindRulesRequestQueryV1 = req.body; - - trackLegacyTerminology( - [req.body.search, req.body.search_fields, req.body.sort_field].filter( - Boolean - ) as string[], - usageCounter - ); - - const options = transformFindRulesBodyV1({ - ...body, - has_reference: body.has_reference || undefined, - search_fields: searchFieldsAsArray(body.search_fields), - }); - - if (req.body.fields) { - usageCounter?.incrementCounter({ - counterName: `alertingFieldsUsage`, - counterType: 'alertingFieldsUsage', - incrementBy: 1, - }); - } - - const findResult = await rulesClient.find({ - options, - excludeFromPublicApi, - includeSnoozeData: true, - }); - - const responseBody: FindRulesResponseV1['body'] = - transformFindRulesResponseV1(findResult, options.fields); - - return res.ok({ - body: responseBody, - }); - }) - ) - ); - } -}; - -export const findRulesRoute = ( - router: IRouter, - licenseState: ILicenseState, - usageCounter?: UsageCounter -) => { - buildFindRulesRoute({ - excludeFromPublicApi: true, - licenseState, - path: `${BASE_ALERTING_API_PATH}/rules/_find`, - router, - usageCounter, - }); -}; - -export const findInternalRulesRoute = ( - router: IRouter, - licenseState: ILicenseState, - usageCounter?: UsageCounter -) => { - buildFindRulesRoute({ - excludeFromPublicApi: false, - licenseState, - path: INTERNAL_ALERTING_API_FIND_RULES_PATH, - router, - usageCounter, - }); }; function searchFieldsAsArray(searchFields: string | string[] | undefined): string[] | undefined { diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/api.test.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/api.test.ts index d10bb4bb03e08..bc7c288906e8e 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/api.test.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/api.test.ts @@ -854,9 +854,7 @@ describe('Detections Rules API', () => { expect(fetchMock).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ - query: expect.objectContaining({ - filter: 'alert.id:"alert:id1" or alert.id:"alert:id2"', - }), + body: '{"filter":"alert.id:\\"alert:id1\\" or alert.id:\\"alert:id2\\"","fields":"[\\"muteAll\\",\\"activeSnoozes\\",\\"isSnoozedUntil\\",\\"snoozeSchedule\\"]","per_page":2}', }) ); }); @@ -867,9 +865,7 @@ describe('Detections Rules API', () => { expect(fetchMock).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ - query: expect.objectContaining({ - per_page: 2, - }), + body: '{"filter":"alert.id:\\"alert:id1\\" or alert.id:\\"alert:id2\\"","fields":"[\\"muteAll\\",\\"activeSnoozes\\",\\"isSnoozedUntil\\",\\"snoozeSchedule\\"]","per_page":2}', }) ); }); @@ -880,14 +876,7 @@ describe('Detections Rules API', () => { expect(fetchMock).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ - query: expect.objectContaining({ - fields: JSON.stringify([ - 'muteAll', - 'activeSnoozes', - 'isSnoozedUntil', - 'snoozeSchedule', - ]), - }), + body: '{"filter":"alert.id:\\"alert:id1\\" or alert.id:\\"alert:id2\\"","fields":"[\\"muteAll\\",\\"activeSnoozes\\",\\"isSnoozedUntil\\",\\"snoozeSchedule\\"]","per_page":2}', }) ); }); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/api.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/api.ts index c86606d0d8137..1e2ee1be7a47a 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/api.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/api.ts @@ -241,12 +241,12 @@ export const fetchRulesSnoozeSettings = async ({ const response = await KibanaServices.get().http.fetch( INTERNAL_ALERTING_API_FIND_RULES_PATH, { - method: 'GET', - query: { + method: 'POST', + body: JSON.stringify({ filter: ids.map((x) => `alert.id:"alert:${x}"`).join(' or '), fields: JSON.stringify(['muteAll', 'activeSnoozes', 'isSnoozedUntil', 'snoozeSchedule']), per_page: ids.length, - }, + }), signal, } ); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/hooks/use_fetch_rules_snooze_settings_query.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/hooks/use_fetch_rules_snooze_settings_query.ts index 8d2ca14d79f9b..a0eedb35d4fa1 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/hooks/use_fetch_rules_snooze_settings_query.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/api/hooks/use_fetch_rules_snooze_settings_query.ts @@ -13,7 +13,7 @@ import type { RulesSnoozeSettingsMap } from '../../logic'; import { fetchRulesSnoozeSettings } from '../api'; import { DEFAULT_QUERY_OPTIONS } from './constants'; -const FETCH_RULE_SNOOZE_SETTINGS_QUERY_KEY = ['GET', INTERNAL_ALERTING_API_FIND_RULES_PATH]; +const FETCH_RULE_SNOOZE_SETTINGS_QUERY_KEY = ['POST', INTERNAL_ALERTING_API_FIND_RULES_PATH]; /** * A wrapper around useQuery provides default values to the underlying query, diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find.ts index 37d42ceeccb3a..bf5595e5756c1 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find.ts @@ -6,10 +6,8 @@ */ import expect from '@kbn/expect'; -import { Agent as SuperTestAgent } from 'supertest'; import { chunk, omit } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; -import { SupertestWithoutAuthProviderType } from '@kbn/ftr-common-functional-services'; import { ES_QUERY_ID, ML_ANOMALY_DETECTION_RULE_TYPE_ID, @@ -19,13 +17,14 @@ import { SuperuserAtSpace1, UserAtSpaceScenarios, StackAlertsOnly } from '../../ import { getUrlPrefix, getTestRuleData, ObjectRemover } from '../../../../common/lib'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; -const findTestUtils = ( - describeType: 'internal' | 'public', - objectRemover: ObjectRemover, - supertest: SuperTestAgent, - supertestWithoutAuth: SupertestWithoutAuthProviderType -) => { - describe(describeType, () => { +// eslint-disable-next-line import/no-default-export +export default function createFindTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + + describe('find public API', () => { + const objectRemover = new ObjectRemover(supertest); + afterEach(async () => { await objectRemover.removeAll(); }); @@ -71,9 +70,9 @@ const findTestUtils = ( const response = await supertestWithoutAuth .get( - `${getUrlPrefix(space.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?search=test.noop&search_fields=alertTypeId` + `${getUrlPrefix( + space.id + )}/api/alerting/rules/_find?search=test.noop&search_fields=alertTypeId` ) .auth(user.username, user.password); @@ -97,8 +96,6 @@ const findTestUtils = ( expect(response.body.per_page).to.be.greaterThan(0); expect(response.body.total).to.be.greaterThan(0); const match = response.body.data.find((obj: any) => obj.id === createdAlert.id); - const activeSnoozes = match.active_snoozes; - const hasActiveSnoozes = !!(activeSnoozes || []).filter((obj: any) => obj).length; expect(match).to.eql({ id: createdAlert.id, name: 'abc', @@ -138,14 +135,6 @@ const findTestUtils = ( execution_status: match.execution_status, ...(match.next_run ? { next_run: match.next_run } : {}), ...(match.last_run ? { last_run: match.last_run } : {}), - ...(describeType === 'internal' - ? { - monitoring: match.monitoring, - snooze_schedule: match.snooze_schedule, - ...(hasActiveSnoozes && { active_snoozes: activeSnoozes }), - is_snoozed_until: null, - } - : {}), }); expect(Date.parse(match.created_at)).to.be.greaterThan(0); expect(Date.parse(match.updated_at)).to.be.greaterThan(0); @@ -195,9 +184,9 @@ const findTestUtils = ( const response = await supertestWithoutAuth .get( - `${getUrlPrefix(space.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?per_page=${perPage}&sort_field=createdAt` + `${getUrlPrefix( + space.id + )}/api/alerting/rules/_find?per_page=${perPage}&sort_field=createdAt` ) .auth(user.username, user.password); @@ -244,9 +233,9 @@ const findTestUtils = ( const secondResponse = await supertestWithoutAuth .get( - `${getUrlPrefix(space.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?per_page=${perPage}&sort_field=createdAt&page=2` + `${getUrlPrefix( + space.id + )}/api/alerting/rules/_find?per_page=${perPage}&sort_field=createdAt&page=2` ) .auth(user.username, user.password); @@ -291,9 +280,9 @@ const findTestUtils = ( const response = await supertestWithoutAuth .get( - `${getUrlPrefix(space.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?filter=alert.attributes.actions:{ actionTypeId: test.noop }` + `${getUrlPrefix( + space.id + )}/api/alerting/rules/_find?filter=alert.attributes.actions:{ actionTypeId: test.noop }` ) .auth(user.username, user.password); @@ -317,8 +306,6 @@ const findTestUtils = ( expect(response.body.per_page).to.be.greaterThan(0); expect(response.body.total).to.be.greaterThan(0); const match = response.body.data.find((obj: any) => obj.id === createdAlert.id); - const activeSnoozes = match.active_snoozes; - const hasActiveSnoozes = !!(activeSnoozes || []).filter((obj: any) => obj).length; expect(match).to.eql({ id: createdAlert.id, name: 'abc', @@ -352,14 +339,6 @@ const findTestUtils = ( revision: 0, ...(match.next_run ? { next_run: match.next_run } : {}), ...(match.last_run ? { last_run: match.last_run } : {}), - ...(describeType === 'internal' - ? { - monitoring: match.monitoring, - snooze_schedule: match.snooze_schedule, - ...(hasActiveSnoozes && { active_snoozes: activeSnoozes }), - is_snoozed_until: null, - } - : {}), }); expect(Date.parse(match.created_at)).to.be.greaterThan(0); expect(Date.parse(match.updated_at)).to.be.greaterThan(0); @@ -401,9 +380,9 @@ const findTestUtils = ( const response = await supertestWithoutAuth .get( - `${getUrlPrefix(space.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?filter=alert.attributes.alertTypeId:test.restricted-noop&fields=["tags"]&sort_field=createdAt` + `${getUrlPrefix( + space.id + )}/api/alerting/rules/_find?filter=alert.attributes.alertTypeId:test.restricted-noop&fields=["tags"]&sort_field=createdAt` ) .auth(user.username, user.password); @@ -434,19 +413,11 @@ const findTestUtils = ( id: createdAlert.id, actions: [], tags: [myTag], - ...(describeType === 'internal' && { - snooze_schedule: [], - is_snoozed_until: null, - }), }); expect(omit(matchSecond, 'updatedAt')).to.eql({ id: createdSecondAlert.id, actions: [], tags: [myTag], - ...(describeType === 'internal' && { - snooze_schedule: [], - is_snoozed_until: null, - }), }); break; default: @@ -486,9 +457,9 @@ const findTestUtils = ( const response = await supertestWithoutAuth .get( - `${getUrlPrefix(space.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?filter=alert.attributes.alertTypeId:test.restricted-noop&fields=["tags","executionStatus"]&sort_field=createdAt` + `${getUrlPrefix( + space.id + )}/api/alerting/rules/_find?filter=alert.attributes.alertTypeId:test.restricted-noop&fields=["tags","executionStatus"]&sort_field=createdAt` ) .auth(user.username, user.password); @@ -520,20 +491,12 @@ const findTestUtils = ( actions: [], tags: [myTag], execution_status: matchFirst.execution_status, - ...(describeType === 'internal' && { - snooze_schedule: [], - is_snoozed_until: null, - }), }); expect(omit(matchSecond, 'updatedAt')).to.eql({ id: createdSecondAlert.id, actions: [], tags: [myTag], execution_status: matchSecond.execution_status, - ...(describeType === 'internal' && { - snooze_schedule: [], - is_snoozed_until: null, - }), }); break; default: @@ -551,9 +514,9 @@ const findTestUtils = ( const response = await supertestWithoutAuth .get( - `${getUrlPrefix('other')}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?search=test.noop&search_fields=alertTypeId` + `${getUrlPrefix( + 'other' + )}/api/alerting/rules/_find?search=test.noop&search_fields=alertTypeId` ) .auth(user.username, user.password); @@ -586,88 +549,71 @@ const findTestUtils = ( }); }); } - }); - describe('Actions', () => { - const { user, space } = SuperuserAtSpace1; - - it('should return the actions correctly', async () => { - const { body: createdAction } = await supertest - .post(`${getUrlPrefix(space.id)}/api/actions/connector`) - .set('kbn-xsrf', 'foo') - .send({ - name: 'MY action', - connector_type_id: 'test.noop', - config: {}, - secrets: {}, - }) - .expect(200); - - const { body: createdRule1 } = await supertest - .post(`${getUrlPrefix(space.id)}/api/alerting/rule`) - .set('kbn-xsrf', 'foo') - .send( - getTestRuleData({ - enabled: true, - actions: [ - { - id: createdAction.id, - group: 'default', - params: {}, - }, - { - id: 'system-connector-test.system-action', - params: {}, - }, - ], + describe('Actions', () => { + const { user, space } = SuperuserAtSpace1; + + it('should return the actions correctly', async () => { + const { body: createdAction } = await supertest + .post(`${getUrlPrefix(space.id)}/api/actions/connector`) + .set('kbn-xsrf', 'foo') + .send({ + name: 'MY action', + connector_type_id: 'test.noop', + config: {}, + secrets: {}, }) - ) - .expect(200); - - objectRemover.add(space.id, createdRule1.id, 'rule', 'alerting'); - - const response = await supertestWithoutAuth - .get(`${getUrlPrefix(space.id)}/api/alerting/rules/_find`) - .set('kbn-xsrf', 'foo') - .auth(user.username, user.password); - - const action = response.body.data[0].actions[0]; - const systemAction = response.body.data[0].actions[1]; - const { uuid, ...restAction } = action; - const { uuid: systemActionUuid, ...restSystemAction } = systemAction; - - expect([restAction, restSystemAction]).to.eql([ - { - id: createdAction.id, - connector_type_id: 'test.noop', - group: 'default', - params: {}, - }, - { - id: 'system-connector-test.system-action', - connector_type_id: 'test.system-action', - params: {}, - }, - , - ]); - }); - }); -}; + .expect(200); -// eslint-disable-next-line import/no-default-export -export default function createFindTests({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); - const supertestWithoutAuth = getService('supertestWithoutAuth'); + const { body: createdRule1 } = await supertest + .post(`${getUrlPrefix(space.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + enabled: true, + actions: [ + { + id: createdAction.id, + group: 'default', + params: {}, + }, + { + id: 'system-connector-test.system-action', + params: {}, + }, + ], + }) + ) + .expect(200); - describe('find', () => { - const objectRemover = new ObjectRemover(supertest); + objectRemover.add(space.id, createdRule1.id, 'rule', 'alerting'); - afterEach(async () => { - await objectRemover.removeAll(); - }); + const response = await supertestWithoutAuth + .get(`${getUrlPrefix(space.id)}/api/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .auth(user.username, user.password); + + const action = response.body.data[0].actions[0]; + const systemAction = response.body.data[0].actions[1]; + const { uuid, ...restAction } = action; + const { uuid: systemActionUuid, ...restSystemAction } = systemAction; - findTestUtils('public', objectRemover, supertest, supertestWithoutAuth); - findTestUtils('internal', objectRemover, supertest, supertestWithoutAuth); + expect([restAction, restSystemAction]).to.eql([ + { + id: createdAction.id, + connector_type_id: 'test.noop', + group: 'default', + params: {}, + }, + { + id: 'system-connector-test.system-action', + connector_type_id: 'test.system-action', + params: {}, + }, + , + ]); + }); + }); describe('stack alerts', () => { const ruleTypes = [ diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find_internal.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find_internal.ts new file mode 100644 index 0000000000000..ee8d49c662ada --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find_internal.ts @@ -0,0 +1,762 @@ +/* + * 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 expect from '@kbn/expect'; +import { chunk, omit } from 'lodash'; +import { v4 as uuidv4 } from 'uuid'; +import { + ES_QUERY_ID, + ML_ANOMALY_DETECTION_RULE_TYPE_ID, + OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, +} from '@kbn/rule-data-utils'; +import { SuperuserAtSpace1, UserAtSpaceScenarios, StackAlertsOnly } from '../../../scenarios'; +import { getUrlPrefix, getTestRuleData, ObjectRemover } from '../../../../common/lib'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function createFindTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + + describe('find internal API', () => { + const objectRemover = new ObjectRemover(supertest); + + afterEach(async () => { + await objectRemover.removeAll(); + }); + + for (const scenario of UserAtSpaceScenarios) { + const { user, space } = scenario; + describe(scenario.id, () => { + it('should handle find alert request appropriately', async () => { + const { body: createdAction } = await supertest + .post(`${getUrlPrefix(space.id)}/api/actions/connector`) + .set('kbn-xsrf', 'foo') + .send({ + name: 'MY action', + connector_type_id: 'test.noop', + config: {}, + secrets: {}, + }) + .expect(200); + + const { body: createdAlert } = await supertest + .post(`${getUrlPrefix(space.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + actions: [ + { + group: 'default', + id: createdAction.id, + params: {}, + frequency: { + summary: false, + notify_when: 'onThrottleInterval', + throttle: '1m', + }, + }, + ], + notify_when: undefined, + throttle: undefined, + }) + ) + .expect(200); + objectRemover.add(space.id, createdAlert.id, 'rule', 'alerting'); + + const response = await supertestWithoutAuth + .post(`${getUrlPrefix(space.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .auth(user.username, user.password) + .send({ + search: 'test.noop', + search_fields: 'alertTypeId', + }); + + switch (scenario.id) { + case 'no_kibana_privileges at space1': + case 'space_1_all at space2': + expect(response.statusCode).to.eql(403); + expect(response.body).to.eql({ + error: 'Forbidden', + message: `Unauthorized to find rules for any rule types`, + statusCode: 403, + }); + break; + case 'global_read at space1': + case 'superuser at space1': + case 'space_1_all at space1': + case 'space_1_all_alerts_none_actions at space1': + case 'space_1_all_with_restricted_fixture at space1': + expect(response.statusCode).to.eql(200); + expect(response.body.page).to.equal(1); + expect(response.body.per_page).to.be.greaterThan(0); + expect(response.body.total).to.be.greaterThan(0); + const match = response.body.data.find((obj: any) => obj.id === createdAlert.id); + const activeSnoozes = match.active_snoozes; + const hasActiveSnoozes = !!(activeSnoozes || []).filter((obj: any) => obj).length; + expect(match).to.eql({ + id: createdAlert.id, + name: 'abc', + tags: ['foo'], + rule_type_id: 'test.noop', + running: match.running ?? false, + consumer: 'alertsFixture', + schedule: { interval: '1m' }, + enabled: true, + actions: [ + { + group: 'default', + id: createdAction.id, + connector_type_id: 'test.noop', + params: {}, + uuid: match.actions[0].uuid, + frequency: { + summary: false, + notify_when: 'onThrottleInterval', + throttle: '1m', + }, + }, + ], + params: {}, + created_by: 'elastic', + scheduled_task_id: match.scheduled_task_id, + created_at: match.created_at, + updated_at: match.updated_at, + throttle: null, + notify_when: null, + updated_by: 'elastic', + api_key_owner: 'elastic', + api_key_created_by_user: false, + mute_all: false, + muted_alert_ids: [], + revision: 0, + execution_status: match.execution_status, + ...(match.next_run ? { next_run: match.next_run } : {}), + ...(match.last_run ? { last_run: match.last_run } : {}), + + monitoring: match.monitoring, + snooze_schedule: match.snooze_schedule, + ...(hasActiveSnoozes && { active_snoozes: activeSnoozes }), + is_snoozed_until: null, + }); + expect(Date.parse(match.created_at)).to.be.greaterThan(0); + expect(Date.parse(match.updated_at)).to.be.greaterThan(0); + break; + default: + throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); + } + }); + + it('should filter out types that the user is not authorized to `get` retaining pagination', async () => { + async function createNoOpAlert(overrides = {}) { + const alert = getTestRuleData(overrides); + const { body: createdAlert } = await supertest + .post(`${getUrlPrefix(space.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(alert) + .expect(200); + objectRemover.add(space.id, createdAlert.id, 'rule', 'alerting'); + return { + id: createdAlert.id, + rule_type_id: alert.rule_type_id, + }; + } + function createRestrictedNoOpAlert() { + return createNoOpAlert({ + rule_type_id: 'test.restricted-noop', + consumer: 'alertsRestrictedFixture', + }); + } + function createUnrestrictedNoOpAlert() { + return createNoOpAlert({ + rule_type_id: 'test.unrestricted-noop', + consumer: 'alertsFixture', + }); + } + const allAlerts = []; + allAlerts.push(await createNoOpAlert()); + allAlerts.push(await createNoOpAlert()); + allAlerts.push(await createRestrictedNoOpAlert()); + allAlerts.push(await createUnrestrictedNoOpAlert()); + allAlerts.push(await createUnrestrictedNoOpAlert()); + allAlerts.push(await createRestrictedNoOpAlert()); + allAlerts.push(await createNoOpAlert()); + allAlerts.push(await createNoOpAlert()); + + const perPage = 4; + + const response = await supertestWithoutAuth + .post(`${getUrlPrefix(space.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .auth(user.username, user.password) + .send({ + per_page: perPage, + sort_field: 'createdAt', + }); + + switch (scenario.id) { + case 'no_kibana_privileges at space1': + case 'space_1_all at space2': + expect(response.statusCode).to.eql(403); + expect(response.body).to.eql({ + error: 'Forbidden', + message: `Unauthorized to find rules for any rule types`, + statusCode: 403, + }); + break; + case 'space_1_all at space1': + case 'space_1_all_alerts_none_actions at space1': + expect(response.statusCode).to.eql(200); + expect(response.body.page).to.equal(1); + expect(response.body.per_page).to.be.equal(perPage); + expect(response.body.total).to.be.equal(6); + { + const [firstPage] = chunk( + allAlerts + .filter((alert) => alert.rule_type_id !== 'test.restricted-noop') + .map((alert) => alert.id), + perPage + ); + expect(response.body.data.map((alert: any) => alert.id)).to.eql(firstPage); + } + break; + case 'global_read at space1': + case 'superuser at space1': + case 'space_1_all_with_restricted_fixture at space1': + expect(response.statusCode).to.eql(200); + expect(response.body.page).to.equal(1); + expect(response.body.per_page).to.be.equal(perPage); + expect(response.body.total).to.be.equal(8); + + { + const [firstPage, secondPage] = chunk( + allAlerts.map((alert) => alert.id), + perPage + ); + expect(response.body.data.map((alert: any) => alert.id)).to.eql(firstPage); + + const secondResponse = await supertestWithoutAuth + .post(`${getUrlPrefix(space.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .auth(user.username, user.password) + .send({ + per_page: perPage, + sort_field: 'createdAt', + page: 2, + }); + + expect(secondResponse.body.data.map((alert: any) => alert.id)).to.eql(secondPage); + } + + break; + default: + throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); + } + }); + + it('should handle find alert request with filter appropriately', async () => { + const { body: createdAction } = await supertest + .post(`${getUrlPrefix(space.id)}/api/actions/connector`) + .set('kbn-xsrf', 'foo') + .send({ + name: 'My action', + connector_type_id: 'test.noop', + config: {}, + secrets: {}, + }) + .expect(200); + + const { body: createdAlert } = await supertest + .post(`${getUrlPrefix(space.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + enabled: false, + actions: [ + { + id: createdAction.id, + group: 'default', + params: {}, + }, + ], + }) + ) + .expect(200); + objectRemover.add(space.id, createdAlert.id, 'rule', 'alerting'); + + const response = await supertestWithoutAuth + .post(`${getUrlPrefix(space.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .auth(user.username, user.password) + .send({ + filter: 'alert.attributes.actions:{ actionTypeId: test.noop }', + }); + + switch (scenario.id) { + case 'no_kibana_privileges at space1': + case 'space_1_all at space2': + expect(response.statusCode).to.eql(403); + expect(response.body).to.eql({ + error: 'Forbidden', + message: `Unauthorized to find rules for any rule types`, + statusCode: 403, + }); + break; + case 'global_read at space1': + case 'superuser at space1': + case 'space_1_all at space1': + case 'space_1_all_alerts_none_actions at space1': + case 'space_1_all_with_restricted_fixture at space1': + expect(response.statusCode).to.eql(200); + expect(response.body.page).to.equal(1); + expect(response.body.per_page).to.be.greaterThan(0); + expect(response.body.total).to.be.greaterThan(0); + const match = response.body.data.find((obj: any) => obj.id === createdAlert.id); + const activeSnoozes = match.active_snoozes; + const hasActiveSnoozes = !!(activeSnoozes || []).filter((obj: any) => obj).length; + expect(match).to.eql({ + id: createdAlert.id, + name: 'abc', + tags: ['foo'], + rule_type_id: 'test.noop', + running: match.running ?? false, + consumer: 'alertsFixture', + schedule: { interval: '1m' }, + enabled: false, + actions: [ + { + id: createdAction.id, + group: 'default', + connector_type_id: 'test.noop', + params: {}, + uuid: createdAlert.actions[0].uuid, + }, + ], + params: {}, + created_by: 'elastic', + throttle: '1m', + api_key_created_by_user: null, + updated_by: 'elastic', + api_key_owner: null, + mute_all: false, + muted_alert_ids: [], + notify_when: 'onThrottleInterval', + created_at: match.created_at, + updated_at: match.updated_at, + execution_status: match.execution_status, + revision: 0, + ...(match.next_run ? { next_run: match.next_run } : {}), + ...(match.last_run ? { last_run: match.last_run } : {}), + monitoring: match.monitoring, + snooze_schedule: match.snooze_schedule, + ...(hasActiveSnoozes && { active_snoozes: activeSnoozes }), + is_snoozed_until: null, + }); + expect(Date.parse(match.created_at)).to.be.greaterThan(0); + expect(Date.parse(match.updated_at)).to.be.greaterThan(0); + break; + default: + throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); + } + }); + + it('should handle find alert request with fields appropriately', async () => { + const myTag = uuidv4(); + const { body: createdAlert } = await supertest + .post(`${getUrlPrefix(space.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + enabled: false, + tags: [myTag], + rule_type_id: 'test.restricted-noop', + consumer: 'alertsRestrictedFixture', + }) + ) + .expect(200); + objectRemover.add(space.id, createdAlert.id, 'rule', 'alerting'); + + // create another type with same tag + const { body: createdSecondAlert } = await supertest + .post(`${getUrlPrefix(space.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + tags: [myTag], + rule_type_id: 'test.restricted-noop', + consumer: 'alertsRestrictedFixture', + }) + ) + .expect(200); + objectRemover.add(space.id, createdSecondAlert.id, 'rule', 'alerting'); + + const response = await supertestWithoutAuth + .post(`${getUrlPrefix(space.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .auth(user.username, user.password) + .send({ + filter: 'alert.attributes.alertTypeId:test.restricted-noop', + fields: ['tags'], + sort_field: 'createdAt', + }); + + switch (scenario.id) { + case 'no_kibana_privileges at space1': + case 'space_1_all at space2': + expect(response.statusCode).to.eql(403); + expect(response.body).to.eql({ + error: 'Forbidden', + message: `Unauthorized to find rules for any rule types`, + statusCode: 403, + }); + break; + case 'space_1_all at space1': + case 'space_1_all_alerts_none_actions at space1': + expect(response.statusCode).to.eql(200); + expect(response.body.data).to.eql([]); + break; + case 'global_read at space1': + case 'superuser at space1': + case 'space_1_all_with_restricted_fixture at space1': + expect(response.statusCode).to.eql(200); + expect(response.body.page).to.equal(1); + expect(response.body.per_page).to.be.greaterThan(0); + expect(response.body.total).to.be.greaterThan(0); + const [matchFirst, matchSecond] = response.body.data; + expect(omit(matchFirst, 'updatedAt')).to.eql({ + id: createdAlert.id, + actions: [], + tags: [myTag], + snooze_schedule: [], + is_snoozed_until: null, + }); + expect(omit(matchSecond, 'updatedAt')).to.eql({ + id: createdSecondAlert.id, + actions: [], + tags: [myTag], + snooze_schedule: [], + is_snoozed_until: null, + }); + break; + default: + throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); + } + }); + + it('should handle find alert request with executionStatus field appropriately', async () => { + const myTag = uuidv4(); + const { body: createdAlert } = await supertest + .post(`${getUrlPrefix(space.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + enabled: false, + tags: [myTag], + rule_type_id: 'test.restricted-noop', + consumer: 'alertsRestrictedFixture', + }) + ) + .expect(200); + objectRemover.add(space.id, createdAlert.id, 'rule', 'alerting'); + + // create another type with same tag + const { body: createdSecondAlert } = await supertest + .post(`${getUrlPrefix(space.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + tags: [myTag], + rule_type_id: 'test.restricted-noop', + consumer: 'alertsRestrictedFixture', + }) + ) + .expect(200); + objectRemover.add(space.id, createdSecondAlert.id, 'rule', 'alerting'); + + const response = await supertestWithoutAuth + .post(`${getUrlPrefix(space.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .auth(user.username, user.password) + .send({ + filter: 'alert.attributes.alertTypeId:test.restricted-noop', + fields: ['tags', 'executionStatus'], + sort_field: 'createdAt', + }); + + switch (scenario.id) { + case 'no_kibana_privileges at space1': + case 'space_1_all at space2': + expect(response.statusCode).to.eql(403); + expect(response.body).to.eql({ + error: 'Forbidden', + message: `Unauthorized to find rules for any rule types`, + statusCode: 403, + }); + break; + case 'space_1_all at space1': + case 'space_1_all_alerts_none_actions at space1': + expect(response.statusCode).to.eql(200); + expect(response.body.data).to.eql([]); + break; + case 'global_read at space1': + case 'superuser at space1': + case 'space_1_all_with_restricted_fixture at space1': + expect(response.statusCode).to.eql(200); + expect(response.body.page).to.equal(1); + expect(response.body.per_page).to.be.greaterThan(0); + expect(response.body.total).to.be.greaterThan(0); + const [matchFirst, matchSecond] = response.body.data; + expect(omit(matchFirst, 'updatedAt')).to.eql({ + id: createdAlert.id, + actions: [], + tags: [myTag], + execution_status: matchFirst.execution_status, + snooze_schedule: [], + is_snoozed_until: null, + }); + expect(omit(matchSecond, 'updatedAt')).to.eql({ + id: createdSecondAlert.id, + actions: [], + tags: [myTag], + execution_status: matchSecond.execution_status, + snooze_schedule: [], + is_snoozed_until: null, + }); + break; + default: + throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); + } + }); + + it(`shouldn't find alert from another space`, async () => { + const { body: createdAlert } = await supertest + .post(`${getUrlPrefix(space.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData()) + .expect(200); + objectRemover.add(space.id, createdAlert.id, 'rule', 'alerting'); + + const response = await supertestWithoutAuth + .post(`${getUrlPrefix('other')}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .auth(user.username, user.password) + .send({ + search: 'test.noop', + search_fields: 'alertTypeId', + }); + + switch (scenario.id) { + case 'no_kibana_privileges at space1': + case 'space_1_all at space2': + case 'space_1_all at space1': + case 'space_1_all_alerts_none_actions at space1': + case 'space_1_all_with_restricted_fixture at space1': + expect(response.statusCode).to.eql(403); + expect(response.body).to.eql({ + error: 'Forbidden', + message: `Unauthorized to find rules for any rule types`, + statusCode: 403, + }); + break; + case 'global_read at space1': + case 'superuser at space1': + expect(response.statusCode).to.eql(200); + expect(response.body).to.eql({ + page: 1, + per_page: 10, + total: 0, + data: [], + }); + break; + default: + throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); + } + }); + }); + } + + describe('Actions', () => { + const { user, space } = SuperuserAtSpace1; + + it('should return the actions correctly', async () => { + const { body: createdAction } = await supertest + .post(`${getUrlPrefix(space.id)}/api/actions/connector`) + .set('kbn-xsrf', 'foo') + .send({ + name: 'MY action', + connector_type_id: 'test.noop', + config: {}, + secrets: {}, + }) + .expect(200); + + const { body: createdRule1 } = await supertest + .post(`${getUrlPrefix(space.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + enabled: true, + actions: [ + { + id: createdAction.id, + group: 'default', + params: {}, + }, + { + id: 'system-connector-test.system-action', + params: {}, + }, + ], + }) + ) + .expect(200); + + objectRemover.add(space.id, createdRule1.id, 'rule', 'alerting'); + + const response = await supertestWithoutAuth + .get(`${getUrlPrefix(space.id)}/api/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .auth(user.username, user.password); + + const action = response.body.data[0].actions[0]; + const systemAction = response.body.data[0].actions[1]; + const { uuid, ...restAction } = action; + const { uuid: systemActionUuid, ...restSystemAction } = systemAction; + + expect([restAction, restSystemAction]).to.eql([ + { + id: createdAction.id, + connector_type_id: 'test.noop', + group: 'default', + params: {}, + }, + { + id: 'system-connector-test.system-action', + connector_type_id: 'test.system-action', + params: {}, + }, + , + ]); + }); + }); + describe('stack alerts', () => { + const ruleTypes = [ + [ + ES_QUERY_ID, + { + searchType: 'esQuery', + timeWindowSize: 5, + timeWindowUnit: 'm', + threshold: [1000], + thresholdComparator: '>', + size: 100, + esQuery: '{\n "query":{\n "match_all" : {}\n }\n }', + aggType: 'count', + groupBy: 'all', + termSize: 5, + excludeHitsFromPreviousRun: false, + sourceFields: [], + index: ['.kibana'], + timeField: 'created_at', + }, + ], + [ + OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, + { + criteria: [ + { + comparator: '>', + metrics: [ + { + name: 'A', + aggType: 'count', + }, + ], + threshold: [100], + timeSize: 1, + timeUnit: 'm', + }, + ], + alertOnNoData: false, + alertOnGroupDisappear: false, + searchConfiguration: { + query: { + query: '', + language: 'kuery', + }, + index: 'kibana-event-log-data-view', + }, + }, + ], + [ + ML_ANOMALY_DETECTION_RULE_TYPE_ID, + { + severity: 75, + resultType: 'bucket', + includeInterim: false, + jobSelection: { + jobIds: ['low_request_rate'], + }, + }, + ], + ]; + + const createRule = async (rule = {}) => { + const { body: createdAlert } = await supertest + .post(`${getUrlPrefix('space1')}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ ...rule })) + .expect(200); + + objectRemover.add('space1', createdAlert.id, 'rule', 'alerting'); + }; + + for (const [ruleTypeId, params] of ruleTypes) { + it(`should get rules of ${ruleTypeId} rule type ID and stackAlerts consumer`, async () => { + /** + * We create two rules. The first one is a test.noop + * rule with stackAlerts as consumer. The second rule + * is has different rule type ID but with the same consumer as the first rule (stackAlerts). + * This way we can verify that the find API call returns only the rules the user is authorized to. + * Specifically only the second rule because the StackAlertsOnly user does not have + * access to the test.noop rule type. + */ + await createRule({ consumer: 'stackAlerts' }); + await createRule({ rule_type_id: ruleTypeId, params, consumer: 'stackAlerts' }); + + const response = await supertestWithoutAuth + .get(`${getUrlPrefix('space1')}/api/alerting/rules/_find`) + .auth(StackAlertsOnly.username, StackAlertsOnly.password); + + expect(response.statusCode).to.eql(200); + expect(response.body.total).to.equal(1); + expect(response.body.data[0].rule_type_id).to.equal(ruleTypeId); + expect(response.body.data[0].consumer).to.equal('stackAlerts'); + }); + } + + for (const [ruleTypeId, params] of ruleTypes) { + it(`should NOT get rules of ${ruleTypeId} rule type ID and NOT stackAlerts consumer`, async () => { + /** + * We create two rules with logs as consumer. The user is authorized to + * access rules only with the stackAlerts consumers. + */ + await createRule({ consumer: 'logs' }); + await createRule({ rule_type_id: ruleTypeId, params, consumer: 'logs' }); + + const response = await supertestWithoutAuth + .get(`${getUrlPrefix('space1')}/api/alerting/rules/_find`) + .auth(StackAlertsOnly.username, StackAlertsOnly.password); + + expect(response.statusCode).to.eql(200); + expect(response.body.total).to.equal(0); + }); + } + }); + }); +} diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find_with_post.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find_with_post.ts index f221b5869dd6b..c8afff8fcc476 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find_with_post.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/find_with_post.ts @@ -207,12 +207,14 @@ const findTestUtils = ( expect(response.body.data.map((alert: any) => alert.id)).to.eql(firstPage); const secondResponse = await supertestWithoutAuth - .get( - `${getUrlPrefix(space.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?per_page=${perPage}&sort_field=createdAt&page=2` - ) - .auth(user.username, user.password); + .post(`${getUrlPrefix(space.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'kibana') + .auth(user.username, user.password) + .send({ + per_page: perPage, + sort_field: 'createdAt', + page: 2, + }); expect(secondResponse.body.data.map((alert: any) => alert.id)).to.eql(secondPage); } diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/index.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/index.ts index ec938e8dc4abb..262fe8af301c8 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/index.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/index.ts @@ -22,6 +22,7 @@ export default function alertingTests({ loadTestFile, getService }: FtrProviderC loadTestFile(require.resolve('./backfill')); loadTestFile(require.resolve('./find')); + loadTestFile(require.resolve('./find_internal')); loadTestFile(require.resolve('./find_with_post')); loadTestFile(require.resolve('./create')); loadTestFile(require.resolve('./delete')); diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/create.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/create.ts index 9932ee2c11a36..57d41424186b3 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/create.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/create.ts @@ -341,13 +341,14 @@ export default function createAlertTests({ getService }: FtrProviderContext) { ) .expect(200); - const response = await supertest.get( - `${getUrlPrefix( - Spaces.space1.id - )}/internal/alerting/rules/_find?filter=alert.attributes.params.risk_score:40` - ); + const response = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'kibana') + .send({ + filter: `alert.attributes.params.risk_score:40`, + }) + .expect(200); - expect(response.status).to.eql(200); objectRemover.add(Spaces.space1.id, createResponse.body.id, 'rule', 'alerting'); expect(response.body.total).to.equal(1); expect(response.body.data[0].mapped_params).to.eql({ diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/find.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/find.ts index c8aeba2b7e210..e730dd657d2f1 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/find.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/find.ts @@ -26,13 +26,15 @@ async function createAlert( return createdAlert; } -const findTestUtils = ( - describeType: 'internal' | 'public', - supertest: SuperTestAgent, - objectRemover: ObjectRemover -) => { - describe(describeType, () => { +// eslint-disable-next-line import/no-default-export +export default function createFindTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + + describe('find public API', () => { + const objectRemover = new ObjectRemover(supertest); + afterEach(() => objectRemover.removeAll()); + describe('handle find alert request', function () { this.tags('skipFIPS'); it('should handle find alert request appropriately', async () => { @@ -72,9 +74,9 @@ const findTestUtils = ( objectRemover.add(Spaces.space1.id, createdAlert.id, 'rule', 'alerting'); const response = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?search=test.noop&search_fields=alertTypeId` + `${getUrlPrefix( + Spaces.space1.id + )}/api/alerting/rules/_find?search=test.noop&search_fields=alertTypeId` ); expect(response.status).to.eql(200); @@ -82,8 +84,6 @@ const findTestUtils = ( expect(response.body.per_page).to.be.greaterThan(0); expect(response.body.total).to.be.greaterThan(0); const match = response.body.data.find((obj: any) => obj.id === createdAlert.id); - const activeSnoozes = match.active_snoozes; - const hasActiveSnoozes = !!(activeSnoozes || []).filter((obj: any) => obj).length; expect(match).to.eql({ id: createdAlert.id, name: 'abc', @@ -123,14 +123,6 @@ const findTestUtils = ( execution_status: match.execution_status, ...(match.next_run ? { next_run: match.next_run } : {}), ...(match.last_run ? { last_run: match.last_run } : {}), - ...(describeType === 'internal' - ? { - monitoring: match.monitoring, - snooze_schedule: match.snooze_schedule, - ...(hasActiveSnoozes && { active_snoozes: activeSnoozes }), - is_snoozed_until: null, - } - : {}), }); expect(Date.parse(match.created_at)).to.be.greaterThan(0); expect(Date.parse(match.updated_at)).to.be.greaterThan(0); @@ -147,9 +139,9 @@ const findTestUtils = ( await supertest .get( - `${getUrlPrefix(Spaces.other.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?search=test.noop&search_fields=alertTypeId` + `${getUrlPrefix( + Spaces.other.id + )}/api/alerting/rules/_find?search=test.noop&search_fields=alertTypeId` ) .expect(200, { page: 1, @@ -186,62 +178,50 @@ const findTestUtils = ( ]); }); - it(`it should${ - describeType === 'public' ? ' NOT' : '' - } allow filter on monitoring attributes`, async () => { + it(`it should NOT allow filter on monitoring attributes`, async () => { const response = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?filter=alert.attributes.monitoring.run.calculated_metrics.success_ratio>50` + `${getUrlPrefix( + Spaces.space1.id + )}/api/alerting/rules/_find?filter=alert.attributes.monitoring.run.calculated_metrics.success_ratio>50` ); - expect(response.status).to.eql(describeType === 'internal' ? 200 : 400); - if (describeType === 'public') { - expect(response.body.message).to.eql( - 'Error find rules: Filter is not supported on this field alert.attributes.monitoring.run.calculated_metrics.success_ratio' - ); - } + expect(response.status).to.eql(400); + expect(response.body.message).to.eql( + 'Error find rules: Filter is not supported on this field alert.attributes.monitoring.run.calculated_metrics.success_ratio' + ); }); - it(`it should${ - describeType === 'public' ? ' NOT' : '' - } allow ordering on monitoring attributes`, async () => { + it(`it should NOT allow ordering on monitoring attributes`, async () => { const response = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?sort_field=monitoring.run.calculated_metrics.success_ratio` + `${getUrlPrefix( + Spaces.space1.id + )}/api/alerting/rules/_find?sort_field=monitoring.run.calculated_metrics.success_ratio` ); - expect(response.status).to.eql(describeType === 'internal' ? 200 : 400); - if (describeType === 'public') { - expect(response.body.message).to.eql( - 'Error find rules: Sort is not supported on this field monitoring.run.calculated_metrics.success_ratio' - ); - } + expect(response.status).to.eql(400); + expect(response.body.message).to.eql( + 'Error find rules: Sort is not supported on this field monitoring.run.calculated_metrics.success_ratio' + ); }); - it(`it should${ - describeType === 'public' ? ' NOT' : '' - } allow search_fields on monitoring attributes`, async () => { + it(`it should NOT allow search_fields on monitoring attributes`, async () => { const response = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?search_fields=monitoring.run.calculated_metrics.success_ratio&search=50` + `${getUrlPrefix( + Spaces.space1.id + )}/api/alerting/rules/_find?search_fields=monitoring.run.calculated_metrics.success_ratio&search=50` ); - expect(response.status).to.eql(describeType === 'internal' ? 200 : 400); - if (describeType === 'public') { - expect(response.body.message).to.eql( - 'Error find rules: Search field monitoring.run.calculated_metrics.success_ratio not supported' - ); - } + expect(response.status).to.eql(400); + expect(response.body.message).to.eql( + 'Error find rules: Search field monitoring.run.calculated_metrics.success_ratio not supported' + ); }); it('should filter on string parameters', async () => { const response = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?filter=alert.attributes.params.strValue:"my b"` + `${getUrlPrefix( + Spaces.space1.id + )}/api/alerting/rules/_find?filter=alert.attributes.params.strValue:"my b"` ); expect(response.status).to.eql(200); @@ -251,9 +231,7 @@ const findTestUtils = ( it('should filter on kueryNode parameters', async () => { const response = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?filter=${JSON.stringify( + `${getUrlPrefix(Spaces.space1.id)}/api/alerting/rules/_find?filter=${JSON.stringify( fromKueryExpression('alert.attributes.params.strValue:"my b"') )}` ); @@ -265,9 +243,9 @@ const findTestUtils = ( it('should sort by parameters', async () => { const response = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?sort_field=params.severity&sort_order=asc` + `${getUrlPrefix( + Spaces.space1.id + )}/api/alerting/rules/_find?sort_field=params.severity&sort_order=asc` ); expect(response.body.data[0].params.severity).to.equal('low'); expect(response.body.data[1].params.severity).to.equal('medium'); @@ -276,9 +254,9 @@ const findTestUtils = ( it('should search by parameters', async () => { const response = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?search_fields=params.severity&search=medium` + `${getUrlPrefix( + Spaces.space1.id + )}/api/alerting/rules/_find?search_fields=params.severity&search=medium` ); expect(response.status).to.eql(200); @@ -288,51 +266,31 @@ const findTestUtils = ( it('should filter on parameters', async () => { const response = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?filter=alert.attributes.params.risk_score:40` + `${getUrlPrefix( + Spaces.space1.id + )}/api/alerting/rules/_find?filter=alert.attributes.params.risk_score:40` ); expect(response.status).to.eql(200); expect(response.body.total).to.equal(1); expect(response.body.data[0].params.risk_score).to.eql(40); - if (describeType === 'public') { - expect(response.body.data[0].mapped_params).to.eql(undefined); - } + expect(response.body.data[0].mapped_params).to.eql(undefined); }); it('should error if filtering on mapped parameters directly using the public API', async () => { const response = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/${ - describeType === 'public' ? 'api' : 'internal' - }/alerting/rules/_find?filter=alert.attributes.mapped_params.risk_score:40` + `${getUrlPrefix( + Spaces.space1.id + )}/api/alerting/rules/_find?filter=alert.attributes.mapped_params.risk_score:40` ); - if (describeType === 'public') { - expect(response.status).to.eql(400); - expect(response.body.message).to.eql( - 'Error find rules: Filter is not supported on this field alert.attributes.mapped_params.risk_score' - ); - } else { - expect(response.status).to.eql(200); - } + expect(response.status).to.eql(400); + expect(response.body.message).to.eql( + 'Error find rules: Filter is not supported on this field alert.attributes.mapped_params.risk_score' + ); }); }); - }); -}; - -// eslint-disable-next-line import/no-default-export -export default function createFindTests({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); - - describe('find', () => { - const objectRemover = new ObjectRemover(supertest); - - afterEach(() => objectRemover.removeAll()); - - findTestUtils('public', supertest, objectRemover); - findTestUtils('internal', supertest, objectRemover); describe('legacy', function () { this.tags('skipFIPS'); diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/find_internal.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/find_internal.ts new file mode 100644 index 0000000000000..25fc54a5229d3 --- /dev/null +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/find_internal.ts @@ -0,0 +1,355 @@ +/* + * 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 expect from '@kbn/expect'; +import { Agent as SuperTestAgent } from 'supertest'; +import { fromKueryExpression } from '@kbn/es-query'; +import { Spaces } from '../../../scenarios'; +import { getUrlPrefix, getTestRuleData, ObjectRemover } from '../../../../common/lib'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +async function createAlert( + objectRemover: ObjectRemover, + supertest: SuperTestAgent, + overwrites = {} +) { + const { body: createdAlert } = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData(overwrites)) + .expect(200); + objectRemover.add(Spaces.space1.id, createdAlert.id, 'rule', 'alerting'); + return createdAlert; +} + +// eslint-disable-next-line import/no-default-export +export default function createFindTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + + describe('find internal API', () => { + const objectRemover = new ObjectRemover(supertest); + + afterEach(() => objectRemover.removeAll()); + + describe('handle find alert request', function () { + this.tags('skipFIPS'); + it('should handle find alert request appropriately', async () => { + const { body: createdAction } = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/api/actions/connector`) + .set('kbn-xsrf', 'foo') + .send({ + name: 'MY action', + connector_type_id: 'test.noop', + config: {}, + secrets: {}, + }) + .expect(200); + + const { body: createdAlert } = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + actions: [ + { + group: 'default', + id: createdAction.id, + params: {}, + frequency: { + summary: false, + notify_when: 'onThrottleInterval', + throttle: '1m', + }, + }, + ], + notify_when: undefined, + throttle: undefined, + }) + ) + .expect(200); + objectRemover.add(Spaces.space1.id, createdAlert.id, 'rule', 'alerting'); + + const response = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .send({ + search: 'test.noop', + search_fields: 'alertTypeId', + }); + + expect(response.status).to.eql(200); + expect(response.body.page).to.equal(1); + expect(response.body.per_page).to.be.greaterThan(0); + expect(response.body.total).to.be.greaterThan(0); + const match = response.body.data.find((obj: any) => obj.id === createdAlert.id); + const activeSnoozes = match.active_snoozes; + const hasActiveSnoozes = !!(activeSnoozes || []).filter((obj: any) => obj).length; + expect(match).to.eql({ + id: createdAlert.id, + name: 'abc', + tags: ['foo'], + rule_type_id: 'test.noop', + revision: 0, + running: false, + consumer: 'alertsFixture', + schedule: { interval: '1m' }, + enabled: true, + actions: [ + { + group: 'default', + id: createdAction.id, + connector_type_id: 'test.noop', + params: {}, + frequency: { + summary: false, + notify_when: 'onThrottleInterval', + throttle: '1m', + }, + uuid: match.actions[0].uuid, + }, + ], + params: {}, + created_by: null, + api_key_owner: null, + api_key_created_by_user: null, + scheduled_task_id: match.scheduled_task_id, + updated_by: null, + throttle: null, + notify_when: null, + mute_all: false, + muted_alert_ids: [], + created_at: match.created_at, + updated_at: match.updated_at, + execution_status: match.execution_status, + ...(match.next_run ? { next_run: match.next_run } : {}), + ...(match.last_run ? { last_run: match.last_run } : {}), + monitoring: match.monitoring, + snooze_schedule: match.snooze_schedule, + ...(hasActiveSnoozes && { active_snoozes: activeSnoozes }), + is_snoozed_until: null, + }); + expect(Date.parse(match.created_at)).to.be.greaterThan(0); + expect(Date.parse(match.updated_at)).to.be.greaterThan(0); + }); + }); + + it(`shouldn't find alert from another space`, async () => { + const { body: createdAlert } = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData()) + .expect(200); + objectRemover.add(Spaces.space1.id, createdAlert.id, 'rule', 'alerting'); + + await supertest + .post(`${getUrlPrefix(Spaces.other.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .send({ + search: 'test.noop', + search_fields: 'alertTypeId', + }) + .expect(200, { + page: 1, + per_page: 10, + total: 0, + data: [], + }); + }); + + describe('basic functionality', () => { + beforeEach(async () => { + await Promise.all([ + createAlert(objectRemover, supertest, { params: { strValue: 'my a' } }), + createAlert(objectRemover, supertest, { params: { strValue: 'my b' } }), + createAlert(objectRemover, supertest, { params: { strValue: 'my c' } }), + createAlert(objectRemover, supertest, { + params: { + risk_score: 60, + severity: 'high', + }, + }), + createAlert(objectRemover, supertest, { + params: { + risk_score: 40, + severity: 'medium', + }, + }), + createAlert(objectRemover, supertest, { + params: { + risk_score: 20, + severity: 'low', + }, + }), + ]); + }); + + it(`it should allow filter on monitoring attributes`, async () => { + const response = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .send({ + filter: 'alert.attributes.monitoring.run.calculated_metrics.success_ratio>50', + }); + + expect(response.status).to.eql(200); + }); + + it(`it should allow ordering on monitoring attributes`, async () => { + const response = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .send({ + sort_field: 'monitoring.run.calculated_metrics.success_ratio', + }); + + expect(response.status).to.eql(200); + }); + + it(`it should allow search_fields on monitoring attributes`, async () => { + const response = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .send({ + search_fields: 'monitoring.run.calculated_metrics.success_ratio', + search: '50', + }); + + expect(response.status).to.eql(200); + }); + + it('should filter on string parameters', async () => { + const response = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .send({ + filter: 'alert.attributes.params.strValue:"my b"', + }); + + expect(response.status).to.eql(200); + expect(response.body.total).to.equal(1); + expect(response.body.data[0].params.strValue).to.eql('my b'); + }); + + it('should filter on kueryNode parameters', async () => { + const response = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .send({ + filter: JSON.stringify(fromKueryExpression('alert.attributes.params.strValue:"my b"')), + }); + + expect(response.status).to.eql(200); + expect(response.body.total).to.equal(1); + expect(response.body.data[0].params.strValue).to.eql('my b'); + }); + + it('should sort by parameters', async () => { + const response = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .send({ + sort_field: 'params.severity', + sort_order: 'asc', + }); + expect(response.body.data[0].params.severity).to.equal('low'); + expect(response.body.data[1].params.severity).to.equal('medium'); + expect(response.body.data[2].params.severity).to.equal('high'); + }); + + it('should search by parameters', async () => { + const response = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .send({ + search_fields: 'params.severity', + search: 'medium', + }); + + expect(response.status).to.eql(200); + expect(response.body.total).to.equal(1); + expect(response.body.data[0].params.severity).to.eql('medium'); + }); + + it('should filter on parameters', async () => { + const response = await supertest + .get(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .send({ + filter: 'alert.attributes.params.risk_score:40', + }); + + expect(response.status).to.eql(200); + expect(response.body.total).to.equal(1); + expect(response.body.data[0].params.risk_score).to.eql(40); + }); + + it('should error if filtering on mapped parameters directly using the public API', async () => { + const response = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'foo') + .send({ + filter: 'alert.attributes.mapped_params.risk_score:40', + }); + + expect(response.status).to.eql(200); + }); + }); + + describe('legacy', function () { + this.tags('skipFIPS'); + it('should handle find alert request appropriately', async () => { + const { body: createdAlert } = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData()) + .expect(200); + objectRemover.add(Spaces.space1.id, createdAlert.id, 'rule', 'alerting'); + + const response = await supertest.get( + `${getUrlPrefix( + Spaces.space1.id + )}/api/alerts/_find?search=test.noop&search_fields=alertTypeId` + ); + + expect(response.status).to.eql(200); + expect(response.body.page).to.equal(1); + expect(response.body.perPage).to.be.greaterThan(0); + expect(response.body.total).to.be.greaterThan(0); + const match = response.body.data.find((obj: any) => obj.id === createdAlert.id); + expect(match).to.eql({ + id: createdAlert.id, + name: 'abc', + tags: ['foo'], + alertTypeId: 'test.noop', + consumer: 'alertsFixture', + schedule: { interval: '1m' }, + enabled: true, + actions: [], + params: {}, + createdBy: null, + apiKeyOwner: null, + apiKeyCreatedByUser: null, + scheduledTaskId: match.scheduledTaskId, + updatedBy: null, + throttle: '1m', + notifyWhen: 'onThrottleInterval', + muteAll: false, + mutedInstanceIds: [], + createdAt: match.createdAt, + updatedAt: match.updatedAt, + executionStatus: match.executionStatus, + revision: 0, + running: false, + ...(match.nextRun ? { nextRun: match.nextRun } : {}), + ...(match.lastRun ? { lastRun: match.lastRun } : {}), + }); + expect(Date.parse(match.createdAt)).to.be.greaterThan(0); + expect(Date.parse(match.updatedAt)).to.be.greaterThan(0); + }); + }); + }); +} diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/update.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/update.ts index 029775fbba383..025fa3b693dce 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/update.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/update.ts @@ -91,11 +91,10 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { expect(Date.parse(response.body.next_run)).to.be.greaterThan(0); } - response = await supertest.get( - `${getUrlPrefix( - Spaces.space1.id - )}/internal/alerting/rules/_find?filter=alert.attributes.params.risk_score:40` - ); + response = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_find`) + .set('kbn-xsrf', 'kibana') + .send({ filter: `alert.attributes.params.risk_score:40` }); expect(response.body.data[0].mapped_params).to.eql({ risk_score: 40, diff --git a/x-pack/test/observability_functional/apps/observability/pages/alerts/custom_threshold.ts b/x-pack/test/observability_functional/apps/observability/pages/alerts/custom_threshold.ts index 38d308a17e7b0..91cb7eec19ef6 100644 --- a/x-pack/test/observability_functional/apps/observability/pages/alerts/custom_threshold.ts +++ b/x-pack/test/observability_functional/apps/observability/pages/alerts/custom_threshold.ts @@ -209,7 +209,10 @@ export default ({ getService }: FtrProviderContext) => { }); it('saved the rule correctly', async () => { - const { body: rules } = await supertest.get('/internal/alerting/rules/_find'); + const { body: rules } = await supertest + .post('/internal/alerting/rules/_find') + .set('kbn-xsrf', 'kibana') + .send({}); expect(rules.data.length).toEqual(1); expect(rules.data[0]).toEqual( diff --git a/x-pack/test/observability_functional/apps/observability/pages/rules_page.ts b/x-pack/test/observability_functional/apps/observability/pages/rules_page.ts index abc2534efaf8a..4ec0f412e1f03 100644 --- a/x-pack/test/observability_functional/apps/observability/pages/rules_page.ts +++ b/x-pack/test/observability_functional/apps/observability/pages/rules_page.ts @@ -29,7 +29,12 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { const { body: { data: rules }, } = await supertest - .get(`${INTERNAL_RULE_ENDPOINT}/_find?search=${name}&search_fields=name`) + .post(`${INTERNAL_RULE_ENDPOINT}/_find`) + .set('kbn-xsrf', 'kibana') + .send({ + search: name, + search_fields: ['name'], + }) .expect(200); return rules.find((rule: any) => rule.name === name); } diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/snoozing/rule_snoozing.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/snoozing/rule_snoozing.cy.ts index 270a9146f65a9..9622cb94bdd4f 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/snoozing/rule_snoozing.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/snoozing/rule_snoozing.cy.ts @@ -217,7 +217,7 @@ describe('rule snoozing', { tags: ['@ess', '@serverless', '@skipInServerlessMKI' describe('Handling errors', () => { it('shows an error if unable to load snooze settings', () => { createRule(getNewRule({ name: 'Test rule', enabled: false })).then(({ body: rule }) => { - cy.intercept('GET', `${INTERNAL_ALERTING_API_FIND_RULES_PATH}*`, { + cy.intercept('POST', `${INTERNAL_ALERTING_API_FIND_RULES_PATH}*`, { statusCode: 500, }); From 7e63ee7c30747b43d231ba33c3020a5e4749c205 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 23 Oct 2024 17:21:28 +1100 Subject: [PATCH 041/146] [api-docs] 2024-10-23 Daily api_docs build (#197360) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/869 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_quality.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_usage.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/entities_data_access.mdx | 2 +- api_docs/entity_manager.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql.mdx | 2 +- api_docs/esql_data_grid.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/fields_metadata.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.devdocs.json | 70 ++++ api_docs/fleet.mdx | 4 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/inference.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/integration_assistant.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/inventory.mdx | 2 +- api_docs/investigate.mdx | 2 +- api_docs/investigate_app.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_ai_assistant.mdx | 2 +- api_docs/kbn_ai_assistant_common.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +- api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_comparators.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_grouping.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_collection_utils.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_data_view.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- .../kbn_apm_synthtrace_client.devdocs.json | 373 +++++++++++++++++ api_docs/kbn_apm_synthtrace_client.mdx | 4 +- api_docs/kbn_apm_types.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_avc_banner.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bfetch_error.mdx | 2 +- api_docs/kbn_calculate_auto.mdx | 2 +- .../kbn_calculate_width_from_char_count.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cbor.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_cloud_security_posture.mdx | 2 +- .../kbn_cloud_security_posture_common.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mock.mdx | 2 +- api_docs/kbn_code_owners.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...ent_management_content_insights_public.mdx | 2 +- ...ent_management_content_insights_server.mdx | 2 +- ...bn_content_management_favorites_public.mdx | 2 +- ...bn_content_management_favorites_server.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...tent_management_table_list_view_common.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- .../kbn_content_management_user_profiles.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.devdocs.json | 10 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- .../kbn_core_deprecations_common.devdocs.json | 11 +- api_docs/kbn_core_deprecations_common.mdx | 4 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_feature_flags_browser.mdx | 2 +- ...bn_core_feature_flags_browser_internal.mdx | 2 +- .../kbn_core_feature_flags_browser_mocks.mdx | 2 +- api_docs/kbn_core_feature_flags_server.mdx | 2 +- ...kbn_core_feature_flags_server_internal.mdx | 2 +- .../kbn_core_feature_flags_server_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- ...e_http_router_server_internal.devdocs.json | 20 +- .../kbn_core_http_router_server_internal.mdx | 2 +- ...core_http_router_server_mocks.devdocs.json | 22 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 385 +++++++++++++++++- api_docs/kbn_core_http_server.mdx | 4 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- .../kbn_core_http_server_mocks.devdocs.json | 34 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_security_browser.mdx | 2 +- .../kbn_core_security_browser_internal.mdx | 2 +- api_docs/kbn_core_security_browser_mocks.mdx | 2 +- api_docs/kbn_core_security_common.mdx | 2 +- api_docs/kbn_core_security_server.mdx | 2 +- .../kbn_core_security_server_internal.mdx | 2 +- api_docs/kbn_core_security_server_mocks.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- .../kbn_core_usage_data_server.devdocs.json | 175 +++++++- api_docs/kbn_core_usage_data_server.mdx | 4 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- ..._core_usage_data_server_mocks.devdocs.json | 10 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_forge.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_data_stream_adapter.mdx | 2 +- api_docs/kbn_data_view_utils.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_fleet.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_elastic_assistant_common.mdx | 2 +- api_docs/kbn_entities_schema.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_esql_ast.devdocs.json | 61 +++ api_docs/kbn_esql_ast.mdx | 4 +- api_docs/kbn_esql_editor.mdx | 2 +- api_docs/kbn_esql_utils.mdx | 2 +- api_docs/kbn_esql_validation_autocomplete.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_formatters.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- .../kbn_ftr_common_functional_ui_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_grid_layout.mdx | 2 +- api_docs/kbn_grouping.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- .../kbn_index_management_shared_types.mdx | 2 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_investigation_shared.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.mdx | 2 +- api_docs/kbn_item_buffer.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_json_schemas.mdx | 2 +- .../kbn_kibana_manifest_schema.devdocs.json | 98 +++++ api_docs/kbn_kibana_manifest_schema.mdx | 4 +- api_docs/kbn_language_documentation.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_lens_formula_docs.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_content_badge.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_manifest.devdocs.json | 47 +++ api_docs/kbn_manifest.mdx | 30 ++ api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_cancellable_search.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_field_stats_flyout.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_parse_interval.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_time_buckets.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_ml_validators.mdx | 2 +- api_docs/kbn_mock_idp_utils.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_object_versioning_utils.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_rule_utils.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_observability_logs_overview.mdx | 2 +- ...kbn_observability_synthetics_test_data.mdx | 2 +- api_docs/kbn_openapi_bundler.mdx | 2 +- api_docs/kbn_openapi_generator.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- api_docs/kbn_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- api_docs/kbn_presentation_publishing.mdx | 2 +- api_docs/kbn_product_doc_artifact_builder.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_hooks.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_recently_accessed.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.devdocs.json | 56 +++ api_docs/kbn_reporting_common.mdx | 4 +- api_docs/kbn_reporting_csv_share_panel.mdx | 2 +- api_docs/kbn_reporting_export_types_csv.mdx | 2 +- .../kbn_reporting_export_types_csv_common.mdx | 2 +- api_docs/kbn_reporting_export_types_pdf.mdx | 2 +- .../kbn_reporting_export_types_pdf_common.mdx | 2 +- api_docs/kbn_reporting_export_types_png.mdx | 2 +- .../kbn_reporting_export_types_png_common.mdx | 2 +- api_docs/kbn_reporting_mocks_server.mdx | 2 +- api_docs/kbn_reporting_public.mdx | 2 +- api_docs/kbn_reporting_server.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- .../kbn_response_ops_feature_flag_service.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rollup.mdx | 2 +- api_docs/kbn_router_to_openapispec.mdx | 2 +- api_docs/kbn_router_utils.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_screenshotting_server.mdx | 2 +- api_docs/kbn_search_api_keys_components.mdx | 2 +- api_docs/kbn_search_api_keys_server.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_errors.mdx | 2 +- .../kbn_search_index_documents.devdocs.json | 17 +- api_docs/kbn_search_index_documents.mdx | 4 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_search_shared_ui.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- api_docs/kbn_security_api_key_management.mdx | 2 +- api_docs/kbn_security_authorization_core.mdx | 2 +- ...kbn_security_authorization_core_common.mdx | 2 +- api_docs/kbn_security_form_components.mdx | 2 +- api_docs/kbn_security_hardening.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- api_docs/kbn_security_plugin_types_public.mdx | 2 +- api_docs/kbn_security_plugin_types_server.mdx | 2 +- .../kbn_security_role_management_model.mdx | 2 +- api_docs/kbn_security_solution_common.mdx | 2 +- ...kbn_security_solution_distribution_bar.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- api_docs/kbn_security_ui_components.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- .../kbn_server_route_repository_client.mdx | 2 +- .../kbn_server_route_repository_utils.mdx | 2 +- api_docs/kbn_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_error_boundary.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_tabbed_modal.mdx | 2 +- api_docs/kbn_shared_ux_table_persist.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_predicates.mdx | 2 +- api_docs/kbn_sse_utils.mdx | 2 +- api_docs/kbn_sse_utils_client.mdx | 2 +- api_docs/kbn_sse_utils_server.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_synthetics_e2e.mdx | 2 +- api_docs/kbn_synthetics_private_location.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_eui_helpers.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_try_in_console.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_unsaved_changes_badge.mdx | 2 +- api_docs/kbn_unsaved_changes_prompt.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_visualization_utils.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kbn_zod.mdx | 2 +- api_docs/kbn_zod_helpers.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/links.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/logs_data_access.mdx | 2 +- api_docs/logs_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/mock_idp_plugin.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.devdocs.json | 55 +-- api_docs/navigation.mdx | 4 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_a_i_assistant_app.mdx | 2 +- .../observability_ai_assistant_management.mdx | 2 +- api_docs/observability_logs_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 27 +- api_docs/presentation_panel.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/search_assistant.mdx | 2 +- api_docs/search_connectors.mdx | 2 +- api_docs/search_homepage.mdx | 2 +- api_docs/search_indices.mdx | 2 +- api_docs/search_inference_endpoints.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/slo.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 770 files changed, 2153 insertions(+), 872 deletions(-) create mode 100644 api_docs/kbn_manifest.devdocs.json create mode 100644 api_docs/kbn_manifest.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index cdcb26506e4fb..086dc91b415e8 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 6b06570b22c2e..094bdec905469 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index a36f6ed4c733f..41ac77f84104b 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 79a5cbcf4b668..17d1ceee9d7ff 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index b56ce09f5a7c6..b83d5f9c750cc 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index f9e57f499cc4f..a112234127df2 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 2b4a8680cb79b..339ebaf4f5389 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 0a84be10a6cfb..8d2ee365061c6 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index c4c3da3a973e4..9662a90c22627 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 6bb842a920512..433bd281157ca 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 57723fa2f92cc..2213f517514f7 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index b761675d10d87..315f75c88443a 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index a8fa73fc07ee3..536dd23ea5078 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 2159bde36f4e8..36bec7ada0161 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index 56bf635927f81..42a532fd51356 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index eab0a671337bd..de8694bc100a8 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index dac1a38ace329..ab22dfa3eb524 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index a032e6b89bf00..3e7ac9aefea9e 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index baeee421a368a..ad588bedc7bcc 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 4928618c3c501..241e70a6701f6 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index a4a4d5e6a846e..f296e4bcf45fe 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 872e84ea75337..b6e253bdeac20 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 238bef60b8c92..c2c1e120912d9 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index a95358c831aa4..3c8a78f752e00 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 73ae5db81d263..47dfc97f200df 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 38683da0ccb65..a01ba05a09591 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_usage.mdx b/api_docs/data_usage.mdx index d46c58a810081..b651ab5e4e5a0 100644 --- a/api_docs/data_usage.mdx +++ b/api_docs/data_usage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataUsage title: "dataUsage" image: https://source.unsplash.com/400x175/?github description: API docs for the dataUsage plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataUsage'] --- import dataUsageObj from './data_usage.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 073bc9547507c..857413c5dc8eb 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index ebb622497d54e..ad62738c38e82 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 7722a4747130a..ec29d2f07d6c2 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 101a1e3b6347e..402b8ebb7d47c 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 4a1bce2e873c1..6ef2c39902ba1 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index b7106ecd71edb..e1b82c70171f5 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 1085444d81bcf..6e1af31607b8d 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 727ce55666c2d..f5d2a6fcded41 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index e8bd07c2ff736..720346e389d94 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index d4df722270435..b1d46f78733f6 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 5c74f175bd3e9..35a9dc5f815e8 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 4620c4b367f3c..cdec938f3cdde 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 52005b9a652bf..ed34c9b7d26b0 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 52b286022e97a..4642fd072ef04 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index a46083b568577..5722396a73f0d 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 9badbdbbd73ab..4d2b6ae31ec33 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index e7aeb494115bf..01a48826572f0 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 9d5833e4930ab..0daf90c42d212 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index ab7c01c8baba5..85bbe03fac19d 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entities_data_access.mdx b/api_docs/entities_data_access.mdx index 269f9e486f8eb..8b5eb703ed019 100644 --- a/api_docs/entities_data_access.mdx +++ b/api_docs/entities_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entitiesDataAccess title: "entitiesDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the entitiesDataAccess plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entitiesDataAccess'] --- import entitiesDataAccessObj from './entities_data_access.devdocs.json'; diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index 3efb017b88d5d..838e66336d32a 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 7a8139c5084b6..5c7b2c44d3ed6 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index 0a4e71472551b..cf32accf6abb8 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index dcd3455efaf90..e2d1a850e9241 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index f0bc87481ba54..ee07f7105352c 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index d5d4e88b21859..5bbe6479f6116 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index eb98575646075..cd21281184379 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index f2d40e76eea41..2bf13bbbe7dba 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index ba925168a7013..774a05f8f345e 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index b24ad46bbc232..63c3151e8a1dd 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 0f5ff13bae446..eb18d1cac26ca 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 73dcaae94ddc0..7246080baa148 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 5aaaed7d9a97a..1593bc4d7c1fe 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index e9070cd4f8296..0ad608ac54949 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 512e82d8736bb..99d176b11ea2b 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 8b38be96a7915..e727fbb817adc 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 4ce3bbb7be629..6235ea045c712 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 4fbe2f75b37aa..205ba906c1fb1 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 763c056a7e1e8..1528b031ff485 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index fa3a012dfa129..2d0dce1478f38 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index a3e6a871f97b9..05039e00ed3f4 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index ee8466d3da988..6429e6986503f 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 1cb8ff75ef0a9..d7bd3ec4f6b15 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 3ab2d788ee27d..ce6582accf7d8 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index 901b430fe1c40..3092178667566 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index a55fff72efd49..e7084ec363d82 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index e28f687715420..341c9b85a3bee 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 7dfc8dad32253..e6f7f9266ebe9 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 277c99364ebfa..3ac36ec52b20b 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -29286,6 +29286,28 @@ "path": "x-pack/plugins/fleet/common/constants/routes.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.AGENT_POLICY_API_ROUTES.LIST_OUTPUTS_PATTERN", + "type": "string", + "tags": [], + "label": "LIST_OUTPUTS_PATTERN", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.AGENT_POLICY_API_ROUTES.INFO_OUTPUTS_PATTERN", + "type": "string", + "tags": [], + "label": "INFO_OUTPUTS_PATTERN", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -29604,6 +29626,54 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-common.agentPolicyRouteService.getInfoOutputsPath", + "type": "Function", + "tags": [], + "label": "getInfoOutputsPath", + "description": [], + "signature": [ + "(agentPolicyId: string) => string" + ], + "path": "x-pack/plugins/fleet/common/services/routes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.agentPolicyRouteService.getInfoOutputsPath.$1", + "type": "string", + "tags": [], + "label": "agentPolicyId", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/common/services/routes.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-common.agentPolicyRouteService.getListOutputsPath", + "type": "Function", + "tags": [], + "label": "getListOutputsPath", + "description": [], + "signature": [ + "() => string" + ], + "path": "x-pack/plugins/fleet/common/services/routes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 60381debad871..548b460dc8ee1 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1421 | 5 | 1296 | 76 | +| 1426 | 5 | 1301 | 76 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index a8f60431cb67e..f37e9ce8ff244 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 0ecca0763234a..da8b599277ae8 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 607a4958ace2d..f01667c56b793 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 432512e2979e4..4fb826bd28a4c 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 125dfbb2cae10..9e826a040da2f 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 9e7f3e917bc3f..12bf1efb4c41f 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/inference.mdx b/api_docs/inference.mdx index 97527d3567dc9..2cc82bfbeeae7 100644 --- a/api_docs/inference.mdx +++ b/api_docs/inference.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inference title: "inference" image: https://source.unsplash.com/400x175/?github description: API docs for the inference plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inference'] --- import inferenceObj from './inference.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 72ef37f7f3f9f..b02e0387ea23a 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 15926a846873b..281f262540933 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 6d40b8861ec3b..808171a931816 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index f1a323e938f27..c889bc987bf9f 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 4148a37c80817..8089b4ecf472f 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/inventory.mdx b/api_docs/inventory.mdx index 539128311167f..cd964bb303af5 100644 --- a/api_docs/inventory.mdx +++ b/api_docs/inventory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inventory title: "inventory" image: https://source.unsplash.com/400x175/?github description: API docs for the inventory plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inventory'] --- import inventoryObj from './inventory.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index eea11d331cd4c..b9434b646b026 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index 13a3541529b67..7f4ad6b2996d3 100644 --- a/api_docs/investigate_app.mdx +++ b/api_docs/investigate_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigateApp title: "investigateApp" image: https://source.unsplash.com/400x175/?github description: API docs for the investigateApp plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 6802a46bef8f3..52a3ccc639439 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant.mdx b/api_docs/kbn_ai_assistant.mdx index d8e894109e119..c164f3a2f7b56 100644 --- a/api_docs/kbn_ai_assistant.mdx +++ b/api_docs/kbn_ai_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant title: "@kbn/ai-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant'] --- import kbnAiAssistantObj from './kbn_ai_assistant.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant_common.mdx b/api_docs/kbn_ai_assistant_common.mdx index cb85a8ecf83b6..70642bebc98bc 100644 --- a/api_docs/kbn_ai_assistant_common.mdx +++ b/api_docs/kbn_ai_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant-common title: "@kbn/ai-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant-common'] --- import kbnAiAssistantCommonObj from './kbn_ai_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 1f1df44ae9e10..93e4da1c70d10 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index 74e7e66075aa5..f7b43cb4f8f2c 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index 1742608f46478..d2b7ee5839ea3 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 1022ceb8bbfac..e383c0fc293b7 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index 731c90e9d459a..1481276f9bb35 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 0da0fd93458e7..8490ebf322821 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index a59fbf87b7e21..784684738e7bc 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 575bc13aaeaf7..0e2b05414d1b9 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index ab9b48818aa54..14216cf909bb2 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 57f8a06c4d4c8..66459f898286c 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index cbfe9721dc84b..005033189b46b 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 1ef361c1b4ed6..0d6f7c704ebbd 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 3b545fcf90110..6cb8f7e168958 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index ba4b79b896dc4..9fbe9d77ce52a 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 5e7ff3a3a3727..4e17f1ae4ff8a 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.devdocs.json b/api_docs/kbn_apm_synthtrace_client.devdocs.json index 31e48f7188cfe..161efd033eb50 100644 --- a/api_docs/kbn_apm_synthtrace_client.devdocs.json +++ b/api_docs/kbn_apm_synthtrace_client.devdocs.json @@ -3476,6 +3476,379 @@ "trackAdoption": false } ] + }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s", + "type": "Object", + "tags": [], + "label": "k8s", + "description": [], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sClusterJobEntity", + "type": "Function", + "tags": [], + "label": "k8sClusterJobEntity", + "description": [], + "signature": [ + "({ schema, name, entityId, ...others }: { [key: string]: any; schema: ", + "Schema", + "; name: string; entityId: string; }) => ", + "K8sEntity" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sClusterJobEntity.$1", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ [key: string]: any; schema: ", + "Schema", + "; name: string; entityId: string; }" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/cluster_entity.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sCronJobEntity", + "type": "Function", + "tags": [], + "label": "k8sCronJobEntity", + "description": [], + "signature": [ + "({ schema, name, uid, clusterName, entityId, ...others }: { [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }) => ", + "K8sEntity" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sCronJobEntity.$1", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/cron_job_entity.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sDaemonSetEntity", + "type": "Function", + "tags": [], + "label": "k8sDaemonSetEntity", + "description": [], + "signature": [ + "({ schema, name, uid, clusterName, entityId, ...others }: { [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }) => ", + "K8sEntity" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sDaemonSetEntity.$1", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/daemon_set_entity.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sDeploymentEntity", + "type": "Function", + "tags": [], + "label": "k8sDeploymentEntity", + "description": [], + "signature": [ + "({ schema, name, uid, clusterName, entityId, ...others }: { [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }) => ", + "K8sEntity" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sDeploymentEntity.$1", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/deployment_entity.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sJobSetEntity", + "type": "Function", + "tags": [], + "label": "k8sJobSetEntity", + "description": [], + "signature": [ + "({ schema, name, uid, clusterName, entityId, ...others }: { [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }) => ", + "K8sEntity" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sJobSetEntity.$1", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/job_set_entity.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sNodeEntity", + "type": "Function", + "tags": [], + "label": "k8sNodeEntity", + "description": [], + "signature": [ + "({ schema, name, uid, clusterName, entityId, ...others }: { [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }) => ", + "K8sEntity" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sNodeEntity.$1", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/node_entity.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sPodEntity", + "type": "Function", + "tags": [], + "label": "k8sPodEntity", + "description": [], + "signature": [ + "({ schema, name, uid, clusterName, entityId, ...others }: { [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }) => ", + "K8sEntity" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sPodEntity.$1", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/pod_entity.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sReplicaSetEntity", + "type": "Function", + "tags": [], + "label": "k8sReplicaSetEntity", + "description": [], + "signature": [ + "({ schema, name, uid, clusterName, entityId, ...others }: { [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }) => ", + "K8sEntity" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sReplicaSetEntity.$1", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/replica_set.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sStatefulSetEntity", + "type": "Function", + "tags": [], + "label": "k8sStatefulSetEntity", + "description": [], + "signature": [ + "({ schema, name, uid, clusterName, entityId, ...others }: { [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }) => ", + "K8sEntity" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sStatefulSetEntity.$1", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ [key: string]: any; schema: ", + "Schema", + "; name: string; uid?: string | undefined; clusterName?: string | undefined; entityId: string; }" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/stateful_set.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sContainerEntity", + "type": "Function", + "tags": [], + "label": "k8sContainerEntity", + "description": [], + "signature": [ + "({ schema, id, entityId, ...others }: { [key: string]: any; schema: ", + "Schema", + "; id: string; entityId: string; }) => ", + "K8sEntity" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.entities.k8s.k8sContainerEntity.$1", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ [key: string]: any; schema: ", + "Schema", + "; id: string; entityId: string; }" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/entities/kubernetes/container_entity.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] } ], "initialIsOpen": false diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 3768637aa253b..444d4579c1bd5 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 247 | 0 | 247 | 36 | +| 268 | 0 | 268 | 38 | ## Common diff --git a/api_docs/kbn_apm_types.mdx b/api_docs/kbn_apm_types.mdx index eeefb6faa47e9..58d5838d248af 100644 --- a/api_docs/kbn_apm_types.mdx +++ b/api_docs/kbn_apm_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-types title: "@kbn/apm-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-types'] --- import kbnApmTypesObj from './kbn_apm_types.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 0f6d0fe1c4256..ef4dc7d1f8a0a 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_avc_banner.mdx b/api_docs/kbn_avc_banner.mdx index 7e55f69fb9362..e2322763b738f 100644 --- a/api_docs/kbn_avc_banner.mdx +++ b/api_docs/kbn_avc_banner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-avc-banner title: "@kbn/avc-banner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/avc-banner plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/avc-banner'] --- import kbnAvcBannerObj from './kbn_avc_banner.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 184ce5588d8b7..0c9c9de31eb39 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index e4d6358678c5f..7984983799ba7 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 61b42e2652eb0..4ddcd3da9dd18 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index 016286299a20d..3a619033e742c 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 66e07a1750564..0b375644eccb8 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cbor.mdx b/api_docs/kbn_cbor.mdx index f95013ef9b1f5..36f664b205ddf 100644 --- a/api_docs/kbn_cbor.mdx +++ b/api_docs/kbn_cbor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cbor title: "@kbn/cbor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cbor plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cbor'] --- import kbnCborObj from './kbn_cbor.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index c71328613270a..68d8a9ee88055 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index b5be35e170ce4..90d4a343a24cb 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index a8f658ecc0542..7d8f5dbf2a5bb 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index aa9820ee7afad..db1ea2a5fbd93 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index afb84d150bc8f..5e13f5fd5f252 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 2a6a5e676395f..3dcba3792b199 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index ef9416dbd1765..b419f3a6783ab 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture.mdx b/api_docs/kbn_cloud_security_posture.mdx index c403086428e28..3bfa05c7c9339 100644 --- a/api_docs/kbn_cloud_security_posture.mdx +++ b/api_docs/kbn_cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture title: "@kbn/cloud-security-posture" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture'] --- import kbnCloudSecurityPostureObj from './kbn_cloud_security_posture.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_common.mdx b/api_docs/kbn_cloud_security_posture_common.mdx index caeb5f80d41a3..f8e08d30d6491 100644 --- a/api_docs/kbn_cloud_security_posture_common.mdx +++ b/api_docs/kbn_cloud_security_posture_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-common title: "@kbn/cloud-security-posture-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 5c968fc61d241..0877ddd2eea25 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index 395a72ff0c48b..882fb4ead4615 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 3427fbc61f642..174423a95d79a 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 6c612c075f851..9c4d99c70de80 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 995979502de6d..2ee605c460cca 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 25f9c6928fd1b..53118952a89d2 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 701ffde784db8..5fb91b2d0c141 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 7a8754de39b59..a9aed94e07e8d 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_public.mdx b/api_docs/kbn_content_management_content_insights_public.mdx index af30a9f5486cc..dbfcbb7c4b397 100644 --- a/api_docs/kbn_content_management_content_insights_public.mdx +++ b/api_docs/kbn_content_management_content_insights_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-public title: "@kbn/content-management-content-insights-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-public plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-public'] --- import kbnContentManagementContentInsightsPublicObj from './kbn_content_management_content_insights_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_server.mdx b/api_docs/kbn_content_management_content_insights_server.mdx index 4ad3136ce4df6..8899cc3a4313a 100644 --- a/api_docs/kbn_content_management_content_insights_server.mdx +++ b/api_docs/kbn_content_management_content_insights_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-server title: "@kbn/content-management-content-insights-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-server'] --- import kbnContentManagementContentInsightsServerObj from './kbn_content_management_content_insights_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_public.mdx b/api_docs/kbn_content_management_favorites_public.mdx index efa46aba6cc31..8341e69175997 100644 --- a/api_docs/kbn_content_management_favorites_public.mdx +++ b/api_docs/kbn_content_management_favorites_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-public title: "@kbn/content-management-favorites-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-public plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-public'] --- import kbnContentManagementFavoritesPublicObj from './kbn_content_management_favorites_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_server.mdx b/api_docs/kbn_content_management_favorites_server.mdx index a1d248760dbdf..785da53c60ed8 100644 --- a/api_docs/kbn_content_management_favorites_server.mdx +++ b/api_docs/kbn_content_management_favorites_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-server title: "@kbn/content-management-favorites-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-server'] --- import kbnContentManagementFavoritesServerObj from './kbn_content_management_favorites_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 8713fbffc8881..de028e6598bd6 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 2175ed159a696..73b048e08154e 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index a5c070deb113e..9a3c865e005f8 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 44b64464e58b3..d2cf6ee91a84c 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index 2e8cbc9d245af..af6c3935e8c9b 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 37f9380b62124..59151eb6baadf 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 43db44e1f649b..f25dfb95fab47 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 1abe9b01009f6..bbf2d179dcbc5 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 9f53359ea78f5..3a74985beddf3 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 35a45a2c84481..964cbf910f03b 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index 2eb93a3e06a33..a3a6061eb3c60 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 51734aa3566b3..18ced0b6d02e5 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index 79638243a29d1..5f3a7ee2a8cc4 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index ab8e855a6bdf3..a094d806f8599 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index 911e0b27dfe01..2e58d19b70acb 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index e82149f1a2787..4f740160e82af 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 87e91d4973293..81f892e1bcff3 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 3f9f3eb704ac2..4314c27ccf92d 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index ea87314149349..a320e01a2f404 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 3d168d02eb3c5..81e7708376b0a 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 512ffddcdcdd6..e5098bd997ccb 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 354edd84e28b5..2d624c58510e3 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 3424a5bd7cc53..e2c3f323b26a3 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index 3ef5ff91962a1..531595ebc8193 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 66d98b16952f6..dadf8f470c8af 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index e1dd867f3447a..02c766cd79f14 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 051c89f4ec85e..5f77943d40f84 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.devdocs.json b/api_docs/kbn_core_chrome_browser.devdocs.json index f7a208fe6ec45..63ea89a56f6e3 100644 --- a/api_docs/kbn_core_chrome_browser.devdocs.json +++ b/api_docs/kbn_core_chrome_browser.devdocs.json @@ -3923,7 +3923,7 @@ "label": "CloudLinkId", "description": [], "signature": [ - "\"projects\" | \"userAndRoles\" | \"performance\" | \"billingAndSub\" | \"deployment\" | \"deployments\"" + "\"projects\" | \"deployment\" | \"userAndRoles\" | \"performance\" | \"billingAndSub\" | \"deployments\"" ], "path": "packages/core/chrome/core-chrome-browser/src/project_navigation.ts", "deprecated": false, @@ -3946,7 +3946,7 @@ "section": "def-public.CloudLink", "text": "CloudLink" }, - " | undefined; userAndRoles?: ", + " | undefined; deployment?: ", { "pluginId": "@kbn/core-chrome-browser", "scope": "public", @@ -3954,7 +3954,7 @@ "section": "def-public.CloudLink", "text": "CloudLink" }, - " | undefined; performance?: ", + " | undefined; userAndRoles?: ", { "pluginId": "@kbn/core-chrome-browser", "scope": "public", @@ -3962,7 +3962,7 @@ "section": "def-public.CloudLink", "text": "CloudLink" }, - " | undefined; billingAndSub?: ", + " | undefined; performance?: ", { "pluginId": "@kbn/core-chrome-browser", "scope": "public", @@ -3970,7 +3970,7 @@ "section": "def-public.CloudLink", "text": "CloudLink" }, - " | undefined; deployment?: ", + " | undefined; billingAndSub?: ", { "pluginId": "@kbn/core-chrome-browser", "scope": "public", diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index ba4ea662f35a7..c02da34256138 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index 83b62e0d54475..ff39e7962dbad 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index a031665720fb7..1df8dfa854c9a 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index f53c8ba399245..fd2baee1848ee 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 4d766aaaf0b11..2e2e8f78dab89 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 3c25a670f2c7d..c56ddefc9dec7 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 09e0b8013be00..079cf42867a04 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index c176fb4f4d133..3ef3462c99098 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index de6023b635192..e5c456d770914 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index 3623061cd4579..03ec12a9d8c1e 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 09a830e75fff6..cb5d44fbdcef6 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index cbfe1648fdfab..751bba4f52f98 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index d0ce93bfe82a0..52c094d4dd043 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.devdocs.json b/api_docs/kbn_core_deprecations_common.devdocs.json index d1055cac144e9..59c42fc7e5ed2 100644 --- a/api_docs/kbn_core_deprecations_common.devdocs.json +++ b/api_docs/kbn_core_deprecations_common.devdocs.json @@ -49,12 +49,15 @@ { "parentPluginId": "@kbn/core-deprecations-common", "id": "def-common.BaseDeprecationDetails.message", - "type": "string", + "type": "CompoundType", "tags": [], "label": "message", "description": [ "\nThe description message to be displayed for the deprecation.\nCheck the README for writing deprecations in `src/core/server/deprecations/README.mdx`" ], + "signature": [ + "string | string[]" + ], "path": "packages/core/deprecations/core-deprecations-common/src/types.ts", "deprecated": false, "trackAdoption": false @@ -85,7 +88,7 @@ "\n(optional) Used to identify between different deprecation types.\nExample use case: in Upgrade Assistant, we may want to allow the user to sort by\ndeprecation type or show each type in a separate tab.\n\nFeel free to add new types if necessary.\nPredefined types are necessary to reduce having similar definitions with different keywords\nacross kibana deprecations." ], "signature": [ - "\"config\" | \"feature\" | undefined" + "\"config\" | \"api\" | \"feature\" | undefined" ], "path": "packages/core/deprecations/core-deprecations-common/src/types.ts", "deprecated": false, @@ -133,7 +136,7 @@ "corrective action needed to fix this deprecation." ], "signature": [ - "{ api?: { path: string; method: \"POST\" | \"PUT\"; body?: { [key: string]: any; } | undefined; omitContextFromBody?: boolean | undefined; } | undefined; manualSteps: string[]; }" + "{ api?: { path: string; method: \"POST\" | \"PUT\"; body?: { [key: string]: any; } | undefined; omitContextFromBody?: boolean | undefined; } | undefined; manualSteps: string[]; mark_as_resolved_api?: { apiTotalCalls: number; totalMarkedAsResolved: number; timestamp: string | number | Date; routePath: string; routeMethod: string; routeVersion?: string | undefined; } | undefined; }" ], "path": "packages/core/deprecations/core-deprecations-common/src/types.ts", "deprecated": false, @@ -297,6 +300,8 @@ "text": "ConfigDeprecationDetails" }, " | ", + "ApiDeprecationDetails", + " | ", { "pluginId": "@kbn/core-deprecations-common", "scope": "common", diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index e1909389074b1..6a4fa95fe88b3 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 17 | 0 | 9 | 0 | +| 17 | 0 | 9 | 1 | ## Common diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index 1ff73df4f0dbd..fc4ccdfdddb83 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index 13e368dd3ff28..21518ac9a29e0 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 674406dca02f2..1a1355df10361 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index a3bab36e39853..97605f15b827f 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index 01f2db6be8ee7..26d575ee33126 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 3f527319436f6..3ffbb6cdb879b 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index 01358cc960861..c638293a2c85e 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 0a7dbeb28db3e..57dfbfdc906bb 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index a2299986a7dd6..405b267f514f5 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 6a1a58ab52ac9..64ac94db7fb8a 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index d7c966eb0723e..061c059daa9c8 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 7ed70888a5421..e7199cf6ffe7a 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 22fbf62d21691..6df6690e3457b 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index abd36dd70dbf1..28fa9b86a7578 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 32daa52d33021..e341059491bd7 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index dbf43b20ee462..054a5692f885b 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 0e014579b20c9..54b6932ecbe05 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 327ff550bc296..dbe12fc157179 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index f9e3057375635..67b7adfa617a1 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index a7bba3379f32d..2aa14b65ccb95 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index aca0f75a3ec42..0b278913b9db7 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index 414bcd8cf54b2..b65d59e89ca27 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 2cc6bc8f983f1..e66072b375616 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser.mdx b/api_docs/kbn_core_feature_flags_browser.mdx index 688c4e11b2e73..3e2ed93e38f83 100644 --- a/api_docs/kbn_core_feature_flags_browser.mdx +++ b/api_docs/kbn_core_feature_flags_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser title: "@kbn/core-feature-flags-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser'] --- import kbnCoreFeatureFlagsBrowserObj from './kbn_core_feature_flags_browser.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_internal.mdx b/api_docs/kbn_core_feature_flags_browser_internal.mdx index fc5d70ab082a4..a146bc963ad9a 100644 --- a/api_docs/kbn_core_feature_flags_browser_internal.mdx +++ b/api_docs/kbn_core_feature_flags_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-internal title: "@kbn/core-feature-flags-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-internal'] --- import kbnCoreFeatureFlagsBrowserInternalObj from './kbn_core_feature_flags_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_mocks.mdx b/api_docs/kbn_core_feature_flags_browser_mocks.mdx index faa012fe14afc..a7c37e6038174 100644 --- a/api_docs/kbn_core_feature_flags_browser_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-mocks title: "@kbn/core-feature-flags-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-mocks'] --- import kbnCoreFeatureFlagsBrowserMocksObj from './kbn_core_feature_flags_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server.mdx b/api_docs/kbn_core_feature_flags_server.mdx index f0bf8886ca2c3..337fe2d9570f0 100644 --- a/api_docs/kbn_core_feature_flags_server.mdx +++ b/api_docs/kbn_core_feature_flags_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server title: "@kbn/core-feature-flags-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server'] --- import kbnCoreFeatureFlagsServerObj from './kbn_core_feature_flags_server.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_internal.mdx b/api_docs/kbn_core_feature_flags_server_internal.mdx index 443f693d0e74d..405a96e6dbca1 100644 --- a/api_docs/kbn_core_feature_flags_server_internal.mdx +++ b/api_docs/kbn_core_feature_flags_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-internal title: "@kbn/core-feature-flags-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-internal'] --- import kbnCoreFeatureFlagsServerInternalObj from './kbn_core_feature_flags_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_mocks.mdx b/api_docs/kbn_core_feature_flags_server_mocks.mdx index 48bfccd1f6318..96c6686bc3743 100644 --- a/api_docs/kbn_core_feature_flags_server_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-mocks title: "@kbn/core-feature-flags-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-mocks'] --- import kbnCoreFeatureFlagsServerMocksObj from './kbn_core_feature_flags_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 1bb960c171989..01b6833115b1b 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 75bc19f9b4654..b0f4942993d4b 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index fe45fd7889850..59eaae56f20d9 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 6392d24097600..b614e22a858a6 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 7e548c4c52898..7111664eff044 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index f517e7f03aea5..3ae73f70441ce 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 4212152c2a940..6ff011b85f409 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index c5f47f6690e4a..48b617a3e4163 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index b1b64dc7efd8b..95533bbcded32 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.devdocs.json b/api_docs/kbn_core_http_router_server_internal.devdocs.json index 2991ec38b9a5b..219635cec955e 100644 --- a/api_docs/kbn_core_http_router_server_internal.devdocs.json +++ b/api_docs/kbn_core_http_router_server_internal.devdocs.json @@ -195,7 +195,7 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -282,7 +282,7 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -369,7 +369,7 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -456,7 +456,7 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -543,7 +543,7 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -560,8 +560,14 @@ "description": [], "signature": [ "() => ", - "VersionedRouterRoute", - "[]" + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.VersionedRouterRoute", + "text": "VersionedRouterRoute" + }, + "[]" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index bcc2a65057609..b3673acdf490f 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.devdocs.json b/api_docs/kbn_core_http_router_server_mocks.devdocs.json index 4d07feacb1943..df244e8c6f8c7 100644 --- a/api_docs/kbn_core_http_router_server_mocks.devdocs.json +++ b/api_docs/kbn_core_http_router_server_mocks.devdocs.json @@ -88,7 +88,7 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts", "deprecated": false, @@ -337,15 +337,15 @@ "section": "def-server.VersionedRouteConfig", "text": "VersionedRouteConfig" }, - "<\"delete\">], unknown>; } & ", + "<\"delete\">], unknown>; getRoutes: jest.MockInstance<", { "pluginId": "@kbn/core-http-server", "scope": "server", "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-server.VersionedRouter", - "text": "VersionedRouter" + "section": "def-server.VersionedRouterRoute", + "text": "VersionedRouterRoute" }, - " & { getRoute: (method: keyof ", + "[], [], unknown>; } & ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -353,15 +353,7 @@ "section": "def-server.VersionedRouter", "text": "VersionedRouter" }, - "<", - { - "pluginId": "@kbn/core-http-server", - "scope": "server", - "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-server.RequestHandlerContextBase", - "text": "RequestHandlerContextBase" - }, - ">, path: string) => ", + " & { getRoute: (method: \"get\" | \"delete\" | \"post\" | \"put\" | \"patch\", path: string) => ", { "pluginId": "@kbn/core-http-router-server-mocks", "scope": "server", @@ -576,7 +568,7 @@ "section": "def-server.RouterRoute", "text": "RouterRoute" }, - "[], [], unknown>; versioned: ", + "[], [options?: { excludeVersionedRoutes?: boolean | undefined; } | undefined], unknown>; versioned: ", { "pluginId": "@kbn/core-http-server", "scope": "server", diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 8dda65eb8661f..bfffd1aca4b13 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 176b0ed195353..2b48acb81ee21 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -400,6 +400,22 @@ "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.AddVersionOpts.options", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ deprecated?: ", + "RouteDeprecationInfo", + " | undefined; } | undefined" + ], + "path": "packages/core/http/core-http-server/src/versioning/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -2310,6 +2326,32 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.HttpServiceSetup.getDeprecatedRoutes", + "type": "Function", + "tags": [], + "label": "getDeprecatedRoutes", + "description": [ + "\nProvides a list of all registered deprecated routes {{@link RouterDeprecatedRouteDetails | information}}.\nThe routers will be evaluated everytime this function gets called to\naccommodate for any late route registrations" + ], + "signature": [ + "() => ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouterDeprecatedRouteDetails", + "text": "RouterDeprecatedRouteDetails" + }, + "[]" + ], + "path": "packages/core/http/core-http-server/src/http_contract.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false @@ -6359,6 +6401,10 @@ "plugin": "@kbn/core-ui-settings-server-internal", "path": "packages/core/ui-settings/core-ui-settings-server-internal/src/routes/internal/validate.ts" }, + { + "plugin": "@kbn/core-deprecations-server-internal", + "path": "packages/core/deprecations/core-deprecations-server-internal/src/routes/resolve_deprecated_api.ts" + }, { "plugin": "@kbn/core-capabilities-server-internal", "path": "packages/core/capabilities/core-capabilities-server-internal/src/routes/resolve_capabilities.ts" @@ -11253,7 +11299,7 @@ "section": "def-server.KibanaRequestRouteOptions", "text": "KibanaRequestRouteOptions" }, - ">; }" + ">; readonly routePath?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/router/request.ts", "deprecated": false, @@ -11444,6 +11490,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.KibanaRequest.apiVersion", + "type": "string", + "tags": [], + "label": "apiVersion", + "description": [ + "\nThe versioned route API version of this request." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/request.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.KibanaRequest.params", @@ -11651,6 +11713,20 @@ "path": "packages/core/http/core-http-server/src/router/request.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.KibanaRequestRoute.routePath", + "type": "string", + "tags": [], + "label": "routePath", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/request.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -11783,6 +11859,21 @@ "deprecated": false, "trackAdoption": false, "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.KibanaRouteOptions.deprecated", + "type": "Object", + "tags": [], + "label": "deprecated", + "description": [], + "signature": [ + "RouteDeprecationInfo", + " | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/request.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.KibanaRouteOptions.xsrfRequired", @@ -13323,14 +13414,15 @@ { "parentPluginId": "@kbn/core-http-server", "id": "def-server.RouteConfigOptions.deprecated", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "deprecated", "description": [ - "\nSetting this to `true` declares this route to be deprecated. Consumers SHOULD\nrefrain from usage of this route.\n" + "\nDescription of deprecations for this HTTP API.\n" ], "signature": [ - "boolean | undefined" + "RouteDeprecationInfo", + " | undefined" ], "path": "packages/core/http/core-http-server/src/router/route.ts", "deprecated": false, @@ -13536,6 +13628,87 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouterDeprecatedRouteDetails", + "type": "Interface", + "tags": [], + "label": "RouterDeprecatedRouteDetails", + "description": [], + "path": "packages/core/http/core-http-server/src/router/router.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouterDeprecatedRouteDetails.routeDeprecationOptions", + "type": "Object", + "tags": [], + "label": "routeDeprecationOptions", + "description": [], + "signature": [ + "RouteDeprecationInfo" + ], + "path": "packages/core/http/core-http-server/src/router/router.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouterDeprecatedRouteDetails.routeMethod", + "type": "CompoundType", + "tags": [], + "label": "routeMethod", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.SafeRouteMethod", + "text": "SafeRouteMethod" + }, + " | ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.DestructiveRouteMethod", + "text": "DestructiveRouteMethod" + } + ], + "path": "packages/core/http/core-http-server/src/router/router.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouterDeprecatedRouteDetails.routePath", + "type": "string", + "tags": [], + "label": "routePath", + "description": [], + "path": "packages/core/http/core-http-server/src/router/router.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouterDeprecatedRouteDetails.routeVersion", + "type": "string", + "tags": [], + "label": "routeVersion", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/router.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.RouterRoute", @@ -13727,6 +13900,20 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouterRoute.isVersioned", + "type": "boolean", + "tags": [], + "label": "isVersioned", + "description": [], + "signature": [ + "false" + ], + "path": "packages/core/http/core-http-server/src/router/router.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -15915,7 +16102,7 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -16226,7 +16413,7 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -17369,7 +17556,7 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -17516,7 +17703,7 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -17815,13 +18002,37 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, "trackAdoption": false } ] + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.VersionedRouter.getRoutes", + "type": "Function", + "tags": [], + "label": "getRoutes", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.VersionedRouterRoute", + "text": "VersionedRouterRoute" + }, + "[]" + ], + "path": "packages/core/http/core-http-server/src/versioning/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false @@ -17881,6 +18092,158 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.VersionedRouterRoute", + "type": "Interface", + "tags": [], + "label": "VersionedRouterRoute", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.VersionedRouterRoute", + "text": "VersionedRouterRoute" + }, + "" + ], + "path": "packages/core/http/core-http-server/src/versioning/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.VersionedRouterRoute.method", + "type": "string", + "tags": [], + "label": "method", + "description": [], + "path": "packages/core/http/core-http-server/src/versioning/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.VersionedRouterRoute.path", + "type": "string", + "tags": [], + "label": "path", + "description": [], + "path": "packages/core/http/core-http-server/src/versioning/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.VersionedRouterRoute.options", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ options?: Omit<", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteConfigOptions", + "text": "RouteConfigOptions" + }, + "<", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteMethod", + "text": "RouteMethod" + }, + ">, \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; security?: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteSecurity", + "text": "RouteSecurity" + }, + " | undefined; description?: string | undefined; summary?: string | undefined; access: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteAccess", + "text": "RouteAccess" + }, + "; discontinued?: string | undefined; enableQueryVersion?: boolean | undefined; }" + ], + "path": "packages/core/http/core-http-server/src/versioning/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.VersionedRouterRoute.handlers", + "type": "Array", + "tags": [], + "label": "handlers", + "description": [], + "signature": [ + "{ fn: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RequestHandler", + "text": "RequestHandler" + }, + "; options: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.AddVersionOpts", + "text": "AddVersionOpts" + }, + "; }[]" + ], + "path": "packages/core/http/core-http-server/src/versioning/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.VersionedRouterRoute.isVersioned", + "type": "boolean", + "tags": [], + "label": "isVersioned", + "description": [], + "signature": [ + "true" + ], + "path": "packages/core/http/core-http-server/src/versioning/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-server.VersionedRouteValidation", @@ -20716,7 +21079,7 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -20800,7 +21163,7 @@ "section": "def-server.RouteSecurity", "text": "RouteSecurity" }, - " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; deprecated?: boolean | undefined; discontinued?: string | undefined; }" + " | undefined; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; discontinued?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 0433311075e5c..3cfc5bbdce292 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 533 | 2 | 216 | 0 | +| 551 | 2 | 232 | 1 | ## Server diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 256971f6e639c..48a5e50cbf2a2 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.devdocs.json b/api_docs/kbn_core_http_server_mocks.devdocs.json index c395e16fc2bb2..ec3fe801a5673 100644 --- a/api_docs/kbn_core_http_server_mocks.devdocs.json +++ b/api_docs/kbn_core_http_server_mocks.devdocs.json @@ -332,7 +332,15 @@ "section": "def-server.OnPreResponseHandler", "text": "OnPreResponseHandler" }, - "], unknown>; } & Omit<", + "], unknown>; getDeprecatedRoutes: jest.MockInstance<", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouterDeprecatedRouteDetails", + "text": "RouterDeprecatedRouteDetails" + }, + "[], [], unknown>; } & Omit<", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -619,7 +627,19 @@ "section": "def-server.OnPreResponseHandler", "text": "OnPreResponseHandler" }, - "], unknown>; registerRouterAfterListening: jest.MockInstance; getDeprecatedRoutes: jest.MockInstance<", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouterDeprecatedRouteDetails", + "text": "RouterDeprecatedRouteDetails" + }, + "[], [], unknown>; registerOnPostValidation: jest.MockInstance, metadata: { deprecated: ", + "RouteDeprecationInfo", + "; }) => void], unknown>; registerRouterAfterListening: jest.MockInstance], unknown>; } & Omit<", + ">], unknown>; getRegisteredDeprecatedApis: jest.MockInstance<", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouterDeprecatedRouteDetails", + "text": "RouterDeprecatedRouteDetails" + }, + "[], [], unknown>; } & Omit<", "InternalHttpServiceSetup", ", \"createRouter\" | \"basePath\" | \"auth\" | \"staticAssets\" | \"authRequestHeaders\"> & { auth: AuthMocked; basePath: BasePathMocked; staticAssets: InternalStaticAssetsMocked; createRouter: jest.MockedFunction<(path: string) => ", { diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 6126d699d3522..3793a797714ba 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index d8b82a724f1ff..16eb6cd54bc4a 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 5e64fe1470f41..5cbe272cf84d3 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index 1e75e185cf51d..f909b471e70dd 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index ccf5a2aa506d2..5d6b70474e33f 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index 3b2a289c335a8..93820eb8d5c89 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index a286571d54a9f..1378fea456c64 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 582d04ca8ee7c..81587ac6062ac 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index 5826a743e640d..996f6ee99ccde 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index ba422887ec639..3766da8aafae4 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index d602e1b532cd2..fc71973cb1c0e 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 4e4e9da70eecd..675c84509790e 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 2c0029cdf28b5..067edc1860641 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index 3ec570cd0d33e..a47aa4a76e351 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index 2a7eb6856d6c6..d85f960999710 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 02752cd9df26a..6115724409c9e 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 8cc534ef0db85..acc13e824320a 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 38b5ee5896e75..ad7ee90d697b8 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index ef07b57d81ab8..a2c141f9bb48a 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 39b1e1e27cbcb..82f34b2379b1e 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index bb0ea69228d4c..7b279622c89c8 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index c8662172aff69..0eab62a34c347 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 236df60f2be94..9e17541707258 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 2ed365f88cdd2..5a134ed3b2a9f 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 9c5e60b22a87a..3a06f2adbab3f 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index a675c4c3710c5..481f6598c3aaa 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index b1d0ccf13d90c..9be973ce9bfea 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index ae4b3eb997188..a2f75e37c59e0 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index 4500160a8c2d9..00ef0fc184366 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index 5183a53d3156b..6fd26fe8edd0e 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index bbe78933a932f..80aeef9a0b5cc 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index aee8dd4ccb10d..85615b191c104 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 421da01f1b388..af85e91701405 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index ff39cd993b467..e938f81e2007f 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index d01f1fe2c57a7..1d0b8dcce372d 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 94803d5aa25a8..02738d2f74e78 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 0799fb2c78e4e..317604117eb70 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 8c3c73a68218d..a33d03e46898d 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 79daef636ad30..b4762dde256cd 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 3a8d76838e175..c6a001d0fbf84 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 766a8df3b0163..09c4eb802b98b 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index cc04723f053d3..b2a076aab3896 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 32e56b8229988..ec8aaf2dbd646 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index 9d4d9d2dfe23a..f1dde07e72cac 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index e15bad49aab44..13341ccd8d403 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index f9b5e9a6b44cf..25f8cb87b40e7 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 2af5fc8259e5f..f7878cd496e33 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 4822a5a8e33e2..74ef74b4c0894 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 2ce28c38e754c..904d1a5c73bd3 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index 75013aad69a2d..b8ff19201e047 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index 4e9638394dde7..5e82279f2ff86 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index f0ff5a88c576f..82f61ada0343d 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index cb6233e13d02e..1d8a0a080e148 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index d42b2f8028c66..c640abd7302e3 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index 26e1126b75239..061a0f16624d9 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 25c00e9a5465b..992856657c001 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index ec5c9173ef8f8..c30b20912f219 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index e3bd6e8ac2177..26b59b25e3340 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 6959ef867d9a6..49d9a6cd3fd72 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 8b2e1e7ce40af..c97eb121023a0 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 487e492555d10..f71529dae07a7 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 7ddcd08239c78..f96934f4c0960 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index 6d2c3325f5bc0..e92b1d7332c50 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index 00e19b23ce05e..b7d6b7da289e1 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index 7c2d32647bb60..c455b4cccc2fb 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index 1c8b2237d6f3a..99e04cfb530b9 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index 95a530380a8de..a360d6e4fd9ae 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index 38e822d9c79cd..ba837b3b8baee 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index 5975730b5df46..130e01e34a474 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index b87f2ff96acc5..01de7991a4162 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index c1c8fccd04e47..1ec92f65eb805 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index 22364f442826a..39870e5beaaba 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index e132b273d83c3..73100e126d083 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index 2aac7d1ce7cc4..196ae614d7c7d 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 5abf29052327c..bbfbf3ec39811 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 9777f11f4b82d..49e728a8f7ee4 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 9311be0e77edd..5144cb6e6f970 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 9f1f5faf5c722..f3fb8f2ef0f85 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index d2ced9027972f..d3b44ce5edeac 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index d6d9671cdf7e4..265c66d935333 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 321c3d9678588..a5219fe5e8ab2 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index bbb8155a127ca..89d859f973f69 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 3d64e36c6baf6..d95034fd001a3 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index a967bf6c29fe2..0b229a86bd042 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 9afb2822199c2..190a865f60254 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 1ea0575eebccf..22d022b4dedca 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 4277ecd003673..a6a4e491aad3b 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index 93023a698123f..478448114cc24 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index 4b85e4c8b6888..a0501fe3df557 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.devdocs.json b/api_docs/kbn_core_usage_data_server.devdocs.json index 4ba0e9204206d..f9604e3bebfc9 100644 --- a/api_docs/kbn_core_usage_data_server.devdocs.json +++ b/api_docs/kbn_core_usage_data_server.devdocs.json @@ -98,6 +98,75 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-usage-data-server", + "id": "def-server.CoreDeprecatedApiUsageStats", + "type": "Interface", + "tags": [], + "label": "CoreDeprecatedApiUsageStats", + "description": [], + "path": "packages/core/usage-data/core-usage-data-server/src/core_usage_stats.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-usage-data-server", + "id": "def-server.CoreDeprecatedApiUsageStats.apiId", + "type": "string", + "tags": [], + "label": "apiId", + "description": [], + "path": "packages/core/usage-data/core-usage-data-server/src/core_usage_stats.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-usage-data-server", + "id": "def-server.CoreDeprecatedApiUsageStats.totalMarkedAsResolved", + "type": "number", + "tags": [], + "label": "totalMarkedAsResolved", + "description": [], + "path": "packages/core/usage-data/core-usage-data-server/src/core_usage_stats.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-usage-data-server", + "id": "def-server.CoreDeprecatedApiUsageStats.markedAsResolvedLastCalledAt", + "type": "string", + "tags": [], + "label": "markedAsResolvedLastCalledAt", + "description": [], + "path": "packages/core/usage-data/core-usage-data-server/src/core_usage_stats.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-usage-data-server", + "id": "def-server.CoreDeprecatedApiUsageStats.apiTotalCalls", + "type": "number", + "tags": [], + "label": "apiTotalCalls", + "description": [], + "path": "packages/core/usage-data/core-usage-data-server/src/core_usage_stats.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-usage-data-server", + "id": "def-server.CoreDeprecatedApiUsageStats.apiLastCalledAt", + "type": "string", + "tags": [], + "label": "apiLastCalledAt", + "description": [], + "path": "packages/core/usage-data/core-usage-data-server/src/core_usage_stats.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-usage-data-server", "id": "def-server.CoreEnvironmentUsageData", @@ -327,9 +396,7 @@ "parentPluginId": "@kbn/core-usage-data-server", "id": "def-server.CoreUsageDataSetup", "type": "Interface", - "tags": [ - "note" - ], + "tags": [], "label": "CoreUsageDataSetup", "description": [ "\nInternal API for registering the Usage Tracker used for Core's usage data payload.\n" @@ -385,6 +452,52 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-usage-data-server", + "id": "def-server.CoreUsageDataSetup.registerDeprecatedUsageFetch", + "type": "Function", + "tags": [], + "label": "registerDeprecatedUsageFetch", + "description": [], + "signature": [ + "(fetchFn: ", + { + "pluginId": "@kbn/core-usage-data-server", + "scope": "server", + "docId": "kibKbnCoreUsageDataServerPluginApi", + "section": "def-server.DeprecatedApiUsageFetcher", + "text": "DeprecatedApiUsageFetcher" + }, + ") => void" + ], + "path": "packages/core/usage-data/core-usage-data-server/src/setup_contract.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-usage-data-server", + "id": "def-server.CoreUsageDataSetup.registerDeprecatedUsageFetch.$1", + "type": "Function", + "tags": [], + "label": "fetchFn", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-usage-data-server", + "scope": "server", + "docId": "kibKbnCoreUsageDataServerPluginApi", + "section": "def-server.DeprecatedApiUsageFetcher", + "text": "DeprecatedApiUsageFetcher" + } + ], + "path": "packages/core/usage-data/core-usage-data-server/src/setup_contract.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false @@ -2288,6 +2401,62 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-usage-data-server", + "id": "def-server.DeprecatedApiUsageFetcher", + "type": "Type", + "tags": [], + "label": "DeprecatedApiUsageFetcher", + "description": [], + "signature": [ + "(params: { soClient: ", + { + "pluginId": "@kbn/core-saved-objects-api-server", + "scope": "server", + "docId": "kibKbnCoreSavedObjectsApiServerPluginApi", + "section": "def-server.ISavedObjectsRepository", + "text": "ISavedObjectsRepository" + }, + "; }) => Promise<", + { + "pluginId": "@kbn/core-usage-data-server", + "scope": "server", + "docId": "kibKbnCoreUsageDataServerPluginApi", + "section": "def-server.CoreDeprecatedApiUsageStats", + "text": "CoreDeprecatedApiUsageStats" + }, + "[]>" + ], + "path": "packages/core/usage-data/core-usage-data-server/src/setup_contract.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/core-usage-data-server", + "id": "def-server.DeprecatedApiUsageFetcher.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "{ soClient: ", + { + "pluginId": "@kbn/core-saved-objects-api-server", + "scope": "server", + "docId": "kibKbnCoreSavedObjectsApiServerPluginApi", + "section": "def-server.ISavedObjectsRepository", + "text": "ISavedObjectsRepository" + }, + "; }" + ], + "path": "packages/core/usage-data/core-usage-data-server/src/setup_contract.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false } ], "objects": [] diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 8abbc146f4f9c..6fe28913f2a34 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 155 | 0 | 144 | 0 | +| 165 | 0 | 154 | 0 | ## Server diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 53d37a422c76e..84d6dce63672f 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.devdocs.json b/api_docs/kbn_core_usage_data_server_mocks.devdocs.json index 7ab368476bc35..d32fdca291d8c 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.devdocs.json +++ b/api_docs/kbn_core_usage_data_server_mocks.devdocs.json @@ -93,7 +93,15 @@ "section": "def-server.CoreUsageStats", "text": "CoreUsageStats" }, - ">, [], unknown>; incrementSavedObjectsBulkCreate: jest.MockInstance, [options: ", + ">, [], unknown>; getDeprecatedApiUsageStats: jest.MockInstance, [], unknown>; incrementDeprecatedApi: jest.MockInstance, [counterName: string, options: { resolved?: boolean | undefined; incrementBy?: number | undefined; }], unknown>; incrementSavedObjectsBulkCreate: jest.MockInstance, [options: ", "BaseIncrementOptions", "], unknown>; incrementSavedObjectsBulkGet: jest.MockInstance, [options: ", "BaseIncrementOptions", diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index 7f9c8f9b6ca93..844771af3608e 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 864082a5bcf5d..7532b55af8515 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index 7263336f6a024..5316c6118fc50 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 73c516372ac16..0f11d19c24aea 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index c2e52a088c736..10836469ed162 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index d43ab94d09baa..4ffaaff5bfe04 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index eda33c00bc49e..5b51427cd672c 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index 2f29aedf606de..356afcbab8b67 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 6b45827c78bfd..76e7109acd934 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 4e8b691bb7003..82e7ab380a748 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index cffef30fe1ec2..3e0fa9bf5d4b1 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 23e17bf2d02dc..b83fcf61f044c 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 9bf56811554a7..9f663407eaf8c 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index f6489372ff2e3..ae0f788539315 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index ebec751030331..9a00fe84f8863 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index fa91cfc4d3e8a..2629ad96f3114 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 93693e6e09cf5..d18c2f5ac0c02 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index 4132b16f82655..5613bf12b696b 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 85972ebbf504a..70668ec224d39 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 2fc12904d763a..3ab5b5295c3b8 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index d90f7f70e8ac5..ff663a097042e 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 6f841f6f07bca..7f3e6ef8d4f5e 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index 57332f6425e33..1bbb51fdc3d1d 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index ee6a5c94bc1d0..885502c27a406 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 478ee5b3decec..e3da77c2c9c79 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 11426db6e3566..de08fc3ec294a 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index bc17346e31af7..2b29b0d3017e2 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index ded50fb4a51a1..ee710ec947f74 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index 1a65f27abc1e4..d6815fac16393 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 9c9d346457c90..f41051dc93d52 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 2dd4ae977b2dc..b20f5bb5811b9 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 6491bfd53450e..6b2b6e027e614 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 504283a91abf5..f2046def2cd30 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 1e4f3aaa0e448..7603bd12a3236 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 772158edd6af8..0d838f3ff43b5 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 286bb62e808bb..b7ad5b49e3b56 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 677a9a154c2f5..0f707300ec763 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 68e6615e4383f..0836f9212736f 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 64921d8506edf..35a6d45a72177 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 8bcc828c8546a..9c8d117d82cd9 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 6e7153490fc3f..571324a4e88b8 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 8f5d16bffabe4..e7d20bbf6b793 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index e972044e986b1..3ad3b42350c3a 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index d290ccfd52ef6..eaee0a7b617a9 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 494a651e9f18e..f75c56f0c3c5d 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index 69b72f7f74614..a237509f05591 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 3d23c1fd039e1..30d5beaa5515f 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 5e6133738583c..eb65f6efb5d6d 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index f148792b3c4e7..fa37d599b6279 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index f6b38721942d3..79c39564ec545 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 7bee1862638b0..a32af69363664 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 07708c9ef9203..284a48cc3c5db 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 254b382c15e0c..36c728a36f14d 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.devdocs.json b/api_docs/kbn_esql_ast.devdocs.json index 5d8e934eb8994..cac01fac9555d 100644 --- a/api_docs/kbn_esql_ast.devdocs.json +++ b/api_docs/kbn_esql_ast.devdocs.json @@ -487,6 +487,67 @@ ], "returnComment": [] }, + { + "parentPluginId": "@kbn/esql-ast", + "id": "def-common.BasicPrettyPrinter.simplifyMultiplicationByOne", + "type": "Function", + "tags": [], + "label": "simplifyMultiplicationByOne", + "description": [], + "signature": [ + "(node: ", + { + "pluginId": "@kbn/esql-ast", + "scope": "common", + "docId": "kibKbnEsqlAstPluginApi", + "section": "def-common.ESQLSingleAstItem", + "text": "ESQLSingleAstItem" + }, + ", minusCount?: number) => string | undefined" + ], + "path": "packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/esql-ast", + "id": "def-common.BasicPrettyPrinter.simplifyMultiplicationByOne.$1", + "type": "CompoundType", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "@kbn/esql-ast", + "scope": "common", + "docId": "kibKbnEsqlAstPluginApi", + "section": "def-common.ESQLSingleAstItem", + "text": "ESQLSingleAstItem" + } + ], + "path": "packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/esql-ast", + "id": "def-common.BasicPrettyPrinter.simplifyMultiplicationByOne.$2", + "type": "number", + "tags": [], + "label": "minusCount", + "description": [], + "signature": [ + "number" + ], + "path": "packages/kbn-esql-ast/src/pretty_print/basic_pretty_printer.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "@kbn/esql-ast", "id": "def-common.BasicPrettyPrinter.visitor", diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index 625509d02bfa0..343cf5cea540f 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 266 | 1 | 208 | 34 | +| 269 | 1 | 211 | 34 | ## Common diff --git a/api_docs/kbn_esql_editor.mdx b/api_docs/kbn_esql_editor.mdx index 51ef9afc634a4..ed71a80ed11bd 100644 --- a/api_docs/kbn_esql_editor.mdx +++ b/api_docs/kbn_esql_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-editor title: "@kbn/esql-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-editor plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-editor'] --- import kbnEsqlEditorObj from './kbn_esql_editor.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 4ebe962f9439a..15aeb10b64833 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 193bd95bee56d..ebd0f86e6a87f 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index d6afc3b87e189..c08ad2d303880 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 6ee0841e09a27..c98ab9de56aff 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 78564d8b01de6..a34ac2b1772e5 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 71d6621ce781b..d655980b6198d 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 9ae6a644e4590..21d346979b6e0 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 5d3bf128fcab1..3729b6b529726 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx index 39161ed5bd6f2..9c26fad7579df 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 16dc49d361b7a..5d5edbb421415 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 4b76cc8b12bab..d746dcf6c1ee7 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 135de4ebde8b3..88c5da95797a1 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 0805bfcdf422a..8c102e5ffb44e 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index d33d5d0a84e5c..55b63c26c7883 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grid_layout.mdx b/api_docs/kbn_grid_layout.mdx index 97203fd7a4e8d..d08510cfe9146 100644 --- a/api_docs/kbn_grid_layout.mdx +++ b/api_docs/kbn_grid_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grid-layout title: "@kbn/grid-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grid-layout plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grid-layout'] --- import kbnGridLayoutObj from './kbn_grid_layout.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index 1f797791202a7..287f035d02383 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 6cdebec418986..769ad16a2f40e 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 32ed0b433c073..44445cbae253d 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index a7970bc0a8951..44e84764ace7d 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index a525f99873c26..40b0d1689b6d7 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 9778685de55fd..a5bd00eb22f81 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index d04725b0e55f4..5264ef503fc2d 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 8d775fb5eb577..86a6311d2a306 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 5335fcad0de65..659eba74ea166 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index df4c9a154bd5f..6fd53de34047d 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management_shared_types.mdx b/api_docs/kbn_index_management_shared_types.mdx index e619e036fb1f0..a2574f6b29860 100644 --- a/api_docs/kbn_index_management_shared_types.mdx +++ b/api_docs/kbn_index_management_shared_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management-shared-types title: "@kbn/index-management-shared-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management-shared-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management-shared-types'] --- import kbnIndexManagementSharedTypesObj from './kbn_index_management_shared_types.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index b669b0166c326..14e63a7ca5251 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 58c525bda283b..08ffb112321b7 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 9c80d96185174..e1119f9b6d3b1 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index 9bdf9f66056c3..64fa1d7454eb9 100644 --- a/api_docs/kbn_investigation_shared.mdx +++ b/api_docs/kbn_investigation_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-investigation-shared title: "@kbn/investigation-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/investigation-shared plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/investigation-shared'] --- import kbnInvestigationSharedObj from './kbn_investigation_shared.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index a2e70b41ef33e..61b2ee4fb0c48 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index 45decbae3a3eb..be01616222844 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_item_buffer.mdx b/api_docs/kbn_item_buffer.mdx index 135772fbde867..6eca637c561b2 100644 --- a/api_docs/kbn_item_buffer.mdx +++ b/api_docs/kbn_item_buffer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-item-buffer title: "@kbn/item-buffer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/item-buffer plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/item-buffer'] --- import kbnItemBufferObj from './kbn_item_buffer.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 1fc41a0554135..25a2c7bf39fef 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index 329485f4cc88a..b384fb4fd04be 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 7444cf0fc55f2..e636f9eda15b7 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index faeff6e944a52..6ab15f200e8cd 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.devdocs.json b/api_docs/kbn_kibana_manifest_schema.devdocs.json index e9509c172d6e8..296e6527f7bcb 100644 --- a/api_docs/kbn_kibana_manifest_schema.devdocs.json +++ b/api_docs/kbn_kibana_manifest_schema.devdocs.json @@ -989,6 +989,104 @@ } ] }, + { + "parentPluginId": "@kbn/kibana-manifest-schema", + "id": "def-common.MANIFEST_V2.properties.group", + "type": "Object", + "tags": [], + "label": "group", + "description": [], + "path": "packages/kbn-kibana-manifest-schema/src/kibana_json_v2_schema.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/kibana-manifest-schema", + "id": "def-common.MANIFEST_V2.properties.group.enum", + "type": "Array", + "tags": [], + "label": "enum", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-kibana-manifest-schema/src/kibana_json_v2_schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/kibana-manifest-schema", + "id": "def-common.MANIFEST_V2.properties.group.description", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "path": "packages/kbn-kibana-manifest-schema/src/kibana_json_v2_schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/kibana-manifest-schema", + "id": "def-common.MANIFEST_V2.properties.group.default", + "type": "string", + "tags": [], + "label": "default", + "description": [], + "path": "packages/kbn-kibana-manifest-schema/src/kibana_json_v2_schema.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/kibana-manifest-schema", + "id": "def-common.MANIFEST_V2.properties.visibility", + "type": "Object", + "tags": [], + "label": "visibility", + "description": [], + "path": "packages/kbn-kibana-manifest-schema/src/kibana_json_v2_schema.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/kibana-manifest-schema", + "id": "def-common.MANIFEST_V2.properties.visibility.enum", + "type": "Array", + "tags": [], + "label": "enum", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-kibana-manifest-schema/src/kibana_json_v2_schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/kibana-manifest-schema", + "id": "def-common.MANIFEST_V2.properties.visibility.description", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "path": "packages/kbn-kibana-manifest-schema/src/kibana_json_v2_schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/kibana-manifest-schema", + "id": "def-common.MANIFEST_V2.properties.visibility.default", + "type": "string", + "tags": [], + "label": "default", + "description": [], + "path": "packages/kbn-kibana-manifest-schema/src/kibana_json_v2_schema.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, { "parentPluginId": "@kbn/kibana-manifest-schema", "id": "def-common.MANIFEST_V2.properties.devOnly", diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index d148a56200697..23c82f22047ce 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kiban | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 108 | 0 | 107 | 0 | +| 116 | 0 | 115 | 0 | ## Common diff --git a/api_docs/kbn_language_documentation.mdx b/api_docs/kbn_language_documentation.mdx index 4968cc51a8c85..30ac4f4c4700b 100644 --- a/api_docs/kbn_language_documentation.mdx +++ b/api_docs/kbn_language_documentation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation title: "@kbn/language-documentation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation'] --- import kbnLanguageDocumentationObj from './kbn_language_documentation.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 76cb1d414fa89..482caa2c1b967 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 2f173726d5b2f..ca6a531bde925 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 2d68262b5da12..92f6f33ce7b49 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index ccc4f099b20d9..31c6a4200476f 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index 49b2445a25ee8..a84bd5b5adf38 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 18517f837f82b..daa0edba16b4f 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 288e9f381d500..2820f77567156 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index bcbf9008e3883..5c81e069f793f 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index 2e9131afcd2c7..18ff351bd0894 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 06cc931a07834..db24e5df33bbd 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 0bce8891a2ac4..265e6b05579ce 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 0f79c6ca2d16b..1eef2b307fff2 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index f2c4aacfe915f..43b61728fec52 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 51d70700b9fd9..d10c6275c7361 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index a967ceea13f33..1197351be5a93 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 1493515592525..9bb669a65a9a9 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index 8abcad04d83e2..c3adef2b30de1 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index de95c998c86fd..2720a7b68cbfe 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_manifest.devdocs.json b/api_docs/kbn_manifest.devdocs.json new file mode 100644 index 0000000000000..d5098e14db2bf --- /dev/null +++ b/api_docs/kbn_manifest.devdocs.json @@ -0,0 +1,47 @@ +{ + "id": "@kbn/manifest", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/manifest", + "id": "def-server.runKbnManifestCli", + "type": "Function", + "tags": [], + "label": "runKbnManifestCli", + "description": [ + "\nA CLI to manipulate Kibana package manifest files" + ], + "signature": [ + "() => void" + ], + "path": "packages/kbn-manifest/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_manifest.mdx b/api_docs/kbn_manifest.mdx new file mode 100644 index 0000000000000..701c94824c8c6 --- /dev/null +++ b/api_docs/kbn_manifest.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnManifestPluginApi +slug: /kibana-dev-docs/api/kbn-manifest +title: "@kbn/manifest" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/manifest plugin +date: 2024-10-23 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/manifest'] +--- +import kbnManifestObj from './kbn_manifest.devdocs.json'; + + + +Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 1 | 0 | 0 | 0 | + +## Server + +### Functions + + diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index c04953a7435ac..98de155206042 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index a5b258019f37b..2aeb8f6080cad 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 992b3a0c083af..d04107c481375 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 92983870454d6..fcb0e68bf6f36 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index e8dc739abdce1..2ca1a387547c1 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index abea7b929ee00..795ec79c3e1c8 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index eafaf68a02cf5..40985831652d3 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 0eebb6ba983bc..fb7c66e45880f 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 55ad195a65c45..fa008ba8445c1 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 8342e2b3557e7..f62be719afc5c 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 34fd72c37c824..50486b789de61 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index cf4d88ab1fb5d..7d9f10b5ba477 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_field_stats_flyout.mdx b/api_docs/kbn_ml_field_stats_flyout.mdx index e9ea48091905c..d6470180e010a 100644 --- a/api_docs/kbn_ml_field_stats_flyout.mdx +++ b/api_docs/kbn_ml_field_stats_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-field-stats-flyout title: "@kbn/ml-field-stats-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-field-stats-flyout plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-field-stats-flyout'] --- import kbnMlFieldStatsFlyoutObj from './kbn_ml_field_stats_flyout.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 8d8fdffa219a1..9ee8c41f82b23 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index cf6644abdc034..8386ff75586e0 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 1b6bea67b5c31..26da72a924e9f 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index a69a78b7a180d..f467b44a4f08a 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index b0349a49914ce..4d844697c3344 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index 9704c768dcc08..635ce00feae8a 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index 5e7a0bf70316d..ecffdbf4fba30 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_parse_interval.mdx b/api_docs/kbn_ml_parse_interval.mdx index 09c38d05ad53d..c28f00d61ad78 100644 --- a/api_docs/kbn_ml_parse_interval.mdx +++ b/api_docs/kbn_ml_parse_interval.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-parse-interval title: "@kbn/ml-parse-interval" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-parse-interval plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-parse-interval'] --- import kbnMlParseIntervalObj from './kbn_ml_parse_interval.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 15e985b28d7a5..2b87406107560 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index cee21727718f7..1ca830e0e04df 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 3e36659760b58..bca7d10654381 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index 5461bd78fc7ac..e5b8f230d38f2 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index bf585d5dd1912..9865b072fdf14 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index 117d37264b844..f3c73e365f533 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 48682095883d0..65d9f74292b34 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 9e9d596acaf7c..9e22cee8e6bdd 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 7d1ec73eb8629..bfb7db77ec93e 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_ml_validators.mdx b/api_docs/kbn_ml_validators.mdx index 2483a8d2d3ee5..089fd47272cc5 100644 --- a/api_docs/kbn_ml_validators.mdx +++ b/api_docs/kbn_ml_validators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-validators title: "@kbn/ml-validators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-validators plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-validators'] --- import kbnMlValidatorsObj from './kbn_ml_validators.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 6b2f53570bf6c..d3cd4e13073ce 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 07c12af29972d..dc626ad8492b5 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 1c491a5d31ab1..4d15309731dd0 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_object_versioning_utils.mdx b/api_docs/kbn_object_versioning_utils.mdx index ff89a07625a7b..6b4731d6b77be 100644 --- a/api_docs/kbn_object_versioning_utils.mdx +++ b/api_docs/kbn_object_versioning_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning-utils title: "@kbn/object-versioning-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning-utils'] --- import kbnObjectVersioningUtilsObj from './kbn_object_versioning_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 09005e1014f7c..6f7fd9448b9a3 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_rule_utils.mdx b/api_docs/kbn_observability_alerting_rule_utils.mdx index 6cbf6e568676b..a4909cef8ac5a 100644 --- a/api_docs/kbn_observability_alerting_rule_utils.mdx +++ b/api_docs/kbn_observability_alerting_rule_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-rule-utils title: "@kbn/observability-alerting-rule-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-rule-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-rule-utils'] --- import kbnObservabilityAlertingRuleUtilsObj from './kbn_observability_alerting_rule_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 0c06069408741..60227e84201e5 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index 21610ab232867..cd099c16473db 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_observability_logs_overview.mdx b/api_docs/kbn_observability_logs_overview.mdx index 18a2d64769a82..1d288f077cd1e 100644 --- a/api_docs/kbn_observability_logs_overview.mdx +++ b/api_docs/kbn_observability_logs_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-logs-overview title: "@kbn/observability-logs-overview" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-logs-overview plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-logs-overview'] --- import kbnObservabilityLogsOverviewObj from './kbn_observability_logs_overview.devdocs.json'; diff --git a/api_docs/kbn_observability_synthetics_test_data.mdx b/api_docs/kbn_observability_synthetics_test_data.mdx index f7d0ae2e26748..018ca688ec568 100644 --- a/api_docs/kbn_observability_synthetics_test_data.mdx +++ b/api_docs/kbn_observability_synthetics_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-synthetics-test-data title: "@kbn/observability-synthetics-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-synthetics-test-data plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-synthetics-test-data'] --- import kbnObservabilitySyntheticsTestDataObj from './kbn_observability_synthetics_test_data.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index d988f50fd43c6..7b87d48fe3a25 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index bca0a657ee65e..8d1dad787fa9d 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 971544cfea089..53d44e62876fc 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index 816fb94c3fc64..9a70bab522f7a 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index e09125c4c34ec..c25daa030b7c9 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 6f90cf1953843..0faedb06d0be6 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 7e2d17c3f97c0..ef190c222fffe 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index 852000262e28e..fc5c65896dffb 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 7df8c47b7ed3f..e085fb1556604 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index eac4ad9e54d70..8a9c9b8af87ba 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index 236c9b5d26a73..544ebcc88f5b6 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index da055d89ddbc4..0be85e7d48eb8 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_product_doc_artifact_builder.mdx b/api_docs/kbn_product_doc_artifact_builder.mdx index 1b25de9e3e507..e3ae09c7a122d 100644 --- a/api_docs/kbn_product_doc_artifact_builder.mdx +++ b/api_docs/kbn_product_doc_artifact_builder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-product-doc-artifact-builder title: "@kbn/product-doc-artifact-builder" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/product-doc-artifact-builder plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/product-doc-artifact-builder'] --- import kbnProductDocArtifactBuilderObj from './kbn_product_doc_artifact_builder.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 7abb4dc7cd6cf..1c38918dae4f4 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 3ea9834b3d7da..e845fba51eba6 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index dc2696d6a5321..e8ae5484895b7 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index 6cec99462dd1a..103b80256875b 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index ede5a137b5c51..b5f72707daf28 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index 33291be69d423..8e3be04d309fa 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 279b96d218736..c0c26b5f8adf5 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index c94ac2938a9b9..6b1974a6dd74b 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index 1bb1a0ee36b28..53d592bbb7535 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index c1a35f3a6228a..c401af9213205 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index a0c1b5e74776c..7a833ea6508ad 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 248fa203007b3..f8c7cbd52bc65 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index cb519b1e2f8d2..3f18186f7d896 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index 0dcddda8cf31c..dc69fdff1248e 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 00ca1c52bc0f2..e431fa380894e 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.devdocs.json b/api_docs/kbn_reporting_common.devdocs.json index 7139afb78c24e..b7b20c613c82a 100644 --- a/api_docs/kbn_reporting_common.devdocs.json +++ b/api_docs/kbn_reporting_common.devdocs.json @@ -758,6 +758,62 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.ReportingSavedObjectNotFoundError", + "type": "Class", + "tags": [], + "label": "ReportingSavedObjectNotFoundError", + "description": [], + "signature": [ + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.ReportingSavedObjectNotFoundError", + "text": "ReportingSavedObjectNotFoundError" + }, + " extends ", + { + "pluginId": "@kbn/reporting-common", + "scope": "common", + "docId": "kibKbnReportingCommonPluginApi", + "section": "def-common.ReportingError", + "text": "ReportingError" + } + ], + "path": "packages/kbn-reporting/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.ReportingSavedObjectNotFoundError.code", + "type": "string", + "tags": [], + "label": "code", + "description": [], + "signature": [ + "\"reporting_saved_object_not_found_error\"" + ], + "path": "packages/kbn-reporting/common/errors.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/reporting-common", + "id": "def-common.ReportingSavedObjectNotFoundError.code", + "type": "string", + "tags": [], + "label": "code", + "description": [], + "path": "packages/kbn-reporting/common/errors.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/reporting-common", "id": "def-common.UnknownError", diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index 1ae4233d88382..bacbadd071a1a 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 96 | 0 | 86 | 13 | +| 99 | 0 | 89 | 13 | ## Common diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index d21b90368cbdc..0fee8b5f8f191 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index b919dd0947d42..8e01711eff9bd 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index c4419a291e0bd..a19ca891c8559 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 33031ccc8fa88..cc6e879b08d22 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index 4185d0009078b..fbd7a6eeec632 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 7c4112db6980d..8740a98329d9e 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 350e6c9ebe98d..251ee85580d57 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 2a5d299dac670..cf00f6402142d 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index a01f17bef4a94..a6b1728182ef7 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index fb4239439dc41..66eb40bdf13af 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index d47a74ecebf7b..01e739b2eea59 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index 7f54270110255..27107dd30cca2 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 6614b305b55a9..7fa1a5feb45aa 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index b76f4b5724970..71c199c3e73f6 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index 4deeda9306ef8..b9d2fdf7eadbf 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 082a3b3e90b1d..6cde5255c91e9 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 9438e4e78c1ef..4525652490018 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 17ed3bfe8c968..56f7328d4e074 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 864a63c3966e1..b282c94a80ed1 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_screenshotting_server.mdx b/api_docs/kbn_screenshotting_server.mdx index 188122da3dd0f..e3082f75b86b5 100644 --- a/api_docs/kbn_screenshotting_server.mdx +++ b/api_docs/kbn_screenshotting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-screenshotting-server title: "@kbn/screenshotting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/screenshotting-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_components.mdx b/api_docs/kbn_search_api_keys_components.mdx index ac74dc87774fb..2845fb1e18728 100644 --- a/api_docs/kbn_search_api_keys_components.mdx +++ b/api_docs/kbn_search_api_keys_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-components title: "@kbn/search-api-keys-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-components plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-components'] --- import kbnSearchApiKeysComponentsObj from './kbn_search_api_keys_components.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_server.mdx b/api_docs/kbn_search_api_keys_server.mdx index 8c468a0184bfc..1de1e5ce0833b 100644 --- a/api_docs/kbn_search_api_keys_server.mdx +++ b/api_docs/kbn_search_api_keys_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-server title: "@kbn/search-api-keys-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-server'] --- import kbnSearchApiKeysServerObj from './kbn_search_api_keys_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index a07ea609236b9..0d8cd756524fd 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index fa9ea8e99b4ef..c93d99c924c28 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 600e8aafb2795..de23e2c15d3c9 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.devdocs.json b/api_docs/kbn_search_index_documents.devdocs.json index 7f2b1b151d792..47d7e742f5e90 100644 --- a/api_docs/kbn_search_index_documents.devdocs.json +++ b/api_docs/kbn_search_index_documents.devdocs.json @@ -101,7 +101,7 @@ "section": "def-server.ElasticsearchClient", "text": "ElasticsearchClient" }, - ", indexName: string, query?: string | undefined, from?: number, size?: number) => Promise<", + ", indexName: string, query?: string | undefined, from?: number, size?: number, trackTotalHits?: boolean) => Promise<", { "pluginId": "@kbn/search-index-documents", "scope": "common", @@ -197,6 +197,21 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "@kbn/search-index-documents", + "id": "def-common.fetchSearchResults.$6", + "type": "boolean", + "tags": [], + "label": "trackTotalHits", + "description": [], + "signature": [ + "boolean" + ], + "path": "packages/kbn-search-index-documents/lib/fetch_search_results.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true } ], "returnComment": [], diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 6d9c97f7365d8..a2966a0a1de69 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-ki | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 35 | 0 | 33 | 3 | +| 36 | 0 | 34 | 3 | ## Common diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index bfe1816a9ffe2..bba562bcd6858 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_shared_ui.mdx b/api_docs/kbn_search_shared_ui.mdx index c94dc0c525e0d..c090540247403 100644 --- a/api_docs/kbn_search_shared_ui.mdx +++ b/api_docs/kbn_search_shared_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-shared-ui title: "@kbn/search-shared-ui" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-shared-ui plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-shared-ui'] --- import kbnSearchSharedUiObj from './kbn_search_shared_ui.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index df378c53d7dc3..bea8417e0a117 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index f58b166637af6..a407b3a320008 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core.mdx b/api_docs/kbn_security_authorization_core.mdx index dc114cdcb9880..645692ea79acb 100644 --- a/api_docs/kbn_security_authorization_core.mdx +++ b/api_docs/kbn_security_authorization_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core title: "@kbn/security-authorization-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core'] --- import kbnSecurityAuthorizationCoreObj from './kbn_security_authorization_core.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core_common.mdx b/api_docs/kbn_security_authorization_core_common.mdx index 05bed52c0f360..0b4d75e73399a 100644 --- a/api_docs/kbn_security_authorization_core_common.mdx +++ b/api_docs/kbn_security_authorization_core_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core-common title: "@kbn/security-authorization-core-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core-common'] --- import kbnSecurityAuthorizationCoreCommonObj from './kbn_security_authorization_core_common.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index 2d15a288366dd..8df41faa758a8 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index fafaa7a6151f8..8a87c1292040e 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 5bf405f636499..bf3b8968baf10 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 9178ef625d301..a0d87552a9d57 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 4b6f8a26edad7..4018d70c6d645 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_role_management_model.mdx b/api_docs/kbn_security_role_management_model.mdx index 1598eb157f77e..b960e7eaf0587 100644 --- a/api_docs/kbn_security_role_management_model.mdx +++ b/api_docs/kbn_security_role_management_model.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-role-management-model title: "@kbn/security-role-management-model" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-role-management-model plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-role-management-model'] --- import kbnSecurityRoleManagementModelObj from './kbn_security_role_management_model.devdocs.json'; diff --git a/api_docs/kbn_security_solution_common.mdx b/api_docs/kbn_security_solution_common.mdx index 27bf28d16850e..ed71112055d49 100644 --- a/api_docs/kbn_security_solution_common.mdx +++ b/api_docs/kbn_security_solution_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-common title: "@kbn/security-solution-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-common plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-common'] --- import kbnSecuritySolutionCommonObj from './kbn_security_solution_common.devdocs.json'; diff --git a/api_docs/kbn_security_solution_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index 3e8de225d9c68..22f592b865a7e 100644 --- a/api_docs/kbn_security_solution_distribution_bar.mdx +++ b/api_docs/kbn_security_solution_distribution_bar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-distribution-bar title: "@kbn/security-solution-distribution-bar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-distribution-bar plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-distribution-bar'] --- import kbnSecuritySolutionDistributionBarObj from './kbn_security_solution_distribution_bar.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 49527e05721c6..da597df7a665a 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 1b86f2b851b7c..c4dd4be12b0ac 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 03934b286203d..3ac0297baf840 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index af9d2c4227e08..2edf044b74ecc 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_security_ui_components.mdx b/api_docs/kbn_security_ui_components.mdx index 0f652723561c7..395cb8ee28de8 100644 --- a/api_docs/kbn_security_ui_components.mdx +++ b/api_docs/kbn_security_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-ui-components title: "@kbn/security-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-ui-components plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-ui-components'] --- import kbnSecurityUiComponentsObj from './kbn_security_ui_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index a2c1aa8fd811e..5c95bdff7aa90 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 2969e11c04f15..bb5c5dbca6893 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index c84e603a2d4e8..541f09ae22e1c 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index e29c43229c7a6..d998e3e27889d 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 629424fb18b75..79d7c389abff9 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index a75e60ba3fa85..21e81d69d6b9b 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 6660f08563591..d9cc4737b69c3 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index ab375f06389e8..b05412b82e335 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index c67ce3ce810aa..d51e39b13a264 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 06b60edb298f0..d915a9b69e451 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index ed4c421b96bb8..6319a128d2614 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 1f76ee7f0b03a..347e4fac556c2 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index a32253b5b6996..a7ea5658579a9 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 4dd287a92f4ff..eedf19f5a2fa6 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index dd7fdc995b6f9..4d87ee04c6f58 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 6d406abda987a..02c105f935d4b 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index c7e659c1ef337..7a979fbfb7d61 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 8c173bbc0f921..9d3397d0fe297 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 310b07c2f5662..f02ba4e265299 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_client.mdx b/api_docs/kbn_server_route_repository_client.mdx index 37ee023c84a1c..2acbfa062be9c 100644 --- a/api_docs/kbn_server_route_repository_client.mdx +++ b/api_docs/kbn_server_route_repository_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-client title: "@kbn/server-route-repository-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-client plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-client'] --- import kbnServerRouteRepositoryClientObj from './kbn_server_route_repository_client.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_utils.mdx b/api_docs/kbn_server_route_repository_utils.mdx index 75f10c1ac000e..f97dff4c17dbf 100644 --- a/api_docs/kbn_server_route_repository_utils.mdx +++ b/api_docs/kbn_server_route_repository_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-utils title: "@kbn/server-route-repository-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-utils'] --- import kbnServerRouteRepositoryUtilsObj from './kbn_server_route_repository_utils.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 4264fe3b41a36..f10ab15b9f5d0 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 77b6ac3dddd42..fcdebd2eebe2c 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index b10db9b61c91f..8f391f3544136 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index 8c06941b27e97..b5c1cc82e5ac5 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index b38a2f7d589b9..9f32d4fc2f8e0 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 6610e36a3cb88..8a36d8e0c5661 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 856bd2ec92939..d4f4af2f2da48 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index b804966794803..50e6a08b4ade4 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 0b8ddd044c5f0..feacdc2632c64 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index bcac3baa8ee0d..5c03b638fd399 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index e668bd2fb5d63..2cb58f6b51a91 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index ed1ea09c8f8a8..2016787a52e26 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index d0c9a4ac32cc0..7e2b6b8278fe3 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index c85cf8bdd9c9f..0c6210a159c78 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index d69102a26d153..d637a3f43b5a2 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index fa572554a4364..52de3be77d0f1 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 7e75bd0265db2..c4f449d777950 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index af929a71368d8..2e378c4b106d1 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index b7e97d39038a2..5bff7c819d44e 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index 8c5406e4e8252..1ea10c9a51389 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 5fceb058fec19..5fd9689dac140 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 81403cae8909b..7c2f668bda7b5 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 37fe11c6d56d4..e577b4e51f263 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 80bd122459640..85ffed06259b1 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index e794758716f82..249a01345a304 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index 44575cf2c4665..64676d962241e 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 9f26d46ef203e..3d64299f00a30 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index d859d19167801..51ca52e3ffb19 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index bc4bfac7b610b..9dcb53ba039ab 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index 3e33f69f0184b..e2e9c1add3798 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index cb951509ec57c..b1dc8932eacb0 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index c80b4c984ecae..93abefa86666b 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 0b2d6c921ee63..57577e25afd73 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 8d38a0dbc7ad9..9cf3ebda4ecdc 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 0080ad6aee0f3..af6c8529e934d 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index 1517ab415f6ac..bd9d5a5208973 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index d6d68305187c0..c9597f8c72bc3 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 6a8dbc7d21368..3096f8a41022e 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 3c7d6cd8fc844..745031615d988 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 685b9584e11e4..444e65400d4f7 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index fbb5a5269b008..10985ea8ec3f5 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index e82b40b6d8097..eba8d5338ce9c 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 89329f36da0e5..ee2c8ffcf6e6d 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index 5d6eee710bdf3..3ec1c45272058 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index 13e9b4d965368..c0b05ef26e750 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_table_persist.mdx b/api_docs/kbn_shared_ux_table_persist.mdx index 72732b67f8cb2..d85a2f11f18dd 100644 --- a/api_docs/kbn_shared_ux_table_persist.mdx +++ b/api_docs/kbn_shared_ux_table_persist.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-table-persist title: "@kbn/shared-ux-table-persist" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-table-persist plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-table-persist'] --- import kbnSharedUxTablePersistObj from './kbn_shared_ux_table_persist.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 89a390d4c1afb..5b05d2802688f 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index d84b117f3573a..2d9c8b39007f5 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 6b09ea82ce21e..72554d86c0120 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 3fdf88a37ba3d..f7d01de3eaca0 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_sse_utils.mdx b/api_docs/kbn_sse_utils.mdx index 1e8c5262aef8f..390356a88c393 100644 --- a/api_docs/kbn_sse_utils.mdx +++ b/api_docs/kbn_sse_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils title: "@kbn/sse-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils'] --- import kbnSseUtilsObj from './kbn_sse_utils.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_client.mdx b/api_docs/kbn_sse_utils_client.mdx index 6d39d1e27d909..dc062aec05a15 100644 --- a/api_docs/kbn_sse_utils_client.mdx +++ b/api_docs/kbn_sse_utils_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-client title: "@kbn/sse-utils-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-client plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-client'] --- import kbnSseUtilsClientObj from './kbn_sse_utils_client.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_server.mdx b/api_docs/kbn_sse_utils_server.mdx index 543affac55eb3..cb21174d88223 100644 --- a/api_docs/kbn_sse_utils_server.mdx +++ b/api_docs/kbn_sse_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-server title: "@kbn/sse-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-server plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-server'] --- import kbnSseUtilsServerObj from './kbn_sse_utils_server.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index cad88942bedee..c91da1c57f34b 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index bd1002c67119d..d3afb906db3ea 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 796d9e8510855..4cc9d348971e5 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_synthetics_e2e.mdx b/api_docs/kbn_synthetics_e2e.mdx index a7d39de24af35..6650bf1e9a14d 100644 --- a/api_docs/kbn_synthetics_e2e.mdx +++ b/api_docs/kbn_synthetics_e2e.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-e2e title: "@kbn/synthetics-e2e" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-e2e plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-e2e'] --- import kbnSyntheticsE2eObj from './kbn_synthetics_e2e.devdocs.json'; diff --git a/api_docs/kbn_synthetics_private_location.mdx b/api_docs/kbn_synthetics_private_location.mdx index cdf37117f0260..5b14270220c3e 100644 --- a/api_docs/kbn_synthetics_private_location.mdx +++ b/api_docs/kbn_synthetics_private_location.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-private-location title: "@kbn/synthetics-private-location" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-private-location plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-private-location'] --- import kbnSyntheticsPrivateLocationObj from './kbn_synthetics_private_location.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 71b29d4060865..2b8aedeb17cc7 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 8e34cdcd7c89b..3c00cb23fd793 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index 224e0c169922c..ad306a1a08b30 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 29febf0df47c6..520050e16b6fe 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index f4207d572b733..24627dfba473c 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index bb13f4337466a..994c0cff4a192 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 30f382910df35..75a98aff73f2a 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index fb2a44e49b250..c65634c3cdeeb 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index 51c01d775d293..9e8586522336c 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 9c581c5a53139..b57f4230e3f0c 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index da88acab22f3d..83133ef76f906 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 01d6c1a420181..867d3998e892f 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 6bdd65c457910..0d9ddbfcde4cb 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index c81bbd52a1b15..d1576c1df19c3 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index f9eb81699615d..4818f43faf153 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index f5433e9781be4..f276e041a5f13 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index e4290b6b040e0..b863d2fb06c57 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index ea3c8c2866f61..df6802ed7e2e1 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index fba9890199563..c6d34ba101195 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index e43b0238842c6..fa4c695d8645d 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index a936b065fa89e..d66a002bb400a 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index e89e1c68efd3b..0a77846295acc 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index 3f529820ecb03..264f8539a7b71 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index b916813b37f2e..532f7e5b523e6 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 7925519564c7c..7c896ed630cdb 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 333980dd09ce1..62fe4a021507c 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index a2246d3caae5b..644c5e1a649f3 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 979cb4a70bf9d..a8b7180cf8ea0 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod.mdx b/api_docs/kbn_zod.mdx index 70c76cb5e2a24..0ed259a048ee0 100644 --- a/api_docs/kbn_zod.mdx +++ b/api_docs/kbn_zod.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod title: "@kbn/zod" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod'] --- import kbnZodObj from './kbn_zod.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 2e7c6759d1bba..6af4c06c27bef 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index d8ee39257300d..89caa9dbe1d9f 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 68dc3db270a99..5e53dac5b9d0e 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index a6185f402e9d7..0d907a9afd1d5 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 9d6decce120c3..24e8cd3fca7af 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index c162ec5866ad0..e20eb3653649b 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 97562a0e6e272..9e7d375dfdfc1 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 65174058b7b38..a44f54ae80c6a 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index cbef10848f0fb..93fc2d5722995 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 8f74b43bbcb5d..deb58685cf52a 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index d1bd5fedbfe1b..4d800922b99a9 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index 0020f949df0b7..ae0f1aeaa80f3 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 2afde38ca0d0d..800ab4c6b6e99 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 7714991e37aaf..48875daaa5c3b 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 8eb08b1d62103..db34cfcd1182a 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 8256542d3d7e0..c97533264c26f 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 9c0c54181a4ce..ddd07a7730286 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index adc6dce0402c9..ad85e5d55e5cc 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index cd92f7017293a..c1bdac945d38c 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index 5edd58a1bf047..5563cc25439eb 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 8165a72f02fe1..9ee000563088b 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 9e204245b7458..11b2df7046175 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.devdocs.json b/api_docs/navigation.devdocs.json index 339e145f24c30..d1c3a65dac7cc 100644 --- a/api_docs/navigation.devdocs.json +++ b/api_docs/navigation.devdocs.json @@ -368,15 +368,7 @@ "label": "TopNavMenuItems", "description": [], "signature": [ - "({ config, className, }: { config: ", - { - "pluginId": "navigation", - "scope": "public", - "docId": "kibNavigationPluginApi", - "section": "def-public.TopNavMenuData", - "text": "TopNavMenuData" - }, - "[] | undefined; className?: string | undefined; }) => React.JSX.Element | null" + "({ config, className, popoverBreakpoints, }: TopNavMenuItemsProps) => React.JSX.Element | null" ], "path": "src/plugins/navigation/public/top_nav_menu/top_nav_menu_items.tsx", "deprecated": false, @@ -387,48 +379,15 @@ "id": "def-public.TopNavMenuItems.$1", "type": "Object", "tags": [], - "label": "{\n config,\n className,\n}", + "label": "{\n config,\n className,\n popoverBreakpoints,\n}", "description": [], + "signature": [ + "TopNavMenuItemsProps" + ], "path": "src/plugins/navigation/public/top_nav_menu/top_nav_menu_items.tsx", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "navigation", - "id": "def-public.TopNavMenuItems.$1.config", - "type": "Array", - "tags": [], - "label": "config", - "description": [], - "signature": [ - { - "pluginId": "navigation", - "scope": "public", - "docId": "kibNavigationPluginApi", - "section": "def-public.TopNavMenuData", - "text": "TopNavMenuData" - }, - "[] | undefined" - ], - "path": "src/plugins/navigation/public/top_nav_menu/top_nav_menu_items.tsx", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "navigation", - "id": "def-public.TopNavMenuItems.$1.className", - "type": "string", - "tags": [], - "label": "className", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/navigation/public/top_nav_menu/top_nav_menu_items.tsx", - "deprecated": false, - "trackAdoption": false - } - ] + "isRequired": true } ], "returnComment": [], @@ -976,7 +935,7 @@ "section": "def-public.MountPoint", "text": "MountPoint" }, - " | undefined) => void) | undefined; }" + " | undefined) => void) | undefined; popoverBreakpoints?: string[] | undefined; }" ], "path": "src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx", "deprecated": false, diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index f35924b446e07..27b3ea3f0d23a 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 57 | 0 | 55 | 4 | +| 55 | 0 | 53 | 4 | ## Client diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index f40600ca5085d..c4e160739760c 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index bd54f40c6451f..4909322b5f73c 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index dd7e3d43cfce3..ae5405998423b 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index b443903f3eca9..83dcaff4d1d55 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 588ba1c9dadc5..bcf7238135c15 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index d1d0d6d19d590..48f6ec595ba47 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index a12c88298e3bf..c39b37df500ac 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index 4c567799ca7c7..f83c9d80f6698 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index c0fca97af1367..53bed513c8715 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 1bff987d33fc1..725a062db1007 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 20fb34470067e..88456c91d166f 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index 282c43217d219..0cdafdd26c03c 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 5ba71242b62bd..a35c1a05f74ed 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 874 | 746 | 45 | +| 875 | 747 | 45 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 53926 | 242 | 40512 | 2004 | +| 53994 | 242 | 40577 | 2008 | ## Plugin Directory @@ -103,7 +103,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 88 | 0 | 88 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 240 | 0 | 24 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 3 | 0 | 3 | 0 | -| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1421 | 5 | 1296 | 76 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1426 | 5 | 1301 | 76 | | ftrApis | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 72 | 0 | 14 | 5 | | globalSearchBar | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 0 | 0 | 0 | 0 | @@ -148,7 +148,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 2 | 0 | 2 | 0 | | | [@elastic/stack-monitoring](https://github.com/orgs/elastic/teams/stack-monitoring) | - | 15 | 3 | 13 | 1 | | | [@elastic/stack-monitoring](https://github.com/orgs/elastic/teams/stack-monitoring) | - | 9 | 0 | 9 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 57 | 0 | 55 | 4 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 55 | 0 | 53 | 4 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | @@ -260,7 +260,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 18 | 0 | 18 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 4 | 0 | 4 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 86 | 0 | 86 | 11 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 247 | 0 | 247 | 36 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 268 | 0 | 268 | 38 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 337 | 0 | 336 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 11 | 0 | 11 | 0 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 3 | 0 | 3 | 0 | @@ -331,7 +331,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 3 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 6 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 9 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 9 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 16 | 0 | 13 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 3 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 6 | 0 | @@ -372,7 +372,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 54 | 7 | 54 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 15 | 0 | 15 | 1 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 533 | 2 | 216 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 551 | 2 | 232 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 96 | 0 | 83 | 10 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 46 | 0 | 45 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 2 | 0 | @@ -463,7 +463,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 42 | 1 | 24 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 20 | 1 | 19 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 155 | 0 | 144 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 165 | 0 | 154 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 8 | 0 | 8 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 29 | 0 | 4 | 0 | @@ -518,7 +518,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 271 | 1 | 210 | 14 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 29 | 0 | 29 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 266 | 1 | 208 | 34 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 269 | 1 | 211 | 34 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 29 | 0 | 12 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 79 | 0 | 71 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 202 | 0 | 190 | 12 | @@ -557,7 +557,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 87 | 0 | 79 | 6 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 41 | 2 | 35 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 9 | 0 | 7 | 0 | -| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 108 | 0 | 107 | 0 | +| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 116 | 0 | 115 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 11 | 0 | 7 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 193 | 0 | 190 | 6 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 172 | 0 | 172 | 1 | @@ -577,6 +577,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 88 | 0 | 10 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 56 | 0 | 6 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 2 | 0 | 0 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 0 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 592 | 1 | 1 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 2 | 0 | 2 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 95 | 1 | 0 | 0 | @@ -646,7 +647,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 40 | 0 | 38 | 5 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 0 | 9 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 6 | 0 | 6 | 1 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 96 | 0 | 86 | 13 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 99 | 0 | 89 | 13 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 13 | 0 | 13 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 52 | 0 | 52 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 25 | 0 | 21 | 0 | @@ -672,7 +673,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 76 | 0 | 76 | 0 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 3929 | 0 | 3929 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 1 | 17 | 1 | -| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 35 | 0 | 33 | 3 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 36 | 0 | 34 | 3 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 20 | 0 | 18 | 1 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 50 | 0 | 25 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 6188b3e244ac9..d28928d9d7b46 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index ba1d578bee570..0e95d62d360eb 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index b870ee4e9db04..ae8e04b077b43 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index e5f6b6cd5e847..f4da3f0070988 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 2436457724a6e..e82704d6719b3 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 9465b38e3fbd2..f64c5dd406531 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 82e31c7ce74fc..e953d84a014e8 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 62f09cc3d9c77..987f5ab06c2ac 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 820c215bcb4ea..b155f8dcc25d5 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 63c4273fb837e..993dd40ebc3d0 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 73091b76c31f8..38ec230e70303 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index b459f34794a70..edbd31275d247 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 2531dde77c2a2..061cd64ee667f 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index eb5c6b8d9ce1c..fed7164e22ecb 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 5cb0939bda311..31aec7280c720 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 94bbb78878302..11cb91a52679a 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 8dde46afdd098..3ae33f5280a9a 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_assistant.mdx b/api_docs/search_assistant.mdx index db4b8c6bdc5e2..bb8277ffcc6fa 100644 --- a/api_docs/search_assistant.mdx +++ b/api_docs/search_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchAssistant title: "searchAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the searchAssistant plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchAssistant'] --- import searchAssistantObj from './search_assistant.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index ee10979316ec0..57bce6557ef5c 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index 521a8787dfb23..ca792560dac70 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_indices.mdx b/api_docs/search_indices.mdx index 048ef641738f4..71149f0526577 100644 --- a/api_docs/search_indices.mdx +++ b/api_docs/search_indices.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchIndices title: "searchIndices" image: https://source.unsplash.com/400x175/?github description: API docs for the searchIndices plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchIndices'] --- import searchIndicesObj from './search_indices.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index 1acfd9569473e..cda9aea2d5d0d 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 847d0b86878d0..c9ec072e31cea 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index ec54edd81de7e..82824168be9be 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 78109bb35320e..acafa149b5dfd 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 6ef5b6e401017..7e9f8d67b7df7 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 00cceb7e4502b..071bc473f2d76 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 75351b08d9669..ac7994c0f70dd 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 81c5b3522da87..160077d47ed37 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index e4428073f460d..64350dd1762f2 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index d6d38498dcdf2..f8e9805d1dca0 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 21a85dc1bdc77..d158f70ffc914 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 613f6e915c9b9..301f22da7099c 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index 3aa27b1c14171..288e796fc9f2c 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index bf30f5171e288..c227cd6b521ea 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index be7bd2a17dd65..5cbab96cd73d1 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 12734e8fc52d6..706deaed61aa6 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index c76654fd5049b..001b54e5324b4 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 49ba693218e37..9e92f0545ddcd 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 51343aef7e857..4b10e1b6625e8 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 6d9a2ae35af94..1a97ff3ddca80 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index cedee388bb046..7a68033c55b9f 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 4d0733b871af8..57dd1d582df8e 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index ffe088d4aedc4..1305052edfb9a 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index e5d0d55890db8..366d08dc22185 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 7dfa9cb9d4efe..5c58ce988ce89 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index c1849c4d585f0..511df7c0bcb3a 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 2f77630396124..b3209b954f339 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index de13e87996fad..2533be85ee20c 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 3fa77ed4a2bf0..8ca3470dd6f6f 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 36286be79ac35..e0012036d3739 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 1931e1a60e0e3..c0348936979b0 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 64061d2147f9c..16131c2c79919 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index ec33e9e770dbb..8637b8e308f81 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 4d271192dfef3..7c3ce38e22076 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 171594804fee5..e062817d6231e 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 07de025d8c819..7848a4f61bdb6 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 96bb43f0fd03f..2eae64c50a84e 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index a671264177f71..c49b3cdca4e33 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 55d4c04564ddc..a635e54904e8a 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 9b111873958b7..6726f6a9d1767 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 90b1e62b6b383..45e8537ced6f5 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index ac57e80c0aa9d..6f34b1f2e6ac2 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 6b8a18c18b92a..8440e636aeb65 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 40ba5219a3a1d..525347351153a 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 7675748d30c9d..32c2921db5a10 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index d93bb25ac5b98..5cf5b05ffcfe5 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 9e9e8a0f872c0..2124c854ffc84 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-10-22 +date: 2024-10-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From af139b4038ad758ad0896492bf7aea0418334ef4 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 23 Oct 2024 08:32:01 +0200 Subject: [PATCH 042/146] [Dashboard][ES|QL] Allow creating a dashboard with ES|QL chart even when there are no dataviews (#196658) ## Summary Closes https://github.com/elastic/kibana/issues/176159 Try ES|QL button now navigates to dashboard with an ES|QL chart embedded. ![meow](https://github.com/user-attachments/assets/47ae19f5-1ed2-49f1-aceb-1f7287f58251) ### Checklist - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/dashboard/kibana.jsonc | 5 +- .../no_data/dashboard_app_no_data.tsx | 100 +++++++++++++++++- src/plugins/dashboard/public/plugin.tsx | 3 + .../public/services/kibana_services.ts | 3 + src/plugins/dashboard/tsconfig.json | 1 + .../group6/dashboard_esql_no_data.ts | 14 ++- 6 files changed, 116 insertions(+), 10 deletions(-) diff --git a/src/plugins/dashboard/kibana.jsonc b/src/plugins/dashboard/kibana.jsonc index 2bf60cde55ef0..d7b0f2c16e04b 100644 --- a/src/plugins/dashboard/kibana.jsonc +++ b/src/plugins/dashboard/kibana.jsonc @@ -24,7 +24,7 @@ "urlForwarding", "presentationUtil", "visualizations", - "unifiedSearch" + "unifiedSearch", ], "optionalPlugins": [ "home", @@ -35,7 +35,8 @@ "taskManager", "serverless", "noDataPage", - "observabilityAIAssistant" + "observabilityAIAssistant", + "lens" ], "requiredBundles": [ "kibanaReact", diff --git a/src/plugins/dashboard/public/dashboard_app/no_data/dashboard_app_no_data.tsx b/src/plugins/dashboard/public/dashboard_app/no_data/dashboard_app_no_data.tsx index 15b3d00d07ec7..366726267c311 100644 --- a/src/plugins/dashboard/public/dashboard_app/no_data/dashboard_app_no_data.tsx +++ b/src/plugins/dashboard/public/dashboard_app/no_data/dashboard_app_no_data.tsx @@ -7,9 +7,19 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import React from 'react'; - +import React, { useCallback, useEffect, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import useAsync from 'react-use/lib/useAsync'; +import { v4 as uuidv4 } from 'uuid'; +import { + getESQLAdHocDataview, + getESQLQueryColumns, + getIndexForESQLQuery, + getInitialESQLQuery, +} from '@kbn/esql-utils'; import { withSuspense } from '@kbn/shared-ux-utility'; +import type { TypedLensByValueInput } from '@kbn/lens-plugin/public'; +import { getLensAttributesFromSuggestion } from '@kbn/visualization-utils'; import { DASHBOARD_APP_ID } from '../../dashboard_constants'; import { @@ -19,10 +29,15 @@ import { embeddableService, noDataPageService, shareService, + lensService, } from '../../services/kibana_services'; import { getDashboardBackupService } from '../../services/dashboard_backup_service'; import { getDashboardContentManagementService } from '../../services/dashboard_content_management_service'; +function generateId() { + return uuidv4(); +} + export const DashboardAppNoDataPage = ({ onDataViewCreated, }: { @@ -35,7 +50,7 @@ export const DashboardAppNoDataPage = ({ noDataPage: noDataPageService, share: shareService, }; - + const [abortController, setAbortController] = useState(new AbortController()); const importPromise = import('@kbn/shared-ux-page-analytics-no-data'); const AnalyticsNoDataPageKibanaProvider = withSuspense( React.lazy(() => @@ -44,6 +59,83 @@ export const DashboardAppNoDataPage = ({ }) ) ); + + const lensHelpersAsync = useAsync(() => { + return lensService?.stateHelperApi() ?? Promise.resolve(null); + }, [lensService]); + + useEffect(() => { + return () => { + abortController?.abort(); + }; + }, [abortController]); + + const onTryESQL = useCallback(async () => { + abortController?.abort(); + if (lensHelpersAsync.value) { + const abc = new AbortController(); + const { dataViews } = dataService; + const indexName = (await getIndexForESQLQuery({ dataViews })) ?? '*'; + const dataView = await getESQLAdHocDataview(`from ${indexName}`, dataViews); + const esqlQuery = getInitialESQLQuery(dataView); + + try { + const columns = await getESQLQueryColumns({ + esqlQuery, + search: dataService.search.search, + signal: abc.signal, + timeRange: dataService.query.timefilter.timefilter.getAbsoluteTime(), + }); + + // lens suggestions api context + const context = { + dataViewSpec: dataView?.toSpec(false), + fieldName: '', + textBasedColumns: columns, + query: { esql: esqlQuery }, + }; + + setAbortController(abc); + + const chartSuggestions = lensHelpersAsync.value.suggestions(context, dataView); + if (chartSuggestions?.length) { + const [suggestion] = chartSuggestions; + + const attrs = getLensAttributesFromSuggestion({ + filters: [], + query: { + esql: esqlQuery, + }, + suggestion, + dataView, + }) as TypedLensByValueInput['attributes']; + + const lensEmbeddableInput = { + attributes: attrs, + id: generateId(), + }; + + await embeddableService.getStateTransfer().navigateToWithEmbeddablePackage('dashboards', { + state: { + type: 'lens', + input: lensEmbeddableInput, + }, + path: '#/create', + }); + } + } catch (error) { + if (error.name !== 'AbortError') { + coreServices.notifications.toasts.addWarning( + i18n.translate('dashboard.noDataviews.esqlRequestWarningMessage', { + defaultMessage: 'Unable to load columns. {errorMessage}', + values: { errorMessage: error.message }, + }) + ); + } + } + } + }, [abortController, lensHelpersAsync.value]); + const AnalyticsNoDataPage = withSuspense( React.lazy(() => importPromise.then(({ AnalyticsNoDataPage: NoDataPage }) => { @@ -54,7 +146,7 @@ export const DashboardAppNoDataPage = ({ return ( - + ); }; diff --git a/src/plugins/dashboard/public/plugin.tsx b/src/plugins/dashboard/public/plugin.tsx index b7a920eb08ce3..a8e7cd96f38db 100644 --- a/src/plugins/dashboard/public/plugin.tsx +++ b/src/plugins/dashboard/public/plugin.tsx @@ -27,6 +27,7 @@ import { type CoreStart, } from '@kbn/core/public'; import type { DataPublicPluginSetup, DataPublicPluginStart } from '@kbn/data-plugin/public'; +import type { LensPublicSetup, LensPublicStart } from '@kbn/lens-plugin/public'; import type { DataViewEditorStart } from '@kbn/data-view-editor-plugin/public'; import type { EmbeddableSetup, EmbeddableStart } from '@kbn/embeddable-plugin/public'; import { FieldFormatsStart } from '@kbn/field-formats-plugin/public/plugin'; @@ -96,6 +97,7 @@ export interface DashboardSetupDependencies { urlForwarding: UrlForwardingSetup; unifiedSearch: UnifiedSearchPublicPluginStart; observabilityAIAssistant?: ObservabilityAIAssistantPublicSetup; + lens?: LensPublicSetup; } export interface DashboardStartDependencies { @@ -120,6 +122,7 @@ export interface DashboardStartDependencies { customBranding: CustomBrandingStart; serverless?: ServerlessPluginStart; noDataPage?: NoDataPagePluginStart; + lens?: LensPublicStart; observabilityAIAssistant?: ObservabilityAIAssistantPublicStart; } diff --git a/src/plugins/dashboard/public/services/kibana_services.ts b/src/plugins/dashboard/public/services/kibana_services.ts index e8b164d47b413..e3fde8c37c2a9 100644 --- a/src/plugins/dashboard/public/services/kibana_services.ts +++ b/src/plugins/dashboard/public/services/kibana_services.ts @@ -18,6 +18,7 @@ import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public/plugin' import type { NavigationPublicPluginStart } from '@kbn/navigation-plugin/public'; import type { NoDataPagePluginStart } from '@kbn/no-data-page-plugin/public'; import type { ObservabilityAIAssistantPublicStart } from '@kbn/observability-ai-assistant-plugin/public'; +import type { LensPublicStart } from '@kbn/lens-plugin/public'; import type { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/public'; import type { SavedObjectTaggingOssPluginStart } from '@kbn/saved-objects-tagging-oss-plugin/public'; import type { ScreenshotModePluginStart } from '@kbn/screenshot-mode-plugin/public'; @@ -40,6 +41,7 @@ export let fieldFormatService: FieldFormatsStart; export let navigationService: NavigationPublicPluginStart; export let noDataPageService: NoDataPagePluginStart | undefined; export let observabilityAssistantService: ObservabilityAIAssistantPublicStart | undefined; +export let lensService: LensPublicStart | undefined; export let presentationUtilService: PresentationUtilPluginStart; export let savedObjectsTaggingService: SavedObjectTaggingOssPluginStart | undefined; export let screenshotModeService: ScreenshotModePluginStart; @@ -63,6 +65,7 @@ export const setKibanaServices = (kibanaCore: CoreStart, deps: DashboardStartDep navigationService = deps.navigation; noDataPageService = deps.noDataPage; observabilityAssistantService = deps.observabilityAIAssistant; + lensService = deps.lens; presentationUtilService = deps.presentationUtil; savedObjectsTaggingService = deps.savedObjectsTaggingOss; serverlessService = deps.serverless; diff --git a/src/plugins/dashboard/tsconfig.json b/src/plugins/dashboard/tsconfig.json index 57125918ef3fc..3e95675ea64c3 100644 --- a/src/plugins/dashboard/tsconfig.json +++ b/src/plugins/dashboard/tsconfig.json @@ -80,6 +80,7 @@ "@kbn/content-management-favorites-public", "@kbn/core-custom-branding-browser-mocks", "@kbn/core-mount-utils-browser", + "@kbn/visualization-utils", ], "exclude": ["target/**/*"] } diff --git a/test/functional/apps/dashboard/group6/dashboard_esql_no_data.ts b/test/functional/apps/dashboard/group6/dashboard_esql_no_data.ts index 148cb95a82b11..333ac7f015397 100644 --- a/test/functional/apps/dashboard/group6/dashboard_esql_no_data.ts +++ b/test/functional/apps/dashboard/group6/dashboard_esql_no_data.ts @@ -6,14 +6,16 @@ * your election, the "Elastic License 2.0", the "GNU Affero General Public * License v3.0 only", or the "Server Side Public License, v 1". */ +import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const testSubjects = getService('testSubjects'); - const esql = getService('esql'); - const PageObjects = getPageObjects(['discover', 'dashboard']); + const panelActions = getService('dashboardPanelActions'); + const monacoEditor = getService('monacoEditor'); + const PageObjects = getPageObjects(['dashboard']); describe('No Data Views: Try ES|QL', () => { before(async () => { @@ -26,8 +28,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.existOrFail('noDataViewsPrompt'); await testSubjects.click('tryESQLLink'); - await PageObjects.discover.expectOnDiscover(); - await esql.expectEsqlStatement('FROM logs* | LIMIT 10'); + await PageObjects.dashboard.expectOnDashboard('New Dashboard'); + expect(await testSubjects.exists('lnsVisualizationContainer')).to.be(true); + + await panelActions.clickInlineEdit(); + const editorValue = await monacoEditor.getCodeEditorValue(); + expect(editorValue).to.eql(`FROM logs* | LIMIT 10`); }); }); } From a7a81c28973fd9b5bfc585b8e9b3cb7c5a86eb0b Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Wed, 23 Oct 2024 09:44:38 +0300 Subject: [PATCH 043/146] [ResponseOps][Rules] Create the rule params package (#196971) ## Summary This PR creates a package containing the schema of the params of all rule types. It starts as `schema.recordOf(schema.string(), schema.maybe(schema.any()))` which is the current one. In subsequent PRs, the schema will be updated to `schema.oneOf([apmRuleType, esQueryRuleType, ....])`. I also substituted the definition of `params` in the alerting plugin with the `params` exported from the package. Towards: https://github.com/elastic/kibana/issues/187356 Fixes: https://github.com/elastic/kibana/issues/195183 ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels) - [ ] This will appear in the **Release Notes** and follow the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 1 + package.json | 1 + packages/response-ops/rule_params/README.md | 3 +++ packages/response-ops/rule_params/index.ts | 23 ++++++++++++++++ .../response-ops/rule_params/jest.config.js | 14 ++++++++++ .../response-ops/rule_params/kibana.jsonc | 5 ++++ packages/response-ops/rule_params/latest.ts | 10 +++++++ .../response-ops/rule_params/package.json | 6 +++++ .../response-ops/rule_params/tsconfig.json | 19 ++++++++++++++ packages/response-ops/rule_params/v1.ts | 26 +++++++++++++++++++ tsconfig.base.json | 2 ++ .../routes/backfill/response/schemas/v1.ts | 3 ++- .../routes/rule/apis/create/schemas/v1.ts | 6 ++--- .../routes/rule/apis/update/schemas/v1.ts | 6 ++--- .../common/routes/rule/response/index.ts | 17 +++++------- .../common/routes/rule/response/schemas/v1.ts | 6 ++--- .../common/routes/rule/response/types/v1.ts | 5 ++-- .../backfill/result/schemas/index.ts | 3 ++- .../create/schemas/create_rule_data_schema.ts | 3 ++- .../update/schemas/update_rule_data_schema.ts | 3 ++- .../application/rule/schemas/rule_schemas.ts | 2 +- .../server/application/rule/types/rule.ts | 2 +- x-pack/plugins/alerting/tsconfig.json | 3 ++- yarn.lock | 4 +++ 24 files changed, 141 insertions(+), 32 deletions(-) create mode 100644 packages/response-ops/rule_params/README.md create mode 100644 packages/response-ops/rule_params/index.ts create mode 100644 packages/response-ops/rule_params/jest.config.js create mode 100644 packages/response-ops/rule_params/kibana.jsonc create mode 100644 packages/response-ops/rule_params/latest.ts create mode 100644 packages/response-ops/rule_params/package.json create mode 100644 packages/response-ops/rule_params/tsconfig.json create mode 100644 packages/response-ops/rule_params/v1.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4dc62da409d25..707592b94a18b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -729,6 +729,7 @@ packages/kbn-resizable-layout @elastic/kibana-data-discovery examples/resizable_layout_examples @elastic/kibana-data-discovery x-pack/test/plugin_functional/plugins/resolver_test @elastic/security-solution packages/response-ops/feature_flag_service @elastic/response-ops +packages/response-ops/rule_params @elastic/response-ops examples/response_stream @elastic/ml-ui packages/kbn-rison @elastic/kibana-operations x-pack/packages/rollup @elastic/kibana-management diff --git a/package.json b/package.json index 500f587e1166d..31ec1fdba494c 100644 --- a/package.json +++ b/package.json @@ -747,6 +747,7 @@ "@kbn/resizable-layout-examples-plugin": "link:examples/resizable_layout_examples", "@kbn/resolver-test-plugin": "link:x-pack/test/plugin_functional/plugins/resolver_test", "@kbn/response-ops-feature-flag-service": "link:packages/response-ops/feature_flag_service", + "@kbn/response-ops-rule-params": "link:packages/response-ops/rule_params", "@kbn/response-stream-plugin": "link:examples/response_stream", "@kbn/rison": "link:packages/kbn-rison", "@kbn/rollup": "link:x-pack/packages/rollup", diff --git a/packages/response-ops/rule_params/README.md b/packages/response-ops/rule_params/README.md new file mode 100644 index 0000000000000..8cc747bf38864 --- /dev/null +++ b/packages/response-ops/rule_params/README.md @@ -0,0 +1,3 @@ +# @kbn/response-ops-rule-params + +The package is responsible for the parameters' schema of all rule types. The alerting plugin uses this package to generate OAS documentation for the `params` property in the rule in requests and responses. diff --git a/packages/response-ops/rule_params/index.ts b/packages/response-ops/rule_params/index.ts new file mode 100644 index 0000000000000..a5ce640a4c5d4 --- /dev/null +++ b/packages/response-ops/rule_params/index.ts @@ -0,0 +1,23 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export { ruleParamsSchema, ruleParamsSchemaWithDefaultValue } from './latest'; + +export { + ruleParamsSchema as ruleParamsSchemaV1, + ruleParamsSchemaWithDefaultValue as ruleParamsSchemaWithDefaultValueV1, +} from './v1'; + +export type { RuleParams } from './latest'; +export type { RuleParamsWithDefaultValue } from './latest'; + +export type { + RuleParams as RuleParamsV1, + RuleParamsWithDefaultValue as RuleParamsWithDefaultValueV1, +} from './v1'; diff --git a/packages/response-ops/rule_params/jest.config.js b/packages/response-ops/rule_params/jest.config.js new file mode 100644 index 0000000000000..ee60f7ea42272 --- /dev/null +++ b/packages/response-ops/rule_params/jest.config.js @@ -0,0 +1,14 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../../..', + roots: ['/packages/response-ops/rule_params'], +}; diff --git a/packages/response-ops/rule_params/kibana.jsonc b/packages/response-ops/rule_params/kibana.jsonc new file mode 100644 index 0000000000000..6a6744a58c4a1 --- /dev/null +++ b/packages/response-ops/rule_params/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/response-ops-rule-params", + "owner": "@elastic/response-ops" +} diff --git a/packages/response-ops/rule_params/latest.ts b/packages/response-ops/rule_params/latest.ts new file mode 100644 index 0000000000000..f278309c22b03 --- /dev/null +++ b/packages/response-ops/rule_params/latest.ts @@ -0,0 +1,10 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export * from './v1'; diff --git a/packages/response-ops/rule_params/package.json b/packages/response-ops/rule_params/package.json new file mode 100644 index 0000000000000..43145b8d5da4c --- /dev/null +++ b/packages/response-ops/rule_params/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/response-ops-rule-params", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0" +} \ No newline at end of file diff --git a/packages/response-ops/rule_params/tsconfig.json b/packages/response-ops/rule_params/tsconfig.json new file mode 100644 index 0000000000000..3df73f778fdc1 --- /dev/null +++ b/packages/response-ops/rule_params/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/config-schema", + ] +} diff --git a/packages/response-ops/rule_params/v1.ts b/packages/response-ops/rule_params/v1.ts new file mode 100644 index 0000000000000..a083f67f10c8c --- /dev/null +++ b/packages/response-ops/rule_params/v1.ts @@ -0,0 +1,26 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { TypeOf, schema } from '@kbn/config-schema'; + +export const ruleParamsSchema = schema.recordOf(schema.string(), schema.maybe(schema.any()), { + meta: { description: 'The parameters for the rule.' }, +}); + +export const ruleParamsSchemaWithDefaultValue = schema.recordOf( + schema.string(), + schema.maybe(schema.any()), + { + defaultValue: {}, + meta: { description: 'The parameters for the rule.' }, + } +); + +export type RuleParams = TypeOf; +export type RuleParamsWithDefaultValue = TypeOf; diff --git a/tsconfig.base.json b/tsconfig.base.json index 5028780367b9c..783e4c254b89b 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1452,6 +1452,8 @@ "@kbn/resolver-test-plugin/*": ["x-pack/test/plugin_functional/plugins/resolver_test/*"], "@kbn/response-ops-feature-flag-service": ["packages/response-ops/feature_flag_service"], "@kbn/response-ops-feature-flag-service/*": ["packages/response-ops/feature_flag_service/*"], + "@kbn/response-ops-rule-params": ["packages/response-ops/rule_params"], + "@kbn/response-ops-rule-params/*": ["packages/response-ops/rule_params/*"], "@kbn/response-stream-plugin": ["examples/response_stream"], "@kbn/response-stream-plugin/*": ["examples/response_stream/*"], "@kbn/rison": ["packages/kbn-rison"], diff --git a/x-pack/plugins/alerting/common/routes/backfill/response/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/backfill/response/schemas/v1.ts index 268ef7f5e90d1..5da51d53dddbb 100644 --- a/x-pack/plugins/alerting/common/routes/backfill/response/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/backfill/response/schemas/v1.ts @@ -6,6 +6,7 @@ */ import { schema } from '@kbn/config-schema'; +import { ruleParamsSchemaV1 } from '@kbn/response-ops-rule-params'; import { adHocRunStatus } from '../../../../constants'; export const statusSchema = schema.oneOf([ @@ -26,7 +27,7 @@ export const backfillResponseSchema = schema.object({ name: schema.string(), tags: schema.arrayOf(schema.string()), rule_type_id: schema.string(), - params: schema.recordOf(schema.string(), schema.maybe(schema.any())), + params: ruleParamsSchemaV1, api_key_owner: schema.nullable(schema.string()), api_key_created_by_user: schema.maybe(schema.nullable(schema.boolean())), consumer: schema.string(), diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/create/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/rule/apis/create/schemas/v1.ts index d9157850bfd8d..e70df7f9dc73f 100644 --- a/x-pack/plugins/alerting/common/routes/rule/apis/create/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/rule/apis/create/schemas/v1.ts @@ -6,6 +6,7 @@ */ import { schema } from '@kbn/config-schema'; +import { ruleParamsSchemaWithDefaultValueV1 } from '@kbn/response-ops-rule-params'; import { validateDurationV1, validateHoursV1, validateTimezoneV1 } from '../../../validation'; import { notifyWhenSchemaV1, alertDelaySchemaV1 } from '../../../response'; import { alertsFilterQuerySchemaV1 } from '../../../../alerts_filter_query'; @@ -166,10 +167,7 @@ export const createBodySchema = schema.object({ }) ) ), - params: schema.recordOf(schema.string(), schema.maybe(schema.any()), { - defaultValue: {}, - meta: { description: 'The parameters for the rule.' }, - }), + params: ruleParamsSchemaWithDefaultValueV1, schedule: schema.object( { interval: schema.string({ diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/update/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/rule/apis/update/schemas/v1.ts index e83e26f119595..b838d21e5cc03 100644 --- a/x-pack/plugins/alerting/common/routes/rule/apis/update/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/rule/apis/update/schemas/v1.ts @@ -6,6 +6,7 @@ */ import { schema } from '@kbn/config-schema'; +import { ruleParamsSchemaWithDefaultValueV1 } from '@kbn/response-ops-rule-params'; import { validateDurationV1, validateHoursV1, validateTimezoneV1 } from '../../../validation'; import { notifyWhenSchemaV1, alertDelaySchemaV1 } from '../../../response'; import { alertsFilterQuerySchemaV1 } from '../../../../alerts_filter_query'; @@ -152,10 +153,7 @@ export const updateBodySchema = schema.object({ }) ) ), - params: schema.recordOf(schema.string(), schema.any(), { - defaultValue: {}, - meta: { description: 'The parameters for the rule.' }, - }), + params: ruleParamsSchemaWithDefaultValueV1, actions: schema.arrayOf(actionSchema, { defaultValue: [] }), notify_when: schema.maybe(schema.nullable(notifyWhenSchemaV1)), alert_delay: schema.maybe(alertDelaySchemaV1), diff --git a/x-pack/plugins/alerting/common/routes/rule/response/index.ts b/x-pack/plugins/alerting/common/routes/rule/response/index.ts index 8c784e744d473..1c7632ad28988 100644 --- a/x-pack/plugins/alerting/common/routes/rule/response/index.ts +++ b/x-pack/plugins/alerting/common/routes/rule/response/index.ts @@ -6,7 +6,6 @@ */ export { - ruleParamsSchema, actionParamsSchema, mappedParamsSchema, ruleExecutionStatusSchema, @@ -18,16 +17,9 @@ export { scheduleIdsSchema, } from './schemas/latest'; -export type { - RuleParams, - RuleResponse, - RuleSnoozeSchedule, - RuleLastRun, - Monitoring, -} from './types/latest'; +export type { RuleResponse, RuleSnoozeSchedule, RuleLastRun, Monitoring } from './types/latest'; export { - ruleParamsSchema as ruleParamsSchemaV1, actionParamsSchema as actionParamsSchemaV1, mappedParamsSchema as mappedParamsSchemaV1, ruleExecutionStatusSchema as ruleExecutionStatusSchemaV1, @@ -41,9 +33,14 @@ export { } from './schemas/v1'; export type { - RuleParams as RuleParamsV1, RuleResponse as RuleResponseV1, RuleSnoozeSchedule as RuleSnoozeScheduleV1, RuleLastRun as RuleLastRunV1, Monitoring as MonitoringV1, } from './types/v1'; + +export { ruleParamsSchemaV1 } from '@kbn/response-ops-rule-params'; +export { ruleParamsSchema } from '@kbn/response-ops-rule-params'; + +export type { RuleParamsV1 } from '@kbn/response-ops-rule-params'; +export type { RuleParams } from '@kbn/response-ops-rule-params'; diff --git a/x-pack/plugins/alerting/common/routes/rule/response/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/rule/response/schemas/v1.ts index 29488b98d6ca8..069aca001d14f 100644 --- a/x-pack/plugins/alerting/common/routes/rule/response/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/rule/response/schemas/v1.ts @@ -6,6 +6,7 @@ */ import { schema } from '@kbn/config-schema'; +import { ruleParamsSchemaV1 } from '@kbn/response-ops-rule-params'; import { rRuleResponseSchemaV1 } from '../../../r_rule'; import { alertsFilterQuerySchemaV1 } from '../../../alerts_filter_query'; import { @@ -18,9 +19,6 @@ import { import { validateNotifyWhenV1 } from '../../validation'; import { flappingSchemaV1 } from '../../common'; -export const ruleParamsSchema = schema.recordOf(schema.string(), schema.maybe(schema.any()), { - meta: { description: 'The parameters for the rule.' }, -}); export const actionParamsSchema = schema.recordOf(schema.string(), schema.maybe(schema.any()), { meta: { description: @@ -497,7 +495,7 @@ export const ruleResponseSchema = schema.object({ }), schedule: intervalScheduleSchema, actions: schema.arrayOf(actionSchema), - params: ruleParamsSchema, + params: ruleParamsSchemaV1, mapped_params: schema.maybe(mappedParamsSchema), scheduled_task_id: schema.maybe( schema.string({ diff --git a/x-pack/plugins/alerting/common/routes/rule/response/types/v1.ts b/x-pack/plugins/alerting/common/routes/rule/response/types/v1.ts index e9a37eea1fe72..e32a56a302e63 100644 --- a/x-pack/plugins/alerting/common/routes/rule/response/types/v1.ts +++ b/x-pack/plugins/alerting/common/routes/rule/response/types/v1.ts @@ -6,22 +6,21 @@ */ import type { TypeOf } from '@kbn/config-schema'; +import { RuleParamsV1 } from '@kbn/response-ops-rule-params'; import { - ruleParamsSchemaV1, ruleResponseSchemaV1, ruleSnoozeScheduleSchemaV1, ruleLastRunSchemaV1, monitoringSchemaV1, } from '..'; -export type RuleParams = TypeOf; export type RuleSnoozeSchedule = TypeOf; export type RuleLastRun = TypeOf; export type Monitoring = TypeOf; type RuleResponseSchemaType = TypeOf; -export interface RuleResponse { +export interface RuleResponse { id: RuleResponseSchemaType['id']; enabled: RuleResponseSchemaType['enabled']; name: RuleResponseSchemaType['name']; diff --git a/x-pack/plugins/alerting/server/application/backfill/result/schemas/index.ts b/x-pack/plugins/alerting/server/application/backfill/result/schemas/index.ts index de3cc5926a4ae..b454d41dd40ca 100644 --- a/x-pack/plugins/alerting/server/application/backfill/result/schemas/index.ts +++ b/x-pack/plugins/alerting/server/application/backfill/result/schemas/index.ts @@ -6,6 +6,7 @@ */ import { schema } from '@kbn/config-schema'; +import { ruleParamsSchema } from '@kbn/response-ops-rule-params'; import { adHocRunStatus } from '../../../../../common/constants'; export const statusSchema = schema.oneOf([ @@ -32,7 +33,7 @@ export const backfillSchema = schema.object({ name: schema.string(), tags: schema.arrayOf(schema.string()), alertTypeId: schema.string(), - params: schema.recordOf(schema.string(), schema.maybe(schema.any())), + params: ruleParamsSchema, apiKeyOwner: schema.nullable(schema.string()), apiKeyCreatedByUser: schema.maybe(schema.nullable(schema.boolean())), consumer: schema.string(), diff --git a/x-pack/plugins/alerting/server/application/rule/methods/create/schemas/create_rule_data_schema.ts b/x-pack/plugins/alerting/server/application/rule/methods/create/schemas/create_rule_data_schema.ts index 0672d7929fdb2..e2cf0da359b0a 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/create/schemas/create_rule_data_schema.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/create/schemas/create_rule_data_schema.ts @@ -6,6 +6,7 @@ */ import { schema } from '@kbn/config-schema'; +import { ruleParamsSchemaWithDefaultValue } from '@kbn/response-ops-rule-params'; import { validateDuration } from '../../../validation'; import { notifyWhenSchema, @@ -23,7 +24,7 @@ export const createRuleDataSchema = schema.object( consumer: schema.string(), tags: schema.arrayOf(schema.string(), { defaultValue: [] }), throttle: schema.maybe(schema.nullable(schema.string({ validate: validateDuration }))), - params: schema.recordOf(schema.string(), schema.maybe(schema.any()), { defaultValue: {} }), + params: ruleParamsSchemaWithDefaultValue, schedule: schema.object({ interval: schema.string({ validate: validateDuration }), }), diff --git a/x-pack/plugins/alerting/server/application/rule/methods/update/schemas/update_rule_data_schema.ts b/x-pack/plugins/alerting/server/application/rule/methods/update/schemas/update_rule_data_schema.ts index 0c4a1df45d44e..9c0bf1666f846 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/update/schemas/update_rule_data_schema.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/update/schemas/update_rule_data_schema.ts @@ -6,6 +6,7 @@ */ import { schema } from '@kbn/config-schema'; +import { ruleParamsSchemaWithDefaultValue } from '@kbn/response-ops-rule-params'; import { validateDuration } from '../../../validation'; import { notifyWhenSchema, @@ -23,7 +24,7 @@ export const updateRuleDataSchema = schema.object( interval: schema.string({ validate: validateDuration }), }), throttle: schema.maybe(schema.nullable(schema.string({ validate: validateDuration }))), - params: schema.recordOf(schema.string(), schema.maybe(schema.any()), { defaultValue: {} }), + params: ruleParamsSchemaWithDefaultValue, actions: schema.arrayOf(actionRequestSchema, { defaultValue: [] }), systemActions: schema.maybe(schema.arrayOf(systemActionRequestSchema, { defaultValue: [] })), notifyWhen: schema.maybe(schema.nullable(notifyWhenSchema)), diff --git a/x-pack/plugins/alerting/server/application/rule/schemas/rule_schemas.ts b/x-pack/plugins/alerting/server/application/rule/schemas/rule_schemas.ts index 7f9fcb1bd5377..da91ceb727d2c 100644 --- a/x-pack/plugins/alerting/server/application/rule/schemas/rule_schemas.ts +++ b/x-pack/plugins/alerting/server/application/rule/schemas/rule_schemas.ts @@ -6,6 +6,7 @@ */ import { schema } from '@kbn/config-schema'; +import { ruleParamsSchema } from '@kbn/response-ops-rule-params'; import { ruleLastRunOutcomeValues, ruleExecutionStatusValues, @@ -18,7 +19,6 @@ import { notifyWhenSchema } from './notify_when_schema'; import { actionSchema, systemActionSchema } from './action_schemas'; import { flappingSchema } from './flapping_schema'; -export const ruleParamsSchema = schema.recordOf(schema.string(), schema.maybe(schema.any())); export const mappedParamsSchema = schema.recordOf(schema.string(), schema.maybe(schema.any())); export const intervalScheduleSchema = schema.object({ diff --git a/x-pack/plugins/alerting/server/application/rule/types/rule.ts b/x-pack/plugins/alerting/server/application/rule/types/rule.ts index 0b1177d31e1f7..2e5cad45cf92f 100644 --- a/x-pack/plugins/alerting/server/application/rule/types/rule.ts +++ b/x-pack/plugins/alerting/server/application/rule/types/rule.ts @@ -6,6 +6,7 @@ */ import { TypeOf } from '@kbn/config-schema'; +import { ruleParamsSchema } from '@kbn/response-ops-rule-params'; import { ruleNotifyWhen, ruleLastRunOutcomeValues, @@ -14,7 +15,6 @@ import { ruleExecutionStatusWarningReason, } from '../constants'; import { - ruleParamsSchema, snoozeScheduleSchema, ruleExecutionStatusSchema, ruleLastRunSchema, diff --git a/x-pack/plugins/alerting/tsconfig.json b/x-pack/plugins/alerting/tsconfig.json index c0951663a8489..eefc1999b26d5 100644 --- a/x-pack/plugins/alerting/tsconfig.json +++ b/x-pack/plugins/alerting/tsconfig.json @@ -73,7 +73,8 @@ "@kbn/core-security-server", "@kbn/core-http-server", "@kbn/zod", - "@kbn/core-saved-objects-base-server-internal" + "@kbn/core-saved-objects-base-server-internal", + "@kbn/response-ops-rule-params" ], "exclude": [ "target/**/*" diff --git a/yarn.lock b/yarn.lock index 92309a0bd0a34..fc84740a0de45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6169,6 +6169,10 @@ version "0.0.0" uid "" +"@kbn/response-ops-rule-params@link:packages/response-ops/rule_params": + version "0.0.0" + uid "" + "@kbn/response-stream-plugin@link:examples/response_stream": version "0.0.0" uid "" From 598706c7d1d171bf7012e91d1389ade9734e8b35 Mon Sep 17 00:00:00 2001 From: Elena Shostak <165678770+elena-shostak@users.noreply.github.com> Date: Wed, 23 Oct 2024 09:39:49 +0200 Subject: [PATCH 044/146] [Authz] Superuser privileges (#196586) ## Summary This PR adds support for explicit indication whether endpoint is restricted to superusers only. Moved `api/encrypted_saved_objects/_rotate_key` endpoint to the new configuration. __Relates: https://github.com/elastic/kibana/issues/196271__ ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ## Release note Introduced explicit configuration for routes that require superuser access. Moved `api/encrypted_saved_objects/_rotate_key` endpoint to the new configuration. --------- Co-authored-by: Elastic Machine --- .../security_route_config_validator.test.ts | 28 ++++ .../src/security_route_config_validator.ts | 10 ++ packages/core/http/core-http-server/index.ts | 1 + .../http/core-http-server/src/router/index.ts | 2 +- .../http/core-http-server/src/router/route.ts | 8 + src/core/server/index.ts | 6 +- .../server/routes/key_rotation.test.ts | 11 +- .../server/routes/key_rotation.ts | 8 +- x-pack/plugins/security/common/constants.ts | 11 ++ .../authorization/api_authorization.test.ts | 156 +++++++++++++----- .../server/authorization/api_authorization.ts | 66 ++++++-- 11 files changed, 244 insertions(+), 63 deletions(-) diff --git a/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.test.ts b/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.test.ts index d130bfdce9fb5..f10d2cb3b3ac4 100644 --- a/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.test.ts +++ b/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.test.ts @@ -8,6 +8,7 @@ */ import { validRouteSecurity } from './security_route_config_validator'; +import { ReservedPrivilegesSet } from '@kbn/core-http-server'; describe('RouteSecurity validation', () => { it('should pass validation for valid route security with authz enabled and valid required privileges', () => { @@ -276,4 +277,31 @@ describe('RouteSecurity validation', () => { `"[authz.requiredPrivileges]: anyRequired privileges must contain unique values"` ); }); + + it('should fail validation when anyRequired has superuser privileges set', () => { + const invalidRouteSecurity = { + authz: { + requiredPrivileges: [ + { anyRequired: ['privilege1', 'privilege1'], allRequired: ['privilege4'] }, + { anyRequired: ['privilege5', ReservedPrivilegesSet.superuser] }, + ], + }, + }; + + expect(() => validRouteSecurity(invalidRouteSecurity)).toThrowErrorMatchingInlineSnapshot( + `"[authz.requiredPrivileges]: Combining superuser with other privileges is redundant, superuser privileges set can be only used as a standalone privilege."` + ); + }); + + it('should fail validation when allRequired combines superuser privileges set with other privileges', () => { + const invalidRouteSecurity = { + authz: { + requiredPrivileges: [ReservedPrivilegesSet.superuser, 'privilege1'], + }, + }; + + expect(() => validRouteSecurity(invalidRouteSecurity)).toThrowErrorMatchingInlineSnapshot( + `"[authz.requiredPrivileges]: Combining superuser with other privileges is redundant, superuser privileges set can be only used as a standalone privilege."` + ); + }); }); diff --git a/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.ts b/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.ts index d74f41d3157b4..65073f9a66ec6 100644 --- a/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.ts +++ b/packages/core/http/core-http-router-server-internal/src/security_route_config_validator.ts @@ -9,6 +9,7 @@ import { schema } from '@kbn/config-schema'; import type { RouteSecurity, RouteConfigOptions } from '@kbn/core-http-server'; +import { ReservedPrivilegesSet } from '@kbn/core-http-server'; import type { DeepPartial } from '@kbn/utility-types'; const privilegeSetSchema = schema.object( @@ -49,6 +50,15 @@ const requiredPrivilegesSchema = schema.arrayOf( } }); + // Combining superuser with other privileges is redundant. + // If user is a superuser, they inherently have access to all the privileges that may come with other roles. + if ( + anyRequired.includes(ReservedPrivilegesSet.superuser) || + (allRequired.includes(ReservedPrivilegesSet.superuser) && allRequired.length > 1) + ) { + return 'Combining superuser with other privileges is redundant, superuser privileges set can be only used as a standalone privilege.'; + } + if (anyRequired.length && allRequired.length) { for (const privilege of anyRequired) { if (allRequired.includes(privilege)) { diff --git a/packages/core/http/core-http-server/index.ts b/packages/core/http/core-http-server/index.ts index 7fe125c6aa9a7..9c12f6a09ac45 100644 --- a/packages/core/http/core-http-server/index.ts +++ b/packages/core/http/core-http-server/index.ts @@ -128,6 +128,7 @@ export { getResponseValidation, isFullValidatorContainer, isKibanaResponse, + ReservedPrivilegesSet, } from './src/router'; export type { ICspConfig } from './src/csp'; diff --git a/packages/core/http/core-http-server/src/router/index.ts b/packages/core/http/core-http-server/src/router/index.ts index 8384ed838d5fc..8e2b9373c43bd 100644 --- a/packages/core/http/core-http-server/src/router/index.ts +++ b/packages/core/http/core-http-server/src/router/index.ts @@ -66,7 +66,7 @@ export type { PrivilegeSet, } from './route'; -export { validBodyOutput } from './route'; +export { validBodyOutput, ReservedPrivilegesSet } from './route'; export type { RouteValidationFunction, RouteValidationResultFactory, diff --git a/packages/core/http/core-http-server/src/router/route.ts b/packages/core/http/core-http-server/src/router/route.ts index 6696babce41e1..17fecd1c48b17 100644 --- a/packages/core/http/core-http-server/src/router/route.ts +++ b/packages/core/http/core-http-server/src/router/route.ts @@ -224,6 +224,14 @@ export interface RouteSecurity { authc?: RouteAuthc; } +/** + * A set of reserved privileges that can be used to check access to the route. + */ +export enum ReservedPrivilegesSet { + operator = 'operator', + superuser = 'superuser', +} + /** * Additional route options. * @public diff --git a/src/core/server/index.ts b/src/core/server/index.ts index 1ac38b1d44157..52149cd611be3 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -242,7 +242,11 @@ export type { } from '@kbn/core-http-server'; export type { IExternalUrlPolicy } from '@kbn/core-http-common'; -export { validBodyOutput, OnPostAuthResultType } from '@kbn/core-http-server'; +export { + validBodyOutput, + OnPostAuthResultType, + ReservedPrivilegesSet, +} from '@kbn/core-http-server'; export type { HttpResourcesRenderOptions, diff --git a/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.test.ts b/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.test.ts index f387e94e80990..b0bdc9b98a86d 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.test.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.test.ts @@ -7,7 +7,7 @@ import { Type } from '@kbn/config-schema'; import type { IRouter, RequestHandler, RequestHandlerContext, RouteConfig } from '@kbn/core/server'; -import { kibanaResponseFactory } from '@kbn/core/server'; +import { kibanaResponseFactory, ReservedPrivilegesSet } from '@kbn/core/server'; import { httpServerMock } from '@kbn/core/server/mocks'; import { routeDefinitionParamsMock } from './index.mock'; @@ -43,9 +43,14 @@ describe('Key rotation routes', () => { }); it('correctly defines route.', () => { + expect(routeConfig.security).toEqual({ + authz: { + requiredPrivileges: [ReservedPrivilegesSet.superuser], + }, + }); expect(routeConfig.options).toEqual({ access: 'public', - tags: ['access:rotateEncryptionKey', 'oas-tag:saved objects'], + tags: ['oas-tag:saved objects'], summary: `Rotate a key for encrypted saved objects`, description: `If a saved object cannot be decrypted using the primary encryption key, Kibana attempts to decrypt it using the specified decryption-only keys. In most of the cases this overhead is negligible, but if you're dealing with a large number of saved objects and experiencing performance issues, you may want to rotate the encryption key. NOTE: Bulk key rotation can consume a considerable amount of resources and hence only user with a superuser role can trigger it.`, @@ -96,7 +101,7 @@ describe('Key rotation routes', () => { expect(config.options).toEqual({ access: 'internal', - tags: ['access:rotateEncryptionKey', 'oas-tag:saved objects'], + tags: ['oas-tag:saved objects'], summary: `Rotate a key for encrypted saved objects`, description: `If a saved object cannot be decrypted using the primary encryption key, Kibana attempts to decrypt it using the specified decryption-only keys. In most of the cases this overhead is negligible, but if you're dealing with a large number of saved objects and experiencing performance issues, you may want to rotate the encryption key. NOTE: Bulk key rotation can consume a considerable amount of resources and hence only user with a superuser role can trigger it.`, diff --git a/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.ts b/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.ts index 272e74c3a69cb..46df83a187c3b 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.ts @@ -6,6 +6,7 @@ */ import { schema } from '@kbn/config-schema'; +import { ReservedPrivilegesSet } from '@kbn/core/server'; import type { RouteDefinitionParams } from '.'; @@ -39,9 +40,14 @@ export function defineKeyRotationRoutes({ type: schema.maybe(schema.string()), }), }, + security: { + authz: { + requiredPrivileges: [ReservedPrivilegesSet.superuser], + }, + }, options: { - tags: ['access:rotateEncryptionKey', 'oas-tag:saved objects'], access: buildFlavor === 'serverless' ? 'internal' : 'public', + tags: ['oas-tag:saved objects'], summary: `Rotate a key for encrypted saved objects`, description: `If a saved object cannot be decrypted using the primary encryption key, Kibana attempts to decrypt it using the specified decryption-only keys. In most of the cases this overhead is negligible, but if you're dealing with a large number of saved objects and experiencing performance issues, you may want to rotate the encryption key. NOTE: Bulk key rotation can consume a considerable amount of resources and hence only user with a superuser role can trigger it.`, diff --git a/x-pack/plugins/security/common/constants.ts b/x-pack/plugins/security/common/constants.ts index 3a9b20bbb0bd7..c75ab77a7de98 100644 --- a/x-pack/plugins/security/common/constants.ts +++ b/x-pack/plugins/security/common/constants.ts @@ -127,3 +127,14 @@ export const API_VERSIONS = { }, }, }; + +/** + * Privileges that define the superuser role or the role equivalent to the superuser role. + */ +export const SUPERUSER_PRIVILEGES = { + kibana: ['*'], + elasticsearch: { + cluster: ['all'], + index: { '*': ['all'] }, + }, +}; diff --git a/x-pack/plugins/security/server/authorization/api_authorization.test.ts b/x-pack/plugins/security/server/authorization/api_authorization.test.ts index e928d73220274..0181c98d6f1b1 100644 --- a/x-pack/plugins/security/server/authorization/api_authorization.test.ts +++ b/x-pack/plugins/security/server/authorization/api_authorization.test.ts @@ -6,6 +6,7 @@ */ import type { RouteSecurity } from '@kbn/core/server'; +import { ReservedPrivilegesSet } from '@kbn/core/server'; import { coreMock, httpServerMock, @@ -149,7 +150,10 @@ describe('initAPIAuthorization', () => { asserts, }: { security?: RouteSecurity; - kibanaPrivilegesResponse?: Array<{ privilege: string; authorized: boolean }>; + kibanaPrivilegesResponse?: { + privileges: { kibana: Array<{ privilege: string; authorized: boolean }> }; + hasAllRequested?: boolean; + }; kibanaPrivilegesRequestActions?: string[]; asserts: { forbidden?: boolean; @@ -180,11 +184,7 @@ describe('initAPIAuthorization', () => { const mockResponse = httpServerMock.createResponseFactory(); const mockPostAuthToolkit = httpServiceMock.createOnPostAuthToolkit(); - const mockCheckPrivileges = jest.fn().mockReturnValue({ - privileges: { - kibana: kibanaPrivilegesResponse, - }, - }); + const mockCheckPrivileges = jest.fn().mockReturnValue(kibanaPrivilegesResponse); mockAuthz.mode.useRbacForRequest.mockReturnValue(true); mockAuthz.checkPrivilegesDynamicallyWithRequest.mockImplementation((request) => { // hapi conceals the actual "request" from us, so we make sure that the headers are passed to @@ -194,6 +194,12 @@ describe('initAPIAuthorization', () => { return mockCheckPrivileges; }); + mockAuthz.checkPrivilegesWithRequest.mockImplementation((request) => { + expect(request.headers).toMatchObject(headers); + + return { globally: () => kibanaPrivilegesResponse }; + }); + await postAuthHandler(mockRequest, mockResponse, mockPostAuthToolkit); expect(mockAuthz.mode.useRbacForRequest).toHaveBeenCalledWith(mockRequest); @@ -207,11 +213,13 @@ describe('initAPIAuthorization', () => { return; } - expect(mockCheckPrivileges).toHaveBeenCalledWith({ - kibana: kibanaPrivilegesRequestActions!.map((action: string) => - mockAuthz.actions.api.get(action) - ), - }); + if (kibanaPrivilegesRequestActions) { + expect(mockCheckPrivileges).toHaveBeenCalledWith({ + kibana: kibanaPrivilegesRequestActions!.map((action: string) => + mockAuthz.actions.api.get(action) + ), + }); + } if (asserts.forbidden) { expect(mockResponse.forbidden).toHaveBeenCalled(); @@ -239,11 +247,15 @@ describe('initAPIAuthorization', () => { ], }, }, - kibanaPrivilegesResponse: [ - { privilege: 'api:privilege1', authorized: true }, - { privilege: 'api:privilege2', authorized: true }, - { privilege: 'api:privilege3', authorized: false }, - ], + kibanaPrivilegesResponse: { + privileges: { + kibana: [ + { privilege: 'api:privilege1', authorized: true }, + { privilege: 'api:privilege2', authorized: true }, + { privilege: 'api:privilege3', authorized: false }, + ], + }, + }, kibanaPrivilegesRequestActions: ['privilege1', 'privilege2', 'privilege3'], asserts: { authzResult: { @@ -267,10 +279,14 @@ describe('initAPIAuthorization', () => { ], }, }, - kibanaPrivilegesResponse: [ - { privilege: 'api:privilege1', authorized: true }, - { privilege: 'api:privilege2', authorized: true }, - ], + kibanaPrivilegesResponse: { + privileges: { + kibana: [ + { privilege: 'api:privilege1', authorized: true }, + { privilege: 'api:privilege2', authorized: true }, + ], + }, + }, kibanaPrivilegesRequestActions: ['privilege1', 'privilege2'], asserts: { authzResult: { @@ -293,11 +309,15 @@ describe('initAPIAuthorization', () => { ], }, }, - kibanaPrivilegesResponse: [ - { privilege: 'api:privilege1', authorized: false }, - { privilege: 'api:privilege2', authorized: true }, - { privilege: 'api:privilege3', authorized: false }, - ], + kibanaPrivilegesResponse: { + privileges: { + kibana: [ + { privilege: 'api:privilege1', authorized: false }, + { privilege: 'api:privilege2', authorized: true }, + { privilege: 'api:privilege3', authorized: false }, + ], + }, + }, kibanaPrivilegesRequestActions: ['privilege1', 'privilege2', 'privilege3'], asserts: { authzResult: { @@ -317,10 +337,14 @@ describe('initAPIAuthorization', () => { requiredPrivileges: ['privilege1', 'privilege2'], }, }, - kibanaPrivilegesResponse: [ - { privilege: 'api:privilege1', authorized: true }, - { privilege: 'api:privilege2', authorized: true }, - ], + kibanaPrivilegesResponse: { + privileges: { + kibana: [ + { privilege: 'api:privilege1', authorized: true }, + { privilege: 'api:privilege2', authorized: true }, + ], + }, + }, kibanaPrivilegesRequestActions: ['privilege1', 'privilege2'], asserts: { authzResult: { @@ -344,18 +368,54 @@ describe('initAPIAuthorization', () => { ], }, }, - kibanaPrivilegesResponse: [ - { privilege: 'api:privilege1', authorized: true }, - { privilege: 'api:privilege2', authorized: false }, - { privilege: 'api:privilege3', authorized: false }, - ], kibanaPrivilegesRequestActions: ['privilege1', 'privilege2', 'privilege3'], + kibanaPrivilegesResponse: { + privileges: { + kibana: [ + { privilege: 'api:privilege1', authorized: true }, + { privilege: 'api:privilege2', authorized: false }, + { privilege: 'api:privilege3', authorized: false }, + ], + }, + }, asserts: { forbidden: true, }, } ); + testSecurityConfig( + `protected route restricted to only superusers returns forbidden if user not a superuser`, + { + security: { + authz: { + requiredPrivileges: [ReservedPrivilegesSet.superuser], + }, + }, + kibanaPrivilegesResponse: { privileges: { kibana: [] }, hasAllRequested: false }, + asserts: { + forbidden: true, + }, + } + ); + + testSecurityConfig( + `protected route allowed only for superuser access returns "authzResult" if user is superuser`, + { + security: { + authz: { + requiredPrivileges: [ReservedPrivilegesSet.superuser], + }, + }, + kibanaPrivilegesResponse: { privileges: { kibana: [] }, hasAllRequested: true }, + asserts: { + authzResult: { + [ReservedPrivilegesSet.superuser]: true, + }, + }, + } + ); + testSecurityConfig( `protected route returns forbidden if user doesn't have at least one from allRequired privileges requested`, { @@ -369,12 +429,16 @@ describe('initAPIAuthorization', () => { ], }, }, - kibanaPrivilegesResponse: [ - { privilege: 'api:privilege1', authorized: true }, - { privilege: 'api:privilege2', authorized: false }, - { privilege: 'api:privilege3', authorized: false }, - { privilege: 'api:privilege4', authorized: true }, - ], + kibanaPrivilegesResponse: { + privileges: { + kibana: [ + { privilege: 'api:privilege1', authorized: true }, + { privilege: 'api:privilege2', authorized: false }, + { privilege: 'api:privilege3', authorized: false }, + { privilege: 'api:privilege4', authorized: true }, + ], + }, + }, kibanaPrivilegesRequestActions: ['privilege1', 'privilege2', 'privilege3', 'privilege4'], asserts: { forbidden: true, @@ -390,10 +454,14 @@ describe('initAPIAuthorization', () => { requiredPrivileges: ['privilege1', 'privilege2'], }, }, - kibanaPrivilegesResponse: [ - { privilege: 'api:privilege1', authorized: true }, - { privilege: 'api:privilege2', authorized: false }, - ], + kibanaPrivilegesResponse: { + privileges: { + kibana: [ + { privilege: 'api:privilege1', authorized: true }, + { privilege: 'api:privilege2', authorized: false }, + ], + }, + }, kibanaPrivilegesRequestActions: ['privilege1', 'privilege2'], asserts: { forbidden: true, diff --git a/x-pack/plugins/security/server/authorization/api_authorization.ts b/x-pack/plugins/security/server/authorization/api_authorization.ts index 9c67ff8bdff8b..2b99c2a176ac1 100644 --- a/x-pack/plugins/security/server/authorization/api_authorization.ts +++ b/x-pack/plugins/security/server/authorization/api_authorization.ts @@ -14,18 +14,28 @@ import type { PrivilegeSet, RouteAuthz, } from '@kbn/core/server'; +import { ReservedPrivilegesSet } from '@kbn/core/server'; import type { AuthorizationServiceSetup } from '@kbn/security-plugin-types-server'; import type { RecursiveReadonly } from '@kbn/utility-types'; -import { API_OPERATION_PREFIX } from '../../common/constants'; +import { API_OPERATION_PREFIX, SUPERUSER_PRIVILEGES } from '../../common/constants'; const isAuthzDisabled = (authz?: RecursiveReadonly): authz is AuthzDisabled => { return (authz as AuthzDisabled)?.enabled === false; }; +const isReservedPrivilegeSet = (privilege: string): privilege is ReservedPrivilegesSet => { + return Object.hasOwn(ReservedPrivilegesSet, privilege); +}; + export function initAPIAuthorization( http: HttpServiceSetup, - { actions, checkPrivilegesDynamicallyWithRequest, mode }: AuthorizationServiceSetup, + { + actions, + checkPrivilegesDynamicallyWithRequest, + checkPrivilegesWithRequest, + mode, + }: AuthorizationServiceSetup, logger: Logger ) { http.registerOnPostAuth(async (request, response, toolkit) => { @@ -47,24 +57,54 @@ export function initAPIAuthorization( const authz = security.authz as AuthzEnabled; - const requestedPrivileges = authz.requiredPrivileges.flatMap((privilegeEntry) => { - if (typeof privilegeEntry === 'object') { - return [...(privilegeEntry.allRequired ?? []), ...(privilegeEntry.anyRequired ?? [])]; + const { requestedPrivileges, requestedReservedPrivileges } = authz.requiredPrivileges.reduce( + (acc, privilegeEntry) => { + const privileges = + typeof privilegeEntry === 'object' + ? [...(privilegeEntry.allRequired ?? []), ...(privilegeEntry.anyRequired ?? [])] + : [privilegeEntry]; + + for (const privilege of privileges) { + if (isReservedPrivilegeSet(privilege)) { + acc.requestedReservedPrivileges.push(privilege); + } else { + acc.requestedPrivileges.push(privilege); + } + } + + return acc; + }, + { + requestedPrivileges: [] as string[], + requestedReservedPrivileges: [] as string[], } + ); - return privilegeEntry; - }); - - const apiActions = requestedPrivileges.map((permission) => actions.api.get(permission)); const checkPrivileges = checkPrivilegesDynamicallyWithRequest(request); - const checkPrivilegesResponse = await checkPrivileges({ kibana: apiActions }); - const privilegeToApiOperation = (privilege: string) => privilege.replace(API_OPERATION_PREFIX, ''); + const kibanaPrivileges: Record = {}; - for (const kbPrivilege of checkPrivilegesResponse.privileges.kibana) { - kibanaPrivileges[privilegeToApiOperation(kbPrivilege.privilege)] = kbPrivilege.authorized; + if (requestedPrivileges.length > 0) { + const checkPrivilegesResponse = await checkPrivileges({ + kibana: requestedPrivileges.map((permission) => actions.api.get(permission)), + }); + + for (const kbPrivilege of checkPrivilegesResponse.privileges.kibana) { + kibanaPrivileges[privilegeToApiOperation(kbPrivilege.privilege)] = kbPrivilege.authorized; + } + } + + for (const reservedPrivilege of requestedReservedPrivileges) { + if (reservedPrivilege === ReservedPrivilegesSet.superuser) { + const checkSuperuserPrivilegesResponse = await checkPrivilegesWithRequest( + request + ).globally(SUPERUSER_PRIVILEGES); + + kibanaPrivileges[ReservedPrivilegesSet.superuser] = + checkSuperuserPrivilegesResponse.hasAllRequested; + } } const hasRequestedPrivilege = (kbPrivilege: Privilege | PrivilegeSet) => { From fc812e33d85691d76e657f8056b18d79a9f860b1 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Wed, 23 Oct 2024 08:57:46 +0100 Subject: [PATCH 045/146] [ML] API tests for ML's _has_privileges (#197274) Calls ML's `_has_privileges` endpoint with various users. Also ensures upgrade mode status is correctly returned. --- .../apis/ml/system/has_privileges.ts | 143 ++++++++++++++++++ .../api_integration/apis/ml/system/index.ts | 1 + x-pack/test/functional/services/ml/api.ts | 28 ++++ 3 files changed, 172 insertions(+) create mode 100644 x-pack/test/api_integration/apis/ml/system/has_privileges.ts diff --git a/x-pack/test/api_integration/apis/ml/system/has_privileges.ts b/x-pack/test/api_integration/apis/ml/system/has_privileges.ts new file mode 100644 index 0000000000000..2e705240b403e --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/system/has_privileges.ts @@ -0,0 +1,143 @@ +/* + * 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 expect from '@kbn/expect'; + +import { MlHasPrivilegesResponse } from '@kbn/ml-plugin/public/application/services/ml_api_service'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { getCommonRequestHeader } from '../../../../functional/services/ml/common_api'; +import { USER } from '../../../../functional/services/ml/security_common'; + +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertestWithoutAuth'); + const ml = getService('ml'); + + async function runRequest( + user: USER, + index: any, + expectedStatusCode = 200 + ): Promise { + const { body, status } = await supertest + .post(`/internal/ml/_has_privileges`) + .auth(user, ml.securityCommon.getPasswordForUser(user)) + .set(getCommonRequestHeader('1')) + .send({ index }); + ml.api.assertResponseStatusCode(expectedStatusCode, status, body); + + return body; + } + + const testData = [ + { + user: USER.ML_POWERUSER, + index: [ + { + names: ['ft_farequote_small'], + privileges: ['read'], + }, + { + names: ['ft_farequote_small'], + privileges: ['write'], + }, + ], + expectedResponse: { + hasPrivileges: { + username: 'ft_ml_poweruser', + has_all_requested: false, + cluster: {}, + index: { + ft_farequote_small: { + read: true, + write: false, + }, + }, + application: {}, + }, + upgradeInProgress: false, + }, + expectedStatusCode: 200, + }, + { + user: USER.ML_VIEWER, + index: [ + { + names: ['ft_farequote_small'], + privileges: ['read'], + }, + { + names: ['ft_farequote_small'], + privileges: ['write'], + }, + ], + expectedResponse: { + hasPrivileges: { + username: 'ft_ml_viewer', + has_all_requested: false, + cluster: {}, + index: { + ft_farequote_small: { + read: true, + write: false, + }, + }, + application: {}, + }, + upgradeInProgress: false, + }, + + expectedStatusCode: 200, + }, + { + user: USER.ML_UNAUTHORIZED, + index: [ + { + names: ['ft_farequote_small'], + privileges: ['read'], + }, + { + names: ['ft_farequote_small'], + privileges: ['write'], + }, + ], + expectedResponse: { statusCode: 403, error: 'Forbidden', message: 'Forbidden' }, + expectedStatusCode: 403, + }, + ]; + + describe("ML's _has_privileges", () => { + before(async () => { + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote_small'); + }); + after(async () => { + await ml.api.setUpgradeMode(false); + }); + + it('should return correct privileges for test data', async () => { + for (const { user, index, expectedResponse, expectedStatusCode } of testData) { + const response = await runRequest(user, index, expectedStatusCode); + expect(response).to.eql( + expectedResponse, + `expected ${JSON.stringify(expectedResponse)}, got ${JSON.stringify(response)}` + ); + } + }); + + it('should return correct upgrade in progress', async () => { + const index = testData[0].index; + const expectedResponse = { ...testData[0].expectedResponse, upgradeInProgress: true }; + await ml.api.setUpgradeMode(true); + await ml.api.assertUpgradeMode(true); + + const response = await runRequest(USER.ML_POWERUSER, index); + expect(response).to.eql( + expectedResponse, + `expected ${JSON.stringify(expectedResponse)}, got ${JSON.stringify(response)}` + ); + }); + }); +}; diff --git a/x-pack/test/api_integration/apis/ml/system/index.ts b/x-pack/test/api_integration/apis/ml/system/index.ts index 0ddd4b80a0ee5..42e02b5fbb808 100644 --- a/x-pack/test/api_integration/apis/ml/system/index.ts +++ b/x-pack/test/api_integration/apis/ml/system/index.ts @@ -14,5 +14,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./index_exists')); loadTestFile(require.resolve('./info')); loadTestFile(require.resolve('./node_count')); + loadTestFile(require.resolve('./has_privileges')); }); } diff --git a/x-pack/test/functional/services/ml/api.ts b/x-pack/test/functional/services/ml/api.ts index 8b2c46d474c0c..0a3d988fd750c 100644 --- a/x-pack/test/functional/services/ml/api.ts +++ b/x-pack/test/functional/services/ml/api.ts @@ -1696,5 +1696,33 @@ export function MachineLearningAPIProvider({ getService }: FtrProviderContext) { this.assertResponseStatusCode(200, status, module); return module; }, + + async setUpgradeMode(enabled: boolean) { + log.debug(`Setting upgrade mode to "${enabled}"`); + const { body, status } = await esSupertest.post(`/_ml/set_upgrade_mode?enabled=${enabled}`); + this.assertResponseStatusCode(200, status, body); + + log.debug(`Upgrade mode set to "${enabled}"`); + }, + + async assertUpgradeMode(expectedMode: boolean) { + log.debug(`Asserting upgrade mode is "${expectedMode}"`); + const { body, status } = await esSupertest.get('/_ml/info'); + this.assertResponseStatusCode(200, status, body); + + expect(body.upgrade_mode).to.eql( + expectedMode, + `Expected upgrade mode to be ${expectedMode}, got ${body.upgrade_mode}` + ); + }, + + async getMlInfo() { + log.debug(`Getting ML info`); + const { body, status } = await kbnSupertest + .get(`/internal/ml/info`) + .set(getCommonRequestHeader('1')); + this.assertResponseStatusCode(200, status, body); + return body; + }, }; } From 0bafb9632c2e1b09dd56586f15dca83d8ad5b358 Mon Sep 17 00:00:00 2001 From: Pablo Machado Date: Wed, 23 Oct 2024 10:05:05 +0200 Subject: [PATCH 046/146] [SecuritySolution] Update entity store source field (#197186) ## Summary In this PR the source field will only store the first identified index for an entity. The PR also updates the entities list panel to display a textual description of the source index and adds a new source field filter. https://github.com/user-attachments/assets/c7aad254-f871-4035-9dac-89decce31a55 ### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Mark Hopkin Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../output/kibana.serverless.staging.yaml | 8 +- oas_docs/output/kibana.serverless.yaml | 8 +- oas_docs/output/kibana.staging.yaml | 8 +- oas_docs/output/kibana.yaml | 8 +- .../entity_store/entities/common.gen.ts | 4 +- .../entity_store/entities/common.schema.yaml | 12 +-- ...alytics_api_2023_10_31.bundled.schema.yaml | 8 +- ...alytics_api_2023_10_31.bundled.schema.yaml | 8 +- .../components/entity_source_filter.tsx | 16 ++-- .../entity_store/entities_list.test.tsx | 2 +- .../components/entity_store/entities_list.tsx | 6 +- .../components/entity_store/helpers.test.ts | 86 +++++++++++++------ .../components/entity_store/helpers.tsx | 46 ++++++++++ .../hooks/use_entities_list_columns.tsx | 6 +- .../hooks/use_entities_list_filters.test.ts | 55 +++++++++--- .../hooks/use_entities_list_filters.ts | 60 ++++++++++--- .../entity_store/{helpers.ts => types.ts} | 12 ++- .../entity_types/common.ts | 5 +- .../get_united_definition.test.ts | 18 ++-- 19 files changed, 248 insertions(+), 128 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/helpers.tsx rename x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/{helpers.ts => types.ts} (52%) diff --git a/oas_docs/output/kibana.serverless.staging.yaml b/oas_docs/output/kibana.serverless.staging.yaml index 3f37d19f8e5e3..05f614ede3df7 100644 --- a/oas_docs/output/kibana.serverless.staging.yaml +++ b/oas_docs/output/kibana.serverless.staging.yaml @@ -48885,9 +48885,7 @@ components: name: type: string source: - items: - type: string - type: array + type: string required: - name - source @@ -49039,9 +49037,7 @@ components: name: type: string source: - items: - type: string - type: array + type: string required: - name - source diff --git a/oas_docs/output/kibana.serverless.yaml b/oas_docs/output/kibana.serverless.yaml index 3f37d19f8e5e3..05f614ede3df7 100644 --- a/oas_docs/output/kibana.serverless.yaml +++ b/oas_docs/output/kibana.serverless.yaml @@ -48885,9 +48885,7 @@ components: name: type: string source: - items: - type: string - type: array + type: string required: - name - source @@ -49039,9 +49037,7 @@ components: name: type: string source: - items: - type: string - type: array + type: string required: - name - source diff --git a/oas_docs/output/kibana.staging.yaml b/oas_docs/output/kibana.staging.yaml index 76ccd5ef75775..da06e3748c05b 100644 --- a/oas_docs/output/kibana.staging.yaml +++ b/oas_docs/output/kibana.staging.yaml @@ -57266,9 +57266,7 @@ components: name: type: string source: - items: - type: string - type: array + type: string required: - name - source @@ -57420,9 +57418,7 @@ components: name: type: string source: - items: - type: string - type: array + type: string required: - name - source diff --git a/oas_docs/output/kibana.yaml b/oas_docs/output/kibana.yaml index 76ccd5ef75775..da06e3748c05b 100644 --- a/oas_docs/output/kibana.yaml +++ b/oas_docs/output/kibana.yaml @@ -57266,9 +57266,7 @@ components: name: type: string source: - items: - type: string - type: array + type: string required: - name - source @@ -57420,9 +57418,7 @@ components: name: type: string source: - items: - type: string - type: array + type: string required: - name - source diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.gen.ts b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.gen.ts index 7359d36c9cbfa..77607a6ceb863 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.gen.ts +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.gen.ts @@ -24,7 +24,7 @@ export const UserEntity = z.object({ '@timestamp': z.string().datetime(), entity: z.object({ name: z.string(), - source: z.array(z.string()), + source: z.string(), }), user: z.object({ full_name: z.array(z.string()).optional(), @@ -48,7 +48,7 @@ export const HostEntity = z.object({ '@timestamp': z.string().datetime(), entity: z.object({ name: z.string(), - source: z.array(z.string()), + source: z.string(), }), host: z.object({ hostname: z.array(z.string()).optional(), diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.schema.yaml b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.schema.yaml index 35314dfed9f54..045a04ff4867a 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/entity_store/entities/common.schema.yaml @@ -22,12 +22,10 @@ components: - name - source properties: - name: + name: type: string source: - type: array - items: - type: string + type: string user: type: object properties: @@ -84,12 +82,10 @@ components: - name - source properties: - name: + name: type: string source: - type: array - items: - type: string + type: string host: type: object properties: diff --git a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml index d3cce9170ae6a..fef2850b44c90 100644 --- a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml @@ -925,9 +925,7 @@ components: name: type: string source: - items: - type: string - type: array + type: string required: - name - source @@ -1077,9 +1075,7 @@ components: name: type: string source: - items: - type: string - type: array + type: string required: - name - source diff --git a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml index eecca3fe07ae6..3a5054f17a460 100644 --- a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_entity_analytics_api_2023_10_31.bundled.schema.yaml @@ -925,9 +925,7 @@ components: name: type: string source: - items: - type: string - type: array + type: string required: - name - source @@ -1077,9 +1075,7 @@ components: name: type: string source: - items: - type: string - type: array + type: string required: - name - source diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/components/entity_source_filter.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/components/entity_source_filter.tsx index aac8aad170f3f..bc295b6cde439 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/components/entity_source_filter.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/components/entity_source_filter.tsx @@ -8,30 +8,26 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { MultiselectFilter } from '../../../../common/components/multiselect_filter'; +import { EntitySourceTag } from '../types'; interface SourceFilterProps { - selectedItems: EntitySource[]; - onChange: (selectedItems: EntitySource[]) => void; + selectedItems: EntitySourceTag[]; + onChange: (selectedItems: EntitySourceTag[]) => void; } -export enum EntitySource { - CSV_UPLOAD = 'CSV upload', - EVENTS = 'Events', -} -// TODO Fix the Entity Source field before using it export const EntitySourceFilter: React.FC = ({ selectedItems, onChange }) => { return ( - + title={i18n.translate( 'xpack.securitySolution.entityAnalytics.entityStore.entitySource.filterTitle', { defaultMessage: 'Source', } )} - items={Object.values(EntitySource)} + items={Object.values(EntitySourceTag)} selectedItems={selectedItems} onSelectionChange={onChange} - width={140} + width={190} /> ); }; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.test.tsx index b105a87fd8720..68039f94dd0ee 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.test.tsx @@ -33,7 +33,7 @@ const responseData: ListEntitiesResponse = { user: { name: entityName }, entity: { name: entityName, - source: ['source'], + source: 'test-index', }, }, ], diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.tsx index a6e058af34392..fc821bead61f0 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.tsx @@ -21,12 +21,13 @@ import { EntityType } from '../../../../common/api/entity_analytics/entity_store import type { Criteria } from '../../../explore/components/paginated_table'; import { PaginatedTable } from '../../../explore/components/paginated_table'; import { SeverityFilter } from '../severity/severity_filter'; -import type { EntitySource } from './components/entity_source_filter'; +import { EntitySourceFilter } from './components/entity_source_filter'; import { useEntitiesListFilters } from './hooks/use_entities_list_filters'; import { AssetCriticalityFilter } from '../asset_criticality/asset_criticality_filter'; import { useEntitiesListQuery } from './hooks/use_entities_list_query'; import { ENTITIES_LIST_TABLE_ID, rowItems } from './constants'; import { useEntitiesListColumns } from './hooks/use_entities_list_columns'; +import type { EntitySourceTag } from './types'; export const EntitiesList: React.FC = () => { const { deleteQuery, setQuery, isInitializing, from, to } = useGlobalTime(); @@ -40,7 +41,7 @@ export const EntitiesList: React.FC = () => { const [selectedSeverities, setSelectedSeverities] = useState([]); const [selectedCriticalities, setSelectedCriticalities] = useState([]); - const [selectedSources, _] = useState([]); + const [selectedSources, setSelectedSources] = useState([]); const filter = useEntitiesListFilters({ selectedSeverities, @@ -147,6 +148,7 @@ export const EntitiesList: React.FC = () => { selectedItems={selectedCriticalities} onChange={setSelectedCriticalities} /> + diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/helpers.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/helpers.test.ts index 6e3ba0e6d09d1..55fb85bf9158b 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/helpers.test.ts @@ -5,40 +5,70 @@ * 2.0. */ -import { isUserEntity } from './helpers'; +import { isUserEntity, sourceFieldToText } from './helpers'; import type { Entity, UserEntity, } from '../../../../common/api/entity_analytics/entity_store/entities/common.gen'; +import { render } from '@testing-library/react'; +import { TestProviders } from '@kbn/timelines-plugin/public/mock'; -describe('isUserEntity', () => { - it('should return true if the record is a UserEntity', () => { - const userEntity: UserEntity = { - '@timestamp': '2021-08-02T14:00:00.000Z', - user: { - name: 'test_user', - }, - entity: { - name: 'test_user', - source: ['logs-test'], - }, - }; - - expect(isUserEntity(userEntity)).toBe(true); +describe('helpers', () => { + describe('isUserEntity', () => { + it('should return true if the record is a UserEntity', () => { + const userEntity: UserEntity = { + '@timestamp': '2021-08-02T14:00:00.000Z', + user: { + name: 'test_user', + }, + entity: { + name: 'test_user', + source: 'logs-test', + }, + }; + + expect(isUserEntity(userEntity)).toBe(true); + }); + + it('should return false if the record is not a UserEntity', () => { + const nonUserEntity: Entity = { + '@timestamp': '2021-08-02T14:00:00.000Z', + host: { + name: 'test_host', + }, + entity: { + name: 'test_host', + source: 'logs-test', + }, + }; + + expect(isUserEntity(nonUserEntity)).toBe(false); + }); }); - it('should return false if the record is not a UserEntity', () => { - const nonUserEntity: Entity = { - '@timestamp': '2021-08-02T14:00:00.000Z', - host: { - name: 'test_host', - }, - entity: { - name: 'test_host', - source: ['logs-test'], - }, - }; - - expect(isUserEntity(nonUserEntity)).toBe(false); + describe('sourceFieldToText', () => { + it("should return 'Events' if the value isn't risk or asset", () => { + const { container } = render(sourceFieldToText('anything'), { + wrapper: TestProviders, + }); + + expect(container).toHaveTextContent('Events'); + }); + + it("should return 'Risk' if the value is a risk index", () => { + const { container } = render(sourceFieldToText('risk-score.risk-score-default'), { + wrapper: TestProviders, + }); + + expect(container).toHaveTextContent('Risk'); + }); + + it("should return 'Asset Criticality' if the value is a asset criticality index", () => { + const { container } = render(sourceFieldToText('.asset-criticality.asset-criticality-*'), { + wrapper: TestProviders, + }); + + expect(container).toHaveTextContent('Asset Criticality'); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/helpers.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/helpers.tsx new file mode 100644 index 0000000000000..e339a63be7064 --- /dev/null +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/helpers.tsx @@ -0,0 +1,46 @@ +/* + * 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 { FormattedMessage } from '@kbn/i18n-react'; +import { + ASSET_CRITICALITY_INDEX_PATTERN, + RISK_SCORE_INDEX_PATTERN, +} from '../../../../common/constants'; +import type { + Entity, + UserEntity, +} from '../../../../common/api/entity_analytics/entity_store/entities/common.gen'; + +export const isUserEntity = (record: Entity): record is UserEntity => + !!(record as UserEntity)?.user; + +export const sourceFieldToText = (source: string) => { + if (source.match(`^${RISK_SCORE_INDEX_PATTERN}`)) { + return ( + + ); + } + + if (source.match(`^${ASSET_CRITICALITY_INDEX_PATTERN}`)) { + return ( + + ); + } + + return ( + + ); +}; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_columns.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_columns.tsx index 52439d10a0000..e1af7152a843d 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_columns.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_columns.tsx @@ -17,9 +17,9 @@ import { RiskScoreLevel } from '../../severity/common'; import { getEmptyTagValue } from '../../../../common/components/empty_value'; import type { Columns } from '../../../../explore/components/paginated_table'; import type { Entity } from '../../../../../common/api/entity_analytics/entity_store/entities/common.gen'; -import type { CriticalityLevels } from '../../../../../common/constants'; +import { type CriticalityLevels } from '../../../../../common/constants'; import { ENTITIES_LIST_TABLE_ID } from '../constants'; -import { isUserEntity } from '../helpers'; +import { isUserEntity, sourceFieldToText } from '../helpers'; import { CRITICALITY_LEVEL_TITLE } from '../../asset_criticality/translations'; export type EntitiesListColumns = [ @@ -110,7 +110,7 @@ export const useEntitiesListColumns = (): EntitiesListColumns => { truncateText: { lines: 2 }, render: (source: string | undefined) => { if (source != null) { - return {source}; + return sourceFieldToText(source); } return getEmptyTagValue(); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_filters.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_filters.test.ts index de5f706d4524c..cdf0583374538 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_filters.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_filters.test.ts @@ -11,7 +11,7 @@ import { useGlobalFilterQuery } from '../../../../common/hooks/use_global_filter import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { CriticalityLevels } from '../../../../../common/constants'; import { RiskSeverity } from '../../../../../common/search_strategy'; -import { EntitySource } from '../components/entity_source_filter'; +import { EntitySourceTag } from '../types'; jest.mock('../../../../common/hooks/use_global_filter_query'); @@ -52,7 +52,6 @@ describe('useEntitiesListFilters', () => { { term: { 'host.risk.calculated_level': RiskSeverity.High } }, { term: { 'user.risk.calculated_level': RiskSeverity.High } }, ], - minimum_should_match: 1, }, }, ]; @@ -72,7 +71,6 @@ describe('useEntitiesListFilters', () => { const expectedFilters: QueryDslQueryContainer[] = [ { bool: { - minimum_should_match: 1, should: [ { term: { @@ -97,13 +95,48 @@ describe('useEntitiesListFilters', () => { useEntitiesListFilters({ selectedSeverities: [], selectedCriticalities: [], - selectedSources: [EntitySource.CSV_UPLOAD, EntitySource.EVENTS], + selectedSources: [EntitySourceTag.criticality, EntitySourceTag.risk], }) ); const expectedFilters: QueryDslQueryContainer[] = [ - { term: { 'entity.source': EntitySource.CSV_UPLOAD } }, - { term: { 'entity.source': EntitySource.EVENTS } }, + { + bool: { + should: [ + { wildcard: { 'entity.source': '.asset-criticality.asset-criticality-*' } }, + { wildcard: { 'entity.source': 'risk-score.risk-score-*' } }, + ], + }, + }, + ]; + + expect(result.current).toEqual(expectedFilters); + }); + + it('should return source events filters when events is selected', () => { + const { result } = renderHook(() => + useEntitiesListFilters({ + selectedSeverities: [], + selectedCriticalities: [], + selectedSources: [EntitySourceTag.events], + }) + ); + + const expectedFilters: QueryDslQueryContainer[] = [ + { + bool: { + should: [ + { + bool: { + must_not: [ + { wildcard: { 'entity.source': '.asset-criticality.asset-criticality-*' } }, + { wildcard: { 'entity.source': 'risk-score.risk-score-*' } }, + ], + }, + }, + ], + }, + }, ]; expect(result.current).toEqual(expectedFilters); @@ -132,7 +165,7 @@ describe('useEntitiesListFilters', () => { useEntitiesListFilters({ selectedSeverities: [RiskSeverity.Low], selectedCriticalities: [CriticalityLevels.HIGH_IMPACT], - selectedSources: [EntitySource.CSV_UPLOAD], + selectedSources: [EntitySourceTag.risk], }) ); @@ -143,16 +176,18 @@ describe('useEntitiesListFilters', () => { { term: { 'host.risk.calculated_level': RiskSeverity.Low } }, { term: { 'user.risk.calculated_level': RiskSeverity.Low } }, ], - minimum_should_match: 1, }, }, { bool: { should: [{ term: { 'asset.criticality': CriticalityLevels.HIGH_IMPACT } }], - minimum_should_match: 1, }, }, - { term: { 'entity.source': EntitySource.CSV_UPLOAD } }, + { + bool: { + should: [{ wildcard: { 'entity.source': 'risk-score.risk-score-*' } }], + }, + }, globalQuery, ]; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_filters.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_filters.ts index 634f3f61c1590..ba720025f4a59 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_filters.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_filters.ts @@ -7,15 +7,19 @@ import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { useMemo } from 'react'; -import type { CriticalityLevels } from '../../../../../common/constants'; +import { + ASSET_CRITICALITY_INDEX_PATTERN, + RISK_SCORE_INDEX_PATTERN, + type CriticalityLevels, +} from '../../../../../common/constants'; import type { RiskSeverity } from '../../../../../common/search_strategy'; import { useGlobalFilterQuery } from '../../../../common/hooks/use_global_filter_query'; -import type { EntitySource } from '../components/entity_source_filter'; +import { EntitySourceTag } from '../types'; interface UseEntitiesListFiltersParams { selectedSeverities: RiskSeverity[]; selectedCriticalities: CriticalityLevels[]; - selectedSources: EntitySource[]; + selectedSources: EntitySourceTag[]; } export const useEntitiesListFilters = ({ @@ -35,17 +39,20 @@ export const useEntitiesListFilters = ({ 'asset.criticality': value, }, })), - minimum_should_match: 1, }, }, ] : []; - const sourceFilter: QueryDslQueryContainer[] = selectedSources.map((value) => ({ - term: { - 'entity.source': value, - }, - })); + const sourceFilter: QueryDslQueryContainer[] = selectedSources.length + ? [ + { + bool: { + should: selectedSources.map((tag) => getSourceTagFilterQuery(tag)), + }, + }, + ] + : []; const severityFilter: QueryDslQueryContainer[] = selectedSeverities.length ? [ @@ -63,7 +70,6 @@ export const useEntitiesListFilters = ({ }, }, ]), - minimum_should_match: 1, }, }, ] @@ -80,3 +86,37 @@ export const useEntitiesListFilters = ({ return filterList; }, [globalQuery, selectedCriticalities, selectedSeverities, selectedSources]); }; + +const getSourceTagFilterQuery = (tag: EntitySourceTag): QueryDslQueryContainer => { + if (tag === EntitySourceTag.risk) { + return { + wildcard: { + 'entity.source': RISK_SCORE_INDEX_PATTERN, + }, + }; + } + if (tag === EntitySourceTag.criticality) { + return { + wildcard: { + 'entity.source': ASSET_CRITICALITY_INDEX_PATTERN, + }, + }; + } + + return { + bool: { + must_not: [ + { + wildcard: { + 'entity.source': ASSET_CRITICALITY_INDEX_PATTERN, + }, + }, + { + wildcard: { + 'entity.source': RISK_SCORE_INDEX_PATTERN, + }, + }, + ], + }, + }; +}; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/helpers.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/types.ts similarity index 52% rename from x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/helpers.ts rename to x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/types.ts index 61e9b2be8b0ab..0adabf36eb436 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/helpers.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/types.ts @@ -5,10 +5,8 @@ * 2.0. */ -import type { - Entity, - UserEntity, -} from '../../../../common/api/entity_analytics/entity_store/entities/common.gen'; - -export const isUserEntity = (record: Entity): record is UserEntity => - !!(record as UserEntity)?.user; +export enum EntitySourceTag { + 'risk' = 'Risk', + 'criticality' = 'Asset Criticality', + 'events' = 'Events', +} diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/united_entity_definitions/entity_types/common.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/united_entity_definitions/entity_types/common.ts index 2f0213d5f3820..ac974bf119d4a 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/united_entity_definitions/entity_types/common.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/united_entity_definitions/entity_types/common.ts @@ -7,7 +7,7 @@ import type { EntityType } from '../../../../../../common/api/entity_analytics/entity_store'; import { getIdentityFieldForEntityType } from '../../utils'; -import { collectValues, newestValue } from '../definition_utils'; +import { oldestValue, newestValue } from '../definition_utils'; import type { UnitedDefinitionField } from '../types'; export const getCommonUnitedFieldDefinitions = ({ @@ -19,10 +19,9 @@ export const getCommonUnitedFieldDefinitions = ({ }): UnitedDefinitionField[] => { const identityField = getIdentityFieldForEntityType(entityType); return [ - collectValues({ + oldestValue({ sourceField: '_index', field: 'entity.source', - fieldHistoryLength, }), newestValue({ field: 'asset.criticality' }), newestValue({ diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/united_entity_definitions/get_united_definition.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/united_entity_definitions/get_united_definition.test.ts index 2657917d45a78..81a381bc91873 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/united_entity_definitions/get_united_definition.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/united_entity_definitions/get_united_definition.test.ts @@ -117,8 +117,7 @@ describe('getUnitedEntityDefinition', () => { }, Object { "field": "entity.source", - "maxLength": 10, - "operation": "collect_values", + "operation": "prefer_oldest_value", }, Object { "field": "asset.criticality", @@ -219,8 +218,10 @@ describe('getUnitedEntityDefinition', () => { }, Object { "aggregation": Object { - "limit": 10, - "type": "terms", + "sort": Object { + "@timestamp": "asc", + }, + "type": "top_value", }, "destination": "entity.source", "source": "_index", @@ -373,8 +374,7 @@ describe('getUnitedEntityDefinition', () => { }, Object { "field": "entity.source", - "maxLength": 10, - "operation": "collect_values", + "operation": "prefer_oldest_value", }, Object { "field": "asset.criticality", @@ -467,8 +467,10 @@ describe('getUnitedEntityDefinition', () => { }, Object { "aggregation": Object { - "limit": 10, - "type": "terms", + "sort": Object { + "@timestamp": "asc", + }, + "type": "top_value", }, "destination": "entity.source", "source": "_index", From 72db703cd2bcedb8c93a442bb42fda5f8cdcc338 Mon Sep 17 00:00:00 2001 From: Pablo Machado Date: Wed, 23 Oct 2024 10:05:28 +0200 Subject: [PATCH 047/146] [SecuritySolution] Fix EntitiesList 'name' column sorting (#197225) ## Summary Fix EntitiesList 'name' column sorting. https://github.com/user-attachments/assets/04a745d8-bae0-4c33-8ff2-f37e8caf4108 --- .../components/entity_store/entities_list.test.tsx | 2 +- .../components/entity_store/hooks/use_entities_list_columns.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.test.tsx index 68039f94dd0ee..0e598d6463c5a 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.test.tsx @@ -106,7 +106,7 @@ describe('EntitiesList', () => { fireEvent.click(columnHeader); expect(mockUseEntitiesListQuery).toHaveBeenCalledWith( expect.objectContaining({ - sortField: 'entity.displayName.keyword', + sortField: 'entity.name.text', sortOrder: 'asc', }) ); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_columns.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_columns.tsx index e1af7152a843d..974a80454ee21 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_columns.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entities_list_columns.tsx @@ -79,7 +79,7 @@ export const useEntitiesListColumns = (): EntitiesListColumns => { width: '5%', }, { - field: 'entity.displayName.keyword', + field: 'entity.name.text', name: ( Date: Wed, 23 Oct 2024 04:15:35 -0400 Subject: [PATCH 048/146] [Search: Inference Management UI] Adding restriction on deleting preconfigured endpoints (#196580) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Disables the delete action when the endpoints are preconfigured. ![Screenshot 2024-10-18 at 12 12 20 PM](https://github.com/user-attachments/assets/6684b5c6-5f7d-434f-83e3-74872125753b) ### Checklist Delete any items that are not applicable to this PR. - [X] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [X] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [X] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [X] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../all_inference_endpoints/constants.ts | 5 ++ .../delete/confirm_delete_endpoint/index.tsx | 1 + .../actions/delete/delete_action.test.tsx | 59 ++++++++++++++++ .../actions/delete/delete_action.tsx | 3 + .../render_endpoint/endpoint_info.tsx | 20 +++++- .../render_endpoint/translations.ts | 15 +++++ .../tabular_page.test.tsx | 67 +++++++++++++++++-- .../all_inference_endpoints/tabular_page.tsx | 1 - .../preconfigured_endpoint_helper.test.ts | 23 +++++++ .../utils/preconfigured_endpoint_helper.ts | 11 +++ 10 files changed, 195 insertions(+), 10 deletions(-) create mode 100644 x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/delete_action.test.tsx create mode 100644 x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_endpoint/translations.ts create mode 100644 x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.test.ts create mode 100644 x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.ts diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/constants.ts b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/constants.ts index 7ce1e578f1db0..26b6a93cec9fa 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/constants.ts +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/constants.ts @@ -34,3 +34,8 @@ export const DEFAULT_INFERENCE_ENDPOINTS_TABLE_STATE: AllInferenceEndpointsTable }; export const PIPELINE_URL = 'ingest/ingest_pipelines'; + +export const PRECONFIGURED_ENDPOINTS = { + ELSER: '.elser-2', + E5: '.multi-e5-small', +}; diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/confirm_delete_endpoint/index.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/confirm_delete_endpoint/index.tsx index ea5c35178f9bf..06bd585c0eb28 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/confirm_delete_endpoint/index.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/confirm_delete_endpoint/index.tsx @@ -75,6 +75,7 @@ export const ConfirmDeleteEndpointModal: React.FC {i18n.CONFIRM_DELETE_WARNING} diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/delete_action.test.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/delete_action.test.tsx new file mode 100644 index 0000000000000..22c509ca22989 --- /dev/null +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/delete_action.test.tsx @@ -0,0 +1,59 @@ +/* + * 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 { render, screen, fireEvent } from '@testing-library/react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import React from 'react'; + +import { DeleteAction } from './delete_action'; +import { InferenceEndpointUI } from '../../../../types'; + +describe('Delete Action', () => { + const mockProvider = { + inference_id: 'my-hugging-face', + service: 'hugging_face', + service_settings: { + api_key: 'aaaa', + url: 'https://dummy.huggingface.com', + }, + task_settings: {}, + } as any; + + const mockItem: InferenceEndpointUI = { + endpoint: 'my-hugging-face', + provider: mockProvider, + type: 'text_embedding', + }; + + const Wrapper = ({ item }: { item: InferenceEndpointUI }) => { + const queryClient = new QueryClient(); + return ( + + + + ); + }; + it('renders', () => { + render(); + + expect(screen.getByTestId('inferenceUIDeleteAction')).toBeEnabled(); + }); + + it('disable the delete action for preconfigured endpoint', () => { + const preconfiguredMockItem = { ...mockItem, endpoint: '.elser-2' }; + render(); + + expect(screen.getByTestId('inferenceUIDeleteAction')).toBeDisabled(); + }); + + it('loads confirm delete modal', () => { + render(); + + fireEvent.click(screen.getByTestId('inferenceUIDeleteAction')); + expect(screen.getByTestId('deleteModalForInferenceUI')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/delete_action.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/delete_action.tsx index f932a3d25ed21..fb31aeb31dcaa 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/delete_action.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_actions/actions/delete/delete_action.tsx @@ -8,6 +8,7 @@ import { EuiButtonIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { useState } from 'react'; +import { isEndpointPreconfigured } from '../../../../../../utils/preconfigured_endpoint_helper'; import { useDeleteEndpoint } from '../../../../../../hooks/use_delete_endpoint'; import { InferenceEndpointUI } from '../../../../types'; import { ConfirmDeleteEndpointModal } from './confirm_delete_endpoint'; @@ -39,6 +40,8 @@ export const DeleteAction: React.FC = ({ selectedEndpoint }) defaultMessage: 'Delete inference endpoint {selectedEndpointName}', values: { selectedEndpointName: selectedEndpoint.endpoint }, })} + data-test-subj="inferenceUIDeleteAction" + disabled={isEndpointPreconfigured(selectedEndpoint.endpoint)} key="delete" iconType="trash" color="danger" diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_endpoint/endpoint_info.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_endpoint/endpoint_info.tsx index 3d810a24a9ffc..26b12328dafd4 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_endpoint/endpoint_info.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_endpoint/endpoint_info.tsx @@ -5,14 +5,28 @@ * 2.0. */ +import { EuiBetaBadge, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React from 'react'; +import { isEndpointPreconfigured } from '../../../../utils/preconfigured_endpoint_helper'; +import * as i18n from './translations'; export interface EndpointInfoProps { inferenceId: string; } export const EndpointInfo: React.FC = ({ inferenceId }) => ( - - {inferenceId} - + + + + {inferenceId} + + + + + {isEndpointPreconfigured(inferenceId) ? ( + + ) : null} + + + ); diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_endpoint/translations.ts b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_endpoint/translations.ts new file mode 100644 index 0000000000000..70b1576a9ddc0 --- /dev/null +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/render_table_columns/render_endpoint/translations.ts @@ -0,0 +1,15 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const PRECONFIGURED_LABEL = i18n.translate( + 'xpack.searchInferenceEndpoints.elasticsearch.endpointInfo.preconfigured', + { + defaultMessage: 'PRECONFIGURED', + } +); diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/tabular_page.test.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/tabular_page.test.tsx index cb23ba650e5fa..91cc303ed4568 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/tabular_page.test.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/tabular_page.test.tsx @@ -45,6 +45,28 @@ const inferenceEndpoints = [ }, task_settings: {}, }, + { + inference_id: '.elser-2', + task_type: 'sparse_embedding', + service: 'elasticsearch', + service_settings: { + num_allocations: 1, + num_threads: 1, + model_id: '.elser_model_2', + }, + task_settings: {}, + }, + { + inference_id: '.multi-e5-small', + task_type: 'text_embedding', + service: 'elasticsearch', + service_settings: { + num_allocations: 1, + num_threads: 1, + model_id: '.multilingual-e5-small', + }, + task_settings: {}, + }, ] as InferenceAPIConfigResponse[]; jest.mock('../../hooks/use_delete_endpoint', () => ({ @@ -58,9 +80,11 @@ describe('When the tabular page is loaded', () => { render(); const rows = screen.getAllByRole('row'); - expect(rows[1]).toHaveTextContent('local-model'); - expect(rows[2]).toHaveTextContent('my-elser-model-05'); - expect(rows[3]).toHaveTextContent('third-party-model'); + expect(rows[1]).toHaveTextContent('.elser-2'); + expect(rows[2]).toHaveTextContent('.multi-e5-small'); + expect(rows[3]).toHaveTextContent('local-model'); + expect(rows[4]).toHaveTextContent('my-elser-model-05'); + expect(rows[5]).toHaveTextContent('third-party-model'); }); it('should display all service and model ids in the table', () => { @@ -68,12 +92,43 @@ describe('When the tabular page is loaded', () => { const rows = screen.getAllByRole('row'); expect(rows[1]).toHaveTextContent('Elasticsearch'); - expect(rows[1]).toHaveTextContent('.own_model'); + expect(rows[1]).toHaveTextContent('.elser_model_2'); expect(rows[2]).toHaveTextContent('Elasticsearch'); - expect(rows[2]).toHaveTextContent('.elser_model_2'); + expect(rows[2]).toHaveTextContent('.multilingual-e5-small'); - expect(rows[3]).toHaveTextContent('OpenAI'); + expect(rows[3]).toHaveTextContent('Elasticsearch'); expect(rows[3]).toHaveTextContent('.own_model'); + + expect(rows[4]).toHaveTextContent('Elasticsearch'); + expect(rows[4]).toHaveTextContent('.elser_model_2'); + + expect(rows[5]).toHaveTextContent('OpenAI'); + expect(rows[5]).toHaveTextContent('.own_model'); + }); + + it('should only disable delete action for preconfigured endpoints', () => { + render(); + + const deleteActions = screen.getAllByTestId('inferenceUIDeleteAction'); + + expect(deleteActions[0]).toBeDisabled(); + expect(deleteActions[1]).toBeDisabled(); + expect(deleteActions[2]).toBeEnabled(); + expect(deleteActions[3]).toBeEnabled(); + expect(deleteActions[4]).toBeEnabled(); + }); + + it('should show preconfigured badge only for preconfigured endpoints', () => { + render(); + + const preconfigured = 'PRECONFIGURED'; + + const rows = screen.getAllByRole('row'); + expect(rows[1]).toHaveTextContent(preconfigured); + expect(rows[2]).toHaveTextContent(preconfigured); + expect(rows[3]).not.toHaveTextContent(preconfigured); + expect(rows[4]).not.toHaveTextContent(preconfigured); + expect(rows[5]).not.toHaveTextContent(preconfigured); }); }); diff --git a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/tabular_page.tsx b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/tabular_page.tsx index 88a18a25b5a79..4cf4b3112396d 100644 --- a/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/tabular_page.tsx +++ b/x-pack/plugins/search_inference_endpoints/public/components/all_inference_endpoints/tabular_page.tsx @@ -60,7 +60,6 @@ export const TabularPage: React.FC = ({ inferenceEndpoints }) return null; }, sortable: true, - truncateText: true, width: '300px', }, { diff --git a/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.test.ts b/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.test.ts new file mode 100644 index 0000000000000..b853109352dd9 --- /dev/null +++ b/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.test.ts @@ -0,0 +1,23 @@ +/* + * 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 { PRECONFIGURED_ENDPOINTS } from '../components/all_inference_endpoints/constants'; +import { isEndpointPreconfigured } from './preconfigured_endpoint_helper'; + +describe('Preconfigured Endpoint helper', () => { + it('return true for preconfigured elser', () => { + expect(isEndpointPreconfigured(PRECONFIGURED_ENDPOINTS.ELSER)).toEqual(true); + }); + + it('return true for preconfigured e5', () => { + expect(isEndpointPreconfigured(PRECONFIGURED_ENDPOINTS.E5)).toEqual(true); + }); + + it('return false for other endpoints', () => { + expect(isEndpointPreconfigured('other-endpoints')).toEqual(false); + }); +}); diff --git a/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.ts b/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.ts new file mode 100644 index 0000000000000..418e7e95319ef --- /dev/null +++ b/x-pack/plugins/search_inference_endpoints/public/utils/preconfigured_endpoint_helper.ts @@ -0,0 +1,11 @@ +/* + * 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 { PRECONFIGURED_ENDPOINTS } from '../components/all_inference_endpoints/constants'; + +export const isEndpointPreconfigured = (endpoint: string) => + Object.values(PRECONFIGURED_ENDPOINTS).includes(endpoint); From e70b533bdb443a4ebc8229237583160eeeaad412 Mon Sep 17 00:00:00 2001 From: Ash <1849116+ashokaditya@users.noreply.github.com> Date: Wed, 23 Oct 2024 10:33:37 +0200 Subject: [PATCH 049/146] [SecuritySolution][Endpoint] Re-enabled skipped tests (#197220) ## Summary This PR attempts to fix tests skipped in elastic/kibana/issues/193092 and elastic/kibana/issues/193554. The tests seem to be flaky right after an [upgrade to `user-event`](https://github.com/elastic/kibana/pull/189949) dependency on Sep 10th. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed --- .../actions_log_users_filter.test.tsx | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx index 5d47cfb3b43c3..535c0114426dd 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx @@ -15,9 +15,7 @@ import { import { ActionsLogUsersFilter } from './actions_log_users_filter'; import { MANAGEMENT_PATH } from '../../../../../common/constants'; -// FLAKY: https://github.com/elastic/kibana/issues/193554 -// FLAKY: https://github.com/elastic/kibana/issues/193092 -describe.skip('Users filter', () => { +describe('Users filter', () => { let render: ( props?: React.ComponentProps ) => ReturnType; @@ -29,7 +27,7 @@ describe.skip('Users filter', () => { const filterPrefix = 'users-filter'; let onChangeUsersFilter: jest.Mock; - beforeEach(async () => { + beforeEach(() => { onChangeUsersFilter = jest.fn(); mockedContext = createAppRootMockRenderer(); ({ history } = mockedContext); @@ -58,8 +56,8 @@ describe.skip('Users filter', () => { render(); const searchInput = renderResult.getByTestId(`${testPrefix}-${filterPrefix}-search`); - await userEvent.type(searchInput, 'usernameX'); - await userEvent.type(searchInput, '{enter}'); + await userEvent.type(searchInput, 'usernameX', { delay: 10 }); + await userEvent.keyboard('{enter}'); expect(onChangeUsersFilter).toHaveBeenCalledWith(['usernameX']); }); @@ -67,8 +65,8 @@ describe.skip('Users filter', () => { render(); const searchInput = renderResult.getByTestId(`${testPrefix}-${filterPrefix}-search`); - await userEvent.type(searchInput, 'usernameX,usernameY,usernameZ'); - await userEvent.type(searchInput, '{enter}'); + await userEvent.type(searchInput, 'usernameX,usernameY,usernameZ', { delay: 10 }); + await userEvent.keyboard('{enter}'); expect(onChangeUsersFilter).toHaveBeenCalledWith(['usernameX', 'usernameY', 'usernameZ']); }); @@ -76,8 +74,8 @@ describe.skip('Users filter', () => { render(); const searchInput = renderResult.getByTestId(`${testPrefix}-${filterPrefix}-search`); - await userEvent.type(searchInput, ' usernameX '); - await userEvent.type(searchInput, '{enter}'); + await userEvent.type(searchInput, ' usernameX ', { delay: 10 }); + await userEvent.keyboard('{enter}'); expect(onChangeUsersFilter).toHaveBeenCalledWith(['usernameX']); }); @@ -85,8 +83,8 @@ describe.skip('Users filter', () => { render(); const searchInput = renderResult.getByTestId(`${testPrefix}-${filterPrefix}-search`); - await userEvent.type(searchInput, ' , usernameX ,usernameY , '); - await userEvent.type(searchInput, '{enter}'); + await userEvent.type(searchInput, ' , usernameX ,usernameY , ', { delay: 10 }); + await userEvent.keyboard('{enter}'); expect(onChangeUsersFilter).toHaveBeenCalledWith(['usernameX', 'usernameY']); }); }); From eacd46f719e4cc1472a7c073741b0a5e9a8aedcd Mon Sep 17 00:00:00 2001 From: "Quynh Nguyen (Quinn)" <43350163+qn895@users.noreply.github.com> Date: Wed, 23 Oct 2024 04:44:59 -0500 Subject: [PATCH 050/146] [ES|QL] Fix incorrect suggestions after a field is accepted in EVAL (#197139) ## Summary This PR fixes https://github.com/elastic/kibana/issues/194073, which shows incorrect function suggestions after a field name is entered. After: https://github.com/user-attachments/assets/675c1d1c-27e1-40da-97fe-7710cbb518a4 ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### Risk Matrix Delete this section if it is not applicable to this PR. Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release. When forming the risk matrix, consider some of the following examples and how they may potentially impact the change: | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels) - [ ] This will appear in the **Release Notes** and follow the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Elastic Machine --- .../__tests__/autocomplete.suggest.eval.test.ts | 7 +++++++ .../src/autocomplete/autocomplete.ts | 13 ++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts index dcb6fe76f184b..81fd8f7f43902 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts @@ -51,6 +51,13 @@ describe('autocomplete.suggest', () => { ...getFieldNamesByType('any'), ...getFunctionSignaturesByReturnType('eval', 'any', { scalar: true }), ]); + + await assertSuggestions('from a | eval doubleField/', [ + 'doubleField, ', + 'doubleField | ', + 'var0 = ', + ]); + await assertSuggestions('from a | eval doubleField /', [ ...getFunctionSignaturesByReturnType('eval', 'any', { builtin: true, skipAssign: true }, [ 'double', diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts index cbc84232b8eb6..98a26b0c8dd4b 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts @@ -596,6 +596,17 @@ async function getExpressionSuggestionsByType( const suggestions: SuggestionRawDefinition[] = []; + // When user types and accepts autocomplete suggestion, and cursor is placed at the end of a valid field + // we should not show irrelevant functions that might have words matching + const columnWithActiveCursor = commands.find( + (c) => + c.name === command.name && + command.name === 'eval' && + c.args.some((arg) => isColumnItem(arg) && arg.name.includes(EDITOR_MARKER)) + ); + + const shouldShowFunctions = !columnWithActiveCursor; + // in this flow there's a clear plan here from argument definitions so try to follow it if (argDef) { if (argDef.type === 'column' || argDef.type === 'any' || argDef.type === 'function') { @@ -722,7 +733,7 @@ async function getExpressionSuggestionsByType( option?.name, getFieldsByType, { - functions: true, + functions: shouldShowFunctions, fields: false, variables: nodeArg ? undefined : anyVariables, literals: argDef.constantOnly, From 99a19e762daf08376828032e593a9e88befe6d23 Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Wed, 23 Oct 2024 12:29:32 +0200 Subject: [PATCH 051/146] [EDR Workflows] Error message 'the value already exists' shown for duplicate values with the 'is one of' operator on Blocklist tab (#196071) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These changes ensure that the warning displayed to the user for duplicate values remains visible after onBlur. I’ve opted to keep it as a warning rather than an error since entering a duplicate value doesn’t allow the user to “save” it as a selected item in the combo box—it remains an active string in the input field. We don’t block form submission due to this warning; any unselected value in the combo box is stripped out. The red border on the combo box is part of EUI’s behavior when attempting to select a duplicate, and I don’t see an easy way to modify this at the moment. https://github.com/user-attachments/assets/84b6d8af-02a8-41f3-88dc-892ed408a098 --- .../view/components/blocklist_form.test.tsx | 12 ++ .../view/components/blocklist_form.tsx | 116 ++++++++++-------- 2 files changed, 78 insertions(+), 50 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/blocklist_form.test.tsx b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/blocklist_form.test.tsx index 21798594641d8..1c2ed0fd028b9 100644 --- a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/blocklist_form.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/blocklist_form.test.tsx @@ -462,6 +462,18 @@ describe('blocklist form', () => { expect(screen.queryByText(ERRORS.INVALID_PATH)).toBeTruthy(); }); + it('should prevail duplicate value warning on lost focus', async () => { + const item = createItem({ + os_types: [OperatingSystem.WINDOWS], + entries: [createEntry('file.Ext.code_signature', ['valid', 'invalid'])], + }); + render(createProps({ item })); + await user.type(screen.getByRole('combobox'), 'invalid{enter}'); + expect(screen.queryByText(ERRORS.DUPLICATE_VALUE)).toBeTruthy(); + await user.click(screen.getByTestId('blocklist-form-os-select')); + expect(screen.queryByText(ERRORS.DUPLICATE_VALUE)).toBeTruthy(); + }); + it('should warn if single duplicate value entry', async () => { const hash = 'C3AB8FF13720E8AD9047DD39466B3C8974E592C2FA383D4A3960714CAEF0C4F2'; const item = createItem({ diff --git a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/blocklist_form.tsx b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/blocklist_form.tsx index 2163a0f156833..fcdcc016c3f37 100644 --- a/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/blocklist_form.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/blocklist/view/components/blocklist_form.tsx @@ -114,10 +114,8 @@ function isValid(itemValidation: ItemValidation): boolean { // eslint-disable-next-line react/display-name export const BlockListForm = memo( ({ item, policies, policiesIsLoading, onChange, mode }) => { - const [visited, setVisited] = useState<{ name: boolean; value: boolean }>({ - name: false, - value: false, - }); + const [nameVisited, setNameVisited] = useState(false); + const [valueVisited, setValueVisited] = useState({ value: false }); // Use object to trigger re-render const warningsRef = useRef({ name: {}, value: {} }); const errorsRef = useRef({ name: {}, value: {} }); const [selectedPolicies, setSelectedPolicies] = useState([]); @@ -269,57 +267,75 @@ export const BlockListForm = memo( ); }, [displaySingleValueInput]); - const validateValues = useCallback((nextItem: ArtifactFormComponentProps['item']) => { - const os = ((nextItem.os_types ?? [])[0] as OperatingSystem) ?? OperatingSystem.WINDOWS; - const { - field = 'file.hash.*', - type = ListOperatorTypeEnum.MATCH_ANY, - value = [], - } = (nextItem.entries[0] ?? {}) as BlocklistEntry; - - // value can be a string when isOperator is selected - const values = Array.isArray(value) ? value : [value].filter(Boolean); - - const newValueWarnings: ItemValidationNodes = {}; - const newNameErrors: ItemValidationNodes = {}; - const newValueErrors: ItemValidationNodes = {}; - // error if name empty - if (!nextItem.name.trim()) { - newNameErrors.NAME_REQUIRED = createValidationMessage(ERRORS.NAME_REQUIRED); - } + const validateValues = useCallback( + (nextItem: ArtifactFormComponentProps['item'], cleanState = false) => { + const os = ((nextItem.os_types ?? [])[0] as OperatingSystem) ?? OperatingSystem.WINDOWS; + const { + field = 'file.hash.*', + type = ListOperatorTypeEnum.MATCH_ANY, + value = [], + } = (nextItem.entries[0] ?? {}) as BlocklistEntry; + + // value can be a string when isOperator is selected + const values = Array.isArray(value) ? value : [value].filter(Boolean); + + const newValueWarnings: ItemValidationNodes = cleanState + ? {} + : { ...warningsRef.current.value }; + const newNameErrors: ItemValidationNodes = cleanState ? {} : { ...errorsRef.current.name }; + const newValueErrors: ItemValidationNodes = cleanState + ? {} + : { ...errorsRef.current.value }; + + // error if name empty + if (!nextItem.name.trim()) { + newNameErrors.NAME_REQUIRED = createValidationMessage(ERRORS.NAME_REQUIRED); + } else { + delete newNameErrors.NAME_REQUIRED; + } - // error if no values - if (!values.length) { - newValueErrors.VALUE_REQUIRED = createValidationMessage(ERRORS.VALUE_REQUIRED); - } + // error if no values + if (!values.length) { + newValueErrors.VALUE_REQUIRED = createValidationMessage(ERRORS.VALUE_REQUIRED); + } else { + delete newValueErrors.VALUE_REQUIRED; + } - // error if invalid hash - if (field === 'file.hash.*' && values.some((v) => !isValidHash(v))) { - newValueErrors.INVALID_HASH = createValidationMessage(ERRORS.INVALID_HASH); - } + // error if invalid hash + if (field === 'file.hash.*' && values.some((v) => !isValidHash(v))) { + newValueErrors.INVALID_HASH = createValidationMessage(ERRORS.INVALID_HASH); + } else { + delete newValueErrors.INVALID_HASH; + } - const isInvalidPath = values.some((v) => !isPathValid({ os, field, type, value: v })); - // warn if invalid path - if (field !== 'file.hash.*' && isInvalidPath) { - newValueWarnings.INVALID_PATH = createValidationMessage(ERRORS.INVALID_PATH); - } - // warn if duplicates - if (values.length !== uniq(values).length) { - newValueWarnings.DUPLICATE_VALUES = createValidationMessage(ERRORS.DUPLICATE_VALUES); - } + const isInvalidPath = values.some((v) => !isPathValid({ os, field, type, value: v })); + // warn if invalid path + if (field !== 'file.hash.*' && isInvalidPath) { + newValueWarnings.INVALID_PATH = createValidationMessage(ERRORS.INVALID_PATH); + } else { + delete newValueWarnings.INVALID_PATH; + } + // warn if duplicates + if (values.length !== uniq(values).length) { + newValueWarnings.DUPLICATE_VALUES = createValidationMessage(ERRORS.DUPLICATE_VALUES); + } else { + delete newValueWarnings.DUPLICATE_VALUES; + } - warningsRef.current = { ...warningsRef.current, value: newValueWarnings }; - errorsRef.current = { name: newNameErrors, value: newValueErrors }; - }, []); + warningsRef.current = { ...warningsRef.current, value: newValueWarnings }; + errorsRef.current = { name: newNameErrors, value: newValueErrors }; + }, + [] + ); const handleOnNameBlur = useCallback(() => { validateValues(item); - setVisited((prevVisited) => ({ ...prevVisited, name: true })); + setNameVisited(true); }, [item, validateValues]); const handleOnValueBlur = useCallback(() => { validateValues(item); - setVisited((prevVisited) => ({ ...prevVisited, value: true })); + setValueVisited({ value: true }); }, [item, validateValues]); const handleOnNameChange = useCallback( @@ -463,7 +479,7 @@ export const BlockListForm = memo( }; // trigger re-render without modifying item - setVisited((prevVisited) => ({ ...prevVisited })); + setValueVisited((prevState) => ({ ...prevState })); }, [blocklistEntry] ); @@ -495,7 +511,7 @@ export const BlockListForm = memo( entries: [{ ...blocklistEntry, value }], } as ArtifactFormComponentProps['item']; - validateValues(nextItem); + validateValues(nextItem, true); onChange({ isValid: isValid(errorsRef.current), item: nextItem, @@ -518,7 +534,7 @@ export const BlockListForm = memo( validateValues(nextItem as ArtifactFormComponentProps['item']); nextItem.entries[0].value = uniq(nextItem.entries[0].value); - setVisited((prevVisited) => ({ ...prevVisited, value: true })); + setValueVisited({ value: true }); onChange({ isValid: isValid(errorsRef.current), item: nextItem as ArtifactFormComponentProps['item'], @@ -563,7 +579,7 @@ export const BlockListForm = memo( @@ -572,7 +588,7 @@ export const BlockListForm = memo( value={item.name} onChange={handleOnNameChange} onBlur={handleOnNameBlur} - required={visited.name} + required={nameVisited} maxLength={256} data-test-subj={getTestId('name-input')} fullWidth @@ -651,7 +667,7 @@ export const BlockListForm = memo( Date: Wed, 23 Oct 2024 11:38:31 +0100 Subject: [PATCH 052/146] [FTR][Ownership] Assign logstash, metrics ui, etc (#196919) ## Summary Hopefully assigning to not too large of a reviewers list. ### Reasons for Assignments Assigned lists due to the api called is defined here: https://github.com/elastic/kibana/blob/4ed9e5173c6d56a949c15fcb8aa223cfc64fc5f1/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/exceptions.ts#L54 \cc @elastic/security-detection-engine Assigned Logs Shared due to https://github.com/elastic/kibana/pull/189646 \cc @elastic/obs-ux-logs-team Assigned logstash due to https://github.com/elastic/kibana/blob/4ed9e5173c6d56a949c15fcb8aa223cfc64fc5f1/x-pack/plugins/logstash/kibana.jsonc#L4 \cc @elastic/logstash Assigned metris ui due to https://github.com/elastic/kibana/blob/4f85a9989373fae228ab7969b671b6817d5ecf79/x-pack/plugins/observability_solution/infra/kibana.jsonc#L4 \cc @elastic/obs-ux-logs-team & @elastic/obs-ux-infra_services-team Contributes to: https://github.com/elastic/kibana/issues/194817 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine --- .github/CODEOWNERS | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 707592b94a18b..d78ad640d625e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1021,6 +1021,7 @@ packages/kbn-zod-helpers @elastic/security-detection-rule-management # The #CC# prefix delineates Code Coverage, # used for the 'team' designator within Kibana Stats +/x-pack/test/api_integration/apis/metrics_ui @elastic/obs-ux-logs-team @elastic/obs-ux-infra_services-team x-pack/test_serverless/api_integration/test_suites/common/platform_security @elastic/kibana-security # Observability Entities Team (@elastic/obs-entities) @@ -1255,7 +1256,7 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test/alerting_api_integration/observability/index.ts @elastic/obs-ux-management-team /x-pack/test_serverless/api_integration/test_suites/observability/synthetics @elastic/obs-ux-management-team -# Logs +# obs-ux-logs-team /x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts @elastic/obs-ux-logs-team /x-pack/test/api_integration/apis/logs_ui @elastic/obs-ux-logs-team /x-pack/test/dataset_quality_api_integration @elastic/obs-ux-logs-team @@ -1266,6 +1267,7 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test_serverless/functional/test_suites/observability/dataset_quality @elastic/obs-ux-logs-team /x-pack/test_serverless/functional/test_suites/observability/ @elastic/obs-ux-logs-team /src/plugins/unified_doc_viewer/public/components/doc_viewer_logs_overview @elastic/obs-ux-logs-team +/x-pack/test/api_integration/apis/logs_shared @elastic/obs-ux-logs-team # Observability onboarding tour /x-pack/plugins/observability_solution/observability_shared/public/components/tour @elastic/appex-sharedux @@ -1803,6 +1805,7 @@ x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout @elastic/ /x-pack/plugins/security_solution/common/field_maps @elastic/security-detection-engine /x-pack/test/functional/es_archives/entity/risks @elastic/security-detection-engine /x-pack/test/functional/es_archives/entity/host_risk @elastic/security-detection-engine +/x-pack/test/api_integration/apis/lists @elastic/security-detection-engine /x-pack/plugins/security_solution/public/sourcerer @elastic/security-threat-hunting-investigations /x-pack/plugins/security_solution/public/detection_engine/rule_creation @elastic/security-detection-engine @@ -1931,6 +1934,7 @@ x-pack/plugins/security_solution/server/lib/security_integrations @elastic/secur /x-pack/plugins/security_solution_serverless/**/*.scss @elastic/security-design # Logstash +/x-pack/test/api_integration/apis/logstash @elastic/logstash #CC# /x-pack/plugins/logstash/ @elastic/logstash # EUI team From 9349ea4130aeab5a594ccb04986dad695cf1dbe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?= Date: Wed, 23 Oct 2024 13:06:24 +0200 Subject: [PATCH 053/146] Render 'preview' instead of chat on Search mode (#197236) ## Summary Changes label for the button group to render preview instead of chat when search mode selected Screenshot 2024-10-22 at 15 13 23 Screenshot 2024-10-22 at 15 13 19 ### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../public/components/header.test.tsx | 96 +++++++++++++++++++ .../public/components/header.tsx | 11 ++- 2 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 x-pack/plugins/search_playground/public/components/header.test.tsx diff --git a/x-pack/plugins/search_playground/public/components/header.test.tsx b/x-pack/plugins/search_playground/public/components/header.test.tsx new file mode 100644 index 0000000000000..be80e2925a853 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/header.test.tsx @@ -0,0 +1,96 @@ +/* + * 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. + */ + +// create @testing-library/react tests for Header component +// check if EuiButtonGroup is differently labeled based on the selectedPageMode prop + +import { render, screen } from '@testing-library/react'; +import React from 'react'; +import { Header } from './header'; +import { ChatFormFields, PlaygroundPageMode } from '../types'; +import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; +import { EuiForm } from '@elastic/eui'; +import { FormProvider, useForm } from 'react-hook-form'; + +const MockFormProvider = ({ children }: { children: React.ReactElement }) => { + const methods = useForm({ + values: { + [ChatFormFields.indices]: ['index1', 'index2'], + [ChatFormFields.queryFields]: { index1: ['field1'], index2: ['field1'] }, + [ChatFormFields.sourceFields]: { + index1: ['field1'], + index2: ['field1'], + }, + [ChatFormFields.elasticsearchQuery]: { + retriever: { + rrf: { + retrievers: [ + { standard: { query: { multi_match: { query: '{query}', fields: ['field1'] } } } }, + { standard: { query: { multi_match: { query: '{query}', fields: ['field1'] } } } }, + ], + }, + }, + }, + }, + }); + return {children}; +}; +const MockChatForm = ({ + children, + handleSubmit, +}: { + children: React.ReactElement; + handleSubmit: React.FormEventHandler; +}) => ( + + + {children} + + +); + +describe('Header', () => { + it('renders correctly', () => { + render( + + {}}> +
{}} + selectedPageMode={PlaygroundPageMode.chat} + onSelectPageModeChange={() => {}} + /> + + + ); + + expect(screen.getByTestId('chatMode')).toHaveTextContent('Chat'); + expect(screen.getByTestId('queryMode')).toHaveTextContent('Query'); + }); + + it('renders correctly with preview mode', () => { + render( + + {}}> +
{}} + selectedPageMode={PlaygroundPageMode.search} + onSelectPageModeChange={() => {}} + /> + + + ); + + expect(screen.getByTestId('chatMode')).toHaveTextContent('Preview'); + expect(screen.getByTestId('queryMode')).toHaveTextContent('Query'); + }); +}); diff --git a/x-pack/plugins/search_playground/public/components/header.tsx b/x-pack/plugins/search_playground/public/components/header.tsx index 0d6d48a903462..bc3b310d8c41f 100644 --- a/x-pack/plugins/search_playground/public/components/header.tsx +++ b/x-pack/plugins/search_playground/public/components/header.tsx @@ -46,9 +46,14 @@ export const Header: React.FC = ({ const options = [ { id: ViewMode.chat, - label: i18n.translate('xpack.searchPlayground.header.view.chat', { - defaultMessage: 'Chat', - }), + label: + selectedPageMode === PlaygroundPageMode.chat + ? i18n.translate('xpack.searchPlayground.header.view.chat', { + defaultMessage: 'Chat', + }) + : i18n.translate('xpack.searchPlayground.header.view.preview', { + defaultMessage: 'Preview', + }), 'data-test-subj': 'chatMode', }, { From 9c4e67c985cf917a3664151d427a4fcdef0563d6 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Wed, 23 Oct 2024 13:22:24 +0200 Subject: [PATCH 054/146] [Synthetics] Show rules created in Obs Rules page !! (#197215) ## Summary Fixes https://github.com/elastic/kibana/issues/197071 --------- Co-authored-by: Christos Nasikas --- .../src/rule_types/o11y_rules.ts | 3 + .../observability/server/plugin.ts | 4 + .../platform_security/authorization.ts | 920 ++++++++++++++++++ 3 files changed, 927 insertions(+) diff --git a/packages/kbn-rule-data-utils/src/rule_types/o11y_rules.ts b/packages/kbn-rule-data-utils/src/rule_types/o11y_rules.ts index 8743052e84664..5dae1c99b210f 100644 --- a/packages/kbn-rule-data-utils/src/rule_types/o11y_rules.ts +++ b/packages/kbn-rule-data-utils/src/rule_types/o11y_rules.ts @@ -20,3 +20,6 @@ export enum ApmRuleType { TransactionDuration = 'apm.transaction_duration', Anomaly = 'apm.anomaly', } + +export const SYNTHETICS_STATUS_RULE = 'xpack.synthetics.alerts.monitorStatus'; +export const SYNTHETICS_TLS_RULE = 'xpack.synthetics.alerts.tls'; diff --git a/x-pack/plugins/observability_solution/observability/server/plugin.ts b/x-pack/plugins/observability_solution/observability/server/plugin.ts index 6bc21bf5dddf2..7f9a37a5a26c4 100644 --- a/x-pack/plugins/observability_solution/observability/server/plugin.ts +++ b/x-pack/plugins/observability_solution/observability/server/plugin.ts @@ -31,6 +31,8 @@ import { METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID, OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, SLO_BURN_RATE_RULE_TYPE_ID, + SYNTHETICS_STATUS_RULE, + SYNTHETICS_TLS_RULE, } from '@kbn/rule-data-utils'; import { RuleRegistryPluginSetupContract } from '@kbn/rule-registry-plugin/server'; import { SharePluginSetup } from '@kbn/share-plugin/server'; @@ -83,6 +85,8 @@ const o11yRuleTypes = [ ML_ANOMALY_DETECTION_RULE_TYPE_ID, METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID, ...Object.values(ApmRuleType), + SYNTHETICS_STATUS_RULE, + SYNTHETICS_TLS_RULE, ]; export class ObservabilityPlugin implements Plugin { diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts b/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts index 885a34572c1f3..d4cca44448676 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts @@ -655,6 +655,62 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/runSoon", "alerting:apm.anomaly/observability/rule/scheduleBackfill", "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/create", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/delete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/enable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/disable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/create", + "alerting:xpack.synthetics.alerts.tls/observability/rule/delete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/update", + "alerting:xpack.synthetics.alerts.tls/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.tls/observability/rule/enable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/disable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.tls/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/deleteBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -700,6 +756,16 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", "alerting:apm.anomaly/observability/alert/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/update", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/update", ], "minimal_all": Array [ "login:", @@ -1307,6 +1373,62 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/runSoon", "alerting:apm.anomaly/observability/rule/scheduleBackfill", "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/create", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/delete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/enable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/disable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/create", + "alerting:xpack.synthetics.alerts.tls/observability/rule/delete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/update", + "alerting:xpack.synthetics.alerts.tls/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.tls/observability/rule/enable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/disable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.tls/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/deleteBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -1352,6 +1474,16 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", "alerting:apm.anomaly/observability/alert/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/update", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/update", ], "minimal_read": Array [ "login:", @@ -1601,6 +1733,24 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", "alerting:apm.anomaly/observability/rule/getBackfill", "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -1637,6 +1787,14 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/find", "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", ], "read": Array [ "login:", @@ -1886,6 +2044,24 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", "alerting:apm.anomaly/observability/rule/getBackfill", "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -1922,6 +2098,14 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/find", "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", ], "settings_save": Array [ "login:", @@ -2851,6 +3035,62 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/runSoon", "alerting:apm.anomaly/observability/rule/scheduleBackfill", "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/create", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/delete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/enable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/disable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/create", + "alerting:xpack.synthetics.alerts.tls/observability/rule/delete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/update", + "alerting:xpack.synthetics.alerts.tls/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.tls/observability/rule/enable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/disable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.tls/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/deleteBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -2896,6 +3136,16 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", "alerting:apm.anomaly/observability/alert/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/update", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/update", ], "generate_report": Array [ "login:", @@ -3228,6 +3478,62 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/runSoon", "alerting:apm.anomaly/observability/rule/scheduleBackfill", "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/create", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/delete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/enable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/disable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/create", + "alerting:xpack.synthetics.alerts.tls/observability/rule/delete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/update", + "alerting:xpack.synthetics.alerts.tls/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.tls/observability/rule/enable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/disable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.tls/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/deleteBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -3273,6 +3579,16 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", "alerting:apm.anomaly/observability/alert/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/update", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/update", ], "minimal_read": Array [ "login:", @@ -3403,6 +3719,24 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", "alerting:apm.anomaly/observability/rule/getBackfill", "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -3439,6 +3773,14 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/find", "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", ], "read": Array [ "login:", @@ -3577,6 +3919,24 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", "alerting:apm.anomaly/observability/rule/getBackfill", "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -3613,6 +3973,14 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/find", "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", ], "store_search_session": Array [ "login:", @@ -5333,6 +5701,62 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/runSoon", "alerting:apm.anomaly/observability/rule/scheduleBackfill", "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/create", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/delete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/enable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/disable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/create", + "alerting:xpack.synthetics.alerts.tls/observability/rule/delete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/update", + "alerting:xpack.synthetics.alerts.tls/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.tls/observability/rule/enable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/disable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.tls/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/deleteBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -5378,6 +5802,16 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", "alerting:apm.anomaly/observability/alert/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/update", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/update", ], "minimal_all": Array [ "login:", @@ -6026,6 +6460,62 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/runSoon", "alerting:apm.anomaly/observability/rule/scheduleBackfill", "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/create", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/delete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/enable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/disable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/create", + "alerting:xpack.synthetics.alerts.tls/observability/rule/delete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/update", + "alerting:xpack.synthetics.alerts.tls/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.tls/observability/rule/enable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/disable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.tls/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/deleteBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -6071,6 +6561,16 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", "alerting:apm.anomaly/observability/alert/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/update", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/update", ], "minimal_read": Array [ "login:", @@ -6335,6 +6835,24 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", "alerting:apm.anomaly/observability/rule/getBackfill", "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -6371,6 +6889,14 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/find", "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", ], "read": Array [ "login:", @@ -6635,6 +7161,24 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", "alerting:apm.anomaly/observability/rule/getBackfill", "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -6671,6 +7215,14 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/find", "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", ], }, "reporting": Object { @@ -7145,6 +7697,62 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/runSoon", "alerting:apm.anomaly/observability/rule/scheduleBackfill", "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/create", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/delete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/enable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/disable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/create", + "alerting:xpack.synthetics.alerts.tls/observability/rule/delete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/update", + "alerting:xpack.synthetics.alerts.tls/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.tls/observability/rule/enable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/disable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.tls/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/deleteBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -7190,6 +7798,16 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", "alerting:apm.anomaly/observability/alert/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/update", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/update", ], "minimal_all": Array [ "login:", @@ -7544,6 +8162,62 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/runSoon", "alerting:apm.anomaly/observability/rule/scheduleBackfill", "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/create", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/delete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/enable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/disable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/create", + "alerting:xpack.synthetics.alerts.tls/observability/rule/delete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/update", + "alerting:xpack.synthetics.alerts.tls/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.tls/observability/rule/enable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/disable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.tls/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/deleteBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -7589,6 +8263,16 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", "alerting:apm.anomaly/observability/alert/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/update", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/update", ], "minimal_read": Array [ "login:", @@ -7728,6 +8412,24 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", "alerting:apm.anomaly/observability/rule/getBackfill", "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -7764,6 +8466,14 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/find", "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", ], "read": Array [ "login:", @@ -7903,6 +8613,24 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", "alerting:apm.anomaly/observability/rule/getBackfill", "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -7939,6 +8667,14 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/find", "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", ], }, "uptime": Object { @@ -8515,6 +9251,62 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/runSoon", "alerting:apm.anomaly/observability/rule/scheduleBackfill", "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/create", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/delete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/enable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/disable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/create", + "alerting:xpack.synthetics.alerts.tls/observability/rule/delete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/update", + "alerting:xpack.synthetics.alerts.tls/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.tls/observability/rule/enable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/disable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.tls/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/deleteBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -8560,6 +9352,16 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", "alerting:apm.anomaly/observability/alert/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/update", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/update", ], "elastic_managed_locations_enabled": Array [ "login:", @@ -9137,6 +9939,62 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/runSoon", "alerting:apm.anomaly/observability/rule/scheduleBackfill", "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/create", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/delete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/enable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/disable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/create", + "alerting:xpack.synthetics.alerts.tls/observability/rule/delete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/update", + "alerting:xpack.synthetics.alerts.tls/observability/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.tls/observability/rule/enable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/disable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.tls/observability/rule/muteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.tls/observability/rule/snooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.tls/observability/rule/unsnooze", + "alerting:xpack.synthetics.alerts.tls/observability/rule/runSoon", + "alerting:xpack.synthetics.alerts.tls/observability/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/deleteBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -9182,6 +10040,16 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", "alerting:apm.anomaly/observability/alert/update", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/update", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/update", ], "minimal_read": Array [ "login:", @@ -9411,6 +10279,24 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", "alerting:apm.anomaly/observability/rule/getBackfill", "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -9447,6 +10333,14 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/find", "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", ], "read": Array [ "login:", @@ -9676,6 +10570,24 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", "alerting:apm.anomaly/observability/rule/getBackfill", "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/get", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/observability/rule/find", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/observability/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/observability/rule/findBackfill", "alerting:slo.rules.burnRate/observability/alert/get", "alerting:slo.rules.burnRate/observability/alert/find", "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", @@ -9712,6 +10624,14 @@ export default function ({ getService }: FtrProviderContext) { "alerting:apm.anomaly/observability/alert/find", "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/observability/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/observability/alert/get", + "alerting:xpack.synthetics.alerts.tls/observability/alert/find", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/observability/alert/getAlertSummary", ], }, } From 4a7ce9062ec1a264da232be486cdfad2290a1641 Mon Sep 17 00:00:00 2001 From: Robert Jaszczurek <92210485+rbrtj@users.noreply.github.com> Date: Wed, 23 Oct 2024 14:01:17 +0200 Subject: [PATCH 055/146] [ML] Get buckets and get overall buckets api integration tests (#197226) ## Summary Part of: [#188459](https://github.com/elastic/kibana/issues/188459) Api integration tests for: `POST /internal/ml/anomaly_detectors/:jobId/results/buckets` `POST /internal/ml/anomaly_detectors/:jobId/results/overall_buckets` --- .../apis/ml/anomaly_detectors/get_buckets.ts | 110 ++++++++++++++ .../anomaly_detectors/get_overall_buckets.ts | 136 ++++++++++++++++++ .../apis/ml/anomaly_detectors/index.ts | 2 + 3 files changed, 248 insertions(+) create mode 100644 x-pack/test/api_integration/apis/ml/anomaly_detectors/get_buckets.ts create mode 100644 x-pack/test/api_integration/apis/ml/anomaly_detectors/get_overall_buckets.ts diff --git a/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_buckets.ts b/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_buckets.ts new file mode 100644 index 0000000000000..46220acf69c59 --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_buckets.ts @@ -0,0 +1,110 @@ +/* + * 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 { DATAFEED_STATE, JOB_STATE } from '@kbn/ml-plugin/common'; +import expect from '@kbn/expect'; +import { USER } from '../../../../functional/services/ml/security_common'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { getCommonRequestHeader } from '../../../../functional/services/ml/common_api'; + +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const ml = getService('ml'); + const supertest = getService('supertestWithoutAuth'); + + const jobId = `fq_single_buckets`; + + async function getBuckets({ + _jobId, + timestamp, + expectedStatusCode = 200, + }: { + _jobId: string; + timestamp?: number; + expectedStatusCode?: number; + }) { + const endpoint = `/internal/ml/anomaly_detectors/${_jobId}/results/buckets/${ + timestamp ? `${timestamp}` : '' + }`; + + const { body, status } = await supertest + .post(endpoint) + .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) + .set(getCommonRequestHeader('1')) + .send({}); + + ml.api.assertResponseStatusCode(expectedStatusCode, status, body); + + return body; + } + + describe('POST anomaly_detectors results buckets', () => { + before(async () => { + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); + await ml.testResources.setKibanaTimeZoneToUTC(); + + const jobConfig = ml.commonConfig.getADFqSingleMetricJobConfig(jobId); + const datafeedConfig = ml.commonConfig.getADFqDatafeedConfig(jobId); + + await ml.api.createAnomalyDetectionJob(jobConfig); + + await ml.api.createDatafeed(datafeedConfig); + + await ml.api.openAnomalyDetectionJob(jobId); + await ml.api.startDatafeed(datafeedConfig.datafeed_id, { + start: '0', + end: String(Date.now()), + }); + await ml.api.waitForDatafeedState(datafeedConfig.datafeed_id, DATAFEED_STATE.STOPPED); + await ml.api.waitForJobState(jobId, JOB_STATE.CLOSED); + }); + + after(async () => { + await ml.api.cleanMlIndices(); + }); + + it('should get buckets with correct structure for a job', async () => { + const result = await getBuckets({ _jobId: jobId }); + + expect(result.count).to.be.greaterThan(0); + expect(result.buckets).not.to.be.empty(); + expect(result.buckets[0]).to.have.keys( + 'job_id', + 'timestamp', + 'anomaly_score', + 'bucket_span', + 'initial_anomaly_score', + 'event_count', + 'is_interim', + 'bucket_influencers', + 'processing_time_ms', + 'result_type' + ); + }); + + it('should get a single bucket when timestamp is specified', async () => { + const allBuckets = await getBuckets({ _jobId: jobId }); + const sampleTimestamp = allBuckets.buckets[0].timestamp; + const result = await getBuckets({ _jobId: jobId, timestamp: sampleTimestamp }); + + expect(result.count).to.eql(1); + expect(result.buckets).to.have.length(1); + }); + + it('should fail with non-existent job', async () => { + await getBuckets({ _jobId: 'non-existent-job', expectedStatusCode: 404 }); + }); + + it('should fail with non-existent timestamp', async () => { + await getBuckets({ + _jobId: jobId, + timestamp: 1, + expectedStatusCode: 404, + }); + }); + }); +}; diff --git a/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_overall_buckets.ts b/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_overall_buckets.ts new file mode 100644 index 0000000000000..e0eab2657d643 --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_overall_buckets.ts @@ -0,0 +1,136 @@ +/* + * 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 { DATAFEED_STATE, JOB_STATE } from '@kbn/ml-plugin/common'; +import expect from '@kbn/expect'; +import { USER } from '../../../../functional/services/ml/security_common'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { getCommonRequestHeader } from '../../../../functional/services/ml/common_api'; + +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const ml = getService('ml'); + const supertest = getService('supertestWithoutAuth'); + + const jobId1 = `fq_single_overall_buckets_1`; + const jobId2 = `fq_single_overall_buckets_2`; + + async function getOverallBuckets({ + jobId, + topN = 1, + bucketSpan = '1h', + start = 0, + end = Date.now(), + overallScore, + expectedStatusCode = 200, + }: { + jobId: string; + bucketSpan?: string; + topN?: number; + start?: number; + end?: number; + overallScore?: number; + expectedStatusCode?: number; + }) { + const endpoint = `/internal/ml/anomaly_detectors/${jobId}/results/overall_buckets`; + + const { body, status } = await supertest + .post(endpoint) + .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) + .set(getCommonRequestHeader('1')) + .send({ + topN, + bucketSpan, + start, + end, + ...(overallScore !== undefined && { overall_score: overallScore }), + }); + + ml.api.assertResponseStatusCode(expectedStatusCode, status, body); + + return body; + } + + describe('POST anomaly_detectors results overall_buckets', () => { + before(async () => { + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); + await ml.testResources.setKibanaTimeZoneToUTC(); + + for (const jobId of [jobId1, jobId2]) { + const jobConfig = ml.commonConfig.getADFqSingleMetricJobConfig(jobId); + const datafeedConfig = ml.commonConfig.getADFqDatafeedConfig(jobId); + + await ml.api.createAnomalyDetectionJob(jobConfig); + + await ml.api.createDatafeed(datafeedConfig); + + await ml.api.openAnomalyDetectionJob(jobId); + await ml.api.startDatafeed(datafeedConfig.datafeed_id, { + start: '0', + end: String(Date.now()), + }); + await ml.api.waitForDatafeedState(datafeedConfig.datafeed_id, DATAFEED_STATE.STOPPED); + await ml.api.waitForJobState(jobId, JOB_STATE.CLOSED); + } + }); + + after(async () => { + await ml.api.cleanMlIndices(); + }); + + it('should get overall buckets with correct structure for multiple jobs', async () => { + const result = await getOverallBuckets({ + jobId: `${jobId1},${jobId2}`, + }); + + expect(result.count).to.be.greaterThan(0); + expect(result.overall_buckets).not.to.be.empty(); + expect(result.overall_buckets[0]).to.have.keys( + 'bucket_span', + 'is_interim', + 'jobs', + 'overall_score', + 'result_type', + 'timestamp' + ); + expect(result.overall_buckets[0].jobs.length).to.equal(2); + }); + + it('should respect the bucket_span parameter', async () => { + const result1h = await getOverallBuckets({ + jobId: `${jobId1},${jobId2}`, + bucketSpan: '1h', + }); + const result2h = await getOverallBuckets({ + jobId: `${jobId1},${jobId2}`, + bucketSpan: '2h', + }); + + expect(result1h.overall_buckets[0].bucket_span).to.not.equal( + result2h.overall_buckets[0].bucket_span + ); + }); + + it('should filter results based on overall_score', async () => { + const result = await getOverallBuckets({ + jobId: `${jobId1},${jobId2}`, + overallScore: 5, + }); + + for (const bucket of result.overall_buckets) { + expect(bucket.overall_score).to.be.greaterThan(5); + } + }); + + it('should fail with non-existent job', async () => { + await getOverallBuckets({ + jobId: 'non-existent-job', + expectedStatusCode: 404, + }); + }); + }); +}; diff --git a/x-pack/test/api_integration/apis/ml/anomaly_detectors/index.ts b/x-pack/test/api_integration/apis/ml/anomaly_detectors/index.ts index 89a12cb7f9a76..8176c3cb775f1 100644 --- a/x-pack/test/api_integration/apis/ml/anomaly_detectors/index.ts +++ b/x-pack/test/api_integration/apis/ml/anomaly_detectors/index.ts @@ -19,5 +19,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./create_with_spaces')); loadTestFile(require.resolve('./forecast_with_spaces')); loadTestFile(require.resolve('./create_with_datafeed')); + loadTestFile(require.resolve('./get_buckets')); + loadTestFile(require.resolve('./get_overall_buckets')); }); } From d8149bf55712b57f6ebc9f27b73681a1c9eccddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20Gonz=C3=A1lez?= Date: Wed, 23 Oct 2024 14:32:18 +0200 Subject: [PATCH 056/146] [Search][Connectors] Links and icons review (#197214) ## Summary This PR fixes a few UX issue: All links after generating config elements are external links in order to don't lose the context: ![CleanShot 2024-10-22 at 13 14 43@2x](https://github.com/user-attachments/assets/99e05d93-6149-4b3c-9fe7-4192e8870d22) Using proper Connectors logo and better size: ![CleanShot 2024-10-22 at 13 15 55@2x](https://github.com/user-attachments/assets/9e524870-7102-44d3-94d2-d7eb1d1f6b41) Finish up footer links take us to respective sections: ![CleanShot 2024-10-22 at 13 16 35@2x](https://github.com/user-attachments/assets/deb36a7e-a49f-40a0-9e75-957af6cda751) --------- Co-authored-by: Sander Philipse <94373878+sphilipse@users.noreply.github.com> --- .../components/generated_config_fields.tsx | 6 +++++ .../connector_description_popover.tsx | 24 +++++++++---------- .../create_connector/finish_up_step.tsx | 15 +++++++++--- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/components/generated_config_fields.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/components/generated_config_fields.tsx index 50deb269e5629..133c15f97f61c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/components/generated_config_fields.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/components/generated_config_fields.tsx @@ -121,6 +121,8 @@ export const GeneratedConfigFields: React.FC = ({ = ({ > = ({ {connector.index_name && ( ], + icons: [], id: 'native-choose-source', }, { @@ -35,7 +35,7 @@ const nativePopoverPanels = [ 'xpack.enterpriseSearch.connectorDescriptionPopover.connectorDescriptionBadge.native.configureConnectorLabel', { defaultMessage: 'Configure your connector using our Kibana UI' } ), - icons: [, ], + icons: [, ], id: 'native-configure-connector', }, ]; @@ -46,7 +46,7 @@ const connectorClientPopoverPanels = [ 'xpack.enterpriseSearch.connectorDescriptionPopover.connectorDescriptionBadge.client.chooseADataSourceLabel', { defaultMessage: 'Choose a data source you would like to sync' } ), - icons: [], + icons: [], id: 'client-choose-source', }, { @@ -58,9 +58,9 @@ const connectorClientPopoverPanels = [ } ), icons: [ - , - , - , + , + , + , ], id: 'client-deploy', }, @@ -72,11 +72,11 @@ const connectorClientPopoverPanels = [ } ), icons: [ - , - , - , - , - , + , + , + , + , + , ], id: 'client-configure-connector', }, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/create_connector/finish_up_step.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/create_connector/finish_up_step.tsx index 28d5387ae4b70..c2f27bde80408 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/create_connector/finish_up_step.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/create_connector/finish_up_step.tsx @@ -30,13 +30,15 @@ import { i18n } from '@kbn/i18n'; import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { APPLICATIONS_PLUGIN } from '../../../../../../common/constants'; +import { APPLICATIONS_PLUGIN, ELASTICSEARCH_PLUGIN } from '../../../../../../common/constants'; import { KibanaDeps } from '../../../../../../common/types'; import { PLAYGROUND_PATH } from '../../../../applications/routes'; import { generateEncodedPath } from '../../../../shared/encode_path_params'; +import { HttpLogic } from '../../../../shared/http'; import { KibanaLogic } from '../../../../shared/kibana'; +import { DEV_TOOLS_CONSOLE_PATH } from '../../../routes'; import { CONNECTOR_DETAIL_TAB_PATH } from '../../../routes'; import { ConnectorDetailTabId } from '../../connector_detail/connector_detail'; @@ -62,6 +64,9 @@ export const FinishUpStep: React.FC = ({ title }) => { const { startSync } = useActions(SyncsLogic); const isSyncing = isWaitingForSync || isSyncingProp; + + const { http } = useValues(HttpLogic); + const { application } = useValues(KibanaLogic); useEffect(() => { setTimeout(() => { window.scrollTo({ @@ -307,7 +312,9 @@ export const FinishUpStep: React.FC = ({ title }) => { 'Use your favorite language client to query your data in your app', } )} - onClick={() => {}} + onClick={() => { + application.navigateToUrl(http.basePath.prepend(ELASTICSEARCH_PLUGIN.URL)); + }} display="subdued" /> @@ -335,7 +342,9 @@ export const FinishUpStep: React.FC = ({ title }) => { 'Tools for interacting with your data, such as console, profiler, Grok debugger and more', } )} - onClick={() => {}} + onClick={() => { + application.navigateToUrl(http.basePath.prepend(DEV_TOOLS_CONSOLE_PATH)); + }} display="subdued" /> From e38b4df83db4c56a747b88642c7458a88dd10822 Mon Sep 17 00:00:00 2001 From: Agustina Nahir Ruidiaz <61565784+agusruidiazgd@users.noreply.github.com> Date: Wed, 23 Oct 2024 14:42:36 +0200 Subject: [PATCH 057/146] [SecuritySolution][Onboarding] Send Telemetry when header/footer cards are clicked (#196495) ## Summary #196145 To verify: 1. Add these lines to kibana.dev.yml ``` logging.browser.root.level: debug telemetry.optIn: true ``` \ 2. In the onboarding hub, click on header cards. It should log `onboarding_card_${cardId}` on cards clicked. Screenshot 2024-10-16 at 10 30 58 Screenshot 2024-10-15 at 16 54 32 \ 3. It should log `onboarding_footer_link_${footerLinkId}` on footer links visited. Screenshot 2024-10-16 at 10 31 26 Screenshot 2024-10-15 at 17 29 59 ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../public/onboarding/components/constants.ts | 14 ++++ .../components/onboarding_footer/constants.ts | 16 +++++ .../onboarding_footer/footer_items.ts | 9 +-- .../onboarding_footer.test.tsx | 52 ++++++++++++++ .../onboarding_footer/onboarding_footer.tsx | 72 ++++++++++++++----- .../cards/common/link_card.test.tsx | 23 ++++++ .../cards/common/link_card.tsx | 18 +++-- .../cards/demo_card/demo_card.tsx | 2 + .../cards/teammates_card/teammates_card.tsx | 2 + .../cards/video_card/video_card.tsx | 3 + 10 files changed, 186 insertions(+), 25 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/onboarding/components/constants.ts create mode 100644 x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/constants.ts create mode 100644 x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/onboarding_footer.test.tsx diff --git a/x-pack/plugins/security_solution/public/onboarding/components/constants.ts b/x-pack/plugins/security_solution/public/onboarding/components/constants.ts new file mode 100644 index 0000000000000..5862eadb32051 --- /dev/null +++ b/x-pack/plugins/security_solution/public/onboarding/components/constants.ts @@ -0,0 +1,14 @@ +/* + * 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. + */ + +export const TELEMETRY_HEADER_CARD = `header_card`; + +export enum OnboardingHeaderCardId { + video = 'video', + teammates = 'teammates', + demo = 'demo', +} diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/constants.ts b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/constants.ts new file mode 100644 index 0000000000000..f67b991e0ea75 --- /dev/null +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/constants.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ + +export const TELEMETRY_FOOTER_LINK = `footer_link`; + +export enum OnboardingFooterLinkItemId { + video = 'video', + documentation = 'documentation', + demo = 'demo', + forum = 'forum', + labs = 'labs', +} diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/footer_items.ts b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/footer_items.ts index e0e2b272da3aa..f064947f657a4 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/footer_items.ts +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/footer_items.ts @@ -9,11 +9,12 @@ import documentation from './images/documentation.png'; import forum from './images/forum.png'; import demo from './images/demo.png'; import labs from './images/labs.png'; +import { OnboardingFooterLinkItemId } from './constants'; export const footerItems = [ { icon: documentation, - key: 'documentation', + id: OnboardingFooterLinkItemId.documentation, title: i18n.translate('xpack.securitySolution.onboarding.footer.documentation.title', { defaultMessage: 'Browse documentation', }), @@ -32,7 +33,7 @@ export const footerItems = [ }, { icon: forum, - key: 'forum', + id: OnboardingFooterLinkItemId.forum, title: i18n.translate('xpack.securitySolution.onboarding.footer.forum.title', { defaultMessage: 'Explore forum', }), @@ -48,7 +49,7 @@ export const footerItems = [ }, { icon: demo, - key: 'demo', + id: OnboardingFooterLinkItemId.demo, title: i18n.translate('xpack.securitySolution.onboarding.footer.demo.title', { defaultMessage: 'View demo project', }), @@ -64,7 +65,7 @@ export const footerItems = [ }, { icon: labs, - key: 'labs', + id: OnboardingFooterLinkItemId.labs, title: i18n.translate('xpack.securitySolution.onboarding.footer.labs.title', { defaultMessage: 'Elastic Security Labs', }), diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/onboarding_footer.test.tsx b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/onboarding_footer.test.tsx new file mode 100644 index 0000000000000..ae80d0c9273c3 --- /dev/null +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/onboarding_footer.test.tsx @@ -0,0 +1,52 @@ +/* + * 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 { render } from '@testing-library/react'; +import { trackOnboardingLinkClick } from '../../common/lib/telemetry'; +import { FooterLinkItem } from './onboarding_footer'; +import { OnboardingFooterLinkItemId, TELEMETRY_FOOTER_LINK } from './constants'; + +jest.mock('../../common/lib/telemetry'); + +describe('OnboardingFooterComponent', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('FooterLinkItems should render the title and description', () => { + const { getByText } = render( + + ); + + expect(getByText('Mock Title')).toBeInTheDocument(); + expect(getByText('Mock Description')).toBeInTheDocument(); + }); + + it('FooterLinkItems should track the link click', () => { + const { getByTestId } = render( + + ); + + getByTestId('footerLinkItem').click(); + expect(trackOnboardingLinkClick).toHaveBeenCalledWith( + `${TELEMETRY_FOOTER_LINK}_${OnboardingFooterLinkItemId.documentation}` + ); + }); +}); diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/onboarding_footer.tsx b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/onboarding_footer.tsx index af0f7bdd6e5ef..fdf743d339a60 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/onboarding_footer.tsx +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_footer/onboarding_footer.tsx @@ -5,33 +5,71 @@ * 2.0. */ -import React from 'react'; +import React, { useCallback } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiLink, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; import { useFooterStyles } from './onboarding_footer.styles'; import { footerItems } from './footer_items'; +import { trackOnboardingLinkClick } from '../../common/lib/telemetry'; +import type { OnboardingFooterLinkItemId } from './constants'; +import { TELEMETRY_FOOTER_LINK } from './constants'; export const OnboardingFooter = React.memo(() => { const styles = useFooterStyles(); return ( - {footerItems.map((item) => ( - - {item.title} - - -

{item.title}

-
- - {item.description} - - - - {item.link.title} - - -
+ {footerItems.map(({ id, title, icon, description, link }) => ( + ))}
); }); OnboardingFooter.displayName = 'OnboardingFooter'; + +interface FooterLinkItemProps { + id: OnboardingFooterLinkItemId; + title: string; + icon: string; + description: string; + link: { href: string; title: string }; +} + +export const FooterLinkItem = React.memo( + ({ id, title, icon, description, link }) => { + const onClickWithReport = useCallback(() => { + trackOnboardingLinkClick(`${TELEMETRY_FOOTER_LINK}_${id}`); + }, [id]); + + return ( + + {title} + + +

{title}

+
+ + {description} + + + {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} + + {link.title} + + +
+ ); + } +); + +FooterLinkItem.displayName = 'FooterLinkItem'; diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_header/cards/common/link_card.test.tsx b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_header/cards/common/link_card.test.tsx index 7499e3feaf5f2..83bfa317d8fbb 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_header/cards/common/link_card.test.tsx +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_header/cards/common/link_card.test.tsx @@ -8,6 +8,10 @@ import React from 'react'; import { render } from '@testing-library/react'; import { LinkCard } from './link_card'; +import { OnboardingHeaderCardId, TELEMETRY_HEADER_CARD } from '../../../constants'; +import { trackOnboardingLinkClick } from '../../../../common/lib/telemetry'; + +jest.mock('../../../../common/lib/telemetry'); describe('DataIngestionHubHeaderCardComponent', () => { beforeEach(() => { @@ -17,6 +21,7 @@ describe('DataIngestionHubHeaderCardComponent', () => { it('should render the title, description, and icon', () => { const { getByTestId, getByText } = render( { expect(getByTestId('data-ingestion-header-card-icon')).toHaveAttribute('src', 'mockIcon.png'); }); + it('should track the link card click', () => { + const { getByTestId } = render( + + ); + + getByTestId('headerCardLink').click(); + expect(trackOnboardingLinkClick).toHaveBeenCalledWith( + `${TELEMETRY_HEADER_CARD}_${OnboardingHeaderCardId.demo}` + ); + }); + it('should apply dark mode styles when color mode is DARK', () => { const { container } = render( = React.memo( - ({ icon, title, description, onClick, href, target, linkText }) => { + ({ id, icon, title, description, onClick, href, target, linkText }) => { const cardStyles = useCardStyles(); const cardClassName = classNames(cardStyles, 'headerCard'); + + const onClickWithReport = useCallback(() => { + trackOnboardingLinkClick(`${TELEMETRY_HEADER_CARD}_${id}`); + onClick?.(); + }, [id, onClick]); + return ( = React.memo( {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} - + {linkText} diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_header/cards/demo_card/demo_card.tsx b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_header/cards/demo_card/demo_card.tsx index dfb8da662060e..b86ae2dcd219d 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_header/cards/demo_card/demo_card.tsx +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_header/cards/demo_card/demo_card.tsx @@ -10,10 +10,12 @@ import { LinkCard } from '../common/link_card'; import demoImage from './images/demo_card.png'; import darkDemoImage from './images/demo_card_dark.png'; import * as i18n from './translations'; +import { OnboardingHeaderCardId } from '../../../constants'; export const DemoCard = React.memo<{ isDarkMode: boolean }>(({ isDarkMode }) => { return ( (({ isDarkMode } const usersUrl = useObservable(usersUrl$, undefined); return ( (({ isDarkMode }) => { const [isModalVisible, setIsModalVisible] = useState(false); + const closeVideoModal = useCallback(() => { setIsModalVisible(false); }, []); @@ -24,6 +26,7 @@ export const VideoCard = React.memo<{ isDarkMode: boolean }>(({ isDarkMode }) => return ( <> Date: Wed, 23 Oct 2024 07:44:07 -0500 Subject: [PATCH 058/146] skip failing test suite (#158318) --- .../group3/incompatible_cluster_routing_allocation.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts index ee6c499da7ce8..6538cb07978b9 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts @@ -97,7 +97,8 @@ async function updateRoutingAllocations( }); } -describe('incompatible_cluster_routing_allocation', () => { +// Failing: See https://github.com/elastic/kibana/issues/158318 +describe.skip('incompatible_cluster_routing_allocation', () => { let client: ElasticsearchClient; let root: Root; From 75f6db10bd1afeeab00bc9265ae7090a197f9e8f Mon Sep 17 00:00:00 2001 From: Kevin Delemme Date: Wed, 23 Oct 2024 09:03:42 -0400 Subject: [PATCH 059/146] fix(slo): Slices without any data event are considered good (#196942) --- .../__snapshots__/apm_transaction_duration.test.ts.snap | 4 ++-- .../__snapshots__/apm_transaction_error_rate.test.ts.snap | 4 ++-- .../transform_generators/__snapshots__/histogram.test.ts.snap | 4 ++-- .../__snapshots__/kql_custom.test.ts.snap | 4 ++-- .../__snapshots__/metric_custom.test.ts.snap | 2 +- .../services/transform_generators/apm_transaction_duration.ts | 4 ++-- .../transform_generators/apm_transaction_error_rate.ts | 4 ++-- .../slo/server/services/transform_generators/histogram.ts | 4 ++-- .../slo/server/services/transform_generators/kql_custom.ts | 4 ++-- .../slo/server/services/transform_generators/metric_custom.ts | 4 ++-- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/apm_transaction_duration.test.ts.snap b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/apm_transaction_duration.test.ts.snap index e5eba04f5305c..fe0c3a8904c05 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/apm_transaction_duration.test.ts.snap +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/apm_transaction_duration.test.ts.snap @@ -394,7 +394,7 @@ Object { "goodEvents": "slo.numerator.value", "totalEvents": "slo.denominator.value", }, - "script": "params.goodEvents / params.totalEvents >= 0.95 ? 1 : 0", + "script": "if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents >= 0.95 ? 1 : 0 }", }, }, "slo.numerator": Object { @@ -542,7 +542,7 @@ Object { "goodEvents": "slo.numerator.value", "totalEvents": "slo.denominator.value", }, - "script": "params.goodEvents / params.totalEvents > 0 ? 1 : 0", + "script": "if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents > 0 ? 1 : 0 }", }, }, "slo.numerator": Object { diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/apm_transaction_error_rate.test.ts.snap b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/apm_transaction_error_rate.test.ts.snap index 92c5b8c09385c..a081c2829f2bc 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/apm_transaction_error_rate.test.ts.snap +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/apm_transaction_error_rate.test.ts.snap @@ -358,7 +358,7 @@ Object { "goodEvents": "slo.numerator>_count", "totalEvents": "slo.denominator>_count", }, - "script": "params.goodEvents / params.totalEvents >= 0.95 ? 1 : 0", + "script": "if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents >= 0.95 ? 1 : 0 }", }, }, "slo.numerator": Object { @@ -493,7 +493,7 @@ Object { "goodEvents": "slo.numerator>_count", "totalEvents": "slo.denominator>_count", }, - "script": "params.goodEvents / params.totalEvents > 0 ? 1 : 0", + "script": "if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents > 0 ? 1 : 0 }", }, }, "slo.numerator": Object { diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/histogram.test.ts.snap b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/histogram.test.ts.snap index 260a9406e7674..43026be44a3bb 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/histogram.test.ts.snap +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/histogram.test.ts.snap @@ -134,7 +134,7 @@ Object { "goodEvents": "slo.numerator>value", "totalEvents": "slo.denominator>value", }, - "script": "params.goodEvents / params.totalEvents >= 0.95 ? 1 : 0", + "script": "if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents >= 0.95 ? 1 : 0 }", }, }, "slo.numerator": Object { @@ -263,7 +263,7 @@ Object { "goodEvents": "slo.numerator>value", "totalEvents": "slo.denominator>value", }, - "script": "params.goodEvents / params.totalEvents > 0 ? 1 : 0", + "script": "if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents > 0 ? 1 : 0 }", }, }, "slo.numerator": Object { diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/kql_custom.test.ts.snap b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/kql_custom.test.ts.snap index 26fb5dde0f784..95e1e3abf6aa5 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/kql_custom.test.ts.snap +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/kql_custom.test.ts.snap @@ -140,7 +140,7 @@ Object { "goodEvents": "slo.numerator>_count", "totalEvents": "slo.denominator>_count", }, - "script": "params.goodEvents / params.totalEvents >= 0.95 ? 1 : 0", + "script": "if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents >= 0.95 ? 1 : 0 }", }, }, "slo.numerator": Object { @@ -242,7 +242,7 @@ Object { "goodEvents": "slo.numerator>_count", "totalEvents": "slo.denominator>_count", }, - "script": "params.goodEvents / params.totalEvents > 0 ? 1 : 0", + "script": "if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents > 0 ? 1 : 0 }", }, }, "slo.numerator": Object { diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/metric_custom.test.ts.snap b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/metric_custom.test.ts.snap index c1317435fb97b..4b7dab85cec60 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/metric_custom.test.ts.snap +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/metric_custom.test.ts.snap @@ -181,7 +181,7 @@ Object { "goodEvents": "slo.numerator>value", "totalEvents": "slo.denominator>value", }, - "script": "params.goodEvents / params.totalEvents >= 0.95 ? 1 : 0", + "script": "if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents >= 0.95 ? 1 : 0 }", }, }, "slo.numerator": Object { diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.ts index 85496cb91f6e4..b349a5affeceb 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.ts @@ -185,9 +185,9 @@ export class ApmTransactionDurationTransformGenerator extends TransformGenerator goodEvents: 'slo.numerator.value', totalEvents: 'slo.denominator.value', }, - script: `params.goodEvents / params.totalEvents ${getTimesliceTargetComparator( + script: `if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents ${getTimesliceTargetComparator( slo.objective.timesliceTarget! - )} ${slo.objective.timesliceTarget} ? 1 : 0`, + )} ${slo.objective.timesliceTarget} ? 1 : 0 }`, }, }, }), diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.ts index 91b4af3a07aff..3aa0d4507e8a4 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.ts @@ -168,9 +168,9 @@ export class ApmTransactionErrorRateTransformGenerator extends TransformGenerato goodEvents: 'slo.numerator>_count', totalEvents: 'slo.denominator>_count', }, - script: `params.goodEvents / params.totalEvents ${getTimesliceTargetComparator( + script: `if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents ${getTimesliceTargetComparator( slo.objective.timesliceTarget! - )} ${slo.objective.timesliceTarget} ? 1 : 0`, + )} ${slo.objective.timesliceTarget} ? 1 : 0 }`, }, }, }), diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.ts index c7c97639b92a8..b19f9a48e70f0 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.ts @@ -101,9 +101,9 @@ export class HistogramTransformGenerator extends TransformGenerator { goodEvents: 'slo.numerator>value', totalEvents: 'slo.denominator>value', }, - script: `params.goodEvents / params.totalEvents ${getTimesliceTargetComparator( + script: `if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents ${getTimesliceTargetComparator( slo.objective.timesliceTarget! - )} ${slo.objective.timesliceTarget} ? 1 : 0`, + )} ${slo.objective.timesliceTarget} ? 1 : 0 }`, }, }, }), diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.ts index 1924bc1a4c344..0082e13968c80 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.ts @@ -94,9 +94,9 @@ export class KQLCustomTransformGenerator extends TransformGenerator { goodEvents: 'slo.numerator>_count', totalEvents: 'slo.denominator>_count', }, - script: `params.goodEvents / params.totalEvents ${getTimesliceTargetComparator( + script: `if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents ${getTimesliceTargetComparator( slo.objective.timesliceTarget! - )} ${slo.objective.timesliceTarget} ? 1 : 0`, + )} ${slo.objective.timesliceTarget} ? 1 : 0 }`, }, }, }), diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.ts index 5717b05a466de..e96f252d5ed84 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.ts @@ -105,9 +105,9 @@ export class MetricCustomTransformGenerator extends TransformGenerator { goodEvents: 'slo.numerator>value', totalEvents: 'slo.denominator>value', }, - script: `params.goodEvents / params.totalEvents ${getTimesliceTargetComparator( + script: `if (params.totalEvents == 0) { return 1 } else { return params.goodEvents / params.totalEvents ${getTimesliceTargetComparator( slo.objective.timesliceTarget! - )} ${slo.objective.timesliceTarget} ? 1 : 0`, + )} ${slo.objective.timesliceTarget} ? 1 : 0 }`, }, }, }), From d081884cb5eeba64a4d035c1bd01a5f809db0204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20Gonz=C3=A1lez?= Date: Wed, 23 Oct 2024 15:31:01 +0200 Subject: [PATCH 060/146] [Search][Connectors] Choose connector selectable custom icon (#197068) ## Summary This PR shows the connectors selected icon when choosing one from the `` component. At the same time the selectedConnector was not updated when clearing the selection. Now it updated this state and the related UI elements like the left doc links and the footer last block changed their state based on this. ![CleanShot 2024-10-21 at 15 48 58](https://github.com/user-attachments/assets/ac76c44a-7562-4f5a-adf0-4a41d70bad46) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --------- Co-authored-by: Elastic Machine --- .../choose_connector_selectable.tsx | 133 +++++++++--------- 1 file changed, 63 insertions(+), 70 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/create_connector/components/choose_connector_selectable.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/create_connector/components/choose_connector_selectable.tsx index 6c5505a22f81e..7019fcbb71e3f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/create_connector/components/choose_connector_selectable.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/create_connector/components/choose_connector_selectable.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { useActions, useValues } from 'kea'; @@ -13,14 +13,16 @@ import { EuiBadge, EuiFlexItem, EuiIcon, - EuiInputPopover, - EuiSelectable, - EuiSelectableOption, + EuiComboBox, + EuiComboBoxOptionOption, + EuiFlexGroup, + EuiText, useEuiTheme, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import connectorLogo from '../../../../../../assets/images/connector.svg'; import { KibanaLogic } from '../../../../../shared/kibana'; import { NewConnectorLogic } from '../../../new_index/method_connector/new_connector_logic'; import { SelfManagePreference } from '../create_connector'; @@ -36,9 +38,39 @@ export const ChooseConnectorSelectable: React.FC selfManaged, }) => { const { euiTheme } = useEuiTheme(); - const [isOpen, setIsOpen] = useState(false); + const [selectedOption, setSelectedOption] = useState>>( + [] + ); + const renderOption = ( + option: EuiComboBoxOptionOption, + searchValue: string, + contentClassName: string + ) => { + const { _append, key, label, _prepend } = option as EuiComboBoxOptionOption & { + _append: JSX.Element[]; + _prepend: JSX.Element; + }; + return ( + + + {_prepend} + + + {label} + + + + {_append} + + ); + }; const [selectableOptions, selectableSetOptions] = useState< - Array> + Array> >([]); const { connectorTypes } = useValues(KibanaLogic); const allConnectors = useMemo( @@ -50,9 +82,9 @@ export const ChooseConnectorSelectable: React.FC const getInitialOptions = () => { return allConnectors.map((connector, key) => { - const append: JSX.Element[] = []; + const _append: JSX.Element[] = []; if (connector.isTechPreview) { - append.push( + _append.push( {i18n.translate( 'xpack.enterpriseSearch.createConnector.chooseConnectorSelectable.thechPreviewBadgeLabel', @@ -62,7 +94,7 @@ export const ChooseConnectorSelectable: React.FC ); } if (connector.isBeta) { - append.push( + _append.push( {i18n.translate( 'xpack.enterpriseSearch.createConnector.chooseConnectorSelectable.BetaBadgeLabel', @@ -74,7 +106,7 @@ export const ChooseConnectorSelectable: React.FC ); } if (selfManaged === 'native' && !connector.isNative) { - append.push( + _append.push( {i18n.translate( 'xpack.enterpriseSearch.createConnector.chooseConnectorSelectable.OnlySelfManagedBadgeLabel', @@ -85,12 +117,11 @@ export const ChooseConnectorSelectable: React.FC ); } - return { - append, + _append, + _prepend: , key: key.toString(), label: connector.name, - prepend: , }; }); }; @@ -100,73 +131,35 @@ export const ChooseConnectorSelectable: React.FC useEffect(() => { selectableSetOptions(initialOptions); }, [selfManaged]); - const [searchValue, setSearchValue] = useState(''); - - const openPopover = useCallback(() => { - setIsOpen(true); - }, []); - const closePopover = useCallback(() => { - setIsOpen(false); - }, []); return ( - } + singleSelection + fullWidth + placeholder={i18n.translate( + 'xpack.enterpriseSearch.createConnector.chooseConnectorSelectable.placeholder.text', + { defaultMessage: 'Choose a data source' } + )} options={selectableOptions} - onChange={(newOptions, _, changedOption) => { - selectableSetOptions(newOptions); - closePopover(); - if (changedOption.checked === 'on') { - const keySelected = Number(changedOption.key); - setSelectedConnector(allConnectors[keySelected]); - setSearchValue(allConnectors[keySelected].name); - } else { + selectedOptions={selectedOption} + onChange={(selectedItem) => { + setSelectedOption(selectedItem); + if (selectedItem.length === 0) { setSelectedConnector(null); - setSearchValue(''); + return; } + const keySelected = Number(selectedItem[0].key); + setSelectedConnector(allConnectors[keySelected]); }} - listProps={{ - isVirtualized: true, - rowHeight: Number(euiTheme.base * 3), - showIcons: false, - }} - singleSelection - searchable - searchProps={{ - fullWidth: true, - isClearable: true, - onChange: (value) => { - if (value !== selectedConnector?.name) { - setSearchValue(value); - } - }, - onClick: openPopover, - onFocus: openPopover, - placeholder: i18n.translate( - 'xpack.enterpriseSearch.createConnector.chooseConnectorSelectable.placeholder.text', - { defaultMessage: 'Choose a data source' } - ), - value: searchValue, - }} - > - {(list, search) => ( - - {list} - - )} - + renderOption={renderOption} + rowHeight={(euiTheme.base / 2) * 5} + /> ); }; From 0a0c3fa796ad8d046c2cbc08a7553d5547cd1f6b Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 23 Oct 2024 15:31:53 +0200 Subject: [PATCH 061/146] [ES|QL] Replace the comments with multiline ones (#197391) ## Summary Due to this bug https://github.com/elastic/kibana/issues/191866 and for better user experience i am changing the comments to multiline ones --- .../src/autocomplete/recommended_queries/templates.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/recommended_queries/templates.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/recommended_queries/templates.ts index 6a3226c9dcc8f..5e8d217491925 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/recommended_queries/templates.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/recommended_queries/templates.ts @@ -32,7 +32,7 @@ export const getRecommendedQueries = ({ defaultMessage: 'Count aggregation', } ), - queryString: `${fromCommand}\n | STATS count = COUNT(*) // you can group by a field using the BY operator`, + queryString: `${fromCommand}\n | STATS count = COUNT(*) /* you can group by a field using the BY operator */`, }, ...(timeField ? [ @@ -49,7 +49,7 @@ export const getRecommendedQueries = ({ defaultMessage: 'Sort by time', } ), - queryString: `${fromCommand}\n | SORT ${timeField} // Data is not sorted by default`, + queryString: `${fromCommand}\n | SORT ${timeField} /* Data is not sorted by default */`, }, { label: i18n.translate( @@ -64,7 +64,7 @@ export const getRecommendedQueries = ({ defaultMessage: 'Count aggregation over time', } ), - queryString: `${fromCommand}\n | EVAL buckets = DATE_TRUNC(5 minute, ${timeField}) | STATS count = COUNT(*) BY buckets // try out different intervals`, + queryString: `${fromCommand}\n | EVAL buckets = DATE_TRUNC(5 minute, ${timeField}) | STATS count = COUNT(*) BY buckets /* try out different intervals */`, }, ] : []), @@ -98,7 +98,7 @@ export const getRecommendedQueries = ({ defaultMessage: 'Count aggregation over time', } ), - queryString: `${fromCommand}\n | WHERE ${timeField} <=?_tend and ${timeField} >?_tstart\n | STATS count = COUNT(*) BY \`Over time\` = BUCKET(${timeField}, 50, ?_tstart, ?_tend) // ?_tstart and ?_tend take the values of the time picker`, + queryString: `${fromCommand}\n | WHERE ${timeField} <=?_tend and ${timeField} >?_tstart\n | STATS count = COUNT(*) BY \`Over time\` = BUCKET(${timeField}, 50, ?_tstart, ?_tend) /* ?_tstart and ?_tend take the values of the time picker */`, }, { label: i18n.translate( @@ -113,7 +113,7 @@ export const getRecommendedQueries = ({ defaultMessage: 'Event rate over time', } ), - queryString: `${fromCommand}\n | STATS count = COUNT(*), min_timestamp = MIN(${timeField}) // MIN(dateField) finds the earliest timestamp in the dataset.\n | EVAL event_rate = count / DATE_DIFF("seconds", min_timestamp, NOW()) // Calculates the event rate by dividing the total count of events by the time difference (in seconds) between the earliest event and the current time.\n | KEEP event_rate`, + queryString: `${fromCommand}\n | STATS count = COUNT(*), min_timestamp = MIN(${timeField}) /* MIN(dateField) finds the earliest timestamp in the dataset. */ \n | EVAL event_rate = count / DATE_DIFF("seconds", min_timestamp, NOW()) /* Calculates the event rate by dividing the total count of events by the time difference (in seconds) between the earliest event and the current time. */\n | KEEP event_rate`, }, { label: i18n.translate( From 4568240e6420318be7f8d948c5d3e1c88b963abe Mon Sep 17 00:00:00 2001 From: Sergi Romeu Date: Wed, 23 Oct 2024 15:32:55 +0200 Subject: [PATCH 062/146] [APM][e2e] Skip transaction_details Cypress test (#197388) ## Summary Relates to #197386 This PR skips the failing test, eventually we will need to fix it and the work will be handled on the parent issue. --- .../e2e/transaction_details/transaction_details.cy.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/transaction_details/transaction_details.cy.ts b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/transaction_details/transaction_details.cy.ts index 404bc5d2492ee..38ced9a6587ee 100644 --- a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/transaction_details/transaction_details.cy.ts +++ b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/transaction_details/transaction_details.cy.ts @@ -34,7 +34,8 @@ describe('Transaction details', () => { cy.loginAsViewerUser(); }); - it('shows transaction name and transaction charts', () => { + // skipping this as it´s been failing a lot lately, more information here https://github.com/elastic/kibana/issues/197386 + it.skip('shows transaction name and transaction charts', () => { cy.intercept('GET', '/internal/apm/services/opbeans-java/transactions/charts/latency?*').as( 'transactionLatencyRequest' ); @@ -106,8 +107,8 @@ describe('Transaction details', () => { ); cy.contains('Create SLO'); }); - - it('shows top errors table', () => { + // skipping this as it´s been failing a lot lately, more information here https://github.com/elastic/kibana/issues/197386 + it.skip('shows top errors table', () => { cy.visitKibana( `/app/apm/services/opbeans-java/transactions/view?${new URLSearchParams({ ...timeRange, From 5f4742c3c6f03053fc8bfe23caeb4d687103e0d3 Mon Sep 17 00:00:00 2001 From: Tre Date: Wed, 23 Oct 2024 14:46:11 +0100 Subject: [PATCH 063/146] [FTR][Ownership] Assign osquery, search profiler, etc (#197037) ## Summary Assign test files to small number of reviewers ## Assignment Reasons Assigned osquery due to https://github.com/elastic/kibana/blob/608cc70be56fa63cb68a93d480e545fa95c0846a/x-pack/plugins/osquery/kibana.jsonc#L4 Assigned search profiler due to https://github.com/elastic/kibana/blob/main/x-pack/plugins/searchprofiler/kibana.jsonc#L4 Assigned slos due to https://github.com/elastic/kibana/blob/main/x-pack/plugins/observability_solution/slo/kibana.jsonc#L4 Assigned stats due to https://github.com/elastic/kibana/blob/main/src/plugins/usage_collection/kibana.jsonc#L4 Assigned status due to https://github.com/elastic/kibana/blob/10ec204128776930c48376a848fe20b1301569f9/packages/core/status/core-status-server-internal/kibana.jsonc#L4 Assigned telemetry due to https://github.com/elastic/kibana/blob/main/src/plugins/telemetry/kibana.jsonc#L4 Contributes to: https://github.com/elastic/kibana/issues/194817 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d78ad640d625e..b7a69b94d1c26 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1206,6 +1206,7 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test/functional/apps/infra/logs @elastic/obs-ux-logs-team # Observability UX management team +/x-pack/test/api_integration/apis/slos @elastic/obs-ux-management-team /x-pack/test/accessibility/apps/group1/uptime.ts @elastic/obs-ux-management-team /x-pack/test/accessibility/apps/group3/observability.ts @elastic/obs-ux-management-team /x-pack/packages/observability/alert_details @elastic/obs-ux-management-team @@ -1392,6 +1393,9 @@ x-pack/test/api_integration/deployment_agnostic/services/ @elastic/appex-qa x-pack/test/**/deployment_agnostic/ @elastic/appex-qa #temporarily to monitor tests migration # Core +/x-pack/test/api_integration/apis/telemetry @elastic/kibana-core +/x-pack/test/api_integration/apis/status @elastic/kibana-core +/x-pack/test/api_integration/apis/stats @elastic/kibana-core /x-pack/test/api_integration/apis/kibana/stats @elastic/kibana-core /x-pack/test_serverless/functional/test_suites/security/config.saved_objects_management.ts @elastic/kibana-core /config/ @elastic/kibana-core @@ -1532,6 +1536,7 @@ x-pack/test/api_integration/apis/management/index_management/inference_endpoints /x-pack/test/functional_search/ @elastic/search-kibana # Management Experience - Deployment Management +/x-pack/test/api_integration/apis/searchprofiler @elastic/kibana-management /x-pack/test/api_integration/apis/console @elastic/kibana-management /x-pack/test_serverless/**/test_suites/common/index_management/ @elastic/kibana-management /x-pack/test_serverless/**/test_suites/common/management/index_management/ @elastic/kibana-management @@ -1835,6 +1840,7 @@ x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout @elastic/ /x-pack/plugins/security_solution/public/common/components/threat_match @elastic/security-detection-engine ## Security Solution sub teams - security-defend-workflows +/x-pack/test/api_integration/apis/osquery @elastic/security-defend-workflows /x-pack/plugins/security_solution/public/management/ @elastic/security-defend-workflows /x-pack/plugins/security_solution/public/common/lib/endpoint/ @elastic/security-defend-workflows /x-pack/plugins/security_solution/public/common/components/endpoint/ @elastic/security-defend-workflows From e1c0cef15dd7f771a621db0230bf4cddcf10815b Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Wed, 23 Oct 2024 07:49:38 -0600 Subject: [PATCH 064/146] [ES|QL] Create validation errors for unknown parameters (#197334) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Follow-up from https://github.com/elastic/kibana/pull/195989. We discussed as a team and decided to show validation errors when an unknown variable is used as an argument to subsequent functions. **Before** Screenshot 2024-10-22 at 1 41 08 PM **After** Screenshot 2024-10-22 at 1 41 29 PM --- .../src/shared/helpers.ts | 2 +- .../validation/__tests__/functions.test.ts | 396 ++++++++++-------- 2 files changed, 226 insertions(+), 172 deletions(-) diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts index 31c2c01a11404..2392a44814997 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts @@ -465,7 +465,7 @@ export function checkFunctionArgMatchesDefinition( const wrappedTypes: Array<(typeof validHit)['type']> = Array.isArray(validHit.type) ? validHit.type : [validHit.type]; - return wrappedTypes.some((ct) => ct === argType || ct === 'null' || ct === 'unknown'); + return wrappedTypes.some((ct) => ct === argType || ct === 'null'); } if (arg.type === 'inlineCast') { const lowerArgType = argType?.toLowerCase(); diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/functions.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/functions.test.ts index a3934c1a35627..ec0fbe5395334 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/functions.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/functions.test.ts @@ -505,67 +505,41 @@ describe('function validation', () => { ['Invalid option ["foo"] for test. Supported options: ["ASC", "DESC"].'] ); }); - }); - describe('command/option support', () => { - it('validates command support', async () => { + it('validates values of type unknown', async () => { setTestFunctions([ { - name: 'eval_fn', + name: 'test1', type: 'eval', description: '', supportedCommands: ['eval'], signatures: [ { - params: [], - returnType: 'keyword', - }, - ], - }, - { - name: 'stats_fn', - type: 'agg', - description: '', - supportedCommands: ['stats'], - signatures: [ - { - params: [], - returnType: 'keyword', - }, - ], - }, - { - name: 'row_fn', - type: 'eval', - description: '', - supportedCommands: ['row'], - signatures: [ - { - params: [], + params: [{ name: 'arg1', type: 'keyword' }], returnType: 'keyword', }, ], }, { - name: 'where_fn', + name: 'test2', type: 'eval', description: '', - supportedCommands: ['where'], + supportedCommands: ['eval'], signatures: [ { - params: [], + params: [{ name: 'arg1', type: 'keyword' }], returnType: 'keyword', }, ], }, { - name: 'sort_fn', + name: 'test3', type: 'eval', description: '', - supportedCommands: ['sort'], + supportedCommands: ['eval'], signatures: [ { - params: [], + params: [{ name: 'arg1', type: 'long' }], returnType: 'keyword', }, ], @@ -573,155 +547,235 @@ describe('function validation', () => { ]); const { expectErrors } = await setup(); + await expectErrors( + `FROM a_index + | EVAL foo = TEST1(1.) + | EVAL TEST2(foo) + | EVAL TEST3(foo)`, + [ + 'Argument of [test1] must be [keyword], found value [1.] type [double]', + 'Argument of [test2] must be [keyword], found value [foo] type [unknown]', + 'Argument of [test3] must be [long], found value [foo] type [unknown]', + ] + ); + }); - await expectErrors('FROM a_index | EVAL EVAL_FN()', []); - await expectErrors('FROM a_index | SORT SORT_FN()', []); - await expectErrors('FROM a_index | STATS STATS_FN()', []); - await expectErrors('ROW ROW_FN()', []); - await expectErrors('FROM a_index | WHERE WHERE_FN()', []); + describe('command/option support', () => { + it('validates command support', async () => { + setTestFunctions([ + { + name: 'eval_fn', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + { + name: 'stats_fn', + type: 'agg', + description: '', + supportedCommands: ['stats'], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + { + name: 'row_fn', + type: 'eval', + description: '', + supportedCommands: ['row'], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + { + name: 'where_fn', + type: 'eval', + description: '', + supportedCommands: ['where'], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + { + name: 'sort_fn', + type: 'eval', + description: '', + supportedCommands: ['sort'], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + ]); - await expectErrors('FROM a_index | EVAL SORT_FN()', [ - 'EVAL does not support function sort_fn', - ]); - await expectErrors('FROM a_index | SORT STATS_FN()', [ - 'SORT does not support function stats_fn', - ]); - await expectErrors('FROM a_index | STATS ROW_FN()', [ - 'At least one aggregation function required in [STATS], found [ROW_FN()]', - 'STATS does not support function row_fn', - ]); - await expectErrors('ROW WHERE_FN()', ['ROW does not support function where_fn']); - await expectErrors('FROM a_index | WHERE EVAL_FN()', [ - 'WHERE does not support function eval_fn', - ]); - }); + const { expectErrors } = await setup(); - it('validates option support', async () => { - setTestFunctions([ - { - name: 'supports_by_option', - type: 'eval', - description: '', - supportedCommands: ['eval'], - supportedOptions: ['by'], - signatures: [ - { - params: [], - returnType: 'keyword', - }, - ], - }, - { - name: 'does_not_support_by_option', - type: 'eval', - description: '', - supportedCommands: ['eval'], - supportedOptions: [], - signatures: [ - { - params: [], - returnType: 'keyword', - }, - ], - }, + await expectErrors('FROM a_index | EVAL EVAL_FN()', []); + await expectErrors('FROM a_index | SORT SORT_FN()', []); + await expectErrors('FROM a_index | STATS STATS_FN()', []); + await expectErrors('ROW ROW_FN()', []); + await expectErrors('FROM a_index | WHERE WHERE_FN()', []); - { - name: 'agg_fn', - type: 'agg', - description: '', - supportedCommands: ['stats'], - supportedOptions: [], - signatures: [ - { - params: [], - returnType: 'keyword', - }, - ], - }, - ]); + await expectErrors('FROM a_index | EVAL SORT_FN()', [ + 'EVAL does not support function sort_fn', + ]); + await expectErrors('FROM a_index | SORT STATS_FN()', [ + 'SORT does not support function stats_fn', + ]); + await expectErrors('FROM a_index | STATS ROW_FN()', [ + 'At least one aggregation function required in [STATS], found [ROW_FN()]', + 'STATS does not support function row_fn', + ]); + await expectErrors('ROW WHERE_FN()', ['ROW does not support function where_fn']); + await expectErrors('FROM a_index | WHERE EVAL_FN()', [ + 'WHERE does not support function eval_fn', + ]); + }); - const { expectErrors } = await setup(); + it('validates option support', async () => { + setTestFunctions([ + { + name: 'supports_by_option', + type: 'eval', + description: '', + supportedCommands: ['eval'], + supportedOptions: ['by'], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + { + name: 'does_not_support_by_option', + type: 'eval', + description: '', + supportedCommands: ['eval'], + supportedOptions: [], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, - await expectErrors('FROM a_index | STATS AGG_FN() BY SUPPORTS_BY_OPTION()', []); - await expectErrors('FROM a_index | STATS AGG_FN() BY DOES_NOT_SUPPORT_BY_OPTION()', [ - 'STATS BY does not support function does_not_support_by_option', - ]); + { + name: 'agg_fn', + type: 'agg', + description: '', + supportedCommands: ['stats'], + supportedOptions: [], + signatures: [ + { + params: [], + returnType: 'keyword', + }, + ], + }, + ]); + + const { expectErrors } = await setup(); + + await expectErrors('FROM a_index | STATS AGG_FN() BY SUPPORTS_BY_OPTION()', []); + await expectErrors('FROM a_index | STATS AGG_FN() BY DOES_NOT_SUPPORT_BY_OPTION()', [ + 'STATS BY does not support function does_not_support_by_option', + ]); + }); }); - }); - describe('nested functions', () => { - it('supports deep nesting', async () => { - setTestFunctions([ - { - name: 'test', - type: 'eval', - description: '', - supportedCommands: ['eval'], - signatures: [ - { - params: [{ name: 'arg1', type: 'keyword' }], - returnType: 'integer', - }, - ], - }, - { - name: 'test2', - type: 'eval', - description: '', - supportedCommands: ['eval'], - signatures: [ - { - params: [{ name: 'arg1', type: 'integer' }], - returnType: 'keyword', - }, - ], - }, - ]); + describe('nested functions', () => { + it('supports deep nesting', async () => { + setTestFunctions([ + { + name: 'test', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [{ name: 'arg1', type: 'keyword' }], + returnType: 'integer', + }, + ], + }, + { + name: 'test2', + type: 'eval', + description: '', + supportedCommands: ['eval'], + signatures: [ + { + params: [{ name: 'arg1', type: 'integer' }], + returnType: 'keyword', + }, + ], + }, + ]); - const { expectErrors } = await setup(); + const { expectErrors } = await setup(); - await expectErrors('FROM a_index | EVAL TEST(TEST2(TEST(TEST2(1))))', []); - }); + await expectErrors('FROM a_index | EVAL TEST(TEST2(TEST(TEST2(1))))', []); + }); - it("doesn't allow nested aggregation functions", async () => { - setTestFunctions([ - { - name: 'agg_fn', - type: 'agg', - description: '', - supportedCommands: ['stats'], - signatures: [ - { - params: [{ name: 'arg1', type: 'keyword' }], - returnType: 'keyword', - }, - ], - }, - { - name: 'scalar_fn', - type: 'eval', - description: '', - supportedCommands: ['stats'], - signatures: [ - { - params: [{ name: 'arg1', type: 'keyword' }], - returnType: 'keyword', - }, - ], - }, - ]); + it("doesn't allow nested aggregation functions", async () => { + setTestFunctions([ + { + name: 'agg_fn', + type: 'agg', + description: '', + supportedCommands: ['stats'], + signatures: [ + { + params: [{ name: 'arg1', type: 'keyword' }], + returnType: 'keyword', + }, + ], + }, + { + name: 'scalar_fn', + type: 'eval', + description: '', + supportedCommands: ['stats'], + signatures: [ + { + params: [{ name: 'arg1', type: 'keyword' }], + returnType: 'keyword', + }, + ], + }, + ]); - const { expectErrors } = await setup(); + const { expectErrors } = await setup(); - await expectErrors('FROM a_index | STATS AGG_FN(AGG_FN(""))', [ - 'Aggregate function\'s parameters must be an attribute, literal or a non-aggregation function; found [AGG_FN("")] of type [keyword]', - ]); - // @TODO — enable this test when we have fixed this bug - // await expectErrors('FROM a_index | STATS AGG_FN(SCALAR_FN(AGG_FN("")))', [ - // 'No nested aggregation functions.', - // ]); - }); + await expectErrors('FROM a_index | STATS AGG_FN(AGG_FN(""))', [ + 'Aggregate function\'s parameters must be an attribute, literal or a non-aggregation function; found [AGG_FN("")] of type [keyword]', + ]); + // @TODO — enable this test when we have fixed this bug + // await expectErrors('FROM a_index | STATS AGG_FN(SCALAR_FN(AGG_FN("")))', [ + // 'No nested aggregation functions.', + // ]); + }); - // @TODO — test function aliases + // @TODO — test function aliases + }); }); }); From 1a13fad289a157d962076bffcffd8aa661fc1bcc Mon Sep 17 00:00:00 2001 From: Pablo Machado Date: Wed, 23 Oct 2024 16:13:02 +0200 Subject: [PATCH 065/146] [SecuritySolution] Change Entity Store default transform interval to 30 seconds (#197419) ## Summary Change Entity Store default transform interval to 30 seconds --- .../server/lib/entity_analytics/entity_store/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/constants.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/constants.ts index addf432f20398..796932d79b364 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/constants.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/constants.ts @@ -9,7 +9,7 @@ import type { EngineStatus } from '../../../../common/api/entity_analytics'; export const DEFAULT_LOOKBACK_PERIOD = '24h'; -export const DEFAULT_INTERVAL = '15s'; +export const DEFAULT_INTERVAL = '30s'; export const ENGINE_STATUS: Record, EngineStatus> = { INSTALLING: 'installing', From 9656621fcc8f6f9a615b0a27d45db9722e047a10 Mon Sep 17 00:00:00 2001 From: Juan Pablo Djeredjian Date: Wed, 23 Oct 2024 16:44:13 +0200 Subject: [PATCH 066/146] [Security Solution] Fix `DataSource` payload creation during rule upgrade with `MERGED` pick_version (#197262) ## Summary The PR https://github.com/elastic/kibana/pull/191439 enhanced the `/upgrade/_perform` API contract and functionality to allow the users of the endpoint to upgrade rules to their `MERGED` version. However, a bug slipped in, where the two different types of `DataSource` (`type: index_patterns` or `type: data_view_id`) weren't properly handled and would cause, in some cases, a rule payload to be created having both an `index` and `data_view` field, causing upgrade to fail. This PR fixes the issue by handling these two field in a specific way, checking what the `DataSource` diffable field's type is, and setting the other field to `undefined`. ### Checklist Delete any items that are not applicable to this PR. - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels) - [ ] This will appear in the **Release Notes** and follow the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../diffable_rule_fields_mappings.ts | 21 ++++++++++ ...e_perform_prebuilt_rules.all_rules_mode.ts | 38 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/diffable_rule_fields_mappings.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/diffable_rule_fields_mappings.ts index d56747f9db264..8a796b5db1e28 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/diffable_rule_fields_mappings.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/diffable_rule_fields_mappings.ts @@ -7,6 +7,8 @@ import { get } from 'lodash'; import type { RuleSchedule, + DataSourceIndexPatterns, + DataSourceDataView, InlineKqlQuery, ThreeWayDiff, DiffableRuleTypes, @@ -195,6 +197,10 @@ export const transformDiffableFieldValues = ( } else if (fieldName === 'saved_id' && isInlineQuery(diffableFieldValue)) { // saved_id should be set only for rules with SavedKqlQuery, undefined otherwise return { type: 'TRANSFORMED_FIELD', value: undefined }; + } else if (fieldName === 'data_view_id' && isDataSourceIndexPatterns(diffableFieldValue)) { + return { type: 'TRANSFORMED_FIELD', value: undefined }; + } else if (fieldName === 'index' && isDataSourceDataView(diffableFieldValue)) { + return { type: 'TRANSFORMED_FIELD', value: undefined }; } return { type: 'NON_TRANSFORMED_FIELD' }; @@ -209,3 +215,18 @@ function isInlineQuery(value: unknown): value is InlineKqlQuery { typeof value === 'object' && value !== null && 'type' in value && value.type === 'inline_query' ); } + +function isDataSourceIndexPatterns(value: unknown): value is DataSourceIndexPatterns { + return ( + typeof value === 'object' && + value !== null && + 'type' in value && + value.type === 'index_patterns' + ); +} + +function isDataSourceDataView(value: unknown): value is DataSourceDataView { + return ( + typeof value === 'object' && value !== null && 'type' in value && value.type === 'data_view' + ); +} diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_perform_prebuilt_rules.all_rules_mode.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_perform_prebuilt_rules.all_rules_mode.ts index 2d0fe71e7d5d4..e24e517c93459 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_perform_prebuilt_rules.all_rules_mode.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/prebuilt_rules/management/trial_license_complete_tier/upgrade_perform_prebuilt_rules.all_rules_mode.ts @@ -17,6 +17,9 @@ import { ThreatMatchRule, FIELDS_TO_UPGRADE_TO_CURRENT_VERSION, ModeEnum, + AllFieldsDiff, + DataSourceIndexPatterns, + QueryRule, } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { PrebuiltRuleAsset } from '@kbn/security-solution-plugin/server/lib/detection_engine/prebuilt_rules'; import { FtrProviderContext } from '../../../../../../ftr_provider_context'; @@ -246,6 +249,41 @@ export default ({ getService }: FtrProviderContext): void => { expect(installedRule.tags).toEqual(reviewRuleResponseMap.get(ruleId)?.tags); } }); + + it('correctly upgrades rules with DataSource diffs to their MERGED versions', async () => { + await createHistoricalPrebuiltRuleAssetSavedObjects(es, [queryRule]); + await installPrebuiltRules(es, supertest); + + const targetObject = cloneDeep(queryRule); + targetObject['security-rule'].version += 1; + targetObject['security-rule'].name = TARGET_NAME; + targetObject['security-rule'].tags = TARGET_TAGS; + targetObject['security-rule'].index = ['auditbeat-*']; + await createHistoricalPrebuiltRuleAssetSavedObjects(es, [targetObject]); + + const reviewResponse = await reviewPrebuiltRulesToUpgrade(supertest); + const ruleDiffFields = reviewResponse.rules[0].diff.fields as AllFieldsDiff; + + const performUpgradeResponse = await performUpgradePrebuiltRules(es, supertest, { + mode: ModeEnum.ALL_RULES, + pick_version: 'MERGED', + }); + + expect(performUpgradeResponse.summary.succeeded).toEqual(1); + + const installedRules = await getInstalledRules(supertest); + const installedRule = installedRules.data[0] as QueryRule; + + expect(installedRule.name).toEqual(ruleDiffFields.name.merged_version); + expect(installedRule.tags).toEqual(ruleDiffFields.tags.merged_version); + + // Check that the updated rules has an `index` field which equals the output of the diff algorithm + // for the DataSource diffable field, and that the data_view_id is correspondingly set to undefined. + expect(installedRule.index).toEqual( + (ruleDiffFields.data_source.merged_version as DataSourceIndexPatterns).index_patterns + ); + expect(installedRule.data_view_id).toBe(undefined); + }); }); describe('edge cases and unhappy paths', () => { From ab021a52668203d19fb2651fcada0720da9c5120 Mon Sep 17 00:00:00 2001 From: Pablo Machado Date: Wed, 23 Oct 2024 16:52:16 +0200 Subject: [PATCH 067/146] [SecuritySolution] Add tooltip to entities table (#197430) ## Summary Add a tooltip to the entities table. ![Screenshot 2024-10-23 at 14 58 52](https://github.com/user-attachments/assets/4766e3bd-9e88-4c9a-9d8f-653c56de6fdd) --- .../components/entity_store/entities_list.tsx | 26 ++++++++++--------- .../components/paginated_table/index.tsx | 4 +++ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.tsx index fc821bead61f0..1b7c77ceda123 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/entities_list.tsx @@ -6,9 +6,8 @@ */ import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import { EuiFilterGroup, EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; +import { EuiFilterGroup, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { noop } from 'lodash/fp'; -import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { useErrorToast } from '../../../common/hooks/use_error_toast'; import type { CriticalityLevels } from '../../../../common/constants'; @@ -116,16 +115,19 @@ export const EntitiesList: React.FC = () => { activePage={(data?.page ?? 1) - 1} columns={columns} headerCount={data?.total ?? 0} - headerTitle={ - -

- -

-
- } + titleSize="s" + headerTitle={i18n.translate( + 'xpack.securitySolution.entityAnalytics.entityStore.entitiesList.tableTitle', + { + defaultMessage: 'Entities', + } + )} + headerTooltip={i18n.translate( + 'xpack.securitySolution.entityAnalytics.entityStore.entitiesList.tableTooltip', + { + defaultMessage: 'Entity data can take a couple of minutes to appear', + } + )} limit={limit} loading={isLoading || isRefetching} isInspect={false} diff --git a/x-pack/plugins/security_solution/public/explore/components/paginated_table/index.tsx b/x-pack/plugins/security_solution/public/explore/components/paginated_table/index.tsx index 82cde8a24f153..7fe4f0c0110b0 100644 --- a/x-pack/plugins/security_solution/public/explore/components/paginated_table/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/components/paginated_table/index.tsx @@ -9,6 +9,7 @@ import type { EuiBasicTableProps, EuiGlobalToastListToast as Toast, EuiTableRowCellProps, + EuiTitleSize, } from '@elastic/eui'; import { EuiBasicTable, @@ -107,6 +108,7 @@ export interface BasicTableProps { dataTestSubj?: string; headerCount: number; headerFilters?: string | React.ReactNode; + titleSize?: EuiTitleSize; headerSupplement?: React.ReactElement; headerTitle: string | React.ReactElement; headerTooltip?: string; @@ -148,6 +150,7 @@ const PaginatedTableComponent: FC = ({ dataTestSubj = DEFAULT_DATA_TEST_SUBJ, headerCount, headerFilters, + titleSize, headerSupplement, headerTitle, headerTooltip, @@ -277,6 +280,7 @@ const PaginatedTableComponent: FC = ({ Date: Wed, 23 Oct 2024 07:55:49 -0700 Subject: [PATCH 068/146] [ResponseOps] Prepare the connector `create` HTTP API for versioning (#194879) Towards https://github.com/elastic/response-ops-team/issues/125 ## Summary Preparing the `POST ${BASE_ACTION_API_PATH}/connector/{id?}` HTTP API for versioning --- x-pack/plugins/actions/common/index.ts | 1 + .../routes/connector/apis/create/index.ts | 21 +++ .../connector/apis/create/schemas}/latest.ts | 2 +- .../connector/apis/create/schemas/v1.ts | 32 ++++ .../connector/apis/create/types/latest.ts | 8 + .../routes/connector/apis/create/types/v1.ts | 12 ++ .../server/actions_client/actions_client.ts | 176 +----------------- .../connector/methods/create/create.ts | 170 +++++++++++++++++ .../connector/methods/create/index.ts | 8 + .../connector/methods/create/types/index.ts | 8 + .../connector/methods/create/types/types.ts | 22 +++ .../transforms => common_transforms}/index.ts | 4 +- .../transform_connector_response/latest.ts | 8 + .../transform_connector_response/v1.ts | 6 +- .../{ => connector/create}/create.test.ts | 27 +-- .../server/routes/connector/create/create.ts | 58 ++++++ .../server/routes/connector/create/index.ts | 8 + .../connector/create/transforms/index.ts | 10 + .../transform_connector_body/latest.ts | 8 + .../transforms/transform_connector_body/v1.ts | 21 +++ .../server/routes/connector/get/get.ts | 4 +- .../plugins/actions/server/routes/create.ts | 98 ---------- x-pack/plugins/actions/server/routes/index.ts | 4 +- .../endpoint/common/connectors_services.ts | 7 +- 24 files changed, 427 insertions(+), 296 deletions(-) create mode 100644 x-pack/plugins/actions/common/routes/connector/apis/create/index.ts rename x-pack/plugins/actions/{server/routes/connector/get/transforms/transform_connector_response => common/routes/connector/apis/create/schemas}/latest.ts (82%) create mode 100644 x-pack/plugins/actions/common/routes/connector/apis/create/schemas/v1.ts create mode 100644 x-pack/plugins/actions/common/routes/connector/apis/create/types/latest.ts create mode 100644 x-pack/plugins/actions/common/routes/connector/apis/create/types/v1.ts create mode 100644 x-pack/plugins/actions/server/application/connector/methods/create/create.ts create mode 100644 x-pack/plugins/actions/server/application/connector/methods/create/index.ts create mode 100644 x-pack/plugins/actions/server/application/connector/methods/create/types/index.ts create mode 100644 x-pack/plugins/actions/server/application/connector/methods/create/types/types.ts rename x-pack/plugins/actions/server/routes/connector/{get/transforms => common_transforms}/index.ts (55%) create mode 100644 x-pack/plugins/actions/server/routes/connector/common_transforms/transform_connector_response/latest.ts rename x-pack/plugins/actions/server/routes/connector/{get/transforms => common_transforms}/transform_connector_response/v1.ts (73%) rename x-pack/plugins/actions/server/routes/{ => connector/create}/create.test.ts (84%) create mode 100644 x-pack/plugins/actions/server/routes/connector/create/create.ts create mode 100644 x-pack/plugins/actions/server/routes/connector/create/index.ts create mode 100644 x-pack/plugins/actions/server/routes/connector/create/transforms/index.ts create mode 100644 x-pack/plugins/actions/server/routes/connector/create/transforms/transform_connector_body/latest.ts create mode 100644 x-pack/plugins/actions/server/routes/connector/create/transforms/transform_connector_body/v1.ts delete mode 100644 x-pack/plugins/actions/server/routes/create.ts diff --git a/x-pack/plugins/actions/common/index.ts b/x-pack/plugins/actions/common/index.ts index b56f6c61238c2..336ff003962a0 100644 --- a/x-pack/plugins/actions/common/index.ts +++ b/x-pack/plugins/actions/common/index.ts @@ -15,6 +15,7 @@ export * from './mustache_template'; export * from './validate_email_addresses'; export * from './connector_feature_config'; export * from './execution_log_types'; +export * from './validate_empty_strings'; export const BASE_ACTION_API_PATH = '/api/actions'; export const INTERNAL_BASE_ACTION_API_PATH = '/internal/actions'; diff --git a/x-pack/plugins/actions/common/routes/connector/apis/create/index.ts b/x-pack/plugins/actions/common/routes/connector/apis/create/index.ts new file mode 100644 index 0000000000000..a40970eadc099 --- /dev/null +++ b/x-pack/plugins/actions/common/routes/connector/apis/create/index.ts @@ -0,0 +1,21 @@ +/* + * 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. + */ + +export { + createConnectorRequestParamsSchema, + createConnectorRequestBodySchema, +} from './schemas/latest'; +export type { CreateConnectorRequestParams, CreateConnectorRequestBody } from './types/latest'; + +export { + createConnectorRequestParamsSchema as createConnectorRequestParamsSchemaV1, + createConnectorRequestBodySchema as createConnectorRequestBodySchemaV1, +} from './schemas/v1'; +export type { + CreateConnectorRequestParams as CreateConnectorRequestParamsV1, + CreateConnectorRequestBody as CreateConnectorRequestBodyV1, +} from './types/v1'; diff --git a/x-pack/plugins/actions/server/routes/connector/get/transforms/transform_connector_response/latest.ts b/x-pack/plugins/actions/common/routes/connector/apis/create/schemas/latest.ts similarity index 82% rename from x-pack/plugins/actions/server/routes/connector/get/transforms/transform_connector_response/latest.ts rename to x-pack/plugins/actions/common/routes/connector/apis/create/schemas/latest.ts index 8a64b2c81df0c..25300c97a6d2e 100644 --- a/x-pack/plugins/actions/server/routes/connector/get/transforms/transform_connector_response/latest.ts +++ b/x-pack/plugins/actions/common/routes/connector/apis/create/schemas/latest.ts @@ -5,4 +5,4 @@ * 2.0. */ -export { transformGetConnectorResponse } from './v1'; +export * from './v1'; diff --git a/x-pack/plugins/actions/common/routes/connector/apis/create/schemas/v1.ts b/x-pack/plugins/actions/common/routes/connector/apis/create/schemas/v1.ts new file mode 100644 index 0000000000000..ec74ba1a9279f --- /dev/null +++ b/x-pack/plugins/actions/common/routes/connector/apis/create/schemas/v1.ts @@ -0,0 +1,32 @@ +/* + * 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 { schema } from '@kbn/config-schema'; +import { validateEmptyStrings } from '../../../../../validate_empty_strings'; + +export const createConnectorRequestParamsSchema = schema.maybe( + schema.object({ + id: schema.maybe(schema.string({ meta: { description: 'An identifier for the connector.' } })), + }) +); + +export const createConnectorRequestBodySchema = schema.object({ + name: schema.string({ + validate: validateEmptyStrings, + meta: { description: 'The display name for the connector.' }, + }), + connector_type_id: schema.string({ + validate: validateEmptyStrings, + meta: { description: 'The type of connector.' }, + }), + config: schema.recordOf(schema.string(), schema.any({ validate: validateEmptyStrings }), { + defaultValue: {}, + }), + secrets: schema.recordOf(schema.string(), schema.any({ validate: validateEmptyStrings }), { + defaultValue: {}, + }), +}); diff --git a/x-pack/plugins/actions/common/routes/connector/apis/create/types/latest.ts b/x-pack/plugins/actions/common/routes/connector/apis/create/types/latest.ts new file mode 100644 index 0000000000000..25300c97a6d2e --- /dev/null +++ b/x-pack/plugins/actions/common/routes/connector/apis/create/types/latest.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export * from './v1'; diff --git a/x-pack/plugins/actions/common/routes/connector/apis/create/types/v1.ts b/x-pack/plugins/actions/common/routes/connector/apis/create/types/v1.ts new file mode 100644 index 0000000000000..2166ee5a712a6 --- /dev/null +++ b/x-pack/plugins/actions/common/routes/connector/apis/create/types/v1.ts @@ -0,0 +1,12 @@ +/* + * 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 { TypeOf } from '@kbn/config-schema'; +import { createConnectorRequestParamsSchemaV1, createConnectorRequestBodySchemaV1 } from '..'; + +export type CreateConnectorRequestParams = TypeOf; +export type CreateConnectorRequestBody = TypeOf; diff --git a/x-pack/plugins/actions/server/actions_client/actions_client.ts b/x-pack/plugins/actions/server/actions_client/actions_client.ts index edad072acbca6..de029ed2acf54 100644 --- a/x-pack/plugins/actions/server/actions_client/actions_client.ts +++ b/x-pack/plugins/actions/server/actions_client/actions_client.ts @@ -14,9 +14,7 @@ import { compact, uniq } from 'lodash'; import { IScopedClusterClient, SavedObjectsClientContract, - SavedObjectAttributes, KibanaRequest, - SavedObjectsUtils, Logger, } from '@kbn/core/server'; import { AuditLogger } from '@kbn/security-plugin/server'; @@ -29,6 +27,7 @@ import { get } from '../application/connector/methods/get'; import { getAll, getAllSystemConnectors } from '../application/connector/methods/get_all'; import { update } from '../application/connector/methods/update'; import { listTypes } from '../application/connector/methods/list_types'; +import { create } from '../application/connector/methods/create'; import { execute } from '../application/connector/methods/execute'; import { GetGlobalExecutionKPIParams, @@ -36,15 +35,7 @@ import { IExecutionLogResult, } from '../../common'; import { ActionTypeRegistry } from '../action_type_registry'; -import { - validateConfig, - validateSecrets, - ActionExecutorContract, - validateConnector, - ActionExecutionSource, - parseDate, - tryCatch, -} from '../lib'; +import { ActionExecutorContract, ActionExecutionSource, parseDate } from '../lib'; import { ActionResult, RawAction, @@ -94,20 +85,11 @@ import { import { connectorFromSavedObject, isConnectorDeprecated } from '../application/connector/lib'; import { ListTypesParams } from '../application/connector/methods/list_types/types'; import { ConnectorUpdateParams } from '../application/connector/methods/update/types'; -import { ConnectorUpdate } from '../application/connector/methods/update/types/types'; +import { ConnectorCreateParams } from '../application/connector/methods/create/types'; import { isPreconfigured } from '../lib/is_preconfigured'; import { isSystemAction } from '../lib/is_system_action'; import { ConnectorExecuteParams } from '../application/connector/methods/execute/types'; -interface Action extends ConnectorUpdate { - actionTypeId: string; -} - -export interface CreateOptions { - action: Action; - options?: { id?: string }; -} - export interface ConstructorOptions { logger: Logger; kibanaIndices: string[]; @@ -187,156 +169,10 @@ export class ActionsClient { * Create an action */ public async create({ - action: { actionTypeId, name, config, secrets }, + action, options, - }: CreateOptions): Promise { - const id = options?.id || SavedObjectsUtils.generateId(); - - try { - await this.context.authorization.ensureAuthorized({ - operation: 'create', - actionTypeId, - }); - } catch (error) { - this.context.auditLogger?.log( - connectorAuditEvent({ - action: ConnectorAuditAction.CREATE, - savedObject: { type: 'action', id }, - error, - }) - ); - throw error; - } - - const foundInMemoryConnector = this.context.inMemoryConnectors.find( - (connector) => connector.id === id - ); - - if ( - this.context.actionTypeRegistry.isSystemActionType(actionTypeId) || - foundInMemoryConnector?.isSystemAction - ) { - throw Boom.badRequest( - i18n.translate('xpack.actions.serverSideErrors.systemActionCreationForbidden', { - defaultMessage: 'System action creation is forbidden. Action type: {actionTypeId}.', - values: { - actionTypeId, - }, - }) - ); - } - - if (foundInMemoryConnector?.isPreconfigured) { - throw Boom.badRequest( - i18n.translate('xpack.actions.serverSideErrors.predefinedIdConnectorAlreadyExists', { - defaultMessage: 'This {id} already exists in a preconfigured action.', - values: { - id, - }, - }) - ); - } - - const actionType = this.context.actionTypeRegistry.get(actionTypeId); - const configurationUtilities = this.context.actionTypeRegistry.getUtils(); - const validatedActionTypeConfig = validateConfig(actionType, config, { - configurationUtilities, - }); - const validatedActionTypeSecrets = validateSecrets(actionType, secrets, { - configurationUtilities, - }); - if (actionType.validate?.connector) { - validateConnector(actionType, { config, secrets }); - } - this.context.actionTypeRegistry.ensureActionTypeEnabled(actionTypeId); - - const hookServices: HookServices = { - scopedClusterClient: this.context.scopedClusterClient, - }; - - if (actionType.preSaveHook) { - try { - await actionType.preSaveHook({ - connectorId: id, - config, - secrets, - logger: this.context.logger, - request: this.context.request, - services: hookServices, - isUpdate: false, - }); - } catch (error) { - this.context.auditLogger?.log( - connectorAuditEvent({ - action: ConnectorAuditAction.CREATE, - savedObject: { type: 'action', id }, - error, - }) - ); - throw error; - } - } - - this.context.auditLogger?.log( - connectorAuditEvent({ - action: ConnectorAuditAction.CREATE, - savedObject: { type: 'action', id }, - outcome: 'unknown', - }) - ); - - const result = await tryCatch( - async () => - await this.context.unsecuredSavedObjectsClient.create( - 'action', - { - actionTypeId, - name, - isMissingSecrets: false, - config: validatedActionTypeConfig as SavedObjectAttributes, - secrets: validatedActionTypeSecrets as SavedObjectAttributes, - }, - { id } - ) - ); - - const wasSuccessful = !(result instanceof Error); - const label = `connectorId: "${id}"; type: ${actionTypeId}`; - const tags = ['post-save-hook', id]; - - if (actionType.postSaveHook) { - try { - await actionType.postSaveHook({ - connectorId: id, - config, - secrets, - logger: this.context.logger, - request: this.context.request, - services: hookServices, - isUpdate: false, - wasSuccessful, - }); - } catch (err) { - this.context.logger.error(`postSaveHook create error for ${label}: ${err.message}`, { - tags, - }); - } - } - - if (!wasSuccessful) { - throw result; - } - - return { - id: result.id, - actionTypeId: result.attributes.actionTypeId, - isMissingSecrets: result.attributes.isMissingSecrets, - name: result.attributes.name, - config: result.attributes.config, - isPreconfigured: false, - isSystemAction: false, - isDeprecated: isConnectorDeprecated(result.attributes), - }; + }: Omit): Promise { + return create({ context: this.context, action, options }); } /** diff --git a/x-pack/plugins/actions/server/application/connector/methods/create/create.ts b/x-pack/plugins/actions/server/application/connector/methods/create/create.ts new file mode 100644 index 0000000000000..3032b38cb36f2 --- /dev/null +++ b/x-pack/plugins/actions/server/application/connector/methods/create/create.ts @@ -0,0 +1,170 @@ +/* + * 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 Boom from '@hapi/boom'; +import { i18n } from '@kbn/i18n'; +import { SavedObjectAttributes, SavedObjectsUtils } from '@kbn/core/server'; +import { ConnectorCreateParams } from './types'; +import { ConnectorAuditAction, connectorAuditEvent } from '../../../../lib/audit_events'; +import { validateConfig, validateConnector, validateSecrets } from '../../../../lib'; +import { isConnectorDeprecated } from '../../lib'; +import { HookServices, ActionResult } from '../../../../types'; +import { tryCatch } from '../../../../lib'; + +export async function create({ + context, + action: { actionTypeId, name, config, secrets }, + options, +}: ConnectorCreateParams): Promise { + const id = options?.id || SavedObjectsUtils.generateId(); + + try { + await context.authorization.ensureAuthorized({ + operation: 'create', + actionTypeId, + }); + } catch (error) { + context.auditLogger?.log( + connectorAuditEvent({ + action: ConnectorAuditAction.CREATE, + savedObject: { type: 'action', id }, + error, + }) + ); + throw error; + } + + const foundInMemoryConnector = context.inMemoryConnectors.find( + (connector) => connector.id === id + ); + + if ( + context.actionTypeRegistry.isSystemActionType(actionTypeId) || + foundInMemoryConnector?.isSystemAction + ) { + throw Boom.badRequest( + i18n.translate('xpack.actions.serverSideErrors.systemActionCreationForbidden', { + defaultMessage: 'System action creation is forbidden. Action type: {actionTypeId}.', + values: { + actionTypeId, + }, + }) + ); + } + + if (foundInMemoryConnector?.isPreconfigured) { + throw Boom.badRequest( + i18n.translate('xpack.actions.serverSideErrors.predefinedIdConnectorAlreadyExists', { + defaultMessage: 'This {id} already exists in a preconfigured action.', + values: { + id, + }, + }) + ); + } + + const actionType = context.actionTypeRegistry.get(actionTypeId); + const configurationUtilities = context.actionTypeRegistry.getUtils(); + const validatedActionTypeConfig = validateConfig(actionType, config, { + configurationUtilities, + }); + const validatedActionTypeSecrets = validateSecrets(actionType, secrets, { + configurationUtilities, + }); + if (actionType.validate?.connector) { + validateConnector(actionType, { config, secrets }); + } + context.actionTypeRegistry.ensureActionTypeEnabled(actionTypeId); + + const hookServices: HookServices = { + scopedClusterClient: context.scopedClusterClient, + }; + + if (actionType.preSaveHook) { + try { + await actionType.preSaveHook({ + connectorId: id, + config, + secrets, + logger: context.logger, + request: context.request, + services: hookServices, + isUpdate: false, + }); + } catch (error) { + context.auditLogger?.log( + connectorAuditEvent({ + action: ConnectorAuditAction.CREATE, + savedObject: { type: 'action', id }, + error, + }) + ); + throw error; + } + } + + context.auditLogger?.log( + connectorAuditEvent({ + action: ConnectorAuditAction.CREATE, + savedObject: { type: 'action', id }, + outcome: 'unknown', + }) + ); + + const result = await tryCatch( + async () => + await context.unsecuredSavedObjectsClient.create( + 'action', + { + actionTypeId, + name, + isMissingSecrets: false, + config: validatedActionTypeConfig as SavedObjectAttributes, + secrets: validatedActionTypeSecrets as SavedObjectAttributes, + }, + { id } + ) + ); + + const wasSuccessful = !(result instanceof Error); + const label = `connectorId: "${id}"; type: ${actionTypeId}`; + const tags = ['post-save-hook', id]; + + if (actionType.postSaveHook) { + try { + await actionType.postSaveHook({ + connectorId: id, + config, + secrets, + logger: context.logger, + request: context.request, + services: hookServices, + isUpdate: false, + wasSuccessful, + }); + } catch (err) { + context.logger.error(`postSaveHook create error for ${label}: ${err.message}`, { + tags, + }); + } + } + + if (!wasSuccessful) { + throw result; + } + + return { + id: result.id, + actionTypeId: result.attributes.actionTypeId, + isMissingSecrets: result.attributes.isMissingSecrets, + name: result.attributes.name, + config: result.attributes.config, + isPreconfigured: false, + isSystemAction: false, + isDeprecated: isConnectorDeprecated(result.attributes), + }; +} diff --git a/x-pack/plugins/actions/server/application/connector/methods/create/index.ts b/x-pack/plugins/actions/server/application/connector/methods/create/index.ts new file mode 100644 index 0000000000000..97fcd17a79499 --- /dev/null +++ b/x-pack/plugins/actions/server/application/connector/methods/create/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { create } from './create'; diff --git a/x-pack/plugins/actions/server/application/connector/methods/create/types/index.ts b/x-pack/plugins/actions/server/application/connector/methods/create/types/index.ts new file mode 100644 index 0000000000000..707a3fd770f2d --- /dev/null +++ b/x-pack/plugins/actions/server/application/connector/methods/create/types/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export type { ConnectorCreateParams } from './types'; diff --git a/x-pack/plugins/actions/server/application/connector/methods/create/types/types.ts b/x-pack/plugins/actions/server/application/connector/methods/create/types/types.ts new file mode 100644 index 0000000000000..2dc68d59ebe47 --- /dev/null +++ b/x-pack/plugins/actions/server/application/connector/methods/create/types/types.ts @@ -0,0 +1,22 @@ +/* + * 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 { SavedObjectAttributes } from '@kbn/core/server'; +import { ActionsClientContext } from '../../../../../actions_client'; + +export interface ConnectorCreate { + actionTypeId: string; + name: string; + config: SavedObjectAttributes; + secrets: SavedObjectAttributes; +} + +export interface ConnectorCreateParams { + context: ActionsClientContext; + action: ConnectorCreate; + options?: { id?: string }; +} diff --git a/x-pack/plugins/actions/server/routes/connector/get/transforms/index.ts b/x-pack/plugins/actions/server/routes/connector/common_transforms/index.ts similarity index 55% rename from x-pack/plugins/actions/server/routes/connector/get/transforms/index.ts rename to x-pack/plugins/actions/server/routes/connector/common_transforms/index.ts index 44960ddfeec0d..0e26b4ee295a6 100644 --- a/x-pack/plugins/actions/server/routes/connector/get/transforms/index.ts +++ b/x-pack/plugins/actions/server/routes/connector/common_transforms/index.ts @@ -5,6 +5,6 @@ * 2.0. */ -export { transformGetConnectorResponse } from './transform_connector_response/latest'; +export { transformConnectorResponse } from './transform_connector_response/latest'; -export { transformGetConnectorResponse as transformGetConnectorResponseV1 } from './transform_connector_response/v1'; +export { transformConnectorResponse as transformConnectorResponseV1 } from './transform_connector_response/v1'; diff --git a/x-pack/plugins/actions/server/routes/connector/common_transforms/transform_connector_response/latest.ts b/x-pack/plugins/actions/server/routes/connector/common_transforms/transform_connector_response/latest.ts new file mode 100644 index 0000000000000..99b38410e71a8 --- /dev/null +++ b/x-pack/plugins/actions/server/routes/connector/common_transforms/transform_connector_response/latest.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { transformConnectorResponse } from './v1'; diff --git a/x-pack/plugins/actions/server/routes/connector/get/transforms/transform_connector_response/v1.ts b/x-pack/plugins/actions/server/routes/connector/common_transforms/transform_connector_response/v1.ts similarity index 73% rename from x-pack/plugins/actions/server/routes/connector/get/transforms/transform_connector_response/v1.ts rename to x-pack/plugins/actions/server/routes/connector/common_transforms/transform_connector_response/v1.ts index ab6f6332280d1..08b32a10e7e45 100644 --- a/x-pack/plugins/actions/server/routes/connector/get/transforms/transform_connector_response/v1.ts +++ b/x-pack/plugins/actions/server/routes/connector/common_transforms/transform_connector_response/v1.ts @@ -5,10 +5,10 @@ * 2.0. */ -import { ConnectorResponseV1 } from '../../../../../../common/routes/connector/response'; -import { Connector } from '../../../../../application/connector/types'; +import { ConnectorResponseV1 } from '../../../../../common/routes/connector/response'; +import { Connector } from '../../../../application/connector/types'; -export const transformGetConnectorResponse = ({ +export const transformConnectorResponse = ({ actionTypeId, isPreconfigured, isMissingSecrets, diff --git a/x-pack/plugins/actions/server/routes/create.test.ts b/x-pack/plugins/actions/server/routes/connector/create/create.test.ts similarity index 84% rename from x-pack/plugins/actions/server/routes/create.test.ts rename to x-pack/plugins/actions/server/routes/connector/create/create.test.ts index 7d9c7fd1a5899..0f97015bd4f01 100644 --- a/x-pack/plugins/actions/server/routes/create.test.ts +++ b/x-pack/plugins/actions/server/routes/connector/create/create.test.ts @@ -5,15 +5,16 @@ * 2.0. */ -import { createActionRoute, bodySchema } from './create'; +import { createConnectorRoute } from './create'; import { httpServiceMock } from '@kbn/core/server/mocks'; -import { licenseStateMock } from '../lib/license_state.mock'; -import { mockHandlerArguments } from './legacy/_mock_handler_arguments'; -import { verifyAccessAndContext } from './verify_access_and_context'; +import { licenseStateMock } from '../../../lib/license_state.mock'; +import { mockHandlerArguments } from '../../legacy/_mock_handler_arguments'; +import { verifyAccessAndContext } from '../../verify_access_and_context'; import { omit } from 'lodash'; -import { actionsClientMock } from '../actions_client/actions_client.mock'; +import { actionsClientMock } from '../../../actions_client/actions_client.mock'; +import { createConnectorRequestBodySchemaV1 } from '../../../../common/routes/connector/apis/create'; -jest.mock('./verify_access_and_context', () => ({ +jest.mock('../../verify_access_and_context', () => ({ verifyAccessAndContext: jest.fn(), })); @@ -22,12 +23,12 @@ beforeEach(() => { (verifyAccessAndContext as jest.Mock).mockImplementation((license, handler) => handler); }); -describe('createActionRoute', () => { +describe('createConnectorRoute', () => { it('creates an action with proper parameters', async () => { const licenseState = licenseStateMock.create(); const router = httpServiceMock.createRouter(); - createActionRoute(router, licenseState); + createConnectorRoute(router, licenseState); const [config, handler] = router.post.mock.calls[0]; @@ -103,7 +104,7 @@ describe('createActionRoute', () => { const licenseState = licenseStateMock.create(); const router = httpServiceMock.createRouter(); - createActionRoute(router, licenseState); + createConnectorRoute(router, licenseState); const [, handler] = router.post.mock.calls[0]; @@ -144,7 +145,7 @@ describe('createActionRoute', () => { throw new Error('OMG'); }); - createActionRoute(router, licenseState); + createConnectorRoute(router, licenseState); const [, handler] = router.post.mock.calls[0]; @@ -182,8 +183,8 @@ describe('createActionRoute', () => { config: { foo: ' ' }, secrets: {}, }; - expect(() => bodySchema.validate(body)).toThrowErrorMatchingInlineSnapshot( - `"[config.foo]: value '' is not valid"` - ); + expect(() => + createConnectorRequestBodySchemaV1.validate(body) + ).toThrowErrorMatchingInlineSnapshot(`"[config.foo]: value '' is not valid"`); }); }); diff --git a/x-pack/plugins/actions/server/routes/connector/create/create.ts b/x-pack/plugins/actions/server/routes/connector/create/create.ts new file mode 100644 index 0000000000000..cd5073506c03f --- /dev/null +++ b/x-pack/plugins/actions/server/routes/connector/create/create.ts @@ -0,0 +1,58 @@ +/* + * 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 { IRouter } from '@kbn/core/server'; +import { ActionsRequestHandlerContext } from '../../../types'; +import { ILicenseState } from '../../../lib'; +import { BASE_ACTION_API_PATH } from '../../../../common'; +import { verifyAccessAndContext } from '../../verify_access_and_context'; +import { connectorResponseSchemaV1 } from '../../../../common/routes/connector/response'; +import { transformConnectorResponseV1 } from '../common_transforms'; +import { + createConnectorRequestParamsSchemaV1, + createConnectorRequestBodySchemaV1, +} from '../../../../common/routes/connector/apis/create'; +import { transformCreateConnectorBodyV1 } from './transforms'; + +export const createConnectorRoute = ( + router: IRouter, + licenseState: ILicenseState +) => { + router.post( + { + path: `${BASE_ACTION_API_PATH}/connector/{id?}`, + options: { + access: 'public', + summary: 'Create a connector', + tags: ['oas-tag:connectors'], + }, + validate: { + request: { + params: createConnectorRequestParamsSchemaV1, + body: createConnectorRequestBodySchemaV1, + }, + response: { + 200: { + description: 'Indicates a successful call.', + body: () => connectorResponseSchemaV1, + }, + }, + }, + }, + router.handleLegacyErrors( + verifyAccessAndContext(licenseState, async function (context, req, res) { + const actionsClient = (await context.actions).getActionsClient(); + const action = transformCreateConnectorBodyV1(req.body); + return res.ok({ + body: transformConnectorResponseV1( + await actionsClient.create({ action, options: req.params }) + ), + }); + }) + ) + ); +}; diff --git a/x-pack/plugins/actions/server/routes/connector/create/index.ts b/x-pack/plugins/actions/server/routes/connector/create/index.ts new file mode 100644 index 0000000000000..47f4f6a55eb71 --- /dev/null +++ b/x-pack/plugins/actions/server/routes/connector/create/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { createConnectorRoute } from './create'; diff --git a/x-pack/plugins/actions/server/routes/connector/create/transforms/index.ts b/x-pack/plugins/actions/server/routes/connector/create/transforms/index.ts new file mode 100644 index 0000000000000..76f6e098f0564 --- /dev/null +++ b/x-pack/plugins/actions/server/routes/connector/create/transforms/index.ts @@ -0,0 +1,10 @@ +/* + * 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. + */ + +export { transformCreateConnectorBody } from './transform_connector_body/latest'; + +export { transformCreateConnectorBody as transformCreateConnectorBodyV1 } from './transform_connector_body/v1'; diff --git a/x-pack/plugins/actions/server/routes/connector/create/transforms/transform_connector_body/latest.ts b/x-pack/plugins/actions/server/routes/connector/create/transforms/transform_connector_body/latest.ts new file mode 100644 index 0000000000000..4584455ddf5c2 --- /dev/null +++ b/x-pack/plugins/actions/server/routes/connector/create/transforms/transform_connector_body/latest.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { transformCreateConnectorBody } from './v1'; diff --git a/x-pack/plugins/actions/server/routes/connector/create/transforms/transform_connector_body/v1.ts b/x-pack/plugins/actions/server/routes/connector/create/transforms/transform_connector_body/v1.ts new file mode 100644 index 0000000000000..07d7a5e7afa4c --- /dev/null +++ b/x-pack/plugins/actions/server/routes/connector/create/transforms/transform_connector_body/v1.ts @@ -0,0 +1,21 @@ +/* + * 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 { ConnectorCreateParams } from '../../../../../application/connector/methods/create/types'; +import { CreateConnectorRequestBodyV1 } from '../../../../../../common/routes/connector/apis/create'; + +export const transformCreateConnectorBody = ({ + connector_type_id: actionTypeId, + name, + config, + secrets, +}: CreateConnectorRequestBodyV1): ConnectorCreateParams['action'] => ({ + actionTypeId, + name, + config, + secrets, +}); diff --git a/x-pack/plugins/actions/server/routes/connector/get/get.ts b/x-pack/plugins/actions/server/routes/connector/get/get.ts index 686b54655c892..eaab31594ba1b 100644 --- a/x-pack/plugins/actions/server/routes/connector/get/get.ts +++ b/x-pack/plugins/actions/server/routes/connector/get/get.ts @@ -11,7 +11,7 @@ import { GetConnectorParamsV1, } from '../../../../common/routes/connector/apis/get'; import { connectorResponseSchemaV1 } from '../../../../common/routes/connector/response'; -import { transformGetConnectorResponseV1 } from './transforms'; +import { transformConnectorResponseV1 } from '../common_transforms'; import { ILicenseState } from '../../../lib'; import { BASE_ACTION_API_PATH } from '../../../../common'; import { ActionsRequestHandlerContext } from '../../../types'; @@ -46,7 +46,7 @@ export const getConnectorRoute = ( const actionsClient = (await context.actions).getActionsClient(); const { id }: GetConnectorParamsV1 = req.params; return res.ok({ - body: transformGetConnectorResponseV1(await actionsClient.get({ id })), + body: transformConnectorResponseV1(await actionsClient.get({ id })), }); }) ) diff --git a/x-pack/plugins/actions/server/routes/create.ts b/x-pack/plugins/actions/server/routes/create.ts deleted file mode 100644 index 25962701918a5..0000000000000 --- a/x-pack/plugins/actions/server/routes/create.ts +++ /dev/null @@ -1,98 +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 { schema } from '@kbn/config-schema'; -import { IRouter } from '@kbn/core/server'; -import { ActionResult, ActionsRequestHandlerContext } from '../types'; -import { ILicenseState } from '../lib'; -import { BASE_ACTION_API_PATH, RewriteRequestCase, RewriteResponseCase } from '../../common'; -import { verifyAccessAndContext } from './verify_access_and_context'; -import { CreateOptions } from '../actions_client'; -import { connectorResponseSchemaV1 } from '../../common/routes/connector/response'; -import { validateEmptyStrings } from '../../common/validate_empty_strings'; - -export const bodySchema = schema.object({ - name: schema.string({ - validate: validateEmptyStrings, - meta: { description: 'The display name for the connector.' }, - }), - connector_type_id: schema.string({ - validate: validateEmptyStrings, - meta: { description: 'The type of connector.' }, - }), - config: schema.recordOf(schema.string(), schema.any({ validate: validateEmptyStrings }), { - defaultValue: {}, - }), - secrets: schema.recordOf(schema.string(), schema.any({ validate: validateEmptyStrings }), { - defaultValue: {}, - }), -}); - -const rewriteBodyReq: RewriteRequestCase = ({ - connector_type_id: actionTypeId, - name, - config, - secrets, -}) => ({ actionTypeId, name, config, secrets }); -const rewriteBodyRes: RewriteResponseCase = ({ - actionTypeId, - isPreconfigured, - isDeprecated, - isMissingSecrets, - isSystemAction, - ...res -}) => ({ - ...res, - connector_type_id: actionTypeId, - is_preconfigured: isPreconfigured, - is_deprecated: isDeprecated, - is_missing_secrets: isMissingSecrets, - is_system_action: isSystemAction, -}); - -export const createActionRoute = ( - router: IRouter, - licenseState: ILicenseState -) => { - router.post( - { - path: `${BASE_ACTION_API_PATH}/connector/{id?}`, - options: { - access: 'public', - summary: 'Create a connector', - tags: ['oas-tag:connectors'], - }, - validate: { - request: { - params: schema.maybe( - schema.object({ - id: schema.maybe( - schema.string({ meta: { description: 'An identifier for the connector.' } }) - ), - }) - ), - body: bodySchema, - }, - response: { - 200: { - description: 'Indicates a successful call.', - body: () => connectorResponseSchemaV1, - }, - }, - }, - }, - router.handleLegacyErrors( - verifyAccessAndContext(licenseState, async function (context, req, res) { - const actionsClient = (await context.actions).getActionsClient(); - const action = rewriteBodyReq(req.body); - return res.ok({ - body: rewriteBodyRes(await actionsClient.create({ action, options: req.params })), - }); - }) - ) - ); -}; diff --git a/x-pack/plugins/actions/server/routes/index.ts b/x-pack/plugins/actions/server/routes/index.ts index 5ea804d1ce47e..39efe6619176b 100644 --- a/x-pack/plugins/actions/server/routes/index.ts +++ b/x-pack/plugins/actions/server/routes/index.ts @@ -13,7 +13,7 @@ import { listTypesRoute } from './connector/list_types'; import { listTypesWithSystemRoute } from './connector/list_types_system'; import { ILicenseState } from '../lib'; import { ActionsRequestHandlerContext } from '../types'; -import { createActionRoute } from './create'; +import { createConnectorRoute } from './connector/create'; import { deleteConnectorRoute } from './connector/delete'; import { executeConnectorRoute } from './connector/execute'; import { getConnectorRoute } from './connector/get'; @@ -36,7 +36,7 @@ export function defineRoutes(opts: RouteOptions) { defineLegacyRoutes(router, licenseState, usageCounter); - createActionRoute(router, licenseState); + createConnectorRoute(router, licenseState); deleteConnectorRoute(router, licenseState); getConnectorRoute(router, licenseState); getAllConnectorsRoute(router, licenseState); diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/connectors_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/connectors_services.ts index 3fb2971f1236d..62ce76437c1d6 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/connectors_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/connectors_services.ts @@ -7,8 +7,7 @@ import type { KbnClient } from '@kbn/test'; import type { AllConnectorsResponseV1 } from '@kbn/actions-plugin/common/routes/connector/response'; -import type { bodySchema } from '@kbn/actions-plugin/server/routes/create'; -import type { TypeOf } from '@kbn/config-schema'; +import type { CreateConnectorRequestBodyV1 } from '@kbn/actions-plugin/common/routes/connector/apis/create'; import type { Connector } from '@kbn/actions-plugin/server/application/connector/types'; import { catchAxiosErrorFormatAndThrow } from '../../../common/endpoint/format_axios_error'; @@ -46,8 +45,6 @@ export const fetchConnectorByType = async ( } }; -type CreateConnectorBody = TypeOf; - /** * Creates a connector in the stack * @param kbnClient @@ -55,7 +52,7 @@ type CreateConnectorBody = TypeOf; */ export const createConnector = async ( kbnClient: KbnClient, - createPayload: CreateConnectorBody + createPayload: CreateConnectorRequestBodyV1 ): Promise => { return kbnClient .request({ From 629edc03da0c91df34b101098d822436a6682f1a Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Wed, 23 Oct 2024 17:11:22 +0200 Subject: [PATCH 069/146] Support Kibana URL parts with stripped default port (#197418) ## Summary This PR adds support for getting Kibana URL parts with stripped default port. ### Details * Adds method `getUrlPartsWithStrippedDefaultPort` to `kbnTestConfig` * Can be used when asserting URLs where the browser strips the default port --- packages/kbn-test/kbn_test_config.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/kbn-test/kbn_test_config.ts b/packages/kbn-test/kbn_test_config.ts index 1b96946bf2781..1faa3291f590e 100644 --- a/packages/kbn-test/kbn_test_config.ts +++ b/packages/kbn-test/kbn_test_config.ts @@ -54,4 +54,21 @@ export const kbnTestConfig = new (class KbnTestConfig { password, }; } + + /** + * Use to get `port:undefined` for assertions if the port is default for the + * used protocol and thus would be stripped by the browser + */ + getUrlPartsWithStrippedDefaultPort(user: UserAuth = kibanaTestUser): UrlParts { + const urlParts = this.getUrlParts(user); + + if ( + (urlParts.protocol === 'http' && urlParts.port === 80) || + (urlParts.protocol === 'https' && urlParts.port === 443) + ) { + urlParts.port = undefined; + } + + return urlParts; + } })(); From ea4ce57141019606b148016f667dd7a0cf98ff8c Mon Sep 17 00:00:00 2001 From: Liam Thompson <32779855+leemthompo@users.noreply.github.com> Date: Wed, 23 Oct 2024 17:30:13 +0200 Subject: [PATCH 070/146] [ML] Update allocations tooltip to clarify that it's per node (#197099) Clarifies text to mention nodes, conditional on being not-serverless --- .../nodes_overview/allocated_models.tsx | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/allocated_models.tsx b/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/allocated_models.tsx index bce892a26b678..4dd04780e2e92 100644 --- a/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/allocated_models.tsx +++ b/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/allocated_models.tsx @@ -24,6 +24,7 @@ import type { NodeDeploymentStatsResponse, } from '../../../../common/types/trained_models'; import { useFieldFormatter } from '../../contexts/kibana/use_field_formatter'; +import { useEnabledFeatures } from '../../contexts/ml'; interface AllocatedModelsProps { models: NodeDeploymentStatsResponse['allocated_models']; @@ -38,6 +39,7 @@ export const AllocatedModels: FC = ({ const dateFormatter = useFieldFormatter(FIELD_FORMAT_IDS.DATE); const durationFormatter = useFieldFormatter(FIELD_FORMAT_IDS.DURATION); const euiTheme = useEuiTheme(); + const { showNodeInfo } = useEnabledFeatures(); const columns: Array> = [ { @@ -105,9 +107,20 @@ export const AllocatedModels: FC = ({ width: '8%', name: ( {i18n.translate('xpack.ml.trainedModels.nodesList.modelsList.allocationHeader', { From d15358496b8cbc153d494f9a8f70c9400ebb1d66 Mon Sep 17 00:00:00 2001 From: seanrathier Date: Wed, 23 Oct 2024 11:46:26 -0400 Subject: [PATCH 071/146] [Cloud Security] Handle critical errors returned from the Agentless API when creating and deleting agentless agents (#195997) --- x-pack/plugins/fleet/server/errors/index.ts | 10 + .../services/agents/agentless_agent.test.ts | 542 +++++++++++++++++- .../server/services/agents/agentless_agent.ts | 438 ++++++++++---- .../fleet/server/services/utils/agentless.ts | 2 +- 4 files changed, 857 insertions(+), 135 deletions(-) diff --git a/x-pack/plugins/fleet/server/errors/index.ts b/x-pack/plugins/fleet/server/errors/index.ts index 2f9b42799075f..ac6eca6b3b97d 100644 --- a/x-pack/plugins/fleet/server/errors/index.ts +++ b/x-pack/plugins/fleet/server/errors/index.ts @@ -57,6 +57,16 @@ export class AgentlessAgentCreateError extends FleetError { super(`Error creating agentless agent in Fleet, ${message}`); } } +export class AgentlessAgentDeleteError extends FleetError { + constructor(message: string) { + super(`Error deleting agentless agent in Fleet, ${message}`); + } +} +export class AgentlessAgentConfigError extends FleetError { + constructor(message: string) { + super(`Error validating Agentless API configuration in Fleet, ${message}`); + } +} export class AgentlessPolicyExistsRequestError extends AgentPolicyError { constructor(message: string) { diff --git a/x-pack/plugins/fleet/server/services/agents/agentless_agent.test.ts b/x-pack/plugins/fleet/server/services/agents/agentless_agent.test.ts index e7db96812749b..42f19d0de85bf 100644 --- a/x-pack/plugins/fleet/server/services/agents/agentless_agent.test.ts +++ b/x-pack/plugins/fleet/server/services/agents/agentless_agent.test.ts @@ -12,7 +12,7 @@ import type { Logger } from '@kbn/core/server'; import type { AxiosError } from 'axios'; import axios from 'axios'; -import { AgentlessAgentCreateError } from '../../errors'; +import { AgentlessAgentConfigError } from '../../errors'; import type { AgentPolicy, NewAgentPolicy } from '../../types'; import { appContextService } from '../app_context'; @@ -88,11 +88,23 @@ describe('Agentless Agent service', () => { jest.resetAllMocks(); }); - it('should throw AgentlessAgentCreateError if agentless policy does not support_agentless', async () => { + it('should throw AgentlessAgentConfigError if agentless policy does not support_agentless', async () => { const soClient = getAgentPolicyCreateMock(); // ignore unrelated unique name constraint const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isCloudEnabled: true } as any); + jest.spyOn(appContextService, 'getConfig').mockReturnValue({ + agentless: { + enabled: true, + api: { + url: 'http://api.agentless.com/api/v1/ess', + tls: { + certificate: '/path/to/cert', + key: '/path/to/key', + }, + }, + }, + } as any); await expect( agentlessAgentService.createAgentlessAgent(esClient, soClient, { @@ -102,16 +114,31 @@ describe('Agentless Agent service', () => { supports_agentless: false, } as AgentPolicy) ).rejects.toThrowError( - new AgentlessAgentCreateError('Agentless agent policy does not have agentless enabled') + new AgentlessAgentConfigError( + 'Agentless agent policy does not have supports_agentless enabled' + ) ); }); - it('should throw AgentlessAgentCreateError if cloud is not enabled', async () => { + it('should throw AgentlessAgentConfigError if cloud and serverless is not enabled', async () => { const soClient = getAgentPolicyCreateMock(); // ignore unrelated unique name constraint const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isCloudEnabled: false } as any); - + jest + .spyOn(appContextService, 'getCloud') + .mockReturnValue({ isCloudEnabled: false, isServerlessEnabled: false } as any); + jest.spyOn(appContextService, 'getConfig').mockReturnValue({ + agentless: { + enabled: true, + api: { + url: 'http://api.agentless.com/api/v1/ess', + tls: { + certificate: '/path/to/cert', + key: '/path/to/key', + }, + }, + }, + } as any); await expect( agentlessAgentService.createAgentlessAgent(esClient, soClient, { id: 'mocked', @@ -119,10 +146,14 @@ describe('Agentless Agent service', () => { namespace: 'default', supports_agentless: true, } as AgentPolicy) - ).rejects.toThrowError(new AgentlessAgentCreateError('missing agentless configuration')); + ).rejects.toThrowError( + new AgentlessAgentConfigError( + 'Agentless agents are only supported in cloud deployment and serverless projects' + ) + ); }); - it('should throw AgentlessAgentCreateError if agentless configuration is not found', async () => { + it('should throw AgentlessAgentConfigError if agentless configuration is not found', async () => { const soClient = getAgentPolicyCreateMock(); // ignore unrelated unique name constraint const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; @@ -136,14 +167,18 @@ describe('Agentless Agent service', () => { namespace: 'default', supports_agentless: true, } as AgentPolicy) - ).rejects.toThrowError(new AgentlessAgentCreateError('missing agentless configuration')); + ).rejects.toThrowError( + new AgentlessAgentConfigError('missing Agentless API configuration in Kibana') + ); }); - it('should throw AgentlessAgentCreateError if fleet hosts are not found', async () => { + + it('should throw AgentlessAgentConfigError if fleet hosts are not found', async () => { const soClient = getAgentPolicyCreateMock(); // ignore unrelated unique name constraint const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; jest.spyOn(appContextService, 'getConfig').mockReturnValue({ agentless: { + enabled: true, api: { url: 'http://api.agentless.com/api/v1/ess', tls: { @@ -172,15 +207,16 @@ describe('Agentless Agent service', () => { namespace: 'default', supports_agentless: true, } as AgentPolicy) - ).rejects.toThrowError(new AgentlessAgentCreateError('missing Fleet server host')); + ).rejects.toThrowError(new AgentlessAgentConfigError('missing default Fleet server host')); }); - it('should throw AgentlessAgentCreateError if enrollment tokens are not found', async () => { + it('should throw AgentlessAgentConfigError if enrollment tokens are not found', async () => { const soClient = getAgentPolicyCreateMock(); // ignore unrelated unique name constraint const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; jest.spyOn(appContextService, 'getConfig').mockReturnValue({ agentless: { + enabled: true, api: { url: 'http://api.agentless.com/api/v1/ess', tls: { @@ -212,7 +248,487 @@ describe('Agentless Agent service', () => { namespace: 'default', supports_agentless: true, } as AgentPolicy) - ).rejects.toThrowError(new AgentlessAgentCreateError('missing Fleet enrollment token')); + ).rejects.toThrowError(new AgentlessAgentConfigError('missing Fleet enrollment token')); + }); + + it('should throw an error and log and error when the Agentless API returns a status not handled and not in the 2xx series', async () => { + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.spyOn(appContextService, 'getConfig').mockReturnValue({ + agentless: { + enabled: true, + api: { + url: 'http://api.agentless.com', + tls: { + certificate: '/path/to/cert', + key: '/path/to/key', + ca: '/path/to/ca', + }, + }, + }, + } as any); + jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isCloudEnabled: true } as any); + mockedListFleetServerHosts.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-server-id', + host: 'http://fleetserver:8220', + active: true, + is_default: true, + host_urls: ['http://fleetserver:8220'], + }, + ], + } as any); + mockedListEnrollmentApiKeys.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-enrollment-token-id', + policy_id: 'mocked-policy-id', + api_key: 'mocked-api-key', + }, + ], + } as any); + // Force axios to throw an AxiosError to simulate an error response + (axios as jest.MockedFunction).mockRejectedValueOnce({ + response: { + status: 999, + data: { + message: 'This is a fake error status that is never to be handled handled', + }, + }, + } as AxiosError); + + await expect( + agentlessAgentService.createAgentlessAgent(esClient, soClient, { + id: 'mocked-agentless-agent-policy-id', + name: 'agentless agent policy', + namespace: 'default', + supports_agentless: true, + } as AgentPolicy) + ).rejects.toThrowError(); + + // Assert that the error is logged + expect(mockedLogger.error).toHaveBeenCalledTimes(1); + }); + + it('should throw an error and log and error when the Agentless API returns status 500', async () => { + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.spyOn(appContextService, 'getConfig').mockReturnValue({ + agentless: { + enabled: true, + api: { + url: 'http://api.agentless.com', + tls: { + certificate: '/path/to/cert', + key: '/path/to/key', + ca: '/path/to/ca', + }, + }, + }, + } as any); + jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isCloudEnabled: true } as any); + mockedListFleetServerHosts.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-server-id', + host: 'http://fleetserver:8220', + active: true, + is_default: true, + host_urls: ['http://fleetserver:8220'], + }, + ], + } as any); + mockedListEnrollmentApiKeys.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-enrollment-token-id', + policy_id: 'mocked-policy-id', + api_key: 'mocked-api-key', + }, + ], + } as any); + // Force axios to throw an AxiosError to simulate an error response + (axios as jest.MockedFunction).mockRejectedValueOnce({ + response: { + status: 500, + data: { + message: 'Internal Server Error', + }, + }, + } as AxiosError); + + await expect( + agentlessAgentService.createAgentlessAgent(esClient, soClient, { + id: 'mocked-agentless-agent-policy-id', + name: 'agentless agent policy', + namespace: 'default', + supports_agentless: true, + } as AgentPolicy) + ).rejects.toThrowError(); + + // Assert that the error is logged + expect(mockedLogger.error).toHaveBeenCalledTimes(1); + }); + + it('should throw an error and log and error when the Agentless API returns status 429', async () => { + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.spyOn(appContextService, 'getConfig').mockReturnValue({ + agentless: { + enabled: true, + api: { + url: 'http://api.agentless.com', + tls: { + certificate: '/path/to/cert', + key: '/path/to/key', + ca: '/path/to/ca', + }, + }, + }, + } as any); + jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isCloudEnabled: true } as any); + mockedListFleetServerHosts.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-server-id', + host: 'http://fleetserver:8220', + active: true, + is_default: true, + host_urls: ['http://fleetserver:8220'], + }, + ], + } as any); + mockedListEnrollmentApiKeys.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-enrollment-token-id', + policy_id: 'mocked-policy-id', + api_key: 'mocked-api-key', + }, + ], + } as any); + // Force axios to throw an AxiosError to simulate an error response + (axios as jest.MockedFunction).mockRejectedValueOnce({ + response: { + status: 429, + data: { + message: 'Limit exceeded', + }, + }, + } as AxiosError); + + await expect( + agentlessAgentService.createAgentlessAgent(esClient, soClient, { + id: 'mocked-agentless-agent-policy-id', + name: 'agentless agent policy', + namespace: 'default', + supports_agentless: true, + } as AgentPolicy) + ).rejects.toThrowError(); + + // Assert that the error is logged + expect(mockedLogger.error).toHaveBeenCalledTimes(1); + }); + + it('should throw an error and log and error when the Agentless API returns status 408', async () => { + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.spyOn(appContextService, 'getConfig').mockReturnValue({ + agentless: { + enabled: true, + api: { + url: 'http://api.agentless.com', + tls: { + certificate: '/path/to/cert', + key: '/path/to/key', + ca: '/path/to/ca', + }, + }, + }, + } as any); + jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isCloudEnabled: true } as any); + mockedListFleetServerHosts.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-server-id', + host: 'http://fleetserver:8220', + active: true, + is_default: true, + host_urls: ['http://fleetserver:8220'], + }, + ], + } as any); + mockedListEnrollmentApiKeys.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-enrollment-token-id', + policy_id: 'mocked-policy-id', + api_key: 'mocked-api-key', + }, + ], + } as any); + // Force axios to throw an AxiosError to simulate an error response + (axios as jest.MockedFunction).mockRejectedValueOnce({ + response: { + status: 408, + data: { + message: 'Request timed out', + }, + }, + } as AxiosError); + + await expect( + agentlessAgentService.createAgentlessAgent(esClient, soClient, { + id: 'mocked-agentless-agent-policy-id', + name: 'agentless agent policy', + namespace: 'default', + supports_agentless: true, + } as AgentPolicy) + ).rejects.toThrowError(); + + // Assert that the error is logged + expect(mockedLogger.error).toBeCalledTimes(1); + }); + + it('should throw an error and log and error when the Agentless API returns status 404', async () => { + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.spyOn(appContextService, 'getConfig').mockReturnValue({ + agentless: { + enabled: true, + api: { + url: 'http://api.agentless.com', + tls: { + certificate: '/path/to/cert', + key: '/path/to/key', + ca: '/path/to/ca', + }, + }, + }, + } as any); + jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isCloudEnabled: true } as any); + mockedListFleetServerHosts.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-server-id', + host: 'http://fleetserver:8220', + active: true, + is_default: true, + host_urls: ['http://fleetserver:8220'], + }, + ], + } as any); + mockedListEnrollmentApiKeys.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-enrollment-token-id', + policy_id: 'mocked-policy-id', + api_key: 'mocked-api-key', + }, + ], + } as any); + // Force axios to throw an AxiosError to simulate an error response + (axios as jest.MockedFunction).mockRejectedValueOnce({ + response: { + status: 404, + data: { + message: 'Not Found', + }, + }, + } as AxiosError); + + await expect( + agentlessAgentService.createAgentlessAgent(esClient, soClient, { + id: 'mocked-agentless-agent-policy-id', + name: 'agentless agent policy', + namespace: 'default', + supports_agentless: true, + } as AgentPolicy) + ).rejects.toThrowError(); + + // Assert that the error is logged + expect(mockedLogger.error).toBeCalledTimes(1); + }); + + it('should throw an error and log and error when the Agentless API returns status 403', async () => { + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.spyOn(appContextService, 'getConfig').mockReturnValue({ + agentless: { + enabled: true, + api: { + url: 'http://api.agentless.com', + tls: { + certificate: '/path/to/cert', + key: '/path/to/key', + ca: '/path/to/ca', + }, + }, + }, + } as any); + jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isCloudEnabled: true } as any); + mockedListFleetServerHosts.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-server-id', + host: 'http://fleetserver:8220', + active: true, + is_default: true, + host_urls: ['http://fleetserver:8220'], + }, + ], + } as any); + mockedListEnrollmentApiKeys.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-enrollment-token-id', + policy_id: 'mocked-policy-id', + api_key: 'mocked-api-key', + }, + ], + } as any); + // Force axios to throw an AxiosError to simulate an error response + (axios as jest.MockedFunction).mockRejectedValueOnce({ + response: { + status: 403, + data: { + message: 'Forbidden', + }, + }, + } as AxiosError); + + await expect( + agentlessAgentService.createAgentlessAgent(esClient, soClient, { + id: 'mocked-agentless-agent-policy-id', + name: 'agentless agent policy', + namespace: 'default', + supports_agentless: true, + } as AgentPolicy) + ).rejects.toThrowError(); + + // Assert that the error is logged + expect(mockedLogger.error).toBeCalledTimes(1); + }); + + it('should throw an error and log and error when the Agentless API returns status 401', async () => { + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.spyOn(appContextService, 'getConfig').mockReturnValue({ + agentless: { + enabled: true, + api: { + url: 'http://api.agentless.com', + tls: { + certificate: '/path/to/cert', + key: '/path/to/key', + ca: '/path/to/ca', + }, + }, + }, + } as any); + jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isCloudEnabled: true } as any); + mockedListFleetServerHosts.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-server-id', + host: 'http://fleetserver:8220', + active: true, + is_default: true, + host_urls: ['http://fleetserver:8220'], + }, + ], + } as any); + mockedListEnrollmentApiKeys.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-enrollment-token-id', + policy_id: 'mocked-policy-id', + api_key: 'mocked-api-key', + }, + ], + } as any); + // Force axios to throw an AxiosError to simulate an error response + (axios as jest.MockedFunction).mockRejectedValueOnce({ + response: { + status: 401, + data: { + message: 'Unauthorized', + }, + }, + } as AxiosError); + + await expect( + agentlessAgentService.createAgentlessAgent(esClient, soClient, { + id: 'mocked-agentless-agent-policy-id', + name: 'agentless agent policy', + namespace: 'default', + supports_agentless: true, + } as AgentPolicy) + ).rejects.toThrowError(); + + // Assert that the error is logged + expect(mockedLogger.error).toBeCalledTimes(1); + }); + + it('should throw an error and log and error when the Agentless API returns status 400', async () => { + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.spyOn(appContextService, 'getConfig').mockReturnValue({ + agentless: { + enabled: true, + api: { + url: 'http://api.agentless.com', + tls: { + certificate: '/path/to/cert', + key: '/path/to/key', + ca: '/path/to/ca', + }, + }, + }, + } as any); + jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isCloudEnabled: true } as any); + mockedListFleetServerHosts.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-server-id', + host: 'http://fleetserver:8220', + active: true, + is_default: true, + host_urls: ['http://fleetserver:8220'], + }, + ], + } as any); + mockedListEnrollmentApiKeys.mockResolvedValue({ + items: [ + { + id: 'mocked-fleet-enrollment-token-id', + policy_id: 'mocked-policy-id', + api_key: 'mocked-api-key', + }, + ], + } as any); + // Force axios to throw an AxiosError to simulate an error response + (axios as jest.MockedFunction).mockRejectedValueOnce({ + response: { + status: 400, + data: { + message: 'Bad Request', + }, + }, + } as AxiosError); + + await expect( + agentlessAgentService.createAgentlessAgent(esClient, soClient, { + id: 'mocked-agentless-agent-policy-id', + name: 'agentless agent policy', + namespace: 'default', + supports_agentless: true, + } as AgentPolicy) + ).rejects.toThrowError(); + + // Assert that the error is logged + expect(mockedLogger.error).toBeCalledTimes(1); }); it('should create agentless agent for ESS', async () => { diff --git a/x-pack/plugins/fleet/server/services/agents/agentless_agent.ts b/x-pack/plugins/fleet/server/services/agents/agentless_agent.ts index 617f3db7849f4..9e6d74ddcf827 100644 --- a/x-pack/plugins/fleet/server/services/agents/agentless_agent.ts +++ b/x-pack/plugins/fleet/server/services/agents/agentless_agent.ts @@ -8,9 +8,10 @@ import https from 'https'; import type { ElasticsearchClient, LogMeta, SavedObjectsClientContract } from '@kbn/core/server'; +import type { Logger } from '@kbn/logging'; import { SslConfig, sslSchema } from '@kbn/server-http-tools'; -import type { AxiosError, AxiosRequestConfig } from 'axios'; +import type { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'; import axios from 'axios'; import apm from 'elastic-apm-node'; @@ -18,7 +19,11 @@ import apm from 'elastic-apm-node'; import { SO_SEARCH_LIMIT } from '../../constants'; import type { AgentPolicy } from '../../types'; import type { AgentlessApiResponse } from '../../../common/types'; -import { AgentlessAgentCreateError } from '../../errors'; +import { + AgentlessAgentConfigError, + AgentlessAgentCreateError, + AgentlessAgentDeleteError, +} from '../../errors'; import { appContextService } from '../app_context'; @@ -34,8 +39,6 @@ class AgentlessAgentService { agentlessAgentPolicy: AgentPolicy ) { const traceId = apm.currentTransaction?.traceparent; - const withRequestIdMessage = (message: string) => `${message} [Request Id: ${traceId}]`; - const errorMetadata: LogMeta = { trace: { id: traceId, @@ -45,21 +48,25 @@ class AgentlessAgentService { const logger = appContextService.getLogger(); logger.debug(`[Agentless API] Creating agentless agent ${agentlessAgentPolicy.id}`); - if (!isAgentlessApiEnabled) { + const agentlessConfig = appContextService.getConfig()?.agentless; + if (!agentlessConfig) { + logger.error('[Agentless API] Missing agentless configuration', errorMetadata); + throw new AgentlessAgentConfigError('missing Agentless API configuration in Kibana'); + } + + if (!isAgentlessApiEnabled()) { logger.error( - '[Agentless API] Creating agentless agent not supported in non-cloud or non-serverless environments' + '[Agentless API] Agentless agents are only supported in cloud deployment and serverless projects' + ); + throw new AgentlessAgentConfigError( + 'Agentless agents are only supported in cloud deployment and serverless projects' ); - throw new AgentlessAgentCreateError('Agentless agent not supported'); } if (!agentlessAgentPolicy.supports_agentless) { logger.error('[Agentless API] Agentless agent policy does not have agentless enabled'); - throw new AgentlessAgentCreateError('Agentless agent policy does not have agentless enabled'); - } - - const agentlessConfig = appContextService.getConfig()?.agentless; - if (!agentlessConfig) { - logger.error('[Agentless API] Missing agentless configuration', errorMetadata); - throw new AgentlessAgentCreateError('missing agentless configuration'); + throw new AgentlessAgentConfigError( + 'Agentless agent policy does not have supports_agentless enabled' + ); } const policyId = agentlessAgentPolicy.id; @@ -111,67 +118,19 @@ class AgentlessAgentService { logger.debug( `[Agentless API] Creating agentless agent with request config ${requestConfigDebugStatus}` ); - const errorMetadataWithRequestConfig: LogMeta = { - ...errorMetadata, - http: { - request: { - id: traceId, - body: requestConfig.data, - }, - }, - }; const response = await axios(requestConfig).catch( (error: Error | AxiosError) => { - if (!axios.isAxiosError(error)) { - logger.error( - `[Agentless API] Creating agentless failed with an error ${error} ${requestConfigDebugStatus}`, - errorMetadataWithRequestConfig - ); - throw new AgentlessAgentCreateError(withRequestIdMessage(error.message)); - } - - const errorLogCodeCause = `${error.code} ${this.convertCauseErrorsToString(error)}`; - - if (error.response) { - // The request was made and the server responded with a status code and error data - logger.error( - `[Agentless API] Creating agentless failed because the Agentless API responding with a status code that falls out of the range of 2xx: ${JSON.stringify( - error.response.status - )}} ${JSON.stringify(error.response.data)}} ${requestConfigDebugStatus}`, - { - ...errorMetadataWithRequestConfig, - http: { - ...errorMetadataWithRequestConfig.http, - response: { - status_code: error.response.status, - body: error.response.data, - }, - }, - } - ); - throw new AgentlessAgentCreateError( - withRequestIdMessage(`the Agentless API could not create the agentless agent`) - ); - } else if (error.request) { - // The request was made but no response was received - logger.error( - `[Agentless API] Creating agentless agent failed while sending the request to the Agentless API: ${errorLogCodeCause} ${requestConfigDebugStatus}`, - errorMetadataWithRequestConfig - ); - throw new AgentlessAgentCreateError( - withRequestIdMessage(`no response received from the Agentless API`) - ); - } else { - // Something happened in setting up the request that triggered an Error - logger.error( - `[Agentless API] Creating agentless agent failed to be created ${errorLogCodeCause} ${requestConfigDebugStatus}`, - errorMetadataWithRequestConfig - ); - throw new AgentlessAgentCreateError( - withRequestIdMessage('the Agentless API could not create the agentless agent') - ); - } + this.catchAgentlessApiError( + 'create', + error, + logger, + agentlessAgentPolicy.id, + requestConfig, + requestConfigDebugStatus, + errorMetadata, + traceId + ); } ); @@ -199,6 +158,12 @@ class AgentlessAgentService { ca: tlsConfig.certificateAuthorities, }), }; + const traceId = apm.currentTransaction?.traceparent; + const errorMetadata: LogMeta = { + trace: { + id: traceId, + }, + }; const requestConfigDebugStatus = this.createRequestConfigDebug(requestConfig); @@ -223,35 +188,25 @@ class AgentlessAgentService { ); const response = await axios(requestConfig).catch((error: AxiosError) => { - const errorLogCodeCause = `${error.code} ${this.convertCauseErrorsToString(error)}`; - - if (!axios.isAxiosError(error)) { - logger.error( - `[Agentless API] Deleting agentless deployment failed with an error ${JSON.stringify( - error - )} ${requestConfigDebugStatus}` - ); - } - if (error.response) { - logger.error( - `[Agentless API] Deleting Agentless deployment Failed Response Error: ${JSON.stringify( - error.response.status - )}} ${JSON.stringify(error.response.data)}} ${requestConfigDebugStatus} ` - ); - } else if (error.request) { - logger.error( - `[Agentless API] Deleting agentless deployment failed to receive a response from the Agentless API ${errorLogCodeCause} ${requestConfigDebugStatus}` - ); - } else { - logger.error( - `[Agentless API] Deleting agentless deployment failed to delete the request ${errorLogCodeCause} ${requestConfigDebugStatus}` - ); - } + this.catchAgentlessApiError( + 'delete', + error, + logger, + agentlessPolicyId, + requestConfig, + requestConfigDebugStatus, + errorMetadata, + traceId + ); }); return response; } + private withRequestIdMessage(message: string, traceId?: string) { + return `${message} [Request Id: ${traceId}]`; + } + private createTlsConfig(agentlessConfig: AgentlessConfig | undefined) { return new SslConfig( sslSchema.validate({ @@ -263,6 +218,34 @@ class AgentlessAgentService { ); } + private async getFleetUrlAndTokenForAgentlessAgent( + esClient: ElasticsearchClient, + policyId: string, + soClient: SavedObjectsClientContract + ) { + const { items: enrollmentApiKeys } = await listEnrollmentApiKeys(esClient, { + perPage: SO_SEARCH_LIMIT, + showInactive: true, + kuery: `policy_id:"${policyId}"`, + }); + + const { items: fleetHosts } = await listFleetServerHosts(soClient); + // Tech Debt: change this when we add the internal fleet server config to use the internal fleet server host + // https://github.com/elastic/security-team/issues/9695 + const defaultFleetHost = + fleetHosts.length === 1 ? fleetHosts[0] : fleetHosts.find((host) => host.is_default); + + if (!defaultFleetHost) { + throw new AgentlessAgentConfigError('missing default Fleet server host'); + } + if (!enrollmentApiKeys.length) { + throw new AgentlessAgentConfigError('missing Fleet enrollment token'); + } + const fleetToken = enrollmentApiKeys[0].api_key; + const fleetUrl = defaultFleetHost?.host_urls[0]; + return { fleetUrl, fleetToken }; + } + private createRequestConfigDebug(requestConfig: AxiosRequestConfig) { return JSON.stringify({ ...requestConfig, @@ -282,6 +265,129 @@ class AgentlessAgentService { }); } + private catchAgentlessApiError( + action: 'create' | 'delete', + error: Error | AxiosError, + logger: Logger, + agentlessPolicyId: string, + requestConfig: AxiosRequestConfig, + requestConfigDebugStatus: string, + errorMetadata: LogMeta, + traceId?: string + ) { + const errorMetadataWithRequestConfig: LogMeta = { + ...errorMetadata, + http: { + request: { + id: traceId, + body: requestConfig.data, + }, + }, + }; + + const errorLogCodeCause = (axiosError: AxiosError) => + `${axiosError.code} ${this.convertCauseErrorsToString(axiosError)}`; + + if (!axios.isAxiosError(error)) { + logger.error( + `${ + action === 'create' + ? `[Agentless API] Creating agentless failed with an error that is not an AxiosError for agentless policy` + : `[Agentless API] Deleting agentless deployment failed with an error that is not an Axios error for agentless policy` + } ${error} ${requestConfigDebugStatus}`, + errorMetadataWithRequestConfig + ); + + throw this.getAgentlessAgentError(action, error.message, traceId); + } + + const ERROR_HANDLING_MESSAGES = this.getErrorHandlingMessages(agentlessPolicyId); + + if (error.response) { + if (error.response.status in ERROR_HANDLING_MESSAGES) { + const handledResponseErrorMessage = + ERROR_HANDLING_MESSAGES[error.response.status as keyof typeof ERROR_HANDLING_MESSAGES][ + action + ]; + this.handleResponseError( + action, + error.response, + logger, + errorMetadataWithRequestConfig, + requestConfigDebugStatus, + handledResponseErrorMessage.log, + handledResponseErrorMessage.message, + traceId + ); + } else { + const unhandledResponseErrorMessage = ERROR_HANDLING_MESSAGES.unhandled_response[action]; + // The request was made and the server responded with a status code and error data + this.handleResponseError( + action, + error.response, + logger, + errorMetadataWithRequestConfig, + requestConfigDebugStatus, + unhandledResponseErrorMessage.log, + unhandledResponseErrorMessage.message, + traceId + ); + } + } else if (error.request) { + // The request was made but no response was received + const requestErrorMessage = ERROR_HANDLING_MESSAGES.request_error[action]; + logger.error( + `${requestErrorMessage.log} ${errorLogCodeCause(error)} ${requestConfigDebugStatus}`, + errorMetadataWithRequestConfig + ); + + throw this.getAgentlessAgentError(action, requestErrorMessage.message, traceId); + } else { + // Something happened in setting up the request that triggered an Error + logger.error( + `[Agentless API] ${ + action === 'create' ? 'Creating' : 'Deleting' + } the agentless agent failed ${errorLogCodeCause(error)} ${requestConfigDebugStatus}`, + errorMetadataWithRequestConfig + ); + + throw this.getAgentlessAgentError( + action, + `the Agentless API could not ${action} the agentless agent`, + traceId + ); + } + } + + private handleResponseError( + action: 'create' | 'delete', + response: AxiosResponse, + logger: Logger, + errorMetadataWithRequestConfig: LogMeta, + requestConfigDebugStatus: string, + logMessage: string, + userMessage: string, + traceId?: string + ) { + logger.error( + `${logMessage} ${JSON.stringify(response.status)} ${JSON.stringify( + response.data + )}} ${requestConfigDebugStatus}`, + { + ...errorMetadataWithRequestConfig, + http: { + ...errorMetadataWithRequestConfig.http, + response: { + status_code: response?.status, + body: response?.data, + }, + }, + } + ); + + throw this.getAgentlessAgentError(action, userMessage, traceId); + } + private convertCauseErrorsToString = (error: AxiosError) => { if (error.cause instanceof AggregateError) { return error.cause.errors.map((e: Error) => e.message); @@ -289,32 +395,122 @@ class AgentlessAgentService { return error.cause; }; - private async getFleetUrlAndTokenForAgentlessAgent( - esClient: ElasticsearchClient, - policyId: string, - soClient: SavedObjectsClientContract - ) { - const { items: enrollmentApiKeys } = await listEnrollmentApiKeys(esClient, { - perPage: SO_SEARCH_LIMIT, - showInactive: true, - kuery: `policy_id:"${policyId}"`, - }); - - const { items: fleetHosts } = await listFleetServerHosts(soClient); - // Tech Debt: change this when we add the internal fleet server config to use the internal fleet server host - // https://github.com/elastic/security-team/issues/9695 - const defaultFleetHost = - fleetHosts.length === 1 ? fleetHosts[0] : fleetHosts.find((host) => host.is_default); + private getAgentlessAgentError(action: string, userMessage: string, traceId: string | undefined) { + return action === 'create' + ? new AgentlessAgentCreateError(this.withRequestIdMessage(userMessage, traceId)) + : new AgentlessAgentDeleteError(this.withRequestIdMessage(userMessage, traceId)); + } - if (!defaultFleetHost) { - throw new AgentlessAgentCreateError('missing Fleet server host'); - } - if (!enrollmentApiKeys.length) { - throw new AgentlessAgentCreateError('missing Fleet enrollment token'); - } - const fleetToken = enrollmentApiKeys[0].api_key; - const fleetUrl = defaultFleetHost?.host_urls[0]; - return { fleetUrl, fleetToken }; + private getErrorHandlingMessages(agentlessPolicyId: string) { + return { + 400: { + create: { + log: '[Agentless API] Creating the agentless agent failed with a status 400, bad request for agentless policy.', + message: + 'the Agentless API could not create the agentless agent. Please delete the agentless policy and try again or contact your administrator.', + }, + delete: { + log: '[Agentless API] Deleting the agentless deployment failed with a status 400, bad request for agentless policy', + message: + 'the Agentless API could not create the agentless agent. Please delete the agentless policy try again or contact your administrator.', + }, + }, + 401: { + create: { + log: '[Agentless API] Creating the agentless agent failed with a status 401 unauthorized for agentless policy.', + message: + 'the Agentless API could not create the agentless agent because an unauthorized request was sent. Please delete the agentless policy and try again or contact your administrator.', + }, + delete: { + log: '[Agentless API] Deleting the agentless deployment failed with a status 401 unauthorized for agentless policy. Check the Kibana Agentless API tls configuration', + message: + 'the Agentless API could not delete the agentless deployment because an unauthorized request was sent. Please try again or contact your administrator.', + }, + }, + 403: { + create: { + log: '[Agentless API] Creating the agentless agent failed with a status 403 forbidden for agentless policy. Check the Kibana Agentless API configuration and endpoints.', + message: + 'the Agentless API could not create the agentless agent because a forbidden request was sent. Please delete the agentless policy and try again or contact your administrator.', + }, + delete: { + log: '[Agentless API] Deleting the agentless deployment failed with a status 403 forbidden for agentless policy. Check the Kibana Agentless API configuration and endpoints.', + message: + 'the Agentless API could not delete the agentless deployment because a forbidden request was sent. Please try again or contact your administrator.', + }, + }, + 404: { + // this is likely to happen when creating agentless agents, but covering it in case + create: { + log: '[Agentless API] Creating the agentless agent failed with a status 404 not found.', + message: + 'the Agentless API could not create the agentless agent because it returned a 404 error not found.', + }, + delete: { + log: '[Agentless API] Deleting the agentless deployment failed with a status 404 not found', + message: `the Agentless API could not delete the agentless deployment ${agentlessPolicyId} because it could not be found.`, + }, + }, + 408: { + create: { + log: '[Agentless API] Creating the agentless agent failed with a status 408, the request timed out', + message: + 'the Agentless API request timed out waiting for the agentless agent status to respond, please wait a few minutes for the agent to enroll with fleet. If agent fails to enroll with Fleet please delete the agentless policy try again or contact your administrator.', + }, + delete: { + log: '[Agentless API] Deleting the agentless deployment failed with a status 408, the request timed out', + message: `the Agentless API could not delete the agentless deployment ${agentlessPolicyId} because the request timed out, please wait a few minutes for the agentless agent deployment to be removed. If it continues to persist please try again or contact your administrator.`, + }, + }, + 429: { + create: { + log: '[Agentless API] Creating the agentless agent failed with a status 429 for agentless policy, agentless agent limit has been reached for this deployment or project.', + message: + 'the Agentless API could not create the agentless agent, you have reached the limit of agentless agents provisioned for this deployment or project. Consider removing some agentless agents and try again or use agent-based agents for this integration.', + }, + // this is likely to happen when deleting agentless agents, but covering it in case + delete: { + log: '[Agentless API] Deleting the agentless deployment failed with a status 429 for agentless policy, agentless agent limit has been reached for this deployment or project.', + message: + 'the Agentless API could not delete the agentless deployment, you have reached the limit of agentless agents provisioned for this deployment or project. Consider removing some agentless agents and try again or use agent-based agents for this integration.', + }, + }, + 500: { + create: { + log: '[Agentless API] Creating the agentless agent failed with a status 500 internal service error.', + message: + 'the Agentless API could not create the agentless agent because it returned a 500 internal error. Please delete the agentless policy and try again later or contact your administrator.', + }, + delete: { + log: '[Agentless API] Deleting the agentless deployment failed with a status 500 internal service error.', + message: + 'the Agentless API could not delete the agentless deployment because it returned a 500 internal error. Please try again later or contact your administrator.', + }, + }, + unhandled_response: { + create: { + log: '[Agentless API] Creating agentless agent failed because the Agentless API responded with an unhandled status code that falls out of the range of 2xx:', + message: + 'the Agentless API could not create the agentless agent due to an unexpected error. Please delete the agentless policy and try again later or contact your administrator.', + }, + delete: { + log: '[Agentless API] Deleting agentless deployment failed because the Agentless API responded with an unhandled status code that falls out of the range of 2xx:', + message: `the Agentless API could not delete the agentless deployment ${agentlessPolicyId}. Please try again later or contact your administrator.`, + }, + }, + request_error: { + create: { + log: '[Agentless API] Creating agentless agent failed with a request error:', + message: + 'the Agentless API could not create the agentless agent due to a request error. Please delete the agentless policy and try again later or contact your administrator.', + }, + delete: { + log: '[Agentless API] Deleting agentless deployment failed with a request error:', + message: + 'the Agentless API could not delete the agentless deployment due to a request error. Please try again later or contact your administrator.', + }, + }, + }; } } diff --git a/x-pack/plugins/fleet/server/services/utils/agentless.ts b/x-pack/plugins/fleet/server/services/utils/agentless.ts index c43f10db16b46..0f5d4e9d1de85 100644 --- a/x-pack/plugins/fleet/server/services/utils/agentless.ts +++ b/x-pack/plugins/fleet/server/services/utils/agentless.ts @@ -10,7 +10,7 @@ import type { FleetConfigType } from '../../config'; export { isOnlyAgentlessIntegration } from '../../../common/services/agentless_policy_helper'; export const isAgentlessApiEnabled = () => { - const cloudSetup = appContextService.getCloud && appContextService.getCloud(); + const cloudSetup = appContextService.getCloud(); const isHosted = cloudSetup?.isCloudEnabled || cloudSetup?.isServerlessEnabled; return Boolean(isHosted && appContextService.getConfig()?.agentless?.enabled); }; From a6dc47ddeb15d6c7b91e1abaaf83fba3eee2fef2 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Wed, 23 Oct 2024 10:06:47 -0600 Subject: [PATCH 072/146] [Security Assistant] Fix Security Assistant settings link behavior and adjust initial settings tab (#197323) --- .../conversation_settings/translations.ts | 2 +- .../settings/assistant_settings_management.tsx | 10 +++++----- .../settings_context_menu.tsx | 17 +++++++++++++++++ .../stack_management/management_settings.tsx | 4 ++-- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/translations.ts b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/translations.ts index 55852fc2a1bad..529631574e6f7 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/translations.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/conversations/conversation_settings/translations.ts @@ -59,7 +59,7 @@ export const SETTINGS_PROMPT_HELP_TEXT_TITLE = i18n.translate( export const STREAMING_TITLE = i18n.translate( 'xpack.elasticAssistant.assistant.conversations.settings.streamingTitle', { - defaultMessage: 'STREAMING', + defaultMessage: 'Streaming', } ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings_management.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings_management.tsx index 12b26da336e72..c0dc904695257 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings_management.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings_management.tsx @@ -37,7 +37,7 @@ interface Props { dataViews: DataViewsContract; selectedConversation: Conversation; onTabChange?: (tabId: string) => void; - currentTab?: SettingsTabs; + currentTab: SettingsTabs; } /** @@ -65,14 +65,14 @@ export const AssistantSettingsManagement: React.FC = React.memo( const tabsConfig = useMemo( () => [ - { - id: CONNECTORS_TAB, - label: i18n.CONNECTORS_MENU_ITEM, - }, { id: CONVERSATIONS_TAB, label: i18n.CONVERSATIONS_MENU_ITEM, }, + { + id: CONNECTORS_TAB, + label: i18n.CONNECTORS_MENU_ITEM, + }, { id: SYSTEM_PROMPTS_TAB, label: i18n.SYSTEM_PROMPTS_MENU_ITEM, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/settings_context_menu/settings_context_menu.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/settings_context_menu/settings_context_menu.tsx index 3a19a68643006..eddf785256d82 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/settings_context_menu/settings_context_menu.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/settings_context_menu/settings_context_menu.tsx @@ -12,6 +12,7 @@ import { EuiContextMenuPanel, EuiContextMenuItem, EuiConfirmModal, + EuiIcon, EuiNotificationBadge, EuiPopover, EuiButtonIcon, @@ -68,6 +69,7 @@ export const SettingsContextMenu: React.FC = React.memo( () => navigateToApp('management', { path: 'kibana/securityAiAssistantManagement', + openInNewTab: true, }), [navigateToApp] ); @@ -81,6 +83,7 @@ export const SettingsContextMenu: React.FC = React.memo( () => navigateToApp('management', { path: `kibana/securityAiAssistantManagement?tab=${KNOWLEDGE_BASE_TAB}`, + openInNewTab: true, }), [navigateToApp] ); @@ -101,6 +104,13 @@ export const SettingsContextMenu: React.FC = React.memo( data-test-subj={'ai-assistant-settings'} > {i18n.AI_ASSISTANT_SETTINGS} + , = React.memo( data-test-subj={'knowledge-base'} > {i18n.KNOWLEDGE_BASE} + , { const [searchParams] = useSearchParams(); const currentTab = useMemo( - () => (searchParams.get('tab') as SettingsTabs) ?? CONNECTORS_TAB, + () => (searchParams.get('tab') as SettingsTabs) ?? CONVERSATIONS_TAB, [searchParams] ); From a2a43e7a3a964cdcc9ca38cf90ea429e2a98edd8 Mon Sep 17 00:00:00 2001 From: Andrew Macri Date: Wed, 23 Oct 2024 10:13:19 -0600 Subject: [PATCH 073/146] [Security Solution] [Security assistant] Fixes errors when creating conversations with special characters in the title (#197319) ### [Security Solution] [Security assistant] Fixes errors when creating conversations with special characters in the title This PR fixes an [issue](https://github.com/elastic/security-team/issues/10284) in the security assistant where attempting to create conversations with special characters in the title, i.e. a `:`, resulted in an `Error creating conversation with title...` toaster. ### Desk testing To reproduce, simulate generation of a title with special characters: 1) Edit `x-pack/plugins/security_solution/public/attack_discovery/attack_discovery_panel/view_in_ai_assistant/use_view_in_ai_assistant.ts` change the following line: from ```ts const lastFive = attackDiscovery.id ? ` - ${attackDiscovery.id.slice(-5)}` : ''; ``` to ```ts const lastFive = attackDiscovery.id ? ` - test: "${attackDiscovery.id.slice(-5)}"` : ''; ``` 2) Navigate to Security > Attack discovery 3) Click the `View in AI Assistant` link for any attack discovery **Expected result** - The assistant flyout opens without errors **Actual result** - The assistant flyout opens with a toaster error like the following example: ``` Error creating conversation with title Sophisticated Multi-Stage Attack Detected - test: "7a882" ``` --- .../user_conversations/create_route.test.ts | 46 +++++++++++++++++++ .../routes/user_conversations/create_route.ts | 7 ++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/create_route.test.ts b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/create_route.test.ts index 0659b8d43a38f..085cf9388d45a 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/create_route.test.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/create_route.test.ts @@ -100,6 +100,52 @@ describe('Create conversation route', () => { expect(result.badRequest).toHaveBeenCalled(); }); + + test('escapes colons when querying for existing titles', async () => { + const request = requestMock.create({ + method: 'post', + path: ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL, + body: { + ...getCreateConversationSchemaMock(), + title: 'test: Malware infection: with credential theft attempt - 2875e', // <-- contains colons + }, + }); + + await server.inject(request, requestContextMock.convertContext(context)); + + expect( + clients.elasticAssistant.getAIAssistantConversationsDataClient.findDocuments + ).toHaveBeenCalledWith({ + fields: ['title'], + filter: + 'users:{ name: "my_username" } AND title:test\\: Malware infection\\: with credential theft attempt - 2875e', + page: 1, + perPage: 100, + }); + }); + + test('escapes quotes when querying for existing titles', async () => { + const request = requestMock.create({ + method: 'post', + path: ELASTIC_AI_ASSISTANT_CONVERSATIONS_URL, + body: { + ...getCreateConversationSchemaMock(), + title: '"Malware infection with credential theft attempt - 2875e"', // <-- contains quotes + }, + }); + + await server.inject(request, requestContextMock.convertContext(context)); + + expect( + clients.elasticAssistant.getAIAssistantConversationsDataClient.findDocuments + ).toHaveBeenCalledWith({ + fields: ['title'], + filter: + 'users:{ name: "my_username" } AND title:\\"Malware infection with credential theft attempt - 2875e\\"', + page: 1, + perPage: 100, + }); + }); }); describe('conversation containing messages', () => { const getMessage = (role: string = 'user') => ({ diff --git a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/create_route.ts b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/create_route.ts index f997121f95aa8..a0dcbe04ba1d1 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/user_conversations/create_route.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/user_conversations/create_route.ts @@ -14,6 +14,8 @@ import { API_VERSIONS, } from '@kbn/elastic-assistant-common'; import { buildRouteValidationWithZod } from '@kbn/elastic-assistant-common/impl/schemas/common'; +import { escapeKuery } from '@kbn/es-query'; + import { ElasticAssistantPluginRouter } from '../../types'; import { buildResponse } from '../utils'; import { performChecks } from '../helpers'; @@ -58,10 +60,13 @@ export const createConversationRoute = (router: ElasticAssistantPluginRouter): v const userFilter = currentUser?.username ? `name: "${currentUser?.username}"` : `id: "${currentUser?.profile_uid}"`; + + const escapedTitle = escapeKuery(request.body.title); + const result = await dataClient?.findDocuments({ perPage: 100, page: 1, - filter: `users:{ ${userFilter} } AND title:${request.body.title}`, + filter: `users:{ ${userFilter} } AND title:${escapedTitle}`, fields: ['title'], }); if (result?.data != null && result.total > 0) { From d6465c749a554b485d390df4ae8f9628f4aa3661 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Wed, 23 Oct 2024 18:34:53 +0200 Subject: [PATCH 074/146] [Synthetics] Fixes embedded components styles !! (#197188) ## Summary Fixes https://github.com/elastic/kibana/issues/190853 Fixes embedded components styles !! Hide multiple titles ### After image ### Before image --------- Co-authored-by: Kevin Delemme --- .../common/monitor_configuration.tsx | 95 ++++++++----------- .../common/monitor_filters_form.tsx | 14 +-- .../common/monitors_open_configuration.tsx | 3 + .../public/apps/embeddables/common/utils.ts | 22 +++++ .../monitors_embeddable_factory.tsx | 6 ++ .../monitors_grid_component.tsx | 10 +- .../stats_overview_component.tsx | 32 +++++-- .../stats_overview_embeddable_factory.tsx | 3 + .../synthetics_embeddable_context.tsx | 10 +- .../create_monitors_overview_panel_action.tsx | 6 ++ .../create_stats_overview_panel_action.tsx | 3 + .../components/embeddable_panel_wrapper.tsx | 67 ++++++++----- .../grid_by_group/grid_items_by_group.tsx | 29 ++++-- .../overview/overview/overview_status.tsx | 22 +++-- .../contexts/synthetics_shared_context.tsx | 3 + .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 18 files changed, 200 insertions(+), 128 deletions(-) create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/common/utils.ts diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/common/monitor_configuration.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/common/monitor_configuration.tsx index 24995e898b3a1..4092f5cd40478 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/common/monitor_configuration.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/common/monitor_configuration.tsx @@ -18,7 +18,6 @@ import { EuiTitle, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { i18n } from '@kbn/i18n'; import { FormProvider, useForm } from 'react-hook-form'; import { MonitorFilters } from '../monitors_overview/types'; import { MonitorFiltersForm } from './monitor_filters_form'; @@ -29,12 +28,14 @@ interface MonitorConfigurationProps { }; onCreate: (props: { filters: MonitorFilters }) => void; onCancel: () => void; + title: string; } export function MonitorConfiguration({ initialInput, onCreate, onCancel, + title, }: MonitorConfigurationProps) { const methods = useForm({ defaultValues: { @@ -57,64 +58,50 @@ export function MonitorConfiguration({ }; return ( - + - + +

{title}

+
+
+ + - -

- {i18n.translate( - 'xpack.synthetics.overviewEmbeddable.config.sloSelector.headerTitle', - { - defaultMessage: 'Overview configuration', - } - )} -

-
+ + + + + + +
- +
+ + + + + - <> - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +
); } diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/common/monitor_filters_form.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/common/monitor_filters_form.tsx index 80d2f3aa072cd..a53d275a12428 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/common/monitor_filters_form.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/common/monitor_filters_form.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { EuiFlexGroup, EuiIconTip } from '@elastic/eui'; +import { EuiFlexGroup } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { FieldSelector } from './field_selector'; @@ -23,18 +23,6 @@ export function MonitorFiltersForm() { )} name="monitorIds" dataTestSubj="syntheticsAvailabilityMonitorSelector" - tooltip={ - - } /> { flyoutSession.close(); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/common/utils.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/common/utils.ts new file mode 100644 index 0000000000000..0a5e104a74270 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/common/utils.ts @@ -0,0 +1,22 @@ +/* + * 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 { MonitorFilters } from '../monitors_overview/types'; + +export const areFiltersEmpty = (filters: MonitorFilters) => { + if (!filters) { + return true; + } + + return ( + !filters.monitorIds?.length && + !filters.projects?.length && + !filters.tags?.length && + !filters.monitorTypes?.length && + !filters.locations?.length + ); +}; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/monitors_overview/monitors_embeddable_factory.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/monitors_overview/monitors_embeddable_factory.tsx index e23de3cc67a14..3908063e68116 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/monitors_overview/monitors_embeddable_factory.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/monitors_overview/monitors_embeddable_factory.tsx @@ -87,6 +87,12 @@ export const getMonitorsEmbeddableFactory = ( initialState: { filters: filters$.getValue(), }, + title: i18n.translate( + 'xpack.synthetics.editSyntheticsOverviewEmbeddableTitle.overview.title', + { + defaultMessage: 'Create monitors overview', + } + ), }); filters$.next(result.filters); } catch (e) { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/monitors_overview/monitors_grid_component.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/monitors_overview/monitors_grid_component.tsx index c3801bb98ca9a..c6465b9d56408 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/monitors_overview/monitors_grid_component.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/monitors_overview/monitors_grid_component.tsx @@ -7,8 +7,8 @@ import React, { useEffect, useRef } from 'react'; import { Subject } from 'rxjs'; -import { i18n } from '@kbn/i18n'; import { useDispatch } from 'react-redux'; +import { areFiltersEmpty } from '../common/utils'; import { getOverviewStore } from './redux_store'; import { ShowSelectedFilters } from '../common/show_selected_filters'; import { setOverviewPageStateAction } from '../../synthetics/state'; @@ -26,13 +26,11 @@ export const StatusGridComponent = ({ }) => { const overviewStore = useRef(getOverviewStore()); + const hasFilters = !areFiltersEmpty(filters); + return ( } + titleAppend={hasFilters ? : null} > diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/stats_overview/stats_overview_component.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/stats_overview/stats_overview_component.tsx index 579596615ae72..a7c1cee656795 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/stats_overview/stats_overview_component.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/stats_overview/stats_overview_component.tsx @@ -8,6 +8,8 @@ import React, { useEffect, useRef } from 'react'; import { Subject } from 'rxjs'; import { useDispatch } from 'react-redux'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { areFiltersEmpty } from '../common/utils'; import { getStatsOverviewStore } from './redux_store'; import { ShowSelectedFilters } from '../common/show_selected_filters'; import { MonitorFilters } from '../monitors_overview/types'; @@ -26,7 +28,16 @@ export const StatsOverviewComponent = ({ return ( - + + + + + ); }; @@ -36,14 +47,21 @@ const WithFiltersComponent = ({ filters }: { filters: MonitorFilters }) => { useEffect(() => { dispatch( setOverviewPageStateAction({ - tags: filters.tags.map((tag) => tag.value), - locations: filters.locations.map((location) => location.value), - monitorTypes: filters.monitorTypes.map((monitorType) => monitorType.value), - monitorQueryIds: filters.monitorIds.map((monitorId) => monitorId.value), - projects: filters.projects.map((project) => project.value), + tags: filters.tags?.map((tag) => tag.value), + locations: filters.locations?.map((location) => location.value), + monitorTypes: filters.monitorTypes?.map((monitorType) => monitorType.value), + monitorQueryIds: filters.monitorIds?.map((monitorId) => monitorId.value), + projects: filters.projects?.map((project) => project.value), }) ); }, [dispatch, filters]); - return } />; + const hasFilters = !areFiltersEmpty(filters); + + return ( + : null} + hideTitle={true} + /> + ); }; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/stats_overview/stats_overview_embeddable_factory.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/stats_overview/stats_overview_embeddable_factory.tsx index 07f1e72fa1e98..83b37f080d422 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/stats_overview/stats_overview_embeddable_factory.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/stats_overview/stats_overview_embeddable_factory.tsx @@ -80,6 +80,9 @@ export const getStatsOverviewEmbeddableFactory = ( initialState: { filters: filters$.getValue(), }, + title: i18n.translate('xpack.synthetics.editSloOverviewEmbeddableTitle.title', { + defaultMessage: 'Create monitor stats', + }), }); filters$.next(result.filters); } catch (e) { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/synthetics_embeddable_context.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/synthetics_embeddable_context.tsx index 5e7b912d43eba..53e242f77c23c 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/synthetics_embeddable_context.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/synthetics_embeddable_context.tsx @@ -7,7 +7,6 @@ import React from 'react'; import { createBrowserHistory } from 'history'; -import { EuiPanel } from '@elastic/eui'; import { Router } from '@kbn/shared-ux-router'; import { Subject } from 'rxjs'; import { Store } from 'redux'; @@ -29,14 +28,7 @@ export const SyntheticsEmbeddableContext: React.FC< - - {children} - + {children} diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/ui_actions/create_monitors_overview_panel_action.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/ui_actions/create_monitors_overview_panel_action.tsx index c3f935add49c4..1e6eb30c7cc02 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/ui_actions/create_monitors_overview_panel_action.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/ui_actions/create_monitors_overview_panel_action.tsx @@ -38,6 +38,12 @@ export function createMonitorsOverviewPanelAction( const initialState = await openMonitorConfiguration({ coreStart, pluginStart, + title: i18n.translate( + 'xpack.synthetics.editSyntheticsOverviewEmbeddableTitle.overview.title', + { + defaultMessage: 'Create monitors overview', + } + ), }); try { embeddable.addNewPanel({ diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/ui_actions/create_stats_overview_panel_action.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/ui_actions/create_stats_overview_panel_action.tsx index 9f88e38c3640c..f3311bec302f7 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/ui_actions/create_stats_overview_panel_action.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/embeddables/ui_actions/create_stats_overview_panel_action.tsx @@ -39,6 +39,9 @@ export function createStatusOverviewPanelAction( const initialState = await openMonitorConfiguration({ coreStart, pluginStart, + title: i18n.translate('xpack.synthetics.editSyntheticsOverviewEmbeddableTitle.title', { + defaultMessage: 'Create monitor stats', + }), }); embeddable.addNewPanel({ panelType: SYNTHETICS_STATS_OVERVIEW_EMBEDDABLE, diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/embeddable_panel_wrapper.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/embeddable_panel_wrapper.tsx index 1d3328197fb55..168984361795e 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/embeddable_panel_wrapper.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/embeddable_panel_wrapper.tsx @@ -6,37 +6,58 @@ */ import React, { FC } from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiProgress, EuiTitle } from '@elastic/eui'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiPanel, + EuiProgress, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; import { AddToDashboard } from './add_to_dashboard'; import { SYNTHETICS_STATS_OVERVIEW_EMBEDDABLE } from '../../../../embeddables/constants'; -export const EmbeddablePanelWrapper: FC< - React.PropsWithChildren<{ - title: string; - loading?: boolean; - titleAppend?: React.ReactNode; - }> -> = ({ children, title, loading, titleAppend }) => { +interface Props { + title?: string; + loading?: boolean; + hideTitle?: boolean; + titleAppend?: React.ReactNode; +} + +export const EmbeddablePanelWrapper: FC> = ({ + children, + title, + loading, + titleAppend, + hideTitle, +}) => { const isSyntheticsApp = window.location.pathname.includes('/app/synthetics'); + const noTitle = !title && !titleAppend; return ( <> - + + {!noTitle && ( + <> + + + {(!hideTitle || !title) && ( + +

{title}

+
+ )} +
+ {isSyntheticsApp && ( + + + + )} + {titleAppend && {titleAppend}} +
+ + + )} {loading && } - - - -

{title}

-
-
- {isSyntheticsApp && ( - - - - )} - {titleAppend && {titleAppend}} -
- {children}
diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/grid_by_group/grid_items_by_group.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/grid_by_group/grid_items_by_group.tsx index 1951e0744c9e8..a2e9226e26162 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/grid_by_group/grid_items_by_group.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/grid_by_group/grid_items_by_group.tsx @@ -10,6 +10,7 @@ import React, { useRef, useState, FC, PropsWithChildren } from 'react'; import { useSelector } from 'react-redux'; import { get, invert, orderBy } from 'lodash'; import styled from 'styled-components'; +import { i18n } from '@kbn/i18n'; import { OverviewLoader } from '../overview_loader'; import { getSyntheticsFilterDisplayValues, @@ -60,18 +61,25 @@ export const GridItemsByGroup = ({ items: monitorTypes, values: getSyntheticsFilterDisplayValues(monitorTypes, 'monitorTypes', allLocations), otherValues: { - label: 'Invalid monitor type', + label: i18n.translate('xpack.synthetics.monitorsPage.overview.gridItemsByGroup.noType', { + defaultMessage: 'Invalid monitor type', + }), items: allConfigs?.filter((monitor) => !get(monitor, ConfigKey.MONITOR_TYPE)), }, }; break; case 'locationId': selectedGroup = { - key: 'location.label', + key: 'locationLabel', items: locations, values: getSyntheticsFilterDisplayValues(locations, 'locations', allLocations), otherValues: { - label: 'Without any location', + label: i18n.translate( + 'xpack.synthetics.monitorsPage.overview.gridItemsByGroup.noLocations', + { + defaultMessage: 'Without any location', + } + ), items: allConfigs?.filter((monitor) => !get(monitor, 'location')), }, }; @@ -82,7 +90,9 @@ export const GridItemsByGroup = ({ items: tags, values: getSyntheticsFilterDisplayValues(tags, 'tags', allLocations), otherValues: { - label: 'Without any tags', + label: i18n.translate('xpack.synthetics.monitorsPage.overview.gridItemsByGroup.noTags', { + defaultMessage: 'Without any tags', + }), items: allConfigs?.filter((monitor) => get(monitor, 'tags', []).length === 0), }, }; @@ -93,7 +103,12 @@ export const GridItemsByGroup = ({ items: projects, values: getSyntheticsFilterDisplayValues(projects, 'projects', allLocations), otherValues: { - label: 'UI Monitors', + label: i18n.translate( + 'xpack.synthetics.monitorsPage.overview.gridItemsByGroup.uiMonitors', + { + defaultMessage: 'UI Monitors', + } + ), items: allConfigs?.filter((monitor) => !Boolean(monitor.projectId)), }, }; @@ -138,11 +153,11 @@ export const GridItemsByGroup = ({ ); })} - {selectedGroup.otherValues.items?.length && ( + {(selectedGroup.otherValues.items ?? []).length > 0 && ( - + {children} diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index fc240ba84ad29..6e54b99766bd1 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -44455,7 +44455,6 @@ "xpack.synthetics.overview.status.filters.legend": "Statut du moniteur", "xpack.synthetics.overview.status.filters.pending": "En attente", "xpack.synthetics.overview.status.filters.up": "Opérationnel", - "xpack.synthetics.overview.status.headingText": "Statut actuel", "xpack.synthetics.overview.status.pending.description": "En attente", "xpack.synthetics.overview.status.up.description": "Opérationnel", "xpack.synthetics.overview.SyntheticsHeading": "Moniteurs", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 4d39022965da0..a4ce80c70af56 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -44195,7 +44195,6 @@ "xpack.synthetics.overview.status.filters.legend": "監視ステータス", "xpack.synthetics.overview.status.filters.pending": "保留中", "xpack.synthetics.overview.status.filters.up": "アップ", - "xpack.synthetics.overview.status.headingText": "現在のステータス", "xpack.synthetics.overview.status.pending.description": "保留中", "xpack.synthetics.overview.status.up.description": "アップ", "xpack.synthetics.overview.SyntheticsHeading": "監視", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 27ee1dd00a563..85e49620aac7f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -44245,7 +44245,6 @@ "xpack.synthetics.overview.status.filters.legend": "监测状态", "xpack.synthetics.overview.status.filters.pending": "待处理", "xpack.synthetics.overview.status.filters.up": "运行", - "xpack.synthetics.overview.status.headingText": "当前状态", "xpack.synthetics.overview.status.pending.description": "待处理", "xpack.synthetics.overview.status.up.description": "运行", "xpack.synthetics.overview.SyntheticsHeading": "监测", From 48fe299d5bcd230d63ce2dd8e89c62307dd0ee82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Zaffarano?= Date: Wed, 23 Oct 2024 14:18:05 -0300 Subject: [PATCH 075/146] Add filters option to ftr_helper api (#196886) --- .../analytics_ftr_helpers/server/plugin.ts | 23 ++++++++++++++---- test/analytics/services/kibana_ebt.ts | 12 +++++++--- .../tests/analytics_from_the_server.ts | 24 +++++++++++++++++++ 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/test/analytics/plugins/analytics_ftr_helpers/server/plugin.ts b/test/analytics/plugins/analytics_ftr_helpers/server/plugin.ts index d4bf140aa4e62..f599f5651374b 100644 --- a/test/analytics/plugins/analytics_ftr_helpers/server/plugin.ts +++ b/test/analytics/plugins/analytics_ftr_helpers/server/plugin.ts @@ -14,7 +14,7 @@ import { fetchEvents } from '../common/fetch_events'; import { CustomShipper } from './custom_shipper'; export class AnalyticsFTRHelpers implements Plugin { - public setup({ analytics, http }: CoreSetup, deps: {}) { + public setup({ analytics, http }: CoreSetup, _deps: {}) { const { optIn, registerShipper } = analytics; const events$ = new ReplaySubject(); @@ -31,7 +31,7 @@ export class AnalyticsFTRHelpers implements Plugin { }), }, }, - (context, req, res) => { + (_context, req, res) => { const { consent } = req.query; optIn({ global: { enabled: consent } }); @@ -67,7 +67,7 @@ export class AnalyticsFTRHelpers implements Plugin { }), }, }, - async (context, req, res) => { + async (_context, req, res) => { const { takeNumberOfEvents, ...options } = req.query; const events = await fetchEvents(events$, takeNumberOfEvents, options); return res.ok({ body: events }); @@ -82,10 +82,25 @@ export class AnalyticsFTRHelpers implements Plugin { eventTypes: schema.arrayOf(schema.string()), withTimeoutMs: schema.number(), fromTimestamp: schema.maybe(schema.string()), + filters: schema.maybe( + schema.recordOf( + schema.string(), + schema.recordOf( + schema.oneOf([ + schema.literal('eq'), + schema.literal('gte'), + schema.literal('gt'), + schema.literal('lte'), + schema.literal('lt'), + ]), + schema.any() + ) + ) + ), }), }, }, - async (context, req, res) => { + async (_context, req, res) => { const events = await fetchEvents(events$, Number.MAX_SAFE_INTEGER, req.query); return res.ok({ body: { count: events.length } }); } diff --git a/test/analytics/services/kibana_ebt.ts b/test/analytics/services/kibana_ebt.ts index f2b635dcbdbbe..925bdece221d3 100644 --- a/test/analytics/services/kibana_ebt.ts +++ b/test/analytics/services/kibana_ebt.ts @@ -28,7 +28,7 @@ export function KibanaEBTServerProvider({ getService }: FtrProviderContext): EBT setOptIn, getEvents: async ( takeNumberOfEvents, - { eventTypes = [], withTimeoutMs, fromTimestamp } = {} + { eventTypes = [], withTimeoutMs, fromTimestamp, filters } = {} ) => { await setOptIn(true); const resp = await supertest @@ -38,6 +38,7 @@ export function KibanaEBTServerProvider({ getService }: FtrProviderContext): EBT eventTypes: JSON.stringify(eventTypes), withTimeoutMs, fromTimestamp, + filters: JSON.stringify(filters), }) .set('kbn-xsrf', 'xxx') .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') @@ -45,11 +46,16 @@ export function KibanaEBTServerProvider({ getService }: FtrProviderContext): EBT return resp.body; }, - getEventCount: async ({ eventTypes = [], withTimeoutMs, fromTimestamp }) => { + getEventCount: async ({ eventTypes = [], withTimeoutMs, fromTimestamp, filters }) => { await setOptIn(true); const resp = await supertest .get(`/internal/analytics_ftr_helpers/count_events`) - .query({ eventTypes: JSON.stringify(eventTypes), withTimeoutMs, fromTimestamp }) + .query({ + eventTypes: JSON.stringify(eventTypes), + withTimeoutMs, + fromTimestamp, + filters: JSON.stringify(filters), + }) .set('kbn-xsrf', 'xxx') .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .expect(200); diff --git a/test/analytics/tests/analytics_from_the_server.ts b/test/analytics/tests/analytics_from_the_server.ts index af15d083419a3..bb1df0735107e 100644 --- a/test/analytics/tests/analytics_from_the_server.ts +++ b/test/analytics/tests/analytics_from_the_server.ts @@ -203,6 +203,30 @@ export default function ({ getService }: FtrProviderContext) { }); expect(eventCount).to.be(1); }); + it('should return 0 events when filtering by invalid properties', async () => { + const eventCount = await ebtServerHelper.getEventCount({ + withTimeoutMs: 500, + eventTypes: ['test-plugin-lifecycle'], + filters: { + 'properties.plugin': { + eq: 'analyticsPluginB', + }, + }, + }); + expect(eventCount).to.be(0); + }); + it('should return 1 event when filtering by valid properties', async () => { + const eventCount = await ebtServerHelper.getEventCount({ + withTimeoutMs: 500, + eventTypes: ['test-plugin-lifecycle'], + filters: { + 'properties.step': { + eq: 'start', + }, + }, + }); + expect(eventCount).to.be(1); + }); }); }); }); From d08dec4b75a0c4112e5275621d654b7751566f03 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 24 Oct 2024 04:39:35 +1100 Subject: [PATCH 076/146] skip failing test suite (#192564) --- test/functional/apps/dashboard/group4/dashboard_listing.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/functional/apps/dashboard/group4/dashboard_listing.ts b/test/functional/apps/dashboard/group4/dashboard_listing.ts index e45016df5cfc2..14eb5e3ae1f45 100644 --- a/test/functional/apps/dashboard/group4/dashboard_listing.ts +++ b/test/functional/apps/dashboard/group4/dashboard_listing.ts @@ -18,7 +18,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const dashboardAddPanel = getService('dashboardAddPanel'); const testSubjects = getService('testSubjects'); - describe('dashboard listing page', function describeIndexTests() { + // Failing: See https://github.com/elastic/kibana/issues/192564 + describe.skip('dashboard listing page', function describeIndexTests() { const dashboardName = 'Dashboard Listing Test'; before(async function () { From 592c0efab05357168ff1cf96d4e34ed7228d0ef0 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 23 Oct 2024 18:44:28 +0100 Subject: [PATCH 077/146] skip flaky suite (#196319) --- .../trial_license_complete_tier/init_and_status_apis.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts index b793ec1cb1306..d9dd985ffc3a5 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts @@ -580,7 +580,8 @@ export default ({ getService }: FtrProviderContext) => { }); }); - describe('status api', () => { + // FLAKY: https://github.com/elastic/kibana/issues/196319 + describe.skip('status api', () => { it('should disable / enable risk engine', async () => { const status1 = await riskEngineRoutes.getStatus(); From f1e4d8fe3e2f4b1d6b08f46c7dc5b0ee30de8d77 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 23 Oct 2024 18:45:48 +0100 Subject: [PATCH 078/146] skip flaky suite (#196166) --- .../trial_license_complete_tier/init_and_status_apis.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts index d9dd985ffc3a5..9483343436018 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/init_and_status_apis.ts @@ -581,6 +581,7 @@ export default ({ getService }: FtrProviderContext) => { }); // FLAKY: https://github.com/elastic/kibana/issues/196319 + // FLAKY: https://github.com/elastic/kibana/issues/196166 describe.skip('status api', () => { it('should disable / enable risk engine', async () => { const status1 = await riskEngineRoutes.getStatus(); From 1b6c497101e1b46d97904538b97faa2e276fa31d Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Wed, 23 Oct 2024 19:05:41 +0100 Subject: [PATCH 079/146] [ML] AIOps: Fixes issue where some queries cause filters to not be applied (#196585) --- .../public/application/utils/search_utils.ts | 74 +++---------------- .../change_point_detection_context.tsx | 15 ++-- .../log_categorization_for_discover.tsx | 11 ++- .../log_categorization_for_embeddable.tsx | 11 ++- .../log_categorization_for_flyout.tsx | 10 ++- .../components/search_panel/search_panel.tsx | 10 +-- .../embeddable_chart_component_wrapper.tsx | 19 +++-- .../plugins/aiops/public/hooks/use_search.ts | 11 ++- 8 files changed, 65 insertions(+), 96 deletions(-) diff --git a/x-pack/plugins/aiops/public/application/utils/search_utils.ts b/x-pack/plugins/aiops/public/application/utils/search_utils.ts index 533303436fa92..442ce910dd828 100644 --- a/x-pack/plugins/aiops/public/application/utils/search_utils.ts +++ b/x-pack/plugins/aiops/public/application/utils/search_utils.ts @@ -13,23 +13,14 @@ import type { IUiSettingsClient } from '@kbn/core/public'; import { getEsQueryConfig, SearchSource } from '@kbn/data-plugin/common'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import type { FilterManager } from '@kbn/data-plugin/public'; -import { isQuery, mapAndFlattenFilters } from '@kbn/data-plugin/public'; -import type { Query, Filter, AggregateQuery } from '@kbn/es-query'; -import { - fromKueryExpression, - toElasticsearchQuery, - buildQueryFromFilters, - buildEsQuery, -} from '@kbn/es-query'; +import { mapAndFlattenFilters } from '@kbn/data-plugin/public'; +import type { Query, Filter } from '@kbn/es-query'; +import { buildEsQuery } from '@kbn/es-query'; import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { DataView } from '@kbn/data-views-plugin/public'; import type { SimpleSavedObject } from '@kbn/core/public'; import { isPopulatedObject } from '@kbn/ml-is-populated-object'; -import { - getDefaultDSLQuery, - type SearchQueryLanguage, - SEARCH_QUERY_LANGUAGE, -} from '@kbn/ml-query-utils'; +import { getDefaultDSLQuery, type SearchQueryLanguage } from '@kbn/ml-query-utils'; export type SavedSearchSavedObject = SimpleSavedObject; @@ -67,51 +58,6 @@ export function getQueryFromSavedSearchObject(savedSearch: SavedSearchSavedObjec return parsed; } -/** - * Create an Elasticsearch query that combines both lucene/kql query string and filters - * Should also form a valid query if only the query or filters is provided - */ -export function createMergedEsQuery( - query?: Query | AggregateQuery, - filters?: Filter[], - dataView?: DataView, - uiSettings?: IUiSettingsClient -) { - let combinedQuery: QueryDslQueryContainer = getDefaultDSLQuery(); - - // FIXME: Add support for AggregateQuery type #150091 - if (isQuery(query) && query.language === SEARCH_QUERY_LANGUAGE.KUERY) { - const ast = fromKueryExpression(query.query); - if (query.query !== '') { - combinedQuery = toElasticsearchQuery(ast, dataView); - } - if (combinedQuery.bool !== undefined) { - const filterQuery = buildQueryFromFilters(filters, dataView); - - if (!Array.isArray(combinedQuery.bool.filter)) { - combinedQuery.bool.filter = - combinedQuery.bool.filter === undefined ? [] : [combinedQuery.bool.filter]; - } - - if (!Array.isArray(combinedQuery.bool.must_not)) { - combinedQuery.bool.must_not = - combinedQuery.bool.must_not === undefined ? [] : [combinedQuery.bool.must_not]; - } - - combinedQuery.bool.filter = [...combinedQuery.bool.filter, ...filterQuery.filter]; - combinedQuery.bool.must_not = [...combinedQuery.bool.must_not, ...filterQuery.must_not]; - } - } else { - combinedQuery = buildEsQuery( - dataView, - query ? [query] : [], - filters ? filters : [], - uiSettings ? getEsQueryConfig(uiSettings) : undefined - ); - } - return combinedQuery; -} - function getSavedSearchSource(savedSearch: SavedSearch) { return savedSearch && 'searchSource' in savedSearch && @@ -174,11 +120,11 @@ export function getEsQueryFromSavedSearch({ if (!savedSearch && userQuery) { if (filterManager && userFilters) filterManager.addFilters(userFilters); - const combinedQuery = createMergedEsQuery( + const combinedQuery = buildEsQuery( + dataView, userQuery, Array.isArray(userFilters) ? userFilters : [], - dataView, - uiSettings + uiSettings ? getEsQueryConfig(uiSettings) : undefined ); return { @@ -199,11 +145,11 @@ export function getEsQueryFromSavedSearch({ if (filterManager) filterManager.setFilters(currentFilters); if (globalFilters) filterManager?.addFilters(globalFilters); - const combinedQuery = createMergedEsQuery( + const combinedQuery = buildEsQuery( + dataView, currentQuery, filterManager ? filterManager?.getFilters() : currentFilters, - dataView, - uiSettings + uiSettings ? getEsQueryConfig(uiSettings) : undefined ); return { diff --git a/x-pack/plugins/aiops/public/components/change_point_detection/change_point_detection_context.tsx b/x-pack/plugins/aiops/public/components/change_point_detection/change_point_detection_context.tsx index 45ef73c5dd7b5..4c429e2fd2976 100644 --- a/x-pack/plugins/aiops/public/components/change_point_detection/change_point_detection_context.tsx +++ b/x-pack/plugins/aiops/public/components/change_point_detection/change_point_detection_context.tsx @@ -9,7 +9,7 @@ import type { FC, PropsWithChildren } from 'react'; import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'; import { type DataViewField } from '@kbn/data-views-plugin/public'; import { startWith } from 'rxjs'; -import type { Filter, Query } from '@kbn/es-query'; +import { buildEsQuery, type Filter, type Query } from '@kbn/es-query'; import { usePageUrlState } from '@kbn/ml-url-state'; import { useTimefilter } from '@kbn/ml-date-picker'; import { ES_FIELD_TYPES } from '@kbn/field-types'; @@ -17,12 +17,10 @@ import { type QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types import type { TimeBuckets, TimeBucketsInterval } from '@kbn/ml-time-buckets'; import { useTimeBuckets } from '@kbn/ml-time-buckets'; import { createDefaultQuery } from '@kbn/aiops-common/create_default_query'; +import { getEsQueryConfig } from '@kbn/data-service'; import { useFilterQueryUpdates } from '../../hooks/use_filters_query'; import { type ChangePointType, DEFAULT_AGG_FUNCTION } from './constants'; -import { - createMergedEsQuery, - getEsQueryFromSavedSearch, -} from '../../application/utils/search_utils'; +import { getEsQueryFromSavedSearch } from '../../application/utils/search_utils'; import { useAiopsAppContext } from '../../hooks/use_aiops_app_context'; import { useDataSource } from '../../hooks/use_data_source'; @@ -261,7 +259,12 @@ export const ChangePointDetectionContextProvider: FC> ); const combinedQuery = useMemo(() => { - const mergedQuery = createMergedEsQuery(resultQuery, resultFilters, dataView, uiSettings); + const mergedQuery = buildEsQuery( + dataView, + resultQuery, + resultFilters, + uiSettings ? getEsQueryConfig(uiSettings) : undefined + ); const to = searchBounds.max?.valueOf(); const from = searchBounds.min?.valueOf(); const timeRange = to !== undefined && from !== undefined ? { from, to } : undefined; diff --git a/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_embeddable/log_categorization_for_discover.tsx b/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_embeddable/log_categorization_for_discover.tsx index db2135e94ab74..5bf415c5ccfc9 100644 --- a/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_embeddable/log_categorization_for_discover.tsx +++ b/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_embeddable/log_categorization_for_discover.tsx @@ -12,7 +12,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiSpacer, useEuiPaddingSize } from '@elasti import type { DataViewField } from '@kbn/data-views-plugin/public'; import { i18n } from '@kbn/i18n'; import type { Filter } from '@kbn/es-query'; -import { buildEmptyFilter } from '@kbn/es-query'; +import { buildEmptyFilter, buildEsQuery } from '@kbn/es-query'; import { usePageUrlState } from '@kbn/ml-url-state'; import type { FieldValidationResults } from '@kbn/ml-category-validator'; @@ -24,11 +24,11 @@ import type { EmbeddablePatternAnalysisInput } from '@kbn/aiops-log-pattern-anal import { css } from '@emotion/react'; import { useTableState } from '@kbn/ml-in-memory-table/hooks/use_table_state'; import useMountedState from 'react-use/lib/useMountedState'; +import { getEsQueryConfig } from '@kbn/data-service'; import { type LogCategorizationPageUrlState, getDefaultLogCategorizationAppState, } from '../../../application/url_state/log_pattern_analysis'; -import { createMergedEsQuery } from '../../../application/utils/search_utils'; import { useData } from '../../../hooks/use_data'; import { useSearch } from '../../../hooks/use_search'; import { useAiopsAppContext } from '../../../hooks/use_aiops_app_context'; @@ -90,7 +90,12 @@ export const LogCategorizationDiscover: FC = ( const [stateFromUrl] = usePageUrlState( 'logCategorization', getDefaultLogCategorizationAppState({ - searchQuery: createMergedEsQuery(query, filters, dataView, uiSettings), + searchQuery: buildEsQuery( + dataView, + query ?? [], + filters ?? [], + uiSettings ? getEsQueryConfig(uiSettings) : undefined + ), }) ); const [selectedCategories, setSelectedCategories] = useState([]); diff --git a/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_embeddable/log_categorization_for_embeddable.tsx b/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_embeddable/log_categorization_for_embeddable.tsx index 9178ac7428664..5ca3cd947f7fe 100644 --- a/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_embeddable/log_categorization_for_embeddable.tsx +++ b/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_embeddable/log_categorization_for_embeddable.tsx @@ -10,7 +10,7 @@ import React, { useState, useEffect, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import type { Filter } from '@kbn/es-query'; -import { buildEmptyFilter } from '@kbn/es-query'; +import { buildEmptyFilter, buildEsQuery } from '@kbn/es-query'; import type { FieldValidationResults } from '@kbn/ml-category-validator'; import type { Category } from '@kbn/aiops-log-pattern-analysis/types'; @@ -21,11 +21,11 @@ import { useTableState } from '@kbn/ml-in-memory-table/hooks/use_table_state'; import { AIOPS_ANALYSIS_RUN_ORIGIN } from '@kbn/aiops-common/constants'; import datemath from '@elastic/datemath'; import useMountedState from 'react-use/lib/useMountedState'; +import { getEsQueryConfig } from '@kbn/data-service'; import { useFilterQueryUpdates } from '../../../hooks/use_filters_query'; import type { PatternAnalysisProps } from '../../../shared_components/pattern_analysis'; import { useSearch } from '../../../hooks/use_search'; import { getDefaultLogCategorizationAppState } from '../../../application/url_state/log_pattern_analysis'; -import { createMergedEsQuery } from '../../../application/utils/search_utils'; import { useData } from '../../../hooks/use_data'; import { useAiopsAppContext } from '../../../hooks/use_aiops_app_context'; @@ -86,7 +86,12 @@ export const LogCategorizationEmbeddable: FC = }); const appState = getDefaultLogCategorizationAppState({ - searchQuery: createMergedEsQuery(query, filters, dataView, uiSettings), + searchQuery: buildEsQuery( + dataView, + query ?? [], + filters ?? [], + uiSettings ? getEsQueryConfig(uiSettings) : undefined + ), filters, }); const { searchQuery } = useSearch({ dataView, savedSearch: savedSearch ?? null }, appState, true); diff --git a/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_flyout.tsx b/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_flyout.tsx index 2036c5d3a24e9..203950cbf3971 100644 --- a/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_flyout.tsx +++ b/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_flyout.tsx @@ -33,11 +33,12 @@ import type { CategorizationAdditionalFilter } from '@kbn/aiops-log-pattern-anal import type { Category } from '@kbn/aiops-log-pattern-analysis/types'; import { useTableState } from '@kbn/ml-in-memory-table/hooks/use_table_state'; +import { buildEsQuery } from '@kbn/es-query'; +import { getEsQueryConfig } from '@kbn/data-service'; import { type LogCategorizationPageUrlState, getDefaultLogCategorizationAppState, } from '../../application/url_state/log_pattern_analysis'; -import { createMergedEsQuery } from '../../application/utils/search_utils'; import { useData } from '../../hooks/use_data'; import { useSearch } from '../../hooks/use_search'; import { useAiopsAppContext } from '../../hooks/use_aiops_app_context'; @@ -100,7 +101,12 @@ export const LogCategorizationFlyout: FC = ({ const [stateFromUrl] = usePageUrlState( 'logCategorization', getDefaultLogCategorizationAppState({ - searchQuery: createMergedEsQuery(query, filters, dataView, uiSettings), + searchQuery: buildEsQuery( + dataView, + query ?? [], + filters ?? [], + uiSettings ? getEsQueryConfig(uiSettings) : undefined + ), }) ); const [selectedCategories, setSelectedCategories] = useState([]); diff --git a/x-pack/plugins/aiops/public/components/search_panel/search_panel.tsx b/x-pack/plugins/aiops/public/components/search_panel/search_panel.tsx index e80bfbf31d843..b3c5adc7c4ed9 100644 --- a/x-pack/plugins/aiops/public/components/search_panel/search_panel.tsx +++ b/x-pack/plugins/aiops/public/components/search_panel/search_panel.tsx @@ -9,13 +9,13 @@ import type { FC } from 'react'; import React, { useEffect, useState } from 'react'; import { EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import type { Query, Filter } from '@kbn/es-query'; +import { type Query, type Filter, buildEsQuery } from '@kbn/es-query'; import type { TimeRange } from '@kbn/es-query'; import type { DataViewField } from '@kbn/data-views-plugin/public'; import type { SearchQueryLanguage } from '@kbn/ml-query-utils'; +import { getEsQueryConfig } from '@kbn/data-service'; import { useAiopsAppContext } from '../../hooks/use_aiops_app_context'; import { useDataSource } from '../../hooks/use_data_source'; -import { createMergedEsQuery } from '../../application/utils/search_utils'; interface Props { searchString: Query['query']; searchQuery: Query['query']; @@ -66,11 +66,11 @@ export const SearchPanel: FC = ({ searchString, searchQueryLanguage, setS queryManager.filterManager.setFilters(mergedFilters); } - const combinedQuery = createMergedEsQuery( + const combinedQuery = buildEsQuery( + dataView, mergedQuery, queryManager.filterManager.getFilters() ?? [], - dataView, - uiSettings + uiSettings ? getEsQueryConfig(uiSettings) : undefined ); setSearchParams({ diff --git a/x-pack/plugins/aiops/public/embeddables/change_point_chart/embeddable_chart_component_wrapper.tsx b/x-pack/plugins/aiops/public/embeddables/change_point_chart/embeddable_chart_component_wrapper.tsx index d95fcca4cbbff..69da4be087a14 100644 --- a/x-pack/plugins/aiops/public/embeddables/change_point_chart/embeddable_chart_component_wrapper.tsx +++ b/x-pack/plugins/aiops/public/embeddables/change_point_chart/embeddable_chart_component_wrapper.tsx @@ -9,6 +9,8 @@ import type { FC } from 'react'; import React, { useEffect, useMemo } from 'react'; import { css } from '@emotion/react'; import { CHANGE_POINT_DETECTION_VIEW_TYPE } from '@kbn/aiops-change-point-detection/constants'; +import { getEsQueryConfig } from '@kbn/data-service'; +import { buildEsQuery } from '@kbn/es-query'; import type { ChangePointDetectionProps } from '../../shared_components/change_point_detection'; import { ChangePointsTable } from '../../components/change_point_detection/change_points_table'; import { @@ -18,7 +20,6 @@ import { import { useFilterQueryUpdates } from '../../hooks/use_filters_query'; import { useDataSource } from '../../hooks/use_data_source'; import { useAiopsAppContext } from '../../hooks/use_aiops_app_context'; -import { createMergedEsQuery } from '../../application/utils/search_utils'; import { useChangePointResults } from '../../components/change_point_detection/use_change_point_agg_request'; import { ChartsGrid } from '../../components/change_point_detection/charts_grid'; import { NoChangePointsWarning } from '../../components/change_point_detection/no_change_points_warning'; @@ -62,15 +63,13 @@ export const ChartGridEmbeddableWrapper: FC = ({ const { uiSettings } = useAiopsAppContext(); const combinedQuery = useMemo(() => { - const mergedQuery = createMergedEsQuery(query, filters, dataView, uiSettings); - if (!Array.isArray(mergedQuery.bool?.filter)) { - if (!mergedQuery.bool) { - mergedQuery.bool = {}; - } - mergedQuery.bool.filter = []; - } - - mergedQuery.bool!.filter.push({ + const mergedQuery = buildEsQuery( + dataView, + query, + filters, + uiSettings ? getEsQueryConfig(uiSettings) : undefined + ); + mergedQuery.bool.filter.push({ range: { [dataView.timeFieldName!]: { from: searchBounds.min?.valueOf(), diff --git a/x-pack/plugins/aiops/public/hooks/use_search.ts b/x-pack/plugins/aiops/public/hooks/use_search.ts index 060e87dab59c5..14d8b6124eabb 100644 --- a/x-pack/plugins/aiops/public/hooks/use_search.ts +++ b/x-pack/plugins/aiops/public/hooks/use_search.ts @@ -9,14 +9,14 @@ import { useMemo } from 'react'; import type { DataView } from '@kbn/data-views-plugin/public'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; -import { isQuery } from '@kbn/data-plugin/public'; +import { getEsQueryConfig, isQuery } from '@kbn/data-plugin/public'; +import { buildEsQuery } from '@kbn/es-query'; import { getEsQueryFromSavedSearch } from '../application/utils/search_utils'; import { isDefaultSearchQuery, type AiOpsIndexBasedAppState, } from '../application/url_state/common'; -import { createMergedEsQuery } from '../application/utils/search_utils'; import { useAiopsAppContext } from './use_aiops_app_context'; @@ -66,7 +66,12 @@ export const useSearch = ( (isDefaultSearchQuery(searchQuery) || searchQuery === undefined) && isQuery(query) ) { - searchQuery = createMergedEsQuery(query, aiopsListState.filters, dataView, uiSettings); + searchQuery = buildEsQuery( + dataView, + query, + aiopsListState.filters ?? [], + uiSettings ? getEsQueryConfig(uiSettings) : undefined + ); } return { From 52a543408d2c396f90ccc3a422ddd9e9a677a7e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Wed, 23 Oct 2024 20:59:08 +0200 Subject: [PATCH 080/146] Change the archive used by `incompatible_cluster_routing_allocation` (#197429) --- ...1_migrations_sample_data_saved_objects.zip | Bin 6797839 -> 0 bytes ...patible_cluster_routing_allocation.test.ts | 10 ++-------- 2 files changed, 2 insertions(+), 8 deletions(-) delete mode 100644 src/core/server/integration_tests/saved_objects/migrations/archives/8.0.0_v1_migrations_sample_data_saved_objects.zip diff --git a/src/core/server/integration_tests/saved_objects/migrations/archives/8.0.0_v1_migrations_sample_data_saved_objects.zip b/src/core/server/integration_tests/saved_objects/migrations/archives/8.0.0_v1_migrations_sample_data_saved_objects.zip deleted file mode 100644 index 98b0ba6442b0ee2d7a83b5b23a6a85e748f84366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6797839 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�AnxH2QQiAjcR~S-|4OCE>OZU$X;_D$ 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 z zV2cTB(Wr#3?r<~~ZMxggUp0smrw}I|tQ+?kq?$1OHN#a27q|A29!+Y?i4mcnn2WkX zu@JY}YfSe_Sg^4#8ry7|i%oYOZ0`-lgoYY{yiEkyq3&?+6DD5{_9>mgXq(Qz2J@!Y zU{_DLm-_7gx6S6Y*&1!0ZD`E2U6a&)p9Ltk>E{Vm%CsMcd^PaW*7Zm$?U?WZF5gI7BTIZ0mkMVO&6A7*D~Yllcl^R`avmC36~hrB`~x;5X+6fXY;xYofh z21CgfKaA1uwDIj=;s;>7VI!e$8k2QiOAnL^V0i3&DVQnoGSA7~s0Bh>Izy2gbZ^tC zy3cW-$~zF24-q5X8w_*!Pt)9AbAMjq*;5Y#IW;Wh=An;RJsiPIJANe_~%t89c;dG$~TLtQj=hx94eY}|! z8|XT%Db!1fb*Slpf`X>=3OO1+5>t8nE|y0uo5$~^7n(=c2U!_kM%PD4d@TnTe~QG} ze8|H9&Sd(xSoG#{0utEtA z+7n|Cpwpzj>nC7&7k-vTkq1FFA*)A%$XpngMa7v#D$Y4jqsVX>OqVLodC<@&$+&Y7 zOcGFYIy4ciPL}AyaD0jipJTKJ`X-CZ&t^XVbmV7}debPVwvd01*&XdbI8yAGDW<%{ zIZLQG4#y z)`4iKzbQ!2zCPF)tE6?CL4;OEgxEsYiA0D~=;|jz6a+Yf2yp=zd_N+@X`tf=$lI7e zL!B4VRXjRD!0K4Onr=^^$49d9JDSL(53dhJ*Ad5%dV2z^5DXGyl_m}N6gJsB2#Dqy zZN%q0Sd}>!u!-?2S+z-g6{ZV4I0cBlCi0)r9ew;I^A$#qvn_}croQNUrAe4>!R}~N zPk2MW&CP2K7wKm{qBfJL&_~LWjo8S?pQpE2PS=;|EmlB2f1TcfL?#~1i0mAsclr4D znUtbs;jJVN6?Gm03& z^l8-3(WDCaSS9NMHphW3$a~Y^8xe3kRQs=>F-<2?a4q0Brv9dxADUNCu)53%RoJp9 z7(Lh^Ci9H#>-kRc{MyFaN#JfFoByn0dg{LLkPunAu~2^_1SET|RZ`fCmkOLXlnB4A z3Zsp+v~r>7RM?*p z{K!MN2aN-mxsEv|0Ms)*%&tmG=~{3f44x_o`ib(oIzB-=*#Z**X41&Wq?rQRX^e0O zZf9^JZ0>Gk?(raIB@cNYICmswWg_W&i!_^a3-AS+$4PR>%RKWm=Xl8Px|oRx z)F#UdpRVc7C}>v`>!Me?R=mAeyFp&`Q^EPEF!OBsQQ&NWqTowLWFR6Gk*0GQPBrwe znKlL%kckm{R5uUPSSi@wWahz|aIGxTjPgvE+dmnrfWf?`uC2Yno^WSVG!zp&l(Jq= zFp02Agw+aHGfqb95VfL>1Td5*?NvP5;{h8pRAix|;Uxh0p`bdC2wc?!)N z?e_08b`)ggPvCl0GJ2k6#&%bkzG+ORqsh`o&bQS z489p_v{MC=7Dsyedc(24{tB&npiiqO(dOh^wF-hqCqGlGCR@|SFVsp%B-{8ES}8w( zt~XlO+vU~G@1^Ti{56e>JN`#%btygFNxFm9qF(}}5ER=E zv*B8uA8xB9qlhooO56j$?_|yF3}6pA2?F>bwmg15GMr5>@iZ;?5>lvN24kXYLAZB) z|3aVXbb0atn)AnoJEwX01`g;4e_y1EWX^s7##|S+g8giVQ3j;C!MTpS!(BKF0;B^E zbl#nRr_jKneFOcSp(9)_Qi@D=9g^l$s(lv;_e%NEt|ERjnAM%f(1(Te9>==u1av0u z&NCL8d=HcwWD3rJQtT5eRcqW}5_gsIbuOFJhZTOmE3X>Neixq4?60#tk`dQ|r`n|r zGPc_FP;<(@oCkcZ%SLNb!FSp1WC2w0kL`IRpGvhuHT;)uHW<`@sX^xbVwhkYC@uv7 zznF!!LHRaMz+KAlA|MLJu7@)dl4mNwm(UjOj5e1*9Mbv}KVA%)BBVy7PRA?5=^|(p zRI~*Aii!?L{vwPgDmoCRvL(<$?Y@TmBJk6adan=nZVvSl5pDevU4*EY5uhxCF@1{2 zFCsy*2F7^XT2K-BGnx=?e_;kc9Ezkqb^*GHfQp1+w;N_lJbi(v<{Hx6%k=`j63Y2F zx~`#nzq~KvbM!)@%_8;-4X-A8W>feIy_nxX-}LCS^_zeU7cUQ(Cia=t{v&iRO`VJX zQ1cOiyLg<<Xg=U^qL%u|fh|0&qrr>NJKU`hSN z(~vq&jr9#~DqZIrLtgcz^w<=dyN{7gbdJHqM_n?14PL78M-7c{1D9aG_gF3456mz# zZg;l?BRxNM*uAi@gCM)sVSKFX4WKu=Ck$-4SU2C&*#t1o*Nxxld<+=QgJ2&0;A0&N zfjzGqWbzjRz5?);?y54Jl|aoKO~C%)9t8ScbEv<+ufL<8q^N%?;D>JhmCi^m+WEh9 zJHfi0f1u~ld>EwpYP^}Qzt#=XLk<3jx|&Ow^B$c(*p=_UyUgPA&C zq=WdVe<8fdVW2%Y?S*ZpT)5S-=LUYk{yT#1cYYl4F^QUwT z^dDHn8%?kM7s3oT9JoVH9xK9wxt`M{FinHR7+_%yxzLBPCib1kuTG!qnUgK zT;Tm$qkcY+7%^{5k22oF^$w_XY+?N8WV0*)5yC2`#RBswF!tCsMMc!LBie0S z&_OEVY&$Gs#&NdOXvm$yKeN`R|Hx)OZsS#eT(g6t0~~|4E0S1oaHewel#Sg8>y#>U zJLBVMY-35wI*^Pguw}7K=^gxFQ@TtGloCxFd(1$iAkQ0`P?mr3wz zOX)Jda6rA&b1Ux32>tn=1P7Tcc#ASMUjYX{64YlKI-F#7deA3AdpbHri03PiA)dz} zJ;d_|5FsA^Dxu4HT0zq!onNfw6Q}d5G?y^}NL6qf6Mkxo^}}U zIs^3Cz>f0Z50UR;rqeRni%2Ublf6)r@z4UTSa^@}HM>)q?CfLYb4-mCW59SS@0%MIwOq92Se<*JEhM8o=X_{{kJ@0DL=L z=)r-)>*o|^7%|gmUk%E)@4jamak$W zvW$l_b_Vi8bxp*VPhn~CWn(3yAv)dnFk(eo9+$Vfw74U>F%*iugfe*cI?CYLTPTBP z?Q)YgcIVkwp1@-R)qW0O3yYx9&T@tOQ@Q z8%~S#_pJ{TP%Z;~C(!HOwxPf8gs#xKfejmK;l(7^QY)u}QDh1Eqrg^1___H?(7(iB z*XCevCo!~Tm;6DPL_iag!RHh3F{KpvrO8NUFL7yyWP9RMfrrZ=U$Cr%$nSwG#j`V+ zeHrTGv0ycz*Z(%yYruROUy>XgPz<~hT{QQmqZIURvbUCKfzH0j*45k5*M2Ilh_2~d z{WoS_OhzE+w<5ooWc-Ur9BiKf+B>+Lb%!!l;y$K(rq6-?qhWwUBPho)&q5yCkl+PtA~wYQ-F7~QZ`jM-o`W1 zA&zGgH0fC@W77e@M81)gvpFIPTh3A*>k!>Zk9D0=nQry^gWcV%%DKOA-Hmb54^C#K zPEtnBV&h2>vM1i~?VLI~KnG{@~p^wE2X!(oX(o1T(rI*y^ zmR`~#xAc-0d!(1t?oN0~CC$Ez=`>r&1kDOBDcqIs?Y^f(VcMJ`TcEk6H5P8^33Uf? z5am-P&n2hdn27_kVIqAO1jA2;B8zAx&z}Q@DV{G!I2Sz+!0XXqPoz84L`Gb&DfTR~ zK^Z8UPFAHKDkMjCKYNR|Zsn`*@e94bD*7ch^!KhU~g$$Z;M zFh}raI=%q+)>(^aUVQ*$qQRmZ1&7MlvR-$*|QeHqk3A#Uk z35TD7A0b~(V-?mwHC@Fci!zU+Tax1i43G@ zEZ8gZSCqy^E8Sn@;V0RYJA1O_&R$@-vk$f0*~eS%?Cq92dk!NeRPOApneOb@lslV$ z$m;m>o+8f~AUyEDV`I!21ZS*N1i7ANgN zKty)O5zm&J10r|E*RRq}Iv&rzvp*pnquqvD^K-2=Kg(M4)2uZ=*;?~0)|$tW_+G8~ zw9GZ%m|F8E)AB!>9w;LCb5WznkD*S8h4~TG2~j3rL!A)r5Ox$xt6({G(gKKYBR@z2 zsAPWmCFWLosO7r>%nu^7AUCV?+%^@dwHr+>EajoJ9)9nU&yomX(mpIWK>(P+|K7ou(M+n=(e61!NH^S_-y9u>*;PfzHi+ko6J=?mdRX|rA+3k%wRHC zrAFndxK*yoIY{zD=BnI^>A5NoqsUdEhlPDTeO+V~-=Q>vJC$Z|kJ1e8Rhq&5N;7y! zX$Dc`k0{OHstnEGnS^GLA2&j={%~isDYS)BqINBph!1j`~y_;{4W#)%=lL* z=9!VEP$Kd{c)o;mhA$wmq7@UKg*ZCpBP%MrkRFHWF@b){X?Gy=2^3qPP;8Duv8f8h zCMy)HS19&#`4?mEl6}vWF0;@Ux4NtXxb+UOEI5+fj0Xxp^FvSN&DJ^ z#UeFp7uxL;fXpKPPjuL65D(CW9vmv7Bt>K&IPCQCJuKq?^cKM}AoR39OFfPM74wAI z@*zsF`UjTTXt@7Gmr2^dRY-H>Hfc?tq)SRY_&42=VfGms_ZMNf$k)EHs3E#SFBTb4 zPZWv}hsXzATqHgjw~C00d#BK;m(o0~URw-h#d=3EzXf#s9hg&Kw{dJ^ZBHl`6oR_8 zb=xV8wXv;{{u1-b67A`dKxjj#_7tMddneUgqu1TVZpT;gYP=kOKuYIDcs<^TgZVgP zFDcl}4xgK?R(5oUaOsGI?Eg&MRy#-LV^0Kq3f!Jb$8LpyOvmmXRXXJTu- z0A3D87>p7yuFXW%-$C4rB~rqZSV<$808X--yb>hLp;B^&|An~VE)NUf0Pr|&&P=6WpO_p)@f>h7S zQ4`QI7Tj{AZQyJd1HAx!T0}rVB2D@ep8o_p~ ze5)p?8wmHngTkdJ3{-lrLg6Ag6dZ+ceZu$OI)(U4IbglOehb4KuqVQ!(jllOy9r8? zzP@V(NSAoq9)#`E&DX!R4@$JNks!NJ`1Y2nVdg$)H1WNn^z0;tIOqlu9%z7#I%!o8cf}KCX z>W)4{dVyY2c5AUGqSO@|6ri1yJWuj4mDp(ly{Si z-98lqo(pwy2Ij&zK`>jOfz5>u`9dvNuiob~80VMqxWwy35CgLD1)}wGh)?K9TaHWz zt@wWS*`wdj2Pc~+XJkIqr8$@X1m?rSce{ne6$yds6YCkeA4Hxa^R`XK#ELG08u?DM zp++p}y->eYywENP$i80An2CCjj^rkYd-t-$tuV$~*9B0c=HVo$wXz!%6LA;RB$FG( zTbx8@VY&nQBdiq;=zwf?P|vb7lhlBwLA*5aql`69zIkeR2Z?y=+$2RWgNgF}7r?}v z?rOE5D{<0J`68mR!MyBCA_g@@4XTy2z~O_U8L*mI1PzIaSOgPkB9=f4TO=pqe3&xC z*S$pOee>y+28hH-=aOUoA<2Bw2Rh^m+=O0Iz90}2?>*?rNi<@F(_uFbrMYJ4kg&5K z)c2_+B_&@_)4gEZECFsd)JkXhCgm*Ok$AbElZKe)G1s1gZynhLqYzKkOo>J21m?Q- z?GI~j)9Y_xcjC)L#S8W`Ib znF72Dz+4GN-_pnm+j>;;1a5rwuBUNwN?M;zoKbA<=m+7y8Kmy@XKH}Zzj{=deY2iW2uO;^M&Z+ub>v75d^z; z=Tm={ywBP9?z|y+0%v-<(eMQ`U1aF3alV=qBSvg4QJ(9P(gfLEtfe26?`0)-HW=@1yE_R5-yt>BQcQ&s^AI%1>G(XGR$3CEX1n`#7jLk3X(V-;Ay6QO zN@E%vHl{M5=BymEga&gG)Fo5Qga&geOqK~ItEJMi4XVlhkVCwWwD|qtTd%c>xjHhNch9#7SHb_ws=M?x`-EK9ktpwBz>}>+FGz@j%yO=?~3V9PTLC5MBKd! z^5n?ofj!H}E(C`fSu>OfKdXrbJ^=U!!lMRoi}^T^q?!oAUxp662>7MwyFQ6YSE7iX zJFi8BwqF+w#jI>9SAACPYAU#sxG16g$bEH4v3BvW!f5pE2Y+9o2c?ifK#K-2+2-S~=X^<^oz7z{?ND{^&keHozW%Jmirg$FB z?|o3*Aw|Xm;1(nJr5eGbN>6Mi29rvlMmF}DS~`ZE^S{EdxHFR;a%0(`Ih+~jTk#25?UeL3vs((Y0ODX#LZa7k#0W!ObC(ko z{R)atPt4{NBs)ZgpkD(Sf+mYhgrMIC8GSw_Ba%8Fe-Uivfxuq@nLIRVo9kWtcFYhy%Eb{2Exo`r+3&_x zy{C=+Av*)_!8`GF{4Vam^YP?MaggJJk#vHova(4I*TEH1E4Xyrw%Wx~E0_-Y+;omw z0yf1_XN=NwaBeow!T0~)dJb-)Im+%iNPIC~m)kdx`eEj8rh-qh*R;`FDwcR_g&HAX z`k#St==koEMPI$H%91lfAer zGKSbpL$qbb%A@vKdhWGgi}@=E$X~`waywRpUXY{;u%!#iU77u#2YG4Hh&w>MNjC3E zH5fw@9e5&&ALrR{vaRW{WMu>IiI9Zth|%2*_r3Hw>AHA^zW- zo|i|{#BxiF9 z+?blo1yCJ692(^mEr%J_6s?3Aa*9^MEHOpbz-+eC%J)7W1M-!3&l&d8`!(}NM~U{~2(IvVP>C{|$zCepU!m_-5?|q1czx&k<4zd_oS7lR_GsD4 zbA4{h2n|bR@Unt!wXITikv%lTgQi4R@2Esqn~DurN4%h`fbh9WYPF>YgqI2T)?I0W zYLJiYDXSyJFvG`|bed6jV}SVwwv+(-#8fXi1fJHAVrMBTITX7aQt%Y78QFWBNX<>@ zkS&lmvW7FnuUrz4A?EnF(K@V0z}18SQr&qUFbSm(WCV8KOX7um^r<&(3dI*we^%Zl zFBo<3SmsWfq%Wxn%96gMPAK=bU7H@_T_%Rq3<25l&Sccc1M$kNk;<%|894Prt;=S8|Z-p`uw!_om%bXbX5!{eK zo!V3ECOfCl8^`=R@oMad^oOp+NcZVDh&U%x-QL5pL6tKJRcc$XLaS#9t>#IzY65*m zx~9E9Sa1~^697U1b}*Qq&v;BiCeKjcZ(x)z+4YCRr2 zLJlt_fkXza6wQ}_p@d<4W~L&V3$)ZO?wmWZXUg)0$>L!{@{%70&jJX@b_Ppwv^3;J z#zDMzM9AK|QJ-hI<4SV{3Wv5o#26UaJ?B$)tur7IJzn6?(qLvXPZikqlFL&sa(TRw z`S9HY=9j?EBplrWGbE<7+hCL0V?MAbbCdaM31fc)tOQsJr>X9@ME2O^mlem!<`O^H zZDtKdHo&7PK-sbo3cPK{q{FrqXedZ*9KRbX2Yv(QA_&MI?J1Vs4)4_Z`f634r2<~g z=)DZuMCUEA-RgWf)Ogz>$&TBhNp`##3U-R&%eLPS4Z*_Q_Ozj=k0EWIG%FCX9~As1 zeN0P$ZwHwbi|37ih@Yk-qQhk8mlwUoO5VnSop=GBh5eV{g?REKIA~&P79YeDLohKf ziHV7wgwp-+o3d>Le*zTAHk_Fbit_;#C~h7VC=Rk#Yv-c$hKaq4;{j`E^=d%B792&u zE>*~Q5Zsai#wlP_!98hExF3}H`(aFUS<3TwFfgMMb|#T7UYy$C$`l=^`zDqgm5(8_8eGFj;cYqrW5ykib zb|ziu@q(N|i)7fc7EI+iFy_Bw<2ZlumvQWf%VDGTtyI4?!jt2Z3@C~BXain%i0T3^x zR|+Q-N3ZS^zz zQNf|fP@pKbMb#@lnl#762B!Ot8@KVrJv}G2sT~@TkinY`M`?f-2qN)$QTD@pahjY7Sr8`ab zjNADW%sUUy#1oD^R9u>I(XC**>k3DA%?a%E=l$SAesrO#s-bVJgfOtZqY4DR2 z#Lu{@6VXQEnT+N8ARxz7FQ%_9-Sa#j?o4FD2zUamUAT`2 zt46I0i&sAnuvO`Kz5mY3$b-o+_RFAM45k#A8qM^~u+jc9DaJceQjE%PTdO|B>-X*w z9+v(#4N7x3s9(-N$#}&m+y^;y(U;QOzZ|UW^ue0!j)xI=60&(DGSl4b0r|)Hgsfq- z5fM0{&}LxYp-JppsIV^}8~9J<5Y!s6yGBU!3%A4PMtX)!La)u8_Hu42?L`II23;y6 zMS1InrKIH0W}D&qq)NCDio9)IX}WB6K>T9;?mWwOA9enVkN&lbu3DkqyM6#Z$*C@0 zNx#nohT2o|O!h;U<63l{+;!;MqmDjg`7tN$OlGm{apW$>pO(auR2LU^Fx z;YFEwdnSxNIGoYvtek=30~H^u_P-pPp;zvm&HRuInGVr3*GNs%sJ3|O8{aTRaY%@E z@1f&Ca|jfvU&nnp5G(nOv7qlo;2vSUML-4QOGlN1TRWO9JMsF_VN=GBrVUZjQb4uH z0xH?qSC#vKQ^yYhsy!u{YDF&2KAViI;850fnQZ6P?0r1D;ud_!xY2mg*sVXWf7kd_ z|4P5i_^Yue9}n8=nH!&%CD~jKvRzJ3bVX7cOB?ZttJt>M6_V-afxaZ2=~n_*On>R9 zREQ0&vTnq+aN3%_)xr%F#c^aIjsxRdC>odr7bn^MyHMNFx4(2n)Im|tRgmvr0M-6+ z0B0sJpblo!UrBr34sqwO5)+Aq^Fv`qafvL{HwOxnr6r`^zX6J{9;-X2La9(fJ7jLG z+JN*36yK0iLN8+cDAcS-sGG@1sHQf2eu**?x(j6%&tFh(_`DUxhEM(qdc;1?%QJR+ z{w%TE)Aw$&Vud(iz9|HYCOeJZr|U#(ejiu3>HniZ@`%DHH8mE`II&?bWICfM!jkjti;9+E$Nwb)Uv zlIf;HWf}qfNTf~_scIJ`NP5BD(%jl#9&gYfi8cy#S!}H^7CXPRpnoY$_4kMVg=3s& ziy|1+ooz5dl)&Jpz|aC1{(=4*m^|_1EOpYxMs?E0a&^*1i#loJHIyf9e1WnI)AupG z4AT!$mSH*b2ZA$oEy}EF*mCNWA2a##$XTf+cbx$>2qnunK4f# z&y1N*lIdym2p7o{>g0|`)X5zWs*^kJQzv)aqfYKPmZ({!b#Bi%x#K2zatFT-eFun& zA1@wI~WsiI$(qX!)~b%T`9>F71C;O@yhm%iZpzk)6duu^nnU z`lf(JLbD0dNU~iNCeV_ZYM-Zt5gMgyf20JFzk=?(8xlDpV}+;UKs1~|F|E}@+&co7 zocGB0h7R<0&(KuKlh0Kdr!N%XeW?KND+PG}QGoY?1U&u?$|Fo(%0N3v?hyY)T5*%( zbi7<_?>1%8b3Y+^F|+Xw`dn!hJg>J3o=>(4o-ai1*E0&5q)tIe6g>CcD9?J5g-4Dz zc|do$nngJi(?vs`%Vf#ynXE_*nOI9K-y~*tH3B|_)StsenDaMuhzG}t`hlflU%iVy zx|olhV<%A}CCXPQCCY9kQ9e`>>1O9)(=Ayn>33YAoat~+ENF~1XK z6|Q@f6u4Kh>-~ydA5!cps|ZMTy()uUpGmQ6EV$t*lv#I=s3Vl_S4Su%Q-CF)+$;eF z+mT?wAuy#c15++aVoJNnO*{`}4YTuQ4KwosRQfBpfnIEPp3Gj%s%M=mD7qEwO_0p8 zmg2k}9F`j|Gs{}y@kQWFBmRlVO|-o)4EYqxJS8!?MJ8a4k;E_dIX#1=&c{Wyv9i4V z#EiL|&480+IRNK0AsgM!RI!>O=60%LHJhwjHDj5-H&(5V`>9a%5K2`&gkn_>p+MC` z@Tz(UcOZAGdI)c3P`jR>_A%S7>NopxsFOUxsYOU?ubygCo$I8IBS@6e`EMRappH-A z&RtC+dYU}(po^)>EnQaSmM*JuOP5u-rOT?^(q&a{`5ft^s@yU;vvNyUvT{o`bz4^L zKZF%l`_$6lk-iitZZR|o(xYLw%h33(8d`OzyHu`M0Y6?xTY6{tOSyPBq z6OSw?)R|dO=vk|vP(=564k9FRh+?G-bgMEUEYCxL>$sSLEIHbDt4_6dV5{jZ0H`A&CrEHwZ63+@G zajgJv7P(xBy5lDnEY2kQ?+=}frlUg?3$E^LCNv|>-81yqtBQiA=NaFFCB{@Chkc^h zCa`>iL>#GP#$4bYRwD{D{S6C@7J&+-#tdOl6w;k4a8ya8S7?O9sarmFsm|*49f{My z8g;jn#dEC#NcOi5AX#9^t)Fz8xlMoPfhMef11S{@{x6>)@HihM2}Bm zKJDkMLmt}pvE3usuS>Dtk&69RD)w8X*l)JN@LwWtQW*ZX3=DUrFx;x+^c%CnEzzvK zQ;aB4yDi$bZQHhO+jjSA+qP}nwr$()UTwSY`gd}&bIwgpvTyFgc&nsR^?fgM4y|6N zTKsj8ZmzNahbM{VlN*pt&mAP&o*U=p=T6j3I;7`<^V_;iEdeg-dL-As7otTp>@#eF zsj~UBK;l7Aana;jlRzrWNMSNaq>}lU0C}Va5y>DbxN?6)i%AMD%i{CI#@q<^@ZT>Y zxK#Z>e|S#+DvKiKG7;4R5xUz{i=_>#T1y;KksyXJD@x$%E~+Qw%IS-C7S`>^Fp6&) znyX**mLdbVUR>5UnUWZac(fi>KiFjbgSqC(Ms59M(~en+Id|ZFSj~gY-Wrh}Zv$B2#nK8jdq zW>9`axYp{VBZ-x91S8D+(XWSXHC$`krUo}sOM~7@)em(^gB8%?`MQZF?ie&t6@V=j z3>x{AJ#1DJ%RrX~o&XxSstUC_3<>mc4_v3K$0DZ|l}y6Dg+-O2gunjz1WSLIWY^Cw zAKF%@N+*lN<8zFHCAG^3k_Gp01lQpksj9j35q>^UpI-qGKagJXW+7PleO-NO9}L$mFT{K zOUQPKy$W=AIr8(6N`IbGOLl3T(|IIFrOpcuj{9GyiZOdQhq&J0qaDj*J z63$N(L_fGt<8V=LkcizYv<8mg3p^KyB^@$2!%hDp-rx&blrV;Sp3zrVpe4-B-ye|D zlaJpmN_Y;n@Yc3Icc_DS}Z%cYGLcVIo? zU%S!U1JbA8SBH6KBhHYJp`&@o-;`)cUd`VjHJAp9%nmFmST_f0d_Na5-)KMRxTR1zb_+cePz} zzcxAQqYR@#%T7pBh#_HR*SqXB26u-XWo~1c4CP_}5pe5%!BoY#brTtdX;`|W)Xn}G zJ-hCw3itru6Hnt4VUGEJ8)H6Yt|_}u9u6NOX^GEdcZP)J%s69J# zg^?OxxC8`V-ZX;RhYH(N;oK@MF9*U|0GT+;BIEc(QC=ZeQ}Q%X^mZnzZ0ffk)DpSu zpN!*=X8d53fc#`d+8pD*AZ#g69a++T9fy^oBrv2(>lw69<+Efu{^EsLp9Dr)cHDUPrbkmu;L}X_uYjS>n zu`qheAVpTLDVq}s$-wlf`LvLEBT+)16p?Q;-MQYvcP-9Z$9EAvE-`8*-u9SqAnrw8 z8wqpp>M<@x!@YZQEt_YoIV)_~sRFzsbBN?$(;@`0eUn0r%k|bwo|CzC%f?Wm+CKIq z2ZvW%UL%pQNu*<#P_ni7BG6CY=T`i&gILiVqlz;+S}wBOu;&L{QZjvOGT5s45#o8WTm94m6(k@MV)nvV*JyY&_74Cg5jQF5<`PDM>tQ3NRfn@&1n4W&1xKSV9McMJz z?)$Ux=RtgFzeLf7NDf6Upl+-f&1%@W6%wPtalL)QcfUC=BGzT>g@(_-;j=M?w~Vwp zkasrWVRdmjaNf-0OGzaY)Xy>60Ij?1#a*cgiR`sqTtb0#YX3>iC0)5ZJ~}|CooYjw z@rxp*gbTelO=J$ZUrq9|tNpVw^#&D%G}d2AUQV9S?!!Yt-{JyXsA3i^yn9Vhe$_TN zBIT>uxh@N?=8u`xtXm19Mz^p2LwgOrEb+8rXec$oXRNx3GC~upFqAQ{dlJ`AVcGIv?mgdwyhd~_|h{Q~KdbkO59aO*|C_z8dFOG^3HQq#b*A@X!1 zOxAcfMHd2sS4BUitmeU$xGzlOni(Y^qr*F@iX(v6u+7qO?{=b@KI;@V+$7p-ZfMkK z@MLR#K<^Eu1oC4VS{6sHcbfS=T&d%+a$bfUFK;hI${epG%1qUkDi8dphiYz79v8GF zAI0Xj!Qew}&M4&ChG2Jr8LfkJYn|%)#-@`!aO&6Gq#Uan#MoAv=Yi}jn$^L4zGz)5 z`TLA3$F7bA*JDL+oZjEccj{CdjjH8u-r9u6x*g5q^yBI^Tg;Cif?^HnAESE1^*>@$ zIzysa4Op&Z><+M2Mof$8ak(eLJT>V7&s$RSuBK8Pjp;$+}0Ur*6bP&ON_Z6x+~@&{Kv&?Q_LPv%f1*@F~S zL2WO|-bvrf*WIv>vx7C_wAWnD4tL{A_h8xlnY6LHI6#u+e!up%Rk|b{W?1K+B~^Y= z11f3{mR?PX#H(tf^i-jaf~AM43tqaR)b0TgfLpUTf~z8cLqe-K@M$GeSfVP%j^QB% zQCz#5D$Imsq~Cg{Sff?q{(Xc*~0}fSFljuc8l{p+hhK| zl8N(u#NPqtfM6ugeoE;9O|&M>p0kTElxk)&q>T<{>8;0q4ZMBK|%}1{f&tY`_s%~Q;)I? zR?+zacI1+(fHTpLZMTzdTmx&dcMSizsbEW;=JGG^8r|WyoE_p!;S(tvdz)DIHZO}BmOC;YoU{| z$^Ao$Ej3#0dMh$|teLr;pq&~5(OulEZ40=BTsq{(&jrz)fc;ezxJf(gONg}ylYE+g zR6(W$&Ytw8cVmJ3L^&kS&cv_A$0bDCPA|&lUkGF>GOMoad?F2GBmwR8_onK_YPiHP zi>dZiCVN<{jY!QAY4H}rlwQsNn-msynPE@!+t8OSO|s;(O zBmnS#B6)89;s1!`(N&bSKvqQX{ZpDFgyJUHg@hn=hk)3HR!s^bcuypCL798h>9Lx= zbDbzFCBLE!9T1og+ORK(fJ#z6g5y|$ml+gBQJ6v%o>u8jIa3gZSN+I_76`vP=gs`s z^T%w~_XQ50=T^3(L`SnCo9c66BtPFQ7-5-bUSpak-G`;Y^Kw4o&y<=`_hqGksn{d2 z5XdMBYK0J7N`(~Yq_TkSuqlm^wAZY+f22zRuN)YDXhZN56=?EQcZ>MF%Z){PIFUE}tni%`?UChZvlBs!+ zOeX6mPoYdZL5m6W+<0n4KRiaaU4`tz6?Lym2csOk2{UL;<7dLq3q#>C`7zbWm^}=b zff}eLixYeG$ALjMIW7A?;6cqywb*n~_7InV7PUQ-q3_iX7tBDntqm4}z*@DqqzTbu)BSzvHjCGMwUxWv{Tg(%ttTXtjWJbfk?JyQLQ!RGotA9n2oN9fxon z&WT=%k=VR=Tk9G_{hPnbWzRtSlXJfk&I3Lz660|X9>BWFy*(XZv1(5r>pA*flYbwz z(|&;dd+S<_W|gun7hjS7ZJpIWF#V6W&VtU#^1n7syn4*wKlnd3t*I}UnC?nBGdnZQ z$`CC(GdC+!{V*dfbq)Ze>#bF`C0)I3`L?_ve70u>iGUG~;1q-rBY~5Ej~HFqmoe;* zQDdNAy%30-nvrIqo~D(alrLhOv6Qc1grA^QZdw#Oyh>p?2Qz=%%)HE;z+5~&Q7Sa@ zsXv6Z_QQ$4E*P?T%Y4%^v%wtwsx*z%tU*;hLliqRBA_)L)eQB-wCo5&Kn+JI$1O%Z-WvHhXNJ?8uT4@}u)Ey-$PMZUOt(vAT z=ca2rt&jX<-N+?6K&h?aV#olys&DgJlBw2*_1u^2%WUqV4!6@jr@mj#-|5Ock*O&* z6Co)X%~fAhZx+P4;X$7PXN0@g?30T*SH7nMakifN;_7E}c}@e=ms%AsH#*$tvc-gT z2`g=;M72bpdxThmrZ9|$9^h+iveUg+vSZ)6AE^ZAa z6nY`CFL+998Ir;T1qR%RG4BWy6LpfxXo>*bgzEu~`L)v3ogpcP97(DG75g+Kymj9w zB&jmC!yrUcm57q9L@5TET4IrQT(#^g4)WL!q6T}C;^MD=<+->4h@`e*PD&J5@{|E0 zJV?^uL=6I5OqI(*zYMM|{=LX-!^l$Az&G;Lip807HyxPAO!;m81YLsRfi|E=QuQSJ z1tJ6`AV~#Tz+C}q!1M4&E5Ui5=<|+WUa;X$eEx1FUv8jGl-ZU9IME{f;LUI#9{>oQ z03Z(p^HeswAWS|O=c~>YAKzxEp=U#JFN9~0xKuqZ$eg7p)=7u z{%%cxZ?^$=tpB;*v2H|dU=Xk7PEtzjHDJQUgbQ8lT`-_wsxDpx_0JkWQ315`5AtwF z53=+>*a9Gn)PQ9Ob_+=H#g2Z;+AsX|*MG+Nb#enHTd_<(Htcp z{hHS`grox}^jMN5J_89DOQG|6``+!?V{{;paEz5ov4~_J2#KFG8Z>!8k2wbIwBR0o zkB4BlL~zc+SzWVZ4re&~?Om7GZ19>(?vUH>eeWdp$7u;Znfst?<6^}R8d}9$_082usM|LD%!ur;o8ij9G2z= zWOplu6FIUL==)Nn z8D{n16(FIL4*Y;jszZFy!CeDHADMu+2hA$|$iw~~w$_F~bCoSr|Ea05Ja`>1tb{J= zcwwiWwH}vj78v2dwEoRl|Amh<6=kz7QevfgmAg03e08 zxB-~}E7i-#jK3L=;2=%xfIH{SXQT(1=`pAc%)Uq1BM(rtLrf|cur!;&2ZMg`!62Ce zimxwtY2ksPzZ#4fN%HdUBAUDb7l^yYkeYgehZvf~C?ymqD z4=@0bsg|$pA00h9lu_=88_t%$7DTY>Z%-U`7or<21JE9J~dM>1a995QLKA;2ngjm zgkvL;@x_7Bmli&3B(+|~AjuhA3o6M2K;}c89_!zW=BQ;WKred!ZGp-MIO<~{aqMsa zXQt=XGp4_BPGh})IZ1j^*iPfs$7&53ONJ1}5K2o*gX7plLNKliClTAD<5m|2;6{=M z&Y%kLI9>|o4{RV*){94aSVT~;W0op|2R0*{{Z~GW2?Ox@p!<#B93h^NfD1kn`21nA zoVP}HqzH4iQ^kY?ExOdZC?UZF!Sp^!KwBV8sgREABxd8DdNu;_2_OSwvyq>u5fk%-tI$3H zu8IhEGNPFj!WvYdDxaRi z6c5~?#YS^?yE)p+%xEd%It&miAWzH5`N%;(QI~H?Z(QjhzlSF7_l-P0@|DD!u+l3 zB$~Ca+Un}sa(kz__1S~>i!}j#^%u!Nl~u> z3zE$B5ty9}tGyc{oo$!1jn9b_?QQ@0Y_yWe z4$Yk$rh-5S*$*Ewct0-Mzn^ZLJU`k!=@MjZn&(0CU}>V1TNSH+>;i}2m@Rf zU=E%!04|t2WQ179dncxFKdu3Vxmi3$w*ZrYLdYGQJ8u(p;v_+Ao5M<9P|=Se>a&l> z^6MZz2wl0Ni6Niko+N|8+QJ+_)L-XwO@$7ZX@K**xg!d^dizK6A1VC>vwu-9Ivr0D zV=XufKUr#e4nrjl&fYsXG9sPaTbo;(UBdUnxz>@X;cKIHhJ`7EtY)=gow?DY3rDVx zBPIm1U8i{FP|5SZ26fSg^fxI~JovOUeBV@(zgKt-`?atX?G@XPgWrqN8vNRWH%f_= zB3jqymyhY0{597X)_s+c3O;~fjJ!^^G+J++>fQ?N*`kg?o9|V{$Bo*~4`U-ypL=~4 zUp(5|U5-^Rrr(I9SaLPSzJ|JQtBDmMhxfZ>d%kfoZqqVwclT-Ia0UWm#>?X3rlL2V zTH)=rd;})j&d+DTD&K{`gBCT*Z;=QMYChr^wJqHw6fJ>IZ9?;vzgOkX3^X>})wgzb zXsLyk8=yYiq9WX{*_dv^L@M^dJg5u72Ccd%E zdde8p{mRSZ4upct-LiL9e;~=NGDP!EFV9cpSUeM2pT-)=wU+t$^?s0jTbx$CbUHqW zMSbW#R`5F{wCNL(kXdK0B;{o1bk;S~&r|g2?i-DP#=CEw+nAT+UHW;m-MQpx*uS%X z((xwb|03;~d~AknUP(vJ^asW565SV{gY!m857CDCV)fVCrz}P;N(g zrQ;PfP9R_X5uH;RWX&r4jLI!k)6FV*@>^)4X=NVE>v$J5GpBMqPJ?fp=Vw0-%wo5I zb~dI8C}Eynjawzx!sI;5J}z_aAZ=G9IcuVq0MlHR-kvs3eNQyRA^#o6~Op|Naj6QtRE~|XdbcNB!hE_ zFxEMI4vTOmh9Ee#odZ^wiun zTH!w$qq~jKeYP2IEv64BA(WS#!d|nB1#TDXUd~@`&WEqgOxC2sTJ&08tgHE}o%(-x zjhgXTwdEDC8#XR+TlLClHSD(ZExDC!xwWjh4_cEvy?lat+;Vx>ZT9;5eTzqYm(BSP z+~P%JKS*PDO=AthjQ!G%#=&vK)j8yJYbl{?MKd1sJV9SNU!otunb8e{ zE~&1Xd)z}#LMl2n-&3j;X&NZ>Oiiqf`Wo=;5Y{u-f$2?IZI~(A9@_x7S78a(>+7{v zz&y0bQ4%54gSLEG`NjsV)Ul7X8yo6d+-Uu~9<;9fLs02g352znkzY)YGYV;Y>ioOR zs9lE#Bhjt$Zaig&oCLlFnuLay5*5bR z_SdwqA`FK9^RD zp$s25wF;vBfUQbZ$nvlc)s-HDs#@?(X#3ghlxy^D)^5b@Tx>)(nrgfj!C6a|(T>lM z@olJ4OPXp_E8t8xEw2IFzav{38n#xzvzU!oTAp2Zp2uI$GBCB`j0)KO83(QmR2mw% zR=}k)niIU<0X;oq0lu;ReWKY!!>f+W8uyMzqF}6}<%QW{Gu}ft!qr)I?+m)IPri%x z;|7zqV?J~IyE~wX7=g4 zpd<|qN2;LcS>u}WgE`76k2bjN##(OG&8|sVH)c=zXOH`Hmrj;et7WABbXTBoE2Lp; zYOGuReTSRjjHwuI#V%BE!TmQdtrE6zUNME&tyMz)RmRh5;nQO*@Mq5ZHzFX_n>ZSESRR(4LrlFVpwuh+53NDz~J0~P$z;3X2&#O0q&4cH&97_YIP5&?b(&` zWpOWwAwT&iaG4E z|K4YNIdX2O$65i~_K~Wx8z|UlX26aNSt(?*&mUGUTVLx3Gcsf?hvlf7kxE_Owk@_5 zKu5YAs1_Te9WfJ#|AiYfG8~CwMNk>i7H~tnZPL`7yanBn+kOF_R>cuecL2};mcwo| z8w+U-IPL>~{mQZj`LF%;)>R&P@q26C1Gt*L{@?|EwwaqtfePs23>L1hXRCsJBC_i( z3d7$SM(7{hEM_yHs9GzMbBi{s2%EQGtf1WO^a9@AbwB{?fq7TDl55~3 z%wds-97EB+x8QGlpe=3NRXXjk$=sRk_Sx;5obb3(p=E(G=HgJ2!pNJolF%DpC6-@f z2CEYXJHsMB!Q{LIT%G|eEe9?yw+iysMq&=RW_Y?w?(m|iRHp8X5aMhw5v6R*c%w^=u$!>A=Iv~b zV9))8hFq&H#4Nhi%vOKQMLsR_X@!o^PrNg~<&v9_WoG5_vvUAe{j15SIZsK}`Gxa0 zeUyEhT0peVqSIF`M)Ty8n0tKLkFvW!%;mM|Q^5S>`PqMUVPAVv<~-B|zP(26>fxOO ztc}65(KaRxjl?{$S!|i+hEVJDCh_;ODI5}`N%am6JB-*WJD)7s#2Ua&^DmUTA1{Gtv{N#{ZO0&!E!Kl{T1;QR{aZbP~QsI7!ye9ck3|V%f5v zLt-X5ljQl2uW{^bYoncAl8U|`^y=^`@Z{Vy-QF4oTRSdYw1WXtkX8@w#vSO>Su>)$ z#D|dIkR*6b2b2w`1ydfF9>^ZJ9Kap~-*F!h-s66fqH2QQs_Dl*sLJ^UUp?CeitgIo zN?{y#0&uwxZe5zbGjvDsSt4i)I0Jzv3ja_fM?@{sGjk zH$|`2{_7K)9>bT<54OR9p90l93M!xvUe*A7URTgf^B|oskDNq3^vC){ET3F}e9qWM z_W?<)kEu3S-UG8doW&Q&vjOm2+5iC?^8m_$aUMTFI%{lB?hszAr+BtL5i}DulrBF?vZMgpg58o$2h^F>;hlMc%m|EL0XU%m z?fj1bw2OcrfSiSBaK8(~Z3XE94Kd6w3=_Aslg!8!2Zt$Ys4B*)RM+jR!^8Tecb(~uO9|b0?#MdVQc4j~?j27@>4oDeb-=nO_aWv?b>%=fuUxll$ z^7WTl!M~&@a$gBBOjpWtlXI5=l$o)lFNXynAy5x)ZqkZeP`i$1fSWmSk-m`j$;#V( zXRQsxBBs!EKy}4G=%pa)2-eQI2>Stt+6G3BZ_@w5LDf#~)IB(zd6k>#+%@v+kcf5v znGMO+#cd+2m8@0~zrNsEm3uN>_RKz*h*cJ(10cwb91w%}YJ6X%j$c!t) zBj~_kU*Z*0G;2g3`>n{Y4_t_mDySa+juXULPavg_mo;IC(sz$jo+k7neg(V%&8Gym z17A@M=NM!y>QmG`Vl>8xg5#uar z4Kl98)2D;g7vam2)gZgv0p^Pr3|@;nF^Mvx>pp+Ag`=&Cs0YO~MA!CzoN>gY zXwZ*Y+Vp!;XULl_SayJ$9J}#X#HRu3N>X8JrzV+oz*}HDT#xx{OO^l^8NNpdnUT0u z^}pNKS%J<^y)e~t8$dx#5V@$}%S0>{H-jo*dWeLF60DyX^sbW_ zo8HkPuryN>LTOG*v$QI-P5@Kk(XM;?!7f4DRnt?FXIz8q*%w`2< z_>ps7D7TtIdJDR=M9Rq7^j`AVlA!}}4?@lN{LP_Un4`ymHR(gTJeecgHDc%@o+JA? z5$Y^C|Dl2c7!wuDhXyzUvAS34j(ms+3T7!xZMYKruWGm|{i=4U3z4;w5&HDUu7BiS zj1`0bQJUdS*ioACPRP+`y_lqKh=U<>g{T_DI8a8bp>D*^m&R7Z7F2c2unR+9=ncxH z1^T%K=ZkKn3+=?lVMS;ZUGo_ft)nsckr)b4c7MvhD~opc5DYO7s%n3C5Rp?69)r{H z*FZpHlCpFIIuK#fTrBR=P^mpt;gTb(@+Tug6|5<9x5i@v`J3Ux3rU5LH+9Z5H#`-> zR4Acso};^04SZn1T_%%^VwZpmi?dCMKr=lbMTF~W5Iu^YJ> z0ydLeL|}a49-zN1E(tjZMa@|tyc{Rm{1ps&x2nHYS+3rd;?NQBWS8({ZQqxG&z}*lEA5LC zML($zu2+6sO8^Yr-!fo(_gEh7{y{mHDM#r8O@sV*1{!FQhzJ1>QD$Zr@{N0O!IUVU zW+I|Bv@a0NBTt%R0Z8pvjx@18!Wrvf*PoP)qKC!yE3(2rGj6siOwDudU|M zqB_zEQZ`@I$zYzS&6aeP$vPfN(4eEQBWE+y23=|Wk%N`>)eeX4L(SghYjkc+LY_Kcn?s%w>%fp94`fyX)g-qo54*pEFsj4p z$joh_XE6$@T~Q@b9O2Ai<%1?$nd}BF^@=B65jEAN6179yPPmJyLLGbu2M_NkJO>H) znBq`Imawvtki->9 z$UZwhSR5F+NQ1l;NmJ<=0x~Jpa;jNoigwO2!?M6lE3_46iHWwvdp>UQ!X6rz;vYGf zJUCwfgP$X92t}gM-eHX|*_us}-k$dUS1Zq@xTa@rgGPn!I-bV&=PtA1NT1Eer@CIv6Gn!}-wY))78!>V{JqK4rDkZ%n?4mnlnHXWtq{d$nUQ0zZZXlh zOwJ#ZOX_fWzNeQf)}eAc_L~>fnrXiTvng{>AuwRlMI{5v1F*1Yv#{3sxPCLmsE7Ep zmhZqmAx1`yx0%hU^k^SQWHL|JWUN-f@6(hu7(txclcdO^HJFPl?@C&Kv!<+R&M zEFE$rP?5S8XBb{BGsxE8oERE0-s%h$u=+XZ_S7;nB#+^p2Qqi0X4+8w!2f1uC@DGx zwhb;w*vk5pOnY*qknUp}9PF99RzQl!SUXlYH3KVavGHZhpdeR7$Ipfr-?`c^uvgOI z0^A0VI0p=K=Sy*qgh*$Kgj6Q4LUWqKnJOIG+Gp?+-ut%0s7vv{t=P8?cOBTuDC;iC zBHae$<-wD?N#nh9FQR=PSYsQ{$jZ*hHiXu`te%qA$X;Jdb8&NVai=yvk9Bc-b#fot zG(Qup3;EUPYkXu@YMXa+?{n{?4Vf%U zn7WqKpt)n&gT7HXsRq==X8G^M`Y#4uj+emcD2?`ZTp06^=VK5m`C1X;+ajYfV=Py1ZD4pc~az4er z4&4OgX(_gC0giw>k=y(NPDG4N<>X43G%`m#u`JBd>6iX@|x1&yyjrzn-`^|Dtb{;6p#0=y!;sp?HskMaa+=0FNBxP;c4=0pe(bn&=TK;8LDCps0*D^nk5gq&!~*{rOTT@MMw%7B2Oss83t@X|Bx|1 zkSd76Z;jLOLpMq{QIaGOau<^x7D`P8H*gg*KMC29(Z)&)!^=4d9s1Z~nFR-M!I(>R zL+6gNtgz}*-TFr{ry>sEox9P!)H`x^UHUeZ9VfE#8MnNKo>yRQn|_! zW2dgt198z@XrZa%dy`b_fw*6po*I{%Gr=>Zg#1gRhPqk-p%&Z{0qSB{GLS~NC=ugB zQmq?KIW>?3afeAs^Gu|js#I;x^`ZfjV zE02W!m+RX#>G*7I=`5;z_9U^(2;@GucXzjUH@Bn=j_$8^Z?#)}i>ajcR$^=Fsk_@) zVr^{e4Se8>>R1|X*o!oETxEt0V@uZ|IkZnmvYIsnECZBt5rf*i?Qk|}JoC~*i8bbq z7zX4H#(VZyem%uoQG5zSftST9ii9%t`45&E?hYe@=sH$KL%=+4KxK1a9jRk`gk}i_ z9%YfXgsdr&Wt=k)G^1qwJpL5TQ|YWwUtQz;UW(@VnkgDrant;Y6U|dUq((X6CPozN zXkkKZ>*?s~sm7KA&9K;(9XricDM=Qv&i1mv*Dnc^eeJugtwp_- z01nviKkW?d?Z5J6UBj#=CP+B^+58)K!kREjfF$w8PeM%+@E&~A7ytfrDI0bnLZnxK zQ{m_&H4Hq%7YZ1BV;&IB%+l1o)c`f{0eQnjZ(43ei2X;fui-~Md1Dro@Zc}SvO>y&{He;#AY6v@0@3Zdyx`%I_j}T4yOL zrR59kJ3x~ThFVi7A}Bmb-T_70#9J1}uv6|4f06$z}9gjTehj z>)GwT90}Qyrb;1)qV?>9oE>nk__MNBqPC6ju@IwWO`u9Uai-0OB^zIQi|c6(mikg% zEWzBtTE)tkH42j(_TrYmHX>XU*fnTP0|xcbRjeI3F}>mZ7*N=xQBx8yR>?KhTM~IX zCL6NqSTV_cOV~lE=c|1)R8%NOr(=9XDshcR2dF*YJ>Nq;kA0CUuD+6_Vfl@_Ca#Ue zV^2vNN~P=Mz7-3{qAbL++9FkrIoT>hm4dXDIraUbElaYlh_EfwhnqRgC{JqS)WKH7 zyvw!mvxRmFt{_oJ5eBT^?@_k@Qq@9Brt|KWt&T=`+!8MJ?9@+R-fO6n)j9^g_C!GJ zWfp#LNY#2$nsxptpU;$>LKM9`4wr~TY}!DUWQN#uzIfgAw`O_-UT@es|2ybu6IRHc z!XHO!IdaEnJU#Yb$*1V})ZW-hUCd3DG({ZSTal&Bpr837g5b*+FO4OKAN#gSoc(P4 zu`IkE>?S)&^pLfp)NhaKz#kv7Mh2x#$ji<}=q-2|V{&}FRiUIVN~uDTW8b~eerP35 znmu!T*YTVq-x%XqmS;G#rl_eIY4YIvnXnhGdn6;auRT{c?!0Vw= zD`hAeXmnRy8@$2EczKtN#q{uoe>2`k|@b%uRnF^upt{ojLY3 z;8CZN!SBx~ZXo(6XW0P|ODKBZa}b9;luNH&41%%*cZU)CF|Wt?)uJzmi~JxxwFvQU zf&e9*>_>g1CF(bR>!dI&-AXS)oaAQ`hZyDlrz8?<-W_Q@H`c_AW&tOb?KN0Oe_lG1 zsHR1-h84pKj3NA(miyy5_4Y%!ckXi?R$@Yw!Z+VmmAuQX2sW=OxhG$+zuh(A5xVH)~jsd<>Upig5}X-wV6}=#Ab8I~tYm3-1WA+C}h5pdS!+nm8%)!Kct4 z&8zTDL}2m-$za_yZb#4u5QTnasZ z1Q#}g^`LlzXZ7N_Q(Iczrm1;eccS|!q`K@Y|wDx(Np17EguzQYmou@pe; zl5gv8%gvTdF1ZSAp{ijvIj;vWRNyfWR^W~4r(OLp%UloI-&pTa5bOVoO`=SUgD&iW zD8^o#X5c*N3h;%>U<~u}8_WoE;p$DQUJ}4A2~Bx`u+TH#0xe-!1Ct!j+?(gjK_O(C zub8KKpdVB{ih1%}4;SeS`Vi#~y8<~Kp+v}7B5QMQ_ZQF3Dl%04iT&C2rPj*YIqdK_)r67IRpAgQmEg9kE`pRAaM$D}7$-LemDpt|BEtCbT>XF8y%- zR!Iya*nzcp&ws;TU%`nYt6&!z&Hq{30PlFRGJ9(t$rcj=tmo!ucK>ewZuI9T_Xf7= zGiy-x+qZ9PW9ueuFCK^$;@yg`?PpF)z*+*xsicViudnukOH{TqY$;y07_RG~%B2ML zZe@@qNGfABdV1wKxs0xXYdVst3cKLX2#*S-d>52>`Z&E~gh_Y#%<RX)1y2?vmb{KdPZV-X5c&% zz1|?s6Q>PCYL8wWKGpOXB(sQ9Z^IYYg%Pw)+suzb#6^en3Fyrdnj=|;g7I)^nJ+|* zl{n^I;G}2eXtzO?lEd1UT2otF+L>=&TUl7yoCFDq^#v@=#YU1{kq%dR^Cj^75OW-8 z)sFMlrZ_IFVgF=>ej=1DA3i*B?tm7gV=gu6NbO{A<9uP_KZlNHqLv?|i zICtjsBhfp-(mM|0?ws0~=~}RiOCwk6ritk3ozcBuNnccPnNRYT?A{0Bf6bsqRKgK% zRu8s!Xc{875)JPp)jZR~S3LpxkWtI@g`l8iQS$-^uY<+8Q|{=Z5a`f=lsW~S+>-TY zj2UqYF3A<%=^u^Jj4eqvArAZ%0YRFTtM$sh+LZ_Y%r$ylR@W~F2L%H)*kRzFU}9X{ zTUu&$=U18vBCLM*XUj?D-w9o8xGjnOOdz8s9+h=sCIuUkEzIR-KJIO?!;^{w=?LlQ z*dg6d?E-15dK$j0@>+`Nz5vg>>$`y;UUzARjS3w1Ff#J}Zwzn1$56LH#oqY%D@^Y; zT)dAMN*yZRb*}sR{n+N@xbJXE?|XtW_R?Pj(TM@~44}?-y!l6a#p!inkYQH5F$pFa zPkHV9X=@Z06k+9j6R5vnBeVh#Iq%18h8%bfw{-4rD~l+F(l>EYrv@PZ3IizleF?tzj~ zPNJ%n(BOl#e0gI#+xu0wc6u5w5M%(_xi^I{q zWO?Mj%DcEt>cbf;6Xr!=DKg%fc5>J6s0`9w8S%(0hE7bsc+r=|_MD9_=ts6Bm2US2 zrUhhlrwnZonr;bC3CF7mGqw3wjS*L1N?r5lEDTZ5FH;4Z=_QD25t>A*2{+a9F|Fvu z2`R+d>eU!H>y3t@er~^)FE6R3s>0X2rvyFI0|Y%8*H27a*RGF{ND;gA?SIw!B3Ia} zwbSrgWJ$^3ho#@0c@pGEf3RWxLNI|6K5nG&L!2sGR3@@U z!@RCCI3-)(3+05m0Ov5Gn2Q`~`R;ILlUFR6x5~ovg%k`gDdaE8ua1b2MPmAePA}He zmEjOAc0~GRgSjlfBT953KB|eYj8+Y@jQK2&Sjx0M-23pOtph=;ME=#>uTPG>ow)g6 zaAG?lc$qdyDrtVP1tcey(5cS>^JV9JqNvu+-xfa?_((_(W{?l~1(AvE|4|+fs2q4* zp2l(4-K98#^CIb&&zA|1553H~Y}49h9HwrvZ83f^N*}!%g!0@(!l`98>nSpiV05ZR zHeT(jjPsyQ)}O_80(gLZ%hCk(LSgGmXKL`+=RnR*ltM1~MHlkL5|f(o6*Yve2EF@# zn0u?Zy0UD07!U3eB)Ge~ySux)y9IZ5C%6W8cM0we!JXg)hmWMXZq=>s>aM!~e)t|1 zzw>a|bM3j-m~-s2=a_3B&;Zzyrc1QN4rrMx-VPt=_ z1{E%vXV2cQ9`CL4?nFC&DBHEEWQp}w#ll|N9X(Up-J+SgM)pI`X%+H>Vfb=z3FRdp zXM%(gy*hmbgpOSi_ZlM;$J+Jzs^d)UgX2v2++iWh@Ql=3&r@Q0=_|eW+PQwF|HC1d1twas7iS^OZ*iJ;Gwewrovwc{Pvwm!Y znD_|nz(MYzvLtL8`iNWz_&6QSHP3>!p|D5$n;BW)^>OpJHlQh<*d4qZZjrVEUew$HTur)Nz9Ze(?mvFcwLAFJ5#FV6JSbSD$E-ucIx%Xrx5<;Ae~0|=1T`F+)U8Q(3-dWx#ReS%;{Zp8 z$IwHhbcAtF?ieGG#uw$3aKC^sM8tqvg`cLp(k7_;bZWcHO8VdEVjs zek5#8o{6l%O%(p4La3V?pr&JpL*%Br%=07uqW}vBBLj4AIBPA@=v=*yn1{_BG=@Pz zKFYV#nA`TS&(U<5T=---J{jp5$x1G|-!Y8hx%lu%p`Rdzl={_HX)rSaCU7sxh+Mz9!P3UUlERzPlTMX?2NW;WlDLaN=H-ZS=e@Afh2Id{M0A zbkeV+B(gJ_BdrLmAO6xK=NTCyx33eLkO92z&u5}@BZ41Y^#T$EkdJwuz-^q9Fq5Y2 ziKX9AXC~eX{~gk;jWI z*6#PMt%v2#`bU_NP;=<*PA8@jk|ZUep|QxJJOrqj!yG6O#h0Z+-pMaRI;pz_MJfHl z4>uru^FSY?4!!n}9r9Va#?N$Xsv({*B_$2R$%wrOwuR-FEKVtf=xD3{0^A?@hg&VSeu?_viqez5w7L_%AiSO2I^B z#=%6Rj{&DAJ_AnY?E)N{;Pc}5>%@)};UK3vF5wnPU+>QBoMmHXJ7T6?9coM_$gER( zH6f^`$>;>ndp?ktp^Si-p;CJCu_O=YOB2CZ=fzjThQKPgi)Ij}s` zLHK+a4s9d24sIA;GeGhL-k)Ikb7FGV5nwZ`cpjM8g{H zTf3>5>W4~bT|veBW3IJP*VjbVPWR>^R3%NAG9?K>;gx+0 zm3fUK9q^LM=@h&EcKwu?Y}ZE}h{f?(5)TXhu$V z_X*vFJTAJit-=qIfOcUVdYzZ8EhF|Gr+8IN%wk>u*Ry?a`jtbDr2K5gkVJt967 zI;YOiFG~4(BecDa-wGQaPu z5x~>vv~1O_Z3JHeX~rQ3{Xe4QG}(1fqeVeEP1$OuuBFd9Cl(fhUBoYMt7dhX(GB|GoauCurWP7eylQ>htZ7_3hHA&Eh0U`6;k(^dhdh?(jHbi-Vc&W_l&CzVj@gPmhe2h>r2=B};`y|zS-Lm8Lwj?!?P zx=D0{c_iKF_4d6kQTF5+Y(1j$c=-I8d6}8+;sa9psqYmXv8C<%2-h;4g@e`=NXJ?{ znaMoi+)@nNrVj{}bLO=g<)6>AoTb)@Am`5BEI3H3eorhU-E@m-aP zy&}O&s$zy}$6v7_Cw7+`o=Oq*L$#a>EZ$<`fuW0EWD%yWo^;{-7K5D-hZN6j7XdON z2H?mBM>RAi)7^PUV^_Xt?BZOQvgXVnSj?59;RXzyUT;|X-q$ahuk5|#0kttt{@eV6GO`yv?jln9F0itlwS023a+qEf<3-E?kU)k6EPa;H&Pm!06ho z!uOIR*xM1p{VK4f@X9fLI)y*oKj9fCO?pI=@IO+99h3B&1=&}z8Emt-(oD^BLa zonlR7my&$btT5*2U()!iiSalaC+HK==Vh3cMe|xVWx%UiGUZj$<(({W&||79E*n#x z5@@DwEue<3?-!!&H|4w83Q{sI3i^SP{BO^;A zMkg(KD@{c{Ays|!U&x%H+bG?a$eN+yv)>gw-f!a>tETi}9wZu~^7h~IAIhV)*Cil= zr%!?N*QWYP4hPsSGGvo$$x4b3$pj5o`VK$lEP*&dJkpR_0oOphRTzTJF~S)tKq{U? zDo)~9#{qsRq%S50Gy)&%0b?YCBPY#;KpEw&=SDLx?h^zb+X*x#Rn$IWR^-9?;)Vhr zwJK38fdy+S=>=%Skl}q9g9h-M?|!^rrmBo#)PM6E`CF;L-&cp5{8}sUqYuH4@qbr` z>;I+>=f!=<3MT7J>1Cl)>*i6#^CO|Crj)CstpB|foU2onrka$^zr3f1^6RJ|NLhX{ zVdI#NUM9nC9;PBr@j_#7FC8?ZB$S(c3CRbx(2!>(TA~ zh(z%u?vUd}V?52Y0|wPfMEs@$r$fiE^;=cZj7!nzvM@C^v@|x;GuO4$Hya>9wn@Q; zgW-sG1#XX9MRv}P(N@={u1NrtB`<&`Pn7q~p{VtNAymqMP?7^GtW~h5Q_=@7*dY;6 z>UG@bzb8wP{$i96d^zUtt1TgAHzGMEM&>+1Gb}|pH8Lh6wrg(>0~-nlYwP5s$C^!d z56WnbZcO4_0`zk=A>Z~s0Kkvc{Q2P@f0+L!5?t)f9F3?gZ44~_r%K>otmtpM=Lhn> z8&GsizuEi0AN@r$-%2rK_u}A>3v~G2G2b;yDT<{9tv3a$xr#?Hmwobm3-+V79?_(2@=J3ebYljFR$E zeIo(PP5ScMePa{(5)M)Gii`JN`~3VeMtAz+MxQv>{BlQYMl)uwXYWo%^ZVKawYb2o z5>w(01Tu!}X8Yo%b7${rMz^N>GDb@k+jD38kR4+DQ`h_id|(Ys42|3RK^$@Sk)`(} zXj1k=!;eVz-Yh=7{TO7DZK7L{tX`&}nx?K;qVop9jBns^R6(TEG9#lBn^Y21a*X2)D#oo=0Z(ZrIi`K*(|5{Ms33zd4WuiLSMJMcb0L| zJMaXV9vb-4b_^$5L^^-oL%kenJ)5P4oA0Vcmn*;1UXqbdvh{9`g??sBn!G z!21RO!ME}EQ;!L?h2byVHU6ZJ%g<#y{I$DAOjfFj{7I5dLb~c(i;Xz-?te}``q0Af z7>PS|eSnP8Ygm3a*&k?Kce%hA|39PE;=hbm@gI58j11*xp8Rn4Yo7cO6Z@~S>u|z6 z#f+&HJ>dej8UfJNfp$H8C)*ZenRW|#`;27xObZE{+5o>y(-*h-!3OM+>rRbG`$C$J z`7R&8)sexOx6fOEkHrDXL!ivU1(lwNFklnEf|rJV$R|VUq4R>6+X1=+S1bsnRZG5%GW{2R+G<$)gY zW3t@?8>gV}jrYMbm4ynAVOuas zLEtIpnIYB8np^ZDTFj}}&Y6F-!p$%5XsC=)T@lpyx}U)T41srJ#nZ{-^}yzk#kT5j z+B|Wq*0IkSKfS(8(39*z72!|zrOZ+NwD6mDP*jK@GZvaR^KGOH0a-xsO z{0a(Bo$;N4Gt|jz#yMQfMZFvLEAuNSk_-$7#;ODDpQ-@eNak4?^>shbYErycV)ZC?;`^tztk2JTqY zraPBszO>{7I>)9acp2m`-3iuA}Q4I`pJn29rg+w7*T zMo?P-v63Lr1viq#bR!bup7iaRW;1zgpJnHY1M>b|*u6i|)08|QJwzRfUyYDo5RqS0 zfgkXkUpI>16b4=?iurMXkqZRoDT4DV1*dJNt!YUv+2E%D%x-dvG^x25v<4cE8hx#eUK|Kaiut zfVYqd8Icaf)JAY=Bj-L>xY#(}nwr5gB^BgAl>aU)+MAB|!6p#PmE`*5On^kVH$Sm^KxynkuMQ9aUIA%DC>gZ+^TDhAW4_Vfaj{UQk;s84+f!?6j=-@mNuS zs+7(IWDX<8fI#vq_(M*}ctc1>FhLM@+ge0Bn-wb;V3*lUB>Obvp^PZ3zlsB8@c zVaq55D@aD}>|tKSrB_SE9UtWc9`gp=^GZ5QwY=*N?@b>955{|^KGKN5J=40M6sKXx z9!nQX70q5#9F42YedJMsYp=lO_#gn&e;}+cY121pGvL^PGIJ|EI@wBRaMmxsukVDW zFVz`Z;ElO*uV=X~QZ0Zp7^M}KH?ZZnZCA+CH{~66{KQysR@;=**%$e-B8Ql%#R6kS zhv|BqF>`_GqmEh7OAdPa^d+ekr;Y~oEHjvCt6$x_{^d>CZ$_a}Bs2XKj=P&J1K?UJ z38&fWELfjg%R=`Lx3+ICc0(^B#V)kSF5b;-1;bne2Ya$G%8JVW2A@8ZBL{M9kQ+qxti(M?UlVa9ME?+QFAvD&A zt7%oJd7P;cfnM4k!17X#;wCB5_lhFoDQcxH>SQ&^Cp2keOtu-GQ`u3b9ImGv`lg+> zqLax{gYVL2%-!kS(P8b?uXROrJ9^gP;`RD`B{DyX!?J&I$k|R*={Ho%xbL)b`LM7X zS+^6(adlsQ@6O!WlWyZi+Sy9g`MUWOD{?is0(F-O`f%zOHU^qB2-(tzdd;IoTT`y< zDT3#%lH(<#*FO`OWCGcmMRl^S!dla5+twJeu9AO7Q|j9B<&t0Sb~E=SIb7IFmC>s% zg-5oGM^4kObn#N$?)G#4GY=KETf6JiHPFi>(DN6+FcwtRubPw3^L{Tbs1a?gx=-zh zFU^S0fpKB$394Qi)6aThuOdVQILQ$@>R)g)ig9#QFM= zUkpoL)Xn;JB&fV8zIA9XzbYMm;SnD!8U|5R1L`c3S2czqJ%%9XAf)C%Qg;^8NBklQ z0jXfrG=!md6iWX=K7G6|t-^E|wB-`yqnnX_GgC<$Nx_q>`aQb9J&Hjf?q__wqFj5g zK&H;zqN*)fyZ+R;Fp7diAO$0SA*0<~@#DDRPX&p=r4$oo#clGnqOz@|Io5K!TH$54 zlt;}jQ#p@lnQFBMVQ$qv+L}X@4a_vB)l}Sd))%Qs{VEv}AmtK>i$sZEiROcouIs4S zuFvBbqN$swwTTYO#1AS;*X4KJ+RV?8lt{8lTU-s7`f;cpw^ZvdU7b#cjvjDSJiO%F zZ;R$kv@1L8-J5ky-Fm)U4zna_tZRO~n!gk{qvW|dy`(rRhtJT6wbc{awNX~}Zq42A zMG59sx7*uBQK2pm5G38TN6)VkH8){&qWqLRR6zbkR_Mt9>du4$^mCIW2*klkPc0lc zNtz%v^%Sqy5;E-+0_jIiTasiE+>cn`N!ZZio@96LlZkOTpo0xRL8#r>9grr2;@-U~ zO`o%f4I;zd!0$iG?*N0{r^xXckvXzK&Uk`mRvu6)UQ@|tXcVVVDhv-NswECD_Ycn> zF1~y_cX;c;!dz@9RXYAoX&0QsQHqG%X#A@n;20n#mU6`c{E@mE9K0 zf(ih&GE{WGWI+fjvWMQUlUjFTrV$*;wH|-hhC(^9$U$J*JToMB*(n) zoNi-huXx16c~bXY#FkGNW-4HdOtQqz+&P|~DrYLSY0F-^svcc}M)J^?ROpqx)9jwS z=_{n)k90DgcIa_(Czik)&WF-J3eZ=I)go`ISvt;#rdWD;Ix}gwiYTCw;R^xSMfdpra5fWR{?8M7fnc##11cy=f zT~xxrdwZ9=1~j>?rT4W?Bprk*WZk9QUE-iQ8=z4uX%c*TbUH-Ys``YxRb;O~WH%9x zv6VQq8yv#0H%`LcR3*==X=CHG+n*Q?@)>P+o~E?ZBX(aS{QK9&gPle+El=GkG??(j z`TiTJa4rk9Gb^>+Yw8P2Rr|s`au~^UWPwnLvoilFL#ar0^0c}7yZn#p8(EpuDR7{^18sB9- zvxdy{H3aa`xEtFVE7?9dxhS>vCypou+fQH91}nx^X5w7NGPAaa&c3F2>nXg{pZc{7 zLVf3yqwT1rHL=lKs|_US&~g37E7uPf_PtHfam%!N%g}BuI{eXF+0)9_cPkR~WCcq4 zsWia5BmeXn@q1nzR2~#cGMYNKn(NjC6pduko~PRIOS|JvmXWx&nlNei#~ zZWEPBI&7V}FV85S*30ko6}gj&a@V8K@03QHbp|El-lscVFsmQeqT+MCr->9ZNxvGC3s+;2>?tZPW+vbtrc)hCo?0;w<2dez4-(6oz z6m~_#h8CLXDZ3@&J*7QLQJM(9E-V1H4l~yFzUAm+i5MkUQNm6Cm+}4~VyDY-&VJsR zGLU_hOd5{6?bpn@&Dx57h?Qi>PipSfE~(izYCSndBr-}k7|-6#ALs8EQXPsCEnigd z+)dq^Xwb(Zaswb+Y?q;*DtXcy*9TfYV!M+()1Y#yIT>p>JDbtYqj7-Kq1^Zs2k3kd-PAVX!Zdj%;$o=aGWi}PW~|YDy?nFLWB&Qp zF6uiD7IDmsPg^>Kp6hXAkINbwH?0&XrjnYnlGTh=-$apEc}CF~s;NpixCzueHr&)F zxEbxlqn&`Za^;WP1I$@#F`Xs`FQFo$&}XEwjwn0V$g@^tx?;3E7mD41-#{0fQOTX- zi(fMNzqbZ@e4^mIXzzg{Y@>ih-Nhm=edI%U#1Fj^38Q{0K3J~S@4wi>LOfr}LOydV zzw4U_qj|~@eAxtbsXN~*eNbSjO+aZz!yBj&?1W@{JdO#i&6&Q+NDpq|24A~xoiunQ zVuC0D#+!D~n-(jPBu+LWGpZ+7v&gqpsk8Kf0#a|L)c%x+TbW5>Bc(jqKO^kAQqnVy ze1Dp7(oXgnf@AG@)e2L|<147hS0J+{|Nl!DVnjdRZC|?|lTw*FEVhw@_-uR)kp$MQg=3bg|#z zSW;5j{c5yWf-pHQp=U}d$$_o>J-8}}C(y|g!+E2&s=G5F(uQz01VTF$bu2HW7&)4K#vN_x0kTT&+Jz$9*!zP$>875tj`ZXH(P0 zN_dBc_ul8y;ho%;)w&T0{U8Fzc<;!gQE*Hvl3R2$&nHUfVCu)9<;e#pB6Hfo$f?)g)84;J zOGtGhPA*R~OV3ptim!mg6I-3k6+=%%-r^Om{>%3VbHed9s zRtUeDiUioUGsl`SOW6Xrjs>X%vX`bJ3`$9H4sz^dZqsMxnv$S6Klp-*97XdAhr|_v z&{~s;>HBY27@^Ybuw@9j6>{AH;<@z;f(V)E+nx{bq@32v-S$jywR6XX{*#8dsd`}a z1VsoobnLc_^Ki;2Y4ClIUDJxGJ1MnuAXN?P;ja+gl6b51%x~h~uIUAmjD@b&Mk7A9h zQm`D|Q^2{V?QbLTO{ko7_|(#vVO$PLF=)>0LZ4%}inU!=YKrunLEIjhsEnStOJUdq zP-q~wV+r^|hjmhSaSW_O=+0;{Dj$7}NK$~jo1(WR9lSSu+ehjKFnn75ee{a4@1RlM z&^dIv0T<`!q4h`#vv}Uv)J~yV^om7yB9Q?k`(Srw^iBL(IdD_$lPwFtsvCFH)koWX zJKKH0RY&Zg)^qrWD4dfXy!>HI-doBloUtodycvEEDeeK6Zg~12GFXDtejgkI)(HG~ zSOOt-Mqrn@LY5E0^6$`1)d9n`9?mZHHY1D9Jy`}yzJ-}7wAWa<_+R<3E@L>vI~^C#Kg zbiHF;OGT@A?!9)xHWYPJ0x8tqvG_4<(O@MgOUq?}6W{EC5BTm*gXeC6msK2S0I6L= z4x;WVFUdIn^=ogJ7C(QG` zrIWM3ofg$-YNo+MKr^)zNsS69&Lkt04$NNT1kIB>03*c8YuK`YVEa|mrzHT`)cZ8f zGgRj;uDS0t+Z0#(Xq6oRI9Ga`A^~ZIJh~t`lHH3)6(OK1_{=KE!qlM$SfVrLSA5L8YdIvUx!?F$hvA2~EJj<~z=|0PB2gntpOnPSaXB z$X`?bu4ml7wC%XODnxbGYoU!7VdUA!icn>~ty;D);+~;O zoKfj5r_6+iJ%z{t;mVJh&6)O?1*{;V$5SBQ;-ihaEOf0I%)x_}4k;7zEom{m2|aD` zE#2=_x;9ZdvD>PUPG&KPZ42F>=opr!=1L=?Jxjp4>B7+OuwiJcj0Y|9)O zrUfm9Io)=Q38PK3>GAY!gr~tP(&c-D@%3S9AP}4@MW(VrqT_5enV&(p~^$oxT)osL>#fa=D0;+Sk9=Er!vDC}JLI4`B-0 zt`D3Lz%0m^KZ>moPJ#r~T#l@pF0>{D7){a4XeYdTFRHo_WA!&$@`?}g-W<};-(ntC#Aphl`r9pJMFeq0e0oW_tfDu| z@m-N80=GwLGCVEXLfL1WrH{`yc))E8(-b_L2uB-~BlM;4-?{t2U4sCz?}aNsc%|>^ zh^K%$^Kq>cg~* zqXlmO?Bte%!Od*d^x8MzXEn_5Rccf>H2P^b>RZ`>TG`sThY)8$LXMDV7U2St#XWID$D3qQi^<0x54X z1CH~{_7yIfYeK7nKnN6|bZ)jfab(VL9$I@@8}ZDaIt?muY>j>UYJ(XIzfCXj2GpA; zy7v!SWZ#470oDrAs?77&Qf}*I2_~s>3Q@A^5jsnq1mJdgA!#zuC-t-^U~uomx<1RR zc0$6*Zr+TXzn!)Q3a*Z>%>#~suH6ZJ+wKM059aM}n-@L@=BouMYPfe%=+YxL-RW1TOefMs$PN$1 zaU135o8`C^in?tm+-)<|WX!hX$V4H7f|DCWl9RlC{@q)3E6uYuDZ+5yKc(I^r|y19 z88{P4;QY{#U{-Y{*~=jV&p1iygmJ3nKMu3caj~P?}lZ_EKi58ZHvQ3DW>!1dGp3X|<>nLGZW6RWuz;^+?05`D;>vx*c&xF8%6;AIB$C=ei;*RYv0MTvwf?+-6PBC>; zp>}8X=I2C;k7J((YNCG%BPOk#HUSaW2N@oW1;hBUnGrWc{BTd32H*0S-3N^)GX_w^ z9n=iwMqa;FznMK$(R2+_n*1>;LMv@J#37rnL6~jKz{l4uRM1UO$zQs(^s8I@d|Q10 zLM`7B)_llELtKK5`%)1u*d?giS>KcqQ)USbb!T=?h|xuZv0Vg~&pRn>@Wk8Ip1_WA zTfrw2axYyuxO?MxciZkRiuHk3atW~EtM821yZm_AX{f_|e^=g0);=^tKhhUR)b0{} z6hJ}?*gCzd2$f?@mUeBNtaj?Q?^F&EGG`2%dgR8`O=lYy3f(!zAvd(Gm|Ml~Y!;R@ z;P+9@c`@G(EIE7EXP^+f1Cel1LOSW9t>1Nx1&%w(2g(=;{o;k${WQi;C+k?*R#%hPS>_!vZfa*C1z1QD2yer67%LcWZ@uK#zN`Wg- z-(e2gLIaQVA4R&OolL`(wBVfvW9EwZC6e69f>iL~fPqvon4ev&*dk`n`^y~z&bn8@ z-1@-W#%S}F2ZwI~@{={*Gtgq<#mD@Te*hOXWhBlq&rZkn0S1Hs1-$hGwjzK9 zvHW7~I=R#Yp~lLb54>Cp5uYQ)>%pu?UkCAJl6V@*&=d(zKm*v7O8WD{cpX6x%sG6D2XOsB$X8*>SEXC{0#`yID+%=A^|-*+ z(YsK2qBgi8Pq@Wxk>LSEY;oXiX*QYyH%yVCfXTSo!xQ$ByJ={16ajNU_`swfVO;!b z9lIOqq3)#4VR#(+pM)dsrN9ZD;Q`7p0Z`8|>GoK*U_i>?gaB8+FZe`HyFYcn2onzq z2aQ31oLkY-!{_GM$xX7pQ-3LEOdWCkY>$H`^<~T+$2f<4-lb6YJd*)K-7;our*`JO zOKI9WkH8%^J!!l);-z4FdOkMvybMl%`%B7%_=RkP9#za4ecXL?jmZ>WyRL>zybUudx+2^F1N0 z8+_f>xiJjLszk~DTbeahk_9&$d`DKIB~InU$|Z@r>mUstF~v$-iU;BckOblr}`ys4+zx)3iX(0zB@QaCbVKtDsUpPyT^o#a}@`g%khfp;GuUDNx>JZ zWdzTJPc{QF75HNe7@{aJT|Ud;Krg@VIvqzWD1%xpJ|Mq1NfbjSya{_Ob6E)zkQB*b zAg{j%n>QhiuapgyY@PRE^uhjypqDptL|!8Z{v=R|9qp;Lq1;yNuyuZ{W3Q;^0f3*f zUo<`;AMzU`L40E*X27n|a%9XB9A6hjv5Sr>DYi9rFO|X040S1ZfhX)3ux^10>^<#p zE>TdmMbdUm!xm!r8CezvdLGAW(b)>Vhg2x7ol?~DwvAbMR(wVrhYiI_S{0^7u$r}( zod-;4QFI(FyTL2zAEZLoB(b}!e02W|>IOxh9+W-CneN%Tu_+m&x@tws zhjM__lU}gDYUMMi2bEMOjtYG1cCyH{p3t&>jCv~=t|Y1x0Y7r3Imgx{F1BUotV%R0 z3P7%)m@OAsko_P+`t|!9xGCf=-ZP9GqNRGw24Ftb?kiUR0th2+FaU9ypULp2_ACsh zts^Ni{hUg$Zf)N0rI}k6uFLX@k;@Utj&D7_$;5}!!C%RDlH%SDJ{g&f{h(zAFU)1U z%xH|FdjVVlPJ-PmUB}@;yF`zP;FXrPG9LrXn+|-}r4DCduPW7%n~wla+KR=$Y@cqh zwlC)cJCML+7sN`0Y?}zTP4%8bz|+&9+$g1^X4<9v+T3?O@r5al(UhG@$A%2o+1->#ZnSQ9J5G4Y&eyH*y4==|e*$$1~ z$C5Pu{Gh-QO9m#&qe2YS%Y~}D{GfgkrZNEe-mQ2H)U4U6n986)>vFxEC8jc2&0hXm z3svL_y~OsT>;-Q@Db%XFTSQ}S7y6ZvEHdGGsHZv7qOLOs&++}czJ2q%J`nf7CdwPE z#Idw{@~?u*WLYN-Ad7={eS;v}I7o{{cMgh$g?Eh!GcST4UNz~oirwFSt&k7{Em2`p zh!+3U!0!rWNm_Q%aD-B#{2a)VV@v*wLb2=EFV3b_O@Gy1A02A~>}Gt{q)I#C=S@41A{W zbpZk}Mf!7W$kTT0#Z02HC?C??m}i}Y%B+wWDFs6ym*)K7A7qBapnG1KJ!st~NWR>z zKR&mhy`cT?(&JAPW5N`aor!vkL!}53faE`kdA#h$ANsG4bYwN4#I&p8%UVc3Zft}=9&S4 z9(oP_eTc9;+{^^ORIjSqBq7oJ_pCXR&YnRi26Pc0LY7kOSYWFZ|-?z`S$jUMFE z2J^?`=HV-9sspX%j9(V-k@Gq&^4`SgN1{;3I)Txk}2B(n(&G+Yyy1vbNM6%E@Ri=ez$r*>UiI4nEN5Ut=|9bL_gzS zH5)%p^ZPOWRWa&cJJGM_H_gWXFHiLA@=N9VN-IUfR{mbRsK)nTOY-lY=*Jh2JpugF z{lADTg#RG2ApB!}t(B3CD}#tJpS-A%ki3kzs6MTTjtC#k&)WQ*H-XHL@dtm+d&dY2d#`AuptC;$q3gI1K3000`MhcEJg=s=GYuCNIdOpLml z?3d8DpSU-GWw{NZ8$ly^X zyZrB%nEJy~!#324=YNC@;Vh&j2cax{nw!@g``K5~lJ>BJ- za&-@8FWA`PkM&to8wewmg;e+mYpJ2$j=T2SHw9QaHT^xsNAqYM&(dB&?o?2bfoQMw z(mG8hDg|zv$8N#eC>Kvq9$#JWUQtx^FEa#VJO7UvrV_W_I7{)rhKsnw-B!ew%2xR|phuV9n<#r?2gP zRM{}ycGC8A$+^4U>5cPtXr~__q-0}L8sNV{IPqVE2kmbd{}cHAYm8I<y>3g0ka_cr+dt{HnHMn=9i&WbIHVdSHk%mm zS;#iUn5L=b^4dE)X%>h$IvLz~r1gY!3^WWhTpg_SRg6qDY)sshj4WjJ2fQL;#@6JM zd#gZ7!WxC{*v(Ak{r3ezLnYj}{wTU&uP^tHJ_9>w(6ZTxMW?^dq!n**5P-xQ(B;iL zAKwPc-}TThk&yP+NXYsY1=;>$BwU94#Vv^(3|I2<6k8G!3<~@X3eOY~Ycp8>obp=! zPwkv>(5u^PA3P8p>@VYyBFGHZ9GsGy0zoRP@x2Z$9~%{C+HVK*hgKesb~&DJmK9S>tb0gznSNA?n~3 ziWQ6E1KR|}-bDx!-Xq3K!c~LURa6E)`F9M1@-KVQ%-Yb%^|vVWAHxGm28(X{n?rs) zMg5al^iLh~ixmeW6RWrI;GjeQ(-HqJB*^`8D75_On*V zM0^FFjIgntn3o)pV3t}ykwTJ=wONdYYpGdik%~`eutN%ginYFwr=7W;r#822Fm#AY zno34W5=NG)dK^wxDxywYYWf>fNznjE;Q1k~owb9O`+Vc}I|ThlW$k}()?ZiF{zZ~$ zC$3|{CQV1BNG~EGV&K9iD$M3U^$(c-zmv>Ax%%(Z&yOSL|0K)(LNcq~0QXh23@iJM zWQzYQlKJnA{DEY0zTu4PpF^vYyp|}k95OZ&&U_Iqz8^Lu=%ZdE`m6l|o{E*qlN#x2 zPtl0e-l@CY-Z-nvfD?r%|3aPANLEi@@KVwVt9FD4bc~&Yu^>967Y%& zF2}^WcN{9@R2U$FnCVtz;m;TXtnoc$`{7Zn0iM23OB4s}lLxd43X;5nb9S^QE1q=} zY-waeBuM#Eyar0809>pUEC>cRjY7$%-pvsR$U%t?o<^oeZ%~XR4izrmU!xyO!;ZIF z$B6GK zlF}#kQ}a#^lc@EN)<(Leyl-bLkA}?6x7Veeae(0@LVvt(8~Ipwdw-H>@h#E@jW|56 za=UqC?)c6uO4Z)H%0VX4VBkVdGpyW1*v2!Bt3_595%hT0jRIL;5(e#;EWFU z>YVy(zXIlIuyrFE-_x`WVR~~@%6PXvVWdgKA!>|5V)?5F$uj(gv{G1TQ9n|IYEh^u zenOg5$#HD#r}2Ub|I3F(oZlYo{`lDVPo(ls;P77~m4ABuKce~vvj0Hr{x_-YRH6&| zQ&Rb#%={Cnr2myY{kshE$LGjDA(dwTJyI$Azewc+ay`+Xkjf2PNw?o?!hgiQ(WH6a zKP8p_$wPl2l^kzT@5lJVlKe}q{Vz!+RQuKp)ibn{K*VbMTKotV*D7VW)674U%B16m zd-WjXG|#LZrf1D#aJNAFVu6 z4uKTEVj7x(28>a{pg00RB=Lgg<*;*Z5TpBO%7fL1I?*X+zI_u?Fk>5IcG9evdMI$% zVUJhq2@aW9mhY7E?T7npiOXzeyR(30$D1DyqO$)Vb#EC}SF%M5AKV>+yA#|YxCVE3 zcPDso*Wex?xVuA;;O+!>4ek=)k?woD`*wFax9{t3jQ9Q6zs?xDYOkuZs@7a{%>@RV zdocRpH^Irb>m``QcnI>d$xNP~KXmN*vDqAcRgw5kWKR2EA-abz`So%5hM@H6i5&Pm zL}>HA>cg*e8G=3O20$K_bX5tpR!z0UeI>%{jr;10{Ny{uMTc&KS0E&3XY7fWnw9+C z=RF~>5H&j45D?N#-R2-rGc4JNd6r3`N&9=9l0?{#PqF!%CnNAE0c2r0zwJ{vM8A}o|nsB zo$BQ~su6$NP|U5Y4nsW67@fG3^@QY<*njC`d`L{qh#A=0#KJ+w$64Lq@3j3E9GkY& zH(0yZp#9GHb7%5b=g)hV=(9&-t0; z#1v$mGQpFeB0l6cM7c7U;w~-g#XbkIQ(MXKe?d{D{EOUD574~PS(KofLn&2 zlIwv2mulg@vP%=6Oqh|{&$~5?eU$R;t1Q>Bc@(oGf4~%s=5q&vA_1j)?Y=@3ap?5 zgCVO}skJPG+U7KvX7>HZXR(UY2Z_exLcvdMUiWDB6EmJ!rNd)jS~Jv4x!6=TMtTS^ z8r}v05hkkckD!3zF+@`$t5Z>cHyd$l^n6`+YV~qb+vALhm#f2O*kRZ`?rQeZu5AkB zZ1WkRABM(a6z?kxQLb=R@xV~irkVGmS-6nHUu-hrjqc}6cngArZ!*c><^!+WOi))j z%q|FF-qV22y?xjt5AwqkfoU@9pAT&`?R&wjs%2~Hc=jy%m>7~wFwe#&p~Go98u_xx zw$6}G)i=<*s!DgRd5wqu^NXfoQN*T{@*bC?6hw5W2WLzQ?VZ1r%~ z;oHqQl+TcWU3W-U%{3{tcJQWB9@q}({w@l2T>`qE{?INV7hjooByf}>$jE5ghD7qP z$aX#?Nw0G|5u>5|dqD$3VxSnID-~$v$GUl~GaA+#ZWbSC@A}6^MSHm*Ywfq{+i(kZ znhn9pon%TgA7WSDo%Sp(*_Y32CX}t)6b^+0I0=4`CnPmk1ee zpIIsgFh!8Yhtjg4mMI2P(5L5F$YMyP#LDuPnl!YGbzY7a)KsV!7Fh&}shtz}^FHHm0Vt&u6QyxSYp9%NP<8iL%S>v#+C%CYT1r?N`fVP1Ql_ zvUFrl7bC?|EKQ*l`9OYh-obUZa~b6Y?FjUrZbgO+4z#%l9&fm=J7(% zlV~{v=LnR$0aNDW>=)yV%XVUd{f&Dex`Tw>0G=;nUT~uU-j7;P2}9}5UZ3s7w@)Ht z^zb!l^YO0Kv25Ea4p#_@)!c-R>>u2;MB0k`E8Pm+VO9kQ9#Xx@APE7jde<+A-J80v z^KhNrTNEn|t1&?_8uaRg31G*HF#sJZor~o`T5m4E0dB>DbmLjhgX7qsyIY6=1l;T( zaE#^*tzAYpIvJ+r8x#7wQnvD^`D*8*IjeOK-ezqZ(sgu@>wQHuGhcDTsCWftV zBVhH6)P%;|(Sh#7fw0P=Gi0r(dP$uz&L;B{Q`8bkTyYWmbm#nQtMWj~&9zQc-WE5< z&!VO87Vdlkp|5GvWHF3qV;yk%SiDQj(Q_(Ljt$)PZdJvrV9`6!j7>00)M4MVjrY|N zvk3?V(1%Dht4RL*?eD`{Z#`g7S*Z2#P@12WuK12N1kAQjX{5i zV*TKx`^Ql%84*zjLl#zMMHUG$Rv|eWBYhwgTz`p(;bAMgGpiZ%6o!>8=^;Fx+w zu=t)&uRo+p|9X(0V>y<8hq$`W7yEC|?_#+KMR!Y7VT?AB)E<#+5?QotGZiT+r_t7H zKjt`jH&Zc)oRRClmA|acCtoiCk?OZjT&hGg(Dg5lBKxsIfdkGQ`X} zC{~JTqLA__FR9})RTG=z&<_mKRsGxU51!|5+iYfrUn8I+Ji}C=v&&l%6NCNmZ zB%(_%eI{ifW~YJRwiv1@k!w+ngHFN#xNtxNxeoCIP$yCN+_U5%S9l>HtOZ;N3d&p2 zp=2X->jg8Uqk1yBS->!S`Q#Sd&63Y^r;b;;!a~s$0xkTrub# zE<3l|ie%s2xGPg{%>lD$L(%!E*aaOqsi7ARILNaYkt1jIrEY0Fipt2Sx;8F<_93AZ zxKeiV2kS@7N}ojvkY~XN#OeZu9sdH%Q?%QvT%<=(S(wEtBosBVx-?!PT@@U^9`l%k=*w*pBJ%EPy zfPJRH@uTPcWsH*1;VaF0H)8xYYQ-{cmO8hk$$Q>AqQyCOmbR+Q)%fgOmeDdUHIKEP z-FpXww=9mdjqCYqVOnJ|RT~J4o~3ZwcNcvovx~x4XeB9W$@fRUUWDVQaTxr-n_M1@!*E0 z3WBkLXY*n_xlg|9KAx;*6S0mQYO&Q9IgH|II%QUAaaNjelrSi!qLvYcz4+=v=JN_n!S_7&E#&8CARWkSMHW$toj zwZySPwqnn8&C0_ZueQIQe>BI3#-(sl46?qj%`r*P+eaj14XM#c+x(yt%+h4c;E;Ji zNwiW~(3v2Efj$`NuVQ>&)I0W|Oj#SdHoS(BVtP=s&#l=OFw4Rb2<6jC5?hG~` zUqpB>Fz`ACQMgjMd&k+Gy*%IGlm_PgzNEG`F~ZJf%cFMK*A-m&45o^VUD;gHPvT~Y z@wfvhUXzZkBtltZ1KU>AXzwwO@1p{0p&w)U^Ilzt=P6=i zuNiJJG+yhbUy_VTo9CvQ#yKywT=O2~SFii~$omh--*;TdKZg8$_x->3gnx3c{!iqO z{hWf}yU5>gLOP=NKDK=PaN-U}e$ znC~KgKeEv8kiWkm)cwIMe~SD)EG>p9NDfO1NVakhYXZMfh!uEwHt|Q~Pq|?S3*GpY za9~orh;ZYM3HnW9j?1fG(#f`!Uv(gV110?s`TOp7{u_t;IYs$jA%A!{76atZk@=sd zlYczWzeoI^kUw4F=X~1-$H*brT;bb7YW26 z#xGacO_-bvzTBiX7t%OK`%^yI<4J=S={M{3dk6Ff=r6LcUKtl~os-ywbz=XN!cMR7S2Fm=LYb}f+b_YwdJMVTgTly#LOD>&ca0|G-s zmGN%cgzb}&O(k*6^xfmz+3El#7c`A*{3hJ$O{J?^Wb)b8!O8z>T84iX zRUPhu1*Ud$HKP1Uxb^TS;Z}@if%Dw`C@P_iV{==K_Xp$!5 z5`%tFWqxBg4r@KBfC#$&fRwI7IHg2zMjn*TwIxWFesp1lZy@X=zT!u?=`qQITn`#q z!BTHpF&}8?13&YWpbv!vZ5Tw<7$EWGz-C3>(As{`oZe{=EMl)=v7lwfOX$3VVV(lb z&qQJ53p|nNActu|stQ3nqow`EEbV`?EmnI)q}JhYxzOKYBGPDTs&8!CKZRa@ylwv} z=v7LE?-%IR+dDZr?6(5wuYMLlXQ3l)3+`ngZOiOxBVZXF>`sNCl2c4e&geCME{x4I z=|eyo41jXr^RK13wQr~O3#nG$Rolm`*g=10UXq$rD5)lOrzQt`v!KUsf1}3fC$%f5 z>8Qu04WuL}sHb&+O+hKO>zfvsbV5zY|4!uGP~UiH=!H#YVp_rgbWSJ}VVeFknU+2o z;#n3wH?P4cZ#xIIc?*4uEMa$RJ3q&sqY*r)3j(5{sfixv8z%>g9@eDc={b$_pO=a) z=#FTl|JC}>cZh!o_#W>0mCDT5KGfG8r!%ycnpCoiUxL_?9Y?>vNul6G$X6P`~FnA49rtZYoKP7v|>Xv zt1Qe+jI7l)^epsXj7f9raF;QYp@fP*LEnaPLEy2jw$HQ|^H2?Ab7}EP4Np01{Sa+y zPjRZmSPR?N9=6`a#W0_MBKqkvfj(uPeeL}DSoqbec&HS71b()C*z@xT-1`SR{~yA= z%liL~doN1z`9l2*_nt)iQ{3D08TUrD38wlum!yfpmg*~Ih|eb(})p%fo_Inpl^MMpC%iR1v= zCk7oVP6OXR#C$R{JRm(Z>{Ka?Wasb17k(WKHTqNa9L)=L1n0CFoEz- zVDKMU{HG)GuVHXicT=2R%#69Y*47|LXU^h;!@jB(^VF{RDQ<2Vd#jf*L{$4Z;?(lC zU_0ka;>&kO${$;+X(*}ektg`@Yr47v1a!!$0WB z25Hbb)p>NR)l3si$o_CAWoiIHqqT<~B%48QCXRCqovZ{ z;}u^+d-EDFJ$5dRz`NzW%o>#ICV5}mnd^>p!q{acXkX$ur!{R2F1mEyt<`d%q?(Y{E!rE*UerBbMo*XejN>8iec2*wqg~)<|lx_SMq38RI+Z>#EjID))v;iZeFCV@6QR4Lvidd8K+wVFEgVl>@krAakLxdKb@tI ztS`#(&CVr_oi`(mm5_-kX8M2)-6?_S@^0*nz+hfH6Y#oAUmK|Fn7vM%f*bqd>Qk4F?`z0~*lRdH$1+hgj!DRYsq@l;T zQ-<=>`7&LOq$#pw(>3Cb$?#0qCpx`sq@Wf^bkMXUP2GW+gEZn?wrd%cWZ}h~EJwj( z3FRFiTss0TUD5cBRGR0S5n(%B_q#4+36UA5VHvXP>TVt9DmFmGtDU8ImL)PS?#Ee zT@SSik#;>bVA^_3bnzC(6Jo>z-xK#EK*xW@e@E{Kg1-HQ=*JLR@ASm6v>fEw9M66` zFh1Lt)V1Pdw)7j>fJ5No+R_O=WhqKG)`XOVyV;Hfa%aanX&(>bj-06#QfCo$Qf~C9 zmrb;nCQKY)2-O%L|s^18FVDI75 zK5?ZFTKpn`VT?O<>0z2XG=xDX09|Q61F|Ru30!jiqYL%3x z-rh2Z^+kU=1c*?BPLM*JO~t<6Q~MAWQcoM^mKN#k zfXL*2?Iqz!EBXz8?DouZ=Ga{Q`Sam!v+{}o@(x}-yX8?Iu!M83Tbi&>ufw1e?_Aha z7xV=5-$pZ`!>H2pSAcw7_D~p~a!ww6G^?mDM!@et0QSPdAtu}2DaHPp?1P_Ck5^^r zQQ}6HFht480U#S%N_TMk($}K_;TvUYpbnE5yl8A9H1j#1A3wK6_+unp_Rzt0BmS5S zD&Odnv8Lzb_JrrL_=a&9BPofZQ3n(+iUv4k(Q8&a`~p9iCJncBa=t<!@wmUA+ zClWd)F?dA)?5EFY;!APb)hBUaL$!IWH zO8fw}s8MvYJ9M7Q^UC1jwHK^~8I=yIF1VNuK~}d(p7B@Q$yHnGNA?iXd&4ASrSGqg0Y-5x|WUr4Y}aY~;L>tf|{JJ=kIku0Hz z9i*_-6nsZg{;~n>N-j8+79uvt!?b-gr;r@oGkcyHTIe<|d!ma~-eYdGi_~BbPS$$K zw(cC((*fiG)nT?y*9)$i#s0l2y;?{MSA_lujYQnJo;@QJ+JxaiU9J0~1y~+s&Ccy* zeNR+!n?8&7h=lC$y$JIe5OC#`?|5vGX)T3kSHlYHab9jmzCk&o^<4*604Chbv>P>= zdDDT*UIUDNEYR(C&3iI}SYOp=jY$J24{FG_p7&Q-jc8sRUob*#QoH?JXXH`kdQ4}j z5h(Yy5+_$8;qfh+c3=k8abKq=m_5-3h6X$a}8iZR3#MempD_6O9tXS zi27j@u+H~6{EL=QoRxcx{bHBYaXuK+@e1QLB9Y-=22zuz?gG{1n-BVWr#9$kMe>=< zsS=Vy*13thtwJ#wVQ3OVVu#eV6^|&iUVYtGMGGI*_3`_%1N?EIM)8Ya?uF9TxRJGH z8O>o%y{r}T>1R7dQwXID8RJ1Zb7Y=Hjb;Vl|yS$|W1($ke>N*Xs+NlT+0Qb$? zijf+l!rf`h7m~g+W=ImXsYZo8oRm)qBek=R@o`pWYQ4t~^cOo%!2cPq;EfaQ**@Rk;{KN#+_y;luWxW_?v^;B-)?Zdw+F9y zk<*fDLaJ$H3r4whJUny77N=N*tkknrTQ>JUFP3g79ZfGWmBwmT;E>!QBMSkkD~)+U zhAL8eF+(H2CaqCKLh_mLQU?|y@=`1X?(bF<4}e@tT}p0V8a!M=>z3bcxpQ)AoAp?+ zG2X#Gc42F^KFo#@<1X&aM%ZG!T@+wtDMVuiJxpAi>=p5{zcGnwtu?ZG>YlC3#BE>N zvyBqLA56v^Osvf<{xZ}m%F9<`<^IXTSKKR9LS{QgXM6&NbCy8S0@8j&$dS7xf7W?* zf5F0hZqtK=qn!L&^hK3Jqa)|FB8km@-s7gP9wyilRmg}&?8o~AYY|B;2^w?yrW);7QN&qQ{52h4|T+I*XFBvioR~#M0R-O&TFd05u8GgQ3L+ zN{m&M4`yQRL@Knb$qB}9P2)cH@C=OjCmfrS`=NjlXKR4b#Ht|1D1!yjI8`Cf^Ke(F zlc8D=CQs263%5_CV;?97JMiQ8janq&wPfp!AD%HsPwa%3$a&8#LhD2=e1v!6tg9iZ zeV1u#sX>$E*bpR46QDdOpXx5V_KI_szgG#S4*Sr#Cffo>G`0e+It%z7xYeK*`LlLN zXhht|G~?!S+Sl%{ryTAMRZQs;M;Q!n-inx{5;U!xEiAy3eo!I%#wyxrKC0cmKsvN`_faMu$cd#`8X<*!bp;BL&9?F;ph?-~vHg*LfA zb2YAYpvjblUyHO=pK1dU@_Mz^l`GfwG>LXrN~cf*5t96}5yZ{5+u|V2+#)}}s))yn>sTmq$xMUbs@h)3i*(;oTHBRf7+Jq~e|>5w~}hy`RtQC02>Euo!tA6`&X zJ0ts=oD4Y~-%BqLgBSGT5`{O*UF{#2J%kNhOch}}joZ8#UUITDXLSZ`3zpHZubNm- zbZ(AU@&XiCaxkPp#@MZ4K%@XWL|{6 z4$LrpT8%t;HU2Sid>j3QRqh?s1?XL@SnANRkk9hVCqgO7ICWvpsJzAcgr4KK;iLgI z!-y1O0oUAp{qJvLT60Pb-UTmwsWp-TsXGd-mkh{d%0M!Whf;YbO_%p_AYNKBQv=J3 zgX{L?N}@eRp3lN_H)q@>1rsN!9W0uIP@?*J2+mi6Su-PKZriCTs8Fa0%m9B%za@A0H7+Gk33D_heJJq(eLH0ZUFL0tOf z#4rMCQ_F1_L<$W}X!za6Y;R)(%hQV>r5QLuRSKeY#fl+E7_ow0uI?0Z?TxixhU!M{ z;L~=Gu1}xCYpD_WXYWI16Wi9ZFp1FK5M>+KzPW+&yrIrV>xjhxDf5e83V-ZK-*hOI zX%Ry!Kc#K{iY;%mv_-YJ|9E@8nvR#*Jxx56rUlDAOY0cpUv7(1CCfxPJ&zTs8}_*IA2;pLfl?XWz46yw8rbr>=RWOkN&Wyx)1V{zlkuZmKWClqF3$MW>t?Y@O<0cvba+GON&SS~`T@xk3crK5yZ7Y$2I9mW z6W;|a(c)1azu4YQI@Yh~tz~g!@#P>+_%gQQy;42};OJg=pJ>8QS>VBZ%T^87xhQVj z#gU$e^K%=%)L7`oWI+uX=Tv#shQ^x~UE1BTTobze8~$lp?x_irUL^{Tg7_kN&;#5w zqdJr6Q?=>et-sLcgyeJ=S`tRy2uWwDR~jJxqf1SCd&elIo-gMFnu0bzgoRMnAro`PB*#w4BE?pYY+p)@gYJ_~MUWcz$y$bz}TIx7s`C0o1&FZ+N zNW7e_WB9w$7uT6Fu$Lz#>eMf|DO52F{QT7LULe2^1WnR6N$rw-;KK`vu#;SlAklky zXA0M{r9>t1it7}$GIb2o`N8dNwlz@xj;sQW-vAKg!6%ZsyGo2bgFyBH}m zSpH)|65o0I?>PZKWJg8UAEKxvS1(@ zii(-Ds`$LL2~vqAkt7f2c;n#Z(aP1PoAaWU1TQrw_)UQK*;;R4&zd8mkC9w5d-@k! z2HH@3ST-rnb_&6q*=w(I5N)~D7Lnl@n}X*~{q5MUqOm}9w* ztX84<{PNxwNXSSaOavSZ{CnN@P$WKG?~X~_28O-$>_QI;nTePqV%^wvZIvs%H(Wqo z8Sj+{LE`9jG;}luWl8ctN~VOtNb9!~@k`=>fxtw( z!x#djw9ENx0fnGk-z`yqAV!YD8h8YTcWshR7zS{OMd!R5H2(?-JPR}xip(cKB$DZx z$C0w`ppH%Eiy2Bl@t&1y-glcraBc@-qj~&HR-8>*4s2S=@peHef*~JsAlv}p_qK-h zqswl_y&&+XSOP8<#~Ldr=@0%;AjnCdZmF0-9KC@^pq0QGry#Esk1CHH4rtCxY9LxjXj@sS$Ho)m%d67Gv$qApwc6dU97y55?ma0;GOk_9w^ z1i%M5Qp&L6R9U&LxNerd;XK8YYbubvn<{Hc3)%9j+!$Mejwc||DS)@au{FYX0%rItvM zVBEOFUIdRE&e0ySk;`|yX^bB(9;HWbi#Sr^MRn*kt_SB${%Z8LDCebffuP!;;?>dD z+Y#rmZDEd+34@rc&m~R7<(e|X4|~05eKql3IdAfEaSLl}9A(n2oZrwq=9XJwUECe2 zr99-OlBMICqVY1L`3HsQ3$3v*bsl9Ww`sKLL-aws4^~_=u$D&{Rc4(zz{G`wctu?D>rp~dVx`p9FmrHxa!ILlN}+Rb*=ryyQCs)6|G)D)~u1RrbQXLbYbOe?1iGC-jy&c zDhKuJFpRjo_2aiwsWWEoP6>5ibRbKOVH6B;kD!Uh z?@qgW_1Ia)-~af@8Hto=o=3O;_Dc=uJG;PG{;6b*!`yN8>kx@Ysz;6)>u1rsr#`A17;uj%9}|a^W527fv0;FPjl`+1TUc zi5jS?`=b8VmhpA@mJd%DuPn5lK+vaX0@#Bv+2p=vO4!-8uRQm0klSGxcE0VmEgK(5 z;>C<2*U}$-zjk6hk*kIpHd+Q{9DzcR1k_dIWZuScQk4zix0;9V2l1%Dn*&UJT!zTD z>(Q%~TllaZpfZeBX%Ham@*g>TH|HX%ZIS$<>iQ&lfXnNBjctiLRrTQMMXo9*hhcDr z)WuLAW%5-=m3Qs%nxI)agp=jv z<9#kZ<@>)WKy589!dZ$*Klg1JI-4K{{y-)F3DyDUk2Ey0X7a?I#QR(bB`|Wb1TYb@ z6f9JdgkK6!gI9Gw{;b~e=Q28fP&N7PcmA6c_BUu~$LzHt-=(4bc%Xle_;+b&mfs3c zb%lOIL%W2nC-}``f2%+}K1rDWE)DI!pBoMH|5SmR1uhKc15O!F_}By<(wN)9gSV^{ zu=QMl`k5O4@n?GEpKDtDfrj?oss3FW8eaN~h1qAWRP8gX;SUw4KN#g7r=fAfdQiK~ zQU0t8DRa^*I8;F&!Z!A@k1jCO%WvY5Kq?uLHT$LFSp0KQsxh(w`g1?(P_b{V<@Lzm z3R=E3!6sAWRlrnyB>kx#l>;vi|G6Ah(UwMW42VP(7|jFbjU2`z3CKH%flSs)PC?Tb zTFkeo!R+KyB7v-miJP69S$dr$P|zp^1PHu}3b13OuCl2vRavZMKj{l90{L}5AT0i7 zPkjr7ddQ8;7XMch{=;;$rA1heucwGxFThX1-6;RXI$QY0?bG$u$aI7a(^l7hW|>g{ zveZ=Cr5J%y6k}kfyXrs$n8bV~2mEc>X$7S0g~#J!GGLLmQT+z)v#?U2YU5D0KP2)c z=J0_vdSv;Y%QB;Fq6=>62yQ*_r%(}CTE8sF1nF~?jcq8-^d%pA=9WR8v+J=VAiK#v zaG?+|htc-sAw!Dl(lNJp{?s*`#hb88h6L|-cC-OwJo#=_?~k|QKSgem;{KJ~^#7br zW7kAy-(p-c%`zVy2TeTMYcvx9_U`brFWIHonOLi#6cc|Nben><700g;~b@OUdtdYT8Hs zN?MAh%e3?7it3i%Fv}DWf@I9>&9#dHZoMb~W;apbeEQ+0oalZL#-VIN)hVf(D9$i{ zPArT2d&Dvr778jz=GTR=r?V`thiKrgPEX3HsQ;W;w)qROY$_t$_VlW92v*FIHW-1D z$r;uGrojFiv260^3ibv@(4$sc;NRKXX|KWb>{-i~82NuZ^Zq(3sUl^GEsVOHe0j%K zBlp@A1~rQm?RA&&AxR{zI+(lxrFa1mi?<@s%=~+y;`wG{XWRg0evXrum&!h}2x*zG zxwmCarQ;FNXhUB@loyxzMXmH_`J@zFVIk=xnMzRcw8)h+j2~ zpGwqtJ&Z8TK4ux{t$ta)hCHP-@9itmn@jnq+iGmi%6J-1vB^R*Fa{O!d{wD|NP0S!dKFC`L>dJ{U#pKMZj7w-(dNS!v^dr~C#k)X=in{W&&OMNKE z$fFx0nmEMFzFl`JV@!|8?_tb7jgB^CDElBu`F<#8+R%wzOENOPn;(Lv6$a-v zw6Z-ommV<}ZB4Uy;qmKs<8g2nLOs@i{)gDyI3JS*Xsajj&v<4iL<(D1{5^wDH+w5K zh_}6kUq1^k(96vk^%o~dAv`RzqxhcC0?600OD->cMK&9Huk$^DRW{KrOOZNK4U4B! zxM=g^6dB8MHu|F*4V_w$#7KJ;K7|-kxr^b&;F1q)sBEUp1!IJ%Vhj$OS9{$Q9G!;ENT+x(dg?67HBPtH!4Xz zKmmpuLk2zDr#hZ4*KTR-$A<&M4^){J$5q?>oS>B`(3Y;8mJZ$tZ#7Ijfdl+lTW`d{ z6^jtcW2qa(?uybbQ;zTTxmw!)Di()qpZoyKZKpz`xHVM9-h~XG6SR1ab7YqHX$Ucw4ly|5fr6fCm4fOronPe;xXpO|j@fYfPRXP_oLqdz&; zxQ*LLPi@2sU&NcFr`qVsRP`NZP;^qy2B?)`A8b#=q%HPZjJw5DP?mp_WldP;p?Po*` z;AyWaJ3X?Q@pI?1B?Qb015#+M;CnR2*E#tifLcVyhSPQZcDQ%lL2Ki)P)0uktQj^XHdQt_7l0#|D5GTd~&m)C@TVs82LokkjrF!6s`t;& z=aFUoWjh3H&>TU=YBt{ScI2dxSJ5=DhZ$V3bK+4=NtPC+*r1;@7IX@#1*+;z4I?9i z@z4dr)NDiHj1j?GlF$29`UTKY7=zRG!n}- z-_0T}r5dc&qrm%`6`Bc+-+6&~KVv$yr- z>9KQEWov!(={F)j->$=YLI;a?|EqWXG3P^7#}r2xV!-txxDGS`r*ZNi{Q0sy#xd<;{c_@5urhtxiZ0-Y?lO0}V`qQ{UK zm&`2q?KO*)nT7&BcHEXkPI)k-<5I!qIdHt;Da{h#D1C93qK?xyS}f?MIE>0TaG1#R zsFAr<4`GmjNE4}W^flZlsfV32Q_E*f#r9+3E zcqkB>{aE8}d-Y`UoUWKG7(~d_nsx=IzAJxY>fUY<`Bp}>@|c2=M*1X$a>ejLKBRS0 zh*k|o8ompoO*;BQn%;Ut6#=_&Jiwl8p)t17uxHyQQ8V{QvKlTu4RLZ&)2!6 zhOYvRM6OI`HjB&Tgd>ZUEadoukHYTZ-Ph6z=VoHEh+l#8`wyec8NnVXr%P8(%n?%R zsFfb*=l3Gi6xp@dM%Hs-;BbTJFhYEM5fzY|r71=zKUz(ey8mXO zJt$L@|4b13R0;7I*cJrP4jex%=&zQRl>Q0Uj=&erJ_j1G>sxRQMO|Woj?>tOVnNqIkA2|f7>BD#+uS!MUsQ5h$1TBEQoYZuB<%t6 z9`tR%3C2DRURgO74#K$9*cfvEAoS`pR(0g)n)QtM!TH#D6hH%A1SkGPof>8bunLE} zbaSPnzsq3Wky)RPJNm`ZM8wI(^YY4!;wCJGM1^`FmwqBzNl#SI@3zt+%TE`W+2VQ@ zVZD_#jML!F{G9+wdfdJivEyhhy_38Ru2IX^*}@DSnAUE2n?pkaDmM*%M{^u6a)4^Y zYwsr0;+}w!nA}UiV^|&X#c_Md@(Y}-HzRG8u3IeXZNm!;?)&S<{x`|nyT%%&S}qFU z?+<&t5ROm6Y92ZXXvbf*F$Ui*N=?!&WOyGN*Hy`Ho=EbL1y+CsJm7g`p+z2HWC=qL z#b#bo1c?PgLHKmAdZ-tRJ|96*$9~h6c*d8gL1q@0im6V_6LaRgHJ@IyyB@>N3l81` zJEZ5miTG4g+cJ}f>pFi~X6Hhd@ma7q+s9SEMthy!s#F`=0_F1N(|WO&{BiWBb&{n= z!Rj(2;w9c-a^|21j0&bbNCp>t?~N1CmrJ7j#7Hgimygh812>d&ug7|GxTsCyOH!22 z%vjj+Uj$)?0KHLFV!Z8GPqlA5$Q5(FDblRQhI;PyE3A6f4LAdQA|^XBDpb_oOEgQc zAz{A=(*O)DypF@|l*pjP*e3O$4m0|i2#mRn2g5ic1uu36Hx{?O6_2)DJnKFLyW&Zp zg?;xMeZ(JTUw;rY{NveID?@uTW=CTIMM+U-C7IW()_Q8{O#hfR#dqHRdno)bv#+Jk zKyTym`?0-eZ3>&`!|4y&6n{O)&oD33zqKh?pCR6F&+oJ;{#0i$Z{Ns-jC7l{Cz0fZ zN$(D@+FqgXX<*y@fP7de)A>2=<*y?Ckr)3G@n0i)8^Vzs(p?DY6C!+@OF(++n%j8V zjTs_L*-ZrvN29xtehwplKCfr|H6=MYF-AQr@h5p+b-8y*iOA1-RPSPw(^L-(GcDMm zh|)FVQdEJNIe5TKeWU&*4i*yN)0o`v7z~{$CB_%DliyMM3PVyj(U-j&$k?1;&Qr}; z++5s4Ti@E8;>!CoKo0uyowmNTv?t?dO1EU!evVwqLbp@WWWE3};X<=Q;X>E`!eu@- zvL5oCo%o#Xct?Sn#029!|Lr_fqm;NDj)0qn#GpI(q%Ber5zKrUp8{`i+^+mWO6wQk ze7a`0&A3=!yLlh&nHw8!=`SQthjlCo#;)4#Ta18Z<{}oZ>uTMVL_OlyAB-!NLVHcs z%K9cBj%kQE7;$qSI6XZpc-nU6qN|KlR&b8f8XF!y3m?w*gDI!F*rbY6;Kk36&>`Nt zJ$BAI96jv}TB*bpJAYldWV^y}Uf{}#{}|5jK_p5|1@hDu?7*(i9c`0C?$x=G-&|yC z#=`X=up&(UdADp_qpAd^$RhnkO5WS8_(v#8&I|K|V%AkCL8#=sfqA7nbu* z!WO5=0X@LzD-@v9Qn6D>O$=m&%!F^0%GTq8B+2wOqNJnS-fdPqRz=F}PDw1N`&Mo9 zu+X%!D(OzVsVgMcmO0g_T6+lf>kksomTfb@c>oI?yO!G8&u$@{ySL)25 z?9rPNC5jh-7ne}o7EfR|&1MxiKQy;*6`qc6&fDf$M=dqxdA7_FlvCK zyY%qWLZtJx)cXpPfpa?NWil6@bO)|onfc{hx+6%?6|pOwt3k`iv*R}@NN*XKzRb9j zU6;A^?oK&mZxT;_xwm$>bH>Tgbt)|L-N{Wl>PLr$@40iQrPi6&rBLt+ao#SHkZ^9Q zIDD$SzPk&r`&8C;eWW0_;K0t{Jl!K<@v)%jOQ~o1&_oTLh~*jggOxb1p#Opw9>Zfv zT|Uo&-wA%unHn6-4!H#D**s5p*vIrYk2{a(i^&;0Js?a6PftUzybGDGhqH#3dzZ7v zf71Ve?CNHHpk>oVXrAVATK9ywhMtRyilaN9s7tm!hiiZ&r>Lfgn&V{W`27cuOmSV` z@X;ZO!KcgS+J>qI5*C%lauOysw4@*hnDsE^^9cp7+W2jwovp+j%BRPNf63yv6W4KI z`~)ZbIZ*$HOyPI@%0HGV{O5BZ?13~sfQ7zPO zu%n{qLj;kmSLnOh!XGWh@3MvT&qoNue|e1jsc40RLMWq@_(Yn3$Ks&i1NYDwGI4hJ zpUBm|2n-S>&A(Cf$JkGZ6HWG4j8~2)h4@9Z;-*UHfa^D#`iG(w-~G;i=kESSwh(jO z8-e0^%l)Zn#g7O2_lSQtTlkY)?M-hm)e{1h=eHWvq-At@HPPR!_P2B)@_^lk@1_g? z`^nM#Z-TW(O&^W*lsvZx2}49WJTc$n^*<^}f9rza;ndCcGpPCJUg!_$!tYM?@1_fB zS_yFlpI1xb`QiJooy5e{SXW7w(OA z?+=szi&kzwe*n)ipn%VJjTe=k56HJan0lzs8@eQV>Ql$J%5>dzx(U>o--`k~b;lza z{jZ0to0g3C*0jIBfn1IdsjV74(LCX#O)7W@!Ty|v;5B~$s!$&SZ>^llJKel%5q;sG$rJsDtaYFC8;+oQ;HH+Z>E%F8t$-6DFlckSda<}jXyBY z3P_X+S(HZ9&6}0`MRM+ygq7(#PHG`=UruP?SKftA%6NgmGWY2Uc43<*t%+cm#f|s8 zrdMuf59yI$>=25TWbIb$&r7xrOg2uY>BcGCPBHli_CnpTGB-iZIv`$I%_^dHM$N`A zf_2U^th8> zY=%vH3Dk4e%^PLzM}w#Bf>B&oT?(UI*PRmOEmu7n$1T?#q8T1n-LqdMRy?jh$+RVG zM<*ttyua$@0N?=~0ATvNPKVuv*23^F7d<`6RWrg2yVq-! zBfcMMu9^iSob;a2ES%H;YHs44)&OJOJ4+)0`2_kaEupUPe&k$%P<|M~s^M@<;}+w0 zMr5OR%cF1HM`~Q2T<^c~%+hWDl4p2dyp6XC3)l|A?~Y7l+3g<8`5fpK=hn5YxP)e46-JGVx?_bw?F}s6Zn5 zgfo$4(JBD&d>olvvOpCe0|0!WD?YVMo|BNrCqe*OJM3pb9UojKnJi2J+!Ronk4Sqy zpF}3*7_2E+17O(a1s_Nz;TV=FEHe-fgr-lVH})8~DU2g9Cm;hz2XN?p#b=VqHimnH zybIo%1E4FA@pe|-SBM}704HDwA3;7YThJSLc5n{_957D+JfO1O zjsTt=HV2UJBSe774wMEepB&-M)UHMV#157QLJPzToXiJqi_`#}1~K7Hy~=0{)(1`t z*lUMdC9_3u0NVt*<%73{Yk*h;KLT9)eBmq8qPSV{fF!GqDAh`iIv7;P8Hg`mRjriY zqEae;HC_B9<`)>jW3`xL#*~;`Z45C2mGa8w(Kn!jFzh3gR*Rw8=cFjZGMlxdB&o~|2p6wlf$KR(E; zy^@PTQ$qQgWEc*2@FUZ^@sITJI6?9xu+{a{H358%b#!4d^S0lSdivy`IipJ%eP; zabd}_JXNgCc~_eUsLj7PdHq(}_0E@ZDqjAKG$0RMc))LBGSQdOTYg;_^DM6cmgTGi zg(;Az^V6D)TCyodhNvF6t5;ogOd~2}@k*(js(6`>G-U|MeL0C}IiX*9KB(mfL`%XA z8*;j1GQVTew%&Iu2K`Gx{qu`cr<}} zB4CVUSu&(5Pym^~D~bg5kyOz#JM)+bfRowKD>u`Yk4P??7fX?iPEnOek;f6&f{i-7 zU|dJG?*@bij5!s_r5@#3LCjGOt5%2gFlE0f;4`G2`f-j(T@Hn#;l@O6Zfv&`y%W26>-)we_aqu4+;h{`V==FgqlHN2+>(oS%0{K7PnQQmJX znXia#t`>sVbL?~MG`{6X<|z0S)|>#6e4gx(dLLh%_{mkqZqWX-J(dHi2F)PmAmLDl z#Ty!ODp6W;`k>P3hS~lGoW`{Jv`Xdsd1Os*Hc zWH<}*W?zFvzY?UFei@O_<^Cdy_E>2A|FHJX(Uoo68gFbn729^jwr$(CQ?cz-Dzc9E*?-R+}$vOtlYav!daldS~s1Nq) zU8fJ26oUdL8e?9>4+2dVSisKEkDg#0GRZJ>JTtgGgA+;JZC%SeHgzPl+&LMl6z>~d zkA8{$@tNY=Vk-GGZ=rA@=d+SIQp$2%%R&<3(A4;AY=q9pkkQt%wvI}@fk0cEt=3M| z!G_aNaW1*i)w9;lw)Lt5hR!p#?YXd!isna~{=QE=KJdtl;K+%WB2#2#GFim}dF`hf zBRktGh(`BJz0=;vjbZq*7j1OB1;o zhmjg?gC`1qXUUE=E6_W^~DIUR6tRdV+2XyNAGI&l6=A@)z%Cr7KvT`rBEN&?n zW6=>=b#Ya-mZ^`9JL-%qH*c}(VU|5LNF2k);f%{vYKJo;7pM9ronG}8H~*}OTcZPg zwglnp^!`z|W%Wcz_;Iv@Q?_#IYlEo@Pg=Fa3RSfgU&ZQTRBUOq1^1klU#uQI5=T1a zZWsCko^Vui3hI#A0}@Yg54-2$<=D7mqZ_Pe)-jaT$d{~XH0j*0IO%&-J-=9Rhr-LU zMt)`0SI6V_$rypv-JIr}?VQTFsHBsy|1@{418&V?=FpRqb=g;pN%Fft6EYK2Aj+4Uk50mrJX_7PSQjH<+N9=#@E2<0! zb7Z%Bdb^KDpP z{cJ?TlHkK9yCU%5rx%!YtPbw7>c?_ac+@@5#9K@7p!%LwPjClELrxukP;*^{lXj3v2ZfR%xG0Y$E%?I4f zg_A3#5AvlYorHOl9z0GZw8%+5N~zwHDkBj;f3Mn~c+hD3GADniRh&8}-xcPyFB4YX zB&!zuUUe0Zwx4lk=Hq#(^D2aOS-?z_F>F3N756P9`v>F2w8t32|Sr@C7tgE@` zs~qB-mt|CrUCG8X&ZfUy$P||%y6RH`aV+x8S-;owhfK6`HRbtYYV+V;g@yRKKY^b> zZ3gIJ7NHSI_k;3kyV~yPm}<*{aHWL@6uBKt5HB|&pEZ@gb;qv97cYhXTuiS%P%$bz zmkz3(tPzCp(g`9!-<2^m^tvb8l*S)?Ml@bUjC|5tj3P%iimbhb=nsUwSw$LtK`tdl zE+Pzvsb3^moJ?IO#oV(5Ky;_lH>M+S!?Pz2PQ{Yp3Ma$BA+o?G>$SlLt00LiL~x3S zMD~QpGKFM23XM+#NiXaFaR~`-A2i%11k(9@B&Y{;kBZVmxb>(-8gOM!AFgMg<<=CX z=Hj>Plr7im8UM`9AKYn~p{cZMXZ+JX*)w)~R z8_J{36lqCeh{dz5^5bW*p|8pjtkRN}a+7CqjhrF(ydl=Y{Ey#B$-gU1f740McZn2V zVzXpOP1qMMsw}=lPkXUhbhfMlVOg(GSZn`mtc!ox#S3X9X9AccFpCd;IGx@hY;EaN z?DoTeSp)3?cq$X~$Ap7pDgi~W4a3YW#=z~&#@WC)^*n){ zV9Mn3b0Wvq`UuZJ6QS^?my#S;rhpZ-pb7cQnFS4&oVId*0xmJ;VqY{nrswMgc(eaG zDq<%1v`<$MFRsfQx8lq@JF(J^Z2^ZEmg;x}mW$%F1cwtLUSS3J94Jmci6>HpW- zz5g9y?EH<)p#2dB^S2b7-7h#Z3;@#h)F|DMs@gPvSzHr3*`eKl&j9B6lh%aH79Bq! zA+E;%M_`RVAP_$DUSM0KD<)>Hfr#8HMrg}SL#2JvXx=^ z?nliVc~IwONPZFxOz8qlsQb0$L7ANu-|Q#_%3{{VIWin?^7?{B_^VB=G^^nes- zKOr33g+WVawHvT`3PwuYOVAEKbNv7TQ)7>@z67RZ^bSB#5p1)PV`HGBOh61&2@q=J zxE6){e`HUo)3WxU9J-CcFe86%J3?bqLCpAUiH$6zdXbYpyluntXW;n zu9LY5_LqM!0_lhl!k3g49q(V*FC1q78y@+Q2I&^5`Z{>YlmME55F{j28omlDFV9S1 zLGfiyhh!1v9mcA#FdbSDuOJyvB_OX%C~%FaX&IKa8cr%vvRbnEF~WKIkae4x$(;1* z`tG=~2zs=EkAe!fJER? zU{pZfpVZx-p}cZ{#UM(cI$)*1J$$HNcm&oB)D0B^Q0L2VfuGO#C&M&=83Z%nZ@_zh zxu0lqSY{yefWLwC`Piqi%^=(1+5zi) za>YXrfB_2wX5a_!2k#%_&#uQs4~PLA2}%ld-7VTp#z##LmkK8Z#sg{sAl|LC&4iDb z3M2)L-Q|DYjiyHx3u^_?3G4!Z>t78*U@o;XNU{ z0jvXF0Lk{Z1Ouk>@%#jo^*8PI^*hpg`|6Nk2QT-*oao6?;ZxC5+0@Ldk@QGwb*eVK zUql|i^o@Velpz?*?^aKtad{#!m{^<_fpmxCS!}#4);+z#pDzyfFYyJs6=ND*J8e-J zte>7^i)YqrQ=gd`t~)6aDLx%u2Tf&Nx@|sthZSqC7n`qpA344?18;a2cUN~ewDPry zV?#|&m|e98qpzyP7;;UUpI#<(JU+XL`6Y9OQ%_bV4x>kPCS6ZPj1gREz~JyWJPvou z*Lbp-T+T1!vZkNUMz~yFcTXd8rl0QFRW0|Q@WS!jKlmsmK}z`$pzwi|35%5o2HT~E zOJu4`#Lr5k*-K>GAxXNKNw0zs1=1-7>j?*i5QKk05X4jAKvHHw5XYm%<8eb$c7&17 z2&H_01oI31$PGs$g2c^(gxrHb-3x<44#h-CQiOn<3q@uMg=HE!ts8!EgoL>b zgE9y46CQn(9Jw1CzSB*}?ILM2jlEn#1YS(YV2c|o=xU1FaE+}i$SCM?9PSJmUKbsn z9vW^V8)=@MI2s=1P4F&YDNwJ9<*bT}v5il%O~Cn-yYLb-@ur5M>`>d5$;z~dAnKML zfu+Pg5qF^$N4q0HPbO7#Ku;!`QpWF7RuCyC)KZI8^+{CvKwUrB~Ep8&a87q$)^HW3jv zL>1al2GL;&S&0SNs)-`^i1;my1VKBp$<1tCc(FHDXmTY;LSHI%Y(7mkMK_cEh+*&|{=ChMiKQ zGjGV)uNm7zs6;*%nY^NHR!wVEZ9^GgtR|^DQk?XqOl+Q3Wz;l=8iPo#(LAP2t7f!= z_9nSi8nn#KGs++3l2+~1sN7W;EWV2$7s5B5 zuGN}>kS03cCiLJ*`y?DT<=!utL(+UhlWZSqoN0tvq&8^&W!JS>$i66Cq0edau(H5O zZ%eyU?KYW|PbL=*b1aAp^OLRk7o(wGT%mUIX8G^YNS2Z8S}X9G47I@ZRliI%*`)K) zyT;&n)6)c5=nNO@dlB^31>q_Yrdn&xn-VTyoZ+tXkw$B!6&vZVZY){|uhts<#zEJE zd#g~jHsm{v_Q>A*$RYR1G7N#Jq-)HtJ!1G-J;qnF+D`xvQK+mB2An#`(Hmq)&|2G= z0wT7o;aH(cStV~yew+b{et&T%lp{na1xV;xTe7+5OxZ+oiQob!kAtwJ#Mn?Zks}wH zYkknHWR{?ad#BO^_ep#ME5+$$nIdoCtgER0Se#OGUs0G9LGVk@?+&lWZ=Zbh90GcA z#+)Hi_I`Q}(d+ifS2xJ=2SJo;yrqTS@yiYg>_lS^Hs7aGhNT&MeThIeNU^nv1;uaH zRj*p|s2|Auk1Orch7*c{@^pvMzs-F02EHua~WDEl(Y4L z5GvV53wi?T#s*7{j9FFyAHCk7VS{*+OM=VO29;hH{5%fNY8kylt>io|>-&bPwjor! zwzPPvwON&KMZ20!RdWUIJiB=k?mWM}`$W~C@Up0`5jO&3QssD%o@~wP`js_^coI3i;l)4a6AcK2L(@Zg`P);G0rXk7=!#t+~)`iDxB-qy<9eEL4Np4hJ_@l1Jl z_IA~LPV^6`h@*E5D|zua6Q109@n-Eh4(%}c zPoI<<&b^qMo{yVjV{G2&u!wA~80;ClBxeB*85u=x%GPPUw9F@L-5Tdl7`d^ob~K}7 ze&^gGK77Zc8KX~GG5oTXdedf5{B&p@zuWUF=b5tISdWkKK6+vw)kV6sP~^cqJKTFl z3K^r^8`4r4ru1n@>=Ia1$kH{2-B;Co0#+YNxwWNZJ#=kR8QiJ0gxw`tA3Lcfn!K4g zrQr$I-X%)@IhztZH%CcfTU*vsT0cMXlPK*r`NMjn__ zZE|^|ECIu#Ab1N-?DQ%Z+cwN&`&?m7*gCio41vFW{sI4KRRmx5NQp=DaD~_qA9Kvd zBNA5DZ0kfioY5q`WJS=Z zyr71C@`T?DH&MPTOU8QJ7{&Qq^{N=xQzFzJNs~7!rxjBU+!<&lVG92qfYwY(EA<^G zA}lIhW$0QqF!ujVBKh@qIu#;NTa-sA733Bv`^UnoRapkCOGk~+HOtTB8Vc>o98&po zoyr`7?Am2}-hT{?t`J5f-Il^1plOz`6R%7D?5b94d7r8XFDyOkBRn{v8+dsQznQND zF}zhSF`%-JxhB&o*AE}wlos66G zpR}LU&-OJl{UD(Fw3GUHZWVBMyse5H>vH5jzDVpkz|FYq94>Ijoom-Yr{q+nDuZ5l zn78mHMtP_~bCD)@$VD@Ux?lZy|9~ETQZcX(5oMVlrAf`qBq<4pAaVMu;2cE*w~$7c zH1WM8*;|sls5Uu)(5ZJ?1`f5gny>9A^oH21%{r0?#QBaH!Mo^$S?>Yu)~dEo#p@~0 zMS0T2J#Fs!`}*1=bXF^wQ>&;yZDAXod#i1O^VaD6sp#>}jK`CGZeziHBXZEMgu7!+ zfxf=`ovq*Yk9XG_cSRGR%IB996J z@8I9w;h_g~nR&tyB+^Z#oH4PgzHOOe9F=0JZn9Lq;XBcFH?#d1Gb$mSf}!2|D7-|> zmDn^Xfd3(2nwAS6q_Ie^Imxj0Y2#vMIyu2OcRN86_(R2(Z3zV08du+jhoYWye!WBJ z_}KYY%{2EmVNuwpkL9|jj%sj zX-zKq%-EL@a+{;9yg-vvdkU}YEC)?0w#GiDFcQX^07mIs;EOBK07xhj_Q`x&^r020 z8ca|qal+50CFBQ(4g~WI@PWMMR-Tw#@k@+bR?8e=77g6?QoVr8e#;bG4+}odS*pPHWn+ zZ5yiBf&WA)QB@Ss5^#t$FC$(aFGOum7%|@>h3F6y(1Xy7o_NGer|Wk@q0wKDe!pp$ zy9{3+M7e6J+F;CGFC}Yzs(&t|c#d7)&bfMjpRO}-?mVb%)7b{+$hPs@hI@0Pps?)` z=P|b60{+*=NYOfUVT&ug)8*DFPeF^VvP;J8Jrv!kbI$R7?|m^r{)WdAU&kdVcWVo7 zlWvZ(f^OQc%O{O3b%iZ;e%`&JoRb3G@5Ni$}^a{3%RH2F6wewL`fPL!S)vwSyU`P!%wwckZFa6&Y>V>E!-G!28*kjvEP z*wk*(G$heAJXO?N_!o0Z8cqFhu=!uQeeP>Ej1q8WW-gQ_d@eI_u#Cy-8x&pFN?IOP zIbBSsJWo|0IsqR#ZO@QN&f4c5e(=4%D82IMpLgycLsmtRvx$-CQ<7@;?=Qu^p+Il; z1+b{?L^+4VqWW12+SM^dCY1MM&k7%IWp)_Vm2RkS(3GolS-ONeTlWSV*TK^yt7Vg@ z80N?tM-Z-zDpXswHIc^wH87rpVN;Z7d`6KI9|UJ#hZ6a=6Rb!(f;|0WNVuHbGG)A(M`ZPvXWY+kMYVr$g+S zLUL_9bC#(8CDdYzG4%KX#pmRbz{QtFCSB!=f;x*pN6Zp}n|F{}Feo>uDP}x}C98;Q zUQE|=TD)GEkwsgegPE~?w}6+icuBdq>AWb9yEw0El{JRej%%`#J}kFsEj1UrvnbBwexjQqHde1ah=iLoc?Z}!|U@|NEEZn72+&jytj&WHahto;){{hz{GUp@nv2R`j_nN3?!7)Fhs&ZJ&=MZ|5Pk(Drhw-1g3y`dVZzavmX`=fCji$ zjSMRGpK3lR0=k!iv!l6i3l?Dg?d%QNpfg_FFurm14po5`4FCrEZyN3xZHxHks8&BL z8h}87;3{~}GrBcamJJ@5E=+?glCJzM8UXF>R$dGM=T(AJF^Waf#^j=0KK%hk;r!%o zcK?i63TLpA%zT9X3(qS66@!BU0szqc0=7K=yxi&E)qKof3QH&Jzbl{q3vinh&uulw zhce`SL~NtA&Td{7J{w*m))SZ2T7%3Z5YZ0;Q4+TdVfq?S{*-qknh)niE|?M>%7P^s z5)G53ruNa}*HumZ&`|S1of^MthP}MZIe&@-g2~}?Omp>Ly zE}}jLsVn{MNg$8g?e$5@Ld)6~yv}WmVSY4*njm?|8_hCrfc?VPuxQkHW3|d(9 zM{bv(KyV*f=$_3-q}Z}`c}Cp1XRgp-2abG5D>GE%(atwL!v%CqF z_&x%(tZm||peu8q&|va1)%|d;N{{sM93Topu5EuQwF(8vW%-ICbsqpL#2qG|cq^$` zQ$AY!cD9ZP7x@-Tto|>NU7m$}fl5kgdM9Z~sexF~@520JmS6L#mchT&Kl?Vti)1eO zEpYd6^zG$`DX-eJV!-U=T<40bfse66s)7uiBGrW9m^74KE~WKU{U++3s_8k$;%QW2 zN-)WqT02fS8P><&>*d%%^nZWvL^&BlijRoHLoBlPKCFOX)V>kX}9;Nwkex!Nn`}Q&DLc*>wN(6BrKj|JwvL?N3aQuh_Iv8mV2_JB6DBOng3giPzlWFa9ntV2O{ChxcV_ z^Od1?jiTg$`xU1qK^ioX2#9(o#8d)6*@Z}n2f_FiY-VB-Ako;vg6Ws33f2(T04z{< zrp#-4Jp(9||JG7Hr-P9OV@HCL;HS?dJ{upQ&vKtX*hI)88gMQoSgZd=SNu z=RE*jinooGVh#mZAlCz4%z>xf-Q}cvwGq-CX@`mAl4^g;C3yVla%0S-7KEYnSMv!g zN^FknFWGhm!N0J(In4fjcmJDy`hPq-8&;q*qnvSvu5ZT|4k8)QUBMDK85Wg@R(qO> z%jInH2BIa`Eaow0V?`jNrpK!blH-{N$<+xO*9Fv01Vj>pv`V$1=q5R)9J8$_k31br zJSNO^t2S;u7S?XZnLclQZMw#M<0HuCOXpl2R+sN;#347x3Sn`%^>3EN-v>>iahbk5 z*7xl|tSVUV?dBUZseI_WhAgv^HKr=RiN;9TC3;zTW52xJ$mZ#f*c9d64aMR#JU{wv zvDvVyt?<8PY=L86e!g#qgS|fct~IcUfsG+xQuY}&mlIQsQP!5;<=6$4lM)#_W0K?< zM@A;G7)h&3E+#u0X{*aFrob9yT9IRo3^M9$5@rk+)}~p}Y7QsYCRx#}4Qm=}uE_iz z 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

>RDFEl&2cpon+=#%z3nq%VgT zg)!*8zuVMkekFAMwIW4eihqE8pt;Cy@g~CjRG*t~F_E-`C+ib9p4*+Y<1Ji>godXgW!v-h6cOQ ztb9uB?Sf8yc#_X{i@R%q&=p;5IXQpA6zej;0-d*Hnj6w~_F3LBxCWI52TxIUq>qND z)7Hvj*+I*=c<9mS29x%;*>M^pkZ2`%e-6t&^*|{ zo7h#(F>p%!N0yc8g!v9u;FaD)HjAPF%!kdAES!veZbIyggw0K(}kIx|DWURcX$k`dyDTpGsJ84}f_zw-fbWgRo zN8Y;W^@?%v=U=e_`~CITSaa5~2Ru`O zXZ9m^Far2{$9Kt*w3;?^Jh}S#8MvG zf`!?+c%aA9Q9aRRva`UKliu$T)rC%ZfQ6wu!=%92v1WX_2Y(q^``Ut~@|F?@o$og7 z!qz=|jNs({XB3j?TR7V;;q7|oah6uoyWcp~(5so;wE)TGqD&6`uz6X@P0ksDQSwaN zwVE!K^N#D*>(rh}=W|!De1thxUmG*Q56CkMRyYd=Gl1;&V^3fOQ89XbbdQk zT@=YReXYxCVBH<0>VO`6To$Y5Vep5+Jp!AtV%~-9^-mcw>K^%Ds_2=qEGWJ}H8#O? zQnuv0J2kd{R;QrRoz(*Sw3cHl7IjoFbaqgt(@%S9fi+6~4Y90%Nv)b~>88sLQ26Zu z?NNG2{k)!A_d%`*Y>&bH+lcu6)so6?Hw*pm9f93|F49Pb-slQw_t0zPX;~Iq*pCIt zYQwPtzG)%gO&(U>^(3}=J$9B>JlCDg#Rg=YhJj)xmgbz!^S+1kvkTq&T4*Ony<-78 zb-!t$4VVrnm*3fwG|f%vn)@(5Jb|V`{UiVq$5$&}4tJ4{CCNeV%mJj`E!*ks#=g5B zWr)~7r|3PR3f9j?m9^dUx8)mH{vulPWgcIx>7QB`rPaD5T%?a>XtHg6ebc~e?U~OE z^B6@Vq6^_v{PDzDl)iu2LPcjqpIGdt+nUwW8n32yZYpcr@$nJ+k$7!1-b)LX0=kk5 zbtD#jQWJ42{p&!g^&o#dw1^>eMNq6N9Hu&}ExAY)GzQN|*5xXh^0!7dOfD0;CVzl+ z#EcKIN{tXkpy0I0urL+M${!@>KGO(wkDPuM^`_tKvC#^WHWUU+OuTj)HIB!DS*s$O zVutA803`Pa2aQobq(ybdG$loL-tDAmlVwGXnAy9DjC!gUw8Pp7ePi5pIWDM*~c`(5gtsLwN5El}Gl=t4hTxu(*@0oA$D?_N;4pq#EHWr*H(n6`$rORa9a#=l0E{ zrDY37Q})nYu>LyUb`Mk*<~n1#aTM#0ya(N1+lyInsmSce9pLr>Y{(GrZOPODt(f?= zH7X~fthFiXeKKm8UZaQQeS$e299bg^5}thhmmr05<|cxN97t!B6`{|Ya`>?64(Z@7gx)qfvvqzsvi$x7f^&2K@bIrvvQsD&XqVBu}9}9$vy-6N|dF zBm1S?HTDrg9!*y%Vai_s+nFfrTzLKyd|2dtJ)2)Kjaw!r-Q+R$dxs@&6|E8K)jt#2 zefA?wOSIwhv$>Rxk<2~&@r?4FR;0TtDUKF^OK7}c2kv<<{~1k#9h7iVHaKz0 zEcl1hUsSt;0s+5l!)>cwWY@meS)llG`|u+)c^tZOik)VDqbuq0Yx?D4Dj(mlQ2dBh zxAsA|-^g_!bKhFg!ZMgP2x~8FFEL9%iNqC4rqCg?CMSu+)wWqX-ieG>AinIq@91_5 z1KW4#b}iSMux!hx5PNkK=3)NJ%Hd|VGMS(a9H{oOSc4ut@Z6N9l+5#5%uu!!E2xrY zoEzm_hOW-#ZfL_KL(o%u@H@!?r-J+wp_Hxb%$?`=;H!7Uq=o=iFeF2DU=`?FFY# z6$egfhZ#&q1N@ZezLX(}AjWXpJwS`2A`nth8MBB979y$3SpUgXzblIsh`cD~8CN`E zjq2CBPF2V(JM1#w&?Pn5zUfDIL*p{p`P~?b~5}G0kIiH)E$CUHyXj3tcqG z#Jpkbc!JZL!q^*k61|tQ6JPyZ3cI!_WAk?{>`TxFZ_!ptvhmiL(QBIJ znFCjC4lg8oy7OH#h>V{s5~L<2eHB``S+2Q#-W^DhrrOda9fLM#wnHyC(&|4Tb0 zysDHPuL$l2R_UG zj4%f=HjK4GXfrFBWd^&-|HO+hyc}FIHE54Az0yO3#1_!~k_2e9$4x zqO@%W^@quihY8LpzOLXWFg1%~69eC6)=Kc-B&?a$ak$5$?%6UP+)gPWK(AU-=0f0L zIXYQ2ESwj@6Z-b&)&&7f9z8W$gBa_wFOnKGnfp?*_vA3p#dV@w1ECSSSmInjb1Ib{ z%q|r8vg!&EWR;xTz6}eDTAHgoj}rAKnQ3cyHp8+bDeTm?; zY{Nr&Z9OC|&?UMk^35e&RM_GztyKT#`BlTXf7(3zT5LSC5`7VFGavlT*SgbL&aqTx z2)xyRxuLu_&fx=dM)JS6b5;IqO%DIFZL*hAz83r$eN zdVG4yzqJo|PSF<`48lI}F5Kxod)@40v75cTdyT1HGlMkJ?3-V$yJAghS$0R?6bjW! znkW9`N?WH1AZzc@yx!!DnXoThX|}RrY5LG@=WfxkxKna)gS47p%aQEO#G_+BCaoSuyy@ZQ25NFaG1St z_|Sm&G#d<}W*-#LzVM0idM(f*La_FwRZ!?v8eM~}Q}=7Nr`)~$dC?~{jh2{?dvQiC zUr)IEm6WK!7afCZ9LQ_CAy(8`q7S;`iMSN| zlN*U}13gkS)9x2%WIPVE_<=w%nnloho)D+LwCH7xGc9rZLuW}&jbZYUoz4y8LI<+- zcFHQ_mIJQ;YMtY}-MCV{-BQu!abR3Mksjb+120I)0WeI5_+`O?P;5Cw_8j9;@2nfP zA=}geZf6Kxw7i#bX-u*eLCYN#+#*F5IuQ^7WuJLWi{BaQAZRxPzU`=i)XAfpr+k=0 z73yOFj%eF3_wnd}TP=t3^v{LJeW{Znp%)i^BGA6NO9)c@Vt^m!5 zcZh2MJ@uKm6_Jta6}Tvrn1+}{Hr0#wn?%wF1LfEte(Bz(ds_OnOA3Z=z~6XE!3WhZ zLxfFADC7IgJdB6-R|E;@q0&9|$OfAGabnXdPyN40U#eYPrY6s^H~qS%fx-h(xonLF zR~?qw z;N;b9jhioYMfE`(3H`04bBnPM!YRT30en--z=eUw`0=FO*wFGe5MAA|2uIGn3x+-9 zv551$_Z|GZ=7(@04-!{Kh9hgBIuXzdh?x^xO`vwbBaoGUPQA0s07dK2sp^weUFUlfjRM-!_3}zT zirNj-3t?5@`ios0;o0vaSiKhyU7^<|D643OG-EYTr}st!*F^YwxfuS(`n$AG-_3OE z9BCATX9J)ouRr<&E?H{`LU<;+kTjhG>DagCKd#7q)W@qdV^w}uTvEp4Z^8I>0_Jgx z2Oq%WcNt%I09RoIw}4X!(TlX5&S})f8*WM+JR-jes55@&9n(Qc^*&ll>$V5a-U^b@ zL=?S3(lW<*46|kJ01X=6NXtXf%2;ChIpeZq@G=Ezc!fN*tHL!nDc1(mAJJUu>83=E zic$jUqEodL&{bSgP@c>Z)d7^4zDifCmgczvpV7`iOg`)bb~#k<9uA$xMh7r{u`Sk7 zoY8BAk_t@?rO;0Uhm7-(mT@Q#M@XYZ)6XR_UoX+8WH`uVk!B?6q5*tWm+(2@AC)ry6}Y#uLv_xh8fn9;iX2g(n;2mna-?O4 zUVE~5xiKz7)E510LhmYdsXJZtM3#@I{zTC5CvZ`p{Zm|=WH zr^4udCk8var%>h&+LMb_5b1e08|Cc1-$5nGX#io($j%35R~I#Ez2}X3V-r1|f#P(S z)Z`$3X)=|4mLBS$@Eojs43>wLvw#ja-7+rI~s>>M-n=5P}$x_l$xLP{H=4`Mth1PG$Kx3I>&@)5WCyj zyaEu47^m~0hUp55Q`xsa^B67+OkA7K@5Y}cJ4jzUQklhwRPT>C>7w>d$OqvhtI4*R zEM`R_5fc$G0AfN~8!hq5wlJjpkov>YcuW>}lxU-{Hb{1G`9p_?X`{`c*+BwcSIb}g zNe}_-Z6VVuR65`@nQrAFCuc0BlhZ0piOKYU%haSf!p(&xU3M59u(jNT& z?d;n(&LxYtZs`b=jg~sII-$E<6r8fykPf)Yp|&R`_O*lLK>qgu4g#o{b$4i^ zZO}>#?if&{Ir#L#1s;0DF^0&45anfBK zKCUO|I8Nnz07LCU>Z8#J(~Lt^kX2*~=h{CuR0Gz9yvLhnm>Gl;mZCXV1OHg3-Mm&x zCj?S|1Q`&agMj**&43=;Sh-;Vn>SygwdXDP%Gl#f+{E0Geo9cp9ydT9z-fRndkm!Xof1^uug~o)p2@-pAeMU_iTe5 z69mZ_t#grf>V&g*BASk=7tBpfeUj4HWO9@Ip`%InEYN-+vl1eS!Pi9`;ZZMd{|UF5H`C6hkHYKZ;`;4s8e1J3onos#}&mu2P#O#*}(?MBC2o%~hi z%m~0f4b-4NNc7E9wwfe^3C7HTpr3!^Ol-b~iQYn1iTJe^ULHpCCwyxZ@QmoBT(riUh?8 zI!cOK^QlvfJX7)rcM}xTsU)#Oek7+vrDamYz&{rWqkIWc4@40Fip&r25 zYsS>S6R;etb~N`sf)9d^OP?@Er)wY610+QHtqX734nW`JEAwcf4IQHjaQm%`?ad-S z)fWD#(UE6X!$-KY@EHjGLt`FdIpVgzp5JjvCqe<7uRaF@*eBSo`iw!=F*GQ57)|?r zk8TsjO^01xD8IKk1>{UXF);tSy*~3)(I{H;VtNZocBQ`6bd2IZ(l4C^p{kz+wAor!|@8i0`#Kz$x z6btL+deAm8@10gf8OntU2L&0Yc(^H`9wUZR=Q`!9&0>v$EVY8_mE4ef!SE^l8V{Cz zPHS2YYL_s%HduYA*>)FQ&j?_$JO~5ENS*!is&WWm?{35agqT5f!#KFw6y~VC?3!5$ zwVJf9)35mtXYh4_zc}s$7kuQg^2t@?WSGN&N{bA%0TgGT#+wGo@B#HQKxo z6Nyjy3L~TZe2q8W1z!voD6S*}=#~r?wf7nNXny_CelylOILfAkgqt=ijnc6XH~ge`Hl7edhE@|mp>$frH&mT>Mh&NN@y=4zSt(@f!D|`lWzL{| z35Hzp9ViI5U77$^oSwsiWNRjO=a2}jhf&)tU&ncW?^XQ09O(KLA&lgNxI@6W%pMUKT+q}s9Q1iiBXy1z?ev~0BZ#9 zo?#crt$M)-J#`f&IpixF(R~Ixgm+YRyq*GHu|SPw1Zl6sK9dBNhSSF^h>^TDqEy}# z>iceK)c5sUtin(Zg_)idrJVzFemaIKl%%~BL&}jC@I5vb34@a0lJX)!>TNRf)fTc? z%tAUU|8Y^WuNWg<44;*&lL!&LDb45SGSPVuEDQ@~4F7FW2Y#zeL?G>zV7^V zZPy~k_{c)I3sFFB3mbaCMnUopFk`l0Xb4+mXLJNF@&nw=qCdLX?n!aVWh)uA@gp_K zg=4vl)uspsq9C@BzW;`mviK*OO*F2JQC4~(g2ouDXX~Gb8#oKMOVYUF8B?F3V1m|d z9Y#ogyD}xYQC=^1kgqyB(Ih?5agZ-FYm?{1L0jIvOU;;}$Xht62v-MJfQ;H6Ph0DJ zk^W{BnN_900F^x)$Ev!)Z*3FeQwCnHx{Gd&G&VaSviTCq;aETN=v)TioO4S+n)hB+ zu3ucnoy+a>Xj_$+yBDl!Kd5qZ+3Rgq9mGe~Vy4Xo$r-~d64s83eBZ2xK>`TX)pvnS z*G8+A)K&#m5WMejNW48$;O37=UV~^N!afR+Tav%Hf;1+RQlC}$b8MbOthNrC(?9AR zxl?~U%BX!|N#j zVQ~8o*4{BX({0-pj_rz*if!Aror-On6;y27wr$(CU9t6L?RC$$&slq)bN9aY{+MZR zdt2Hw=QHMb$HeG;^jG)_6mp8u2@$-vX4BEsm9AHA zAfpLO4`hoD$Pam%>+H|pK4RNZM%rq>?u81FZr;(D?&dJ_bG8Uz8|GbU^YZKi$BN@a zf%+@F`rT9n>SgQv0`iY|NJO%t(8P~j@I`58xE~n}HpvrW11ihm?kd8*iwlhDiwUTb z@J0pTfa8Srb(Ol6(b+9gT)7UoF87{pbLX#6`kf8W$v;pe8NZUr&RF{J(i=8@Vk?&` zq-CQ~Lat#R{5tT2@;xF;+Zbi{8meERh4mgZ*1^KAqayWcC`a`_kP6sXBMYiBUKNGA zX9vsDwIUvWXy|bl;z}o6YZd(2;yEfW)26m}-~7wb4l7B-<4_yaW*>=4Qw^xsz&XZC zgKADQ@>@tiGPKAxE`)#A0|JO{ond_y%@FW}633@0SIPQbTs;a-9epyV1r?=R)Eu^; zZOrWxe8qTaU)Zv-KNHj^wTfEANtot~g%SQ-77{LqLszi>Z_bgm@w^s=P%vO81m^?; zYX}`mBX!(GWa2T5YLa9{h4N+rXcyUT2_|FQe1cmr{Xzzy(VK?-;y_sPx{^>{Q4tmh zx7;UYHk|zONi%^xDWV81BJ-XmZ z4wdbnmvtW~35DXu?0g_Hon*W9Ox-`{-9~!R2>qIK*9CN^qW9S|cAu*E-6Fd?>VZy3 zsf|TUGd%_bGCfX?7}uHaAbz!_rE)N=pY^-3CJ;4+nQNZB`|TUP_KkOnZu2V%$TE1Q zCYs_u%Hu^6jO8zLPeuVGLp#^02WT~E6nk#9jD_8& z*=`ArOVFktE`yMPv^MFzD>jzEHS93ZS|*rp`rBO3DT}ASjNPitv|DpneJXyn?d=yG zJ26Po6FhS`Xc0G5Y|3wFY-5s3#YrQ#9HEGH$11A!uWv%VXGq;>=P`%h^I-hBT!N$M zf+4l1hcP+{N2&GBgbD92fcj9ci7c;fXJ;u1bxva(OZf+nx0@Dixq#Y5OYQd@8XGlfAjS@ZR(2YAS4AV`SE5jA6`edMr zeMaF{&T-|^+H~x>s0_yF0JUhA2^>yVynd+AxD$Oh@qA0A`M^BENU4Dzp`K^lZDrt-Q$qYDrzN^#wIp zDe|im3g$vNe|X3ES>M~wgbv+?QguTLr^B!P{LQ4vjEvn4?^7D5*52+2aD-A8+3i3X z)O!1Mr+gIoIm>W5QxlLmhnx;!D|ryIa~hH~GCAAQC_4}+b|`Va4=!P7Jn6LERgOA# zNDX~T-Y4AINYU6kd;aVYPnJ*nu6ZF#fG$Qw=f+Zwl5}+6 zromr1qYd;Kl)(p>%9X4!f~VV?h}gzNi4PdPc=V469wQ|m+1?Q}8RYxXo+BWx7QsBa z*&i6I->`04oYB6wrprpChB09iM+@O$kLl@C!5-^81W=v0l{lG|1;SI;kHczyV|M}Z z9Md9ym05~luMgM_&u;enTK6-|oZzV2uryBjo0B@MV2DePwX&NV8&Y>dXxr=JH}C3W z{4Y=zqKmg}?fcYL`bK$)Q6ulRFNAgu#J>OdBC21PO3^*VIkgwR6p{{vQIBFXEMl@H zdGbZtR~I5y1V*!jLeiLrzR5ss*qQ`LQ?SD?(K*Q)+*f;bJ@Vnr(S zn~0CCB>&Qe^mWt^yx`WsbXl1{e}>BMIYfWCc>hJT zlJXY;>sw2ER_U4Rd@u(wX~n@cpEuwFHDyzFzl6L=Ov0N?!g`**h*x3~OK~kA=Pa?I z;&|aX@(gTnvi(mc(!@4U8`BV%8~U}XUT(=W8f+XY_U<=t-eMf-A8x3ZNYcQZ9%&B4 zK#>>i%5}DMFGyo#!waga%@SIGjE_A2bMrgUNue9dJp4#z7HKg2L=8@>bP9^%X=z@W zcN#e-etfgEt?*6IAYFkOc6}e=+Z^?&BbGhQZCf7ZmS_44ey<(kQ*-rmvoY3Sz1p^Y zOa(vtKs5kx_aQs6HdckP!FumYJa^W^8~$lNv>a8Dc=p6FiJ`I361%p zj%{`fYLl?H-~5PaGmhRva8A)w*QRoe_5FULKgQ2v7V<@+c9^@1!a+(x!fP(!>UU-A z`nM?Xmr5Dz5pD~lVQ$T{$eyo1%fC2!xS7S5v1#q5$N?c#59D{4y2n;gZ#c*$(GDW) zo4_LE48aOy$kLPD^k$*ua7n{sZA$M>5EZuDD_|kh4@!~hX%1Q|OmOES$?Yh3+hUIk zO#?qE64KQW=ex9iB8i&O-x5avqw=<=n_4&XAB%Hp?%>R_o@9IL5)JxvyPPiwwRj}N zTUC{ZkQaIA{^+yX7|^zwAajkS+_#arv5Yp(5IB9BvMnY~iK7f!NFYZhgEk#+^|1WG zvOmcDg9oF}aTt|d;|Oo6VD)_A}aM)s=-4PY*XWbLF2!^MsWH$`%5SAvz=5{yG zEOG@(pyk|l>9&$=-J4*6VV4?$oXp@>4^Mt_?GCp+hc~_xPu9S#Us?dsk^P~~}PRX8V z5)WI8e&h~8iT+Up0x!u$@$mOog<~$ZCx#L-#CKp&F5WYPlZL`>vEAAl1Q`j)LqXz4 z-+^9DpPhiTL6k1?YUB*J=r!I|Z-YwI&ri9C+BjU~FGOAfrWu5D@YXn@ToWtRN8!s_%A>K%9|_N^TZgT1)9l6w%`#T;s&J5@JZC!*M)4 z7~_Hc&F-+)#jGY1t^!E#^bE1=Siwb1`z`Et_@h2MH(Zdj6o16$(tpb|Hq!ebapS~U z2>BJ8nI}DRFj#p3J#&!z#)_07Xbz4vQpUv+XEUiE7iqlG0eewZRADA3P;W>-SE(&p zL>7Ek&1NL&8^-~|A_dK6o+)Jo3nEiK_!=nqND{NLsW30#SY@oMM;*Luox=m_=ZO6^ zx+On-y{Nh|@|u0)FUV}aYM>vvS>Mq$m`E^Jz5K!%Tg1;3WRS@VOM=jLrFh_EUDI~T zW(syO^&!XD;mU>6pH8kGocyEBogX-;3DHKN=H^oo6IPGan{-=9w`sMXjRi;J$AU5) z;Iq$TB(b->9+yA;taAOVHeFQNDy&ft=_oQkMk4Hrrg@*Nl9QzO8Jv z)M>~~-LO@V$xmI5VJ8vipRb@ieqCNq*>&u@4BnL+B&USfCY+ z_Ssk#69Mq6g@g@7BC7veHig`Hg$y!1{%cT#JtSYDc_3UZey^&jr zXjhogN9vn$Q8jV7$DUaGP9y#U!l63Z@vrY6zmnhU<-^8%^fc=+cje(0)n=O1O(4wl zHS~oyR#v;O796Rcpo37=LxEhT!ILaxjui&v*LE}-z7Vm;3taT>W19JQI`+=z9-rX< z6}8>M7|BQQCF0@%{C}+;>}d6O?UR2ZAd?WwZL!9OKICP>S&M>AiH{F5B$zZkJt|hK zKXMwDhRjh=fFLMhmpI9F9*c`Fv+dhD7#E?=@mT=AL@O1LpmUVw$)Kyiu zyVKo+&*G$MMz3t-?TL$c8c4d&_COXHhb#s6f&U34!49|y#9#bg5PVne733~2W;irN zhJANIbK`lwO4ibNEqV@vq-*eNs2O)4UX35wohcM{Q|4hpJ}m)-4|QEY#T&L;+zv#P z&So(_l_AVHl}d(<9FPr}eMBv9QP&bF%}fQ`-WjEv(=MhSb(mAe8pyT96SlG^E^~<= zzxIJ6HEcmdaS_HrcG0PUkkFE&)|@4JwVaisbms&9l}gL$IaZZgz*S|ozM_3Ji_){3 zUhngPD1y&?9 zLAnxqCr28bzT){Fz}!c^N6u;sPu$-xO>QCUp?bMJo=|6~nWI+E?+Q*W_Z zxyYI6EZtJe0TtM%4?^Ns_z97ZWYm3gZh=3mq^PV>(hnVcsT(go=5P{8Lx<_gLZQDO zAKWBpmDou~#YrpPNM31CvJe#zX*Yr`^$iw95rpR#IWxg08GWH{ zu;MAI0Dj1L3Z)(xXP9yHs^o`Ep?2r0T}#fCL4RAoSVi}Mc~b2g>J)sqt2>AXTq@sU z9!{gDFS*ddUZtHGCfbHI>0{&j)kGKXQ4b}4agSPhcjm)a`4HU|BHeWW0 zL}H>#Y@Egg2*eLa@~l@g{N4EQV*J+fJ#vjPs}6w3(y@s!cpwrc0Y5;gGEG&7wM)x$ z>%C=B+iHRJ3&ups8t~em5psxb)t4CV!`8qo&;_qy4av8!m2JuO9;yo)f710`5RsU()^$6 z*e<^t-@Ty>P)=bjH?h8VG2br%d1j<);FR%4ZpWSa6P>o;|G`mvi!mw{lf4Bf#~@n7 zN#2TB^%IJO5DzVs84eD6c?dO>vIQXsq@??dwWOF)lfq6kNlM zD}b|O34vo4rIZ8@y{E460=ItKXhg$NphR(4N zF_6K4JycKqks8mrmu%qgYMt#JLBw4jcRU||Td)2UIurSe&>7KRqk^rayt1ggs-BXl zn;r`*y&Aodqq>U;?cam~_9qZb{%B6F&;WoS_g@YOg8ZeW@P}{y`E<#@Je~4ie7cT< zqn@MDpPl?6_))h591C7I< zTq(KAA>BXPUtUT}-AE2wB58oTxvh;;&sKUGpDjSow+90Ph6dl%_Hi3^UCR#?3$Ixc z2*d@pbH(d&tzuPk;eBs??nuH()oCF?-Ihqu$^WMw0tg65|EG2pd$rsp?=8o&x^Iqd zbhlSBc>lu0B*y3uq%#m_yBhyh-w$Eby>&dgWu5K|-eEqfR4c-rl{F3F4#y9YqOG=BcTr-^h<)Ma(^ z#`)Rrvz}OqKzClnFnn6&*XmoG9bFvIT+Q~mMSX!gxFv>)pc-9w|A~`yAp87T>7x+y z9#tAvRu`0k(hmg!%E_q7Q2q z_=OfR_n8Cor^?8ogFr^Tp0aas;iTk76V1+qng%E@+l56%`9_EA+a1nj75l08wpQU2 z>aRu~cKgW;84`5m!}U$THnUR!;%l2o(o(mY2gRpIFi^)>OckO0Z@8Cwt3!Iyg7=5oL(rKZNgoW$BS0I5*Q{PPPcICfq}V5={FDypg*u;M1=i-kuaZ znwHVgXoLd-gGK>Oa*d8mrC;mBULrXcqa74$`XgUVy!j8#Wei}6%hbs2g8&!et)cKO zb+L7;ECB~%%}TqcMax=vgV>>kxEU$Cbs?b7OtStha|Hmw1C7etfqF$i(48|b*|XQE2W z&Nw6%BL{^Fje*!=6r1aRkN%3bPZ&Ke2T~k_>d!;rNf>;;@=E9qzRy>i@#P3ZK{sCz(L^&Iy3mVNu}o3s6u z(@J=ou21Ih>bZ{(16mA(Cyb(bkMZC!Mz*ct5auKP45%`cjt?5?LK4_}gWvAtw8d&s z>vj5;x%fN>c1za3#f&#= zg)gP;qG{G?5XoIPy`Be*?XFzi0y!A1 zxITQupUh%RJ0CmuAHxkCp1k-UUYOV$>T#-&>5ZpW)~jHchy(m+LTtHNoaSTT+>HP6 zwFtpKTv6k{#V$FI`R;4RwA&!Ta-jy;r}zliZOR*9*XZWMw;>ef0_Rq{TaZ34hl(az zAB+QVrG<0-GT7|Tx1af{(Knt>ZYAqQ^5ST)AtK!jvB=8W*K9|r04G_~Y*2~ZCFqc_ zDPTx^!XemPf5qx0S94+S5)(r4c*hvcXW-WmU`Mol$8TQK$KYhaKbw6TEITlASM~C| zL4x2k@sUkHYP*1W#VO@#cSb;8XsmE_+&SBIbp}5mK$%p3aKRS@Ji63Mt(1rn-Be_u zT+|Zu{(?TylM-5H2Sr{mYvX5P3OJYs?z$7uyXvT~>{a7XP({Gtup47!-Rd}@*gPb* zz1cU8UPZh9t1f_?=4H`#hO~q{kv`4PpkqoJN^4v-R~6x+z&#`-o&aGyWj?~4k<>(v)^(} zi9VRZdY^yDRAF+r5inR;2hB=~3XDPZ$U=bth7cob&U?%|##6$K&J;H*pNgY`?F)1; zb`2%DB{??2om~VzfKu-5eXhJy)SE}J^xzFc=fKFe=SA%=GWL=2ojb9e-_9^6@y8Y0|o)``ZT*hFK8kO3ECngk=!Y>)q-(n%SN0cfM4i}7{9I`v` zw;8p`d&nG9At7kzoKa?|2!iVR9Dw7B*7T9QT7xmk1nkMa6!Szl8KnyD!-Q;*n^}jg zQ#oWsDEr_NqJ+iC*X;3*&cDDC%C>to-%#}GDvfKyG*+RRPf2Sckn0e;Qirq0|w~J#usf(5KnHNPr$?I}F zk<7cxCXx?VgO;q7OD4+dZ&y9G<2!wgBIUZmk=a5m^zw+{O#)1nVb>c9psYU=m=ry- z8XeZC0u^VpT|1piT|p;)T7gFO$)}x{M%d>z#FjSy;MxXqmg3deg;1ak zv9cEpPtW$g0#{vbz(*4>S@m~;Pii+ECoXr)SL2eg0{HY2*wnC%7v z`rP*RB&U2x$=;6~d0QmoPRzxVHKadEv*01r9L<3A8??-vw+^)9-iI{f$Jn zw2(VQ{Hcd^LFaa>Jy82ww(;FuBpGxuY78>_>pMrBlb_>*OKTC z0#0AzFG;f&YRNuhc)tfs>T`9n{PdDn5c#1;x}>_o33EsLgj14NM96q=RgihgtZvlz z!C<()ex=?b$8;v@d+*1}c3VSix?wR=1d7)t6;nONH|Sk}p|y550Z$kgizVG=XE38` zQ*+44Z0U1rXasJwm1AHGTJ=#1aPJ_(lQI7G5MTD(TP4!8d^lW&Nk6)5S&FXLlgxCM zm-+!U+HL>^N%~MV+fiU|0w4G4$4J5+0=zu5A}L5#w{%L^%ssR`#*3Sqy z#kNovf|56Md;}KnD2l-~Pi=h}gNVj@o@k%osPzO>dCcz&pdZ1Tt5zE7fN}CW*AZL zPUe)?M-|WjGzI1p7GgQPJ10=5w?B8~eNCsO#L_9&o$W7ta@!a}7?7l(9bC`-`}%M# zA2$|-DB)7m$KD&Y|^Q zk_b1mnX36mLV_;RA#;M5_)@bbShap<*#F7F6iV{oI#lPYZ5u@}$T%Xu0ecvP9kP#W z*zmjK)$jddudS&fA4y}kBykJ6%d1U@Ju!jLI!AMg`KU-@t%qGxGe67}mOfZL#`^w6 zD;DOq^g~8jN7YPgR_e{*ZbYeH$Rq3il5nhV5?B28h3}2f2IJCg^sU)qve z?x*kjVHdoW3Gu)ZNN0vCysL4c78S;gZc?`GkHMOPvt5zXC=6Y~3M6voM}+I{gAd&vuUv-0+FI-l=wlme zOP2t6YwGfnQDxX_xzbGO>Te^6w!y%MzaOwu9-o;@$0cM&F4c1IdA8sw%2Umdx6NSR zj(Ys$2zwyRM9+CJFm)vt_vLmm=o@JWG73p!%>1zP28@d2KR2q4LYt!po|u>S)U><8 zJ+jv+vo&uu4`dYhyfd=OId)wzaVyWWb)-}>2DY_527WmfZJ+ae^#_-V>BHdRIk|IR zYQ)M*A&lU1Ms)(Af)oVp4uL%A_KOfsNaYC*zOU|oV)GjDit4nN28Lo8B3}Ej7ec63 zJ92K|Y7R(>?2dFBgYm&5%$76WO5|BSW1qWp=zmAD@;`nHHDAQquc8Oy1+y zzuDuKa2xdCb4QfV&l}tMy{sh*e@Sj(1IlJf-FAVTSDTS4d6ADTgR=3m++e*^Bohi2 zJl31G>}$%#?Mc4OCsL|`Izzx?W%ug?3PGfbIuYkHHBZr(Khf8`4FT&6Vv1BR%^rW1 z8@Rfdui+OuCsgfK*jCxwsEi?fO8eu)nd{{{@`c>%qYv*ja*6qG42hxXg-NgYoi=Rh zPKr?pYMK{{aDVFxWdIu!fnb;gvAiLyX;-)67P=*G8wUoJ2_)7CWL(n?4mv!5SRumi zgyONbBti#=$~0PbR9kJ{*_iXD=T~gUNaE;_1%Mh^yc{?0H}3K^J2y%R4rar6MA;Pg z6NB$y%WXX^IQT7&zS5f_&LBCxBz9m50EY!Z?mwiM;cVG|H&+c@Eb(}fJ{V@PfSpb= zL~f$2KQ`pK^})=-4&;LV)}2Xv~1h85*o& zDXm86p%L|yDu!(TioKV7D+N*oCh>dA^^rRE0?xO0hKAsKO^LzAz%{auLu{>Z#*s?P z%sNfkd&zB-A9uBn?Hr&d*bCqjDZXc3*98?sR{u;o_%UD7f@}7(K!JyzX}T8r=!}zIdPddWYpAs% zKyOZ>0s19Qd>%WXHLW4%)r5@NEJKYEuB`8J1Ut7BWMpXaulln@MP=%p_PUz`#h~`YY{?rx+@)IbESxyJHEHfy8A#W$ z@>w^`%<|@Pu= zf1k&SWeBx8N9GKJ$Ue6(+(T zhj4`(?o_)5)05xBkU9!Z9y>04OO4h)h$K_JyeXiu^iqHOBjaVa#26&FbQn*%6{C7I z&O3F5kBK=RV$4+FQ4)*Y@HB+l^`ue9??`(eYmh?CkL&#w#78la6IZM`-Bmh`eaWyX z4wew&lMd64pZAxIPpr{qYFzaU)k(7?^(slZg`T+leUJB<;};nHQzmpI)ZDaC^HD~B zR##qH(x73}tZhmNB9Kmd?}ilhL!JAGi#bAA^Txx*(wflrs+|zcZWTE8) zcaZ2!h;vEwi#KOBm$paB;#U{Gu}*;#Q%WS7|H}kL@uX0|EQvlRwC?GOrLxX&A8%T( z_@_bjiZ`M6;pT`|C-HCN$BYbz2CAeKU!CPuWus-KwMUpD%5=myb6cHmZF(g*(%lhHwVl_?|59=SUSu#8teCw{bv=Qol2#Ip|VXf=M*Q^f|yiDwD@72 z;|oDIieefqR_4;hbAZOA*|+wd7XR!`$2q*-I_2NM^dhR$faW&5s9jFx!L;*8XYIV6-IU4D&jR# zLPY9AXMDeOgq7R5Dda(*j~4S!a$J0DIzIzuwk0Ll_uk9|!BJPJFu3T$ic30W5)WTb zB|%D_<!gdM?Y&2FcdX&CE@MgdNd-|Mvgj+n5Aio^@TwuTKLF80O(xMzcuwtEeQe z@ir|u@~&N}pI=*i53Zvs$vKG^&d2C}!S~v=EyFyPr}HM_@i@HICJ2Dk-~1tG6wgP9 zb+Dq*J-xWV*zmmPTN;*Q!6AT^W_%OI8mShxQy7` zMDghTTvV&%cgyDbkBeUx5rG_8dCDelWjUd9$#6ka7i*}Y8-&!2D*O*{aMmatJ{;lO z5gQ=In2#II^|WdlT7fX}m@YH{Bc^NK8v3Mwc3qz7HI{j>yBuJ(gL4~_E(>H;yAGc8 zQyY2XaE#JNS#Noh+WSj^t?#$>buPbx`m1%A(6K`|cAVg3F(Wu0tRfAK8cjL#WN;$z z6}h+^SMy@$&N^q_^t(tiCr&jNBcVIXjYa(tO^>B+Dom-D7ThFLD{wY19qN+4L4qk_ z;Sb6v5FmD4&6VVn8WIfAroF-pOhP^Vo`(3bWNC_{^iu2bQR!i3**Qjs*A~jyD^U8- zU&5;4`e`AG0~!eS0jme4_j9@#n$-I}WHB$qh$(l9F0@+8bm;}_7@HFCOyQz6+JJP3 zL9%Y$<{&-7Qef|i|JY+aXHt;H)+$!0JOOzcX*rvj99&CgDz`N#sA&0@ zJ0K2%rbJ|b<~uBSkVona^WYj{ST#Vskb~Qa`fHo4R}e~hL{Q>Kw~l54WgSXke?gID zT3M)y%6fgW8`T$iZ@FmMV41~8_{hks6*cx^epg0FjVg*e?9t1s3uMJ2syfi;in(}L zONOgLsHzB4dFsYAX}g4rU|Ec$#CFxl@1K9~jxtGdB95gi;Hn`@#UBq6d|abpG-4hz znAYi2pp(pDU6pexFhiPn9S+X<8bFpU(ca_kp28otGKPFrC*=z*NgvoXHE=ma$uTgmTv9r=k!m@hSkH$UkNg?bJ`;513GYp?{_st7 zw58Q<&wmOqYcP#Czu{u?0JqY;DedxM`QV|OUIk8;ym>i0s=H!cZm?gQUJtkt0>}W{ zjJgSh)io*nXI9XyrxKnn0;^}ISFO5z>HhbzYwo@IijagEy-h<`{DXG~rYsC~g>i3} zb%#usMd|)fgViXM$2I+D1*vk-fg&U$QOu(HJvD|k>c%sjs69n&?j@574P4$z6$Jl{?7@W1iOyA+zG(tD?G zZZ}@%Zc%>cpQ&gJ1|gLiQxCTcZ8_h+2S+}o?Ue1q=-?J=q0r1&WUML0BqvRxwi836 z|BgzLLY<3^@`gBB&f~lm>!%!sU8B55-?9%JRQ--wu*c1 zIqg_25(9Up!Kd9tV=>POKojt~K1Q#N?bxhPu(dAEV-LsDx{Yp<>J`?-Nc`JpGu5lr zs7gL25JWO-SD)0vUs0HAL5Q^Zfn1@FDoMUypWX39oAEcB)T7^S9{?;wzWh^gEgTVO zSHpsRQ3S77-shcPsPEO6|JkBFTpnNZoNrxky!Q##hm~b~TVB8d@o(m6c|U2BtoQd@ zZ_i20{=_#f8zkYM zCzVP5#k4Qo-_y$fO~&`1r&u3vHVAJ`7epy|B9^WlL(J4{z@}9el>xAw;OvS zMZJ4Jku?y}Gtx5Ba(A*dR5LNtvVUn&GqI94hy~h-i;5dtQ%wI} z2T~T%GzOCoRIV6!E)X6m;lay8(G~gpcz*RA+((0v!)tJz`p>AMGW|&fNJ-W~moNKx zeKpp9*G7M)-|7CtF!bd^x_`94Ov*ns%qrBMhDqRLyj4)3+?AAMR1|==2NK)>?)xUV zPWf$O9F`D9QIcS6&I8H8{wD65B*X3PE~BD1GZ2cqTB<0hFqkSBCK2Wl7$z3_Ggf>+ z!smwNc# z@(S_Es_AiAlV4+m>DQ-GKlJt%-t76Q9hef>!k@5XHYu-%r;ec8j_Ff{`=93PuecVf zf7y&?)`mu|e-A_#|7f@W8X^2@w#BZ#46^kFfB6SY-G6J4KYP)kqcJcx`kN8{hloJ) zTQM~~HObt3J3UJ?S|>GWH&s<3K1E|30Hp1yQMw^nwQ2scxF&eABSI7dMD4Ct(H;Yj z4_+c`J1QtyPY=l^TQyn-2IUj1z<@860pD^EuQ;1BOdE5YXz)a?$Bm4nV4qa*tLA&o z4L;coaf;l#REAt@x-e}O6=<(s;Hh4<@SGArLQ~)-#Z~sr2&t4`Hl|wK@F7g^v^HhOr^X5Z=L$?v!MQyvvGd?5OUdZ+Ymtj00>b50J#6n8Pu`V zk#aIHvNmF)`!chkv(^7(<^nZIQzda^uMK5dvpHHjeWDASU_oqNB9a(Wsqye!hUnb9gpH1P8JRbSu ziSd@V_*C2uK5Ke>nCUEYU01hBEQ7BVcFKTe(F292oP79ke(M*7YJ`4ZweZpq^REu_ z)5R&Acwi<94u4!6AWqJdPLYu#>CvdTN0AVtq5G7V|1X=>T ztY=de4@((l%Ud23@Ok{wA*F-^f(M9thWhTXO);R27|M~q89IGuDL`1B45AJ3Hlunh z3O-5kpdd0A1Cha;$E=1QkkI`-Q@}uIFh-x&I?H(7|K#kdiAFbP?QszJs9GN#Jw@5a z9V!A5LzVI&bh>IcUyUqk8eI$e2VnXwGA1EI<;;Hl>&$$Sx5ReKd5}k$u4*4k503A5 z{|q|k^{bDmt^hBC^O+&x*OIfsnzThMkJjF0XqSkNC&3x-4<27Dx`!9whQAA8| zk*>um&%jRmZH|G>VTc3K)F3%T5-a$Hh0CvR9k$&EHd~+*!X||=1 z&clD*{*0NKZb}Pa2iMLY!I*H2i{HB-v5Ze~azSO2L}onfbhw+TMnNZrW>v#Jnq+0W zQjng^&v2NoV93j$of9HMtX`J?%=K;i2IM^!K+FipShK7#!ZE zczzLK!bE6;MD0XXU-ThQMW?;ZSQR17OV4taHgj$TuAMWo!sQTY{{4uIlY;RK8znQE z5`__=hGlza?N?ov@61K+^lq~=4k3ef-pI+yM(#<(H1$e;vb?iP*glIWNv=rP-nv^J za1+@>;(LC0KCEPjrw^Xccer+$xVa{wHA4|%bJcM&pCb=nqoY@}J6@MzbST zaxrb=uUq|82ywuJrN(I)B9QZWp{t6B_Ev{(>w)ka3kOIwbBBRlHVcP=pFT?G8Ew;` z5O}7+(J1cGI;z zTjQf46qIUNv<$pRk?!t%c8&JG#(4W6a^ds;(-?32|2D>JL8E`g_*n%C^gm)eXZ7(x zLIEGUo7`$DFOGh7pm_UFZE+eYZ{h&`btr}skY2q|e<+e(W()x4g7^c0{**_-6I9fW zbL3*YHpcn>Z+JaY5NZBc6vt2uIHj?K02FNS`ADY-kuGvQ=t@DxsC)tJ9oaWLcw79^ zyXjykQs9_b;NRY$bJS(>l9j%e6~rS>z=i#wL(XE!rvcqxxyQ02vcE=`^pAs@k|*%fFbl(vH|3JM)>p489hbAS#TDL)k`W852&Uk1m9*9GmJK0_ z12ka1(|dQ9yklM7uWJ!So;!E9L%1YB#u2c>y(3Bls1Z?-5x6O7MKL3WbuB-5vS^W^ z;^GE&=jS_5PEt}*R#sNtU*WOYT(9I#t|rCil9Scgyx#g}48}(kw+DdU!}%b35q^^O zGXiTdU0Y2s=Y*Xq1neV^c2M3iq85Vv=S;^*5-DZ_@QlgN!xJdWLafXv{4k% zf>V*tTv4cHuPT;tT#zV@J!@NI!GcAcVOq9vLJ6DKV!5{%T0$S$W*rkNts%We&CRrt z5NlK!6Wi!#wRD2ojh;`IL7Ai27hd!>d^&NkXA;>ZV$A3e6-9;( zCz>~-WC%0+?OKkY<-%0NV1??tY?Nqj3gRhIpr+FxF>1r<>RDAT_1JuS!Qv{MHVO0h zw8a-jSk}erJ}%4EGV1bAzHg`0&~5vkb$ZETKFa~u%XcuhfvJi=Q`>gOUy! zYJ{@mzhpX%HI|)1He6A(NFp`M_Q0eYEa2?4>T1s8Pn#DaIFcv%&@&e2usn_+8yisO z>~48__+dFm0w zNyr*Ic*91@K}&kui|DCCl0&H?68%(0u6JT1NkF`$2EsdZ87S-Twi>&C5eb?*R8wJA z@~*Z)5FMypo5S2Mn!-FVsVQ=;J5rL1cp(+5s`5 z0szJZ@Pi7*`w0V;{u6$O@ClvgXPqtFWFKfVgz^(IO^=B!Xk{<6PL_7VfWDn^qu8Yu zX56L=TSDfrp&k)($lx(^2D8S%!;%}#i2L zBiBkg2pwk-(;L7M*F(-P4%dqgB_Kl|;kc)%i6v91CM|$XK!W@#r(c1utV*rq;qIdRe9EAYuZ2H$Stg`F@evEl7UW$T8wb0gES-+je-m2EzHIl9rY z|NidyI{|emxWhO$$iJ_T&T0H1u$Gg015>P-+xOK+JoAe~33|8ps`KIYSCu6m9z`mo zuj7)*SEK)TxAk9F1^*)p>5pS0&H0}vCOy>j)XcP0)!me&#HoLBTH@Eo<{O99rz3Fi z^$m#$BkxM?W2IN`;Z?);4ltC_z|0|*==EJY-nk0rl+r`r)NDmj%t&g zl%6;Wl^@E8pROv^o7TUjA|KvZcADxw=s&JmD z6Q8E`H3hL6J^wHVT8l6ub;(85lSWzt?#cHsXUdBn=HSbg2iIp{F{PshSPuOR;PA%*d;D~N_L zn>D2{Hz&#WNX)P=nU{$n)A62>?j8U@83jH+Sh8;9EdNs5B<3JlGkbIG(!ggQGF?6Z z5u(&ML}?QmLQzkd_8e^uZ5pKzsyI3^A{_Hv{;&O-ggOms4RWC?u+kh0&cJEprzyZW zI#b40kBnjHl(2&iat)7x(BleH_LRN6=OOsr*S}}!1p|5|1{rIRwD7DYz}~C#q`Km) zkf8EOQ}KP%;cE;D>n5p%+}|f9J?tkn$tN*E+c!B(pi5C3-6v7$PdY>)Ei4!$O-$S$ zGAZm&`f^OvB%(u9x)aQsL}cPal%xHkp`=9P!r&Ie|Btn|jHxS%wnp)TyB2MsNO39d zw8bg3P@IFiyC2-OP~0g}+#L???(T4Khl8KT{qpjXd-J{T=H0wsJK5PgduPp=HRc>E zbBxrd2O~<7cppVAq)0$IxBvrUy5C1qkVI#?Ur^XfQbgPj+2ek9VQftNmYQmk z&S{W+twK6aQj}1-N8-INYWtzagqn#?{$-)&aDw~)5z(qa98s%hqW=<6oth+5t+#%^ z68nFUn|5z?w$uL;&Hqhqj;U{0(SD`KUQz_4=gZhC8sV`wWvSYnxt4E}G!Y#~Q^+LrPkJx*vh`&}S zU8!b?J`5S~duY@foPF*lx{-SB{qwmwD`m<0SGB+TRN6nj(Zbv$LTUKFA}Jj(hqGGf zcRiRWcf#|nKYYZO$HQZnT2JL_jtYJGMtQBd_j&p4H3XvOwqL((yGd$W@EmEWIq=NH zr8m^Xny5`3g$6e&P?AhDwtEwqRI*iu$>XA*!*iy}=Mv&eKTkDsNa`xMBj6;9K2lcQ z9o!FnaB+%Rny^hz+gdc4nI>XzG{W_}Ov3S7eueAczPnePBvS|g@A2B1b6(DHe!fxQ zqdpFaILD?5V!4*d9);QOavsYYt7!JPxU3bY@@f)Ej_cu@C?X>u*~|x#G*<61*`zn* zlRa6t{!3ek1|;S8o|u*wt_7n;4e@rclG88oocOULX??8q{P~a10pv``MA9k6FZz*> zMNz#>YU#Z(8i`@ZS+}*88Vmj%f;;}#2kZuGM?XUnqtE*kycd7rjNo0Z2a7R}yK@e( zTpbE6weCY2>^w*g3%?J{!j|{KO{LT*%7!Dju{sBXDTb3j)W{D{Ia>=wtS>e(&Un9T z;(FR6Rz$pp7neRqaV4DluA6I(`#yT+sc&T(f$WTN@sEn-$C^3}Nf$@K<3d!r$|eIKOHTd9trx z0?a@MU&M7^13WU6L7u!;%;^#fX08RVf&PG*nI!_2>Upke;?kvFL?CGEyHl^vHv@c( z%hm_`e^54B@G4bhzwF|!kA`k!=;fPcnGBcexn3}bxcni;+UgEk*jRZkm@Y!dUxLp7 z+AEhso__90VA7N#e}xPFiMlmi6}&nbKt*flQ6%Y28u&rD;Ak?KzVuT zzNc|7Tr+3}eea!ozy$pO^2z_=3k;|tA`fMy#zz(r*c+8gyCu6?Iw(32LzDm&lJ0_u zu2Rn`WoCRPvzcsbeE-M~n9N%V!vj`glkT4vzKUOv(2a_>EdGHiKLu(New<=>&q>_F z&~kfW0)Gz;-gkW8i7p<=ifh?r=z2=$h}VFMqr0x_@eB}auoHvc{udL;M!PS*g>UG} z`M;a8{_hxJYc^Zg|6?orzYzA||3=u&WMHE9$=i9+;Qt0$X*lU=OpWzRU=y7eFfqaG z=s!e}_}@@mL-hG${r$1R$NZ%zx`_30O>oWP4C74V%#@9lO_dFljV6sJ4JM5^^f?SU zOfO6?f{RT;5QvG1c}0N*DBort4OQfJSpkX%%;aOARFSYS61|-(vywSK_aL6R0 z8G=avWnX^~*!}tK4XLx=_V)il&0+h0CU5`OiX8o?6-n3no$~*>D!))rCqt$YFflX4 zBglqL^pOl*8CTvZV$mj^kHO)=!HWs+qlzy%D5v4%g`jCh<0fVz7I@HDlE%-4i7yeo z2_H!=vGULQJ+q>jeD5@h!A}$c$Q_H%qIMHz!Wo({KGCPWL!rw-|NNUM^j)0Ck#gaC zY^Wc?PsEab;?Q@vlK~}{y*uobjNF8=?{pct@nYZkFmjWGz9Xi2QxE>vn;SwB7M)|M zb-8GQV4~D(l+2_$rbA&Ve%Os)V)_yL^FMKGWVKqNSTF0G(ZILgz;8fQ9n%!v=a)$3 zb0{`IG&CztD|)-{hoL$q{U7hG5tZz-V}H)!*+Fp;Wx)PS18SB^&Euctcm)Lf2Q|}) z^c<|l@?Rph^rOh}KcYpA`#*@7?SG5JzjV!M)d)M>OqVl_XKF0ntYm*Vh~p{LCh&}9 z>)UG^^|%_LRrP~I@U zWujq3eRrPOoUp3EV1bM1MI+#JE&>sPWN|x<4}msPvbF8h<3p16h}xH?SF~)@stNrL z?@mb0O+{PoWDi#gnh(A=s>KaVGf*BzwUwx|Ge+}r{o{ua;k5iF^7urMVC2{-i8cEr zsk#=nD+GlrcpfwJrRl^G+-7Rd$@^AbJm)flLqq{#w#2f>b!KuX;)^q2wmB#)uv{^f z;7f}jDqT_dYfBdzo_gx3+m2*nUuKxMz?_B+?&PY?w5?EJQmojw z_)lZd+>wA&$~Lz#`qQ?M z2TSZr?CNt<=H(kqR3jCRlD0b98^WVL_pN@BVLnXK`uY)DX$^c1r_BuZx(nYp(eh}> zRR=PYqyBMt&pAQcitrt$v~wszq3&&r>vqpXsxNpjr1Qu==#h;OZuhN(a9Y!&b82VU z7~`oPBHX$o6$U287`0-HJ?Wdv#aetShblTdts za@4;~QA(wBIheLTL7=ffnswIuzMi`&KAQ07Wnzr$b+f*{T!Vr};V4Op8Upvb)la_I z;!Vt9lUQ{l)dRC~0aqWNF}#S7wd0>3(LII}?)i?*hGerwo+7Lg*>`}wz<9dlJ)b^S zJ~SofhC`2GEM7w~U-wC4#EtA~nI=o=3C%aH(;2s780yj~w|-nrR9oppGzLl+&4d5g zh16u*@HjS=YG=3$@Ya!DFH&>Uzu%5(u3*Ga8HiXPWJ$o={0GZ;b0ATNmDGs@% zBv2;ho1!446YHFWr5yMT#H7!DpylS8>ccx8)G(le_qTT0SF$pz~TiLESCcono< zQW=Q}`S_VNf_Wllvd!+FsuPDzrA?Pqa+BV4FM!(2>=(O?2Pw)>D^@^Zx~f}G##|IC! zRY@Yb{W8?d)6=xnlk>%kHInm{2nR`6W+g}R;i%>n^K*;Ej!h~|h)={(e@Mb0*!M%V z(!SdB(?uaLtDmf$<<_5IpOrN}kaN4&YKHb4 zn-kw16!_N;IV?{GN}-ON>FBZ#^{++qE;Db7|nYtCFo@86c2_1-YrKX-gjqz>32z|?`)7ct{7K1RRYu3#VPYbmYSyLr; zj&|LscSYNuACA6X&(ykA*m59$5!q3O{LQP#NIteP|CRHx6dU8%WDCtjQF6d<$qld* z^ZH%fE^>5JBkurBOz0CSDZF(6hQu|OkPzoh>Q!cw(Wuk+)l3XREb9J~k2e*}0LEhV zDhD^V=uhSrgPvT(HdGguzaOrl9Jmo19>cIYH(dQIxH%c@K@sUykIX!>lK$JO&&21; z;n1_+x6lbP>M70?-I@AAlO*T-_u9;gM0&ld9aV}X=5dWm&)&%>LuH4B1)tedjzdf( z5X&#}dk_Qy5mLX&i@l70`sOt&0u(koL{XK0S5|5&%gf4_+Uxy;)8Wnz&UA6dSmC=r z75hoLGH)WuK8r>umN{8wTkX`&lQwr_rq!n9Hb-h!lx;o2pB5_kxH)-H zcf?=bQIblDy;SV)S6wj*WQ*sG=~Cm8rvC{r2`%jWNVT+N5@X++A#?D3U;o~E27SG_ z?dkom3t9=@fq#6HyNf|7kwQKVVZLH;;(SSPx_}>a+;F{XGiSoFq6rdFO2xmMCuAI@ zL(mJj&z^-}V(je1;Ss4_HmWz9!cOa%Evt5>pBYMFRDI7lnH9&wzvld^(4#|S+eAf2 z4K8!4Z>Z;h9P>RLTEC(yjEoj@eymnMCocFLSarzw)`z}r(<$olQ=^kda<%KfUkyT# zn11tpkQw1w{x>Ifre6mDxTwz(GE2IwK3Qvs-|_Lo!`M9LrX|HI_<8pm)}3<2o9FjR2!cS!o4>^Jh|-TJ%JK3yo6-PT;#DhQ zLs~5pRlK}164vdyyeF&PULRJjjY_SA;zkj|BJaE{mGFZxERztSdws7@S6U7ju6k2g z^^U;wFeQ`bkxDS>GFwm*RiZ8aU#3MjVx?SanS|`Mwss=rZ>#ji8f0BM1A+3XSa>R< zE&5ULCsap*k}Far%#rk(bwU}_&7WG_DD3rdAYEvkdRuVz!>!kua-VLTfa)r0(M4qPsTNKy7Ro6DnSY>qNJO+l!lUf#kq{!Jx!}1{23eM4^ZY z@`GpK>_wxsGW#gTc>?1bKdxMmZx!O6Qv*M~c5F;QUJi})-W?e@pyx!S;Hr{iXA ze*w3yzab;)kq1yoRopqx@kPO?jpfRR0&K0ExrEGOZ> z{3?dhuA33nKU7X)A0d(5N|Z)h6<3R!DBcJ5&mo`G#-ZFQ3;fByMU_gAc7{beNK3qT zK^yr|ASs9CowSJk%SKQRh36XA=@O&X->%GVAwc8E-c>nHV8K^Y-0#1KKESzQcewhv zouP!|5K;RnQ3)98#ORYo34c(C5coieFH~clE?~$s-c7k$EfWJzf=a@Au>PRkaqPcG zWiUa2iLBHP=OWmh4S;!*3-)G#kPzxy0X`Hxoo=K0yBmS)VV(81?YMtCV1aSX*tC2x zAoP}}-Ew#9kh3l3#%&YJZ)ePn*zMux;G5y{6`p~dD5MSp)(->GosD_%CZf?lXPs6i z2@bgVauHv8f-8le@jdzZ7$gv0Av=@x3CY4Uv1{r9IQ~B9owPWo{3x-$uTKqZZWWRs ztt%X{d$|j_3j=#guS@)(78Ph;xf$?r6MpuAgK-uBGO%jZP8ylQ_SjV+boo+4 z;o9rT@38AxcRGm)vA-+ANKOj|pq44eVVGbVSv2S5B0UKA*|jTdYvkM4O%RWt9R~w! zw>`I-lYwa1;A;Eadmx78fHVDJED@ui4h+(LiLF6JRe`e;Earf1Cm+}GK*k! z*kZ?SbcKqk`JDmxtbdyd4~u+Yj6qV|)R1P0-j=RV{K0mJmo?&BqI{yl^CH}##$vz| z{CeGub!2<#cVFK9x?$b*B&L3U{IsBuc&S0~HI|~AGgbzrK2~7?>1nKnZrGmDGIh47 zp^=Jq5)5wt%$D`E)NOKC8+@9*f>PQvu>l^=;|)y9AtXJsm!=!vmZl$TkxuNXZm?3J z_m7V3Yloib^AA&$S*$tYhr zKpj;sXKrrUIpVD2uj6cTxhDhAJ27x;k#GAUy41lwt9=dN9GI_>Mk5;_;;1osKqpZv zU54?PMXwTCpb_xi1|h>5Cvg*ko}4;Cd;4r6KZu^*65LPQ$q zW(nBkAMfRWW|K5f71>w1CtOCXpmr_ySq-e@)DrMTd>5K=fM5Vn_mL0o-{9E77?83S<`m&12$!9TgKJ(&8c}~Ii#B1jf2H=^_uhu&xMf)e z+uAQ8U%$*cg{mz~tQs4pPf%V>_1 zGtCNpr#ISfrvWRQ#KcGFK9YP47CYg1_ zjB}kn9>myb*+NIpTScqN!YNx#jbmYKH~ltAeYz;1z4_4a@)vaH!?o_!x`EA(SZ{k7 z4zzDB=3A4z`%Nwf@2o=#$7&+;WJGQrAOsk3;s-WS_a}syISE zAKHaf?7bQiGMMVHvT(!{vZ%u0Xj2D^mw=JA;wpk?W+@NSNGs{rVT^j!>0a|T*!2Rx zSWdhxa2{iW0VnL|?T7y86noP9p7^l7^{%b*_ML5vP*SwIo$8_I*~C#A4?MvUL?5qL zkAtg6k1!aD+3&5%4fuC2-S4~d`0HTIUk_eCk6f|@^i0wY=li!U@q6@YCVA~nH$k*A zbl=%rdKyyGeav4c}&x?Y^XHp z1N~JT{nIw-eRorcrPDEwIZ_&GeS+^3){-4CnKPNsU~An^_>-qZAcL2sGplhrrM&Pz zuS3lPdd;`}9tSvXP?#~4;SA`aOn%Q#s<2Y+f11kg(pz2Z){BpQnp?Otb>ePE{^$nK z2GzB~GLc_e9$(u-v0<)TrWb3$+07uV;xuV{I^Uq_I=3%*NXnnaCH(DG7z2fnzVfe% zt*y660GB`kv{av_d1Sq3`Vb9W9bkVV)$h!_)ZOHAM$gtS?^Ztt7D@3TTqJnYU?mK# z`qu;BLmmvk=@TdF+B9n>yUr1e_S%d4mT1#*YZ zzC-x5x{e5~RHnBlSSW~PTrrH5iToVPPu>@UO6W$3KbZ31wBXhN20>-3`a{QGr@CID z=N;!>*bk%8aAXup5l^7n7j9@}9z`G?QWs?|-C;nw(GYE<^AIii>K_v)BuLdcC`X2a z-_0i0ka6E?1=HUUxUvrRI_z7s^1?~q&|8Gvtz~1e0tPFNeMZj6i;?Mw@?%-{*W|%b zh>i8=O=6}Lvz5PI0TWa`H-$e&}ty{Q|y5RNHM#^#b;R=QuHUNg}du}Y2&dxjXP zh|}%W){eRq$4F`Q@fo$X&v8Kyjwc^Z6`f2GMC@jm^#+Z@0=C7Xx&(UonDM+6xU%Br z<_6p9x+}uTfo2Fe=i?rk6lS+jH@n`ty5iBy+zsI5484vgSLnJ!mtS#!h^FQ%*iu3< zK0zyt4oH9d;p+f(qty^i90Q((Ke>rWT`wpO3k)7Lu9AYw9tNxz@h_ODxfm_ka%N>(HNi#(s){c(3G zxSwK1z%_$v7BkwMSFkk_%v`P6HF>*}BIEeXV1#a(R%Gg;6nQ6nnGn|&YuyR>2S~hp z+$(2Nz3;P;)hNS(t?!YhjGNMh;#MfyT9P?lf*c9W0Yl{)zVe0J-6m^%Gn{NxXEJr@S=>i>*qN0wQA&NS-X!4)-;vg8gpPYkG zFf^O}_5PI@?DcTr)rbLeFS#AYG`rc5WOMl3n~oy0L3(}+UferN5$D>)Sd z>`1Z=5Bu`JC+vb(jqDTOot=R1b^~!cYHttQ)xUO%PHjh?d$?d*b9)@FN$VkJ>=s?e zwnH|@xhLTkkAxb4o0JR$pbGcGMNp!jc(9#s9s$PY|pEs34wDO-Y1?#51qL5Jk%9T(sI*!{t&g7 z%WtB2hZmR&GbDMODLRv)Ku#pV6b;tojTHP2WI6NQnii$v<;S+w98%tuAA$zk>vQ?(myVyJSQOB(BE`U;jCMO?Pc=JRaarl#KmOd z=COwUP&~Fy9sGK84k4<0{6-s0zpB2}U_gXWc5@v-q$*agtQ}7Hwx0P3_K2^{pDwO~ zONIuwPlaWT!jjOZxhY7e>@n&}7Wt}S;B_85PHA`}CXN9!06fkxj6YX0+)+2(;ZJLO z50rxdY&bNedlb;HJ2;v+{x_OJF;$vTDUa|FPG6b*n!NkFNPq#)i+|wuF>)H+ zA#iye)P6C2SH3O5F9I|N3iCgYzIk9lCO0oGmhZ-rD@0y*;3WBH4LR(MNW0+AyZCW5 zNa5Yzod_FgQT1@l1A&X4Y1^Kmu~Vy;Gkxc5!ofSR30ltB*scdIr9C-vsz0wJ>0y zj5XNJOzcVI#JNrji0!Wqu`$C*LNMYL5Fx-7Zg;WJ%{aYj$B_nQ~^Sb`JeskE(uEY4;{W>B|dON0k zSqQbuX46~!wEAohYwkWK?W$pccfB8QJwJzcdcQQ-GlnM4_WVgGBm68;$QhTduIFn)#qYxJuJN3N@#xWZXsJtxiO-*KApY& zd>MwA$t2!W8{0f}F4b2_Nl3NP()M~&`;=Lptmg%DYE;TLMdM?y-+&ohd_8{WjD~Kv zMo$`J0y^1u*lNJipf>aGUPaN-p8>mF9NBd5@NZu&soNpq`Xrq|*+_H-NC85g6x(A}%mv&i1KcKyW-(6oD!%{jbj>;%4vu zF?)KW=5p8C``J5+kzHTFr&VcmFt#o|2Cg%vu4yL_k~7i`d%!R!aXfAYf57-NQ`9mD zh^cJ1$B^di%!kXXqWT8*+h&hDxTcH2mOwsR#2fr_CN=xO@Sf1i|GE1C@kI6@hHT(W zie2h^`*RxQfOybA@7b>{28?WvtqWcWgxfAZ_RLoI%Y73>jeQ}NtoT514-|9{&=Vc)VK}!QtL&66g}DGc$+cRt$eaCrUXHR@xtx`XAP8s zT#nosAjpL#o<`^IKReMP9xX9!B0K?Kq9A-TubnJ*PcEE-cyM)QcLBJ1k#>V20vAJR z_KzGK@F?kx+|C3;izdGLu^5PIDN7XAn^8j|VM!ZagaO6nr`g+)*?Tz8P^skDl1=i- z0?+^nF)p_4!|;6Y1aXC^TOj;hPj|9JgakX6x-Bbs{47xTu2; z2j_308rB#m&P07h1kw@e>y=QddgN0W6KwEOZ2{SJ$Ndg(Seaj00eU0*5inRNU6lgZ z9PSd+ZFBZ-SF8z^#tF+_VXc^$CLHjFbSVnEUp^|HQ^!A5Qr^*{b+&K*R9}}Ni0j57 zayk=zS+5iq$CcoZ8+~r>fk&O5T9OAh)D{r2KjXT63>yd9=;dJ#ET;E$+Yy5wZc@WZ zun(zy?Y2H(wFiko`i8m8?avs0K!>xJMhnT+04`}f$LjgU*bhNEO&x>@M*Bp8IgZS*ud{0 zEBOZP@WTB{-;+6cicJ39ZG!;HbN2(Od=gbbT8R|V4C-*MvkRno{Bl_{EHrL#rGO_y z(b|`MSHyRJ3ifccsz&s2vN)bGyL;WAel1EJi2UXNV~FT|= zic^(EAzbQ}m^RetH(~7V@A5nGm+Hd8|GURu7#<+hEs?e7=T=R;qtnJ%VRMHBNFv;?_3vjqc*&t?JrP?>t_8;e+YA}a!EJ7$m}NB z+XkLbQ^>zPkdO-$TyA}s%nt>wh+L;XJqh(eY=2ul4_8)|jTt6NQ+hN!K%r-LOVada zJAVAa${!~R20>0nUXZ2k1pbEpH=Rpi(UmnAMqE=CQ=JiLyNO*a5RsC9S!f9(2D@FB zkRddoHxrD|@n(vE$Nv^F8)ac5t{gnn&WhNZK(^$H%ieHvKdQRXMF`#jXlc-BlOl|CT~7h@a?wH|d+#+-~F zP!Y$}9TBN9AJFN57$Nzw&?snlJe_H;u%Wg!$P4DgDs-wg1yb2iKQo53VjBg_bHJ=2 z(>ON%+_oZLxlRFHVtP%qt$H;s@QRSGsk_(6m26Ogl*+K<&Uv>jGxP9+oY3MD zPt7dw!!>e~B8H{qz%QgDwR&54K^tAOdYiMsS9B6Di|eoTPShaEQJj6hNP=Lq4sm=Q zPh&v}hae|9pLpM>ybUno__!|$$A_VoB#+&^gIGIiyPqujn*E}V7T7(S{XDWKD-);L zOp@xHcSp7+Fs6vt-aEyRHlKF;H!{+DuZe8^8z%9;usr25`={R!iMSi(Y zUJSOrQyPQ#ypDn|IYqT7gMCtn7I1?HFz=*QL5UinUT>>#C=t~*R8G4-117D_N(pISZfh4BiI02mE8}dJwx6}og`+kH)z20l$Ik; zzr}tzPaG5A051SUBDtSUr$Y3^KtwTG*?8T(i~%SN)Q}QB8#MDG&&TG9U2yRK77>MP zHOc;r@j$vjGcQCm#E4Ud4mLa3Yz5r!Ejr|)9=#6OX;FO33EF|15b}C`#rAm2BL(z^ znu~ zVvbduW;g4)6HOBL;cYxRdmr;oa?Z96mGCZVw;=c+?K%Z~RWY4K5koTiF2Fc@i;B`m z9V(vf$TqI_eh$G$%59~{BCA@Nu-;Z&OeRjho;U1|y2e2$O|h>BESute>{RH+-S#Vc zV{Ui0uxA3BDCUNS&J_D=f8>*$#rJkuxE)uUX+Z>s)2=5W#xO@>j86vJS^hF~QUnEQhdB1#dR*o5@-zRw32Sgbt0D~0SO$tTW)LlnS4`ucx zN3x*LsA-D_Ozt33#|3$s4 z(z}XO{@D8qe6ha(6paLSE8kSzVSZ)b^q-hzF`d8u3j#EfqspofWk zr+U>QF}6NX%%Gzn;n~GATW@x1+d)vMHy6huMEO7!im-iaiE{>nZtHD9fsDSM$0s0m zD%=UtHrQdg*+d(3>jmb$1C3!1^o|wi6pc~9B&D@@6BC!PqiUwHn52tncXfhgi`2Lz zyv+1$zXmglIkt_Y6`wka+bduaCg)w!&ew}QBBU@_dbrDM0!3?KVy;Vk8W9&d%iXb) zBkFn#oYTUFHsh`Kdqzl>{{91#LQh{iyLT&3C^jAPn|`ujl520M1o^Hk!@k~_o6U-6 z3{f{=;I_OtlCsiAL+m`&^*pX5o`;#A8eJEi#3tP-`q+S9$7G(-oS!_dId7U-5ALoP z*-veKUZ>=N9am)UkU7!(V0foFVhU2gWo+3r1a!#D6ziy|pUVlzf_(X*m+V0D-#sK4 z@eC*aRE&M~ubZuw5PLgh`*P+9cHOQn1~};atcxjxklXt*vEd9;wYNXNx&0Z+!}M;n zQ4QcNm9!3uL!EzZFTZ(|E~hFiYZ&fgKiW)wE1a$u3UpfJ?b;q+Vj%bV1YtYhCJF&&-mMw z3EKol>w3tJ@ie<$gv}}!FR2gB7)#q2r6Tc9Lrf5@(Lpz3%5WAw=WFQlKY1y|98f{p zF{F9<+36vSBVs6#8AE{{_YrlU{`BR9kJxQ~(B&BmMi!$8Hh>9b``Ck@R`1q_z8wZqILa&ySBCqsqdP85%MAR-eSX785w4yvK9L^GGme=U)2fYo8AK2J|A= z9(uFB+yMl&#oWo#^gse>>0;J8i$!d{clV!Y7}M$e23CmUD1O6pjpVTuXYIK2U@OOQ ziQRO6^f|W(5%9KvjUc4`JUv62^RFzIG|xj?;4^8LtN0?60NK$XTXPDEHbySlCF`5%6yuQ)e(XwgP#^kRX?0 zP6!*yepD_?fHMekX4B=|;W#jnZ!U$uU|4&&_xU74bwH_K$*2rwOA)N<2v^1f=sutKbiygCa1CIF5KS z@O~R(V1mYg!*hzuD49Mx-CVM?R+9YBQ~&_RwD#IGOMTgvGO#JHM)ClEugw8r9r3{w z6lH!VsmPbM3FnCJ8#n*UgzLoNK7aDkPCZIVv(nX*SQJU~Uk1)f07sd9f`NLmwxjdA79hbTie#qn0@->TamM*3Bx(y9ukqBgSktad*M0Bvn$YAb(SY{mf3WwWUZ zq#YA(r863&Xt#Bo=2xGYF0H(|Aw`OulMtgB_VQy*`2#~e>U(3*KWN$@*I1qa*I$EQ z61Wo_QEK79FiMkU%RIFSNiADd%4(|LWhdeTDQxp9aX~40gar9hr2e(T{an?)hmpz# zfPuTM=2dzK>+NRhX`oWV=W>QAYpG`$b}*K(kf&-PN3IC6)GE{K~&lD`SpE zjux$WgL+W~ot&>13pk>2C=q&h4@o>hkRM9;d*RPta(OwV!%Tg4Ea3dts(SBiw&aJp1QSfLPemU=T8b?G@7@h9 zOt{<0>qL>-8|2b99CPRXEng2l%d}CDt5)3!E%+>E7kbweiK@z8doL8cQ<_ub7+4v( z<7xd%dhXr(g3`2e#m8fPZUspah%`2mjnqIaYQ9`~>7{PR0{QOGf|%sYjxT$kODMfK z)B1m4Yv0m!PaRzY&v!%RKDcPjNMP|Y3xBBZjuxSERVx%RQD?NQiApS-bD8vPv%eA- zweU+KA+1}Y|43a(j=;r8M&Q%!mwDn?ePLlwjQ}L`BRY_rV^aV0b3}b`%rrhKZL)R2 z6rY!>p+G{o`jd~1>MePUa(}eMv_1=OIwWc6J7nWmej~_b*)B1F z=ihHU9+$hZ&)%1*9>;q~OE@{uhYQYSHrmU}j!aoi!h>?{D;eYRsYHItFFEVx-n&oE zv0LXNtS_zjwkx6O8vHsuTKRf#E=jCB89@i4@WfL1l|O4fFll?Ka&T%WkoDy`;=DZg z%)O>~c7?EQR&(sm^89#7{fVpmQLC2Y+9+yP07sd zJ`3lkgb=FVOiGw9{Z5nW4K&8Z@3H%-u(K|8%(j22Zr~4?a_e zk$i-g97V>irlk70pV_7`i)(<=l;)NHMnnF-cU}mR{IN#bR#2|(uz_@4tDaj~U@a%i zQA2!g^;efChmSDYyESE5-VYO+Sz-oc@q(QKc-Y)KXyedythaL&E%n zMhuY(iFuAoo++HYtA}U}`I6H9RCE1FH`lj3_TRm#X{0C6?#vxe!$g+#TSY4S(h+f+a504aN=CSmK~sbSrxxw?e!*O*#< z5Fbf;1;K~8q|eJd!ZtrLlT>RyPiU&2zUK{=eV5#&W)S#(wN2PegiV7MRe7NzF-Ys9 zin5FBi}>a4gDVE$s4IOYTxF`K`17zsTNazSbGYZsva&I=zp&+x`)}L!-1!$*-kZ^Y zbX+nn#4SsB8-)QerKIyo+Mp*&DVw_dA2jHr1+kr;jCpY zfY**F@4rWkz*pl-r_ZvC27$wpaOvy(tD?;k%BAQ8Rsl0y0po;?C|ogWDg_I+lNpJX z^8xZv0s|ly9HNK*N=azN&kxDLnicaL-Kl(t%<&}Niv&)s!F09n88tTr_EOuP=2o7S zr-B8jWnWy_E2iWfbmhGGIpMs~-I!@Lk1)yp#v<+!Tw^VDBeVFQiPRp=x)^*I)SI}z z9mnq?ahDv4)bHUv%xO{58m!wRCE(8ZIW`qm&TnDCb^5tI)HUXPmK{X=hdcsyk@K)` z&HcEGm&WC?N^h@|5m5vSIqRuIPPx5&kt!CBMq2z*ldsWJ49(m->Q5BZDW(P6LG}Ul zWu~F|>6Sj5`T^@Cp(6Ir+W=QsYu%4;oCj}*+2MSjobNIj`g|tja;uw8(pAmFPTS4b5VcGE(BoTwo0FM#MC&3S*^Hbv8@R!hsU*7NU0R+D<7M7+NY{mvEq5OkbWjio`@L5J zp#20X+D&O`jpk*D&~b;f3l=45ef$dv2u0A-o*Tm!S~bpJm9Zo>u}}ZR*;CGF@=0%* ze^Kzj$MoD8C|gze`vd-3l5iES63Y|OcO}Vg{6MCPqi-7r0s;TV8JYk2d-FN@5+SIw zfKf7qHMcs^Y0J=V7;m*+OjLi6e;~%dlcN1u5F%%bP(0ejBp|P1$rY$c5!tabOV~_y zH^dFCU@Ba%>T&LmkVLCsUl|h!B#n{OApc=o%Q=uY_8Ll~N`|+h&7l6rB%i9$2>DVo zwGmR}7^^6{^FcSs+Z;#EKBr-Hz@&(`;yCL)` zf75?n=DPb%{35MHwi?THsez#Ati@T_(t4U|hT@}TR;L)KLj45O3CkGTiJb5sh-qC3>>>(d)j}?-z=qM12~D%vL5PJStx> z=1s()>F;8=U3qrpLs|{VIFUyv1(23XFM2@8!^Ket-wBnd(38G(C?BIuhWe&{l*jtx zn0cwn7m^g35cG)wYkZo77=tpq6irr^Ty-$S>esIEm&vkUW0DoWUpwcA*yO^SsCxEkqb%K{cV1%jsb`)4Nd^m{#8tTIq%nS6V(amsy-&mqoTL| z67{b8;&S`)vjGqP+IKta=qEMmb?1EnZa8j^$A7cJMIrVSY4bi0r;=iKK=OA|lx|~6 zh)*M&A!G|WiT!}na+z|;f8j{r(;st5E^|{PbnY3Z=`Uy-5)QA;-Rl3M z7ZvI7F*C8K%)By#+vw=*q zy?6aRQnL-fC12H51|5zj6hxH>Z(o^zd)o<`}HF5kPAM)`sxm}q0w#sbx)2VNL0(?B$ND)7cD zFr|@TuTZC6x2zwT0;_Uat6++|aFYeF0~@juKVM=(#;dMzd8bq58eRYKSWr zsl`2uGwjC5Lo}{Z-PG_^c#ObT6XWyYj9$PE=ctkAHe5|6I zu}rd)R=G8s1D}-HRmGl=@hTDoy9^AVXKBM$2^V+^B^&{fC3S9;SFao#U#LmyxNeLk zZ_!FX9+`kfb6S;U6lB@!`^PtyD_PCEWM5f=85-M@V6|lUw!%%RNkDrzFEJHnOt_zZ z;F@+^eCupYpv7(`H8yR)%nf>i)R=TrUX;h@P9B_t0IcNI#Xxh%O3vdU8B&uuZL>lZ zt}E#RR<+LJ2MV8|CweT2NLwJ6^xez%ZZCs|ww?nATcphmiw)-i>7jMX3su~0WjfzY z$Sn1_#k}T?k=asmH!^@yt+XCghV&S)oQh5-c?C1%X4Ga^4ce}9O?N}B({{zkDn3Dw zE<*t&VA^MO2PFcj%# z9%Y7YXzN!-)mUz@rIFVU>AfrOKH=6%X`-ykmS!`m4>Pf1w^#FxXs!g0;9zE@)~QO$ zR^94^FbA8S>TxXSutV&V9R97R4PDjmHS^*~V z(pf+tR;lp?==f3I8Q1ktPhfx@D^DQIlH^Xsgi(B)qB7RXoiGhl-rZ=uFJHNL#xM-v ztgvdZ?s)7Eve}eCz(zwSTvJ*BN$o{ltAc`}OuYUyWlOpvaT^r_bfC);g##w{WJJ;h zM5y@Sl~pTGM=)KhC{51grGG&<{K;kT`X zt$TveU{avXwv!p!%s34p^<=FPt)6qgB@GAVZGbbF+xBPfh*UU=I9us|n(p$``Lpfou>?A3% zEW6&y9fq*%ZAcX{sxm!lvT8`o=d*#a@cbpxiRX<``thxh&wH`dkPa{2gS(uXIg5Ie zXxM9=u@bnQwMYjrl!l->r;y|IwMQ9W$|zCbA4Ew3`|r>>nG)r2u@_w{C}qf9|s z)JGj*=+&`VJj95NL3MIkT1YjXK&J#2%uRK)iDQxJ*+{wVd~xgeoG{X>9ewCa;67t^ zYB>0atlMF=^1f>)*BOgt0(R5m^sK%Xy9>!u2`6MSRayoT>ua<#TldQ!+Ph1Ml{PjR zu1=p1s`c`e6S@%IoN2wq@u(!GK=Dgl8y_siRZzG~ zNFe)enl-7t-Xt=bQuxSLoiJ$V>u#ed%R}4DTCj*wO4dUAQmgQ$Lqhene z)}gOJyg2bPC-+MEGJ`&%3{#dTeLgws%q(@(7pHY3nGW{ zQMraS2aJ?vX}pl?QVmoEw4x8gEZgg_6;90UW&XA8lSlm$H<)*2ENC|kv$GjW_Cy4a z;DrnrU##&`>Nsv{GkvW8k08FGB*^-aK4A)r>0Rg}yam+L(WK)C@9hrN7Oa3Y29qUr zz*=F&Qo7o@c<<50jN$V&sHj@n^Z;g5Sl+C(eSTO|I3h%Ro(Pi^4U~D*_^vZ(zcF-* zClB~^O>InauoQVlm9=&ySBAsN)RtN`W{QM1_LI=tP>mO9bKT^^#Q?-D`n3n{QM%!2 zoAM^-Tv%2mn1&_O!v|g?XpJe{BRq05WL31oEX3TU&&I$+8>zD67 zo6I^|l?GxcrD_!$>bMw4IY*4lq^`m#oONP?7}5a?6D@5dkQ*-Av^Z(NuKp)<@-olo z6EW_U2PNNtmm-<9R-5H0lWUGgu>{daEC+U4Wo!k<6UDMSh`#DcLA5VY8$-056I=H< ziBCqeXtn~e$3PZd!m!N+w&C4A5om6Y6?M|92vsA+q}B)tl2LioZz8qTrk$YEQ3^{! zie^d})&1geaV9zAp*L*x)ma3FejsySxc<%)!B^vm`M$pU$CJ}?N z0a?A)fG3!Q3meo!31u0EJ?K#6dZ(|-0mR8#E{6*v24N zHIj7=x)ls#UhA!TDdKjBRSXLPV#v_F7fVtFG~aMSR#`?JM_!u@WiG*)*``MND^_Y{ ze4I#m8N-cyHlsTW39fH&LiYRP_uhLo*NYnhj{Ni~}O0t#~10CWBY&@SL_bBb(VoqQrzeKI2)XyNR-RKx6ngN05xG zt*vGE4+?jmVd`EhpRapmoE)0INYV6wE&JV6rz1oy;nRMFHmD(}?}$g5Z6cDGPQwA2 z^82B;-^a@W(wYEX2N=t4x?B|&$IcL2q&U;?>8Po|4$BehCdPzTTjhGK1*d9lnjda9 z)A~H13AAA#IP3YVQWrYGCEiQt@uoSznteuU0*f&`&z_lpfY2c5I4)-oLKR<$#_&xOMkMzLguBIE*y_nT--*EQXsjjuFgu=6G{$%qxz^540)5 zR5z`WM<68-PD#N~Q$SK6weq3C)iw-Hi6gWC{UCJj)+F9Eh8S;;08Z(Q6!nm@-|)uF1_X9P_)J$6-c(Ae>DlEfnS!iu~EvHNn>7p;O zWs8gHUWudooA*JlsxGjU`KNE+d$I>~$XYeZDABGWiN3K?Gs@TVWKvcvr$V%5%T0~1 zP*rzsGd-uQ4&p#F)cup&JXb1PbIglcj@lHerG=r@$r#7X_6$V_LuQ3jn-M<;USKzI zgj=)v#~*$BCeJgq<)*059L%XzKD6Qf27P1eM?ql) zY&_Ix|Fy#LUgnmo=)llgB;8nYeV@n8p}fLhxpuFpOqN`SCAv;I8^j3`MWesFbMjD{ zx8hADQ$!3w+L%Q3CP2!|l~m*up<3gUdB-HFaGsz30+XhYiek1I%Z6amdIB-Wu2NCbie6kLI>u~ot(9lCPiA- zV#zatGQl?)a575<^PxK^Ghy1+ zHN5VmD|;FtWp*L0c-roNNHz7aAfrlD3K`heEleS@RHCw5jE$O%2(4BWg}b62yz~f*&-z z%)qPMN*k?dPID?Obn>`}cR(DV;E`Bg+2trpiJ_CV`~mBnKJPnHMJh$=&O9b%J&=hY zNSF5aZ699{S5;eXAZ5uLnoKERO<0$$ByBJA_Tgi9w-iBU@XAI}P(5jNhs)8s#d}Xk zyfYd_>_%}&*+ruma6Dr=jWNpjb8OJkP*sHc!hq-If=OV@TF`;>SN88dY1JyLW`byI zY1}}OO!NcXThDqJUQ?$%#lgU>@=UXpTP{e+lW>u1ipKx+*4@LJq?9mg-oXdp#(WgF zhD0~EQ>9mKHGRfS+6#fK61m+6#CtThHGlhSkAIcGtCl7GW~jE z)mkYC&dgn=fkG$m<;(nfpzH7uvj*-G)~#OBQ?lXgR8`6#l&tC$=xeO_WkI5sR}G-B>kw1zuZ9qLF(#*wjA8LT^DfINr6xVPypN#&iAv zdS^F}2X3Hu>B!FvVI&Ucf`QAwSUh>$s!di+AB5F>X_OU-9B^}7q_pXjbDA3;*R*_5 zYV%}+rYUw-XEKm?4hru+G-{%4Egf1RU9qEhNi57&>b2Ls&AjT5y&6BOSGq)!pubqW zEP)sbrJGSQpba3Q!LYF&V$jK+32Oo=*qnlENIssWwmU?Kg(w$}w}p-bL>xISIk@3| z4t!_4b@xm=F>0gJH~vT)Pp%P6J298(<_o*;-sX9$Ca#(bSS!U7QqnbSRIvv32#pBD zc4WRZsvtN}la;KyR9J#r<2SaBFXJoFSlFyb=3|9fg+s=lc}}flM`0@U>TdAsJO455 zEwW*qaGD6!Pr($wR~lIZP~9G%4C}ZDT98?4>)9aOtnsnc;8C#!#|%;?`!R=Z-aLPN zrX?ifx<)lcY!23?>$(ifX4)_q{d^!(pg7-XI4*=)&!VF8BAfV zYHt|!^$YjlW_2Uxp%x9M>n6&?U=)_PrNm6R+nSoV+Yc8?(zxS|qUhy&kJN^WUiU*@kJ)}c$ieAI z3rspMbjG-4%3z}VvC<)sE-YU-Ipq1Q-dNjl*Q)e~%T^OZ=9pDaWK5T(8oDvU^z^-0 zeyhvP0x;^o`T)d2_a3I#cCxOC<&EOke04Yub;IhWu~g#MASFk^(z5u_T4I|o>=Zr+ zz59?G;~QhmX$Yo{P(_DBSWwvzb$j+wD2W0!0*ke#$Z)Ulqdd69Zl(!2{t4*rxn9Gl zVbXM(xbvk{66>IKhZOC1d3o!2uPMpET8swbj@Blg=JQTG%c|zy)9(}-C5mR4L`Km* zzyW-@cjb7CoytOs5bDcG49ho zQtGClz&6#N3}D4B(}QWNE&AOUUNMW7HD5J!cNv;LSbVFf3hXKlF~AgX7R|adEBNTn z7Z*U=$_={2#9?pPzOZ#%6nSc`=#j6cgew7|9^0QUo?JZDv+knLH_8D*uOnjKMK&!N zRj1{)JO(ANQ&nB|TQgtOXh-xEq zOTZ+6>3Ha5M+uk4*X&htnebQVZc!E(grhC>HK zCr!0l&^&$5(u!x$Y&~4fyjf1r20^2$mOSvIHQp;>W}4?cf9nM5@$-`3uJSNm3K`D6 z58b;yF@<+E%9`$DHLE5D$VS*xD55XjB z#^grF;ozC6Pi895H_;8T=1O`0vpdIUMgrT@mW*thR)qTckdgZ9>9oBAz3 zv8t&NW4ZKP;hjebv6~pDZ*v7Lnvd)Kux(R9STlfv3MJrEi5gF+jgb#aln))Wd?=)< z(X1*jzx4dOJK);UvP7WTY&a5u0^2RT|AWvD3f((jmW^RQTz7lZ#Kijo$qRGbg|l(f z?-dTEtOq1~olkpC7w?Z}^%;)&6mAXv>6v?lm9B!YIJE+$H(1k4@_V=LJ)*E<&<$!; zN@1d%4Eu}PeC=0EX z)h;M#DQe8huRs42AYG*%yIiB)FC853w?uDTH=m1swK10K-4TKY!~*?=tv580S2`2ivYcy|oi#AJrEs_n{nxE~*IFxk zjO9!tk1KiZS1K->gkW>Z;xLfosEXKLtNlpfxG)7qg~26qwdp5*O%uPi`^7oOBfMw)287|ESt|7gdGE~De~bDxuz^t!gJm(RA2~RAD6Xnv9xKGW zRWY?V6l?Zi2y7SwqOAFI!tyL(!yu^eUC_xvb1{mVD>$mGgt0xMEVKb}@D-(yW6CypYAsF==&F|L3>wy|>0^B8$ThG>|*j;`K zIyoamt9ZfpfU*h;k)^y98;B$Ir=a8QufHFW^Q=W#uJsczIxz90#c$2kkXp*k{AuVI zQoCRyysRdx7$MH;P~pD~P>EU3BDt&TbiwmI0CHn^T17HMky{_l5Anz4N?y`X+F9 z7AOPPEU~;Q5`lzFD&6?=P{@xWezW#JdFH@Lc3hFwiHZFmpyRDt1rhUfV+LJ(#Mgmc z8;}1UFLFaCPJz6+oA~29_pX#`T@AO&KE4Xg{-SQLP#~6_&}_6>-fI~Zcy&;`dyOh3 zgNiG5KyvBKN1)4w^h#ZceU@0U-4?5jLAv=?=&;@T^wGWT3hW0>qx1DQaZe-IoG{JL zZ5?P=k6wrC%hNaF_d61~{Sx#mQf&@azDoK*#r%W9F9?~eB>2p$=8{o(Yj311z+Nb< zHS9$I@{$G(sJR69cBvBGzrFSL)kW1hecgbo$7Tw{)_h2we& z?b8m!eCXW02c=mD8&hzL%JoI=t-8ZahXPkehauk*13Sf2uQ9Urz@T@UdNm;JQIbsS z-BR`Ry^;Q=3d9A~4SMF#?H`1GwC+3X zMjcSC#og_@dvcQKW1`K&wE)eU8=R!bc_&4_5qj$)&zCzgSn0^0<4nwFtHJ4~D?n?6 zbo{xC-)aF_X480rK@bZ4HaP2?8;Q+nui;ic{&aukiHY?%bngLPpi0{5)AeXF5|Bpf zWaD-)<4MKO5qn%6;*VZG-d#@g*r>V8R2fW`rAo`5l9_XS@O_f(xoeiugkJHo`5e$Z zr`(yxRG%kvr!I%-{PdOo(^pcZl_mQyCAQ+DB32Tyr_UTiWn&Nz{Ema`_LPM;pV<1| zhU#+Mx|(H&+d!WBU2H;0k&n$4WjGBtv#LOu4W8w*=Co0Mwa5#+vFM%o-)AhnI-k@l zof)Gn%A-nokfcOI1`>C*!3aQlm>_Pk8$GGlG<#Az{ltOPOt|qpru&@%Q`q_f^v*fh zZZFs=)#az@z|v`5Ib!z-Lb{YBeg_GaX;3`NTRa0T3JwP~95l5dsd-psKXnGY#n67v6 zz;F74Hd3jWNTLUy*(vB-Z|x35kn8iw#&X6+PA4nSat4mRsMV|_AOHFm+7{@~Kqi`3 zMoH>c|c(zX?A!5ZLX4a{394!^-0L+`XNkqg&CuyQsIQVFE^en2fS7?;T&@d43>* z+w7*Or2z3(upnu4dYWFXrk7ZZBwjl>d4O+c09A!@C)&qmUnt*@R3S1C0o0QEAWDK|ni5~qvR>63Nhm$!}| z7baZm|-;wY}>M)Ct>O{nj2T z@b$goy_?(+(?CqXhhYoO%EJ<@D6q6-vvLhr0p(=n3KBD+ht0N1ZYL3ucAT7C^f@~UPFcZp}^I;HatFw8gtfJ1E;0&L2#w)33zq}$?VHKY%)U4k|dSgz?Ii#m~(AG)8slblZjpeYd^4fIMduH#g+q~44Y`IbG z>a(6YKrI%Lx#_|yf!k7--H3Mw**u*G8Ayr^LdR;^?0tp4PEjQ3VvWg%6RI zkk2~(DWzAE)rfAPrMaZ8*)(t@omCa5gb>nzbm4in0=a@&E1!kXn&9?|Cr?kxGRJj0 zS;X`!=4M=LP<@Fd%ILgfjVWgYdl5~RYGK`UdZ4mHgm3UcCX~Kw>#I+UWN`JA<`K8N z3M8(@BE!Ck2)v8?9p6jIYB}*x&RDU_ylVC21zWXye^fjs8$!5>m#PV7r`piUUDfAJ zhWASY0WqQhNu~0%4Q6&wp}8D@iNMw!2zFa9~Y{A)tPzH$fE|-LNDvD zKX!c60y7a2cF)I2#_(gL&1L0vFIUagisKT-=cQ2t9XKk_cupz#j?>RxZha0qdA7yy zaCL@k*7_`IFU^sNMC;h@ZK`Y1Lse_V(uhDXM1A18R-0dlpj~^b7BQc`e&wB8AU*-^ zVLKi`f_B>vi5Y_m3zS-p;|NViSZmRGfKv^wFQx0XUiM#o_}-JeIC4SL>2$+vPO(j2 z9vYN4L3(9R$`PfClqtti=3~&Ad{VL6E0;yF{QiZItLrOvVWGv7+Y(Z(xLUb2ClD)l z{2U(|BdRe9RCLl{k!q=$p_&E~;wV@R9Hc~Th+n+&?jaylFj*ES!FF}hRr4X`(hH2N zExCA#W*Mbtv>uYKWtI^NM8&7K|CTD%!1xn`cX#eR6E0_^Ch(!jOhWpO?@}BGOd(cj zeaXXiEFlDkw#*f4uSWbz8Q6}C%9a}l^Xu>27D4`(avnz2F|D%pkm~nIv#JAQFet;r zmJX_bN*joZ7@>Fi{!!->=TW{be0t{);a}alhvXeNOWK`y-LDR(ah5T?S~7|=kB@Ut z&Pf zxR|rqicLNaot)E=x#C3gB|CE*u`O6EFh>HO%hvkbz30Wz2232rw2^9!>DHE0R;y(E zf{Z*;ZRMFwBO7l_RJqz@rL6rXhJut9Z|IgluuJ~#*-%F3k(^hqZom83Y|6PNIrAp- zC4n;CMNRNDtMAm~dgiqHkrNT4H0IkpzEKxs)#<)*aQvh(R`hJ4a%4|%>l;j&td=QK zZkBw2h@2V(6M(K2F3c+0vL$PJUKK$NHbUHX8y!sJ#Oj5$_nrB3JTzgr9wHKBqK(_+w? zl%IZl=b-T&II3mwjWhS2&(!LCXpuVB>8KgT+C~MYJw$>%Zm!j1M&{BS>3g9|3PZQ< z>!%-vSyhJ^)2&Jo^NSC?286MvMT`(`-Fs@&L8^LMw^FetuInnJ`4u?A8iEyB-8u+1 z7Sqj_#!#95pN~v4HZtkNo$=Q3*>vU%T-$(cbrj2XgYrydR>`aW9~6!s3)S2gF?QjR zY|RZ;F_CAq8H(vR^oVM++&}$*J}+B=-gXf%yu|kxfZW`}6@ggAVOi`(DjQgB5;w_S zEnenHEA_Z?mo|JenH$JdGjSfZv1)Ifj)#3=P>owHWa3cKPhBs389F(dG2UoNcC7l; zXLMhk)1o<3>q&QHELf(Nz=Yn<7OpW}Z$eeBsdJEhlI2n!=zX=ZS3KUA+Af2t4a8=b zZu%B(vY|YL$00gSp|S zIw>d+U>bf@r%S#O_q8f*B$TR_*Un~)Skp!YMT}m62TQGNN^@LPO15cgZWX#)1m)%0 z9!26oHA{wu4H6f0_jz8gjNnMgdy8tl-(OQm7L7;;9TQ!c?#ZA5vdTst5RHB`G6w;^ z45`s9;#mpLBnkf_bWh+*0-<#NPs8*um1(;=VQOUs9%NG5rl|RUKb-4!HlZ6UT%;&;lkx{`=f=on~PQ>XVrDy>Tg_0q>>!K5}0edMKY1E zE;bF9sW|>zA!agN_3>uUSkhL$SnzS3ppa7~}17_FXmD(Ackroi(vUuC?O4Xcc7#@Tuu z_Igd=4!;P!T^9#f2^*y3!02_dEZn%RJRt+gcd{7?D^nz!kO+_Wmy6ca*Dp5BOwP=|b*}n`O zKO~L>N3Z%GNT9eIZcHg3GwoVq6o+hu_d!^)U^~i&(?2M@{YY0!W)wDT3j>cPy_JI* zsuTIT(qcDBQYSJe)E8ZyBFWPGp|_sn`AVoepgl-%QiftPc}Cj7d@YN1Rm~%dRR=^D zYfGDcj$^i~YRbswz3J2lV0ruQZtBGwskZEKjmQIAxuQziqVfuKA}q=#reUT_rTA#! zG2}e*))bk_HfhgOY_LS)fnIK}rZu_UlqaWh((8`aMBt43IKSXMy*eAQeIb%t19jLY z$H~#w2_x{nxlkIE(=b`qq8FK*$pq% zsv<46t!q~9qK|EzR7#-LN2`cg!Bvv$=?%Js0M%{7gG8Dw$>nG`4fB*;t!CXRC*fc; zx*9X&InkQ^}WK9Z%EN{6u%1HWf#bLjrqKnslfJo zWxP>tSf#~^lDTZjY(UZ)2t&Lzp0mT$Gx-6ZN{wnuatOVdMOmGgCDTM{$FW^Fsql_6 z>CGc5URpz(@FfPxmy2F0%h}#W*0HuSokiom5l|{ou_-X)#DvCBg==-^+LCWgI5si+ z9O}2>9zEG~8z>@I(Aw{B9bXmD-c;B8e!8+wKS18A0ODS+n?}EeMs;>tMVi%L+`jvK zf~;#Ix|CyEm)0!E%$<;&uJM`QF@&WQuplX}W7*JCS>Uod?kDkv8rwiN#9@8(x3^9j z;;4a88fv&sI5owohHR9{V%$q7nx|~k9A~K{)g-Z@f|#;qv4%Q_Rm*e$%?q@cvD49j zCCgLUDtBUyq603*iFvs0r$hIsaB@c#7t7Ho@>k(_vra&)DEoT3BBrV1>j>j^V4oSu zfe*r0UnA&FH{dN^T~5@-8V#}tn<q z)>Tp}qpfAm_5(d}#^ruB>@VY(H@h*9B#Dw6Odqluk90kh^OyIK(+8BvR1Lx#<7hJ;zIkAFl`t#XP16APpsyUA-UE@ek>Ut!( zjMkhm)W$g*W%MRbv`Q%(nbSefmx(r3?ifZe!`u}R!ewaymeLWuQr4QpTxrI_l3~;b z(A^^;)^j^*Q0|Cyvjz^vs?wqALKQT{EWk7ocWJ55>wep93!Od_Qe;EzOqr1F_1gZ{ zJxbz}pr1za3aLtz+*oVfMy@X;1zl~N%n&0c=o@~GUjdS|UA$6rJQMKDWD?04tikhC zOBT}c*>|4B>w{GDO*f2ng~b;2#!RXD3Nkjkny2BK#Mc*XY0Xu5$wFLng)Jj7j;9;F z{CVi!b8Q-Au(Xe@K~b$4D2h9APv3>pFB4R1E-Sp!O*2vR{qaE1TZ@iFrY_}?j7*?A zXHO6z>&-187hPXz%qh988;b?duAmGuaMz)wnqX31zyc8;fPv;stQ}RyxkE9eZMGMG z2YPE;S!%LBG*pysOf(Xom}v|E@Jgg8jVyK7biClP#-yax-qdCR(Ku;X6oxqf3~XbyZ#ydqCs>P9a2B6Dh^yHUz<- zHKG4HbQh5jV*!9MPt&R4Tb9=ZNfI?nrJ(1AR5gY3mRBA!3wb0g`{Na(CZ+C%TvWTF zm?Nn07hCs^c%CTRMq`qw4V*?wV91uGRv2Y@I$E-(*7a3R81aT>Bh}`BMIv1{%S^N9 zk&BffLC0IVl1|5=AxkbSb(1Wm z9f6RK6M((ukt3@fOwg*U!o3lReF-|g5B@t)bflV95pL5?_+XB~oVz-B zk}!bdk+)jwh_5#j%h6&L>3GZlmAOR8(q2Ns3xq;cvcsS}r>uE*h@lY;KRkk%)!>r79F>Z)xi%pnJ=cozC z7N-IOClJIXSJE(CA)84UN2^gfRcivr>SG@3tNOG;GG$|>X>5aUSKBkIvgx5!Uxz(r z=$0&#n)j+vuWWd^i^E~5xsvQwnU1YxY_vx#(^?E-0HIPZ6JYkSdt1$#2 zNv+8QJ(V^Ky`BZrWH=m&aMqCF0I=!CXOQj`Mw5|ciMg^EBg8UUI5x(pMZ0NyslS8HNH zdJ|F-X0c3*t$u)wM}$^xRZ7E54RKV{YO`60WJJ{#C-F2Y<;FVcQZCB1Ib)PJDygu- zQ_sbsU<`W#FjX`eEFC(~27P$5Nb*T6HTl+>1qqH&eac!>u#3?BNoUz=bM82dkRbDL zsuOvqzcnJHgBF&1h_Yt;6beF8b2Vy}U=SEpe#2VwvK}$|io-dF)J8$mnmV;f0&)h4 zs^tnk;j!40+TOzL3AFF|D4Pv3nUk8Hz1B69@Nj>T@;8`q7HQNpD)%gen5>x}ax z8lejK-@#OmXJNL4h?`{EGpaI!jt7+ipG=4P)KRsunyGWnb*UVcHUz~chNuoq0J7EE z6nIJ=D9n6QCrBApdVH%yVOnjDcKO~YwylO~Mw^6LYDQ3Ep1qebejoP;+Zxo z!~;sThJH)&%b2P;Vvm>mTw_fD9-p#uLll$V1VuuZ7*kXN0<@y62cej%kwAuJ-DG>3 z6FDokhuKk!hT#m5sKr%R^SI8LJdZcKWcuglPbK0XGJP?!fQGO1WzE&BUQjiRfvc>&IHp>fmw*AD2OzmM=x~xw z7AZW=X`ELTY1!y$OhgN_N zIMW=~MSWb?>Y(1JI;2`gKdtB>_l)44&~X=R#v(GYF3nqdFiMaSLbO9Lp;f?Xeu>IOd zmhcuQ#Jpan@Qny!8x2wpJD(Um($(1}VDb8JN+cCyq^yTbRdqe2X^?WYnrueuawzMb zQ$iwKmXXddYnMkApJlPr7o5yZt_+kIl?O5aO-$Nwc6r3q<`Y>LgtZ%T-a75IW8SK& zEvCGnb6lcX5S%+cFx+*0)SDQ6ug)<{hL|h6WQ(j|_&ozoxqJ|klt9sIep#JY$K-H8f0CaAL43-RA#5Y>q?iKUW1&9 z&1Hv|dBpB1lr>F}-ck+MNJEz*O;$S#!xQ6(pU2{g=gHQ9ib+0q)>VThk%#wAr}Z38 zZm5+$ZiCP@oMl;^>QiH?4EWewWt=y|mp)q0I_iiBHXH90E71mRwIo)ETjjD@?xhHg zR#PNoG>ld&l3TTzq)LlRxVPrqRu^AMt@W~3jw=AC8)+Ah%3XQ7NNrTM>$y0{dgb8Kj?WS$pCz_k3f7s35H%s0by%9iJ4s zW#PDobhHea%!qhdsW^6tqymK6AWpq6%y_=Rs6OiXj7cG(ZCFmbtI>n#^xaFn#k4-? zX+3f@CL_)1Bbq8`gLQqqh;2S?dZN;7tXMNbN9>T`G{qF^dgM+pHYyo;d9Jb^yMPmM z*;2`}KTy!MCHURxR1`6;vz`$nW~Fn~gp=~M1n#+#SW*|YI&d(Vr^0aVdgaW?H<)T! z%Red{-~TTXwV@ItqH7_CmV7k{daG%kSalV|yhX@oD995-=JZXCaccvs3$+#}20IN| zphL@uWP-Vj1X0hHxbmPHEd5nr54=^kKOZ{mK*%&c?&u?vhc~m7q{k5o6r|_zNhoZp zL#?Js08y=Qu}Mj)rC38vH~enDlh_(ywow-cj1lH;cU0nAbl$F^Ym!C!NQ~PFh|pSv znOI$)Qt^g@1`UmJJ-@8Ad4Tw)Wi_tOEE*#zYi`VD7xibVlW9qiGzo=9 zvi8vM2VgTuWl1XCX)rdXwRNm%%A^b=%%jr!Le^JR9#0!dtA%VT)o5w8jo2-tpirm3 zsT5Eku^z^4ZmBq2W$0@4PMcV{^n4~}f}&2GCQ8c_H}R5Xn=G$NtiGI9=7?j0XpRos zu2G?KcfHP*{%jgF(ot6*xjI>PU3!WKYdWY7Kmq9Q+CKhJyqcE5z4LlAjphxnEE#2G zHM9(&rI5L}syEtTxJtx^(%puqiJQ~+I?PvSq+vr1)|2kM(fR$ zGJ^(eZDcl;IsrDwnnd2=Rs%2bM$Bjyw;7}w4S{4$<9->bB9lO5#jv#AK7KFBAx_`| z%2pzDu9wY93r(=hLJd$8T+!W@r|@jU8wyl!=sddh6&JN=FHud?tni!0a+!K99!o}o zt<&QQT`~0pb`=I+l>ENKiQQ$kDOX^sg_V&^@y$U?2hJD?YA4%>3l(F#5j|>mak*bx z6EGTrKILq$%`OL`gy5@X&k#(lHvGia@%=))=`a=56_s&T!i=~LFFCv`sU)=qi%-o)6(YE>C~^zQ?ae}f@!8B%Ju`t_xF_*Ib73zXHZ&7h}D_J z8CgYH92Q$)-8K*ycI62Zzyd+ejHu<77gfI!ZWhgf;L6yvYI+rVqYN{))LuAPuVOYs zwyq-`gkkYyo&}AdBh28IX2v0kJDlcE`(++*j!|=K0!ldnY=X#JBeh8#RG^K4qKwwl zU=xQ?9wg?d>8WIuN|%w8hr@=8Xj#V@*^ZH;M1#UAO1o+cTvZlYGg|IWyNSC_$405@ z&tVOp^a5F?=dA=-_}Z$A*rvsaEZ)?Jirb&z!%DPitl^|;;wvyqN#?q_ZH|U;EKmc@ zSK-ZY4^-&Sg*523qHwm^1oO>gP035QE#sXgF90pbv*pys+(l1qTkRAzB1P>_mujAC zJThM+EnWBMni+S!N;30Dy0#e5>wGlqn`?sPIv%G{PF(wn|4&?amueW7jh%xpNCI|jB=W!mq#G1vf}@szoh>obia zS(dkZnn^9i{=Dh*+*LG|>7}XD>|*Bf_!wSwq78!u%MK<`^~RWum_YWKb-ArdL?^Jq z)Z_=6cYj`%isx)R&Z^BtpB2POgu`K5^?&~k$E)_468OMth%~hfr zQ|h!W8q*hp<=WI{9251lMOV&quWZc+z+gA4SdI&cL0G8YhZqcxoJ&5>ji28aVIi_^!gCd+yZ#iNn5dmK?YB_j??_J?XUlctll z5f~$bSvD4V%+GsWP~V9g0e(UgJ$8K5iRkH&Cd^K`k1S zqw2exsV>=)g!Nr_Iq}o1Cg0sU{syceV-XLeAabZkK;_1qORD3Rww$>kSU|3dYbKhx zV;fhsc-$y~_CwdhU{r34u>w52iB=httcOT2@#~-6JHDz6D0VZZQXWamnAK8gK|rRH zBzUzht>s#;oGmg51#XzDzzR_9u?+F3@m zXp^9eHdn8HsBr9?8(X7$iei^gZ@rF0fX8XoXsIPy%rh}D6`yP5si(<}UI{^)Rw<;W zUg!%Nhiy=-H)<@5sL9dxvKcJ1b){dOFEPT#ebO(J;#8|*la{vfnc1q%BEbm66VlLI z^NlFx-mgFW_95Kx$+(GGb`n|=+ryUFtgG<@ek35uob~FC(XREiX++GczTNJBt#JGh z+9TF2UhYzZ0M=FA4Xgd?Y_^owjMUckFb_8?v(?hzFBaaqe>*J^h@6pHd&4&cwb~hN z<{L$Eth`(Xm{bLer&U4i!3@==qcJxmQ+LE$8d}#9tz&2b5b_3Drtva>*1lRv5KV0Q zmA*PZec=&>`zslYt(Lmddc926_M)U|5s^ESCZB@vM-M}+f~TVCQDijf^L$IvTV9h) z2V@H&L@$pQm{FRNHFd>Xn{{Oa zc!+m}R+#EZKj|{{Z~{7wtqFiVC2F>rQffq3#c3VS;5l!G(~08)-qZ0$J=CKd&eF8S z20jzYF~9UDtBqd+B>|8vJM8v5k1P_GSq!T@JI^*%XBxV#zS!W_tpUgZ-h@uQ{t9a| zS~QxySvbCKD!lJz3$}!K&5;~wzL|z*l=oDS*06>My0EWN40`6Eg`PRSHnf3DmU(JQ zaZ`YKt<5~CEM10Yqo85P62`h=Sp^us$E0$zy=n7oSygi+@21J1M1K7pg+P^?Vq(LV zKPS3^Newf@Ckfz*Dc}Q8DsM1qk0K1KJFY1*ytJeSHHx7%gp{?}^t&o=bfQ>Wig|#MmTSps#dPURTT;_u2Y16Lw6axJ?oj-6 zzzip7)V8L)7}!QexkFwU@JO}G29-&r0q%PPY}V#aKf_pi;JBMo-C&H;SVvcv{>Y6`E4xmEJ2NR#FAs;2)Xlwlrt<69jaxNVZp1)U z>H~pnIj-ADgtAR12itG`GqO6QjE*{7bejp^gNdF$r8;ecS>OvRmYP1Qw(!}KWl+7z zPr>*Yni*Is9^!Gz{{LwDvygkXKEDq;@7r&yJ3Y8NQcK-#*;sbkk)n!R^JFVQHSDU| zyT-kD&32G#-Zjso6>x$altj7kkYF-^FN`t42IJ^Li5>8TO&st=E(9?|7lPa<;E?Au z3KqfPWIY{xIEVk?oafn9wbuH5zn|}}HB|YXfLwWVuNE$SA|C8sJaOepfm#HfMd@

;1b#dY}1N37@T(O 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 z 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%0D>@g}mMkhIA=$Bs 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

Dzlck)`r> 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

@P?Y?pH*^ALO-2)wY+;FN6ckZ7J1 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�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%0DI_~0;9#ja4X+q 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

eUSj2p8Ld5pR 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≺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%0D_;#X>DYLDbY*dyd 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 O*ywwFRx>&ZzDOvSK=t|hG!$_w$>~zov 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 z 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 z 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

LG3yx-W% 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

JJkL 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 z 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 BDY7q^;|$#c`^RViJ`Ui44wDps@*&uD3fOy% zPk0*$wiP&OZ(?2`T^V-L5Dv#}(3eXxB^cExLEjGeCd#sGnP7fYv*@MomcEaa}VS8XD$3AWLC0GaJb_|FF7_oVVIJr-?8N?!# zT<2CeYH8CgGst=RIluLOuE=s?MqC$m&_BJS3VHTYdMT*DeAb_yV!d7^9feC-QP!v| zqm)lQp&z&C)JVsoRI@^%btPcGjKU0MUuiR_DU^mQ$1QWgJxQF%n5kn%+(JdLv+h6r zka3$mQ0zYmQzTm-fB^_%E`tBU9yT`fML^6VZAp#L9K->sk z4jRbW$E1owWktjyRU?gw-Fmp+sV>7Q)05-T1`4ATH$6TZ)p>^OtX~atk2t85J2LEc z!@eC!%TBu{4iS{_@b&u~4 z`Nv+BCYcSqv)1%0^J_e{A25g`-`63_Yk#iro}7;(h52Wx0ZJ-U)J5UVb)cFHX=6O4 z{9z{-r&O1r+Rx|(QO^a|AZvK6H?D%PSuQvUA?74;)}^R2Eoh1j-yZXdd9hdfu6dEQrYPSX`iwb>^lzZr!6$e5Y_ZLpVC zW5$qZ_6v@M07AGL~K*% z`MsVyVF1#$xPyA9IHfcfiw7KkUa<@*!La`>!vh^41xtlt*cWaQX$?7DxWCLM1hN!^ zg#q3vwnB;#OtRu)kfF%MgG|+FvKp_U%~YSa zNmL{pAwl9d24qY?$wob=SFJDDvs)%(Nuc7Tu?6f~XdPXeVJ>FZTG$7{e@j zA&TTndiuMiGr{*qTa2OxP6VBINQ?73NM95QfxJUjR;VTc730BA5<^PqDWw`wDx}BB z%D&TCiTvhND@q^LEhfGlgIjMFXFX&={odwy4vw%F#C5Dr$3Xx&fC=dvdVU=n&D=YA zc1e^P^!M|nI@bL~;4RN}LGw9cOiD2-6TE4E)#@htFDu=5!2MYO&+h4~bWUkk6qHsH zo*0Rp#E)9hTLnqFCqrc#V<8N>z$aL57oKUCmXF3>$kH-6C5ld$=OfsJOZA6S|Hef& z+Mmd7)bqLD_a{iXsVu7@MPO-^9Ta@=8IjaH~%2nt82)Bs_2C&9|EQW{9s%I87kSATpMzV zrtr4X62)Xpx6~brl$Q~N9C6%FU}aZFdi(;3z45lj_4O+1_#;Tu_q+pPF&~69?JYA& z5dXO#2wEk`#woaqSmimNR|Sr)DL))xzWwT13*U&}LgyO{YBoqhM&FBL=6YB^Issvt zctMTlEuVtxTQuUKM81}>zbrJFTm9U2f?=#6WYg>hM$9gVz42VqMJV|bQZk$8w_Fu< zh8B2V@d`u=Ta{c+c^KIY|%w={jtbs;$Y}0FJS7uAjCFpM~p)9h}rsmoL^Rj>~{I=+C zYsd3?!zU*JzdEkRJ*UV0r0ltrS~Q^1q~s-DSJSEt>=)u$`ol>|qnA1-kw|&A6$U6F z|5FEZw+iewl*2`j_~$$;)A05p>^rAE^NN&6y}(cUX*dLhI^2z!7zvF5zs=fXyx@@{ zcm7b=hgs8rS0E<$gIsV8L7}DTrDB$52E<^^FFOvZ zq{E?5*e#FtybMjBusH4+F3r2qjizwHw}`0#N%C7{X>%B_3?*}9#nNm7 z4g8XDMYj`abU_ShZdeSRAApw3))1zeey&PH3>0pg3ts4N9T)G|dGiJ zq7LrLQG)QGJ&H(?u+}G1aeykzj3jm|U>b$O%3@?7cBhL;FN;beRtVBJyrWiZn80YWx*elq2M0+QT6hYo7en#6n7H5wN7SOJ{9DU%Z zf-tP7UdsqJv!W5tf6PQ7Gly8JlUL8d(h@7;!({DvIdK-s{;=#GPOT*8BWcQha0K< z+xzPCgA22m>u~qAWchp+sYE_f9JZs)^bN)BI)-|by`~k%I|7kOVlS=d*<+#~Rd~d& z=7(w=)UgN?Pb2O(aTkPhBFKS?{wx78-8>jHN3i^$C;Cc8v8>1EdlD~MJ|tJw+=okG~J5x7hp zD6jVYE(gnRJwvt36xFue{)a(%7qa`$kXFiC>uTMq27=U^Av7&Yt1OEJPLjp-3vrR{ z@O+K8FR3MkiClgg&T2$WDUe1X+X{-FVx7?^6Psco9hb_{bF&K|D8R`b;L=Llu^iOu zt1**9CU<#kgWcxejhsgSZj(xA{ix8{KqT+C0-FIpSf)%gQtxegn$df`nKhW& z87ilm;u%%ZY=dn#2y#RWoA$bVosWILvy#F{oiS&oaAqP}2A4_cc}Lud-SX{KlpeUN zq-4p%$kQBN+&e3ObyJ6g?fPtRR&{SwKrCWFsQj+{H`A}ZL6I{O;grAh+t9~f9j1qA7j0EozRBK{I_(_0SBcMOUT-1W;cVhU(P*yA$-m_$_3!yXb z-%uHvZbwqV zufk$y&S9T&#bliKGTf@zisSfr%$rh8^CfZf@d1)R!MVKPLMjD0_t^sVpt~1(bF7{z zc=Q{lY1pm%F?B=3)2e2zvg>0^Y;_7M9q>!lmq&KV$`9kC(Wh|}@6uUvU;D_ba$@M% zA3KWJ3JDD|p#Wu@UeB>0u{mj}b=Ph0ELPtsp(v1mw=m#2NWl29;l@Vq%HtLjzQ@}o zNIi69wIygEv{sQ8EK8*)bH>R}{#KPl4ZP&%S4iPL+8o^b{>_!aASHweu?%6l^ep&q z$L1PWXY24qBasS$&6B}KV9SZDAj^MvyE;Yvu<$$?7KmT*a;3L?U3N-66Uta$db(`a zh6*-5(3pbT4)=EBvKb^cCgdFz!%ek0Ja(+D5b)JDjlN0Yrtut?mXBLNHH1^hH z#Mj$hxmZ&p-J||oi2tJXb#oK1jh9R9y4l6r4L(ECU16OBY4_OeM``5GzBejfqbCw|$vZo0Q+9kqR_5D;LnQ zFk7<|E*O)|v_jNcb43sAP>2I)(eKkwG3>M{2_v^k=DRb2V>GEFz<@YqpN^)<@wJ6WMv5ezCt$SU zgSr^-O)L}(;;&A*fDXqXY1?3iYMTA_G1QbtHVrcubqwFu!aBEF`F-ZOD;@l~!K<}f z=n#BVbbK0fwETbt!u>GKNegJn1YG7F043fWtU#a{e0#rXy&GZIM~;$BNVf^ons^Dz z)l597RosD9PQ$e=4jQ>M{x<1H6T^?FKAjOkip(X{7KhBvMwEMPS}i-SObnqjvdbp8 z_?)Z>T%CICGaL75S|47Cxt(YJiTfWZSV|^ey^e*izpANkU$xGnIsj z^~df(UW$kt(I-Vtn>GJ@;~)v9_vLww0t#X?+@)PMrw z4x%m={3hMB<=4?@pL)?)8ZI;-ul4KcROB^>0p<)7?bDa;O8%*p+RwntkoYY)rLrDS&=;;m%NG zZ9c5m3VBq;O|KqFbYNP(suS6>NVWJ*zWhSrKzjY12<1u4UKFL8g2Bf2;yPXGJ$ z6#o_Xw%Sf|(|XXW5-2@IiZ;`k0YX$G@TRv{u3S1kNz>w@X)3Bm-)~emy$_xK?Qq1 zY6R=)3r;8wIF-Xbqi(|?!l14c>p8hcs5(wl-+O=ZV-8e_F?!iNL(ZJPM1^=pN7rW( z2oR(a1|vKse>iQc)9=y%nzuBm`6#(1+(dI05c_A79yO{&D}Dj5>h=eHs5y2KA-x}~ z_D7^yfkWvdBE<1;M^qFgeodE*&tjlA2H1$4u7HRnCZ8snYe8sBXN82CYY!L(7EkSE z20+>wK>nppuEs+Xp$q#cwSF>K2&AwbAWF-OL3-S_XSy2@B|NFF{~i;0$X<&U8&3PO zA^=hC1h*)|Z)NeI2vUWxFtIBaAnQ*&oj4ESY1KDB*vTaINu;3@Ly`T}mw~Y-AoP{qV zjzQ0{5WF(faTSfDz;)R`{dzsC?#E?sx(SDIz0S9i#3xsOMGB9hXQCn`&wbr7&&!H+ zVZ>CDu{jNSH>C_X5~kF{UHXYs8D8raqYkr;u&1m#b6lfSF4o)L0@Di}dc+qnn4}KF zi=C4uO&g0`pI4KrjaMq}Z}5UTYR?a4#3iE)r9#eotpsv=9_eTOyPG8<#kZLuThoiO zR+t@&oUg)8FNa=M7cv4Y*Q`4xmj#3>%-=lTaZ`nT9$+`(6&U6Dh7whWDozQbaxS1; zAiwo8XBnJvH$wPDK%u_@&CrZ&dvY=0sTV0grxDznehJD?G7|I(nmTWy(C8O19L^h& zw>Vy|T$7JiqoTmH;xs$7bT#rGk7D~_-h?Ro{1xn_$yd(mBeHYjT+ z9vu=*Zk&~Qz^M5C#uePy5`_j*{P`aF+>uxyWG5vZkKZbR2;)7#{Wgrf@dhcyGYRGK zpzB-zxZ#o>I~Dy(LR>T`$G#}E&D-9(3bmw(4H%r2$`LnUwf5vBkch^2HLCpTC(`im zk8GQ#uIKK09Sbr4xHlW6?nG{lvgEA9+^)qmRj#PROxA{WYeuq#i;_- zR^L$Msuy=~s@jgK?P&S;w516LX&)t5-}OCUd-upyVIhf{f~vT-awO%KSIB&$WxkvH zLwVDh4^H0TtecpVTh!NYnA(Z->Z;1AAP zWM%w3`Mm0R%O9qj$%7b`EhdoTi+bXTLcla&1mRTY*>yadKkgo}J#qi)T34X=G+f_U zm@2@;$KRyHu}WsX64TjtX_Ma`zTA!L6w1KXhUN6JkVk6$wj=eUuM+<3uanIsdVuhR z4#3+SASLDGdWwt;=%C#wMk*CMSrqb>>tBY`LIu%Q&gRYF02T19QxI^lltm7!UUh+Y z{5ejpI7H|&d2#CP!3KtUEuW&j&z4B7G)PPdsAAGPb{*8L~8$*jDtC7s{A7 zhPN04d6EANde>>g$YYu^)2~itrMdVzhUZDWbf)qNH6FgFLihpQN4QtMr&Ytb`_O$F zdrMPoXrb4Ic@^xm9ll}<62OCzVVVT*sbX)TAvx)w#bx_ zbO9nFoo%$_@u8C-{!pgSI!kv=52&>rXpW;<`jp;Y3ohKRMY))MjEX0syBN!5WK9#p zcL`{Vx{ezb!d+fXZGTu?_H;NhKBZw|k_0Pl6+Yl|xm$F5pX!`df$t4gXQ&_Y6W_OI zT(g^`3vYd!c1&sBvJXKJJV-Y{_t3N)L@cD%JYh)a)ZrGW&*niV*=v)EBNJ}FT0VG^ zlDukfq2DoC? zDW^D~qS;K1W)O7$NP%sr^HMg63wthh?a<5#nl+EQ6DeZy=GQjlPphXmaaSyAW0T;y4V zPyKPdV1si9d0si9Q|a}1>xRkAdfx|s)885EflS@uFHwobD zSk9?tJX020YpB*XE=UB5lAnz0Km`pxkn6|4k7_coXg*CZeUZTfaJzw*>G|4Rv!(l9 zP~;1Th7Hxr_fxuyF=V7E^Veog>Tqz2z$xnQlSkwiI}qU)B_1UkLfzi}IAjdFHUHk17^ehn*TR8*w3iKB}q1zyAN+J=sysJ#Gd;`j66> zR83jV3fO_Ogh3hki)1$u;Mq(BC0s@0tuj-pAc&`waUyNnRE&~?&6eNm3dyN%9 zlC}rFjBf|GyC=>^6=!Cc+7}b+%}A9QBjJ&8z2TAY1C)2ZH{7v zkhzxoo$>$t`k^1VzVSK1M8kKd$llXuT3NOfRd40fN!T6QZg7P0Op=Uahh}_y@2kr)qVg zNdUVkO5QvC$3_yCenJP4+;PuZD}No@je2)Aja^kU0h2u(a-3hL<__Ejb69I(G#1Rt zR3PcQL_@ltu<)4?{k)PO)C=0luqQD)_qd0`d|!_=tJ1I_Z`&rVsQRc8eXiLZT~6$z zY(9rDDXLceCh^D1*#vpw0jj=Rn_{6Ts!|8Jq(LoBJx=J*ucjkLehHO^*>2%mKVi)M zS5<)PT+o^uljDPPN;%p~4K%6QzjNm}&saGnrXANT2slAiib3B^&OG7%z@n5hlHARC zW$`H;r!F`3`))mJ=S)UUIck&K8WLkRXf+|NA|x4$&HRDmU?xEx&bs{!}}A` zjEADDZT)_n#;1I^k=Vbb1Az>rgiiTkY9W%|; z#Yp~HtnXNhqX$}isD6ojx+x^&ClkfIk4|9> zB%&E${zZc-`shD_>*6$R$0leQ{4FTZ*WaW_p{H9l&kzfrSOwrL&M%qbtir*5F1x+w zdCBcckQ%D#&C5IpH4UWDYyxDt5ci`?d?tvB28cM>Gv9d3e%c1?XIk)T=J8sj*cpx} zHJ05_(n06DxW414m1&-on7HGg%Bba#*cY0nOWeX&8@~AJ>q}jbz4P!iney3Mil)sj zN680p4|Mz3tNgN%BjwFwKM?AZzPFu-4BM3a)fVL-P3UKReJysd^ZQX|4`&n!J_p_+ zU&i?ybD=fc?F8%gq zjll%Xv{X#Z-<}2Qt$@G(gNvM46&=p4!Unu!MJG(fXN6n{6YW=9cN7+aIxeQepiJw3 zQU+IT#@QTMV>eF>yP>)TTx+FFfwX1oJi1;STil~%MhsjWch4-uND=ym3>K1lH%w%g7Mg91;-9w%5DVlDizlv2Jo^ISV`W>Ti* zawrU9;8&+p`RuQM0Ji&mLe&)6n5wll@MU9qq5^@MTM5*?^t7BI`!#B}+i?f3Dx!^d zON-aoFZZdGv^2KTh*Gjc1v{umn0%o<9a|c?Km3%%mPee8nqXj`fg!jtKpCY5h%Pow2TpZGb(;6^%!y8f z27hYWyJq&{gwe{J6oaQ@B!Q}q&rOk>!JLg8b$3D$2sT7EB)Nlr66t!&l`u7rPAF3e zoF9}5af7?K=DIWp!rbP^b?i%M%>JH^@41{y{9*Nvax&LM`&;?#3Fwp5RZS&X{%jeN zIJ5ohDXE|wkd?D7cgqa|QcP{`wtSl)+0%E}nL9~fm~9V_#U-&vY7ZkNNxt}jP&LQ@ z(Y%kGMmk`#JQ$-VL8+NqiGa_V7eGP}w{C?bXVa=(f09Cn?208egDW^K_3-1EhoR4GlyT1+blf15KSOa-vf>CUWj zR6>2kEZxF497b;C>RFGC(jZKJT=CF^_yd13m$S}crSZE#|EGWV z|Gjm^|MBbJX&Z{mJ5**GoE035WQVJ(8rSM34&56|q=@F1UedR=t~XD$X51|-%;%8f z`ath4;5}U4NPQb(Lpyj-m}aKmONz%PyYt^&tu^U2J<0iOrLt34M#S$sD@>p|#^>}M zLbW4hR+B_B#Qc6ahH+#}wy+?|kUek9Mv&#xa{YOj8zWs_y46&jM= z<8VC9<7)@9#7Df2Uy1TD2p#8-tGKO=OHWoMjT^z7Y-X$VH1_jzzCJ4pCg}u_CF&om zP=H*_9hI#=Qf@z#M>rkb_*(Q1@1=ujMT8ng7-ASoYwyF!5}0~aMxS3Vj31-#2bQp9 zU9f*OuQt0kru7FapXknpRoo3>{W|Ai_nMaysID6-B zTCudF)RH#TE3U*fmcQG>YKqYEw!CxVap05|CX_>e+W1Yra|qe*mXoimBqhiWa7yi8 zHAofgj!E#M&bQ}N<9r6a zGdou=GAsNT%1?#%ldC@v9+tt~Byw?8E_}~v<@gb-WX<0Vi|Y}B6ZeNoK{Oc8eIRMf z6LK>9(;Q$4Jn;yZa~<$-yiaJF5J53LE=t(_@Z%SlK|5|&L!>pn_m;)!eLHZ*A~VrQ zz{#x6kxp5*JrV1GUsOZQOJ~4L{nVCu%)7lXc^S6Dqx=AH2Zg#SL35{dI4lM68 zf_nfpi&&>qj5FH@L53a0nbf$)j;)`m>o_2QJm2g|D&cKgeCd9iyeYB=>c?%M9io6e zIC1-sC)(3MWa|%5Y!^y2#$2pzjy{6In?Jx`D4k=I8d*N zpg8z*H-md)Z7bI^yFy=>aNdN(oTK3K`Z1jM0|iDFjzHgj)}qtI5AVuf66w;)KtP1Z zlun^qp`hAjH5sRHW}Pc@%~IZycB7KJ+7&RL`85SP6`6P0rl*j)Woj}^TUlse4ahIe zd?svZXNR`EXPiXkMs@s-eF)Vab4YRHIPVO+=`1Cg8x%XPi&0-k4qqz5mY_I@j`OzyWNZ&93GJP^( z#De6jxMZ=VH%Z{5`jv!qwp9$IaE|>+1r1Z!hb`(_WLeUkJtxCIofKlagI&mKUArMn z<6uaEsu|AkMqbv}hFwTbvgK(H24slH${|oG(sZoWuegEM)`A_QY~?v#YD2|hg765L z-=OIWRGuJz7Yt_Jd49;0;guAQPlhClE5b3)fXKz-&$U0?KGCs%d{v?>K_}R`Y_QSmoo@(ne8Gpas3PGt zIV*=ryR{nC_sXY>((3O50hpj}*uEaZv*|DWY6XnyW$Gsopv0I}oSo4X>3~RKU!0_o z6tT|~eV+P50V4Cc#~jEv(TPNq=*%ztM)$YgJIv;cvUx#gVoEo?2blRm#=u72AlzIY z)uDHu^Z1_Ss{m6}lU_>kJdm?wQU9W}wDLXE^sI3G_R_IBS%H6!;vj>Aq6KNG(;y1T zEu!b(NtQmvA3!4!qssT-ku(B6Ht*5yP$0Qeo%R43UZW>?Q=BRKEX{N#gl6s~+;Hzp zUDa=UOeEIf)FYs}6cGP?QLR-=frBJZ2~0CaGL1mbpy5oEE`m z@K1SSxm~bdD);Ff3gWZqJg(ZkPr^)FuCLM~!48S$xgFdL)#nWVF#wl7wdSr|WOU6Z z0ion!8eptB4A^FBZ6oF`V8p`2Uo;j4)4&I~GoJ|8#}lG(y+k1+`um2EqOC10Z2owuf_l+(mJp}lxr zeprS%ol5c4pz&!;;@fNeA_8PGZ;a`w(RWmMV*UfUD8BFi?@> zI{1m_%A$_!WVJY_^5Ks>;q{JCPk|3pIOgiHC~)T!u5cBC4cJj*sH{}|R&l7tg@f`~ zQLYnbt~_y^3Eq{5{pe<|u)dSoOwcsmJ~MyMo%FnPU&Xe~)OHMtKI4=ba|?JpTwiDHTJDm(R3OAO1t*T)COb z!R-v|>H_6AK_)y$@$*;Ps!35Xd!&Ri4^HPV)spc8*9o_ zql6C>qCfN-GM@I~6e49$)J$u^V?%9A^ciwWyobkxN&IO*XQ6?#FXX=1C~#K&-Rdj5 zsIfsUXt5EsXGvBkbNq;AtPqxU)TC1ovf1txj<>SN-a7BIIZz~x+zpM<7Ze|qlR58d z=58Lf5cb$?#~l7gnn4b(3dz+pkzY} zEeVeh)f%b0P<||% zT#;<~0uRfhppr`0@j@k0A6>z!mFFO%KFY_Og%hGuxtI0hrE6b6l+XTV6E|R=5G$xJ zn;7?Mq);?G&#AqI+7Hh7W7!p1WcoUmHama4m3$1dZS%*p3w6Ss?C~YeqoGIg_My;O zFglBQI6;)m;A0Us78t#DwM}>Zf%ph~zv#9Wf458%dv?8~55&-d6w$B@G`L|!lg`Ne zxdt5JhL`K(jYe!32003;in`+5@+1vSkmLkM>Hc{X_8U~7VJULKO-%6+m(rv#1phiU z|EY3S&e9G_0EH_iRfb7LSVyniWfh5Q4w67wdTV9JRPW(EJ86#d`R-jK_mcP4RkP0< zlX1k*4r~1_^>q`WQ+rA5Y8g$;!cVS{VTM0Ef5a*$I z>oS~q@J#1z3O9I7s@b@q_-&|n zn<*4uDU;heVMy^*Gz9kLIbsVKNtE6-ox}+hhH>iou$;6*8s<9!bk>-+u%<$K*YSo> zuy_K!BznQh=#ZhKVN3tjzw*EQ|9oQB{2HC)*~o-Hi3A9|q;mXfq4!xoXqI=Tf;Br@ z(AvJA@8FDa<($o+pYWi&Owfy^=*o~iCoDajteOZy*sJV=QTa`XXC8#j`+}9gHxI{R zDk3?!&2b+ATGN7DdToYWT>=|s`FZL0TdYEovMv&SgdE%w!PTHfOz~`C0~P(Dt;q=`%dh>S|=v z2tiTlNWW-9>U&^Pb3mC!_;Si7i0tx0L>$FPmM6Ua8)2oJfiKujSY2sAl>MAHLA39Z zKn%2+L{1cv37H&a^;&I>W5@D=ub@PdUi`_L8@RpaW zB`giM+3NULIl*tjp4rE3f-`X`qbcC;205rbhfGYyis- z2mmOwX8<^6WCah4sniH{VIPs<^*WrRq&XIl{~lW;c~T_$x|R>h=6^Hv znmOy1mK3rfDBy%LRW)v7TzgCW6GA(YRW7FyAVK@}?(&gf`H>NOJ?^6Qmfs5XW$&y#Y1nW!^4L_w5^KXvP!FqCsz#0F0o#&3JP#k*{kZwL_>PaMZCeJ25;mn7Ms4 z$X*bKVHt7QH_lVTbGIYsHZX^Ofo<=i@4m6*K6kMxYYY9NQiMHMi{Yx+CzBS3DJ=Oi z`8~Y_q(c=aLa*feBjx#a%l-JbYl9N8zY%o&8zUWzH4IQ%W= z+(CRyZJ1J!%I~~0Qix^2y|eeo&}&)KwM>-Tc7px{-TMMauP6pV#bA2Nh?&Blb?@ZU zEHWAOrokl)Bgd?%MC6kndfqw3UI=erG#-Jzz7a~c?vQvCG)dRG=>#|LQNHJgN(zqT zDgsJ1xxBm?dV=Vg?mexmuP<2&=SK^(HnZPzZ=Y00{QUra#D96(tR#=$YH^k&|6^66 zO%^K}DPt{ATT%SxQIjGj;sK}^#M z2l4nZ8^c|JeyNG(jCZv0th|6&777--TB%ORvHoh^04@h42UAOp_A1FF;*)R5Q*m$U zyLvsWxPH%~@bmcMa+(MDD?AWE%I-5)XFe+=6Tyb`T8iv~pJZzyo8qz=X31io5C5Z_DNwOKsQ1^C3-l{L zUsromI{T4C%9J)^W`=9z*N!m=DPlgfB;)78eB+{$Zb9Tb->@`ImQzFLV$~ZS9d*9 z7*KIu5o_|n(l6%tz&)yt5nrdPe%{W*kYNXl+EULK;g{48&yvTAX^lhbt@k-=P+C8t zoMX!%QxHN^k@e);fPY2nwUu27preeNS+ES+P#^<#G3B>|ZzZMPqztr*f5w+Y?@ix@ zA{tvryazjO_KDUZZ=o2v=@#v@y&@7%19A;N5l-1vl#y=wA@RqouVa_076YfgOa8UD zjCs`yaD>viV@k6MbK;oV$0fs`^)YGiT4J@Ig-y4i<_s_o8lQ=T$-+wED&vQ6DWz$R zaqwj2HoqDF<0Iv67JoY+vZ6)PM9AVrJv;7C5FF}8_J1$K6PM#I)u7?5z#mgl2tcuX z<;!4vsYgM;#kU`*@z2Mz6%rA0l90l^ZuJQR=g~P!Lj0ZQ&W&3FRn2>54B7EvAi86o zvhBmWFn4U!NsaB9P<}c0Q9kxhfjyvQ5ThY3RHnQVG{=E8Uwvp4*O90fj&$ zgOOlI!?dJjT}ZlWKzoqFXg@o9jvMDIa;sn?d(Zo-sU8H&q{mGqLqsE7PdTmi7+f3Y z-sB7{#VZqZb<-r3DPNdYtN#^#l;Cxq}k9v&;WoZyl*C6JC z@5%|8%ESBszriGZ%eBzXqa6^lN>2P60Gi^YtsBu{*Pav`-@I*3<0v8Lo^#0)1v}=~ zc-Qd#@uiSkC)YR=>n}Wg7~NJA<0wkdXPVTfuLtnsLwwInZSk+%e2*u#O;RU=OGCR2 zK=tq&S5{wc?(g;uv*BN=cEj@sHd-^Y;@|;U=p(EAF!Zs}{v+N*{fj{>rAAiKKY{+r(OQ zv&Ac|0l%%RnIsZ|^*t zPG{R5elia3&n#@}*EgET*~Zns{3 zwN~Wj9N|vGfrK4duhOrPwb{6%xlv}KtFTIzFc}!eCTQ`ms(fkW;wTDfC0Ck(G+AS zKt@kfTjHi(cF!&f*?+4(`_j%^iJKNkz~Q%-)B zFMoVofpHx_1m~r(VnM`Psk zBHEC*S4!&CA}2Y*(3~yL=kABQnnARb>kVmynNTy{7UHpC+RneILW4z0|KZ*H}prp z*PPyzC&O#YxYZg4&TjAR&y;0^xevRHlbt zkWis_X|@YN?mN68k(|tBvD_LIkGSwJbovcb**aJ%+$d_WiL8BOx%mP^SScD&x9}oc z3?qd$0xLz)Sbugsp`02w4z#ZTWFF)c0&XyedxhYdqwWwkV?;hmn;t0CZy*;J&_}@0 z74o+*E}`{V^6^wj#+_~_Ihh{8FS}WW-RF&(a9l*Lupm(0mehY6FJ`wg+%}P4ZBHgr z<@O&6kK+iKP!O%Rs@#^Vaw^*{lxSE|B`>9wwQnc>%uI~Z*AIni;i*aVIm%%ZA5agj zm?XX~ZD(bSeJl3>QDr@1h-Z37`URbS#%gKsh~lPB)xcIfGYo+e@>YipE=aA=rR&lJ zjwSb+AvyNnMKb9W=d1)RYm{v&Aigel?WjS>X*yWww(5A)| zC*=;1zHhkD-2i*teu4Fr`@5(ymdl7)lloUn3si@~M)br*jGp`y3Qm3eG2lGA30ga> zH|8-(@^R^sKOJb;P3ICO3cGIkwAtu+-eoEDit-=*v;WVgS z01Erk-qqcd&jnac|WgkJVExZdH!2C?Aej$JhFQct}HPMKf$ zv=03AR<3x}>}iIWQt^?gtIo>LFkKmyXZvxoEU9R!pgEdSQg9*GNxzZ$$leVtCmdFC zmWV;2R-cs+kRO{VHD@`vSng<@^V~T)(`Lsmh9)AA9y$WiVmtpqt*@YZ+kIodxqhIh zRGqJIOUCTZ(89sbq`mQ-XQ+d*vd5!3Gg)g zJ+Y(c0#w(9-tCa^T0603^!Id!Ef=ltnmko%eTdMiem!G%?(m&yKmABxgWf#BC8%`H z-;S94fe42mpXF*0p&dkY4e_*}XOODDi*U3#UzO4V<9UpKE=}v+03rA;G zaqGb(rbG13j_$syK22CDP++a?A=s$>F~S?ylK0duIJI#1A?$)?)hV|@;S4)>)iy~&Ojt^$|ts9Zn3I=@)T zwi^nWD5IFNbH{ugK4X{W<9P#x7t2s^?VzuB#$w&W%8{ijLR(5D<>(DVnv5)su>q@O zZ#45VZ*ARgA3$>YWXohY$E?a(BxXeWXqI@peA&)ctVQdTpYwg3We^ZoX@zXtQkZq+ zvIjK0wZW#6_!1GmemHqC1Ao2cB4$t(y1#vCVge?wAv6<(X)n6tl|FutlQ%R~l*SEf z@CTZnA>KMhQV=-uL4(-7o}QVvEuji$7H^Zb0dT(yhRY1zpgD9yAqqGwu6|C5^a9TmBN+ z9!)~-pB}C{C2|2q3Ss-gm(hmWQJZJti?St}l^5e!u&Wc3E_Pma1OtEB9c(na!Z=w0 zc)aclLElQMecXpSrKthXa?hDL$`_9@)~pK3bf=;Z7J;BMKh&w>Noa-yLmKds5d$!V z6fww8Cy$)#L0OU5AIFGw@J?>m6 zLVd`1viJ!|$$Ur7gFNYRq+?w*gua-s~xk-}l3%ggdIrnz*f|m|e9Z-5g-t;87UBp6^_f5i~FTOq&f?oh6I=`k;p+)<+jYF%_E=>U&3?2ellDRJk9I9=*KHwng#LC_xzB zP1((y;d@W6nP-wEVAjtsz);By`}<}9=iYMT$ilK{NPj@GT>3VY5KS|xORv0;E5^Bk z_=6Z*VO)g|_)=UbQ{VdQYJP1rXBc87Y}>>}`>r^rR~NyDIb)c!DKo-ZO8L}!MdDp1 zdJi+A#R=(DC^}4#4Len1@)4!9dt^(61PbxwGq0CBW4671Sr6W8Ji1+^*_+m^mTe|) zlM-W7aet-77n)u9kDHN*1O60wtlUq9r|L?1ysKnS-vWx_h?m$04n%3L&>(6BIMyjb z)No0PY9eT`-rm@y!|spExJp$b^^VAj$=tRbe{5|0>gSCrn=I82|I0h~ZoMDAVXCj+ zac8;E0)**o%mBza!vy_ARJ!;>V$2LjuH4jwyv)b@GDR_cGgKJt|G8TGI? z)WvB0g9?g{q&*`Lq+oahfN{7!>AA$HUhk=%UG@?b{*8K!GN0Oy=5}LC9KBPABw&^B zla2S6r4iYDm`@dDnR6_$?;5A5Z=t9>rVGt?osl?8)@}G^ zx%~iv2c|L&^6Bbn#KZd|Lk?i&@^!iP(@PQd%0_{^$N=Kq()!SY?^)M2c6)c=z4wj4 z@xxvl>t{1g)%v39{IM=~FjUrRR$jV#D0dRu;#uvH4YV4a1U10DZbW^REE}bv;~KOF z$~@ACtpaZ4oo5~wYabmENn2ijja1tHN#_}j_MTB^?t@3?Yn_@DFz#!4XY3AirW9Xa zBN(@K(Drl_a_1*E`)NP3RNi(RIL=e_SVqQgm4qoNg8FE?gq>3C6DdF2N5x=(lmsDr zZ%n*fP#dB5T#CIMoz!jvlM`UC!M zer?v8{)rIoElPeCa_;=re0t+h;Gp7UQIUsKc zHX^a2p9M~&okogpxrse}A7lXIWuyHj<O*Lotu!9)boKBBx zsZG|bABP0_5MEh&<**?84gl*5sWZ6q(oxyt!XF1nt<+8f2fQ5Mur)Kzs(R^+qv%;ddA8Ob24Zl6 z2MB7`K%;^L+q0Qbt}tWNPoG{57)WI_1O{Uq3MLx`??J5@?Lr^kXXNXDqwCFeZ3h}Q zEhIn$gaj>;mPiniB|J|N@;uM8qxL)xYk7GL`eq0TxC|21h^$jC0O!CW^XJ5b>gYA<<)iG*A|UlLj=0@c%#^^o zaHavor8}#~6c}o_zw5^`*!)SVs~MH^SD3Bg@1odbl!j)5$0CofUWb~8Z#bgxAr~+` zoLt3op?;e{<67D`r)h=uNcEj&Dg|@87=c9sh(75#AD$^Ltegt2V%%SzZG(soRXfcp z@+@UqD251Ftiy}363WkQH^?H>2AB!I;u!4cXqj6?+t0TR&Tds}b=&qw6xPfKK@Q(e z?~sK8GfTfZN=a&So@0o&YsASd zV+P}Xi548_aq@79E5zHdq;URk|J(nU}x+b6I{H~+dOk9YbrPz7V_~VO>&sLS~K*YqtPpU@FoMNy<@@^QJeZH#Ncfq$xZ#clP2;HDKS^fR(L}(TXd#USUJyb47Zf`nF z*(lrX>v%I`By$L^EXQUG#2ZrpFw7-_FExvZiQ~gZ(`AC?xAcq8C!v-X00}3MV}uqJ zVna^~^-LyZILepLus1Z|f{p?%&SbYdoO1o(`0ykn6&ZxFBq&@25_iifaqDF zZMS>?%)wrS5Ku`vQQsn7`^!n%D^{Ds!0Llsfhru&p{C#P$^Qgabx^!TZEbh3Z}9u8S*IiQ?U zpra|Jc%;Dck`A+zP6>`QaHUAC?bC!}wnPrAC29vuB1}-}yG3@QrSp1;5RzXS=4^zU zlV#xK!G#}xV(dCW$v(8NesoK^MrlF04lik_|(`<5yuW zs3z1EN+EC|c4WA>iP z>%iU2G{KcZw!q~OBGERUNVyLfxou~G2)*4HZ{nwbm3*E#J9!h`$;De@PJWFwuUK4m z8sataf~q)ycC+Fg7m1Tq->7WQP(XSav7xh^1wDa=+a9EpeJ3g&r85C*KdJVl2N86Q zCqh^QCg(Ilig0m8>GE$(j`}zPy%cfAHze35p%huwal=&VL`WP_=_fVqPTU0;K+QKX)-u9#oS4V(u@Qo#Ov!!UkIvK#O|?A>`y2+RfbD{?dwD! zz@EpS+OH7s#4GQ|4)hB&p;H*^>(;rEk|Z{{6-ciK2z)>N;Q~iw>7%rg&CO;@8x2{OaNP|!M`lx~+;a@NI5yZtIB2pPg z(3}@2KBsW{P@~_B=qO)~8E!^U;ZP|0kyG-}ORnFndLrUky`H}0LMXO@kgkeu+OjxM zN)E*Hac^eiW_vYY{xeOM5plZeOT;7DHM)hTz z)<1|~_I8ejcH-h+Ej*6A^Yh)O!=Dv4Du``_qzEwlIuup#5K;Whsj5DP z&=Jb#&Xhs_Bn;B?DaD9|LMwu9c|6???Pc*d&!X@r52Ps`0FO{)&|Nr2u%`#s4fhJE z?n_ug)2Jw|*Opqn41Qf@(d0{}7i9eRWY4ql9uQbD)q3EM5SXf*pLr#d_ii$j2xo#L z{Q&CJc!|;|jI{8vKl)l<93!gx4beiQo2@Gshs}`RxN7d^;x@o|!U)bway_D0wcGw> zP?Kj72exdmV8>g-ZHwGXa&pK)CKMA$p3XzzSp@Emhu5q9HB&-yu`?tR zmI66l_1Gw0DtBYTNHtp`Fkmag(LObN$No)rKl3%+lR{mlM!4496sO7gO5JtrQ{v&> zml}s-*_Xm^OdDr?LsQyF{z$u`o7`rEQkt=2fQ9%#BOJkFE10!;`vwAe3f;*Wz`z7K zDBF{_p+yQ0xy_j-#4jYWEQ&GoZ(fHQ+J^5HdXRgD@#xgh8)VS+lxXFEzYq)!_=c-Y{wHc!j*yh{Z(|ZKEk9D&*hV^EybK15-di1Sw2Ks; z{QT>88gt~ejbGI-zVPpZcuYFKw)m?*Op(M@>aOja0`H7RMJY`r>-4YD)bY`ak=Nrb z;>2H8!`IJpJc+B~rYg%11yVHfxH4!z$M>nsGrfs)&c<`+(cY8_)_G$BDORY&(ZYz6 zPy#=4isMjH@{ZjxgN1Dn-YX~9Gn=|ZU*(spgkbNVV&zFSPoQ6Ko7-57k`owg%IsBJ zI+J1W=93fEk{qciepw?|4ejYW9&IPFVkP8nqeXFY=>=?bp1z>DzmxK_FgI@k^^3gd z$2`w>dTw)T0p!I zam9bTm1l1dm-WEb)`^-!tSSN?gnL>=?}dA=S&pybUc`Jt^jLYP^%@i_TJ*)czn4!C zAwp_r2nHgqkckchL|6KSnG!kmG?pM63toIip!$bQD~53q^4MPee#B*bWNhv~z(4^N z!U}dheGegVj7bLzL3LPL#moc=`V1WaV5-7!#>B=27b-{1x5Tk}VFTR`_5%=pnh~LqM zXb11=brKqca}ef)WEzj{HD+CxMJje=xs+1l<7a*@Uclw}X7pyUCA`mIs)(L#2p)z8 z2)`96?rLxBI&N=i71=dx?e|Oe;N0)85Mx2!+DqVeqb~zf4Iv*GMt_4QFL^R z*M_-k5KHDaH`bFh>W2}}EFBLsEbtsBxgosE6A+idd$SBI$#0p8-?Iq&p9@WTYIjg_ z`Z>e07tH<=6}-&&!0jo?D!{~qK8Y900jKl;WN#b0v}j?{mzyPi=!K#x?UhOS~Z{FL!!`TmrF#MRu^w`7+R; z;X6i2i*d#J-Gn{fYoCFo@ z(A9vLHc^4UrB5)tdZqE3li5vz5bhNq*wA2)%-}5o48DK>8?v+BpEyAMM(X}JhUlBx z)HI?)dcnJ%jCUBmCei9oR!4Pvp32AE$*lYC@K#nSfw3V`?d>A3a?xfCgEiK|C;-<^ zf#u7LcNUA2@wU@b+>#wuqypTj>B*G#nd=*h>h`ZT7apEoZ|HWVjnh^wAS;of#r4f- zUe!$5nvLQXPeHBSr?k}ARvQKf2VwN!N03|xc0e8IG_t2l0k6~RtzNsb|H^0|lC3RyS=5f1PN2k%}K`7!n#-W^A8 z*kC8?=+UbO%$UUtJSf(k{F6e^LXJI%H2^JtMzjX*{&m4l23Akm^3O^8>0SB@QC1TpgaEgG|imbV9jAt{xie?4g^K5gC`yVT&V+V@Kd z#z`mj633(;JykQZ^{7K?t&!`MaPm^;cNpc5XD)s<_@=BJM~Mb1lyxxj%Qe~Fn)11(J@;T~cJ#jjk$%wVns>#{iX;eM z!^;?hGCo8a^b{FNOrm(GhH_^MaOTa1Dt)aHGTdP*)tfkizQ!-m?-gJ$9LW&a|Xx0uMwwH zcb^tDGXi!nAlPhJdX5^OmkX6(H_3yO`-hpY!#{3rGiFJiT#7K5JA+!1D2Fc>&v|;) zkN{NGE~;y@?-jH3r&V~983c900}O2`kfA&h&kLAfXe0MoR?%APs`g>COFNa%0H*2w zC9t!f6$3r>q{Z{RnL9A9*9iw_kZIT&@I;yeFp&Di+6Ao9njNAVM#pBiXHvOV(s>J} zM9-i=-{r@`+{aF?&)u#S=Y*>&Xi_tm@^5VB!j4KqfkKJAWH&eypNP<$BN3)IR|XBu z?Fu+A=j=uX{&wvf{oyTX)l%@AqGvIZajb{H&+38p`iV^ihk7su4>~=*JP8Sf9{srG z?glMrO>0 zm23vXUH-O`Y&1<=WN?MZlqXCZX<1qD$B(4H-flQ_Pg_4fonhJcyo%oBtSWp67}Di$ zd*5(+sS53HzL{@iXu=|Q7H~DQp9O;{k`2n7)f0E~ zy0ze$-?(@BsVtmNwMwUXvmL3^fD6IzH1bS74{G}uWe`Z}S_#ap82f$B+SZiyEXlU zzyZSGe*0iHil0qEU(D%)Nmt9@?V%5@70g@c@}Mbt@5!CPe6*`3Hm8bs_H?w#(XH&v zN26Kseh7yTN*=LilEl@!>8-lRoSyS=h|WJNbJMfecEJ7fy%VhrA>UuPp2J zPD1kst&Dvds{`C%5JT8$cnmTyZk!T>i>*2P!|omv2h}d?ljGTu$w}q#md#BAD9OFt z&@n5OAz*HRzN6{pV>I$vh0&(EYqulp_hCCHJL4XIgNTop_BV6pH%%ks0;lI17^{m^ zioHejOAlaP&BZOpn}Ip!1(cOU3!q{Pg1d5*WY{;rM8$jEYth)G=H4py@??6l*U(Sq zTgZ|I%nK`3skk_T`hnDU#r?c0k1Bz9SC~5p`h-}4OX;hkh|m`|zP^*L9jUgPA1%h) z3a{Z6df!O0Lo%SyEnwBUfWnxP+^*YWS-&>1D{b?GcItpuFVP{Sv9km--$l%E>q_8G?_wd*y}DSob*xq!I=eSY^j}`+X*(Aw;9n4E^+8x4LoSo03ktAT zXqr~>jaPaMyOL3p^TzlRAx7*5|5NS5aqBnutlmD7x??yh?&Wd5eU%yk9}xy}YA~5Y zNEOZ-W&Pq0hUZ8#->gFo9QC((s0o5WD)IPEL-TBQL;ujk<)0$=Xq${h#1&ti#qq~n zfMg2M=tp1!h~*je9FU5I&0xTW!J(3h!qMKn!WLeAGzTb2Utp^M5g(Fi`<_EH-ZeQp zRX+Kg`w{!nD}#9ABqgUOX3GKTb1Hb0BsdRA0rPbk^#{$*7Z5k8nD&SN0*Q~0fCTeY zqa`g9SzJ2nZ@r_|x)vjK;^+9}xF*yUo-}mslRR?f7LBj1PA1o{5a3yUmnR5O3WP%E zkzWW!z0pK^d~IQuTtb%rt!HWchV?4jH;x!KEv2@ z?K#%KUy=y!y(ReBvNnjM8qu-f>I7t938zo`4-uIuEB+>qOt6tIs?B3u{Lji_kBPa z)|9YS-=e_a27NFNtVb& zl4hqR_>VAJUS|{=Xgf>XKL}6vGaw35;voKaFN5Tu7KWZ4uwMFrIX+LB{t#d2<=*!rSe?N*M@^n(5Zz&@0~;Nh%@yWDP(gYZ&!Hv-?rF_D#4Be zrhoQAF;8qS0+{Hitndbpkqe@`oZx4sf7=3lYe;woHJoc$| z6a`rYZ@Ezk4{k)yujM1xmfgUpONvjnu3J1AoR*0ZGw}EHNUnQV43IvBd5Uq zO6;AxHADl`94=K4Ju=TdQ^soz(MRn$MUF)!yB4t(S>x=NmHj-;uA6Y=Z4T8V3jEIc zR$%1Op#7gNlmxcSjQ|R++5^($s?nEam>=zAw*Gb;vt9-3aawESkY3a!^omT`bdNUW zz+{^@z(a4OclI;q3{h|!$b4K6)g_b*y41bl&B5l1SNLRHd6GO)W)H`Ac3=ZBeQl6>uSGv(AwI)(U1L<>I;(v)Lsu&fGoiDBylu-RJnqGhVJPUGPv-n&kH z*6(?Op*QF3=7b8>@oS||W0PV#NQT!Km|_x7vk^PWJ2G3b|eYO!GYk^Wlq0lH;cJ39 zUodu7zxK6p*uXHmJJqJPVMuVCCc=&cs0nqTW5$BKML#Fsl41JT#rg}KE=DIj;!-3w zlYTa8FPX=iMsK^JkoXF&OUah;?g>=#uL7bP^!|1jqEeMI+ zM&dRd@1!$~lgWW2eAb%}dFU%XrK?6}^Et+WtL0W%))iKD0DSX0yfaOzWjMci z^lNSHh2xr`G?tlW~<@tRh~j zx&|qE#CRs(6dn(!|sUyguWmqPZISB1B8 zoXZ&lN+zS?IDfx@LFrWv-jB8JJfCdTDlT;n@!|A%Au+ovPh~Yr5K2sel$QPA;rCPPMazL-Q42<>P5gNM9a2CuFPEN-ewgh-#CKvWwQ7o;PB*{-y zh3{3&PxU-^TTz%Kq06$tblelTP#EDJ`+0u`?*#7Y`6VWO<43J?w>xxltUeNVbzsJyZQYk~U;)ufbj z%CgC3v}54U6{ic_4c{*mYt{Et)iyHng-tsK$~)?&e(&FJHQH|CBbJfO%?ef+5X_G@ zx+}1#q(OYUi4tw)Z9(_T zc;Y7zq#{|3By|xw$0ndgthX*_KoxbnJqxyyGGh3%-O5ds%mCUvMs0C~`h`h==d@*{ zu6YYjQhN59XxrKWe0y250}1J5DGY!h@v@D0Ldp>Hcr$DczETh|k|^`Wk9{(wFJ!prAPZ=QU@CA#OZ zXT~TG#=Z*b%Yfc3GSgM8HPO9Kyot1ipxlX%g!^; zBu>k1o1)Qut57FGZ)?0gEmzEuWIMUobd8rKpsuO~~UG-urjR%kR3H3??pCTt(%t0 zpk<<#HZ1$&i)czEhnjp-E*m8%R7@tRQwwP#9q(!v9c-{Bky^PvB0=QmAr>Rm$XW1l zA3-0@NlRgp1Bo{zM=joH4H`-`SbCEiVBKyh;sNesM-BGd{q{#|j*Bsy7Kd7wv&h5k zBl1Fx#u-xRa7A{*@kd&sJ`aBu;4J#xBmxl&9b)ewc{fNk+O#FQ-V@g{4ItDHPjy%3h=^I2zcunSso z)7xMnOn1NHWX{>&{%!_f*rRr48T7f^Uf?*LH?%@w@N4)9f$bz)G7m;N2})0CKcfk& zx8gBFyn_&qFrq-@_}Eu#6xf{OCh=JFrGH_}h%zvR7cS%FvK_z2R85S5h+E--FqdX8 zZmjU*Fak!1+~Og1LO7cKc+8rENgUNB4J})uHN{ zO~@mopwybv#;OiNX$3U~1k#?=dR~aPM9>sYs18xvmE>vC)W|ab3x8M!&ao$cB(KOA zzgPt~f%42sf2!JWyL3q72dWEz*ShIZZ_vM*VK!|6UCad-=TIHNvYDxFUkH$!ZE}G3KBIO!3u3Z0H1a>zy);eeO}i=X7I>T4l2hq1IPiCv?+ebfja8anPngnd6tL4r(rtB) z$tP_hP2J9umFSZPe=k>U}YMY8XFBnhjoiN|v;+Rg>oKq4+Yq))W zHJGTromjN_DtL*;g9YPM8$~yMPn-!pfrmB!)!IcCQ7XSQuhmwrF&rW*vQckzL{fs zT5)_D>|rQuT-qdyIiIa#wMz3iNP1!6!$cK-66XLhM}xHHkB-JOCd}rE&W=e0Du7*C zY!2AG>MQ{`{6REtmpSHz(c*I?YvjKRS7Y0Vn`ia!t-$Ls+CW-z7pehiimQ?;84#l2 z1lha2ZHD!et*hM$#PHY}k%7@yIU?-GTKCMlfzZtR;Ph~g^rAz4*MxG0j3tLB5qgwp zeund_F@61fxyC`cymV%@)p2;UH7MQ@y`wuMOT8E*+_^@osX^Fl)|8dr%7lBr~Y%h9Fw*-;hgp>Z2|j1OOyyU~#~ikP6HLf=UCk zm-B&1;36s>RXPZbnN7C&K$8|etYITRzJ*Pb{*@#CKs}9DK+DjZiE`i+PcO~KPp`9o z1FyO_weEYW9O~TY%Ub%4^sI`#hC@v%#S(P zgM1asZSSAt8j&zXnCjcjM{y`A%jNv-5x~#RyZg}DpApbxQwU<(l#SGG<`FVIODUh2 z3m$mDn?}T-8^=U8Q(wF;a9S!eZxgzaDe1EJnFKTWED|~1M8Sk6Q{fi9T1LXSN{p)r zT>6)Ce3zd$+9ZKRXx!VK)cdD!6%#f;V1Ng>?$?Y<=yLDa#;#EoUt9} zV!=2=ML6Ugk~s5;-uUV28M1O%Y{;Wpz2nl$xQuxUc;lYYEBXQ>-ss&Lgu1*zSCG(s?YPBA9U_XuaUf+(@$D8}Q>`p`~uFw>X`O z@~rB-r^mMpiqSbpjuQ`zlc1G>5nnf*5oe8G@vhP&dsN7=z2GB!#O>l%RK2rhs+wQ^ znLf);kEd@xhKxH6n;xh^*Ylw5Q~+_$g#!-2rWciI5sX#%+#xWvC8XQX<8%8Cn$LxV z#wZ}Uo1aqk?h|7%n`_W7R=vStD&tTIPWt9>_2ZGtGJ(L$CS}wwg-}i(=+u%4nQHVB zLlOMSSTC2s_Q6$`^UX#f8(mU2-6S-EmBS6*eV1tLr!pviNaHx-(M_jarOTz`4xqMZ z8}$-I1gPS=fC_uidpTkrm(vlS8|`TNkbPTfS9@)J!1@?{lsqCJJSWiAnJe{f=j%lk z3V_0|j_q&3lcW#4zExiHODW;kKcCny4@HutUF4vDPI2GKf=EeLgp!2dJ+j? zS4RvSeKaM3)7`zS*(`2LLNTt%RI;`Tx@pXO3BZa`d>1Q6?*q4#Ke}P{^=TfeSx(VWI60Zl^9>~N{jKOnUPgn31zaI|m10|u z9TzlIyyon*1ouBYr%?Fs`%oWBzlMMRum15r!{uaL%DeOcdk|_S^Wi{#YDlSN|A9Z! zb|my_`0zkykUc06$6WL(e!EY1mD-Ql`C`lhEsr>`48^bL>{iSb$I5gsQ7pI02Oje6 z;kh+2>0{MGIt88{iP?Ufcl)%tr=Xi_=_NkY^77WMUHI%gq-Z5lv9M%d5 zGyRp4<s#v&WYK8v{TQ%^cW} zNdjjQHIIa7{%Lu`<}8IZkxKzI<(GA|CowPhi2EYB)%is@M+37W5$!f6*4DNy_ZuvV zmQ}99tRKp)y@fV_<5T>M5hHG0y&Hb!g+%7*#QlAO!eH}s7a{uBrqa_l$&}Q$P*nwq zY}jWIpWICz?9(ly({b4xBN^W504@qf2E?rAf|*T532+wo`oR=qZ`wNZbcVz3DHD!Z z#Btx?YsEeV4aM3`bZWzowY1<1C;|4LWLISZevEEZZ@0)(7AzXU1W%+8-h~b*G!gw4 zjmgrhiD|Qj6?n`U#j%Q__P>!}iCGKBdjXj{W|X3lisr5R`8CO9V7>Ri{;0cD2DqOJ z&S=)bO3_E1yzB$cMDL1U!z{rF#TY|PaapK2$nc3yM4T*90I4Ie9)a!#yOlldDtp|@ z9b@!)m+F|;f+PitEny0yvjA;YRjJ&9^4Cl1tx*cqjRbCHN?-6D7HG0-C(1Z&_t3V@ z*|(eh34VR2MB>983bH3Ik(O1BLH(N2_;R1%kDAzWqg;bg>sQ@!MU1^f|HbkAf=|u% z=04!`YA?UAtulYmfhvILW(FYrXVdd{1i@##33w--lFUVkF4CgB!QM!VMbtHA+7LCoF!Yt^&fRbvuhRp?Hoc(D?s)EaM-5jU3! zsdtX3myxW>8v@+ujAUqi`|;8(=aj%N(Mmzp7Du?sSkPObfJ*l$0Bl@8Tu2X3z5WXV zxpfQ3H_}@u(HxC*s!(CP4_i*RBhdvfG3fw^Xf*}qEz%PlX z%mQyWV`o9ocj~g?;&(swN3hz79SoXa((d;|^32eXbNx1!p9YAy-VL5W^xA!j+EkFg zcO;$c?iLE;N^PoJ3&;!@MT#xt*PdPiW#=cYpLohhR3_4W=N-Yn6IEMCK72p> zzOuxK-rY-HqcSt5>U?c}G+THX zJ2p7BQ`;>m>D7o%O4 z{q$#2_UqwIbyTt;jy2um?#M~vsB!!09e!6etm4W0F;W1hJK$g20ubj1&B0uEP__D| zc)PiPeI?Ehw=Lo5C|A^dVc!al1NvR_VMGVJiIudiReyd)U+!s}{xyi?!Pg01M~rSgOI`!eAS!UKevnq} zuUQI4){9pXs4o&EhC9=^@TG3_Rj32i6{}z+2Iy`-IFQ#Vw}PgCulFYNVzNmNk}@H% z0F;q9c7`hW$b%}Vq4mYCp~jO5>lFo4>L5!U=e%ZUFodk@a#T%3X_+RFemc{ zKrDmANm-`FWdTen!idm^jBDuG*ec@FHOEPOqU+oFsjUDBVV)#nhW+fe24nxQNnLaT zae>9B?Am9yh~^O%_Gp0$XI`T@DQmsBQ5Vq7>dr0oj`>YmU2OirufFhmK)u6mbLw7Oxhs>))p>?D*1$vf>xri zRDophf&Kg!`>9C4Sf{?FgI!qV%U(5sd-Kp6qfYK!eG zapG$%jchkz_)B@K#uxPUoqffN43)MkjcGqj>vz^arG~(w{R%tf7}x9iVwj^Ko%#XcWpww?C3>F81 zrNa!R@egkO%`jcUay6T$xyqISypZ-aAZ?K$ZIgdTh}?$GbPnauv*0Jpk&!OX63ml( zF2;{fV5C>*f0fUbT}PuU!+Xi8l9Sm=UQ8yHD%-p3JT=*u(7AfsehE))U3jR^1A%|f zZ3$GFT1nd6Zw3s_D)oNVT8*E{g3lmO3hw3)t}@~Y8Kv+R;ZT10z?jipGA_yg{XkI) zLWDj}ZY7rJ8IHM=c4KA=JI5msBoFX++(%6AY6NqIp^~0#qSvIvDxfzi0AZ3#+h7B2 zH2_AcXtW1drr^(4GQI}Y~1|)D9z)^XyyVB&r95u{rk2f_C{30vRZj-ktF*7=Rm%j=rRi5kfm?W1Hdb(1h<)%IsI?LV=+CbHR^D;A+GZ{r#BSW3Mh+xj z3A^R$INhh>V1bw6`V;!}XmX&Ef6t*Z@hF0K2a8;4-nGt`O18_?tVK^SON)=PTTeQv zbM`cj#w!E{vFu({5m%enq~1*Z)cpBTU{%5 z>NK+G{ks>Jvpc{8Pllq?RCY>JIYYXhcvsN{J0$?3L7_ChMs-TVAD?)RHssnK&C^H( zj_@LhAWAl2&_EcUY;ir6!7mV~>Nj2EB}{dfQdA{Xs9p!>oaX!vyyN|3e#{A3Q@;hl zP3M-DdD|;2fDflC&uO&i>whI{GqeC;sWIi|2=BiEbJ#6=ay1O)_zbZd#fbXyqf1Ax1i#H8h&8g!K^|gYKJ1KO z4xF=YCzL8A=j948%dKpRd7kc=jTQT`)c9(zVM8%hY|EU6R_=VV0w#B={pQkF_PBS z#vh;~uXVoAm@0kW^wIqkV4%(wvS5^@dcvjW%wJcj!y^alXVpu^y0%yXVxoprMA9hH z;u%goO;n)yw1wqfk!6e{81ICptbkbgCxA2wV3Y-j8&XNLjqnrRrtDsZK>=W~WaVcP zKBU^r+pwaGC@CFr$CGI4k8~`Gvy|Vqy^z{b>S=|<$8Bbm8Rt!+L3)_s-^{%*5~JwU zg9Zo^@-dz+I=P1{&W6jZ*Y{yB@|hQW(h+!@kAZZd+^mf|rtRp8;Tkxn5=^5X28!jr z#pW|!Xy<#c3H^?d+$<6=A(TY&sfe5U?-`{L6NPr@;T`B9+~?OBUdRqehHGAd(vg0> z2Dn;y>xg4_pXlBSjKYlp!YJp(6ti#oj}IZ4F* zug&n5n2cfOW_wnvk6a~T! zGl(NWf!>=Qu}AL}-*a1Vh^b%9#j~m>hCAnv&fitZV4I&X)@7F~7lfR=>M8!|ZHf(_ zvh!iq=Juenq;^R%1|#2@!ey4gaRtnePO|+7qGp?0brN3zy0kY_7>J%I>_W?%)H{Rp zHXsQnR<2ILIz9u}wTX)nw}J_thI~x`ML@d0$-Tl&XGROs51uTjv&%dUK6T*`Ga_0z zJ%7@;^R;&bJp_=MI%KI$-15Yyhdsp@QZiks7qxQyj!ZDtQSt(qwLQ3fpKW+iV!BXT z#eu`Gex+n0TN{^)ge71fhEQm(3M>-15FX(K_Rw(&E=A+6_wT5{lhk7o)*BNBMCUs; zK(WJEYlDcp>e%>eXtyhL z)gR{WzJY1LE2)KZJBz()lNrIB*Jxm$F0g*RSxN303YIktt2BnpckNKfv+2at4I-Pv zU|7W-<*;DJRA;|*=E<^>%+%)!B5`RVvN0#OVBFwtRV)PF23NN%qRS*A^Yr|ti&rPI zA$EIF^k2C-azMFRY5ek!Ayv7=Fpk#9m+VRg^P5CZ!dd7{!P&9}bF?+<{_P6>&UFd$ z-AI3@d`ISf=};`x&kH9)PHN{Py^MdyZq&Mg2Lpb?7|bVY{=fd~fBd@ybHMCz2D68z zv}7pb?Bf{AFbhUzDPJEsB?9vIY+6t9=Jn0+V{bty;q=)j@ofBVsEX0z%iM5TX%E$; zG<1PcjvGI*|5kjmWi(8cC#Aw3@DR@)!9Kl(xCay^aMX@&gEESCkKf&fQ@e!mz0az+ zdwoIm=Nj`=32411o$Q(j-N&YvogAK-WHo2Ca+}Mm%<*FXwyebA+}!d$-{ylXZFQb< znDg)cD^{yp zQA*kRj=TddB0;#SU0_4i9u|qNTTP^N59ji``yVG@+Qv~~=!A>;3&pVZR*eaS4m7m< z#xu7Cr+L2hNTz5-eN88ij^Z~9zliKis$$47>fLM`@P56v8HBoUV#(<6Kw0 zUbbwr2Yn+tKWftKP6YmU6F;=AKoTVFJ#8|!{9PAwI51A|XsMzP$_1O*xx|EJR^K|{ zx7w~or|y3EzKJ+{yj+9XydRk$$eqX_Egw=$J-^AK@qqX)lqF9q%OAMFO2b9jqkEHP z@EeSfVdhinD_}?juWgaq_7GwtJeg2@lZ9D1k@zj9t;__BS2(6=Dj+?)dXa8_?NM3P z@b}^%(3XELo@YEA=rzO^XSYZk&wNC>KC8oJU*In<>*tJL*1ZBaS9{VlAR8PtG;csM z=V=I!CIj&jq$(39u1xo47C^1eEyug?ehpfPY72jp_J8r?2kcC7{7iKOuW^DQFB*y zuiqn+@dNBlGB%&iF&-?Z%Y=g}95A0`bsDm4FH ze$j&wRL|eo!+%foicA?O#nJ^2x&*=NLj#o$zx51%YbWHL>8aO52Pm-2f5l4u=)Vn* z(q3W`R!1e#m{tWDqwGv1|6rDV$0@wl48+8JeWKJv9F5)qZKS~U0)A53+jzn)y0o zbHH;q;L5(14!*Y}$&Z3{i~D3%8Bqf(_#B`X#kCPp;vMuh%H1TMj4R!;7BDoAzgO~1 z;%YGa+eaTnf7}#Jx23=B`1-s?FI%g=KJ$KPen_p#a1zKQNTTQ2%a3C4P7;uzgmJOy zFlw}~uqu0C(&AV7-RZyn$A3SeKE5x%k#S4ooYXihn|Bi@;hT5?vj{AO~&!YHwamaIAJXup@*!w6$0o*}LET5`y7~B`P8yme=1ulfb?`?SQOYLOxk;w_9YD>2@2XV`7)-) zeM;f?AiyBg9E*UTbx}oY_;l{RZ_m@utWGIXDuic;G~sH~fntsZOJM~MywIT}(&dbM z;gn;Zpt9;c@e-|pWN=JRcG!onzaHp^l+O+EuvcNr7ySxp7dtejQ64b024wHVO!dhI zVbflaJaL+VsYrb(EOR~EDBeQ;4M`Ukim@WTD3QWIs>Wh5whszCn&Cu)(fzbmVW&&F zNX`PYn*H0X^cra%*eJ7CJU6$%r~v-r*(z)U*a(H)@I_c@#;)QZMAVD6GOdz51=OlD z@-*;nvzo-M_~96fGHZ8~;|V!@y3Tv7fpKc}u(p+agS0Uh@%3aO_Nc8A$p17V-Wc}6 zq(9clm@G1wU;{Upn7Y+*w&zDn*JhH4Si2vA>IVqsxQ z1t!&@;-rdzJLYCNCVJQAx+UoQiYw`|I%;W@2jXng4Z9#%QuU*$K1naqZOGlvt$XYq zqf`guGpVVd+lPQg{5%@@F`VhSb|S3xWbhPAM4;?INH<38ekuD^yL#U~!PTxz0k+N5 zGdlzI>D<{{;RGT}XsF)+alR+NYyg@Y#)d*gyB>?4>X6e=YYub_Hi?!l$o@|027V__rq_WFlF?TGU~+VE4%s> ztx&H_FS*_=>zoi<&co1_i)<+bKmRWK?^&rN{3R7)ScoKRYB&>{5~rhB%~@-bW>O?i zb5Casejdl`a)wJDmWRMEvTekS*%3XCo<6m)M zf&qcx<^b=PlyO%lgYzn- z$aHp}16r{j360~GNi2BbY5UkPQPl=}V#e|0X#Sof*ucKe-$5ADyS`$H(u8(Wx%4J2 z9k3R_v52a!x@Fi_{nzY)A%(HByQ}F8(*~E)c5ZI zEp(jAnFYb6;PcfN2S|=(1`?0@faU#=36M0;_QP^u90jWBQUb;x56Z(}%FAn`3=^hD(3sy8^(dz;+wXCrjwZ zzTA6i<@aL1(~aaO>?`of2gDLszR;q}=j8h)MqzSkRjr$ev& z=9I7qVhLdCZl-*vsx{9$yc6#*M zaE^i8zZT+k2}&Dky4IQDX!g;y*iXY1kuT+H4RL?XjcTN=BJY#LPLlCJ4e024|j_^^|T1CSZKr%s$BRAXPzfiqtuslm7Vp!Wti=K9sxY z_FcoLjCNlMCALC#MJnShP5A&s0#7Krr+}zPyZnP-w-u)41ug!UX(qb_gDk*R3s6{; z%A6vQg_CT2^`e;_kjTZ)U64Zqy0=cmhK{;@;%mLa=lV?OFX&dj6$WjERtbZ!@THZp z87?TW1&9A+eYsfQuAWbms;7=iVGGn<3_Q-*c;pQZCa8&j)sOXCw9p;OwoI4z;Pto|hD-)qn)D)>EsMuVc7E9HYeB)zd5J@7 znXTc6;^G2~WKS}pFUc2&^9y)R(8J5U9iE-GoPt`7lkzXqsAy;ZC>d)C=7-H2#WdP% zQtBsy86U@E^t3Uq+6s+ujwlWjz^|FF@4if%ezWj;_~Ls-l2JOHJrKb`Q^z#Ztuexd z^A!E_y^8p=IfMP1^6|*GMX)C|z2NzIY#bD=5j0B>&-#t*YaQ-0@?H4ijMP_s$>K)c zq+jx`5l-Sr4cgb*5Bzz9)r2S)X*R6ai_1d5%hD(p&WyWMXa|>#Q;)QKVRii@KNoG! z4}Rjn^JK1{~f^wC8y3pw#HL-tmcGb5M7QyL# zwfaInqlYEgOnepP(=;y{+XW(V+2v}N&|>Kq77Dm3-SenF{n)%cy!cD7csJb0b=wbo z_pR|1fz${0S~8)=7v3iRb43jQ03CTS)X+D&d3l4!X)FO-vAg2x!sj4t6qNzQg~H0L z!x7(YSYl)Kj`wBk)y-oaM z)&wTd4f7~K=?_Xn1HEC5xTer^Ssnr%q$%~HaBTU*zFRyYWC@`r%)4^Wv?C2`Zy!6W z_zWMy#-+2#Q$sziQwdWO)|x%)Y7^p)1U*nnXR4<)cy9@}s(`>#fEbNy9PNgg!RuAz zTjI>oeUUsRsL$`Q7x0j_yR-^~T-jLzhv(;pLcSYqMRG32@LR33AplNx?^1Cd0Ib-4 zxAdHY9)mpSG8fE^m}3}T{w!2aQTJAy8|deWJY(%b3KMi+i5!8wH(#Gf%6$%`4-?U; z<-<3Ubo7k|K#==Z&2GxkDQ2%=me6lMeDj}Hv?>7L#sg~oDPA~9d_2h%>ZqY3&W0}B zP_hD+fDE7tFL$p59>3p~?uFDNTuE#}w!A>Kj_;ZNCD0v(w-vOk?HB5NdguPSPn+?j z!)-gpDPYrbswFT}70vOy7;c(pByI8=`*N>gEr0V$Wl=+^+R zDVlqHkL!)-0WI68$3b3uxYLgT&prXRpWULOvKzB#_aLto;x>C$fv%JyeKyJ6?r`CM z56pRZlPH|k*Pajg+wiMTYqBpz2V%`dF`BL)EeClAFA@L<3yY?HUz0DEtXhR3r8UuH7o{tS|6(XlAZp-9}+tN0$l_Yf8JN4Dj8(%;Gh6@mF+)@Zd4 zI;XFX91$!+pzU}zZCNM~QezUHz%RYa55j$M?^_n(j}aP;=}>8B!KHzdvlHkvJC`28 zbeLk2Fw4r1{=xkcK1)Le3>I&5htku|+BB_eQI_3h62lt@8s@{cZOK`=4>b^7Ji(8N z_C=ZQc5i7ZixEYXcT9f@YkErN(y?1;UmwaV?Z_`!jyTW4cV?{6!XV;1)>wa<;mq1g zxg3Wo_VbEO9w-Ye-x9+T#pD7dv#q$td$6>uKL80+^Js?cU;?S z`6MgI{k(jK@zjc5mjSu@unNUoB@`x1J$wK4JDDqbUU(pL2Zl-9Y zBM1)nV{^4QEeQ`QB2IjbohNuV&xpLp2!dOpIB+NlIG-^W?T6I|Kw6&x ztRUhM9vq_QM|28VVrfJPuqtbCxjQ6Yv+cBn)a-h^&>$nW?XmoWnIGRAh=Oo2wTV@z zyjmo1QL&m0Odgx4vT8{Hb(xvV#n0&bllg~c{iOF?c};-S28BxZ8!v@>dF z63{C7ud!JMhPy+fc7-qfWamQej{x9@si&UbZSs?k;@0E!mL?wpovgX2GM?&f4Cj>$x{(0r^7(cwn2{WGCaYfYir>jqgzave4RQK~n zvSne_d~oRY8)5!u%^62zwJ5S*fho1Pdut$4E6Y)1A?ieQW!GM=kew_Vf;5HxnWu$? zFxQXAmPz(`EevYTnBZQOOsr9p_4Py9c2R6Ik6AE#44jvB;r-eoydPCriXVNt)xR|pex#LgTq-&JON?w|n9?eAK!jr${4aUvM)ZzBNeKCZ}k3oC@aj0_JWKHK6; zdBl40OY%C2alP(`o+KRwHsUcq#|*_f7t=wBAL)oOy;`J7pFrrQ!ZG9%DA}o&2gz<- zjA;7YuKIVh9ii!<{N{T>(?zHP(}2kOL$IjfX7LOeb0@xC1jwLIB(H&QP47gAoioQ8 zSoT1UR1rTK=E(8Aqw2U9EakSrci-IHQtBh_zWhTY+C!lN-O)1hawbhB*eSD}VMxw- zGwKFBegybd<~(3XEEo{T)UT=uKlY}-v$+bg1svM>SnMfE$Aw&Npyu{)cV;gsnTbNt zMpkLxLRF|&f`niZ;!4Ec2$xfGMAN`Wc4;W72}=hR1;2sJE`(=GOu6O_LatCSU(f;B zvXY7V@jCdzV!ZJ&O!4h!_+AcgjHh#-vbc}MUW;1Mq)QuPQf;^utb;B>&j89kcbMrl zIcc^<991)Bhw2L>h_RT{*$Z6PdpfAfUrFL5iezw|p2SDDhDZ>gou1+cg z%bZBjUSt@Y2*Ye`T&F2rk?TusIYRuSmK8KfUco(0iWBL_Rou3=@^7_1WWMtAhen`$ zuk^ktjVTQtU502(C(;CR|?4^;3*4 zNr$?4`Jbw*Iz=Df$szPPpRwMj)q%lyB*+hy#t8<7jEJp0$8S`dwRgn|m3+jjX~G#d zCZ+a5U+2q+ccnyDexekpQzW%h`jvnowd-|t*C8fF-*6EJuT*$S_{9UPFzOMHes3!v zU;Q{K3c$F-_(6d!q3BmcKYI;2BP5b_rC-rf-wDyJ)fL85^?bObe9uVP~-Z zeFmMs*>$e9F5u)j7K;bPHL}ZPub<7<+w0+AoI3~t3@sSoD+}r@eClj*RaaC7F8H1w z#QeF)&PaDOlVpF_#%$!WE>Hxxyu;$~8?n6gn|x}|8e&0EzR^Bf_uj}sbi@5gGfmI8 z+#tsOw}Lz$>0BaJw(JQnJ^Y9a=NfKLsg(%22El~wc@subU!>$Fwb!r1oHNCv>}HRU zpD`9T67B*a-EV~K@Unp#4_VZz5{Pu@AqY0(W~w-kfGkT@IbiK@rn&5|@S%EC93Hbj zYyXFj7%=p_KnYY4yq~E-uP+5pn$Y&A9$?;v=;TSo;*=cy?|H4OXtDhZ(@iAEnn2Y-amY?HxJXHR}`OH%nvyJ!JL!$^8g^=4Z@aKBfVc9gop7_4)ZA z5l#`*tvoCD+Y0dOZWuaV1z`LLej)~IO>er=vVls;2+WFZ6yBfgURI2cC84p^qY$?? zuVwJL#4%6;n*~ejP;dt`G3&cY*T0RE30g#OALCm0W);i;uJU)Bfw$6?eUg9U`(X#UcHr9LpBn7vZ5_(*B{WkMCIaT1UU1X-1?R9r9bCE(4oj=<>5O1PH1 z6GB^uvGt%F63|y1qBm!Nt@G&}^AA5|0&*UnwOJu8hewL_40|JAev8DokC&<=-bP5C zqC=_}Z-6eudygah?Cr8YWrK}^Fu)Gi18Vqqj1}eTsxMJD(e<5bM)uP0JHCVdB4FFN8)?A(^hTIDWOW?N8>?%qPbQcEzVHMD>FA7LN+^> z42wh93L5ZyYE{9q)xhl!10J2~%?!@Vyn=T9SK$0gZodYrm%uO{&&*>wFQfvVq~8y^ zunXp{=@lPQ7(~azIehq$#yt}mj08*LBX_iGKPI_|Ru{K-L?|?lRe#klfMj`}!!e^Z7qu|nX0XK?5p;MwK-UDz zcV;t4`f!)UP@hLpzB3^n1LOalruwTuS&`%q7W^mw*?)Kx=KtdJlbCcL0neoX)5?#)n`bCuD*FAGZR{!)@@~Vms98=#}tt=wqh$cB1 zjy>jqX!pGCztCe5o8{M=%crXk}xI3;%OtFeVL&``0J*1yAbVjH9~M43G=x3 zx+_NIkxhWTm)%31kn#q@9K$7LMaR!o-{*@Tm2qcrUob*7gn%^bPzKPZ> zQ7ae%%!_z7TP!e4V=DSgtIWktG@hQak0SKo;*?8e#BEKQSm+CZ%Oy(yUvm60IokAa zMjndM7_x-)1PqZD>%(s3-20N`)S}08V+`?XhN*)7`Wk zUU9du$hI@U5bXGv^xB3?v;{wE{sRcJ)@OVs%kci$KpvC`68<tgzU$Yg$?)4_y2l zpQI5DYyX5?QPlu@)f?^%@n*w6kC&aMtQLw{zPqYaA3z&@CpV@HB^mg1%&=!P!^0$3 z8bZ$cbl!Tmi^y!py*7s+!GMaC{JD_uM`z&#S0&PeaMVAU1%)(u;xcmwb~OP$#AE3M z?r6wGFeP2+=J2E+Jb@T?Zhy{IjIq=1jrOYbC2e1V>9?Rlma zPDKBH(C~X_&R1iI&+B}N0O=x}7NpK@oJ+Jxv#dYfwzs+}cH*ZuO2ht#= zqBM0ZCD9cfl-Pdpp48x$tQ(y~#Axz*~VqUGMiZ?!1SH#HX-B(rO zZ20f*z=ZNZLu~oN5O^Al%oD7A9Ra^hCJEW{LD?aHWWL3NF#(4(&3+>a3=d=auD{V> zK3U*Low8=<|4rDN>&Om9ZMjDx03jhEA_U1nB03Jr^FZc#o@YnL^IUd$w(o=(5pYXf z1QH<`Zv8(ALSpZ%d+)CD_pP@OaYE(TLqCAbK(YW!(|$a- zSl@zC3JgWaZVJ6jPCBN-6r4_SuH^)~H{{FO`w2(G5+36dTk~T5AOGq9@fm*q(#uGO zaa1+98iNk6N2dcN)AV2EZ(_W9SZwc;&<%)Y84JTt7kheW7!>tRb6YQMm9^Y9%o|Jc zkSj-F`uZ{L>U0V!)>d-to4*Sw^Nc=WGt6$K@3~LDVc?IXp`(*o=YG3ekJomK_&A{b zX?=Fj|DDsrsSnDT+1b_+g#pzj7}s@H!+K|p3&?c=85cQiyxdYLnAqc8LNBR?hfH{>WstnA-2vDi9 zjhV~d;69xE@oPDhx}W`iI+@*wejMWMO*t zb(FG~JHC`%N8C9i1v+atie*;Et1x_x+8&fBVEQ?DZ%^v*oz2t_r9btOylZ1+hM#=_ zWvt4RuG-G6==J>;gkd-^e?NJ&XPl>3=oo$8Xj<|pTVC1{k9N5XWgOMA{vpkhvH8`_8IqV05?PoG3JEm-!&i*Sr9&0N#|ap!hcGm|;etFnbO zYO}`_k{%o4sD+VxM|>?xYu{!j>?OaRG#+>LXX=$tND?_vpCSZZrqDNmW-XQrdX^^5 z)4}aMO*vcQoaVbKlQwDrl(aWNssKZlZ@V?8WN_>YWh&( zOJ_GieX29oKNa(}A9DZjU#O*igK2*a$14vLXBgDdKYZdF1ix_Y`C000#(f(OTTUJF zbNtZL?GPrkm$+*t~C!ojUgvwWa0w`>+_9I=yrmk4bL#d*$P4-C`uq z{A5ydj1cEMbj>Jv)L&6HZh`MiU-xpov}Vzn%6Yd}kgR(O`L2|dUYsI|9v$dBEc2hL8QyCZm})X-0yN3F;hIx>iWO7u5PGFcW8kZj_hO_VVk> zd5E>;{ic@XkjF@Fhi_*(rO`#a(OoNq3yQMOh9&%9&gRmL_L3wSb>ul-D7pmx+X9S8 zbq*xrmJjc@2p#i92IC-`1flbviEZudlhy-4o(%SMC==CuyJ+?&aC~7oQ+`DD-};=E zI2!b5wmdA)Doby-w}zYS4b~wFR4ZbhJ1bWyNpkY(CL+aM2B5^NbsaM=F@!Rl0WO)U`ubRbg2xnE zz`}PYa%oOC^P0tl?jI5uUPDB0u1(S}C+*#yAz(0Yh}2S2Meo}9?E(o`Y|I1TAA}&s zAhZXnA>HSuQa-qi(ZGXGfF9vWqfuP*JOE3TBbF+ihYTh+m^}2kP98BO%yQ|9f48m> z5R_GbvkgXWa*P^wc>}c34%*Z>9q2P%W&Q$gm`8Mh*#>2FbSX)3#%qxP%4zVNUlQVa?9Es9jUZ_iY}5lsT#Lw%!2YD z>v{QzI#anKOp9V$J3#68X%+puY-^XyIC>;QopqJAvg9qhoN)pe4$f6L@`F$VIJSL7 zB{^%t(eDmuVdb2dz%~@*44OWZUBNp$g+8y91l*8iC%%J`x+&ZyRwDJNwJoN;S5%nO zy}E4+5(ins;zZ#NioaI$;%u*mt6=3KL2CPyelllg`#Sqs{MsZnlm*FmmxO}cvR{Nv zOYrgP+ZCEwRjiK9K|0?+`4zcO)25M>g%J|klS}W-nOzVO_udff>hR8wCRDn{JfHI$ zSDVf<2%eKtksD#%dFkrn;ZRYZCt{3ij#m|pe)NFYL>lo>$vdqyAH4O~O>~b{F3u|6;s%ZW4q5NE@9>Z8#;D;*J zFd|!-b7Vm9Whm}~Kw8zHzPz|&fl?N1?s;SGcE4r|UdmOTy?LY`(Ur-{*=uH(oY`t8 zJO4oICVVD7^5i|>JJYpJFRAL=-1yM7W*4#f(w&3vx* zvU78E%zTio0iPZo*a*%M1@_!ngv;{yfLb&OnTNfN^vsOSRH*v##6-Xl#$dFQi}ZEg zwvr}Q4jbYweW zSVw>xpCew0DB}wmn@}XqGNI2=e+0h<4%@%E57|)F*j)fXQT`~qM2T=z<6O|90> zNXs)b8Ad7W*4PO9xhx?fym~jzu_FG1&eWGqD35?-p5e((9Dbm$0&1q+yG|Sf@ZCsdo3SQ92B=NImd$JFh`%d5iyRx6o{v^r(fVs-MuP zlc_3{8r`r%6%B=wt1&js$j-PUsjBKFk&s{n#MUa8A9rK#63v>c1NW z)%5vYydmr-pEZ$WSgJf>t1{haIja*a?upgIV)87=;xDIY z@d1s~dC$#16vUHVm-DMkr|6TWw3un_M`~$7GzDHd*u)SKaiD)xgKtTferT25KAmLF zG5AtQzHJYb7(uO*vR=*zGrI{ZaJV7YeB}>Nr$Z~wj*n_w+A%}qM@y*E@ zQbK61-XNW}?L^0inP^H+tl>FyA~Zmah!9L=Z zaiZk_&*YjY(7F`H?GNveqD73y8cTPX8E@w4VOn0EA2I9e<@co9qG3cr!zHy*0i^g# zY}vv}W*HDRM|EdKlXWDxc%g(hzq-U691^)*1XVX=45Q}kzB>wOQut`Lly5hknogLu z+2nk{oAvZpe=M-^G4c6ovAn*aVSjO^M!xYkckU6s^KDpKoFLTW)@@1~$nseroCx;h zKzb+o#BKDmc4t9DZbV20${{8oYHE}S%SO(Q9H0$_ccOC2!S=ftb$P%tVuBf)O@0=Z zrcbk>l!3_2Jd_}}^E-C0CsN}V?X6r!-&Q)J2oP6k5-FzXDWV~tr1DLFcEkFy!Hm7M z2Qqun3!tex&O0V9dW=xQ?dy+Nhac-Vgl=W#O~BE3u$MUv#T>)1IDPf1Qh)H4z-;+J zdJdMHFL6}neInT?Co4_3>GY^go!5P_B!wH%F9G6t@$D9xP10BbnQ+a6Z%FI!WNEf! zjJNpD^FQn#abHVB?HH!Ag*q`^=wv#{v5iEE@WOLb!3 zd!(0_#!qa)ID>2@A%-pBAIjcDn)Imq_dVhZuIT8SZWfm7sPv2Zn`h;N$%)zs7`#+d zjM3RpO-Z>e&+?__Bpefer7z1%!gO~&9p8HoD4dQv!)rv%s0ifVZx;03R9AnkN%r(o z2_P9t6cZ8T--%hG*bBJ7-@*gTI?IwJCMWLJ6l_hEUQ-2i5?|q`gt2W!%R8$=ZJ82M zVa`<0rkc1mMTt1d|4BS(kAvZh$xijY>l}PvTzOEulq`E=_o0$^LfH0IA06xaU4J{j zjt;DZ`r&4N*@Nk7=yV2fXot?X7LP_B(C^P`mg|<(C(uAlkyxv0%t70#C=STf)>97e zw7z{1KZFS0o=RHWRkqo=lzBt>CM+2J#}5ckdIvA>%q4y~_kz{&7@KENYAX3O8YE=I zq;iJpBEP~qc*WDCCB8Ve;QCJca5sJNPKwc3SIV9Q%8~4EQNH89Nnt!R%sLazLVpLl>=kraBzkB`HFZEc3OlqE%{WDjF%?u z@UshyJxj=jCYP5Zd;!0-SjQu7ckF%cFKXr&Q0X>5H4D-yTGX zJO&=pgmtA3Ga2ADJZYs0>Ojrqm-J4{`?pKRqT^r7FyXaFvz~*{DZCa{5WnL z<^~l;RVh?`o`6z5Q5HZtkMlFuZ6)^t$5?0E7vq`s>_G$1J(?95E_W~#B8%tUR*K6xYSRR>#9cGEDKx5F?la_&&XHU8^ANgu9vzPM-^nr#8~LTER4J24NoQSJzR9 zo5L|{8eiO^IpJ35s?%i1L-TFtzmo?Gp4DpC%k{{eG*#kbT$M|WaQUxuu$(hYh#Z&j zjx59JBNQ7_V)*&Ff_fd+gafzoS=G+-m5s+Pj(0+Wsj{galCnsk^!XQAU*_nk;q zqY^2Q>EVLcV=tbQ-{vVG4BS_!n_}*8Y+YlEpy1t+zvkoNc%BN`(_Lb{a8U9c#Xx@- z!{dM2gCg2qT$%@qF3j&{CWkWJu@%eb-yc))Yz65UprGP#N>dkJBX-Ql^~FL0!;ZWf zj*Zv>e=O5i+;Ue=UgrwizT;>N({>a#wB8ZEYI*TAt^u?6U;f2EB$2iMj(Bv?kseXU z;>yPBn(tQDnvN*S7U4O`&kA^^{Qa^eOXRDJo#MH{Jc{44nlxaZmz`+;K$&kLTVp->TQ1=1CfaM*LMmZWbp9s*47T6 z^@w+@R?kL3D7%(DjrXj>-@h|$=a8U_40G*Y;G%UI=m;^4(XY=(C1wgEN>56tSj>sFPZ{N1`5ESK+^!Kao z)|~7OdfSyID{jiETYB+13C#yH1I&o=Clb3PhU0m|#9;0ZT=e8Vl0f}A<7U&2jEL02 zix33PtWY0UiF!o@Vi<~G?m6(XiNOv#I(i_*iNjxrN}E3f>{gmbe8~LxauzWp#B7!c zGiu_a2z~xh0f78y(y>O*mnT9DT^Us8>}K|xQ|{okeWrSdw$h(P;j16G7Y|{2H=hJQ z+#$RS@U#0%KrSp%tTKE66@&tLow4o*i{L~u9FGj`&V8bcLT3mdi-D^uv}HrYS(+(q zEnlbzFloadv+tKllwI9QD9@eNcVm^`M6yD!T?BiRQG0!bV;Qi|hlR~M@MP`uVesbD z6L4`tD@Nv*M?=XH^h4VnI1yf`R&b))pqVOOPVBKu#z=2QVm`2ZqNYxQ-oXW&pE;2Zg@I2_jI%= zdpXgqbHz$ry*1uigJIQpvU?}UU`I{0Y&s|!dPcysd7MhI&^G8l%(G;G&X83_FNPBQ zn$sgyUJpP4=A+Y)>(ww6R_UUqGugLWel)3d?c*Lyor+N{8~}*=*f)0`EkYInHB{Hw zPx!W>xd?EEc5m@V?bD8z1sV-&=Bw~pX5UUpcuINC!QPdkhWW{P1cb?G05dfb-Y`W385dcF# zyua|ZjAfH13k`LYr1xD2TFKBs!0W(moCj)tj@+Qcv?H&1z^oO@l$}(Uk1tar+aOHo zuT;ygx`c{~lF7RJNXW-1ma2;-b*5yed>h%{BT+t2`{vVttshAVzs8oSjIW}{M-o@< z;uxkW$#0EyKl*{N9Dif0+iv=FpQ+7}?qH?qi|_jqA@KFF!sD|R(~w8^;sKZ+#OAd} z`q>bf4E|jRM)CUa2|K$au;LW^0A4kZYS#e3CQ_ta2Jq$8wu7Qu$4@Ij+ueYhSJzye zYVV)pawFauIAFF*iT#v2Q~=%Y__Rk^0oBi8cdz=aU*dS0Iy_=t4lhnTDDHVX6##HQ z5zbQ}8Id(a+){X{mSDd9kz>Ygqod`pcVFa(+8@c_p(XMVI=)8-gl|(TGA+-$CP8V2E{YbLZ{>jJYAOtz&$tGSy&KI-9l)IC*xSb^Ae_^I#-_ zyTGokJsUWyfE+nPW3$q7NM$y+ckA}2EKyP1AAi8~_RZiE&#w%0Lf~he`&-mRu zD6g)AlJ6fOZ7RQ&2@*M}Siq&xa@le;Oiepo^9rG)5 zBJ$RJ);RdInuZii0LSzq$Sl?`-k$gl2lx3@>o<%CIX}5NmvuIf8I@6fqoa92`cl{w z*a`?Cx+z6-Q29OCxBQK8LHk8~8ILE9OGf~sjRSdalct*Nzz=D73IikA;4Vm8g7_C2 zz><#EF2Z%E?gJ`WwisC^CE8(6yD!(6U$wZ)yw*2y9(nX96tiwegcZ9iK4m8E&u|CE z$r3CJ+n9)toMZPJ8y~>lE%A$leqAU*6^VlIxGfrPY#Jp6b2R9E!b3b?Y{dtC&^HxF zV9zib|LKkPjiyyMM9WI=x=KmH-92q@7`4vlf__VnqOan(dfz#lAk6#?eVW*yB*xfv z-_Gt_lO0mw?n%oLmHH6H-EClM-7NIsr98&TB8KxxRhi!LtEvdBKvn7!J&hzbPVcBjBuu?qS!J-1`@%>y$|eZ{EjtM(*T(+7iTd4im~Ai$ z#X2RUz%bv0FymRVcxs!cFt9_sgu?r$N__As*g_ zV>2EPFz)_)J_xv*`TRlk8Z`3|8l>1gT`kj1Kh*(MwE{~m1RfT90$8Ni=kSOrJ=~WOEseZZujBdQq6SsK5A7`7o0F5j4dWz(~ZwEnz6`iOrhb} z{*FWXn#T1!$F{Mmt!_rM+Z|WWadaScNJv2A2y&JgDk*SmcdRE;E^9ih-nPsu$f#{x zGS52UaaL#Vz{!FevC^1h1&;rnDl;xC36Wl*`x5iG%w)rWS4<`DQ0#JUSdx~lT>MVp z>h29~OEhM(rvReJ7DdKRH|oi?;`0$mKdVO|`TXK4Q_LrtU7m&HZABxAkX)vvic9^ajBq@qtJ6kLB7&zC5@TWLw zI%OO{xWkhDTkUB7D{_JMC(3EP+&xL|@0WCo)Czsy%^?p#ihwDl6a0iHu?01q@f8KM z{Nt?}s+LAc{vaKqY>{drnq57%^x_oDB4lur{BZ>==A4rhPoLboBZ+Q!+v5ajdSb&~ zAD7Zr?#(A@iT#DQrbLdR1Ot#%VY9HN;QK|8-kQ1%St)+Q3{la6`+SGZw>Cxcu3igt zqmMi~A4-o=lo?GnAtT6;A(nT8@N4q;cf^wX&Pp_^TJ_!{IiA52<$L(|P%dUtXhaeD z9(_pA;xLjTt8&ngv^tROqJlAr6JZJdPOxLf)j0G0!qU@X47ZM@k3q>7Bi|QAoOKFYOye2ea=N-)l@ZJu`0^f~c?g<@ zIaGyp!AOxAtvx$NUo?bIV_%zvYh0amK|g8`zr;9z0Vl6%UF+l6k$0I~u(p+-~@=%;fq?^c&{_5K;*e`?{0)EOE3Qa?~cHZVi!b&Y)8Wq|HvW zVx(0U_Dhks5Wm`Fd73f#S4V5EK;y356yzZ6uam8xO8A!LEmt2twp$qh=|JkMdKtgt z>bVb>TSgI7TYsFEejji2Y?`D2A%ENB%!BHIrr7>11tw-eE7a6ZOFC?7zw^w=88r2C zwdO6!*0RZY%mT`YW6xb%%eT`Py+t@}j5Gl`LmA9uO7EC82EjkyiWFySmhT(Nb;PAl zPPgZ5*b+}!-49_%`QpddB>A>kA)z_wU|3I1wQJY(DL_nCht48oy~tsV-||L>q-=xD z{na;3HLm9jhu`MnduDA(Lk-4N&+<_5{Gl?7=*}}G4LR4z(+a~XYY4QV7OL`dA34b`&U-6W%8?2yX%mCz2a*3zM1 zIL^!;-PCBI4D*n9xQm7YV;7cZ-bLgVKM-kKz`BRZe?D$d`uSCbYO+J~oA$srba)n7i0d#~g&p4EYYw_^iQhKDj3FE6j(U~5(`k$7Ij zJS&WKiVBe_LMItAPd}jJQzRNTCekH6%8!@phwy%BMb#RB*atpK{zRxC^9Z2rn_*{! zMmyy7U2e0uBlkXTEm66sgXwJ>Chh=tl0Q}(cW$kNUSCK23W5@~=9d9>LCIf7*AS|f zFi`S{QZ|7fMeGzk3uu>%qH-#A(I@5o#re~gDs0bF40a34TAoi2u9dlJ6(#*$CY41z zT#5%CoCp~rb4R0>N`CY0_lXW{!!M24M0@@jHHXR?>&@8MEqnGtv#4;U=!&sd{m|d| zbZuwpTP#_%Xj~WV-DLH&bF}haspHc>b)$x3-OL=~wWyx7u zgPeQrum_<+Prnh3>3U3mP;R$hv}M+80qBp4%J|OIM^5ltA9GP2aM!|^ zDkcq(;f}Ww=oz!X97xMA@J4RjTpv+lzS*a8#AUj~I(qgH7DFOYZR|0VQEFG(&tP9iSDDg-wvAhib(A^Br-SjFt|cllbXR`uf=(k5j__ zyYN}v#in!SJlE{JujpCtw(*pWTcfHSea`Jis)0bzq^kEGI{Su@{oyO_oe(wd3-AxG zzQ33-!0&iwpkcB#c#Vhvje^d$5*~ZQ6W>k$r3Hz_0PT(Vg=+U6Gp5wp*IRJwgvfH841(9g{ z$|u=T2$uKn{sh37eW*Z%V8G}XX_(W=)(dq5a9(o(_fv2pQ)Tcs98)-_3%D&{dcm+t zlUSQt;FjLEOb&nfNoc--v#g_t`~_wSPhvP1#q8IJVAmQ9Gy0CuU43paq_odXJ|*z^ z=`5xRUXPRd?JX$EEngZk4lt5hUdHB)wp8pvveQi3an08JQv+P`f()k)G0Qn2FaoqD zV38edzrGe*BXn=!$A*>*s$J6HoGI7BIBL(>=_$X3S{uv>!Kg+p6U^e`FzQMYX)zsM zLDR<~7Z_lg_}F)EEn){YfOHD1XDGU@IQbw{^kdP~FY|b_kl5TEYabnOncgp@vj2(d zqh?VVH@ZjwlhAK6an?R=q>L=|UThW^oXs~N1Y67H0%>KA-q7>wb3m(53476MueY(F z+Y!fJgan=+`m(APky+1DK-2^9WDJ*i*(t<@J`%KNs4L9<9q|jp|9{LZ5Oi_wG;d<+0Qk){=Eh34=8#%gf zjta-3lh>FYSKlhSt}XmpXWqM^c2{W$R<29Y63k21fJGSwX8Q?ZghHK;b^Li^;qhzb z_tNiTJRVAiJBxSNciOw1Mgg|*zKC3&7-O>U%t}tvqF06mi>T>y(1YGu*0J7x%7^)w z-rzfW`y4Vk*k&@36m(?b=V3vYhgxgr3b6)0oFKaTy3Oay6%{*S^(+kd8tyu^gExDW zMg?F)sQ|GDdj{>ix_C}ts+E4XbMdff z*#v0L6ljgnOs!ltajek~KuXac4Qx`+fAQasCd-K;TR#rd5WEHuFOrEmV)=VU{mL;O zVW9fF%WANL*r5gz5K6wn6OvoSY(YA!EPSc$Nv~Lo*QxB#7>ca5=S=BG2*NtbhBeMg zjxGIf^ecj7kuPg1aV#Nx)qMbvMcFBV%*BI63~*LpGmj&wcH$e>tgkbtlrFr<&&Flm=QD)Nl{?f%eiKPT-%ivtN>l8?)Yu-MX=w;+ zn!CQD^z6469PK&3CIZrjKuV(bU92f%t3j{vHb1KcI~9YcaMn9LIs4@~B$R{=SLIe%-&Zd5 z&j-j4o4i3QB39kQB)?Vzg6>>BjXpcj-$?GkKReSWPb{Nu=_OM)kLpE5VR*=v9X?#O zzdiSLn(l#uccO8|?(h1ALn6Ti+P<2YL6Gph2<^fHtYkStL?gl@2;r}B#(Ev#n-dfy z938PPYxOSb3uV==H@7oIpGIaB9k5-${q3oxvSX+dyf#?NK)#=eVTHZdFC6V?rfHbmJw6oe5S{!2+Rd` zt4iJ`WlwMEi)YK|XZDN9o9+Twpv^*n8U9=jvv$Yo`MS>Xt-cmADgNIjfKn%pkeD1T z(Ue(viq`=)DMrfzy>&Fw>YYIDni;Bjx}cg$fs;^^nJqrd{Q}n=v1Hfxy@unR7xQR< z0RvUl?JdfOohf-SLfVfP7vBtOE>z~+n2 z)*j^*e9%9Djkl!&22fK@3;#*5nm% z-g$*$P0Y0h-=@)5>V^65ENlsp0utp>t-8P!+1YfGDy6048C}D-eI|0B$*{wTZ?k|3 zG?d?d-^#L8Vz}FQgKhEwX{c8~4fihPVerNtPk08ReWol`{0+{X<%-nB<|F{g%}${b zlkf^&qEb$W$OA+J^#HTp=v_m2iSbCayg>fOgdHElX!$$=eR_$|w#aW#>VYl>tUhlI z5Q>;1QmbE`xVV4$YHQ(e9Q7}+%QyxT8i@{S)Pb$?ETNKbB-SoDq{R=}t3Yn5o`4b5 z_oj-ycGyofY1)w^$0r_*2a7cH^HcF1t@7H$RU_GpFGc6}He7tu*em}l3y9$}sP&FM z7~keKLy&8ffOqZ;M!c5*#%4&+MY2%9PLVn6ZCSq;=foEw{_W^m{je-u5`%0g;^$)K z4_%wBv_{?}#`A>TY#@{mLcZo~MV|wQDo+bO^So!MVl3PfG9VVw-)4dnmfF+n`Jl3d zumda;U3!<4#U`y-n3grbpuX4cz#_D-!wy9FV;}f*QAZnWHRAH(QqDsPSn)@1q#v8s zWo0#<#cgK2vyQ~G_TJ*t1$O4sy}&DUzA8tTeCLCFA}SB^68Xh-IshW@JC7Rk$_7za zD;a`mMHm_XG23e+zxu=LRZ})nBm+9$l&LkQ+zesjdn~ChlA5oCjmLadB6A zJ34o|E4txFhIK`H@=;CDkO}5WPHL4;NftogDc!*vNLRmZYQ@XNZYPbM5uO-UB-IEb zaeHnNOZ{{;47_(>S_p~N$bf6*xG@h>GiuOAiG7`P8gvy40V zVBL9n@Ng_|B6^UWHd`g$8onxr3zUYh6%F9|B4OHzLT;?Tj zQQT0eMX7uyyr7pZXB^#6T}_`Lab!{=^7Slz_<>LsLjv!%Ef{cwrMpS*0T`FPb;K=4 zh*UVP+gNf>s&5$QPTO&h<_Mp)g$X-~JriD@x0VjL#T?8d2FFMSMtJjHafatGVsyRV zo)Z23{2=~Z=!+a-{Vw@Z-19IcQPts0s1Q7NDBxTS_B?ai#-CA43f3 zRHoAR?zgq)=95H>QM}#0eS|?6yYl!r?w{?_4oOOUezzCx!7H5W+^XM<9^Ei#a1@V=++Zt%AoY31LoaOqBF?2D=~>*DZd?q zyPX5hNEW2J4^^6F9pXjpMbYfh;3w{rHYOOEP}=jJkm^rW6A zfcUNL6_Z1&i$o390V^6wXTh3guZGMKK-1}+^IPXHzsW!C7zKvA0p%FoJ!-h&P!~gY z#Mmd&F)7cYUwShR(mrS!MB%CX@OhQ5H)o1<_IaTJUHg6N6jBLx2w-7BnU#^a^A}Y4 z*YrC<;$FQ-oGMaRz_qHa^dhQBCX6hlCn|U#*dt%jC+y6!q5L4xEQ^em0Tp>FKkrL^ zN#LvnERK({(q%f$>h+iO89Tux%#H4aRYtdqLdptS@+9)7km6iM&n>442XuNfcw(nm zeV2I-`*LO1T&?`zEH9Q*h=~T0Z60A>X7NdM0JRpsUA5oem9J&18%j~9z#bZqm1n8I zDaR$(n8+txQ8dvc#29+*eD<8XBuwwfb|+e3?J-|#A5-O@z^W=B`uGBT<$e5pPl2lr zU#KY(=^GArWn})llg#x5PPJrz4+s1}Ds+FhTrwHqdFjnTn|1PVFi&E{256h0gZPAP zN;29omGtj?I-tL2oSzT|)tR%j_RS3h7L zAZ%lo_DHXHi?!&gjJK9DjtYx%z3E zqk^PW@Ot|ro7M;#0X%jav=)9iwOJ{ zpG^UQl3D9mP9Rn5E>oWg7`u?;yVH(Xuyy?cm)Ht8tRIFDP^(uUD|f@OjjcH|h{Vqq z*%st=l4haCvn^4;-O-yAv|%_uY&((e-Zr9x;cE{apE0v{?ixlT z`9vx^=ye2*eYF9=qX|H=nIpQ2+3RMk?Kr`y45zc$_C*`m89B}m8b}lIBVSY|4*C!; z*2_IS!F}9*)X0!)Eco~|7cIeXIt;&rG3wtZ_MzH&eRXYWgpujj(Uw;Ol_o*y0e{!| zT>`_=QTf$!`ty66qYbr$uw#mW@q~WDX^}dVR$Vh%JM7ic_=Cw`Q${GS5W5NzceD^2Wb`f1o`tP%B)9;eVV-E`8pw3Uu>hs9F zHCMe(MGyt_4d73J_f8zM(F(1Pz@JXQ_~v5RbTXoSzTcyS-XIgp>|kGR74r_2`vKHa;r#`r zL?!qshyf9reE`LJUOgEErSd_SrJdQiQB_>^eAtalp|$!SX?rrSj2GMO^%Et2%||>Lrav?ZN_ow7VBX=naSgK0PL%@WwEk4&0op* z1`>EUtI|T{MRa|Dj&m}qHm;F2>hxIPD|(@9hRPL;M9l_RIG9$g8t{*)l7rSzp8ljU z+ALe*HqOyBm_HI58DI{a`kJ}>fgK9psPM2a1qar*# zsjg7V_c8}k_!C+X#|{Dh&ZZ<^DgaOY81jSAB=sZn`5%*fznsJ!gYC$*(LHs;o=Te5 z_wN#wm`CjTF70iqbD0xAtN`D*#SiH4GFhgP_=q6a4XnZEDvug3BAkBW6{!CQQ5I zEaVE^)@(EvY$w5OWBOw93d_i?oNh8xYwOCIwEE!8Ly4=QPKN}_+m|=gCQF~jR6DR; zx(6lOSzZ7|m;ztz3*Wu=+{ir+Qv(ddLQ&@DlS=)^YaG|cKLgJl)l_aC?Z@@g^W6CX z&n{1-B76ZovJ3YI34A68fE`vM#VgV%>HH_riK{#ISZt=)dSv~x(93H4CU}Ov+tJ=* zLY_Xy{?4#g93ysc#7Wvtl{8(NlF{LVQGbxDXB*UbHxAV3-Ln@=+*yZ+Aw*^HqS@^< zt&AIIieYbm>ZpEjI{&zGtuc)=W}PImDkyJ*htQ|{yM;s!SFwfBIDW8=Z+@Yya-%1u zKyej~4suJ1sbx4CCIcfkKtx|S_!Qxd&hn(wehvk7Y8kx5@@(Gr@*D3=tB`tvauV#A zz&=7lnt>nV1$jOCZffCeDuLkEyh*Egp1PY#7jViJUkb zITavg&NO=)Vlv!OYdk5AL6)HMCU%#p{rfsVGYWNsGWWHyuaFH352OlTwXjUZ)MZ!t zl8)?(W)hQ7^o_H0-)n07?eqTL$Zn;-nFF8;k{+9&{MJklE=7GUCZK<eCD|tEKhL zAm$R*VCL!?PWv_=%$0e@qvw|nu5Ey2=~ei#p>^a5T<-p@KSv_+-(iWrOuT{^!L>2J8KRX zwq3F0pWnr~dPcQVkfEyzbam0*H_cPrw~wwY(a${GkufA7nU#AN-C6gY^I zA>|}9Bg(A>LEN$4b3GE<|^-;TT{=t%)Pt{+M zsFLi*5CB*(GmscZ$%GGFlu{cWUvx%NpP4nRULWFlcqx*b-Fz!Cf5)gXaYQLqJ7`3V zw*_2T*6fe_yU`zOwL4g3Kc2wNu;rO}P8~!-YbKu13C`bHTGtc)xzBbmhwNE_YQanL zgMjbgc@NhoUxrJ>7hTM* zprHaI@G5M=2nB1H9|#;iKTF%ux8q?B<4;ev7Hh2a@9idBs-P5CV64N?+5%qMaE%%) zPG5^TSav3~%vLfq9koTC=ZN(flx{vVj9<(M#nypeW90<`lzB~_hk0(UlQbG2x>u9% z!U(4^=A@w;EXA{AW%`VN8B64Og=c;NqSDei=4fAy()ZNLxXwJrnXg{2w;f~kY>9+1 zkyy{Av__2gti#!2=)w1ZnFQSiDX}ziXy||9IWbe{UP;JE@1^@V|^V zL4hNBK9^Q}a7mr~C^Bpv>v6DG>cebs>j_(iraHG$81p||D{ZEuOK#Des8(ibdJ_-1&k113r0)9>Q&q!U>3{zA#ckQaJSN%CSAqLP6 zfH>r7nkrYO*#e@T5UVq;bB&VRkmA-CdNBekxpbhO?X}vZ?S<1weP1gYyrGyg%}jjF z;=8zkn*fcqzgUNOu|}|=f`4@}|H%&fwR9S!494GM{AlT(4p0Z??Ic(R(`L;_mGmM% z@x0A}N$2{`oLJa`9{uBkZL+>B`z&g8%0ocXmKS6KBU_E-2@JhHUz^*HF3etb#jnO4 z#KuXUwzVfqJ?q7H_ZKqkSDP&2vZYgvXQ<3-kSA(!X`9rdb)Y_~_x(U6bUD#Q=!`0w zoJ3wwEp5V$bMgw-y3ngSigYcfe6C=bW<4r;;n#|*sSxN>G^sBg#7{C+*!0i|c}j-O z`WB~ItDGyD=JdXU8|R|uLG1N2f}+)a@VruoR)bMyFa*B+v0UrIa4wZNGj*Tv+-fly z?YZdcKqVl2o5yw1kxDY*KDl9dhieyEcbC_Fss1fAZ9$G$O5UhWsYAU=EJWOwXFt54 z#?M#+-nEIF}Mt|7m}M>neb%E)`$ z&j+ZL%Sb`2a>+_TPIk5J3v%4whCdU(7AL-^vm906H0T!nmz1hz58uInIiqv+cqGHU zAy`=_@N!TwCisjH5ucA&ZD)V<&yg2IPbM|h)@bh<--7|)0^N1&zEa^j+yfc)QEW%)zV%0G1WgfvR zqen;ZrX3_XT6sOfX^7=NK8h6l=lcToT?(kGk(vEdSZCyYsio^D_zoG1RG8|=rz)d$ zku(UPqVglyondS1H-P5aIBn$C3)#WWJ3&b>cB)X8>J~t}u3o=y0*WmH;p6g2zU}zh zy)%5=C8S2ZR>4^cd&F&~-oD+Ja^E*A=e2#~pbnO@GfTwftK!5Y^qIY;Kvp>guWT9{ zTN(GEea$NnIK%w}Z|*7Ek0q7+^jGNv3#MJGU#(8{qAa}Y)UL!FEO#l}67XY^5tdv4 z&^3)YXtmpr0gO>Hz?$j^PYE~tXA6i?+Bdu$#6)jk%czY^6NtK05*n!J$Uwik z9mf>n(Q|PG#I(_48FA$a-A5JCS#|z_H6L_%#<-4F!RZUQ0{geu?z$wtEp@OTLJO0F zT#yqs@(WU8^04m|nQXGTvdU+f8qU?H0-p@I5nf)p2cWudVEkk=Y$;N@E2)hc9-tYvu7Bja}NO4Q}Sb*GrJ`) z{9^x98TrqYV*EejYt?-l4CnL#%E& zwR3>%=jzp*vFAw$tJtN#wdhQUnt~~84-pd>U)K^1$IsDh72o-Mc`hd$Z z#ELh?OmHSd0&B8shcOGXwPYOOv-OQ&k0_R$7jr#Tw?~PmjXo&!w~;56uG^U!G4>u# z(pGhPqOsa}Dq$n2L!v?+9WXUpp11jvMpe4cEo#C<)Pd{j%jFRz@I&RPLi4q6IOr3m zx6AKwBJob_)E4TPvHH&U^6uXs{V5^@wOcWU?~I|Sl($0WVIM`tNIKIV!5S?U!_MWm zuJ>RMV!gHLh|6e8g*wOD7c0VOLM8N9ue0%_`3ia%1SwAMpZpDyeNcT{_7v znHLt}&n1)wv1WDi(Z12vNg>!ZJ2Zn@s9SPp=og+fVyMR=BS~n*#94_(bz)-)Cr?x? z-I}~hAtk?6$IAC4F_lp9C{JgDm7>MMu)AW7qF^kz`KA4Upy{7qEc;w~<=H?7T}c5{ zbDyf~<;QUd^I0d{*5xB@Fpq8^1Tbm|Te2=KLJwyEycP1!=cRU#V+oFK0Q|Nly8b7)FA;;;AMq;zZ-K@F!-9x z+}J?hk4nFw7MC)_G@Xok-#XLRL6~4`HNpDvvnV2RBWPDg-LE6zdo5fUJJCd^(oizR zkGB9LyZO2&3vRFMnHoyVR@e7NKSl?q=9QksTnx-*2UX+Yjibz{fgu zG*Vn-7Z^}t_<%yBpjV?hwy%&Cg?3L()VicC=6n*Y9DZ7=e1~u<^UCj7O3^iE31}%G z^PGG~cr03|57!Z;!yGlw5!Epd@Y-K1f7TQn;=MQ#0vJIh4f~7{&Vp~o7)&7a@`)ca z5kH@}tBT!!3I^NGwEh~jD#A3yXb-gJK{Ai9Ag!_28I?}M_)N%5$u69i|fu7we)G`e%UPnX=O84{$^uTG}io+>1jr+Ax z72Lk~T!UmNELlQ7yB*BT$$l$KAxhDyH&Ge3Awr3Xa4qRa3ib&qZ1~9&d`HDBi`u`3 zB`Y9$CoPZ`jvq(LYC{(-TDkM%W1!f;U{3;Pp>Tvl0P)Ajk^F%PL z>hoi?Q;)H*M!eRXYoh*bz2r1@tIrt9YJ1J5FB?c&OivW!fc~XB;DwIn$+IzCv5oHP zK!IFYkLsmmECQp3xTxY%xO8z5j)6+H?{?eYmNGj~xfyunEeM*0ob%+!X8cpei_s;IP(D27$geMR?(M&^d`VLUxq+=_MA*wkAWj1h!U5C@F^m*hv+FRwgKO=;_o}Q2y zT5-QDoAX69-47b;3E1JPWzLqCOI{%sV`O0#D{%snbTOkr` zbBwG{mI%F1hi2f|f98bGf`?if$p^O21gQ1do$tFEtBg-^JADrIouGXN*aPs3JU zT|&OhqG?%w-|aWs7{%C-=kd~z2K~C1cq`J-_H^@PFRZzd*|@*2*D9?+ z*}CZ-WjYc!bB>v~XV|Y~f%Efos@;5u%1ua*kiY@cttAvVv0w-ga7N6!i{d`}2y2!?=EM8g}Djg(@ZDFG2P-IX9ZPX{UzW z*0+t5V@8sZNAO2!0x|6}gXgo`>2}gGnBJuQ699SPM5{eK(_@ZQAIVRXHsq(e(gnXn zuxFz^@Lr_n82_u?67;YBx7+WGnK~f@rF<;{50Ecl^<-AcEy~gu+6u28fgSquzc$=_ zJFJGQYa~XYMV;%z!k4K?=txnoVcZ<|>9;BE0^VtPH~(;u2o>?S30P2ReW>(FRr_|4 z$*D<~hLggKBQ~$WsFcCPp%sc2GD0bM9Ebf5{!9k1(s8U$f^Aohl_jjVSP?&6S%*?o zN=@wD(vpuJRuHldDV5I=54fic^(eK8zSxG{KT%Pf>K8ZJPZqu+0;Or6M!^|J-QH|* zf9mUZ#*Ox(`MrnNwjpRKKV`KQ`gjE5@a;Mr)OzxYZ}>2k6b-+*jVxj0I)wsioqqey zH4s=$NhBI#Fa^jQ!;P4WO4J=y5*e#~9?ZkiQkvLk-qaN zVO8LS{JEzuLo=?6vgUW%gpBUVN*_L7y&QBdg>(Tx@bJ_cBfo)==c~1Z+R>W<_S>zmXnx)}Wa%>Ee}a3|J_8Q)bzmQnvT~RhW-3)*i1<81!LF^bV5iB$f(%!Qt#$XX`?z) zYpMFg4!eSa+x+|vE?l&@Xcpi1NHmY><)PeCYMqtetw{Ab^$C}E$3%F3%RQ8a6?+8SmkZx~X zd>-x_aS*{1adBcJ09B2ylk4McCds-6BILjCZ`6~6Xs?x~UX5tKC$l~CZWAGKqUrR} zbS?#dTR;-iCpklVgq6;JbBMmvgPsZeom~nnRFgi9yS|Z7u?Sc^zQpl;8B&!Sh`O4; zdtW0_JO7?KEE;Hzm>1m9Oup^a#@Xv0!?_eo5c*NF@ zivu?^s_#cZmXaY850IJhN9|mxYnR>Wzdr309V}e5%)>4ZFrdqI&Y_=4(UI3@O(Z>2 z=T$tv&g*;!<#l9pn@1~R{YAmOvsg=8Y~0cML(dO0jRruc2#9^RAE;bi3i;u35n)O< zDu4lEY{i;@s0?I@QKP&q? zI?G`Tq!t*G)B8*flcKOK>IJa0xOG>DaD1EWJPU;lS0UT%YCziMK}sAb+DEFveSF~I?^qzep+@#uI8x1#%VVzD*eXOVryM5V6P1e zwq2H^4rzDC`Jyhy9rIY3Uyz8h!hC2Ovf9~*8^8pwJD3+C!oV(EnlTb)TY30nbDO6P zeX+POWi}?l@wsY0JyOUMz(8Kz0f8;Jln=Ec2Kaa3G6MoRoak@f)&=YwE#QN1wx$|f(AvZd+d6kP|Hn!g}iI}UTipS4I$e2N5J6D48)Mp|r*g$6ISTq75zg0;}uF&@L z>y|l`{l-W6#VYZF>Nj+-=Y;$O#pKu?S@g>bwo*P^Z6HQ`$#;Rt>2&V%DbAS`pSe9g z7)l=2WMAbm7tXCH>`R`{SDHMLJ-zOpn{q0ua0|ItUb`_igv?3-w6XeO>eOz1G4`d@ z&iXt<9DKrJwIlzb8}3lOZWBTrc)Th2d(i2xaG5lDG>mJe4y8c` z3thb^m8%ywKU z-k#hT@bj5YsO9-2ov-d#MZ)5Fi&LQ&uC+691PJe;-|Q^MSnv5(Q3c`-1=kEMLNhB*iFy{DOQK?y3w5Z7RcS zbsIvsoqe%0C`A9Z>LV`iTe!d@b4N?GLUX5q#=w5vEvLHGtOBZk6|eu9D0jLK5+}q2 z#YKZE+)F;ulBsxWMKwri#tOKa3wzC!SGJtkZDm(B5X3Jo9~32tL7`>%dU4o zPNl+PrrDG`l8raOG#m6Gijb#A5G9c>;g2zf^cYY+)6!>K8S;PM>f=@xciSoiU>XLfZRbQ*1M*Vcwj5 zOox@wyV&X5xnK}Ldb6r!qGqG6_&UAr6yDvrx_@0_SgJJt1?F?b^y^RWno#_H3=AI;+FV=XJP)EUUxAV!z(SX|ytd63T@f%S3 z=bd{R?yR3(X#oI0#Si^3^n|CFAa`IYjB;%WB~(?}0W1Jvs?qsiU{R^$K5Iict;VI$ zQ>W!k)YhN44LXEBB8>>WrW1E&FZ`JhIPRACa`gCbMCohC*UcOcOSVDzdYQi*xAnPIgM+r^$7& zgU$!JvCUJw@0jPFxY;t)j6YLpPvNO5=uwSC-_Kc~G@q^5w()#0?=!*vZSsU&thV+d zeoTgd*De3(oh`($u3uOz0MAoY#NwU<%$wi=G_}KmD)&}D$PN;$BV$ZnNZ}}?_6@rd zUe_W0$@(jZR}<{g&4QU>3CLdg;!hWB3atE@{K(&k$MW>a88W9@hcoWQ=zr(I1YpAm z4^NWGL&u|Jjb4k1oF&pBjaaPKbCv~%a4H7ooot<4Q&79`{`Hc+3<-o`3`8#><@M;B z;1V>5!aUn_X;++=i`S^eBL)nx+H-gt4O=G8bkvKO^vH{BofErIHLB<2k|QBOIL=eS zTR&S=P~_VPc5qg7odfsG%QE)i08t8|6%1QfwxCFP#Z=ab)C$l6Lupag0jF!6p-2W) zw03$Rn&^Eox!eMMsyRg!A1i%TMd9$r(X~WcgbFEq2~m-4H;2V)*c{AF^CIfr=1QR^ zXebfp295csv&u2_+u+LdQ^GjwL1Os(=`r6pq8YaF1%GT`JWtlXL(=5m( z3cWqSj_vAic}#1X2BXWl)HS5x*c3V^w6wkmuhVL#{L+R%^@G0 z+ee^&QsZOLlm33Y+W4ES-i~L{SQZ+28d*+pehE)|JGM&bHP%jj;=l=m>^H4O5dUI2 zJiK4E_*iqx`4$>+yPi3mLA?#kR2CJT%urbY(K4w^tB)*^aDCpd2>iRq_j%S6FFVHR zQ>PxkvHk_x_Gx&mw58=C2@A`r3TQ*kb7^G~Ai=c$&J#{y8UwU~npv;0){Dj(5Gd{1 zsS@SV*L2uH7HNbY`>s&o(6pbr$Cf5cuxUO%^kQSlMn2I;LIK_fYll`{mX!#) ziO$>49?#5*`B5U{a+d%!T270ohXo;;CjDbbpC8UwQwl+&SCU)}7N+8PUa0`M54Fw0|EVnjS{Xs{-uj$5c|oAUG& z{8$0Nz0C7&T{YL9tO)&~%TE~d|Yv{MfobS6Ei*J4z9*k<^@Gu-XiLK}cE6cV|lFAa3KcvuyoLUZTe} z4GJqW(Xhtq+>-pU`T5)=$~JFbQ|f7R+9{|e#@TvElmN)!88q?F zFxo}@2d)FIhcK-p9y=jmwwv)Y@(=xlRoOvefKznJ?!G-xGS%?D(nS1QaUlF?guBI# zYd3e_8)O^wlX5DlzRg;B^rwVy)jP$4K7FTc2uCH28G>raT}rqL{Y^7MC#l0J(UrXQ zpF?*f-}PFr2(Zc{a^iu(!jy|7K3W<|+BUXP)QY+P3v?-s9+c1Ai=RUYUtiC)zQ=%_ zJf)L8g|YPZJ@mK8*xQr5<&4Icfu3{ciCxshEJ+CAW2K;oWMNsLDoqDpEfQCxNa>;- zfDg!TAAs4dchV~E2meOM3Prg!1bx7OMKETP9a%rrLP5|It z*i0QinPvvC>B$Tn7x?M!q&H3 zMnZ~A3( z(^VII#m459W>KN_h9`+Y?hx6&l?9ErU@vm?S~fa&vsF*Fnoq*uMezk-I4B86$av?n zofo8Z!qMf0oLpA%SE#r2cEl_&_fvXftc!^@WB(qZaY@(ngVe3gzs?8DM*mTavCPwy zOA3geJvJPc80*SoNsI46^>QKBI-yF5YBdO&a4FrIu`qd`?3Wj)?5S3i8srEaGiFM) zxeqWiY+TcHSdUyh4tpm#vTn)6E{*a<=IrxwIPNSBR)@-utybtelj19vPWPul?x&bW z)Q2E+t?qs4O;CP(YE0wc#F<)F4EdEHNdVY0mQFEiYbc(W3?=LyaR9vjol^w;iYuQz zn?=ru3mkN~rq43JBAqg{lu-2~7*FtNeGaNkAj%uwYI!!?HxT3AwAWZS^PuMx@#1XI zlL{8L3R(x-6)b(Bddro!R6P2KkkD_YroYmk&R#p-MbX5I-swZkrZo2jFi)f4>KVOV|tt28cN{}D>w_OpVGnxDH=R2{m|cP*Om$|!OW z{Htqz&pxS{^rayZc88r#mKHA)NF3CnLBSoh+!BE=pTa&*8+^gY;uAUZPbN#0xfE2f}{ z+39R4%0#}=!?{OShTZ2hJj!l|?_+y@>w^49>3FOMA-Fp@h}~!wWhLx`bp?VAW!W(0XOHcl)}~;LeUV&`W`qLRV26O_~)2PTS!7 zZR0yBD{oz;dph>zKwcjV9-V@>Z#&M>)8Qh(y&(Qh`%J_ePP0n-{D}a?fCIewmbgyy zH{+$+0?-Y)sNr%vM7!1-=jrH7Hc#D0g?1fB!%-l|glr>i_lB7meixYT>q zW(CreGL(LJwi0_qVf|+@{Yw!I$Ypq{* z_1=s0LR*GJ)lobT5k4w~J!S04oWZQjWqi1cP~no4P8e{0haE;Rwv2f%o>(b-6TmMo8VvJpG zZ>MA2LRXufFFoPOtfDM>;s*eh@%+gqF*=!o8Ou@)bp>6e!w@Di6FK?Q;@=U8%Jm20 zujlU^%uP@G(qqF7Pf0-%jFiY&2Vo^l3Z<&KA=OottC(Qpr;>-MWIwtIG0S9sGculn z^0wGM~N@Fb019iMq$Q06}f`k5%%1gkYNWDNi$F9(~0?~t#1>H zPWZ4e!w+NlH8Qq|ADJ2b9-FOr3AE;i0LA>x+h;HfX+Cw>PMMW2&QBc0#$62IOD?BE z*SG#nd_CHkXb;A^{rx~fXf{*oU66|$&4!!(f*8R!cDKe%A}2MU!nYefdJzaKOI9#gI;h@y?9DzPQAqgcVBS)5SRf{pu9SVp^ zla?EYH~{FF5;5X&*Z`Z?aZZ#tuT$10D&y{eTKRaj(Wd9^Ti^9t9 z#i!TU%<$P4ivDTRHCt!*iI}$@Y*g}ZFXguRj-8*rbwdE5I>FbRNLCj+z|o;SC~*38Ps)v=@7?tv}6xDT{5fGUXu5M^c5%)Lo2smdgW>@S$&g zcrFV8mN-8NP023sW`{!ZBTneRHtTA>`hhnZTj=QrY#Anzd5CUA@yhE=;Wug0Pl7-z zUrXWl8wp^nqfEfMIw2BE&=sF8=#Vu#jlWN_z@zY1;0FSYvht6@vax8qK?!1uBl_~M z6eWU>GqdsraMWNJmZ}ry5OAdnQkihyChKREB-yt;{$3brVD<$cBXyS1k2Sr;)K&y+32#0VUwL>*d0KYy=KHOy6ej=&h>xLJUf042)Q|stbDd`!@NzC_ zaqfkb^J<@5z9P7$J3C>VGsDnVRmQ3)QKSoz!uF_Sr;Tv0xZAQwD-?1Np4m|5+Gz#( z6&kHY2DWeaFMgUb=h8ys)Xe1Tzc}8_p+JWD2X*t<56dG`SsFLM_u$@s)8ZS@lJIJS zMiKAJ;Eq`#c1K*9pRooRE#%559Bz<0va{c}J!h0RYqE0AN)S-oo09cp;+&-%-Q}n_ z`YSGDGkSMdmr$tjq4-P|+rqhnZZi;hc-=i8hj9yQ-yvXW-Uqx2k@<~`V0b{fNU*lX z!S|?QgL87=)v?C8JJfsfSb$6A`NioZYsr8WrNHPd88xoQ6sgxAQ!k`j)g9du;6H2WkIOcX!>hB z2Gj+fR&UWazFMLInD)B1V97+Qd)_dY57v;spy z7lf+5yYQS8OS4);&Nw@3`whiW9-Ok;UCFqsVJl;8xmny@9UeA$NF1llXR(EK5z`A& zcyGVz2mhI+K?6BWalzc>u>q?KB?nR$l2tz5`oYVNELJ8=(Y-R8C$(n_GP_Gd244dB+L{ zo)e$}6_rJ#wPxrXoH068in;k2QT5{(qBLM{*W2^(C|L^>kUPnu^VO)7-mlwx8g(L8 zxm1eumC^^-*j6%Z?E6h1Uw0e`ti_H8gGE8P-@#z;zYB^hXt z)2qct9Hmc^W7B8DFQRcu^4qNI=SJZU%}s+W0Kv;YTlrjNUH=*tydjbAEIB31?*@-Q zO~U}oVo$eUnOp%g7K0>S;^dx;owL`3G=*=+! zj`ibE4n=~F@{T-wpCmbcb#(S|FUdBNL21-Q?7_9_M=na@xjt2wV_5u2gAmnG9?*U* zK+)Z_52O{nK~m+4lHU}Oc2~THC4*>}qZs;{iS#Xr7h@B8YN`*bvvi5FVxM^x40``( z=u=A^ZMgfOFW&{(_$ZMYL_KPvdicfC?Ti%YHqDm72xQF}iyV=LInQ|tKES)`&ipmY zpI=vf+&z)ZU3DHmuK{Gg~hV={C>W(DOIG)GBqytLFgf4c^R+r30S-7W%{`R z2)$RhP~$Ac?OEkKT4r_V4Yj`s`c>-wRg78u<~Vv^TZewEBv+R8zQsEyFnq+nK~mL* z6j6C*Tym2wdU2Azf$}r^TJ;3ehPcAC?MeNdm{D1nr@^M@a?NwRGROg2n94_%sY6j`q{!EBBEn|GKq-hC5#v(wUf#9Xod^cCVGGRtj0(TcG zY=<|$1pyV^-)!v$~3tX1$fh z0U0}FP>N&cc0cW>GlBt}YI<`$M-=M6+uyU=Yr!jAYej*7MEz2?YHNo6DHovJ`0 z!^A(`J7CaNLi2pAk2^UUdUSNCjl$jC*$pXky>9yX(O`#($`?)8 zZQZgF7)_JLtq(}H8|iPUCAKdeYL{W%m!rlTcDK%HLEaKPKCwKhanIk0@p2j;3^5WK z8vDh+q*KR>Zm;SY_@9h81U70hEgs^1`r5{DFIXMh6$i}j5O4q%t~4MP#4{(cvwk2E zTOA|^n1#iz&c(RvtN;r<)+sOh1DVOWnA1gATN`l-D_?olCu_34Mv9+M{p-UW!4wZa z`A^s+pWykJQ#yMOhsrhb&e3e)D1-&kMwJ4WqqH*j-#{Wy@1oy-?cKpvHBLV zV0rF0;@d2Pv$L2$Uu=-e7JncS8lLUtb52Em7}7d!x7AjK9VyI|oWjX%rsRmf9+OPr z_`RlE)BN0e5-JdPw>ah&^I~_Ru7OS&0LB}yfhy%o2|{?o3XK!u>UVQtG6}wPEjY&0 zg}gNS3IoWJH^$#dVkY-yc5aYBma|}SZ2Gb5H13{lcv*Jp=oP1edHEM=Eo~kvCB=!g z*0pTIN&KB}xSL{L`LZic4QD`J#elzl$cnxpc6R-F*nt|D;d@~S)1U!tW$wy`cU=A+ zc6@>PQ97{V`ntr;uFhLx0)9wIFNw^L1-L!dr}&f;lU9?U@Ib4j;B zyYkJST?3vs`PXRx3-hDXvB7U(U6LwaT(Fp3DKQ3iyc(#zfK_=W+mQjNBY9RuH^Ncu z(k!s73uzd*EzSWNSw~c2h?+=7(;5iqz^U*LaocFGQ9R>1>f^Yt)v}c2_Z{}xxD?DJ zz0O3_fB@U#iluA4QmLar0Xk>=UO8O3De+r^Y0Zc>sFojCB>~V=tq-gP!`~mxy`!(R z{~k$`B484cDuVjc{-jI``oAm#wx+wM32fLeBxegHOyl*$d@SO%Q)L8|&>%to286cL z#t055h)|opwT%3M(}x74#$x&3{gg`~JM8M!(p3v>V$V{;Kzt8|(6sKd5BfL`)|=If zV_4ONe>ZGX_OR9dR7^Y&^QVjShriDe8@&qyC6hLe4+_=jx?5Hw{btL#G6a4U#QrJ~ ze>sd<2d)6YjMe(US~FKNn}5t)nj1o?PpBEOURp--w{dsxjO>jqZfogh1hhp zVZaUd1i&7g3cKkzie%f zv;XuT{PX82Z78MXAH5!5~H7@vt^o~ z;-oDmvN}veqoCBZ!*&{M_T8|nSGk8)ckAOgl_ce6i{1{ZZJOZTmm<_I-yHP{thHDnp5a-*GlD8D>wG$ z1t?dUG#PJUsMMtYg44RP+T6Q)4bOeYIjf-8rSaR%kHP$O_;ATO^pyR;uD4>ZnwO!H zsTYi`?w-=0Pdmu7_d=iTbAem7V_CeE)-Hp-3YXZLz!BNeA=AX5Cmk;GIFtS&-=z zc^FVm5TqY6S-nYmZ(ro2QA{6OvVlvP@g3K&D}=YvisR)JT~_AliXrBM`jFY^j~ z)sZAJzfzJP-psk7bC26nIOhr*f*bDNC+F=At*y;#vQjD2gOlY+i?PPU!}F!{^|TWT z0?lOy@kf?|N>lk;tkm*SJZvI#n)pE1yz4~yOE`eHy{PHi4}4s!eH_Q|!vTr&~JEr;wP&H|LwYgQpW%yIxys#v7rHh!l@U+K9K*a#RPAO0bkJbv002+i) zjO2nn8-CV?;mSBO1_YJvi~@G3eodlBw-WC?gO4oNy&Tk^QSTr28PlmHQU5QRe@p-G@1`=37Qe<-`2O5$vno& z2~YOS^-&`9g+T3z)8aj_KLr&;OVCUj3|5Oem`#@4H_M zwcdas8XvQ!nhN67VLn+TrJ3Al)7(RrOo|1OU_f2djU`TKWE6LHB%6iH8lG)gweN^$ z6@*5~cu(i-MnE{O7V2_59K3PsyVdk>0NB&2K;HJl>oHegBsSd77hA;RQnl!HLKW10 z3VH9H}NIIV83bG zm8lj#2Dz82o$iDLzi zE}7Yn#`R%d>MMu8aN;+V=k}o4lBn#9}lYC^nM1y%;K39S=6ww2`9f5}SM!WDj|rURDedGZ6(0H~lf<&+yg6v9n_s&RPqF}U05ZuhJqJo}r)fOM2ne7YNGoSZjvz->RP#ce zW``9i_Jsg@QycgcD*m|vlBT3Ikxu*@3W#t^)p=QmiwR1nptH~*jY=_weFU}b*?~@C z2)KR<&t^MLv~9@^D~&_QYKHVtT$rR8mrmn-avIpL!>R=3A?qe@;yCgc$sd=?n}Rs# zv$?p*LjdBz`MHzn%a$`YNInTb>S=0Mn=^&43y8<*!qjwk9cKotR=i~xl_`}Vd+ZKP z$49e?h~K!TqAayI%>DRlr;R^p*qC2te?=A@+BnaVNQinGw`QdxMLB44HbjK^vwP{U zrMFkyhMQ*eQ1)8Q2zhV64hAy52^GF>_w8`<5H^sV(8n#~Eo=v6#yPvFjAK>Aq_2tA z^l!luw!$%7HnuMl8ztf(J)x3uOUWUcQhP_PuVuVk3*#CCihj!`@fh-mP>(pAv_CBg zwQe)FFg8XSOT@1dflyKFN4kxS>elh^%H$%cZ}!+wc$6Yxw`*qP8Q*+Yb@R9~pZbN( z#kQryF1~o+BZK=>awYf(MEvo@rTVo%B`l!Cl4jJ4Na#e|okLDJA6)`J(P-iW>okJH z4x~L*e4(0S=SZWewQts9lal^=5ReFXemw?t5Vl<#q`b#Xl}U;cHpWNPmUPgwlg9Go zmQl;E?jIYNmxsiq;WY<*;SF^urMew|+gcMfYj^Iw)zcS&xh?KG_VxEBmq$kEar|MM zHw&mx-B8RWd*X))FW}kk4=Jg{AQ+nB+Dtcdd@&~BuRLO(u6!tX?Bx+>*#3||tnvk- zFq+#Y>h}T5TB2|=vMg`C(j)HDhgFG*W^`*Ay$d^X0ME4R|u7Fdflq!`1LU=FQ%vdYJv2Jr9&xU)Qy5w^Ah3b z&N>aGepU98(7wy=)?BHjeZO6y>^|E>NRGi`X$8hzXxPV+CznQwg0)TG3n#Q(>0dJ* zH7;qXH-E8i%O(!2*&a5r9}l(*P`e*s8gBs7f#!DzSDJ;}$A-ewBYnz_gY$qSCJo)h z;|uo36TqHX{ZV}giFP7ImFDyASckbaoT$lG%q(SzzYJ@ITOg*O!t`6QQ+%zH=xEMn zl*==IF2Dog)w#M4O-Pp{I1$TUU)ar6sR6%B%6Ra%XM|cx<3l4en6tJtU*H;CR-CvL za55>jyQmwXd5y+LWcjqrWDl<0>x`b$(ezPlH!Q|W`>uQ-=VEYTJkg=)r~p~{K0k+3 zl#8K~0*vbf_XCU02bdghzNQ{T6!}~zCa6r z$DCBV`UU7N_)-tpM;1HU9sHZtXA`gv^e&g%y!#v4-PwQe?YR7`1%e_kSk5{O5&+HS!aSBKgDqJxwa+!z{x21t;~g$Bc@x|Xp||Q)J}WXy;kJ6 zv{4Upea5`v>pm~B6dHyg)b62VCCe{jn>X6^y8G97DXB`0JVEDdm=kMAoB{jEJ^Hl8doWzIygCOJKjE2VyTZhq~;=hu~#DmqVZU%!vE19Ckl zhmpPDlv$=n)~Bb8^6{9b-K8LE?I&1AN7LUXXRNJ&iN0_o4V;N%Yzc+xE8a;?%6ENS8=~y#gg~p#JXirQU{pU>b4u;;Z*J;2 zFmb}$*)GOBhMOc}Voh-(wH~rh4t6veqT||XQRIK9rcP)r{6V8qQ6X0cA0?ayc_?{6 zben0&T3V7440R^u*mNux$|Uo3 zbPXUEN9L_5YSJdjy3>j>k4v-SRjLa(eN<_{gMpyJ7hY2dZ2rKpgR z3hO}3T0s;Suyf1i9AMve;^E~%mbSdbNe86hXsf-TJ*|M*Als?YuR1EV`0NrtfjAti ziB!fE!mwymz#$-8Rn?1X=?W8x8U0)MB<2q`n;v*XZaN%`1jWMxskBlli3tzn`jFD7sKW$+iNq_F&8RQri z#Rxr$9>^^ANu4q?-(pziVF!Ae??8fmSq!ZiO;({w5yTVM$XRoKL4OD3(w@e+KY{b) zc>^SKfz^mIj;uv!B3_`@k~i}A@nqN_;%hiqj7bojL{2t5d#S@Adav*(o{lRdiU0Y( z_*&lsr*l-1`%K^s~8?Yfa;$ytyE6Ya^+B*d0s%vl+0 zZc4NtI5*Uy>HDWEa6?tWuZ^3@*W_r72ETrY<;X|F3H(!WJ;~ypyBP9H(@o2{O=IyZhpSNn;4G0?S zIkGyNAz9*cr9-bC3O!ssh$9HP<32xc_bdMdQC0$`S1qOQtoK}As=kU>9{ym+M3NM1 z0XTN>-Bd5}lQ_du`veTXPLhdZjYbyv$x%P}48 z0tbkE4Y|VtoP?0%GX&@Q6>p&3N6bp%;d$&54I1cEW+TRXzY7$qSDy|{HmTM_(~8tc zl)Qffy6vC9Rd5Z5q>d?KvkNF4f_}H=7m@P?Ly*}%`Zs{ai1;RSjs%B2c}Oo&F8*ml zYRiT1X9ut`#VT3zL6FahTfj;e6*HD59gczs8tD!=YWEytYp@gy2*h|M)Z#V4@H*z> z50$mE0dG9!9&?CNSZKZ1D#2ssD(6Z4pj6w*DfsTEx#SUqm?eJnxF+3m4=#D-cDI=p zmirid;wZdh?~dnu6i3HJc@@+T?QzJw<3o8=txxkH{h?`_ByrNQW3L+8@0p(L*Jc)I z5z!to|I*7hxFmcevxAH@V49f(f&?E|Myeu>$Pg_Tj>fAoSS;a07%{sRY3_(S1z#RU zeoI1ScewoKkJ(p>rskE}DrO(Qbry}Qp-yiuxh$q(t} zyQ%}U9qAJ*F^ZtoNVUy;_l@F=zst;@CKl140z0dTv4`7}w}NRg^VX)^oKn422xOz~ z1>rg1j8GS)))3-;b*F8ln<|ynb!!ZvQSVp4a=Vj)R^>**h&)EHyrY{3Z#si{pM2K# zCwBSvXOn4iuR9N^OZ4LRzCkeieH0#}OqexPaqykvdwmTpd0|6i-!)L~J#2OI%XG0N zxI2}I#dm2Q-*b`aS=-gDi z>I!6j*NqXi-II%8*V@Gu($5ICMtK)M8}+lA+nMo|z7Cy9=Po!3M{!lfxEF%)^95?(Xgf;Or)8aC)v=?61ifOYnQC*HK03F+To7OCzXtw1J+d zsvp?0fS_=ZYYspH_kA?}n;(u+qec!CVM-p_GA2NBrHD4nkY6EL>;7%D9Zf4TIs}(2 zGSLo*MP6~$QDB30MDh$WN|$abIRX#9@%Dp>CH0DRDXk5Wd{!cVzR2H(@7&*;Dd(wF zze|_Nr+|p*y*?5(py87t&S#pQ&$*U9nJfIt`m_ak83t8vJRJ#Zq3Pq^fF1xrC4@3N zP+5kJE3MP%2BdpacuAIr=tz6eqm=BX?v7G(hD4eooho6<+th3M37xa%>w7s46D- ze#kB*M?80$F|kE?x9&n^prcc_+hDZscoM&TeGXP)ORI{Xr@d4(^I zH4B@>8I9A45FtU+M(+uH*IJ=$fs2K`=Qu0C?2er+la=%|Uap^PO@z#5GRj(%-_oE) z?u<~o>Zbu5oka>N$9tuq+f5g5JoCRFBM#wHVpnDGYQK+Q;RJ1D6sq}#+Q0*`Vt=#j)E{t!p~@ zT*c`e2El5hNQE5G68uW^gT56<_yEk;F*SC zI_<#9sr{<9n^5(DT7DjTYWbk`Pq|T+!5g~%3{t})825%q7BVWpifEeSqiZ}rLX_Xvp^qPP1@5hI^Wz_+x zBlavmmb-Gp?pa0m*;McQiKy~$nFSM5oxIMF05;+b*eFAfpZ?&teu5^t(q_rjdWi~1 zRjt1WT)--#K6m$}oYM9h&uh#_2&txVY8FQ5P{1pI`s$IOzee%_Z?C_{?Bw8Q`<`}U_aZ}WBM08iBqWNm9#Um_SUka~~?8Ki7aZ05G686#Rd;QsXX8@tw zp@KCoYiU*6?q9dLz+MAnT4kqI{Q$Y^9{sy{2b3$!p ze4sL`Mft+x0s2XccgaZs9chS&m{T%MZK;TBdbeM1nRHAdPzH%0ctDOl7k9m$s5-5( zP^5@KMK|`KFjQMX;8{;_XX0{KPA3G!&wrO*3*RvN8*0I0+T%8B2$FZl%3a81W<^tcwGO;d}n- zawH)$mkHd4M`e?6IXrHuP`EgO2@hrqFm#6kEtO_Q$d$({M%oJ!HM4X&HI{J%nkezO zCnx#~2dpwL)%TGNncO49UMg^`(0XfG3@KOI>^erZs)^hMpO4c<=9w>g&p^(NyWC@2? z??ewGb-Zd5mgVOq0PJ^gdp`~A@~8$-Xd-KRN@1<}lu25$XzS0sb_Gt3{S$jQP45c{ z5H>|$4y_f=Q0rr`1*&(qUmCwUg?1Gq5_orlJZ4m{0#e0Wo#-FHlf=2qdB)TFwD6;W z3;n||1R`a$_?xBU_5MrauBgtTc&sEH$EpP{_c>{v5BocMqiJ;k%0rMdIf9zQfwg}? zja!@5I8k_ujv$&Sceh!w@L!(h2|XZyMv8b4@rS7rLI3 z4+kV+bbuTlVNX#>UTbV;T81aP__>I`ZHuR%0zjx)@Q2G>rzSPoivWUjo^JY$rlBx} zBu@OSWOX~XMM>$r4T_(T{;-!IF(vYx=Ry`B(32_RX)RM7)pN4lWKg6<4p29?%{N}Z zG2g?C(UA1BE+Bj7li&sIUCeoK?4w}(%rm$8)Lmpfq$+PJF6j>Ii1{e|4Ra#HCSP8~ z`d?=5O3|rf<(mo;!BDnteniT>`l#$k|H|zK^;m8Ij9Qee#6|4^=P0EF%Bm7t$0_hViflA2s2L zK$ji)BmO{-t>Ls4u6yM$+1a^h{w4^BCet{wQqGF0CH=U&4FUpiyz^8Zvwjl(WjUV5 zL-YqC>SKm~eC>kXn{}wkVE|6}h*Hy4OtNo^Br%8D7HLn^QZQ_N7SoErM`Dn4iI-T8 zE6?*66mP8zf@C+c3`N3tNz6c{xpcBSqRgvPrH|^P$SQqdXCh3mN_fHF-feLc4AZ65 z&Vc1vmVBsQwq9b?5>dO~P(KcS!V&!^jGZ?qQ%pR)G9rzrt=fqyF`k!h`w#Mi_3Jp0 zq*I@V*<-CvGYXofTr6GaNulWIR50mob9UH5moC~D9 ziSz3Z=(r~999q%SM#L0Zlp!|{5$AvTxBvMYecylok!@7rFsi_St~-mfwGLqzXm?h( z;H$65w_&TBTpDz$f($J2A;Nv-jXHLgBoq-~&;IiW!O07C9agNYX}+Q}aBnd8Rp(5k z`WPMzxmYm)-aZ-+Xxl45wb6eEC-!j-#=a0g$gQ7OtYT}GDwi6u%N}GoR%iXZGg8kV zX3vk#@nHh&!L~8KD1MFCvC{9&P>)L6&gn;(um(u2s7f<=)^lvJ%h)4K8jsly_;7{G zkI|^A$jPp$bhXJ3ZA-g2C1^!^FF185E1RPd5fI!J$OPD5qWgSUJV%LMTya?tLQSuqB^^d61h{(kzk$ zJamh7g*wgxyL~gkLRGWluVXlDSW!Rcbg%^+68g;wUE{I(ZN&CY`m|C2uXxZ|wBr(X zKLVTQHEkxYY(Ed4BpCJwkF7tT}g;?5DrDmC5 zX&uh%d$F;k7i<`DzULcMZ2Hj)#c{>92$1nn6c2i4g>fTRzQe#D)#SCZ;<8($G_F-M zLc4fkFF&7EDiyKT8tTJCM&Vh(x(+`${~%%aMg}lPl-uK$8R^m8IeSt?2b%2XiW7uh<9GORb-c-+Oj4X=(eNix- ztCx{4V-goslB!E@4HAjkmVzN_5v&SLfLipZu2VXGvZ?Ub-AX0m_ee2~bxR1t9%!<7 zV$b=ksQs=&K!R2vz5ee=92$7n2|6ONuq_`!CNSnBnyNIB7D%+U`R|Pkzt@*OiO#i{ z*G|OdM%3?aI}HBe#GP3~A_?2V)vb)NOdK1Ya@XYY5Sk+joz=%>Hm$gdNJ!Qe$&8t- zkx0ulskVnbC;jDEFY1t@abi{*zid2`pBNbDnAG3)vXjZ+R_BI-pPJJT`L}cIvKVgx zBqbU*Xs2N^^BcQ3?ZQp3Cz}3^(hwbfJPjhhw<5Q(XCAxHcM6-T3#ejmB)5*liMG;kMMdeHkp2!1i!RN zUdfq*Po3kuVc=5pelZUI!e=7hqc(RoIjJTvmn}RToikFczbC&&t`G&J!1A}m-_;w5{cwGn)B=}vSnt7?e}6m6V}L|UJYCim zQ~C^(beIePFh6lEQ^(fZ2!)Ab;iW!QErJ%bDc-=oSZS`Wqfu~UelsFBPWhXl)iX#j z^R=ATCMYXZORaJhjmXctVKu0bUw%L{8n$GT1T_zut+AJ|sf$M8Fs}(Gs62^|SJ^eL zqqOdrFl1P*H=0ku-2qB4Qm&ba)YV6V96D%o-{n20My1;Vv zv=e~5?e6eSm(yH?Hx1V8LK$OJdCjad&c>^G`TJLrpwK~d zfZp=<&JB7o$BjX)E9U4w&FT^;zXPL$fq*O$wDtaCp_pT`L`|$ygd{~h)#?|9Q@!?c zwFgoknCqXFzZgE^pEP27>eUVMHM<-rzC`ZJ0+|YGju~=BTd>l`x*RF1J0;`iSTr&-ySyJ_14StoPK4oeEdUyh=g^JRNA~gz8-`-6clpC(zo(> z6|1T%xpRZrQU54Omj8YZ6k%hGtWp6py*J{@ow1aVjV2dS<=c+z`Wq(Z!$lH{G&Km4 zWc6AQd<7n(fPM|{C=wB09x-e(HPx(Q(dlYU&>0AOHUlwh&z!&+OM-$XVdOr@GDp`S zMG+5|_9P1_Lc=7OG>O!4#BG52?QA+H6Z_J?YI$f?F9<6o6ENiK=-&U?=G=vr40Q8}nAoyy^&*2fz7Me-X z6hF+{!dzJaq06;y6;L$XedqDdR)4PkQG}_yd-v_@Wugqo;wYsl?@S%NOShT6;&w`V z(JrgWb*=cd0yNpzAx*(g9@Wh!SGTY5jk!!qNS>~I9>rr9v?lBKHON92^X`jU!h3O} zOW@`F&TIcrI7kCZ?qu5!Vy(p($bIP(1!eIgqzx=eAx|mK9$(o3Qk#pl;p*c7Q}gKaM?fN#ld0ApYGb$!w`WWtIi|27n!N=4YNQ^GO%Ll6@GS0Z#g;!E;oR zIL&?7T3e$pSOfsv6}I@B9%Yu}?-Wi#mT1u{uin>eWRHHW@3r#amhMPJ!j>aJMHN?w zyYt0e73QLp6B)lBk8N|8s0+`b7XuP0RuInQ5?*3mUux%%*^ZcT5^Htzy@wEDiILO6 zPFyyFP3G$i?d?h7Q_K%^(B~v-SPr~U0VmO{9{PBsC-sXG=O;u5{rN1&xfCD;)#|rP zgvaG(clfX?=#k^_QaMWLRQ>+Z!>Ad^;59cvSayNd(zxxpmPrSKfR7NW1R_0 zPEem|2XsU3(;(v|Th;I@b)|tQaEepS-aMAfogFS#kT z7nFMBe=jrCdgM28b(J&>{L6^P>@MY{610(TFowHyW|tcKFdkJm`5xN zU0b9=<9`y~QU^(nlNQM647DZUJ75pvAe5g9DRsEtnPe`J%!O`qLH2Q3eCl}(^%og-@o#5nND(0sXDoA#MIvdKM8c9B;iDeIM~+9{6l-3w*y6Cm8wD0-S}tmSlmj{AtGDalT4GXCSOq zJ^m;NpUXs?{C+UHqo@(~s>W_{lg{&;{Th2xEbwtrEx3eG1y{8v(fAFnF{+Z50=jsC zOBO0{zluL=0Rzv4Y$mo=LmH{=(qO{h=I{)|0!+&>i16s<=aZA2_DN@EZN3LwiUMKZ zfML>)2ubYmgBiPZ`SFE2+V7oqAF8iNv;Kwc1Q8JgbmBuz>DAesUZ^K^cltJkgx9FZf>`=T98Zots+!l_2GaCh9SDP<`5DvX!0S} zXr3R*>|$&Ao=07WSg6Ak5)x@4b!T4S(Lbi#8)zZ#ajr9GhgKe1O)u{Sl@G?yTdeHJ zzRh+#t*0N1y`?|H?pN~!{Hfk5M(%#6!teqTYbq~Fw)Crcc3lHQmWvarDtZZhdJRMw zs6AF@lVt~i`V%zigVbTuwC~Llh zzP1}lXx;U`qNNsE%BY}CjSc}6AR9!08*G859X}|dH+VK(M3yf8o(c#~k(9XmB8G0k zRxSErQ#=AWyn-M^oeqvuw!eAC$5@9$VVPQecD*-4bkPuyjIV4FFXBDUwp!$3&Nc@M zy2YU^Uz(y4KQ7O>*jsDdk&;n_MrN}H>MgnpPEm8WLu~r&cJ6X6R3JxvF}`XJwYn^# zkVd1g9!%Zz7zl?yZ%cQ7ev_9&H{H$l{I6DQ=xm{5J7-C_?sG1Ma8!n9MpfTYBzbXu z9XWm#8A+_lSk?rIy<1V%kLq=tz7;~@^{*BX+KTYvz}rfV*G_14U}XvCTU;&J#<2g* z5OwvPm{Wf5B6ZNKbASn=A#gt)-an~C=uK`?ueJyBEQGXHC90;o&4-8j& zH)96z4Xf>;zzRceOG1#eSLJ zWE=P+$;ouwpbR87!F{Y^Woc?*-kB&;7;S0imU}Sq(WV^n`+F0%vSs7&62_N{P0(&~ z22voM3o~|FR^wXwiy=jD!w)S=UwG33m0@%%Um-tVPwK+DaT7!sls7c`?X>X1uSUT) zO$L3=CFDJwk8l2jwjx zJT{;;(gpFh#J)G`==|b$0$jdT9wL_AQoaE7cs#UxN#)*Rdu-13ZNI`WFF^R7q8Du1 zpw6FfxHwChBp}Y#(xqN*`zsX9WSp~H*e=3qO-7lU0$2{j?r!7;a2XSM{<&IhJU}Go zpu4VrcPE-{ZX89TTBo_Yp$0d1g9E@&V)U0NOq;{JHJ%CSGazl7M`l9HgcDOA9gwl5 zyX^(l(sNn|?dJcsZm^cbb+h`}mFt*%BI*>H9MYYEQyQ(3Ru- zFy`at1ZR+PV@fT`6}Q4rJ8e9(1N(6&XL7`;=`OhQ>?50y!>}tQIE`p>+C(93Yad8? zl-veWiTpqj`KrrLRw?5vLY1F-aY%LIO?1KpO6Ckj9r8if8k!JnqnBnfKy*5YtqHkd zM(LxQU0RG*`UZWsIEAE|=_DBUZBpDOel-@^qNXNh-7WQmts-t7dI1eRbzZ%x0gAp| z^~yZ$kMxokOm9DQ%lb%~F8+JrQ3pWgZhT@!x~q#s^-TCk4wLN=v=KIU#7g?(H!NAO zyFg_`wKRz>ziCi-BLpeoO!!NX$b!W?PN1Szyz%KO>~&l0hQ2=`xGf(r134jq`EyyE z4c*M5xFSzTClB-f_y2oi#Q)A^8-+j}JR0@^a&Fb8S}(Xp)f$+cu<~Lc7jJgzx@DRS z?dwt{2A%KZhn0NsD&hO@fH?~f8ghau1%~t-FtvO$=z9oGQPfPq#T53-+ODS2j2)wt zJLLgmj*a0}65Go$I}b|GrppQLdul2DkDPs$q2=S zAe7o;kDQ<5Y#Kr%NI+D8Z73eOmv@B^PdQY+ERp>jrxp$r+Fn~-9uP3-%-NlszWa-oQJ`g9l!-l)A}2cqSWOj zJbud6t@}|keJ`Le?v?J67N4-7%t|slKuh$sGXYC&;MGgq>+C}NVQTFS zvnC&n`t8T0fPQgw4vp3l9QbSbrBYOZ$NP_r;p5OQiC@OdgnCU6AWZi0W(q=|@84wov0E5|@L1WW{9$(Jy! zEHz0yixA|*X$!AZ@Dd*-Wb@8XqUE>7aTf7Uo8Xxyd5_7QHrLCI9 zn1b!BTv+E;cgRpEKOc!TF8`us#x6|0&x$T;)?_sot3+1UtPm{uLAA}{F4y*G%%5_h zSq( z6aQ#I%iIiWDOU|c*A_{o&9d5Z*ks#~%ktw-G=Zc(($;U_72uOLg&ll}nvfsM^s$bK z&w_h}cR-`d%j#(A4PAsa69k}qcH1|=BU~~?yzL3>H)OT2)i{%7L^MD|JDP!|s@*FFfjpknV`+$VDwIRQ2t9Ckf)HS^?Sl zf#y;jtDMjKddtWciS}_M3tPBAun}nw=(>+q1iy>zH%|LKCKOk1`ikSPFQUfxx-Te( zMrG%W%<_G$-h&e8eb*~uU62BuXvQUUBtBj0wh{W5d2mb70>8=yU{Vzxe)}s;YoNZn zHD%&Ax=_%9xj0ip+sO3tXD(n%s2fI1+;G!u!<;V{YA=Y-Aot>JrY=6tusBC=3~*fh zeXf*TL{Hr$^XI94kU;7R&G;$l3_P^nH%ywsAu`6=o|{T}MUm!9_?FD8M|0>GOr*1keWR5f@L4rZyDIz;E}TX{d@nf_x1mkoZH;M z$yds&92%*h`|6Kctb6g4n;%P8o3g355GQE^lU_6#J3Eed`9*ST++# z^XUFAX4e?#>4=^M(uQ>nYU{l0ZYjFHpH6%9Da2CGSPgh{@&zc~USL3~PmP*TV_RMo zyGH9d_Djadx0oZIxCKUb&Fe#`v(T$@!2t3lB;U+lF3Ga?9ETOsHA5I#WA(ytF!~@} z8))fqJYoSqt5c`-qWlD?pDQ(7&kg`g_2&yQCzywo(NJD7Y(4dZTrHB8H!n$J|FG-SDZ{TlB zb;Bx(&urQTulE*3EDilwa6F2;af1EI-M{Yzx*!OHW?@s-!!Fj@D>21A<_m8Qo*=LS zyRxzS%Y)upmYxgXr@Q`|JPJLFKaHQmX1~BWrQR#Y6?zLkvJgDZT#>;GMV&QTvkmtw z@7GbAW)TETT-Vo9hnDdm?EEgt0|+_Oh@6XQet1n-{QQKQ?`2a1lLjepJ+ zBtsDC=)*GWWZk~tfsLZ5BoZDzBev~_5tvV=jx!buXWgz0hpsk})PaL}yL>S1Wi*-4 z+|#D{_^80KUg+KpIHmatV&d_c;R952p_T#U5>5#KSTK*vO~?6w+Qk^o!^uBI&MlF6 z@SCc?dpEsA(q9s#)0u2WW&BMYmTVP1?;?@~ul9$Nc;vHh@9IfN^IWI3b|SP`b~P^E z_%n-{z`(R0`CfXaeqgEc;u;&vC1>P3k!?m&E=$Kg4W#SBR8uF{zO#(#s-c=M?P;IZ zo-tIw!8gn8fy*czaClL?4%S0Dr5jN0nu3mYA(Rk+^#o&2_BKkX_FrXZrSfo^iq+2@ z#{rzR_J{2qqy|y-u``s!2n4D)(FJA`+3<$2r0fMPkb+1L&T-|ip<#l)4=| z>$$$lb+wVBg4G*cS#xZU(SHqhAn@!N+r-h-m55(5v%h=xfPzoL`WzRk#KIwL{GI0> z&&x%5J>HwdzA{^|p0ob|ohS*9eDTRzP)3Mg76a^udL6oXTPtcIP2FNC>_k9W>q?8C zbfI)ChZ*=Q3P=?*$(qUz@33cnX8_JTAAzkO;FB8Q^oy)8ttx*zZ&377McNcGIGMxk zQWYb`;Im;Iy_q|<3xFLV!xTUCmP_zA=7ah3+|2gEv|wOqH)6^uD*ffh1OMbgg}(CQ zr-~!ZNU@28Gn(je^en5tt$~-c9xZn4E#H_b`LZr{p)B~mQB}vi-0%}-jjd8`2e7zI z+6fqcexY3t;ahx z8fmJR-cCr0eJNm!sCX9hUc>up^p%ij*4Z^tje#!Qj!(1PO#=SgyyMcNB*a`K4jIFA zrFg~MUX;=^w=oQ=F!5*DW&pOoAR5Qaw>`MX=0;d!N)d)%zW&O6$Zaa`oivVvneXrJ zc0PGUVG4vak0kM@U8zB}iqAziaO=DSxOOTPeRHnHSWrt#g&L;8=b4jYfURO`q%s4~ zg0DmWxIlwjps|(aW^=`XUwLS7lNHg6HkjwdTm36@xyq-av7{F`#O6Ku`Q2l}5sO1R zL1E>|*I4TGO&Vlter%05^yxA$42D)x7^s3HRe^d(cq@e5Rxrb=HQPZVyGN1F zdxd)(x?#gN9W8M-)E+uw_5{sULkZ*m`tSa8x3d0Mx~iBKX5J4@-tV{)AWlj=FvZh| zp6(|o;neky)j{}}F!af^dh_XIM&b=@f41_$2U_mh>CTAQyCEL9jpl)H}}=%keLs z$4UIew$s1Wy$j&ifp{W2$~sLYE|E$(mp^iOES)9N97GHO#OLIFAErzcaVn(NmS5-U zI@r!8)ZYQr7~>(3Za^F*xcDQfiK-c&-)jU!{in5XKN+_Rh zWz3w^*!V-OzoxV|_P*w-Gu*(>Qz-Du!ym_P=qjBu7}_T*|IVq!^uD~+pB=BP7{55A zZ@q;tJei6_rTsY#Ur+WEiO6>Tuv_@bo0qyVUgsW!zr#DgT6s%4ZxtJ>`MDc=moXAW zUF)!NGA+$-^R2gfoV9$^klyXL;Hv@L*OYvMg_!26WS{+p70pXav(Y+(y7S31Z{N0TwqvBRcnKCW$d4260mPu)K}Axi4k?KQek`0MWToOM z&7c|q6w;WXf>Eld2gjd7;mns~`Yf%q4c*F(eZySf`r(#AsBBMZC(s_M#dZ2DYF&#a z-OMl5e5!za^^-EAuVQ7+m__pf4_|h5c-x=MMZ4tRG#2jYKtQ$rCM)HLRpmD2Z?~<- z5VubEylrU0NK-fMl9DFA1%Z$R2x}2VUbiFp$|dKPf491FUq~0N5w|H59^K@nga`Mn z@(#F_RoE!MHfOTc5#$B`nLg(xZ%IFGY=H3U3|i&d@#AH_kUAN!9OItOSCA%ccF}gKiip_aZSlse zyA1%B`nE~T|E{cw+}^k;+(_N7dVXAhZ8ybbFDdTb;HucFQpwCRC|R(fu}_p@WsMFp zm!hwy6Kx}yY4N4o4*Gb-L@0Z!#7}I^@+IkZ4Pw3to+S8oN}0Onk#G3*+a086em$#F zKWWlV^}Ebts=81e2c>Yo-jHMdMC#Z4xoKO0zoX#@Iv*+WR&vnuj0(}S+GGeX&ani7 z_FeMkK$-`SRRoqjRzUK``}re7lJ2-Ib06gw;j*%-p2W%4hY1CB|A~hwE=!Dje?ORF z8$n9{c5psKa#kQrl}C_dYElSwqki_O(4C6i z+aFbgr(oYAx2y4+`n~#9LBP8n>a#wGew_wUbTxy~f@@dTG27s5=Cub}OuoYxI6*%+ zpe)AAMnU_0nNYiWpYvxBg@*JfXhUhac%1t!;eS^fAg|kv^6oB^L`mfuoqj&e7Ws_A zW(TxjEx{=TrF1|%viZ9JanaEo0e!a5%E*UNO8x8tnY6lf`18;%eKd)syOaaQ#Re)o zsR1E0F0vOPQVHZ>a~fn>&hbXSgB$%vQlhT@9i&S5HGu9mXD&SH#V zV}FBUIo{xCvaXyPR>|qiNNF^`*;<7&ms!|^|2yAW9LGZzhNQzUOq}-ex4Z0X2!y~@ zZICqm_2mR^Y(MRubTcKUx2!ZuuPtpgXIuN_xlgJ!>X#dZ{*qO@d~#B`1GeAgLA!1M zzS?XFT_l6k-f$Hz#7%dDrg_;McUJGK;=)z_q~78~S21m#p`3~z|9vd%*S<;NY9IDy z<)rSIm`dH{;gXgueAhT_Ct-6KxnIs~;FMjP!O0O0RxH|F`+MFa=Qn(X)Yv~}b|kXY zfL+X}096DLFWXpUUTAH|l}Ee0%H6Bek67X~Kcy+Y?AN_{EzWbk=nxTj#A5kK`l3&Q zPD8456!;!PiGmYYr8YiEh{P3wH&*$K{aM?pYOLyR%G@llTmRq`89x|&qIVD6ExZ+I z9wQ{v+m~Ule1ZsH>UVM2)2`@owpEf<)&;@*tGZTxIR3}){K_SSAcs2)_fq)bT5?nG zjYT;PlNf=U7#t8>A@*dYbSL(yM)d4I3+4PQ3vf8ly?dms(cUpdlOJVt3Fe6Eh|`(w zUfX_}i2en~`@pR7$B=ww;-?(~>mV6FK=1j;WSou*`zX)s9 z^i4Nw46`~fy|8tV85y6ijlG}-4dKcjywauZ^X(y+B2tYvG%3yeRRejgoRWRzy0od= z{%98DHZxC3Ea2{+n$ah!yDz3lXx)?RI>T4sdE-Q-(DTMvgwbL(1x}n0$8AyhuT?q$ z?g5Tr8jZ?Wa66WV{Ptkn7bX=%LD*s65_#6q#ChxWv9A!X_RWIl_c2i5LCS?L?y|bA zxV)9X{A4#KPiM_qC7Zm%+G#tgg5{%dh(6pHL?Ds7F~m=LS=-^{EdZU*d5Sp;?x_mH z+4HSF(~9KT@WTg{AWy-A7%zbQwer-J2*nxuI#itAmhc5XeLdJ5oRCUYXLl>Z?~i3( zqA3GGxT#Vuh@i5@acwOwC#KF>&idN94f|Y)8j`_Ypejb*(;0qvha^F)CjG0I7^}6{ z=72FejC$)u-rOUrAfv@g?lKXNl%o_Hud{fff6BKet~4_2N+G`&Z_VMQ($$9&S+Wt| z9Ll9$Ml*%NV0nDS{0Z@)06!2HaM2vX!Z-f%3_pw$vjiYUk0|A8`^KNVqjrc&d{2VY zs(x05+;wDq$$OP=YS%}6Eu
x_a_xqD17NLsq*4en6c2nQN-yi|JFxsYOqONtq1*V&4g*l2=a zcHk0Cbeo>)s>wy}8pFp@G%aSteXRB7gDja@s@SWbF^{V#G%wqn;9p(=^4Y)=c;` zSc{Agl}u+oy1^Ksk%%XPnrB7&o{}21&f{YkAWyEErx&j<4Bg{%ey?nJ!kJ1#JQyXc zbo9^jT>p!|HvI2&)mz%ouM#aU$@=_6HZX=abIDHoxnI9ad|Fh`byJg3?H4pUG#khc zIm$z2(KovVvK7<-bezOK=S$7J&pS1NFyt`eLCY)&H#WStF%nSxeu~Y$U_|Yj0HJL! zruiX&$MfdQTXeSlU^0u$Fd+u_kiA&ex2VbFbRXRlR0|;Nm1~ zO*T-Q3+g*Uy}pSuxS}&dktU}Ybbf$rxk#1qDgfJj-#*WLfyNqNg8p;Ff~$T6P)RnU zyGvxMS{FLlm)eUO+8tFi{#T6r<>BV@ZGV;()h%YNzc(%SLz%zu75WGRrV>U!nrK%x zM%(2<`3QG+=`)?^t*hU|M;@DD7n&FTPNIU<(YO{`{_>yoZ@(Vq=KaQ?eSUBn|8KF0 zc!rfO@OUlDHqI@bmbwzXarosTh}^Y>$&7ir2}PV7wU!yCt0qG%a)hWf86tvbg+d)9 zE5EDBL}^%9pgqxakKY!k7%j6Ll8URn0Ku)Luvim``JE}e9WpoRd03Z)*dHL6^hod0 zdQVL8)PAe)bn7BTf9aDh##U+@j*%aa&TAy`-wYohU0_}P zy1}RapZWhg<`De%?-PH5`sTd$`a94gL!4qKOAVv)kH)Pb;L$lBjB}T<@2WoK)noeW zI9PnIo(g@{FFH|-UMHTKOJXIKL$UIQtK0l(eV^ix*c;!JR~H*^yLThcQcYqK+XTuA zpVQd)ltW|G{9aBUjMGbLuk%#S7qxHLheatY`qZ;b1d1Y`B=RPUh|I2Xqn1cjldKl4 zM)b8Ihl}l3I!_sK`>tazNqTw2gp0+%JnnYF35=iw4j2Y`gP(Ao{K%${r-jMs&k>%l zM!)af$MdX~8y_o@&vm=jwS7w@ghklFJ=F<>0G>(mB&|BCMJ+BcbS+fgaKJk{*m~XLows*2(VB!{j>%lcQ?X3uJ`^AUl#G2YM@dh3 z1Eoha-cRG)UB|c&{R5oDfhrT%&8(ZvRY2k&Ktv50NBLt)FDYw;|3E@L)ogDyDx7rTao14=3EO?O|Bf0zgSKGewG6 ztY7^lz=(cCT-)w4qB%LL<{@w}KD!L}5G*gA_YK0xd~&m7FdNH+H7$u5F1CL#uDX)b z3@RMz#oTRfE$txWf&Ra5`*6M&H7PP2L+CY6H~d41yj0!yc-g9FA!Nb%M3A?_2(!QTrSGw=G`VqT5Nmn zP7j4rKL|D5yL9FfG62kws&AoD)cO)9run!WNX#u~he6`7NK9w~62&yEtC!Iuh84CO zzc(g&^EIhW2+bp`sX$XaFivXZ@RQYz*r2rw(q{gesR%b*{v0Cpi<9aw%QuYfIQ-Nt zzw5g@2{%jhmQ=&)ZfF6YceH<%_zy2XOIUEiBeYdJ@EPP~#&`8BFv=fo*GAQ)CLurE zZXbE1CXM}@D)05V_vEdRR*7VKFw~M3=l=BX zOnXLvnI9#gib2wvAJqb)=|akOE*;6E_P#UcO9dF*ezEeK!F}O8x7TNJ6uv{b?jwW( z(0{V6dLN@XC$FLKm&r(Z`NuHUys#7pP^<_(lB;trrU!9Fz7Z=9bkD~1E<>YV?@ z5Sz@xPlkS);QAoC(7DTJT_!6p7D&epWdhsD=gcfuQ@tiX)*0Asbf3oUIQO9Wa>i~< zmM#I$W70<_G05BT5m${uf}g?AL6-iNdSQa+Y0=l$bZIfXi)HrS)SRVy-x0PxiI*5| z5;kB5C6yXX?(=f?SlYgH3MOlDaT8A z9|a+-Z*^fRDdp4Hr4}G&k4@(-o|UP&ej40jzKIy4VA)BKrlz4us=lO#C4EOpd(*7` zCFg|g?L!c^+r3z!WYS9GM6Mh4Bc9$Zk2qDSJ7=?*qj(VTV``AKAZ#@Nv;&@ z9&zodUJUOxc|koJR{PeYrP78oVYcn*q+5|TT@6X~wH$Z0+y|+*NXsHWdq}L4kJ9B5 z9sl`Cg20l4NHxKONOGn-bBeWCnkv>9RUJ&M6S272hF`{XB!ASK5G zFylQ-iOGh~gC&t;4{POnar=yIkUA;)BMm7WQnN2&{oSYu-L|*EPMvNKEE5*@`o}k_}9G|`z`30r?E+*wL2oSG!zjrP# z(d&w7uB-iSQEwwuvdx_W4N|off+P{ds?7(+|Jo3-FkOQk-?2`n?arDoE8);reKXlD zruj#R;yqal-MI}??_X`UVWg5dTSLiAyf+CqFbX@>oGs^dmZ&IY@;{oMh=f=%mh~1l z`87ln!-6sFnj?NZw0s92`v~uk(DW(fi2IyRJLA+d!Xu4A1({0to{p<*(}@f1`OR$M za^_ZqvhU5`In9v!MUN_DpBnppdnOR{!&3hj~vHKNH9 z^Qj2g5g@(3Vpw;p?zC#SN3>002o9I_K|zGX2Yk z!?v87rrjr56Hg*VnB^KFHynIlKI1obZDKUum-saR9&He%a4)<5xY=76gId*5+~UKs zdACQ<=0Zz+yB>Wsz@=`{?(g<}6Tjg3btws{`cn-p08QE5QbNCq_4(=7qWpbkB`pUq z`VP~{wd+O&D!%nECfiprB(U~I=vu(TCpfuQ{o40sd}btqH$oRh~iB8#o6l@tW7vF#uFv#&<5Y#;YKtFyfQs z^4;*;baHf}+{rr`<#VOsA0B_Eu8mP-nQkv@)rDV|1J>i2RWnkXAsHDAD_NRdG>ut? z&TPuPz`H)X{vc1H;7Q$4n<_up$K4+Lc~J|8>ANKN)~X;{jgZA6x|*Tqx4S$~Xmw9E z!Pf(PI^Wc^FF<6sF&V?3UwLaXR=(H>nA112En9HK73LSA^^EPyCulo0GF-W$JWp|g zsL9;(A>=Lr&YLV!O+daWiBjF5ly>CT>+$|t`~tEzZ!^TAFu&E?oi$IRhdcbe^lX4m z>}k;Dv5bBHzyGWM_^1E)`(%cXd6+L3!#}GglwyG;V9Lc*pQE`2uQo2X>b=1WS9(yw za=qjXwU`sB*63Pi zA`g8_*LZsfk{lmQh8}zt-9Ubd(z%nNmlFkP4W+Gbx|dz#L>T*Is+)@q;BXz6hY=i< zt=xqO7`0u`Jr}t=QTHF$jADgF#8XV2CktXtW^crBFNjy_eS+TUfApWz|9|(rG;}{X ztqtmsfpT5j7)BO2J7@?cZt(Q-?Jp>ET1cVV;f^VTGOf-DJZR7fNS6C_Y9`2M2r z5t`4;km!Zb>rSuw({7kU_R}6TKz~^nXEE!p!f#;R33?;LK6b(cInS=W^wn!6Mf-#`6T{ zZX@ut@e}SvUlJ(6z|aAvg{&~xwWR$?8T=`^my=^uiX&zo;m;J$XX{|F7ZY!}hbi4C z&7VzvNm_m$oN_q51x{E1l)uR?N)zM|p4a0Jw-Ij{N+QOmE5~LPuw3nkX_b1gVVcIfI)?3lsV?wz#H44?mbf|NNw*KHVoRpjgLaqHd(PsVLY)H*k$M*a30gqTL{ z*+G2j66Lq=!=Q)9_bJl^AblGW+*`S);KV+PhNotSuCN^b`T%{Uk0vsAkIcG-MXc+I z_jR?I8Qsa<5S&h}mq~rDXI~GLT+#`)`vkLu8v`XzS`PVDXU9`MDABK|WsUbu7Aj}x zp2i?455h%mi}$H`bjrniElCrZzt;CulCAE=2v0af&|+Wl^%V~j66`uLe--65P=W*y z3c}Eksi4*yOmUU*USVpKu{A5J;3B(m76~x_AOj`a>;%H+&flW=Wr*nAo%y$=zSI&w zN)3iaLOS^dwHV#ex?X60=cvcBSJ)Z;YYpW4zFR%}z9|0n4m;BCUd}Ic9@xGGR(Acp z#RX_J#bXg%t?ZH+V>R~~Ak!I4zwWSo2!lafa58c3%>ki%yRaD){?Y1@=}xzqB3j>- zmp|kB>uAlu8#nei2am1IDkXK?C>zBQEg7Np-^_Pf{7S~|q}_!96v4?zrKFB|>f^*J zgA7Pp=&yd`==kIh^Xn_Aa7(vfh+Y0dLm$%d+7I9n7nG7?1zIsRD6CwXYZQ8}=O*H1 z-=+^jNgQSlLoQ+F-RWd|Z8V?R_6oEo;b(H?3a*|xh;KI~Xy>*SkX@`5?V_C+W*}FU z8@)Of%Ktk;iQii?S8BsAez&i(^el@i zk~>lJs$0eL-~Mm@$3Okw7%8x0pCnqRbOGt)-Kar{@w?S%<&*hxGxOVFdH$WB!+Wqp ziy#xwAweEGNYiDCzL30CI?wh$mP~Ax)VvmR)Q6b-+!>4&A9$3Z+&NbB*cMz;*Hv<& zV!B`}rHXI+`AUN`-xzLsw{mz;D$1iXH?D433(=3EVNiYYF|~0~Hxu`$|*VD-c>=}uU7+k2?|n*dKhu)pA?I7u^k z+J{9{(v4a^E#`^Z(gE5P+Z-AyB_6Oq5L>{i5;P!rhFJ(aJBo2=| z;gm*_RWJaWoP;}x31-swDiR_H?WKp;q?y4-KJYLXNdwrWjR7D>Af>t~ev?`3Kdl6} z$Je=?VQhh6CD~kmXMma*Ik6*+>yuiiO>1JAcbl2XxuhA4$>(sCB6YC0Nr2h;UP#G) zJjU|$4I74J7#f+FY>f9}edinfnRbENo0auwZ6KVkyC6&qZC?0q!2j=es{i+@2SC$6 z>Y$$|mXVn$rd~9h_)hHm;u-oEYzmuL4P27vlr40bsyb=S@?!1KP2I3E z#dH@}w30oytp&o1E%2FGCmF3~;;K5h-lVZnT`mn&k#4xt1|_iCnKrw#gRBTP75wkON6p4PNX z9EQ@LSvX@msv(RRr6Sw}*K8vkgFKGFWLK#FEeMYDwP{y$+b1-2)+>?Nw*N@;OAE&P zz*rj-Ir?=S-gXyOSnJhtu6zbTviZ0j#VE3&Id~6|lGLJqn^aV82hnTN7v_){8J$-E zU7U2W&CuyGL+?|)^gNw1wsxnZm_Bd?Utx=&Yz3&4+o?ICA!Y)G@wVDwcu)9XY2@Sm zy`jTgK+r)+zlP_B=IrITl=dLoSIfQk$s)buhMhV_kn4lt>2EcYR=<@*BW&L4soeOQ z>EtUgqCiy3)CUf1?iU=B;rePGEOYLBq=qI30|K>NfD<5wv|5+yPmIKt-$U2fsYvVS z_BCjbQPS(VvFadykyKfoF}~Hr_B+<^+2-aH+qE?$LK)!}bO3&8;>V?}(QK^Dk}*3@ z!VZPMcS&O33($Ku5D@lWRY0_~8!`aSmeUROx(D#H28erRvOlbvs)^4+Fxxiw*BJM8 zu?Rh44B1DCJH@4sQE68w>E&{qf~Z;Iy{3(tS!&P`n|K3$1Lkq-iEK}mVuP=y*cQOI z*rnlBv2zP<%b{7e`9U4Wpl{(1^ISdS7okpRWqV5;W?ioh!T{2xvz^?Z>x2BHy|i9l z`&y!)9Lki>keuif7%rqCx;N_cNi1^6$CoEroFBci<|cdVz6o|xJMQC&S1-06z=kAQ zzvb*{es60XgV={*rHXYnBF3RBXm=omllgQ@W|Wo;xrgxsxU2ZS^P7lEy;;rjrLXP!rh;azl6OpVI|KewTP<3)} zb$`tY@f(h-jJ(lE9^240{HHj7D1n682L~PbtLhgUl-%MPSo2-m4@P|xdRA4JzLV*6 z`WuTxPv^-`28BOG4lS<8_bkB(rx`n7{UJPE&%K@SZ{5gmjY8gyJeH*h>Z4dHg(OKL zy&e^Y6EX|BdnR<#jrnc9IR|JsdW1*EXUy=rk0 z`cdMkp09%Pn*MkH;?D;DCy?Jz{vFy=3V7pg>Q1g%nwLYj(wau7Rr%F64MVy0J#DPd zpDubYg3yUgr8%CeCha~n`sxhg$>%>cMzl`&I|jl8=&!_zXJ~Q|8Yp{zhG;-W(5UW)h`MB;b!HcNmt-J1|52ZH9x%xX zZR<_5;*aYoy7U(Ua=7 z=a&=@t<*Q52D5g$<~#4KjTp(OsmMGD@OF$*kY`(Ag~ypROId)*VpJf z9OlpSdY(jJt=0I7ezX2<0R2zBA3V#t=4P^wAGlSQc|PI@5*DSaP)> zp(Y<)BCRoWxjbztz4%6|ct<2LUgVwMN51t~f5GAq4LRQKg`6pSkz;`hl( zSCV%cDZjThdyN{I!z2PPXtN(_jT#X@B7kj#A69adr3;6ghf*t zrpMIMLh10>z0C4`VTEaR*L@wcI&jV>e;G;aKOCsqz}3cX6vH=@d`C1nM~aF>oVV8KNI}l{tx}j>LZ;)imeM36HW5QbEN9(4Gt?mE%NtzSCb+i4OHQ#e2Vp? z_=}M+HfO^P5{c$~*&53LNvIOu>4hydI3BlqJ&9=t5Ei}h%Fm<4PL_dfc3T~Ebj@%4 zPH+FoKkfJ*$DzGd5czjMKTmHhKu9Ig7$v5^v9`y{9Ws<5vtvRVVvr<%+Zt`+iPQxx zHhL${%HW>8TIYd57A(i7kc%83}5>H%gOyKYt6g*CS>dHb2QM;_{or`PJVb$$U+(!;K@mhLoS2eS1Ey{qNI* z@T+uiFiOwkZMdc8Uw@al$2+_Uqu|erlb$s?U+$)3;Yx^aZMWnplq<`Kgt=tK=`_p#^suprqJ^w_a4cp(9gK49DuK|M= zJ(2huHHk$d@>`*ZCW(R9OT`<>wjpI-6}dD&G5-SI*+b#SCnMDpVbmwzu1k9B

#K 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

X&0}KkD$&P=sDLet(4GUM??(#!6Y~`W||A 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

5O8AG_nE{~=V^;UzU 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

_z54a*EoX~kN!kNL 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

^;o4Mqc%2)VpkMoBC^FBGrr%YOjU(3Bp=PM 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 z