bfg-common 1.5.47 → 1.5.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/assets/img/icons/icons-sprite-dark-3.svg +227 -227
  2. package/assets/img/icons/icons-sprite-dark-5.svg +488 -488
  3. package/assets/img/icons/icons-sprite-light-3.svg +227 -227
  4. package/assets/img/icons/icons-sprite-light-5.svg +488 -488
  5. package/assets/localization/local_be.json +1 -0
  6. package/assets/localization/local_en.json +1 -0
  7. package/assets/localization/local_hy.json +1 -0
  8. package/assets/localization/local_kk.json +1 -0
  9. package/assets/localization/local_ru.json +1 -0
  10. package/assets/localization/local_zh.json +1 -0
  11. package/components/common/browse/blocks/lib/models/types.ts +1 -1
  12. package/components/common/browse/lib/models/interfaces.ts +5 -5
  13. package/components/common/diagramMain/adapter/AdapterItems.vue +61 -61
  14. package/components/common/diagramMain/lib/config/initial.ts +50 -50
  15. package/components/common/diagramMain/lib/models/types.ts +21 -21
  16. package/components/common/diagramMain/lib/utils/utils.ts +331 -331
  17. package/components/common/diagramMain/modals/editSettings/ConfirmTeamingSettingsModal.vue +40 -40
  18. package/components/common/diagramMain/modals/editSettings/tabs/NetworkProperties.vue +214 -214
  19. package/components/common/diagramMain/modals/editSettings/tabs/Security.vue +189 -189
  20. package/components/common/diagramMain/modals/editSettings/tabs/SwitchProperties.vue +163 -163
  21. package/components/common/diagramMain/modals/editSettings/tabs/TeamingFailover.vue +175 -175
  22. package/components/common/diagramMain/modals/editSettings/tabs/port/IpvFourSettings.vue +346 -346
  23. package/components/common/diagramMain/modals/editSettings/tabs/port/PortProperties.vue +205 -205
  24. package/components/common/diagramMain/modals/lib/config/initial.ts +180 -180
  25. package/components/common/diagramMain/modals/lib/config/vmKernelAdapter.ts +90 -90
  26. package/components/common/diagramMain/modals/lib/mappers/mappers.ts +87 -87
  27. package/components/common/diagramMain/modals/lib/utils/index.ts +24 -24
  28. package/components/common/diagramMain/modals/migrateVmkernelAdapter/lib/config/steps.ts +114 -114
  29. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/ConnectionSettings.vue +169 -169
  30. package/components/common/diagramMain/modals/migrateVmkernelAdapter/steps/SelectVmkernelAdapter.vue +159 -159
  31. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common.ts +14 -14
  32. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/connectionSettings.ts +137 -137
  33. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/selectVmkernelAdapter.ts +52 -52
  34. package/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/validations.ts +19 -19
  35. package/components/common/diagramMain/port/Ports.vue +47 -47
  36. package/components/common/mainNavigationPanel/MainNavigationPanelNew.vue +9 -0
  37. package/components/common/monitor/advanced/tools/chartOptionsModal/counters/table/lib/config/utils.ts +1040 -1040
  38. package/components/common/split/horizontal/HorizontalNew.vue +4 -4
  39. package/package.json +2 -2
  40. package/plugins/recursion.ts +17 -3
@@ -1,14 +1,14 @@
1
- export const isIntegerNumberInRange = (
2
- value: number | string | undefined,
3
- down: number,
4
- up: number
5
- ): boolean =>
6
- isNaN(Number(value)) ||
7
- Number(value) < down ||
8
- Number(value) > up ||
9
- Number(value) !== Math.round(Number(value))
10
-
11
- export const checkVlanId = (vlanId: string): boolean =>
12
- vlanId !== 'None (0)' &&
13
- vlanId !== 'All (4095)' &&
14
- (isIntegerNumberInRange(vlanId, 0, 4095) || vlanId === '')
1
+ export const isIntegerNumberInRange = (
2
+ value: number | string | undefined,
3
+ down: number,
4
+ up: number
5
+ ): boolean =>
6
+ isNaN(Number(value)) ||
7
+ Number(value) < down ||
8
+ Number(value) > up ||
9
+ Number(value) !== Math.round(Number(value))
10
+
11
+ export const checkVlanId = (vlanId: string): boolean =>
12
+ vlanId !== 'None (0)' &&
13
+ vlanId !== 'All (4095)' &&
14
+ (isIntegerNumberInRange(vlanId, 0, 4095) || vlanId === '')
@@ -1,137 +1,137 @@
1
- import type { UI_I_ConnectionSettings } from '~/components/common/wizards/network/add/lib/models/interfaces'
2
- import type { UI_I_MigrateVmkernelAdapterEmits } from '~/components/common/diagramMain/lib/models/interfaces'
3
- import type { UI_I_Localization } from '~/lib/models/interfaces'
4
- import type {
5
- UI_I_AsyncCheckReturn,
6
- UI_I_ValidationReturn,
7
- UI_I_WizardStep,
8
- } from '~/components/atoms/wizard/lib/models/interfaces'
9
- import { UI_E_MigrationValidationFields } from '~/components/common/diagramMain/lib/models/enums'
10
- import type Wizard from '~/components/atoms/wizard/lib/utils/utils'
11
- import { checkVlanId } from '~/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common'
12
-
13
- export const validateVlanIdConnectionSettingsLocal = (
14
- localization: UI_I_Localization,
15
- data: UI_I_ConnectionSettings,
16
- wizard: Wizard
17
- ): void => {
18
- wizard.validateFieldLocal(
19
- 1,
20
- UI_E_MigrationValidationFields.CONNECTION_SETTINGS_VLAN,
21
- checkVlanId(data.vlanId),
22
- localization.common.vlanIdInvalidMessage,
23
- localization.common.vlanIdInvalidMessage
24
- )
25
- }
26
-
27
- export const validateNetworkConnectionSettingsLocal = (
28
- localization: UI_I_Localization,
29
- data: UI_I_ConnectionSettings,
30
- wizard: Wizard
31
- ): void => {
32
- wizard.validateFieldLocal(
33
- 1,
34
- UI_E_MigrationValidationFields.CONNECTION_SETTINGS_NETWORK,
35
- data.networkLabel === '',
36
- localization.common.networkLabelInvalidMessage,
37
- localization.common.networkLabelInvalidMessage
38
- )
39
- }
40
-
41
- export const checkConnectionSettingsSync = (
42
- localization: UI_I_Localization,
43
- data: UI_I_ConnectionSettings,
44
- wizard: Wizard,
45
- value: UI_I_WizardStep[]
46
- ): UI_I_ValidationReturn => {
47
- let stepHasError = false
48
-
49
- if (checkVlanId(data.vlanId)) {
50
- stepHasError = wizard.setValidation(
51
- 1,
52
- UI_E_MigrationValidationFields.CONNECTION_SETTINGS_VLAN,
53
- {
54
- fieldMessage: localization.common.vlanIdInvalidMessage,
55
- alertMessage: localization.common.vlanIdInvalidMessage,
56
- }
57
- )
58
- } else if (
59
- wizard.hasMessage(
60
- 1,
61
- UI_E_MigrationValidationFields.CONNECTION_SETTINGS_VLAN
62
- )
63
- ) {
64
- value = wizard.removeValidation(
65
- 1,
66
- UI_E_MigrationValidationFields.CONNECTION_SETTINGS_VLAN,
67
- value
68
- )
69
- }
70
-
71
- return {
72
- newValue: value,
73
- stepHasError,
74
- }
75
- }
76
-
77
- const checkNetwork = async (
78
- label: string,
79
- localization: UI_I_Localization,
80
- emits: UI_I_MigrateVmkernelAdapterEmits
81
- ): Promise<UI_I_AsyncCheckReturn> => {
82
- if (label) {
83
- return new Promise((resolve, _reject) =>
84
- emits('check-network-label', label, (message: string) => {
85
- if (message === '') {
86
- resolve({
87
- isValid: true,
88
- message: '',
89
- })
90
- }
91
-
92
- if (message !== '') {
93
- resolve({
94
- isValid: false,
95
- message,
96
- })
97
- }
98
- })
99
- )
100
- } else {
101
- return {
102
- isValid: false,
103
- message: localization.common.networkLabelInvalidMessage,
104
- }
105
- }
106
- }
107
-
108
- export const checkNetworkAsync = async (
109
- value: UI_I_WizardStep[],
110
- label: string,
111
- stepId: number,
112
- fieldName: string,
113
- emits: UI_I_MigrateVmkernelAdapterEmits,
114
- localization: UI_I_Localization,
115
- wizard: Wizard
116
- ): Promise<UI_I_ValidationReturn> => {
117
- let stepHasError = false
118
-
119
- const labelValidation: {
120
- isValid: boolean
121
- message: string
122
- } = await checkNetwork(label, localization, emits)
123
-
124
- if (!labelValidation.isValid) {
125
- stepHasError = wizard.setValidation(stepId, fieldName, {
126
- fieldMessage: labelValidation.message,
127
- alertMessage: labelValidation.message,
128
- })
129
- } else if (wizard.hasMessage(stepId, fieldName)) {
130
- value = wizard.removeValidation(stepId, fieldName, value)
131
- }
132
-
133
- return {
134
- newValue: value,
135
- stepHasError,
136
- }
137
- }
1
+ import type { UI_I_ConnectionSettings } from '~/components/common/wizards/network/add/lib/models/interfaces'
2
+ import type { UI_I_MigrateVmkernelAdapterEmits } from '~/components/common/diagramMain/lib/models/interfaces'
3
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
4
+ import type {
5
+ UI_I_AsyncCheckReturn,
6
+ UI_I_ValidationReturn,
7
+ UI_I_WizardStep,
8
+ } from '~/components/atoms/wizard/lib/models/interfaces'
9
+ import { UI_E_MigrationValidationFields } from '~/components/common/diagramMain/lib/models/enums'
10
+ import type Wizard from '~/components/atoms/wizard/lib/utils/utils'
11
+ import { checkVlanId } from '~/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/common'
12
+
13
+ export const validateVlanIdConnectionSettingsLocal = (
14
+ localization: UI_I_Localization,
15
+ data: UI_I_ConnectionSettings,
16
+ wizard: Wizard
17
+ ): void => {
18
+ wizard.validateFieldLocal(
19
+ 1,
20
+ UI_E_MigrationValidationFields.CONNECTION_SETTINGS_VLAN,
21
+ checkVlanId(data.vlanId),
22
+ localization.common.vlanIdInvalidMessage,
23
+ localization.common.vlanIdInvalidMessage
24
+ )
25
+ }
26
+
27
+ export const validateNetworkConnectionSettingsLocal = (
28
+ localization: UI_I_Localization,
29
+ data: UI_I_ConnectionSettings,
30
+ wizard: Wizard
31
+ ): void => {
32
+ wizard.validateFieldLocal(
33
+ 1,
34
+ UI_E_MigrationValidationFields.CONNECTION_SETTINGS_NETWORK,
35
+ data.networkLabel === '',
36
+ localization.common.networkLabelInvalidMessage,
37
+ localization.common.networkLabelInvalidMessage
38
+ )
39
+ }
40
+
41
+ export const checkConnectionSettingsSync = (
42
+ localization: UI_I_Localization,
43
+ data: UI_I_ConnectionSettings,
44
+ wizard: Wizard,
45
+ value: UI_I_WizardStep[]
46
+ ): UI_I_ValidationReturn => {
47
+ let stepHasError = false
48
+
49
+ if (checkVlanId(data.vlanId)) {
50
+ stepHasError = wizard.setValidation(
51
+ 1,
52
+ UI_E_MigrationValidationFields.CONNECTION_SETTINGS_VLAN,
53
+ {
54
+ fieldMessage: localization.common.vlanIdInvalidMessage,
55
+ alertMessage: localization.common.vlanIdInvalidMessage,
56
+ }
57
+ )
58
+ } else if (
59
+ wizard.hasMessage(
60
+ 1,
61
+ UI_E_MigrationValidationFields.CONNECTION_SETTINGS_VLAN
62
+ )
63
+ ) {
64
+ value = wizard.removeValidation(
65
+ 1,
66
+ UI_E_MigrationValidationFields.CONNECTION_SETTINGS_VLAN,
67
+ value
68
+ )
69
+ }
70
+
71
+ return {
72
+ newValue: value,
73
+ stepHasError,
74
+ }
75
+ }
76
+
77
+ const checkNetwork = async (
78
+ label: string,
79
+ localization: UI_I_Localization,
80
+ emits: UI_I_MigrateVmkernelAdapterEmits
81
+ ): Promise<UI_I_AsyncCheckReturn> => {
82
+ if (label) {
83
+ return new Promise((resolve, _reject) =>
84
+ emits('check-network-label', label, (message: string) => {
85
+ if (message === '') {
86
+ resolve({
87
+ isValid: true,
88
+ message: '',
89
+ })
90
+ }
91
+
92
+ if (message !== '') {
93
+ resolve({
94
+ isValid: false,
95
+ message,
96
+ })
97
+ }
98
+ })
99
+ )
100
+ } else {
101
+ return {
102
+ isValid: false,
103
+ message: localization.common.networkLabelInvalidMessage,
104
+ }
105
+ }
106
+ }
107
+
108
+ export const checkNetworkAsync = async (
109
+ value: UI_I_WizardStep[],
110
+ label: string,
111
+ stepId: number,
112
+ fieldName: string,
113
+ emits: UI_I_MigrateVmkernelAdapterEmits,
114
+ localization: UI_I_Localization,
115
+ wizard: Wizard
116
+ ): Promise<UI_I_ValidationReturn> => {
117
+ let stepHasError = false
118
+
119
+ const labelValidation: {
120
+ isValid: boolean
121
+ message: string
122
+ } = await checkNetwork(label, localization, emits)
123
+
124
+ if (!labelValidation.isValid) {
125
+ stepHasError = wizard.setValidation(stepId, fieldName, {
126
+ fieldMessage: labelValidation.message,
127
+ alertMessage: labelValidation.message,
128
+ })
129
+ } else if (wizard.hasMessage(stepId, fieldName)) {
130
+ value = wizard.removeValidation(stepId, fieldName, value)
131
+ }
132
+
133
+ return {
134
+ newValue: value,
135
+ stepHasError,
136
+ }
137
+ }
@@ -1,52 +1,52 @@
1
- import type { UI_I_SelectVmkernelAdapter } from '~/components/common/wizards/network/add/lib/models/interfaces'
2
- import type { UI_I_Localization } from '~/lib/models/interfaces'
3
- import type { UI_I_WizardStep, UI_I_ValidationReturn } from '~/components/atoms/wizard/lib/models/interfaces'
4
- import { UI_E_MigrationValidationFields } from '~/components/common/diagramMain/lib/models/enums'
5
- import type Wizard from '~/components/atoms/wizard/lib/utils/utils'
6
-
7
- export const validateSelectedVmLocal = (
8
- localization: UI_I_Localization,
9
- data: UI_I_SelectVmkernelAdapter,
10
- wizard: Wizard
11
- ): void => {
12
- wizard.validateFieldLocal(
13
- 0,
14
- 'vm',
15
- data.vm === '',
16
- '',
17
- localization.common.noVmKernelNetworkAdapterSelectedForMigration
18
- )
19
- }
20
-
21
- export const checkSelectedVmSync = (
22
- localization: UI_I_Localization,
23
- data: UI_I_SelectVmkernelAdapter,
24
- wizard: Wizard,
25
- value: UI_I_WizardStep[]
26
- ): UI_I_ValidationReturn => {
27
- let stepHasError = false
28
-
29
- if (data.vm === '') {
30
- stepHasError = wizard.setValidation(
31
- 0,
32
- UI_E_MigrationValidationFields.SELECT_ADAPTER_VM,
33
- {
34
- fieldMessage: '',
35
- alertMessage: localization.common.noVmKernelNetworkAdapterSelectedForMigration,
36
- }
37
- )
38
- } else if (
39
- wizard.hasMessage(0, UI_E_MigrationValidationFields.SELECT_ADAPTER_VM)
40
- ) {
41
- value = wizard.removeValidation(
42
- 0,
43
- UI_E_MigrationValidationFields.SELECT_ADAPTER_VM,
44
- value
45
- )
46
- }
47
-
48
- return {
49
- newValue: value,
50
- stepHasError,
51
- }
52
- }
1
+ import type { UI_I_SelectVmkernelAdapter } from '~/components/common/wizards/network/add/lib/models/interfaces'
2
+ import type { UI_I_Localization } from '~/lib/models/interfaces'
3
+ import type { UI_I_WizardStep, UI_I_ValidationReturn } from '~/components/atoms/wizard/lib/models/interfaces'
4
+ import { UI_E_MigrationValidationFields } from '~/components/common/diagramMain/lib/models/enums'
5
+ import type Wizard from '~/components/atoms/wizard/lib/utils/utils'
6
+
7
+ export const validateSelectedVmLocal = (
8
+ localization: UI_I_Localization,
9
+ data: UI_I_SelectVmkernelAdapter,
10
+ wizard: Wizard
11
+ ): void => {
12
+ wizard.validateFieldLocal(
13
+ 0,
14
+ 'vm',
15
+ data.vm === '',
16
+ '',
17
+ localization.common.noVmKernelNetworkAdapterSelectedForMigration
18
+ )
19
+ }
20
+
21
+ export const checkSelectedVmSync = (
22
+ localization: UI_I_Localization,
23
+ data: UI_I_SelectVmkernelAdapter,
24
+ wizard: Wizard,
25
+ value: UI_I_WizardStep[]
26
+ ): UI_I_ValidationReturn => {
27
+ let stepHasError = false
28
+
29
+ if (data.vm === '') {
30
+ stepHasError = wizard.setValidation(
31
+ 0,
32
+ UI_E_MigrationValidationFields.SELECT_ADAPTER_VM,
33
+ {
34
+ fieldMessage: '',
35
+ alertMessage: localization.common.noVmKernelNetworkAdapterSelectedForMigration,
36
+ }
37
+ )
38
+ } else if (
39
+ wizard.hasMessage(0, UI_E_MigrationValidationFields.SELECT_ADAPTER_VM)
40
+ ) {
41
+ value = wizard.removeValidation(
42
+ 0,
43
+ UI_E_MigrationValidationFields.SELECT_ADAPTER_VM,
44
+ value
45
+ )
46
+ }
47
+
48
+ return {
49
+ newValue: value,
50
+ stepHasError,
51
+ }
52
+ }
@@ -1,19 +1,19 @@
1
- import {
2
- validateVlanIdConnectionSettingsLocal,
3
- validateNetworkConnectionSettingsLocal,
4
- checkConnectionSettingsSync,
5
- checkNetworkAsync,
6
- } from '~/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/connectionSettings'
7
- import {
8
- checkSelectedVmSync,
9
- validateSelectedVmLocal,
10
- } from '~/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/selectVmkernelAdapter'
11
-
12
- export {
13
- validateVlanIdConnectionSettingsLocal,
14
- validateNetworkConnectionSettingsLocal,
15
- checkConnectionSettingsSync,
16
- checkNetworkAsync,
17
- checkSelectedVmSync,
18
- validateSelectedVmLocal,
19
- }
1
+ import {
2
+ validateVlanIdConnectionSettingsLocal,
3
+ validateNetworkConnectionSettingsLocal,
4
+ checkConnectionSettingsSync,
5
+ checkNetworkAsync,
6
+ } from '~/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/connectionSettings'
7
+ import {
8
+ checkSelectedVmSync,
9
+ validateSelectedVmLocal,
10
+ } from '~/components/common/diagramMain/modals/migrateVmkernelAdapter/validations/selectVmkernelAdapter'
11
+
12
+ export {
13
+ validateVlanIdConnectionSettingsLocal,
14
+ validateNetworkConnectionSettingsLocal,
15
+ checkConnectionSettingsSync,
16
+ checkNetworkAsync,
17
+ checkSelectedVmSync,
18
+ validateSelectedVmLocal,
19
+ }
@@ -1,47 +1,47 @@
1
- <template>
2
- <g>
3
- <template v-if="props.network.toggle">
4
- <template v-for="port in props.network.ports" :key="port.id">
5
- <common-diagram-main-port
6
- :network="props.network"
7
- :port="port"
8
- :is-dark-mode="props.isDarkMode"
9
- :selected-port="props.selectedPort"
10
- :selected-adapter="props.selectedAdapter"
11
- @select-port="onSelectPort"
12
- @show-modal="onShowModal"
13
- />
14
- </template>
15
- </template>
16
- </g>
17
- </template>
18
-
19
- <script setup lang="ts">
20
- import type {
21
- UI_I_ModalsInitialData,
22
- UI_I_NetworkFullWithPositions,
23
- UI_I_SelectedAdapter,
24
- UI_I_SelectedPort,
25
- } from '~/components/common/diagramMain/lib/models/interfaces'
26
-
27
- const props = defineProps<{
28
- network: UI_I_NetworkFullWithPositions
29
- selectedPort: UI_I_SelectedPort
30
- selectedAdapter: UI_I_SelectedAdapter
31
- isDarkMode: boolean
32
- }>()
33
-
34
- const emits = defineEmits<{
35
- (event: 'select-port', networkId: string, portId: string): void
36
- (
37
- event: 'show-modal',
38
- value: string,
39
- properties?: UI_I_ModalsInitialData
40
- ): void
41
- }>()
42
-
43
- const onSelectPort = (networkId: string, portId: string) =>
44
- emits('select-port', networkId, portId)
45
- const onShowModal = (value: string, properties?: UI_I_ModalsInitialData) =>
46
- emits('show-modal', value, properties)
47
- </script>
1
+ <template>
2
+ <g>
3
+ <template v-if="props.network.toggle">
4
+ <template v-for="port in props.network.ports" :key="port.id">
5
+ <common-diagram-main-port
6
+ :network="props.network"
7
+ :port="port"
8
+ :is-dark-mode="props.isDarkMode"
9
+ :selected-port="props.selectedPort"
10
+ :selected-adapter="props.selectedAdapter"
11
+ @select-port="onSelectPort"
12
+ @show-modal="onShowModal"
13
+ />
14
+ </template>
15
+ </template>
16
+ </g>
17
+ </template>
18
+
19
+ <script setup lang="ts">
20
+ import type {
21
+ UI_I_ModalsInitialData,
22
+ UI_I_NetworkFullWithPositions,
23
+ UI_I_SelectedAdapter,
24
+ UI_I_SelectedPort,
25
+ } from '~/components/common/diagramMain/lib/models/interfaces'
26
+
27
+ const props = defineProps<{
28
+ network: UI_I_NetworkFullWithPositions
29
+ selectedPort: UI_I_SelectedPort
30
+ selectedAdapter: UI_I_SelectedAdapter
31
+ isDarkMode: boolean
32
+ }>()
33
+
34
+ const emits = defineEmits<{
35
+ (event: 'select-port', networkId: string, portId: string): void
36
+ (
37
+ event: 'show-modal',
38
+ value: string,
39
+ properties?: UI_I_ModalsInitialData
40
+ ): void
41
+ }>()
42
+
43
+ const onSelectPort = (networkId: string, portId: string) =>
44
+ emits('select-port', networkId, portId)
45
+ const onShowModal = (value: string, properties?: UI_I_ModalsInitialData) =>
46
+ emits('show-modal', value, properties)
47
+ </script>
@@ -236,6 +236,15 @@ const localization = computed<UI_I_Localization>(() => useLocal())
236
236
  padding: 0 12px 12px;
237
237
  height: inherit;
238
238
 
239
+ &::-webkit-scrollbar-track,
240
+ &::-webkit-scrollbar-corner {
241
+ background: var(--nav-content-scrollbar-track-corner-thumb);
242
+ }
243
+ &::-webkit-scrollbar-thumb {
244
+ background: var(--nav-content-scrollbar-thumb);
245
+ border: solid 3px var(--nav-content-scrollbar-track-corner-thumb);
246
+ }
247
+
239
248
  .node-tooltip-container {
240
249
  margin-bottom: 4px;
241
250
  }