From 3309391cfb6854707d31fa7b6bac60027213f2fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 3 Jan 2025 13:48:02 +0000 Subject: [PATCH 001/109] chore(web): update PatternFly to latest v5 version As a first step before migrating to PatternFly v6 --- web/package-lock.json | 6 +++--- web/package.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index 24a40993f2..8675d7094b 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -10,9 +10,9 @@ "@date-fns/tz": "^1.1.2", "@icons-pack/react-simple-icons": "^10.0.0", "@material-symbols/svg-400": "^0.27.2", - "@patternfly/patternfly": "^5.1.0", - "@patternfly/react-core": "^5.1.1", - "@patternfly/react-table": "^5.1.1", + "@patternfly/patternfly": "^5.4.2", + "@patternfly/react-core": "^5.4.2", + "@patternfly/react-table": "^5.4.2", "@tanstack/react-query": "^5.49.2", "axios": "^1.7.3", "fast-sort": "^3.4.0", diff --git a/web/package.json b/web/package.json index 4bac7b46d0..5f52d8f4cc 100644 --- a/web/package.json +++ b/web/package.json @@ -107,9 +107,9 @@ "@date-fns/tz": "^1.1.2", "@icons-pack/react-simple-icons": "^10.0.0", "@material-symbols/svg-400": "^0.27.2", - "@patternfly/patternfly": "^5.1.0", - "@patternfly/react-core": "^5.1.1", - "@patternfly/react-table": "^5.1.1", + "@patternfly/patternfly": "^5.4.2", + "@patternfly/react-core": "^5.4.2", + "@patternfly/react-table": "^5.4.2", "@tanstack/react-query": "^5.49.2", "axios": "^1.7.3", "fast-sort": "^3.4.0", From c57edbfcf7db62f858b18b548108b85e4c5f2237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 3 Jan 2025 14:01:37 +0000 Subject: [PATCH 002/109] chore(web): update PatternFly to v6 --- web/package-lock.json | 62 +++++++++++++++++++++---------------------- web/package.json | 6 ++--- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index 8675d7094b..6792531e7f 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -10,9 +10,9 @@ "@date-fns/tz": "^1.1.2", "@icons-pack/react-simple-icons": "^10.0.0", "@material-symbols/svg-400": "^0.27.2", - "@patternfly/patternfly": "^5.4.2", - "@patternfly/react-core": "^5.4.2", - "@patternfly/react-table": "^5.4.2", + "@patternfly/patternfly": "^6.1.0", + "@patternfly/react-core": "^6.1.0", + "@patternfly/react-table": "^6.1.0", "@tanstack/react-query": "^5.49.2", "axios": "^1.7.3", "fast-sort": "^3.4.0", @@ -3948,23 +3948,23 @@ } }, "node_modules/@patternfly/patternfly": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.4.2.tgz", - "integrity": "sha512-+BaokNR8/AmTYMESxby9UtQXPGACg449BXQd0KejAvW/uGxlgO6mY1X1205DeBEHoK3e/vXkYXjvZPpv/tcxSA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-6.1.0.tgz", + "integrity": "sha512-w+QazL8NHKkg5j01eotblsswKxQQSYB0CN3yBXQL9ScpHdp/fK8M6TqWbKZNRpf+NqhMxcH/om8eR0N/fDCJqw==", "license": "MIT" }, "node_modules/@patternfly/react-core": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.4.11.tgz", - "integrity": "sha512-+WgxVnnqiZiASB+zMBA8Z1YuaX32/ehJ8Y4UB+j2xIB/tjvBqKNVn7n4VPy56F+G9nJ92Kv8Tekccau6bL6jFg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.1.0.tgz", + "integrity": "sha512-zj0lJPZxQanXKD8ae2kYnweT0kpp1CzpHYAkaBjTrw2k6ZMfr/UPlp0/ugCjWEokBqh79RUADLkKJJPce/yoSQ==", "license": "MIT", "dependencies": { - "@patternfly/react-icons": "^5.4.2", - "@patternfly/react-styles": "^5.4.1", - "@patternfly/react-tokens": "^5.4.1", + "@patternfly/react-icons": "^6.1.0", + "@patternfly/react-styles": "^6.1.0", + "@patternfly/react-tokens": "^6.1.0", "focus-trap": "7.6.2", - "react-dropzone": "^14.2.3", - "tslib": "^2.7.0" + "react-dropzone": "^14.3.5", + "tslib": "^2.8.1" }, "peerDependencies": { "react": "^17 || ^18", @@ -3972,9 +3972,9 @@ } }, "node_modules/@patternfly/react-icons": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.4.2.tgz", - "integrity": "sha512-CMQ5oHYzW6TPVTs2jpNJmP2vGCAKR/YeTPwHGO9dLkAUej1IcIxtCCWK2Fdo2UJsnBjuZihasyw2b6ehvbUm9Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-6.1.0.tgz", + "integrity": "sha512-V1w/j19YmOgvh72IRRf1p07k+u4M5+9P+o/IxunlF0fWzLDX4Hf+utBI11A8cRfUzpQN7eLw/vZIS3BLM8Ge3Q==", "license": "MIT", "peerDependencies": { "react": "^17 || ^18", @@ -3982,23 +3982,23 @@ } }, "node_modules/@patternfly/react-styles": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.4.1.tgz", - "integrity": "sha512-XA8PXksD8uiA3RTwxdUwJXOCf+V6sVd+2HKapWAdRLvtSV+Sdk7NgCvalb4IAQncsddLopjPQD8gAHA298+N8w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-6.1.0.tgz", + "integrity": "sha512-JQ3zIl5SFiSB0YWVYibcUwgZdsp6Wn8hkfZ7KhtCjHFccSDdJexPOXVV1O9f2h4PfxTlY3YntZ81ZsguBx/Q7A==", "license": "MIT" }, "node_modules/@patternfly/react-table": { - "version": "5.4.12", - "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.4.12.tgz", - "integrity": "sha512-ZpW/49bWR9JkZCyBGBCbHNdJt0Vn34g5BaXlVF/P7Tl0WPdxFLWS5EQywiXEhu8qoOhz3uGcyGwACCJCvmqCSg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-6.1.0.tgz", + "integrity": "sha512-eC8mKkvFR0btfv6yEOvE+J4gBXU8ZGe9i2RSezBM+MJaXEQt/CKRjV+SAB5EeE3PyBYKG8yYDdsOoNmaPxxvSA==", "license": "MIT", "dependencies": { - "@patternfly/react-core": "^5.4.11", - "@patternfly/react-icons": "^5.4.2", - "@patternfly/react-styles": "^5.4.1", - "@patternfly/react-tokens": "^5.4.1", + "@patternfly/react-core": "^6.1.0", + "@patternfly/react-icons": "^6.1.0", + "@patternfly/react-styles": "^6.1.0", + "@patternfly/react-tokens": "^6.1.0", "lodash": "^4.17.21", - "tslib": "^2.7.0" + "tslib": "^2.8.1" }, "peerDependencies": { "react": "^17 || ^18", @@ -4006,9 +4006,9 @@ } }, "node_modules/@patternfly/react-tokens": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.4.1.tgz", - "integrity": "sha512-eygdHE7Krta1mijAv/E8RHiKIgysD0eeNTo8EXUYC8/M4e5K6sqpr2p6rQBF8QiRMN8FnbXvZT3K2OQ28pYt9Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-6.1.0.tgz", + "integrity": "sha512-t1UcHbOa4txczTR5UlnG4XcAAdnDSfSlCaOddw/HTqRF59pn2ks2JUu9sfnFRZ8SiAAxKRiYdX5bT7Mf4R24+w==", "license": "MIT" }, "node_modules/@pkgr/core": { diff --git a/web/package.json b/web/package.json index 5f52d8f4cc..a78be1a182 100644 --- a/web/package.json +++ b/web/package.json @@ -107,9 +107,9 @@ "@date-fns/tz": "^1.1.2", "@icons-pack/react-simple-icons": "^10.0.0", "@material-symbols/svg-400": "^0.27.2", - "@patternfly/patternfly": "^5.4.2", - "@patternfly/react-core": "^5.4.2", - "@patternfly/react-table": "^5.4.2", + "@patternfly/patternfly": "^6.1.0", + "@patternfly/react-core": "^6.1.0", + "@patternfly/react-table": "^6.1.0", "@tanstack/react-query": "^5.49.2", "axios": "^1.7.3", "fast-sort": "^3.4.0", From 725e23da187e75fe9de56c4d8ae22c79582d921d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Wed, 8 Jan 2025 17:56:58 +0000 Subject: [PATCH 003/109] fix(web): migrate EmptyState to PFv6 --- web/src/components/core/EmptyState.tsx | 23 ++++++++++--------- .../components/core/InstallationFinished.tsx | 14 +++++------ web/src/components/core/ServerError.tsx | 19 ++++++--------- web/src/components/layout/Loading.tsx | 10 ++------ 4 files changed, 27 insertions(+), 39 deletions(-) diff --git a/web/src/components/core/EmptyState.tsx b/web/src/components/core/EmptyState.tsx index 49451b9c1f..9237b60aa4 100644 --- a/web/src/components/core/EmptyState.tsx +++ b/web/src/components/core/EmptyState.tsx @@ -23,13 +23,11 @@ import React from "react"; import { EmptyState, - EmptyStateHeader, EmptyStateBody, Stack, EmptyStateFooter, EmptyStateActions, EmptyStateProps, - EmptyStateHeaderProps, } from "@patternfly/react-core"; import { Icon } from "~/components/layout"; import { IconProps } from "../layout/Icon"; @@ -38,7 +36,7 @@ type EmptyStateWrapperProps = { title: string; icon: IconProps["name"]; color?: string; - headingLevel?: EmptyStateHeaderProps["headingLevel"]; + headingLevel?: EmptyStateProps["headingLevel"]; noPadding?: boolean; actions?: React.ReactNode; children?: React.ReactNode; @@ -66,15 +64,18 @@ export default function EmptyStateWrapper({ // @ts-ignore if (noPadding) rest.className = [rest.className, "no-padding"].join(" ").trim(); + const EmptyStateIcon = () => ; + return ( - - } - /> + {children && ( {children} diff --git a/web/src/components/core/InstallationFinished.tsx b/web/src/components/core/InstallationFinished.tsx index 598ed705ca..67c46428e1 100644 --- a/web/src/components/core/InstallationFinished.tsx +++ b/web/src/components/core/InstallationFinished.tsx @@ -28,8 +28,6 @@ import { CardBody, EmptyState, EmptyStateBody, - EmptyStateHeader, - EmptyStateIcon, ExpandableSection, Flex, Grid, @@ -114,12 +112,12 @@ function InstallationFinished() { - - } - /> +
- - } - /> + {_("Please, check whether it is running.")}
diff --git a/web/src/components/layout/Loading.tsx b/web/src/components/layout/Loading.tsx index 7147518404..ba8a57045f 100644 --- a/web/src/components/layout/Loading.tsx +++ b/web/src/components/layout/Loading.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { EmptyState, EmptyStateIcon, EmptyStateHeader, Spinner } from "@patternfly/react-core"; +import { EmptyState, Spinner } from "@patternfly/react-core"; import { Center, PlainLayout } from "~/components/layout"; import { LayoutProps } from "~/components/layout/Layout"; import { _ } from "~/i18n"; @@ -39,13 +39,7 @@ function Loading({ return (
- - } - /> - +
); From 8f14e2eba4b45931bbf653956fee71a778b998e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 9 Jan 2025 08:04:58 +0000 Subject: [PATCH 004/109] fix(web): replace PF/Text with PF/Content As part of the migration to PF v6. It also use PF/Content for replacing a deprecated PF/Chip. --- .../components/core/InstallationFinished.tsx | 8 ++-- web/src/components/core/ProgressText.tsx | 4 +- web/src/components/l10n/KeyboardSelection.tsx | 4 +- web/src/components/l10n/TimezoneSelection.tsx | 6 +-- web/src/components/overview/L10nSection.tsx | 12 +++--- .../components/overview/SoftwareSection.tsx | 12 +++--- .../components/overview/StorageSection.tsx | 38 +++++++++---------- .../components/questions/GenericQuestion.tsx | 4 +- .../questions/LuksActivationQuestion.tsx | 4 +- .../questions/QuestionWithPassword.tsx | 4 +- .../storage/VolumeLocationSelectorTable.tsx | 6 +-- web/src/components/storage/dasd/DASDTable.tsx | 14 +++---- 12 files changed, 57 insertions(+), 59 deletions(-) diff --git a/web/src/components/core/InstallationFinished.tsx b/web/src/components/core/InstallationFinished.tsx index 67c46428e1..ecd51dc4f3 100644 --- a/web/src/components/core/InstallationFinished.tsx +++ b/web/src/components/core/InstallationFinished.tsx @@ -26,6 +26,7 @@ import { Button, Card, CardBody, + Content, EmptyState, EmptyStateBody, ExpandableSection, @@ -33,7 +34,6 @@ import { Grid, GridItem, Stack, - Text, } from "@patternfly/react-core"; import { Center, Icon } from "~/components/layout"; import { _ } from "~/i18n"; @@ -123,14 +123,14 @@ function InstallationFinished() { rowGap={{ default: "rowGapMd" }} justifyContent={{ default: "justifyContentCenter" }} > - {_("The installation on your machine is complete.")} - + {_("The installation on your machine is complete.")} + {useIguana ? _("At this point you can power off the machine.") : _( "At this point you can reboot the machine to log in to the new system.", )} - + {usingTpm(config) && }
diff --git a/web/src/components/core/ProgressText.tsx b/web/src/components/core/ProgressText.tsx index 8a31346e2a..705fe6c71f 100644 --- a/web/src/components/core/ProgressText.tsx +++ b/web/src/components/core/ProgressText.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { Split, Text } from "@patternfly/react-core"; +import { Split, Content } from "@patternfly/react-core"; type ProgressTextProps = { /** Progress message. */ @@ -39,7 +39,7 @@ export default function ProgressText({ message, current, total }: ProgressTextPr const text = current === 0 ? message : `${message} (${current}/${total})`; return ( - {text} + {text} ); } diff --git a/web/src/components/l10n/KeyboardSelection.tsx b/web/src/components/l10n/KeyboardSelection.tsx index 0675bc3877..bfc323ddf8 100644 --- a/web/src/components/l10n/KeyboardSelection.tsx +++ b/web/src/components/l10n/KeyboardSelection.tsx @@ -21,7 +21,7 @@ */ import React, { useState } from "react"; -import { Form, FormGroup, Radio, Text } from "@patternfly/react-core"; +import { Content, Form, FormGroup, Radio } from "@patternfly/react-core"; import { useNavigate } from "react-router-dom"; import { ListSearch, Page } from "~/components/core"; import { _ } from "~/i18n"; @@ -59,7 +59,7 @@ export default function KeyboardSelection() { {name} {" "} - {id} + {id} } value={id} diff --git a/web/src/components/l10n/TimezoneSelection.tsx b/web/src/components/l10n/TimezoneSelection.tsx index 614ba8dc5a..0042704d98 100644 --- a/web/src/components/l10n/TimezoneSelection.tsx +++ b/web/src/components/l10n/TimezoneSelection.tsx @@ -21,7 +21,7 @@ */ import React, { useState } from "react"; -import { Divider, Flex, Form, FormGroup, Radio, Text } from "@patternfly/react-core"; +import { Content, Divider, Flex, Form, FormGroup, Radio } from "@patternfly/react-core"; import { useNavigate } from "react-router-dom"; import { ListSearch, Page } from "~/components/core"; import { timezoneTime } from "~/utils"; @@ -93,12 +93,12 @@ export default function TimezoneSelection() { {parts.join("-")} {" "} - {country} + {country} } description={ - {timezoneTime(id, date) || ""} + {timezoneTime(id, date) || ""}
{details}
diff --git a/web/src/components/overview/L10nSection.tsx b/web/src/components/overview/L10nSection.tsx index 37308e410d..4f0d686826 100644 --- a/web/src/components/overview/L10nSection.tsx +++ b/web/src/components/overview/L10nSection.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { TextContent, Text, TextVariants } from "@patternfly/react-core"; +import { Content } from "@patternfly/react-core"; import { Em } from "~/components/core"; import { _ } from "~/i18n"; import { useL10n } from "~/queries/l10n"; @@ -34,13 +34,13 @@ export default function L10nSection() { const [msg1, msg2] = _("The system will use %s as its default language.").split("%s"); return ( - - {_("Localization")} - + + {_("Localization")} + {msg1} {`${locale.name} (${locale.territory})`} {msg2} - - + + ); } diff --git a/web/src/components/overview/SoftwareSection.tsx b/web/src/components/overview/SoftwareSection.tsx index a93e880192..fe1cfcd043 100644 --- a/web/src/components/overview/SoftwareSection.tsx +++ b/web/src/components/overview/SoftwareSection.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { List, ListItem, Text, TextContent, TextVariants } from "@patternfly/react-core"; +import { Content, List, ListItem } from "@patternfly/react-core"; import { Em } from "~/components/core"; import { SelectedBy } from "~/types/software"; import { usePatterns, useProposal, useProposalChanges } from "~/queries/software"; @@ -51,11 +51,11 @@ export default function SoftwareSection(): React.ReactNode { return ( <> - + {msg1} {proposal.size} {msg2} - + {selectedPatterns.map((p) => ( {p.summary} @@ -66,9 +66,9 @@ export default function SoftwareSection(): React.ReactNode { }; return ( - - {_("Software")} + + {_("Software")} {patterns.length ? : } - + ); } diff --git a/web/src/components/overview/StorageSection.tsx b/web/src/components/overview/StorageSection.tsx index a4f4526963..76d8f32952 100644 --- a/web/src/components/overview/StorageSection.tsx +++ b/web/src/components/overview/StorageSection.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { Text, TextContent, TextVariants } from "@patternfly/react-core"; +import { Content } from "@patternfly/react-core"; import { deviceLabel } from "~/components/storage/utils"; import { Em } from "~/components/core"; import { _ } from "~/i18n"; @@ -95,11 +95,11 @@ const msgLvmSingleDisk = (policy: string): string => { } }; -const Content = ({ children }) => ( - - {_("Storage")} +const SectionContent = ({ children }) => ( + <> + {_("Storage")} {children} - + ); /** @@ -117,9 +117,9 @@ export default function StorageSection() { if (result === undefined) { return ( - - {_("Install using an advanced configuration.")} - + + {_("Install using an advanced configuration.")} + ); } @@ -133,27 +133,27 @@ export default function StorageSection() { if (pvDevices.length > 1) { return ( - + {msgLvmMultipleDisks(result.settings.spacePolicy)} - + ); } else { const [msg1, msg2] = msgLvmSingleDisk(result.settings.spacePolicy).split("%s"); return ( - - + + {msg1} {label(pvDevices[0])} {msg2} - - + + ); } } const targetDevice = result.settings.targetDevice; - if (!targetDevice) return {_("No device selected yet")}; + if (!targetDevice) return {_("No device selected yet")}; const fullMsg = (policy: string): string => { switch (policy) { @@ -179,12 +179,12 @@ export default function StorageSection() { const [msg1, msg2] = fullMsg(result.settings.spacePolicy).split("%s"); return ( - - + + {msg1} {label(targetDevice)} {msg2} - - + + ); } diff --git a/web/src/components/questions/GenericQuestion.tsx b/web/src/components/questions/GenericQuestion.tsx index 39a016224c..b534aba42a 100644 --- a/web/src/components/questions/GenericQuestion.tsx +++ b/web/src/components/questions/GenericQuestion.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { Text } from "@patternfly/react-core"; +import { Content } from "@patternfly/react-core"; import { Popup } from "~/components/core"; import { AnswerCallback, Question } from "~/types/questions"; import QuestionActions from "~/components/questions/QuestionActions"; @@ -47,7 +47,7 @@ export default function GenericQuestion({ return ( - {question.text} + {question.text} - {question.text} + {question.text}
{/* TRANSLATORS: field label */} diff --git a/web/src/components/questions/QuestionWithPassword.tsx b/web/src/components/questions/QuestionWithPassword.tsx index 0bccc00c75..24f6a2de78 100644 --- a/web/src/components/questions/QuestionWithPassword.tsx +++ b/web/src/components/questions/QuestionWithPassword.tsx @@ -21,7 +21,7 @@ */ import React, { useState } from "react"; -import { Form, FormGroup, Stack, Text } from "@patternfly/react-core"; +import { Content, Form, FormGroup, Stack } from "@patternfly/react-core"; import { Icon } from "~/components/layout"; import { PasswordInput, Popup } from "~/components/core"; import { AnswerCallback, Question } from "~/types/questions"; @@ -57,7 +57,7 @@ export default function QuestionWithPassword({ titleIconVariant={() => } > - {question.text} + {question.text} {/* TRANSLATORS: field label */} diff --git a/web/src/components/storage/VolumeLocationSelectorTable.tsx b/web/src/components/storage/VolumeLocationSelectorTable.tsx index 78f063901a..f52da531c5 100644 --- a/web/src/components/storage/VolumeLocationSelectorTable.tsx +++ b/web/src/components/storage/VolumeLocationSelectorTable.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { Chip, Split } from "@patternfly/react-core"; +import { Content, Split } from "@patternfly/react-core"; import { _ } from "~/i18n"; import { DeviceName, @@ -64,9 +64,7 @@ const DeviceUsage = ({ users }: { users: string[] }) => { return ( {users.map((user, index) => ( - - {user} - + {user} ))} ); diff --git a/web/src/components/storage/dasd/DASDTable.tsx b/web/src/components/storage/dasd/DASDTable.tsx index da1b21af1a..74b315dcef 100644 --- a/web/src/components/storage/dasd/DASDTable.tsx +++ b/web/src/components/storage/dasd/DASDTable.tsx @@ -23,6 +23,7 @@ import React, { useState } from "react"; import { Button, + Content, Divider, Dropdown, DropdownItem, @@ -31,7 +32,6 @@ import { ListItem, MenuToggle, Stack, - Text, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, @@ -93,11 +93,11 @@ const DevicesList = ({ devices }) => ( const FormatNotPossible = ({ devices, onAccept }) => ( - + {_( "Offline devices must be activated before formatting them. Please, unselect or activate the devices listed below and try it again", )} - + @@ -109,11 +109,11 @@ const FormatNotPossible = ({ devices, onAccept }) => ( const FormatConfirmation = ({ devices, onCancel, onConfirm }) => ( - + {_( "This action could destroy any data stored on the devices listed below. Please, confirm that you really want to continue.", )} - + @@ -279,7 +279,7 @@ export default function DASDTable() { setFilters((currentFilters) => ({ ...currentFilters, ...newFilters })); }; - const Content = () => { + const PageContent = () => { return ( @@ -382,7 +382,7 @@ export default function DASDTable() { - + ); From d9d4cddeb65013452f5290e985b8c86f8acc098c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 9 Jan 2025 08:18:16 +0000 Subject: [PATCH 005/109] fix(web): replace values for align props Use Start and End suffix instead of Left and Right. --- web/src/components/core/InstallationFinished.tsx | 2 +- web/src/components/layout/Header.tsx | 2 +- web/src/components/storage/dasd/DASDTable.tsx | 2 +- web/src/components/storage/iscsi/TargetsSection.tsx | 2 +- web/src/components/storage/zfcp/ZFCPPage.tsx | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/web/src/components/core/InstallationFinished.tsx b/web/src/components/core/InstallationFinished.tsx index ecd51dc4f3..63f62b7db4 100644 --- a/web/src/components/core/InstallationFinished.tsx +++ b/web/src/components/core/InstallationFinished.tsx @@ -50,7 +50,7 @@ const TpmHint = () => { const title = _("TPM sealing requires the new system to be booted directly."); return ( - {title}}> + {title}}> {_("If a local media was used to run this installer, remove it before the next boot.")} - + diff --git a/web/src/components/storage/dasd/DASDTable.tsx b/web/src/components/storage/dasd/DASDTable.tsx index 74b315dcef..a23a31c81c 100644 --- a/web/src/components/storage/dasd/DASDTable.tsx +++ b/web/src/components/storage/dasd/DASDTable.tsx @@ -326,7 +326,7 @@ export default function DASDTable() { <> - + - + {/* TRANSLATORS: button label, starts iSCSI discovery */} diff --git a/web/src/components/storage/zfcp/ZFCPPage.tsx b/web/src/components/storage/zfcp/ZFCPPage.tsx index defb1678e9..00734d6104 100644 --- a/web/src/components/storage/zfcp/ZFCPPage.tsx +++ b/web/src/components/storage/zfcp/ZFCPPage.tsx @@ -108,7 +108,7 @@ const Disks = () => { <> - + {/* TRANSLATORS: button label */} + ); } From d494cc97b87b9f62c4bfd5f8e82d0f6e6c99e814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 9 Jan 2025 08:49:08 +0000 Subject: [PATCH 015/109] fix(web): force WifiSelectorPage to fill all space --- web/src/components/network/WifiSelectorPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/components/network/WifiSelectorPage.tsx b/web/src/components/network/WifiSelectorPage.tsx index 14b5a38ee2..c0a5c15a51 100644 --- a/web/src/components/network/WifiSelectorPage.tsx +++ b/web/src/components/network/WifiSelectorPage.tsx @@ -31,7 +31,7 @@ function WifiSelectorPage() { useNetworkConfigChanges(); return ( - +

{_("Connect to a Wi-Fi network")}

From 9592a2aebd14f40a8e51691c7df44feb5527954c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 9 Jan 2025 08:49:41 +0000 Subject: [PATCH 016/109] fix(web): put Button icon as prop instead of child As recommended by PF v6. --- web/src/components/storage/dasd/DASDTable.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/web/src/components/storage/dasd/DASDTable.tsx b/web/src/components/storage/dasd/DASDTable.tsx index a23a31c81c..5f00f01b28 100644 --- a/web/src/components/storage/dasd/DASDTable.tsx +++ b/web/src/components/storage/dasd/DASDTable.tsx @@ -342,9 +342,8 @@ export default function DASDTable() { variant="plain" aria-label={_("Remove min channel filter")} onClick={() => updateFilter({ minChannel: "" })} - > - - + icon={} + /> )}
@@ -364,9 +363,8 @@ export default function DASDTable() { variant="plain" aria-label={_("Remove max channel filter")} onClick={() => updateFilter({ maxChannel: "" })} - > - - + icon={} + /> )} From 9eaaa81db045277ec2231ed2f179d389b221a2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 9 Jan 2025 09:33:51 +0000 Subject: [PATCH 017/109] fix(web): update text color utilities to PF v6 --- web/src/components/core/Page.tsx | 2 +- web/src/components/l10n/LocaleSelection.tsx | 6 ++++-- web/src/components/product/ProductRegistrationPage.tsx | 2 +- web/src/components/storage/BootSelection.tsx | 2 +- web/src/components/storage/ProposalActionsSummary.tsx | 4 ++-- web/src/components/storage/SnapshotsField.tsx | 2 +- web/src/components/storage/SpacePolicySelection.tsx | 4 +++- 7 files changed, 13 insertions(+), 9 deletions(-) diff --git a/web/src/components/core/Page.tsx b/web/src/components/core/Page.tsx index b03d626649..f006398807 100644 --- a/web/src/components/core/Page.tsx +++ b/web/src/components/core/Page.tsx @@ -162,7 +162,7 @@ const Section = ({ )} - {hasDescription &&
{description}
} + {hasDescription &&
{description}
} )} diff --git a/web/src/components/l10n/LocaleSelection.tsx b/web/src/components/l10n/LocaleSelection.tsx index ccc50b8e41..ed47e8505f 100644 --- a/web/src/components/l10n/LocaleSelection.tsx +++ b/web/src/components/l10n/LocaleSelection.tsx @@ -57,10 +57,12 @@ export default function LocaleSelection() { {name} - + {territory} - {id} + + {id} + } value={id} diff --git a/web/src/components/product/ProductRegistrationPage.tsx b/web/src/components/product/ProductRegistrationPage.tsx index 2aa23f4f8e..0c0648b6a4 100644 --- a/web/src/components/product/ProductRegistrationPage.tsx +++ b/web/src/components/product/ProductRegistrationPage.tsx @@ -124,7 +124,7 @@ const RegistrationFormSection = () => { fieldId="email" label={ <> - {EMAIL_LABEL} {_("(optional)")} + {EMAIL_LABEL} {_("(optional)")} } > diff --git a/web/src/components/storage/BootSelection.tsx b/web/src/components/storage/BootSelection.tsx index 9a1bcc71e8..7c5f37caac 100644 --- a/web/src/components/storage/BootSelection.tsx +++ b/web/src/components/storage/BootSelection.tsx @@ -134,7 +134,7 @@ partitions in the appropriate disk.",

{_("Select booting partition")}

-

{description}

+

{description}

diff --git a/web/src/components/storage/ProposalActionsSummary.tsx b/web/src/components/storage/ProposalActionsSummary.tsx index fb0052bdb9..d3a1cc9569 100644 --- a/web/src/components/storage/ProposalActionsSummary.tsx +++ b/web/src/components/storage/ProposalActionsSummary.tsx @@ -58,7 +58,7 @@ const DeletionsInfo = ({ } else if (hasDeleteActions) { // TRANSLATORS: %d will be replaced by the amount of destructive actions label = ( - + {sprintf( n_( "There is %d destructive action planned", @@ -160,7 +160,7 @@ const ActionsInfo = ({ if (!validProposal) { label = ( - + {_("Cannot accommodate the required file systems for installation")} ); diff --git a/web/src/components/storage/SnapshotsField.tsx b/web/src/components/storage/SnapshotsField.tsx index 1235e3b81f..213ab89396 100644 --- a/web/src/components/storage/SnapshotsField.tsx +++ b/web/src/components/storage/SnapshotsField.tsx @@ -62,7 +62,7 @@ export default function SnapshotsField({ rootVolume, onChange }: SnapshotsFieldP />
{label}
-
+
{_( "Allows to boot to a previous version of the \ system after configuration changes or software upgrades.", diff --git a/web/src/components/storage/SpacePolicySelection.tsx b/web/src/components/storage/SpacePolicySelection.tsx index c998f038b4..93d2a18893 100644 --- a/web/src/components/storage/SpacePolicySelection.tsx +++ b/web/src/components/storage/SpacePolicySelection.tsx @@ -63,7 +63,9 @@ const SpacePolicyPicker = ({ id={policy.id} value={policy.id} label={{_(policy.label)}} - body={{_(policy.description)}} + body={ + {_(policy.description)} + } onChange={() => onChange(policy)} defaultChecked={isChecked} /> From 738d19dd495cfe26587bf4167b80d4b1363684c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 9 Jan 2025 09:55:40 +0000 Subject: [PATCH 018/109] fix(web): adapt typing of EmptyState wrapper --- web/src/components/core/EmptyState.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/components/core/EmptyState.tsx b/web/src/components/core/EmptyState.tsx index 9237b60aa4..e39f656f86 100644 --- a/web/src/components/core/EmptyState.tsx +++ b/web/src/components/core/EmptyState.tsx @@ -60,7 +60,7 @@ export default function EmptyStateWrapper({ actions, children, ...rest -}: Partial & EmptyStateWrapperProps) { +}: Partial> & EmptyStateWrapperProps) { // @ts-ignore if (noPadding) rest.className = [rest.className, "no-padding"].join(" ").trim(); From b0485b6d13251e7c6d3a82f3918f0817b2422e62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 01:30:01 +0000 Subject: [PATCH 019/109] fix(web): adapt core/Popup typing For accepting the description prop sometimes needed for the header. --- web/src/components/core/Popup.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/web/src/components/core/Popup.tsx b/web/src/components/core/Popup.tsx index 20335dfa0a..72e92d5a59 100644 --- a/web/src/components/core/Popup.tsx +++ b/web/src/components/core/Popup.tsx @@ -28,6 +28,7 @@ import { ModalBody, ModalFooter, ModalHeader, + ModalHeaderProps, ModalProps, } from "@patternfly/react-core"; import { Loading } from "~/components/layout"; @@ -45,7 +46,8 @@ export type PopupProps = { isLoading?: boolean; /** Text displayed when `isLoading` is set to `true` */ loadingText?: string; -} & Omit; +} & Omit & + Pick; /** * Wrapper component for holding Popup actions @@ -200,6 +202,8 @@ const AncillaryAction = ({ children, ...actionsProps }: PredefinedAction) => ( */ const Popup = ({ title, + titleIconVariant, + description, isOpen = false, isLoading = false, // TRANSLATORS: progress message @@ -221,7 +225,7 @@ const Popup = ({ isOpen={isOpen} className={`${className} block-size-${blockSize} inline-size-${inlineSize}`.trim()} > - {title && } + {title && } {isLoading ? : content} {actions} From 84d6c717ca6750d2eb72ca011101c74f6866afa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:03:29 +0000 Subject: [PATCH 020/109] fix(web): upate aria props for core/Popup --- web/src/components/core/Popup.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/web/src/components/core/Popup.tsx b/web/src/components/core/Popup.tsx index 72e92d5a59..4ce95db232 100644 --- a/web/src/components/core/Popup.tsx +++ b/web/src/components/core/Popup.tsx @@ -20,7 +20,7 @@ * find current contact information at www.suse.com. */ -import React, { isValidElement } from "react"; +import React, { isValidElement, useId } from "react"; import { Button, ButtonProps, @@ -218,15 +218,20 @@ const Popup = ({ isValidElement(child) ? child.type === Actions : false, ); + const titleId = useId(); + const contentId = useId(); + return ( /** @ts-ignore */ - {title && } - {isLoading ? : content} + {title && } + {isLoading ? : content} {actions} ); From 4fc06b1b659ff5b557f6f579f9f41b833ee6adbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:04:28 +0000 Subject: [PATCH 021/109] fix(web): use proper roles in EncryptionDialog test --- .../components/storage/EncryptionSettingsDialog.test.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/src/components/storage/EncryptionSettingsDialog.test.tsx b/web/src/components/storage/EncryptionSettingsDialog.test.tsx index b690d6489f..6b32b304c6 100644 --- a/web/src/components/storage/EncryptionSettingsDialog.test.tsx +++ b/web/src/components/storage/EncryptionSettingsDialog.test.tsx @@ -53,7 +53,7 @@ describe("EncryptionSettingsDialog", () => { it("allows settings the encryption", async () => { const { user } = plainRender(); - const checkbox = screen.getByRole("checkbox", { name: "Encrypt the system" }); + const checkbox = screen.getByRole("switch", { name: "Encrypt the system" }); const passwordInput = screen.getByLabelText("Password"); const confirmationInput = screen.getByLabelText("Password confirmation"); const tpmCheckbox = screen.getByRole("checkbox", { name: /Use.*TPM/ }); @@ -102,7 +102,7 @@ describe("EncryptionSettingsDialog", () => { it("allows unsetting the encryption", async () => { const { user } = plainRender(); - const checkbox = screen.getByRole("checkbox", { name: "Encrypt the system" }); + const checkbox = screen.getByRole("switch", { name: "Encrypt the system" }); const acceptButton = screen.getByRole("button", { name: "Accept" }); expect(checkbox).toBeChecked(); await user.click(checkbox); @@ -144,7 +144,7 @@ describe("EncryptionSettingsDialog", () => { it("does not allow sending not valid settings", async () => { const { user } = plainRender(); - const checkbox = screen.getByRole("checkbox", { name: "Encrypt the system" }); + const checkbox = screen.getByRole("switch", { name: "Encrypt the system" }); const passwordInput = screen.getByLabelText("Password"); const confirmationInput = screen.getByLabelText("Password confirmation"); const acceptButton = screen.getByRole("button", { name: "Accept" }); From e8284766363476beb4eaa59865758db4d5ac28a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:15:59 +0000 Subject: [PATCH 022/109] fix(web): update tests looking for actions in rows To properly look for the menu actions at the document body instead of the row where the toggler lives. This change is needed because in PFv6 "The default value of appendTo on Dropdown, Select, and Popper has been updated to `document.body`" Maybe in the future the appendTo prop is added to the actions menu instead. --- .../network/ConnectionsTable.test.tsx | 6 +-- .../components/users/RootAuthMethods.test.tsx | 38 +++++++++++-------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/web/src/components/network/ConnectionsTable.test.tsx b/web/src/components/network/ConnectionsTable.test.tsx index 779e76932f..6612f67bf1 100644 --- a/web/src/components/network/ConnectionsTable.test.tsx +++ b/web/src/components/network/ConnectionsTable.test.tsx @@ -102,9 +102,8 @@ describe("ConnectionsTable", () => { const connectionActions = screen.getByRole("button", { name: "Actions for connection enp1s0", }); - const actionsColumn = connectionActions.parentNode as HTMLElement; await user.click(connectionActions); - const menu = await within(actionsColumn).findByRole("menu"); + const menu = screen.getByRole("menu"); const editAction = within(menu).getByRole("menuitem", { name: "Edit connection enp1s0" }); await user.click(editAction); expect(mockNavigateFn).toHaveBeenCalled(); @@ -122,9 +121,8 @@ describe("ConnectionsTable", () => { const connectionActions = screen.getByRole("button", { name: "Actions for connection enp1s0", }); - const actionsColumn = connectionActions.parentNode as HTMLElement; await user.click(connectionActions); - const menu = await within(actionsColumn).findByRole("menu"); + const menu = screen.getByRole("menu"); const forgetAction = within(menu).getByRole("menuitem", { name: "Forget connection enp1s0", }); diff --git a/web/src/components/users/RootAuthMethods.test.tsx b/web/src/components/users/RootAuthMethods.test.tsx index 065482e080..559fe14a2a 100644 --- a/web/src/components/users/RootAuthMethods.test.tsx +++ b/web/src/components/users/RootAuthMethods.test.tsx @@ -72,7 +72,8 @@ describe("and the password has been set", () => { const passwordRow = within(table).getByText("Password").closest("tr"); const actionsToggler = within(passwordRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const setAction = within(passwordRow).queryByRole("menuitem", { name: "Set" }); + const menu = screen.getByRole("menu"); + const setAction = within(menu).queryByRole("menuitem", { name: "Set" }); expect(setAction).toBeNull(); }); @@ -83,9 +84,9 @@ describe("and the password has been set", () => { const passwordRow = within(table).getByText("Password").closest("tr"); const actionsToggler = within(passwordRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const changeAction = within(passwordRow).queryByRole("menuitem", { name: "Change" }); + const menu = screen.getByRole("menu"); + const changeAction = within(menu).queryByRole("menuitem", { name: "Change" }); await user.click(changeAction); - screen.getByRole("dialog", { name: "Change the root password" }); }); @@ -96,7 +97,8 @@ describe("and the password has been set", () => { const passwordRow = within(table).getByText("Password").closest("tr"); const actionsToggler = within(passwordRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const discardAction = within(passwordRow).queryByRole("menuitem", { name: "Discard" }); + const menu = screen.getByRole("menu"); + const discardAction = within(menu).queryByRole("menuitem", { name: "Discard" }); await user.click(discardAction); expect(mockRootUserMutation.mutate).toHaveBeenCalledWith({ password: "" }); @@ -124,7 +126,8 @@ describe("the password is not set yet", () => { const passwordRow = within(table).getByText("Password").closest("tr"); const actionsToggler = within(passwordRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const setAction = within(passwordRow).getByRole("menuitem", { name: "Set" }); + const menu = screen.getByRole("menu"); + const setAction = within(menu).getByRole("menuitem", { name: "Set" }); await user.click(setAction); screen.getByRole("dialog", { name: "Set a root password" }); }); @@ -136,9 +139,9 @@ describe("the password is not set yet", () => { const passwordRow = within(table).getByText("Password").closest("tr"); const actionsToggler = within(passwordRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - - const changeAction = within(passwordRow).queryByRole("menuitem", { name: "Change" }); - const discardAction = within(passwordRow).queryByRole("menuitem", { name: "Discard" }); + const menu = screen.getByRole("menu"); + const changeAction = within(menu).queryByRole("menuitem", { name: "Change" }); + const discardAction = within(menu).queryByRole("menuitem", { name: "Discard" }); expect(changeAction).toBeNull(); expect(discardAction).toBeNull(); @@ -166,7 +169,8 @@ describe("and the SSH Key has been set", () => { const sshKeyRow = within(table).getByText("SSH Key").closest("tr"); const actionsToggler = within(sshKeyRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const setAction = within(sshKeyRow).queryByRole("menuitem", { name: "Set" }); + const menu = screen.getByRole("menu"); + const setAction = within(menu).queryByRole("menuitem", { name: "Set" }); expect(setAction).toBeNull(); }); @@ -177,9 +181,9 @@ describe("and the SSH Key has been set", () => { const sshKeyRow = within(table).getByText("SSH Key").closest("tr"); const actionsToggler = within(sshKeyRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const changeAction = within(sshKeyRow).queryByRole("menuitem", { name: "Change" }); + const menu = screen.getByRole("menu"); + const changeAction = within(menu).queryByRole("menuitem", { name: "Change" }); await user.click(changeAction); - screen.getByRole("dialog", { name: "Edit the SSH Public Key for root" }); }); @@ -190,7 +194,8 @@ describe("and the SSH Key has been set", () => { const sshKeyRow = within(table).getByText("SSH Key").closest("tr"); const actionsToggler = within(sshKeyRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const discardAction = within(sshKeyRow).queryByRole("menuitem", { name: "Discard" }); + const menu = screen.getByRole("menu"); + const discardAction = within(menu).queryByRole("menuitem", { name: "Discard" }); await user.click(discardAction); expect(mockRootUserMutation.mutate).toHaveBeenCalledWith({ sshkey: "" }); @@ -218,7 +223,8 @@ describe("but the SSH Key is not set yet", () => { const sshKeyRow = within(table).getByText("SSH Key").closest("tr"); const actionsToggler = within(sshKeyRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const setAction = within(sshKeyRow).getByRole("menuitem", { name: "Set" }); + const menu = screen.getByRole("menu"); + const setAction = within(menu).getByRole("menuitem", { name: "Set" }); await user.click(setAction); screen.getByRole("dialog", { name: "Add a SSH Public Key for root" }); }); @@ -230,9 +236,9 @@ describe("but the SSH Key is not set yet", () => { const sshKeyRow = within(table).getByText("SSH Key").closest("tr"); const actionsToggler = within(sshKeyRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - - const changeAction = within(sshKeyRow).queryByRole("menuitem", { name: "Change" }); - const discardAction = within(sshKeyRow).queryByRole("menuitem", { name: "Discard" }); + const menu = screen.getByRole("menu"); + const changeAction = within(menu).queryByRole("menuitem", { name: "Change" }); + const discardAction = within(menu).queryByRole("menuitem", { name: "Discard" }); expect(changeAction).toBeNull(); expect(discardAction).toBeNull(); From 19c70ee81d976e417493cbb0227921230f1af6ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:28:25 +0000 Subject: [PATCH 023/109] fix(web): fix WifiConnectionForm test Which was wrongly using getByText instead of getByRole for working with buttons. --- web/src/components/network/WifiConnectionForm.test.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/src/components/network/WifiConnectionForm.test.tsx b/web/src/components/network/WifiConnectionForm.test.tsx index 2656796f35..917c3308cd 100644 --- a/web/src/components/network/WifiConnectionForm.test.tsx +++ b/web/src/components/network/WifiConnectionForm.test.tsx @@ -126,16 +126,16 @@ describe("WifiConnectionForm", () => { it("disables cancel and submission actions", async () => { const { user } = renderForm(networkMock); - const connectButton = screen.getByText("Connect"); - const cancelLink = screen.getByText("Cancel"); + const connectButton = screen.getByRole("button", { name: "Connect" }); + const cancelButton = screen.getByRole("button", { name: "Cancel" }); expect(connectButton).not.toBeDisabled(); - expect(cancelLink).not.toBeDisabled(); + expect(cancelButton).not.toBeDisabled(); await waitFor(() => { user.click(connectButton); expect(connectButton).toBeDisabled(); - expect(cancelLink).toBeDisabled(); + expect(cancelButton).toBeDisabled(); }); }); From 44a4c906268624864420f6dd82bd8a88b52f1ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:43:37 +0000 Subject: [PATCH 024/109] fix(web): fix core/Page tests --- web/src/components/core/Page.test.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/web/src/components/core/Page.test.tsx b/web/src/components/core/Page.test.tsx index 5c90132aa1..9a0c683248 100644 --- a/web/src/components/core/Page.test.tsx +++ b/web/src/components/core/Page.test.tsx @@ -100,7 +100,7 @@ describe("Page", () => { it("renders a node that fills all the available space", () => { installerRender({_("The Content")}); const content = screen.getByText("The Content"); - expect(content.classList.contains("pf-m-fill")).toBe(true); + expect((content.parentNode as HTMLElement).classList.contains("pf-m-fill")).toBe(true); }); it("mounts a ProductRegistrationAlert", () => { @@ -177,10 +177,8 @@ describe("Page", () => { }); describe("Page.Header", () => { it("renders a node that sticks to top", () => { - plainRender(The Header); - const content = screen.getByText("The Header"); - const container = content.parentNode as HTMLElement; - expect(container.classList.contains("pf-m-sticky-top")).toBe(true); + const { container } = plainRender(The Header); + expect(container.children[0].classList.contains("pf-m-sticky-top")).toBe(true); }); }); From 6b70a42446cc6bec6ffbd704e627f86341e2f75f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:48:32 +0000 Subject: [PATCH 025/109] fix(web): use v6 intead of v5 in test selectors --- web/src/components/core/FormReadOnlyField.test.jsx | 4 ++-- web/src/components/core/Popup.test.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web/src/components/core/FormReadOnlyField.test.jsx b/web/src/components/core/FormReadOnlyField.test.jsx index c32ed904d7..e9797d0e3a 100644 --- a/web/src/components/core/FormReadOnlyField.test.jsx +++ b/web/src/components/core/FormReadOnlyField.test.jsx @@ -29,6 +29,6 @@ it("renders label and content wrapped in div nodes using expected PatternFly sty plainRender(Agama); const field = screen.getByText("Agama"); const label = screen.getByText("Product"); - expect(field.classList.contains("pf-v5-c-form__group")).toBe(true); - expect(label.classList.contains("pf-v5-c-form__label-text")).toBe(true); + expect(field.classList.contains("pf-v6-c-form__group")).toBe(true); + expect(label.classList.contains("pf-v6-c-form__label-text")).toBe(true); }); diff --git a/web/src/components/core/Popup.test.tsx b/web/src/components/core/Popup.test.tsx index 4b29e1c098..97004333f4 100644 --- a/web/src/components/core/Popup.test.tsx +++ b/web/src/components/core/Popup.test.tsx @@ -82,7 +82,7 @@ describe("Popup", () => { installerRender(Testing); const dialog = await screen.findByRole("dialog"); - expect(dialog.classList.contains("pf-v5-c-modal-box")).toBe(true); + expect(dialog.classList.contains("pf-v6-c-modal-box")).toBe(true); within(dialog).getByText("The Popup Content"); }); From 4da23c03fec15d7a4bb308e9bb9dd62ef6ff8d06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:50:09 +0000 Subject: [PATCH 026/109] fix(web): use expected role in the test Switch instead checkbox --- web/src/components/storage/SnapshotsField.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/components/storage/SnapshotsField.test.tsx b/web/src/components/storage/SnapshotsField.test.tsx index 9603e4a61a..375e9ffad4 100644 --- a/web/src/components/storage/SnapshotsField.test.tsx +++ b/web/src/components/storage/SnapshotsField.test.tsx @@ -56,14 +56,14 @@ describe("SnapshotsField", () => { it("reflects snapshots status", () => { props = { rootVolume: { ...rootVolume, snapshots: true }, onChange: onChangeFn }; plainRender(); - const checkbox: HTMLInputElement = screen.getByRole("checkbox"); + const checkbox: HTMLInputElement = screen.getByRole("switch"); expect(checkbox.value).toEqual("on"); }); it("allows toggling snapshots status", async () => { props = { rootVolume: { ...rootVolume, snapshots: true }, onChange: onChangeFn }; const { user } = plainRender(); - const checkbox: HTMLInputElement = screen.getByRole("checkbox"); + const checkbox: HTMLInputElement = screen.getByRole("switch"); await user.click(checkbox); expect(onChangeFn).toHaveBeenCalledWith({ active: false }); }); From 5659c229f404a62f173f0d90a6054618d9d23bbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Sat, 11 Jan 2025 09:02:05 +0000 Subject: [PATCH 027/109] fix(web): skip a useless test Most probably it will be drop in the short term. --- web/src/components/core/Em.test.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/components/core/Em.test.jsx b/web/src/components/core/Em.test.jsx index fe6cd064eb..10996c98e9 100644 --- a/web/src/components/core/Em.test.jsx +++ b/web/src/components/core/Em.test.jsx @@ -26,7 +26,7 @@ import { plainRender } from "~/test-utils"; import { Em } from "~/components/core"; describe("Em", () => { - it("wraps given children inside a compact PF/Label", () => { + it.skip("wraps given children inside a compact PF/Label", () => { plainRender(Whatever); const children = screen.getByText("Whatever"); const parent = children.closest("span.pf-v5-c-label"); From 863f2b41d7a2dc9d38986719af9e0523b16d08ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Mon, 13 Jan 2025 10:08:04 +0000 Subject: [PATCH 028/109] fix(web): temporary workaround for Layout header Renders an emtpy Masthead instead of nothing when there is not header at all. This is needed in order to have the document structure expected by PatternFly CSS to make things works as expected (i.e., allowing the content fill the space reserved for the sidebar). --- web/src/components/layout/Layout.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/src/components/layout/Layout.tsx b/web/src/components/layout/Layout.tsx index 10384f9e9a..87fc2cf59d 100644 --- a/web/src/components/layout/Layout.tsx +++ b/web/src/components/layout/Layout.tsx @@ -22,7 +22,7 @@ import React, { Suspense, useState } from "react"; import { Outlet, useLocation } from "react-router-dom"; -import { Page, PageProps } from "@patternfly/react-core"; +import { Masthead, Page, PageProps } from "@patternfly/react-core"; import { Questions } from "~/components/questions"; import Header, { HeaderProps } from "~/components/layout/Header"; import { Loading, Sidebar } from "~/components/layout"; @@ -69,6 +69,11 @@ const Layout = ({ // to mount it if there is no header. pageProps.notificationDrawer = ; pageProps.isNotificationDrawerExpanded = issuesDrawerVisible; + } else { + // FIXME: render an empty Masthead instead of nothing, in order to have + // everything working as designed by PatternfFly (there are some CSS rules + // that expect the masthead to be there :shrug:) + pageProps.masthead = ; } return ( From 49b264dbc5e215fa3fe3bb24017c12c344cbad6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Mon, 13 Jan 2025 10:15:04 +0000 Subject: [PATCH 029/109] fix(web): do not use body wrapper for core/Page.Content See https://www.patternfly.org/components/page/#pagesection --- web/src/components/core/Page.test.tsx | 2 +- web/src/components/core/Page.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/components/core/Page.test.tsx b/web/src/components/core/Page.test.tsx index 9a0c683248..e85dc4baf3 100644 --- a/web/src/components/core/Page.test.tsx +++ b/web/src/components/core/Page.test.tsx @@ -100,7 +100,7 @@ describe("Page", () => { it("renders a node that fills all the available space", () => { installerRender({_("The Content")}); const content = screen.getByText("The Content"); - expect((content.parentNode as HTMLElement).classList.contains("pf-m-fill")).toBe(true); + expect(content.classList.contains("pf-m-fill")).toBe(true); }); it("mounts a ProductRegistrationAlert", () => { diff --git a/web/src/components/core/Page.tsx b/web/src/components/core/Page.tsx index f006398807..1670fe621f 100644 --- a/web/src/components/core/Page.tsx +++ b/web/src/components/core/Page.tsx @@ -286,7 +286,7 @@ const Content = ({ children, ...pageSectionProps }: React.PropsWithChildren {mountRegistrationAlert && } - + {children} From ca9e4f597d29be8b1c79cd28760a2fda9c697f26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Mon, 13 Jan 2025 10:17:20 +0000 Subject: [PATCH 030/109] fix(web): centers login form at login page --- web/src/components/core/LoginPage.tsx | 63 ++++++++++++--------------- 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/web/src/components/core/LoginPage.tsx b/web/src/components/core/LoginPage.tsx index 060ff0a9d8..dcfc5503d0 100644 --- a/web/src/components/core/LoginPage.tsx +++ b/web/src/components/core/LoginPage.tsx @@ -22,9 +22,8 @@ import React, { useState } from "react"; import { Navigate } from "react-router-dom"; -import { ActionGroup, Button, Card, Form, FormGroup, Grid, GridItem } from "@patternfly/react-core"; +import { ActionGroup, Bullseye, Button, Card, Form, FormGroup } from "@patternfly/react-core"; import { EmptyState, FormValidationError, Page, PasswordInput } from "~/components/core"; -import { Center } from "~/components/layout"; import { AuthErrors, useAuth } from "~/context/auth"; import { _ } from "~/i18n"; import { sprintf } from "sprintf-js"; @@ -69,40 +68,36 @@ user privileges.", return ( -
- - - - {/** @ts-ignore */} - -

- {rootExplanationStart} {rootUser} {rootExplanationEnd} -

-

{_("Please, provide its password to log in to the system.")}

- - - setPassword(v)} - /> - + + + {/** @ts-ignore */} + +

+ {rootExplanationStart} {rootUser} {rootExplanationEnd} +

+

{_("Please, provide its password to log in to the system.")}

+ + + setPassword(v)} + /> + - {error && } + {error && } - - - - -
-
-
-
-
+ + + + + + +
); } From 761852fb94c0aa2ff8d3112aa51fd4f0e92b5ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Mon, 13 Jan 2025 14:13:48 +0000 Subject: [PATCH 031/109] fix(web): use PF/Bullseye for centering content Intead of the custom core/Center one, which is going to be deleted. --- web/src/components/core/InstallationFinished.tsx | 8 +++++--- web/src/components/core/ProgressReport.tsx | 6 +++--- web/src/components/core/ServerError.tsx | 8 ++++---- web/src/components/layout/Loading.tsx | 8 ++++---- web/src/components/product/ProductSelectionPage.tsx | 6 +++--- web/src/components/users/RootAuthMethodsPage.tsx | 9 ++++----- 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/web/src/components/core/InstallationFinished.tsx b/web/src/components/core/InstallationFinished.tsx index fc013156dc..8ba78cd2b7 100644 --- a/web/src/components/core/InstallationFinished.tsx +++ b/web/src/components/core/InstallationFinished.tsx @@ -23,6 +23,7 @@ import React, { useState } from "react"; import { Alert, + Bullseye, Button, Card, CardBody, @@ -35,7 +36,7 @@ import { GridItem, Stack, } from "@patternfly/react-core"; -import { Center, Icon } from "~/components/layout"; +import { Icon } from "~/components/layout"; import { _ } from "~/i18n"; import alignmentStyles from "@patternfly/react-styles/css/utilities/Alignment/alignment"; import { useInstallerStatus } from "~/queries/status"; @@ -106,7 +107,7 @@ function InstallationFinished() { } return ( -
+ @@ -120,6 +121,7 @@ function InstallationFinished() { > @@ -145,7 +147,7 @@ function InstallationFinished() { -
+ ); } diff --git a/web/src/components/core/ProgressReport.tsx b/web/src/components/core/ProgressReport.tsx index 6e5fc3ec22..bbd915dbf3 100644 --- a/web/src/components/core/ProgressReport.tsx +++ b/web/src/components/core/ProgressReport.tsx @@ -22,6 +22,7 @@ import React, { useEffect, useState } from "react"; import { + Bullseye, Card, CardBody, Flex, @@ -36,7 +37,6 @@ import { } from "@patternfly/react-core"; import { _ } from "~/i18n"; -import { Center } from "~/components/layout"; import { useProgress, useProgressChanges, useResetProgress } from "~/queries/progress"; import { Progress as ProgressType } from "~/types/progress"; @@ -135,7 +135,7 @@ function ProgressReport({ title, firstStep }: { title: string; firstStep?: React ); return ( -
+ @@ -155,7 +155,7 @@ function ProgressReport({ title, firstStep }: { title: string; firstStep?: React -
+ ); } diff --git a/web/src/components/core/ServerError.tsx b/web/src/components/core/ServerError.tsx index e24a81a245..e4b0e80951 100644 --- a/web/src/components/core/ServerError.tsx +++ b/web/src/components/core/ServerError.tsx @@ -21,8 +21,8 @@ */ import React from "react"; -import { EmptyState, EmptyStateBody } from "@patternfly/react-core"; -import { Center, Icon, PlainLayout } from "~/components/layout"; +import { Bullseye, EmptyState, EmptyStateBody } from "@patternfly/react-core"; +import { Icon, PlainLayout } from "~/components/layout"; import { Page } from "~/components/core"; import { _ } from "~/i18n"; import { locationReload } from "~/utils"; @@ -34,7 +34,7 @@ function ServerError() { -
+ {_("Please, check whether it is running.")} -
+
diff --git a/web/src/components/layout/Loading.tsx b/web/src/components/layout/Loading.tsx index ba8a57045f..6a8be0f838 100644 --- a/web/src/components/layout/Loading.tsx +++ b/web/src/components/layout/Loading.tsx @@ -21,8 +21,8 @@ */ import React from "react"; -import { EmptyState, Spinner } from "@patternfly/react-core"; -import { Center, PlainLayout } from "~/components/layout"; +import { Bullseye, EmptyState, Spinner } from "@patternfly/react-core"; +import { PlainLayout } from "~/components/layout"; import { LayoutProps } from "~/components/layout/Layout"; import { _ } from "~/i18n"; @@ -38,9 +38,9 @@ function Loading({ const Wrapper = useLayout ? Layout : React.Fragment; return ( -
+ -
+
); } diff --git a/web/src/components/product/ProductSelectionPage.tsx b/web/src/components/product/ProductSelectionPage.tsx index 73a5db2909..ca1545bea4 100644 --- a/web/src/components/product/ProductSelectionPage.tsx +++ b/web/src/components/product/ProductSelectionPage.tsx @@ -33,10 +33,10 @@ import { Stack, FormGroup, Button, + Bullseye, } from "@patternfly/react-core"; import { Navigate, useNavigate } from "react-router-dom"; import { Page } from "~/components/core"; -import { Center } from "~/components/layout"; import { useConfigMutation, useProduct, useRegistration } from "~/queries/software"; import pfTextStyles from "@patternfly/react-styles/css/utilities/Text/text"; import pfRadioStyles from "@patternfly/react-styles/css/components/Radio/radio"; @@ -120,7 +120,7 @@ function ProductSelectionPage() { return ( -
+
@@ -139,7 +139,7 @@ function ProductSelectionPage() { -
+
{selectedProduct && !isLoading && } diff --git a/web/src/components/users/RootAuthMethodsPage.tsx b/web/src/components/users/RootAuthMethodsPage.tsx index 3fce9489dd..0d63309431 100644 --- a/web/src/components/users/RootAuthMethodsPage.tsx +++ b/web/src/components/users/RootAuthMethodsPage.tsx @@ -21,9 +21,8 @@ */ import React, { useRef, useState } from "react"; -import { Flex, Form, FormGroup } from "@patternfly/react-core"; +import { Bullseye, Flex, Form, FormGroup } from "@patternfly/react-core"; import { useLocation, useNavigate } from "react-router-dom"; -import { Center } from "~/components/layout"; import { Page, PasswordInput } from "~/components/core"; import { useRootUserMutation } from "~/queries/users"; import { ROOT as PATHS } from "~/routes/paths"; @@ -60,7 +59,7 @@ function RootAuthMethodsPage() { return ( -
+ } - pfCardProps={{ isCompact: false }} + pfCardProps={{ isCompact: false, isFullHeight: false }} pfCardBodyProps={{ isFilled: true }} >
@@ -91,7 +90,7 @@ function RootAuthMethodsPage() {
-
+
From 8c0ac5c478fdd68bc83028afb99a1d0ad29c5aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Mon, 13 Jan 2025 14:14:58 +0000 Subject: [PATCH 032/109] fix(web): drop no longer needed Center component --- web/src/components/layout/Center.tsx | 52 ---------------------------- web/src/components/layout/index.ts | 1 - 2 files changed, 53 deletions(-) delete mode 100644 web/src/components/layout/Center.tsx diff --git a/web/src/components/layout/Center.tsx b/web/src/components/layout/Center.tsx deleted file mode 100644 index 48c4a53512..0000000000 --- a/web/src/components/layout/Center.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) [2022-2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; - -/** - * Wrapper component for centering vertically its children - * - * @note It could be replaced by the 'vertically-centered' CSS utility class once Firefox add support - * by default for the :has selector, which allows having something like - * - * .parent:has(.vertically-centered) { - * display: grid; - * place-items: center; - * block-size: 100%; - * } - * - * .vertically-centered { inline-size: 100%; } - * - * We can use \@support CSS at rule and use a workaround when :has not available, but somehow - * prefer waiting until Firefox gets support. - * - * To know more, read - * - https://www.w3.org/TR/selectors-4/#relational - * - https://ishadeed.com/article/css-has-parent-selector/ - */ -const Center = ({ children }: React.PropsWithChildren) => ( -
-
{children}
-
-); - -export default Center; diff --git a/web/src/components/layout/index.ts b/web/src/components/layout/index.ts index 0bea58236e..9d32ca00a1 100644 --- a/web/src/components/layout/index.ts +++ b/web/src/components/layout/index.ts @@ -21,7 +21,6 @@ */ export { default as Icon } from "./Icon"; -export { default as Center } from "./Center"; export { default as Loading } from "./Loading"; export { default as Sidebar } from "./Sidebar"; export { default as Header } from "./Header"; From 69eca7e271a464c42c24bafd3526430d49130b05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Tue, 14 Jan 2025 11:48:46 +0000 Subject: [PATCH 033/109] doc(web): update headers of touched files --- web/src/components/core/Drawer.tsx | 2 +- web/src/components/core/Em.test.jsx | 2 +- web/src/components/core/EmptyState.tsx | 2 +- web/src/components/core/FormReadOnlyField.test.jsx | 2 +- web/src/components/core/InstallButton.tsx | 2 +- web/src/components/core/InstallationFinished.tsx | 2 +- web/src/components/core/IssuesDrawer.tsx | 2 +- web/src/components/core/LoginPage.tsx | 2 +- web/src/components/core/Page.tsx | 2 +- web/src/components/core/PasswordInput.tsx | 2 +- web/src/components/core/Popup.test.tsx | 2 +- web/src/components/core/Popup.tsx | 2 +- web/src/components/core/ProgressReport.tsx | 2 +- web/src/components/core/ServerError.tsx | 2 +- web/src/components/l10n/KeyboardSelection.tsx | 2 +- web/src/components/l10n/LocaleSelection.tsx | 2 +- web/src/components/l10n/TimezoneSelection.tsx | 2 +- web/src/components/layout/Header.tsx | 2 +- web/src/components/layout/Layout.tsx | 2 +- web/src/components/layout/Loading.tsx | 2 +- web/src/components/layout/index.ts | 2 +- web/src/components/network/ConnectionsTable.test.tsx | 2 +- web/src/components/network/WifiConnectionForm.test.tsx | 2 +- web/src/components/network/WifiNetworksListPage.tsx | 2 +- web/src/components/network/WifiSelectorPage.tsx | 2 +- web/src/components/overview/SoftwareSection.tsx | 2 +- web/src/components/overview/StorageSection.tsx | 2 +- web/src/components/product/ProductRegistrationPage.tsx | 2 +- web/src/components/product/ProductSelectionPage.tsx | 2 +- web/src/components/questions/GenericQuestion.tsx | 2 +- web/src/components/questions/LuksActivationQuestion.tsx | 2 +- web/src/components/questions/QuestionWithPassword.tsx | 2 +- web/src/components/storage/BootSelection.tsx | 2 +- web/src/components/storage/EncryptionSettingsDialog.test.tsx | 2 +- web/src/components/storage/ProposalActionsSummary.tsx | 2 +- web/src/components/storage/SnapshotsField.test.tsx | 2 +- web/src/components/storage/SnapshotsField.tsx | 2 +- web/src/components/storage/SpacePolicySelection.tsx | 2 +- web/src/components/storage/VolumeFields.tsx | 2 +- web/src/components/storage/VolumeLocationSelectorTable.tsx | 2 +- web/src/components/storage/dasd/DASDTable.tsx | 2 +- web/src/components/storage/iscsi/TargetsSection.tsx | 2 +- web/src/components/storage/zfcp/ZFCPPage.tsx | 2 +- web/src/components/users/RootAuthMethods.test.tsx | 2 +- web/src/components/users/RootAuthMethodsPage.tsx | 2 +- 45 files changed, 45 insertions(+), 45 deletions(-) diff --git a/web/src/components/core/Drawer.tsx b/web/src/components/core/Drawer.tsx index de18dcaf12..b1ab80a060 100644 --- a/web/src/components/core/Drawer.tsx +++ b/web/src/components/core/Drawer.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/Em.test.jsx b/web/src/components/core/Em.test.jsx index 10996c98e9..44be652019 100644 --- a/web/src/components/core/Em.test.jsx +++ b/web/src/components/core/Em.test.jsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/EmptyState.tsx b/web/src/components/core/EmptyState.tsx index e39f656f86..36faeb8a72 100644 --- a/web/src/components/core/EmptyState.tsx +++ b/web/src/components/core/EmptyState.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/FormReadOnlyField.test.jsx b/web/src/components/core/FormReadOnlyField.test.jsx index e9797d0e3a..00706d9ae9 100644 --- a/web/src/components/core/FormReadOnlyField.test.jsx +++ b/web/src/components/core/FormReadOnlyField.test.jsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/InstallButton.tsx b/web/src/components/core/InstallButton.tsx index e6a0f991b6..0faaf87461 100644 --- a/web/src/components/core/InstallButton.tsx +++ b/web/src/components/core/InstallButton.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/InstallationFinished.tsx b/web/src/components/core/InstallationFinished.tsx index 8ba78cd2b7..d510638203 100644 --- a/web/src/components/core/InstallationFinished.tsx +++ b/web/src/components/core/InstallationFinished.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/IssuesDrawer.tsx b/web/src/components/core/IssuesDrawer.tsx index da6ac3c07e..f1a08ef17b 100644 --- a/web/src/components/core/IssuesDrawer.tsx +++ b/web/src/components/core/IssuesDrawer.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/LoginPage.tsx b/web/src/components/core/LoginPage.tsx index dcfc5503d0..0e823a6aa1 100644 --- a/web/src/components/core/LoginPage.tsx +++ b/web/src/components/core/LoginPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/Page.tsx b/web/src/components/core/Page.tsx index 1670fe621f..83d3593d61 100644 --- a/web/src/components/core/Page.tsx +++ b/web/src/components/core/Page.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/PasswordInput.tsx b/web/src/components/core/PasswordInput.tsx index 05feed1795..e1352960de 100644 --- a/web/src/components/core/PasswordInput.tsx +++ b/web/src/components/core/PasswordInput.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/Popup.test.tsx b/web/src/components/core/Popup.test.tsx index 97004333f4..8582066fce 100644 --- a/web/src/components/core/Popup.test.tsx +++ b/web/src/components/core/Popup.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/Popup.tsx b/web/src/components/core/Popup.tsx index 4ce95db232..8bf1f7fb5b 100644 --- a/web/src/components/core/Popup.tsx +++ b/web/src/components/core/Popup.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/ProgressReport.tsx b/web/src/components/core/ProgressReport.tsx index bbd915dbf3..686b2438a6 100644 --- a/web/src/components/core/ProgressReport.tsx +++ b/web/src/components/core/ProgressReport.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/ServerError.tsx b/web/src/components/core/ServerError.tsx index e4b0e80951..1735b4a1fb 100644 --- a/web/src/components/core/ServerError.tsx +++ b/web/src/components/core/ServerError.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/l10n/KeyboardSelection.tsx b/web/src/components/l10n/KeyboardSelection.tsx index bfc323ddf8..dce08d3192 100644 --- a/web/src/components/l10n/KeyboardSelection.tsx +++ b/web/src/components/l10n/KeyboardSelection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/l10n/LocaleSelection.tsx b/web/src/components/l10n/LocaleSelection.tsx index ed47e8505f..2446a52e09 100644 --- a/web/src/components/l10n/LocaleSelection.tsx +++ b/web/src/components/l10n/LocaleSelection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/l10n/TimezoneSelection.tsx b/web/src/components/l10n/TimezoneSelection.tsx index 0042704d98..30136056fe 100644 --- a/web/src/components/l10n/TimezoneSelection.tsx +++ b/web/src/components/l10n/TimezoneSelection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/layout/Header.tsx b/web/src/components/layout/Header.tsx index 69868a91c9..1b65057d0f 100644 --- a/web/src/components/layout/Header.tsx +++ b/web/src/components/layout/Header.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/layout/Layout.tsx b/web/src/components/layout/Layout.tsx index 87fc2cf59d..9f1aa3a4f8 100644 --- a/web/src/components/layout/Layout.tsx +++ b/web/src/components/layout/Layout.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/layout/Loading.tsx b/web/src/components/layout/Loading.tsx index 6a8be0f838..1577b8f012 100644 --- a/web/src/components/layout/Loading.tsx +++ b/web/src/components/layout/Loading.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/layout/index.ts b/web/src/components/layout/index.ts index 9d32ca00a1..ddb595427c 100644 --- a/web/src/components/layout/index.ts +++ b/web/src/components/layout/index.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/network/ConnectionsTable.test.tsx b/web/src/components/network/ConnectionsTable.test.tsx index 6612f67bf1..025405ead6 100644 --- a/web/src/components/network/ConnectionsTable.test.tsx +++ b/web/src/components/network/ConnectionsTable.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/network/WifiConnectionForm.test.tsx b/web/src/components/network/WifiConnectionForm.test.tsx index 917c3308cd..c7ce53ff98 100644 --- a/web/src/components/network/WifiConnectionForm.test.tsx +++ b/web/src/components/network/WifiConnectionForm.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/network/WifiNetworksListPage.tsx b/web/src/components/network/WifiNetworksListPage.tsx index fca7b96b06..b816384f32 100644 --- a/web/src/components/network/WifiNetworksListPage.tsx +++ b/web/src/components/network/WifiNetworksListPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/network/WifiSelectorPage.tsx b/web/src/components/network/WifiSelectorPage.tsx index c0a5c15a51..c650686362 100644 --- a/web/src/components/network/WifiSelectorPage.tsx +++ b/web/src/components/network/WifiSelectorPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/overview/SoftwareSection.tsx b/web/src/components/overview/SoftwareSection.tsx index fe1cfcd043..16beef2502 100644 --- a/web/src/components/overview/SoftwareSection.tsx +++ b/web/src/components/overview/SoftwareSection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/overview/StorageSection.tsx b/web/src/components/overview/StorageSection.tsx index 76d8f32952..ea8d9f2504 100644 --- a/web/src/components/overview/StorageSection.tsx +++ b/web/src/components/overview/StorageSection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/product/ProductRegistrationPage.tsx b/web/src/components/product/ProductRegistrationPage.tsx index 0c0648b6a4..346dbe40c4 100644 --- a/web/src/components/product/ProductRegistrationPage.tsx +++ b/web/src/components/product/ProductRegistrationPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/product/ProductSelectionPage.tsx b/web/src/components/product/ProductSelectionPage.tsx index ca1545bea4..87d680cadd 100644 --- a/web/src/components/product/ProductSelectionPage.tsx +++ b/web/src/components/product/ProductSelectionPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/questions/GenericQuestion.tsx b/web/src/components/questions/GenericQuestion.tsx index b534aba42a..74bea5ff9f 100644 --- a/web/src/components/questions/GenericQuestion.tsx +++ b/web/src/components/questions/GenericQuestion.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/questions/LuksActivationQuestion.tsx b/web/src/components/questions/LuksActivationQuestion.tsx index 5d152d9a1f..48fc7a092a 100644 --- a/web/src/components/questions/LuksActivationQuestion.tsx +++ b/web/src/components/questions/LuksActivationQuestion.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/questions/QuestionWithPassword.tsx b/web/src/components/questions/QuestionWithPassword.tsx index 24f6a2de78..95f2fe0b51 100644 --- a/web/src/components/questions/QuestionWithPassword.tsx +++ b/web/src/components/questions/QuestionWithPassword.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/BootSelection.tsx b/web/src/components/storage/BootSelection.tsx index 7c5f37caac..39946a01e1 100644 --- a/web/src/components/storage/BootSelection.tsx +++ b/web/src/components/storage/BootSelection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/EncryptionSettingsDialog.test.tsx b/web/src/components/storage/EncryptionSettingsDialog.test.tsx index 6b32b304c6..62f06d3d9a 100644 --- a/web/src/components/storage/EncryptionSettingsDialog.test.tsx +++ b/web/src/components/storage/EncryptionSettingsDialog.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/ProposalActionsSummary.tsx b/web/src/components/storage/ProposalActionsSummary.tsx index d3a1cc9569..d67b623be9 100644 --- a/web/src/components/storage/ProposalActionsSummary.tsx +++ b/web/src/components/storage/ProposalActionsSummary.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/SnapshotsField.test.tsx b/web/src/components/storage/SnapshotsField.test.tsx index 375e9ffad4..372e81227b 100644 --- a/web/src/components/storage/SnapshotsField.test.tsx +++ b/web/src/components/storage/SnapshotsField.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/SnapshotsField.tsx b/web/src/components/storage/SnapshotsField.tsx index 213ab89396..ed220e1bf4 100644 --- a/web/src/components/storage/SnapshotsField.tsx +++ b/web/src/components/storage/SnapshotsField.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/SpacePolicySelection.tsx b/web/src/components/storage/SpacePolicySelection.tsx index 93d2a18893..b84c31c9f1 100644 --- a/web/src/components/storage/SpacePolicySelection.tsx +++ b/web/src/components/storage/SpacePolicySelection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/VolumeFields.tsx b/web/src/components/storage/VolumeFields.tsx index 95981e8aa2..2bf2198e62 100644 --- a/web/src/components/storage/VolumeFields.tsx +++ b/web/src/components/storage/VolumeFields.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/VolumeLocationSelectorTable.tsx b/web/src/components/storage/VolumeLocationSelectorTable.tsx index f52da531c5..764a9c3e38 100644 --- a/web/src/components/storage/VolumeLocationSelectorTable.tsx +++ b/web/src/components/storage/VolumeLocationSelectorTable.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/dasd/DASDTable.tsx b/web/src/components/storage/dasd/DASDTable.tsx index 5f00f01b28..81b96fb5cc 100644 --- a/web/src/components/storage/dasd/DASDTable.tsx +++ b/web/src/components/storage/dasd/DASDTable.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/iscsi/TargetsSection.tsx b/web/src/components/storage/iscsi/TargetsSection.tsx index eba697fb20..2becbf3c5d 100644 --- a/web/src/components/storage/iscsi/TargetsSection.tsx +++ b/web/src/components/storage/iscsi/TargetsSection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/zfcp/ZFCPPage.tsx b/web/src/components/storage/zfcp/ZFCPPage.tsx index 00734d6104..25294b981c 100644 --- a/web/src/components/storage/zfcp/ZFCPPage.tsx +++ b/web/src/components/storage/zfcp/ZFCPPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/users/RootAuthMethods.test.tsx b/web/src/components/users/RootAuthMethods.test.tsx index 559fe14a2a..7baa7c11f3 100644 --- a/web/src/components/users/RootAuthMethods.test.tsx +++ b/web/src/components/users/RootAuthMethods.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/users/RootAuthMethodsPage.tsx b/web/src/components/users/RootAuthMethodsPage.tsx index 0d63309431..4fa898a0ea 100644 --- a/web/src/components/users/RootAuthMethodsPage.tsx +++ b/web/src/components/users/RootAuthMethodsPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * From cd8afc3823af7dce009c700750a88de677d2af12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Wed, 15 Jan 2025 16:29:33 +0000 Subject: [PATCH 034/109] fix(web): adapt some text utilities after merge Same than done at 9eaaa81db045277ec2231ed2f179d389b221a2ea, but for files not previously adapted. --- web/src/components/storage/BootSelection.tsx | 2 +- web/src/components/storage/SpacePolicySelection.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/components/storage/BootSelection.tsx b/web/src/components/storage/BootSelection.tsx index 31df59f554..4fd312d545 100644 --- a/web/src/components/storage/BootSelection.tsx +++ b/web/src/components/storage/BootSelection.tsx @@ -136,7 +136,7 @@ partitions in the appropriate disk.",

{_("Boot options")}

-

{description}

+

{description}

diff --git a/web/src/components/storage/SpacePolicySelection.tsx b/web/src/components/storage/SpacePolicySelection.tsx index b0cc4724d3..484da7f7a0 100644 --- a/web/src/components/storage/SpacePolicySelection.tsx +++ b/web/src/components/storage/SpacePolicySelection.tsx @@ -101,7 +101,7 @@ export default function SpacePolicySelection() {

{sprintf(_("Find space in %s"), device.name)}

-

{description}

+

{description}

From c68c2f38e64b8b55127c0f8c9060014fd7b48d36 Mon Sep 17 00:00:00 2001 From: Eugenio Paolantonio Date: Wed, 15 Jan 2025 17:55:00 +0100 Subject: [PATCH 035/109] live: Drop patterns-yast-yast2_basis requirement yast packages should be installed per package and not as a whole pattern. Signed-off-by: Eugenio Paolantonio --- live/src/agama-installer.changes | 8 ++++++++ live/src/agama-installer.kiwi | 1 - 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/live/src/agama-installer.changes b/live/src/agama-installer.changes index 9eb42405ef..b8e7b46303 100644 --- a/live/src/agama-installer.changes +++ b/live/src/agama-installer.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Wed Jan 15 16:53:28 UTC 2025 - Eugenio Paolantonio + +- Drop patterns-yast-yast2_basis requirement + yast packages should be installed per package and not as + a whole pattern. + (gh#agama-project/agama#1893). + ------------------------------------------------------------------- Fri Jan 10 21:22:03 UTC 2025 - Imobach Gonzalez Sosa diff --git a/live/src/agama-installer.kiwi b/live/src/agama-installer.kiwi index c42a5995b7..4350da69b2 100644 --- a/live/src/agama-installer.kiwi +++ b/live/src/agama-installer.kiwi @@ -134,7 +134,6 @@ - From 12f8b6508e295c7287440d8dfda93b2e6a48383b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Wed, 15 Jan 2025 18:23:49 +0000 Subject: [PATCH 036/109] fix(web): drop no longer needed storage components Since they does not met requirements of the new storage interface. --- .../storage/BootConfigField.test.tsx | 80 -- .../components/storage/BootConfigField.tsx | 95 -- .../storage/InstallationDeviceField.test.tsx | 219 ----- .../storage/InstallationDeviceField.tsx | 113 --- .../storage/InvalidMaxSizeError.tsx | 46 - .../storage/PartitionsField.test.tsx | 488 ---------- .../components/storage/PartitionsField.tsx | 848 ------------------ .../components/storage/ProposalPage.test.tsx | 1 - .../storage/ProposalSettingsSection.test.tsx | 75 -- .../storage/ProposalSettingsSection.tsx | 141 --- .../storage/SnapshotsField.test.tsx | 70 -- web/src/components/storage/SnapshotsField.tsx | 74 -- .../components/storage/VolumeDialog.test.tsx | 428 --------- web/src/components/storage/VolumeDialog.tsx | 647 ------------- .../components/storage/VolumeFields.test.tsx | 191 ---- web/src/components/storage/VolumeFields.tsx | 554 ------------ .../storage/VolumeLocationDialog.test.tsx | 237 ----- .../storage/VolumeLocationDialog.tsx | 224 ----- .../storage/VolumeLocationSelectorTable.tsx | 133 --- web/src/components/storage/index.ts | 1 - 20 files changed, 4665 deletions(-) delete mode 100644 web/src/components/storage/BootConfigField.test.tsx delete mode 100644 web/src/components/storage/BootConfigField.tsx delete mode 100644 web/src/components/storage/InstallationDeviceField.test.tsx delete mode 100644 web/src/components/storage/InstallationDeviceField.tsx delete mode 100644 web/src/components/storage/InvalidMaxSizeError.tsx delete mode 100644 web/src/components/storage/PartitionsField.test.tsx delete mode 100644 web/src/components/storage/PartitionsField.tsx delete mode 100644 web/src/components/storage/ProposalSettingsSection.test.tsx delete mode 100644 web/src/components/storage/ProposalSettingsSection.tsx delete mode 100644 web/src/components/storage/SnapshotsField.test.tsx delete mode 100644 web/src/components/storage/SnapshotsField.tsx delete mode 100644 web/src/components/storage/VolumeDialog.test.tsx delete mode 100644 web/src/components/storage/VolumeDialog.tsx delete mode 100644 web/src/components/storage/VolumeFields.test.tsx delete mode 100644 web/src/components/storage/VolumeFields.tsx delete mode 100644 web/src/components/storage/VolumeLocationDialog.test.tsx delete mode 100644 web/src/components/storage/VolumeLocationDialog.tsx delete mode 100644 web/src/components/storage/VolumeLocationSelectorTable.tsx diff --git a/web/src/components/storage/BootConfigField.test.tsx b/web/src/components/storage/BootConfigField.test.tsx deleted file mode 100644 index 50958eb633..0000000000 --- a/web/src/components/storage/BootConfigField.test.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { screen } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import BootConfigField, { BootConfigFieldProps } from "~/components/storage/BootConfigField"; -import { StorageDevice } from "~/types/storage"; - -const sda: StorageDevice = { - sid: 59, - description: "A fake disk for testing", - isDrive: true, - type: "disk", - vendor: "Micron", - model: "Micron 1100 SATA", - driver: ["ahci", "mmcblk"], - bus: "IDE", - busId: "", - transport: "usb", - dellBOSS: false, - sdCard: true, - active: true, - name: "/dev/sda", - size: 1024, - shrinking: { unsupported: ["Resizing is not supported"] }, - systems: [], - udevIds: ["ata-Micron_1100_SATA_512GB_12563", "scsi-0ATA_Micron_1100_SATA_512GB"], - udevPaths: ["pci-0000:00-12", "pci-0000:00-12-ata"], -}; - -const props: BootConfigFieldProps = { - configureBoot: false, - bootDevice: undefined, - defaultBootDevice: undefined, - availableDevices: [sda], - isLoading: false, -}; - -describe.skip("BootConfigField", () => { - describe("when installation is set for not configuring boot", () => { - it("renders a text warning about it", () => { - plainRender(); - screen.getByText(/will not configure partitions/); - }); - }); - - describe("when installation is set for automatically configuring boot", () => { - it("renders a text reporting about it", () => { - plainRender(); - screen.getByText(/configure partitions for booting at the installation disk/); - }); - }); - - describe("when installation is set for configuring boot at specific device", () => { - it("renders a text reporting about it", () => { - plainRender(); - screen.getByText(/partitions for booting at \/dev\/sda/); - }); - }); -}); diff --git a/web/src/components/storage/BootConfigField.tsx b/web/src/components/storage/BootConfigField.tsx deleted file mode 100644 index b275592d55..0000000000 --- a/web/src/components/storage/BootConfigField.tsx +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { Link as RouterLink } from "react-router-dom"; -import { Skeleton } from "@patternfly/react-core"; -import { _ } from "~/i18n"; -import { sprintf } from "sprintf-js"; -import { deviceLabel } from "~/components/storage/utils"; -import { Icon } from "~/components/layout"; -import { StorageDevice } from "~/types/storage"; -import { STORAGE as PATHS } from "~/routes/paths"; - -/** - * Internal component for building the link that navigates to selector - * - * @param props - * @param [props.isBold=false] - Whether text should be wrapped by . - */ -const Link = ({ isBold = false }: { isBold?: boolean }) => { - const text = _("Change boot options"); - - return {isBold ? {text} : text}; -}; - -export type BootConfig = { - configureBoot: boolean; - bootDevice: StorageDevice; -}; - -export type BootConfigFieldProps = { - configureBoot: boolean; - bootDevice?: StorageDevice; - defaultBootDevice?: StorageDevice; - availableDevices: StorageDevice[]; - isLoading: boolean; -}; - -/** - * Summarizes how the system will boot. - * @component - */ -export default function BootConfigField({ - configureBoot, - bootDevice, - isLoading, -}: BootConfigFieldProps) { - if (isLoading && configureBoot === undefined) { - return ; - } - - let value: React.ReactNode; - - if (!configureBoot) { - value = ( - <> - {" "} - {_("Installation will not configure partitions for booting.")} - - ); - } else if (!bootDevice) { - value = _("Installation will configure partitions for booting at the installation disk."); - } else { - // TRANSLATORS: %s is the disk used to configure the boot-related partitions (eg. "/dev/sda, 80 GiB) - value = sprintf( - _("Installation will configure partitions for booting at %s."), - deviceLabel(bootDevice), - ); - } - - return ( -
- {value} -
- ); -} diff --git a/web/src/components/storage/InstallationDeviceField.test.tsx b/web/src/components/storage/InstallationDeviceField.test.tsx deleted file mode 100644 index 9967d39550..0000000000 --- a/web/src/components/storage/InstallationDeviceField.test.tsx +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -// @ts-check - -import React from "react"; -import { screen, within } from "@testing-library/react"; -import { installerRender } from "~/test-utils"; -import InstallationDeviceField, { - InstallationDeviceFieldProps, -} from "~/components/storage/InstallationDeviceField"; -import { ProposalTarget, StorageDevice } from "~/types/storage"; - -jest.mock("@patternfly/react-core", () => { - const original = jest.requireActual("@patternfly/react-core"); - - return { - ...original, - Skeleton: () =>
PF-Skeleton
, - }; -}); - -const sda: StorageDevice = { - sid: 59, - isDrive: true, - type: ProposalTarget.DISK, - description: "", - vendor: "Micron", - model: "Micron 1100 SATA", - driver: ["ahci", "mmcblk"], - bus: "IDE", - busId: "", - transport: "usb", - dellBOSS: false, - sdCard: true, - active: true, - name: "/dev/sda", - size: 1024, - shrinking: { unsupported: ["Resizing is not supported"] }, - systems: [], - udevIds: ["ata-Micron_1100_SATA_512GB_12563", "scsi-0ATA_Micron_1100_SATA_512GB"], - udevPaths: ["pci-0000:00-12", "pci-0000:00-12-ata"], -}; - -const sdb: StorageDevice = { - sid: 62, - isDrive: true, - type: ProposalTarget.DISK, - description: "", - vendor: "Samsung", - model: "Samsung Evo 8 Pro", - driver: ["ahci"], - bus: "IDE", - busId: "", - transport: "", - dellBOSS: false, - sdCard: false, - active: true, - name: "/dev/sdb", - size: 2048, - shrinking: { unsupported: ["Resizing is not supported"] }, - systems: [], - udevIds: [], - udevPaths: ["pci-0000:00-19"], -}; - -let props: InstallationDeviceFieldProps; - -beforeEach(() => { - props = { - target: ProposalTarget.DISK, - targetDevice: sda, - targetPVDevices: [], - devices: [sda, sdb], - isLoading: false, - onChange: jest.fn(), - }; -}); - -describe.skip("when set as loading", () => { - beforeEach(() => { - props.isLoading = true; - }); - - it("renders a loading hint", () => { - installerRender(); - - // a PF skeleton is displayed - screen.getByText("PF-Skeleton"); - }); -}); - -describe.skip("when the target is a disk", () => { - beforeEach(() => { - props.target = ProposalTarget.DISK; - }); - - describe("and installation device is not selected yet", () => { - beforeEach(() => { - props.targetDevice = undefined; - }); - - it("uses a 'No device selected yet' text for the selection button", async () => { - installerRender(); - screen.getByText("No device selected yet"); - }); - }); - - describe("and an installation device is selected", () => { - beforeEach(() => { - props.targetDevice = sda; - }); - - it("uses its name as part of the text for the selection button", async () => { - installerRender(); - screen.getByText(/\/dev\/sda/); - }); - }); -}); - -describe.skip("when the target is a new LVM volume group", () => { - beforeEach(() => { - props.target = ProposalTarget.NEW_LVM_VG; - }); - - describe("and the target devices are not selected yet", () => { - beforeEach(() => { - props.targetPVDevices = []; - }); - - it("uses a 'No device selected yet' text for the selection button", async () => { - installerRender(); - screen.getByText("No device selected yet"); - }); - }); - - describe("and there is a selected device", () => { - beforeEach(() => { - props.targetPVDevices = [sda]; - }); - - it("uses its name as part of the text for the selection button", async () => { - installerRender(); - screen.getByText(/new LVM .* \/dev\/sda/); - }); - }); - - describe("and there are more than one selected device", () => { - beforeEach(() => { - props.targetPVDevices = [sda, sdb]; - }); - - it("does not use the names as part of the text for the selection button", async () => { - installerRender(); - screen.getByText("new LVM volume group"); - }); - }); -}); - -it.skip("allows changing the selected device", async () => { - const { user } = installerRender(); - const button = screen.getByRole("button", { name: /installation device/i }); - - await user.click(button); - - const selector = await screen.findByRole("dialog", { name: /Device for installing/ }); - const diskGrid = within(selector).getByRole("grid", { name: /target disk/ }); - const sdbRow = within(diskGrid).getByRole("row", { name: /sdb/ }); - const sdbOption = within(sdbRow).getByRole("radio"); - const accept = within(selector).getByRole("button", { name: "Confirm" }); - - await user.click(sdbOption); - await user.click(accept); - - expect(screen.queryByRole("dialog")).not.toBeInTheDocument(); - expect(props.onChange).toHaveBeenCalledWith({ - target: ProposalTarget.DISK, - targetDevice: sdb, - targetPVDevices: [], - }); -}); - -it.skip("allows canceling a device selection", async () => { - const { user } = installerRender(); - const button = screen.getByRole("button", { name: /installation device/i }); - - await user.click(button); - - const selector = await screen.findByRole("dialog", { name: /Device for installing/ }); - const diskGrid = within(selector).getByRole("grid", { name: /target disk/ }); - const sdbRow = within(diskGrid).getByRole("row", { name: /sdb/ }); - const sdbOption = within(sdbRow).getByRole("radio"); - const cancel = within(selector).getByRole("button", { name: "Cancel" }); - - await user.click(sdbOption); - await user.click(cancel); - - expect(screen.queryByRole("dialog")).not.toBeInTheDocument(); - expect(props.onChange).not.toHaveBeenCalled(); -}); diff --git a/web/src/components/storage/InstallationDeviceField.tsx b/web/src/components/storage/InstallationDeviceField.tsx deleted file mode 100644 index 624bc95b9b..0000000000 --- a/web/src/components/storage/InstallationDeviceField.tsx +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { Skeleton } from "@patternfly/react-core"; -import { Link, Page } from "~/components/core"; -import { ProposalTarget, StorageDevice } from "~/types/storage"; -import { deviceLabel } from "~/components/storage/utils"; -import { STORAGE as PATHS } from "~/routes/paths"; -import { sprintf } from "sprintf-js"; -import { _ } from "~/i18n"; - -/** - * Generates the target value. - */ -const targetValue = ( - target: ProposalTarget, - targetDevice: StorageDevice, - targetPVDevices: StorageDevice[], -): string => { - if (target === ProposalTarget.DISK && targetDevice) { - // TRANSLATORS: %s is the installation disk (eg. "/dev/sda, 80 GiB) - return sprintf(_("File systems created as new partitions at %s"), deviceLabel(targetDevice)); - } - if (ProposalTarget.NEW_LVM_VG && targetPVDevices.length > 0) { - if (targetPVDevices.length > 1) return _("File systems created at a new LVM volume group"); - - if (targetPVDevices.length === 1) { - // TRANSLATORS: %s is the disk used for the LVM physical volumes (eg. "/dev/sda, 80 GiB) - return sprintf( - _("File systems created at a new LVM volume group on %s"), - deviceLabel(targetPVDevices[0]), - ); - } - } - - return _("No device selected yet"); -}; - -/** - * Allows to select the installation device. - * @component - */ - -export type TargetConfig = { - target: ProposalTarget; - targetDevice: StorageDevice | undefined; - targetPVDevices: StorageDevice[]; -}; - -export type InstallationDeviceFieldProps = { - // Installation target - target: ProposalTarget | undefined; - // Target device (for target "disk") - targetDevice: StorageDevice | undefined; - // Target devices for the LVM volume group (target "newLvmVg") - targetPVDevices: StorageDevice[]; - // Available devices for installation. - devices: StorageDevice[]; - isLoading: boolean; - onChange: (target: TargetConfig) => void; -}; - -export default function InstallationDeviceField({ - target, - targetDevice, - targetPVDevices, - isLoading, -}: InstallationDeviceFieldProps) { - let value: React.ReactNode; - if (isLoading || !target) value = ; - else value = targetValue(target, targetDevice, targetPVDevices); - - // TRANSLATORS: The storage "Installation device" field's description. - const description = _("Main disk or LVM Volume Group for installation."); - - return ( - - ) : ( - - {_("Change")} - - ) - } - > - {value} - - ); -} diff --git a/web/src/components/storage/InvalidMaxSizeError.tsx b/web/src/components/storage/InvalidMaxSizeError.tsx deleted file mode 100644 index 5bf1612d9e..0000000000 --- a/web/src/components/storage/InvalidMaxSizeError.tsx +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import { _ } from "~/i18n"; -import { SIZE_METHODS, SizeMethod } from "~/components/storage/utils"; - -export class InvalidMaxSizeError { - sizeMethod: SizeMethod; - minSize: string | number; - maxSize: string | number; - - constructor(sizeMethod: SizeMethod, minSize: string | number, maxSize: string | number) { - this.sizeMethod = sizeMethod; - this.minSize = minSize; - this.maxSize = maxSize; - } - - check(): boolean { - return ( - this.sizeMethod === SIZE_METHODS.RANGE && this.maxSize !== -1 && this.maxSize <= this.minSize - ); - } - - render(): string { - return _("Maximum must be greater than minimum"); - } -} diff --git a/web/src/components/storage/PartitionsField.test.tsx b/web/src/components/storage/PartitionsField.test.tsx deleted file mode 100644 index e4214fbd05..0000000000 --- a/web/src/components/storage/PartitionsField.test.tsx +++ /dev/null @@ -1,488 +0,0 @@ -/* - * Copyright (c) [2022-2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -// @ts-check - -import React from "react"; -import { screen, within } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import PartitionsField, { PartitionsFieldProps } from "~/components/storage/PartitionsField"; -import { ProposalTarget, StorageDevice, Volume, VolumeTarget } from "~/types/storage"; - -jest.mock("@patternfly/react-core", () => { - const original = jest.requireActual("@patternfly/react-core"); - - return { - ...original, - Skeleton: () =>
PFSkeleton
, - }; -}); - -const rootVolume: Volume = { - mountPath: "/", - target: VolumeTarget.DEFAULT, - fsType: "Btrfs", - minSize: 1024, - maxSize: 2048, - autoSize: false, - snapshots: false, - transactional: false, - outline: { - required: true, - fsTypes: ["Btrfs", "Ext4"], - supportAutoSize: true, - snapshotsConfigurable: true, - snapshotsAffectSizes: true, - sizeRelevantVolumes: [], - adjustByRam: false, - productDefined: true, - }, -}; - -const swapVolume: Volume = { - mountPath: "swap", - target: VolumeTarget.DEFAULT, - fsType: "Swap", - minSize: 1024, - maxSize: 1024, - autoSize: false, - snapshots: false, - transactional: false, - outline: { - required: false, - fsTypes: ["Swap"], - supportAutoSize: false, - snapshotsConfigurable: false, - snapshotsAffectSizes: false, - sizeRelevantVolumes: [], - adjustByRam: false, - productDefined: true, - }, -}; - -const homeVolume: Volume = { - mountPath: "/home", - target: VolumeTarget.DEFAULT, - fsType: "XFS", - minSize: 1024, - autoSize: false, - snapshots: false, - transactional: false, - outline: { - required: false, - fsTypes: ["Ext4", "XFS"], - supportAutoSize: false, - snapshotsConfigurable: false, - snapshotsAffectSizes: false, - sizeRelevantVolumes: [], - adjustByRam: false, - productDefined: true, - }, -}; - -const arbitraryVolume: Volume = { - mountPath: "", - target: VolumeTarget.DEFAULT, - fsType: "XFS", - minSize: 1024, - maxSize: 4096, - autoSize: false, - snapshots: false, - transactional: false, - outline: { - required: false, - fsTypes: ["Ext4", "XFS"], - supportAutoSize: false, - snapshotsConfigurable: false, - snapshotsAffectSizes: false, - adjustByRam: false, - sizeRelevantVolumes: [], - productDefined: false, - }, -}; - -const sda: StorageDevice = { - sid: 59, - name: "/dev/sda", - description: "", - isDrive: true, - type: "disk", - vendor: "Micron", - model: "Micron 1100 SATA", - transport: "usb", - size: 1024, -}; - -const sda1: StorageDevice = { - sid: 69, - name: "/dev/sda1", - description: "", - isDrive: false, - type: "partition", - size: 256, - filesystem: { - sid: 169, - type: "Swap", - }, -}; - -const sda2: StorageDevice = { - sid: 79, - name: "/dev/sda2", - description: "", - isDrive: false, - type: "partition", - size: 512, - filesystem: { - sid: 179, - type: "Ext4", - }, -}; - -let props: PartitionsFieldProps; - -const expandField = async () => { - const render = plainRender(); - const button = screen.getByRole("button", { name: "Partitions and file systems" }); - await render.user.click(button); - return render; -}; - -beforeEach(() => { - props = { - volumes: [rootVolume, swapVolume], - templates: [], - availableDevices: [], - volumeDevices: [sda], - target: ProposalTarget.DISK, - targetDevices: [], - configureBoot: false, - bootDevice: undefined, - defaultBootDevice: undefined, - onVolumesChange: jest.fn(), - }; -}); - -it.skip("allows to reset the file systems", async () => { - const { user } = await expandField(); - const button = screen.getByRole("button", { name: "Reset to defaults" }); - await user.click(button); - - expect(props.onVolumesChange).toHaveBeenCalledWith([]); -}); - -it.skip("renders a button for adding a file system when only arbitrary volumes can be added", async () => { - props.templates = [arbitraryVolume]; - const { user } = await expandField(); - const button = screen.getByRole("button", { name: "Add file system" }); - expect(button).not.toHaveAttribute("aria-expanded"); - await user.click(button); - screen.getByRole("dialog", { name: "Add file system" }); -}); - -it.skip("renders a menu for adding a file system when predefined and arbitrary volume can be added", async () => { - props.templates = [homeVolume, arbitraryVolume]; - const { user } = await expandField(); - - const button = screen.getByRole("button", { name: "Add file system" }); - expect(button).toHaveAttribute("aria-expanded", "false"); - await user.click(button); - - expect(button).toHaveAttribute("aria-expanded", "true"); - const homeOption = screen.getByRole("menuitem", { name: "/home" }); - await user.click(homeOption); - - screen.getByRole("dialog", { name: "Add /home file system" }); -}); - -it.skip("renders the control for adding a file system when using transactional system with optional templates", async () => { - props.templates = [{ ...rootVolume, transactional: true }, homeVolume]; - await expandField(); - screen.queryByRole("button", { name: "Add file system" }); -}); - -it.skip("does not render the control for adding a file system when using transactional system with no optional templates", async () => { - props.templates = [{ ...rootVolume, transactional: true }]; - await expandField(); - expect(screen.queryByRole("button", { name: "Add file system" })).toBeNull(); -}); - -it.skip("renders the control as disabled when there are no more left predefined volumes to add and arbitrary volumes are not allowed", async () => { - props.templates = [rootVolume, homeVolume]; - props.volumes = [rootVolume, homeVolume]; - await expandField(); - const button = screen.getByRole("button", { name: "Add file system" }); - expect(button).toBeDisabled(); -}); - -it.skip("allows to add a file system", async () => { - props.templates = [homeVolume]; - const { user } = await expandField(); - - const button = screen.getByRole("button", { name: "Add file system" }); - await user.click(button); - const homeOption = screen.getByRole("menuitem", { name: "/home" }); - await user.click(homeOption); - - const dialog = await screen.findByRole("dialog"); - const accept = within(dialog).getByRole("button", { name: "Accept" }); - await user.click(accept); - - expect(screen.queryByRole("dialog")).not.toBeInTheDocument(); - expect(props.onVolumesChange).toHaveBeenCalledWith([rootVolume, swapVolume, homeVolume]); -}); - -it.skip("allows to cancel adding a file system", async () => { - props.templates = [arbitraryVolume]; - const { user } = await expandField(); - - const button = screen.getByRole("button", { name: "Add file system" }); - await user.click(button); - - const popup = await screen.findByRole("dialog"); - const cancel = within(popup).getByRole("button", { name: "Cancel" }); - await user.click(cancel); - - expect(screen.queryByRole("dialog")).not.toBeInTheDocument(); - expect(props.onVolumesChange).not.toHaveBeenCalled(); -}); - -describe.skip("if there are volumes", () => { - beforeEach(() => { - props.volumes = [rootVolume, homeVolume, swapVolume]; - }); - - it("renders skeleton for each volume if loading", async () => { - props.isLoading = true; - await expandField(); - - const [, body] = await screen.findAllByRole("rowgroup"); - - const rows = within(body).getAllByRole("row"); - expect(rows.length).toEqual(3); - - const loadingRows = within(body).getAllByRole("row", { name: "PFSkeleton" }); - expect(loadingRows.length).toEqual(3); - }); - - it("renders the information for each volume", async () => { - await expandField(); - - const [, body] = await screen.findAllByRole("rowgroup"); - - expect(within(body).queryAllByRole("row").length).toEqual(3); - within(body).getByRole("row", { name: "/ Btrfs 1 KiB - 2 KiB Partition at installation disk" }); - within(body).getByRole("row", { - name: "/home XFS at least 1 KiB Partition at installation disk", - }); - within(body).getByRole("row", { name: "swap Swap 1 KiB Partition at installation disk" }); - }); - - it("allows deleting the volume", async () => { - const { user } = await expandField(); - - const [, body] = await screen.findAllByRole("rowgroup"); - const row = within(body).getByRole("row", { - name: "/home XFS at least 1 KiB Partition at installation disk", - }); - const actions = within(row).getByRole("button", { name: "Actions" }); - await user.click(actions); - const deleteAction = within(row).queryByRole("menuitem", { name: "Delete" }); - await user.click(deleteAction); - - expect(props.onVolumesChange).toHaveBeenCalledWith(expect.not.arrayContaining([homeVolume])); - }); - - it("allows editing the volume", async () => { - const { user } = await expandField(); - - const [, body] = await screen.findAllByRole("rowgroup"); - const row = within(body).getByRole("row", { - name: "/home XFS at least 1 KiB Partition at installation disk", - }); - const actions = within(row).getByRole("button", { name: "Actions" }); - await user.click(actions); - const editAction = within(row).queryByRole("menuitem", { name: "Edit" }); - await user.click(editAction); - - const popup = await screen.findByRole("dialog"); - within(popup).getByRole("heading", { name: "Edit /home file system" }); - }); - - it("allows changing the location of the volume", async () => { - const { user } = await expandField(); - - const [, body] = await screen.findAllByRole("rowgroup"); - const row = within(body).getByRole("row", { - name: "/home XFS at least 1 KiB Partition at installation disk", - }); - const actions = within(row).getByRole("button", { name: "Actions" }); - await user.click(actions); - const locationAction = within(row).queryByRole("menuitem", { name: "Change location" }); - await user.click(locationAction); - - const popup = await screen.findByRole("dialog"); - within(popup).getByText("Location for /home file system"); - }); - - // FIXME: improve at least the test description - it("does not allow resetting the volume location when already using the default location", async () => { - const { user } = await expandField(); - - const [, body] = await screen.findAllByRole("rowgroup"); - const row = within(body).getByRole("row", { - name: "/home XFS at least 1 KiB Partition at installation disk", - }); - const actions = within(row).getByRole("button", { name: "Actions" }); - await user.click(actions); - expect(within(row).queryByRole("menuitem", { name: "Reset location" })).toBeNull(); - }); - - describe("and a volume has a non default location", () => { - beforeEach(() => { - props.volumes = [{ ...homeVolume, target: VolumeTarget.NEW_PARTITION, targetDevice: sda }]; - }); - - it("allows resetting the volume location", async () => { - const { user } = await expandField(); - - const [, body] = await screen.findAllByRole("rowgroup"); - const row = within(body).getByRole("row", { - name: "/home XFS at least 1 KiB Partition at /dev/sda", - }); - const actions = within(row).getByRole("button", { name: "Actions" }); - await user.click(actions); - const resetLocationAction = within(row).queryByRole("menuitem", { name: "Reset location" }); - await user.click(resetLocationAction); - expect(props.onVolumesChange).toHaveBeenCalledWith( - expect.arrayContaining([ - expect.objectContaining({ - mountPath: "/home", - target: "DEFAULT", - targetDevice: undefined, - }), - ]), - ); - - // NOTE: sadly we cannot perform the below check because the component is - // always receiving the same mocked props and will still having a /home as - // "Partition at /dev/sda" - // await within(body).findByRole("row", { name: "/home XFS at least 1 KiB Partition at installation device" }); - }); - }); - - describe("and there is a transactional Btrfs root volume", () => { - beforeEach(() => { - props.volumes = [{ ...rootVolume, snapshots: true, transactional: true }]; - }); - - it("renders 'transactional' legend as part of its information", async () => { - await expandField(); - - const [, volumes] = await screen.findAllByRole("rowgroup"); - - within(volumes).getByRole("row", { - name: "/ Transactional Btrfs 1 KiB - 2 KiB Partition at installation disk", - }); - }); - }); - - describe("and there is Btrfs volume using snapshots", () => { - beforeEach(() => { - props.volumes = [{ ...rootVolume, snapshots: true, transactional: false }]; - }); - - it("renders 'with snapshots' legend as part of its information", async () => { - await expandField(); - - const [, volumes] = await screen.findAllByRole("rowgroup"); - - within(volumes).getByRole("row", { - name: "/ Btrfs with snapshots 1 KiB - 2 KiB Partition at installation disk", - }); - }); - }); - - describe("and some volumes are allocated at separate disks", () => { - beforeEach(() => { - props.volumes = [ - rootVolume, - { ...swapVolume, target: VolumeTarget.NEW_PARTITION, targetDevice: sda }, - { ...homeVolume, target: VolumeTarget.NEW_VG, targetDevice: sda }, - ]; - }); - - it("renders the locations", async () => { - await expandField(); - - const [, volumes] = await screen.findAllByRole("rowgroup"); - - within(volumes).getByRole("row", { name: "swap Swap 1 KiB Partition at /dev/sda" }); - within(volumes).getByRole("row", { - name: "/home XFS at least 1 KiB Separate LVM at /dev/sda", - }); - }); - }); - - describe("and some volumes are reusing existing block devices", () => { - beforeEach(() => { - props.volumes = [ - rootVolume, - { ...swapVolume, target: VolumeTarget.FILESYSTEM, targetDevice: sda1 }, - { ...homeVolume, target: VolumeTarget.DEVICE, targetDevice: sda2 }, - ]; - }); - - it("renders the locations", async () => { - await expandField(); - - const [, volumes] = await screen.findAllByRole("rowgroup"); - - within(volumes).getByRole("row", { name: "swap Reused Swap 256 B /dev/sda1" }); - within(volumes).getByRole("row", { name: "/home XFS 512 B /dev/sda2" }); - }); - }); -}); - -describe.skip("if there are not volumes", () => { - beforeEach(() => { - props.volumes = []; - }); - - it("renders an empty table if it is not loading", async () => { - await expandField(); - - const [, body] = await screen.findAllByRole("rowgroup"); - expect(body).toBeEmptyDOMElement(); - }); - - it("renders an skeleton row if it is loading", async () => { - props.isLoading = true; - - await expandField(); - - const [, body] = await screen.findAllByRole("rowgroup"); - const rows = within(body).getAllByRole("row", { name: "PFSkeleton" }); - - expect(rows.length).toEqual(1); - }); -}); diff --git a/web/src/components/storage/PartitionsField.tsx b/web/src/components/storage/PartitionsField.tsx deleted file mode 100644 index 3869843e1c..0000000000 --- a/web/src/components/storage/PartitionsField.tsx +++ /dev/null @@ -1,848 +0,0 @@ -/* - * Copyright (c) [2022-2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React, { useState } from "react"; -import { - Button, - CardExpandableContent, - Divider, - Dropdown, - DropdownItem, - DropdownList, - Flex, - List, - ListItem, - MenuToggle, - Skeleton, - Split, - Stack, -} from "@patternfly/react-core"; -import { Table, Thead, Tr, Th, Tbody, Td } from "@patternfly/react-table"; -import { Page, RowActions, Tip } from "~/components/core"; -import { noop } from "~/utils"; -import { _ } from "~/i18n"; -import { sprintf } from "sprintf-js"; -import { - deviceSize, - hasSnapshots, - isTransactionalRoot, - isTransactionalSystem, - reuseDevice, -} from "~/components/storage/utils"; -import BootConfigField from "~/components/storage/BootConfigField"; -import SnapshotsField, { SnapshotsConfig } from "~/components/storage/SnapshotsField"; -import VolumeDialog from "./VolumeDialog"; -import VolumeLocationDialog from "~/components/storage/VolumeLocationDialog"; -import { ProposalTarget, StorageDevice, Volume, VolumeTarget } from "~/types/storage"; - -/** - * @component - */ -const SizeText = ({ volume }: { volume: Volume }) => { - let targetSize: number; - if (reuseDevice(volume)) targetSize = volume.targetDevice.size; - - const minSize = deviceSize(targetSize || volume.minSize); - const maxSize = targetSize - ? deviceSize(targetSize) - : volume.maxSize - ? deviceSize(volume.maxSize) - : undefined; - - if (minSize && maxSize && minSize !== maxSize) return `${minSize} - ${maxSize}`; - // TRANSLATORS: minimum device size, %s is replaced by size string, e.g. "17.5 GiB" - if (maxSize === undefined) return sprintf(_("at least %s"), minSize); - - return `${minSize}`; -}; - -const BasicVolumeText = ({ volume, target }: { volume: Volume; target: ProposalTarget }) => { - const snapshots = hasSnapshots(volume); - const transactional = isTransactionalRoot(volume); - const size = SizeText({ volume }); - const lvm = target === ProposalTarget.NEW_LVM_VG; - // When target is "filesystem" or "device" this is irrelevant since the type of device - // is not mentioned - const lv = - volume.target === VolumeTarget.NEW_VG || (volume.target === VolumeTarget.DEFAULT && lvm); - - if (transactional) - return lv - ? // TRANSLATORS: "/" is in an LVM logical volume. %s replaced by size string, e.g. "17.5 GiB" - sprintf(_("Transactional Btrfs root volume (%s)"), size) - : // TRANSLATORS: %s replaced by size string, e.g. "17.5 GiB" - sprintf(_("Transactional Btrfs root partition (%s)"), size); - - if (snapshots) - return lv - ? // TRANSLATORS: "/" is in an LVM logical volume. %s replaced by size string, e.g. "17.5 GiB" - sprintf(_("Btrfs root volume with snapshots (%s)"), size) - : // TRANSLATORS: %s replaced by size string, e.g. "17.5 GiB" - sprintf(_("Btrfs root partition with snapshots (%s)"), size); - - const volTarget = volume.target; - const mount = volume.mountPath; - const device = volume.targetDevice?.name; - - if (volTarget === VolumeTarget.FILESYSTEM) - // TRANSLATORS: This results in something like "Mount /dev/sda3 at /home (25 GiB)" since - // %1$s is replaced by the device name, %2$s by the mount point and %3$s by the size - return sprintf(_("Mount %1$s at %2$s (%3$s)"), device, mount, size); - - if (mount === "swap") { - if (volTarget === VolumeTarget.DEVICE) - // TRANSLATORS: This results in something like "Swap at /dev/sda3 (2 GiB)" since - // %1$s is replaced by the device name, and %2$s by the size - return sprintf(_("Swap at %1$s (%2$s)"), device, size); - - return lv - ? // TRANSLATORS: Swap is in an LVM logical volume. %s replaced by size string, e.g. "8 GiB" - sprintf(_("Swap volume (%s)"), size) - : // TRANSLATORS: %s replaced by size string, e.g. "8 GiB" - sprintf(_("Swap partition (%s)"), size); - } - - const type = volume.fsType; - - if (mount === "/") { - if (volTarget === VolumeTarget.DEVICE) - // TRANSLATORS: This results in something like "Btrfs root at /dev/sda3 (20 GiB)" since - // %1$s is replaced by the filesystem type, %2$s by the device name, and %3$s by the size - return sprintf(_("%1$s root at %2$s (%3$s)"), type, device, size); - - return lv - ? // TRANSLATORS: "/" is in an LVM logical volume. - // Results in something like "Btrfs root volume (at least 20 GiB)" since - // $1$s is replaced by filesystem type and %2$s by size description - sprintf(_("%1$s root volume (%2$s)"), type, size) - : // TRANSLATORS: Results in something like "Btrfs root partition (at least 20 GiB)" since - // $1$s is replaced by filesystem type and %2$s by size description - sprintf(_("%1$s root partition (%2$s)"), type, size); - } - - if (volTarget === VolumeTarget.DEVICE) - // TRANSLATORS: This results in something like "Ext4 /home at /dev/sda3 (20 GiB)" since - // %1$s is replaced by filesystem type, %2$s by mount point, %3$s by device name and %4$s by size - return sprintf(_("%1$s %2$s at %3$s (%4$s)"), type, mount, device, size); - - return lv - ? // TRANSLATORS: The filesystem is in an LVM logical volume. - // Results in something like "Ext4 /home volume (at least 10 GiB)" since - // %1$s is replaced by the filesystem type, %2$s by the mount point and %3$s by the size description - sprintf(_("%1$s %2$s volume (%3$s)"), type, mount, size) - : // TRANSLATORS: This results in something like "Ext4 /home partition (at least 10 GiB)" since - // %1$s is replaced by the filesystem type, %2$s by the mount point and %3$s by the size description - sprintf(_("%1$s %2$s partition (%3$s)"), type, mount, size); -}; - -/** - * Generates a text explaining the system boot configuration. - * @component - */ -const BootLabelText = ({ configure, device }: { configure: boolean; device: StorageDevice }) => { - if (!configure) return _("Do not configure partitions for booting"); - - if (!device) return _("Boot partitions at installation disk"); - - // TRANSLATORS: %s is the disk used to configure the boot-related partitions (eg. "/dev/sda, 80 GiB) - return sprintf(_("Boot partitions at %s"), device.name); -}; - -/** - * Generates an hint describing which attributes affect the auto-calculated limits. - * If the limits are not affected then it returns `null`. - * @component - */ -const AutoCalculatedHint = ({ volume }: { volume: Volume }) => { - const { snapshotsAffectSizes = false, sizeRelevantVolumes = [], adjustByRam } = volume.outline; - - // no hint, the size is not affected by known criteria - if (!snapshotsAffectSizes && !adjustByRam && sizeRelevantVolumes.length === 0) { - return null; - } - - return ( - <> - {/* TRANSLATORS: header for a list of items referring to size limits for file systems */} - {_("These limits are affected by:")} - - {snapshotsAffectSizes && ( - // TRANSLATORS: list item, this affects the computed partition size limits - {_("The configuration of snapshots")} - )} - {sizeRelevantVolumes.length > 0 && ( - // TRANSLATORS: list item, this affects the computed partition size limits - // %s is replaced by a list of the volumes (like "/home, /boot") - - {sprintf(_("Presence of other volumes (%s)"), sizeRelevantVolumes.join(", "))} - - )} - {adjustByRam && ( - // TRANSLATORS: list item, describes a factor that affects the computed size of a - // file system; eg. adjusting the size of the swap - {_("The amount of RAM in the system")} - )} - - - ); -}; - -/** - * @component - */ -const VolumeLabel = ({ volume, target }: { volume: Volume; target: ProposalTarget }) => { - return ( - - {BasicVolumeText({ volume, target })} - - ); -}; - -const BootLabel = ({ - bootDevice, - configureBoot, -}: { - bootDevice: StorageDevice | undefined; - configureBoot: boolean; -}) => { - return ( - - {BootLabelText({ configure: configureBoot, device: bootDevice })} - - ); -}; - -// TODO: Extract VolumesTable or at least VolumeRow and all related internal -// components to a new file. - -const VolumeSizeLimits = ({ volume }: { volume: Volume }) => { - const isAuto = volume.autoSize; - - return ( - - {SizeText({ volume })} - {/* TRANSLATORS: device flag, the partition size is automatically computed */} - {isAuto && !reuseDevice(volume) && ( - {_("auto")} - )} - - ); -}; - -const VolumeDetails = ({ volume }: { volume: Volume }) => { - const snapshots = hasSnapshots(volume); - const transactional = isTransactionalRoot(volume); - - if (volume.target === VolumeTarget.FILESYSTEM) - // TRANSLATORS: %s will be replaced by a file-system type like "Btrfs" or "Ext4" - return sprintf(_("Reused %s"), volume.targetDevice?.filesystem?.type || ""); - if (transactional) return _("Transactional Btrfs"); - if (snapshots) return _("Btrfs with snapshots"); - - return volume.fsType; -}; - -type VolumeLocationProps = { - volume: Volume; - target: ProposalTarget; -}; - -const VolumeLocation = ({ volume, target }: VolumeLocationProps) => { - if (volume.target === VolumeTarget.NEW_PARTITION) - // TRANSLATORS: %s will be replaced by a disk name (eg. "/dev/sda") - return sprintf(_("Partition at %s"), volume.targetDevice?.name || ""); - if (volume.target === VolumeTarget.NEW_VG) - // TRANSLATORS: %s will be replaced by a disk name (eg. "/dev/sda") - return sprintf(_("Separate LVM at %s"), volume.targetDevice?.name || ""); - if (volume.target === VolumeTarget.DEVICE || volume.target === VolumeTarget.FILESYSTEM) - return volume.targetDevice?.name || ""; - if (target === ProposalTarget.NEW_LVM_VG) return _("Logical volume at system LVM"); - - return _("Partition at installation disk"); -}; - -type VolumeActionsProps = { - volume: Volume; - onEdit: () => void; - onResetLocation: () => void; - onLocation: () => void; - onDelete: () => void; -}; - -const VolumeActions = ({ - volume, - onEdit, - onResetLocation, - onLocation, - onDelete, -}: VolumeActionsProps) => { - const actions = [ - { title: _("Edit"), onClick: onEdit }, - volume.target !== "default" && { title: _("Reset location"), onClick: onResetLocation }, - { title: _("Change location"), onClick: onLocation }, - !volume.outline.required && { title: _("Delete"), onClick: onDelete, isDanger: true }, - ]; - - return ; -}; - -type VolumeRowProps = { - columns?; - volume?: Volume; - volumes?: Volume[]; - templates?: Volume[]; - volumeDevices?: StorageDevice[]; - target?: ProposalTarget; - targetDevices?: StorageDevice[]; - isLoading: boolean; - onEdit?: (volume: Volume) => void; - onDelete?: () => void; -}; - -/** - * Renders a table row with the information and actions for a volume - * @component - */ -const VolumeRow = ({ - columns, - volume, - volumes, - templates, - volumeDevices, - target, - targetDevices, - isLoading, - onEdit = noop, - onDelete = noop, -}: VolumeRowProps) => { - const [dialog, setDialog] = useState(); - - const openEditDialog = () => setDialog("edit"); - - const openLocationDialog = () => setDialog("location"); - - const closeDialog = () => setDialog(undefined); - - const onResetLocationClick = () => { - onEdit({ ...volume, target: VolumeTarget.DEFAULT, targetDevice: undefined }); - }; - - const acceptForm = (volume: Volume) => { - closeDialog(); - onEdit(volume); - }; - - const isEditDialogOpen = dialog === "edit"; - const isLocationDialogOpen = dialog === "location"; - - if (isLoading) { - return ( -
- - - ); - } - - return ( - <> - - - - - - - - {isEditDialogOpen && ( - - )} - {isLocationDialogOpen && ( - - )} - - ); -}; - -type VolumesTableProps = { - volumes: Volume[]; - templates: Volume[]; - volumeDevices: StorageDevice[]; - target: ProposalTarget; - targetDevices: StorageDevice[]; - isLoading: boolean; - onVolumesChange: (volumes: Volume[]) => void; -}; - -/** - * Renders a table with the information and actions of the volumes - * @component - */ -const VolumesTable = ({ - volumes, - templates, - volumeDevices, - target, - targetDevices, - isLoading, - onVolumesChange, -}: VolumesTableProps) => { - const columns = { - mountPath: _("Mount point"), - details: _("Details"), - size: _("Size"), - // TRANSLATORS: where (and how) the file-system is going to be created - location: _("Location"), - actions: _("Actions"), - }; - - const editVolume = (volume: Volume) => { - const index = volumes.findIndex((v) => v.mountPath === volume.mountPath); - const newVolumes = [...volumes]; - newVolumes[index] = volume; - onVolumesChange(newVolumes); - }; - - const deleteVolume = (volume: Volume) => { - const newVolumes = volumes.filter((v) => v.mountPath !== volume.mountPath); - onVolumesChange(newVolumes); - }; - - const renderVolumes: () => React.ReactElement[] | React.ReactElement = () => { - if (volumes.length === 0 && isLoading) return ; - - return volumes.map((volume, index) => { - return ( - deleteVolume(volume)} - /> - ); - }); - }; - - return ( -
- -
{volume.mountPath} - - - - - - - -
- - - - - - - - - {renderVolumes()} -
{columns.mountPath}{columns.details}{columns.size}{columns.location} -
- ); -}; - -/** - * Content to show when the field is collapsed. - * @component - */ -const Basic = ({ - volumes, - configureBoot, - bootDevice, - target, - isLoading, -}: { - volumes: Volume[]; - configureBoot: boolean; - bootDevice: StorageDevice | undefined; - target: ProposalTarget; - isLoading: boolean; -}) => { - if (isLoading) - return ( - - - - - - ); - - return ( - - {volumes.map((v, i) => ( - - ))} - - - ); -}; - -/** - * Button for adding a new volume. It renders either a menu or a button depending on the number - * of options. - * @component - * - * @param props - * @param props.options - Possible mount points to add. An empty string represent an - * arbitrary mount point. - * @param props.onClick - */ -const AddVolumeButton = ({ - options, - onClick, -}: { - options: string[]; - onClick: (option: string) => void; -}) => { - const [isOpen, setIsOpen] = React.useState(false); - - const onToggleClick: () => void = () => setIsOpen(!isOpen); - - const onSelect: (_, value: string) => void = (_, value): void => { - setIsOpen(false); - onClick(value); - }; - - // Shows a button if the only option is to add an arbitrary volume. - if (options.length === 1 && options[0] === "") { - return ( - - ); - } - - const isDisabled = !options.length; - - return ( - ( - - {_("Add file system")} - - )} - shouldFocusToggleOnSelect - > - - {options.map((option, index) => { - if (option === "") { - return ( - - - - {_("Other")} - - - ); - } else { - return ( - - {option} - - ); - } - })} - - - ); -}; - -type AdvancedProps = { - volumes: Volume[]; - templates: Volume[]; - availableDevices: StorageDevice[]; - volumeDevices: StorageDevice[]; - target: ProposalTarget; - targetDevices: StorageDevice[]; - configureBoot: boolean; - bootDevice: StorageDevice | undefined; - defaultBootDevice: StorageDevice | undefined; - onVolumesChange: (volumes: Volume[]) => void; - isLoading: boolean; -}; - -/** - * Content to show when the field is expanded. - * @component - * - */ -const Advanced = ({ - volumes, - templates, - availableDevices, - volumeDevices, - target, - targetDevices, - configureBoot, - bootDevice, - defaultBootDevice, - onVolumesChange, - isLoading, -}: AdvancedProps) => { - const [isVolumeDialogOpen, setIsVolumeDialogOpen] = useState(false); - const [template, setTemplate] = useState(); - - const openVolumeDialog = () => setIsVolumeDialogOpen(true); - - const closeVolumeDialog = () => setIsVolumeDialogOpen(false); - - const onAcceptVolumeDialog: (volume: Volume) => void = (volume) => { - closeVolumeDialog(); - - const index = volumes.findIndex((v) => v.mountPath === volume.mountPath); - - if (index !== -1) { - const newVolumes = [...volumes]; - newVolumes[index] = volume; - onVolumesChange(newVolumes); - } else { - onVolumesChange([...volumes, volume]); - } - }; - - const resetVolumes = () => onVolumesChange([]); - - const addVolume: (mountPath: string) => void = (mountPath) => { - const template = templates.find((t) => t.mountPath === mountPath); - setTemplate(template); - openVolumeDialog(); - }; - - /** - * Possible mount paths to add. - */ - const mountPathOptions: () => string[] = () => { - const mountPaths = volumes.map((v) => v.mountPath); - const isTransactional = isTransactionalSystem(templates); - - return templates - .map((t) => t.mountPath) - .filter((p) => !mountPaths.includes(p)) - .filter((p) => !isTransactional || p.length); - }; - - /** - * Whether to show the button for adding a volume. - */ - const showAddVolume: () => boolean = () => { - const hasOptionalVolumes = () => { - return templates.find((t) => t.mountPath.length && !t.outline.required) !== undefined; - }; - - return !isTransactionalSystem(templates) || hasOptionalVolumes(); - }; - - const rootVolume = volumes.find((v: Volume) => v.mountPath === "/"); - - const changeBtrfsSnapshots: (config: SnapshotsConfig) => void = ({ active }) => { - if (active) { - rootVolume.fsType = "Btrfs"; - rootVolume.snapshots = true; - } else { - rootVolume.snapshots = false; - } - - onVolumesChange(volumes); - }; - - const showSnapshotsField = rootVolume?.outline.snapshotsConfigurable; - - return ( - - {showSnapshotsField && ( - - )} - - - {showAddVolume() && } - - - {isVolumeDialogOpen && ( - - )} - - - - ); -}; - -export type PartitionsFieldProps = { - volumes: Volume[]; - templates: Volume[]; - availableDevices: StorageDevice[]; - volumeDevices: StorageDevice[]; - target: ProposalTarget; - targetDevices: StorageDevice[]; - configureBoot: boolean; - bootDevice: StorageDevice | undefined; - defaultBootDevice: StorageDevice | undefined; - isLoading?: boolean; - onVolumesChange: (volumes: Volume[]) => void; -}; - -/** - * @todo This component should be restructured to use the same approach as other newer components: - * * Use a TreeTable, specially if we need to represent subvolumes. - * - * Renders information of the volumes and boot-related partitions and actions to modify them. - * @component - */ -export default function PartitionsField({ - volumes, - templates, - availableDevices, - volumeDevices, - target, - targetDevices, - configureBoot, - bootDevice, - defaultBootDevice, - isLoading = false, - onVolumesChange, -}: PartitionsFieldProps) { - const [isExpanded, setIsExpanded] = useState(false); - const onExpand = () => setIsExpanded(!isExpanded); - - return ( - - {!isExpanded && ( - - )} - - - - - ); -} diff --git a/web/src/components/storage/ProposalPage.test.tsx b/web/src/components/storage/ProposalPage.test.tsx index f16f32d8fc..bd1cc78388 100644 --- a/web/src/components/storage/ProposalPage.test.tsx +++ b/web/src/components/storage/ProposalPage.test.tsx @@ -43,7 +43,6 @@ jest.mock("~/queries/issues", () => ({ useIssues: () => [], })); -jest.mock("./ProposalSettingsSection", () => () =>
proposal settings
); jest.mock("./ProposalResultSection", () => () =>
result section
); jest.mock("./ProposalTransactionalInfo", () => () =>
trasactional info
); diff --git a/web/src/components/storage/ProposalSettingsSection.test.tsx b/web/src/components/storage/ProposalSettingsSection.test.tsx deleted file mode 100644 index 85dae759d7..0000000000 --- a/web/src/components/storage/ProposalSettingsSection.test.tsx +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) [2022-2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { screen, within } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import { ProposalSettingsSection } from "~/components/storage"; -import { ProposalTarget } from "~/types/storage"; -import { ProposalSettingsSectionProps } from "./ProposalSettingsSection"; - -let props: ProposalSettingsSectionProps; - -beforeEach(() => { - props = { - settings: { - target: ProposalTarget.DISK, - targetDevice: "/dev/sda", - targetPVDevices: [], - configureBoot: false, - bootDevice: "", - defaultBootDevice: "", - encryptionPassword: "", - encryptionMethod: "", - spacePolicy: "delete", - spaceActions: [], - volumes: [], - installationDevices: [], - }, - availableDevices: [], - volumeDevices: [], - encryptionMethods: [], - volumeTemplates: [], - onChange: jest.fn(), - }; -}); - -it("allows changing the selected device", () => { - plainRender(); - const region = screen.getByRole("region", { name: "Installation device" }); - const link: HTMLAnchorElement = within(region).getByRole("link", { name: "Change" }); - expect(link.href).toMatch(/storage\/target-device/); -}); - -it("allows changing the encryption settings", async () => { - const { user } = plainRender(); - const region = screen.getByRole("region", { name: "Encryption" }); - const button = within(region).getByRole("button", { name: "Enable" }); - await user.click(button); - await screen.findByRole("dialog", { name: "Encryption" }); -}); - -it("renders a section holding file systems related stuff", () => { - plainRender(); - const region = screen.getByRole("region", { name: "Partitions and file systems" }); - expect(region).toBeInTheDocument(); -}); diff --git a/web/src/components/storage/ProposalSettingsSection.tsx b/web/src/components/storage/ProposalSettingsSection.tsx deleted file mode 100644 index 03878de865..0000000000 --- a/web/src/components/storage/ProposalSettingsSection.tsx +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) [2022-2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { Grid, GridItem } from "@patternfly/react-core"; -import EncryptionField, { EncryptionConfig } from "~/components/storage/EncryptionField"; -import InstallationDeviceField, { - TargetConfig, -} from "~/components/storage/InstallationDeviceField"; -import PartitionsField from "~/components/storage/PartitionsField"; -import { CHANGING, NOT_AFFECTED } from "~/components/storage/ProposalPage"; -import { ProposalSettings, StorageDevice, Volume } from "~/types/storage"; -import { compact } from "~/utils"; - -/** - * A helper function to decide whether to show the progress skeletons or not - * for the specified component - * @param loading - loading status - * @param component - name of the component - * @param changing - the item which is being changed - * @returns {boolean} true if the skeleton should be displayed, false otherwise - */ -const showSkeleton = (loading: boolean, component: string, changing: symbol): boolean => { - return loading && !NOT_AFFECTED[component].includes(changing); -}; - -export type ProposalSettingsSectionProps = { - settings: ProposalSettings; - availableDevices: StorageDevice[]; - volumeDevices: StorageDevice[]; - encryptionMethods: string[]; - volumeTemplates: Volume[]; - isLoading?: boolean; - changing?: symbol; - onChange: (changing: symbol, settings: object) => void; -}; - -/** - * Section for editing the proposal settings - * @component - */ -export default function ProposalSettingsSection({ - settings, - availableDevices, - volumeDevices, - encryptionMethods, - volumeTemplates, - isLoading = false, - changing = undefined, - onChange, -}: ProposalSettingsSectionProps) { - const changeTarget = ({ target, targetDevice, targetPVDevices }: TargetConfig) => { - onChange(CHANGING.TARGET, { - target, - targetDevice: targetDevice?.name, - targetPVDevices: targetPVDevices.map((d) => d.name), - }); - }; - - const changeEncryption = ({ password, method }: EncryptionConfig) => { - onChange(CHANGING.ENCRYPTION, { encryptionPassword: password, encryptionMethod: method }); - }; - - const changeVolumes = (volumes: Volume[]) => { - onChange(CHANGING.VOLUMES, { volumes }); - }; - - /** - * @param {string} name - * @returns {StorageDevice|undefined} - */ - const findDevice = (name: string): StorageDevice | undefined => - availableDevices.find((a) => a.name === name); - - const targetDevice: StorageDevice | undefined = findDevice(settings.targetDevice); - const targetPVDevices: StorageDevice[] = compact(settings.targetPVDevices?.map(findDevice) || []); - const { volumes = [] } = settings; - const bootDevice = findDevice(settings.bootDevice); - const defaultBootDevice = findDevice(settings.defaultBootDevice); - const targetDevices = compact([targetDevice, ...targetPVDevices]); - - return ( - - - - - - - - - - - - ); -} diff --git a/web/src/components/storage/SnapshotsField.test.tsx b/web/src/components/storage/SnapshotsField.test.tsx deleted file mode 100644 index 9603e4a61a..0000000000 --- a/web/src/components/storage/SnapshotsField.test.tsx +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -// @ts-check - -import React from "react"; -import { screen } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import SnapshotsField, { SnapshotsFieldProps } from "~/components/storage/SnapshotsField"; -import { Volume, VolumeTarget } from "~/types/storage"; - -const rootVolume: Volume = { - mountPath: "/", - target: VolumeTarget.DEFAULT, - fsType: "Btrfs", - minSize: 1024, - autoSize: true, - snapshots: true, - transactional: false, - outline: { - required: true, - fsTypes: ["ext4", "btrfs"], - supportAutoSize: true, - snapshotsConfigurable: false, - snapshotsAffectSizes: true, - adjustByRam: false, - sizeRelevantVolumes: ["/home"], - productDefined: true, - }, -}; - -const onChangeFn = jest.fn(); - -let props: SnapshotsFieldProps; - -describe("SnapshotsField", () => { - it("reflects snapshots status", () => { - props = { rootVolume: { ...rootVolume, snapshots: true }, onChange: onChangeFn }; - plainRender(); - const checkbox: HTMLInputElement = screen.getByRole("checkbox"); - expect(checkbox.value).toEqual("on"); - }); - - it("allows toggling snapshots status", async () => { - props = { rootVolume: { ...rootVolume, snapshots: true }, onChange: onChangeFn }; - const { user } = plainRender(); - const checkbox: HTMLInputElement = screen.getByRole("checkbox"); - await user.click(checkbox); - expect(onChangeFn).toHaveBeenCalledWith({ active: false }); - }); -}); diff --git a/web/src/components/storage/SnapshotsField.tsx b/web/src/components/storage/SnapshotsField.tsx deleted file mode 100644 index 1235e3b81f..0000000000 --- a/web/src/components/storage/SnapshotsField.tsx +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -// @ts-check - -import React from "react"; -import { Split, Switch } from "@patternfly/react-core"; -import { _ } from "~/i18n"; -import { hasFS } from "~/components/storage/utils"; -import textStyles from "@patternfly/react-styles/css/utilities/Text/text"; -import { Volume } from "~/types/storage"; - -export type SnapshotsFieldProps = { - rootVolume: Volume; - onChange?: (config: SnapshotsConfig) => void; -}; - -export type SnapshotsConfig = { - active: boolean; -}; - -/** - * Allows to define snapshots enablement - * @component - */ -export default function SnapshotsField({ rootVolume, onChange }: SnapshotsFieldProps) { - const isChecked = hasFS(rootVolume, "Btrfs") && rootVolume.snapshots; - - const label = _("Use Btrfs snapshots for the root file system"); - - const switchState = () => { - if (onChange) onChange({ active: !isChecked }); - }; - - return ( - - -
-
{label}
-
- {_( - "Allows to boot to a previous version of the \ -system after configuration changes or software upgrades.", - )} -
-
-
- ); -} diff --git a/web/src/components/storage/VolumeDialog.test.tsx b/web/src/components/storage/VolumeDialog.test.tsx deleted file mode 100644 index e249dfd9e9..0000000000 --- a/web/src/components/storage/VolumeDialog.test.tsx +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright (c) [2004] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -// @ts-check - -import React from "react"; -import { screen, waitFor, within } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import { parseToBytes } from "~/components/storage/utils"; -import VolumeDialog, { VolumeDialogProps } from "./VolumeDialog"; -import { Volume, VolumeTarget } from "~/types/storage"; - -const rootVolume: Volume = { - mountPath: "/", - target: VolumeTarget.DEFAULT, - fsType: "Btrfs", - minSize: 1024, - maxSize: 2048, - autoSize: false, - snapshots: false, - transactional: false, - outline: { - required: true, - fsTypes: ["Btrfs", "Ext4"], - supportAutoSize: true, - snapshotsConfigurable: true, - snapshotsAffectSizes: true, - sizeRelevantVolumes: [], - adjustByRam: false, - productDefined: true, - }, -}; - -const swapVolume: Volume = { - mountPath: "swap", - target: VolumeTarget.DEFAULT, - fsType: "Swap", - minSize: 1024, - maxSize: 1024, - autoSize: false, - snapshots: false, - transactional: false, - outline: { - required: false, - fsTypes: ["Swap"], - supportAutoSize: false, - snapshotsConfigurable: false, - snapshotsAffectSizes: false, - adjustByRam: false, - sizeRelevantVolumes: [], - productDefined: true, - }, -}; - -const homeVolume: Volume = { - mountPath: "/home", - target: VolumeTarget.DEFAULT, - fsType: "XFS", - minSize: 1024, - maxSize: 4096, - autoSize: false, - snapshots: false, - transactional: false, - outline: { - required: false, - fsTypes: ["Ext4", "XFS"], - supportAutoSize: false, - snapshotsConfigurable: false, - snapshotsAffectSizes: false, - adjustByRam: false, - sizeRelevantVolumes: [], - productDefined: true, - }, -}; - -const arbitraryVolume: Volume = { - mountPath: "", - target: VolumeTarget.DEFAULT, - fsType: "XFS", - minSize: 1024, - maxSize: 4096, - autoSize: false, - snapshots: false, - transactional: false, - outline: { - required: false, - fsTypes: ["Ext4", "XFS"], - supportAutoSize: false, - snapshotsConfigurable: false, - snapshotsAffectSizes: false, - adjustByRam: false, - sizeRelevantVolumes: [], - productDefined: false, - }, -}; - -let props: VolumeDialogProps; - -describe("VolumeDialog", () => { - beforeEach(() => { - props = { - volume: undefined, - volumes: [], - templates: [], - isOpen: true, - onCancel: jest.fn(), - onAccept: jest.fn(), - }; - }); - - describe("when adding a new volume", () => { - describe("predefined by the product", () => { - it("does not allow settings the mount point", () => { - plainRender(); - expect(screen.queryByRole("textbox", { name: "Mount point" })).toBeNull(); - }); - }); - - describe("not predefined by the product", () => { - it("allows setting the mount point", async () => { - const { user } = plainRender(); - const mountPointInput = screen.getByRole("textbox", { name: "Mount point" }); - const submit = screen.getByRole("button", { name: "Accept" }); - await user.type(mountPointInput, "/var/log"); - await user.click(submit); - expect(props.onAccept).toHaveBeenCalledWith( - expect.objectContaining({ mountPath: "/var/log" }), - ); - }); - }); - - it("renders a file system picker if it allows more than one", async () => { - const { user } = plainRender(); - const fsTypeButton = screen.getByRole("button", { name: "File system type" }); - await user.click(fsTypeButton); - screen.getByRole("option", { name: "XFS" }); - screen.getByRole("option", { name: "Ext4" }); - }); - - it("does not render a file system picker when it accepts only one", async () => { - plainRender(); - await waitFor(() => - expect(screen.queryByRole("button", { name: "File system type" })).not.toBeInTheDocument(), - ); - }); - - it("renders 'Auto', 'Fixed', and 'Range' size options when volume supports auto size", () => { - plainRender(); - screen.getByRole("radio", { name: "Auto" }); - screen.getByRole("radio", { name: "Fixed" }); - screen.getByRole("radio", { name: "Range" }); - }); - - it("renders only 'Fixed' and 'Range' size options if volume does not support auto size", () => { - plainRender(); - expect(screen.queryByRole("radio", { name: "Auto" })).toBeNull(); - screen.getByRole("radio", { name: "Fixed" }); - screen.getByRole("radio", { name: "Range" }); - }); - - it("uses the min size unit as max size unit when it is missing", () => { - plainRender( - , - ); - const maxSizeUnitSelector = screen.getByRole("combobox", { - name: "Unit for the maximum size", - }); - expect(maxSizeUnitSelector).toHaveValue("TiB"); - }); - }); - - describe("when editing a volume", () => { - beforeEach(() => { - props = { ...props, volumes: [rootVolume, homeVolume, swapVolume, arbitraryVolume] }; - }); - - it("does not allow changing the mount point", () => { - const { rerender } = plainRender(); - expect(screen.queryByRole("textbox", { name: "Mount point" })).toBeNull(); - rerender(); - expect(screen.queryByRole("textbox", { name: "Mount point" })).toBeNull(); - }); - - it("renders a file system picker if it allows more than one", async () => { - const { user } = plainRender(); - const fsTypeButton = screen.getByRole("button", { name: "File system type" }); - await user.click(fsTypeButton); - screen.getByRole("option", { name: "XFS" }); - screen.getByRole("option", { name: "Ext4" }); - }); - - it("does not render a file system picker when it accepts only one", async () => { - plainRender(); - await waitFor(() => - expect(screen.queryByRole("button", { name: "File system type" })).not.toBeInTheDocument(), - ); - }); - - it("renders 'Auto', 'Fixed', and 'Range' size options when volume supports auto size", () => { - plainRender(); - screen.getByRole("radio", { name: "Auto" }); - screen.getByRole("radio", { name: "Fixed" }); - screen.getByRole("radio", { name: "Range" }); - }); - - it("renders only 'Fixed' and 'Range' size options if volume does not support auto size", () => { - plainRender(); - expect(screen.queryByRole("radio", { name: "Auto" })).toBeNull(); - screen.getByRole("radio", { name: "Fixed" }); - screen.getByRole("radio", { name: "Range" }); - }); - - it("uses the min size unit as max size unit when it is missing", () => { - plainRender( - , - ); - const maxSizeUnitSelector = screen.getByRole("combobox", { - name: "Unit for the maximum size", - }); - expect(maxSizeUnitSelector).toHaveValue("TiB"); - }); - }); - - it("calls the onAccept callback with resulting volume when the form is submitted", async () => { - const { user } = plainRender(); - const submit = screen.getByRole("button", { name: "Accept" }); - const rangeSize = screen.getByRole("radio", { name: "Range" }); - - await user.click(rangeSize); - - const minSizeInput = screen.getByRole("textbox", { name: "Minimum desired size" }); - const minSizeUnitSelector = screen.getByRole("combobox", { name: "Unit for the minimum size" }); - const minSizeGiBUnit = within(minSizeUnitSelector).getByRole("option", { name: "GiB" }); - const maxSizeInput = screen.getByRole("textbox", { name: "Maximum desired size" }); - const maxSizeUnitSelector = screen.getByRole("combobox", { name: "Unit for the maximum size" }); - const maxSizeGiBUnit = within(maxSizeUnitSelector).getByRole("option", { name: "GiB" }); - - await user.clear(minSizeInput); - await user.type(minSizeInput, "10"); - await user.selectOptions(minSizeUnitSelector, minSizeGiBUnit); - await user.clear(maxSizeInput); - await user.type(maxSizeInput, "25"); - await user.selectOptions(maxSizeUnitSelector, maxSizeGiBUnit); - - await user.click(submit); - - expect(props.onAccept).toHaveBeenCalledWith({ - ...rootVolume, - autoSize: false, - minSize: parseToBytes("10 GiB"), - maxSize: parseToBytes("25 GiB"), - }); - }); - - it("does not call the onAccept callback when the form is not submitted", async () => { - const { user } = plainRender(); - const cancelButton = screen.getByRole("button", { name: "Cancel" }); - await user.click(cancelButton); - expect(props.onAccept).not.toHaveBeenCalled(); - expect(props.onCancel).toHaveBeenCalled(); - }); - - describe("mount point validations", () => { - it("warns and helps user when entered mount path included in a not existing but predefined volume", async () => { - const { user } = plainRender( - , - ); - const mountPointInput = screen.getByRole("textbox", { name: "Mount point" }); - await user.type(mountPointInput, "/home"); - await screen.findByText("There is a predefined file system for /home."); - const addButton = screen.getByRole("button", { name: "Do you want to add it?" }); - await user.click(addButton); - screen.getByRole("heading", { name: "Add /home file system" }); - expect(screen.queryByRole("textbox", { name: "Mount point" })).toBeNull(); - screen.getByText("/home"); - }); - - it("warns and helps user when entered mount path including in an existing volume", async () => { - const { user } = plainRender( - , - ); - const mountPointInput = screen.getByRole("textbox", { name: "Mount point" }); - await user.type(mountPointInput, "swap"); - await screen.findByText("There is already a file system for swap."); - const editButton = screen.getByRole("button", { name: "Do you want to edit it?" }); - await user.click(editButton); - screen.getByRole("heading", { name: "Edit swap file system" }); - expect(screen.queryByRole("textbox", { name: "Mount point" })).toBeNull(); - screen.getByText("swap"); - }); - - it("renders an error if a not valid path was given", async () => { - const { user } = plainRender(); - const mountPointInput = screen.getByRole("textbox", { name: "Mount point" }); - const submitButton = screen.getByRole("button", { name: "Accept" }); - - // No mount point given - await user.click(submitButton); - screen.getByText("A mount point is required"); - - // Without starting backslash - await user.clear(mountPointInput); - await user.type(mountPointInput, "var/log"); - await user.click(submitButton); - screen.getByText("The mount point is invalid"); - - // With more than one leading backslash - await user.clear(mountPointInput); - await user.type(mountPointInput, "//var/log/"); - await user.click(submitButton); - screen.getByText("The mount point is invalid"); - - // With more than one trailing backslash - await user.clear(mountPointInput); - await user.type(mountPointInput, "/var/log//"); - await user.click(submitButton); - screen.getByText("The mount point is invalid"); - }); - }); - - describe("size validations", () => { - describe("when 'Fixed' size is selected", () => { - it("renders an error when size is not given", async () => { - const { user } = plainRender(); - const submitButton = screen.getByRole("button", { name: "Accept" }); - const fixedSizeOption = screen.getByRole("radio", { name: "Fixed" }); - await user.click(fixedSizeOption); - const sizeInput = screen.getByRole("textbox", { name: "Exact size" }); - await user.clear(sizeInput); - await user.click(submitButton); - screen.getByText("A size value is required"); - await user.type(sizeInput, "10"); - await user.click(submitButton); - expect(screen.queryByText("A size value is required")).toBeNull(); - }); - }); - - describe("when 'Range' size is selected", () => { - it("renders an error when min size is not given", async () => { - const { user } = plainRender(); - - const submitButton = screen.getByRole("button", { name: "Accept" }); - const rangeSize = screen.getByRole("radio", { name: "Range" }); - await user.click(rangeSize); - - const minSizeInput = screen.getByRole("textbox", { name: "Minimum desired size" }); - - await user.clear(minSizeInput); - await user.click(submitButton); - screen.getByText("Minimum size is required"); - - await user.type(minSizeInput, "10"); - await user.click(submitButton); - expect(screen.queryByText("Minimum size is required")).toBeNull(); - }); - - it("renders an error when max size is smaller than or equal to min size", async () => { - const volume = { ...homeVolume, minSize: undefined, maxSize: undefined }; - const { user } = plainRender(); - const submitButton = screen.getByRole("button", { name: "Accept" }); - const rangeSize = screen.getByRole("radio", { name: "Range" }); - await user.click(rangeSize); - - const minSizeInput = screen.getByRole("textbox", { name: "Minimum desired size" }); - const minSizeUnitSelector = screen.getByRole("combobox", { - name: "Unit for the minimum size", - }); - const minSizeMiBUnit = within(minSizeUnitSelector).getByRole("option", { name: "MiB" }); - const maxSizeInput = screen.getByRole("textbox", { name: "Maximum desired size" }); - const maxSizeUnitSelector = screen.getByRole("combobox", { - name: "Unit for the maximum size", - }); - const maxSizeGiBUnit = within(maxSizeUnitSelector).getByRole("option", { name: "GiB" }); - const maxSizeMiBUnit = within(maxSizeUnitSelector).getByRole("option", { name: "MiB" }); - - // Max (11 GiB) > Min (10 GiB) BEFORE changing any unit size - await user.clear(minSizeInput); - await user.type(minSizeInput, "10"); - await user.clear(maxSizeInput); - await user.type(maxSizeInput, "11"); - await user.click(submitButton); - expect(screen.queryByText("Maximum must be greater than minimum")).toBeNull(); - - // Max (10 GiB) === Min (10 GiB) - await user.clear(maxSizeInput); - await user.type(maxSizeInput, "10"); - await user.click(submitButton); - screen.getByText("Maximum must be greater than minimum"); - - // Max (10 MiB) < Min (10 GiB) because choosing a lower size unit - await user.selectOptions(maxSizeUnitSelector, maxSizeMiBUnit); - await user.click(submitButton); - screen.getByText("Maximum must be greater than minimum"); - - // Max (9 MiB) < Min (10 MiB) because choosing a lower size - await user.selectOptions(minSizeUnitSelector, minSizeMiBUnit); - await user.clear(maxSizeInput); - await user.type(maxSizeInput, "9"); - await user.click(submitButton); - screen.getByText("Maximum must be greater than minimum"); - - // Max (11 MiB) > Min (10 MiB) - await user.clear(maxSizeInput); - await user.type(maxSizeInput, "11"); - await user.selectOptions(maxSizeUnitSelector, maxSizeGiBUnit); - }); - }); - }); -}); diff --git a/web/src/components/storage/VolumeDialog.tsx b/web/src/components/storage/VolumeDialog.tsx deleted file mode 100644 index 56b71d16d4..0000000000 --- a/web/src/components/storage/VolumeDialog.tsx +++ /dev/null @@ -1,647 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React, { FormEvent, useReducer } from "react"; -import { Alert, Button, Form, Split } from "@patternfly/react-core"; -import { Popup } from "~/components/core"; -import { FsField, MountPathField, SizeOptionsField } from "~/components/storage/VolumeFields"; -import { _ } from "~/i18n"; -import { sprintf } from "sprintf-js"; -import { compact, useDebounce } from "~/utils"; -import { - SizeMethod, - DEFAULT_SIZE_UNIT, - SIZE_METHODS, - mountFilesystem, - parseToBytes, - reuseDevice, - splitSize, - volumeLabel, -} from "~/components/storage/utils"; -import { Volume } from "~/types/storage"; - -type VolumeFormState = { - volume: Volume; - formData: VolumeFormData; - errors: VolumeFormErrors; -}; -type VolumeFormData = { - minSize?: number | string; - minSizeUnit?: string; - maxSize?: number | string; - maxSizeUnit?: string; - sizeMethod: SizeMethod; - mountPath: string; - fsType: string; - snapshots: boolean; -}; -type VolumeFormErrors = { - missingMountPath: string | null; - invalidMountPath: string | null; - existingVolume: React.ReactElement | null; - existingTemplate: React.ReactElement | null; - missingSize: string | null; - missingMinSize: string | null; - invalidMaxSize: string | null; -}; - -/** - * Renders the title for the dialog. - */ -const renderTitle = (volume: Volume, volumes: Volume[]): string => { - const isNewVolume = !volumes.includes(volume); - const isProductDefined = volume.outline.productDefined; - const label = volumeLabel(volume); - - if (isNewVolume && isProductDefined) return sprintf(_("Add %s file system"), label); - if (!isNewVolume && isProductDefined) return sprintf(_("Edit %s file system"), label); - - return isNewVolume ? _("Add file system") : _("Edit file system"); -}; - -/** - * @component - */ -const VolumeAlert = ({ volume }: { volume: Volume }) => { - let alert: { title: string; text: string }; - - if (mountFilesystem(volume)) { - alert = { - // TRANSLATORS: Warning when editing a file system. - title: _("The type and size of the file system cannot be edited."), - // TRANSLATORS: Description of a warning. The first %s is replaced by a device name (e.g., - // /dev/vda) and the second %s is replaced by a mount path (e.g., /home). - text: sprintf( - _("The current file system on %s is selected to be mounted at %s."), - volume.targetDevice.name, - volume.mountPath, - ), - }; - } else if (reuseDevice(volume)) { - alert = { - // TRANSLATORS: Warning when editing a file system. - title: _("The size of the file system cannot be edited"), - // TRANSLATORS: Description of a warning. %s is replaced by a device name (e.g., /dev/vda). - text: sprintf(_("The file system is allocated at the device %s."), volume.targetDevice.name), - }; - } - - if (!alert) return null; - - return ( - - {alert.text} - - ); -}; - -/** @fixme Redesign *Error classes. - * - * Having different *Error classes does not seem to be a good design. Note these classes do not - * represent an error but a helper to check and render an error. It would be a better approach to - * have something like a volume checker which generates errors: - * - * For example: - * - * const checker = new VolumeChecker(volume, volumes, templates); - * const error = checker.existingMountPathError(); - * const message = error?.render(onClick); - */ -class MissingMountPathError { - mountPath: string; - - constructor(mountPath: string) { - this.mountPath = mountPath; - } - - check(): boolean { - return this.mountPath.length === 0; - } - - render(): string { - return _("A mount point is required"); - } -} - -class InvalidMountPathError { - mountPath: string; - - constructor(mountPath: string) { - this.mountPath = mountPath; - } - - check(): boolean { - const regex = /^swap$|^\/$|^(\/[^/\s]+([^/]*[^/\s])*)+$/; - return !regex.test(this.mountPath); - } - - render(): string { - return _("The mount point is invalid"); - } -} - -class MissingSizeError { - sizeMethod: SizeMethod; - size: string | number; - - constructor(sizeMethod: SizeMethod, size: string | number) { - this.sizeMethod = sizeMethod; - this.size = size; - } - - check(): boolean { - return this.sizeMethod === SIZE_METHODS.MANUAL && !this.size; - } - - render(): string { - return _("A size value is required"); - } -} - -class MissingMinSizeError { - sizeMethod: SizeMethod; - minSize: string | number; - - constructor(sizeMethod: SizeMethod, minSize: string | number) { - this.sizeMethod = sizeMethod; - this.minSize = minSize; - } - - check(): boolean { - return this.sizeMethod === SIZE_METHODS.RANGE && !this.minSize; - } - - render(): string { - return _("Minimum size is required"); - } -} - -class InvalidMaxSizeError { - sizeMethod: SizeMethod; - minSize: string | number; - maxSize: string | number; - - constructor(sizeMethod: SizeMethod, minSize: string | number, maxSize: string | number) { - this.sizeMethod = sizeMethod; - this.minSize = minSize; - this.maxSize = maxSize; - } - - check(): boolean { - return ( - this.sizeMethod === SIZE_METHODS.RANGE && this.maxSize !== -1 && this.maxSize <= this.minSize - ); - } - - render(): string { - return _("Maximum must be greater than minimum"); - } -} - -class ExistingVolumeError { - mountPath: string; - volumes: Volume[]; - - constructor(mountPath: string, volumes: Volume[]) { - this.mountPath = mountPath; - this.volumes = volumes; - } - - findVolume(): Volume | undefined { - return this.volumes.find((t) => t.mountPath === this.mountPath); - } - - check(): boolean { - return this.mountPath.length && this.findVolume() !== undefined; - } - - render(onClick: (volume: Volume) => void): React.ReactElement { - const volume = this.findVolume(); - const path = this.mountPath === "/" ? "root" : this.mountPath; - - return ( - - {sprintf(_("There is already a file system for %s."), path)} - - - ); - } -} - -class ExistingTemplateError { - mountPath: string; - templates: Volume[]; - - constructor(mountPath: string, templates: Volume[]) { - this.mountPath = mountPath; - this.templates = templates; - } - - findTemplate(): Volume | undefined { - return this.templates.find((t) => t.mountPath === this.mountPath); - } - - check(): boolean { - return this.mountPath.length && this.findTemplate() !== undefined; - } - - render(onClick: (template: Volume) => void): React.ReactElement { - const template = this.findTemplate(); - const path = this.mountPath === "/" ? "root" : this.mountPath; - - return ( - - {sprintf(_("There is a predefined file system for %s."), path)} - - - ); - } -} - -/** - * Error if the mount path is missing. - */ -const missingMountPathError = (mountPath: string): string | null => { - const error = new MissingMountPathError(mountPath); - return error.check() ? error.render() : null; -}; - -/** - * Error if the mount path is not valid. - */ -const invalidMountPathError = (mountPath: string): string | null => { - const error = new InvalidMountPathError(mountPath); - return error.check() ? error.render() : null; -}; - -/** - * Error if the size is missing. - */ -const missingSizeError = (sizeMethod: SizeMethod, size: string | number): string | null => { - const error = new MissingSizeError(sizeMethod, size); - return error.check() ? error.render() : null; -}; - -/** - * Error if the min size is missing. - */ -const missingMinSizeError = (sizeMethod: SizeMethod, minSize: string | number): string | null => { - const error = new MissingMinSizeError(sizeMethod, minSize); - return error.check() ? error.render() : null; -}; - -/** - * Error if the max size is not valid. - */ -const invalidMaxSizeError = ( - sizeMethod: SizeMethod, - minSize: string | number, - maxSize: string | number, -): string | null => { - const error = new InvalidMaxSizeError(sizeMethod, minSize, maxSize); - return error.check() ? error.render() : null; -}; - -/** - * Error if the given mount path exists in the list of volumes. - */ -const existingVolumeError = ( - mountPath: string, - volumes: Volume[], - onClick: (volume: Volume) => void, -): React.ReactElement | null => { - const error = new ExistingVolumeError(mountPath, volumes); - return error.check() ? error.render(onClick) : null; -}; - -/** - * Error if the given mount path exists in the list of templates. - */ -const existingTemplateError = ( - mountPath: string, - templates: Volume[], - onClick: (template: Volume) => void, -): React.ReactElement | null => { - const error = new ExistingTemplateError(mountPath, templates); - return error.check() ? error.render(onClick) : null; -}; - -/** - * Checks whether there is any error. - */ -const anyError = (errors: VolumeFormErrors): boolean => { - return compact(Object.values(errors)).length > 0; -}; - -/** - * Remove leftover trailing slash. - */ -const sanitizeMountPath = (mountPath: string): string => { - if (mountPath === "/") return mountPath; - - return mountPath.replace(/\/$/, ""); -}; - -/** - * Creates a new storage volume object based on given params. - */ -const createUpdatedVolume = (volume: Volume, formData: VolumeFormData): Volume => { - let sizeAttrs = {}; - const minSize = parseToBytes(`${formData.minSize} ${formData.minSizeUnit}`); - const maxSize = parseToBytes(`${formData.maxSize} ${formData.maxSizeUnit}`); - - switch (formData.sizeMethod) { - case SIZE_METHODS.AUTO: - sizeAttrs = { minSize: undefined, maxSize: undefined, autoSize: true }; - break; - case SIZE_METHODS.MANUAL: - sizeAttrs = { minSize, maxSize: minSize, autoSize: false }; - break; - case SIZE_METHODS.RANGE: - sizeAttrs = { minSize, maxSize: formData.maxSize ? maxSize : undefined, autoSize: false }; - break; - } - - const { fsType, snapshots } = formData; - const mountPath = sanitizeMountPath(formData.mountPath); - - return { ...volume, mountPath, ...sizeAttrs, fsType, snapshots }; -}; - -/** - * Form-related helper for guessing the size method for given volume - */ -const sizeMethodFor = (volume: Volume): SizeMethod => { - const { autoSize, minSize, maxSize } = volume; - - if (autoSize) { - return SIZE_METHODS.AUTO; - } else if (minSize !== maxSize) { - return SIZE_METHODS.RANGE; - } else { - return SIZE_METHODS.MANUAL; - } -}; - -/** - * Form-related helper for preparing data based on given volume - */ -const prepareFormData = (volume: Volume): VolumeFormData => { - const { size: minSize = "", unit: minSizeUnit = DEFAULT_SIZE_UNIT } = splitSize(volume.minSize); - const { size: maxSize = "", unit: maxSizeUnit = minSizeUnit || DEFAULT_SIZE_UNIT } = splitSize( - volume.maxSize, - ); - - return { - minSize, - minSizeUnit, - maxSize, - maxSizeUnit, - sizeMethod: sizeMethodFor(volume), - mountPath: volume.mountPath, - fsType: volume.fsType, - snapshots: volume.snapshots, - }; -}; - -/** - * Possible errors from the form data. - */ -const prepareErrors = (): VolumeFormErrors => { - return { - missingMountPath: null, - invalidMountPath: null, - existingVolume: null, - existingTemplate: null, - missingSize: null, - missingMinSize: null, - invalidMaxSize: null, - }; -}; - -/** - * Initializer function for the React#useReducer used in the {@link VolumesForm} - * - * @param volume - a storage volume object - */ -const createInitialState = (volume: Volume): VolumeFormState => { - const formData = prepareFormData(volume); - const errors = prepareErrors(); - - return { volume, formData, errors }; -}; - -/** - * The VolumeForm reducer. - */ -const reducer = (state: VolumeFormState, action: { type: string; payload }) => { - const { type, payload } = action; - - switch (type) { - case "CHANGE_VOLUME": { - return createInitialState(payload.volume); - } - - case "UPDATE_DATA": { - return { - ...state, - formData: { - ...state.formData, - ...payload, - }, - }; - } - - case "SET_ERRORS": { - const errors = { ...state.errors, ...payload }; - return { ...state, errors }; - } - - default: { - return state; - } - } -}; - -export type VolumeDialogProps = { - volume: Volume; - volumes: Volume[]; - templates: Volume[]; - isOpen?: boolean; - onCancel: () => void; - onAccept: (volume: Volume) => void; -}; - -/** - * Renders a dialog that allows the user to add or edit a file system. - * @component - */ -export default function VolumeDialog({ - volume: currentVolume, - volumes, - templates, - isOpen, - onCancel, - onAccept, -}: VolumeDialogProps) { - const [state, dispatch]: [VolumeFormState, (action) => void] = useReducer( - reducer, - currentVolume, - createInitialState, - ); - - const delayed: Function = useDebounce((f) => f(), 1000); - - const changeVolume: (volume: Volume) => void = (volume) => { - dispatch({ type: "CHANGE_VOLUME", payload: { volume } }); - }; - - const updateData: (data: object) => void = (data): void => - dispatch({ type: "UPDATE_DATA", payload: data }); - - const updateErrors: (errors: object) => void = (errors): void => - dispatch({ type: "SET_ERRORS", payload: errors }); - - const mountPathError: () => string | React.ReactElement = () => { - const { missingMountPath, invalidMountPath, existingVolume, existingTemplate } = state.errors; - return missingMountPath || invalidMountPath || existingVolume || existingTemplate; - }; - - const sizeErrors: () => object = () => { - return { - size: state.errors.missingSize, - minSize: state.errors.missingMinSize, - maxSize: state.errors.invalidMaxSize, - }; - }; - - const disableWidgets: () => boolean = () => { - const { existingVolume, existingTemplate } = state.errors; - return existingVolume !== null || existingTemplate !== null; - }; - - const isMountPathEditable: () => boolean = () => { - const isNewVolume = !volumes.includes(state.volume); - const isPredefined = state.volume.outline.productDefined; - return isNewVolume && !isPredefined; - }; - - const changeMountPath: (mountPath: string) => void = (mountPath) => { - // Reset current errors. - const errors = { - missingMountPath: null, - invalidMountPath: null, - existingVolume: null, - existingTemplate: null, - }; - updateErrors(errors); - - delayed(() => { - // Reevaluate in a delayed way. - const errors = { - existingVolume: existingVolumeError(mountPath, volumes, changeVolume), - existingTemplate: existingTemplateError(mountPath, templates, changeVolume), - }; - updateErrors(errors); - }); - - updateData({ mountPath }); - }; - - const changeSizeOptions: (data: object) => void = (data) => { - // Reset errors. - const errors = { - missingSize: null, - missingMinSize: null, - invalidMaxSize: null, - }; - updateErrors(errors); - updateData(data); - }; - - const submitForm: (e: FormEvent) => void = (e) => { - e.preventDefault(); - const { volume: originalVolume, formData } = state; - const volume = createUpdatedVolume(originalVolume, formData); - - const checkMountPath = isMountPathEditable(); - - const errors = { - missingMountPath: checkMountPath ? missingMountPathError(volume.mountPath) : null, - invalidMountPath: checkMountPath ? invalidMountPathError(volume.mountPath) : null, - existingVolume: checkMountPath - ? existingVolumeError(volume.mountPath, volumes, changeVolume) - : null, - existingTemplate: checkMountPath - ? existingTemplateError(volume.mountPath, templates, changeVolume) - : null, - missingSize: missingSizeError(formData.sizeMethod, volume.minSize), - missingMinSize: missingMinSizeError(formData.sizeMethod, volume.minSize), - invalidMaxSize: invalidMaxSizeError(formData.sizeMethod, volume.minSize, volume.maxSize), - }; - - anyError(errors) ? updateErrors(errors) : onAccept(volume); - }; - - const title = renderTitle(state.volume, volumes); - const { fsType, mountPath } = state.formData; - const isDisabled = disableWidgets(); - const isFsFieldDisabled = isDisabled || mountFilesystem(state.volume); - const isSizeFieldDisabled = isDisabled || reuseDevice(state.volume); - - return ( - /** @fixme blockSize medium is too big and small is too small. */ - -
- - - - - - - - {_("Accept")} - - - -
- ); -} diff --git a/web/src/components/storage/VolumeFields.test.tsx b/web/src/components/storage/VolumeFields.test.tsx deleted file mode 100644 index e706c9686a..0000000000 --- a/web/src/components/storage/VolumeFields.test.tsx +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { screen, within } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import { SIZE_METHODS } from "~/components/storage/utils"; -import { FsField, MountPathField, SizeOptionsField } from "~/components/storage/VolumeFields"; -import { Volume, VolumeTarget } from "~/types/storage"; - -const volume: Volume = { - mountPath: "/home", - target: VolumeTarget.DEFAULT, - fsType: "XFS", - minSize: 1024, - maxSize: 4096, - autoSize: false, - snapshots: false, - transactional: false, - outline: { - required: false, - fsTypes: ["Ext4", "XFS"], - supportAutoSize: false, - snapshotsConfigurable: false, - snapshotsAffectSizes: false, - adjustByRam: false, - sizeRelevantVolumes: [], - productDefined: true, - }, -}; - -const callbackFn = jest.fn(); - -describe("MountPathField", () => { - it("renders a text input with given value", () => { - const { rerender } = plainRender(); - const input = screen.getByRole("textbox", { name: "Mount point" }); - expect(input).toHaveValue("/home"); - rerender(); - expect(input).toHaveValue("/var"); - }); - - it("renders given error", () => { - plainRender( - , - ); - screen.getByText("Something went wrong"); - }); - - it("calls given callback when user changes its content", async () => { - const { user } = plainRender(); - const input = screen.getByRole("textbox", { name: "Mount point" }); - // NOTE: MountPathField is a controlled component. That makes a bit more - // difficult to write more sensible test here by typing "/var" and expecting that - // callback is called multiple times with "/", "/v", "/va", and "/var". It - // will not work because it's actually triggering the onChange with "/", - // "v", "a", and "r", but having a different "value" each time it's - // re-rendered. Anyway, checking that callback is called is enough. - await user.type(input, "/"); - expect(callbackFn).toHaveBeenCalledWith("/"); - }); - - it("renders only the value if mount as read-only (no input)", () => { - plainRender(); - expect(screen.queryByRole("textbox", { name: "Mount point" })).toBeNull(); - screen.getByText("/home"); - }); -}); - -describe("SizeOptionsField", () => { - it("renders radio group with sizing options", () => { - plainRender( - , - ); - screen.getByRole("radiogroup", { name: "Size" }); - }); - - it("renders 'Fixed' and 'Range' options always but 'Auto' only if volume accepts auto size", () => { - const { rerender } = plainRender( - , - ); - const group = screen.getByRole("radiogroup", { name: "Size" }); - within(group).getByRole("radio", { name: "Fixed" }); - within(group).getByRole("radio", { name: "Range" }); - expect(within(group).queryByRole("radio", { name: "Auto" })).toBeNull(); - - rerender( - , - ); - within(group).getByRole("radio", { name: "Auto" }); - within(group).getByRole("radio", { name: "Fixed" }); - within(group).getByRole("radio", { name: "Range" }); - }); - - it("renders options as disabled when isDisabled props is given", () => { - plainRender( - , - ); - const group = screen.getByRole("radiogroup", { name: "Size" }); - within(group) - .getAllByRole("radio") - .forEach((option) => expect(option).toBeDisabled()); - }); - - it("calls given callback when user changes selected option", async () => { - const { user } = plainRender( - , - ); - const group = screen.getByRole("radiogroup", { name: "Size" }); - const rangeOption = within(group).getByRole("radio", { name: "Range" }); - await user.click(rangeOption); - expect(callbackFn).toHaveBeenCalledWith({ sizeMethod: SIZE_METHODS.RANGE }); - }); - - it.todo("test SizeAuto internal component"); - it.todo("test SizeManual internal component"); - it.todo("test SizeRange internal component"); -}); - -describe("FsField", () => { - it("renders control for selecting a file system, with the given value as initial selection", async () => { - const { user, rerender } = plainRender( - , - ); - let button = screen.getByRole("button", { name: "File system type" }); - await user.click(button); - const xfsOption = screen.getByRole("option", { name: "XFS" }); - let ext4Option = screen.getByRole("option", { name: "Ext4" }); - expect(xfsOption).toHaveAttribute("aria-selected", "true"); - expect(ext4Option).toHaveAttribute("aria-selected", "false"); - expect(screen.queryByRole("option", { name: "Btrfs" })).toBeNull(); - - rerender( - , - ); - button = screen.getByRole("button", { name: "File system type" }); - await user.click(button); - ext4Option = screen.getByRole("option", { name: "Ext4" }); - const btrfsOption = screen.getByRole("option", { name: "Btrfs" }); - expect(ext4Option).toHaveAttribute("aria-selected", "true"); - expect(btrfsOption).toHaveAttribute("aria-selected", "false"); - expect(screen.queryByRole("option", { name: "XFS" })).toBeNull(); - }); - - it("renders control as disabled when isDisabled is given", () => { - plainRender(); - const button = screen.getByRole("button", { name: "File system type" }); - expect(button).toBeDisabled(); - }); - - it("calls given callback when user clicks on an option", async () => { - const { user } = plainRender(); - const button = screen.getByRole("button", { name: "File system type" }); - await user.click(button); - const ext4Option = screen.getByRole("option", { name: "Ext4" }); - await user.click(ext4Option); - expect(callbackFn).toHaveBeenCalledWith(expect.objectContaining({ fsType: "Ext4" })); - }); -}); diff --git a/web/src/components/storage/VolumeFields.tsx b/web/src/components/storage/VolumeFields.tsx deleted file mode 100644 index aafe93e25b..0000000000 --- a/web/src/components/storage/VolumeFields.tsx +++ /dev/null @@ -1,554 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React, { useState } from "react"; -import { - FormGroup, - FormSelect, - FormSelectOption, - InputGroup, - InputGroupItem, - MenuToggle, - Popover, - Radio, - Select, - SelectOption, - SelectList, - Split, - Stack, - TextInput, - FormSelectProps, -} from "@patternfly/react-core"; -import { FormValidationError, FormReadOnlyField, NumericTextInput } from "~/components/core"; -import { Icon } from "~/components/layout"; -import { _, N_ } from "~/i18n"; -import { sprintf } from "sprintf-js"; -import { SIZE_METHODS, SIZE_UNITS } from "~/components/storage/utils"; -import { Volume } from "~/types/storage"; - -const { K, ...MAX_SIZE_UNITS } = SIZE_UNITS; - -export type MountPathFieldProps = { - value?: string; - isReadOnly?: boolean; - onChange: (mountPath: string) => void; - error?: React.ReactNode; -}; - -/** - * Field for the mount path of a volume. - * @component - */ -const MountPathField = ({ - value = "", - onChange, - isReadOnly = false, - error, -}: MountPathFieldProps) => { - const label = _("Mount point"); - - const changeMountPath: (_, mountPath: string) => void = (_, mountPath) => onChange(mountPath); - - if (isReadOnly) { - return {value}; - } - - return ( - - - - - ); -}; - -/** - * Form control for selecting a size unit - * @component - * - * Based on {@link PF/FormSelect https://www.patternfly.org/components/forms/form-select} - * - * @param {object} props - * @param props.units - a collection of size units - * @param props.formSelectProps - */ -const SizeUnitFormSelect = ({ - units, - ...formSelectProps -}: { - units: Array; - formSelectProps: FormSelectProps; -}) => { - return ( - - {units.map((unit) => { - // unit values are marked for translation in the utils.js file - // eslint-disable-next-line agama-i18n/string-literals - return ; - })} - - ); -}; - -/** - * Possible file system type options for a volume. - */ -const fsOptions = (volume: Volume): string[] => { - return volume.outline.fsTypes; -}; - -/** - * Option for selecting a file system type. - * @component - */ -const FsSelectOption = ({ fsOption }: { fsOption: string }) => { - return ( - - {fsOption} - - ); -}; - -/** - * Widget for selecting a file system type. - * @component - * - * @param props - * @param props.id - Widget id. - * @param props.value - Currently selected file system. - * @param props.volume - The selected storage volume. - * @param props.isDisabled - * @param props.onChange - Callback for notifying input changes. - */ -const FsSelect = ({ - id, - value, - volume, - isDisabled, - onChange, -}: { - id: string; - value: string; - volume: Volume; - isDisabled: boolean; - onChange: (data: object) => void; -}) => { - const [isOpen, setIsOpen] = useState(false); - - const options = fsOptions(volume); - const selected = value; - - const onToggleClick = () => { - setIsOpen(!isOpen); - }; - - const onSelect = (_event, option) => { - setIsOpen(false); - onChange({ fsType: option }); - }; - - const toggle = (toggleRef) => { - return ( - - {selected} - - ); - }; - - return ( - - ); -}; - -type FsFieldProps = { - value: string; - volume: Volume; - isDisabled?: boolean; - onChange: (data: object) => void; -}; - -/** - * Widget for rendering the file system configuration. - * - * Allows selecting a file system type. If there is only one possible option, then it renders plain - * text with the unique option. - * @component - */ -const FsField = ({ value, volume, isDisabled = false, onChange }: FsFieldProps) => { - const isSingleFs = () => { - // check for btrfs with snapshots - if (volume.fsType === "Btrfs" && volume.snapshots) { - return true; - } - - const { fsTypes } = volume.outline; - return fsTypes.length === 1; - }; - - const Info = () => { - // TRANSLATORS: info about possible file system types. - const text = _( - "The options for the file system type depends on the product and the mount point.", - ); - - return ( - - - - ); - }; - - // TRANSLATORS: label for the file system selector. - const label = _("File system type"); - - if (isSingleFs()) { - return {value}; - } - - return ( - } fieldId="fsType"> - - - ); -}; - -/** - * Widget for rendering the size option content when SIZE_UNITS.AUTO is selected - * @component - * - * @param {object} props - * @param {Volume} props.volume - a storage volume object - */ -const SizeAuto = ({ volume }: { volume: Volume }) => { - const conditions = []; - - if (volume.outline.snapshotsAffectSizes) - // TRANSLATORS: item which affects the final computed partition size - conditions.push(_("the configuration of snapshots")); - - if (volume.outline.sizeRelevantVolumes && volume.outline.sizeRelevantVolumes.length > 0) - // TRANSLATORS: item which affects the final computed partition size - // %s is replaced by a list of mount points like "/home, /boot" - conditions.push( - sprintf( - _("the presence of the file system for %s"), - // TRANSLATORS: conjunction for merging two list items - volume.outline.sizeRelevantVolumes.join(_(", ")), - ), - ); - - if (volume.outline.adjustByRam) - // TRANSLATORS: item which affects the final computed partition size - conditions.push(_("the amount of RAM in the system")); - - // TRANSLATORS: the %s is replaced by the items which affect the computed size - const conditionsText = sprintf( - _("The final size depends on %s."), - // TRANSLATORS: conjunction for merging two texts - conditions.join(_(" and ")), - ); - - return ( - <> - {/* TRANSLATORS: the partition size is automatically computed */} -

- {_("Automatically calculated size according to the selected product.")} {conditionsText} -

- - ); -}; - -/** - * Widget for rendering the size option content when SIZE_UNITS.MANUAL is selected - * @component - * - * @param props - * @param props.errors - the form errors - * @param props.formData - the form data - * @param props.isDisabled - * @param props.onChange - callback for notifying input changes - */ -const SizeManual = ({ - errors, - formData, - isDisabled, - onChange, -}: { - errors; - formData; - isDisabled: boolean; - onChange: (v: object) => void; -}) => { - return ( - -

{_("Exact size for the file system.")}

- - - - onChange({ minSize })} - validated={errors.minSize ? "error" : "default"} - isDisabled={isDisabled} - /> - - - onChange({ minSizeUnit })} - isDisabled={isDisabled} - /> - - - - -
- ); -}; - -/** - * Widget for rendering the size option content when SIZE_UNITS.RANGE is selected - * @component - * - * @param props - * @param props.errors - the form errors - * @param props.formData - the form data - * @param props.isDisabled - * @param props.onChange - callback for notifying input changes - */ -const SizeRange = ({ - errors, - formData, - isDisabled, - onChange, -}: { - errors; - formData; - isDisabled: boolean; - onChange: (v: object) => void; -}) => { - return ( - -

- {_( - "Limits for the file system size. The final size will be a value between the given minimum \ -and maximum. If no maximum is given then the file system will be as big as possible.", - )} -

- - - - - onChange({ minSize })} - validated={errors.minSize ? "error" : "default"} - isDisabled={isDisabled} - /> - - - onChange({ minSizeUnit })} - isDisabled={isDisabled} - /> - - - - - - - - onChange({ maxSize })} - isDisabled={isDisabled} - /> - - - onChange({ maxSizeUnit })} - isDisabled={isDisabled} - /> - - - - - -
- ); -}; - -// constants need to be marked for translation with N_() and translated with _() later -const SIZE_OPTION_LABELS = Object.freeze({ - // TRANSLATORS: radio button label, fully automatically computed partition size, no user input - auto: N_("Auto"), - // TRANSLATORS: radio button label, exact partition size requested by user - fixed: N_("Fixed"), - // TRANSLATORS: radio button label, automatically computed partition size within the user provided min and max limits - range: N_("Range"), -}); - -/** - * Widget for rendering the volume size options - * @component - */ - -type SizeOptionsFieldProps = { - volume: Volume; - formData; - errors?: object; - isDisabled?: boolean; - onChange: (v: object) => void; -}; - -const SizeOptionsField = ({ - volume, - formData, - isDisabled = false, - errors = {}, - onChange, -}: SizeOptionsFieldProps) => { - const { sizeMethod } = formData; - const sizeWidgetProps = { errors, formData, volume, isDisabled, onChange }; - - const sizeOptions: string[] = [SIZE_METHODS.MANUAL, SIZE_METHODS.RANGE]; - - if (volume.outline.supportAutoSize) sizeOptions.push(SIZE_METHODS.AUTO); - - return ( - -
- - {sizeOptions.map((value) => { - const isSelected = sizeMethod === value; - - return ( - onChange({ sizeMethod: value })} - isDisabled={isDisabled} - /> - ); - })} - - -
- {sizeMethod === SIZE_METHODS.AUTO && } - {sizeMethod === SIZE_METHODS.RANGE && } - {sizeMethod === SIZE_METHODS.MANUAL && } -
-
-
- ); -}; - -export { FsField, MountPathField, SizeOptionsField }; diff --git a/web/src/components/storage/VolumeLocationDialog.test.tsx b/web/src/components/storage/VolumeLocationDialog.test.tsx deleted file mode 100644 index f89469f858..0000000000 --- a/web/src/components/storage/VolumeLocationDialog.test.tsx +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { screen, within } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import VolumeLocationDialog, { - VolumeLocationDialogProps, -} from "~/components/storage/VolumeLocationDialog"; -import { StorageDevice, Volume, VolumeTarget } from "~/types/storage"; - -const sda: StorageDevice = { - sid: 59, - isDrive: true, - type: "disk", - description: "", - vendor: "Micron", - model: "Micron 1100 SATA", - driver: ["ahci", "mmcblk"], - bus: "IDE", - busId: "", - transport: "usb", - dellBOSS: false, - sdCard: true, - active: true, - name: "/dev/sda", - size: 1024, - shrinking: { unsupported: ["Resizing is not supported"] }, - systems: [], - udevIds: ["ata-Micron_1100_SATA_512GB_12563", "scsi-0ATA_Micron_1100_SATA_512GB"], - udevPaths: ["pci-0000:00-12", "pci-0000:00-12-ata"], -}; - -const sda1: StorageDevice = { - sid: 69, - name: "/dev/sda1", - description: "", - isDrive: false, - type: "partition", - size: 256, - filesystem: { - sid: 169, - type: "Swap", - }, -}; - -const sda2: StorageDevice = { - sid: 79, - name: "/dev/sda2", - description: "", - isDrive: false, - type: "partition", - size: 512, - filesystem: { - sid: 179, - type: "Ext4", - }, -}; - -sda.partitionTable = { - type: "gpt", - partitions: [sda1, sda2], - unpartitionedSize: 0, - unusedSlots: [], -}; - -const sdb: StorageDevice = { - sid: 62, - isDrive: true, - type: "disk", - description: "", - vendor: "Samsung", - model: "Samsung Evo 8 Pro", - driver: ["ahci"], - bus: "IDE", - busId: "", - transport: "", - dellBOSS: false, - sdCard: false, - active: true, - name: "/dev/sdb", - size: 2048, - shrinking: { unsupported: ["Resizing is not supported"] }, - systems: [], - udevIds: [], - udevPaths: ["pci-0000:00-19"], -}; - -const volume: Volume = { - mountPath: "/", - target: VolumeTarget.DEFAULT, - fsType: "Btrfs", - minSize: 1024, - maxSize: 2048, - autoSize: false, - snapshots: false, - transactional: false, - outline: { - required: true, - fsTypes: ["Btrfs", "Ext4"], - supportAutoSize: true, - snapshotsConfigurable: true, - snapshotsAffectSizes: true, - sizeRelevantVolumes: [], - adjustByRam: false, - productDefined: true, - }, -}; - -let props: VolumeLocationDialogProps; - -describe("VolumeLocationDialog", () => { - beforeEach(() => { - props = { - isOpen: true, - volume, - volumes: [], - volumeDevices: [sda, sdb], - targetDevices: [sda], - onCancel: jest.fn(), - onAccept: jest.fn(), - }; - }); - - it("offers an option to create a new partition", () => { - plainRender(); - screen.getByRole("radio", { name: "Create a new partition" }); - }); - - it("offers an option to create a dedicated VG", () => { - plainRender(); - screen.getByRole("radio", { name: /Create a dedicated LVM/ }); - }); - - it("offers an option to format the device", () => { - plainRender(); - screen.getByRole("radio", { name: "Format the device" }); - }); - - it("offers an option to mount the file system", () => { - plainRender(); - screen.getByRole("radio", { name: "Mount the file system" }); - }); - - describe("if the selected device cannot be partitioned", () => { - beforeEach(async () => { - const { user } = plainRender(); - const sda1Row = screen.getByRole("row", { name: /sda1/ }); - const sda1Radio = within(sda1Row).getByRole("radio"); - await user.click(sda1Radio); - }); - - it("disables the option for creating a new partition", () => { - const option = screen.getByRole("radio", { name: "Create a new partition" }); - expect(option).toBeDisabled(); - }); - - it("disables the option for creating a dedicated VG", () => { - const option = screen.getByRole("radio", { name: /Create a dedicated LVM/ }); - expect(option).toBeDisabled(); - }); - }); - - describe("if the selected device has not a compatible file system", () => { - beforeEach(async () => { - const { user } = plainRender(); - const sda1Row = screen.getByRole("row", { name: /sda1/ }); - const sda1Radio = within(sda1Row).getByRole("radio"); - await user.click(sda1Radio); - }); - - it("disables the option for mounting the file system", () => { - const option = screen.getByRole("radio", { name: "Mount the file system" }); - expect(option).toBeDisabled(); - }); - }); - - describe("if the selected device has a compatible file system", () => { - beforeEach(async () => { - const { user } = plainRender(); - const sda2Row = screen.getByRole("row", { name: /sda2/ }); - const sda2Radio = within(sda2Row).getByRole("radio"); - await user.click(sda2Radio); - }); - - it("enables the option for mounting the file system", () => { - const option = screen.getByRole("radio", { name: "Mount the file system" }); - expect(option).toBeEnabled(); - }); - }); - - it("calls onAccept with the selected options on accept", async () => { - const { user } = plainRender(); - - const sdbRow = screen.getByRole("row", { name: /sdb/ }); - const sdbRadio = within(sdbRow).getByRole("radio"); - await user.click(sdbRadio); - - const formatRadio = screen.getByRole("radio", { name: /format the device/i }); - await user.click(formatRadio); - - const accept = screen.getByRole("button", { name: "Confirm" }); - await user.click(accept); - - expect(props.onAccept).toHaveBeenCalledWith( - expect.objectContaining({ target: VolumeTarget.DEVICE, targetDevice: sdb }), - ); - }); - - it("does not call onAccept on cancel", async () => { - const { user } = plainRender(); - const cancel = screen.getByRole("button", { name: "Cancel" }); - - await user.click(cancel); - - expect(props.onAccept).not.toHaveBeenCalled(); - }); -}); diff --git a/web/src/components/storage/VolumeLocationDialog.tsx b/web/src/components/storage/VolumeLocationDialog.tsx deleted file mode 100644 index 4d78c854cf..0000000000 --- a/web/src/components/storage/VolumeLocationDialog.tsx +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React, { useState } from "react"; -import { Form, FormGroup, Radio, Stack } from "@patternfly/react-core"; -import { FormReadOnlyField, Popup } from "~/components/core"; -import VolumeLocationSelectorTable from "~/components/storage/VolumeLocationSelectorTable"; -import { _ } from "~/i18n"; -import { sprintf } from "sprintf-js"; -import { deviceChildren, volumeLabel } from "~/components/storage/utils"; -import { StorageDevice, Volume, VolumeTarget } from "~/types/storage"; - -const defaultTarget: (device: StorageDevice | undefined) => VolumeTarget = ( - device, -): VolumeTarget => { - if (["partition", "lvmLv", "md"].includes(device?.type)) return VolumeTarget.DEVICE; - - return VolumeTarget.NEW_PARTITION; -}; - -/** @type {(volume: Volume, device: StorageDevice|undefined) => VolumeTarget[]} */ -const availableTargets: (volume: Volume, device: StorageDevice | undefined) => VolumeTarget[] = ( - volume, - device, -): VolumeTarget[] => { - /** @type {VolumeTarget[]} */ - const targets: VolumeTarget[] = [VolumeTarget.DEVICE]; - - if (device?.isDrive) { - targets.push(VolumeTarget.NEW_PARTITION); - targets.push(VolumeTarget.NEW_VG); - } - - if (device?.filesystem && volume.outline.fsTypes.includes(device.filesystem.type)) - targets.push(VolumeTarget.FILESYSTEM); - - return targets; -}; - -/** @type {(volume: Volume, device: StorageDevice|undefined) => VolumeTarget} */ -const sanitizeTarget: (volume: Volume, device: StorageDevice | undefined) => VolumeTarget = ( - volume, - device, -): VolumeTarget => { - const targets = availableTargets(volume, device); - return targets.includes(volume.target) ? volume.target : defaultTarget(device); -}; - -export type VolumeLocationDialogProps = { - volume: Volume; - volumes: Volume[]; - volumeDevices: StorageDevice[]; - targetDevices: StorageDevice[]; - isOpen?: boolean; - onCancel: () => void; - onAccept: (volume: Volume) => void; -}; - -/** - * Renders a dialog that allows the user to change the location of a volume. - * @component - */ -export default function VolumeLocationDialog({ - volume, - volumes, - volumeDevices, - targetDevices, - isOpen, - onCancel, - onAccept, - ...props -}: VolumeLocationDialogProps) { - /** @type {StorageDevice|undefined} */ - const initialDevice: StorageDevice | undefined = - volume.targetDevice || targetDevices[0] || volumeDevices[0]; - /** @type {VolumeTarget} */ - const initialTarget: VolumeTarget = sanitizeTarget(volume, initialDevice); - - const [target, setTarget] = useState(initialTarget); - const [targetDevice, setTargetDevice] = useState(initialDevice); - - /** @type {(devices: StorageDevice[]) => void} */ - const changeTargetDevice: (devices: StorageDevice[]) => void = (devices): void => { - const newTargetDevice = devices[0]; - - if (newTargetDevice.name !== targetDevice.name) { - setTarget(defaultTarget(newTargetDevice)); - setTargetDevice(newTargetDevice); - } - }; - - /** @type {(e: import("react").FormEvent) => void} */ - const onSubmit: (e: import("react").FormEvent) => void = (e): void => { - e.preventDefault(); - const newVolume = { ...volume, target, targetDevice }; - onAccept(newVolume); - }; - - /** @type {(device: StorageDevice) => boolean} */ - const isDeviceSelectable: (device: StorageDevice) => boolean = (device): boolean => { - return device.isDrive || ["md", "partition", "lvmLv"].includes(device.type); - }; - - const targets = availableTargets(volume, targetDevice); - - if (!targetDevice) return null; - - // TRANSLATORS: Description of the dialog for changing the location of a file system. - const dialogDescription = _( - "The file systems are allocated at the installation device by \ -default. Indicate a custom location to create the file system at a specific device.", - ); - - return ( - -
- {/** FIXME: Rename FormReadOnlyField */} - -
- d.sid)} - variant="compact" - /> -
- - - setTarget(VolumeTarget.NEW_PARTITION)} - /> - setTarget(VolumeTarget.NEW_VG)} - /> - setTarget(VolumeTarget.DEVICE)} - /> - setTarget(VolumeTarget.FILESYSTEM)} - /> - - - - - - - -
- ); -} diff --git a/web/src/components/storage/VolumeLocationSelectorTable.tsx b/web/src/components/storage/VolumeLocationSelectorTable.tsx deleted file mode 100644 index 78f063901a..0000000000 --- a/web/src/components/storage/VolumeLocationSelectorTable.tsx +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { Chip, Split } from "@patternfly/react-core"; -import { _ } from "~/i18n"; -import { - DeviceName, - DeviceDetails, - DeviceSize, - toStorageDevice, -} from "~/components/storage/device-utils"; -import { ExpandableSelector } from "~/components/core"; -import { - ExpandableSelectorColumn, - ExpandableSelectorProps, -} from "~/components/core/ExpandableSelector"; -import { PartitionSlot, StorageDevice, Volume } from "~/types/storage"; -import { DeviceInfo } from "~/api/storage/types"; - -/** - * Returns what (volumes, installation device) is using a device. - */ -const deviceUsers = ( - item: PartitionSlot | StorageDevice, - targetDevices: StorageDevice[], - volumes: Volume[], -): string[] => { - const device = toStorageDevice(item); - if (!device) return []; - - const isTargetDevice = !!targetDevices.find((d) => d.name === device.name); - const volumeUsers = volumes.filter((v) => v.targetDevice?.name === device.name); - - const users = []; - if (isTargetDevice) users.push(_("Installation device")); - - return users.concat(volumeUsers.map((v) => v.mountPath)); -}; - -/** - * @component - */ -const DeviceUsage = ({ users }: { users: string[] }) => { - return ( - - {users.map((user, index) => ( - - {user} - - ))} - - ); -}; - -type VolumeLocationSelectorTableBaseProps = { - devices: StorageDevice[]; - selectedDevices: StorageDevice[]; - targetDevices: StorageDevice[]; - volumes: Volume[]; -}; - -export type VolumeLocationSelectorTableProps = VolumeLocationSelectorTableBaseProps & - ExpandableSelectorProps; - -/** - * Table for selecting the location for a volume. - * @component - */ -export default function VolumeLocationSelectorTable({ - devices, - selectedDevices, - targetDevices, - volumes, - ...props -}: VolumeLocationSelectorTableProps) { - const columns: ExpandableSelectorColumn[] = [ - { - name: _("Device"), - value: (item: PartitionSlot | StorageDevice) => , - }, - { - name: _("Details"), - value: (item: PartitionSlot | StorageDevice) => , - }, - { - name: _("Usage"), - value: (item: PartitionSlot | StorageDevice) => ( - - ), - }, - { - name: _("Size"), - value: (item: PartitionSlot | StorageDevice) => , - classNames: "sizes-column", - }, - ]; - - return ( - { - if (!device.sid) { - return "dimmed-row"; - } - }} - itemsSelected={selectedDevices} - className="devices-table" - {...props} - /> - ); -} diff --git a/web/src/components/storage/index.ts b/web/src/components/storage/index.ts index 27639b6376..2e1a4044c4 100644 --- a/web/src/components/storage/index.ts +++ b/web/src/components/storage/index.ts @@ -21,7 +21,6 @@ */ export { default as ProposalPage } from "./ProposalPage"; -export { default as ProposalSettingsSection } from "./ProposalSettingsSection"; export { default as ProposalTransactionalInfo } from "./ProposalTransactionalInfo"; export { default as ProposalActionsDialog } from "./ProposalActionsDialog"; export { default as ProposalResultSection } from "./ProposalResultSection"; From 063ed7c670f3ddcfdea0821a5efd7e1eeff48036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Wed, 15 Jan 2025 18:30:18 +0000 Subject: [PATCH 037/109] fix(web): drop some core components Which are no longer referenced and probably no longer needed. --- web/src/components/core/Description.jsx | 50 ------------- web/src/components/core/Description.test.jsx | 69 ------------------ web/src/components/core/FormReadOnlyField.jsx | 61 ---------------- .../core/FormReadOnlyField.test.jsx | 34 --------- .../components/core/NumericTextInput.test.tsx | 72 ------------------- web/src/components/core/NumericTextInput.tsx | 55 -------------- web/src/components/core/Tip.jsx | 54 -------------- web/src/components/core/Tip.test.jsx | 68 ------------------ web/src/components/core/index.ts | 4 -- 9 files changed, 467 deletions(-) delete mode 100644 web/src/components/core/Description.jsx delete mode 100644 web/src/components/core/Description.test.jsx delete mode 100644 web/src/components/core/FormReadOnlyField.jsx delete mode 100644 web/src/components/core/FormReadOnlyField.test.jsx delete mode 100644 web/src/components/core/NumericTextInput.test.tsx delete mode 100644 web/src/components/core/NumericTextInput.tsx delete mode 100644 web/src/components/core/Tip.jsx delete mode 100644 web/src/components/core/Tip.test.jsx diff --git a/web/src/components/core/Description.jsx b/web/src/components/core/Description.jsx deleted file mode 100644 index fa6cf2e5b5..0000000000 --- a/web/src/components/core/Description.jsx +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) [2023] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -// @ts-check - -import React from "react"; -import { Popover, Button } from "@patternfly/react-core"; - -/** - * Displays details popup after clicking the children elements - * @component - * - * @param {object} props - * @param {React.ReactElement} props.description - Content displayed in a popup. - * @param {React.ReactNode} props.children - The wrapped content. - * @param {import("@patternfly/react-core").PopoverProps} [props.otherProps] - */ -export default function Description({ description, children, ...otherProps }) { - if (description) { - return ( - - - - ); - } - - // none or empty description, just return the children - return children; -} diff --git a/web/src/components/core/Description.test.jsx b/web/src/components/core/Description.test.jsx deleted file mode 100644 index 5d4a42a56a..0000000000 --- a/web/src/components/core/Description.test.jsx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) [2023] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { screen } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import { Description } from "~/components/core"; - -describe("Description", () => { - const description = "Some great description"; - const item = "Item with description"; - - it("displays the description after clicking the object", async () => { - const { user } = plainRender({item}); - - // the description is not displayed just after the render - expect(screen.queryByText(description)).not.toBeInTheDocument(); - expect(screen.queryByRole("dialog")).not.toBeInTheDocument(); - - // click it - const item_node = screen.getByText(item); - await user.click(item_node); - - // then the description is visible in a dialog - screen.getByRole("dialog"); - screen.getByText(description); - }); - - const expectNoPopup = async (content) => { - const { user } = plainRender(content); - - const item_node = screen.getByText(item); - await user.click(item_node); - - // do not display empty popup - expect(screen.queryByRole("dialog")).not.toBeInTheDocument(); - }; - - it("displays the object without description when it is undefined", async () => { - expectNoPopup({item}); - }); - - it("displays the object without description when it is null", async () => { - expectNoPopup({item}); - }); - - it("displays the object without description when it is empty", async () => { - expectNoPopup({item}); - }); -}); diff --git a/web/src/components/core/FormReadOnlyField.jsx b/web/src/components/core/FormReadOnlyField.jsx deleted file mode 100644 index 3ca98b9d4c..0000000000 --- a/web/src/components/core/FormReadOnlyField.jsx +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -// @ts-check -// cspell:ignore labelable - -import React from "react"; -import styles from "@patternfly/react-styles/css/components/Form/form"; - -/** - * Renders a read-only form value with a label that visually looks identically - * that a a label of an editable form value, without using the `label` HTML tag. - * - * Basically, this "mimicking component" is needed for two reasons: - * - * - The HTML specification limits the use of labels to "labelable elements". - * - * > Some elements, not all of them form-associated, are categorized as labelable - * > elements. These are elements that can be associated with a label element. - * > => button, input (if the type attribute is not in the Hidden state), meter, - * > output, progress, select, textarea, form-associated custom elements - * > - * > https://html.spec.whatwg.org/multipage/forms.html#categories - * - * - Agama does not use disabled form controls for rendering a value that users - * have no chance to change by any means, but a raw text instead. - * - * Based on PatternFly Form styles to maintain consistency. - * - * @typedef {import("react").ComponentProps<"div">} HTMLDivProps - * @param {HTMLDivProps & { label: string }} props - */ -export default function FormReadOnlyField({ label, children, className = "", ...props }) { - return ( -
-
- {label} -
- {children} -
- ); -} diff --git a/web/src/components/core/FormReadOnlyField.test.jsx b/web/src/components/core/FormReadOnlyField.test.jsx deleted file mode 100644 index c32ed904d7..0000000000 --- a/web/src/components/core/FormReadOnlyField.test.jsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { screen } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import { FormReadOnlyField } from "~/components/core"; - -it("renders label and content wrapped in div nodes using expected PatternFly styles", () => { - plainRender(Agama); - const field = screen.getByText("Agama"); - const label = screen.getByText("Product"); - expect(field.classList.contains("pf-v5-c-form__group")).toBe(true); - expect(label.classList.contains("pf-v5-c-form__label-text")).toBe(true); -}); diff --git a/web/src/components/core/NumericTextInput.test.tsx b/web/src/components/core/NumericTextInput.test.tsx deleted file mode 100644 index 760aac843e..0000000000 --- a/web/src/components/core/NumericTextInput.test.tsx +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) [2023-2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React, { useState } from "react"; -import { screen } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import { NumericTextInput } from "~/components/core"; - -// Using a controlled component for testing the rendered result instead of testing if -// the given onChange callback is called. The former is more aligned with the -// React Testing Library principles, https://testing-library.com/docs/guiding-principles -const Input = ({ value: initialValue = "" }) => { - const [value, setValue] = useState(initialValue); - return ; -}; - -it("renders an input text control", () => { - plainRender(); - - const input = screen.getByRole("textbox", { name: "Test input" }); - expect(input).toHaveAttribute("type", "text"); -}); - -it("allows only digits and dot", async () => { - const { user } = plainRender(); - - const input = screen.getByRole("textbox", { name: "Test input" }); - expect(input).toHaveValue(""); - - await user.type(input, "-"); - expect(input).toHaveValue(""); - - await user.type(input, "+"); - expect(input).toHaveValue(""); - - await user.type(input, "1"); - expect(input).toHaveValue("1"); - - await user.type(input, ".5"); - expect(input).toHaveValue("1.5"); - - await user.type(input, " GiB"); - expect(input).toHaveValue("1.5"); -}); - -it("allows clearing the input (empty values)", async () => { - const { user } = plainRender(); - - const input = screen.getByRole("textbox", { name: "Test input" }); - expect(input).toHaveValue("120"); - await user.clear(input); - expect(input).toHaveValue(""); -}); diff --git a/web/src/components/core/NumericTextInput.tsx b/web/src/components/core/NumericTextInput.tsx deleted file mode 100644 index 50302af7b2..0000000000 --- a/web/src/components/core/NumericTextInput.tsx +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) [2023-2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { TextInput, TextInputProps } from "@patternfly/react-core"; -import { noop } from "~/utils"; - -type NumericTextInputProps = { - value: string | number; - onChange: (value: string | number) => void; -} & Omit; - -/** - * Helper component for having an input text limited to not signed numbers - * @component - * - * Based on {@link https://www.patternfly.org/components/forms/text-input PF/TextInput} - * - * @note It allows empty value too. - */ -export default function NumericTextInput({ - value = "", - onChange = noop, - ...textInputProps -}: NumericTextInputProps) { - // NOTE: Using \d* instead of \d+ at the beginning to allow empty - const pattern = /^\d*\.?\d*$/; - - const handleOnChange: TextInputProps["onChange"] = (_, value) => { - if (pattern.test(value)) { - onChange(value); - } - }; - - return ; -} diff --git a/web/src/components/core/Tip.jsx b/web/src/components/core/Tip.jsx deleted file mode 100644 index 1f2ee5976d..0000000000 --- a/web/src/components/core/Tip.jsx +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) [2023] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -// @ts-check - -import React from "react"; -import { Label } from "@patternfly/react-core"; - -import { Description } from "~/components/core"; -import { Icon } from "~/components/layout"; - -/** - * Display a label with additional details. The details are displayed after - * clicking the label and the "i" icon indicates available details. - * If the label is not defined or is empty it behaves like a plain label. - * @component - * - * @param {object} props - * @param {React.ReactElement} props.description - Details displayed after clicking the label. - * @param {React.ReactNode} props.children - The content of the label. - */ -export default function Tip({ description, children }) { - if (description) { - return ( - - - - ); - } - - return ; -} diff --git a/web/src/components/core/Tip.test.jsx b/web/src/components/core/Tip.test.jsx deleted file mode 100644 index 54f34bdf51..0000000000 --- a/web/src/components/core/Tip.test.jsx +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) [2023] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { screen } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import { Tip } from "~/components/core"; - -describe("Tip", () => { - const description = "Some great description"; - const label = "Label"; - - describe("The description is not empty", () => { - it("displays the label with the 'info' icon and show the description after click", async () => { - const { user, container } = plainRender({label}); - - // an icon is displayed - expect(container.querySelector("svg")).toBeInTheDocument(); - - // the description is not displayed just after the render - expect(screen.queryByText(description)).not.toBeInTheDocument(); - expect(screen.queryByRole("dialog")).not.toBeInTheDocument(); - - // click it - const label_node = screen.getByText(label); - await user.click(label_node); - - // then the description is visible in a dialog - screen.getByRole("dialog"); - screen.getByText(description); - }); - }); - - describe("The description is not defined", () => { - it("displays the label without the 'info' icon and clicking does not show any popup", async () => { - const { user, container } = plainRender({label}); - - // no icon - expect(container.querySelector("svg")).not.toBeInTheDocument(); - - // click it - const label_node = screen.getByText(label); - await user.click(label_node); - - // no popup - expect(screen.queryByRole("dialog")).not.toBeInTheDocument(); - }); - }); -}); diff --git a/web/src/components/core/index.ts b/web/src/components/core/index.ts index dd18a31925..e77cbce6a3 100644 --- a/web/src/components/core/index.ts +++ b/web/src/components/core/index.ts @@ -21,9 +21,7 @@ */ export { default as ChangeProductLink } from "./ChangeProductLink"; -export { default as Description } from "./Description"; export { default as FormLabel } from "./FormLabel"; -export { default as FormReadOnlyField } from "./FormReadOnlyField"; export { default as FormValidationError } from "./FormValidationError"; export { default as Fieldset } from "./Fieldset"; export { default as Em } from "./Em"; @@ -40,8 +38,6 @@ export { default as PasswordAndConfirmationInput } from "./PasswordAndConfirmati export { default as Popup } from "./Popup"; export { default as ProgressReport } from "./ProgressReport"; export { default as ProgressText } from "./ProgressText"; -export { default as Tip } from "./Tip"; -export { default as NumericTextInput } from "./NumericTextInput"; export { default as PasswordInput } from "./PasswordInput"; export { default as ServerError } from "./ServerError"; export { default as ExpandableSelector } from "./ExpandableSelector"; From 5143d4c6bc7e5c5cb02793e60beb90f369c2f57b Mon Sep 17 00:00:00 2001 From: Martin Vidner Date: Thu, 16 Jan 2025 10:30:13 +0100 Subject: [PATCH 038/109] Fix typo in `agama profile import --help` (bsc#1235827) --- rust/agama-cli/src/profile.rs | 2 +- rust/package/agama.changes | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/rust/agama-cli/src/profile.rs b/rust/agama-cli/src/profile.rs index 9f2cbcce0d..c76be3147c 100644 --- a/rust/agama-cli/src/profile.rs +++ b/rust/agama-cli/src/profile.rs @@ -72,7 +72,7 @@ pub enum ProfileCommands { /// installation. Unless there is a need to inject additional commands between processing /// use this command instead of set of underlying commands. Import { - /// Profile's URL. Supports the same schemas than te "download" command plus + /// Profile's URL. Supports the same schemas as the "download" command plus /// AutoYaST specific ones. Supported files are json, jsonnet, sh for Agama profiles and ERB, XML, and rules/classes directories /// for AutoYaST support. url: String, diff --git a/rust/package/agama.changes b/rust/package/agama.changes index 6c57a34c96..e208e4c4a3 100644 --- a/rust/package/agama.changes +++ b/rust/package/agama.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Thu Jan 16 09:32:00 UTC 2025 - Martin Vidner + +- Fix typo in `agama profile import --help` (bsc#1235827) + ------------------------------------------------------------------- Fri Jan 10 21:22:01 UTC 2025 - Imobach Gonzalez Sosa From 7981617f1838698f6c3323e905e165aa60b47f04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 16 Jan 2025 12:03:32 +0000 Subject: [PATCH 039/109] fix(web): drop orphan test file --- .../core/FormReadOnlyField.test.jsx | 34 ------------------- 1 file changed, 34 deletions(-) delete mode 100644 web/src/components/core/FormReadOnlyField.test.jsx diff --git a/web/src/components/core/FormReadOnlyField.test.jsx b/web/src/components/core/FormReadOnlyField.test.jsx deleted file mode 100644 index 00706d9ae9..0000000000 --- a/web/src/components/core/FormReadOnlyField.test.jsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) [2024-2025] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { screen } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import { FormReadOnlyField } from "~/components/core"; - -it("renders label and content wrapped in div nodes using expected PatternFly styles", () => { - plainRender(Agama); - const field = screen.getByText("Agama"); - const label = screen.getByText("Product"); - expect(field.classList.contains("pf-v6-c-form__group")).toBe(true); - expect(label.classList.contains("pf-v6-c-form__label-text")).toBe(true); -}); From b1f79e4ec06f5a29e8e84ba0f5f1fbd01b21dcd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Thu, 16 Jan 2025 11:10:34 +0000 Subject: [PATCH 040/109] refactor(web): expose onerror and onclose at WSClient level --- web/src/client/index.ts | 15 ++++++++++----- web/src/client/ws.ts | 19 ++++++++++--------- web/src/context/installer.tsx | 2 +- web/src/context/installerL10n.test.tsx | 3 ++- web/src/queries/questions.ts | 8 ++++++++ web/src/test-utils.tsx | 4 ++-- 6 files changed, 33 insertions(+), 18 deletions(-) diff --git a/web/src/client/index.ts b/web/src/client/index.ts index 97826e5cd5..41f60c26b5 100644 --- a/web/src/client/index.ts +++ b/web/src/client/index.ts @@ -20,11 +20,10 @@ * find current contact information at www.suse.com. */ -import { WSClient } from "./ws"; +import { WSClient, EventHandlerFn, ErrorHandlerFn } from "./ws"; type VoidFn = () => void; type BooleanFn = () => boolean; -type EventHandlerFn = (event) => void; export type InstallerClient = { /** Whether the client is connected. */ @@ -37,10 +36,15 @@ export type InstallerClient = { */ onConnect: (handler: VoidFn) => VoidFn; /** - * Registers a handler to run when connection is lost. It returns a function + * Registers a handler to run when connection is closed. It returns a function * for deregistering the handler. */ - onDisconnect: (handler: VoidFn) => VoidFn; + onClose: (handler: VoidFn) => VoidFn; + /** + * Registers a handler to run when there is an error. It returns a function + * for deregistering the handler. + */ + onError: (handler: ErrorHandlerFn) => VoidFn; /** * Registers a handler to run on events. It returns a function for * deregistering the handler. @@ -66,7 +70,8 @@ const createClient = (url: URL): InstallerClient => { isConnected, isRecoverable, onConnect: (handler: VoidFn) => ws.onOpen(handler), - onDisconnect: (handler: VoidFn) => ws.onClose(handler), + onClose: (handler: VoidFn) => ws.onClose(handler), + onError: (handler: ErrorHandlerFn) => ws.onError(handler), onEvent: (handler: EventHandlerFn) => ws.onEvent(handler), }; }; diff --git a/web/src/client/ws.ts b/web/src/client/ws.ts index 608001f2cd..529c1e3c43 100644 --- a/web/src/client/ws.ts +++ b/web/src/client/ws.ts @@ -22,7 +22,8 @@ type RemoveFn = () => void; type BaseHandlerFn = () => void; -type EventHandlerFn = (event) => void; +export type EventHandlerFn = (event) => void; +export type ErrorHandlerFn = (error: object) => void; /** * Enum for the WebSocket states. @@ -53,7 +54,7 @@ class WSClient { handlers: { open: Array; close: Array; - error: Array; + error: Array; events: Array; }; @@ -109,14 +110,14 @@ class WSClient { }; client.onclose = () => { - console.log(`WebSocket closed`); + console.log("WebSocket closed"); this.dispatchCloseEvent(); this.timeout = setTimeout(() => this.connect(this.reconnectAttempts + 1), ATTEMPT_INTERVAL); }; - client.onerror = (e) => { - console.error("WebSocket error:", e); - this.dispatchErrorEvent(); + client.onerror = (error) => { + console.error("WebSocket error:", error); + this.dispatchErrorEvent(error); }; return client; @@ -179,7 +180,7 @@ class WSClient { * * The handler is executed when an error is reported by the socket. */ - onError(func: BaseHandlerFn): RemoveFn { + onError(func: ErrorHandlerFn): RemoveFn { this.handlers.error.push(func); return () => { @@ -214,8 +215,8 @@ class WSClient { * * Dispatchs an error event by running all its handlers. */ - dispatchErrorEvent() { - this.handlers.error.forEach((f) => f()); + dispatchErrorEvent(error) { + this.handlers.error.forEach((f) => f(error)); } /** diff --git a/web/src/context/installer.tsx b/web/src/context/installer.tsx index 6b48662e7d..96fe40e0de 100644 --- a/web/src/context/installer.tsx +++ b/web/src/context/installer.tsx @@ -102,7 +102,7 @@ function InstallerClientProvider({ children, client = null }: InstallerClientPro setError(false); }); - value.onDisconnect(() => { + value.onClose(() => { setConnected(false); setError(!value.isRecoverable()); }); diff --git a/web/src/context/installerL10n.test.tsx b/web/src/context/installerL10n.test.tsx index e97d324920..b8f3153090 100644 --- a/web/src/context/installerL10n.test.tsx +++ b/web/src/context/installerL10n.test.tsx @@ -48,7 +48,8 @@ const client = { isConnected: jest.fn().mockResolvedValue(true), isRecoverable: jest.fn(), onConnect: jest.fn(), - onDisconnect: jest.fn(), + onClose: jest.fn(), + onError: jest.fn(), onEvent: jest.fn(), }; diff --git a/web/src/queries/questions.ts b/web/src/queries/questions.ts index 1394df00c2..871129d2d0 100644 --- a/web/src/queries/questions.ts +++ b/web/src/queries/questions.ts @@ -62,6 +62,14 @@ const useQuestionsChanges = () => { } }); }, [client, queryClient]); + + React.useEffect(() => { + if (!client) return; + + return client.onConnect(() => { + queryClient.invalidateQueries({ queryKey: ["questions"] }); + }); + }, [client, queryClient]); }; /** diff --git a/web/src/test-utils.tsx b/web/src/test-utils.tsx index 39493e288e..962ceafaf4 100644 --- a/web/src/test-utils.tsx +++ b/web/src/test-utils.tsx @@ -93,8 +93,8 @@ const Providers = ({ children, withL10n }) => { // FIXME: workaround to fix the tests. We should inject // the client instead of mocking `createClient`. - if (!client.onDisconnect) { - client.onDisconnect = noop; + if (!client.onClose) { + client.onClose = noop; } if (withL10n) { From 0ed361d7968883589daa99404e6968ae41b37064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Thu, 16 Jan 2025 11:13:20 +0000 Subject: [PATCH 041/109] fix(web): work on "always" mode when working locally --- web/src/context/app.tsx | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/web/src/context/app.tsx b/web/src/context/app.tsx index 70686fde79..339450901f 100644 --- a/web/src/context/app.tsx +++ b/web/src/context/app.tsx @@ -24,8 +24,28 @@ import React from "react"; import { InstallerClientProvider } from "./installer"; import { InstallerL10nProvider } from "./installerL10n"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { localConnection } from "~/utils"; -const queryClient = new QueryClient(); +// Determines which "network mode" should Tanstack Query use +// +// When running on a local connection, we assume that the server is always +// available so Tanstack Query is expected to perform all the request, no +// matter whether the network is available on not. +// +// For remote connections, let's use the default "online" mode. +// +// See https://tanstack.com/query/latest/docs/framework/react/guides/network-mode +const networkMode = (): "always" | "online" => { + return localConnection() ? "always" : "online"; +}; + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + networkMode: networkMode(), + }, + }, +}); /** * Combines all application providers. From 1964887535de985226d17a6f08100a65be2325b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Thu, 16 Jan 2025 11:14:03 +0000 Subject: [PATCH 042/109] fix(rust): exit the ws handler when the client is disconnected --- rust/agama-server/src/web/ws.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rust/agama-server/src/web/ws.rs b/rust/agama-server/src/web/ws.rs index 5c6ce10776..10d17c6270 100644 --- a/rust/agama-server/src/web/ws.rs +++ b/rust/agama-server/src/web/ws.rs @@ -40,7 +40,10 @@ async fn handle_socket(mut socket: WebSocket, events: EventsSender) { let mut rx = events.subscribe(); while let Ok(msg) = rx.recv().await { if let Ok(json) = serde_json::to_string(&msg) { - _ = socket.send(Message::Text(json)).await; + if socket.send(Message::Text(json)).await.is_err() { + tracing::info!("ws: client disconnected"); + return; + } } } } From f704d9e9e86f9e0968f08f17627b1ea4f9f865a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Thu, 16 Jan 2025 11:14:36 +0000 Subject: [PATCH 043/109] feat(rust): log the events --- rust/agama-server/src/web.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rust/agama-server/src/web.rs b/rust/agama-server/src/web.rs index 8904565ff7..abb6d34349 100644 --- a/rust/agama-server/src/web.rs +++ b/rust/agama-server/src/web.rs @@ -224,6 +224,7 @@ async fn run_events_monitor(dbus: zbus::Connection, events: EventsSender) -> Res tokio::pin!(stream); let e = events.clone(); while let Some((_, event)) = stream.next().await { + tracing::info!("event: {:?}", &event); _ = e.send(event); } Ok(()) From 221ffeee2a8ece1e763057310703f57bf5b85ae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Thu, 16 Jan 2025 13:12:21 +0000 Subject: [PATCH 044/109] doc: update changes files --- rust/package/agama.changes | 7 +++++++ web/package/agama-web-ui.changes | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/rust/package/agama.changes b/rust/package/agama.changes index e208e4c4a3..58bf5fb564 100644 --- a/rust/package/agama.changes +++ b/rust/package/agama.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Thu Jan 16 13:10:54 UTC 2025 - Imobach Gonzalez Sosa + +- Stop the WebSocket handler when the client is disconnected + (gh#agama-project/agama#1909). +- Log the events. + ------------------------------------------------------------------- Thu Jan 16 09:32:00 UTC 2025 - Martin Vidner diff --git a/web/package/agama-web-ui.changes b/web/package/agama-web-ui.changes index b856e7cb7c..06367517d0 100644 --- a/web/package/agama-web-ui.changes +++ b/web/package/agama-web-ui.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Jan 16 13:11:06 UTC 2025 - Imobach Gonzalez Sosa + +- Display error messages during package installation + (gh#agama-project/agama#1909). + ------------------------------------------------------------------- Mon Jan 13 11:11:49 UTC 2025 - David Diaz From 56ea6472f2845b15a450e6ef570a9ea13777e600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Thu, 16 Jan 2025 13:14:41 +0000 Subject: [PATCH 045/109] fix(web): fix client mock --- web/src/context/installer.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/src/context/installer.test.tsx b/web/src/context/installer.test.tsx index 5c4125da1e..7811ffec3d 100644 --- a/web/src/context/installer.test.tsx +++ b/web/src/context/installer.test.tsx @@ -44,7 +44,8 @@ describe("installer context", () => { (createDefaultClient as jest.Mock).mockImplementation(() => { return { onConnect: jest.fn(), - onDisconnect: jest.fn(), + onClose: jest.fn(), + onError: jest.fn(), }; }); }); From f1b4018667cc1ab28186607745a7581c55d59316 Mon Sep 17 00:00:00 2001 From: Josef Reidinger Date: Thu, 16 Jan 2025 16:12:03 +0100 Subject: [PATCH 046/109] fix SLES4SAP base product to match product (bsc#1235956) --- products.d/sles_sap_160.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/products.d/sles_sap_160.yaml b/products.d/sles_sap_160.yaml index a11ad92401..3cf70ce139 100644 --- a/products.d/sles_sap_160.yaml +++ b/products.d/sles_sap_160.yaml @@ -37,7 +37,7 @@ software: mandatory_packages: - NetworkManager optional_packages: null - base_product: SLES-SAP + base_product: SLES_SAP security: lsm: selinux From 755f1429063b6c1cae9ab376b87fa63e30f921c4 Mon Sep 17 00:00:00 2001 From: Josef Reidinger Date: Thu, 16 Jan 2025 16:12:38 +0100 Subject: [PATCH 047/109] changes --- products.d/agama-products.changes | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/products.d/agama-products.changes b/products.d/agama-products.changes index 780ff182b1..12ea341591 100644 --- a/products.d/agama-products.changes +++ b/products.d/agama-products.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Thu Jan 16 15:12:08 UTC 2025 - Josef Reidinger + +- Update also base product from SLES-SAP to SLES_SAP(bsc#1235956) + ------------------------------------------------------------------- Mon Jan 13 09:04:21 UTC 2025 - Imobach Gonzalez Sosa From 693f8da894bfc523fcdd16a2f274f81ecb98c8c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ladislav=20Slez=C3=A1k?= Date: Thu, 16 Jan 2025 18:33:37 +0100 Subject: [PATCH 048/109] Correctly select the base product to install (bsc#1235931) --- service/lib/agama/software/proposal.rb | 4 +++- service/package/rubygem-agama-yast.changes | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/service/lib/agama/software/proposal.rb b/service/lib/agama/software/proposal.rb index ce2b8bef26..3330bba08a 100644 --- a/service/lib/agama/software/proposal.rb +++ b/service/lib/agama/software/proposal.rb @@ -86,8 +86,10 @@ def set_resolvables(unique_id, type, resolvables, optional: false) # @return [Boolean] def calculate initialize_target - select_base_product @proposal = Yast::Packages.Proposal(force_reset = true, reinit = false, _simple = true) + # select the base product after running the Packages.Proposal, the force_reset = true + # option would reset the selection and a random product would be selected by the solver + select_base_product solve_dependencies valid? diff --git a/service/package/rubygem-agama-yast.changes b/service/package/rubygem-agama-yast.changes index d66cc4c1e5..328d6c5390 100644 --- a/service/package/rubygem-agama-yast.changes +++ b/service/package/rubygem-agama-yast.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Thu Jan 16 17:30:03 UTC 2025 - Ladislav Slezák + +- Correctly select the base product to install (bsc#1235931) + ------------------------------------------------------------------- Wed Jan 15 14:26:11 UTC 2025 - José Iván López González From 423e20b313e83037e81d8f04833a38adbdea2185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 06:07:34 +0000 Subject: [PATCH 049/109] feat(storage): add D-Bus method for reprobing --- .../bus/org.opensuse.Agama.Storage1.bus.xml | 2 + doc/dbus/org.opensuse.Agama.Storage1.doc.xml | 5 ++ service/lib/agama/dbus/storage/manager.rb | 9 ++-- service/lib/agama/storage/manager.rb | 26 +++++++---- service/test/agama/storage/manager_test.rb | 46 ++++++++++++++++++- 5 files changed, 74 insertions(+), 14 deletions(-) diff --git a/doc/dbus/bus/org.opensuse.Agama.Storage1.bus.xml b/doc/dbus/bus/org.opensuse.Agama.Storage1.bus.xml index 9eedf3e6e6..93dd879063 100644 --- a/doc/dbus/bus/org.opensuse.Agama.Storage1.bus.xml +++ b/doc/dbus/bus/org.opensuse.Agama.Storage1.bus.xml @@ -45,6 +45,8 @@ + + diff --git a/doc/dbus/org.opensuse.Agama.Storage1.doc.xml b/doc/dbus/org.opensuse.Agama.Storage1.doc.xml index a4ac2393f4..3a8beb2e6c 100644 --- a/doc/dbus/org.opensuse.Agama.Storage1.doc.xml +++ b/doc/dbus/org.opensuse.Agama.Storage1.doc.xml @@ -7,6 +7,11 @@ + + + diff --git a/service/lib/agama/dbus/storage/manager.rb b/service/lib/agama/dbus/storage/manager.rb index 2554e8fd29..918f43de6d 100644 --- a/service/lib/agama/dbus/storage/manager.rb +++ b/service/lib/agama/dbus/storage/manager.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -# Copyright (c) [2022-2024] SUSE LLC +# Copyright (c) [2022-2025] SUSE LLC # # All Rights Reserved. # @@ -87,13 +87,15 @@ def issues STORAGE_INTERFACE = "org.opensuse.Agama.Storage1" private_constant :STORAGE_INTERFACE - def probe + # @param keep_config [Boolean] Whether to use the current storage config for calculating + # the proposal. + def probe(keep_config: false) busy_while do # Clean trees in advance to avoid having old objects exported in D-Bus. system_devices_tree.clean staging_devices_tree.clean - backend.probe + backend.probe(keep_config: keep_config) end end @@ -162,6 +164,7 @@ def deprecated_system dbus_interface STORAGE_INTERFACE do dbus_method(:Probe) { probe } + dbus_method(:Reprobe) { probe(keep_config: true) } dbus_method(:SetConfig, "in serialized_config:s, out result:u") do |serialized_config| busy_while { apply_config(serialized_config) } end diff --git a/service/lib/agama/storage/manager.rb b/service/lib/agama/storage/manager.rb index 9d8c4463ac..48a28c427b 100644 --- a/service/lib/agama/storage/manager.rb +++ b/service/lib/agama/storage/manager.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -# Copyright (c) [2022-2024] SUSE LLC +# Copyright (c) [2022-2025] SUSE LLC # # All Rights Reserved. # @@ -113,14 +113,21 @@ def on_probe(&block) end # Probes storage devices and performs an initial proposal - def probe + # + # @param keep_config [Boolean] Whether to use the current storage config for calculating the + # proposal. + def probe(keep_config: false) start_progress_with_size(4) product_config.pick_product(software.selected_product) check_multipath progress.step(_("Activating storage devices")) { activate_devices } progress.step(_("Probing storage devices")) { probe_devices } - progress.step(_("Calculating the storage proposal")) { calculate_proposal } + progress.step(_("Calculating the storage proposal")) do + calculate_proposal(keep_config: keep_config) + end progress.step(_("Selecting Linux Security Modules")) { security.probe } + # The system is not deprecated anymore + self.deprecated_system = false update_issues @on_probe_callbacks&.each(&:call) end @@ -216,14 +223,15 @@ def probe_devices iscsi.probe Y2Storage::StorageManager.instance.probe(callbacks) - - # The system is not deprecated anymore - self.deprecated_system = false end - # Calculates the proposal using the storage config from the product. - def calculate_proposal - config_json = ConfigJSONReader.new(product_config).read + # Calculates the proposal. + # + # @param keep_config [Boolean] Whether to use the current storage config for calculating the + # proposal. If false, then the default config from the product is used. + def calculate_proposal(keep_config: false) + config_json = proposal.storage_json if keep_config + config_json ||= ConfigJSONReader.new(product_config).read proposal.calculate_from_json(config_json) end diff --git a/service/test/agama/storage/manager_test.rb b/service/test/agama/storage/manager_test.rb index d4515423d9..ec43df5d01 100644 --- a/service/test/agama/storage/manager_test.rb +++ b/service/test/agama/storage/manager_test.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -# Copyright (c) [2022-2024] SUSE LLC +# Copyright (c) [2022-2025] SUSE LLC # # All Rights Reserved. # @@ -167,6 +167,10 @@ allow(proposal).to receive(:issues).and_return(proposal_issues) allow(proposal).to receive(:available_devices).and_return(devices) allow(proposal).to receive(:calculate_from_json) + allow(proposal).to receive(:storage_json).and_return(current_config) + + allow_any_instance_of(Agama::Storage::ConfigJSONReader) + .to receive(:read).and_return(default_config) allow(config).to receive(:pick_product) allow(iscsi).to receive(:activate) @@ -181,6 +185,26 @@ let(:proposal) { Agama::Storage::Proposal.new(config, logger: logger) } + let(:default_config) do + { + storage: { + drives: [ + search: "/dev/vda1" + ] + } + } + end + + let(:current_config) do + { + storage: { + drives: [ + search: "/dev/vda2" + ] + } + } + end + let(:iscsi) { Agama::Storage::ISCSI::Manager.new } let(:devices) { [disk1, disk2] } @@ -194,7 +218,7 @@ let(:callback) { proc {} } - it "probes the storage devices and calculates a proposal with the default settings" do + it "probes the storage devices and calculates a proposal" do expect(config).to receive(:pick_product).with("ALP") expect(iscsi).to receive(:activate) expect(y2storage_manager).to receive(:activate) do |callbacks| @@ -237,6 +261,24 @@ storage.probe end + context "if :keep_config is false" do + let(:keep_config) { false } + + it "calculates a proposal using the default product config" do + expect(proposal).to receive(:calculate_from_json).with(default_config) + storage.probe(keep_config: keep_config) + end + end + + context "if :keep_config is true" do + let(:keep_config) { true } + + it "calculates a proposal using the current config" do + expect(proposal).to receive(:calculate_from_json).with(current_config) + storage.probe(keep_config: keep_config) + end + end + context "if there are available devices" do let(:devices) { [disk1] } From 8d50eba664db16b224ca23af0ca3da8523fc1aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 06:09:01 +0000 Subject: [PATCH 050/109] feat(storage): add reprobe endpoint --- rust/agama-lib/src/storage/client.rs | 7 ++++++- .../agama-lib/src/storage/proxies/storage1.rs | 5 ++++- rust/agama-server/src/storage/web.rs | 20 +++++++++++++++++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/rust/agama-lib/src/storage/client.rs b/rust/agama-lib/src/storage/client.rs index cfbf228609..b99626b13d 100644 --- a/rust/agama-lib/src/storage/client.rs +++ b/rust/agama-lib/src/storage/client.rs @@ -1,4 +1,4 @@ -// Copyright (c) [2024] SUSE LLC +// Copyright (c) [2024-2025] SUSE LLC // // All Rights Reserved. // @@ -139,6 +139,11 @@ impl<'a> StorageClient<'a> { Ok(self.storage_proxy.probe().await?) } + /// Runs the reprobing process + pub async fn reprobe(&self) -> Result<(), ServiceError> { + Ok(self.storage_proxy.reprobe().await?) + } + /// Set the storage config according to the JSON schema pub async fn set_config(&self, settings: StorageSettings) -> Result { Ok(self diff --git a/rust/agama-lib/src/storage/proxies/storage1.rs b/rust/agama-lib/src/storage/proxies/storage1.rs index 67e31c247d..563bbfd356 100644 --- a/rust/agama-lib/src/storage/proxies/storage1.rs +++ b/rust/agama-lib/src/storage/proxies/storage1.rs @@ -1,4 +1,4 @@ -// Copyright (c) [2024] SUSE LLC +// Copyright (c) [2024-2025] SUSE LLC // // All Rights Reserved. // @@ -56,6 +56,9 @@ pub trait Storage1 { /// Probe method fn probe(&self) -> zbus::Result<()>; + /// Reprobe method + fn reprobe(&self) -> zbus::Result<()>; + /// Set the storage config according to the JSON schema fn set_config(&self, settings: &str) -> zbus::Result; diff --git a/rust/agama-server/src/storage/web.rs b/rust/agama-server/src/storage/web.rs index 26c0b60bef..260f2a9280 100644 --- a/rust/agama-server/src/storage/web.rs +++ b/rust/agama-server/src/storage/web.rs @@ -1,4 +1,4 @@ -// Copyright (c) [2024] SUSE LLC +// Copyright (c) [2024-2025] SUSE LLC // // All Rights Reserved. // @@ -116,6 +116,7 @@ pub async fn storage_service(dbus: zbus::Connection) -> Result>) -> Result, Error> Ok(Json(state.client.probe().await?)) } +/// Reprobes the storage devices. +#[utoipa::path( + post, + path = "/reprobe", + context_path = "/api/storage", + responses( + (status = 200, description = "Devices were probed and the proposal was recalculated"), + (status = 400, description = "The D-Bus service could not perform the action") + ), + operation_id = "storage_reprobe" +)] +async fn reprobe(State(state): State>) -> Result, Error> { + Ok(Json(state.client.reprobe().await?)) +} + /// Gets whether the system is in a deprecated status. /// /// The system is usually set as deprecated as effect of managing some kind of devices, for example, From 3dd10237b5c494dff36e2c52e1ac2ae90532bf04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 06:11:25 +0000 Subject: [PATCH 051/109] feat(web): adapt storage api - Add #reprobe - Remove #refresh - Move useful methods from proposal file. --- web/src/api/storage.ts | 39 ++++++++++++++++++--------------- web/src/api/storage/proposal.ts | 36 ++++-------------------------- 2 files changed, 25 insertions(+), 50 deletions(-) diff --git a/web/src/api/storage.ts b/web/src/api/storage.ts index b09a0b64f2..e0c4b3852c 100644 --- a/web/src/api/storage.ts +++ b/web/src/api/storage.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * @@ -22,16 +22,17 @@ import { get, post, put } from "~/api/http"; import { Job } from "~/types/job"; -import { calculate, fetchSettings } from "~/api/storage/proposal"; -import { config, configModel } from "~/api/storage/types"; +import { Action, config, configModel, ProductParams, Volume } from "~/api/storage/types"; /** * Starts the storage probing process. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any const probe = (): Promise => post("/api/storage/probe"); +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const reprobe = (): Promise => post("/api/storage/reprobe"); + const fetchConfig = (): Promise => get("/api/storage/config").then((config) => config.storage); @@ -42,6 +43,17 @@ const setConfig = (config: config.Config) => put("/api/storage/config", { storag const setConfigModel = (model: configModel.Config) => put("/api/storage/config_model", model); +const fetchUsableDevices = (): Promise => get(`/api/storage/proposal/usable_devices`); + +const fetchProductParams = (): Promise => get("/api/storage/product/params"); + +const fetchDefaultVolume = (mountPath: string): Promise => { + const path = encodeURIComponent(mountPath); + return get(`/api/storage/product/volume_for?mount_path=${path}`); +}; + +const fetchActions = (): Promise => get("/api/storage/devices/actions"); + /** * Returns the list of jobs */ @@ -53,26 +65,17 @@ const fetchStorageJobs = (): Promise => get("/api/storage/jobs"); const findStorageJob = (id: string): Promise => fetchStorageJobs().then((jobs: Job[]) => jobs.find((value) => value.id === id)); -/** - * Refreshes the storage layer. - * - * It does the probing again and recalculates the proposal with the same - * settings. Internally, it is composed of three different API calls - * (retrieve the settings, probe the system, and calculate the proposal). - */ -const refresh = async (): Promise => { - const settings = await fetchSettings(); - await probe().catch(console.log); - await calculate(settings).catch(console.log); -}; - export { probe, + reprobe, fetchConfig, fetchConfigModel, setConfig, setConfigModel, + fetchUsableDevices, + fetchProductParams, + fetchDefaultVolume, + fetchActions, fetchStorageJobs, findStorageJob, - refresh, }; diff --git a/web/src/api/storage/proposal.ts b/web/src/api/storage/proposal.ts index 22ce49f066..333f3ae633 100644 --- a/web/src/api/storage/proposal.ts +++ b/web/src/api/storage/proposal.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * @@ -20,38 +20,10 @@ * find current contact information at www.suse.com. */ -import { get, put } from "../http"; -import { - Action, - ProductParams, - ProposalSettings, - ProposalSettingsPatch, - Volume, -} from "~/api/storage/types"; - -const fetchUsableDevices = (): Promise => get(`/api/storage/proposal/usable_devices`); - -const fetchProductParams = (): Promise => get("/api/storage/product/params"); - -const fetchDefaultVolume = (mountPath: string): Promise => { - const path = encodeURIComponent(mountPath); - return get(`/api/storage/product/volume_for?mount_path=${path}`); -}; - -// NOTE: the settings might not exist. -const fetchSettings = (): Promise => - get("/api/storage/proposal/settings").catch(() => null); - -const fetchActions = (): Promise => get("/api/storage/devices/actions"); +import { put } from "../http"; +import { ProposalSettingsPatch } from "~/api/storage/types"; const calculate = (settings: ProposalSettingsPatch) => put("/api/storage/proposal/settings", settings); -export { - fetchUsableDevices, - fetchProductParams, - fetchDefaultVolume, - fetchSettings, - fetchActions, - calculate, -}; +export { calculate }; From 3186e9b7d949199233e8ecb46231e37cb34033e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 06:24:21 +0000 Subject: [PATCH 052/109] feat(web): add query for reprobing storage --- web/src/queries/storage.ts | 41 +++++++++++++++----------------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/web/src/queries/storage.ts b/web/src/queries/storage.ts index 957bf4c956..cd2b7c4f71 100644 --- a/web/src/queries/storage.ts +++ b/web/src/queries/storage.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * @@ -28,15 +28,17 @@ import { useSuspenseQuery, } from "@tanstack/react-query"; import React from "react"; -import { fetchConfig, refresh, setConfig } from "~/api/storage"; -import { fetchDevices, fetchDevicesDirty } from "~/api/storage/devices"; import { - calculate, + fetchConfig, + setConfig, fetchActions, fetchDefaultVolume, fetchProductParams, fetchUsableDevices, -} from "~/api/storage/proposal"; + reprobe, +} from "~/api/storage"; +import { calculate } from "~/api/storage/proposal"; +import { fetchDevices, fetchDevicesDirty } from "~/api/storage/devices"; import { useInstallerClient } from "~/context/installer"; import { config, @@ -314,30 +316,19 @@ const useDeprecatedChanges = () => { }); }; -type RefreshHandler = { - onStart?: () => void; - onFinish?: () => void; -}; - /** * Hook that reprobes the devices and recalculates the proposal using the current settings. */ -const useRefresh = (handler?: RefreshHandler) => { +const useReprobeMutation = () => { const queryClient = useQueryClient(); - const deprecated = useDeprecated(); - - handler ||= {}; - handler.onStart ||= () => undefined; - handler.onFinish ||= () => undefined; - - React.useEffect(() => { - if (!deprecated) return; + const query = { + mutationFn: async () => { + await reprobe(); + }, + onSuccess: () => queryClient.invalidateQueries({ queryKey: ["storage"] }), + }; - handler.onStart(); - refresh() - .then(() => queryClient.invalidateQueries({ queryKey: ["storage"] })) - .then(() => handler.onFinish()); - }, [handler, deprecated, queryClient]); + return useMutation(query); }; export { @@ -352,7 +343,7 @@ export { useProposalMutation, useDeprecated, useDeprecatedChanges, - useRefresh, + useReprobeMutation, }; export * from "~/queries/storage/config-model"; From 267fa7cd040175988521d901381df2cbc32bb37b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 06:27:03 +0000 Subject: [PATCH 053/109] fix(web): reprobe the system --- web/src/components/storage/ProposalPage.tsx | 26 ++++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/web/src/components/storage/ProposalPage.tsx b/web/src/components/storage/ProposalPage.tsx index 620d14731b..9f8347be87 100644 --- a/web/src/components/storage/ProposalPage.tsx +++ b/web/src/components/storage/ProposalPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * @@ -20,7 +20,7 @@ * find current contact information at www.suse.com. */ -import React, { useState } from "react"; +import React from "react"; import { Grid, GridItem, SplitItem } from "@patternfly/react-core"; import { Page } from "~/components/core/"; import { Loading } from "~/components/layout"; @@ -32,7 +32,13 @@ import ConfigEditorMenu from "./ConfigEditorMenu"; import { toValidationError } from "~/utils"; import { useIssues } from "~/queries/issues"; import { IssueSeverity } from "~/types/issues"; -import { useDevices, useProposalResult, useRefresh } from "~/queries/storage"; +import { + useDevices, + useDeprecated, + useDeprecatedChanges, + useProposalResult, + useReprobeMutation, +} from "~/queries/storage"; import { _ } from "~/i18n"; /** @@ -59,21 +65,23 @@ export const NOT_AFFECTED = { }; export default function ProposalPage() { - const [isLoading, setIsLoading] = useState(false); const systemDevices = useDevices("system"); const stagingDevices = useDevices("result"); + const isDeprecated = useDeprecated(); + const { mutateAsync: reprobe } = useReprobeMutation(); const { actions } = useProposalResult(); - useRefresh({ - onStart: () => setIsLoading(true), - onFinish: () => setIsLoading(false), - }); + useDeprecatedChanges(); + + React.useEffect(() => { + if (isDeprecated) reprobe().catch(console.log); + }, [isDeprecated, reprobe]); const errors = useIssues("storage") .filter((s) => s.severity === IssueSeverity.Error) .map(toValidationError); - if (isLoading) { + if (isDeprecated) { return ( From ad8b6c2747ae9c8a5258eba04f6e4f1a072ca78e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 06:28:30 +0000 Subject: [PATCH 054/109] fix(web): avoid to fail if a storage device is not found --- web/src/components/storage/ConfigEditor.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/web/src/components/storage/ConfigEditor.tsx b/web/src/components/storage/ConfigEditor.tsx index acc377a257..a804198617 100644 --- a/web/src/components/storage/ConfigEditor.tsx +++ b/web/src/components/storage/ConfigEditor.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * @@ -34,6 +34,12 @@ export default function ConfigEditor() { {model.drives.map((drive, i) => { const device = devices.find((d) => d.name === drive.name); + /** + * @fixme Make DriveEditor to work when the device is not found (e.g., after disabling + * a iSCSI device). + */ + if (device === undefined) return null; + return ( From ee3035b845321a4eee0cfda1783b261c1867647c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 06:31:42 +0000 Subject: [PATCH 055/109] fix(web): adapt back button of iSCSI page --- web/src/components/storage/ISCSIPage.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/src/components/storage/ISCSIPage.tsx b/web/src/components/storage/ISCSIPage.tsx index 79c7852505..a61fa35d82 100644 --- a/web/src/components/storage/ISCSIPage.tsx +++ b/web/src/components/storage/ISCSIPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * @@ -44,8 +44,8 @@ export default function ISCSIPage() { - - {_("Back to device selection")} + + {_("Back")} From 26a5dc3681119fc734e16fb235bf762c426e4632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 06:57:14 +0000 Subject: [PATCH 056/109] fix(web): remove reprobing from device selector - DeviceSelector component is not used anymore. --- web/src/components/storage/DeviceSelection.tsx | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/web/src/components/storage/DeviceSelection.tsx b/web/src/components/storage/DeviceSelection.tsx index aefffe1f81..5fc87aae9e 100644 --- a/web/src/components/storage/DeviceSelection.tsx +++ b/web/src/components/storage/DeviceSelection.tsx @@ -27,17 +27,11 @@ import { Page } from "~/components/core"; import { DeviceSelectorTable } from "~/components/storage"; import DevicesTechMenu from "./DevicesTechMenu"; import { ProposalTarget, StorageDevice } from "~/types/storage"; -import { - useAvailableDevices, - useProposalMutation, - useProposalResult, - useRefresh, -} from "~/queries/storage"; +import { useAvailableDevices, useProposalMutation, useProposalResult } from "~/queries/storage"; import { deviceChildren } from "~/components/storage/utils"; import { compact } from "~/utils"; import a11y from "@patternfly/react-styles/css/utilities/Accessibility/accessibility"; import { _ } from "~/i18n"; -import { Loading } from "~/components/layout"; const SELECT_DISK_ID = "select-disk"; const CREATE_LVM_ID = "create-lvm"; @@ -59,17 +53,11 @@ export default function DeviceSelection() { const availableDevices = useAvailableDevices(); const updateProposal = useProposalMutation(); const navigate = useNavigate(); - const [isLoading, setIsLoading] = useState(false); const [state, setState] = useState({}); const isTargetDisk = state.target === ProposalTarget.DISK; const isTargetNewLvmVg = state.target === ProposalTarget.NEW_LVM_VG; - useRefresh({ - onStart: () => setIsLoading(true), - onFinish: () => setIsLoading(false), - }); - useEffect(() => { if (state.target !== undefined) return; @@ -130,8 +118,6 @@ physical volumes will be created on demand as new partitions at the selected \ devices.", ).split(/[[\]]/); - if (isLoading) return ; - return ( From afc41dc158ce0a2dadfb7be72b4b1289d6ef532f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 08:59:39 +0000 Subject: [PATCH 057/109] fix(web): remove unused components --- .../core/ExpandableSelector.test.tsx | 454 ------------------ .../components/core/ExpandableSelector.tsx | 274 ----------- web/src/components/core/index.ts | 1 - .../components/storage/DeviceSelection.tsx | 215 --------- .../storage/DeviceSelectorTable.tsx | 183 ------- .../storage/DevicesTechMenu.test.tsx | 76 --- .../components/storage/DevicesTechMenu.tsx | 118 ----- .../storage/VolumeLocationSelectorTable.tsx | 131 ----- web/src/components/storage/index.ts | 2 - web/src/routes/storage.tsx | 6 +- 10 files changed, 1 insertion(+), 1459 deletions(-) delete mode 100644 web/src/components/core/ExpandableSelector.test.tsx delete mode 100644 web/src/components/core/ExpandableSelector.tsx delete mode 100644 web/src/components/storage/DeviceSelection.tsx delete mode 100644 web/src/components/storage/DeviceSelectorTable.tsx delete mode 100644 web/src/components/storage/DevicesTechMenu.test.tsx delete mode 100644 web/src/components/storage/DevicesTechMenu.tsx delete mode 100644 web/src/components/storage/VolumeLocationSelectorTable.tsx diff --git a/web/src/components/core/ExpandableSelector.test.tsx b/web/src/components/core/ExpandableSelector.test.tsx deleted file mode 100644 index 9f1f9e6815..0000000000 --- a/web/src/components/core/ExpandableSelector.test.tsx +++ /dev/null @@ -1,454 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { screen, within } from "@testing-library/react"; -import { plainRender } from "~/test-utils"; -import { ExpandableSelector } from "~/components/core"; -import { ExpandableSelectorColumn } from "./ExpandableSelector"; - -let consoleErrorSpy: jest.SpyInstance; - -/* eslint-disable @typescript-eslint/no-explicit-any */ - -const sda: any = { - sid: "59", - isDrive: true, - type: "disk", - vendor: "Micron", - model: "Micron 1100 SATA", - driver: ["ahci", "mmcblk"], - bus: "IDE", - busId: "", - transport: "usb", - dellBOSS: false, - sdCard: true, - active: true, - name: "/dev/sda", - size: 1024, - shrinking: { unsupported: ["Resizing is not supported"] }, - systems: [], - udevIds: ["ata-Micron_1100_SATA_512GB_12563", "scsi-0ATA_Micron_1100_SATA_512GB"], - udevPaths: ["pci-0000:00-12", "pci-0000:00-12-ata"], -}; - -const sda1 = { - sid: "60", - isDrive: false, - type: "", - active: true, - name: "/dev/sda1", - size: 512, - shrinking: { supported: 128 }, - systems: [], - udevIds: [], - udevPaths: [], -}; - -const sda2 = { - sid: "61", - isDrive: false, - type: "", - active: true, - name: "/dev/sda2", - size: 512, - shrinking: { unsupported: ["Resizing is not supported"] }, - systems: [], - udevIds: [], - udevPaths: [], -}; - -sda.partitionTable = { - type: "gpt", - partitions: [sda1, sda2], - unpartitionedSize: 512, -}; - -const sdb = { - sid: "62", - isDrive: true, - type: "disk", - vendor: "Samsung", - model: "Samsung Evo 8 Pro", - driver: ["ahci"], - bus: "IDE", - busId: "", - transport: "", - dellBOSS: false, - sdCard: false, - active: true, - name: "/dev/sdb", - size: 2048, - shrinking: { unsupported: ["Resizing is not supported"] }, - systems: [], - udevIds: [], - udevPaths: ["pci-0000:00-19"], -}; - -const lv1 = { - sid: "163", - name: "/dev/system/vg/lv1", - content: "Personal Data", -}; - -const vg = { - sid: "162", - type: "vg", - name: "/dev/system/vg", - lvs: [lv1], -}; - -const columns: ExpandableSelectorColumn[] = [ - // FIXME: do not use any but the right types once storage part is rewritten. - // Or even better, write a test not coupled to storage - { name: "Device", value: (item: any) => item.name }, - { - name: "Content", - value: (item: any) => { - if (item.isDrive) return item.systems.map((s, i) =>

{s}

); - if (item.type === "vg") return `${item.lvs.length} logical volume(s)`; - - return item.content; - }, - }, - { name: "Size", value: (item: any) => item.size }, -]; - -const onChangeFn = jest.fn(); - -let props; -const commonProps = { - columns, - items: [sda, sdb, vg], - itemIdKey: "sid", - initialExpandedKeys: [sda.sid, vg.sid], - itemChildren: (item) => (item.isDrive ? item.partitionTable?.partitions : item.lvs), - onSelectionChange: onChangeFn, - "aria-label": "Device selector", -}; - -describe("ExpandableSelector", () => { - beforeAll(() => { - consoleErrorSpy = jest.spyOn(console, "error"); - consoleErrorSpy.mockImplementation(); - }); - - afterAll(() => { - consoleErrorSpy.mockRestore(); - }); - - beforeEach(() => { - props = { ...commonProps }; - }); - - it("renders a table with given name", () => { - plainRender(); - screen.getByRole("grid", { name: "Device selector" }); - }); - - it("renders the table headers", () => { - plainRender(); - const table = screen.getByRole("grid"); - within(table).getByRole("columnheader", { name: "Device" }); - within(table).getByRole("columnheader", { name: "Content" }); - within(table).getByRole("columnheader", { name: "Size" }); - }); - - it("renders a rowgroup per parent item", () => { - plainRender(); - const groups = screen.getAllByRole("rowgroup"); - // NOTE: since has also the rowgroup role, we expect to found 4 in - // this example: 1 thead + 3 tbody (sda, sdb, vg) - expect(groups.length).toEqual(4); - }); - - it("renders a row per given item and found children", () => { - plainRender(); - const table = screen.getByRole("grid"); - within(table).getByRole("row", { name: /dev\/sda 1024/ }); - within(table).getByRole("row", { name: /dev\/sdb 2048/ }); - within(table).getByRole("row", { name: /dev\/system\/vg 1 logical/ }); - within(table).getByRole("row", { name: /dev\/sda1 512/ }); - within(table).getByRole("row", { name: /dev\/sda2 512/ }); - within(table).getByRole("row", { name: /Personal Data/ }); - }); - - it("renders a expand toggler in items with children", () => { - plainRender(); - const table = screen.getByRole("grid"); - const sdaRow = within(table).getByRole("row", { name: /dev\/sda 1024/ }); - const sdbRow = within(table).getByRole("row", { name: /dev\/sdb 2048/ }); - const lvRow = within(table).getByRole("row", { name: /dev\/system\/vg 1 logical/ }); - - within(sdaRow).getByRole("button", { name: "Details" }); - within(lvRow).getByRole("button", { name: "Details" }); - // `/dev/sdb` does not have children, toggler must not be there - const sdbChildrenToggler = within(sdbRow).queryByRole("button", { name: "Details" }); - expect(sdbChildrenToggler).toBeNull(); - }); - - it("renders as expanded items which value for `itemIdKey` is included in `initialExpandedKeys` prop", () => { - plainRender( - , - ); - const table = screen.getByRole("grid"); - within(table).getByRole("row", { name: /dev\/sda1 512/ }); - within(table).getByRole("row", { name: /dev\/sda2 512/ }); - }); - - it("keeps track of expanded items", async () => { - const { user } = plainRender( - , - ); - const table = screen.getByRole("grid"); - const sdaRow = within(table).getByRole("row", { name: /sda 1024/ }); - const sdaToggler = within(sdaRow).getByRole("button", { name: "Details" }); - const vgRow = within(table).getByRole("row", { name: /vg 1 logical/ }); - const vgToggler = within(vgRow).getByRole("button", { name: "Details" }); - - within(table).getByRole("row", { name: /dev\/sda1 512/ }); - within(table).getByRole("row", { name: /dev\/sda2 512/ }); - - await user.click(vgToggler); - - within(table).getByRole("row", { name: /Personal Data/ }); - - await user.click(sdaToggler); - const sdaPartitionsRows = within(table).queryAllByRole("row", { name: /sda[d] 512/ }); - expect(sdaPartitionsRows.length).toEqual(0); - }); - - it("uses 'id' as key when `itemIdKey` prop is not given", () => { - plainRender(); - - const table = screen.getByRole("grid"); - // Since itemIdKey does not match the id used for the item, they are - // collapsed by default and their children are not visible - const sdaChild = within(table).queryByRole("row", { name: /dev\/sda1 512/ }); - expect(sdaChild).toBeNull(); - }); - - it("uses given `itemIdKey` as key", () => { - plainRender( - , - ); - - const table = screen.getByRole("grid"); - // Since itemIdKey === "name", "/dev/sda" is properly mounted as expanded. Its - // children must be visible - const sdaChild = within(table).queryByRole("row", { name: /dev\/sda1 512/ }); - expect(sdaChild).not.toBeNull(); - }); - - describe("when `itemsSelected` is given", () => { - it("renders nothing as checked if value is an empty array", () => { - plainRender(); - const table = screen.getByRole("grid"); - const selection = within(table).queryAllByRole("radio", { checked: true }); - expect(selection.length).toEqual(0); - }); - - describe("but it isn't an array", () => { - it("outputs to console.error", () => { - plainRender(); - expect(console.error).toHaveBeenCalledWith( - expect.stringContaining("prop must be an array"), - "Whatever", - ); - }); - - it("renders nothing as selected", () => { - plainRender(); - const table = screen.getByRole("grid"); - const selection = within(table).queryAllByRole("radio", { checked: true }); - expect(selection.length).toEqual(0); - }); - }); - }); - - describe("when mounted as single selector", () => { - describe.each([undefined, null, false])("because isMultiple={%s}", (isMultiple) => { - beforeEach(() => { - props = { ...props, isMultiple }; - }); - - it("renders a radio per item row", () => { - plainRender(); - const table = screen.getByRole("grid"); - const radios = within(table).getAllByRole("radio"); - expect(radios.length).toEqual(6); - }); - - describe("but `itemSelectable` is given", () => { - it("renders a radio only for items for which it returns true", () => { - const itemSelectable = (item) => item.isDrive || item.type === "vg"; - plainRender(); - const table = screen.getByRole("grid"); - const radios = within(table).getAllByRole("radio"); - - // Expected only three radios - expect(radios.length).toEqual(3); - - // Not in below items - const sda1Row = within(table).getByRole("row", { name: /dev\/sda1/ }); - const sda2Row = within(table).getByRole("row", { name: /dev\/sda2/ }); - const lv1Row = within(table).getByRole("row", { name: /lv1/ }); - expect(within(sda1Row).queryAllByRole("radio")).toEqual([]); - expect(within(sda2Row).queryAllByRole("radio")).toEqual([]); - expect(within(lv1Row).queryAllByRole("radio")).toEqual([]); - }); - }); - - describe("and `itemsSelected` is given", () => { - describe("and it is an array with just one item", () => { - it("renders it as checked", async () => { - plainRender(); - const table = screen.getByRole("grid"); - const sda1Row = within(table).getByRole("row", { name: /dev\/sda1/ }); - const selection = screen.getAllByRole("radio", { checked: true }); - expect(selection.length).toEqual(1); - within(sda1Row).getByRole("radio", { checked: true }); - }); - }); - - describe("but it is an array with more than one item", () => { - it("outputs to console.error", () => { - plainRender(); - expect(console.error).toHaveBeenCalledWith( - expect.stringContaining("Using only the first element"), - ); - }); - - it("renders the first one as checked", async () => { - plainRender(); - const table = screen.getByRole("grid"); - const selection = screen.getAllByRole("radio", { checked: true }); - const sda1Row = within(table).getByRole("row", { name: /dev\/sda1/ }); - const lv1Row = within(table).getByRole("row", { name: /Personal Data/ }); - const lv1Radio = within(lv1Row).getByRole("radio"); - within(sda1Row).getByRole("radio", { checked: true }); - expect(lv1Radio).not.toHaveAttribute("checked", true); - expect(selection.length).toEqual(1); - }); - }); - }); - - describe("and user selects an already selected item", () => { - it("does not trigger the `onSelectionChange` callback", async () => { - const { user } = plainRender(); - const sda1row = screen.getByRole("row", { name: /dev\/sda1/ }); - const sda1radio = within(sda1row).getByRole("radio"); - await user.click(sda1radio); - expect(onChangeFn).not.toHaveBeenCalled(); - }); - }); - - describe("and user selects a not selected item", () => { - it("calls the `onSelectionChange` callback with a collection holding only selected item", async () => { - const { user } = plainRender(); - const sda2row = screen.getByRole("row", { name: /dev\/sda2/ }); - const sda2radio = within(sda2row).getByRole("radio"); - await user.click(sda2radio); - expect(onChangeFn).toHaveBeenCalledWith([sda2]); - }); - }); - }); - }); - - describe("when mounted as multiple selector", () => { - beforeEach(() => { - props = { ...props, isMultiple: true }; - }); - - it("renders a checkbox per item row", () => { - plainRender(); - const table = screen.getByRole("grid"); - const checkboxes = within(table).getAllByRole("checkbox"); - expect(checkboxes.length).toEqual(6); - }); - - describe("but `itemSelectable` is given", () => { - it("renders a checkbox only for items for which it returns true", () => { - const itemSelectable = (item) => item.isDrive || item.type === "vg"; - plainRender(); - const table = screen.getByRole("grid"); - const checkboxes = within(table).getAllByRole("checkbox"); - - // Expected only three checkboxes - expect(checkboxes.length).toEqual(3); - - // Not in below items - const sda1Row = within(table).getByRole("row", { name: /dev\/sda1/ }); - const sda2Row = within(table).getByRole("row", { name: /dev\/sda2/ }); - const lv1Row = within(table).getByRole("row", { name: /lv1/ }); - expect(within(sda1Row).queryAllByRole("checkbox")).toEqual([]); - expect(within(sda2Row).queryAllByRole("checkbox")).toEqual([]); - expect(within(lv1Row).queryAllByRole("checkbox")).toEqual([]); - }); - }); - - describe("and `itemsSelected` is given", () => { - it("renders given items as checked", async () => { - plainRender(); - const table = screen.getByRole("grid"); - const selection = screen.getAllByRole("checkbox", { checked: true }); - const sda1Row = within(table).getByRole("row", { name: /dev\/sda1/ }); - const lv1Row = within(table).getByRole("row", { name: /Personal Data/ }); - within(sda1Row).getByRole("checkbox", { checked: true }); - within(lv1Row).getByRole("checkbox", { checked: true }); - expect(selection.length).toEqual(2); - }); - }); - - it("renders initially selected items given via `itemsSelected` prop", async () => { - plainRender(); - const table = screen.getByRole("grid"); - const sda1Row = within(table).getByRole("row", { name: /dev\/sda1/ }); - const lv1Row = within(table).getByRole("row", { name: /Personal Data/ }); - const selection = screen.getAllByRole("checkbox", { checked: true }); - expect(selection.length).toEqual(2); - [sda1Row, lv1Row].forEach((row) => within(row).getByRole("checkbox", { checked: true })); - }); - - describe("and user selects an already selected item", () => { - it("triggers the `onSelectionChange` callback with a collection not including the item", async () => { - const { user } = plainRender( - , - ); - const sda1row = screen.getByRole("row", { name: /dev\/sda1/ }); - const sda1radio = within(sda1row).getByRole("checkbox"); - await user.click(sda1radio); - expect(onChangeFn).toHaveBeenCalledWith([sda2]); - }); - }); - - describe("and user selects a not selected item", () => { - it("calls the `onSelectionChange` callback with a collection including the item", async () => { - const { user } = plainRender(); - const sda2row = screen.getByRole("row", { name: /dev\/sda2/ }); - const sda2checkbox = within(sda2row).getByRole("checkbox"); - await user.click(sda2checkbox); - expect(onChangeFn).toHaveBeenCalledWith([sda1, sda2]); - }); - }); - }); -}); diff --git a/web/src/components/core/ExpandableSelector.tsx b/web/src/components/core/ExpandableSelector.tsx deleted file mode 100644 index b8c04f58fa..0000000000 --- a/web/src/components/core/ExpandableSelector.tsx +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React, { useState } from "react"; -import { - Table, - TableProps, - Thead, - Tr, - Th, - Tbody, - Td, - ExpandableRowContent, - RowSelectVariant, -} from "@patternfly/react-table"; - -/* eslint-disable @typescript-eslint/no-explicit-any */ - -/** - * An object for sharing data across nested maps - * - * Since function arguments are always passed by value, an object passed by - * sharing is needed for sharing data that might be mutated from different - * places, as it is the case of the rowIndex prop here. - * - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions#passing_arguments - */ - -type SharedData = { - rowIndex: number; -}; - -export type ExpandableSelectorColumn = { - /** The column header text */ - name: string; - /** A function receiving the item to work with and returns the column value */ - value: (item: object) => React.ReactNode; - /** Space-separated list of additional CSS class names */ - classNames?: string; -}; - -export type ExpandableSelectorProps = { - /** Collection of objects defining columns. */ - columns?: ExpandableSelectorColumn[]; - /** Whether multiple selection is allowed. */ - isMultiple?: boolean; - /** Collection of items to be rendered. */ - items?: object[]; - /** The key for retrieving the item id. */ - itemIdKey?: string; - /** Lookup method to retrieve children from given item. */ - itemChildren?: (item: object) => object[]; - /** Whether an item will be selectable or not. */ - itemSelectable?: (item: object) => boolean; - /** Callback to add additional CSS class names to item row. */ - itemClassNames?: (item: object) => string | undefined; - /** Collection of selected items. */ - itemsSelected?: object[]; - /** Ids of initially expanded items. */ - initialExpandedKeys?: any[]; - /** Callback to be triggered when selection changes. */ - onSelectionChange?: (selection: object[]) => void; -} & TableProps; - -/** - * Internal component for building the table header - */ -const TableHeader = ({ columns }: { columns: ExpandableSelectorColumn[] }) => ( - - - - - {columns?.map((c, i) => ( - - {c.name} - - ))} - - -); - -/** - * Helper function for ensuring a good value for ExpandableSelector#itemsSelected prop - * - * It logs information to console.error if given value does not match - * expectations. - * - * @param selection - The value to check. - * @param allowMultiple - Whether the returned collection can have - * more than one item - * @return Empty array if given value is not valid. The first element if - * it is a collection with more than one but selector does not allow multiple. - * The original value otherwise. - */ -const sanitizeSelection = (selection: any[], allowMultiple: boolean): any[] => { - if (!Array.isArray(selection)) { - console.error("`itemSelected` prop must be an array. Ignoring given value", selection); - return []; - } - - if (!allowMultiple && selection.length > 1) { - console.error( - "`itemsSelected` prop can only have more than one item when selector `isMultiple`. " + - "Using only the first element", - ); - - return [selection[0]]; - } - - return selection; -}; - -/** - * Build a expandable table with selectable items. - * @component - * - * @note It only accepts one nesting level. - * - * @param {ExpandableSelectorProps} props - */ -export default function ExpandableSelector({ - columns = [], - isMultiple = false, - items = [], - itemIdKey = "id", - itemChildren = () => [], - itemSelectable = () => true, - itemClassNames = () => "", - itemsSelected = [], - initialExpandedKeys = [], - onSelectionChange, - ...tableProps -}: ExpandableSelectorProps) { - const [expandedItemsKeys, setExpandedItemsKeys] = useState(initialExpandedKeys); - const selection = sanitizeSelection(itemsSelected, isMultiple); - const isItemSelected = (item: object) => { - const selected = selection.find((selectionItem) => { - return ( - Object.hasOwn(selectionItem, itemIdKey) && selectionItem[itemIdKey] === item[itemIdKey] - ); - }); - - return selected !== undefined || selection.includes(item); - }; - const isItemExpanded = (key: string | number) => expandedItemsKeys.includes(key); - const toggleExpanded = (key: string | number) => { - if (isItemExpanded(key)) { - setExpandedItemsKeys(expandedItemsKeys.filter((k) => k !== key)); - } else { - setExpandedItemsKeys([...expandedItemsKeys, key]); - } - }; - - const updateSelection = (item: object) => { - if (!isMultiple) { - onSelectionChange([item]); - return; - } - - if (isItemSelected(item)) { - onSelectionChange(selection.filter((i) => i !== item)); - } else { - onSelectionChange([...selection, item]); - } - }; - - /** - * Render method for building the markup for an item child - * - * @param item - The child to be rendered - * @param isExpanded - Whether the child should be shown or not - * @param sharedData - An object holding shared data - */ - const renderItemChild = (item: object, isExpanded: boolean, sharedData: SharedData) => { - const rowIndex = sharedData.rowIndex++; - - const selectProps = { - rowIndex, - onSelect: () => updateSelection(item), - isSelected: isItemSelected(item), - variant: isMultiple ? RowSelectVariant.checkbox : RowSelectVariant.radio, - }; - - return ( - - - - {columns?.map((column, index) => ( - - {column.value(item)} - - ))} - - ); - }; - - /** - * Render method for building the markup for item - * - * @param item - The item to be rendered - * @param sharedData - An object holding shared data - */ - const renderItem = (item: object, sharedData: SharedData) => { - const itemKey = item[itemIdKey]; - const rowIndex = sharedData.rowIndex++; - const children = itemChildren(item); - const validChildren = Array.isArray(children) && children.length > 0; - const expandProps = validChildren && { - rowIndex, - isExpanded: isItemExpanded(itemKey), - onToggle: () => toggleExpanded(itemKey), - }; - - const selectProps = { - rowIndex, - onSelect: () => updateSelection(item), - isSelected: isItemSelected(item), - variant: isMultiple ? RowSelectVariant.checkbox : RowSelectVariant.radio, - }; - - const renderChildren = () => { - if (!validChildren) return; - - return children.map((item) => renderItemChild(item, isItemExpanded(itemKey), sharedData)); - }; - - // TODO: Add label to Tbody? - return ( - - - - - {columns?.map((column, index) => ( - - {column.value(item)} - - ))} - - {renderChildren()} - - ); - }; - - // @see SharedData - const sharedData = { rowIndex: 0 }; - - const TableBody = () => items?.map((item) => renderItem(item, sharedData)); - - return ( - - - -
- ); -} diff --git a/web/src/components/core/index.ts b/web/src/components/core/index.ts index e77cbce6a3..d2e7babb03 100644 --- a/web/src/components/core/index.ts +++ b/web/src/components/core/index.ts @@ -40,7 +40,6 @@ export { default as ProgressReport } from "./ProgressReport"; export { default as ProgressText } from "./ProgressText"; export { default as PasswordInput } from "./PasswordInput"; export { default as ServerError } from "./ServerError"; -export { default as ExpandableSelector } from "./ExpandableSelector"; export { default as TreeTable } from "./TreeTable"; export { default as Link } from "./Link"; export { default as EmptyState } from "./EmptyState"; diff --git a/web/src/components/storage/DeviceSelection.tsx b/web/src/components/storage/DeviceSelection.tsx deleted file mode 100644 index 5fc87aae9e..0000000000 --- a/web/src/components/storage/DeviceSelection.tsx +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React, { useEffect, useState } from "react"; -import { useNavigate } from "react-router-dom"; -import { Flex, Form, FormGroup, Radio, Stack } from "@patternfly/react-core"; -import { Page } from "~/components/core"; -import { DeviceSelectorTable } from "~/components/storage"; -import DevicesTechMenu from "./DevicesTechMenu"; -import { ProposalTarget, StorageDevice } from "~/types/storage"; -import { useAvailableDevices, useProposalMutation, useProposalResult } from "~/queries/storage"; -import { deviceChildren } from "~/components/storage/utils"; -import { compact } from "~/utils"; -import a11y from "@patternfly/react-styles/css/utilities/Accessibility/accessibility"; -import { _ } from "~/i18n"; - -const SELECT_DISK_ID = "select-disk"; -const CREATE_LVM_ID = "create-lvm"; -const SELECT_DISK_PANEL_ID = "panel-for-disk-selection"; -const CREATE_LVM_PANEL_ID = "panel-for-lvm-creation"; - -type DeviceSelectionState = { - target?: ProposalTarget; - targetDevice?: StorageDevice; - targetPVDevices?: StorageDevice[]; -}; - -/** - * Allows the user to select a target device for installation. - * @component - */ -export default function DeviceSelection() { - const proposal = useProposalResult(); - const availableDevices = useAvailableDevices(); - const updateProposal = useProposalMutation(); - const navigate = useNavigate(); - const [state, setState] = useState({}); - - const isTargetDisk = state.target === ProposalTarget.DISK; - const isTargetNewLvmVg = state.target === ProposalTarget.NEW_LVM_VG; - - useEffect(() => { - if (state.target !== undefined) return; - - // FIXME: move to a state/reducer - setState({ - target: proposal.settings.target, - targetDevice: availableDevices.find((d) => d.name === proposal.settings.targetDevice), - targetPVDevices: availableDevices.filter((d) => - proposal.settings.targetPVDevices?.includes(d.name), - ), - }); - }, [proposal, availableDevices, state.target]); - - const selectTargetDisk = () => setState({ ...state, target: ProposalTarget.DISK }); - const selectTargetNewLvmVG = () => setState({ ...state, target: ProposalTarget.NEW_LVM_VG }); - - const selectTargetDevice = (devices: StorageDevice[]) => - setState({ ...state, targetDevice: devices[0] }); - const selectTargetPVDevices = (devices: StorageDevice[]) => { - setState({ ...state, targetPVDevices: devices }); - }; - - const onSubmit = async (e) => { - e.preventDefault(); - const newSettings = { - target: state.target, - targetDevice: isTargetDisk ? state.targetDevice?.name : "", - targetPVDevices: isTargetNewLvmVg ? state.targetPVDevices.map((d) => d.name) : [], - }; - - updateProposal.mutateAsync({ ...proposal.settings, ...newSettings }); - navigate(".."); - }; - - const isAcceptDisabled = () => { - if (isTargetDisk) return state.targetDevice === undefined; - if (isTargetNewLvmVg) return state.targetPVDevices?.length === 0; - - return true; - }; - - const isDeviceSelectable = (device: StorageDevice) => device.isDrive || device.type === "md"; - - // TRANSLATORS: description for using plain partitions for installing the - // system, the text in the square brackets [] is displayed in bold, use only - // one pair in the translation - const [msgStart1, msgBold1, msgEnd1] = _( - "The file systems will be allocated \ -by default as [new partitions in the selected device].", - ).split(/[[\]]/); - // TRANSLATORS: description for using logical volumes for installing the - // system, the text in the square brackets [] is displayed in bold, use only - // one pair in the translation - const [msgStart2, msgBold2, msgEnd2] = _( - "The file systems will be allocated \ -by default as [logical volumes of a new LVM Volume Group]. The corresponding \ -physical volumes will be created on demand as new partitions at the selected \ -devices.", - ).split(/[[\]]/); - - return ( - - -

{_("Select installation device")}

-
- - -
- - - - - - - - - -
- {msgStart1} - {msgBold1} - {msgEnd1} -
- - -
- - -
- {msgStart2} - {msgBold2} - {msgEnd2} -
- -
- -
-
- - - {_("Prepare more devices by configuring advanced")} - - -
-
-
-
- - - - - -
- ); -} diff --git a/web/src/components/storage/DeviceSelectorTable.tsx b/web/src/components/storage/DeviceSelectorTable.tsx deleted file mode 100644 index 1372dc2a8d..0000000000 --- a/web/src/components/storage/DeviceSelectorTable.tsx +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (c) [2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { - DeviceName, - DeviceDetails, - DeviceSize, - FilesystemLabel, - toStorageDevice, -} from "~/components/storage/device-utils"; -import { ExpandableSelector } from "~/components/core"; -import { Icon } from "~/components/layout"; -import { _ } from "~/i18n"; -import { sprintf } from "sprintf-js"; -import { deviceBaseName } from "~/components/storage/utils"; -import { PartitionSlot, StorageDevice } from "~/types/storage"; -import { ExpandableSelectorColumn, ExpandableSelectorProps } from "../core/ExpandableSelector"; -import { typeDescription, contentDescription } from "./utils/device"; -import { DeviceInfo as DeviceInfoType } from "~/api/storage/types"; - -/** - * @component - */ -const DeviceInfo = ({ item }: { item: PartitionSlot | StorageDevice }) => { - const device = toStorageDevice(item); - if (!device) return null; - - const DeviceType = () => { - const type = typeDescription(device); - - return type &&
{type}
; - }; - - const DeviceModel = () => { - if (!device.model || device.model === "") return null; - - return
{device.model}
; - }; - - const MDInfo = () => { - if (device.type !== "md" || !device.devices) return null; - - const members = device.devices.map(deviceBaseName); - - // TRANSLATORS: RAID details, %s is replaced by list of devices used by the array - return
{sprintf(_("Members: %s"), members.sort().join(", "))}
; - }; - - const RAIDInfo = () => { - if (device.type !== "raid") return null; - - const devices = device.devices.map(deviceBaseName); - - // TRANSLATORS: RAID details, %s is replaced by list of devices used by the array - return
{sprintf(_("Devices: %s"), devices.sort().join(", "))}
; - }; - - const MultipathInfo = () => { - if (device.type !== "multipath") return null; - - const wires = device.wires.map(deviceBaseName); - - // TRANSLATORS: multipath details, %s is replaced by list of connections used by the device - return
{sprintf(_("Wires: %s"), wires.sort().join(", "))}
; - }; - - return ( -
- - - - - - -
- ); -}; - -/** - * @component - */ -const DeviceExtendedDetails = ({ item }: { item: PartitionSlot | StorageDevice }) => { - const device = toStorageDevice(item); - - if (!device || ["partition", "lvmLv"].includes(device.type)) return ; - - const Description = () => { - return ( -
- {contentDescription(device)} -
- ); - }; - - const Systems = () => { - if (!device.systems || device.systems.length === 0) return null; - - const System = ({ system }) => { - const isWindows = /windows/i.test(system); - - if (isWindows) return
{system}
; - - return ( -
- {system} -
- ); - }; - - return device.systems.map((s, i) => ); - }; - - return ( -
- - -
- ); -}; - -const columns: ExpandableSelectorColumn[] = [ - { name: _("Device"), value: (item: PartitionSlot | StorageDevice) => }, - { - name: _("Details"), - value: (item: PartitionSlot | StorageDevice) => , - }, - { - name: _("Size"), - value: (item: PartitionSlot | StorageDevice) => , - classNames: "sizes-column", - }, -]; - -type DeviceSelectorTableProps = { - devices: StorageDevice[]; - selectedDevices: StorageDevice[]; -} & ExpandableSelectorProps; - -/** - * Table for selecting the installation device. - * @component - */ -export default function DeviceSelectorTable({ - devices, - selectedDevices, - ...props -}: DeviceSelectorTableProps) { - return ( - { - if (!device.sid) { - return "dimmed-row"; - } - }} - itemsSelected={selectedDevices} - className="devices-table" - {...props} - /> - ); -} diff --git a/web/src/components/storage/DevicesTechMenu.test.tsx b/web/src/components/storage/DevicesTechMenu.test.tsx deleted file mode 100644 index 5b8bf07358..0000000000 --- a/web/src/components/storage/DevicesTechMenu.test.tsx +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) [2023-2025] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { screen } from "@testing-library/react"; -import { installerRender } from "~/test-utils"; -import DevicesTechMenu from "./DevicesTechMenu"; -import { supportedDASD } from "~/api/storage/dasd"; -import { supportedZFCP } from "~/api/storage/zfcp"; - -jest.mock("~/api/storage/dasd"); -jest.mock("~/api/storage/zfcp"); - -beforeEach(() => { - (supportedDASD as jest.Mock).mockResolvedValue(false); - (supportedZFCP as jest.Mock).mockResolvedValue(false); -}); - -it("contains an entry for configuring iSCSI", async () => { - const { user } = installerRender(); - const toggler = screen.getByRole("button"); - await user.click(toggler); - const link = screen.getByRole("option", { name: /iSCSI/ }); - expect(link).toHaveAttribute("href", "/storage/iscsi"); -}); - -it("does not contain an entry for configuring DASD when is NOT supported", async () => { - const { user } = installerRender(); - const toggler = screen.getByRole("button"); - await user.click(toggler); - expect(screen.queryByRole("option", { name: /DASD/ })).toBeNull(); -}); - -it("contains an entry for configuring DASD when is supported", async () => { - (supportedDASD as jest.Mock).mockResolvedValue(true); - const { user } = installerRender(); - const toggler = screen.getByRole("button"); - await user.click(toggler); - const link = screen.getByRole("option", { name: /DASD/ }); - expect(link).toHaveAttribute("href", "/storage/dasd"); -}); - -it("does not contain an entry for configuring zFCP when is NOT supported", async () => { - const { user } = installerRender(); - const toggler = screen.getByRole("button"); - await user.click(toggler); - expect(screen.queryByRole("option", { name: /DASD/ })).toBeNull(); -}); - -it("contains an entry for configuring zFCP when is supported", async () => { - (supportedZFCP as jest.Mock).mockResolvedValue(true); - const { user } = installerRender(); - const toggler = screen.getByRole("button"); - await user.click(toggler); - const link = screen.getByRole("option", { name: /zFCP/ }); - expect(link).toHaveAttribute("href", "/storage/zfcp"); -}); diff --git a/web/src/components/storage/DevicesTechMenu.tsx b/web/src/components/storage/DevicesTechMenu.tsx deleted file mode 100644 index 20cf3adc56..0000000000 --- a/web/src/components/storage/DevicesTechMenu.tsx +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) [2023-2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React, { useEffect, useState } from "react"; -import { useHref } from "react-router-dom"; -import { - MenuToggle, - MenuToggleElement, - Select, - SelectList, - SelectOption, -} from "@patternfly/react-core"; -import { _ } from "~/i18n"; -import { supportedDASD } from "~/api/storage/dasd"; -import { supportedZFCP } from "~/api/storage/zfcp"; - -/** - * Internal component for building the link to Storage/DASD page - */ -const DASDLink = () => { - const href = useHref("/storage/dasd"); - - return ( - - DASD - - ); -}; - -/** - * Internal component for building the link to Storage/zFCP page - */ -const ZFCPLink = () => { - const href = useHref("/storage/zfcp"); - - return ( - - {_("zFCP")} - - ); -}; - -/** - * Internal component for building the link to Storage/iSCSI page - * @component - */ -const ISCSILink = () => { - const href = useHref("/storage/iscsi"); - - return ( - - {_("iSCSI")} - - ); -}; - -type ProposalMenuProps = { - label: string; -}; - -/** - * Component for rendering the options available from Storage/ProposalPage - */ -export default function DevicesTechMenu({ label }: ProposalMenuProps) { - const [isOpen, setIsOpen] = useState(false); - const [showDasdLink, setShowDasdLink] = useState(false); - const [showZFCPLink, setShowZFCPLink] = useState(false); - - useEffect(() => { - supportedDASD().then(setShowDasdLink); - supportedZFCP().then(setShowZFCPLink); - }, []); - const toggle = (toggleRef: React.Ref) => ( - setIsOpen(!isOpen)} isExpanded={isOpen}> - {label} - - ); - - const onSelect = () => { - setIsOpen(false); - }; - - return ( - - ); -} diff --git a/web/src/components/storage/VolumeLocationSelectorTable.tsx b/web/src/components/storage/VolumeLocationSelectorTable.tsx deleted file mode 100644 index 764a9c3e38..0000000000 --- a/web/src/components/storage/VolumeLocationSelectorTable.tsx +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) [2024-2025] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; -import { Content, Split } from "@patternfly/react-core"; -import { _ } from "~/i18n"; -import { - DeviceName, - DeviceDetails, - DeviceSize, - toStorageDevice, -} from "~/components/storage/device-utils"; -import { ExpandableSelector } from "~/components/core"; -import { - ExpandableSelectorColumn, - ExpandableSelectorProps, -} from "~/components/core/ExpandableSelector"; -import { PartitionSlot, StorageDevice, Volume } from "~/types/storage"; -import { DeviceInfo } from "~/api/storage/types"; - -/** - * Returns what (volumes, installation device) is using a device. - */ -const deviceUsers = ( - item: PartitionSlot | StorageDevice, - targetDevices: StorageDevice[], - volumes: Volume[], -): string[] => { - const device = toStorageDevice(item); - if (!device) return []; - - const isTargetDevice = !!targetDevices.find((d) => d.name === device.name); - const volumeUsers = volumes.filter((v) => v.targetDevice?.name === device.name); - - const users = []; - if (isTargetDevice) users.push(_("Installation device")); - - return users.concat(volumeUsers.map((v) => v.mountPath)); -}; - -/** - * @component - */ -const DeviceUsage = ({ users }: { users: string[] }) => { - return ( - - {users.map((user, index) => ( - {user} - ))} - - ); -}; - -type VolumeLocationSelectorTableBaseProps = { - devices: StorageDevice[]; - selectedDevices: StorageDevice[]; - targetDevices: StorageDevice[]; - volumes: Volume[]; -}; - -export type VolumeLocationSelectorTableProps = VolumeLocationSelectorTableBaseProps & - ExpandableSelectorProps; - -/** - * Table for selecting the location for a volume. - * @component - */ -export default function VolumeLocationSelectorTable({ - devices, - selectedDevices, - targetDevices, - volumes, - ...props -}: VolumeLocationSelectorTableProps) { - const columns: ExpandableSelectorColumn[] = [ - { - name: _("Device"), - value: (item: PartitionSlot | StorageDevice) => , - }, - { - name: _("Details"), - value: (item: PartitionSlot | StorageDevice) => , - }, - { - name: _("Usage"), - value: (item: PartitionSlot | StorageDevice) => ( - - ), - }, - { - name: _("Size"), - value: (item: PartitionSlot | StorageDevice) => , - classNames: "sizes-column", - }, - ]; - - return ( - { - if (!device.sid) { - return "dimmed-row"; - } - }} - itemsSelected={selectedDevices} - className="devices-table" - {...props} - /> - ); -} diff --git a/web/src/components/storage/index.ts b/web/src/components/storage/index.ts index 2e1a4044c4..8cb45ed580 100644 --- a/web/src/components/storage/index.ts +++ b/web/src/components/storage/index.ts @@ -26,7 +26,5 @@ export { default as ProposalActionsDialog } from "./ProposalActionsDialog"; export { default as ProposalResultSection } from "./ProposalResultSection"; export { default as ISCSIPage } from "./ISCSIPage"; export { default as BootSelection } from "./BootSelection"; -export { default as DeviceSelectorTable } from "./DeviceSelectorTable"; export { default as DevicesFormSelect } from "./DevicesFormSelect"; export { default as SpaceActionsTable } from "./SpaceActionsTable"; -export { default as DeviceSelection } from "./DeviceSelection"; diff --git a/web/src/routes/storage.tsx b/web/src/routes/storage.tsx index 7a94b22553..3cd1f9bd71 100644 --- a/web/src/routes/storage.tsx +++ b/web/src/routes/storage.tsx @@ -23,7 +23,7 @@ import React from "react"; import BootSelection from "~/components/storage/BootSelection"; import SpacePolicySelection from "~/components/storage/SpacePolicySelection"; -import { DeviceSelection, ISCSIPage, ProposalPage } from "~/components/storage"; +import { ISCSIPage, ProposalPage } from "~/components/storage"; import { Route } from "~/types/routes"; import { supportedDASD, probeDASD } from "~/api/storage/dasd"; @@ -42,10 +42,6 @@ const routes = (): Route => ({ index: true, element: , }, - { - path: PATHS.targetDevice, - element: , - }, { path: PATHS.bootDevice, element: , From 7b1952c9aa1aca37bf229a54b8e14e92365edada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 09:18:35 +0000 Subject: [PATCH 058/109] fix(web): remove unused api --- web/src/api/storage/proposal.ts | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 web/src/api/storage/proposal.ts diff --git a/web/src/api/storage/proposal.ts b/web/src/api/storage/proposal.ts deleted file mode 100644 index 333f3ae633..0000000000 --- a/web/src/api/storage/proposal.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) [2024-2025] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import { put } from "../http"; -import { ProposalSettingsPatch } from "~/api/storage/types"; - -const calculate = (settings: ProposalSettingsPatch) => - put("/api/storage/proposal/settings", settings); - -export { calculate }; From ba7edd5d9444d4f2816ae474b5f415241af65633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 09:19:18 +0000 Subject: [PATCH 059/109] fix(web): remove unused query --- web/src/queries/storage.ts | 60 ++------------------------------------ 1 file changed, 2 insertions(+), 58 deletions(-) diff --git a/web/src/queries/storage.ts b/web/src/queries/storage.ts index cd2b7c4f71..34858d859b 100644 --- a/web/src/queries/storage.ts +++ b/web/src/queries/storage.ts @@ -37,22 +37,10 @@ import { fetchUsableDevices, reprobe, } from "~/api/storage"; -import { calculate } from "~/api/storage/proposal"; import { fetchDevices, fetchDevicesDirty } from "~/api/storage/devices"; import { useInstallerClient } from "~/context/installer"; -import { - config, - ProductParams, - Volume as APIVolume, - ProposalSettingsPatch, -} from "~/api/storage/types"; -import { - ProposalSettings, - ProposalResult, - StorageDevice, - Volume, - VolumeTarget, -} from "~/types/storage"; +import { config, ProductParams, Volume as APIVolume } from "~/api/storage/types"; +import { ProposalResult, StorageDevice, Volume, VolumeTarget } from "~/types/storage"; import { QueryHookOptions } from "~/types/queries"; @@ -242,49 +230,6 @@ const useProposalResult = (): ProposalResult | undefined => { return { actions }; }; -const useProposalMutation = () => { - const queryClient = useQueryClient(); - const query = { - mutationFn: (settings: ProposalSettings) => { - const buildHttpVolume = (volume: Volume): APIVolume => { - return { - autoSize: volume.autoSize, - fsType: volume.fsType, - maxSize: volume.maxSize, - minSize: volume.minSize, - mountOptions: [], - mountPath: volume.mountPath, - snapshots: volume.snapshots, - target: volume.target, - targetDevice: volume.targetDevice?.name, - }; - }; - - const buildHttpSettings = (settings: ProposalSettings): ProposalSettingsPatch => { - return { - bootDevice: settings.bootDevice, - configureBoot: settings.configureBoot, - encryptionMethod: settings.encryptionMethod, - encryptionPBKDFunction: settings.encryptionPBKDFunction, - encryptionPassword: settings.encryptionPassword, - spaceActions: settings.spacePolicy === "custom" ? settings.spaceActions : undefined, - spacePolicy: settings.spacePolicy, - target: settings.target, - targetDevice: settings.targetDevice, - targetPVDevices: settings.targetPVDevices, - volumes: settings.volumes?.map(buildHttpVolume), - }; - }; - - const httpSettings = buildHttpSettings(settings); - return calculate(httpSettings); - }, - onSuccess: () => queryClient.invalidateQueries({ queryKey: ["storage"] }), - }; - - return useMutation(query); -}; - const deprecatedQuery = { queryKey: ["storage", "dirty"], queryFn: fetchDevicesDirty, @@ -340,7 +285,6 @@ export { useVolumeTemplates, useVolumeDevices, useProposalResult, - useProposalMutation, useDeprecated, useDeprecatedChanges, useReprobeMutation, From ca18b0effc73d3fad3180cc9bc5fe32c18b12328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 09:19:48 +0000 Subject: [PATCH 060/109] fix(web): remove unused types --- web/src/types/storage.ts | 44 ++-------------------------------------- 1 file changed, 2 insertions(+), 42 deletions(-) diff --git a/web/src/types/storage.ts b/web/src/types/storage.ts index 01321780fc..ebba8e7724 100644 --- a/web/src/types/storage.ts +++ b/web/src/types/storage.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * @@ -84,11 +84,6 @@ type ShrinkingInfo = { unsupported?: string[]; }; -type ProposalResult = { - settings?: ProposalSettings; - actions: Action[]; -}; - type Action = { device: number; text: string; @@ -102,27 +97,6 @@ type SpacePolicyAction = { value: "delete" | "resizeIfNeeded"; }; -type ProposalSettings = { - target: ProposalTarget; - targetDevice?: string; - targetPVDevices: string[]; - configureBoot: boolean; - bootDevice: string; - defaultBootDevice: string; - encryptionPassword: string; - encryptionMethod: string; - encryptionPBKDFunction?: string; - spacePolicy: string; - spaceActions: SpaceAction[]; - volumes: Volume[]; - installationDevices: StorageDevice[]; -}; - -type SpaceAction = { - device: string; - action: "force_delete" | "resize" | "keep"; -}; - type Volume = { mountPath: string; target: VolumeTarget; @@ -147,17 +121,6 @@ type VolumeOutline = { sizeRelevantVolumes: string[]; }; -/** - * Enum for the possible proposal targets. - * - * @readonly - */ -enum ProposalTarget { - DISK = "disk", - NEW_LVM_VG = "newLvmVg", - REUSED_LVM_VG = "reusedLvmVg", -} - /** * Enum for the possible volume targets. * @@ -207,14 +170,11 @@ export type { ISCSINode, PartitionSlot, PartitionTable, - ProposalResult, - ProposalSettings, ShrinkingInfo, - SpaceAction, SpacePolicyAction, StorageDevice, Volume, VolumeOutline, }; -export { EncryptionMethods, ProposalTarget, VolumeTarget }; +export { EncryptionMethods, VolumeTarget }; From 8fd0ae183a571097b8655aa84bff2c3511b39eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 09:41:50 +0000 Subject: [PATCH 061/109] fix(web): add query for getting actions --- .../components/storage/ProposalPage.test.tsx | 22 +++---------------- web/src/components/storage/ProposalPage.tsx | 4 ++-- web/src/queries/storage.ts | 13 +++++------ 3 files changed, 11 insertions(+), 28 deletions(-) diff --git a/web/src/components/storage/ProposalPage.test.tsx b/web/src/components/storage/ProposalPage.test.tsx index bd1cc78388..acd8945ddd 100644 --- a/web/src/components/storage/ProposalPage.test.tsx +++ b/web/src/components/storage/ProposalPage.test.tsx @@ -30,8 +30,7 @@ import { screen } from "@testing-library/react"; import { installerRender } from "~/test-utils"; import { ProposalPage } from "~/components/storage"; import { - ProposalResult, - ProposalTarget, + Action, StorageDevice, Volume, VolumeTarget, @@ -105,22 +104,7 @@ const volume = (mountPath: string): Volume => { }; }; -const mockProposalResult: ProposalResult = { - settings: { - target: ProposalTarget.DISK, - targetPVDevices: [], - configureBoot: false, - bootDevice: "", - defaultBootDevice: "", - encryptionPassword: "", - encryptionMethod: "", - spacePolicy: "", - spaceActions: [], - volumes: [], - installationDevices: [], - }, - actions: [], -}; +const mockActions: Action[] = []; jest.mock("~/queries/storage", () => ({ ...jest.requireActual("~/queries/storage"), @@ -132,7 +116,7 @@ jest.mock("~/queries/storage", () => ({ encryptionMethods: [], mountPoints: ["/", "swap"], }), - useProposalResult: () => mockProposalResult, + useActions: () => mockActions, useDeprecated: () => false, useDeprecatedChanges: jest.fn(), useProposalMutation: jest.fn(), diff --git a/web/src/components/storage/ProposalPage.tsx b/web/src/components/storage/ProposalPage.tsx index 9f8347be87..8ceb3dfd33 100644 --- a/web/src/components/storage/ProposalPage.tsx +++ b/web/src/components/storage/ProposalPage.tsx @@ -36,7 +36,7 @@ import { useDevices, useDeprecated, useDeprecatedChanges, - useProposalResult, + useActions, useReprobeMutation, } from "~/queries/storage"; import { _ } from "~/i18n"; @@ -69,7 +69,7 @@ export default function ProposalPage() { const stagingDevices = useDevices("result"); const isDeprecated = useDeprecated(); const { mutateAsync: reprobe } = useReprobeMutation(); - const { actions } = useProposalResult(); + const actions = useActions(); useDeprecatedChanges(); diff --git a/web/src/queries/storage.ts b/web/src/queries/storage.ts index 34858d859b..47d916c022 100644 --- a/web/src/queries/storage.ts +++ b/web/src/queries/storage.ts @@ -40,7 +40,7 @@ import { import { fetchDevices, fetchDevicesDirty } from "~/api/storage/devices"; import { useInstallerClient } from "~/context/installer"; import { config, ProductParams, Volume as APIVolume } from "~/api/storage/types"; -import { ProposalResult, StorageDevice, Volume, VolumeTarget } from "~/types/storage"; +import { Action, StorageDevice, Volume, VolumeTarget } from "~/types/storage"; import { QueryHookOptions } from "~/types/queries"; @@ -222,12 +222,11 @@ const proposalActionsQuery = { }; /** - * Hook that returns the current proposal (settings and actions). + * Hook that returns the actions to perform in the storage devices. */ -const useProposalResult = (): ProposalResult | undefined => { - const { data: actions } = useSuspenseQuery(proposalActionsQuery); - - return { actions }; +const useActions = (): Action[] | undefined => { + const { data } = useSuspenseQuery(proposalActionsQuery); + return data; }; const deprecatedQuery = { @@ -284,7 +283,7 @@ export { useProductParams, useVolumeTemplates, useVolumeDevices, - useProposalResult, + useActions, useDeprecated, useDeprecatedChanges, useReprobeMutation, From 74d9007f68e9491b4a07df8b794dd63206bb3965 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 09:59:55 +0000 Subject: [PATCH 062/109] fix(web): eslint --- web/src/api/storage/types/config-model.ts | 1 - web/src/api/storage/types/config.ts | 1 - web/src/components/storage/ProposalPage.test.tsx | 7 +------ 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/web/src/api/storage/types/config-model.ts b/web/src/api/storage/types/config-model.ts index 079d6bb8f4..2095531c99 100644 --- a/web/src/api/storage/types/config-model.ts +++ b/web/src/api/storage/types/config-model.ts @@ -1,4 +1,3 @@ -/* eslint-disable */ /** * This file was automatically generated by json-schema-to-typescript. * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, diff --git a/web/src/api/storage/types/config.ts b/web/src/api/storage/types/config.ts index 7a7864a01d..dbaaa13af1 100644 --- a/web/src/api/storage/types/config.ts +++ b/web/src/api/storage/types/config.ts @@ -1,4 +1,3 @@ -/* eslint-disable */ /** * This file was automatically generated by json-schema-to-typescript. * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, diff --git a/web/src/components/storage/ProposalPage.test.tsx b/web/src/components/storage/ProposalPage.test.tsx index acd8945ddd..c4e24e7f47 100644 --- a/web/src/components/storage/ProposalPage.test.tsx +++ b/web/src/components/storage/ProposalPage.test.tsx @@ -29,12 +29,7 @@ import React from "react"; import { screen } from "@testing-library/react"; import { installerRender } from "~/test-utils"; import { ProposalPage } from "~/components/storage"; -import { - Action, - StorageDevice, - Volume, - VolumeTarget, -} from "~/types/storage"; +import { Action, StorageDevice, Volume, VolumeTarget } from "~/types/storage"; jest.mock("~/queries/issues", () => ({ ...jest.requireActual("~/queries/issues"), From 9249a0e3d3363091950a415919084bf494197bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Fri, 17 Jan 2025 12:15:07 +0000 Subject: [PATCH 063/109] feat(rust): add an HTTP API to get licenses information --- rust/agama-server/src/software.rs | 1 + rust/agama-server/src/software/license.rs | 229 ++++++++++++++ rust/agama-server/src/software/web.rs | 58 +++- rust/share/eula/license.final/license.es.txt | 295 ++++++++++++++++++ rust/share/eula/license.final/license.txt | 263 ++++++++++++++++ .../eula/license.final/license.zh_CN.txt | 187 +++++++++++ 6 files changed, 1030 insertions(+), 3 deletions(-) create mode 100644 rust/agama-server/src/software/license.rs create mode 100644 rust/share/eula/license.final/license.es.txt create mode 100644 rust/share/eula/license.final/license.txt create mode 100644 rust/share/eula/license.final/license.zh_CN.txt diff --git a/rust/agama-server/src/software.rs b/rust/agama-server/src/software.rs index b363de6ad1..6bdfb1e0d1 100644 --- a/rust/agama-server/src/software.rs +++ b/rust/agama-server/src/software.rs @@ -20,3 +20,4 @@ pub mod web; pub use web::{software_service, software_streams}; +mod license; diff --git a/rust/agama-server/src/software/license.rs b/rust/agama-server/src/software/license.rs new file mode 100644 index 0000000000..f132231d7c --- /dev/null +++ b/rust/agama-server/src/software/license.rs @@ -0,0 +1,229 @@ +// Copyright (c) [2024] SUSE LLC +// +// All Rights Reserved. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, contact SUSE LLC. +// +// To contact SUSE LLC about this file by physical or electronic mail, you may +// find current contact information at www.suse.com. + +//! Implements support for reading software licenses. + +use regex::Regex; +use serde::Serialize; +use std::{ + fmt::Display, + fs::read_dir, + path::{Path, PathBuf}, +}; +use thiserror::Error; + +/// Represents a product license. +/// +/// It contains the license ID and the list of languages that with a translation. +#[derive(Clone, Debug, Serialize)] +pub struct License { + pub id: String, + pub languages: Vec, +} + +/// Represents a license content. +/// +/// It contains the license ID and the body. +/// +/// TODO: in the future it might contain a title, extracted from the text. +#[derive(Clone, Debug, Serialize)] +pub struct LicenseContent { + pub id: String, + pub body: String, +} + +/// Simplified representation of the RFC 5646 language code. +#[derive(Clone, Debug, Serialize, PartialEq)] +pub struct LanguageTag { + // ISO-639 + pub language: String, + // ISO-3166 + pub territory: Option, +} + +impl Default for LanguageTag { + fn default() -> Self { + LanguageTag { + language: "en".to_string(), + territory: None, + } + } +} + +impl Display for LanguageTag { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if let Some(territory) = &self.territory { + write!(f, "{}-{}", &self.language, territory) + } else { + write!(f, "{}", &self.language) + } + } +} + +#[derive(Error, Debug)] +#[error("Not a valid language code: {0}")] +pub struct InvalidLanguageCode(String); + +impl TryFrom<&str> for LanguageTag { + type Error = InvalidLanguageCode; + + fn try_from(value: &str) -> Result { + let language_regexp: Regex = Regex::new(r"^([[:alpha:]]+)(?:-([A-Z]+))?").unwrap(); + + let captures = language_regexp + .captures(value) + .ok_or_else(|| InvalidLanguageCode(value.to_string()))?; + + Ok(Self { + language: captures.get(1).unwrap().as_str().to_string(), + territory: captures.get(2).map(|e| e.as_str().to_string()), + }) + } +} + +#[derive(Clone)] +pub struct LicensesRepo { + pub path: std::path::PathBuf, + pub licenses: Vec, +} + +impl LicensesRepo { + pub fn new>(path: P) -> Self { + Self { + path: path.as_ref().to_owned(), + licenses: vec![], + } + } + pub fn read(&mut self) -> Result<(), std::io::Error> { + let entries = read_dir(self.path.as_path())?; + + for entry in entries { + let entry = entry?; + if entry.file_type()?.is_dir() { + let license = License { + id: entry.file_name().into_string().unwrap(), + languages: Self::find_locales(&entry.path()), + }; + self.licenses.push(license); + } + } + Ok(()) + } + + /// Finds a license with the given ID and language. + /// + /// If the license is not found for the given language, it returns the default one. + pub fn find(&self, id: &str, language: &LanguageTag) -> Option { + let mut names: Vec = vec![]; + if let Some(territory) = &language.territory { + names.push(format!("license.{}_{}.txt", language.language, territory)); + } + names.push(format!("license.{}.txt", language.language)); + names.push("license.txt".to_string()); + + let license_path = names + .into_iter() + .map(|p| self.path.join(id).join(p)) + .find(|p| p.exists())?; + + let body: String = std::fs::read_to_string(license_path).unwrap(); + + Some(LicenseContent { + id: id.to_string(), + body, + }) + } + + fn find_locales(path: &PathBuf) -> Vec { + let entries = read_dir(path).unwrap().filter_map(|entry| entry.ok()); + + let files = entries + .filter(|entry| entry.file_type().is_ok_and(|f| f.is_file())) + .filter_map(|entry| { + let path = entry.path(); + let file = path.file_name()?; + file.to_owned().into_string().ok() + }); + + files.filter_map(|f| Self::file_to_locale(&f)).collect() + } + + fn file_to_locale(name: &str) -> Option { + if !name.starts_with("license") { + return None; + } + let mut parts = name.split("."); + let mut code = parts.nth(1)?; + + if code == "txt" { + code = "en" + } + + code.try_into().ok() + } +} + +impl Default for LicensesRepo { + fn default() -> Self { + let relative_path = Path::new("share/eula"); + let path = if relative_path.exists() { + relative_path + } else { + Path::new("/usr/share/agama/eula") + }; + Self::new(path) + } +} + +#[cfg(test)] +mod test { + use super::LicensesRepo; + use crate::software::license::LanguageTag; + use std::path::Path; + + fn build_repo() -> LicensesRepo { + let mut repo = LicensesRepo::new(Path::new("../share/eula")); + repo.read().unwrap(); + repo + } + + #[test] + fn test_read_licenses_repository() { + let repo = build_repo(); + let license = repo.licenses.first().unwrap(); + assert_eq!(&license.id, "license.final"); + } + + #[test] + fn test_find_license() { + let repo = build_repo(); + let language: LanguageTag = "es".try_into().unwrap(); + let license = repo.find("license.final", &language).unwrap(); + assert!(license.body.starts_with("Acuerdo de licencia")); + + let language: LanguageTag = "es-ES".try_into().unwrap(); + let license = repo.find("license.final", &language).unwrap(); + assert!(license.body.starts_with("Acuerdo de licencia")); + + let language: LanguageTag = "xx".try_into().unwrap(); + let license = repo.find("license.final", &language).unwrap(); + assert!(license.body.starts_with("End User License")); + } +} diff --git a/rust/agama-server/src/software/web.rs b/rust/agama-server/src/software/web.rs index 40d49be018..8c7616ee28 100644 --- a/rust/agama-server/src/software/web.rs +++ b/rust/agama-server/src/software/web.rs @@ -27,6 +27,7 @@ use crate::{ error::Error, + software::license::LicensesRepo, web::{ common::{issues_router, progress_router, service_status_router, EventStreams}, Event, @@ -46,20 +47,23 @@ use agama_lib::{ }, }; use axum::{ - extract::{Path, State}, + extract::{Path, Query, State}, http::StatusCode, response::IntoResponse, routing::{get, post, put}, Json, Router, }; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use std::collections::HashMap; use tokio_stream::{Stream, StreamExt}; +use super::license::{License, LicenseContent}; + #[derive(Clone)] struct SoftwareState<'a> { product: ProductClient<'a>, software: SoftwareClient<'a>, + licenses: LicensesRepo, } /// Returns an stream that emits software related events coming from D-Bus. @@ -190,12 +194,23 @@ pub async fn software_service(dbus: zbus::Connection) -> Result>) -> Result>, Error> { + Ok(Json(state.licenses.licenses.clone())) +} + +#[derive(Deserialize, utoipa::IntoParams)] +struct LicenseQuery { + lang: Option, +} + +#[utoipa::path( + get, + path = "/licenses/:id", + context_path = "/api/software", + responses( + (status = 200, description = "License with the given ID"), + (status = 404, description = "There is not license with the given ID") + ) +)] +async fn license( + State(state): State>, + Path(id): Path, + Query(query): Query, +) -> Result>, Error> { + let lang = query.lang.unwrap_or("en".to_string()); + let lang = lang.as_str().try_into().unwrap(); + let license = state.licenses.find(&id, &lang); + Ok(Json(license)) +} diff --git a/rust/share/eula/license.final/license.es.txt b/rust/share/eula/license.final/license.es.txt new file mode 100644 index 0000000000..a00e57fe5c --- /dev/null +++ b/rust/share/eula/license.final/license.es.txt @@ -0,0 +1,295 @@ +Acuerdo de licencia de usuario final +del software de SUSE + + +Acuerdo de licencia de usuario final del software de SUSE +LEA ESTE ACUERDO ATENTAMENTE. AL DESCARGAR, INSTALAR O ADQUIRIR DE +CUALQUIER OTRO MODO EL SOFTWARE (COMO SE DEFINE MÁS ABAJO E +INCLUIDOS SUS COMPONENTES), ESTARÁ ACEPTANDO LOS TÉRMINOS DE ESTE +ACUERDO. SI NO ESTÁ CONFORME CON ESTOS TÉRMINOS, NO TENDRÁ +AUTORIZACIÓN PARA DESCARGAR, INSTALAR NI UTILIZAR EL SOFTWARE. SI +UNA PERSONA ACTÚA EN NOMBRE DE UNA ENTIDAD, SE DETERMINA QUE ESA +PERSONA TIENE LA AUTORIDAD PARA ACEPTAR ESTE ACUERDO EN NOMBRE DE +DICHA ENTIDAD. + +SUSE LLC (el "Licenciador" o "SUSE") pone a disposición del usuario +los productos de software, que son una recopilación: (i) programas +de software desarrollados por SUSE y sus afiliados; (ii) programas +de software desarrollados por terceros; (iii) marcas comerciales +propiedad de SUSE y/o sus filiales ("Marcas de SUSE"); y (iv) los +medios o reproducciones (físicos o virtuales) y la documentación +adjunta que acompañe a dichos programas de software (la recopilación +de programas, marcas comerciales y documentación se denomina +conjuntamente como el "Software"). + +El Software está protegido por las leyes y los tratados de derechos +de autor de Estados Unidos y por las leyes de derechos de autor de +otros países. Este Acuerdo de licencia de usuario final ("EULA") es +un acuerdo legal entre el Usuario (una entidad o una persona) y SUSE +que rige el uso del Software. Si las leyes de la ubicación principal +del negocio del Usuario requieren que los contratos estén en el +idioma local para ser ejecutables, dicha versión en el idioma local +se puede obtener del Licenciador previa solicitud por escrito y se +considerará que rige el uso que haga el Usuario del Software. +Cualquier complemento, extensión, actualización, aplicación móvil, +módulo, adaptador o versión de asistencia del Software que pueda +descargar o recibir el Usuario y no esté acompañado por un acuerdo +de licencia que reemplace expresamente al presente, se considerará +como Software y se regirá por este EULA. + +Términos de la licencia +Código abierto +El Software contiene muchos componentes individuales que son +software de código abierto, y la licencia de código abierto de cada +componente, que según el programa de software puede ser la Licencia +pública general de GNU versión 2 +(https://www.gnu.org/licenses/oldlicenses/gpl-2.0.en.html) o Apache +2.0 (https://www.apache.org/licenses/LICENSE-2.0) u otra licencia de +código abierto (cada una de estas licencias se denomina "Licencia de +código abierto"). Estas Licencias de código abierto se encuentran en +la documentación y/o en el código fuente del componente. + +Este EULA rige el uso del Software, incluidas las Marcas de SUSE, y +no limita, sustituye ni modifica los derechos del Usuario expresados +en la Licencia de código abierto aplicable al uso de cualquier +código de código abierto incluido en el Software sin las Marcas de +SUSE. + +El Software puede incluir o estar incluido en un paquete con otros +programas de software cuya licencia contenga términos distintos o +haya sido otorgada por otros fabricantes distintos al Licenciador. +El uso de cualquier programa de software acompañado de un acuerdo de +licencia independiente se regirá por dicho acuerdo de licencia. + +Licencia para utilizar el Software +Siempre que se cumplan los términos y condiciones de este EULA, el +Licenciador otorga al Usuario una licencia mundial perpetua, no +exclusiva, no transferible y revocable para reproducir y usar copias +del Software dentro de su Organización para uso interno en la +Organización del Usuario. "Organización" significa una entidad legal +y sus Afiliadas. "Afiliadas" hace referencia a las entidades que +controla el Usuario, las que tienen control sobre el Usuario y las +que están bajo control común del Usuario. La licencia anterior está +condicionada a que el Usuario sea responsable de cualquier +incumplimiento de las disposiciones de este EULA por parte de sus +Afiliadas. + +Este EULA no le permite distribuir el Software o sus componentes que +usen las marcas de SUSE aunque la copia haya sido modificada. El +Usuario puede realizar una redistribución fuera de su Organización: +(a) del Software, solo si se permite en virtud de un acuerdo por +escrito independiente con el Licenciador que autorice dicha +redistribución, o (b) de los componentes que constituyen el +Software, solo si el Usuario elimina y reemplaza todas las +apariciones de cualquier Marca de SUSE. + +Si el Usuario ha recibido de SUSE, ya sea directa o indirectamente, +hardware, software u otro dispositivo que utilice o integre el +Software, puede utilizar el Software únicamente con el fin de +ejecutar dicho hardware, software o dispositivo, y no de forma +independiente. + +Propiedad +No se le transfiere ningún título o propiedad del Software. El +Licenciador y sus licenciadores terceros mantienen íntegramente el +derecho, la titularidad y el interés sobre todos los derechos de +propiedad intelectual especificados en el Software, incluidas sus +copias o adaptaciones. El Software no se le vende al Usuario, el +Usuario adquiere únicamente una licencia condicional de uso del +Software. La titularidad, los derechos de propiedad y los derechos +de propiedad intelectual del contenido al que se accede a través del +Software son propiedad de los propietarios del contenido aplicable y +deben estar protegidos por derechos de autor u otras leyes +aplicables. Este EULA no da derecho alguno al Usuario sobre dicho +contenido. + +Marcas de SUSE +En virtud de este EULA no se otorga ningún derecho o licencia, ni +expreso ni implícito, para utilizar cualquier Marca de SUSE, nombre +comercial o marca de servicio del Licenciador o sus afiliados ni +licenciadores de otro modo que no sea necesario para utilizar el +Software según lo permitido por este EULA + +Servicios de suscripciones y Asistencia técnica +El Licenciador no tiene la obligación de proporcionar mantenimiento +o asistencia a menos que el Usuario adquiera una oferta de +suscripción, de conformidad con un contrato adicional con el +Licenciador o sus afiliados, que incluya expresamente dichos +servicios. + +Garantía y responsabilidad +Garantía limitada +El Licenciador garantiza que el medio en el que se entrega el +software está libre de defectos en materiales y manufacturado bajo +un uso normal para un periodo de sesenta (60) días desde la fecha de +entrega. LA ANTERIOR GARANTÍA ES LA ÚNICA Y EXCLUSIVA COMPENSACIÓN +DEL USUARIO Y SUSTITUYE A CUALQUIER OTRA GARANTÍA, YA SEA EXPLÍCITA +O IMPLÍCITA. SALVO POR LA PRESENTE GARANTÍA, EL SOFTWARE SE ENTREGA +"TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO. +EL SOFTWARE NO ESTÁ DISEÑADO, FABRICADO NI PREVISTO PARA SU USO O +DISTRIBUCIÓN, Y NO SE DEBEN USAR, CON EQUIPOS DE CONTROL EN LÍNEA EN +ENTORNOS PELIGROSOS QUE REQUIERAN UN RENDIMIENTO A PRUEBA DE FALLOS, +COMO EL FUNCIONAMIENTO DE INSTALACIONES NUCLEARES, SISTEMAS DE +NAVEGACIÓN, COMUNICACIONES O CONTROL DE AVIONES, EQUIPOS DE SOPORTE +VITAL DIRECTO, SISTEMAS DE ARMAMENTO O CUALQUIER OTRO USO EN EL QUE +LOS FALLOS EN EL SOFTWARE PUEDAN PROVOCAR DIRECTAMENTE MUERTES, +DAÑOS PERSONALES O FÍSICOS O AL MEDIOAMBIENTE DE GRAVEDAD. +Productos que no sean del Licenciador +El Software puede incluir hardware u otros programas de software o +servicios, o bien formar parte de estos, que hayan sido vendidos o +cuya licencia haya sido otorgada por otra entidad distinta del +Licenciador. EL LICENCIADOR NO GARANTIZA LOS PRODUCTOS O SERVICIOS +NO PERTENECIENTES AL MISMO. ESTOS PRODUCTOS O SERVICIOS SE +DISTRIBUYEN "TAL CUAL". CUALQUIER SERVICIO DE GARANTÍA PARA LOS +PRODUCTOS NO PERTENECIENTES AL LICENCIADOR SERÁ PRESTADO POR EL +LICENCIADOR DEL PRODUCTO, DE CONFORMIDAD CON LO DISPUESTO EN LA +GARANTÍA DEL LICENCIADOR CORRESPONDIENTE. +CON LA EXCEPCIÓN DE LAS RESTRICCIONES LEGALES, EL LICENCIADOR +RECHAZA Y EXCLUYE TODAS LAS GARANTÍAS IMPLÍCITAS, INCLUIDAS LAS +GARANTÍAS DE COMERCIALIZACIÓN, IDONEIDAD PARA UN PROPÓSITO +PARTICULAR, TÍTULO O NO INFRACCIÓN; ASIMISMO TAMPOCO EXISTEN +GARANTÍAS CREADAS EN EL TRASCURSO DE LA NEGOCIACIÓN, EL RENDIMIENTO +O EL USO COMERCIAL. EL LICENCIADOR NO OFRECE NINGUNA GARANTÍA, +REPRESENTACIÓN NI PROMESA NO INCLUIDA DE FORMA EXPLÍCITA EN ESTA +GARANTÍA LIMITADA. EL LICENCIADOR NO GARANTIZA QUE EL SOFTWARE O LOS +SERVICIOS SATISFAGAN LAS NECESIDADES DEL USUARIO, SEAN COMPATIBLES +CON TODOS LOS SISTEMAS OPERATIVOS, O QUE EL FUNCIONAMIENTO DEL +SOFTWARE O LOS SERVICIOS SEA ININTERRUMPIDO O ESTÉ LIBRE DE ERRORES. +LAS EXCLUSIONES Y RENUNCIAS ANTERIORES SON UNA PARTE ESENCIAL DE +ESTE ACUERDO. Algunas jurisdicciones no permiten ciertas exclusiones +y limitaciones de garantías, por lo que algunas de las limitaciones +anteriores pueden no ser aplicables en el caso del Usuario. Esta +garantía limitada le otorga al Usuario derechos específicos. Además, +es posible que le asistan otros derechos, que pueden variar en +función del estado o la jurisdicción. +Limitación de responsabilidad +NI EL LICENCIADOR, NI SUS LICENCIADORES TERCEROS, SUBSIDIARIOS O +EMPLEADOS SERÁN RESPONSABLES EN FORMA ALGUNA DE NINGÚN DAÑO +CONSECUENTE O INDIRECTO, YA SE BASE EN UN CONTRATO, NEGLIGENCIA, +AGRAVIO U OTRA TEORÍA DE RESPONSABILIDAD, NI DE NINGUNA PÉRDIDA DE +BENEFICIOS, NEGOCIO O PÉRDIDA DE DATOS, INCLUSO AUNQUE SE LES +ADVIERTA DE LA POSIBILIDAD DE DICHOS DAÑOS. + +EN CASO DE QUE SE PRODUZCA, EN NINGÚN CASO LA RESPONSABILIDAD +CONJUNTA DEL LICENCIADOR EN RELACIÓN CON ESTE EULA (YA SEA EN UNA +INSTANCIA O EN UNA SERIE DE INSTANCIAS) EXCEDERÁ LA CANTIDAD PAGADA +POR EL USUARIO POR EL SOFTWARE (O 50 DÓLARES DE ESTADOS UNIDOS SI EL +USUARIO NO PAGÓ EL SOFTWARE), DURANTE LOS 12 MESES ANTERIORES A LA +PRIMERA RECLAMACIÓN AMPARADA POR ESTE EULA. +Las exclusiones y limitaciones anteriores no serán de aplicación a +las reclamaciones relacionadas con la muerte o daños personales +causados por la negligencia del Licenciador o de sus empleados, +agentes o contratistas. En las jurisdicciones donde no se permita +la exclusión o limitación de daños y perjuicios, incluyendo, sin +limitación, daños por incumplimiento de cualquiera de las +condiciones implícitas en cuanto al título o disfrute pacífico de +cualquier software obtenido de conformidad con el presente EULA o +por mala interpretación fraudulenta, la responsabilidad del +Licenciador se limitará o excluirá hasta el máximo permitido en +dichas jurisdicciones. + +Condiciones generales +Duración +Este EULA entrará en vigor en la fecha en que el Usuario descargue +el Software y finalizará automáticamente si el Usuario incumple +alguno de sus términos. +Transferencia +Este EULA no se puede transferir ni ceder sin el consentimiento +previo por escrito del Licenciador. Cualquier intento de cesión será +nulo y sin efecto alguno. +Legislación +Todas las cuestiones que surjan o estén relacionadas con el EULA se +regirán por las leyes de Estados Unidos y el estado de Nueva York, +excluyendo cualquier disposición de selección de fuero. Cualquier +pleito, acción o procedimiento que surja de este EULA o que esté +relacionado con él, solo podrá ser llevado ante un tribunal federal +de Estados Unidos o estatal de jurisdicción competente del estado de +Nueva York. Si una parte inicia procedimientos legales relacionados +con el EULA, la parte ganadora tendrá derecho a recuperar los +honorarios razonables de abogados. Sin embargo, si la ubicación +principal del negocio del Usuario se encuentra en un estado miembro +de la Unión Europea o de la Asociación Europea de Libre Comercio, +(1) los tribunales de Inglaterra y Gales tendrán jurisdicción +exclusiva sobre cualquier acción legal relacionada con este EULA y +(2) se aplicarán las leyes de Inglaterra excepto cuando sea +obligatorio que las leyes del país de dicha ubicación principal del +negocio se apliquen a cualquier acción legal, en cuyo caso se +aplicarán las leyes de ese país. Ni la Convención de las Naciones +Unidas sobre los Contratos para la Venta Internacional de +Mercaderías ni las reglas de conflicto de leyes de Nueva York o +Inglaterra y Gales se aplican a este EULA o su contenido. +Acuerdo completo +Este EULA, junto con cualquier otro documento de compra u otro +acuerdo entre el Usuario y el Licenciador o sus Afiliadas, +constituye la totalidad del entendimiento y acuerdo entre el Usuario +y el Licenciador y solo puede ser enmendado o modificado mediante un +acuerdo por escrito firmado por el Usuario y un representante +autorizado del Licenciador. NINGÚN LICENCIADOR EXTERNO, +DISTRIBUIDOR, PROVEEDOR, MINORISTA, REVENDEDOR, COMERCIAL NI +EMPLEADO ESTÁ AUTORIZADO A MODIFICAR ESTE ACUERDO NI A REALIZAR +NINGUNA DECLARACIÓN NI PROMESA QUE CONTRADIGA O AMPLÍE LOS TÉRMINOS +DE ESTE ACUERDO. +Renuncia +Ninguna renuncia voluntaria a los derechos otorgados en virtud de +este EULA será efectiva, a menos que se realice por escrito y esté +firmada por un representante debidamente autorizado de la parte +vinculada. Ninguna renuncia voluntaria a derechos presentes o +pasados obtenidos como consecuencia de infracciones o +incumplimientos se considerará una renuncia voluntaria de ningún +derecho futuro que pueda emanar de este EULA. +Omisión +Si cualquier disposición de este EULA no es válida o no es +aplicable, se interpretará, limitará, modificará o, si es necesario, +recortará en la medida en que sea necesario para eliminar su falta +de validez o imposibilidad de aplicación. El resto de disposiciones +del EULA no se verán afectadas. +Cumplimiento de normativas de exportación +El Usuario reconoce que los productos y/o la tecnología del +Licenciador pueden estar sujetos a las Regulaciones de la +Administración de Exportación de Estados Unidos ("EAR") y a las +leyes comerciales de otros países. El Usuario se compromete a +cumplir con las EAR y con las leyes y normativas locales que puedan +ser aplicables y afectar al derecho del Usuario a importar, exportar +o utilizar los productos y/o la tecnología del Licenciador. El +Usuario no exportará ni reexportará productos del Licenciador, +directa o indirectamente, a: (1) entidades incluidas en las listas +de exclusión a las exportaciones de Estados Unidos o que estén +sometidas a embargos, ni a países que apoyen el terrorismo según se +especifica en las EAR, (2) cualquier usuario final que el Usuario +sepa o tenga razones para saber que utilizará los productos del +Licenciador en el diseño, desarrollo o producción de sistemas de +armas nucleares, químicas o biológicas, sistemas de cohetes, +lanzadores espaciales y cohetes de sondeo o vehículos aéreos no +tripulados, salvo autorización de la agencia pública relevante por +normativas o licencias específicas, o (3) cualquier usuario final al +que se haya prohibido participar en las operaciones de exportación +de los Estados Unidos por cualquier agencia federal del Gobierno de +Estados Unidos. El Usuario no utilizará los productos y/o la +tecnología del Licenciador para fines prohibidos aplicados a +armamento nuclear, misilístico o biológico, tal como se especifica +en las EAR. Al descargar o utilizar el Software, el Usuario está de +acuerdo con lo anterior, y afirma y garantiza que no se encuentra +en, bajo el control de un nacional o residente de dichos países o en +ninguna de dichas listas. Además, el Usuario es responsable de +cumplir con las leyes locales en su jurisdicción que puedan afectar +a su derecho a la importación, exportación o uso de productos del +Licenciador. Consulte la página Web de la Oficina de Industria y +Seguridad de Estados Unidos https://www.bis.doc.gov antes de +exportar productos sujetos al as EAR. Para obtener más información +sobre la exportación del Software, incluyendo el Número de +Clasificación de Control de la Exportación (ECCN) aplicable y la +excepción de licencia asociada (según corresponda), consulte: +https://www.suse.com/company/legal/. Previa solicitud, el +Departamento de Servicios de Comercio Internacional del Licenciador +puede proporcionar información con respecto a las restricciones de +exportación aplicables a los productos del Licenciador. El +Licenciador no asume ninguna responsabilidad en el caso de que no +pueda obtener las aprobaciones de exportación necesarias. + +:versión:2024-02-01:001 +SUSE.com + +Copyright (c) SUSE 2024 + +SUSE Legal +Febrero de 2024 diff --git a/rust/share/eula/license.final/license.txt b/rust/share/eula/license.final/license.txt new file mode 100644 index 0000000000..5e9b4affe4 --- /dev/null +++ b/rust/share/eula/license.final/license.txt @@ -0,0 +1,263 @@ +End User License Agreement +for SUSE Software + + +End User License Agreement for SUSE Software +PLEASE READ THIS AGREEMENT CAREFULLY. BY PURCHASING, INSTALLING, +DOWNLOADING OR OTHERWISE USING THE SOFTWARE (AS DEFINED BELOW AND +INCLUDING ITS COMPONENTS), YOU AGREE TO THE TERMS OF THIS AGREEMENT. +IF YOU DO NOT AGREE WITH THESE TERMS, YOU ARE NOT PERMITTED TO +DOWNLOAD, INSTALL OR USE THE SOFTWARE. AN INDIVIDUAL ACTING ON +BEHALF OF AN ENTITY REPRESENTS THAT HE OR SHE HAS THE AUTHORITY TO +ENTER INTO THIS AGREEMENT ON BEHALF OF THAT ENTITY. + +SUSE LLC ("Licensor" or "SUSE") makes available software products, +being a compilation of: (i) software programs developed by SUSE and +is affiliates; (ii) software programs developed by third parties; +(iii) trade marks owned by SUSE and/or its affiliates ("SUSE +Marks"); and (iv) media or reproductions (physical or virtual) and +accompanying documentation accompanying such software programs (such +compilation of programs, trade marks and documentation being the +"Software"). + +The Software is protected by the copyright laws and treaties of the +United States and copyright laws in other countries worldwide. This +End User License Agreement ("EULA") is a legal agreement between You +(an entity or a person) and SUSE governing Your use of the Software. +If the laws of Your principal place of business require contracts to +be in the local language to be enforceable, such local language +version may be obtained from Licensor upon written request and shall +be deemed to govern Your use of the Software. Any add-on, extension, +update, mobile application, module, adapter or support release to +the Software that You may download or receive that is not +accompanied by a license agreement is Software and is governed by +this EULA. + +License Terms +Open Source +The Software contains many individual components that are open +source software and the open source license for each component, +which, depending on the software program, may be the GNU General +Public License v.2 +(https://www.gnu.org/licenses/oldlicenses/gpl-2.0.en.html) or Apache +2.0 (https://www.apache.org/licenses/LICENSE-2.0) or other open +source license (each such license being the "OSS License"), is +located in the licensing documentation and/or in the component's +source code. + +This EULA governs Your use of the Software, including SUSE Marks, +and does not limit, supersede or modify your rights under the OSS +License applicable to Your use of any open source code contained in +the Software without the SUSE Marks. + +The Software may include or be bundled with other software programs +licensed under different terms and/or licensed by a third party +other than Licensor. Use of any software programs accompanied by a +separate license agreement is governed by that separate license +agreement. + +License to use the Software +Subject to compliance with the terms and conditions of this EULA, +Licensor grants to You a perpetual, non- exclusive, +non-transferable, revocable, worldwide license to reproduce and use +copies of the Software within Your Organization for Your +Organization's internal use. "Organization" means a legal entity and +its Affiliates. "Affiliates" means entities that control, are +controlled by, or are under common control with You. The above +license is conditioned upon You being responsible and liable for any +breach of the provisions of this EULA by Your Affiliates. + +This EULA does not permit you to distribute the Software or its +components using the SUSE Marks regardless of whether the copy has +been modified. You may make a redistribution outside of Your +Organization: (a) of the Software, only if permitted under a +separate written agreement with Licensor authorizing such +redistribution, or (b) of the constituent components of the +Software, only if You remove and replace all occurrences of any SUSE +Mark. + +If You have received, whether directly or indirectly from SUSE, +hardware, software or other appliance that uses or embeds the +Software, You may use the Software solely for the purpose of running +that hardware, software or appliance and not on a stand-alone basis. + +Ownership +No title to or ownership of the Software is transferred to You. +Licensor and/or its third party licensors retain all right, title +and interest in and to all intellectual property rights in the +Software, including any adaptations or copies thereof. The Software +is not sold to You, You acquire only a conditional license to use +the Software. Title, ownership rights and intellectual property +rights in and to the content accessed through the Software are the +property of the applicable content owner and may be protected by +applicable copyright or other law. This EULA gives You no rights to +such content. + +SUSE Marks +No right or license, express or implied, is granted under this EULA +to use any SUSE Mark, trade name or service mark of Licensor or its +affiliates or licensors otherwise than is necessary to use the +Software as permitted by this EULA. + +Subscription Services and Support +Licensor has no obligation to provide maintenance or support unless +You purchase a subscription offering, pursuant to an additional +contract with Licensor or its affiliates, which expressly includes +such services. + +Warranty and Liability +Limited Warranty +Licensor warrants that the media that the Software is delivered on +will be free from defects in materials and manufacture under normal +use for a period of sixty (60) days from the date of delivery to +you. THE FOREGOING WARRANTY IS YOUR SOLE AND EXCLUSIVE REMEDY AND IS +IN LIEU OF ALL OTHER WARRANTIES, EXPRESS OR IMPLIED. SAVE FOR THE +FOREGOING WARRANTY, THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY +WARRANTIES OF ANY KIND. +THE SOFTWARE IS NOT DESIGNED, MANUFACTURED OR INTENDED FOR USE OR +DISTRIBUTION WITH, AND MUST NOT BE USED FOR, ON-LINE CONTROL +EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE PERFORMANCE, +SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION, +COMMUNICATION, OR CONTROL SYSTEMS, DIRECT LIFE SUPPORT MACHINES, +WEAPONS SYSTEMS, OR OTHER USES IN WHICH FAILURE OF THE SOFTWARE +COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL OR +ENVIRONMENTAL DAMAGE. +Non-Licensor Products +The Software may include or be bundled with hardware or other +software programs or services licensed or sold by an entity other +than Licensor. LICENSOR DOES NOT WARRANT NON-LICENSOR PRODUCTS OR +SERVICES. ANY SUCH PRODUCTS OR SERVICES ARE PROVIDED ON AN "AS IS" +BASIS. WARRANTY SERVICE IF ANY FOR NON-LICENSOR PRODUCTS IS PROVIDED +BY THE PRODUCT LICENSOR IN ACCORDANCE WITH THEIR APPLICABLE +WARRANTY. +EXCEPT AS OTHERWISE RESTRICTED BY LAW, LICENSOR DISCLAIMS AND +EXCLUDES ANY AND ALL IMPLIED WARRANTIES INCLUDING ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE OR +NON-INFRINGEMENT NOR ARE THERE ANY WARRANTIES CREATED BY COURSE OF +DEALING, COURSE OF PERFORMANCE OR TRADE USAGE. LICENSOR MAKES NO +WARRANTY, REPRESENTATION OR PROMISE NOT EXPRESSLY SET FORTH IN THIS +LIMITED WARRANTY. LICENSOR DOES NOT WARRANT THAT THE SOFTWARE OR +SERVICES WILL SATISFY YOUR REQUIREMENTS, BE COMPATIBLE WITH ALL +OPERATING SYSTEMS, OR THAT THE OPERATION OF THE SOFTWARE OR SERVICES +WILL BE UNINTERRUPTED OR ERROR-FREE. THE FOREGOING EXCLUSIONS AND +DISCLAIMERS ARE AN ESSENTIAL PART OF THIS AGREEMENT. Some +jurisdictions do not allow certain disclaimers and limitations of +warranties, so portions of the above limitations may not apply to +You. This limited warranty gives You specific rights and You may +also have other rights which vary by state or jurisdiction. +Limitation of Liability +NEITHER LICENSOR NOR ANY OF ITS THIRD PARTY LICENSORS, SUBSIDIARIES, +OR EMPLOYEES WILL IN ANY CASE BE LIABLE FOR ANY CONSEQUENTIAL OR +INDIRECT DAMAGES, WHETHER BASED ON CONTRACT, NEGLIGENCE, TORT OR +OTHER THEORY OF LIABILITY, OR FOR ANY LOSS OF PROFITS, BUSINESS OR +LOSS OR CORRUPTION OF DATA, IN EACH CASE, EVEN IF ADVISED OF THE +POSSIBILITY OF THOSE DAMAGES. + +IN NO EVENT WILL LICENSOR'S AGGREGATE LIABILITY UNDER OR IN +CONNECTION WITH THIS EULA (WHETHER IN ONE INSTANCE OR A SERIES OF +INSTANCES) EXCEED THE AMOUNT PAID BY YOU FOR THE SOFTWARE OUT OF +WHICH SUCH CLAIM AROSE (OR $50 (U.S.) IF YOU DID NOT PAY FOR THE +SOFTWARE), IN THE 12 MONTHS PRECEDING THE FIRST CLAIM UNDER THIS +EULA. +The above exclusions and limitations will not apply to claims +relating to death or personal injury caused by the negligence of +Licensor or its employees, agents or contractors. In those +jurisdictions that do not allow the exclusion or limitation of +damages, including, without limitation, damages for breach of any +implied terms as to title or quiet enjoyment of any Software +obtained pursuant to this EULA or for fraudulent misrepresentation, +Licensor's liability shall be limited or excluded to the maximum +extent allowed within those jurisdictions. + +General Terms +Term +This EULA becomes effective on the date You download the Software +and will automatically terminate if You breach any of its terms. +Transfer +This EULA may not be transferred or assigned without the prior +written approval of Licensor. Any such attempted transfer or +assignment shall be void and of no effect. +Law +All matters arising out of or relating to this EULA will be governed +by the substantive laws of the United States and the State ofNew +York without regard to its choice of law provisions. Any suit, +action or proceeding arising out of or relating to this EULA may +only be brought before a federal or state court of appropriate +jurisdiction in New York. If a party initiates EULA-related legal +proceedings, the prevailing party will be entitled to recover +reasonable attorneys' fees. If, however, Your principal place of +business is a member state of the European Union or the European +Free Trade Association, (1) the courts of England and Wales shall +have exclusive jurisdiction over any action of law relating to this +EULA; and (2) the laws of England shall apply except where the laws +of such country of Your principal place of business are required to +be applied to any such action of law, in which case the laws of that +country shall apply. Neither the United Nations Convention of +Contracts for the International Sale of Goods nor the New York or +England and Wales conflict of law rules apply to this EULA or its +subject matter. +Entire Agreement +This EULA, together with any other purchase documents or other +written agreement between You and Licensor or its Affiliates, sets +forth the entire understanding and agreement between You and +Licensor and may be amended or modified only by a written agreement +agreed to by You and an authorized representative of Licensor. NO +THIRD PARTY LICENSOR, DISTRIBUTOR, DEALER, RETAILER, RESELLER, SALES +PERSON, OR EMPLOYEE IS AUTHORIZED TO MODIFY THIS AGREEMENT OR TO +MAKE ANY REPRESENTATION OR PROMISE THAT IS DIFFERENT FROM, OR IN +ADDITION TO, THE TERMS OF THIS AGREEMENT. +Waiver +No waiver of any right under this EULA will be effective unless in +writing, signed by a duly authorized representative of the party to +be bound. No waiver of any past or present right arising from any +breach or failure to perform will be deemed to be a waiver of any +future right arising under this EULA. +Severability +If any provision in this EULA is invalid or unenforceable, that +provision will be construed, limited, modified or, if necessary, +severed, to the extent necessary, to eliminate its invalidity or +unenforceability, and the other provisions of this EULA will remain +unaffected. +Export Compliance +You acknowledge that Licensor's products and/or technology may be +subject to the U.S. Export Administration Regulations (the "EAR") +and the trade laws of other countries. You agree to comply with the +EAR and local laws and regulations which may be applicable to and +impact Your right to import, export or use Licensor's products +and/or technology. You will not export or re-export Licensor's +products, directly or indirectly, to (1) entities on the current +U.S. export exclusion lists or to any embargoed or terrorist +supporting countries as specified in the EAR; (2) any end user who +You know or have reason to know will utilize Licensor's products in +the design, development or production of nuclear, chemical or +biological weapons, or rocket systems, space launch vehicles, and +sounding rockets, or unmanned air vehicle systems, except as +authorized by the relevant government agency by regulation or +specific license; or (3) any end user who has been prohibited from +participating in the US export transactions by any federal agency of +the US government. You will not use Licensor's products and/or +technology for prohibited nuclear, missile, or chemical biological +weaponry end uses as specified in the EAR. By downloading or using +the Software, You are agreeing to the foregoing and You are +representing and warranting that You are not located in, under the +control of, or a national or resident of any such country or on any +such list. In addition, You are responsible for complying with any +local laws in Your jurisdiction which may impact Your right to +import, export or use Licensor's products. Please consult the Bureau +of Industry and Security web page https://www.bis.doc.gov before +exporting items subject to the EAR. For more information on +exporting Software, including the applicable Export Control +Classification Number (ECCN) and associated license exception (as +applicable), see https://www.suse.com/company/legal/. Upon request, +Licensor's International Trade Services Department can provide +information regarding applicable export restrictions for Licensor +products. Licensor assumes no responsibility for Your failure to +obtain any necessary export approvals. + +:version:2024-02-01:001 +SUSE.com + +Copyright (c) SUSE 2024 + +SUSE Legal +February 2024 diff --git a/rust/share/eula/license.final/license.zh_CN.txt b/rust/share/eula/license.final/license.zh_CN.txt new file mode 100644 index 0000000000..fd05df1624 --- /dev/null +++ b/rust/share/eula/license.final/license.zh_CN.txt @@ -0,0 +1,187 @@ +SUSE 软件 +最终用户许可协议 + + +SUSE 软件最终用户许可协议 +请仔细阅读本协议。一旦购买、安装、下载或以其他方式使用本软件(如下 +文定义,包括其组件),即表示您同意本协议的条款。如不同意以下条款, +您将不能下载、安装或使用本软件。代表某实体行事的个人表示其有权代表 +该实体签署本协议。 + +SUSE LLC(以下简称"许可证颁发者"或"SUSE")所提供的 +软件产品合集包含以下各项:(i) 由 SUSE 及其关联公司开发的 +软件程序;(ii) 第三方开发的软件程序;(iii) SUSE 及 +/或其关联公司拥有的商标(以下简称"SUSE 商标");以及 +(iv) 媒介或复制品(实体或虚拟格式)以及此类软件程序随附的相关 +文档(此类程序、商标和文档的合集统称为"软件")。 + +本软件受美国版权法和条约以及世界其他国家/地区版权法的保护。本最终 +用户许可协议(以下简称为"EULA")是您(作为个人或实体)与 +SUSE 之间就软件使用达成的法律协议。如果您所在的主要营业地的法 +律要求合同必须使用本地语言才能实施,则此类本地语言版本可按照书面请 +求从许可证颁发者处获得,并且应视为对您使用本软件的行为具有约束力。 +对于您可能下载或接收本软件的任何附加内容、扩展、更新、移动应用程序、 +模块、适配器或支持版本,如果没有随附许可协议,则均视为本软件并受 +本 EULA 的约束。 + +许可条款 +开放源代码 +本本软件包含许多独立组件,这些组件都是开源软件,每个组件的开源许可 +证(取决于软件程序)可能是 GNU 通用公共许可证 v.2 +(https://www.gnu.org/licenses/old +licenses/gpl-2.0.en.html) 或 +Apache 2.0 +(https://www.apache.org/licenses/ +LICENSE-2.0)或其他开放源代码许可(此类任一许可均 +为"OSS 许可"),位于许可文档和/或组件的开放源代码。 + +本 EULA 约束您使用本软件(包括 SUSE 商标)的权利,并不 +限制、替代或修改您根据 OSS 许可证对软件中的开放源代码(不包含 +SUSE 商标)的使用权利。 + +本软件可能包含或捆绑有其他软件程序,这些软件程序使用不同的条款许可, +并/或由许可证颁发者之外的第三方许可。使用任何附带有单独许可协议 +的软件程序的行为受该单独许可协议的约束。 + +本软件的使用许可证 +在遵守本 EULA 条款和条件的前提下,许可证颁发者授予您永久、非 +排他性、不可转让和可撤销的全球范围内的许可,允许在您组织内部复制和 +使用本软件的副本。"组织"指法律实体及其关联公司。"关联公司"指控 +制您、受您控制或受您共同控制的实体。上述许可的前提条件是,如果您的 +关联公司违反本 EULA 的任何条款,您将对此负有责任。 + +本 EULA 不允许您分发带有 SUSE 商标的软件或其组件,无论 +其副本有无改动。但在下列情况,您可以在您的组织范围外进行再分发: +(a) 只有在您与许可证颁发者签署的独立书面协议授权进行软件再分发 +的情况下,方可进行软件再分发;或 (b) 只有在您移除并替换所有 +SUSE 商标的情况下, 方可进行软件组件的再分发。 + +如果您直接或间接从 SUSE 收到使用或嵌入本软件的硬件、软件或其 +他设备,您只能将本软件用于运行该硬件、软件或设备,而不能单独使用本 +软件。 + +所有权 +本软件的所有权并未转让给您。许可证颁发者和/或其第三方许可证颁发者 +对本软件(包括软件的任何改编版本或副本)中的所有知识产权,保留全部 +权利、所有权和权益。本软件并非出售给您,您获得的只是使用本软件的有 +条件许可证。通过本软件访问的内容的相关权利、所有权和知识产权是相应 +内容所有者的财产,并可能受相应的版权法或其他法律的保护。本 +EULA 未授予您对此类内容的任何权利。 + +SUSE 商标 +除非根据本 EULA 的允许,必须使用本软件,否则本 EULA 并 +未以明示或暗示的方式,授予您使用许可证颁发者或其关联公司或其他许可 +证颁发者的任何 SUSE 商标、商号或服务商标的权利或许可。 + +订阅服务和支持 +除非您根据与许可证颁发者或其关联公司签署的附加合同购买的订阅产品中 +明确包含维护或支持服务,否则许可证颁发者无义务提供此类服务。 + +担保和责任 +有限担保 +自产品送达之日起六十 (60) 天内,许可证颁发者担保寄送软件所使 +用的任何介质在正常使用的情况下没有物理缺陷和制造缺陷。上述担保是您 +唯一的和独有的补救措施,它将取代所有其他明示或暗示的担保。除前述担 +保条款之外,本软件按"原样"提供,不提供任何形式的任何担保。 +本软件在设计、制造或使用目的方面,并非用于、分发于且不得用于在危险 +环境中使用的、需要故障自动防护性能的在线控制设备,例如核设备、飞机 +导航或通讯系统、空中交通控制、直接生命保障系统或武器系统。不适用的 +环境还包括由于本软件故障就会导致人员伤亡或严重的人身或环境损害的情 +况。 +非许可证颁发者产品 +本软件可能包含或捆绑着由许可证颁发者之外的实体许可或销售的硬件或其 +他软件程序或服务。对于非许可证颁发者的产品或服务,许可证颁发者不提 +供担保。任何此类产品和服务均按"原样"提供。对于非许可证颁发者的产 +品,如果有担保服务,则该担保服务由该产品的许可证颁发者依据其适用的 +担保提供。 +除非法律另行禁止,否则许可证颁发者不作任何暗示担保,包括对适销性、 +针对特定目的的适用性、所有权或不侵权的任何担保,交易过程、履约过程 +或贸易惯例也不会产生任何担保。除在本有限担保中所作的明示担保外,许 +可证颁发者不作任何担保、陈述或承诺。许可证颁发者不担保本软件或服务 +能满足您的要求并与所有操作系统兼容,也不担保本软件或服务的运行不会 +中断或没有错误。前述免除和免责声明构成本协议的核心部分。部分司法管 +辖区不允许特定免责声明和对担保的限制,因此,上述部分限制对您未必适 +用。本有限担保授予您特定的权利,您可能还拥有其他权利(因各州或司法 +辖区而异)。 +有限责任 +在任何情况下,无论是因合同、疏忽、侵权或其他责任原因,许可证颁发者 +或其任何第三方许可证颁发者、子公司或雇员均不对任何形式的间接或非直 +接损害承担责任,也不对任何利润损失、业务损失或数据丢失或损坏承担责 +任,即便已被告知可能发生此类损害。 + +在任何情况下,许可证颁发者在本 EULA 项下或与本 EULA 相 +关的累计责任(无论是单一事件还是系列事件)均不会超过您根据本 +EULA 在首次提出索赔前 12 个月内支付的与此类索赔有关的软件 +费用(如果您未支付任何软件费用,则或为 50 美元)。 +上述免除和限制不适用于与许可证颁发者或其雇员、代理或订约人所导致的 +死亡或人身伤害有关的索赔。对于不允许免除或限制损失(包括但不限于违 +反与所有权有关的任何隐含条款、安静享用依照本 EULA 获得的任何 +软件或欺诈性陈述所带来的损失)责任的司法管辖区,许可证颁发者的责任 +应在这些司法管辖区允许的最大范围内予以限制或免除。 + +通则 +术语 +本 EULA 自您下载本软件之日起生效,如果您违反了本协议的任何条 +款,本协议将自动终止。 +转移 +未经许可证颁发者的事先书面许可,不得转移或转让本 EULA。尝试进 +行任何此类转移或转让均属无用和无效。 +法律 +因本 EULA 产生或与本 EULA 相关的所有事宜均应受美国和纽 +约州实体法的约束,与所选的法律条款无关。因本 EULA 产生或与本 +EULA 相关的任何诉讼、行动或程序,只能呈交纽约州具有相应司法管 +辖权的联邦或州法庭裁决。如果某方提起与本 EULA 相关的法律诉讼, +则胜诉方有权获得合理的律师费。但是,如果您的主要营业地是欧盟或欧 +洲自由贸易联盟的成员国,则:(1) 英格兰和威尔士法庭将对与本 +EULA 相关的任何法律诉讼具有专属司法管辖权;以及 (2) 除非 +需要依据此类主要营业地所在的国家/地区的法律处理任何此类法律诉讼, +否则英格兰法律将适用。《联合国国际货物销售合同公约》、纽约或英格兰 +及威尔士的法律冲突规则对本 EULA 或其标的均不适用。 +完整协议 +本 EULA 连同其他任何购买单据或您与许可证颁发者或其关联公司之 +间签署的其他书面协议,构成您与许可证颁发者之间的完整理解与协议。未 +经您与许可证颁发者的授权代表的书面同意,不得修正或修改本协议。任何 +第三方许可证颁发者、分销商、经销商、零售商、转售商、销售人员或雇员, +均无权修改本协议,或做出与协议条款不一致或本协议条款之外的任何陈 +述或承诺。 +放弃 +对于本 EULA 中任何权利的放弃,必须以书面形式经受约束方正式授 +权代表签字,方可生效。对违约或未履约引发的任何过往、当前权利的弃权, +不得视为对未来依照本 EULA 而应具有的权利的弃权。 +可分割性 +如本 EULA 中的任何条款无效或不可执行,应在必要的范围内对该条 +款加以解释、限制、修改,如果必要的话,还可删除无效、不可执行的部分。 +本 EULA 的其他条款不受影响。 +符合出口法规 +您确认许可证颁发者的产品和/或技术可能受到《美国出口管理条例》(以 +下简称"EAR")及其他国家/地区贸易法的管辖。您同意遵循 EAR +及可能适用于您或影响您进口、出口或使用许可证颁发者产品和/或技术的 +当地法律和法规。您不得向以下国家/地区或用户直接或间接出口或再出口 +许可证颁发者的产品:(1) 列入美国出口排除名单的实体或 EAR +中规定的任何禁运或支持恐怖主义的其他国家/地区;(2) 任何您知晓 +或有理由知晓的将利用许可证颁发者的产品设计、开发或生产核武器、化学 +武器或生物武器、火箭系统、太空运载火箭和探测火箭或无人飞行器系统的 +最终用户,除非根据条例或特定许可证获得相关政府机构的授权;或者 +(3) 任何遭到美国政府的任何联邦机构禁止参与美国出口交易的最终用 +户。您还不得将许可证颁发者的产品和/或技术用于 EAR 所禁止的任 +何核武器、导弹或化学生物武器的最终用途。下载或使用本软件,即表示您 +同意上述条款并声明和保证,您不在上述任何国家/地区内,不受上述任何 +国家/地区的控制,不是上述任何国家/地区的公民或居民,也不在上述任 +何名单中。此外,您有义务遵守您所在司法管辖区内任何可能会影响您进口、 +出口或使用许可证颁发者产品的权利的当地法律。在依据 EAR 出口 +商品之前,请查阅美国商务部工业安全局网页 +https://www.bis.doc.gov。有关软件出口的更多 +信息,包括适用的出口管制分类号 (ECCN) 及相关的许可证异常 +(如果适用),请访问 +https://www.suse.com/company/lega +l/。如有必要,许可证颁发者的国际贸易服务部可以提供适用于许可证颁 +发者产品的出口限制方面的信息。如果您未能获得任何必要的出口许可,则 +许可证颁发者对此概不负责。 + +:版本:2024-02-01:001 +SUSE.com + +版权所有 (c) SUSE 2024 + +SUSE 法务 +2024 年 2 月 From b5a25241bff5f93c7b0e1b80c02087b4422b8597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Fri, 17 Jan 2025 12:17:48 +0000 Subject: [PATCH 064/109] feat(service): add a license_id to the products --- products.d/sles_160.yaml | 1 + products.d/sles_sap_160.yaml | 1 + service/lib/agama/dbus/software/product.rb | 3 ++- service/lib/agama/software/product.rb | 4 ++++ service/lib/agama/software/product_builder.rb | 1 + service/test/agama/software/product_builder_test.rb | 2 ++ 6 files changed, 11 insertions(+), 1 deletion(-) diff --git a/products.d/sles_160.yaml b/products.d/sles_160.yaml index dd94294086..d2742279ec 100644 --- a/products.d/sles_160.yaml +++ b/products.d/sles_160.yaml @@ -2,6 +2,7 @@ id: SLES name: SUSE Linux Enterprise Server 16.0 Beta registration: "mandatory" version: "16-0" +license_id: "license.beta" # ------------------------------------------------------------------------------ # WARNING: When changing the product description delete the translations located # at the at translations/description key below to avoid using obsolete diff --git a/products.d/sles_sap_160.yaml b/products.d/sles_sap_160.yaml index 3cf70ce139..06630abd3c 100644 --- a/products.d/sles_sap_160.yaml +++ b/products.d/sles_sap_160.yaml @@ -3,6 +3,7 @@ name: SUSE Linux Enterprise Server for SAP Applications 16.0 Beta archs: x86_64,aarch64,ppc registration: "mandatory" version: "16-0" +license_id: "license.beta" # ------------------------------------------------------------------------------ # WARNING: When changing the product description delete the translations located # at the at translations/description key below to avoid using obsolete diff --git a/service/lib/agama/dbus/software/product.rb b/service/lib/agama/dbus/software/product.rb index 40b7d2b1fd..aeacb8628e 100644 --- a/service/lib/agama/dbus/software/product.rb +++ b/service/lib/agama/dbus/software/product.rb @@ -60,7 +60,8 @@ def available_products { "description" => product.localized_description, "icon" => product.icon, - "registration" => product.registration + "registration" => product.registration, + "license_id" => product.license_id } ] end diff --git a/service/lib/agama/software/product.rb b/service/lib/agama/software/product.rb index 01b219bf09..fc649ede16 100644 --- a/service/lib/agama/software/product.rb +++ b/service/lib/agama/software/product.rb @@ -111,6 +111,9 @@ class Product # @return [Hash>] attr_accessor :translations + # License ID + attr_accessor :license_id + # @param id [string] Product id. def initialize(id) @id = id @@ -124,6 +127,7 @@ def initialize(id) # nil = display all visible patterns, [] = display no patterns @user_patterns = nil @registration = Agama::Registration::Requirement::NO + @license_id = nil @translations = {} end diff --git a/service/lib/agama/software/product_builder.rb b/service/lib/agama/software/product_builder.rb index a2507507bd..9f412e7991 100644 --- a/service/lib/agama/software/product_builder.rb +++ b/service/lib/agama/software/product_builder.rb @@ -66,6 +66,7 @@ def initialize_product(id, data, attrs) product.version = data[:version] product.icon = attrs["icon"] if attrs["icon"] product.registration = attrs["registration"] if attrs["registration"] + product.license_id = attrs["license_id"] if attrs["license_id"] product.version = attrs["version"] if attrs["version"] end end diff --git a/service/test/agama/software/product_builder_test.rb b/service/test/agama/software/product_builder_test.rb index cf67c02b0f..9943ae7fef 100644 --- a/service/test/agama/software/product_builder_test.rb +++ b/service/test/agama/software/product_builder_test.rb @@ -43,6 +43,7 @@ "description" => "This is a test product named Test 1", "version" => "1.0", "registration" => "mandatory", + "license_id" => "suse", "translations" => { "description" => { "cs" => "Czech", @@ -146,6 +147,7 @@ name: "Test1", version: "1.0", registration: "mandatory", + license_id: "suse", repositories: ["https://repos/test1/x86_64/product/"], mandatory_patterns: ["pattern1-1", "pattern1-2"], optional_patterns: ["pattern1-3"], From 1ece6079d5076fbb00bda62670bdc59919c748eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Fri, 17 Jan 2025 12:22:10 +0000 Subject: [PATCH 065/109] feat(rust): expose the license_id in the list of products --- rust/agama-lib/src/product/client.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rust/agama-lib/src/product/client.rs b/rust/agama-lib/src/product/client.rs index 4e6080b4f0..d4fc07504b 100644 --- a/rust/agama-lib/src/product/client.rs +++ b/rust/agama-lib/src/product/client.rs @@ -21,7 +21,7 @@ use std::collections::HashMap; use std::str::FromStr; -use crate::dbus::get_property; +use crate::dbus::{get_optional_property, get_property}; use crate::error::ServiceError; use crate::software::model::RegistrationRequirement; use crate::software::proxies::SoftwareProductProxy; @@ -43,6 +43,8 @@ pub struct Product { pub icon: String, /// Registration requirement pub registration: RegistrationRequirement, + /// License ID + pub license_id: Option, } /// D-Bus client for the software service @@ -81,12 +83,16 @@ impl<'a> ProductClient<'a> { .map(|r| RegistrationRequirement::from_str(&r).unwrap_or_default()) .unwrap_or_default(); + let license_id = + get_optional_property::(&data, "license_id").unwrap_or_default(); + Product { id, name, description: description.to_string(), icon: icon.to_string(), registration, + license_id, } }) .collect(); From 24fedc64b4d20e88b2d97d787465a2c58a222938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Fri, 17 Jan 2025 12:46:08 +0000 Subject: [PATCH 066/109] fix(rust): use camel case for the license ID --- rust/agama-lib/src/product/client.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rust/agama-lib/src/product/client.rs b/rust/agama-lib/src/product/client.rs index d4fc07504b..8c2052fa75 100644 --- a/rust/agama-lib/src/product/client.rs +++ b/rust/agama-lib/src/product/client.rs @@ -32,6 +32,7 @@ use super::proxies::RegistrationProxy; /// Represents a software product #[derive(Default, Debug, Serialize, utoipa::ToSchema)] +#[serde(rename_all = "camelCase")] pub struct Product { /// Product ID (eg., "ALP", "Tumbleweed", etc.) pub id: String, From bb6da7ae35bfd0d02c1b77c23a40aca1f4b24ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Fri, 17 Jan 2025 12:46:52 +0000 Subject: [PATCH 067/109] fix(service): do not crash when exporting a nil license_id --- service/lib/agama/dbus/software/product.rb | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/service/lib/agama/dbus/software/product.rb b/service/lib/agama/dbus/software/product.rb index aeacb8628e..2dfcb6b458 100644 --- a/service/lib/agama/dbus/software/product.rb +++ b/service/lib/agama/dbus/software/product.rb @@ -54,15 +54,16 @@ def issues def available_products backend.products.map do |product| + data = { + "description" => product.localized_description, + "icon" => product.icon, + "registration" => product.registration + } + data["license_id"] = product.license_id if product.license_id [ product.id, product.display_name, - { - "description" => product.localized_description, - "icon" => product.icon, - "registration" => product.registration, - "license_id" => product.license_id - } + data ] end end From ac24f3ae5c7f6d99936eeacf28d88feb88614afc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Fri, 17 Jan 2025 12:53:52 +0000 Subject: [PATCH 068/109] test: set license id values just for testing --- products.d/leap_160.yaml | 1 + products.d/slowroll.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/products.d/leap_160.yaml b/products.d/leap_160.yaml index 0c9563becc..cbaaaf6569 100644 --- a/products.d/leap_160.yaml +++ b/products.d/leap_160.yaml @@ -9,6 +9,7 @@ description: 'The latest version of a community distribution based on the latest SUSE Linux Enterprise Server.' # Do not manually change any translations! See README.md for more details. icon: Leap16.svg +license_id: "license.final" translations: description: ca: La darrera versió d'una distribució comunitària basada en l'últim SUSE Linux diff --git a/products.d/slowroll.yaml b/products.d/slowroll.yaml index e4d1b25d36..cc8d5d7be6 100644 --- a/products.d/slowroll.yaml +++ b/products.d/slowroll.yaml @@ -9,6 +9,7 @@ archs: x86_64 description: 'An experimental and slightly slower rolling release of openSUSE designed to update less often than Tumbleweed but more often than Leap without forcing users to choose between "stable" and newer packages.' +license_id: "license.beta" icon: Slowroll.svg # Do not manually change any translations! See README.md for more details. translations: From 025992d34fb04eb2e0a6fcd482abb9be39ff0dcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Fri, 17 Jan 2025 12:57:43 +0000 Subject: [PATCH 069/109] feat(live): add licenses to the live image --- .../agama/eula/license.beta/license.cs.txt | 322 ++++++++++++++++ .../agama/eula/license.beta/license.de.txt | 330 +++++++++++++++++ .../agama/eula/license.beta/license.es.txt | 323 ++++++++++++++++ .../agama/eula/license.beta/license.fr.txt | 320 ++++++++++++++++ .../agama/eula/license.beta/license.it.txt | 316 ++++++++++++++++ .../agama/eula/license.beta/license.ja.txt | 158 ++++++++ .../agama/eula/license.beta/license.ko.txt | 166 +++++++++ .../agama/eula/license.beta/license.pt_BR.txt | 297 +++++++++++++++ .../agama/eula/license.beta/license.ru.txt | 347 ++++++++++++++++++ .../share/agama/eula/license.beta/license.txt | 310 ++++++++++++++++ .../agama/eula/license.beta/license.zh_CN.txt | 125 +++++++ .../agama/eula/license.beta/license.zh_TW.txt | 124 +++++++ .../agama/eula/license.final/license.cs.txt | 279 ++++++++++++++ .../agama/eula/license.final/license.de.txt | 321 ++++++++++++++++ .../agama/eula/license.final/license.es.txt | 295 +++++++++++++++ .../agama/eula/license.final/license.fr.txt | 306 +++++++++++++++ .../agama/eula/license.final/license.it.txt | 308 ++++++++++++++++ .../agama/eula/license.final/license.ja.txt | 253 +++++++++++++ .../agama/eula/license.final/license.ko.txt | 262 +++++++++++++ .../eula/license.final/license.pt_BR.txt | 282 ++++++++++++++ .../agama/eula/license.final/license.ru.txt | 308 ++++++++++++++++ .../agama/eula/license.final/license.txt | 263 +++++++++++++ .../eula/license.final/license.zh_CN.txt | 187 ++++++++++ .../eula/license.final/license.zh_TW.txt | 181 +++++++++ 24 files changed, 6383 insertions(+) create mode 100644 live/root/usr/share/agama/eula/license.beta/license.cs.txt create mode 100644 live/root/usr/share/agama/eula/license.beta/license.de.txt create mode 100644 live/root/usr/share/agama/eula/license.beta/license.es.txt create mode 100644 live/root/usr/share/agama/eula/license.beta/license.fr.txt create mode 100644 live/root/usr/share/agama/eula/license.beta/license.it.txt create mode 100644 live/root/usr/share/agama/eula/license.beta/license.ja.txt create mode 100644 live/root/usr/share/agama/eula/license.beta/license.ko.txt create mode 100644 live/root/usr/share/agama/eula/license.beta/license.pt_BR.txt create mode 100644 live/root/usr/share/agama/eula/license.beta/license.ru.txt create mode 100644 live/root/usr/share/agama/eula/license.beta/license.txt create mode 100644 live/root/usr/share/agama/eula/license.beta/license.zh_CN.txt create mode 100644 live/root/usr/share/agama/eula/license.beta/license.zh_TW.txt create mode 100644 live/root/usr/share/agama/eula/license.final/license.cs.txt create mode 100644 live/root/usr/share/agama/eula/license.final/license.de.txt create mode 100644 live/root/usr/share/agama/eula/license.final/license.es.txt create mode 100644 live/root/usr/share/agama/eula/license.final/license.fr.txt create mode 100644 live/root/usr/share/agama/eula/license.final/license.it.txt create mode 100644 live/root/usr/share/agama/eula/license.final/license.ja.txt create mode 100644 live/root/usr/share/agama/eula/license.final/license.ko.txt create mode 100644 live/root/usr/share/agama/eula/license.final/license.pt_BR.txt create mode 100644 live/root/usr/share/agama/eula/license.final/license.ru.txt create mode 100644 live/root/usr/share/agama/eula/license.final/license.txt create mode 100644 live/root/usr/share/agama/eula/license.final/license.zh_CN.txt create mode 100644 live/root/usr/share/agama/eula/license.final/license.zh_TW.txt diff --git a/live/root/usr/share/agama/eula/license.beta/license.cs.txt b/live/root/usr/share/agama/eula/license.beta/license.cs.txt new file mode 100644 index 0000000000..e0c46da661 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.beta/license.cs.txt @@ -0,0 +1,322 @@ +Licenční smlouva společnosti SUSE® s koncovým uživatelem k betaverzi +softwaru + +PŘEČTĚTE SI POZORNĚ TUTO LICENČNÍ SMLOUVU. INSTALACÍ, STAŽENÍM NEBO +JINÝM POUŽITÍM TOHOTO SOFTWARU SOUHLASÍTE S PODMÍNKAMI TÉTO SMLOUVY +K BETAVERZI SOFTWARU A S PODMÍNKAMI VŠECH DODATEČNÝCH LICENČNÍCH +SMLUV SPOLEČNOSTI SUSE, KTERÉ JSOU SOUČÁSTÍ TOHOTO SOFTWARU. POKUD +S PODMÍNKAMI TÉTO SMLOUVY NESOUHLASÍTE, SOFTWARE NESTAHUJTE, +NEINSTALUJTE ANI NEPOUŽÍVEJTE. SOFTWARE NESMÍ BÝT PRODÁN, POSTOUPEN +ANI DÁLE ŠÍŘEN BEZ PŘEDCHOZÍHO PÍSEMNÉHO SVOLENÍ SPOLEČNOSTI SUSE. + +Tato licenční smlouva s koncovým uživatelem k·betaverzi softwaru +společnosti SUSE (dále jen „licenční smlouva“) spolu s jakoukoli +doplňkovou licenční smlouvou společnosti SUSE dodanou s tímto +softwarem je právní smlouva mezi vámi (subjektem nebo osobou) +a společností SUSE LLC (dále jen „SUSE“). Softwarové produkty +uvedené v názvu této licenční smlouvy, inovace softwaru, média +(existují-li) a doprovodná online nebo tištěná dokumentace +(souhrnným označením „software") jsou chráněny autorskými právy +a úmluvami Spojených států amerických a dalších zemí a vztahují se +na ně podmínky této licenční smlouvy. Pokud s podmínkami této +licenční smlouvy nesouhlasíte, software nestahujte, neinstalujte a +ani jinak nepoužívejte. Je-li to možné, vraťte v takovém případě +nepoužité balení společnosti SUSE. Software vám nebyl prodán, pouze +vám byla udělena licence k jeho užívání. + +Software může být dodáván jako součást jiných softwarových programů +nebo v kombinaci s nimi. Na tyto jiné softwarové programy se mohou +vztahovat jiné licenční podmínky anebo mohou být licencovány jiným +poskytovatelem licence než společností SUSE. Před následujícími +podmínkami mají přednost podmínky licenční smlouvy s koncovým +uživatelem dodané s konkrétním softwarovým souborem při instalaci +nebo stažení softwaru. Softwarové programy jiných výrobců jsou +poskytnuty k použití podle vašeho vlastního uvážení. Společnost +SUSE neodpovídá za jakýkoli software jiných výrobců a nenese žádnou +odpovědnost za jeho používání. + +Software může obsahovat nezávisle vyvinuté součásti open source, +které se řídí samostatnými licenčními podmínkami. Licenční práva +k jednotlivým součástem řídícím se samostatnými licenčními +podmínkami jsou definována příslušnými podmínkami. Žádné ustanovení +této smlouvy neomezuje ani jinak neovlivňuje práva, povinnosti a +podmínky, jež se na vás vztahují a které musíte splnit, vyplývající +z takových licencí. Licenční podmínky k některé součásti vás sice +mohou opravňovat k distribuci součásti, při takové distribuci však +nesmíte používat známky společnosti SUSE (například SUSE a SUSE +LINUX), a to bez ohledu na to, zda součást známky společnosti SUSE +obsahuje. + +Licence. Na základě podmínek této licenční smlouvy vám společnost +SUSE uděluje nevýhradní, nepřevoditelné právo na reprodukování +a interní používání softwaru po níže uvedenou dobu v množství +nezbytném pro vaše vyhodnocení anebo testování softwaru. + +Pokud je v softwaru zahrnut nebo společně se softwarem dodán i +nějaký samostatný produkt SUSE jiný než produkt poskytnutý k beta +testování, tak bez ohledu na licenční práva v licenční smlouvě +doprovázející tuto kopii samostatného produktu SUSE souhlasíte +s tím, že tento samostatný produkt SUSE budete používat výhradně ve +spojení s tímto softwarem a jen pro účely vyhodnocení tohoto +softwaru. Vaše právo používat samostatný produktový software SUSE +končí s ukončením platnosti licenční smlouvy k betaverzi softwaru +(viz níže). + +Doba trvání. Tato licenční smlouva vstupuje v platnost dnem získání +softwaru a zůstává v platnosti do doby, kdy bude ukončena. Tato +smlouva bude ukončena, jakmile nastane první z následujících +událostí: (i) uplyne 90 dní od instalace softwaru, (ii) bude vydána +další předběžná verze softwaru, (iii) společnost SUSE zahájí +komerční dodávky softwaru, (iv) některá ze smluvních stran písemně +oznámí ukončení smlouvy, nebo (v) porušíte některou podmínku této +smlouvy k betaverzi softwaru. Při ukončení platnosti této licenční +smlouvy musíte přestat používat software, vrátit do původního stavu +všechny softwarem provedené akce a zničit originál a všechny kopie +softwaru, případně je vrátit společnosti SUSE. Software musíte také +odstranit ze všech svých systémů. + +Kvalita předběžné verze. Protože se jedná o předběžný software, +nedoporučuje se jeho použití v komerčním nebo produkčním systému. +Software dosud nebyl plně testován a může obsahovat chyby +a opomenutí. Software lze používat pouze v testovacím prostředí. +Společnost SUSE nezaručuje, že komerční verze softwaru bude +zpřístupněna veřejnosti, že budou dodrženy předpokládané termíny +nebo že budou vydány přidružené produkty. Veškerá rizika spojená +s používáním softwaru nesete výhradně vy. Software může obsahovat +automatický blokovací mechanizmus, který brání jeho použití po +uplynutí určité lhůty, takže doporučujeme zálohovat váš systém a +přijmout další opatření k ochraně před ztrátou souborů nebo dat. +Software používáte zcela na vlastní nebezpečí. + +Důvěrnost. (Tato část se vás týká v případě, že společnost SUSE +neuvolnila software pro veřejnost jako nechráněný software beta bez +závazku důvěrnosti.) Software a veškeré související koncepty, +doprovodná dokumentace a materiály, informace o produktu, výsledky +testování a hodnocení, výsledky výkonnostních testů, předpokládané +termíny, čísla a hesla PIN a veškeré ostatní související informace +jsou důvěrným vlastnictvím společnosti SUSE a jejích dodavatelů a +jako takové jsou považovány za „důvěrné informace“. Zavazujete se +nevyzradit ani neposkytnout důvěrné informace žádné další osobě či +subjektu. Dále se zavazujete, že nebudete důvěrné informace používat +k jiným účelům, než je testování nebo hodnocení softwaru a oznámení +výsledků společnosti SUSE. Pokud je vám poskytnuto číslo PIN nebo +heslo pro webové servery s omezeným přístupem, zavazujete se, že +toto číslo PIN nebo heslo nesdělíte jiné osobě nebo subjektu. Váš +závazek důvěrnosti zůstává platný i po ukončení této licenční +smlouvy k betaverzi softwaru, dokud společnost SUSE nezpřístupní +tyto informace veřejnosti. + +Zpětná vazba. Jste srozuměni a souhlasíte s tím, že společnost SUSE +může použít vámi poskytnutou zpětnou vazbu nebo informace, a tímto +udělujete společnosti SUSE trvalé a neodvolatelné povolení používat +tyto informace pro jakékoli účely bez náhrady za podmínky, že +společnost SUSE nebude v této souvislosti veřejně uvádět vaše jméno. +Prohlašujete a zaručujete, že tato zpětná vazba a informace nebudou +obsahovat žádné vlastnické a důvěrné informace týkající se vás nebo +jiné osoby a že jste oprávněni toto povolení poskytnout. + +Licenční omezení. Společnost SUSE si vyhrazuje všechna práva, která +vám nebyla výslovně udělena. Nejste oprávněni: (1)  jakkoli +zvyšovat počet připojení podporovaných softwarem, ke kterým máte +licenci, případně podporovat více připojení nebo uživatelů +prostřednictvím jednoho připojení, (2)  zpětně překládat, +dekompilovat nebo analyzovat software mimo rozsah výslovně povolený +příslušnými zákony, (3)  upravovat, měnit, pronajímat, sdílet nebo +půjčovat software, případně dále postupovat práva plynoucí z této +licenční smlouvy, (4)  převádět software nebo vaše licenční práva +plynoucí z této smlouvy, ať již vcelku nebo částečně. + +AUTORIZOVANÁ PRACOVIŠTĚ PRO TESTOVÁNÍ BETAVERZÍ + +Pokud jste byli ustanoveni jako autorizované pracoviště pro +testování betaverzí, pak pro vás platí následující podmínky. Pokud +se chcete kvalifikovat jako autorizované pracoviště pro testování +betaverzí, kontaktujte prosím programového manažera SUSE pro +testování betaverzí na e-mailu beta-programs@lists.suse.com. +Společnost SUSE může kdykoli změnit rozsah výhod, které jsou vám za +testování nabízeny. V takovém případě oznámí tyto změny na +příslušném webovém serveru společnosti SUSE. + +Podpora. Společnost SUSE poskytne přímou podporu pro software +v souladu s aktuální nabídkou podpory společnosti SUSE autorizovaným +pracovištím pro testování betaverzí pro daný software zveřejněnou na +příslušném webovém serveru společnosti SUSE a oznámenou programovým +manažerem společnosti SUSE pro betaverzi daného softwaru. Tato +podpora může být usnadněna použitím webových nástrojů, elektronické +pošty anebo telefonu. Společnost SUSE poskytne nezbytné webové +adresy, elektronické adresy a telefonní čísla podpory. + +Testování. Souhlasíte, že na vlastní náklady provedete a dokončíte +všechny testovací programy poskytnuté společností SUSE během +testování betaverze a plně otestujete software provedením dalších +testů, které považujete za užitečné nebo nezbytné. Souhlasíte +s tím, že zajistíte hardware, software a pracovníky nezbytné pro +provedení odpovídajícího testování a splnění zde uvedených +požadavků. Souhlasíte s tím, že během testování betaverze +uskutečníte testy v minimálním rozsahu čtyř pracovních hodin týdně. +Během testování je třeba věnovat zvýšenou pozornost funkčnosti, +přesnosti, konzistenci a snadnému používání testovaného softwaru při +jednotlivých testech a rovněž věnovat pozornost související +dokumentaci. Výsledky všech testovacích programů a dalšího +testování včetně veškerých návrhů, nesrovnalostí a problémů musí být +podrobně zdokumentovány (včetně konfigurace systému atd.) a jednou +týdně předávány společnosti SUSE prostřednictvím vykazovacích metod +anebo nástrojů poskytnutých nebo specifikovaných společností SUSE. +Mezi tyto metody a nástroje mohou patřit webové nástroje, +elektronická pošta, fax, pošta a telefon. Aby bylo možno případné +chyby rychle opravit, souhlasíte s tím, že budete problémy zjištěné +v softwaru hlásit do dvou (2) dnů od jejich zjištění, i když si +nebudete jisti, zda problém nastal z důvodu náhodné chyby nebo chyby +v softwaru. Souhlasíte s tím, že na konci testování betaverze +vypracujete na vyžádání písemnou zprávu shrnující vykonané testy, +celkové dojmy ze softwaru a případné plánované použití softwaru ve +vašem prostředí. Souhlasíte s tím, že vyplníte případné dotazníky +týkající se výkonnosti testovacích programů a dalších aspektů +softwaru a v požadovaném termínu a na určeném médiu je vrátíte. + +VLASTNICKÁ PRÁVA + +Nepřechází na vás nárok na software ani na jeho vlastnictví. +Společnost SUSE, případně její poskytovatelé licencí, vlastní +a ponechávají si veškeré nároky a práva k duševnímu vlastnictví +obsaženému v softwaru včetně jakýchkoli jeho úprav a kopií. Touto +smlouvou získáváte pouze licenci na používání softwaru. + +ODMÍTNUTÍ ZÁRUK + +SOFTWARE A DALŠÍ DŮVĚRNÉ INFORMACE JSOU POSKYTOVÁNY „TAK, JAK JSOU“, +BEZ ZÁRUKY JAKÉHOKOLI DRUHU. VEŠKERÁ RIZIKA SPOJENÁ S POUŽÍVÁNÍM +A VÝSLEDKY POUŽÍVÁNÍ DŮVĚRNÝCH INFORMACÍ NESETE VÝHRADNĚ VY. +SPOLEČNOST SUSE ODMÍTÁ VŠECHNY VÝSLOVNÉ NEBO ODVOZENÉ ZÁRUKY VČETNĚ, +MIMO JINÉ, ODVOZENÝCH ZÁRUK TÝKAJÍCÍCH SE OBCHODOVATELNOSTI, +VHODNOSTI PRO KONKRÉTNÍ ÚČEL, VLASTNICTVÍ NEBO NEPORUŠENÍ PRÁVA. +SPOLEČNOST SUSE NEZARUČUJE, ŽE SOFTWARE SPLNÍ VAŠE POŽADAVKY ANI ŽE +JEHO PROVOZ BUDE NEPŘERUŠOVANÝ. Některé místně příslušné soudy +neumožňují odmítnutí určitých záruk nebo některá omezení, proto +je možné, že některá z výše uvedených omezení se na vás nevztahují. +Tato omezená záruka vám poskytuje určitá práva a určitá práva vám +zajišťuje zákon, který se v jednotlivých státech liší. + +Produkty, které nejsou produkty společnosti SUSE. Software může být +dodáván spolu s hardwarem nebo jinými softwarovými programy +licencovanými nebo prodávanými jinými poskytovateli licencí než +společností SUSE. SPOLEČNOST SUSE NEPOSKYTUJE ZÁRUKU NA PRODUKTY +JINÝCH VÝROBCŮ. VŠECHNY TAKOVÉ PRODUKTY JSOU POSKYTOVÁNY „TAK JAK +JSOU“. VŠECHNY ZÁRUČNÍ OPRAVY PRODUKTŮ JINÝCH VÝROBCŮ ZAJIŠŤUJÍ +POSKYTOVATELÉ LICENCÍ TĚCHTO PRODUKTŮ V SOULADU S PLATNOU ZÁRUKOU +POSKYTOVATELE LICENCE. + +OMEZENÍ ODPOVĚDNOSTI + +Následné ztráty. SPOLEČNOST SUSE ANI ŽÁDNÝ Z JEJÍCH POSKYTOVATELŮ +LICENCÍ, PŘIDRUŽENÝCH SPOLEČNOSTÍ NEBO ZAMĚSTNANCŮ NENESE +ODPOVĚDNOST ZA JAKÉKOLI ZVLÁŠTNÍ, NÁHODNÉ, NÁSLEDNÉ, NEPŘÍMÉ, +ÚMYSLNÉ, EKONOMICKÉ NEBO TRESTNÍ ŠKODY ZPŮSOBENÉ POUŽITÍM SOFTWARU +NEBO NEMOŽNOSTÍ JEJ POUŽÍT, MIMO JINÉ VČETNĚ ZTRÁTY ZISKU, ŠKOD PŘI +PODNIKÁNÍ NEBO ZTRÁTY DAT, A TO I V PŘÍPADĚ, ŽE BYLA NA MOŽNOST +VZNIKU TAKOVÝCH ŠKOD UPOZORNĚNA. +Přímé škody. CELKOVÁ ODPOVĚDNOST SPOLEČNOSTI SUSE ZA PŘÍMÉ ŠKODY +NA MAJETKU NEBO OSOBNÍ ÚJMY (AŤ JIŽ SE JEDNÁ O JEDEN PŘÍPAD NEBO +O ŘADU PŘÍPADŮ) V ŽÁDNÉM PŘÍPADĚ NEPŘESÁHNE 1,25NÁSOBEK ČÁSTKY, +KTEROU JSTE ZAPLATILI ZA SOFTWARE, KTERÝ VZNIK NÁROKU ZPŮSOBIL (NEBO +50 USD, POKUD JSTE SOFTWARE ZÍSKALI ZDARMA). Výše uvedené vyloučení +a omezení neplatí v případě nároků souvisejících se smrtí nebo +zraněním. V jurisdikcích, kde není vyloučení nebo omezení +odpovědnosti za náhradu škody povoleno, bude odpovědnost společnosti +SUSE omezena nebo vyloučena v maximálním rozsahu, který v dané +jurisdikci povolen je. + +VŠEOBECNÉ PODMÍNKY + +Podpora. Společnost SUSE nemá žádné závazky týkající se zajištění +podpory pro software kromě těch, které jsou zde výslovně uvedeny. +Testování typovou úlohou. Toto omezení testování produktu se vás +týká, jen pokud jste vývojář softwaru nebo poskytovatel licence nebo +pokud provádíte testování softwaru podle pokynů nebo jménem vývojáře +nebo poskytovatele licence. Bez předchozího písemného svolení +společnosti SUSE, které nebude bezdůvodně odmítáno, nesmíte +zveřejnit ani sdělit žádné třetí straně výsledky referenčního +testování softwaru. Pokud jste poskytovatelem licence produktů, +které jsou funkčně podobné nebo konkurují softwaru („podobné +produkty“) nebo jednáte jménem takového poskytovatele licence +a zveřejníte nebo sdělíte informace o referenčním testování softwaru +v rozporu s tímto omezením, má společnost SUSE právo provést +referenční testování na podobných produktech a sdělit a zveřejnit +informace o tomto testování a vy tímto prohlašujete, že máte +oprávnění toto právo společnosti SUSE poskytnout. To platí bez +ohledu na jakékoli opačné ustanovení v licenční smlouvě koncového +uživatele podobného produktu a bez ohledu na další opravné +prostředky, které může společnost SUSE případně využít. +Open Source. Žádné ustanovení této smlouvy neomezuje ani jinak +neovlivňuje práva, povinnosti a podmínky, které se na vás vztahují +nebo které musíte splnit, vyplývající z případných licencí pro +programový kód open source obsažený v tomto softwaru. +Ustanovení o závazku ke koupi. Tuto smlouvu o betaverzi softwaru +nelze vykládat jako závazek ke koupi licence pro komerčně dostupné +verze softwaru. Každý takový nákup bude doložen vystavením formální +objednávky. +Převod. Tuto smlouvu k testování betaverze nelze převést ani +poskytnout bez předchozího písemného souhlasu společnosti SUSE. +Vymezení jurisdikce. Tato licenční smlouva se řídí zákony státu +Utah v USA. Veškerá právní řízení vztahující se k této smlouvě mohou +řešit pouze místně příslušné soudy státu Utah. Pokud je však země, +kde se nachází vaše hlavní sídlo, členským státem Evropské unie nebo +Evropské dohody o volném obchodu, řídí se tato smlouva zákony této +země a veškerá právní řízení vztahující se k této smlouvě mohou +řešit pouze místně příslušné soudy této země. +Úplnost smlouvy. Tato smlouva zakládá úplné ujednání a dohodu mezi +vámi a společností SUSE. Může být doplněna nebo změněna pouze +písemnou dohodou, s níž souhlasíte vy i oprávněný zástupce +společnosti SUSE. ŽÁDNÝ POSKYTOVATEL LICENCE, DISTRIBUTOR, +PRODEJCE, MALOOBCHODNÍK, OBCHODNÍ ZÁSTUPCE ANI ZAMĚSTNANEC NENÍ +OPRÁVNĚN TUTO SMLOUVU UPRAVOVAT NEBO POSKYTOVAT JAKÁKOLI PROHLÁŠENÍ +ČI ZÁVAZKY NEOBSAŽENÉ V PODMÍNKÁCH TÉTO SMLOUVY NEBO LIŠÍCÍ +SE OD NÍ. +Vzdání se práva. Jakékoli zřeknutí se práv v rámci této licenční +smlouvy je platné pouze v písemné formě s podpisem oprávněného +zástupce zavázané smluvní strany. Zřeknutí se jakéhokoli dřívějšího +nebo současného práva vyplývajícího z porušení nebo nedodržení této +smlouvy nebude považováno za zřeknutí se jakéhokoli budoucího práva +plynoucího z této smlouvy. +Klauzule o oddělitelnosti. Stane-li se jakékoli ustanovení této +licenční smlouvy neplatným nebo neúčinným, bude toto ustanovení +interpretováno, omezeno, upraveno nebo v případě potřeby zrušeno +v nezbytném rozsahu tak, aby se zamezilo neplatnosti nebo +neúčinnosti této smlouvy. Ostatní ustanovení této smlouvy zůstávají +nedotčena. +Splnění exportních požadavků. Výrobky nebo technické údaje +poskytnuté podle této smlouvy mohou být předmětem exportních omezení +USA a obchodních zákonů jiných zemí. Smluvní strany se zavazují +dodržovat veškerá exportní omezení a získat jakékoli licence nebo +exportní klasifikace potřebné k exportu, reexportu nebo importu +zboží. Smluvní strany se zavazují neexportovat ani nereexportovat +subjektům uvedeným v platném seznamu subjektů vyloučených z exportu, +do zemí, na které je uvaleno embargo, ani do teroristických zemí +podle exportních zákonů USA. Smluvní strany nepoužijí zboží +pro zakázané jaderné, raketové nebo chemické a biologické zbraně. +Než začnete z USA vyvážet produkty společnosti SUSE, informujte se +na webových stránkách www.bis.doc.gov amerického Úřadu pro průmysl a +bezpečnost (Bureau of Industry and Security). Další informace +o vývozu softwaru společnosti SUSE najdete na adrese +https://www.suse.com/company/legal/. Společnost SUSE vám na požádání +poskytne konkrétní informace o příslušných omezeních. SUSE však +nepřijímá žádnou zodpovědnost v případě, že si neopatříte potřebné +povolení k vývozu. Instalací, stažením nebo jiným používáním +softwaru vyjadřujete svůj souhlas s následujícím prohlášením: +Potvrzujeme, že tato betaverze softwaru bude používána pouze pro +účely testování betaverze a nebude pronajata, prodána, postoupena, +přidělena ani jinak převedena. Dále potvrzujeme, že nepřevedeme ani +nevyexportujeme žádný výrobek, proces ani službu, které jsou přímým +produktem betaverze softwaru určené k testování. +Omezená práva pro vládu USA. Použití, duplikace nebo zpřístupnění +vládou USA je předmětem omezení určených FAR 52.227-14 (červen 1987) +Alternate III (červen 1987), FAR 52.227-19 (červen 1987) nebo DFARS +252.227-7013 (b)(3) (listopad 1995) nebo příslušných následných +ustanovení. Dodavatelem/výrobcem je společnost SUSE LLC, 404 Wyman +Street, Waltham, MA 02415, USA. +Jiné. Uplatnění Konvence OSN o smlouvách v mezinárodním obchodě se +zbožím je tímto výslovně vyloučeno. + +©2013 SUSE LLC nebo její přidružené společnosti. Všechna práva +vyhrazena. +(020314) diff --git a/live/root/usr/share/agama/eula/license.beta/license.de.txt b/live/root/usr/share/agama/eula/license.beta/license.de.txt new file mode 100644 index 0000000000..846c357adb --- /dev/null +++ b/live/root/usr/share/agama/eula/license.beta/license.de.txt @@ -0,0 +1,330 @@ +SUSE(r)-Endbenutzer-Lizenzvereinbarung für Beta-Software + +LESEN SIE SICH DIESE BETA-VEREINBARUNG SORGFÄLTIG DURCH. MIT DER INSTALLATION, +DEM HERUNTERLADEN ODER EINER ANDERWEITIGEN NUTZUNG DER SOFTWARE STIMMEN SIE +DEN BESTIMMUNGEN DIESER BETA-VEREINBARUNG UND EINER ETWAIGEN IM LIEFERUMFANG +DER SOFTWARE ENTHALTENEN ZUSÄTZLICHEN SUSE-LIZENZVEREINBARUNG ZU. WENN SIE MIT +DIESEN BESTIMMUNGEN NICHT EINVERSTANDEN SIND, DÜRFEN SIE DIE SOFTWARE NICHT +HERUNTERLADEN, INSTALLIEREN ODER VERWENDEN. DIE SOFTWARE DARF NICHT OHNE +VORHERIGE ZUSTIMMUNG VON SUSEWEITERVERKAUFT, ÜBERTRAGEN ODER VERTRIEBEN +WERDEN. + +Die vorliegende SUSE-Endbenutzer-Lizenzvereinbarung für Beta-Software +("Beta-Vereinbarung") einschließlich einer etwaigen im Lieferumfang der +Software enthaltenen zusätzlichen SUSE-Lizenzvereinbarung ist eine +rechtsgültige Vereinbarung zwischen Ihnen (als juristische Person oder +Einzelperson) und SUSE LLC ("SUSE"). Das dieser Beta-Vereinbarung +unterliegende Software-Produkt, die Software-Updates, die dazugehörigen Medien +(sofern vorhanden) sowie die Online- oder gedruckte Begleitdokumentation (im +Gesamten als "Software" bezeichnet) unterliegen den urheberrechtlichen +Bestimmungen der Vereinigten Staaten von Amerika und anderer Länder sowie den +Bestimmungen dieser Beta-Vereinbarung. Falls Sie den Bestimmungen dieser +Beta-Vereinbarung nicht zustimmen, unterlassen Sie das Herunterladen, die +Installation oder anderweitige Nutzung der Software und geben Sie +gegebenenfalls das gesamte, unbenutzte Paket an SUSE zurück. Diese Software +wird für Sie lizenziert; Sie erwerben nicht die Software selbst. + +Andere Softwareprogramme, die unter anderen Bestimmungen und/oder von anderen +Lizenzgebern als von SUSE lizenziert werden, können in der Software selbst +oder im Lieferumfang der Software enthalten sein. Die Bestimmungen einer +Endbenutzer-Lizenzvereinbarung, die im Lieferumfang einer bestimmten +Softwaredatei enthalten ist, ersetzen mit der Installation oder dem Download +der Software die nachfolgenden Bestimmungen. Die Nutzung von +Softwareprogrammen von Drittanbietern, die zur Verfügung gestellt werden, +steht Ihnen frei. SUSE ist nicht verantwortlich für die Software von +Drittanbietern und haftet nicht dafür, wenn Sie Drittanbietersoftware +verwenden. + +Die Software enthält möglicherweise Komponenten, die Open Source-Pakete sind +und unabhängig entwickelt wurden und für die andere Lizenzbedingungen gelten. +Ihre Lizenzrechte in Bezug auf diese einzelnen Komponenten, für die andere +Lizenzbedingungen gelten, werden durch die Lizenzvereinbarung der jeweiligen +Komponente bestimmt. Durch keine der hier aufgeführten Bedingungen werden Ihre +Rechte oder Verpflichtungen sowie die für Sie zutreffenden Bedingungen +eingeschränkt oder anderweitig beeinflusst, die für Sie im Rahmen dieser +Lizenzvereinbarungen gelten. Selbst wenn Sie gemäß den Lizenzbedingungen einer +Komponente berechtigt sind, diese zu vertreiben, ist es untersagt, SUSE +-Marken (z. B. SUSE oder SUSE LINUX) für den Vertrieb der Komponente zu +verwenden, unabhängig davon, ob die Komponente SUSE-Marken beinhaltet. + +Lizenz. Vorbehaltlich der Bestimmungen dieser Beta-Vereinbarung gewährt SUSE +Ihnen das nicht ausschließliche, nicht übertragbare Recht, die Software zu +reproduzieren und während des unten aufgeführten Zeitraums innerhalb Ihres +Unternehmens in der zur Evaluierung und/oder zum Testen der Software +erforderlichen Anzahl zu nutzen. + +Wenn ein separates SUSE-Produkt, das von dem für den Beta-Test vorgesehenen +Produkt unabhängig ist, in oder mit der Software enthalten ist, erklären Sie +sich ungeachtet der Lizenzrechte in der Lizenzvereinbarung, die der Kopie +dieses separaten SUSE-Produkts beiliegt, damit einverstanden, das separate +SUSE-Produkt ausschließlich in Verbindung mit und ausschließlich zum Zwecke +Ihrer Evaluierung der Software zu verwenden. Die Nutzungsberechtigung für die +separate SUSE-Produktsoftware erlischt mit Ablauf der Beta-Vereinbarung wie +nachstehend festgelegt. + +Begriff. Diese Beta-Vereinbarung tritt an dem Tag in Kraft, an dem Sie die +Software rechtmäßig erwerben, und bleibt bis zu ihrer im Folgenden +beschriebenen Beendigung gültig. Je nachdem, was als Erstes eintritt, gilt +diese Vereinbarung unter folgenden Bedingungen als beendet:(i) 90 Tage nach +Installation der Software, (ii) bei Veröffentlichung der nächsten Vorabversion +dieser Software (sofern weitere Vorabversionen veröffentlicht werden), (iii) +bei erster kommerzieller Auslieferung der Software SUSE, (iv) bei Eingang +einer schriftlichen Beendigungsbestätigung von einer der involvierten Parteien +oder (v) bei Bruch einer der Bestimmungen dieser Vereinbarung durch den +Nutzer. Nach Beendigung dieser Beta-Vereinbarung müssen Sie die Nutzung der +Software einstellen, alle von der Software ausgeführten Vorgänge rückgängig +machen bzw. den ursprünglichen Systemzustand wiederherstellen, das Original +und alle Kopien der Software vernichten oder an SUSE zurückgeben und die +Software vollständig von Ihren Systemen entfernen. + +Qualität der Vorabversion. Da es sich bei der Software um eine Vorabversion +handelt, sollten Sie die Software nicht im Rahmen einer kommerziellen +Anwendung oder eines Produktionssystems verwenden. Die Software wurde nicht +vollständig getestet und kann Fehler sowie unvollständige Elemente enthalten. +Die Software sollte daher nur in Testumgebungen eingesetzt werden. SUSE +übernimmt keine Gewährleistung dafür, dass eine kommerzielle Version dieser +Software oder zugehörige Produkte in der Zukunft veröffentlicht oder Termine +eingehalten werden. Sie übernehmen die Verantwortung für alle Risiken, die aus +der Nutzung dieser Software für Sie entstehen können. Die Software enthält +unter Umständen einen Mechanismus zur automatischen Deaktivierung, der die +Verwendung der Software nach Ablauf eines bestimmten Zeitraums verhindert. +Daher sollten Sie eine Sicherungskopie Ihres Systems erstellen und weitere +Maßnahmen zur Vermeidung von Datei- oder Datenverlust ergreifen. Die +Verwendung der Software erfolgt ausschließlich auf eigenes Risiko. + +Vertraulichkeit. (Dieser Abschnitt findet nur dann Anwendung, wenn die +Software von SUSE nicht als Beta-Version ohne Geheimhaltungspflicht +veröffentlicht wurde.) Die Software und alle zugrunde liegenden Konzepte, +beiliegenden Dokumentationen und Medien, Produktfunktionen, Test- und +Evaluierungsergebnisse, Vergleichstestergebnisse, Zieldaten, PIN-Nummern und +Passwörter, sowie sämtliche zugehörigen Informationen sind vertrauliche +Informationen von SUSE und deren Lieferanten (im Folgenden als "vertrauliche +Informationen" bezeichnet). Sie versichern, dass Sie keine vertraulichen +Informationen an Dritte weiterleiten bzw. dass Sie vertrauliche Informationen +ausschließlich zu Test- oder Evaluierungszwecken und für Feedback an SUSE +nutzen. Für den Fall, dass Sie eine PIN-Nummer oder ein Passwort für +zugriffsgeschützte Sites erhalten haben, verpflichten Sie sich, weder die +PIN-Nummer noch das Passwort an Dritte weiterzugeben. Ihre +Geheimhaltungspflicht gilt auch nach Ablauf der Beta-Vereinbarung bis zu dem +Zeitpunkt, zu dem SUSE die betreffenden Informationen der Öffentlichkeit +zugänglich macht. + +Rückmeldungen. Sie erklären sich damit einverstanden, dass SUSE Ihr Feedback +bzw. die von Ihnen mitgeteilten Informationen verwenden kann, und Sie erteilen +SUSE hiermit eine dauerhafte und unwiderrufliche Lizenz zur unentgeltlichen +Verwendung Ihres Feedbacks und der Informationen zu jedem beliebigen Zweck, +sofern SUSE Ihren Namen in diesem Zusammenhang nicht öffentlich nennt. Sie +versichern und garantieren, dass Ihr Feedback und die von Ihnen mitgeteilten +Informationen keine vertraulichen Informationen von Ihnen oder Dritten +enthalten und Sie dazu berechtigt sind, die vorgenannte Lizenz zu gewähren. + +Lizenzbeschränkungen. SUSE behält sich alle Rechte vor, die Ihnen nicht +ausdrücklich gewährt werden. (1) Sie sind nicht berechtigt, die Anzahl der +Verbindungen,die von der Software unterstützt werden und für Sie lizenziert +sind, auf irgendeine Weise zu erhöhen oder eine Einzelverbindung für mehr als +eine Verbindung oder einen Benutzer einzusetzen; (2) Reverse Engineering, +Dekompilieren oder Disassemblieren der Software ist nicht oder höchstens in +dem Ausmaß gestattet, wie es das anwendbare Gesetz zulässt; (3) Die Software +darf nicht modifiziert, verändert, vermietet, zeitweise überlassen oder +geleast werden und die Unterlizenzierung von aus dieser Beta-Vereinbarung +entstehenden Rechten ist nicht erlaubt; (4) Die vollständige oder teilweise +Übertragung der Software oder Ihrer Lizenzrechteaus dieser Beta-Vereinbarung +ist nicht gestattet. + +AUTORISIERTE BETA TESTSITES + +Wenn Sie zum Betreiben einer Beta-Test-Site für die Software autorisiert +wurden, gelten für Sie die folgenden Bedingungen. Um sich als autorisierte +Beta-Test-Site zu qualifizieren, wenden Sie sich per E-Mail an den SUSE +Beta-Programm-Manager unter beta-programs@suse.com. SUSE kann die Ihnen +gebotenen Leistungen durch Bekanntgabe der geänderten Leistungen auf der +entsprechenden SUSE-Website jederzeit ändern. + +Unterstützung. SUSE leistet für die Software direkte Unterstützung gemäß dem +aktuellen Unterstützungsangebot von SUSE für autorisierte Beta-Test-Sites, das +auf der entsprechenden SUSE-Website bekannt gegeben und vom +Beta-Programm-Manager von SUSE für die Software mitgeteilt wird. Diese +Unterstützung kann durch Web-basierte Tools und E-Mail und/oder telefonisch +erfolgen. SUSE teilt Ihnen alle erforderlichen Internet- und E-Mail-Adressen +sowie die Telefonnummern mit. + +Testbetrieb. Sie erklären sich einverstanden, alle von SUSE während des +Beta-Testzeitraums bereitgestellten Testprogramme auf eigene Kosten +vollständig auszuführen und die Software durch andere als nützlich bzw. +erforderlich erachtete Tests eingehend zu testen. Sie erklären sich +einverstanden, die zum sachgemäßen Testen und zur Erfüllung der hierin +festgelegten Anforderungen erforderliche Hard- und Software sowie das nötige +Personal bereitzustellen. Sie erklären sich einverstanden, während des +Beta-Testzeitraums mindestens vier Arbeitsstunden pro Woche für Tests +aufzuwenden. Bei den Tests ist vor allem auf Funktionalität, Genauigkeit, +Konsistenz und Benutzerfreundlichkeit der getesteten Software einschließlich +der zugehörigen Dokumentation zu achten. Die Ergebnisse aller Testprogramme +und anderer Tests, einschließlich aller Vorschläge, Inkonsistenzen und/oder +Probleme, müssen genau protokolliert werden (einschließlich der +Systemkonfiguration usw.) und wöchentlich mit den von SUSE bereitgestellten +und/oder angegebenen Berichtsmethoden und/oder Tools an SUSE übermittelt +werden. Diese Methoden und Tools können Web-basierte Tools, E-Mail, Fax, Post +und/oder Telefon umfassen, sind jedoch nicht darauf beschränkt. Um eine rasche +Problembehebung zu ermöglichen, erklären Sie sich einverstanden, alle im +Zusammenhang mit der Software festgestellten Probleme innerhalb von zwei (2) +Tagen nach Feststellung des Problems mitzuteilen und zwar ungeachtet einer +etwaigen Ungewissheit, ob ein Problem auf einen Fehler oder einen +Programmfehler zurückzuführen ist. Sie erklären sich einverstanden, am Ende +des Beta-Testzeitraums auf Verlangen einen schriftlichen Bericht vorzulegen, +in dem Sie die durchgeführten Tests zusammenfassen, Ihren Gesamteindruck von +der Software mitteilen und eine potenzielle geplante Verwendung der Software +in Ihrer Umgebung beschreiben. Unter Umständen werden Ihnen Fragebogen +hinsichtlich der Leistung der Testprogramme und anderer Aspekte der Software +zugestellt; Sie erklären sich einverstanden, diese Fragebogen auszufüllen und +bis zum angegebenen Datum unter Verwendung der vorgesehenen Methode +zurückzusenden. + +EIGENTÜMERSCHAFT + +Durch die Lizenz werden Ihnen keine Eigentumsrechte an der Software +übertragen. SUSE und/oder seine Lizenzgeber besitzen alle Rechte in +Zusammenhang mit dem geistigen Eigentum an der Software und behalten sich +diese vor; dies gilt auch für Anpassungen oder Kopien. Sie erwerben nur eine +Lizenz zur Verwendung der Software. + +HAFTUNGSAUSCHLUSS + +DIE SOFTWARE UND ANDERE VERTRAULICHE INFORMATIONEN WERDEN IN DER +VERFÜGBARENFORM OHNE GEWÄHRLEISTUNG BEREITGESTELLT. SIE ÜBERNEHMEN ALLE +RISIKEN BEZÜGLICH DER ERGEBNISSE UND DER ERFOLGREICHEN UMSETZUNG DER +VERTRAULICHEN INFORMATIONEN. SUSE SCHLIEẞT ALLE AUSDRÜCKLICHEN ODER IMPLIZITEN +GEWÄHRLEISTUNGEN AUS, EINSCHLIEẞLICH ALLER IMPLIZITEN GEWÄHRLEISTUNGEN +HINSICHTLICH MÄNGELGEWÄHR JEDWEDER ART (JEDOCH NICHT BESCHRÄNKT DARAUF). SUSE +GEWÄHRLEISTET NICHT DIE EIGNUNG DER SOFTWARE FÜR JEDWEDEN BEDARF ODER EINEN +UNUNTERBROCHENEN BETRIEB DER SOFTWARE. Manche Rechtsprechungen lassen +bestimmte Haftungsausschlüsse und Haftungseinschränkungen nicht zu, sodass +Teile der oben genannten Einschränkungen für Sie möglicherweise nicht relevant +sind. Durch diese beschränkte Gewährleistung werden Ihnen bestimmte Rechte +erteilt und außerdem können noch andere Rechte gelten, die von Rechtsordnung +zu Rechtsordnung variieren. + +Produkte von Drittanbietern. Die Software kann andere Softwareprogramme +enthalten oder zusammen mit Hardware oder anderen Softwareprogrammen +ausgeliefert werden, die von einem anderen Lizenzgeber als SUSE lizenziert +oder verkauft werden. SUSE ÜBERNIMMT KEINE GARANTIE FÜR NICHT-SUSE-PRODUKTE. +DERARTIGE PRODUKTE WERDEN IN DER VERFÜGBAREN FORM BEREITGESTELLT. EIN +GARANTIE-SERVICE FÜR NICHT-SUSE-PRODUKTE WIRD GEGEBENENFALLS VOM +PRODUKTLIZENZGEBER GEMÄẞ DER ZUTREFFENDEN LIZENZGEBERGARANTIE ZUR VERFÜGUNG +GESTELLT. + +EINSCHRÄNKUNG DER HAFTBARKEIT + +Folgeschäden. WEDER SUSE NOCH DIE ZUGEHÖRIGEN LIZENZGEBER, +TOCHTERGESELLSCHAFTEN ODER MITARBEITER SIND ZU ENTSCHÄDIGUNGEN FÜR BESONDERE, +ZUFÄLLIGE, MITTELBARE ODER INDIREKTE SCHÄDEN, SCHÄDEN RESULTIEREND AUS +UNERLAUBTER HANDLUNG ODER VERSCHÄRFTEM SCHADENSERSATZ VERPFLICHTET, DIE SICH +AUS DER NUTZUNG BZW. NICHT MÖGLICHEN NUTZUNG DER SOFTWARE ERGEBEN, +EINSCHLIEẞLICH GEWINN- UND BETRIEBSAUSFÄLLEN SOWIE DATENVERLUST, SELBST WENN +AUF DIE MÖGLICHKEIT SOLCHER SCHÄDEN HINGEWIESEN WURDE. +Unmittelbare Schäden. IN KEINEM FALL ÜBERSTEIGT DIE GESAMTHAFTUNG VON SUSE FÜR +DIREKTE SCHÄDEN AN EIGENTUM ODER PERSONEN (OB IN EINEM EINZELFALL ODER EINER +SERIE VON FÄLLEN) DEN 1,25-FACHEN WERT DES ENTRICHTETEN KAUFBETRAGS FÜR DIE +SOFTWARE, AUS DER EIN SOLCHER ANSPRUCH ENTSTANDEN IST [ODER 50 US-DOLLAR, WENN +SIE DIE SOFTWARE KOSTENLOS ERHALTEN HABEN]. Die oben genannten Ausschlüsse und +Einschränkungen gelten nicht bei Forderungen in Verbindung mit Tod und +Körperverletzung. Bei Rechtsprechungen, die den Ausschluss oder die +Einschränkung von Entschädigungen nicht zulassen, ist die Haftung von SUSE im +im Rahmen des geltenden Rechts maximal zulässigen Umfang beschränkt oder +ausgeschlossen. + +ALLGEMEINE BEDINGUNGEN + +Support. SUSE unterliegt keiner Verpflichtung, Unterstützung für die Software +zu leisten, die über die ausdrücklichen Bestimmungen der vorliegenden +Vereinbarung hinausgeht. +Bewertungstests. Diese Bewertungstest-Einschränkung ist für Sie relevant, wenn +Sie Software-Entwickler oder Lizenzgeber sind oder die Software im Auftrag +eines Software-Entwicklers oder Lizenzgebers testen. Ohne vorherige +schriftliche Zustimmung von SUSE, die nicht ungerechtfertigterweise verweigert +werden kann, sind Sie nicht berechtigt, die Ergebnisse eines Bewertungstests +dieser Software Dritten gegenüber bekanntzugeben oder zu veröffentlichen. Wenn +Sie Lizenzen für Produkte vergeben, die in der Funktion der Software ähnlich +sind oder ein Konkurrenzprodukt darstellen ("Ähnliche Produkte"), oder wenn +Sie im Namen eines solchen Lizenzgebers handeln und durch Veröffentlichung +oder Weitergabe von Vergleichsdaten gegen diese Einschränkung verstoßen, gilt +- ungeachtet eventuell anders lautender Bestimmungen im +Endbenutzer-Lizenzvertrag des ähnlichen Produkts und zusätzlich zu anderen, +SUSE eventuell zur Verfügung stehenden Gegenmaßnahmen - Folgendes: SUSE darf +Vergleichstests an den ähnlichen Produkten durchführen sowie die +Testergebnisse veröffentlichen und weitergeben. Durch Ihr Handeln bestätigen +Sie, dass Sie befugt sind, SUSE solche Rechte zu erteilen. +Open Source. Durch keine der hier aufgeführten Bedingungen werden Ihre Rechte +oder Verpflichtungen sowie die für Sie zutreffenden Bedingungen, die für Sie +im Rahmen aller zutreffenden Open Source-Lizenzen für den Open Source-Code in +dieser Software gelten, eingeschränkt oder anderweitig beeinflusst. +Kein Kaufzwang. Sie sind durch diese Beta-Vereinbarung nicht verpflichtet, +Lizenzen für die kommerziell erhältliche Version der Software zu erwerben. Ein +etwaiger Erwerb erfolgt durch eine formelle Bestellung. +Übertragung. Diese Beta-Vereinbarung darf ohne vorherige schriftliche +Genehmigung von SUSE nicht übertragen werden. +Recht und Rechtsprechung. Diese Beta-Vereinbarung unterliegt den Gesetzen des +US-Bundesstaates Utah. Bei jedweder Klage, die sich auf diese +Beta-Vereinbarung bezieht, sind die Gerichte des US-Bundesstaates Utah +zuständig. Sollte Ihr Hauptwohnsitz in einem Mitgliedsstaat der Europäischen +Union oder der Europäischen Freihandelszone liegen, gelten die Gesetze dieses +Landes. In diesem Fall sind bei jedweden Klagen die Gerichte des +entsprechenden Landes zuständig. +Gesamtvereinbarung. Diese Vereinbarung legt alle Absprachen und Festlegungen +zwischen Ihnen und SUSE dar und kann nur durch eine schriftliche +Einverständniserklärung zwischen Ihnen und einem autorisierten Vertreter von +SUSE geändert oder ergänzt werden. KEIN LIZENZGEBER, VERTEILER, FACHHÄNDLER, +HÄNDLER, WIEDERVERKÄUFER ODER VERKAUFSPERSONAL IST ZUM ÄNDERN DIESER +VEREINBARUNG ODER ZU ANGABEN ODER ZUSAGEN BERECHTIGT, DIE VON DEN BESTIMMUNGEN +DIESER VEREINBARUNG ABWEICHEN ODER DEN BESTIMMUNGEN DIESER VEREINBARUNG +HINZUGEFÜGT WERDEN. +Aufhebung. Ein Verzicht auf eines der in dieser Beta-Vereinbarung +festgehaltenen Rechte wird erst wirksam, wenn dieser schriftlich erfolgt und +von einem ordnungsgemäß bevollmächtigten Vertreter der zu bindenden Partei +unterschrieben ist. Ein Verzicht auf ein zuvor oder derzeit gültiges Recht, +der auf einen Vertragsbruch oder eine Unterlassung zurückzuführen ist, kann +nicht als Verzicht auf künftige Rechte erachtet werden, die sich aus dieser +Beta-Vereinbarung ergeben. +Abtrennbarkeit. Ist eine Bestimmung dieser Beta-Vereinbarung ungültig oder +nicht anwendbar, wird diese Bestimmung im notwendigen Umfang ausgelegt, +beschränkt, geändert oder notfalls abgetrennt, um die Ungültigkeit oder +Nichtdurchführbarkeit der Bestimmung zu beseitigen; die übrigen Bestimmungen +dieser Beta-Vereinbarung bleiben unberührt. +Exportbestimmungen. Alle im Zusammenhang mit dieser Vereinbarung zur Verfügung +gestellten Produkte oder technischen Informationen unterliegen möglicherweise +den US-Gesetzen zur Exportkontrolle sowie den Handelsgesetzen anderer Länder. +Die Parteien erkennen alle Ausfuhrkontrollbestimmungen an und erklären sich +damit einverstanden, alle für anstehende Exporte, Re-Exporte oder Importe +erforderlichen Lizenzen bzw. Klassifizierungen einzuholen. Die Parteien +erklären sich damit einverstanden, keine Ausfuhr oder Wiederausfuhr an Länder +vorzunehmen, für die derzeit ein Exportverbot der US-Behörden besteht oder +denen gemäß der US-Exportbestimmungen ein Embargo auferlegt wurde oder die als +terroristische Länder eingestuft wurden. Die Parteien verpflichten sich, die +im Lieferumfang enthaltenen Elemente nicht für die Herstellung verbotener +nuklearer oder chemisch-biologischer Waffen oder Lenkwaffen einzusetzen. Bitte +informieren Sie sich auf der Webseite des Bureau of Industry and Security +(www.bis.doc.gov), bevor Sie SUSE-Produkte aus den USA exportieren. Weitere +Informationen zur Ausfuhr von SUSE-Software finden Sie unter +https://www.suse.com/company/legal/. Auf Anfrage erhalten Sie von SUSE +spezielle Informationen zu den entsprechenden Beschränkungen. SUSE bernimmt +jedoch keine Haftung für Ihr Versäumnis, die notwendigen Ausfuhrgenehmigungen +einzuholen. Durch Installation, Herunterladen oder eine andere Nutzung der +Software, stimmen Sie der folgenden Aussage zu: Wir bestätigen, dass diese +Beat Test-/Evaluierungssoftware nur zu Beta-Testzwecken genutzt wird und nicht +verliehen, verkauft, unterlizenziert, zugewiesen oder auf andere Art und Weise +weitergereicht wird. Des Weiteren bescheinigen wir, dass wir keine Produkte, +Prozesse oder Services übertragen oder exportieren, bei denen es sich um das +unmittelbare Produkt dieser Beta-Testsoftware handelt. +Von der US-Regierung eingeschränkte Rechte. Die Verwendung, Vervielfältigung +oder Offenbarung unterliegt durch die Regierung der Vereinigten Staaten den +Einschränkungen in FAR 52.227-14 (Juni 1987) Alternate III (Juni 1987), FAR +52.227-19 (Juni 1987) oder DFARS 252.227-7013 (b)(3) (Nov 1995) bzw. den +zutreffenden nachfolgenden Bestimmungen. Vertragspartei/Hersteller ist SUSE +LLC, 404 Wyman Street, Waltham, MA 02415. +Sonstiges. Die Anwendung der Vertragskonventionen der Vereinten Nationen für +den internationalen Verkauf von Gütern wird ausdrücklich ausgeschlossen. + +(c) 2013 SUSE LLC bzw. deren Tochterunternehmen. Alle Rechte vorbehalten. +(020314) + + + diff --git a/live/root/usr/share/agama/eula/license.beta/license.es.txt b/live/root/usr/share/agama/eula/license.beta/license.es.txt new file mode 100644 index 0000000000..1bc2f45fbe --- /dev/null +++ b/live/root/usr/share/agama/eula/license.beta/license.es.txt @@ -0,0 +1,323 @@ +Acuerdo de licencia de usuario final de SUSE(r) para software versión beta + +LEA ESTE ACUERDO BETA CON ATENCIÓN. POR EL HECHO DE INSTALAR, DESCARGAR O +UTILIZAR EL SOFTWARE, USTED EXPRESA SU CONFORMIDAD CON LOS TÉRMINOS DE ESTE +ACUERDO BETA, ASÍ COMO CON LOS DE CUALQUIER ACUERDO DE LICENCIA ADICIONAL DE +SUSE INCLUIDO CON EL MISMO. SI NO ESTÁ CONFORME CON ESTOS TÉRMINOS, NO +DESCARGUE, INSTALE NI UTILICE EL SOFTWARE. NO ESTÁ PERMITIDO VENDER, +TRANSFERIR NI DISTRIBUIR EL SOFTWARE SIN PERMISO PREVIO POR ESCRITO DE SUSE. + +Este Acuerdo de licencia de usuario final de software versión beta de SUSE +("Acuerdo Beta"), conjuntamente con cualquier acuerdo de licencia de SUSE +adicional incluido con el software, constituye un contrato legal vinculante +entre usted (persona física o jurídica) y SUSE LLC . ("SUSE"). El producto de +software que acompaña este acuerdo Beta, las actualizaciones de software, el +soporte físico (si lo hubiera) y la documentación impresa o en línea adjunta +(denominados colectivamente "el Software") están protegidos por las leyes y +los tratados de copyright de Estados Unidos y de otros países, estando sujetos +a los términos y condiciones de este acuerdo Beta. Si no está conforme con los +términos de este Acuerdo Beta, no descargue, instale ni utilice el Software y, +si procede, devuelva el paquete completo sin utilizar a SUSE. El Software se +le ha cedido bajo licencia a Usted, pero no se le ha vendido. + +El Software puede incluir o estar incluido en un paquete con otros programas +de software cuya licencia contenga términos distintos o haya sido otorgada por +otro licenciador distinto de SUSE. Los términos de un Acuerdo de licencia del +usuario final que acompañen a un archivo de software concreto al instalar o +descargar el software sustituirán a los términos que se presentan a +continuación. Los programas de software de otros fabricantes que se incluyen +se utilizarán a discreción del usuario. SUSE no se hace responsable del +software de otros fabricantes ni del uso que Usted haga del mismo. + +El Software debe incluir componentes que sean paquetes de código abierto, +desarrollados de manera independiente, y acompañados por diferentes términos +de licencia. Sus derechos de licencia con respecto a cada uno de los +componentes que vienen acompañados por sus propias condiciones de licencia +están definidos por dichas condiciones. Ninguna de las disposiciones de este +Acuerdo restringirá, limitará ni afectará de modo alguno a los derechos y a +las obligaciones que Usted pueda contraer ni a las condiciones a las que Usted +puede estar sujeto por las condiciones de esta licencia. Aunque los términos +de la licencia de un componente le autoricen a distribuir el componente, no +podrá emplear ninguna marca de SUSE (por ejemplo, SUSE o SUSE LINUX) al +distribuir el componente, independientemente de que el componente incluya o no +marcas de SUSE. + +Licencia. Según los términos y condiciones de este Acuerdo Beta, SUSE le +otorga el derecho, no exclusivo e intransferible, de reproducir y utilizar +dentro de su organización dicho Software durante la vigencia especificada a +continuación, en la cantidad que sea razonablemente necesaria para realizar su +evaluación y/o prueba del Software. + +Si se incluye dentro del Software o se proporciona junto al Software un +producto SUSE separado al producto proporcionado para realizar pruebas de la +versión beta, independientemente de lo establecido en los derechos del acuerdo +de licencia que acompañe a la copia del producto SUSE separado, Usted se +compromete a usar el producto SUSE separado exclusivamente con fines de +evaluación del Software y siempre de forma conjunta con el Software. Su +derecho a utilizar el software SUSE separado quedará rescindido con la +rescisión del Acuerdo Beta como se especifica a continuación. + +Término. Este Acuerdo de software versión beta entra en vigor en la fecha en +que adquiera legalmente el software, y mantendrá su vigencia hasta su +vencimiento tal y como se indica a continuación. Este Acuerdo Beta caducará +(i) en el plazo de 90 días a partir de la fecha de instalación del Software; +(ii) cuando se produzca el lanzamiento de la siguiente versión preliminar, si +la hubiera, del Software; (iii) cuando SUSE comience a comercializar el +Software; (iv) cuando cualquiera de las partes notifique a la otra por escrito +su voluntad de resolver el presente acuerdo; o bien (v) en la fecha en que +Usted incumpla cualquiera de los términos de este Acuerdo Beta (lo que antes +se produzca). Tras la rescisión de este Acuerdo Beta, deberá dejar de utilizar +el Software, devolver a su estado original cualquier acción llevada a cabo por +el Software, destruir o devolver a SUSE el Software original y todas sus +copias, y eliminar el Software completamente de sus sistemas. + +Calidad de versión preliminar. Dado que la calidad del Software es propia de +una versión preliminar, no debe utilizarlo en un sistema comercial o de +producción. El Software no ha sido plenamente comprobado, y puede contener +errores y omisiones. El Software debe utilizarse únicamente en un entorno +experimental. SUSE no garantiza que se vaya a poner a disposición del público +general una versión comercial del Software, que se vayan a cumplir los plazos +anunciados ni que se vayan a lanzar productos asociados. Todo riesgo derivado +del uso que Usted haga del Software queda enteramente bajo su responsabilidad. +El Software podría contener un mecanismo de desactivación automática que +impida su utilización después de un determinado período de tiempo, por lo que +el Usuario deberá realizar una copia de seguridad del sistema y adoptar otras +medidas para evitar la pérdida de archivos o datos. La utilización del +Software correrá por propia cuenta y riesgo del Usuario. + +Confidencialidad. (Esta sección le es aplicable siempre que SUSE no haya +publicado el Software para los usuarios en general como una versión beta +abierta sin tener ninguna obligación de confidencialidad). El Software y todos +los conceptos en él contenidos, junto con la documentación y los materiales, +funciones del producto, resultados de prueba y evaluación, resultados de +pruebas comparativas, plazos, contraseñas y números PIN, y cualquier otra +información relacionada son propiedad y tienen información confidencial sobre +SUSE y sus proveedores y en el presente documento forman parte de lo que se +conoce como "Información confidencial". Por la presente, Usted se compromete a +no divulgar ni proporcionar ninguna Información confidencial a terceros, ni a +utilizar la Información confidencial para ningún fin que no sea la realización +de pruebas o la evaluación del Software y el envío de sus comentarios a SUSE. +Si se le proporcionara una contraseña o número de identificación personal +(PIN) para acceder a sitios restringidos, se compromete a no divulgar la +contraseña ni el número PIN a terceros. Sus obligaciones de confidencialidad +conservarán su validez tras el vencimiento de este Acuerdo Beta, hasta que +SUSE haga dicha información de conocimiento público. + +Comentarios. Usted entiende y admite que SUSE utilice cualquier comentario o +información que nos proporcione y, en virtud del presente acuerdo, autoriza a +SUSE de manera perpetua e irrevocable a utilizar sus comentarios e información +para los propósitos que SUSE considere oportuno sin obligación de remunerarle +por ello, siempre y cuando SUSE no haga mención pública de su nombre con +relación a ellos. Manifiesta y garantiza que sus comentarios e información no +incluirán información confidencial o exclusiva de su propiedad o de propiedad +de terceros, y que Usted está plenamente capacitado para otorgar la +autorización mencionada en el párrafo precedente. + +Restricciones de la licencia. SUSE se reserva todos los derechos que no se le +otorguen expresamente. No puede: (1) aumentar, bajo ningún concepto, el número +de conexiones que admite el Software y que se le han concedido bajo licencia +ni admitir más de una conexión o usuario a través de una única conexión; (2) +realizar ingeniería inversa, descompilar o desensamblar el Software excepto en +la medida en que lo permita expresamente la ley vigente; (3) modificar, +cambiar, alquilar o compartir el Software o conceder una licencia secundaria +de alguno de los derechos establecidos en este Acuerdo Beta; ni (4) transferir +el Software o los derechos de licencia de este Acuerdo Beta total o +parcialmente. + +SITIOS DE PRUEBAS BETA AUTORIZADOS + +Si ha sido designado como sitio de pruebas beta autorizado para el Software, +serán de aplicación en su caso los siguientes términos y condiciones. Para +solicitar su inclusión como sitio de pruebas de la versión beta autorizado, +póngase en contacto on el gestor del programa beta de SUSE por correo +electrónico en beta-programs@suse.com. SUSE podrá modificar en todo +momento las ventajas y beneficios ofrecidos con solo publicar dichas +modificaciones en el sitio Web de SUSE correspondiente. + +Asistencia. SUSE proporcionará asistencia directa para el Software conforme a +la oferta de asistencia de SUSE vigente en ese momento para los sitios de +pruebas beta autorizados del sitio correspondiente, tal y como se haya +expuesto en el sitio Web de SUSE aplicable y se haya comunicado al gestor del +programa beta de SUSE para el Software. Esta asistencia podrá proporcionarse +mediante herramientas basadas en Web, correo electrónico o por teléfono. SUSE +le proporcionará todas las direcciones Web, direcciones de correo electrónico +y números de asistencia telefónica que sean necesarios. + +Prueba. Por la presente, Usted acepta realizar y completar a sus expensas +todos los programas de pruebas proporcionados por SUSE durante el período de +pruebas beta, y a probar íntegramente el Software mediante otras pruebas que +se consideren útiles o necesarias. Asimismo, acepta asignar los recursos de +hardware, software y humanos necesarios para realizar las pruebas adecuadas y +cumplir los requisitos aquí expuestos. Como mínimo, acepta realizar al menos +cuatro horas de pruebas a la semana durante el período de pruebas beta. +Durante todas las pruebas, deberá prestarse especial atención a la +funcionalidad, la precisión, la uniformidad y la facilidad de uso del Software +que se esté verificando en cada prueba, así como a la documentación asociada. +Los resultados de todos los programas de pruebas y de otros tipos de pruebas, +incluidas todas las sugerencias, incoherencias y/o problemas, deben +comunicarse detalladamente y con precisión (incluida la configuración del +sistema, etc.) y enviarse a SUSE cada semana, utilizando para ello el método +de elaboración de informes y/o las herramientas proporcionados y/o +especificados por SUSE. Estos métodos y herramientas pueden incluir (aunque su +enumeración no debe considerarse como limitación) herramientas basadas en Web, +correo electrónico, fax, correo postal o teléfono. Para que los errores puedan +resolverse con prontitud, se compromete a informar de todos los problemas +encontrados en el Software en un plazo de dos (2) días después de haberlos +detectado, incluso en los casos en los que no esté seguro de que se trate de +un error. Si se le solicita, también está conforme con presentar un informe +escrito al final del período de pruebas beta que resuma las pruebas +realizadas, sus impresiones generales sobre el Software y los usos potenciales +del Software en su entorno. Es posible que reciba cuestionarios sobre el +rendimiento de los programas de pruebas y otros aspectos del Software; está de +acuerdo con completarlos y devolverlos en la fecha y el formato especificados. + +DERECHOS DE TITULARIDAD + +El presente Acuerdo no supone la cesión o transferencia de la titularidad o +propiedad sobre el Software. SUSE y/o sus licenciadores poseen y mantienen la +titularidad y propiedad de todos los derechos de propiedad intelectual +especificados en el Software, lo cual incluye cualquier copia o adaptación del +mismo. El Usuario únicamente adquiere una licencia para utilizar el Software. + +RENUNCIA DE GARANTÍA + +EL SOFTWARE Y OTRA INFORMACIÓN CONFIDENCIAL SE SUMINISTRA "TAL CUAL", SIN +NINGÚN TIPO DE GARANTÍA. EL USO DE LOS RESULTADOS Y DEL RENDIMIENTO DE LA +INFORMACIÓN CONFIDENCIAL CORRE EXCLUSIVAMENTE DE SU CUENTA Y RIESGO. SUSE +DECLINA TODA GARANTÍA EXPLÍCITA O IMPLÍCITA, INCLUIDAS (AUNQUE SU ENUMERACIÓN +NO DEBE CONSIDERARSE EN MODO ALGUNO COMO LIMITACIÓN) LAS GARANTÍAS IMPLÍCITAS +DE COMERCIABILIDAD, IDONEIDAD PARA DETERMINADO PROPÓSITO, TITULARIDAD Y NO +CONTRAVENCIÓN. SUSE NO GARANTIZA QUE EL SOFTWARE SATISFARÁ SUS NECESIDADES, NI +QUE SU FUNCIONAMIENTO SEA ININTERRUMPIDO. Algunas jurisdicciones no permiten +ciertas exclusiones y limitaciones de garantías, por lo que algunas de las +limitaciones anteriores pueden no ser aplicables en su caso. Esta garantía +limitada proporciona al Usuario derechos específicos, pero el Usuario también +puede tener otros derechos adicionales dependiendo de su lugar de residencia. + +Productos que no son de SUSE. El Software puede incluir o estar incluido en +hardware u otros programas de software licenciados o vendidos por un +licenciatario distinto de SUSE. SUSE NO GARANTIZA LOS PRODUCTOS NO +PERTENECIENTES A SUSE. CUALQUIER PRODUCTO DE ESTAS CARACTERÍSTICAS SE +PROPORCIONA "TAL CUAL". LA RESPONSABILIDAD DE PROPORCIONAR CUALQUIER SERVICIO +DE GARANTÍA PARA PRODUCTOS NO FABRICADOS POR SUSE CORRESPONDERÁ AL +LICENCIATARIO DEL PRODUCTO, SEGÚN LA GARANTÍA APLICABLE DEL LICENCIATARIO. + +LIMITACIÓN DE RESPONSABILIDAD + +Pérdidas consecuentes. NI SUSE NI NINGUNO DE SUS LICENCIATARIOS, EMPRESAS +SUBSIDIARIAS NI EMPLEADOS SERÁN RESPONSABLES DE NINGÚN DAÑO ESPECIAL, +EMERGENTE, DIRECTO, INDIRECTO, ILÍCITO, ECONÓMICO NI PUNITIVO QUE SE PRODUZCA +COMO RESULTADO DEL USO O LA INCAPACIDAD PARA UTILIZAR EL SOFTWARE, INCLUIDOS, +PERO NO LIMITADOS A LAS PÉRDIDAS DE BENEFICIOS, NEGOCIOS O DATOS, INCLUSO EN +EL CASO DE HABER RECIBIDO ADVERTENCIA PREVIA DE LA POSIBILIDAD DE QUE SE +PRODUJERAN DICHOS DAÑOS. +Daños directos. LA RESPONSABILIDAD CONJUNTA DE SUSE POR DAÑOS DIRECTOS A +PROPIEDADES O PERSONAS (YA SEA EN UN PROCESO INDIVIDUAL O EN UNA SERIE DE +PROCESOS) EN NINGÚN CASO SERÁ SUPERIOR A 1,25 VECES LA CANTIDAD PAGADA POR EL +USUARIO POR EL SOFTWARE CAUSANTE DE LA RECLAMACIÓN [O 50 DÓLARES AMERICANOS SI +EL SOFTWARE SE PROPORCIONÓ DE FORMA GRATUITA]. Las exclusiones y limitaciones +anteriores no serán aplicables a las reclamaciones relacionadas con +fallecimientos o daños personales. En aquellas jurisdicciones en las que no se +permita la exclusión o limitación de daños, la responsabilidad de SUSE se +limitará o excluirá en la mayor medida en que se permita en esas +jurisdicciones. + +TÉRMINOS GENERALES + +Asistencia. SUSE no tiene obligación de proporcionar asistencia para el +Software, excepto en la medida en que el presente Acuerdo Beta así lo +estipule. +Evaluación comparativa. Esta restricción para evaluación comparativa es +aplicable a Usted si es desarrollador o licenciador de software, o si evalúa +el Software bajo la supervisión de un desarrollador o licenciador de software +o en su nombre. El Usuario no podrá publicar ni revelar a ningún tercero los +resultados de la evaluación comparativa del Software sin consentimiento previo +por escrito de SUSE, consentimiento que no se demorará de forma injustificada. +Si el Usuario es otorgante de licencias de productos que sean funcionalmente +similares o que compitan con el Software ("Productos similares"), o si actúa +en representación de tales otorgantes de licencia, y publica o divulga +información de evaluación comparativa del Software infringiendo esta +restricción, aunque el acuerdo de licencia del usuario final del Producto +similar indique lo contrario y además de otros recursos de los que SUSE +disponga, SUSE tendrá derecho a realizar la evaluación comparativa con los +Productos similares, así como a divulgar y publicar la información de dicha +evaluación comparativa. Por la presente, el Usuario manifiesta que tiene +autoridad para otorgar tal derecho a SUSE. +Código abierto. Nada de lo establecido en este Acuerdo restringirá, limitará o +afectará de ningún otro modo a los derechos u obligaciones que Usted pueda +tener, ni a las condiciones a las que pueda estar sujeto, bajo cualquier +licencia de código abierto aplicable a todo código abierto que contenga este +Software. +Sin compromiso de compra. Bajo ningún concepto deberá interpretarse que +Acuerdo de software versión beta represente un compromiso de su parte de +adquirir licencias de la versión comercial del Software. Dicha adquisición +deberá estar documentada por la expedición de un pedido de compra oficial. +Transferencia. Este Acuerdo Beta no se puede transferir ni ceder sin el +consentimiento previo por escrito de SUSE. +Legislación y jurisdicción. Este Acuerdo de software versión beta se regirá +por las leyes del Estado de Utah, EE.UU. Cualquier acción legal relacionada +con este Acuerdo de software versión beta se resolverá en los juzgados de la +jurisdicción competente del Estado de Utah. No obstante, si su país de +residencia principal es un estado miembro de la Unión Europea o de la +Asociación Europea de Libre Comercio, este Acuerdo de software versión beta se +regirá por las leyes de dicho país, y toda acción legal se resolverá en los +juzgados de la jurisdicción competente del mismo. +Acuerdo completo. Este Acuerdo establece el total entendimiento y acuerdo +entre el Usuario y SUSE, y solo se puede modificar mediante un acuerdo por +escrito en el que el Usuario y un representante autorizado de SUSE muestren su +acuerdo. NINGÚN LICENCIATARIO, DISTRIBUIDOR, PROVEEDOR, MINORISTA, REVENDEDOR, +COMERCIAL NI EMPLEADO ESTÁ AUTORIZADO A MODIFICAR ESTE ACUERDO NI A REALIZAR +NINGUNA GARANTÍA O PROMESA QUE CONTRADIGA O AMPLÍE LOS TÉRMINOS DE ESTE +ACUERDO. +Renuncia. En ningún caso, la renuncia a cualquiera de los derechos estipulados +en el presente Acuerdo de software versión beta será efectiva si no está +debidamente documentada por escrito y firmada por un representante debidamente +autorizada de la parte pertinente. Ninguna renuncia a cualquier derecho pasado +o presente, derivada de cualquier infracción o incumplimiento, deberá +interpretarse como una renuncia a los derechos futuros derivados del presente +Acuerdo de software versión beta. +Omisión. Si cualquiera de las disposiciones contenidas en el presente Acuerdo +de software versión beta no fuera válida o ejecutable, dicha disposición será +interpretada, limitada, modificada o, si procede, omitida, en la medida en que +sea necesario para eliminar su falta de validez u obligatoriedad, mientras que +el resto de las disposiciones de este Acuerdo de software versión beta +permanecerán inalteradas. +Cumplimiento de normativas de exportación. Los productos o la información +técnica que se proporcionan bajo este Acuerdo pueden estar sujetos a los +controles de exportación de Estados Unidos o a la legislación sobre comercio +de otros países. Las partes aceptan acatar las regulaciones de los controles +de exportaciones y obtener todas las licencias necesarias para exportar, +reexportar o importar bienes. Las partes se abstendrán de exportar o +reexportar a aquellas entidades a las que EE. UU. haya prohibido exportar, a +cualquier país objeto de embargo o a los países que apoyan actividades +terroristas, según lo estipulado en la legislación en materia de exportación +de Estados Unidos. Las partes se comprometen a no utilizar los productos para +fines prohibidos, como la fabricación de misiles, así como armamento nuclear o +químico-biológico. Puede consultarse la página Web de la Oficina de Industria +y Seguridad www.bis.doc.gov antes de exportar productos de SUSE desde EE. UU. +Consulte https://www.suse.com/company/legal/ para obtener más información +sobre la exportación de software de SUSE. Si se solicita, SUSE proporcionará +información específica acerca de las restricciones aplicables. No obstante, +SUSE no asumirá responsabilidad alguna en caso de que el Usuario no obtenga +las aprobaciones de exportación necesarias. Por el hecho de instalar, +descargar o utilizar el software, se considera que Usted realiza esta +declaración: Certificamos que este software versión beta de evaluación/prueba +se utilizará sólo con el fin de probar la versión beta y no se alquilará, +arrendará, venderá, sublicenciará, asignará ni transferirá en modo alguno. +Además, certificamos que no transferiremos ni exportaremos ningún producto, +proceso o servicio que sea un producto directo del software versión beta de +prueba. +Derechos restringidos del Gobierno de Estados Unidos. El uso, la duplicación o +la revelación por parte del Gobierno de EE. UU. dependerá de las restricciones +de FAR 52.227-14 (junio de 1987) alternativa III (junio de 1987), FAR +52.227-19 (junio de 1987) o DFARS 252.227-7013 (b) (3) (noviembre de 1995), o +bien las cláusulas sustitutivas correspondientes. El contratista/fabricante es +SUSE LLC 404 Wyman Street, Waltham, MA 02415, Estados Unidos. +Otros. Se excluye expresamente la aplicación de la Convención de las Naciones +Unidas relativa a contratos para la venta internacional de artículos. + +(c) 2013 SUSE LLC o sus afiliados. Reservados todos los derechos. +(020314) + + + diff --git a/live/root/usr/share/agama/eula/license.beta/license.fr.txt b/live/root/usr/share/agama/eula/license.beta/license.fr.txt new file mode 100644 index 0000000000..281b65747b --- /dev/null +++ b/live/root/usr/share/agama/eula/license.beta/license.fr.txt @@ -0,0 +1,320 @@ +Contrat de licence utilisateur final SUSE(r) pour logiciel Bêta + +LISEZ ATTENTIVEMENT LE PRÉSENT CONTRAT BÊTA. EN INSTALLANT, EN TÉLÉCHARGEANT +OU EN UTILISANT LE LOGICIEL, VOUS ACCEPTEZ LES TERMES DU PRÉSENT CONTRAT BÊTA +ET TOUT CONTRAT DE LICENCE SUSE SUPPLÉMENTAIRE FOURNI AVEC LE LOGICIEL. SI +VOUS N'ACCEPTEZ PAS CES TERMES, NE TÉLÉCHARGEZ PAS, N'INSTALLEZ PAS ET +N'UTILISEZ PAS LE LOGICIEL. CE LOGICIEL NE PEUT ÊTRE REVENDU, TRANSFÉRÉ OU +REDISTRIBUÉ SANS LE CONSENTEMENT PRÉALABLE ÉCRIT DE SUSE. + +Le présent Contrat de licence utilisateur final SUSE pour logiciel Bêta +(ci-après dénommé " Contrat Bêta "), ainsi que tout Contrat de licence SUSE +supplémentaire fourni avec le Logiciel constituent un contrat légal conclu +entre vous-même, personne physique ou morale (" Vous ") et SUSE LLC (ci-après +dénommé " SUSE "). Les produits logiciels, les mises à jour logicielles, tout +support (le cas échéant) et toute documentation en ligne ou imprimée +accompagnant le présent Contrat Bêta (dénommés collectivement le " Logiciel ") +sont protégés par les lois et traités sur les droits sur le copyright en +vigueur aux États-Unis et dans d'autres pays et sont soumis aux termes du +présent Contrat Bêta. Si Vous n'acceptez pas les termes du présent Contrat +Bêta, ne téléchargez pas, n'installez pas et n'utilisez pas le Logiciel, et le +cas échéant, renvoyez l'intégralité du produit inutilisé à SUSE. Le Logiciel +vous est concédé sous licence. Il ne vous est pas vendu. + +Le Logiciel peut inclure ou faire partie d'une offre groupée qui comprend +d'autres logiciels concédés sous licence régis par d'autres clauses et/ou +concédés sous licence par un autre Fournisseur de licence que SUSE. Les termes +d'un Contrat de licence utilisateur final accompagnant un fichier logiciel +donné lors de l'installation ou du téléchargement du logiciel annulent et +remplacent les termes présentés ci-dessous. Vous avez toute liberté d'utiliser +les programmes logiciels tiers fournis. SUSE ne pourra être tenu responsable +d'aucun logiciel de fabricants tiers, ni de l'utilisation que vous en faites. + +Le Logiciel peut inclure des composants à source ouverte, mis au point de +manière indépendante et accompagnés de conditions de licence distinctes. Vos +droits de licence concernant les différents composants accompagnés de +conditions de licence distinctes sont définis par lesdites conditions ; rien +dans le présent Contrat ne restreint, limite ou affecte de toute autre façon +des droits ou obligations que vous pouvez avoir en vertu desdites conditions +de licence. Si les conditions de licence d'un composant Vous autorisent à le +distribuer, Vous ne devez utiliser aucune des marques SUSE (par ex. SUSE et +SUSE LINUX) lors de la distribution du composant, que le composant contienne +ou non des marques SUSE. + +Licence. Conformément aux termes et conditions du présent Contrat Bêta, SUSE +Vous accorde un droit non exclusif et non transférable de reproduction et +d'utilisation en interne du Logiciel pour la durée spécifiée ci-dessous et ce, +dans la quantité nécessaire raisonnable pour Vous permettre d'exécuter votre +évaluation et/ou de tester le Logiciel. + +Si un produit SUSE distinct du produit fourni à des fins de test Bêta est +inclus dans ou avec le Logiciel, alors nonobstant les droits de licence du +Contrat de licence accompagnant la copie du produit SUSE distinct, vous +acceptez d'utiliser le produit SUSE distinct uniquement dans le cadre de votre +évaluation du Logiciel. Votre droit d'utiliser le Logiciel du produit SUSE +prend fin à l'expiration du Contrat Bêta comme spécifié ci-dessous. + +Termes et conditions d'utilisation. Le présent Contrat Bêta prend effet à +compter de la date à laquelle Vous acquérez légalement le Logiciel et reste en +vigueur jusqu'à sa résiliation de la manière énoncée ci-après. Le présent +Contrat Bêta se termine au plus tôt : (i) après 90 jours à compter de la date +d'installation du Logiciel, (ii) lors de la publication de la version suivant +la version préliminaire du Logiciel, le cas échéant, (iii) à la première +expédition commerciale du Logiciel par SUSE, (iv) après notification écrite de +résiliation par l'une des parties, ou (v) à la date à laquelle Vous enfreignez +l'un des termes du présent Contrat Bêta. À l'expiration du présent Contrat +Bêta, Vous devez cesser d'utiliser le Logiciel, restituer à son état d'origine +toute action exécutée par le Logiciel, détruire l'original et toutes les +copies du Logiciel ou retourner ceux-ci à SUSE et supprimer intégralement le +Logiciel de vos systèmes. + +Qualité de la Version préliminaire. La qualité du logiciel étant celle d'une +version préliminaire, Vous n'êtes pas autorisé à l'utiliser au sein d'un +système commercial ou productif. Comme le Logiciel n'a pas été entièrement +testé, il est susceptible de contenir des erreurs et des omissions. Le +Logiciel ne doit être utilisé que dans un environnement de test. SUSE ne +garantit pas qu'une version commerciale du Logiciel sera mise à la disposition +du grand public, que les dates de lancement prévues seront respectées ou que +des produits associés seront publiés. Vous assumez intégralement le risque +entraîné par l'utilisation du Logiciel. Le Logiciel peut contenir un mécanisme +de désactivation automatique qui empêche toute utilisation après une certaine +période. Vous devez donc sauvegarder votre système et prendre d'autres mesures +pour éviter toute perte de fichiers ou de données. L'utilisation du logiciel +se fait à vos propres risques. + +Confidentialité. (Cette section ne s'applique qu'à Vous, sauf si SUSE a mis le +Logiciel à la disposition du grand public en tant que version Bêta gratuite, +sans obligation de confidentialité.) Le Logiciel et tous les concepts inclus, +la documentation et les matériels qui l'accompagnent, les caractéristiques de +produits, les résultats de tests et d'évaluation, les résultats des bancs +d'essai, les dates cibles, les numéros d'identification et mots de passe, +ainsi que toutes les informations associées sont des données confidentielles +appartenant à SUSE et à ses fournisseurs et sont dénommées ci-après " +Informations confidentielles ". Vous acceptez de ne pas divulguer ni fournir +des Informations confidentielles à un tiers, ni utiliser les Informations +confidentielles dans un autre but qu'un test ou une évaluation du Logiciel et +la fourniture de commentaires à SUSE. Si Vous avez reçu un numéro +d'identification ou un mot de passe pour accéder à des sites restreints, Vous +acceptez de ne pas divulguer ce numéro d'identification et ce mot de passe à +un tiers. Vos obligations de confidentialité subsisteront après l'expiration +de ce Contrat Bêta, jusqu'a la date de divulgation de ces informations au +public par SUSE. + +Commentaires. Vous reconnaissez et acceptez que SUSE ait le droit d'utiliser +tout commentaire et toute information que Vous lui fournissez et Vous accordez +de ce fait à SUSE un droit perpétuel et irrévocable d'utiliser tous ces +commentaires et informations dans quelque but que ce soit, sans compensation +pour Vous, à condition que SUSE ne cite pas votre nom publiquement en relation +avec ces informations. Vous déclarez et garantissez que ces commentaires et +informations ne contiendront pas d'informations personnelles ni +confidentielles appartenant à Vous-même ou à un tiers et que Vous êtes dûment +habilité à concéder le droit mentionné ci-dessus. + +Limitations du Contrat de licence. SUSE se réserve tous les droits qui ne Vous +sont pas expressément accordés. Vous n'êtes pas autorisé à : (1) augmenter, +par quelque moyen que ce soit, le nombre de connexions prises en charge par le +Logiciel et pour lesquelles Vous détenez une licence ou à prendre en charge +plusieurs connexions ou utilisateurs via une connexion unique ; (2) décompiler +ou désassembler le Logiciel ou pratiquer sur ce dernier l'ingénierie à rebours +sauf dans la mesure où ces opérations seraient expressément autorisées par la +législation en vigueur ; (3) modifier, altérer, louer, louer à bail ou +exploiter en temps partagé le logiciel, ou céder les droits que le présent +Contrat vous confère ; ou (4) transférer le Logiciel ou les droits de licence +que vous confère le présent Contrat, en partie ou dans leur intégralité. + +SITES DE TEST BÊTA AGRÉÉS + +Si Vous avez été désigné comme Site de Test Bêta Agréé pour le Logiciel, les +modalités et conditions suivantes Vous sont applicables. Si vous souhaitez que +votre site fasse office de Site de Test Bêta Agréé, contactez le Directeur du +Programme d'évaluation SUSE en envoyant un message électronique à l'adresse +beta-programs@suse.com. SUSE a le droit de modifier a tout moment les +avantages qui Vous sont offerts en publiant les nouvelles conditions de ces +avantages sur le site Web SUSE concerné. + +Support. SUSE fournira un support direct pour le Logiciel conformément à son +offre de support actuelle aux Sites de Test Bêta Agréés pour le Logiciel en +question, tel qu'il est spécifié sur le site Web SUSE applicable et communiqué +par le Directeur du Programme Bêta de SUSE pour le Logiciel. Ce support peut +être facilité par des outils basés sur le Web, la messagerie électronique +et/ou le téléphone. SUSE vous fournira toutes les adresses Internet, les +adresses électroniques et les numéros de téléphone nécessaires pour contacter +le support. + +Test. Vous acceptez d'exécuter à vos frais tous les programmes de test fournis +par SUSE pendant toute la période de test Bêta et de tester intégralement le +Logiciel en effectuant d'autres tests jugés utiles ou nécessaires. Vous +acceptez de mettre à disposition le matériel, les logiciels et le personnel +nécessaires pour exécuter les tests adéquats et répondre aux exigences de +ceux-ci. Vous acceptez d'effectuer au moins quatre heures-personnes de test +par semaine pendant la période de test Bêta. Pendant la durée du test, une +attention particulière devra être accordée à la fonctionnalité, à la +précision, à la cohérence et à la facilité d'utilisation du Logiciel soumis à +chaque test, ainsi qu'à toute documentation associée. Les résultats de tous +les programmes de test et d'autres tests, y compris l'ensemble des +suggestions, incohérences et/ou problèmes doivent être consignés dans les +moindres détails (y compris la configuration système, etc.) et soumis à SUSE +sur une base hebdomadaire à l'aide de la méthode de création de rapports et/ou +d'outils fournis et/ou spécifiés par SUSE. Ces méthodes et outils peuvent +inclure des outils basés sur le Web, la messagerie électronique, le fax, US +Mail et/ou le téléphone, mais sans se limiter à ceux-ci. Afin de permettre des +réparations rapides, Vous acceptez de rapporter tous les problèmes décelés +dans le Logiciel dans les deux (2) jours qui suivent la découverte du +problème, que Vous soyez ou non certain que l'incident soit à l'origine d'une +erreur ou d'un bogue. Si Novell Vous le demande, Vous acceptez de produire un +rapport écrit à la fin de la période de test bêta, en récapitulant les tests +effectués, les impressions générales sur le Logiciel et les utilisations +potentielles envisagées du Logiciel dans votre environnement. Vous êtes +susceptible de recevoir des questionnaires relatifs aux performances de +programmes de test et d'autres aspects du Logiciel, que Vous acceptez de +compléter et de retourner à la date et sur le support spécifiés. + +DROITS DE PROPRIÉTÉ + +Un titre de propriété ou un droit de propriété sur le Logiciel ne vous est en +aucun cas transféré. SUSE et/ou ses fournisseurs de licence conservent tous +les droits de propriété intellectuelle attachés au Logiciel, y compris ceux +portant sur toute adaptation ou copie du Logiciel. Vous n'acquérez qu'une +licence d'utilisation du Logiciel. + +EXCLUSION DE GARANTIE + +LE LOGICIEL ET LES AUTRES INFORMATIONS CONFIDENTIELLES VOUS SONT FOURNIS " EN +L'ÉTAT ", SANS AUCUNE GARANTIE D'AUCUNE SORTE. VOUS ASSUMEZ INTÉGRALEMENT LE +RISQUE LIÉ AUX RÉSULTATS ET À L'UTILISATION DES INFORMATIONS CONFIDENTIELLES. +SUSE DÉCLINE TOUTE GARANTIE EXPRESSE OU IMPLICITE RELATIVE AU LOGICIEL, Y +COMPRIS, MAIS SANS CARACTÈRE LIMITATIF, TOUTE GARANTIE IMPLICITE DE QUALITÉ +MARCHANDE, D'ADÉQUATION À UN USAGE PARTICULIER, DE PROPRIÉTÉ ET DE +NON-CONTREFAÇON. SUSE NE GARANTIT PAS QUE LE LOGICIEL SATISFERA À VOS +EXIGENCES OU QU'IL FONCTIONNERA SANS INTERRUPTION. Certaines juridictions +n'autorisent pas certaines exclusions ou limitations de garantie. Par +conséquent, il se peut qu'une partie des limitations susmentionnées ne vous +soient pas applicables. La présente garantie limitée vous octroie des droits +spécifiques. En outre, il se peut que vous disposiez également d'autres droits +qui peuvent varier d'un état à l'autre. + +Produits non-SUSE. Le Logiciel peut inclure ou être regroupé avec du matériel +ou d'autres programmes logiciels concédés sous licence ou vendus par un autre +fournisseur de licence que SUSE. SUSE NE FOURNIT AUCUNE GARANTIE POUR LES +PRODUITS AUTRES QUE SES PROPRES PRODUITS. CES PRODUITS SONT FOURNIS " EN +L'ÉTAT ". TOUTE GARANTIE ÉVENTUELLE SUR LES PRODUITS NON-SUSE PEUT UNIQUEMENT +ÊTRE DONNÉE, LE CAS ÉCHÉANT, PAR LE FOURNISSEUR DE LICENCE DE CES PRODUITS. + +LIMITATION DE RESPONSABILITÉ + +Préjudices indirects. SUSE, SES FOURNISSEURS DE LICENCE, FILIALES OU EMPLOYÉS, +NE POURRONT EN AUCUN CAS ÊTRE TENUS RESPONSABLES DES PRÉJUDICES SPÉCIAUX, +ACCESSOIRES, INDIRECTS, DÉLICTUELS, ÉCONOMIQUES OU DOMMAGES-INTÉRÊTS +EXEMPLAIRES, RÉSULTANT DE L'UTILISATION DU LOGICIEL OU DE L'IMPOSSIBILITÉ DE +L'UTILISER, Y COMPRIS, NOTAMMENT, EN CAS DE PERTE FINANCIÈRE, DE MANQUE À +GAGNER OU DE PERTES DE DONNÉES ET CE, INDÉPENDAMMENT DU CARACTÈRE PRÉVISIBLE +OU NON DE TELS PRÉJUDICES. +Préjudices directs. EN AUCUN CAS LA RESPONSABILITÉ GLOBALE DE SUSE POUR DES +DOMMAGES DIRECTS AUX BIENS OU AUX PERSONNES (QU'IL S'AGISSE D'UN CAS OU DE +PLUSIEURS CAS) NE DÉPASSERA 1,25 FOIS LE MONTANT QUE VOUS AVEZ VERSÉ POUR LE +LOGICIEL CONCERNÉ PAR LA RÉCLAMATION [OU 50 DOLLARS AMÉRICAINS, SI VOUS AVEZ +REÇU LE LOGICIEL GRATUITEMENT]. Les exclusions et limitations susmentionnées +ne peuvent pas être appliquées à des réclamations en rapport avec un décès ou +des blessures corporelles. Dans les pays où la législation en vigueur rendrait +inapplicables les exclusions ou les limitations de responsabilité énoncées +ci-dessus, la responsabilité de SUSE sera exclue ou limitée dans la mesure +maximale autorisée par ces lois. + +CONDITIONS GÉNÉRALES + +Prise en charge. SUSE n'a en aucun cas l'obligation de fournir une assistance +pour le Logiciel, sauf disposition contraire dans le présent Contrat. +Tests d'évaluation des performances. Cette limitation sur les tests +d'évaluation des performances Vous concerne si Vous êtes un développeur +logiciel ou un fournisseur de licence ou si vous effectuez des tests sur le +logiciel sous la direction ou pour le compte d'un développeur de logiciels ou +d'un fournisseur de licence. Sans l'accord préalable écrit de SUSE (SUSE ne +devant pas s'opposer à cet accord de manière excessive), vous ne pouvez pas +publier ou dévoiler à un tiers les résultats d'un test d'évaluation des +performances du Logiciel. Si Vous êtes fournisseur de licence de produits en +concurrence avec le Logiciel ou aux fonctionnalités similaires à celles du +Logiciel (" Produits similaires ") ou agissez au nom de tels fournisseurs, et +que Vous publiez ou divulguez des informations sur les tests d'évaluation du +Logiciel en violation de cette restriction, sauf mention contraire dans le +contrat de licence de l'utilisateur final du Produit similaire et outre les +recours que SUSE pourrait utiliser, SUSE est autorisé à effectuer les tests +d'évaluation des performances sur des Produits similaires et à divulguer et +publier les résultats. Vous faites ainsi valoir que Vous avez l'autorité de +concéder ces droits à SUSE. +Open Source. Rien dans le présent Contrat ne peut restreindre, limiter ou +affecter tout droit dont vous disposez, ou toute obligation ou condition à +laquelle vous pouvez être soumis, aux termes de toute licence relative aux +sources ouvertes applicable pour tout code source ouvert contenu dans le +Logiciel. +Aucune Obligation d'Achat. Ce Contrat Bêta ne sera pas considéré comme un +engagement de votre part à acquérir des licences pour la version du Logiciel +disponible dans le commerce. Cet achat sera certifié par l'émission d'un bon +de commande officiel. +Cession. Le présent Contrat Bêta ne peut pas faire l'objet d'une cession ou +d'un transfert, sans l'accord préalable écrit de SUSE. +Loi et juridiction. Le présent Contrat Bêta est régi par le droit de l'État +américain de l'Utah. Toute action en justice liée à ce Contrat Bêta peut +uniquement être portée devant les tribunaux compétents de l'État de l'Utah. +Toutefois, si votre principal établissement se trouve dans un État membre de +l'Union Européenne ou de l'Association Européenne de Libre Échange, ce Contrat +Bêta est régi par les lois en vigueur dans cet État. Toute action en justice +liée à ce Contrat pourra alors être uniquement portée devant les tribunaux +compétents dudit État. +Contrat complet. Le présent Contrat définit la totalité des conventions entre +Vous et SUSE et ne peut être amendé ou modifié que par un accord écrit conclu +entre Vous et un représentant autorisé de SUSE. AUCUN FOURNISSEUR DE LICENCE, +DISTRIBUTEUR, VENDEUR, DÉTAILLANT, REVENDEUR, REPRÉSENTANT OU EMPLOYÉ N'EST +AUTORISÉ À MODIFIER CE CONTRAT OU À ENGAGER DES RESPONSABILITÉS DISTINCTES DE +CELLES INCLUSES DANS LES PRÉSENTES CLAUSES DU CONTRAT. +Renonciation. Toute renonciation à un droit prévu par le présent Contrat Bêta +devra, pour prendre effet, être formulée par écrit et signée par un +représentant dûment autorisé de la partie concernée. Une renonciation à un +droit passé ou présent, en relation avec la violation d'une clause ou un +manquement, ne saurait être interprétée comme une renonciation à un droit +futur découlant des termes du présent Contrat Bêta. +Rupture du Contrat. Si une clause du présent Contrat Bêta est nulle ou +inapplicable, elle sera interprétée, limitée, modifiée ou, si nécessaire, +dissociée des autres clauses autant que de besoin, afin d'éliminer sa nullité +ou son caractère inapplicable et sans que cela affecte les autres +dispositions. +Conformité aux exigences d'exportation. Tous les produits ou informations +techniques fournis dans le cadre de ce Contrat peuvent être soumis à des +contrôles d'exportation aux États-Unis et à la législation commerciale +d'autres pays. Les parties s'engagent à respecter toutes les réglementations +de contrôle d'exportation et à obtenir les autorisations ou classifications +nécessaires pour exporter, réexporter ou importer des livrables. Les parties +s'engagent à ne pas exporter ou réexporter vers des entités figurant sur les +listes d'exclusion d'exportation américaines ou vers des pays sous embargo des +États-Unis ou représentant une menace terroriste conformément à la législation +des États-Unis en matière d'exportation. Les parties s'engagent à ne pas +employer de livrables à des fins d'utilisation illicite d'armes nucléaires, de +missiles ou d'armes biochimiques. Avant d'exporter des produits SUSE depuis +les États-Unis, consultez la page Web (en anglais) du Bureau of Industry and +Security : www.bis.doc.gov. Reportez-vous également à la page +https://www.suse.com/company/legal/ pour plus d'informations sur l'exportation +des logiciels SUSE. SUSE s'engage à vous fournir, sur demande, les +informations spécifiques relatives aux limitations applicables. Toutefois, +SUSE décline toute responsabilité quant à la non-obtention de Votre part des +agréments d'exportation nécessaires. Si vous installez, téléchargez ou +utilisez le présent logiciel, vous vous engagez à respecter la modalité +suivante : Nous certifions que le présent logiciel d'évaluation/de test bêta +ne sera utilisé qu'à cette fin et ne sera pas loué, cédé, vendu, concédé +sous-licence, assigné ni transféré de quelque façon que ce soit. Nous +certifions également que nous ne transférerons ni n'exporterons de produits, +de processus ou de services qui soient les produits directs du logiciel de +test bêta. +Droits du Gouvernement des États-Unis. Toute utilisation, reproduction ou +divulgation de la part du Gouvernement des États-Unis est soumise aux +limitations prévues par les dispositions légales suivantes : FAR 52.227-14 +(juin 1987) Alternate III (juin 1987), FAR 52.227-19 (juin 1987) ou DFARS +252.227-7013 (b)(3) (nov. 1995), ou par les clauses ultérieures appliquées en +remplacement des dispositions légales ci-avant. Contractant/fabricant : SUSE +LLC, 404 Wyman Street Waltham, MA 02415. +Autre. L'application de la Convention des Nations Unies sur les contrats de +vente internationale de marchandises est expressément exclue. + +(c) 2013 SUSE LLC ou ses sociétés affiliées. Tous droits réservés. +(020314) + + + diff --git a/live/root/usr/share/agama/eula/license.beta/license.it.txt b/live/root/usr/share/agama/eula/license.beta/license.it.txt new file mode 100644 index 0000000000..151f10c2a5 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.beta/license.it.txt @@ -0,0 +1,316 @@ +Contratto di licenza per l'utente finale SUSE(r) per il Software Beta + +LEGGERE ATTENTAMENTE I TERMINI DEL PRESENTE CONTRATTO BETA. INSTALLANDO, +SCARICANDO O UTILIZZANDO IN ALTRO MODO QUESTO SOFTWARE, L'UTENTE ACCETTA I +TERMINI DEL PRESENTE CONTRATTO BETA E DI QUALSIASI CONTRATTO DI LICENZA SUSE +SUPPLEMENTARE INCLUSO NEL SOFTWARE. QUALORA L'UTENTE NON ACCETTI TUTTE LE +CONDIZIONI IN ESSO CONTENUTE, NON DOVRÀ SCARICARE, INSTALLARE NÉ UTILIZZARE IL +SOFTWARE. IL SOFTWARE NON PUÒ ESSERE VENDUTO, CEDUTO O ALTRIMENTI DISTRIBUITO +SENZA LA PREVENTIVA AUTORIZZAZIONE SCRITTA DI SUSE. + +Il presente Contratto di licenza per l'utente finale SUSE per il Software Beta +("Contratto Beta") insieme a qualsiasi altro contratto di licenza SUSE +supplementare incluso in questo Software rappresenta un accordo con valore +legale tra l'Utente (una persona fisica o giuridica) e SUSE LLC ("SUSE"). I +prodotti Software relativi al presente Contratto Beta, gli aggiornamenti +software, i supporti (se esistenti) e la documentazione di accompagnamento +online o stampata (collettivamente, "Software") sono protetti dalle leggi +degli Stati Uniti ("U.S.A.") e dalle disposizioni dei trattati internazionali +sul copyright e sono soggetti ai termini del presente Contratto Beta. Qualora +l'Utente non accetti i termini del presente Contratto Beta, non dovrà +scaricare, installare o altrimenti utilizzare il Software e, a seconda dei +casi, dovrà restituire la confezione inutilizzata nella sua integrità a SUSE. +Il Software viene concesso in licenza all'Utente e non viene venduto. + +Il Software può includere o essere venduto insieme ad altri programmi software +concessi in licenza ai sensi di termini diversi e/o da un licenziante diverso +da SUSE. I termini di un Contratto di licenza per l'utente finale fornito con +particolare software con l'installazione o il download del software +prevarranno sui termini indicati di seguito. L'uso dei programmi software +forniti da terze parti è a discrezione dell'Utente. SUSE non è responsabile +del software di terze parti e non risponde dei danni derivanti dal suo +utilizzo. + +Il software può includere componenti che sono pacchetti Open Source, +sviluppati in modo indipendente e accompagnati da un contratto di licenza +separato. I diritti di licenza dell'Utente relativamente ai singoli componenti +accompagnati da contratti di licenza separati sono definiti dalle condizioni +di tali contratti; nulla nel presente Contratto limiterà o altrimenti +pregiudicherà i diritti o gli obblighi dell'Utente o le condizioni alle quali +l'Utente sarà soggetto in conformità al presente Contratto. Qualora i termini +e le condizioni della licenza di un componente specifico autorizzino l'Utente +a distribuire il componente, l'Utente non potrà utilizzare marchi SUSE (come +SUSE e SUSE LINUX) nella copia distribuita, indipendentemente dal fatto che il +componente contenga o meno i marchi SUSE. + +Licenza. In conformità ai termini e alle condizioni di questo Contratto Beta, +SUSE concede all'Utente un diritto non esclusivo e non trasferibile alla +riproduzione e all'uso del Software all'interno dell'organizzazione durante il +periodo indicato di seguito in una quantità adeguata allo scopo di effettuare +una valutazione o una prova funzionale del Software. + +Se un prodotto SUSE separato da quello fornito per il Beta Test è incluso +all'interno o insieme al Software, nonostante i dirittiprevisti nel contratto +di licenza fornito con la copia di tale prodotto SUSE separato, l'Utente +acconsente a utilizzare il prodotto SUSE separato solo ed esclusivamente in +relazione a e ai fini di una valutazione del Software. Il diritto di +utilizzare il software del prodotto SUSE separato cessa alla risoluzione del +Contratto Beta come specificato di seguito. + +Scioglimento. Questo Contratto Beta diventa effettivo dalla data in cui viene +acquistato legalmente il Software e rimarrà in vigore fino alla risoluzione. +Il presente Contratto Beta terminerà: (i) allo scadere di 90 giorni dalla data +di installazione del Software, (ii) al rilascio della versione successiva a +una versione di prova del Software, se presente, (iii) alla prima spedizione +commerciale del Software da parte SUSE, (iv) con notifica scritta della +risoluzione prodotta da una delle parti oppure (v) nel caso venga violato uno +dei termini in esso contenuti. In seguito alla risoluzione di questo Contratto +Beta l'Utente deve sospendere l'uso del Software, ripristinare lo stato +originale di qualsiasi azione eseguita per mezzo del Software, distruggere +l'originale e tutte le copie del Software oppure restituirli a SUSE e +disinstallare completamente il Software dal proprio computer. + +Versione preliminare. Poiché si tratta di una versione preliminare, il +Software non dovrà essere utilizzato in un ambiente produttivo o commerciale. +Il Software non è stato sottoposto a verifiche approfondite e può contenere +errori e omissioni, pertanto deve essere utilizzato solo in un ambiente di +prova. SUSE non garantisce il rilascio al pubblico di una versione commerciale +del Software o dei prodotti a esso associati né che le date prescritte saranno +rispettate. I rischi derivanti dall'utilizzo del Software sono completamente a +carico dell'Utente. Il Software può contenere un meccanismo automatico di +disabilitazione che ne impedisce l'utilizzo una volta trascorso un determinato +periodo di tempo. Sarà compito dell'Utente pertanto provvedere a un backup del +sistema e adottare ogni altra misura necessaria a evitare l'eventuale perdita +di file o dati. L'utilizzo del Software avviene unicamente a rischio +dell'Utente. + +Riservatezza. La presente sezione è applicabile all'Utente a meno che SUSE non +abbia distribuito il Software come versione Beta aperta rendendolo di dominio +pubblico senza alcun obbligo di riservatezza. Il Software, i relativi concetti +e caratteristiche, i materiali e la documentazione con esso forniti, i +risultati di test, verifiche, benchmark, le date previste, i codici PIN, le +password e qualsiasi altra informazione a esso correlata sono informazioni +riservate e di proprietà di SUSE e dei suoi fornitori di seguito definite +"Informazioni riservate". L'Utente si impegna a non divulgare o fornire le +Informazioni riservate ad alcuna terza parte né a utilizzare tali informazioni +per scopi diversi da quelli di valutazione del Software e invio di commenti e +suggerimenti a SUSE. Nel caso in cui all'Utente vengano forniti un codice PIN +e/o una password per l'accesso a determinati siti Web, l'Utente si impegna a +non condividere il codice PIN o la password con alcuna terza parte. L'obbligo +di riservatezza rimane in vigore anche dopo la risoluzione del presente +Contratto Beta, fino al momento in cui SUSE renderà tali informazioni di +dominio pubblico. + +Feedback. L'Utente acconsente all'utilizzo da parte di SUSE di qualsiasi +commento o informazione forniti a SUSE e concede a SUSE una licenza perenne e +irrevocabile per l'uso di tali commenti e informazioni per qualsiasi scopo +senza avere diritto ad alcun indennizzo, a condizione che SUSE non citi +pubblicamente il nome dell'Utente in connessione a tale uso. L'Utente dichiara +e garantisce che tali commenti e informazioni non contengono informazioni +esclusive o di natura riservata riguardanti l'Utente o terze parti e di avere +piena autorità a concedere la suddetta licenza. + +Limitazioni della Licenza. SUSE si riserva tutti i diritti non espressamente +concessi all'Utente. L'utente non potrà: (1) aumentare, in alcun modo, il +numero di connessioni supportate dal Software e concesse in licenza o +supportare più di una connessione o Utente tramite un'unica connessione; (2) +decodificare, decompilare o disassemblare il Software fatta eccezione per i +casi espressamente consentiti dalle leggi in vigore; (3) modificare, alterare, +prestare o concedere in leasing ilSoftware o concedere in sublicenza alcuno +dei diritti previsti dal presente Contratto Beta; o (4) trasferire, totalmente +o in parte, il Software o alcuno dei diritti previsti dal presente Contratto +Beta. + +SITI DI BETA TEST AUTORIZZATI + +Per gli utenti designati come siti di Beta Test autorizzati per questo +Software, sono validi i termini e le condizioni riportati di seguito. Per +qualificarsi come sito di Beta Test autorizzato, contattare tramite e-mail il +responsabile del programma beta di SUSE all'indirizzo +beta-programs@suse.com. SUSE può modificare i benefici offerti +all'Utente in qualsiasi momento pubblicando i benefici corretti nel sito Web +SUSE pertinente. + +Supporto. SUSE fornisce il supporto diretto per il Software in conformità con +il servizio di supporto correntemente offerto da SUSE per i siti di Beta Test +autorizzati per il relativo Software secondo quanto pubblicato nel sito Web +SUSE pertinente e secondo quanto comunicato dal responsabile del programma +beta per tale Software. Tale supporto può essere agevolato dall'uso di +strumenti basati sul Web, della posta elettronica e/o del telefono. SUSE +fornirà all'Utente tutti gli indirizzi Web, di posta elettronica e i numeri di +telefono necessari per contattare il supporto. + +Verifica. L'Utente acconsente a proprie spese ad eseguire e completare tutti i +programmi di prova forniti da SUSE durante il periodo di Beta Test e di +valutare il Software in modo approfondito eseguendo altri test ritenuti utili +o necessari. L'Utente acconsente ad assegnare l'hardware, il software e il +personale necessari ad eseguire prove adeguate sul Software e a soddisfare i +requisiti specificati in questo documento. L'Utente acconsente a dedicare un +minimo di quattro ore-uomo a settimana all'esecuzione di test durante il +periodo di Beta Test. Durante tutti i test, particolare attenzione dovrà +essere rivolta alla funzionalità, accuratezza, coerenza e facilità d'uso del +Software utilizzato in ogni test come pure alla documentazione ad esso +associata. I risultati di tutti i programmi di prova e di altri test, inclusi +qualsiasi suggerimento, incoerenza e/o problema, devono essere registrati +dettagliatamente (compresa la configurazione del sistema, e così via) e devono +essere inviati a SUSE con cadenza settimanale mediante l'uso della +reportistica e/o strumenti forniti e/o indicati da SUSE. Questi metodi e +strumenti possono comprendere, ma non essere limitati a, strumenti basati sul +Web, posta elettronica, fax, posta convenzionale e/o telefono. Per permettere +la rapida risoluzione dei problemi, l'Utente acconsente a comunicare tutti i +problemi rilevati nel Software entro due (2) giorni dal rilevamento del +problema, nonostante eventuali dubbi se tale problema sia dovuto ad un errore +o ad un difetto. Se richiesto, al termine del periodo di prova beta l'Utente +acconsente a redigere un rapporto scritto che riassuma i test eseguiti, le +proprie impressioni generali sul Software e gli usi potenziali del Software +all'interno del proprio ambiente. L'Utente acconsente a completare e +restituire entro la data e con il mezzo specificati i questionari che potrebbe +ricevere sull'esecuzione dei programmi di prova e ad altri aspetti del +Software. + +DIRITTI DI PROPRIETÀ + +All'Utente non viene trasferito alcun titolo o diritto di proprietà sul +Software. SUSE e/o i suoi concessori di licenza possiedono e detengono tutti i +titoli e i diritti di proprietà intellettuale del Software, inclusi quelli di +adattamento o copia. L'Utente acquisisce solo una licenza per l'uso del +Software. + +ESCLUSIONI DI GARANZIA + +IL SOFTWARE E LE ALTRE INFORMAZIONI RISERVATE SONO FORNITE ALL'UTENTE "COSÌ +COME SONO" SENZA ALCUN TIPO DI GARANZIA. I RISCHI DERIVANTI DAI RISULTATI E +DALLE PRESTAZIONI DELLE INFORMAZIONI RISERVATE SONO INTERAMENTE A CARICO +DELL'UTENTE. SUSE NON RILASCIA ALCUN TIPO DI GARANZIA ESPLICITA O IMPLICITA, +INCLUSE, IN VIA ESEMPLIFICATIVA, LE GARANZIE IMPLICITE DI COMMERCIABILITÀ, +IDONEITÀ PER UNO SCOPO PARTICOLARE, PROPRIETÀ E DI NON VIOLAZIONE. SUSE NON +GARANTISCE CHE IL SOFTWARE CORRISPONDA AI REQUISITI DELL'UTENTE O CHE IL +FUNZIONAMENTO DEL SOFTWARE NON SUBIRÀ INTERRUZIONI. Alcune giurisdizioni non +consentono determinate esclusioni e limitazioni di garanzia, pertanto alcune +parti delle suddette limitazioni potrebbero non essere applicabili all'Utente. +Benché la presente garanzia limitata riconosca all'Utente diritti specifici, è +possibile anche che l'Utente abbia anche altri diritti che variano a seconda +dei paesi. + +Prodotti non SUSE. Il Software può includere o può essere fornito con hardware +o altri programmi software concessi in licenza o venduti da licenzianti +diversi da SUSE. SUSE NON GARANTISCE PER PRODOTTI NON SUSE. TALI PRODOTTI +VENGONO FORNITI "COSÌ COME SONO". QUALSIASI SERVIZIO DI GARANZIA PER PRODOTTI +DI TERZE PARTI VERRÀ FORNITO DAL RELATIVO CONCESSORE DI LICENZA IN CONFORMITÀ +ALLE CONDIZIONI DI GARANZIA DEFINITE DALLO STESSO. + +LIMITAZIONE DI RESPONSABILITÀ + +Perdite consequenziali. IN NESSUN CASO SUSE O ALCUNO DEI SUOI CONCESSORI DI +LICENZA, FILIALI O DIPENDENTI POTRÀ ESSERE RITENUTO RESPONSABILE DI DANNI +SPECIFICI, INCIDENTALI, CONSEQUENZIALI, INDIRETTI, COLPOSI, ECONOMICI O MORALI +DERIVANTI DALL'USO O DAL MANCATO USO DEL SOFTWARE, INCLUSI, SENZA ALCUNA +ESCLUSIONE, I DANNI DERIVANTI DAL MANCATO GUADAGNO, DANNI COMMERCIALI O +PERDITE DI DATI, PER QUANTO A CONOSCENZA DELLA POSSIBILITÀ DI TALI DANNI. +Danni diretti. LA RESPONSABILITÀ COMPLESSIVA DI SUSE PER EVENTUALI DANNI +DIRETTI A PROPRIETÀ O PERSONE (CAUSATI DA UNO O PIÙ INCIDENTI) NON POTRÀ +SUPERARE 1,25 VOLTE IL PREZZO DI ACQUISTO DEL SOFTWARE CHE HA CAUSATO IL DANNO +[O 50 DOLLARI USA SE IL SOFTWARE È STATO FORNITO GRATUITAMENTE]. Le esclusioni +e le limitazioni di cui sopra non si applicano alle richieste di danni +relative ad incidenti mortali o infortuni personali. Nelle giurisdizioni che +non ammettono esclusioni o limitazioni della responsabilità per danni, la +responsabilità di SUSE sarà limitata o esclusa nella misura massima consentita +dalla legge. + +TERMINI GENERALI + +Supporto. La fornitura di assistenza per il Software non costituisce un +obbligo per SUSE tranne se espressamente specificato in questo documento. +Test di benchmark. Le presenti limitazioni relative all'esecuzione dei test di +benchmark sono applicabili all'Utente nel caso in cui questi sia uno +sviluppatore o un concessore di licenza software o esegua test sul Software +alle dipendenze o per conto di uno sviluppatore o di un concessore di licenza +software. L'Utente non potrà, senza previo consenso scritto di SUSE che non +sia ragionevolmente negato, pubblicare o divulgare a terze parti i risultati +dei test di benchmark del Software. Se i licenzianti di prodotti con +funzionalità simili al Software, o in concorrenza con esso ("Prodotti +simili"), oppure gli Utenti che agiscono per conto di tali licenzianti +pubblicano o divulgano informazioni relative ai test di benchmark eseguiti sul +Software in violazione di questa limitazione, nonostante eventuali clausole +discordanti nel contratto di licenza per l'Utente finale del Prodotto simile e +in aggiunta a qualsiasi altro rimedio a disposizione di SUSE, SUSE avrà il +diritto di valutare le prestazioni dei Prodotti simili e di divulgare e +pubblicare tali informazioni e con il presente documento l'Utente dichiara di +disporre dell'autorità di concedere tale diritto a SUSE. +Open source. Nessun elemento del presente Contratto limiterà o in alcun modo +pregiudicherà i diritti o gli obblighi dell'Utente o le condizioni a cui +l'Utente potrà essere soggetto, in conformità a eventuali licenze open source +per qualsiasi codice open source contenuto nel Software. +Nessun impegno all'acquisto. Questo Contratto Beta non costituisce un impegno +da parte dell'Utente ad acquistare licenze per la versione commerciale di +questo Software. Qualsiasi acquisto di questo tipo sarà comprovato +dall'emissione di un ordine di acquisto formale. +Trasferimento. Questo Contratto Beta non può essere trasferito o concesso +senza previo consenso scritto di SUSE. +Legge applicabile e foro competente. Questo Contratto Beta è regolato dalle +leggi dello Stato dello Utah negli Stati Uniti. Qualsiasi azione legale +relativa a tale Contratto Beta potrà essere fatta valere esclusivamente +davanti al foro competente dello Stato dello Utah. Se, tuttavia, l'Utente è +residente in un paese membro dell'Unione Europea e dell'EFTA (European Free +Trade Association), il presente Contratto Beta è regolato dalle leggi di tale +paese e qualsiasi azione legale dovrà essere fatta valere esclusivamente +davanti al foro competente di tale paese. +Indivisibilità dell'accordo. Il presente Contratto definisce tutti i termini +dell'accordo tra l'Utente e SUSE e può essere rettificato o modificato solo +per iscritto mediante un accordo accettato dall'Utente e da un rappresentante +autorizzato di SUSE. NESSUN CONCESSIONARIO DI LICENZE, DISTRIBUTORE, +RIVENDITORE, CONCESSIONARIO, RAPPRESENTANTE O DIPENDENTE POTRÀ MODIFICARE IL +PRESENTE CONTRATTO O FORNIRE DICHIARAZIONI O PROMESSE DIVERSE O AGGIUNTIVE +RISPETTO AI TERMINI E ALLE CONDIZIONI INDICATI NEL PRESENTE CONTRATTO. +Rinuncia. Nessuna rinuncia a un qualsiasi diritto concesso da questo Contratto +Beta sarà effettiva a meno che non venga riportata per iscritto e firmata da +un rappresentante autorizzato della parte vincolata. Nessuna rinuncia a un +qualsiasi diritto passato o presente derivante da violazione o inadempienza +potrà essere considerata come rinuncia a un qualsiasi diritto futuro +risultante da questo Contratto Beta. +Indipendenza delle previsioni contrattuali. Se una qualsiasi clausola del +presente Contratto Beta non è valida o è inapplicabile, verrà interpretata, +limitata, modificata o, se necessario, eliminata, nella misura necessaria, in +modo da garantirne la validità o l'applicabilità, senza che ciò abbia alcun +effetto sulle altre clausole del Contratto Beta. +Conformità con le leggi sull'esportazione. Qualsiasi informazione tecnica o +prodotto fornito in base a questo Contratto può essere soggetto ai controlli +statunitensi relativi alle esportazioni e alle leggi sul commercio in vigore +in altri paesi. Le parti si impegnano a rispettare le norme di esportazione e +a ottenere le licenze necessarie o le autorizzazioni per l'esportazione, la +ri-esportazione o l'importazione delle merci. Le parti si accordano a non +esportare o riesportare entità presenti nella lista dei prodotti e dei servizi +esclusi dall'esportazione in vigore negli Stati Uniti, nonché a non esportare +o riesportare verso paesi su cui grava l'embargo o facenti parte dell'elenco +dei paesi terroristi, come specificato nelle leggi sull'esportazione degli +Stati Uniti. Le parti accettano inoltre di non utilizzare i beni per impieghi +finali vietati di tipo nucleare o missilistico o di armamento chimico e +biologico. Si prega di consultare la pagina Web del Bureau of Industry and +Security (Dipartimento Industria e Sicurezza) www.bis.doc.gov prima di +esportare i prodotti SUSE dagli Stati Uniti. Fare riferimento al sito +https://www.suse.com/company/legal/ per maggiori informazioni +sull'esportazione del software SUSE. Su richiesta, SUSE fornirà all'Utente +informazioni specifiche relative alle limitazioni applicabili. Tuttavia, SUSE +non si assume alcuna responsabilità per il mancato ottenimento delle +necessarie autorizzazioni all'esportazione da parte dell'Utente. Installando, +scaricando o utilizzando in altro modo questo Software, l'Utente è tenuto a +dichiarare quanto segue: Si certifica che questa copia di valutazione/Beta +Test del Software verrà esclusivamente utilizzata per scopi di Beta Test e non +sarà noleggiata, fornita in leasing, venduta, concessa in sublicenza, +assegnata o trasferita in alcun modo. Inoltre, si certifica che non verrà +trasferito o esportato alcun prodotto, processo o servizio che costituisce il +prodotto diretto del software di Beta Test. +Limitazioni dei diritti del Governo degli Stati Uniti. L'uso, la duplicazione +e/o la distribuzione del presente Software a uffici del Governo degli Stati +Uniti sono soggetti alle limitazioni specificate in FAR 52.227-14 (giugno +1987) Alternate III (giugno 1987), FAR 52.227-19 (giugno 1987) o DFARS +252.227-7013 (b)(3) (Nov 1995) o altre clausole successive. Il +contraente/produttore è SUSE LLC, 404 Wyman Street, Waltham, MA 02415. +Altre disposizioni. L'applicazione della Convenzione delle Nazioni Unite sui +contratti per la vendita internazionale di beni è espressamente esclusa. + +(c) 2013 SUSE LLC o relative società affiliate. Tutti i diritti riservati. +(020314) + + + diff --git a/live/root/usr/share/agama/eula/license.beta/license.ja.txt b/live/root/usr/share/agama/eula/license.beta/license.ja.txt new file mode 100644 index 0000000000..34067eca6b --- /dev/null +++ b/live/root/usr/share/agama/eula/license.beta/license.ja.txt @@ -0,0 +1,158 @@ +ベータ版ソフトウェア用SUSE(r)エンドユーザ使用許諾契約 + +このベータ契約を注意してお読みください。本ソフトウェアをインストール、ダウンロードまたは使用することにより、お客様は本ベータ契約の条項および本ソフトウ +ェアに含まれる追補のSUSE使用許諾契約書に同意されたものとします。お客様が本契約の条項に同意しない場合は、このソフトウェアをダウンロード、インストー +ルまたは使用しないでください。また、SUSEの事前の書面による許可を得ることなく本ソフトウェアを販売、譲渡または再配布することはできません。 + +このベータ版ソフトウェア用SUSEエンドユーザ使用許諾契約(以下「ベータ契約」といいます)は、本ソフトウェアに含まれる追補のSUSE使用許諾契約書と同 +様に、お客様(法人または個人)とSUSE LLC(以下「弊社」といいます)との間で締結される法的な契約書です。本ベータ契約に基づくソフトウェア製品、ソ +フトウェア更新、媒体および添付のオンライン文書または印刷文書(以下総称して「本ソフトウェア」といいます)は、米国およびその他の国の著作権法および著作権 +条約によって保護されており、本ソフトウェアの所有および使用に関しては本ベータ契約の条項が適用されます。お客様が本ベータ契約の条項に同意されない場合は、 +本ソフトウェアをダウンロード、インストールまたは使用することはできません。未使用の製品一式を弊社にご返却ください。本ソフトウェアは、ライセンス契約によ +り使用を許諾されたもので売却されたものではありません。 + +本ソフトウェアは、別段の条件またはSUSE以外のライセンサ、もしくはその両方により使用許諾された、他のソフトウェアプログラムを含んでいるか、またはこの +ような他のソフトウェアプログラムにバンドルされている場合があります。ソフトウェアのインストールまたはダウンロード時に特定のソフトウェアファイルに付属す +るエンドユーザー使用許諾契約の条項は、以下の条項に優先されます。サードパーティーのソフトウェアプログラムは、お客様の判断で使用するために提供されていま +す。SUSEは、サードパーティーのソフトウェアに関して責任を負わず、お客様による当該サードパーティー製品の使用に関しても、一切責任を負わないものとしま +す。 + +本ソフトウェアには、個別に開発されたオープンソースパッケージで、それぞれに使用許諾条項が付随したコンポーネントが含まれる可能性があります。 別の使用許 +諾条項が付随した個別のコンポーネントについては、お客様の使用許諾に関する権利はこうした使用許諾条項によって定義されます。本契約が、お客様が持つ権利や義 +務、またはこうした使用許諾条項においてお客様が遵守すべき条件を制限または限定したり、これらに影響を与えたりすることはありません。コンポーネントによって +は、使用許諾条項がお客様にその配布を許可する場合もありますが、コンポーネントの配布に際して、そのコンポーネントがSUSEの商標(SUSEおよびSUSE +LINUXなど)を含んでいるかどうかに関わらず、SUSEの商標を使用することはできません。 + +ライセンス。 弊社はお客様に対し、本ベータ契約の条項に従って、組織内部での使用目的に限り、本ソフトウェアの評価またはテストに必要な数内で本ソフトウェア +を複製して使用する非独占的な譲渡不可の権利を、以下に指定する期間に限定して付与します。 + +ベータテストで提供される製品とは別のSUSE製品が本ソフトウェアに付随または含まれている場合、当該SUSE製品に付随する使用許諾契約の条項にかかわらず、 +お客様は、本ソフトウェアの評価目的でのみ当該SUSE製品を使用することに同意するものとします。以下に定める本ベータ契約の終了と同時に、お客様が当該 +SLESを使用する権利も終了するものとします。 + +用語。 本ベータ契約は、お客様が本ベータ契約にご同意いただき、本ソフトウェアをインストールした日から発効し、以下に定める終了時点まで有効とします。本ベ +ータ契約は、以下のいずれか早い時点で終了するものとします。(1)インストールしてから90日間が経過した場合。(2)本ソフトウェアのプレリリース版の新し +いバージョンがリリースされた場合。(3)弊社が本ソフトウェアを販売目的で最初に出荷した場合。(4)両当事者のいずれかから書面による契約終了通知が発行さ +れた場合。(5)お客様が本ベータ契約の条項のいずれかに違反した場合。本ベータ契約が終了次第、お客様は本ソフトウェアの使用を中止し、本ソフトウェアによっ +て加えられた変更を元の状態に戻し、本ソフトウェアおよび複製物をすべて廃棄するか、または弊社に返却の上、お客様のシステムから本ソフトウェアを削除するもの +とします。 + +プレリリース品質。本ソフトウェアはプレリリース品質で提供されます。お客様は、本ソフトウェアを商用または生産システムで使用しないものとします。本ソフトウ +ェアのテストを完了しておらず、エラーや欠陥がある場合があるため、本ソフトウェアはテスト環境のみでの使用を目的とします。弊社は、本ソフトウェアの一般販売、 +発売予定日における販売開始、および関連製品のリリースを保証しません。本ソフトウェアの使用はお客様の責任で行われるものとします。本ソフトウェアには、一 +定期間を過ぎるとその使用を不可能にする自動無効化メカニズムが含まれていることがあります。したがって、お客様は、システムをバックアップし、他の手段でファ +イルやデータの喪失を防ぐ必要があります。本ソフトウェアの使用は、すべてお客様自身の責任で行ってください。 + +機密保持。(弊社が本ソフトウェアをオープンベータ版として機密保持の義務を課さずに一般に提供した場合を除き、お客様は以下の条件に従って本ソフトウェアを使 +用するものとします。)本ソフトウェアおよびその具体的なコンセプト、同梱のマニュアル等、製品の機能、テストおよび評価結果、ベンチマークテストの結果、目標 +の日程、PINナンバーとパスワード、さらに他の関連情報は、弊社およびそのサプライヤに帰属する機密情報です(以下、「機密情報」といいます)。 お客様は機 +密情報を第三者に開示または提供しないことに同意し、その使用は本ソフトウェアのテストまたは評価、および弊社にフィードバックを提供することのみを目的としま +す。制限されたサイトにアクセスするためのPINナンバーまたはパスワードを提供された場合、お客様はPINナンバーまたはパスワードを第三者と共有しないもの +とします。お客様は本ベータ契約終了後においても、弊社がこれらの情報を一般に公開するまで機密保持の義務を負うものとします。 + +フィードバック。 お客様は、お送りいただいたフィードバックを弊社が使用することに同意するものとし、弊社がお客様のお名前を公開しないことを条件に、これら +のフィードバックを無期限に使用する権利を弊社に付与するものとします。お客様は、ご自身のまたは第三者の所有権に関わる、または帰属する機密情報をこれらのフ +ィードバックに含めないこと、およびお客様が弊社にこの権利を付与する権限を持ち合わせることを保証するものとします。 + +使用上の制限事項。お客様に明示的に許諾されていないすべての権利は、SUSEが留保します。お客様による次の行為は禁じられています。(1) いかなる手段で +あれ、本ソフトウェアでサポートされ、お客様にライセンスが付与されている接続数を増加すること、または1つの接続につき複数の接続またはユーザをサポートする +こと。(2) 適用される法律により明示的に許可されている範囲を越えて本ソフトウェアのリバースエンジニアリング、逆コンパイル、逆アセンブルを行うこと。 +(3) 本ソフトウェアを改変、変更、貸与、タイムシェア、リースすること、または本ベータ契約に基づくお客様の権利を再使用許諾すること。(4) 本ソフトウ +ェアまたは本ベータ契約に基づくお客様のライセンス権利をすべてまたは一部譲渡すること。 + +認定ベータテストサイト + +お客様が本ソフトウェアの認定ベータテストサイトとして指定された場合は、以下の条件がお客様に適用されます。認定ベータテストサイトとして指定を受ける場合は、 +SUSEベータプログラムマネージャ(beta-programs@suse.com)までメールでご連絡ください。弊社は、お客様に提供する便 +益について、該当する弊社サイトにその改定事項を掲示することで、いつでも変更することができます。 + +サポート。弊社は、認定ベータテストサイトが、適用するウェブサイトにポストされたソフトウェア、および弊社のベータプログラムマネージャが指定したソフトウェ +アを使用することを条件として、現行の直接サポートを提供します。弊社のサポートは、インターネットを使用したツール、電子メール、電話を使用して提供されます。 +弊社は、お客様に必要なインターネットアドレス、電子メールアドレスおよび電話サポートの電話番号を提供するものとします。 + +テスト。 お客様は、ベータ版テスト期間に弊社によって提供されたすべてのテストプログラムの操作を完了し、有益または必要とみなされたこれ以外のテストを行う +ことにより、お客様自身の費用で本ソフトウェアのテストを完了することに同意するものとします。お客様は適切なテストを行うために必要とされる専用のハードウェ +ア、ソフトウェアまたは人員を備えることに同意するものとします。お客様は、ベータ版テスト期間中各週において、最低 4 時間の延べ時間をテストに費やされる +ことに同意するものとします。お客様は、テスト期間内に各テストまたは関連する文書に含まれた本ソフトウェアの機能性、精密性、統一性、使い易さに対して、特別 +な注意を払うものとします。すべてのテストプログラムおよび他のテストの結果(提案、矛盾、問題などを含む)は、システム構成を含み、詳細かつ正確に記録し、 +SUSEが提供もしくは指定した報告手段あるいはツールを指定してSUSE毎週提出するものとします。これらの方法およびツールには、インターネットを使用した +ツール、電子メール、ファックス、USメールおよび電話が含まれます。迅速な修理を可能にするためには、お客様は本ソフトウェアの使用中に発生した問題を、エラ +ーまたはバグであるかに関わらず発生から2日以内に報告することに同意するものとします。お客様は要請に応じて、ベータ版テスト期間の終了時において、行われた +テスト操作、本ソフトウェアの全体的な印象、お客様の環境における本ソフトウェアの可用性に関して、書面によるレポートを提出していただくことに同意するものと +します。お客様には、テストプログラムの操作性および本ソフトウェアの他の機能などに関して、アンケートが送られる場合があります。お客様は指定された方法で回 +答を記入し、返送することに同意していただきます。 + +所有権 + +本ソフトウェアのタイトルも所有権も、お客様に譲渡されません。SUSEおよびライセンサは、改編や複製を含む、本ソフトウェアのあらゆる知的所有権の所有権を +保持します。お客様は、本ソフトウェアを使用するライセンスのみを取得します。 + +保証の否認 + +本ソフトウェアとその他の機密情報は、いかなる保証もなく「現状有姿」のままで提供されます。機密情報の結果とパフォーマンスに関するすべてのリスクはお客様が +負うものとします。弊社は、本ソフトウェアの商品性、権原、第三者の権利侵害および特定の用途への適合性をはじめ、いかなる黙示的保証も否認し、排除します。更 +に弊社は、本ソフトウェアがお客様の要求を満たすこと、欠陥または誤りがないこと、並びに本ソフトウェアの動作が中断されないことを保証しません。保証の特定の +排除および制限を認めていない法的区域があるため、上記の制限の一部はお客様に適用されないことがあります。この保証の制限は、お客様に特定の権利を付与します、 +さらに、お客様は、州により相違ありますが、その他の権利も付与されることがあります。 + +SUSE以外の製品。本ソフトウェアには、SUSE以外の他のライセンサにより使用許諾もしくは販売されたハードウェアもしくは他のソフトウェアが含まれている +か、またはこのようなハードウェアもしくはソフトウェアにバンドルされていることがあります。SUSEは、SUSE以外の製品に対して如何なる保証も行いません。 +このような製品は、すべて「現状のまま」で提供されます。SUSE以外の製品に対する保証サービスは、その製品のライセンサが該当するライセンサ保証に基づい +て提供します。 + +責任の制限 + +結果的損失。弊社、弊社に対する使用許諾者、弊社の子会社または従業員は、逸失利益、事業の中断、データの喪失をはじめとして、本ソフトウェアの使用または使用 +不能に起因する特別損害、付随的損害、結果的損害、間接的損害、不法行為、経済的損害または懲罰的損害について、当該損害発生の可能性が告知されていた場合であ +っても、損害賠償責任を含む一切の責任を負わないものとします。 +直接的損害。いかなる場合でも、財産に対するまたは人的な直接損害(それが一件の案件または一連の案件におけるかにかかわりなく)に対するSUSEの賠償責任総 +額は、お客様がクレームの原因となった本ソフトウェアの対価として支払った支払総額の1.25倍の金額を限度とします(また、お客様が本ソフトウェアを無償で取 +得した場合は、50米ドルを限度とします)。前述の除外や制限は、人命または身体的損害に関連するクレームには適用されません。損害の例外または制限が認められ +ない管轄区域では、SUSEの責任はそれらの管轄区域で認められる最大限の範囲で制限または除外されるものとします。 + +一般条項 + +サポート。弊社では本評価版契約で明確に定められた場合を除き本ソフトウェアへのサポートを提供する義務を負いません。 +ベンチマークテスト。このベンチマークテストの制限条項は、お客様がソフトウェア開発者またはライセンサーである場合か、お客様がソフトウェア開発者またはライ +センサーの指示によるか、またはその代理として本ソフトウェアのテストを実施する場合に、お客様に対して適用されます。お客様は、SUSEからの不当に留保され +ない書面による事前許可を得ることなしに、本ソフトウェアのベンチマークテストの結果を第三者に公表または開示できません。お客様が本ソフトウェアに機能上類似 +または競合する製品(「類似製品」)のライセンサであるか、またはそのようなライセンサの代理であり、さらに、お客様がこの制限条項に違反して本ソフトウェアの +ベンチマーク情報を公表または開示した場合は、類似製品のエンドユーザ使用許諾契約に矛盾する規定があっても、SUSEは、SUSEが提供できる他の救済策に加 +えて、類似製品のベンチマークテストを実施し、そのベンチマーク情報を開示および公表する権利を有するものとし、お客様は、上記の権利をSUSEに供与する権限 +を有することを表明するものとします。 +オープンソース。本契約のいかなる内容も、本ソフトウェアに含まれる任意のオープンソースコードに適用できるオープンソースライセンスの下で、お客様が所有する +権利または義務、あるいはお客様が準拠する条件に対して、制約、制限、または他の方法による影響を与えないものとします。 +購入義務の否認。本ベータ契約は、お客様が本ソフトウェアの市販製品のライセンス購入を確約することを示唆するものではありません。市販製品の購入は正式な購入 +注文書の発行によって証明されるものとします。 +移譲。本ベータ契約は、SUSEの事前の書面による許可なしに、譲渡または移譲することはできません。 +法令および法域。本ベータ契約は、日本法に準拠します。本ベータ契約に関して発生した訴訟については、東京地方裁判所を第一審専属管轄裁判所とします。ただし、 +お客様の主たる所在地がある国が、欧州連合または欧州自由貿易連合の加盟国である場合は、本ベータ契約は当該国の法律に準拠し、あらゆる法的手続きは、当該国の +管轄裁判所のみに対して提起できます。 +完全合意。本契約は、お客様とSUSEの間の完全な理解および合意を規定したものであり、お客様とSUSEの権限のある代表者によって合意された書面による場合 +に限り、修正または変更できます。ライセンサー、卸売業者、販売店、小売店、再販売業者、販売員、従業員には、本契約を変更したり、本契約の条項に相違するか追 +加される表明もしくは約束を行う権限はありません。 +権利放棄。本ベータ契約に基づく権利の放棄は、その拘束を受ける当事者の正式な代表者が署名した書面による場合を除き、有効になりません。違反または不履行によ +って生じた過去または現在のいかなる権利の放棄も、本ベータ契約により発生する将来の権利の放棄とはみなされないものとします。 +可分性。本ベータ契約の規定のいずれかが無効または法的強制力がないとみなされた場合、その規定は、無効または法的強制力のない部分を排除するために必要な範囲 +で、解釈、制限、変更、または必要に応じて分離され、本ベータ契約のその他の規定は影響を受けません。 +輸出法令準拠。本契約の下で提供される製品または技術情報はすべて、米国の輸出規制および他国の商法の制限を受けます。当事者は、すべての輸出管理規定に従うこ +と、および取引対象製品の輸出、再輸出または輸入に必要なライセンスを取得したり、分類を行うことに同意するものとします。当事者は、現在の米国の輸出禁止リス +トに掲載されている団体にも、米国の輸出管理規定で指定された輸出禁止国またはテロリスト国にも、輸出または再輸出を行わないことに同意するものとします。当事 +者は、取引対象製品を禁止されている核兵器、ミサイル兵器、または生物化学兵器の最終用途に使用しないものとします。米国からSUSE製品を輸出する際には、事 +前に、米国商務省産業安全保障局のWebページ(www.bis.doc.gov)でご確認ください。また、SUSEソフトウェアの輸出の詳細については、 +https://www.suse.com/company/legal/を参照してください。ご要望があれば、SUSEは該当する制限について詳細な情報を提 +供します。ただし、SUSEは、お客様が必要な輸出承認を取得しないことについては、いなかる責任も負わないものとします。本ソフトウェアをダウンロード、イン +ストール、またはその他の方法で使用することにより、お客様は以下のことを表明したとみなされます。本ベータテスト/評価版ソフトウェアをベータテストの目的の +みに使用し、貸与、リース、販売、再使用許諾、譲渡等の方法で移譲しないことを証します。また、ベータテストソフトウェアの直接的な生産物である製品、プロセス、 +またはサービスを譲渡または輸出しないこと保証します。 +米国政府の権利制限。米国政府による使用、複製、開示は、FAR 52.227-14 (June 1987) Alternate III (June +1987)、FAR 52.227-19 (June 1987)、もしくはDFARS 252.227-7013 (b)(3) (Nov 1995)、また +は該当するこれらの修正条項に定める制限事項に従うことを条件とします。契約人/製造者は、SUSE LLC 404 Wyman Street, +Waltham, MA 02415です。 +その他。国際物品売買契約に関する国連条約の適用は、明示的に除外されています。 + +(c) 2013 SUSE LLCまたは関連会社。All Rights Reserved. +(020314) + + + diff --git a/live/root/usr/share/agama/eula/license.beta/license.ko.txt b/live/root/usr/share/agama/eula/license.beta/license.ko.txt new file mode 100644 index 0000000000..b9d649de3b --- /dev/null +++ b/live/root/usr/share/agama/eula/license.beta/license.ko.txt @@ -0,0 +1,166 @@ +베타 소프트웨어용 SUSE(r) 최종 사용자 사용권 계약서 + +이 베타 계약서를 주의 깊게 읽어보시기 바랍니다. 소프트웨어를 설치하거나 다운로드하거나 사용하면 소프트웨어와 함께 제공되는 본 베타 버 +전 사용권 계약 및 추가 SUSE 사용권 계약에 동의하게 됩니다. 본 사용권 계약서에 동의하지 않을 경우에는 소프트웨어를 다운로드하거나 +설치하거나 또는 사용하지 마십시오. 본 소프트웨어를 SUSE의 서면 승인 없이 판매, 양도 또는배포할 수 없습니다. + +이 베타 소프트웨어용 SUSE 최종 사용자 사용권 계약("베타 계약")은 소프트웨어에 포함된 추가 SUSE 사용권 계약과 함께 사용자 +(업체 또는 개인)와 SUSE LLC("SUSE") 간의 법적 계약을 구성합니다. 본 베타 버전 사용권 계약서가 동반된 소프트웨어 제품, +소프트웨어 업데이트, 미디어(해당하는 경우) 및 동봉한 온라인 또는 인쇄된 문서("소프트웨어"라고 통칭함)는 미합중국과 기타 국가의 저 +작권법 및 저작권 협약의 보호를 받으며 본 베타 버전 사용권 계약서 내용의 적용을 받습니다. 본 베타 버전 사용권 계약서 내용에 동의하 +지 않을 경우에는 소프트웨어를 다운로드, 설치 또는 사용하지 마십시오. 이 경우 사용하지 않은 전체 패키지를 SUSE에 반환하십시오. +본 소프트웨어는 판매되는 것이 아니라 그 사용이 허여되는 것입니다. + +본 소프트웨어에는 다른 규정 및/또는 SUSE 이외의 다른 사용권 허여자에 의해 사용권이 허여된 기타 소프트웨어 프로그램이 포함되거나 +패키지 형태로 함께 제공될 수 있습니다. 소프트웨어의 설치 또는 다운로드 시 특정 소프트웨어 파일에 동봉된 최종 사용자 사용권 계약의 +내용은 아래 표시된 내용에 우선합니다. 타사 소프트웨어는 귀하의 선택에 따라 사용할 수 있도록 제공됩니다. SUSE는 어떠한 제3자 소 +프트웨어에 대해서도 책임이 없으며 귀하의 제3자 소프트웨어 사용에 대해서도 책임지지 않습니다. + +소프트웨어에는 공개 소스 패키지, 개별적으로 개발되었으며 별도의 사용 조건이 있는 구성 요소가 포함될 수 있습니다. 개별적인 사용 조건 +이 동봉되는 개별 구성 요소에 대한 귀하의 사용권 권리는 그 조건으로 정해지며, 그러한 사용권 하에서 이 계약서의 어떤 부분도 귀하가 +가진 권리 또는 책임, 또는 귀하가 처한 상황에 제한을 가하거나 영향을 줄 수 없습니다. 특정 구성 요소의 계약 조건에 따라 귀하는 구 +성 요소를 배포할 수 있지만, 구성 요소 배포 시 SUSE 마크 포함 여부에 관계없이 그 어떤 SUSE 상표(예: SUSE 및 SUSE +LINUX)도 사용할 수 없습니다. + +사용권. SUSE는 본 베타 버전 사용권 계약서의 규정 및 조건에 따라 귀하가 소프트웨어를 평가 및/또는 테스트할 수 있도록 아래 지정 +된 기간 동안 소프트웨어를 필요한 개수만큼 복제하고 내부적으로 사용할 수 있는 비독점적이며 양도할 수 없는 사용권을 귀하에게 허여합니 +다. + +베타 테스트를 위해 제공된 제품과 별도로 SUSE 제품이 소프트웨어에 포함되거나 함께 있는 경우, 별도의 SUSE 제품 사본을 동봉한 +사용권 계약의 사용권에도 불구하고 소프트웨어의 평가를 목적으로 연결되어 단독으로 별도의 SUSE 제품을 사용하는 데 동의하게 됩니다. +별도의 SUSE 제품 소프트웨어 사용에 대한 사용자의 권한은 아래 명시된 대로 베타 버전 사용권 계약이 종료될 때 함께 종료됩니다. + +용어. 본 베타 버전 사용권 계약은 소프트웨어를 합법적으로 취득한 날부터 효력이 발생하며 아래와 같이 계약 기간이 만료될 때까지 유효합 +니다. 본 베타 버전 사용권 계약은 다음 중 가장 먼저 도래하는 날에 종료될 수 있습니다. (i) 본 소프트웨어를 설치한 날로부터 90 +일 (ii) 본 소프트웨어 시험판의 후속 버전이 배포되었을 때(해당되는 경우) (iii) SUSE에서 본 소프트웨어의 상업적 발매를 시 +작한 경우 (iv) 상대방이 서면으로 계약 종료를 통보한 경우 (v) 사용자가 본 베타 버전 사용권 계약서의 내용을 위반한 날. 본 베 +타 버전 계약이 종료되면 귀하는 소프트웨어의 사용을 중단하고 소프트웨어에 의해 수행되는 모든 작업을 원상태로 되돌려야 합니다. 또한 소 +프트웨어의 원본과 모든 복사본을 파기하거나 SUSE에 반환하고 귀하의 시스템에서 소프트웨어를 완전히 삭제해야 합니다. + +시험판 품질. 본 소프트웨어는 시험판 품질로 제공되므로 상업용 또는 생산 시스템에 사용해서는 안 됩니다. 본 소프트웨어는 아직 충분한 +검사를 거치지 않았으므로 오류 및 결함이 있을 수도 있습니다. 따라서 본 소프트웨어는 테스트 환경에서만 사용해야 합니다. SUSE는 본 +소프트웨어의 상업용 버전이 일반에 보급되거나, 예정된 날짜에 출시되거나, 관련 제품이 발매될 것이라는 점을 보증하지 않습니다. 본 소프 +트웨어 사용으로 인해 발생하는 모든 위험은 귀하가 부담합니다. 본 소프트웨어에는 일정 기간이 지나면 계속 사용할 수 없도록 자동 사용 +방지 메커니즘이 포함될 수 있으므로 파일 또는 데이터 손실을 막기 위해 귀하의 시스템을 미리 백업하고 기타 필요한 조치를 취해야 합니 +다. 본 소프트웨어의 사용에 따른 모든 위험은 전적으로 귀하가 부담합니다 + +기밀 유지. (이 절은 SUSE가 본 소프트웨어를 기밀 유지 의무가 없는 공개 베타 버전으로 일반에 배포하지 않은 경우에 적용됩니다.) +본 소프트웨어 및 이에 포함된 모든 개념, 동봉된 문서 및 자료, 제품 기능, 테스트 및 평가 결과, 벤치마크 결과, 목표 출시 날짜, +PIN 번호 및 암호, 기타 관련 모든 정보는 SUSE와 그 공급자의 독점 및 기밀 정보이며, 이 계약에서는 "기밀 정보"라고 지칭됩니 +다. 귀하는 기밀 정보를 타사에 공개 또는 제공하지 않으며 소프트웨어를 테스트 또는 평가하거나 SUSE에 피드백을 제공하는 목적 외에는 +사용하지 않을 것에 동의합니다. 제한된 사이트에 액세스할 수 있도록 PIN 번호 또는 암호가 제공된 경우, 귀하는 PIN 번호 또는 암 +호를 제3자와 공유하지 않을 것에 동의합니다. 기밀 유지 의무는 본 베타 버전 사용권 계약이 종료되어도 SUSE가 기밀 정보를 공개적으 +로 사용하기 전까지 유효합니다. + +피드백. 귀하는 SUSE에 제공한 피드백이나 정보를 SUSE에서 사용할 수 있다는 점을 이해하고 동의하며, 이와 관련해 SUSE가 귀하 +의 이름을 공개적으로 언급하지 않는 한 이러한 모든 피드백과 정보를 아무런 보상 없이 어떠한 목적으로도 사용할 수 있는 영구적이며 해지 +불가능한 사용권을 SUSE에 부여합니다. 귀하는 그와 같은 피드백과 정보에 귀하 또는 제3자의 독점 또는 기밀 정보가 포함되지 않으며 +앞서 언급한 사용권을 부여할 수 있는 모든 권한을 귀하 자신이 가지고 있다는 것을 확인하고 보증합니다. + +사용권 제한. SUSE는 귀하에게 명시적으로 부여하지 않은 모든 권한을 보유합니다. 귀하는 다음을 수행할 수 없습니다. (1) 본 소프 +트웨어에 의해 지원되며 귀하에게 사용이 허가된 연결 수를 어떠한 방법으로든 늘리거나 단일 연결을 통해 여러 연결 또는 사용자를 지원할 +수 없습니다. (2) 관련 법규에서 명시적으로 허용하는 한도를 넘어 본 소프트웨어를 리버스 엔지니어, 디컴파일 또는 디스어셈블할 수 없 +습니다. (3) 본 소프트웨어를 수정, 변경, 대여, 공유 또는 임대할 수 없으며 베타 버전 사용권 계약에 따른 권리를 재라이센스할 수 +없습니다. (4) 본 소프트웨어 또는 베타 버전 사용권 계약에서 허용하는 사용권 권리의 전체 또는 일부를 양도할 수 없습니다. + +공인 베타 테스트 사이트 + +귀하가 본 소프트웨어의 공인 베타 테스트 사이트로 승인된 경우에는 다음 규정 및 조건이 적용됩니다. 공인 베타 테스트 사이트로 선별되려 +면 SUSE 베타 프로그램 관리자에게 전자 메일(beta-programs@suse.com)로 문의하시기 바랍니다. SUSE는 +해당 SUSE 웹 사이트에 변경된 혜택을 게시함으로써 귀하에게 제공되는 혜택을 언제든지 변경할 수 있습니다. + +지원. SUSE는 해당 소프트웨어의 공인 베타 테스트 사이트에 대한 당시 SUSE의 지원 내용에 따라 본 소프트웨어와 관련한 직접 지원 +을 제공합니다. 이 지원 내용은 본 소프트웨어에 대한 SUSE의 베타 프로그램 관리자가 제공하는 내용에 따라 해당 SUSE 웹사이트에 +게시됩니다. 그와 같은 지원은 웹 기반 툴, 전자 메일 및/또는 전화를 사용하여 간편하게 사용할 수 있습니다. SUSE는 필요한 모든 +전 세계 웹 주소, 전자 메일 주소 및 전화 지원 번호를 귀하에게 제공합니다. + +테스트. 귀하는 자체 비용으로 베타 테스트 기간 동안 SUSE에서 제공하는 모든 테스트 프로그램을 수행 및 완료하고 유용하거나 필요하다 +고 판단되는 다른 테스트를 통해 본 소프트웨어를 충분히 테스트하는 데 동의합니다. 귀하는 충분한 테스트를 실시하고 이와 관련한 요구 사 +항을 충족하는 데 필요한 하드웨어, 소프트웨어 및 인력을 제공함에 동의합니다. 또한 귀하는 베타 테스트 기간 동안 테스트를 주당 4인시 +(man-hours) 이상 진행할 것에 동의합니다. 모든 테스트 과정에서는 관련 문서뿐 아니라 각 테스트와 관련된 소프트웨어의 기능, +정확성, 일관성 및 사용 편의성에 특별한 주의를 기울여야 합니다. 모든 제안 사항, 비일관성 및/또는 문제를 포함한 모든 테스트 프로그 +램 및 기타 테스트의 결과는 SUSE에서 제공 및/또는 지정한 보고 방법 및/또는 도구를 사용해 정확하고 상세하게(시스템 구성 등을 포 +함) 기록하여 매주 SUSE에 제출해야 합니다. 이러한 방법과 툴에는 웹 기반 툴, 전자 메일, 팩스, 미국 우편 및/또는 전화가 있으 +며 이에 국한되지 않습니다. 귀하는 신속한 문제 해결을 위해 장애의 원인이 오류나 버그에 따른 것인지 명확하지 않더라도 문제 발생 2일 +내에 본 소프트웨어와 관련해 발견한 모든 문제점을 보고하는 데 동의합니다. 또한 귀하는 베타 버전 테스트 기간이 끝날 무렵 Novell +에서 요청할 경우 테스트 과정 요약, 본 소프트웨어에 대한 전반적인 의견 및 자체 사용 방안이 포함된 서면 보고서를 작성하는 데 동의합 +니다. 귀하는 테스트 프로그램의 성능 및 소프트웨어의 기타 측면과 관련한 설문지를 받을 수 있으며 이 설문지를 지정된 날짜까지 해당 매 +체를 통해 제출하는 데 동의합니다. + +소유권 + +본 소프트웨어에 대한 모든 권리 또는 소유권은 귀하에게 양도되지 않습니다. SUSE 및/또는 사용권 허여자는 개정본 또는 복사본을 포함 +한 본 소프트웨어의 모든 지적 재산권을 소유 및 보유합니다. 귀하는 본 소프트웨어를 사용할 수 있는 사용권만 취득하게 됩니다. + +보증 고지 사항 + +본 소프트웨어 및 기타 기밀 정보는 어떠한 보증도 없이 "있는 그대로" 제공됩니다. 이러한 기밀 정보의 결과 및 성능과 관련한 모든 위 +험은 귀하가 부담합니다. SUSE는 명시적이거나 묵시적인 모든 보증(상품성, 특정 목적에 대한 적합성, 제목 및 비침해에 대한 묵시적인 +보증을 포함하여 이제 국한되지 않음)을 부인합니다. SUSE는 소프트웨어가 귀하의 요구 조건을 충족하거나 중단 없이 작동될 것임을 보증 +하지 않습니다. 일부 관할 지역에서는 보증에 대한 특정한 배제와 제한을 허용하지 않으므로 위 제한 중 일부는 귀하에게 적용되지 않을 수 +도 있습니다. 이 제한적 보증은 귀하에게 특정한 권리를 부여하며 관할 주에 따라 다른 권리를 제공할 수 있습니다. + +SUSE 외의 제품. 본 소프트웨어에는 SUSE 외의 사용권 허여자가 사용을 허가하거나 판매한 하드웨어 또는 기타 소프트웨어 프로그램이 +포함되거나 패키지 형태로 함께 제공될 수 있습니다. SUSE는 SUSE 소유가 아닌 제품을 보증하지 않습니다. 이러한 모든 제품은 "있 +는 그대로" 제공됩니다. SUSE 소유가 아닌 제품에 대한 보증 서비스는 해당 제품의 사용권 허여자가 사용권 허여자의 관련 보증에 따라 +제공합니다. + +책임 제한 + +결과적 손해. SUSE를 비롯한 해당 사용권 허여자, 계열사 및 직원은 본 소프트웨어의 사용 또는 사용 불가능으로 인한 모든 특별한, +부수적, 파생적, 간접적, 불법적, 경제적 또는 징벌적 손해(수익, 영업 또는 데이터 손실이 포함되며 이에 국한되지 않음)에 대해 어떠 +한 경우에도 책임을 지지 않으며, 이는 그와 같은 손해의 가능성을 사전에 알고 있던 경우에도 마찬가지입니다. +직접적인 손해. 어떠한 경우에도 재산권 또는 사람에 대한 직접적 피해와 관련해 SUSE에서 부담하는 모든 책임은 피해 건수와 상관없이 +문제가 된 소프트웨어 구입 시 귀하가 지불한 금액의 1.25배(또는 소프트웨어를 무상으로 얻은 경우에는 미화 50달러($50 +U.S.))로 제한됩니다. 위의 배제 및 제한 규정은 사망 또는 부상과 관련한 피해 청구에는 적용되지 않습니다. 손해의 배제 또는 제한 +을 허용하지 않는 관할 지역의 경우, SUSE의 책임은 해당 관할 지역이 허용하는 최대 범위 내에서 제한되거나 배제됩니다. + +일반 규정 + +지원. SUSE는 여기서 명시적으로 언급된 내용을 제외하고 본 소프트웨어에 대한 지원을 제공할 책임이 없습니다. +벤치마크 테스트. 이 벤치마크 테스트 제한은 귀하가 소프트웨어 개발자나 사용권 허여자인 경우 또는 소프트웨어 개발자나 사용권 허여자의 +지시에 따르거나 이들을 대신하여 테스트를 실시하는 경우에 적용됩니다. SUSE의 사전 서면 동의(특별한 이유 없이 보류 중이지 않은)가 +없으면 본 소프트웨어에 대한 어떠한 벤치마크 테스트 결과도 부적절하게 보유하거나 제3자에게 게시하거나 공개할 수 없습니다. 사용자가 본 +소프트웨어와 기능이 비슷하거나 경쟁하는 제품("유사 제품")의 사용권 부여자이거나, 그 사용권 부여자를 대신하여 소프트웨어 벤치마크 정 +보를 게시 또는 공개함으로써 이 제한 규정을 위반하는 경우에는 유사 제품의 최종 사용자 사용권 계약에 반하는 조항이 있더라도 SUSE는 +다른 모든 변상을 받을 수 있으며 유사 제품에 대해 벤치마크 테스트를 실시하고 이 벤치마크 결과를 공개 및 게시할 수 있는 권리를 가지 +게 되므로 사용자는 사실상 SUSE에 그와 같은 권리를 부여하는 셈이 됩니다. +공개 소스. 본 소프트웨어에 포함된 모든 공개 소스 코드에 대해 적용 가능한 모든 공개 소스 라이센스 하에서 이 계약의 어떤 부분도 귀 +하가 가진 권리 또는 책임, 또는 귀하가 처한 상황을 제한하거나 영향을 미칠 수 없습니다. +구입 의무 배제. 본 베타 버전 사용권 계약서는 소프트웨어의 상업용 버전에 대한 사용권 구입을 약속하는 의미로 해석되어서는 안 됩니다. +그와 같은 사용권 구입은 정식 주문을 통해 증명됩니다. +양도. 본 베타 사용권 계약을 SUSE의 사전 서면 승인 없이 양도하거나 할당할 수 없습니다. +법률 및 관할 지역. 본 베타 버전 사용권 계약서는 미합중국 유타 주법에 따르며 본 베타 버전 사용권 계약과 관련한 모든 법적 행위는 +유타 주 관할 법원의 소관입니다. 그러나 귀하의 거주지가 유럽 연합(EU) 또는 유럽자유무역연합(EFTA)에 포함된 주인 경우, 본 베 +타 버전 사용권 계약은 해당 국가의 법률에 따르며 모든 법적 행위는 해당 국가의 관할 법원의 소관입니다. +전면 계약. 본 사용권 계약서는 사용자와 SUSE와의 전면적 이해와 동의를 기반으로 하며, 사용자와 SUSE 담당자 간의 서면 동의에 +의해서만 수정할 수 있습니다. 어떠한 사용권 허여자, 배급업체, 중개업자, 소매점, 대리점, 영업 사원 또는 직원도 본 사용권 계약서를 +수정할 권한이 없으며 본 사용권 계약서의 내용과 다르거나 추가적인 언급 또는 약속을 할 수 없습니다. +권리 포기. 본 베타 버전 사용권 계약에 따른 모든 권리의 포기는 관련 당사자가 정식으로 승인한 대표의 서명 없이는 효력이 없습니다. +계약의 파기나 이행 실패로 인한 과거 또는 현재의 모든 권리 포기는 본 베타 버전 사용권 계약에 따른 추후의 권리까지 포기한 것으로 간 +주되지 않습니다. +조항 분리. 본 베타 버전 사용권 계약서의 조항이 유효하지 않거나 집행이 어려운 경우, 이를 해결하기 위해 필요한 범위 내에서 해당 조 +항을 해석, 제한 및 수정할 수 있으며 필요한 경우 분리할 수도 있습니다. 이때 본 베타 버전 사용권 계약서의 다른 조항은 영향을 받지 +않습니다. +수출 규정. 본 계약서하에 제공되는 모든 제품 또는 기술 정보는 미국 수출 규제 및 기타 국가 무역법의 적용을 받을 수 있습니다. 양 +당사자는 모든 수출 통제 규정을 따르고 물품을 수출, 재수출, 수입하기 위해 필요한 사용권과 분류를 얻는 것에 동의합니다. 양 당사자는 +현재 미합중국 수출 제외 목록에 올랐거나 수출 금지되었거나 미 수출 법률로 분류한 테러리스트 국가에 수출 또는 재수출하는 데 동의하지 +않습니다. 양 당사자는 금지된 핵, 미사일, 생화학 무기 등의 용도로 물품을 사용하지 않습니다. SUSE 제품을 미국 이외의 국가로 수 +출하려는 경우 먼저 www.bis.doc.gov의 미국 BIS(Bureau of Industry and Security) 웹 페이지를 +참조하십시오. SUSE 소프트웨어 수출에 대한 자세한 내용은 https://www.suse.com/company/legal/ 페이지를 +참조하십시오. 요청이 있으면, SUSE는 사용자에게 해당 제한 사항에 관한 특정 정보를 제공합니다. 하지만, SUSE는 사용자가 필요한 +수출 승인을 획득하지 못한 경우에 대해 책임을 지지 않습니다. 소프트웨어를 설치하거나 다운로드하거나 사용하면 다음을선언하는 것으로 간주 +됩니. 우리는 본 베타 테스트/평가 소프트웨어가 베타 테스트 목적으로만 사용되며 대여하거나, 임대하거나, 판매하거나, 재라이센스하거나, +할당하거나, 양도할 수 없다는 것을 인증합니. 또한 우리는 제품, 프로세스 또는 베타 테스트 소프트웨어의 직접 제품인 서비스를 양도하거 +나 수출하지 않는다는 것을 인증합니다. +미합중국 정부의 제한적 권리. 미합중국 정부에 의한 사용, 복제 및 공개는 FAR 52.227-14(1987년 6월) Alternate +III(1987년 6월), FAR 52.227-19(1987년 6월) 또는 DFARS 252.227-7013(b)(3)(1995년 11 +월) 또는 이후 관련 조항의 제한을 따릅니다. 계약자/제조자는 SUSE LLC 404 Wyman Street, Waltham, MA +02415입니다. +기타. 국제 물품 매매계약에 관한 UN 협약의 적용은 명시적으로 배제합니다. + +(c) 2013 SUSE LLC 또는 SUSE의 계열사. All Rights Reserved. +(020314) + + + diff --git a/live/root/usr/share/agama/eula/license.beta/license.pt_BR.txt b/live/root/usr/share/agama/eula/license.beta/license.pt_BR.txt new file mode 100644 index 0000000000..9245359547 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.beta/license.pt_BR.txt @@ -0,0 +1,297 @@ +Contrato de Licença para Usuário Final da SUSE(r) para Software Beta + +LEIA ESTE CONTRATO BETA COM ATENÇÃO. AO INSTALAR, FAZER DOWNLOAD OU DE +QUALQUER OUTRA FORMA UTILIZAR O SOFTWARE, VOCÊ CONCORDA COM OS TERMOSDESTE +CONTRATO BETA E COM QUALQUER CONTRATO DE LICENÇA SUPLEMENTAR DA SUSE INCLUÍDO +COM O SOFTWARE. CASO VOCÊ NÃO CONCORDE COM ESTES TERMOS, NÃO FAÇA O DOWNLOAD, +NÃO INSTALE E NÃO UTILIZE O SOFTWARE. O SOFTWARE NÃO PODE SER VENDIDO, +TRANSFERIDO OU DISTRIBUÍDO POSTERIORMENTE SEM A AUTORIZAÇÃO PRÉVIA POR ESCRITO +DA SUSE. + +Este Contrato de Licença para Usuário Final da SUSE para Software Beta +("Contrato Beta"), juntamente com qualquer Contrato de Licença Suplementar da +SUSE fornecido com o Software, constitui um acordo legal entre Você (pessoa +física ou jurídica) e a SUSE LLC ("SUSE"). O(s) software(s) que acompanha(m) +este Contrato Beta, as atualizações de software, a mídia (se houver) e sua +respectiva documentação on-line ou impressa (coletivamente o "Software") estão +protegidos pelas leis e pelos tratados de direitos autorais dos Estados Unidos +e de outros países, estando sujeitos aos termos deste Contrato Beta. Caso não +concorde com os termos deste Contrato Beta, não faça download, não instale nem +de outro modo use o Software e, se aplicável, devolva o pacote não utilizado à +SUSE. O Software é licenciado para Você, e não vendido. + +O Software pode incluir ou fazer parte de um bundle com outros programas de +software licenciados sob diferentes termos e/ou por uma licenciante que não +seja a SUSE. Os termos de um contrato de licença para usuário final que +acompanhe um arquivo de software específico durante a instalação ou o download +do software substituirão os termos apresentados a seguir. Os programas de +software de terceiros são fornecidos para uso a seu critério. A SUSE não se +responsabiliza por qualquer software de terceiros e nem pelo uso que Você faz +desse software. + +O Software pode incluir componentes compostos por pacotes de fonte aberta, +desenvolvidos de forma independente, acompanhados de termos de licença +separados. Seus direitos de licença relacionados a componentes individuais +acompanhados de termos de licença separados são definidos por esses termos. +Nenhuma cláusula deste Contrato deverá restringir, limitar ou afetar de outra +maneira quaisquer direitos ou obrigações que Você possa ter ou condições às +quais Você possa estar sujeito sob tais termos de licença. Embora os termos de +licença de um componente possam autorizar Você a distribuir esse componente, +Você não poderá usar nenhuma das marcas da SUSE (ex. SUSE e SUSE LINUX) na +distribuição do componente, quer o componente tenha ou não marcas da SUSE. + +Licença. Segundo os termos e as condições deste Contrato Beta, a SUSE concede +a Você o direito não exclusivo e intransferível de reproduzir e usar +internamente o Software durante a Vigência especificada abaixo em uma +quantidade tão razoável quanto necessária para executar a Sua avaliação e/ou +os testes do Software. + +Se um produto SUSE separado do produto fornecido para testes Beta estiver +incluído no Software, não obstante os direitos de licença do contrato de +licença que acompanha a cópia desse produto SUSE separado, Você concordará em +usar o produto SUSE separado unicamente em conexão com e exclusivamente com a +finalidade da Sua avaliação do Software. O Seu direito de usar o software do +produto SUSE separado cessa juntamente com o término do Contrato Beta, +conforme especificado abaixo. + +Termo. Este Contrato Beta entra em vigor na data de aquisição legal do +Software, permanecendo válido até a sua rescisão, da maneira a seguir. Este +Contrato Beta terminará (o que acontecer primeiro): (i) 90 dias após a data de +instalação do Software, (ii) no próximo lançamento de uma versão de +pré-lançamento, se houver, do Software, (iii) no primeiro lançamento comercial +do Software pela SUSE, (iv) mediante notificação por escrito do término por +uma das partes ou (v) na data em que Você violar algum dos termos deste +Contrato Beta. Quando do término deste Contrato Beta, Você deverá parar de +usar o Software, retornar ao estado original quaisquer ações executadas pelo +Software, destruir o Software original e todas as suas cópias ou devolvê-los à +SUSE e apagar o Software dos Seus sistemas integralmente. + +Qualidade de Pré-lançamento. Como o Software tem qualidade de pré-lançamento, +Você não deve usá-lo em um sistema comercial ou de produção. O Software não +foi totalmente testado e pode conter erros e omissões. O Software deve ser +usado apenas em ambiente de teste. A SUSE não garante que uma versão comercial +do Software será disponibilizada comercialmente para o público, que as datas +estabelecidas serão cumpridas ou que serão lançados produtos associados. Todo +o risco decorrente do uso do Software é de Sua responsabilidade. O Software +pode conter um mecanismo de desabilitação automática que impede sua utilização +após um determinado período. Portanto, Você deve fazer backup do sistema e +tomar outras medidas para evitar a perda de arquivos ou de dados. Você assume +todos os riscos da utilização do Software. + +Confidencialidade. (Esta seção se aplicará a Você, a menos que a SUSE tenha +disponibilizado o Software para o público em geral como uma versão Beta aberta +sem obrigação de confidencialidade.) O Software e todos os conceitos +englobados, respectivos materiais e documentação, recursos do produto, +resultados de testes e avaliações, resultados de benchmark, datas +estabelecidas, números PIN e senhas, e todas as outras informações +relacionadas são informações confidenciais e de propriedade da SUSE e de seus +fornecedores, sendo denominadas "Informações Confidenciais" neste documento. +Você concorda em não divulgar ou fornecer quaisquer Informações Confidenciais +a terceiros ou usar as Informações Confidenciais para quaisquer fins que não +sejam teste ou avaliação do Software e fornecimento de comentários à SUSE. Se +for fornecido um número PIN ou uma senha de acesso a sites restritos, Você +concorda em não compartilhar o número nem a senha com terceiros. Suas +obrigações de confidencialidade permanecerão após o término deste Contrato +Beta até a data em que a SUSE disponibilizar essas informações para o público. + +Comentários. Você compreende e concorda que a SUSE pode usar quaisquer +comentários ou informações que Você fornecer e, pelo presente, Você concede à +SUSE uma licença vitalícia e irrevogável para usar tais comentários e +informações com qualquer finalidade, sem nenhuma indenização a Você, desde que +a SUSE não cite publicamente o Seu nome em conexão com os mesmos. Você +representa e garante que tais comentários e informações não incluirão +informações confidenciais de Sua propriedade ou de propriedade de terceiros e +que Você tem total autoridade para conceder a supramencionada licença. + +Restrições da Licença. A SUSE reserva todos os direitos que não são +expressamente concedidos a Você. Você não pode: (1) aumentar, por qualquer +meio, o número de conexões suportadas pelo Software e licenciadas para Você ou +suportar mais de uma conexão ou mais de um usuário através de uma única +conexão; (2) fazer engenharia reversa, descompilar ou desmontar o Software, +exceto e somente na medida em que seja expressamente permitido pela lei +aplicável; (3) modificar, alterar, alugar, compartilhar, fazer leasing do +Software ou sub-licenciar qualquer um dos direitos concedidos a Você por este +Contrato Beta; ou (4) transferir o Software ou os direitos da Sua licença sob +este Contrato Beta, no total ou em parte. + +SITES DE TESTE BETA AUTORIZADOS + +Caso Você tenha sido designado como um Site de Teste Beta Autorizado do +Software, os termos e as condições a seguir se aplicam a Você. Para se +qualificar como um site de teste Beta autorizado, contate o gerente do +programa Beta pelo e-mail beta-programs@suse.com. A SUSE pode modificar +os benefícios oferecidos a Você a qualquer momento, publicando os benefícios +revisados no site aplicável da SUSE na Web. + +Suporte. A SUSE fornecerá suporte direto para o Software de acordo com a +oferta de suporte vigente da SUSE aos Sites de Teste Beta Autorizados do +Software aplicável, conforme publicado no site aplicável da SUSE na Web e +conforme comunicação do Gerente do Programa Beta da SUSE referente ao +Software. Esse suporte poderá ser facilitado por ferramentas baseadas na Web, +e-mail e/ou telefone. A SUSE fornecerá a Você todos os endereços da Web, +endereços de e-mail e números de suporte por telefone necessários. + +Teste. Você concorda em realizar e concluir, à Sua própria custa, todos os +programas de teste fornecidos pela SUSE durante o período de teste Beta e +testar totalmente o Software, realizando outros testes considerados úteis ou +necessários. Você concorda em dedicar o hardware, o software e o pessoal +necessários para realizar testes adequados e para atender às exigências aqui +estabelecidas. No mínimo, Você concorda em realizar quatro homens-hora de +testes por semana durante o período de teste Beta. Durante todos os testes, +deve-se prestar atenção específica à funcionalidade, à precisão, à +consistência e à facilidade de uso do Software envolvido em cada teste, assim +como a qualquer documentação associada. Os resultados de todos os programas de +teste e de outros testes, incluindo todas e quaisquer sugestões, +inconsistências e/ou problemas, devem ser registrados com detalhes precisos +(incluindo a configuração do sistema etc.) e enviados à SUSE semanalmente +usando o método de relatórios e/ou as ferramentas fornecidas e/ou +especificadas pela SUSE. Esses métodos e ferramentas podem incluir, sem +limitação, ferramentas baseadas na Web, e-mail, fax, correio regular e/ou +telefone. Para permitir correções imediatas, Você concorda em reportar +problemas encontrados no Software dentro de dois (2) dias após a localização +dos mesmos, independentemente da incerteza sobre se um incidente envolve um +erro ou defeito. Se solicitado, Você concorda em gerar um relatório por +escrito no final do período de testes beta, resumindo os testes realizados, as +impressões gerais sobre o Software e possíveis usos planejados do Software no +Seu ambiente. Você poderá receber questionários referentes ao desempenho dos +programas de teste e a outros aspectos do Software, os quais Você concorda em +preencher e devolver até a data e pelo meio especificados. + +DIREITOS DE PROPRIEDADE + +Nenhum direito de posse ou de propriedade do Software foi transferido a Você. +A SUSE e/ou suas respectivas licenciantes detêm a propriedade e toda a +titularidade e a posse de todos os direitos de propriedade intelectual sobre o +Software, incluindo quaisquer adaptações ou cópias. Você adquire somente uma +licença para usar o Software. + +ISENÇÃO DE RESPONSABILIDADE DA GARANTIAO SOFTWARE E OUTRAS INFORMAÇÕES +CONFIDENCIAIS SÃO FORNECIDAS A VOCÊ "COMO ESTÃO", SEM GARANTIA DE QUALQUER +TIPO. O RISCO INTEGRAL QUANTO AOS RESULTADOS E AO DESEMPENHO DAS INFORMAÇÕES +CONFIDENCIAIS É DE SUA RESPONSABILIDADE. A SUSE ISENTA-SE DE TODAS AS +GARANTIAS, EXPRESSAS OU IMPLÍCITAS, INCLUINDO, MAS SEM LIMITAÇÃO, AS GARANTIAS +IMPLÍCITAS DE COMERCIABILIDADE, ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA, +TITULARIDADE E NÃO VIOLAÇÃO. A SUSE NÃO GARANTE QUE O SOFTWARE ATENDERÁ AOS +SEUS REQUISITOS OU QUE A OPERAÇÃO DO SOFTWARE SERÁ ININTERRUPTA. Algumas +jurisdições não permitem determinadas isenções de responsabilidade e +limitações de garantias; portanto, partes das limitações descritas acima podem +não se aplicar a Você. Esta garantia limitada concede a Você direitos +específicos. Além disso, Você poderá ter direitos que variam de estado para +estado. + +Produtos de Terceiros. O Software pode incluir ou fazer parte de um bundle de +hardware ou de outros programas de software licenciados ou vendidos por uma +licenciante que não seja a SUSE. A SUSE NÃO OFERECE GARANTIAS A PRODUTOS DE +TERCEIROS. ESSES PRODUTOS SÃO OFERECIDOS "NA FORMA EM QUE SE ENCONTRAM". +QUALQUER SERVIÇO DE GARANTIA PARA PRODUTOS DE TERCEIROS É FORNECIDO PELA +LICENCIANTE DO PRODUTO DE ACORDO COM AS GARANTIAS APLICÁVEIS DA PRÓPRIA +LICENCIANTE. + +LIMITAÇÃO DE RESPONSABILIDADE + +Perdas Consequenciais. A SUSE E QUALQUER UMA DE SUAS LICENCIANTES, +SUBSIDIÁRIAS OU FUNCIONÁRIOS NÃO SERÃO RESPONSÁVEIS, EM HIPÓTESE ALGUMA, POR +QUAISQUER DANOS ESPECIAIS, INCIDENTAIS, CONSEQUENCIAIS, INDIRETOS, ILÍCITOS +ECONÔMICOS OU PUNITIVOS DECORRENTES DO USO OU DA INCAPACIDADE DE USAR O +SOFTWARE, INCLUINDO, SEM LIMITAÇÃO, PERDA DE LUCROS, NEGÓCIOS OU DADOS, MESMO +SE AVISADOS DA POSSIBILIDADE DE TAIS DANOS. +Danos Diretos. A RESPONSABILIDADE AGREGADA DA SUSE PELOS DANOS DIRETOS À +PROPRIEDADE OU À PESSOA (SEJA EM UMA INSTÂNCIA OU UMA SÉRIE DE INSTÂNCIAS), EM +NENHUM CASO, EXCEDERÁ 1,25 VEZ O VALOR QUE VOCÊ PAGOU PELO SOFTWARE OBJETO DA +RECLAMAÇÃO [OU US$ 50 SE VOCÊ TIVER RECEBIDO O SOFTWARE GRATUITAMENTE]. As +exclusões e as limitações acima não se aplicarão às reclamações referentes a +morte ou a danos físicos. Nas jurisdições em que não são permitidas a exclusão +ou limitação de danos, a responsabilidade do SUSE será limitada ou excluída, +dentro do máximo rigor permitido por essas jurisdições. + +TERMOS GERAIS + +Suporte. A SUSE não tem obrigação de fornecer suporte para o Software, salvo +se expressamente especificado neste documento. +Teste de Benchmark. Esta restrição aos testes de benchmark aplica-se a Você +caso Você seja desenvolvedor ou licenciador de software, ou caso esteja +executando testes no Software para um desenvolvedor ou licenciador ou em nome +dele. Sem o prévio consentimento por escrito do SUSE, você não pode deter, +publicar ou divulgar para terceiros os resultados de qualquer teste de +benchmark do Software. Se Você for um licenciador de produtos que tiverem +funcionalidade similar ou forem concorrentes do Software ("Produtos +Similares"), ou estiver atuando em nome de um licenciador, e vier a publicar +ou divulgar informações sobre o teste de benchmark do Software, violando assim +esta restrição, o SUSE, além de outros recursos, terá o direito de executar +testes de benchmark dos Produtos Similares e divulgar e publicar essas +informações, não obstante o contido no contrato de licença de usuário final +dos Produtos Similares; e Você, pelo presente, declara que tem autoridade para +conceder tal direito ao SUSE. +Código-fonte Aberto. Nada neste Contrato deve restringir, limitar ou de forma +alguma afetar os direitos e as obrigações que Você possa ter, ou as condições +às quais Você esteja sujeito, em relação a qualquer licença aplicável a +qualquer código-fonte aberto contido no Software. +Isenção de Obrigação de Compra. Este Contrato Beta não deverá ser interpretado +como um compromisso de compra de licenças para a versão comercialmente +disponível do Software. Tal compra será comprovada pela emissão de uma ordem +de compra formal. +Transferência. Este Contrato Beta não pode ser transferido ou atribuído sem a +aprovação prévia, por escrito, da SUSE. +Lei e Jurisdição. Este Contrato Beta é regido pelas leis do Estado de Utah, +EUA. Qualquer ação legal em relação a este Contrato Beta só poderá ser julgada +perante o tribunal de jurisdição competente do Estado de Utah. Contudo, se Seu +país de residência for um Estado membro da União Europeia ou da Associação +Europeia de Comércio Livre, este Contrato Beta será regido pelas leis desse +país e qualquer ação legal só poderá ser julgada perante o tribunal de +jurisdição competente desse país. +Contrato Completo. Este Contrato estabelece na íntegra o entendimento e o +acordo entre Você e o SUSE, e só poderá ser corrigido ou modificado mediante +um contrato por escrito, aprovado por Você e por um representante autorizado +do SUSE. NENHUM LICENCIADOR, DISTRIBUIDOR, COMERCIANTE, VAREJISTA, REVENDEDOR, +VENDEDOR OU FUNCIONÁRIO ESTÁ AUTORIZADO A MODIFICAR ESTE CONTRATO OU A FAZER +QUALQUER REPRESENTAÇÃO OU PROMESSA QUE SEJA DIFERENTE OU ADICIONAL AOS TERMOS +DESTE CONTRATO. +Desistência. Nenhuma desistência de qualquer direito sob este Contrato Beta +será considerada efetiva, a menos que seja registrada por escrito e assinada +por um representante devidamente autorizado da parte legalmente obrigada. +Nenhuma desistência de qualquer direito, passado ou presente, decorrente de +qualquer violação ou não execução deverá ser considerada como uma renúncia de +qualquer direito futuro procedente deste Contrato Beta. +Divisão. Caso qualquer disposição deste Contrato Beta se torne inválida ou não +possa ser cumprida, essa disposição deverá ser interpretada, limitada, +modificada ou, se necessário, dividida, na medida necessária, para eliminar +seu aspecto inválido ou inexequível, e as outras disposições deste Contrato +Beta deverão permanecer inalteradas. +Conformidade com as Leis de Exportação. Quaisquer informações técnicas ou +sobre produtos fornecidas segundo os termos do presente Contrato estão +sujeitas aos controles de exportação dos EUA e às leis comerciais de outros +países. As partes concordam em manter a conformidade com todas as +regulamentações de controle de exportação e em obter quaisquer licenças ou +classificações exigidas para exportar, reexportar ou importar materiais para +distribuição. As partes concordam em não exportar ou reexportar para entidades +que constam das listas atuais de exclusão de exportação dos Estados Unidos ou +para todos os países sob embargo ou que abrigam organizações terroristas, de +acordo com o especificado pelas leis de exportação dos Estados Unidos. As +partes não utilizarão os produtos para fins proibidos associados a armas +nucleares, mísseis ou armas químicas e biológicas. Consulte a página do Bureau +of Industry and Security na Web www.bis.doc.gov antes de exportar produtos da +SUSE dos EUA. Consulte o site https://www.suse.com/company/legal/ para obter +mais informações sobre como exportar o software SUSE. Mediante solicitação, o +SUSE fornecerá informações específicas sobre as restrições aplicáveis. No +entanto, o SUSE não assumirá qualquer responsabilidade se Você não obtiver as +aprovações necessárias para exportação. Ao instalar, fazer o download ou de +qualquer forma usar o software, Você concordará com a seguinte declaração: +Certificamos que este software de teste/avaliação beta só será usado para +testes beta e não será alugado, fornecido por leasing, vendido, sublicenciado, +atribuído nem transferido de qualquer outra forma. Além disso, certificamos +que não transferiremos nem exportaremos nenhum produto, processo ou serviço +que seja produto direto do software de teste beta. +Direitos Restritos do Governo dos EUA. O uso, a duplicação ou a divulgação +pelo governo dos EUA estão sujeitos às restrições dos regulamentos FAR +52.227-14 (junho de 1987) Alternativa III (junho de 1987), FAR 52.227-19 +(junho de 1987) ou DFARS 252.227-7013 (b)(3) (novembro de 1995), ou às +cláusulas sucessoras aplicáveis. O Prestador de Serviço/Fabricante é SUSE LLC, +404 Wyman Street, Waltham, MA 02415. +Outros. A aplicação da Convenção das Nações Unidas de Contratos para a Venda +Internacional de Mercadorias está expressamente excluída. + +(c) 2013 SUSE LLC ou suas afiliadas. Todos os direitos reservados. +(020314) + + + diff --git a/live/root/usr/share/agama/eula/license.beta/license.ru.txt b/live/root/usr/share/agama/eula/license.beta/license.ru.txt new file mode 100644 index 0000000000..1e94018152 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.beta/license.ru.txt @@ -0,0 +1,347 @@ +Лицензионное соглашение SUSE(r) по бета-версии программного обеспечения + +ВНИМАТЕЛЬНО ОЗНАКОМЬТЕСЬ С ДАННЫМ СОГЛАШЕНИЕМ ПО БЕТА-ВЕРСИИ. УСТАНАВЛИВАЯ, +ЗАГРУЖАЯ ИЛИ ИСПОЛЬЗУЯ ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ЛЮБЫМ СПОСОБОМ, ВЫ +ПРИНИМАЕТЕ УСЛОВИЯ ДАННОГО СОГЛАШЕНИЯ ПО БЕТА-ВЕРСИИ И ЛЮБЫХ ДОПОЛНИТЕЛЬНЫХ +ЛИЦЕНЗИОННЫХ СОГЛАШЕНИЙ SUSE, ПРИЛАГАЮЩИХСЯ К ПРОГРАММНОМУ ОБЕСПЕЧЕНИЮ. ЕСЛИ +ВЫ НЕ СОГЛАСНЫ С УСЛОВИЯМИ НАСТОЯЩЕГО СОГЛАШЕНИЯ, НЕ ЗАГРУЖАЙТЕ, НЕ +УСТАНАВЛИВАЙТЕ И НЕ ИСПОЛЬЗУЙТЕ ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. ПРОГРАММНОЕ +ОБЕСПЕЧЕНИЕ НЕЛЬЗЯ ПРОДАВАТЬ, ПЕРЕДАВАТЬ ИЛИ РАСПРОСТРАНЯТЬ ИНЫМ СПОСОБОМ БЕЗ +ПРЕДВАРИТЕЛЬНОГО ПИСЬМЕННОГО РАЗРЕШЕНИЯ ОТ SUSE. + +Данное Лицензионное соглашение об использовании бета-версии программного +обеспечения (далее - "Соглашение по бета-версии") совместно с любыми +дополнительными лицензионными соглашениями SUSE, прилагающимися к Программному +обеспечению, представляет собой юридически обязывающее соглашение между +юридическим или физическим лицом (далее - "Вы") и компанией SUSE LLC (далее - +"SUSE"). Программные продукты, с которыми поставляется настоящее Соглашение по +бета-версии, обновления для них, физические носители (если имеются) и +сопутствующая электронная или напечатанная документация (в целом Программное +обеспечение или ПО) защищены законом об авторских правах и соглашениями +Соединенных Штатов Америки и других стран и являются предметом настоящего +Соглашения по бета-версии. Если Вы не согласны с условиями настоящего +Соглашения по бета-версии, не загружайте, не устанавливайте и не используйте +данное Программное обеспечение. При возможности верните полное +неиспользованное отправление SUSE. Данное Программное обеспечение Вам не +продается; Вы получаете лишь лицензию на его использование. + +Данное Программное обеспечение может включать в себя другое программное +обеспечение или входить в комплект поставки другого программного обеспечения, +на которое распространяются иные положения лицензионного соглашения и +лицензиаром которого может являться другая компания (не SUSE). Условия +лицензионного соглашения, поставляемого с определенным программным продуктом, +заменяют указанные ниже условия после его установки или загрузки. Вы можете +использовать по своему усмотрению программные продукты сторонних +производителей. SUSE не несет ответственность за такие программные продукты и +за Ваше использование программных продуктов третьих лиц. + +Программное обеспечение может содержать компоненты с открытыми исходными +кодами и независимо разработанные компоненты, для которых будут действовать +условия отдельного лицензионного соглашения. Ваши лицензионные права в +отношении отдельных компонентов, которые предоставляются на отдельных +лицензионных условиях, определяются этими условиями. Ничто в этом Соглашении +не должно ограничивать, ущемлять или иным образом влиять на какие-либо права +или обязательства, которые Вы можете иметь, или на условия, которые могут +распространяться на Вас согласно таким лицензионным условиям. Условия +лицензионного соглашения для отдельных компонентов могут позволять Вам +распространять эти компоненты, однако Вы не имеете права использовать +какие-либо знаки SUSE (например, SUSE и SUSE LINUX) при распространении +компонента вне зависимости от того, входят ли в него эти знаки. + +Лицензия. В соответствии с условиями данного Соглашения по бета-версии, SUSE +предоставляет Вам неисключительное и не подлежащее передаче право +воспроизводить и использовать (самостоятельно или внутри компании) Программное +обеспечение в течение указанного ниже Срока действия в объемах, обоснованно +необходимых для выполнения Вами оценки и тестирования Программного +обеспечения. + +Если продукт SUSE, отдельный от продукта, предоставленного для +бета-тестирования, включен в Программное обеспечение или прилагается к нему, +то, несмотря на лицензионные права в лицензионном соглашении, прилагаемом к +копии этого отдельного продукта SUSE, Вы соглашаетесь использовать отдельный +продукт SUSE исключительно в связи с и исключительно в целях Вашей оценки +Программного обеспечения. Ваше право на использование отдельного программного +обеспечения SUSE прекращает свое действие после прекращения действия +Соглашения по бета-версии согласно указанным ниже условиям. + +Срок действия. Настоящее Соглашение по бета-версии вступает в силу в день +законного получения Вами данного Программного обеспечения и продолжает +действовать до тех пор, пока не будет прекращено в соответствии с +определенными ниже условиями. Настоящее Соглашение по бета-версии прекращается +при наступлении одного из указанных событий, в зависимости от того, какое +наступит раньше: (а) истечение 90 дней с даты установки Программного +обеспечения, (б) выход следующего выпуска предварительной версии Программного +обеспечения, если таковая имеется, (в) первый коммерческий выпуск Программного +обеспечения от SUSE, (г) оформление письменного уведомления о прекращении +действия Соглашения любой из сторон, или (д) нарушение Вами любого из условий +настоящего Соглашения по бета-версии. После расторжения данного Соглашения по +бета-версии Вы должны прекратить использование Программного обеспечения, +отменить все действия, совершенные Программным обеспечением, уничтожить +оригинал и все копии Программного обеспечения или вернуть их SUSE, а также +полностью удалить Программное обеспечение с Ваших вычислительных систем. + +Качество предварительной версии. Поскольку качество данного Программного +обеспечения соответствует качеству предварительной версии, Вы не должны +использовать это ПО в коммерческих или производственных системах. Данное +Программное обеспечение не было полностью испытано и может содержать ошибки и +недоработки. Это ПО должно использоваться только в среде, специально +приспособленной для проведения испытаний. SUSE не гарантирует, что +коммерческая версия Программного обеспечения станет общедоступной, что +намеченные цели будут выполнены в установленные сроки и что дополнительные +продукты будут выпущены. Весь риск, связанный с использованием Вами данного +Программного обеспечения, возлагается исключительно на Вас. Программное +обеспечение может содержать механизм автоматического отключения, делающий +невозможным его дальнейшее использование по истечении определенного периода, +поэтому вам следует выполнить резервное копирование системы и принять другие +меры для того, чтобы предотвратить потерю файлов или данных. Данное +Программное обеспечение используется Вами исключительно на свой собственный +риск. + +Конфиденциальность. (Этот раздел относится к Вам, если SUSE не выпустила +Программное обеспечение для широкой общественности в виде открытой бета-версии +без обязательства о неразглашении конфиденциальной информации). Программное +обеспечение и все воплощенные в нем концепции, сопроводительная документация и +материалы, функции продукта, результаты тестов и оценок, результаты +сравнительных испытаний производительности, контрольные даты, PIN-коды и +пароли, а также вся другая связанная информация являются частной и +конфиденциальной информацией SUSE и ее поставщиков и обозначены в данном +документе как "Конфиденциальная информация". Вы соглашаетесь не разглашать и +не предоставлять Конфиденциальную информацию каким-либо третьим лицам и не +использовать Конфиденциальную информацию для каких-либо целей, кроме +тестирования и оценки Программного обеспечения и предоставления обратной связи +SUSE. Если Вам будет предоставлен PIN-код или пароль для доступа к веб-сайтам +с ограниченным доступом, Вы обязуетесь не сообщать этот PIN-код или пароль +какой-либо третьей стороне. Ваши обязательства по неразглашению +конфиденциальной информации остаются в силе после прекращения действия +настоящего Соглашения по бета-версии до тех пор, пока SUSE не сделает +конфиденциальную информацию общедоступной. + +Обратная связь. Вы понимаете и принимаете следующее: SUSE может использовать +любые отзывы или информацию, которую Вы предоставляете, и тем самым +предоставляете SUSE бессрочную и безотзывную лицензию на использование всех +таких отзывов и информации в любых целях без компенсации Вам при условии, что +SUSE не будет публично ссылаться на Ваше имя в связи с используемой +информацией. Вы подтверждаете и гарантируете, что этот отзыв и эта информация +не содержат каких-либо сведений, которые носят конфиденциальный характер или +являются Вашей собственностью или собственностью какого-либо независимого +производителя, и что Вы обладаете всеми полномочиями на предоставление +вышеупомянутого права. + +Ограничения лицензии. Все права, не предоставленные Вам напрямую, сохраняются +за SUSE. Вам запрещено: 1) увеличивать каким-либо способом количество +соединений, поддерживаемое данным Программным обеспечением и оговоренное в +лицензии, использовать более одного соединения или пользователя на одном +соединении; 2) выполнять обратное проектирование, декомпилировать и +дизассемблировать данное ПО, за исключением тех случаев и только в той +степени, когда такие действия явно разрешены действующим законодательством; 3) +видоизменять, переделывать или предоставлять данное ПО или Ваши права, +определяемые настоящим Соглашением по бета-версии, в аренду или во временное +пользование; 4) полностью или частично передавать кому-либо само Программное +обеспечение или Ваши права, определяемые настоящим Соглашением по бета-версии. + +КОМПАНИИ, УЧАСТВУЮЩИЕ В ТЕСТИРОВАНИИ БЕТА-ВЕРСИИ ПРОДУКТА + +Если Вы получили статус компании, участвующей в тестировании бета-версии +продукта, то к Вам относятся указанные ниже положения и условия. Чтобы стать +авторизованным участником тестирования бета-версии, свяжитесь с менеджером +программы бета-тестирования SUSE по адресу электронной почты +beta-programs@suse.com. SUSE может изменить предлагаемые Вам +преимущества в любое время, разместив пересмотренный список преимуществ на +соответствующем веб-сайте SUSE. + +Поддержка. SUSE обеспечит прямую поддержку Программного обеспечения в +соответствии с действующим на момент ее оказания предложением SUSE для +Авторизованных участников тестирования бета-версии для соответствующего +Программного обеспечения, размещенном на соответствующем веб-сайте SUSE и +предоставленном Менеджером программы бета-тестирования SUSE для Программного +обеспечения. Процесс получения такой поддержки может быть облегчен с помощью +инструментальных веб-средств, электронной почты и/или телефона. SUSE +предоставит Вам все необходимые веб-адреса, адреса электронной почты и номера +телефонов службы поддержки. + +Тестирование. Вы соглашаетесь за свой счет выполнить и завершить все программы +тестирования, предоставляемые SUSE в течение периода бета-тестирования, и +полностью протестировать Программное обеспечение, выполнив другие тесты, +которые сочтены полезными или обязательными. Вы обязуетесь выделить +оборудование, программное обеспечение и персонал, необходимые для точного +проведения процедур тестирования и выполнения в полном объеме требований, +сформулированных в данном разделе. Вы соглашаетесь выполнять не менее четырех +человеко-часов тестирования в неделю в течение периода бета-тестирования. В +течение всего периода тестирования особое внимание необходимо уделять +функциональным характеристикам, точности и согласованности работы, простоте +использования Программного обеспечения, испытание которого проводится в каждом +из тестов, а также качеству относящейся к нему документации. Результаты всех +программ тестирования и других тестов, включая любые пожелания, сообщения о +несоответствиях и проблемах, должны подробно записываться (включая информацию +о конфигурацию системы и т. д.) и еженедельно передаваться в SUSE с +использованием методов отчетности и инструментальных средств, предоставленных +или указанных SUSE. Эти методы и инструментальные средства могут включать (но +не ограничиваться только ими) веб-средства, электронную почту, факсимильную, +почтовую (США) и/или телефонную связь. Для обеспечения быстрых исправлений Вы +обязуетесь сообщать обо всех проблемах, выявленных при тестировании +Программного обеспечения, в течение 2 (двух) дней с момента обнаружения данной +проблемы, независимо от того, есть ли ясность в вопросе о том, являются ли +выявленные проблемы следствием ошибки тестирования или ошибки в Программном +обеспечении. Вы соглашаетесь подготовить по просьбе Novell письменный отчет в +конце периода тестирования бета-версии, в котором обобщаются результаты +проведенных тестов, дается оценка Вашего общего впечатления от использования +данного Программного обеспечения и сообщается об имеющихся у Вас потенциальных +планах применения данного Программного обеспечения в среде Вашей организации. +Вам может быть предоставлен перечень вопросов, относящийся к проблемам, +связанным с проведением плана тестирования, и к другим аспектами использования +Программного обеспечения, который Вы обязуетесь заполнить и вернуть к +определенной дате с помощью указанных средств. + +ПРАВА СОБСТВЕННОСТИ + +Вам не передаются никакие права собственности на Программное обеспечение. SUSE +и ее лицензиары имеют и сохраняют за собой все права собственности и все права +интеллектуальной собственности на Программное обеспечение, включая любые +адаптации или копии. Вы получаете только лицензию на использование +Программного обеспечения. + +ЗАЯВЛЕНИЕ ОБ ОТКАЗЕ ОТ ГАРАНТИИ + +ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ И ПРОЧАЯ КОНФИДЕНЦИАЛЬНАЯ ИНФОРМАЦИЯ +ПОСТАВЛЯЮТСЯ "КАК ЕСТЬ", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. ВЕСЬ РИСК, СВЯЗАННЫЙ С +РЕЗУЛЬТАТАМИ И ЭФФЕКТИВНОСТЬЮ ИХ ИСПОЛЬЗОВАНИЯ, ВОЗЛАГАЕТСЯ НА ВАС. SUSE +ОТКАЗЫВАЕТСЯ ОТ ВСЕХ ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ +ОГРАНИЧИВАЯСЬ ИМИ, ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ПРОДАЖИ, +ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ, ПРАВА СОБСТВЕННОСТИ И НЕНАРУШЕНИЯ. SUSE НЕ +ГАРАНТИРУЕТ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ УДОВЛЕТВОРИТ ВАШИМ ТРЕБОВАНИЯМ И ЧТО +ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ БУДЕТ РАБОТАТЬ БЕЗОТКАЗНО. Если действующее +законодательство не допускает ограничения гарантии или отказа от нее, то +перечисленные выше ограничения могут к Вам не относиться. Эта ограниченная +гарантия предоставляет Вам определенные права, кроме которых Вы можете также +обладать другими правами в зависимости от действующего законодательства. + +Продукты сторонних компаний (не SUSE). Программное обеспечение может включать +в себя аппаратное или программное обеспечение, лицензированное или проданное +лицензиаром, отличным от SUSE, или входить в их комплект поставки. SUSE НЕ +ПРЕДОСТАВЛЯЕТ ГАРАНТИЮ ДЛЯ ПРОДУКТОВ, НЕ ЯВЛЯЮЩИХСЯ ПРОДУКТАМИ SUSE. ЛЮБЫЕ +ПРОГРАММНЫЕ ПРОДУКТЫ ТАКОГО РОДА ПОСТАВЛЯЮТСЯ НА УСЛОВИЯХ "КАК ЕСТЬ". ЛЮБОЕ +ГАРАНТИЙНОЕ ОБСЛУЖИВАНИЕ ДЛЯ ПРОДУКТОВ, НЕ ЯВЛЯЮЩИХСЯ ПРОДУКТАМИ SUSE, +ПРЕДОСТАВЛЯЕТСЯ ЛИЦЕНЗИАРОМ ПРОДУКТА В СООТВЕТСТВИИ С ДЕЙСТВУЮЩЕЙ ГАРАНТИЕЙ +ЛИЦЕНЗИАРА. + +ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ + +Косвенный ущерб. КОМПАНИЯ SUSE, ЕЕ ЛИЦЕНЗИАРЫ, ДОЧЕРНИЕ ПРЕДПРИЯТИЯ И +СОТРУДНИКИ НИ В КАКОМ СЛУЧАЕ НЕ НЕСУТ ОТВЕТСТВЕННОСТЬ ЗА ФАКТИЧЕСКИЕ, +СЛУЧАЙНЫЕ, КОСВЕННЫЕ, ДЕЛИКТНЫЕ, ЭКОНОМИЧЕСКИЕ ИЛИ ШТРАФНЫЕ УБЫТКИ, ВОЗНИКШИЕ +ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ИЛИ НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАТЬ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ, +ВКЛЮЧАЯ В ТОМ ЧИСЛЕ ПОТЕРЮ ПРИБЫЛИ, БИЗНЕСА ИЛИ ДАННЫХ, ДАЖЕ ЕСЛИ О +ВОЗМОЖНОСТИ ВОЗНИКНОВЕНИЯ ЭТИХ УБЫТКОВ БЫЛО ИЗВЕСТНО. +Прямые убытки. СОВОКУПНАЯ ОТВЕТСТВЕННОСТЬ SUSE ЗА ПРЯМОЙ УЩЕРБ СОБСТВЕННОСТИ +ИЛИ ЧЕЛОВЕКУ (ВНЕ ЗАВИСИМОСТИ ОТ КОЛИЧЕСТВА СИТУАЦИЙ ПОНЕСЕНИЯ УЩЕРБА) НИ В +КАКОМ СЛУЧАЕ НЕ ПРЕВЫШАЕТ СУММУ, КОТОРУЮ ВЫ УПЛАТИЛИ ЗА ПРОГРАММНОЕ +ОБЕСПЕЧЕНИЕ, ИЗ-ЗА КОТОРОГО ПОНЕСЛИ УЩЕРБ, В БОЛЕЕ ЧЕМ 1,25 РАЗ [ИЛИ НЕ +ПРЕВЫШАЕТ 50 ДОЛЛАРОВ США, ЕСЛИ ВЫ ПОЛУЧИЛИ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ +БЕСПЛАТНО]. Вышеуказанные исключения и ограничения недействительны в случае +подачи исков, связанных со смертью или причинением вреда физическому лицу. В +юрисдикциях, где исключение или ограничение ответственности за нанесенный +ущерб запрещено, ответственность SUSE следует считать ограниченной или +исключенной в той мере, в какой это разрешено законодательством такой +юрисдикции. + +ОБЩИЕ ПОЛОЖЕНИЯ + +Поддержка. SUSE не обязана предоставлять поддержку для Программного +обеспечения за исключением случаев, прямо указанных в настоящем документе. +Испытание производительности ПО. Данное ограничение на испытание +производительности действует в отношении Вас, если Вы являетесь разработчиком +или лицензиаром программного обеспечения или проводите испытание Программного +обеспечения по указанию или от имени разработчика или лицензиара программного +обеспечения. Вы не имеете права без предварительного письменного разрешения +SUSE, в котором не может быть отказано без веских оснований, публиковать или +раскрывать какой-либо третьей стороне результаты любого испытания +производительности Программного обеспечения. Если Вы являетесь лицензиаром +продуктов, сходных по своим функциональным возможностям с данным ПО или +конкурирующих с ним (далее "Аналогичные продукты"), или же действуете от имени +такого лицензиара и в нарушение приведенного выше ограничения опубликовали или +сообщили третьим сторонам информацию о результатах тестирования этого ПО, то, +несмотря на любые утверждения об обратном, которые могут содержаться в +лицензионном соглашении с конечным пользователем на Аналогичный продукт, и в +дополнение к любым средствам защиты прав, доступным SUSE, компания SUSE имеет +право провести тестирование Аналогичных продуктов и раскрыть или опубликовать +информацию о результатах этого тестирования, и настоящим Вы подтверждаете, что +обладаете полномочиями, позволяющими Вам предоставить данное право компании +SUSE. +Открытые исходные коды. Никакие положения настоящего Соглашения не будут +ограничивать или иным образом влиять на Ваши права и обязательства или +условия, которые Вы должны соблюдать, по любым применимым лицензиям на +открытые исходные коды, содержащиеся в данном Программном обеспечении. +Отсутствие обязательств по приобретению. Настоящее Соглашение по бета-версии +не может быть истолковано как обязывающее Вас приобретать лицензии на +коммерческую версию данного Программного обеспечения. Любое такое приобретение +должно быть подтверждено официальным заказом на поставку. +Передача. Настоящее Соглашение по бета-версии не может быть передано или +переуступлено без предварительного письменного согласия SUSE. +Применимое законодательство и юрисдикция. Настоящее Соглашение по бета-версии +регулируется законодательством штата Юта (США). Любой судебный иск, связанный +с данным Соглашением по бета-версии, должен рассматриваться судом этого штата. +Однако если основной страной Вашего пребывания является государство, входящее +в Европейский союз или Европейскую ассоциацию свободной торговли, то настоящее +Соглашение по бета-версии регулируется законодательством такой страны, а все +судебные иски, связанные с данным Соглашением, должны рассматриваться ее +судом. +Полнота соглашения. Настоящее Соглашение представляет собой полное соглашение +и договор между Вами и SUSE. Все изменения и дополнения к настоящему +Соглашению должны быть оформлены в письменном виде и подписаны Вами и +уполномоченным представителем SUSE. ЛИЦЕНЗИАРАМ, ДИСТРИБЬЮТОРАМ, ОПТОВЫМ И +РОЗНИЧНЫМ ПРОДАВЦАМ, РЕСЕЛЛЕРАМ, КОНСУЛЬТАНТАМ ПО ПРОДАЖАМ И СОТРУДНИКАМ +ЗАПРЕЩЕНО ИЗМЕНЯТЬ НАСТОЯЩЕЕ СОГЛАШЕНИЕ, А ТАКЖЕ ДЕЛАТЬ ЛЮБЫЕ ЗАЯВЛЕНИЯ И +ПРЕДЛОЖЕНИЯ, КОТОРЫЕ ПРОТИВОРЕЧАТ УСЛОВИЯМ НАСТОЯЩЕГО СОГЛАШЕНИЯ ИЛИ ДОПОЛНЯЮТ +ИХ. +Отказ от прав. Никакой отказ от прав, предоставляемых настоящим Соглашением по +бета-версии, не будет иметь силы, если он не изложен письменно и не заверен +подписью уполномоченного представителя соответствующей стороны. Никакой отказ +от прошлых или настоящих прав, связанный с нарушением или невозможностью +соблюдения, не считается отказом от любых будущих прав, предоставляемых +настоящим Соглашением по бета-версии. +Делимость соглашения. Если какое-либо положение настоящего Соглашения по +бета-версии окажется недействительным или невыполнимым, оно должно быть +истолковано, ограничено, изменено или, в случае необходимости, отделено в +нужной степени так, чтобы устранить его недействительность или невыполнимость +и не подвергать влиянию остальные положения настоящего Соглашения по +бета-версии. +Соответствие экспортному законодательству. На любые продукты и техническую +информацию, предоставляемые по настоящему Соглашению, могут распространяться +правила экспортного контроля США и положения торгового законодательства, +действующего в других странах. Стороны обязуются соблюдать все правила +экспортного контроля и получать все требуемые лицензии или разрешения на +экспорт, реэкспорт или импорт материалов. Стороны обязуются не осуществлять +экспорт или реэкспорт организациям, присутствующим в действующих в США списках +запрета на экспорт, а также в страны, подвергнутые эмбарго, или в +страны-спонсоры международного терроризма, как определено законами об экспорте +США. Стороны обязуются не использовать поставляемые продукты в запрещенных +целях, связанных с ядерным, ракетным, биологическим или химическим оружием. +Прежде чем экспортировать продукты SUSE из США, ознакомьтесь с информацией на +веб-странице Бюро промышленности и безопасности США (www.bis.doc.gov). Для +получения дополнительной информации об экспортировании программного +обеспечения SUSE посетите страницу https://www.suse.com/company/legal/. SUSE +предоставит Вам подробную информацию об экспортных ограничениях по запросу. +Однако компания SUSE не несет никакой ответственности в случае неполучения +Вами необходимых разрешений на экспорт. Устанавливая, загружая или используя +данное программное обеспечение иным способом, Вы соглашаетесь с указанными +ниже утверждениями. Вы обязуетесь использовать данную бета-версию или +оценочную версию программного продукта только в ознакомительных целях и не +предоставлять ее в аренду или во временное пользование, не продавать ее и не +передавать другим образом третьим лицам. Кроме того, Вы обязуетесь не +предоставлять и не экспортировать продукты, процессы или сервисы, являющиеся +прямым результатом использования данной бета-версии. +Ограничение прав для государственных организаций США. Правила использования, +копирования и распространения Программного обеспечения государственными +организациями США определяются следующими документами: FAR 52.227-14 (июнь +1987 г.) Alternate III (июнь 1987 г.), FAR 52.227-19 (июнь 1987 г.), DFARS +252.227-7013 (b)(3) (ноябрь 1995 г.) и последующими редакциями соответствующих +документов. Исполнителем работ/производителем является SUSE LLC, 404 Wyman +Street, Waltham, MA 02415 (США). +Прочие положения. Применение конвенции ООН о договорах международной +купли-продажи товаров исключается в явно выраженной форме. + +(c) SUSE LLC или ее аффилированные лица, 2013 Все права защищены. +(020314) + + + diff --git a/live/root/usr/share/agama/eula/license.beta/license.txt b/live/root/usr/share/agama/eula/license.beta/license.txt new file mode 100644 index 0000000000..dfa8b7e3aa --- /dev/null +++ b/live/root/usr/share/agama/eula/license.beta/license.txt @@ -0,0 +1,310 @@ +SUSE(R) End User License Agreement for Beta Software + +PLEASE READ THIS BETA AGREEMENT CAREFULLY. BY INSTALLING, +DOWNLOADING OR OTHERWISE USING THE SOFTWARE, YOU AGREE TO THE TERMS +OF THIS BETA AGREEMENT AND ANY SUPPLEMENTAL SUSE LICENSE AGREEMENT +INCLUDED WITH THE SOFTWARE. IF YOU DO NOT AGREE WITH THESE TERMS, +DO NOT DOWNLOAD, INSTALL OR USE THE SOFTWARE. THE SOFTWARE MAY NOT +BE SOLD, TRANSFERRED, OR FURTHER DISTRIBUTED WITHOUT PRIOR WRITTEN +AUTHORIZATION FROM SUSE. + +This SUSE End User License Agreement for Beta Software ("Beta +Agreement") together with any Supplemental SUSE License Agreement +included with the Software constitutes a legal agreement between You +(an entity or a person) and SUSE LLC ("SUSE"). The software +product(s) accompanying this Beta Agreement, software updates, media +(if any) and accompanying online or printed documentation +(collectively the "Software") is protected by the copyright laws and +treaties of the United States and other countries and is subject to +the terms of this Beta Agreement. If You do not agree with the +terms of this Beta Agreement, do not download, install or otherwise +use the Software and, if applicable, return the entire unused +package to SUSE. The Software is licensed to You, not sold. + +The Software may include or be bundled with other software programs +licensed under different terms and/or licensed by a licensor other +than SUSE. The terms of an end user license agreement accompanying +a particular software file upon installation or download of the +software shall supersede the terms presented below. Third party +software programs are provided for use at Your option. SUSE is not +responsible for any third party's software and shall have no +liability for Your use of third party software. + +The Software may include components that are open source packages, +developed independently, and accompanied by separate license terms. +Your license rights with respect to individual components +accompanied by separate license terms are defined by those terms; +nothing in this Agreement shall restrict, limit, or otherwise affect +any rights or obligations You may have, or conditions to which You +may be subject, under such license terms. While the license terms +for a component may authorize You to distribute the component, You +may not use any SUSE marks (e.g., SUSE and SUSE LINUX) in +distributing the component, whether or not the component contains +SUSE marks. + +License. Subject to the terms and conditions of this Beta +Agreement, SUSE grants You a non-exclusive, non-transferable right +to reproduce and internally use the Software during the Term +specified below in a quantity as reasonably necessary to perform +Your evaluation and/or testing of the Software. + +If a SUSE product separate to the product provided for beta testing +is included in or with the Software, then notwithstanding the +license rights in the license agreement accompanying the copy of +that separate SUSE product, You agree to use the separate SUSE +product solely in connection with and solely for the purpose of Your +evaluation of the Software. Your right to use the separate SUSE +product software terminates upon termination of the Beta Agreement +as specified below. + +Term. This Beta Agreement becomes effective on the date You legally +acquire the Software and will remain in force until terminated as +follows. This Beta Agreement shall terminate upon the earlier of: +(i) 90 days from the date of installation of the Software, (ii) the +next release of a pre-release version, if any, of the Software, +(iii) first commercial shipment by SUSE of the Software, (iv) +written notice of termination by either party, or (v) the date on +which You breach any of the terms of this Beta Agreement. Upon +termination of this Beta Agreement, You must cease use of the +Software, return to an original state any actions performed by the +Software, destroy the original and all copies of the Software or +return them to SUSE, and delete the Software entirely from Your +systems. + +Pre-Release Quality. Since the Software is of pre-release quality, +You should not use the Software in a commercial or production +system. The Software has not been fully tested and may contain +errors and omissions. The Software should be used only in a testing +environment. SUSE does not guarantee that a commercial version of +the Software will become generally available to the public, that +target dates will be met, or that associated products will be +released. The entire risk arising out of Your use of the Software +remains with You. The Software may contain an automatic disabling +mechanism that prevents its use after a certain period of time, so +You should back up Your system and take other measures to prevent +any loss of files or data. Use of the Software is entirely at Your +own risk. + +Confidentiality. (This section applies to You unless SUSE has +released the Software to the general public as an open beta without +obligation of confidentiality.) The Software and all embodied +concepts, accompanying documentation and materials, product +features, test and evaluation results, benchmark results, target +dates, PIN numbers and passwords, and all other related information +are proprietary and confidential information of SUSE and its +suppliers and are referred to herein as "Confidential Information". +You agree not to disclose or provide any Confidential Information to +any third party or use the Confidential Information for any purpose +other than testing or evaluating the Software and providing feedback +to SUSE. If provided a PIN number or password to access restricted +sites, You agree not to share the PIN number or password with any +third party. Your obligations of confidentiality shall survive +termination of this Beta Agreement until the date SUSE makes such +information publicly available. + +Feedback. You understand and agree that SUSE may use any feedback +or information You provide and You hereby grant SUSE a perpetual and +irrevocable license to use all such feedback and information for any +purpose without compensation to You, provided that SUSE shall not +publicly reference Your name in connection therewith. You represent +and warrant that such feedback and information will not include any +proprietary or confidential information of You or any third party +and that You have full authority to grant the foregoing license. + +License Restrictions. SUSE reserves all rights not expressly +granted to You. You may not: (1) increase, by any means +whatsoever, the number of connections supported by the Software and +licensed to You or support more than one connection or user through +a single connection; (2) reverse engineer, decompile, or disassemble +the Software except and only to the extent it is expressly permitted +by applicable law; (3) modify, alter, rent, timeshare or lease the +Software or sublicense any of Your rights under this Beta Agreement; +or (4) transfer the Software or Your license rights under this Beta +Agreement, in whole or in part. + +AUTHORIZED BETA TEST SITES + +If You have been appointed as an Authorized Beta Test Site for the +Software, then the following terms and conditions apply to You. To +qualify as an authorized beta test site please contact SUSE beta +program manager by e-mail at beta-programs@suse.com. SUSE may +change the benefits offered to You at any time by posting the +revised benefits on the applicable SUSE web site. + +Support. SUSE will provide direct support for the Software in +accordance with SUSE's then current support offering for Authorized +Beta Test Sites for the applicable Software as posted on the +applicable SUSE web site and as communicated by SUSE's Beta Program +Manager for the Software. Such support may be facilitated by +web-based tools, electronic mail, and/or telephone. SUSE will +provide You all necessary world-wide web addresses, electronic mail +addresses and telephone support numbers. + +Testing. You agree, at Your expense, to perform and complete all +test programs provided by SUSE throughout the beta test period and +fully test the Software by performing other tests deemed useful or +necessary. You agree to dedicate hardware, software, and personnel +as necessary to perform adequate testing and to meet the +requirements herein. At a minimum, You agree to perform at least +four man-hours of testing per week during the term of the beta test +period. During all testing, specific attention should be directed +to functionality, accuracy, consistency, and ease of use of the +Software involved in each test as well as any associated +documentation. Results of all test programs and other testing, +including any and all suggestions, inconsistencies and/or problems, +must be logged in accurate detail (including system configuration, +etc.) and submitted to SUSE on a weekly basis using the reporting +method and/or tools provided by and/or specified by SUSE. These +methods and tools may include, but are not limited to, web-based +tools, electronic mail, FAX, US Mail, and/or telephone. To enable +prompt fixes, You agree to report all problems found with the +Software within two (2) days of encountering the problem, regardless +of uncertainty about whether an incident involves an error or bug. +If requested, You agree to produce a written report at the end of +the beta test period summarizing the testing performed, overall +impressions of the Software, and potential planned uses of the +Software within Your environment. You may receive questionnaires +pertaining to the performance of test programs and other aspects of +the Software, which You agree to complete and return by the date and +medium specified. + +OWNERSHIP RIGHTS + +No title to or ownership of the Software is transferred to You. +SUSE and/or its licensors own and retain all title and ownership of +all intellectual property rights in the Software, including any +adaptations or copies. You acquire only a license to use the +Software. + +WARRANTY DISCLAIMER + +THE SOFTWARE AND OTHER CONFIDENTIAL INFORMATION IS PROVIDED TO YOU +"AS IS" WITHOUT WARRANTY OF ANY KIND. THE ENTIRE RISK AS TO THE +RESULTS AND PERFORMANCE OF THE CONFIDENTIAL INFORMATION IS ASSUMED +BY YOU. SUSE DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND +NONINFRINGEMENT. SUSE DOES NOT WARRANT THAT THE SOFTWARE WILL +SATISFY YOUR REQUIREMENTS OR THAT THE OPERATION OF THE SOFTWARE WILL +BE UNINTERRUPTED. Some jurisdictions do not allow certain +disclaimers and limitations of warranties, so portions of the above +limitations may not apply to You. This limited warranty gives You +specific rights and You may also have other rights which vary from +state to state. + +Non-SUSE Products. The Software may include or be bundled with +hardware or other software programs licensed or sold by a licensor +other than SUSE. SUSE DOES NOT WARRANT NON-SUSE PRODUCTS. ANY SUCH +PRODUCTS ARE PROVIDED ON AN 'AS IS" BASIS. ANY WARRANTY SERVICE FOR +NON-SUSE PRODUCTS IS PROVIDED BY THE PRODUCT LICENSOR IN ACCORDANCE +WITH THE APPLICABLE LICENSOR WARRANTY. + +LIMITATION OF LIABILITY + +Consequential Losses. NEITHER SUSE NOR ANY OF ITS LICENSORS, +SUBSIDIARIES, OR EMPLOYEES WILL IN ANY CASE BE LIABLE FOR ANY +SPECIAL, INCIDENTAL, CONSEQUENTIAL, INDIRECT, TORT, ECONOMIC OR +PUNITIVE DAMAGES ARISING OUT OF THE USE OF OR INABILITY TO USE THE +SOFTWARE, INCLUDING WITHOUT LIMITATION LOSS OF PROFITS, BUSINESS OR +DATA, EVEN IF ADVISED OF THE POSSIBILITY OF THOSE DAMAGES. +Direct Damages. IN NO EVENT WILL SUSE'S AGGREGATE LIABILITY FOR +DIRECT DAMAGES TO PROPERTY OR PERSON (WHETHER IN ONE INSTANCE OR A +SERIES OF INSTANCES) EXCEED 1.25 TIMES THE AMOUNT PAID BY YOU FOR +THE SOFTWARE OUT OF WHICH SUCH CLAIM AROSE [OR $50 (U.S.) IF YOU +RECEIVED THE SOFTWARE FREE OF CHARGE]. The above exclusions and +limitations will not apply to claims relating to death or personal +injury. In those jurisdictions that do not allow the exclusion or +limitation of damages, SUSE's liability shall be limited or excluded +to the maximum extent allowed within those jurisdictions. + +GENERAL TERMS + +Support. SUSE has no obligation to provide support for the Software +except as expressly stated herein. +Benchmark Testing. This benchmark testing restriction applies to +You if You are a software developer or licensor or if You are +performing testing on the Software at the direction of or on behalf +of a software developer or licensor. You may not, without SUSE's +prior written consent not to be unreasonably withheld, publish or +disclose to any third party the results of any benchmark test of the +Software. If You are a licensor of products that are functionally +similar to or compete with the Software ("Similar Products"), or are +acting on behalf of such a licensor, and You publish or disclose +benchmark information on the Software in violation of this +restriction, then notwithstanding anything to the contrary in the +Similar Product's end user license agreement, and in addition to any +other remedies SUSE may have, SUSE shall have the right to perform +benchmark testing on Similar Products and to disclose and publish +that benchmark information and You hereby represent that You have +authority to grant such right to SUSE. +Open Source. Nothing in this Agreement shall restrict, limit or +otherwise affect any rights or obligations You may have, or +conditions to which You may be subject, under any applicable open +source licenses to any open source code contained in the Software. +No Obligation to Purchase. This Beta Agreement shall not be +construed as committing You to purchase licenses for the +commercially available version of the Software. Any such purchase +will be evidenced by the issuance of a formal purchase order. +Transfer. This Beta Agreement may not be transferred or assigned +without the prior written approval of SUSE. +Law and Jurisdiction. This Beta Agreement is governed by the laws +of the State of Utah, U.S. Any action at law relating to this Beta +Agreement may only be brought before the courts of competent +jurisdiction of the State of Utah. If, however, Your country of +principal residence is a member state of the European Union or the +European Free Trade Association, this Beta Agreement is governed by +the laws of that country, and any action at law may only be brought +before a court of competent jurisdiction of that country. +Entire Agreement. This Agreement sets forth the entire +understanding and agreement between You and SUSE and may be amended +or modified only by a written agreement agreed to by You and an +authorized representative of SUSE. NO LICENSOR, DISTRIBUTOR, +DEALER, RETAILER, RESELLER, SALES PERSON, OR EMPLOYEE IS AUTHORIZED +TO MODIFY THIS AGREEMENT OR TO MAKE ANY REPRESENTATION OR PROMISE +THAT IS DIFFERENT FROM, OR IN ADDITION TO, THE TERMS OF THIS +AGREEMENT. +Waiver. No waiver of any right under this Beta Agreement will be +effective unless in writing, signed by a duly authorized +representative of the party to be bound. No waiver of any past or +present right arising from any breach or failure to perform will be +deemed to be a waiver of any future right arising under this Beta +Agreement. +Severability. If any provision in this Beta Agreement is invalid or +unenforceable, that provision will be construed, limited, modified +or, if necessary, severed, to the extent necessary, to eliminate its +invalidity or unenforceability, and the other provisions of this +Beta Agreement will remain unaffected. +Export Compliance. Any products or technical information provided +under this Agreement may be subject to U.S. export controls and the +trade laws of other countries. The parties agree to comply with all +export control regulations and to obtain any required licenses or +classification to export, re-export or import deliverables. The +parties agree not to export or re-export to entities on the current +U.S. export exclusion lists or to any embargoed or terrorist +countries as specified in the U.S. export laws. The parties will +not use deliverables for prohibited nuclear, missile, or chemical +biological weaponry end uses. Please consult the Bureau of Industry +and Security web page www.bis.doc.gov before exporting SUSE products +from the U.S. Please refer to https://www.suse.com/company/legal/ +for more information on exporting SUSE software. Upon request, SUSE +will provide You specific information regarding applicable +restrictions. However, SUSE assumes no responsibility for Your +failure to obtain any necessary export approvals. By installing, +downloading or otherwise using the software, You are deemed to make +the following statement: We certify that this beta test/evaluation +software will only be used for beta testing purposes, and will not +be rented, leased, sold, sublicensed, assigned, or otherwise +transferred. Further, we certify that we will not transfer or export +any product, process, or service that is the direct product of the +beta test software. +U.S. Government Restricted Rights. Use, duplication, or disclosure +by the U.S. Government is subject to the restrictions in FAR +52.227-14 (June 1987) Alternate III (June 1987), FAR 52.227-19 (June +1987), or DFARS 252.227-7013 (b)(3) (Nov 1995), or applicable +successor clauses. Contractor/Manufacturer is SUSE LLC 404 Wyman +Street, Waltham, MA 02415. +Other. The application of the United Nations Convention of +Contracts for the International Sale of Goods is expressly excluded. + +(c)2013 SUSE LLC or its affiliates. All Rights Reserved. +(020314) diff --git a/live/root/usr/share/agama/eula/license.beta/license.zh_CN.txt b/live/root/usr/share/agama/eula/license.beta/license.zh_CN.txt new file mode 100644 index 0000000000..cb1757ce9a --- /dev/null +++ b/live/root/usr/share/agama/eula/license.beta/license.zh_CN.txt @@ -0,0 +1,125 @@ +针对 Beta 软件的 SUSE(r) 最终用户许可协议 + +请仔细阅读本 Beta 协议。 安装、下载或以其他方式使用本软件,即表示您同意本 Beta 协议中的条款以及软件中附带的任何 SUSE 补充许可协议。 +如果您不同意这些条款,请不要下载、安装或使用本软件。未经 SUSE 事先书面授权,不得出售、转让或进一步分发本软件。 + +这份针对 Beta 软件的 SUSE 最终用户许可协议(以下简称"Beta 协议")与本软件附带的任何 SUSE 补充许可协议构成您(实体或个人)与 +SUSE LLC(以下简称"SUSE")之间的法律协议。附带本 Beta 协议的软件产品、软件更新、媒体(如果有)和附带在线或印刷文档(统称"软件") +受美国和其它国家/地区的版权法和条约的保护,并受本 Beta 协议的条款的约束。如果您不同意本 Beta 协议的条款,请不要下载、安装或以其他方式使用 +本软件,并在适用的情况下,将完整的未使用的软件包退还给 SUSE。本软件只许可您使用,而不是出售给您。 + +本软件可能包含或捆绑有其他软件程序,这些软件程序根据不同的条款许可,并/或由 SUSE 之外的许可证颁发者许可。安装或下载软件时附带特定软件文件的最终 +用户许可协议的条款应取代以下所述条款。您可自行决定是否使用提供的第三方软件程序。SUSE 不对任何第三方软件负责,并且也不应承担您使用第三方软件的责任。 + +本软件可能包含独立开发的开放源代码软件包组件,并且附带独立的许可条款。这些许可条款规定了您对具有单独许可条款的各个组件所享有的许可权利;本协议中的任何 +内容均不会约束、限制或影响根据这些许可条款您可能具有的任何权利或义务,或可能需要遵从的任何条件。尽管某一组件的许可条款可能授予您分发该组件的权利,但无 +论该组件是否包含 SUSE 标记(如:SUSE 及 SUSE LINUX),分发该组件时均不得使用任何 SUSE 标记。 + +许可证。依照本 Beta 协议的条款和条件,SUSE 授予您非独占、不可转让的权利,允许您在下面指定的期限内重新制作及于内部使用本软件,重新制作和使用 +次数依据您执行评估和/或测试本软件所需的必要数量而定。 + +如果本软件包含或随附非用于 Beta 测试的 SUSE 产品,尽管有附带单独 SUSE 产品副本的许可证协议中所规定的许可权,您同意将单独 SUSE +产品用于仅限有关且仅为您对软件评估之目的。您使用 SUSE 软件的权利随本 Beta 协议终止时终止,具体如下所述。 + +术语。本 Beta 协议自您合法获得本软件之日起生效,到终止之时失效。以下情况下,本 Beta 协议将会终止(以先发生之日为准):(1) 从安装本软件 +之日起的 90 天后,(2) 下一次发布本软件的预发布版(如果有),(3) SUSE 第一次交付本软件商业版,(4) 任一方书面通知终止,或 (5) +您违反本 Beta 协议任何条款之日。本 Beta 协议终止时,您必须停止使用本软件,恢复到本软件所执行动作的原始状态,销毁本软件的原件及所有副本或将 +它们退还给 SUSE,并从您的系统中彻底删除本软件。 + +预发布质量。由于本软件为预发布质量,您不应在商业或生产系统中使用本软件。本软件未经全面测试,可能含有错误或疏漏。本软件只应用于测试环境。SUSE 不保 +证本软件的商业版本将适合多数公众、将符合目标日期或将发布关联产品。您使用本软件而引发的全部风险由您自行承担。本软件可能包含禁止在特定时间段后继续使用该 +软件的自动禁用机制,因此,应对您的系统进行备份或采取其他措施来防止丢失任何文件或数据。使用本软件完全由您自担风险。 + +机密性。(除非 SUSE 已将本软件作为开放 Beta 版向普通大众发布,不要求保密,否则该条适用于您。)本软件及所有包含的概念、附带文档及资料、产品 +功能、测试和评估结果、基准测试结果、目标日期、PIN 码和密码以及所有其他相关信息,都是 SUSE 及其供应商的专有机密信息,在本协议中称为"机密信 +息"。您同意不向任何第三方披露或提供任何机密信息,或将机密信息用于测试或评估本软件以及向 SUSE 提供反馈之外的任何目的。如果为您提供了用于访问受限 +网站的 PIN 码或密码,您同意不向任何第三方共享该 PIN 码或密码。在本 Beta 协议终止之后,您仍有义务保密该信息,直到 SUSE 公开此类信 +息为止。 + +反馈。 您了解并同意 SUSE 可以使用您提供的任何反馈或信息,并特此授予 SUSE 永久且不可撤销的许可,允许 SUSE 将所有此类反馈和信息用于任 +何用途,而不必为您提供报酬,只要 SUSE 不在与此相关的事务中公开提及您的名字即可。您声明并保证此类反馈和信息不包含您或任何第三方的专有或机密信息, +并且您具有授予上述许可的全部权限。 + +许可证限制。SUSE 保留所有未明确授予您的权利。您无权:(1) 通过任何手段增加本软件支持的或对您许可的连接数量,或者通过单一连接支持多个连接或用户; +(2) 反向工程、反编译或者反汇编本软件(除非且仅在适用法律明确许可的范围内);(3) 修改、更改、租赁、分时共享或租用本软件或发放本 Beta 协 +议授予您的任何权利的从属许可证;或者 (4) 转让本软件或本 Beta 协议授予您的许可证权利(不管是全部还是部分)。 + +授权 BETA 测试站点 + +如果您已被委任为本软件的授权 Beta 测试站点,则下列条款和条件适用于您。要获得授权 Beta 测试站点资格,请发送电子邮件至 +beta-programs@suse.com 与 SUSE Beta 项目经理联系。SUSE 可能会在相应的 SUSE 网站上发布修改的补 +助金,随时更改为您提供的补助金。 + +支持。SUSE 将按 SUSE 相应网站上发布的内容以及 SUSE Beta 程序经理针对本软件的通知,依照 SUSE 当时对授权 Beta 测试站点 +提供的支持,提供对本软件的直接支持。此类支持可通过基于 Web 的工具、电子邮件和/或电话进行。SUSE 将为您提供所有必要的万维网网址、电子邮件地址 +和支持电话号码。 + +测试。 您同意自费执行并完成 SUSE 在整个 Beta 测试期间提供给您的所有测试程序,并通过执行其他视为有用或必要的测试来全面测试本软件。您同意提 +供执行足够测试以及满足本协议中要求所需的硬件、软件和人力。您同意最低限度在 Beta 测试期间每周至少执行 4 小时工时测试。在所有测试期间,应特别侧 +重于每次测试以及任何关联文档中涉及的本软件的功能、准确性、一致性和易用性。所有测试程序和其他测试的结果,包括任何及所有建议、不一致性和/或问题,必须准 +确详细记录(包括系统配置等)并使用 SUSE 提供和/或指定的报告方法和/或工具每周提交给 SUSE。这些方法和工具包括但不限于基于 Web 的工具、 +电子邮件、传真、美国邮政服务和/或电话。为了能够及时修正问题,您同意在发现本软件的问题的两 (2) 天内即报告所有问题,即使您不确定错误或 Bug 是 +否由于意外因素而产生。如果收到请求,您同意在 Beta 测试期结束时提交一份书面报告,总结所执行的测试、对本软件的总体评价以及在您的环境中对本软件可能 +的计划用途。您可能会收到有关测试程序性能和本软件其他方面的问卷,您同意在指定日期之前使用指定的媒介完成并发回这些问题。 + +所有權 + +此軟體之任何所有權或擁有權均未轉讓予您。SUSE 和/或其许可证颁发者拥有并保留本软件(包括任何改编版本或副本)中所有知识产权的所有权利和所有权。您获 +得的只是本软件的使用许可。 + +担保免责声明 + +本软件及其他机密信息按"原样"提供给您,不提供任何形式的担保。与机密信息的结果和性能相关的全部风险均由您自行承担。SUSE 不作任何明示或暗示的担保, +包括但不限于适销性、特定目的的适用性、权利和不侵权的担保。SUSE 不担保本软件能满足您的要求,也不担保本软件的运行不会中断。有些司法管辖区不允许某些 +免责声明和对担保的限制,因此,上述部分限制对您未必适用。本有限担保对您授予了特定权利,由于各个州(国家/地区)的不同,您可能还拥有其它权利。 + +非 SUSE 产品。本软件可能包含 SUSE 以外许可方授权使用或出售的硬件或其它软件程序或与它们捆绑在一起。SUSE 不担保非 SUSE 产品。任何 +此类产品均按"原样"提供。非 SUSE 产品的任何担保服务由该产品的许可证颁发者依据适用的许可证颁发者担保而提供。 + +有限责任 + +连带损失。任何情況下,對於因使用或無法使用此軟體所造成之任何特殊、意外、衍生性、間接、侵權、懲罰性傷害,即使是在已知可能造成損失之情況下,SUSE 或 +其任何授權者、子公司或員工均不負任何賠償責任,包括但不限於利益、商業或資料損失。 +直接损失。在任何情况下,SUSE 对财产或个人的直接损害的总赔偿额(无论是一个实例还是一系列实例)都不超过您为导致此索赔的软件所支付金额的 1.25 +倍(如果您是免费获得该软件的,则为 50 美元)。上述免除和限制不适用于与死亡或人身伤害有关的索赔。对于不允许免除或限制损失责任的法律管辖区,SUSE +的责任应根据这些法律管辖区内允许的最大程度予以限制或免除。 + +一般条款 + +支持。除了本协议所述内容之外,SUSE 没有义务提供对本软件的支持。 +基准测试。如您为软件研发者或许可证颁发者,或您按照软件研发者或许可证颁发者的指示,或代表软件研发者或许可证颁发者对本软件进行测试,则须遵守本基准测试限 +制。未经 SUSE 事先书面许可(SUSE 不得无故拒绝许可),不得公布或向任何第三方批露本软件任何基准测试的结果。如果您许可的产品在功能上与本软件类 +似或构成竞争关系(以下简称"类似产品"),或您的行为代表此类许可证颁发者,而您违反上述限制公布或披露本软件的基准信息,则不论该类似产品的最终用户许可协 +议有何相反规定,SUSE 在其可能享有的任何其他补救措施之外,有权对该类似产品实施基准测试并披露和公布其基准信息。您据此声明您有权将此项权利授予 +SUSE。 +开放源代码。对于本软件中包含的任何开放源代码,本协议的任何条款均不得限制、约束或以其它方式影响任何适用开放源代码许可证所赋予您的任何相应的权利或义务或 +您应遵守的各种条件。 +无购买义务。本 Beta 协议不应解释为承诺您购买本软件商业版本的许可证。任何此类购买均应以正式采购订单的下发为依据。 +转让。未经 SUSE 的事先书面批准,不得转让或让渡本 Beta 协议。 +法律和司法管辖权。本 Beta 协议受美国犹他州法律管辖。与本 Beta 协议相关的任何法律诉讼,只能向犹他州具有司法管辖权的法院提出。不过,如果您的 +主要居住地所在的国家/地区是欧盟或欧洲自由贸易联盟的成员国,本 Beta 协议将受该国家/地区的法律管辖,并且任何法律诉讼只能向该国家/地区具有司法管 +辖权的法院提出。 +完整协议。本协议构成您与 SUSE 之间的完整理解与协议。未经您与 SUSE 授权代表书面同意,不得修正或修改。任何许可证颁发者、分销商、经销商、零售 +商、转售商、销售人员或雇员,均无权修改本协议,或做出与协议条款不一致、或本协议条款之外的任何陈述或承诺。 +弃权。放弃本 Beta 协议中任何权利均应以书面提交,并由受约束一方正式授权的代表签名后方可生效。对违约或未履约引发的任何过往或当前权利的弃权,不得视 +为对未来依照本 Beta 协议而应具有的任何权利的弃权。 +可分割性。如本 Beta 协议中的任何条款无效或不可执行,应对该条款加以解释、限制、修改或必要时对其分割,如果必需,还可删除无效或不可执行的部分。本协 +议其它条款不受影响。 +出口管制。依据本协议提供的任何产品或技术信息都将受到美国出口管制和其他国家/地区的贸易法律的约束。双方均同意遵守所有出口管制法规,并同意在出口、再出口 +或进口可交付产品之前取得所有必要的许可证或分类证书。双方均同意不向美国目前的出口排除列表上的国家/地区或组织,或美国出口法律中规定的任何禁运国家/地区 +或支持恐怖主义的国家/地区进行出口或再出口。双方均同意不将可交付产品用于禁止的核、导弹或生化武器的终端使用。在将 SUSE 产品从美国出口至境外前,请 +查阅美国商务部工业安全局网页 www.bis.doc.gov。有关出口 SUSE 软件的详细信息,请参考 +https://www.suse.com/company/legal/。如有要求,SUSE 将提供适用法规限制的具体信息。如果您未能获得任何必要的出口 +许可,SUSE 对此不负任何责任。安装、下载或以其他方式使用本软件,即视为您作出以下声明:我们保证此 Beta 版测试/评估软件将仅用于 Beta 测 +试目的,不会将其租借、租赁、销售、发放从属许可证、让渡或以其他方式转让。另外,我们保证我们不会运输或出口属于 Beta 版测试软件直接产品的任何产品、 +流程或服务。 +美国政府有限权利。美国政府的使用、复制或公布行为必须遵从 FAR 52.227-14 (June 1987) Alternate III (June +1987)、FAR 52.227-19 (June 1987)、DFARS 252.227-7013 (b) (3) (Nov 1995) 或适用后续 +条款的限制。承包商/制造商为 SUSE LLC 404 Wyman Street, Waltham, MA 02415。 +其他。《联合国国际货物销售合同公约》不适用于本协议。 + +(c) 2013 SUSE LLC 或其分公司。保留所有权利。 +(020314) + + + diff --git a/live/root/usr/share/agama/eula/license.beta/license.zh_TW.txt b/live/root/usr/share/agama/eula/license.beta/license.zh_TW.txt new file mode 100644 index 0000000000..e51a1dce5f --- /dev/null +++ b/live/root/usr/share/agama/eula/license.beta/license.zh_TW.txt @@ -0,0 +1,124 @@ +適用於 Beta 版軟體的 SUSE(r) 最終使用者授權合約 + +請仔細閱讀本 Beta 合約。 安裝、下載或以其他方式使用本軟體,即表示您同意「軟體」隨附的 Beta 合約及任何補充 SUSE 授權合約的條款。如果 +您不同意這些條款,請不要下載、安裝或使用此軟體。未經 SUSE 事先書面授權,不得銷售、轉讓或散佈此軟體。 + +適用於 Beta 版軟體的 SUSE 最終使用者授權合約 (簡稱「Beta 合約」) 及「軟體」隨附的任何補充 SUSE 授權合約構成您 (實體或個人) +與 SUSE LLC (簡稱「SUSE」) 之間的法律合約。隨附本 Beta 合約的軟體產品、軟體更新、媒體 (若有) 及隨附的線上或列印文件 +(統稱「軟體」) 受美國和其他國家/地區著作權法和公約的保護,並且受本 Beta 合約條款的約束。如果您不同意本 Beta 合約的條款,請不要下載、安裝 +或以其他方式使用「軟體」;在適用情況下,請將完整未使用過的套件退還給 SUSE。「軟體」僅授權由台端使用,並非販售賣斷。 + +「軟體」可包含或隨附於以不同條款授權的其他軟體程式,及/或由非 SUSE 之授權人所授權的其他軟體程式。安裝或下載特定軟體時,該軟體檔案隨附之最終使用 +者授權合約的條款應取代下列所示的條款。本合約提供的協力廠商軟體程式供您自由選擇使用。SUSE 對於任何協力廠商之軟體不負任何責任,對於您使用協力廠商軟 +體亦不負任何賠償責任。 + +「軟體」可能包含獨立開發的開放原始碼套件元件,並且隨附個別授權條款。對於分別具有授權條款的個別元件,您所獲得的授權依這些條款而定;此「合約」中沒有任何 +規章可約束、限制或影響您在個別授權條款下所具備的權利與義務、以及必須遵守的條件。儘管某元件的授權條款可能授予您發佈該元件的權利,但您不得在發佈該元件時 +使用任何 SUSE 標誌 (例如 SUSE 與 SUSE LINUX),不論該元件是否含有 SUSE 標誌。 + +授權。SUSE 基於本 Beta 合約的條款與條件規定,授予您非專屬且不可轉讓的權利,允許您於內部組織中重製與使用本「軟體」,重製與使用的次數視您執行 +「軟體」評估和/或測試所需的必要數量而定。 + +若 SUSE 產品不屬於 Beta 版測試目之產品,但納入或附隨於本軟體,則不論附隨該個別 SUSE 產品副本之授權合約載有哪些授權權利,您皆同意使用 +該個別 SUSE 產品之目的,僅限於與您評估本軟體用途有關,且僅限於為評估本軟體之用途。您對於個別 SUSE 產品軟體的使用權將隨本 Beta 合約的 +終止而終止,具體如下所述。 + +專有名詞。本 Beta 合約將在您合法獲得本「軟體」之日起生效,到終止時失效。本 Beta 合約應在出現以下任一情況時終止,以先發生之日為準:(i) +從安裝「軟體」之日起 90 天後;(ii) 下一次發行「軟體」的預先發行版本 (如果有);(iii) SUSE 第一次交付「軟體」商業版;(iv) 任 +何一方書面通知終止,或 (v) 您違反本 Beta 合約任何條款之日。本 Beta 合約終止時,您必須停止使用「軟體」、恢復到「軟體」所執行動作的原始 +狀態、銷毀「軟體」的所有原本與副本或將其退還給 SUSE,並從您的系統中完全刪除「軟體」。 + +預先發行品質。由於「軟體」為預先發行品質,故您不得將本「軟體」用於商業或生產環境系統。本「軟體」未經過全面測試,可能存在錯誤和疏漏。本「軟體」應僅用於 +測試環境。SUSE 不保證本「軟體」的商業版將適用於公眾、將符合目標日期或將發行相關產品。因使用本「軟體」而引發的全部風險由您自行承擔。本「軟體」可能 +包含自動失效機制,以防止逾期使用。因此請將系統備份,以及採取其他措施以防止檔案或資料遺失。使用此「軟體」之責任完全由您自行承擔。 + +機密性。(除非 SUSE 已將本「軟體」作為開放 Beta 版面向普通公眾發行,無需承擔保密義務,否則該條款適用於您。)「軟體」及所有包含的概念、隨附 +文件及材料、產品功能、測試及評估結果、基準測試結果、目標日期、PIN 號碼和密碼以及所有其他相關資訊,都是 SUSE 及其供應商的專屬機密資訊,在本合 +約中稱為「機密資訊」。您同意不向任何協力廠商洩漏或提供任何機密資訊,或將機密資訊用於測試或評估「軟體」以及向 SUSE 提供意見反應之外的任何目的。如 +果為您提供用於存取受限站點的 PIN 號碼或密碼,您同意不向任何協力廠商共用該 PIN 號碼或密碼。在本 Beta 合約終止之後,您仍有義務保密該資訊, +直到 SUSE 公開此類資訊為止。 + +意見反應。 您瞭解並同意 SUSE 可以使用您提供的任何意見反應或資訊,並在此授予 SUSE 永久且不可撤銷的授權,只要 SUSE 不在與此相關的事務 +中公開提及您的姓名,即可將所有此類意見反應及資訊用於任何用途,而不必向您提供報酬。您聲明並保證此類意見反應及資訊不包含您或任何協力廠商的任何專屬或機密 +資訊,並且您具有授予上述授權的全部權限。 + +授權限制。SUSE 保留未明確授與您之所有權利。您不得:(1) 以任何方式增加「軟體」支援的或對您授權的連線數量,或透過單一連線支援多個連線或使用者; +(2) 對「軟體」進行反向工程、反編譯或反組譯,除非且僅限於適用法律明確允許的範圍內;(3) 修改、變更、出租、分時共用或租用本「軟體」,或將本「 +Beta 合約」中之任何權利轉授給他人;或 (4) 轉讓本「軟體」或本「Beta 合約」中之全部或部分權利。 + +授權 BETA 測試站點 + +如果您已被委任為「軟體」的授權 Beta 測試站點,則下列條款和條件適用於您。若要取得授權 Beta 測試網站的資格,請透過電子郵件聯絡 SUSE +Beta 程式經理,電子郵件地址:beta-programs@suse.com。SUSE 可能會在適用的 SUSE 網站上公佈修改的權益, +隨時變更為您提供的權益。 + +支援。SUSE 將根據 SUSE 適用網站上公佈的內容以及 SUSE Beta 程式經理針對「軟體」的通知,按照 SUSE 目前對授權 Beta 測試 +站點提供的支援,提供對「軟體」的直接支援。此類支援可透過 Web 型工具、電子郵件及/或電話獲得。SUSE 將為您提供所有必要的全球資訊網網址、電子郵 +件地址及電話支援號碼。 + +測試。 您同意自費執行並完成 SUSE 在整個 Beta 測試期間為您提供的所有測試程式,並透過執行其他視為有用或必要的測試來全面測試「軟體」。您同意 +提供執行適當測試及滿足本合約中之要求所需的硬體、軟體和人力。您同意在 Beta 測試期間內,每週至少執行 4 小時工時測試。在所有測試期間,應特別注意 +每次測試及任何相關文件所涉及的「軟體」功能、準確性、一致性和易用性。所有測試程式及其他測試的結果,包括任何及所有建議、不一致性和/或問題,必須準確詳細 +地加以記錄 (包括系統組態等),並使用 SUSE 提供和/或指定的報告方法和/或工具,每週向 SUSE 提交一次。這些方法和工具包括但不限於 Web +型工具、電子郵件、傳真、美國郵件服務和/或電話。為了能夠及時修正,您同意在遇到「軟體」問題的兩 (2) 天內報告所有問題,即使您不確定事件中是否存在錯 +誤或 Bug。 應要求,您同意在 Beta 測試期結束時撰寫一份書面報告,總結執行的測試、對「軟體」的總體評價以及在您的環境中對「軟體」的潛在計畫用途。 +您可能會收到關於測試程式效能與「軟體」其他方面的問卷,您同意在指定日期之前採用指定媒體完成並傳回這些問題。 + +所有權 + +此軟體之任何所有權或擁有權均未轉讓予您。SUSE 及/或其授權者擁有並保留「軟體」中所有智慧財產權的所有權利和擁有權,包括任何改寫及副本在內。您僅取得 +本「軟體」的使用授權。 + +免責聲明 + +「軟體」及其他機密資訊「依現狀」提供給您,而不提供任何形式的擔保。與「機密資訊」結果及效能相關的所有風險均由您承擔。SUSE 不承擔所有明示或暗示擔保, +包括但不限於適售性、適於特定用途、所有權及非侵權之擔保。SUSE 不保證此軟體將滿足您的需求,亦不保證此軟體之操作不會中斷。有些管轄區域不允許特定免 +責聲明和擔保限制,因此上述限制中可能有部分內容不適用於您。這份有限擔保會提供您特定權限,因此您可能會因地區差異而擁有不同的權利。 + +非 SUSE 產品。本軟體可包含於、或附隨於由非 SUSE 的其他授權人所授權或販售之硬體或其他軟體進行配送。SUSE 不為非 SUSE 產品提供保證。 +任何此類產品均係依產品既有規格提供。非 SUSE 產品之任何擔保服務均由產品授權者根據適當的授權者擔保而提供。 + +賠償限制 + +衍生性損失。任何情況下,對於因使用或無法使用此軟體所造成之任何特殊、意外、衍生性、間接、侵權、懲罰性傷害,即使是在已知可能造成損失之情況下,SUSE +或其任何授權者、子公司或員工均不負任何賠償責任,包括但不限於利益、商業或資料損失。 +直接損害。任何情況下,SUSE 對於財產或人身 (不論是單次或連續多次) 構成直接損害之總賠償金額以不超過您購買上述所指軟體金額的 1.25 倍為限 +[或如果您是免費取得此軟體,則不得超過 $50 (美金)]。對於因此造成死亡或人員受傷者,上述排除及限定條款將不適用。在不允許排除或限定損害之管轄區域 +內,SUSE 之賠償責任以該管轄區域內所允許限制之最大範圍為限。 + +一般條款 + +支援。除了此處明確規定的支援之外,SUSE 沒有提供「軟體」支援之義務。 +基準測試。若您為軟體開發者或授權者,或若您代表或依據軟體開發者或授權者之指示,以進行測試工作,則適用本基準測試的限制。未經 SUSE 之事先書面同意 +(無正當理由不應拒絕),您不得將本軟體之任何基準測試結果公佈或洩漏給任何協力廠商。如果您是功能上與本軟體類似或與本軟體有競爭的產品 (以下簡稱「類似產 +品」) 的授權者,或者代表此類授權者經營,而您違反本限制公佈或洩漏了有關本軟體的基準資訊,則不論此類似產品的終端使用者授權合約中是否有相反的限制, +SUSE 除了可能會對此採取任何其他補救措施外,還應有權對此類似產品執行基準測試以及洩露和公佈該基準資訊,而且您在此聲明您有權授予 SUSE 這種權 +利。開放原始碼。此「合約」中任何規範均不得約束、限制或影響您具備的任何權利與義務,或在「軟體」所包含任何開放原始碼之適當開放原始碼授權中所應遵守的條件。 +無購買義務。本 Beta 合約不應解釋為承諾您購買「軟體」商業版本的授權。任何此類購買將以正式訂單的下發為依據。 +轉讓。未經 SUSE 之書面許可,不得轉讓或讓渡此 Beta 合約。 +法律和管轄權。本 Beta 合約係受美國猶他州法律之管轄。與本 Beta 合約相關之任何法律訴訟只能向猶他州具有法定管轄權之法院提出。但是,如果您主要 +的居住國為歐盟或歐洲自由貿易聯盟之成員國,則本 Beta 合約受該國法律之管轄,任何法律訴訟只能向該國具有法定管轄權之法院提出。 +完整合約。本合約確定您與 SUSE 完全瞭解與同意所有條款規定,除非經過您與 SUSE 授權代表的書面同意,否則不得擅自增修。所有授權者、批發商、代理 +商、零售商、經銷商、銷售人員或員工均未經授權,不得修改此合約,所做之任何保證或承諾亦不得異於或超出此合約中之條款。 +棄權。放棄本 Beta 合約中之任何權利均應以書面呈現,並由受約束一方之正式授權代表負責簽署。既往或目前因任何侵害或無法執行所產生之任何棄權聲明,均不 +應視為放棄根據本 Beta 合約而產生之任何未來權利。 +分割。如果本 Beta 合約中之任何條款無效或無法實行,應在必要的範圍內重訂、限制、修改,甚至視情況終止該項條款,使其不再無效或無法實行,至於本 +Beta 合約中之其他條款則不受影響。 +出口規定。根據此「合約」所提供的任何產品或技術資訊,均受美國出口控制或其他國家的貿易法律管轄。雙方同意遵守所有出口控制法規,並取得所需授權或出口、再出 +口、進口貨物的分級。雙方同意不出口或再出口目前美國出口排除清單中的項目,或至美國出口法律中所指定的任何禁運或恐怖份子國家。雙方不會將交付項目用於核子、 +飛彈或生化武器的用途。將 SUSE 產品從美國出口前,請洽詢美國商務部工業安全局 (Bureau of Industry and Security) +網頁 www.bis.doc.gov。請參閱 https://www.suse.com/company/legal/ 以取得出口 SUSE 軟體的更多 +資訊。若有要求,SUSE 會向您提供適用限制的詳細資訊。但是,若您未取得任何必要的出口許可,SUSE 不承擔任何責任。安裝、下載或以其他方式使用此軟體, +即視為您做出以下聲明:我們保證此 Beta 版測試/評估軟體將僅用於 Beta 測試用途,不會將其出租、租用、銷售、轉授、讓渡或以其他方式轉讓。另外, +我們還保證不會運輸或出口屬於此 Beta 版測試軟體直接產品的任何產品、程序或服務。 +美國政府限制權利。美國政府之使用、複製或揭露應依 FAR 52.227-14 (1987 年 6 月) Alternate III (1987 年 6 +月)、FAR 52.227-19 (1987 年 6 月) 或 DFARS 252.227-7013 第 (b)(3) 款 (1995 年 11 月) +或其適當繼承條款所規定之限制。承包商/製造商為 SUSE LLC 404 Wyman Street, Waltham, MA 02415。 +其他。謹此明確排除「聯合國國際貨物銷售合同公約」(United Nations Convention of Contracts for the +International Sale of Goods) 之適用。 + +(c) 2013 SUSE LLC 或其關係企業。保留所有權利。 +(020314) + + + diff --git a/live/root/usr/share/agama/eula/license.final/license.cs.txt b/live/root/usr/share/agama/eula/license.final/license.cs.txt new file mode 100644 index 0000000000..c8faaee255 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.final/license.cs.txt @@ -0,0 +1,279 @@ +Licenční smlouva s koncovým uživatelem +pro software SUSE + + +Licenční smlouva s koncovým uživatelem pro software SUSE +PŘEČTĚTE SI POZORNĚ TUTO SMLOUVU. ZAKOUPENÍM, INSTALACÍ, STAŽENÍM +NEBO JINÝM POUŽÍVÁNÍM SOFTWARU (JAK JE DEFINOVÁN NÍŽE A VČETNĚ JEHO +ČÁSTÍ) VYJADŘUJETE SOUHLAS S PODMÍNKAMI TÉTO SMLOUVY. POKUD S +PODMÍNKAMI TÉTO SMLOUVY NESOUHLASÍTE, NEMÁTE DOVOLENO TENTO SOFTWARE +STAHOVAT, INSTALOVAT ANI HO POUŽÍVAT. OSOBA JEDNAJÍCÍ JMÉNEM JINÉHO +SUBJEKTU POTVRZUJE, ŽE MÁ ZMOCNĚNÍ TUTO SMLOUVU JMÉNEM TOHOTO +SUBJEKTU UZAVŘÍT. + +Společnost SUSE LLC ("Poskytovatel licence" nebo "SUSE") +zpřístupňuje softwarové produkty, které jsou kompilací: (i) +softwarových programů vyvinutých společností SUSE a jejími +přidruženými subjekty; (ii) softwarových programů vyvinutých třetími +stranami; (iii) ochranných známek vlastněných společností SUSE +a/nebo jejími přidruženými subjekty ("značky SUSE"); a (iv) médií +nebo reprodukcí (fyzických nebo virtuálních) a doprovodné +dokumentace k těmto softwarovým programům (taková kompilace +programů, ochranných známek a dokumentace je "Software"). + +Software je chráněn zákony a smlouvami o autorských právech +Spojených států amerických a zákony o autorských právech v jiných +zemích světa. Tato Licenční smlouva s koncovým uživatelem ("smlouva +EULA") je právní smlouva mezi vámi (právnickou nebo fyzickou osobou) +a společností SUSE, která upravuje vaše používání Softwaru. Pokud +musí být podle zákonů v místě hlavního sídla vaší firmy smlouvy +uzavřeny v místním jazyce, aby byly vymahatelné, poskytne vám +takovou verzi v místním jazyce Poskytovatel licence na základě +písemné žádosti. Vaše používání Softwaru se pak bude řídit verzí v +místním jazyce. Všechny doplňky, rozšíření, aktualizace, mobilní +aplikace, moduly, adaptéry či podpůrné verze Softwaru, které můžete +stáhnout či získat a které nejsou doprovázeny licenční smlouvou, +jsou považovány za Software a řídí se touto smlouvou EULA. + +Podmínky licence +Open Source +Software obsahuje mnoho jednotlivých komponent, které jsou softwarem +s otevřeným zdrojovým kódem, a licence otevřeného zdrojového kódu +pro každou komponentu, kterou může být v závislosti na softwarovém +programu GNU General Public License v.2 +(https://www.gnu.org/licenses/oldlicenses/gpl-2.0.en.html) nebo +Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0) nebo jiná +licence otevřeného zdrojového kódu (každá taková licence je "Licence +OSS"), je uvedena v licenční dokumentaci a/nebo ve zdrojovém kódu +komponent. + +Tato smlouva EULA upravuje vaše používání Softwaru včetně značek +SUSE a neomezuje, nenahrazuje ani nemění vaše práva podle Licence +OSS, která se vztahuje na vaše používání jakéhokoli otevřeného +zdrojového kódu obsaženého v Softwaru bez značek SUSE. + +Software může být dodáván jako součást jiných softwarových programů +nebo v kombinaci s nimi. Na tyto jiné softwarové programy se mohou +vztahovat jiné licenční podmínky a mohou být licencovány jinou třetí +stranou, než je Poskytovatel licence. Použití kteréhokoli ze +softwarových programů provázeného samostatnou licenční smlouvou se +řídí ustanoveními této samostatné licenční smlouvy. + +Licence na používání Softwaru +Za dodržení podmínek této smlouvy EULA vám Poskytovatel licence +uděluje trvalé, nevýlučné, nepřenosné, odvolatelné oprávnění s +celosvětovou platností reprodukovat a používat kopie Softwaru v +rámci vaší organizace pro interní použití ve vaší organizaci. +"Organizací" se rozumí právnická osoba a její přidružené subjekty. +"Přidružené subjekty" znamenají subjekty, které vás ovládají, které +vy ovládáte nebo které jsou ovládány stejným subjektem jako vy. Výše +uvedená licence je podmíněna tím, že vy nesete odpovědnost za +jakékoli porušení podmínek této smlouvy EULA vašimi Přidruženými +subjekty. + +Tato smlouva EULA nepovoluje distribuci Softwaru ani jeho komponent +používajících značek SUSE, bez ohledu na to, zda byla kopie +upravena. Můžete provádět redistribuci mimo vaši organizaci: (a) +Softwaru, pouze pokud povoleno na základě samostatné písemné smlouvy +s Poskytovatelem licence, která takovou redistribuci povoluje, nebo +(b) komponent Softwaru, pouze pokud odstraníte a nahradíte všechny +výskyty jakékoli značky SUSE. + +Pokud jste obdrželi, ať už přímo nebo nepřímo od společnosti SUSE, +hardware, software nebo jiné zařízení, které používá nebo obsahuje +Software, můžete Software používat výhradně pro účely provozu tohoto +hardwaru, softwaru nebo zařízení, nikoli samostatně. + +Vlastnictví +Nepřechází na vás nárok na software ani na jeho vlastnictví. +Poskytovatel licence nebo jeho poskytovatelé licencí si ponechávají +veškerá práva, nároky a podíl na duševním vlastnictví Softwaru +včetně jakýchkoli jeho úprav a kopií. Software vám není prodáván, +získáváte pouze podmíněnou licenci k jeho používání. Vlastnictví, +vlastnická práva, práva k duševnímu vlastnictví a k obsahu +přístupnému prostřednictvím Softwaru jsou majetkem příslušného +majitele obsahu a mohou být chráněna příslušnými zákony o autorských +právech nebo jinými zákony. Touto smlouvou EULA nezískáváte žádné +právo na takový obsah. + +Značky SUSE +Touto smlouvou EULA se neuděluje žádné právo ani licence, výslovná +ani implicitní, na použití jakékoli značky SUSE, obchodního názvu +nebo značky služeb poskytovatele licence nebo jeho přidružených +subjektů nebo poskytovatelů licence jinak, než je nezbytné pro +použití Softwaru, jak je povoleno touto smlouvou EULA. + +Služby předplatného a podpora +Poskytovatel licence není povinen poskytovat údržbu nebo podporu, +pokud si nezakoupíte předplatné na základě další smlouvy s +poskytovatelem licence nebo jeho přidruženými subjekty, která takové +služby výslovně zahrnuje. + +Záruka a odpovědnost +Omezená záruka +Poskytovatel licence zaručuje, že média, které jsou dodávána se +Softwarem, nebudou vykazovat vady materiálu ani výroby za podmínek +běžného používání po dobu šedesáti (60) dní ode dne doručení. VÝŠE +UVEDENÁ ZÁRUKA JE VAŠÍM JEDINÝM A VÝHRADNÍM PROSTŘEDKEM NÁPRAVY A +NAHRAZUJE VŠECHNY DALŠÍ ZÁRUKY, VYJÁDŘENÉ NEBO PŘEDPOKLÁDANÉ. S +VÝJIMKOU VÝŠE UVEDENÉ ZÁRUKY JE SOFTWARE DODÁVÁN VE STÁVAJÍCÍM STAVU +BEZ JAKÝCHKOLI ZÁRUK. +SOFTWARE NEBYL NAVRŽEN, VYTVOŘEN ANI URČEN K POUŽITÍ NEBO DISTRIBUCI +V RÁMCI ŘÍDÍCÍCH ZAŘÍZENÍ ON-LINE V RIZIKOVÝCH PROSTŘEDÍCH +VYŽADUJÍCÍCH BEZPORUCHOVÝ PROVOZ, JAKO JSOU OVLÁDACÍ SYSTÉMY +JADERNÝCH ELEKTRÁREN, LETECKÉ NAVIGAČNÍ, KOMUNIKAČNÍ NEBO ŘÍDICÍ +SYSTÉMY, PŘÍSTROJE PRO PŘÍMOU PODPORU ŽIVOTA, ZBROJNÍ SYSTÉMY NEBO +DALŠÍ POUŽITÍ, KDE BY SELHÁNÍ SOFTWARU MOHLO PŘÍMO ZPŮSOBIT SMRT, +ZRANĚNÍ NEBO TĚŽKOU TĚLESNOU NEBO EKOLOGICKOU ÚJMU. +Produkty jiných výrobců +Software může obsahovat nebo být dodáván s hardwarem nebo jinými +softwarovými programy a službami, které prodává či na ně uděluje +licenci jiný subjekt než Poskytovatel licence. POSKYTOVATEL LICENCE +NEPOSKYTUJE ZÁRUKU NA PRODUKTY NEBO SLUŽBY JINÝCH VÝROBCŮ. VŠECHNY +TAKOVÉ PRODUKTY NEBO SLUŽBY JSOU POSKYTOVÁNY "TAK JAK JSOU". VŠECHNY +ZÁRUČNÍ OPRAVY PRODUKTŮ JINÝCH DODAVATELŮ ZAJIŠŤUJÍ POSKYTOVATELÉ +LICENCÍ TĚCHTO PRODUKTŮ V SOULADU S JEJICH PLATNOU ZÁRUKOU. +POKUD NENÍ ZÁKONEM STANOVENO JINAK, POSKYTOVATEL LICENCE ODMÍTÁ +ODPOVĚDNOST A VYLUČUJE JAKÉKOLI A VŠECHNY PŘEDPOKLÁDANÉ ZÁRUKY +VČETNĚ VŠECH ZÁRUK TÝKAJÍCÍCH SE OBCHODOVATELNOSTI, VHODNOSTI PRO +KONKRÉTNÍ ÚČEL, VLASTNICTVÍ NEBO NEPORUŠENÍ PRÁVA A STEJNĚ TAK +JAKÉKOLI ZÁRUKY VYPLÝVAJÍCÍ Z PRŮBĚHU UZAVÍRÁNÍ OBCHODŮ, PRŮBĚHU +VÝKONU NEBO OBCHODOVÁNÍ. POSKYTOVATEL LICENCE NEPOSKYTUJE ŽÁDNÉ +ZÁRUKY, VYJÁDŘENÍ ANI PŘÍSLIBY S VÝJIMKOU TĚCH, KTERÉ JSOU VÝSLOVNĚ +UVEDENY V TÉTO OMEZENÉ ZÁRUCE. POSKYTOVATEL LICENCE NEZARUČUJE, ŽE +SOFTWARE A SLUŽBY SPLNÍ VŠECHNY VAŠE POŽADAVKY, BUDOU KOMPATIBILNÍ +SE VŠEMI OPERAČNÍMI SYSTÉMU ANI ŽE PROVOZ SOFTWARU ČI SLUŽEB BUDE +NEPŘERUŠOVANÝ A BEZCHYBNÝ. VÝŠE UVEDENÉ VÝJIMKY A PROHLÁŠENÍ O +ODMÍTNUTÍ ODPOVĚDNOSTI JSOU NEDÍLNOU SOUČÁSTÍ TÉTO SMLOUVY. Některé +místně příslušné soudy neumožňují odmítnutí určitých záruk nebo +některá omezení, proto je možné, že některá z výše uvedených omezení +se na vás nevztahují. Omezená záruka vám dává určitá práva a kromě +nich můžete mít i další práva, která se liší v závislosti na státu +nebo jurisdikci. +Omezení odpovědnosti +POSKYTOVATEL LICENCE ANI ŽÁDNÝ Z JEHO POSKYTOVATELŮ LICENCE, +DCEŘINÝCH SPOLEČNOSTÍ NEBO ZAMĚSTNANCŮ TŘETÍCH STRAN V ŽÁDNÉM +PŘÍPADĚ NEODPOVÍDÁ ZA JAKÉKOLI NÁSLEDNÉ NEBO NEPŘÍMÉ ŠKODY, AŤ UŽ NA +ZÁKLADĚ SMLOUVY, NEDBALOSTI, DELIKTU NEBO JINÉ TEORIE ODPOVĚDNOSTI, +NEBO ZA JAKOUKOLI ZTRÁTU ZISKU, OBCHODNÍ ZTRÁTU NEBO ZTRÁTU ČI +POŠKOZENÍ DAT, A TO V KAŽDÉM PŘÍPADĚ, I KDYŽ BYL NA MOŽNOST TĚCHTO +ŠKOD UPOZORNĚN. + +CELKOVÁ ODPOVĚDNOST POSKYTOVATELE LICENCE PODLE TÉTO SMLOUVY EULA +NEBO V SOUVISLOSTI S NÍ (AŤ UŽ V JEDNOM PŘÍPADĚ NEBO V ŘADĚ PŘÍPADŮ) +V ŽÁDNÉM PŘÍPADĚ NEPŘEKROČÍ ČÁSTKU, KTEROU JSTE ZAPLATILI ZA +SOFTWARE, Z NĚHOŽ TAKOVÝ NÁROK VZNIKL (NEBO 50 USD (USA), POKUD JSTE +ZA SOFTWARE NEZAPLATILI), V PRŮBĚHU 12 MĚSÍCŮ PŘEDCHÁZEJÍCÍCH +PRVNÍMU NÁROKU PODLE TÉTO SMLOUVY EULA. +Výše uvedená vyloučení a omezení se nevztahují na nároky související +s úmrtím nebo zraněním osob způsobených nedbalostí Poskytovatele +licence nebo jeho zaměstnanců, zástupců nebo smluvních partnerů. V +jurisdikcích, které nepovolují vyloučení nebo omezení náhrad škod, +zejména pak náhrad škod za porušení jakýchkoli předpokládaných +podmínek týkajících se vlastnictví nebo nerušeného užívání +jakéhokoli Softwaru získaného na základě této smlouvy EULA nebo +náhrad škod za úmyslné zkreslení údajů, bude odpovědnost +Poskytovatele licence omezena nebo vyloučena v maximálním rozsahu +povoleném v těchto jurisdikcích. + +Všeobecné podmínky +Doba trvání +Tato smlouva EULA nabývá platnosti v den, kdy stáhnete Software, a +je automaticky ukončena ve chvíli, kdy porušíte kteroukoli z jejích +podmínek. +Převod +Tato smlouva EULA nesmí být převedena ani postoupena bez předchozího +písemného svolení Poskytovatele licence. Jakýkoli takový pokus o +převod nebo postoupení bude neplatný a nebude mít žádný právní +účinek. +Rozhodné právo +Všechny záležitosti vyplývající z této smlouvy EULA nebo s ní +související se budou řídit hmotným právem Spojených států amerických +a státu Utah bez ohledu na ustanovení o výběru práva. Veškeré soudní +spory, řízení nebo jednání, které vyplynou z této smlouvy EULA nebo +vzniknou v souvislosti s ní, lze vést pouze před federálním nebo +státním soudem příslušné jurisdikce ve státě New York. Pokud některá +ze stran iniciuje soudní řízení, má vítězná strana nárok na +přiměřenou náhradu poplatků za právní zastupování. Pokud je však +místo hlavního sídla firmy v členském státě Evropské unie nebo +Evropského sdružení volného obchodu, (1) mají výhradní příslušnost k +veškerým soudním sporům v souvislosti s touto smlouvou EULA soudy v +Anglii a Walesu; a (2) použijí se zákony Anglie s výjimkou případů, +kdy se veškerá taková soudní řízení musí vést podle zákonů místa +hlavního sídla firmy; v takovém případě se použijí zákony dané země. +Na tuto smlouvu EULA ani její předmět se nevztahuje Úmluva OSN o +smlouvách o mezinárodní koupi zboží ani kolizní normy států New York +nebo Anglie a Wales. +Úplnost smlouvy +Tato smlouva EULA, spolu s veškerými dalšími doklady o nákupu nebo +případně jinou písemnou smlouvou uzavřenou mezi vámi a +Poskytovatelem licence nebo jeho přidruženými subjekty, tvoří úplné +ujednání a smlouvu mezi vámi a Poskytovatelem licence a je možné ji +doplnit nebo upravit pouze písemnou smlouvou uzavřenou mezi vámi a +oprávněným zástupcem Poskytovatele licence. ŽÁDNÝ POSKYTOVATEL +LICENCE TŘETÍ STRANY, DISTRIBUTOR, PRODEJCE, MALOOBCHODNÍK, OBCHODNÍ +ZÁSTUPCE ANI ZAMĚSTNANEC NENÍ OPRÁVNĚN TUTO SMLOUVU UPRAVOVAT NEBO +POSKYTOVAT JAKÁKOLI PROHLÁŠENÍ ČI ZÁVAZKY NEOBSAŽENÉ V PODMÍNKÁCH +TÉTO SMLOUVY NEBO LIŠÍCÍ SE OD NÍ. +Vzdání se práva +Vzdání se jakéhokoli práva stanoveného touto smlouvou EULA nabude +platnosti teprve v písemné formě, podepsané řádným a oprávněným +zástupcem zavazující se strany. Žádné vzdání se jakéhokoli +dřívějšího nebo současného práva vyplývajícího z porušení nebo +nedodržení smlouvy nebude považováno za vzdání se jakéhokoli +budoucího práva plynoucího z této smlouvy EULA. +Klauzule o oddělitelnosti +Pokud je kterékoli z ustanovení této smlouvy EULA neplatné nebo +právně neúčinné, bude toto ustanovení vykládáno, omezeno, pozměněno +nebo, je-li to nutné, odděleno v potřebném rozsahu tak, aby byla +odstraněna jeho neplatnost nebo právní neúčinnost. Další ustanovení +smlouvy EULA zůstávají tímto nedotčené. +Splnění exportních požadavků +Berete na vědomí, že produkty a/nebo technologie Poskytovatele +licence mohou podléhat předpisům USA o správě exportu ("Export +Administration Regulations, EAR") a obchodním zákonům jiných zemí. +Souhlasíte s tím, že budete dodržovat předpisy EAR a místní zákony a +předpisy, které se mohou vztahovat na vaše právo dovážet, vyvážet +nebo používat produkty a/nebo technologie Poskytovatele licence. +Nebudete exportovat či reexportovat, ať už přímo nebo nepřímo, +produkty Poskytovatele licence: (1) do subjektů uvedených na +aktuálních seznamech USA pro vyloučení vývozu nebo do zemí, na které +bylo uvaleno embargo nebo které podporují terorismus, jak je uvedeno +v předpisech EAR; (2) žádnému koncovému uživateli, o kterém se +domníváte nebo máte důvod se domnívat, že produkty Poskytovatele +licence využije pro návrh, vývoj nebo výrobu nukleárních, chemických +nebo biologických zbraní, raketových systémů, vesmírných nosných +raket, sondážních raket nebo bezobslužných vzdušných nosných +systémů, s výjimkami schválenými příslušnou vládní agenturou +předpisem nebo zvláštní licencí; ani (3) žádnému koncovému +uživateli, kterému federální agentura nebo vláda USA zakázala účast +na vývozních transakcích USA. Nebudete používat produkty a/nebo +technologie Poskytovatele licence pro zakázané použití v jaderných, +raketových nebo chemicko-biologických zbraních, jak je uvedeno v +předpisech EAR. Stažením nebo použitím Softwaru vyjadřuje svůj +souhlas s výše uvedeným a prohlašujete a zaručujete, že se +nenacházíte, nejste pod kontrolou nebo nejste státním příslušníkem +či rezidentem žádné takové země ani země, která je uvedena v seznamu +těchto zemí. Kromě toho nesete odpovědnost za dodržování všech +místních zákonů své jurisdikce, které mohou mít vliv na vaše právo +dovozu, vývozu nebo použití produktů Poskytovatele licence. Než +začnete vyvážet produkty podléhající předpisům EAR, informujte se na +webových stránkách úřadu Bureau of Industry and Security (Úřad pro +průmysl a bezpečnost) https://www.bis.doc.gov . Další informace o +exportu Softwaru, včetně příslušného klasifikačního čísla pro +kontrolu exportu (ECCN) a přidružených licenčních výjimek (pokud je +to relevantní), naleznete na webu +https://www.suse.com/company/legal/. Na vyžádání vám informace +týkající se příslušných vývozních omezení platných pro produkty +Poskytovatele licence podá oddělení služeb mezinárodního obchodu +Poskytovatele licence. Poskytovatel licence nepřejímá žádnou +odpovědnost za to, že si případně nezajistíte veškerá nezbytná +vývozní povolení. + +:verze:2024-02-01:001 +SUSE.com + +Copyright (c) SUSE 2024 + +SUSE Legal +Únor 2024 diff --git a/live/root/usr/share/agama/eula/license.final/license.de.txt b/live/root/usr/share/agama/eula/license.final/license.de.txt new file mode 100644 index 0000000000..92e83a76f5 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.final/license.de.txt @@ -0,0 +1,321 @@ +Endbenutzer-Lizenzvereinbarung +für SUSE-Software + + +Endbenutzer-Lizenzvereinbarung für SUSE-Software +LESEN SIE DIESE VEREINBARUNG SORGFÄLTIG DURCH. MIT DEM KAUF, DER +INSTALLATION, DEM HERUNTERLADEN ODER DER ANDERWEITIGEN NUTZUNG DER +SOFTWARE (WIE UNTEN DEFINIERT UND EINSCHLIESSLICH IHRER KOMPONENTEN) +STIMMEN SIE DEN BESTIMMUNGEN DIESER VEREINBARUNG ZU. WENN SIE DIESEN +BEDINGUNGEN NICHT ZUSTIMMEN, DÜRFEN SIE DIE SOFTWARE NICHT +HERUNTERLADEN, INSTALLIEREN ODER VERWENDEN. EINE EINZELPERSON, DIE +IM AUFTRAG EINER JURISTISCHEN PERSON HANDELT, BESTÄTIGT, DASS ER +BZW. SIE BERECHTIGT IST, DIESE VEREINBARUNG IM AUFTRAG DER +JURISTISCHEN PERSON EINZUGEHEN. + +SUSE LLC ("Lizenzgeber" oder "SUSE") stellt Softwareprodukte zur +Verfügung, die eine Zusammenstellung sind von: (i) +Softwareprogrammen, die von SUSE und seinen angegliederten +Unternehmen entwickelt wurden; (ii) Softwareprogrammen, die von +Dritten entwickelt wurden; (iii) Marken, die im Besitz von SUSE +und/oder seinen angegliederten Unternehmen sind ("SUSE-Marken"); und +(iv) Medien oder Reproduktionen (physisch oder virtuell) und +begleitender Dokumentation zu diesen Softwareprogrammen (diese +Zusammenstellung von Programmen, Marken und Dokumentation wird +nachstehend als die "Software" bezeichnet). + +Die Software ist durch die Urheberrechtsgesetze und -verträge der +Vereinigten Staaten (USA) und die Urheberrechtsgesetze in anderen +Ländern weltweit geschützt. Diese Endbenutzer-Lizenzvereinbarung +("EULA") ist eine rechtliche Vereinbarung zwischen Ihnen (einer +juristischen oder natürlichen Person) und SUSE, die Ihre Nutzung der +Software regelt. Sollten die Gesetze Ihres Hauptgeschäftssitzes +erfordern, dass Verträge für ihre Vollstreckbarkeit in der +jeweiligen Landessprache zu verfassen sind, so kann auf schriftliche +Anforderung beim Lizenzgeber eine Version in der jeweiligen +Landessprache angefordert werden, die für Ihre Nutzung der Software +gilt. Jedes Add-on, jede Erweiterung, jede Aktualisierung, jede +mobile Anwendung, jedes Modul, jeder Adapter und jede +Support-Version der Software, die Sie herunterladen oder erhalten +und der keine Lizenzvereinbarung beigefügt ist, gilt als Software +und unterliegt dieser Endbenutzer-Lizenzvereinbarung. + +Lizenzbestimmungen +Open Source +Die Software enthält viele einzelne Komponenten, bei denen es sich +um Open-Source-Software handelt. Die Open-Source-Lizenz für jede +Komponente, bei der es sich je nach Softwareprogramm um die GNU +General Public License v.2 +(https://www.gnu.org/licenses/oldlicenses/gpl-2.0.en.html) oder +Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0) oder eine +andere Open-Source-Lizenz handeln kann (jede dieser Lizenzen wird +als "OSS-Lizenz" bezeichnet), ist in der Lizenzierungsdokumentation +und/oder im Quellcode der Komponente enthalten. + +Diese Endbenutzer-Lizenzvereinbarung regelt Ihre Nutzung der +Software, einschließlich der SUSE-Marken, und schränkt Ihre Rechte +gemäß der OSS-Lizenz, die für Ihre Nutzung des in der Software +enthaltenen Open-Source-Codes ohne die SUSE-Marken gilt, nicht ein, +ersetzt sie nicht und ändert sie nicht. + +Andere Softwareprogramme, die unter anderen Bestimmungen und/oder +von Dritten (also nicht vom Lizenzgeber) lizenziert werden, können +in der Software selbst oder im Lieferumfang der Software enthalten +sein. Die Nutzung von Softwareprogrammen mit separater +Lizenzvereinbarung unterliegt der jeweiligen separaten +Lizenzvereinbarung. + +Lizenz zur Nutzung der Software +Unter Einhaltung der Bedingungen dieser +Endbenutzer-Lizenzvereinbarungen gewährt Ihnen der Lizenzgeber eine +zeitlich unbegrenzte, nicht exklusive, nicht übertragbare, +widerrufbare, weltweite Lizenz zur Erstellung und Verwendung von +Kopien der Software für den internen Gebrauch innerhalb Ihrer +Organisation. "Organisation" bezeichnet eine juristische Person und +ihre angegliederten Unternehmen. "Angegliederte Unternehmen" sind +Unternehmen, die ganz oder teilweise unter Ihrer Kontrolle stehen +oder die Ihr Unternehmen kontrollieren. Die oben stehende Lizenz +wird unter der Bedingung gewährt, dass Sie für jegliche Verstöße +Ihrer angegliederten Unternehmen gegen die Bestimmungen dieser +Endbenutzer-Lizenzvereinbarung verantwortlich sind. + +Diese Endbenutzer-Lizenzvereinbarung berechtigt Sie nicht dazu, die +Software oder ihre Komponenten mit den SUSE-Marken zu vertreiben, +unabhängig davon, ob die Kopie modifiziert wurde. Außerhalb Ihrer +Organisation sind Sie nur dann zur Redistribution (a) der Software +berechtigt, wenn dies im Rahmen einer separaten schriftlichen +Vereinbarung mit dem Lizenzgeber gestattet ist, die eine solche +Redistribution erlaubt, oder Sie können (b) diese Redistribution für +die einzelnen Komponenten der Software nur vornehmen, wenn Sie die +SUSE-Kennzeichnungen an sämtlichen Stellen entfernen und ersetzen. + +Wenn Sie direkt oder indirekt von SUSE Hardware, Software oder eine +andere Appliance erhalten haben, die die Software nutzt oder +einbettet, dürfen Sie die Software ausschließlich zum Ausführen +dieser Hardware, Software oder dieser Appliance und nicht auf +eigenständiger Basis verwenden. + +Eigentumsrechte +Durch die Lizenz werden Ihnen keine Besitzansprüche auf die Software +übertragen. Der Lizenzgeber und/oder seine Drittlizenzgeber besitzen +alle Rechte, Eigentums- und Nutzungsrechte an geistigem Eigentum an +der Software und behalten sich diese vor; dies gilt auch für +Anpassungen oder Kopien hiervon. Die Software wird Ihnen nicht +verkauft; Sie erhalten lediglich eine bedingte Lizenz zur Nutzung +der Software. Jegliche Rechtsansprüche, Eigentumsrechte, geistige +Eigentumsrechte auf die bzw. an den Inhalte(n), auf die mithilfe der +Software zugegriffen wird, sind das Eigentum des jeweiligen +Inhaltsanbieters und sind gegebenenfalls durch entsprechende +Urheberrechte oder andere Gesetze geschützt. Diese +Endbenutzer-Lizenzvereinbarung gewährt Ihnen keine Rechte an +derartigen Inhalten. + +SUSE-Marken +Im Rahmen dieser Endbenutzer-Lizenzvereinbarung wird weder +ausdrücklich noch stillschweigend das Recht oder die Lizenz gewährt, +eine SUSE-Marke, einen Handelsnamen oder eine Dienstleistungsmarke +des Lizenzgebers oder seiner angegliederten Unternehmen oder +Lizenzgeber auf eine andere Weise zu verwenden, als es für die durch +diese Endbenutzer-Lizenzvereinbarung erlaubte Nutzung der Software +erforderlich ist. + +Abonnementservices und Support +Der Lizenzgeber ist nicht verpflichtet, Wartungs- oder +Supportleistungen zu erbringen, es sei denn, Sie erwerben ein +Abonnementangebot gemäß einem zusätzlichen Vertrag mit dem +Lizenzgeber oder einem ihm angegliederten Unternehmen, das solche +Leistungen ausdrücklich einschließt. + +Gewährleistung und Haftung +Begrenzte Garantie +Der Lizenzgeber gewährleistet, dass die Medien, auf denen die +Software bereitgestellt wird, bei normalem Gebrauch über einen +Zeitraum von 60 (sechzig) Tagen ab Lieferdatum frei von Material- +und Verarbeitungsfehlern sind. DIE VORLIEGENDE GEWÄHRLEISTUNG STELLT +IHREN EINZIGEN UND AUSSCHLIESSLICHEN ANSPRUCH DAR UND ERSETZT ALLE +ANDEREN AUSDRÜCKLICHEN ODER KONKLUDENTEN GARANTIEN. ABGESEHEN VON +DER OBIGEN GEWÄHRLEISTUNG WIRD DIE SOFTWARE OHNE MÄNGELGEWÄHR UND +OHNE JEGLICHE GEWÄHRLEISTUNGEN BEREITGESTELLT. +DIE SOFTWARE WURDE NICHT FÜR DIE NUTZUNG ODER DEN VERTRIEB MIT +ONLINE-STEUERUNGSHARDWARE IN GEFÄHRLICHEN UMGEBUNGEN, DIE EINEN +STÖRUNGSSICHEREN BETRIEB ERFORDERN, ENTWICKELT, HERGESTELLT ODER +KONZIPIERT UND DARF NICHT DAFÜR VERWENDET WERDEN, BEISPIELSWEISE FÜR +DEN BETRIEB VON KERNKRAFTANLAGEN, FLUGNAVIGATION, KOMMUNIKATIONS- +ODER STEUERUNGSSYSTEMEN, LEBENSERHALTENDEN GERÄTEN, WAFFENSYSTEMEN +ODER FÜR ANDERE NUTZUNGSZWECKE, BEI DENEN SOFTWARE-AUSFÄLLE DIREKT +ZUM TOD, ZU VERLETZUNGEN ODER SCHWEREN PHYSISCHEN ODER UMWELTSCHÄDEN +FÜHREN KÖNNEN. +Nicht vom Lizenzgeber stammende Produkte +In der Software oder im Lieferumfang können weitere Hardware oder +Softwareprogramme bzw. Services, die von anderen Unternehmen als dem +Lizenzgeber lizenziert oder verkauft werden, enthalten sein. DER +LIZENZGEBER ÜBERNIMMT KEINE GARANTIE FÜR PRODUKTE ODER SERVICES, DIE +NICHT VOM LIZENZGEBER ENTWICKELT WURDEN BZW. BEREITGESTELLT WERDEN. + PRODUKTE BZW. SERVICES DIESER ART WERDEN IN DER VERFÜGBAREN FORM +BEREITGESTELLT. EIN ETWAIGER GARANTIESERVICE FÜR PRODUKTE, DIE NICHT +VOM LIZENZGEBER STAMMEN, WIRD VOM PRODUKTLIZENZGEBER GEMÄSS DER +ZUTREFFENDEN GARANTIE ZUR VERFÜGUNG GESTELLT. +SOFERN NICHT ANDERWEITIG VOM GESETZ BESCHRÄNKT, SCHLIESST DER +LIZENZGEBER SÄMTLICHE IMPLIZIERTEN GEWÄHRLEISTUNGEN AUS, +EINSCHLIESSLICH SÄMTLICHER GEWÄHRLEISTUNGEN IN BEZUG AUF +MARKTFÄHIGKEIT, EIGNUNG FÜR EINEN BESTIMMTEN ZWECK, GEWÄHRLEISTUNGEN +AUS EIGENTUMSRECHTEN ODER DER NICHTVERLETZUNG VON RECHTEN; FERNER +BESTEHEN KEINE GEWÄHRLEISTUNGEN, DIE SICH AUS DER VERHANDLUNG, +LEISTUNG ODER DEM HANDELSGEBRAUCH ERGEBEN. DER LIZENZGEBER LEISTET +KEINE GARANTIEN, ANGABEN ODER ZUSAGEN, DIE NICHT IN DIESER +BESCHRÄNKTEN GEWÄHRLEISTUNG FESTGELEGT SIND. DER LIZENZGEBER +GARANTIERT NICHT, DASS DIE SOFTWARE BZW. DIE SERVICES IHREN +ANFORDERUNGEN ENTSPRECHEN, MIT SÄMTLICHEN BETRIEBSSYSTEMEN +KOMPATIBEL SIND BZW. DASS DER BETRIEB DER SOFTWARE BZW. SERVICES +FREI VON UNTERBRECHUNGEN ODER FEHLERN SEIN WIRD. DIE VORSTEHENDEN +AUSSCHLÜSSE UND HAFTUNGSAUSSCHLÜSSE SIND EIN WESENTLICHER +BESTANDTEIL DIESER VEREINBARUNG. Einige Rechtsprechungen lassen +bestimmte Haftungsausschlüsse und Haftungsbeschränkungen nicht zu, +sodass Teile der oben genannten Einschränkungen möglicherweise nicht +auf Sie zutreffen. Diese eingeschränkte Gewährleistung verleiht +Ihnen bestimmte Rechte; abhängig von Bundesstaat oder Rechtssystem +ergeben sich möglicherweise weitere Rechte. +Haftungseinschränkung +WEDER DER LIZENZGEBER NOCH SEINE DRITTLIZENZGEBER, +TOCHTERGESELLSCHAFTEN ODER MITARBEITER HAFTEN FÜR JEGLICHE +FOLGESCHÄDEN ODER INDIREKTE SCHÄDEN, UNABHÄNGIG DAVON, OB DIESE AUF +VERTRAG, FAHRLÄSSIGKEIT, UNERLAUBTER HANDLUNG ODER EINER ANDEREN +HAFTUNGSTHEORIE BERUHEN, ODER FÜR GEWINNVERLUSTE, GESCHÄFTSVERLUSTE +ODER DATENVERLUSTE ODER -BESCHÄDIGUNGEN, AUCH WENN SIE AUF DIE +MÖGLICHKEIT SOLCHER SCHÄDEN HINGEWIESEN WURDEN. + +IN KEINEM FALL ÜBERSTEIGT DIE GESAMTHAFTUNG DES LIZENZGEBERS IM +RAHMEN ODER IN VERBINDUNG MIT DIESER ENDBENUTZER-LIZENZVEREINBARUNG +(UNABHÄNGIG DAVON, OB ES SICH UM EINEN FALL ODER EINE REIHE VON +FÄLLEN HANDELT) DEN BETRAG, DEN SIE IN DEN LETZTEN 12 MONATEN VOR +DEM ERSTEN ANSPRUCH IM RAHMEN DIESER ENDBENUTZER-LIZENZVEREINBARUNG +FÜR DIE SOFTWARE, AUS DER DER ANSPRUCH ENTSTANDEN IST, BEZAHLT HABEN +(ODER 50 US-DOLLAR, WENN SIE NICHT FÜR DIE SOFTWARE BEZAHLT HABEN). +Die oben genannten Ausschlüsse und Beschränkungen gelten nicht für +Ansprüche in Bezug auf Tod oder Körperverletzung, die durch die +Fahrlässigkeit des Lizenzgebers oder dessen Mitarbeiter, Vertreter +oder Auftragnehmer verursacht wurden. In den Rechtssystemen, die +keinen Ausschluss bzw. keine Einschränkung von +Schadenersatzansprüchen zulassen, einschließlich +Schadenersatzansprüchen bei Verletzung von implizierten Bedingungen +in Bezug auf Eigentumsrechte bzw. den stillen Besitz beliebiger +Software, die im Rahmen dieser Endbenutzer-Lizenzvereinbarung +erworben wurde, bzw. bei arglistiger Täuschung wird die Haftung des +Lizenzgebers im maximal zulässigen Umfang dieser Rechtssysteme +beschränkt bzw. ausgeschlossen. + +Allgemeine Bedingungen +Begriff +Diese Endbenutzer-Lizenzvereinbarung wird zu dem Zeitpunkt wirksam, +zu dem Sie die Software herunterladen, und endet automatisch, sobald +Sie eine der darin enthaltenen Bestimmungen missachten. +Übertragen +Diese Endbenutzer-Lizenzvereinbarung darf ohne vorherige +schriftliche Genehmigung des Lizenzgebers nicht übertragen oder +abgetreten werden. Sämtliche versuchten Übertragungen oder +Abtretungen sind null und nichtig und nicht wirksam. +Gesetze +Sämtliche Streitigkeiten, die sich aus oder im Zusammenhang mit +dieser Endbenutzer-Lizenzvereinbarung ergeben, unterliegen dem +materiellen Recht der Vereinigten Staaten und dem Bundesstaat New +York ohne Rücksicht auf dessen Auswahl von Gesetzesbestimmungen. +Jegliche Verfahren, Klagen oder Rechtssachen, die sich aus oder im +Zusammenhang mit dieser Endbenutzer-Lizenzvereinbarung ergeben, +werden ausschließlich von einem zuständigen Bundes- oder +Bundesstaatsgericht in New York entschieden. Sollte eine Partei ein +Rechtsverfahren in Bezug auf die Endbenutzer-Lizenzvereinbarung +einleiten, so hat die obsiegende Partei Anspruch auf Erstattung der +Anwaltskosten in einem angemessenen Umfang. Sollte jedoch das Land +Ihres Hauptgeschäftssitzes ein Mitgliedsstaat der Europäischen Union +oder der Europäischen Freihandelsassoziation (EFTA) sein, (1) sind +ausschließlich die Gerichte in England und Wales für alle +Rechtsstreitigkeiten in Bezug auf diese +Endbenutzer-Lizenzvereinbarung zuständig; und (2) sofern die Gesetze +eines solchen Landes mit Ihrem Hauptgeschäftssitz für solche +Rechtsstreitigkeiten gelten, finden die Gesetze dieses Landes +Anwendung. Weder die UN-Konvention über den internationalen +Warenkauf noch die Kollisionsnormen des New Yorker Rechts oder des +Rechts von England und Wales finden auf diese +Endbenutzer-Lizenzvereinbarung oder seinen Gegenstand Anwendung. +Ungeteilte Vereinbarung +Diese Endbenutzer-Lizenzvereinbarung, zusammen mit sämtlichen +anderen Kaufbelegen bzw. anderen schriftlichen Vereinbarungen +zwischen Ihnen und dem Lizenzgeber und seinen angegliederten +Unternehmen, enthält die gesamten Abreden und Vereinbarungen +zwischen Ihnen und dem Lizenzgeber und kann nur durch eine von Ihnen +und einem befugten Vertreter des Lizenzgebers vereinbarte +schriftliche Vereinbarung ergänzt bzw. modifiziert werden. KEIN +DRITTER LIZENZGEBER, DISTRIBUTOR, FACHHÄNDLER, EINZELHÄNDLER, +WIEDERVERKÄUFER, MITARBEITER UND KEIN DRITTES VERKAUFSPERSONAL IST +ZUM ÄNDERN DIESER VEREINBARUNG ODER ZU ANGABEN ODER ZUSAGEN +BERECHTIGT, DIE VON DEN BESTIMMUNGEN DIESER VEREINBARUNG ABWEICHEN +ODER DIESE ERGÄNZEN. +Aufhebung +Ein Verzicht auf eines der in dieser Endbenutzer-Lizenzvereinbarung +festgehaltenen Rechte wird erst wirksam, wenn dieser schriftlich +erfolgt und von einem ordnungsgemäß bevollmächtigten Vertreter der +zu bindenden Partei unterschrieben ist. Ein Verzicht auf ein zuvor +oder derzeit gültiges Recht, der auf einen Vertragsbruch oder eine +Unterlassung zurückzuführen ist, kann nicht als Verzicht auf +künftige Rechte erachtet werden, die sich aus dieser +Endbenutzer-Lizenzvereinbarung ergeben. +Abtrennbarkeit +Ist eine Bestimmung dieser Endbenutzer-Lizenzvereinbarung ungültig +oder nicht anwendbar, wird diese Bestimmung im notwendigen Umfang +ausgelegt, beschränkt, geändert oder notfalls abgetrennt, um die +Ungültigkeit oder Nichtdurchführbarkeit der Bestimmung zu +beseitigen; die übrigen Bestimmungen dieser +Endbenutzer-Lizenzvereinbarung bleiben unberührt. +Einhaltung der Exportbestimmungen +Sie erkennen an, dass die Produkte und/oder Technologien des +Lizenzgebers den US Export Administration Regulations (die "EAR") +und den Handelsgesetzen anderer Länder unterliegen können. Sie +verpflichten sich, die EAR und die lokalen Gesetze und Vorschriften +einzuhalten, die auf Ihr Recht, die Produkte und/oder Technologie +des Lizenzgebers zu importieren, zu exportieren oder zu nutzen, +anwendbar sind und sich darauf auswirken können. Sie unterlassen es, +die Produkte des Lizenzgebers direkt oder indirekt folgendermaßen zu +exportieren bzw. zu reexportieren: (1) in Entitäten, die auf den +aktuellen US-Export-Ausschlusslisten stehen, oder in Länder, gegen +die ein Embargo verhängt wurde oder die terroristische Aktivitäten +unterstützen, wie in den EAR angegeben; (2) für jeden Endbenutzer, +bei dem Ihnen bekannt ist oder Sie den begründeten Verdacht haben, +dass er die Produkte des Lizenzgebers für die Konstruktion, +Entwicklung oder Produktion von nuklearen, chemischen oder +biologischen Waffen, Raketensystemen, Trägerraketen, +Höhenforschungsraketen oder unbemannten Luftfahrzeugsystemen +einsetzt, es sei denn, dies wurde durch die zuständige Behörde per +Verordnung oder im Rahmen einer speziellen Lizenz autorisiert; oder +(3) für jeden Endbenutzer, dem die Teilnahme an +US-Exporttransaktionen durch eine Behörde der US-Regierung untersagt +wurde. Sie unterlassen es, die Produkte und/oder Technologien des +Lizenzgebers für verbotene nukleare, chemische oder biologische +Waffenzwecke oder Raketen zu verwenden, wie in den EAR festgelegt. +Indem Sie die Software herunterladen oder verwenden, stimmen Sie den +vorstehenden Bedingungen zu. Ferner erklären und garantieren Sie, +dass Sie sich nicht in einem solchen Land befinden, unter der +Kontrolle eines solchen Landes stehen oder ein Einwohner oder +Staatsbürger eines solchen Landes sind und dass Sie nicht auf einer +solchen Liste stehen. Ferner sind Sie für die Einhaltung lokaler +Gesetze in Ihrer Gerichtsbarkeit verantwortlich, die sich +möglicherweise auf Ihr Recht zum Import, Export oder zur Nutzung der +Produkte des Lizenzgebers auswirken. Informieren Sie sich auf der +Webseite des Amts für Industrie und Sicherheit unter +https://www.bis.doc.gov, bevor Sie Produkte exportieren, die den EAR +unterliegen. Weitere Informationen zum Export von Software, +einschließlich der gültigen Exportkontroll-Klassifizierungsnummer +(ECCN) und der damit verbundenen Lizenzausnahmen (sofern +zutreffend), sind unter https://www.suse.com/company/legal/ zu +finden. Auf Anforderung kann die Außenhandelsabteilung des +Lizenzgebers Informationen bezüglich geltender Exportbeschränkungen +für die Produkte des Lizenzgebers bereitstellen. Der Lizenzgeber +haftet nicht für Ihr Versäumnis, die erforderlichen +Exportgenehmigungen einzuholen. + +:Version:2024-02-01:001 +SUSE.com + +Copyright (c) SUSE 2024 + +SUSE - Rechtliches +Februar 2024 diff --git a/live/root/usr/share/agama/eula/license.final/license.es.txt b/live/root/usr/share/agama/eula/license.final/license.es.txt new file mode 100644 index 0000000000..a00e57fe5c --- /dev/null +++ b/live/root/usr/share/agama/eula/license.final/license.es.txt @@ -0,0 +1,295 @@ +Acuerdo de licencia de usuario final +del software de SUSE + + +Acuerdo de licencia de usuario final del software de SUSE +LEA ESTE ACUERDO ATENTAMENTE. AL DESCARGAR, INSTALAR O ADQUIRIR DE +CUALQUIER OTRO MODO EL SOFTWARE (COMO SE DEFINE MÁS ABAJO E +INCLUIDOS SUS COMPONENTES), ESTARÁ ACEPTANDO LOS TÉRMINOS DE ESTE +ACUERDO. SI NO ESTÁ CONFORME CON ESTOS TÉRMINOS, NO TENDRÁ +AUTORIZACIÓN PARA DESCARGAR, INSTALAR NI UTILIZAR EL SOFTWARE. SI +UNA PERSONA ACTÚA EN NOMBRE DE UNA ENTIDAD, SE DETERMINA QUE ESA +PERSONA TIENE LA AUTORIDAD PARA ACEPTAR ESTE ACUERDO EN NOMBRE DE +DICHA ENTIDAD. + +SUSE LLC (el "Licenciador" o "SUSE") pone a disposición del usuario +los productos de software, que son una recopilación: (i) programas +de software desarrollados por SUSE y sus afiliados; (ii) programas +de software desarrollados por terceros; (iii) marcas comerciales +propiedad de SUSE y/o sus filiales ("Marcas de SUSE"); y (iv) los +medios o reproducciones (físicos o virtuales) y la documentación +adjunta que acompañe a dichos programas de software (la recopilación +de programas, marcas comerciales y documentación se denomina +conjuntamente como el "Software"). + +El Software está protegido por las leyes y los tratados de derechos +de autor de Estados Unidos y por las leyes de derechos de autor de +otros países. Este Acuerdo de licencia de usuario final ("EULA") es +un acuerdo legal entre el Usuario (una entidad o una persona) y SUSE +que rige el uso del Software. Si las leyes de la ubicación principal +del negocio del Usuario requieren que los contratos estén en el +idioma local para ser ejecutables, dicha versión en el idioma local +se puede obtener del Licenciador previa solicitud por escrito y se +considerará que rige el uso que haga el Usuario del Software. +Cualquier complemento, extensión, actualización, aplicación móvil, +módulo, adaptador o versión de asistencia del Software que pueda +descargar o recibir el Usuario y no esté acompañado por un acuerdo +de licencia que reemplace expresamente al presente, se considerará +como Software y se regirá por este EULA. + +Términos de la licencia +Código abierto +El Software contiene muchos componentes individuales que son +software de código abierto, y la licencia de código abierto de cada +componente, que según el programa de software puede ser la Licencia +pública general de GNU versión 2 +(https://www.gnu.org/licenses/oldlicenses/gpl-2.0.en.html) o Apache +2.0 (https://www.apache.org/licenses/LICENSE-2.0) u otra licencia de +código abierto (cada una de estas licencias se denomina "Licencia de +código abierto"). Estas Licencias de código abierto se encuentran en +la documentación y/o en el código fuente del componente. + +Este EULA rige el uso del Software, incluidas las Marcas de SUSE, y +no limita, sustituye ni modifica los derechos del Usuario expresados +en la Licencia de código abierto aplicable al uso de cualquier +código de código abierto incluido en el Software sin las Marcas de +SUSE. + +El Software puede incluir o estar incluido en un paquete con otros +programas de software cuya licencia contenga términos distintos o +haya sido otorgada por otros fabricantes distintos al Licenciador. +El uso de cualquier programa de software acompañado de un acuerdo de +licencia independiente se regirá por dicho acuerdo de licencia. + +Licencia para utilizar el Software +Siempre que se cumplan los términos y condiciones de este EULA, el +Licenciador otorga al Usuario una licencia mundial perpetua, no +exclusiva, no transferible y revocable para reproducir y usar copias +del Software dentro de su Organización para uso interno en la +Organización del Usuario. "Organización" significa una entidad legal +y sus Afiliadas. "Afiliadas" hace referencia a las entidades que +controla el Usuario, las que tienen control sobre el Usuario y las +que están bajo control común del Usuario. La licencia anterior está +condicionada a que el Usuario sea responsable de cualquier +incumplimiento de las disposiciones de este EULA por parte de sus +Afiliadas. + +Este EULA no le permite distribuir el Software o sus componentes que +usen las marcas de SUSE aunque la copia haya sido modificada. El +Usuario puede realizar una redistribución fuera de su Organización: +(a) del Software, solo si se permite en virtud de un acuerdo por +escrito independiente con el Licenciador que autorice dicha +redistribución, o (b) de los componentes que constituyen el +Software, solo si el Usuario elimina y reemplaza todas las +apariciones de cualquier Marca de SUSE. + +Si el Usuario ha recibido de SUSE, ya sea directa o indirectamente, +hardware, software u otro dispositivo que utilice o integre el +Software, puede utilizar el Software únicamente con el fin de +ejecutar dicho hardware, software o dispositivo, y no de forma +independiente. + +Propiedad +No se le transfiere ningún título o propiedad del Software. El +Licenciador y sus licenciadores terceros mantienen íntegramente el +derecho, la titularidad y el interés sobre todos los derechos de +propiedad intelectual especificados en el Software, incluidas sus +copias o adaptaciones. El Software no se le vende al Usuario, el +Usuario adquiere únicamente una licencia condicional de uso del +Software. La titularidad, los derechos de propiedad y los derechos +de propiedad intelectual del contenido al que se accede a través del +Software son propiedad de los propietarios del contenido aplicable y +deben estar protegidos por derechos de autor u otras leyes +aplicables. Este EULA no da derecho alguno al Usuario sobre dicho +contenido. + +Marcas de SUSE +En virtud de este EULA no se otorga ningún derecho o licencia, ni +expreso ni implícito, para utilizar cualquier Marca de SUSE, nombre +comercial o marca de servicio del Licenciador o sus afiliados ni +licenciadores de otro modo que no sea necesario para utilizar el +Software según lo permitido por este EULA + +Servicios de suscripciones y Asistencia técnica +El Licenciador no tiene la obligación de proporcionar mantenimiento +o asistencia a menos que el Usuario adquiera una oferta de +suscripción, de conformidad con un contrato adicional con el +Licenciador o sus afiliados, que incluya expresamente dichos +servicios. + +Garantía y responsabilidad +Garantía limitada +El Licenciador garantiza que el medio en el que se entrega el +software está libre de defectos en materiales y manufacturado bajo +un uso normal para un periodo de sesenta (60) días desde la fecha de +entrega. LA ANTERIOR GARANTÍA ES LA ÚNICA Y EXCLUSIVA COMPENSACIÓN +DEL USUARIO Y SUSTITUYE A CUALQUIER OTRA GARANTÍA, YA SEA EXPLÍCITA +O IMPLÍCITA. SALVO POR LA PRESENTE GARANTÍA, EL SOFTWARE SE ENTREGA +"TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO. +EL SOFTWARE NO ESTÁ DISEÑADO, FABRICADO NI PREVISTO PARA SU USO O +DISTRIBUCIÓN, Y NO SE DEBEN USAR, CON EQUIPOS DE CONTROL EN LÍNEA EN +ENTORNOS PELIGROSOS QUE REQUIERAN UN RENDIMIENTO A PRUEBA DE FALLOS, +COMO EL FUNCIONAMIENTO DE INSTALACIONES NUCLEARES, SISTEMAS DE +NAVEGACIÓN, COMUNICACIONES O CONTROL DE AVIONES, EQUIPOS DE SOPORTE +VITAL DIRECTO, SISTEMAS DE ARMAMENTO O CUALQUIER OTRO USO EN EL QUE +LOS FALLOS EN EL SOFTWARE PUEDAN PROVOCAR DIRECTAMENTE MUERTES, +DAÑOS PERSONALES O FÍSICOS O AL MEDIOAMBIENTE DE GRAVEDAD. +Productos que no sean del Licenciador +El Software puede incluir hardware u otros programas de software o +servicios, o bien formar parte de estos, que hayan sido vendidos o +cuya licencia haya sido otorgada por otra entidad distinta del +Licenciador. EL LICENCIADOR NO GARANTIZA LOS PRODUCTOS O SERVICIOS +NO PERTENECIENTES AL MISMO. ESTOS PRODUCTOS O SERVICIOS SE +DISTRIBUYEN "TAL CUAL". CUALQUIER SERVICIO DE GARANTÍA PARA LOS +PRODUCTOS NO PERTENECIENTES AL LICENCIADOR SERÁ PRESTADO POR EL +LICENCIADOR DEL PRODUCTO, DE CONFORMIDAD CON LO DISPUESTO EN LA +GARANTÍA DEL LICENCIADOR CORRESPONDIENTE. +CON LA EXCEPCIÓN DE LAS RESTRICCIONES LEGALES, EL LICENCIADOR +RECHAZA Y EXCLUYE TODAS LAS GARANTÍAS IMPLÍCITAS, INCLUIDAS LAS +GARANTÍAS DE COMERCIALIZACIÓN, IDONEIDAD PARA UN PROPÓSITO +PARTICULAR, TÍTULO O NO INFRACCIÓN; ASIMISMO TAMPOCO EXISTEN +GARANTÍAS CREADAS EN EL TRASCURSO DE LA NEGOCIACIÓN, EL RENDIMIENTO +O EL USO COMERCIAL. EL LICENCIADOR NO OFRECE NINGUNA GARANTÍA, +REPRESENTACIÓN NI PROMESA NO INCLUIDA DE FORMA EXPLÍCITA EN ESTA +GARANTÍA LIMITADA. EL LICENCIADOR NO GARANTIZA QUE EL SOFTWARE O LOS +SERVICIOS SATISFAGAN LAS NECESIDADES DEL USUARIO, SEAN COMPATIBLES +CON TODOS LOS SISTEMAS OPERATIVOS, O QUE EL FUNCIONAMIENTO DEL +SOFTWARE O LOS SERVICIOS SEA ININTERRUMPIDO O ESTÉ LIBRE DE ERRORES. +LAS EXCLUSIONES Y RENUNCIAS ANTERIORES SON UNA PARTE ESENCIAL DE +ESTE ACUERDO. Algunas jurisdicciones no permiten ciertas exclusiones +y limitaciones de garantías, por lo que algunas de las limitaciones +anteriores pueden no ser aplicables en el caso del Usuario. Esta +garantía limitada le otorga al Usuario derechos específicos. Además, +es posible que le asistan otros derechos, que pueden variar en +función del estado o la jurisdicción. +Limitación de responsabilidad +NI EL LICENCIADOR, NI SUS LICENCIADORES TERCEROS, SUBSIDIARIOS O +EMPLEADOS SERÁN RESPONSABLES EN FORMA ALGUNA DE NINGÚN DAÑO +CONSECUENTE O INDIRECTO, YA SE BASE EN UN CONTRATO, NEGLIGENCIA, +AGRAVIO U OTRA TEORÍA DE RESPONSABILIDAD, NI DE NINGUNA PÉRDIDA DE +BENEFICIOS, NEGOCIO O PÉRDIDA DE DATOS, INCLUSO AUNQUE SE LES +ADVIERTA DE LA POSIBILIDAD DE DICHOS DAÑOS. + +EN CASO DE QUE SE PRODUZCA, EN NINGÚN CASO LA RESPONSABILIDAD +CONJUNTA DEL LICENCIADOR EN RELACIÓN CON ESTE EULA (YA SEA EN UNA +INSTANCIA O EN UNA SERIE DE INSTANCIAS) EXCEDERÁ LA CANTIDAD PAGADA +POR EL USUARIO POR EL SOFTWARE (O 50 DÓLARES DE ESTADOS UNIDOS SI EL +USUARIO NO PAGÓ EL SOFTWARE), DURANTE LOS 12 MESES ANTERIORES A LA +PRIMERA RECLAMACIÓN AMPARADA POR ESTE EULA. +Las exclusiones y limitaciones anteriores no serán de aplicación a +las reclamaciones relacionadas con la muerte o daños personales +causados por la negligencia del Licenciador o de sus empleados, +agentes o contratistas. En las jurisdicciones donde no se permita +la exclusión o limitación de daños y perjuicios, incluyendo, sin +limitación, daños por incumplimiento de cualquiera de las +condiciones implícitas en cuanto al título o disfrute pacífico de +cualquier software obtenido de conformidad con el presente EULA o +por mala interpretación fraudulenta, la responsabilidad del +Licenciador se limitará o excluirá hasta el máximo permitido en +dichas jurisdicciones. + +Condiciones generales +Duración +Este EULA entrará en vigor en la fecha en que el Usuario descargue +el Software y finalizará automáticamente si el Usuario incumple +alguno de sus términos. +Transferencia +Este EULA no se puede transferir ni ceder sin el consentimiento +previo por escrito del Licenciador. Cualquier intento de cesión será +nulo y sin efecto alguno. +Legislación +Todas las cuestiones que surjan o estén relacionadas con el EULA se +regirán por las leyes de Estados Unidos y el estado de Nueva York, +excluyendo cualquier disposición de selección de fuero. Cualquier +pleito, acción o procedimiento que surja de este EULA o que esté +relacionado con él, solo podrá ser llevado ante un tribunal federal +de Estados Unidos o estatal de jurisdicción competente del estado de +Nueva York. Si una parte inicia procedimientos legales relacionados +con el EULA, la parte ganadora tendrá derecho a recuperar los +honorarios razonables de abogados. Sin embargo, si la ubicación +principal del negocio del Usuario se encuentra en un estado miembro +de la Unión Europea o de la Asociación Europea de Libre Comercio, +(1) los tribunales de Inglaterra y Gales tendrán jurisdicción +exclusiva sobre cualquier acción legal relacionada con este EULA y +(2) se aplicarán las leyes de Inglaterra excepto cuando sea +obligatorio que las leyes del país de dicha ubicación principal del +negocio se apliquen a cualquier acción legal, en cuyo caso se +aplicarán las leyes de ese país. Ni la Convención de las Naciones +Unidas sobre los Contratos para la Venta Internacional de +Mercaderías ni las reglas de conflicto de leyes de Nueva York o +Inglaterra y Gales se aplican a este EULA o su contenido. +Acuerdo completo +Este EULA, junto con cualquier otro documento de compra u otro +acuerdo entre el Usuario y el Licenciador o sus Afiliadas, +constituye la totalidad del entendimiento y acuerdo entre el Usuario +y el Licenciador y solo puede ser enmendado o modificado mediante un +acuerdo por escrito firmado por el Usuario y un representante +autorizado del Licenciador. NINGÚN LICENCIADOR EXTERNO, +DISTRIBUIDOR, PROVEEDOR, MINORISTA, REVENDEDOR, COMERCIAL NI +EMPLEADO ESTÁ AUTORIZADO A MODIFICAR ESTE ACUERDO NI A REALIZAR +NINGUNA DECLARACIÓN NI PROMESA QUE CONTRADIGA O AMPLÍE LOS TÉRMINOS +DE ESTE ACUERDO. +Renuncia +Ninguna renuncia voluntaria a los derechos otorgados en virtud de +este EULA será efectiva, a menos que se realice por escrito y esté +firmada por un representante debidamente autorizado de la parte +vinculada. Ninguna renuncia voluntaria a derechos presentes o +pasados obtenidos como consecuencia de infracciones o +incumplimientos se considerará una renuncia voluntaria de ningún +derecho futuro que pueda emanar de este EULA. +Omisión +Si cualquier disposición de este EULA no es válida o no es +aplicable, se interpretará, limitará, modificará o, si es necesario, +recortará en la medida en que sea necesario para eliminar su falta +de validez o imposibilidad de aplicación. El resto de disposiciones +del EULA no se verán afectadas. +Cumplimiento de normativas de exportación +El Usuario reconoce que los productos y/o la tecnología del +Licenciador pueden estar sujetos a las Regulaciones de la +Administración de Exportación de Estados Unidos ("EAR") y a las +leyes comerciales de otros países. El Usuario se compromete a +cumplir con las EAR y con las leyes y normativas locales que puedan +ser aplicables y afectar al derecho del Usuario a importar, exportar +o utilizar los productos y/o la tecnología del Licenciador. El +Usuario no exportará ni reexportará productos del Licenciador, +directa o indirectamente, a: (1) entidades incluidas en las listas +de exclusión a las exportaciones de Estados Unidos o que estén +sometidas a embargos, ni a países que apoyen el terrorismo según se +especifica en las EAR, (2) cualquier usuario final que el Usuario +sepa o tenga razones para saber que utilizará los productos del +Licenciador en el diseño, desarrollo o producción de sistemas de +armas nucleares, químicas o biológicas, sistemas de cohetes, +lanzadores espaciales y cohetes de sondeo o vehículos aéreos no +tripulados, salvo autorización de la agencia pública relevante por +normativas o licencias específicas, o (3) cualquier usuario final al +que se haya prohibido participar en las operaciones de exportación +de los Estados Unidos por cualquier agencia federal del Gobierno de +Estados Unidos. El Usuario no utilizará los productos y/o la +tecnología del Licenciador para fines prohibidos aplicados a +armamento nuclear, misilístico o biológico, tal como se especifica +en las EAR. Al descargar o utilizar el Software, el Usuario está de +acuerdo con lo anterior, y afirma y garantiza que no se encuentra +en, bajo el control de un nacional o residente de dichos países o en +ninguna de dichas listas. Además, el Usuario es responsable de +cumplir con las leyes locales en su jurisdicción que puedan afectar +a su derecho a la importación, exportación o uso de productos del +Licenciador. Consulte la página Web de la Oficina de Industria y +Seguridad de Estados Unidos https://www.bis.doc.gov antes de +exportar productos sujetos al as EAR. Para obtener más información +sobre la exportación del Software, incluyendo el Número de +Clasificación de Control de la Exportación (ECCN) aplicable y la +excepción de licencia asociada (según corresponda), consulte: +https://www.suse.com/company/legal/. Previa solicitud, el +Departamento de Servicios de Comercio Internacional del Licenciador +puede proporcionar información con respecto a las restricciones de +exportación aplicables a los productos del Licenciador. El +Licenciador no asume ninguna responsabilidad en el caso de que no +pueda obtener las aprobaciones de exportación necesarias. + +:versión:2024-02-01:001 +SUSE.com + +Copyright (c) SUSE 2024 + +SUSE Legal +Febrero de 2024 diff --git a/live/root/usr/share/agama/eula/license.final/license.fr.txt b/live/root/usr/share/agama/eula/license.final/license.fr.txt new file mode 100644 index 0000000000..5eb8f39e86 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.final/license.fr.txt @@ -0,0 +1,306 @@ +Contrat de licence utilisateur final +pour les logiciels SUSE + + +Contrat de licence utilisateur final pour les logiciels SUSE +LISEZ ATTENTIVEMENT LE PRÉSENT CONTRAT DE LICENCE. EN ACHETANT, EN +INSTALLANT, EN TÉLÉCHARGEANT OU EN UTILISANT DE TOUTE AUTRE MANIÈRE +CE LOGICIEL (TEL QUE DÉFINI CI-DESSOUS ET Y COMPRIS SES COMPOSANTS), +VOUS ACCEPTEZ LES TERMES DU PRÉSENT CONTRAT. SI VOUS N'ACCEPTEZ PAS +CES TERMES, VOUS N'ÊTES PAS AUTORISÉ À TÉLÉCHARGER, INSTALLER OU +UTILISER LE LOGICIEL. UNE PERSONNE AGISSANT AU NOM D'UNE ENTITÉ +DÉCLARE DISPOSER DE L'AUTORITÉ REQUISE POUR CONCLURE CE CONTRAT AU +NOM DE LADITE ENTITÉ. + +SUSE LLC (" Fournisseur de licence " ou " SUSE ") met à disposition +des produits logiciels, à savoir une compilation de : (i) logiciels +développés par SUSE et ses sociétés affiliées ; (ii) logiciels +développés par des tiers ; (iii) marques appartenant à SUSE et/ou à +ses sociétés affiliées (" Marques SUSE ") ; et (iv) supports ou +reproductions (physiques ou virtuelles) et documentation +accompagnant ces logiciels (cette compilation de programmes, de +marques et de documentations constituant le " Logiciel "). + +Le Logiciel est protégé par les lois et traités sur le copyright en +vigueur aux États-Unis et par les lois sur le copyright dans +d'autres pays. Le présent Contrat de licence utilisateur final (" +CLUF ") est un accord légal entre Vous (entité ou personne) et SUSE +régissant votre utilisation du Logiciel. Si les lois du pays de +votre établissement principal exigent pour rendre les contrats +exécutoires, qu'ils soient rédigés dans la langue locale, une +version dans cette langue peut être obtenue auprès du Fournisseur de +licence en lui adressant une demande écrite et sera réputée régir +votre utilisation du Logiciel. Toute mise à jour, extension ou +application mobile ou tout produit complémentaire, adaptateur, +module ou encore version de support du Logiciel que Vous pouvez +télécharger ou recevoir et qui n'est accompagné d'aucun contrat de +licence est considéré comme étant le Logiciel et est dès lors régi +par le présent CLUF. + +Conditions de licence +Open Source +Le Logiciel contient de nombreux composants individuels qui sont des +logiciels Open Source et la licence Open Source pour chaque +composant, qui, selon le logiciel, peut être la licence publique +générale GNU v.2 +(https://www.gnu.org/licenses/oldlicenses/gpl-2.0.en.html) ou Apache +2.0 (https://www.apache.org/licenses/LICENSE-2.0) ou toute autre +licence Open Source (chacune de ces licences étant la " Licence OSS +"), dans la documentation de licence et/ou dans le code source du +composant. + +Le présent CLUF régit votre utilisation du Logiciel, y compris des +Marques SUSE, et ne limite pas, ne remplace pas ni ne modifie vos +droits en vertu de la Licence OSS applicable à votre utilisation de +tout code Open Source contenu dans le Logiciel sans les Marques +SUSE. + +Le Logiciel peut inclure ou faire partie d'une offre groupée qui +comprend d'autres logiciels concédés sous licence régis par d'autres +clauses et/ou concédés sous licence par un tiers autre que le +Fournisseur de licence. L'utilisation de logiciels faisant l'objet +de contrats de licence distincts est régie par ces contrats. + +Licence d'utilisation du Logiciel +Sous réserve du respect des conditions générales du présent CLUF, le +Fournisseur de licence vous octroie une licence perpétuelle, non +exclusive, non cessible, révocable et de portée mondiale vous +permettant de reproduire le Logiciel et d'en utiliser des copies au +sein de votre Organisation pour son utilisation interne. Le terme " +Organisation " désigne une personne morale et ses sociétés +affiliées. Le terme " Sociétés affiliées " désigne les entités qui +vous contrôlent, que vous contrôlez ou qui sont sous le même +contrôle que Vous. La licence ci-dessus est octroyée à condition que +Vous soyez responsable de toute violation des dispositions du +présent CLUF par vos Sociétés affiliées. + +Ce CLUF ne vous permet pas de distribuer le Logiciel ou ses +composants sous les Marques SUSE, que la copie ait été modifiée ou +non. Vous pouvez effectuer une redistribution en dehors de votre +Organisation : (a) du Logiciel, uniquement si elle est autorisée par +un accord écrit distinct avec le Fournisseur de licence autorisant +une telle redistribution, ou (b) des composants constitutifs du +Logiciel, uniquement si Vous supprimez et remplacez toutes les +occurrences de toute Marque SUSE. + +Si Vous avez reçu, que ce soit directement ou indirectement de SUSE, +du matériel, un logiciel ou un autre applicatif qui utilise ou +intègre le Logiciel, Vous pouvez utiliser le Logiciel uniquement +dans le but d'exécuter ce matériel, logiciel ou applicatif et non de +façon autonome. + +Propriété +Aucun titre de propriété du Logiciel ne vous est cédé. Le +Fournisseur de licence et/ou ses fournisseurs de licences tiers +conservent tous les droits, titres et intérêts de propriété +intellectuelle attachés au Logiciel, y compris ceux portant sur +toute adaptation ou copie dudit Logiciel. Le Logiciel ne vous est +pas vendu, Vous faites uniquement l'acquisition d'une licence +conditionnelle d'utilisation du Logiciel. Le titre, les droits de +possession et de propriété intellectuelle du contenu disponible via +le Logiciel demeurent la propriété de l'éditeur de contenu et +peuvent être protégés par le droit sur le copyright ou d'autres lois +applicables. Le présent CLUF ne vous concède aucun droit sur ce type +de contenu. + +Marques SUSE +Aucun droit ou licence, explicite ou implicite, n'est accordé en +vertu du présent CLUF pour utiliser une Marque SUSE, un nom +commercial ou une marque de service du Fournisseur de licence ou de +ses sociétés affiliées ou fournisseurs de licence autrement que +nécessaire pour utiliser le Logiciel conformément au présent CLUF. + +Services d'abonnement et assistance +Le Fournisseur de licence n'est pas tenu de fournir une maintenance +ou un support, sauf si Vous achetez une offre d'abonnement, +conformément à un contrat supplémentaire avec le Fournisseur de +licence ou ses sociétés affiliées, qui inclut expressément ces +services. + +Garantie et responsabilité +Garantie limitée +Le Fournisseur de licence garantit que les supports sur lesquels +figure le Logiciel sont et seront exempts de défauts matériels ou de +fabrication dans le cadre d'une utilisation normale pour une période +de soixante (60) jours à compter de la date à laquelle ils vous sont +fournis. LA GARANTIE SUSMENTIONNÉE CONSTITUE VOTRE SEUL ET UNIQUE +RECOURS ET REMPLACE TOUTE AUTRE GARANTIE, EXPRESSE OU IMPLICITE. À +L'EXCEPTION DE LA GARANTIE SUSMENTIONNÉE, LE LOGICIEL EST FOURNI " +EN L'ÉTAT " SANS GARANTIE D'AUCUNE SORTE. +LE LOGICIEL N'A PAS ÉTÉ CONÇU, FABRIQUÉ OU PRÉVU POUR UNE +UTILISATION OU UNE DISTRIBUTION SUR UN ÉQUIPEMENT FONCTIONNANT DANS +UN ENVIRONNEMENT DANGEREUX NÉCESSITANT UN FONCTIONNEMENT À L'ÉPREUVE +DE PANNES ET NE DOIT PAS ÊTRE UTILISÉ POUR CE TYPE D'ÉQUIPEMENT : +FONCTIONNEMENT SUR DES INSTALLATIONS NUCLÉAIRES, NAVIGATION +AÉRIENNE, COMMUNICATIONS OU SYSTÈMES DE CONTRÔLE, ÉQUIPEMENTS DE +SAUVETAGE, SYSTÈMES D'ARMES OU AUTRES UTILISATIONS AU COURS +DESQUELLES UNE PANNE DU LOGICIEL POURRAIT ENTRAÎNER DIRECTEMENT LA +MORT, DES BLESSURES CORPORELLES OU UNE DÉTÉRIORATION GRAVE DE +L'ENVIRONNEMENT. +Produits d'un autre éditeur +Le Logiciel peut inclure ou faire partie d'une offre groupée qui +inclut du matériel ou d'autres logiciels ou services concédés sous +licence ou vendus par une entité autre que le Fournisseur de +licence. LE FOURNISSEUR DE LICENCE NE GARANTIT PAS LES PRODUITS OU +SERVICES FOURNIS PAR UN AUTRE ÉDITEUR. CES PRODUITS OU SERVICES SONT +FOURNIS " TELS QUELS ". TOUTE GARANTIE ÉVENTUELLE SUR CES PRODUITS +D'UN AUTRE ÉDITEUR NE PEUT ÊTRE OFFERTE QUE PAR LE FOURNISSEUR DE +LICENCE DE CES PRODUITS EN VERTU DE SES PROPRES CONDITIONS DE +GARANTIE APPLICABLES. +SOUS RÉSERVE DE RESTRICTIONS CONTRAIRES PRÉVUES PAR LA LOI, LE +FOURNISSEUR DE LICENCE EXCLUT TOUTE GARANTIE GÉNÉRALEMENT QUELCONQUE +ET TOUTE GARANTIE IMPLICITE NOTAMMENT TOUTE GARANTIE DE QUALITÉ +MARCHANDE OU D'ADÉQUATION À UN USAGE PARTICULIER, TOUT DROIT DE +PROPRIÉTÉ OU DE NON-CONTREFAÇON AINSI QUE TOUTE GARANTIE DÉCOULANT +D´ÉCHANGES COMMERCIAUX OU D'UNE UTILISATION COMMERCIALE OU TOUTE +GARANTIE DE PERFORMANCES. LE FOURNISSEUR DE LICENCE N'APPORTE AUCUNE +GARANTIE ET N'ENGAGE AUCUNE RESPONSABILITÉ NON EXPRESSÉMENT DÉFINIE +DANS LA PRÉSENTE GARANTIE LIMITÉE. IL NE GARANTIT PAS QUE LE +LOGICIEL OU LES SERVICES SATISFERONT À VOS EXIGENCES, QU'ILS SERONT +COMPATIBLES AVEC TOUS LES SYSTÈMES D'EXPLOITATION OU QU'ILS +FONCTIONNERONT DE MANIÈRE ININTERROMPUE OU SANS ERREUR. LES +EXCLUSIONS ET LIMITATIONS DE GARANTIE PRÉCÉDENTES SONT UNE PARTIE +ESSENTIELLE DU PRÉSENT CONTRAT. Certaines juridictions n'autorisent +pas certaines exclusions ou limitations de garantie. Par conséquent, +il se peut qu'une partie des limitations susmentionnées ne Vous +soient pas applicables. La présente garantie limitée Vous confère +des droits spécifiques, auxquels peuvent s'ajouter d'autres droits +variables en fonction de la législation en vigueur dans l'État ou la +juridiction dont Vous relevez. +Limitation de responsabilité +NI LE FOURNISSEUR DE LICENCE NI AUCUN DE SES FOURNISSEURS DE LICENCE +TIERS, FILIALES OU EMPLOYÉS NE SERONT RESPONSABLES DE QUELCONQUE +DOMMAGE CONSÉCUTIF OU INDIRECT, QU'IL SOIT FONDÉ SUR UN CONTRAT, UNE +NÉGLIGENCE, UN TORT OU TOUTE AUTRE THÉORIE DE RESPONSABILITÉ, OU DE +QUELCONQUE PERTE DE BÉNÉFICES OU D'ACTIVITÉS OU PERTE OU CORRUPTION +DE DONNÉES, DANS CHAQUE CAS, MÊME SI LA POSSIBILITÉ DE CES DOMMAGES +A ÉTÉ SIGNALÉE. + +EN AUCUN CAS, LA RESPONSABILITÉ GLOBALE DU FOURNISSEUR DE LICENCE +CONFORMÉMENT AU PRÉSENT CLUF OU EN ASSOCIATION À CELUI-CI (QUE CE +SOIT EN UNE SEULE INSTANCE OU UNE SÉRIE D'INSTANCES) NE DÉPASSERA LE +MONTANT QUE VOUS AVEZ PAYÉ POUR LE LOGICIEL À L'ORIGINE D'UNE TELLE +RÉCLAMATION (OU 50 USD SI VOUS N'AVEZ PAS PAYÉ POUR LE LOGICIEL), +DANS LES 12 MOIS PRÉCÉDANT LA PREMIÈRE RÉCLAMATION EN VERTU DU +PRÉSENT CLUF. +Les exclusions et limitations stipulées plus haut ne s'appliquent +pas en cas de décès ou de dommage corporel causé par la négligence +du Fournisseur de licence, de ses employés, agents ou +sous-traitants. Dans les juridictions où la loi rend inapplicables +les exclusions ou limitations de responsabilité de ces dommages, y +compris, mais sans limitation, les dommages découlant d'une +violation des termes implicites quant au droit de propriété ou à la +jouissance paisible du Logiciel concédé sous licence en vertu du +présent CLUF ou d'une présentation frauduleuse, la responsabilité du +Fournisseur de licence sera exclue ou limitée dans la mesure +maximale permise par la législation de ces juridictions. + +Conditions générales d'utilisation +Terme +Le présent CLUF entre en vigueur à la date à laquelle Vous acquérez +le Logiciel. Il sera automatiquement résilié si Vous ne respectez +pas l'une de ses conditions. +Cession +Le présent CLUF ne peut en aucun cas être cédé ni assigné sans +l'accord préalable écrit du Fournisseur de licence. Toute tentative +de cession ou d'assignation sera considérée comme nulle et non +avenue. +Droit +Tout litige découlant ou concernant le présent CLUF sera soumis aux +principales lois des États-Unis et de l'État de New York +indépendamment de ses dispositions concernant le choix de la loi +applicable. Tout procès, action ou procédure découlant ou concernant +le présent CLUF peut uniquement être porté devant les tribunaux +fédéraux ou fédérés de la juridiction compétente de New York. Si une +partie entame une procédure légale par rapport au présent CLUF, la +partie qui remporte le procès sera en droit de se voir dédommager, +dans la mesure du raisonnable, de ses frais d'avocat. Toutefois, si +votre établissement principal est situé dans un État membre de +l'Union européenne ou de l'Association européenne de libre-échange, +(1) les tribunaux d'Angleterre et du pays de Galles seront l'unique +juridiction habilitée à recevoir toute action juridique au titre du +présent CLUF et (2) les lois d'Angleterre s'appliqueront excepté si +les lois du pays de votre établissement principal exigent d'être +appliquées pour ce type d'action devant les tribunaux, auquel cas ce +seront les lois dudit pays qui régiront l'action. Ni la Convention +des Nations Unies sur les contrats de vente internationale de +marchandises ni les règles de conflit de lois de New York ou +d'Angleterre et du pays de Galles ne s'appliquent au présent CLUF ou +à son objet. +Accord complet +Le présent CLUF ainsi que tous les autres documents d'achat ou tout +autre accord écrit entre Vous et le Fournisseur de licence ou ses +sociétés affiliées définissent la totalité des conventions entre +Vous et le Fournisseur de licence, et ne peuvent être amendés ou +modifiés que par un accord écrit conclu entre Vous et un +représentant autorisé du Fournisseur de licence. AUCUN FOURNISSEUR +DE LICENCE TIERS, DISTRIBUTEUR, VENDEUR, DÉTAILLANT, REVENDEUR, +REPRÉSENTANT OU EMPLOYÉ N'EST AUTORISÉ À MODIFIER CE CONTRAT OU À +ENGAGER DES RESPONSABILITÉS AUTRES QUE CELLES INCLUSES DANS LES +PRÉSENTES CLAUSES DU CONTRAT. +Renonciation +Toute renonciation à l'un des droits octroyés par le présent CLUF +devra, pour prendre effet, être formulée par écrit et signée par un +représentant dûment autorisé de la partie concernée. Toute +renonciation du droit passé ou présent causé par la violation de +l'une des clauses du présent CLUF représentera une renonciation des +droits futurs liés à ce CLUF. +Indépendance des Clauses +Si l'une des clauses de ce CLUF perd sa valeur juridique ou sa force +exécutoire, ladite disposition sera interprétée, limitée, modifiée +ou, le cas échéant, résiliée afin d'éliminer son inapplicabilité ; +en revanche, les autres dispositions conserveront leur +applicabilité. +Respect de la Réglementation en matière d'exportation +Vous reconnaissez que les produits et/ou la technologie du +Fournisseur de licence peuvent être soumis à la réglementation +américaine sur les exportations ("EAR") et aux lois commerciales +d'autres pays. Vous acceptez de vous conformer à la réglementation +EAR et aux lois et réglementations locales applicables et ayant une +incidence sur votre droit d'importer, d'exporter ou d'utiliser les +produits et/ou la technologie du Fournisseur de licence. Vous +acceptez de ne pas exporter ni réexporter les produits du +Fournisseur de licence, de manière directe ou indirecte : (1) vers +des entités figurant sur les listes actuelles d'exclusion des +exportations des États-Unis ou vers des pays soumis à un embargo ou +soutenant le terrorisme tels que spécifiés dans la réglementation +EAR ; (2) vers tout utilisateur final dont Vous savez ou avez des +raisons de penser qu'il utilisera les produits du Fournisseur de +licence pour concevoir, développer ou produire des armes nucléaires, +chimiques ou biologiques, des systèmes de fusée, des lanceurs +spatiaux, des fusées sondes ou des systèmes de véhicules aériens +sans pilote, hormis s'il y est autorisé par l'agence gouvernementale +compétente par une réglementation ou licence spécifique ; (3) vers +tout utilisateur final frappé d'embargo par le Gouvernement fédéral +des États-Unis en matière de transactions à l'exportation. Vous +n'utiliserez pas les produits et/ou la technologie du Fournisseur de +licence pour des utilisations finales interdites dans le domaine des +armements nucléaires, des missiles ou des armes biologiques ou +chimiques, comme stipulé dans la réglementation EAR. En +téléchargeant ou en utilisant le Logiciel, Vous acceptez ce qui +précède et Vous déclarez et garantissez que Vous n'êtes pas situé +dans un tel pays, subordonné à ce dernier, originaire ou résident de +ce pays ou d'un pays de cette liste. Par ailleurs, Vous êtes tenu de +respecter toute législation locale de votre juridiction susceptible +d'avoir un impact sur votre droit à l'importation, l'exportation ou +l'utilisation des produits du Fournisseur de licence. Avant +d'exporter des produits soumis à la réglementation EAR, consultez la +page Web (en anglais) du Bureau of Industry and Security +https://www.bis.doc.gov . Pour plus d'informations sur l'exportation +du Logiciel ainsi que sur son numéro ECCN (numéro de classification +du contrôle à l'exportation) et les exceptions de licence associées +(le cas échéant), consultez le site Web +https://www.suse.com/fr-fr/company/legal/. Sur demande, le ministère +du Commerce international du Fournisseur de licence peut fournir des +informations relatives aux restrictions applicables aux produits du +Fournisseur de licence en matière d'exportation. Le Fournisseur de +licence décline toute responsabilité en cas de refus d'obtention des +autorisations d'exportation nécessaires. + +:version:2024-02-01:001 +SUSE.com + +Copyright (c) SUSE 2024 + +SUSE - Juridique +Février 2024 diff --git a/live/root/usr/share/agama/eula/license.final/license.it.txt b/live/root/usr/share/agama/eula/license.final/license.it.txt new file mode 100644 index 0000000000..1a4ae05997 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.final/license.it.txt @@ -0,0 +1,308 @@ +Contratto di licenza con l'Utente finale +per il software SUSE + + +Contratto di licenza con l'Utente finale per i software SUSE +LEGGERE ATTENTAMENTE IL PRESENTE CONTRATTO. ACQUISTANDO, +INSTALLANDO, SCARICANDO O ALTRIMENTI UTILIZZANDO QUESTO PRODOTTO +SOFTWARE (COME DEFINITO DI SEGUITO E INCLUSI I RELATIVI COMPONENTI), +L'UTENTE ACCETTA I TERMINI DEL PRESENTE CONTRATTO. SE NON SI +ACCETTANO QUESTE CONDIZIONI, NON È CONSENTITO SCARICARE, INSTALLARE +O UTILIZZARE IL SOFTWARE. UN INDIVIDUO CHE AGISCA PER CONTO DI +UN'ENTITÀ DISPONE DELL'AUTORITÀ PER ACCEDERE AL PRESENTE CONTRATTO +PER CONTO DI TALE ENTITÀ. + +SUSE LLC ("Licenziante" o "SUSE") rende disponibili i prodotti +software come parte della seguente raccolta: (i) programmi software +sviluppati da SUSE e dalle sue affiliate; (ii) programmi software +sviluppati da terze parti; (iii) marchi commerciali di proprietà di +SUSE e/o delle sue affiliate ("Marchi SUSE"); e (iv) supporti +multimediali o riproduzioni (fisiche o virtuali) e documentazione a +corredo dei tali programmi software (ad esempio, raccolte di +programmi, marchi commerciali e documentazione che rientrano nella +definizione di "Software"). + +Il software è protetto dai trattati e dalle leggi sul copyright +degli Stati Uniti e in altri Paesi. Il contratto di licenza con +l'utente finale ("EULA") è un accordo legale fra l'Utente (un'entità +o una persona) e SUSE, che disciplina l'utilizzo del Software. Se le +leggi del Paese della propria sede operativa principale richiedono +che i contratti siano redatti nella lingua locale per essere validi, +tale versione nella lingua locale può essere richiesta per iscritto +al Licenziante e disciplinerà l'uso del Software da parte +dell'Utente finale. Qualsiasi componente aggiuntivo, estensione, +versione di aggiornamento, applicazione mobile, modulo, adattatore o +supporto del presente Software scaricati o ricevuti dall'Utente e +non accompagnati da un contratto di licenza rientrano nel Software e +sono soggetti alle condizioni del presente Contratto di licenza con +l'utente finale. + +Termini della licenza +Open source +Il Software contiene molti singoli componenti che costituiscono +software open source e la licenza open source per ciascun +componente, che, a seconda del programma software, può essere GNU +General Public License v.2 +(https://www.gnu.org/licenses/oldlicenses/gpl-2.0.en.html) o Apache +2.0 (https://www.apache.org/licenses/LICENSE-2.0) o un'altra licenza +open source (ciascuna, "OSS License"), è disponibile nella +documentazione di licenza e/o nel codice sorgente del componente. + +Il presente Contratto di licenza con l'utente finale disciplina +l'utilizzo del Software, compresi i Marchi SUSE, e non limita, +prevale su o modifica i diritti dell'Utente ai sensi della Licenza +OSS applicabile all'utilizzo di qualsiasi codice open source +contenuto nel Software senza i Marchi SUSE. + +Il Software può includere o essere venduto insieme ad altri +programmi software concessi in licenza ai sensi di termini diversi +e/o autorizzati da terze parti diverse dal Licenziante. L'uso di +qualsiasi programma software provvisto di un contratto di licenza +separato è disciplinato da tale contratto di licenza. + +Licenza di utilizzo del software +Nel rispetto della conformità ai termini e condizioni del presente +Contratto di licenza con l'utente finale, il Licenziante concede +all'Utente una licenza perpetua internazionale non esclusiva, non +trasferibile e revocabile per riprodurre e utilizzare copie del +Software all'interno dell'Organizzazione dell'utente per scopi +aziendali. Il termine "Organizzazione" definisce un'entità legale e +i relativi affiliati. Il termine "Affiliate" si riferisce alle +entità che controllano l'Utente, sono controllate dall'Utente o sono +controllate dalla stessa entità che controlla l'Utente. In relazione +alla licenza in questione, l'Utente sarà ritenuto responsabile di +qualunque violazione delle disposizioni del presente Contratto di +licenza con l'utente finale, anche da parte delle relative +Affiliate. + +Questo Contratto di licenza con l'utente finale vieta la +distribuzione del Software o dei relativi componenti utilizzando i +marchi del SUSE, indipendentemente dal fatto che la copia degli +stessi sia stata modificata. L'utente può ridistribuire all'esterno +dell'organizzazione: (a) il software solo se tale ridistribuzione è +consentita e autorizzata ai sensi di un contratto distinto in forma +scritta stipulato con il licenziante, oppure (b) i componenti +costitutivi del software solo se l'Utente rimuove e sostituisce +tutte le occorrenze del marchio SUSE. + +Qualora avesse ricevuto componenti hardware, software o altri +appliance che utilizzano o integrano il software, l'Utente può +utilizzarlo al solo scopo di eseguire tale hardware, software o +appliance. Non è consentito l'utilizzo del software come componente +autonomo. + +Proprietà +All'Utente non viene trasferito alcun titolo o diritto di proprietà +sul Software. Il Licenziante e/o i suoi concessori di licenza di +terze parti mantengono tutti i titoli e i diritti di proprietà +intellettuale sul Software, inclusi quelli di adattamento o copia. +Il Software non viene venduto all'Utente, il quale acquista +esclusivamente una licenza condizionale per l'utilizzo del Software. +Titolo, diritti di proprietà e diritti di proprietà intellettuale in +merito ai contenuti a cui si accede mediante il Software sono di +proprietà del rispettivo proprietario e possono essere protetti +dalle leggi sul copyright o da altre leggi applicabili. Il presente +Contratto di licenza con l'utente finale non comporta alcun diritto +dell'Utente nei confronti di tali contenuti. + +Marchi SUSE +Il presente Contratto di licenza con l'utente finale non concede +diritti o licenze, espressi o impliciti, per l'utilizzo di qualsiasi +marchio, marchio SUSE o marchio di servizio del Licenziatario o dei +relativi licenzianti e delle relative affiliate al di fuori dei casi +necessari per l'utilizzo del Software come consentito dal presente +Contratto di licenza con l'utente finale. + +Supporto e servizi associati alla sottoscrizione +Il licenziante non ha alcun obbligo di fornire manutenzione o +assistenza a meno che l'Utente non acquisti un'offerta di +abbonamento, in conformità con qualsivoglia contratto aggiuntivo con +il Licenziante o le sue affiliate, che includa espressamente tali +servizi. + +Garanzia +Garanzia limitata +Il Licenziante garantisce che il supporto su cui il Software è +fornito sarà privo di difetti a livello di materiale e fabbricazione +durante il normale utilizzo per un periodo di sessanta (60) giorni +dalla data di consegna all'Utente. LA SUDDETTA GARANZIA È L'UNICA +TUTELA DELL'UTENTE E SOSTITUISCE QUALSIASI ALTRA GARANZIA, ESPLICITA +O IMPLICITA. FATTA ECCEZIONE PER LA PRESENTE GARANZIA, IL SOFTWARE +VIENE FORNITO "NELLO STATO IN CUI SI TROVA" SENZA ALCUN TIPO DI +GARANZIA. +IL SOFTWARE NON È PROGETTATO, REALIZZATO O DESTINATO ALL'USO O ALLA +VENDITA CON, E NON DEVE ESSERE UTILIZZATO PER, APPARECCHIATURE DI +CONTROLLO IN TEMPO REALE, IN AMBIENTI AD ALTO RISCHIO PER I QUALI +SONO NECESSARIE PRESTAZIONI CHE GARANTISCANO LA MASSIMA SICUREZZA, +QUALI SISTEMI PER IL CONTROLLO DI IMPIANTI NUCLEARI, SISTEMI PER LA +NAVIGAZIONE, LA COMUNICAZIONE O IL CONTROLLO AEREO, STRUMENTI DI +SUPPORTO DIRETTO ALLA VITA DELLE PERSONE, SISTEMI DI ARMI ALTRI +STRUMENTI PER I QUALI IL GUASTO DEL SOFTWARE POTREBBE CAUSARE MORTE, +GRAVI DANNI ALLE PERSONE O ALL'AMBIENTE. +Prodotti di terze parti +Il Software può includere o essere venduto insieme a hardware o ad +altri programmi software concessi in licenza o forniti da un +concessore di licenza diverso dal Licenziante. IL LICENZIANTE NON +FORNISCE ALCUNA GARANZIA PER I PRODOTTI O I SERVIZI DI TERZE PARTI. + TALI PRODOTTI O SERVIZI VENGONO FORNITI "COSĚ COME SONO". QUALSIASI +SERVIZIO DI GARANZIA PER PRODOTTI DI TERZE PARTI VIENE FORNITO DAL +RELATIVO CONCESSORE DI LICENZA IN CONFORMITÀ ALLE CONDIZIONI DI +GARANZIA DEFINITE DALLO STESSO. +SALVO NEI CASI DIVERSAMENTE PREVISTI DALLA LEGGE, IL LICENZIANTE NON +RICONOSCE ALCUNA GARANZIA IMPLICITA, INCLUSE LE GARANZIE DI +COMMERCIABILITÀ, IDONEITÀ A UNO SCOPO PARTICOLARE, PROPRIETÀ O NON +VIOLAZIONE DEI DIRITTI ALTRUI, NÉ RILASCIA ALCUNA GARANZIA DERIVANTE +DAGLI USI DEL COMMERCIO E DALLA PRASSI COMMERCIALE. IL LICENZIANTE +NON CONCEDE ALCUNA GARANZIA NÉ RILASCIA ALCUNA ASSERZIONE O +ASSICURAZIONE NON ESPRESSAMENTE DICHIARATA IN QUESTA GARANZIA +LIMITATA. IL LICENZIANTE NON GARANTISCE CHE IL SOFTWARE O I SERVIZI +CORRISPONDANO AI REQUISITI DELL'UTENTE, SIANO COMPATIBILI CON TUTTI +I SISTEMI OPERATIVI O CHE IL FUNZIONAMENTO DEL SOFTWARE O DEI +SERVIZI NON SUBIRÀ INTERRUZIONI O SIA PRIVO DI ERRORI. LE SEGUENTI +ESCLUSIONI E LIMITAZIONI DI GARANZIA COSTITUISCONO PARTE INTEGRANTE +DEL PRESENTE CONTRATTO. Poiché alcune giurisdizioni non consentono +determinate esclusioni e limitazioni di garanzia, alcune parti delle +suddette limitazioni potrebbero non essere applicabili a uno +specifico Utente. In aggiunta ai diritti specifici che la presente +garanzia limitata riconosce all'Utente, questo potrebbe godere di +ulteriori diritti, che variano in base alla giurisdizione. +Limitazione di responsabilità +NÉ IL LICENZIANTE NÉ ALCUN LICENZIANTE DI TERZE PARTI, DISTRIBUTORE +O DIPENDENTE SARÀ IN ALCUN CASO RESPONSABILE PER DANNI DI QUALSIASI +TIPO, CONSEQUENZIALI O INDIRETTI, AI SENSI DEL CONTRATTO, PER +NEGLIGENZA, PER ILLECITO O ALTRE IPOTESI DI RESPONSABILITÀ, O PER +QUALSIVOGLIA PERDITA DI PROFITTO O AFFARI, O ALTRESÌ PERDITA O +CORRUZIONE DI DATI, IN OGNI CIRCOSTANZA, ANCHE QUALORA SIANO STATI +INFORMATI DELLA POSSIBILITÀ DI TALI DANNI. + +IN NESSUN CASO LA RESPONSABILITÀ COMPLESSIVA DEL LICENZIANTEAI SENSI +O IN RELAZIONE AL PRESENTE CONTRATTO DI LICENZA CON L'UTENTE FINALE +(CHE SIA IN UNA CIRCOSTANZA O IN UNA SERIE DI CIRCOSTANZE) POTRÀ +SUPERARE L'IMPORTO CORRISPOSTO DALL'UTENTE PER IL SOFTWARE DA CUI +DERIVI TALE RIVENDICAZIONE (OPPURE $ 50 USD SE L'UTENTE NON HA +PAGATO ALCUNO IMPORTO PER IL SOFTWARE), NEI 12 MESI PRECEDENTI LA +PRIMA RIVENDICAZIONE AI SENSI DEL PRESENTE CONTRATTO DI LICENZA CON +L'UTENTE FINALE. +Le suddette esclusioni e limitazioni non sono applicabili ai reclami +relativi a casi di decesso o di grave danno alle persone causati +dalla negligenza del Licenziante o dei suoi dipendenti, agenti o +contraenti. Negli Stati in cui non sono ammesse esclusioni o +limitazioni della responsabilità per danni, compresi, a titolo +esemplificativo, danni derivanti dalla violazione di termini +impliciti relativi alla titolarità o al quieto godimento di +qualsiasi Software ottenuto in virtù del presente Contratto di +licenza con l'utente finale o per falsa dichiarazione fraudolenta, +la responsabilità del Licenziante sarà limitata o esclusa nei limiti +massimi concessi all'interno di essi. + +Termini generali +Termine +Gli effetti del presente Contratto di licenza con l'utente finale +decorrono dal giorno in cui l'Utente ha effettuato il download del +Software e verranno automaticamente a cessare in caso di violazione +di una qualsiasi delle sue condizioni. +Trasferimento +Questo Contratto di licenza con l'utente finale non può essere +trasferito o concesso senza previo consenso scritto del +Licenziatario. Qualsiasi tentativo di trasferimento o assegnazione +sarà nullo e senza efficacia. +Legislazione +Tutte le questioni derivanti o correlate al presente Contratto di +licenza con l'utente finale saranno disciplinate dalle leggi vigenti +negli Stati Uniti e nello Stato di New York senza tenere in conto le +clausole normative e regolamentative stabilite nel presente +contratto. Ogni azione legale o procedimento derivanti o relativi al +presente Contratto di licenza con l'utente finale potrà essere +discusso esclusivamente davanti ai tribunali della giurisdizione +competente dello Stato di New York. Se una parte avvia procedimenti +legali relativi al Contratto di licenza con l'utente finale, la +parte vincitrice avrà diritto a recuperare le spese legali +ragionevoli. Se, tuttavia, la sede operativa principale dell'Utente +risiede in un paese membro dell'Unione europea o dell'Associazione +europea di libero scambio, (1) i tribunali dell'Inghilterra e del +Galles avranno competenza esclusiva per quanto riguarda azioni +legali relative al presente Contratto di licenza con l'utente +finale; (2) le leggi dell'Inghilterra saranno applicate tranne che +nei casi in cui le leggi del paese della sede operativa principale +debbano essere applicate per qualsiasi azione legale; in tal caso le +leggi di tale paese verranno applicate. Né la convenzione delle +Nazioni Unite sui contratti di vendita internazionale di merci né le +norme sul conflitto di legge in vigore nello Stato di New York, in +Inghilterra o in Galles si applicano al presente Contratto di +licenza con l'utente finale o al suo oggetto. +Intero Contratto +Il presente Contratto di licenza con l'utente finale, insieme ad +altri documenti relativi all'acquisto o ad altri contratti scritti +tra l'Utente e il Licenziante o le relative Affiliate, definisce +tutti i termini dell'accordo tra l'Utente e il Licenziante e può +essere rettificato o modificato solo per iscritto mediante un +accordo accettato dall'Utente e da un rappresentante autorizzato del +Licenziante. NESSUN LICENZIANTE DI TERZE PARTI, DISTRIBUTORE, +RIVENDITORE, CONCESSIONARIO, RAPPRESENTANTE O DIPENDENTE POTRÀ +MODIFICARE IL PRESENTE CONTRATTO O FORNIRE DICHIARAZIONI O PROMESSE +DIVERSE O AGGIUNTIVE RISPETTO AI TERMINI E ALLE CONDIZIONI INDICATI +NEL PRESENTE CONTRATTO. +Rinuncia +Nessuna rinuncia a un qualsiasi diritto concesso da questo Contratto +di licenza con l'utente finale sarà effettiva a meno che non venga +riportata per iscritto e firmata da un rappresentante autorizzato +della parte vincolata. Nessuna rinuncia a un qualsiasi diritto +passato o presente derivante da violazione o inadempienza potrà +essere considerata una rinuncia a un qualsiasi diritto futuro +risultante da questo Contratto di licenza con l'utente finale. +Separabilità di clausole +Se una qualsiasi clausola del presente Contratto di licenza con +l'utente finale non è valida o è inapplicabile, verrà interpretata, +limitata, modificata o, se necessario, eliminata nella misura +necessaria, in modo da garantirne la validità o l'applicabilità, +senza che ciò abbia alcun effetto sulle altre clausole del Contratto +di licenza con l'utente finale. +Responsabilità collegata alle esportazioni +L'Utente riconosce che la tecnologia e/o i prodotti del Licenziante +possono essere soggetti alle U.S. Export Administration Regulations +(the "EAR") e alle normative sul commercio vigenti in altri paesi. +L'Utente accetta di rispettare l'EAR, nonché i regolamenti e le +normative locali, che possono essere applicabili al e influenzare il +diritto dell'Utente all'importazione, all'esportazione o +all'utilizzo dei prodotti e/o delle tecnologie del Licenziante. +L'Utente accetta di non esportare o riesportare i prodotti del +Licenziante, direttamente o indirettamente, verso: (1) paesi su cui +gravano restrizioni all'esportazione da parte degli USA, paesi +sottoposti a embargo o paesi che sostengono il terrorismo in base a +quanto specificato nell'EAR; (2) utenti finali per i quali si sa o +si ha ragione di credere che utilizzeranno i prodotti del +Licenziante nella progettazione, nello sviluppo o nella produzione +di armi nucleari, chimiche o batteriologiche, o di razzi, vettori e +razzi-sonda o droni, salvo autorizzazione dell'agenzia governativa +pertinente tramite regolamento o licenza specifica; o (3) utenti +finali ai quali è stato proibito di partecipare a transazioni di +esportazione statunitensi da parte di un'agenzia federale del +governo degli Stati Uniti. L'utente non utilizzerà le tecnologie e/o +i prodotti del Licenziante per applicazioni finali di carattere +nucleare, missilistico o armi chimiche o biologiche, come +specificato dall'EAR. Scaricando o utilizzando il Software, l'Utente +accetta quanto stabilito in precedenza e dichiara di non trovarsi, +essere sotto il controllo di o essere un residente di Paesi presenti +in uno dei citati elenchi. Inoltre, l'Utente accetta di attenersi +alle leggi locali della propria giurisdizione che potrebbero avere +un impatto sul suo diritto di importare, esportare o utilizzare i +prodotti del Concessore di licenza. Fare riferimento al sito Web del +Bureau of Industry and Security https://www.bis.doc.gov prima di +esportare prodotti soggetti alle normative EAR. Per ulteriori +informazioni sull'esportazione del Software, compresi l'Export +Control Classification Number (ECCN) e le eccezioni relative alle +licenze associate (se applicabili), consultare +https://www.suse.com/company/legal/. Su richiesta, il dipartimento +dei servizi per il commercio internazionale del Licenziante può +offrire informazioni specifiche sulle limitazioni applicabili +relative all'esportazione. Il Licenziante non si assume alcuna +responsabilità per il mancato ottenimento da parte dell'Utente delle +necessarie autorizzazioni all'esportazione. + +:versione:2024-02-01:001 +SUSE.com + +Copyright (c) SUSE 2024 + +SUSE Legal +Febbraio 2024 diff --git a/live/root/usr/share/agama/eula/license.final/license.ja.txt b/live/root/usr/share/agama/eula/license.final/license.ja.txt new file mode 100644 index 0000000000..e4279734a5 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.final/license.ja.txt @@ -0,0 +1,253 @@ +エンドユーザ使用許諾契約 +SUSEソフトウェア対象 + + +SUSEソフトウェアを対象とするエンドユーザ使用許諾契約 +本契約書は注意深くお読みください。本ソフトウェア(下記にて定義され +ており、そのコンポーネントを含む)を購入、インストール、ダウンロー +ド、使用することにより、お客様は本契約の条項に同意されたものとしま +す。お客様が本契約の条項に同意しない場合は、本ソフトウェアをダウン +ロード、インストールまたは使用はできません。エンティティの代わりの +個人の行為は、当人がエンティティの代わりに本契約を締結する権限があ +ることを表しています。 + +SUSE LLC(「ライセンサー」または「SUSE」)は入手可能な +ソフトウェア製品を製造しています。当該製品は、(i) SUSEとそ +の関連会社が開発したソフトウェアプログラム、(ii) 第三者が開発 +したソフトウェアプログラム、(iii) SUSEとその関連会社また +はそのいずれかが所有する商標(「SUSEマーク」)、ならびに、 +(iv) 上記のソフトウェアプログラムに付随する媒体または複製物( +物理的または仮想的)および付属書類で編成されます(上記のプログラム、 +商標、書類で編成されたものを「本ソフトウェア」と称する)。 + +本ソフトウェアは、アメリカ合衆国の著作権法および条約、ならびに、世 +界中のその他の国の著作権法により保護されています。本エンドユーザ使 +用許諾契約(「EULA」)は、お客様(法人(エンティティ)または個 +人)による本ソフトウェアの使用を規定した法的契約であり、お客様と +SUSEの間で締結されます。お客様の主たる事業所の規範が、現地の言 +語で契約することを要めている場合、係る現地言語版の契約をお客様がラ +イセンサーに対して書面による要求を行って入手することにより、お客様 +による本ソフトウェアの使用に対して効力を発するものと見なされます。 +お客様がダウンロードまたは受領するソフトウェアのすべてのアドオン、 +拡張機能、アップデート、モバイルアプリケーション、モジュール、アダ +プタまたはサポートリリース版は、使用許諾契約を伴わない限り、本ソフ +トウェアの一部であり、本EULAが適用されるものとします。 + +使用許諾条項 +オープンソース +本ソフトウェアには、オープンソースソフトウェアである数多くの個別コ +ンポーネントと、各コンポーネントのオープンソースライセンスが含まれ +ています。これらはソフトウェアプログラムによって異なり、GNU +General Public License +v.2(https://www.gnu.org/licenses/ +oldlicenses/gpl-2.0.en.html)、 +Apache +2.0(https://www.apache.org/licens +es/LICENSE-2.0)または、その他のオープンソースライセ +ンス(上記の各ライセンスを「OSSライセンス」と称する)になります +。上記ライセンスは、ライセンス(使用許諾)取得関連書類やコンポーネ +ントのソースコードに記載されています。 + +本EULAは、お客様による本ソフトウェア(SUSEマークを含む)の +使用を規定するものであり、本ソフトウェアに含まれているがSUSEマ +ークがないオープンソースコードのお客様による使用に対して適用される +OSSライセンスに準じたお客様の権利を制限するものではなく、同権利 +に優先するものではなく、同権利を変更するものではありません。 + +本ソフトウェアは、別段の条件またはライセンサー以外の第三者、もしく +はその両方により使用許諾された、他のソフトウェアプログラムを含んで +いるか、またはこのような他のソフトウェアプログラムにバンドルされて +いる場合があります。別の使用許諾契約が添付されているソフトウェアプ +ログラムの使用には、当該別添の使用許諾契約が適用されます。 + +本ソフトウェアを使用するためのライセンス +本EULAの諸条件の順守を前提として、ライセンサーはお客様に対し、 +お客様の組織内で本ソフトウェアを複製し、そのコピーを使用できるライ +センスを付与します。このライセンスは、恒久的で、非独占的で、譲渡不 +可能で、取り消し可能で、世界に通用するものです。「組織」は法人(エ +ンティティ)およびその関連会社を意味します。「関連会社」は、お客様 +を管理している法人(エンティティ)、お客様によって管理されている法 +人、または、お客様と共通の管理下にある法人を意味します。上記のライ +センスは、お客様の関連会社による本EULAの条項違反に対し、お客様 +が責任を負うことを条件としています。 + +本EULAでは、コピーが変更されているかどうかに関わりなく、 +SUSEマークを使用したソフトウェアまたはそのコンポーネントの配布 +は許可されていません。お客様は、お客様の組織外において、(a) 本 +ソフトウェアの再配布(かかる再配布の承認についてライセンサーと別途 +締結した契約書に基づいて許可される場合のみ)、または (b) 本ソ +フトウェアを構成するコンポーネントの再配布(お客様がSUSEマーク +の出現をすべて排除・置換する場合のみ)を実行できます。 + +お客様は、本ソフトウェアが使用されている、もしくは組み込まれている +ハードウェア、ソフトウェア、またはその他のアプライアンスをSUSE +から直接・間接を問わず受け取った場合、当該ハードウェア、ソフトウェ +アまたはアプライアンスの使用のみを目的として本ソフトウェアを使用す +ることができ、本ソフトウェアを単独で使用することはできません。 + +所有権 +本ソフトウェアのタイトルまたは所有権は、お客様に譲渡されないものと +します。本ソフトウェア(一部または全体の翻案および複製を含む)のす +べての知的所有権に関するあらゆる権利、タイトル、および権益は、ライ +センサーまたはその第三者のライセンサーが留保します。お客様が取得す +るのは、本ソフトウェアを使用する条件付きのライセンス(使用権)のみ +です。本ソフトウェアによりアクセスされるコンテンツに関連するタイト +ル、所有権、および知的所有権は該当するコンテンツ所有者の財産であり、 +該当する著作権法または他の法律により保護されている場合があります。 +本EULAは、上記のコンテンツに対する権利をお客様に与えるもので +はありません。 + +SUSEマーク +本EULAにより許可される本ソフトウェアの使用に必要な場合を除き、 +ライセンサーまたはその関連会社もしくはそのライセンサーのSUSEマ +ーク、商号またはサービスマークを使用する権利またはライセンスは、明 +示または黙示を問わず、本EULAにより付与されるものではありません。 + +サブスクリプションサービスおよびサポート +お客様がライセンサーまたはその関連会社と締結した(サブスクリプショ +ンサービスが明示的に含まれている)追加契約に従ってサブスクリプショ +ン商品を購入されない限り、ライセンサーは保守またはサポートを提供す +る義務を負いません。 + +保証および責任 +限定保証 +お客様への配布日から60日間、ライセンサーは、本ソフトウェアの配布 +に使用した媒体が、正常な使用において材質上および製造上の欠陥がない +ことを保証します。前述の保証は、お客様が利用できる唯一かつ排他的な +救済策であり、明示的または黙示的な他のすべての保証に代わるものです。 +前述の保証を除いて、本ソフトウェアは、現状有姿のままで提供されど +のような保証もなしに提供されます。 +本ソフトウェアは、原子力施設の制御、航空機管制システム、通信システ +ム、制御システム、生命維持装置、兵器システム、または本ソフトウェア +の障害が人命、人体の傷害または重大な物理的損害もしくは環境破壊に直 +結する可能性のあるその他の用途など、絶対に安全な運用が要求される危 +険な環境下でのオンライン制御装置とともに使用または提供されることを +目的に設計または製造されておらず、上記の制御装置とともに使用または +配布することも想定しておらず、上記の制御装置に使用してはいけません。 + +ライセンサー以外の製品 +本ソフトウェアには、ライセンサ以外の第三者によって使用許諾または販 +売されたハードウェア、他のソフトウェアプログラムまたはサービスが含 +まれている場合や、バンドルされている場合があります。ライセンサーは、 +ライセンサー以外の製品またはサービスに対する保証は行いません。当 +該製品またはサービスは現状有姿で提供されるものであり、ライセンサー +以外の製品に対する保証サービスは、そのサービスが存在する場合、製品 +のライセンサーにより、該当する保証に従って提供されるものとします。 +ライセンサは、法律で別途制限される場合を除き、本ソフトウェアの商品 +性、特定の用途への適合性、タイトル、または第三者の知的所有権の侵害、 +取引過程・利用・商慣習から生じる権利侵害がないことを含む、いかな +る黙示的保証も否認し、排除します。ライセンサは、この限定保証条項で +明示的に規定されていない保証、表示、または約束は一切行いません。ラ +イセンサは、本ソフトウェアまたは本サービスがお客様の要件を満たすこ +とも、すべてのオペレーティングシステム、または本ソフトウェアや本サ +ービスの操作が中断されないことまたはエラーがないことも保証しません。 +前述の除外および免責は本契約の本質的な部分です。保証の一定の排除 +および制限を認めていない法的区域があるため、上述の制限の一部がお客 +様に適用されないことがあります。この限定保証は、お客様に特定の権利 +を与えます。お客様は、州または法的区域によって異なる他の権利を持つ +ことがあります。 +責任の制限 +いかなる場合においても、ライセンサー、および、その第三者ライセンサ +ー、子会社または従業員は、契約、過失、不法行為、またはその他の責任 +の法理に基づくかどうかにかかわらず、結果的損害または間接的損害に対 +して責任を負わず、また、利益の損失、ビジネスの損失、またはデータの +損失についても、かかる損失の可能性を知らされていたとしても、責任を +負いません。 + +いかなる場合においても、本EULAに基づく、または本EULAに関連 +するライセンサーの債務総額は(1つの事例であるか一連の事例であるか +を問わず)、本EULAに基づく最初の請求に先立つ12か月間に、かか +る請求の原因となったソフトウェアに対してお客様が支払った金額(お客 +様がソフトウェアの代金を支払っていない場合は50米ドル)を超えない +ものとします。 +前述の除外や制限は、ライセンサや従業員、エージェント、契約者の不正 +行為に起因する人命または身体的損害に関連するクレームには適用されま +せん。タイトルまたは本EULAに従って入手したすべてのソフトウェア +の平穏享有についての暗黙的条項の不履行、もしくは悪意不実表示に関す +る損害を含むがこれに限定されない、損害の除外または制限が認められな +い管轄区域では、ライセンサーの責任はそれらの管轄区域で認められる最 +大限の範囲で制限または除外されるものとします。 + +一般条項 +期間 +本EULAは、お客様が本ソフトウェアをダウンロードした日に有効とな +り、お客様が本契約の条件に違反した場合に自動的に終了します。 +委譲 +事前にライセンサーから書面による許可を得ることなく、本EULAを移 +譲または譲渡することはできません。そのようないかなる移譲または譲渡 +も無効であり効力を持ちません。 +法律 +本EULAの下で生じる、または本EULAに関連するいかなる状況も、 +抵触法の定めに関わらず、アメリカ合衆国およびニューヨーク州の実体法 +に準拠します。本EULAの下で生じる、または本EULAに関連する訴 +訟、法的措置はすべて、ニューヨーク州の管轄裁判所の連邦裁判所または +州立裁判所にのみ提訴することができます。当事者が本EULAに関連す +る法的手続きを開始する場合、勝訴当事者は相手方に対して妥当な弁護士 +料を請求できます。ただし、お客様の主たる事業所が、欧州連合または欧 +州自由貿易連合の加盟国にある場合、(1) 本EULAに関連した訴訟 +手続きを審理し判決を下す専属管轄権は、イングランドおよびウェールズ +の裁判所が持ち、(2) お客様の主たる事業所が所在する当該国の法律 +を当該法律行為に適用する必要がある場合を除き、イングランドの法律が +適用されるものとします。本EULAまたはその主題には、国際物品売買 +契約に関する国連条約、ならびに、ニューヨークまたはイングランドおよ +びウェールズの抵触法の規則のいずれも適用されません。 +完全合意 +本EULA、ならびに、その他の購買文書、またはお客様とライセンサー +またはその関連会社との間の書面によるその他の合意は、お客様とライセ +ンサーの完全な理解および合意を規定したものであり、これらの修正や変 +更は、ライセンサーの正式代表者とお客様の間の書面による合意によって +のみ実行できます。第三者のライセンサー、卸売業者、販売店、小売店、 +再販売業者、販売員、従業員には、本契約を変更したり、本契約の条項に +相違するか追加される表明もしくは約束を行う権限はありません。 +権利放棄 +本EULAに基づく権利の放棄は、その拘束を受ける当事者の正式な代表 +者が署名した書面によるものでない限り、有効になりません。契約違反ま +たは不履行に基づく過去および現在の権利の放棄は、本EULAに基づい +て生じる将来の権利の放棄とみなされることはありません。 +可分性 +本EULAのいずれかの条項が、無効であるかまたは法的強制力がなくな +った場合、これを排除するため、その条項に関して、必要程度の、解釈の +変更、制限、修正、または必要に応じて分離が行われ、本EULAの他の +条項には影響しません。 +輸出規制へのコンプライアンス +お客様は、ライセンサーの製品や技術が米国輸出管理規則(「EAR」) +および他国の貿易法の対象となる可能性があることを認めるものとします。 +ライセンサーの製品や技術を輸入、輸出、または使用するためのお客様 +の権利に適用され、影響を及ぼす可能性のあるEARおよび現地の法規制 +を遵守することに、お客様は同意するものとします。ライセンサーの製品 +を、(1) 現在の米国輸出禁止リストに掲載されているエンティティや、 +EARに規定されている禁輸国もしくはテロ支援国、(2) 核兵器、 +化学兵器、生物兵器、ミサイル技術、宇宙ロケット、気象観測ロケット、 +または無人航空機の設計、開発、製造のために、ライセンサーの製品を利 +用しようとしている、お客様が知るまたは知るに足る理由があるエンドユ +ーザ(該当する政府機関の規制または特定のライセンスによって許可され +ている場合を除く)、(3) 米国政府の連邦機関より輸出管理規定に参 +加することを禁止されたエンドユーザに対して、直接的または間接的に、 +輸出または再輸出することはできません。お客様は、ライセンサーの製品 +や技術を、EARに規定されている禁止の核兵器、ミサイル、または化学 +生物兵器の最終用途に使用しないものとします。本ソフトウェアをダウン +ロードまたは使用することにより、前述の条項に同意したものとし、お客 +様がかかる国に滞在していない、その管理下にない、またはその国民もし +くは居住者ではない、かかるリストに載せられていないことを表明および +保証するものとします。さらに、ライセンサーの製品を輸入、輸出、使用 +する権利に影響を及ぼす可能性のある、お客様の管轄裁判所のいかなる現 +地の法律を順守する責任があります。EARに従って製品を輸出する際に +は、米国商務省産業安全保障局のWebページ +(https://www.bis.doc.gov)で事前にご確認く +ださい。適切な輸出規制品目分類番号(Export Control +Classification Number、ECCN)および関連す +るライセンスの例外(該当する場合)など、本ソフトウェアの輸出の詳細 +については、 +https://www.suse.com/company/lega +l/を参照してください。要求に応じて、ライセンサーの国際貿易サービ +ス部門は、ライセンサーの製品の適切な輸出規制に関する情報を提供しま +す。ライセンサーは、必要な輸出許可の取得をお客様が怠った場合の責任 +は問われないものとします。 + +:バージョン:2024-02-01:001 +SUSE.com + +Copyright (c) SUSE 2024 + +SUSE Legal +2024年2月 diff --git a/live/root/usr/share/agama/eula/license.final/license.ko.txt b/live/root/usr/share/agama/eula/license.final/license.ko.txt new file mode 100644 index 0000000000..ba073ac94d --- /dev/null +++ b/live/root/usr/share/agama/eula/license.final/license.ko.txt @@ -0,0 +1,262 @@ +SUSE 소프트웨어의 +최종 사용자 라이선스 계약 + + +SUSE 소프트웨어의 최종 사용자 라이선스 계약 +본 계약을 자세히 읽으십시오. 아래 정의된 바를 따라 구성 +요소를 포함하는 소프트웨어를 구매, 설치, 다운로드 또는 사 +용함과 동시에 본 계약의 규정에 동의하게 됩니다. 이 약관에 +동의하지 않을 경우 소프트웨어를 다운로드, 설치 또는 사용하 +는 것이 허용되지 않습니다. 업체를 대표하는 개인은 본인에게 +해당 업체를 대신하여 본 계약을 체결할 권한이 있음을 나타냅 +니다. + +SUSE LLC("라이선스 허여자" 또는 "SUSE")는 +(i) SUSE 및 계열사가 개발한 소프트웨어 프로그램, +(ii) 타사에서 개발한 소프트웨어 프로그램, (iii) +SUSE 및/또는 그 계열사가 소유한 상표("SUSE 마 +크") 및 (iv) 해당 소프트웨어 프로그램과 함께 제공되는 +미디어 또는 복제물(물리적 또는 가상) 및 첨부 문서(이러한 +프로그램, 상표 및 문서의 편집물을 "소프트웨어"라 함)의 +편집물인 소프트웨어 제품을 제공합니다. + +본 소프트웨어는 미국의 저작권법 및 조약과 전세계 기타 국가 +의 저작권법에 의해 보호됩니다. 본 최종 사용자 라이선스 계 +약("EULA")은 귀하의 소프트웨어 사용에 적용되는 귀하 +(법인 또는 개인)와 SUSE 간 법적 계약입니다. 귀하의 주 +사업장이 있는 지역의 법률에 따라 계약을 현지 언어로 작성해 +야 하는 경우, 서면으로 요청 시 해당 현지 언어 버전을 라 +이선스 허가자로부터 받을 수 있으며 귀하가 소프트웨어를 사용 +할 때 적용됩니다. 귀하가 다운로드 또는 수령한 소프트웨어에 +대한 모든 추가 기능, 확장 프로그램, 업데이트, 모바일 응 +용 프로그램, 모듈, 어댑터 또는 지원 버전은 라이선스 계약 +이 없는 경우 해당 소프트웨어로 간주하며 본 EULA의 적용 +을 받습니다. + +라이선스 약관 +오픈 소스 +본 소프트웨어에는 오픈 소스 소프트웨어인 여러 개별 구성 요 +소 및 각 구성 요소에 대한 오픈 소스 라이선스가 포함되어 +있으며, 해당 개별 구성 요소는 소프트웨어 프로그램에 따라 +GNU General Public License +v.2(https://www.gnu.org/licenses/ +oldlicenses/gpl-2.0.en.html) 또는 +Apache +2.0(https://www.apache.org/licens +es/LICENSE-2.0) 또는 기타 오픈 소스 라이선스 +(각 라이선스를 "OSS 라이선스"라고 함)가 될 수 있으며, +라이선싱 문서 및/또는 구성 요소의 소스 코드에 있습니다. + +본 EULA는 SUSE 마크를 포함하여 귀하의 소프트웨어 사 +용에 적용되며, SUSE 마크 없이 소프트웨어에 포함된 오픈 +소스 코드의 사용에 적용되는 OSS 라이선스에 따른 귀하의 +권리를 제한하거나 대체하거나 수정하지 않습니다. + +본 소프트웨어에는 다른 규정 및/또는 라이선스 허여자 이외의 +타사에 의해 라이선스가 허여된 기타 소프트웨어 프로그램이 포 +함되거나 번들로 함께 제공될 수 있습니다. 별도의 라이선스 +계약이 있는 모든 소프트웨어 프로그램의 사용은 해당 라이선스 +계약의 적용을 받습니다. + +소프트웨어 사용 라이선스 +본 EULA의 규정 및 조건을 준수할 경우 라이선스 허여자는 +귀하에게(아래 정의된 대로) 조직 내에서 소프트웨어의 사본을 +복제하고 사용할 수 있는 영구적이고, 비독점적이며, 양도할 +수 없고, 가역적인 전세계 라이선스를 부여합니다. "조직"이 +란 법인 또는 계열사를 의미합니다. "계열사"란 귀하를 지배 +하거나 귀하의 지배를 받거나 귀하와 동일한 지배를 받는 법인 +을 의미합니다. 위의 라이선스는 귀하 계열사가 본 EULA의 +조항을 위반하는 일에 대해 귀하가 책임을 지고 배상하는 것을 +조건으로 합니다. + +본 EULA 하에서 귀하는 복사본의 수정 여부와 상관없이 +SUSE 마크를 사용하여 소프트웨어 또는 소프트웨어 구성 요 +소를 배포할 수 없습니다. 귀하는다음 경우에 귀하의 조직 외 +부로 재배포할 수 있습니다. (a) 소프트웨어가 해당 재배포 +를 승인하는 라이선스 허여자와의 별도의 서면 계약에 따라 허 +용되는 경우, 또는 (b) 소프트웨어 구성 요소가 모든 +SUSE 마크를 제거하고 교체하는 경우에만 가능합니다. + +SUSE에게서 직접 혹은 간접적으로 하드웨어, 소프트웨어 또 +는 소프트웨어를 사용하거나 임베드하는 기타 장치를 수령한 경 +우, 귀하는 해당 하드웨어, 소프트웨어 또는 장치를 실행하는 +목적으로만 소프트웨어를 사용할 수 있으며 독립 실행 목적으로 +는 사용할 수 없습니다. + +소유권 +본 소프트웨어에 대한 모든 권리 또는 소유권은 귀하에게 양도 +되지 않습니다. 라이선스 허여자 및/또는 라이선스 허여자의 +타사 라이선스 허여자는 개정본 또는 복사본을 포함한 소프트웨 +어의 모든 지식재산권과 관련하여 권한, 소유권 및 이권을 보 +유합니다. 소프트웨어는 귀하에게 판매되지 않으며, 귀하는 본 +소프트웨어 사용에 대한 조건부 라이선스만 취득합니다. 소프트 +웨어를 통해 액세스하는 콘텐츠에 대한 권리, 소유권 및 지식 +재산권은 해당 콘텐츠 소유자에게 있으며 해당하는 저작권 또는 +기타 법률의 보호를 받습니다. 본 EULA에서는 이러한 콘텐 +츠에 대한 권리를 귀하에게 부여하지 않습니다. + +SUSE 마크 +본 EULA에서 허용하는 소프트웨어 사용에 필요한 경우를 제 +외하고 본 EULA에 따라 라이선스 허여자 또는 그 계열사 +또는 라이선스 허여자의 SUSE 마크, 상표 또는 서비스 마 +크를 사용할 수 있는 명시적 또는 묵시적인 어떠한 권리 또는 +라이선스도 부여되지 않습니다. + +구독 서비스 및 지원 +라이선스 허여자는 유지보수 또는 지원을 제공할 의무가 없습니 +다. 단, 귀하가 라이선스 허여자 또는 그 계열사와의 추가 +계약에 따라 해당 서비스가 명시적으로 포함된 구독 제품을 구 +매하는 경우는 제외입니다. + +보증 및 배상 +제한 보증 +라이선스 허여자는 소프트웨어 제공 미디어가 귀하에게 제공된 +날짜로부터 60일 동안 정상적인 방법으로 사용될 경우 재료상 +의 결함이나 제작상의 결함이 없음을 보증합니다. 앞서 언급한 +보증은 귀하에게 제공되는 유일한 독점적 보상이며 명시적인 또 +는 묵시적인 다른 모든 보증을 대신합니다. 앞서 언급한 보증 +을 제외하고, 이러한 소프트웨어는 어떠한 보증도 없이 "있는 +그대로" 제공됩니다. +본 소프트웨어는 핵 시설, 항공기 항법, 통신 또는 제어 시 +스템, 직접적인 생명 유지 기계, 무기 시스템 또는 소프트웨 +어 오류로 인해 사망, 부상 또는 심각한 물리적 또는 환경적 +피해를 직접적으로 초래할 수 있는 기타 용도의 운영 등 페일 +세이프 성능이 요구되는 위험 환경의 온라인 제어 장비와 함께 +사용 또는 배포할 목적으로 설계되거나 제조되지 않았습니다. +라이선스 허여자 외의 제품 +본 소프트웨어에는 라이선스 허여자 외의 업체에서 라이선스를 +허여하거나 판매한 하드웨어, 기타 소프트웨어 프로그램 또는 +서비스가 포함되거나 번들로 함께 제공될 수 있습니다. 라이선 +스 허여자는 라이선스 허여자 외의 제품이나 서비스에 대해서는 +보증을 하지 않습니다. 이러한 모든 제품이나 서비스는 "있는 +그대로" 제공됩니다. 라이선스 허여자 외의 제품에 대한 보증 +서비스(있는 경우)는 해당 제품의 라이선스 허여자가 해당 보 +증에 따라 제공합니다. +법률에 따라 달리 제한되는 경우를 제외하고 라이선스 허여자는 +상품성, 특정 목적에 대한 적합성, 소유권 또는 비침해에 대 +한 보증을 포함하여 묵시적인 일부 및 모든 보증을 부인 및 +배제하며 거래 과정, 수행 과정 또는 무역 관례에 따라 어떠 +한 보증도 발생하지 않습니다. 라이선스 허여자는 이 제한된 +보증에서 명시하지 않은 어떠한 보증, 언급 또는 약속도 하지 +않습니다. 라이선스 허여자는 소프트웨어 또는 서비스가 귀하의 +요구 사항을 충족한다거나, 모든 운영 체제와 호환된다거나, +소프트웨어 또는 서비스 작동이 중단되거나 오류가 없다고 보증 +하지 않습니다. 상기 언급된 예외 및 면책 조항은 본 계약의 +필수적인 부분입니다. 일부 관할 지역에서는 보증에 대한 특정 +한 배제와 제한을 허용하지 않으므로 위 제한 중 일부는 귀하 +에게 적용되지 않을 수도 있습니다. 이 제한된 보증은 귀하에 +게 특정한 권리를 부여하며 관할 주나 지역에 따라 다른 권리 +를 제공할 수 있습니다. +책임의 제한 +라이선스 허여자 또는 타사 라이선스 허여자, 자회사나 직원은 +어떠한 경우에도 계약, 과실, 불법행위 또는 기타 책임 이론 +에 근거한 결과적 또는 간접적 손해 또는 이익 손실, 사업 +손실, 데이터 손실 또는 손상에 대해 책임을 지지 않으며, +이러한 손해의 가능성에 대해 통지받은 경우에도 책임을 지지 +않습니다. + +어떠한 경우에도 본 EULA에 따라 또는 이와 관련하여 라이 +선스 허여자의 총 책임(단일 사례인지 또는 일련의 사례인지에 +관계없이)은 본 EULA에 따른 첫 번째 청구가 발생하기 전 +12개월 동안 해당 청구가 발생한 소프트웨어에 대해 귀하가 +지불한 금액(또는 소프트웨어 비용을 지불하지 않은 경우 +$50(미국 달러))을 초과하지 않습니다. +라이선스 허여자나 라이선스 허여자 직원, 에이전트 또는 계약 +자의 과실로 인한 사망 또는 부상과 관련된 청구에는 위의 배 +제 및 제한이 적용되지 않습니다. 손해(본 EULA에 따라 +취득한 소프트웨어의 소유권 또는 향유권과 관련된 묵시적 규정 +위반이나 악의적인 허위 진술로 인한 손해를 포함하되 이에 제 +한되지 않음)를 배제 또는 제한하는 것을 허용하지 않는 관할 +지에서는 라이선스 허여자의 책임이 해당 관할지에서 허용하는 +최대 범위 내에서 제한 또는 배제됩니다. + +일반 규정 +용어 +본 EULA는 소프트웨어를 다운로드한 날로부터 발효되며 관련 +규정을 준수하지 않는 경우에는 자동으로 해지됩니다. +양도 +본 EULA는 라이선스 허여자의 사전 서면 승인 없이는 이전 +하거나 양도할 수 없습니다. 이와 같은 양도 또는 양수 시도 +는 법적 효력이 없고 아무 영향도 미치지 않습니다. +법률 +본 계약과 관련하여 발생하는 모든 문제에는 법률 조항 선택과 +관계없이 미국 및 유타주의 실체법이 적용됩니다. 본 EULA +와 관련하여 발생하는 소송, 조치 또는 법적 절차는 뉴욕주의 +해당 관할지 연방 또는 주 법원에 소환됩니다. 한 당사자가 +EULA 관련 소송 절차를 시작하는 경우, 승소한 측이 합당 +한 변호사 비용을 회수할 수 있습니다. 단, 귀하의 주 사업 +장이 유럽 연합 또는 유럽 자유 무역 연합의 회원국인 경우, +(1) 잉글랜드 및 웨일즈 법원이 본 계약과 관련된 모든 소 +송의 전담 관할지이며 (2) 잉글랜드 법이 적용됩니다. 단, +귀하의 주요 사업장이 소재한 국가의 법률이 해당 법률 행위에 +적용되어야 하는 경우에는 해당 국가의 법률이 적용됩니다. 국 +제물품매매계약에 관한 UN 협약이나 뉴욕 또는 잉글랜드 및 +웨일즈의 준거법 충돌 규정은 본 EULA 또는 해당 사안에 +적용되지 않습니다. +완전 합의 +본 EULA는 귀하, 라이선스 허여자, 또는 그 자회사 간의 +기타 구매 문서 또는 기타 서면 합의와 함께 귀하와 라이선스 +허여자 간의 완전한 이해 및 합의를 명시하며, 귀하와 라이선 +스 허여자의 허가된 대표자가 서면으로 동의한 경우에만 개정 +또는 수정할 수 있습니다. 어떠한 타사 라이선스 허여자, 배 +급업체, 중개업자, 소매점, 대리점, 영업 사원 또는 직원도 +본 계약의 규정을 수정할 권한이 없으며 본 계약의 내용과 다 +르거나 추가적인 언급 또는 약속을 할 수 없습니다. +권리 포기 +본 EULA에 따른 모든 권리의 포기는 관련 계약 단체 또는 +당사자의 권한을 부여받은 적격한 대표의 서명 없이는 효력이 +없습니다. 계약의 파기나 이행 실패로 인한 과거 또는 현재의 +모든 권리 포기는 본 EULA에 따라 향후 발생하는 모든 권 +리까지 포기한 것으로 간주하지는 않습니다. +조항 분리 +본 EULA의 조항이 유효하지 않거나 집행이 어려운 경우, +이를 해결하기 위해 필요한 범위 내에서 해당 조항을 해석, +제한 및 수정할 수 있으며 필요한 경우 분리할 수도 있습니 +다. 이때 본 EULA의 다른 조항은 영향을 받지 않습니다. +수출 규제 준수 +귀하는 라이선스 허여자의 제품 및/또는 기술에 미국 수출관리 +규정("EAR") 및 기타 국가의 무역법이 적용될 수 있음을 +확인합니다. 귀하는 라이선스 허여자의 제품 및/또는 기술을 +수입, 수출 또는 사용할 수 있는 귀하의 권리에 적용되고 이 +에 영향을 미칠 수 있는 EAR 및 현지 법률 및 규정을 준 +수하는 것에 동의합니다. 귀하는 (1) 현재 미국 수출 제외 +목록에 있는 단체 또는 EAR에 명시된 금수 또는 테러 지원 +국가, (2) 핵, 화학 또는 생물학 무기나 로켓 시스템, +우주 발사용 로켓, 관측 로켓, 무인 비행기 시스템의 설계, +개발 또는 생산에 라이센스 허여자의 제품을 이용할 것을 알거 +나 그럴 법한 이유가 있는 최종 사용자(규정 또는 특정 라이 +센스에 따라 해당 정부 기관의 인증을 받은 귀하 제외), +또는 (3) 미국 연방 정부 기관에 의해 미국 수출 거래에 +참여하는 것이 금지된 최종 사용자에게 직간접적으로 라이센스 +허여자 제품을 수출 또는 재수출하지 않습니다. 귀하는 EAR +에 명시된 금지된 핵, 미사일 또는 화학 생물학 무기 최종 +용도에 라이선스 허여자의 제품 및/또는 기술을 사용해서는 안 +됩니다. 소프트웨어를 다운로드하거나 사용하면 앞서 언급한 내 +용에 동의하는 것이며 귀하가 이러한 국가에 거주하거나, 이러 +한 국가의 통제를 받거나, 이러한 국가의 국민 또는 거주자가 +아니며 이러한 목록에 없음을 보증하는 것입니다. 또한 귀하는 +라이선스 허여자 제품을 수입, 수출 또는 사용할 수 있는 권 +한에 영향을 줄 수 있는 관할지의 현지 법률을 준수할 책임이 +있습니다. EAR이 적용되는 품목을 수출하기 전에 +BIS(Bureau of Industry and +Security: 산업안보국) 웹 페이지 +https://www.bis.doc.gov를 참조하십시오. +ECCN(Export Control +Classification Number: 수출 관리 분류 번 +호) 및 관련 라이선스 예외 사항(해당하는 경우)을 비롯해 +소프트웨어 수출에 관한 자세한 내용은 +https://www.suse.com/company/lega +l/을 참조하십시오. 요청 시 라이선스 허여자의 +International Trade Services +Department(국제 무역 서비스 부서)에서 라이선스 허 +여자 제품에 적용되는 수출 제한 관련 정보를 제공할 수 있습 +니다. 라이선스 허여자는 필요한 수출 승인을 획득하지 못할 +경우 어떠한 책임도 지지 않습니다. + +:version:2024-02-01:001 +SUSE.com + +Copyright (c) SUSE 2024 + +SUSE 법적 고지사항 +2024년 2월 diff --git a/live/root/usr/share/agama/eula/license.final/license.pt_BR.txt b/live/root/usr/share/agama/eula/license.final/license.pt_BR.txt new file mode 100644 index 0000000000..e576f8c3b4 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.final/license.pt_BR.txt @@ -0,0 +1,282 @@ +Contrato de Licença para Usuário Final +do Software SUSE + + +Contrato de Licença para Usuário Final do Software SUSE +LEIA ESTE CONTRATO COM ATENÇÃO. AO COMPRAR, INSTALAR, FAZER DOWNLOAD +OU, DE QUALQUER OUTRA FORMA, UTILIZAR O SOFTWARE (CONFORME DEFINIDO +ABAIXO E INCLUINDO SEUS COMPONENTES), VOCÊ CONCORDA COM OS TERMOS +DESTE CONTRATO. CASO VOCÊ NÃO CONCORDE COM ESTES TERMOS, NÃO PODERÁ +FAZER DOWNLOAD, INSTALAR OU UTILIZAR O SOFTWARE. UMA PESSOA QUE ATUA +EM NOME DE UMA ENTIDADE REPRESENTA QUE ELE/ELA TEM AUTORIZAÇÃO PARA +FIRMAR ESTE CONTRATO EM NOME DESSA ENTIDADE. + +A SUSE LLC ("Licenciadora" ou "SUSE") disponibiliza produtos de +software, sendo uma compilação de: (i) programas de software +desenvolvidos pela SUSE e suas afiliadas; (ii) programas de software +desenvolvidos por terceiros; (iii) marcas registradas de propriedade +da SUSE e/ou de suas afiliadas ("Marcas da SUSE"); e (iv) mídias ou +reproduções (físicas ou virtuais) e a respectiva documentação que +acompanha tais programas de software (sendo a compilação de +programas, marcas registradas e documentação o "Software"). + +O Software é protegido pelas leis e pelos tratados de direitos +autorais dos Estados Unidos e pelas leis de direitos autorais de +outros países no mundo todo. Este Contrato de Licença para Usuário +Final ("EULA") é um contrato legal entre Você (uma pessoa física ou +jurídica) e a SUSE que rege Seu uso do Software. Se as leis do Seu +local principal de atividade exigirem que os contratos estejam no +idioma local para serem assegurados, a versão do idioma local deverá +ser obtida da Licenciadora mediante solicitação por escrito e deverá +ser considerada para controlar Seu uso do Software. Qualquer +complemento, extensão, atualização, aplicativo móvel, módulo, +adaptador ou versão de suporte do Software do qual Você possa fazer +download ou o qual possa receber e que não seja acompanhado por um +contrato de licença será um Software regido por este EULA. + +Termos da Licença +Código-fonte Aberto +O Software contém muitos componentes individuais que são softwares +de código-fonte aberto e a licença de código-fonte aberto referente +a cada componente; que, dependendo do programa de software, pode ser +a GNU General Public License v.2 +(https://www.gnu.org/licenses/oldlicenses/gpl-2.0.en.html) ou Apache +2.0 (https://www.apache.org/licenses/LICENSE-2.0), ou ainda outra +licença de código-fonte aberto (cada uma dessas licenças é +denominada "Licença OSS"), na documentação de licenciamento e/ou no +código-fonte do componente. + +Este EULA rege o uso que Você faz do Software, incluindo as Marcas +da SUSE, e não limita, substitui nem modifica seus direitos +concedidos sob a Licença OSS aplicável ao Seu uso de qualquer +código-fonte aberto contido no Software, sem as Marcas da SUSE. + +O Software pode incluir outros programas de software ou pode fazer +parte de um bundle com outros programas de software licenciados sob +diferentes termos e/ou por um terceiro que não seja a Licenciadora. +O uso de quaisquer programas de software acompanhados de um contrato +de licença separado é regido por esse contrato separado. + +Licença para usar o Software +Em conformidade com os termos e as condições deste EULA, a +Licenciadora concede a Você uma licença perpétua, não exclusiva, +intransferível, revogável e global para reproduzir e usar cópias do +Software em Sua Organização e para uso interno de Sua Organização. +"Organização" significa uma entidade legal e suas Afiliadas. +"Afiliadas" significam entidades que controlam, são controladas por +ou estão sob controle comum com Você. A licença acima está +condicionada a Você ser responsável por qualquer violação das +cláusulas constantes neste EULA por Suas Afiliadas. + +Este EULA não permite a você distribuir o Software ou seus +componentes usando as Marcas da SUSE, mesmo que a cópia tenha sido +modificada. Você pode fazer uma redistribuição fora de sua +Organização: (a) do Software, somente se permitido mediante um +contrato separado por escrito com a Licenciadora autorizando essa +redistribuição, ou (b) dos componentes constituintes do Software, +somente se Você remover e substituir todas as ocorrências de +qualquer Marca da SUSE. + +Se Você recebeu, direta ou indiretamente da SUSE, hardware, software +ou outra aplicação que usa ou incorpora o Software, Você poderá usar +o Software exclusivamente para fins de execução desse hardware, +software ou aplicação, e não de forma independente. + +Propriedade +Nenhum direito ou propriedade do Software é transferido para Você. A +Licenciadora e/ou seus licenciadores terceirizados detêm todos os +direitos, titularidades e interesses referentes a todos os direitos +de propriedade intelectual do Software e, incluindo as respectivas +adaptações ou cópias deles. Este Software não foi vendido a Você, +apenas uma licença condicional de uso foi adquirida por Você. O +título, os direitos de propriedade e os direitos de propriedade +intelectual sobre o conteúdo acessado por meio do Software pertencem +ao proprietário de conteúdo aplicável e podem estar protegidos por +leis de direitos autorais ou outras leis aplicáveis. Este EULA não +concede a Você nenhum direito sobre tal conteúdo. + +Marcas da SUSE +Nenhum direito ou licença, expresso ou implícito, é concedido sob +este EULA para usar qualquer Marca da SUSE, nome comercial ou marca +de serviço da Licenciadora, de suas afiliadas ou de licenciantes que +não sejam necessários para usar o Software conforme permitido por +este EULA. + +Serviços de Assinatura e Suporte +A Licenciadora não tem obrigação de oferecer manutenção ou suporte, +a menos que Você adquira uma oferta de assinatura, de acordo com um +contrato adicional com a Licenciadora ou suas afiliadas, que inclua +expressamente tais serviços. + +Garantia e Responsabilidade +Garantia Limitada +A Licenciadora garante que a mídia na qual o Software é fornecido +estará livre de defeitos de materiais e fabricação sob uso normal +pelo período de sessenta (60) dias a partir da data de entrega para +você. A GARANTIA PRECEDENTE É SEU ÚNICO E EXCLUSIVO RECURSO E +SUBSTITUI TODAS AS OUTRAS GARANTIAS, EXPRESSAS OU IMPLÍCITAS. EXCETO +PELA GARANTIA PRECEDENTE, O SOFTWARE É FORNECIDO "COMO ESTÁ" SEM +GARANTIAS DE NENHUM TIPO. +O SOFTWARE NÃO É DESENVOLVIDO, FABRICADO OU DESTINADO AO USO OU À +DISTRIBUIÇÃO COM, E NÃO DEVE SER USADA PARA, EQUIPAMENTO DE CONTROLE +ONLINE EM AMBIENTES PERIGOSOS QUE EXIJAM DESEMPENHO LIVRE DE FALHAS, +COMO OPERAÇÃO DE INSTALAÇÕES NUCLEARES, NAVEGAÇÃO AÉREA, SISTEMAS DE +COMUNICAÇÃO OU DE CONTROLE, MÁQUINAS DE SUPORTE DIRETO À VIDA, +SISTEMAS DE ARMAS OU OUTRAS UTILIZAÇÕES NAS QUAIS A FALHA DO +SOFTWARE POSSA CAUSAR MORTE, ACIDENTES PESSOAIS OU DANOS FÍSICOS OU +AMBIENTAIS GRAVES. +Produtos não Pertencentes à Licenciadora +O Software pode incluir ou ser fornecido com hardware, outros +programas de software, serviços licenciados ou vendidos por +terceiros que não sejam a Licenciadora. A LICENCIADORA NÃO GARANTE +PRODUTOS OU SERVIÇOS NÃO PERTENCENTES A ELA. QUALQUER UM DESSES +PRODUTOS OU SERVIÇOS É FORNECIDO "NO ESTADO EM QUE SE ENCONTRA". +QUALQUER SERVIÇO DE GARANTIA, SE HOUVER, PARA PRODUTOS NÃO +PERTENCENTES À LICENCIADORA É FORNECIDO PELO LICENCIADOR DO PRODUTO, +DE ACORDO COM AS GARANTIAS APLICÁVEIS DO PRÓPRIO LICENCIADOR. +EXCETO SE DE OUTRA FORMA RESTRITO POR LEI, A LICENCIADORA RENUNCIA E +EXCLUI QUALQUER E TODA GARANTIA IMPLÍCITA, INCLUINDO QUALQUER +GARANTIA DE COMERCIALIZAÇÃO, ADAPTAÇÃO A UM PROPÓSITO PARTICULAR, +TÍTULO OU NÃO VIOLAÇÃO DE DIREITOS AUTORAIS, NEM HÁ NENHUMA GARANTIA +CRIADA POR NENHUMA NEGOCIAÇÃO EM CURSO, CURSO DE DESEMPENHO OU USO +COMERCIAL. A LICENCIADORA NÃO CONCEDE QUALQUER GARANTIA, +REPRESENTAÇÃO OU COMPROMISSO ALÉM DAQUELES EXPRESSAMENTE +ESTABELECIDOS NESTA GARANTIA LIMITADA. A LICENCIADORA NÃO GARANTE +QUE O SOFTWARE OU OS SERVIÇOS ATENDERÃO A SEUS REQUISITOS, QUE SERÃO +COMPATÍVEIS COM TODOS OS SISTEMAS OPERACIONAIS OU QUE A OPERAÇÃO DO +SOFTWARE OU DOS SERVIÇOS NÃO SERÃO INTERROMPIDOS NEM LIVRES DE ERRO. +AS EXCLUSÕES E ISENÇÕES DE RESPONSABILIDADE ANTERIORES SÃO PARTE +ESSENCIAL DESTE CONTRATO. Algumas jurisdições não permitem +determinadas isenções de responsabilidade e limitações de garantias; +portanto, partes das limitações descritas acima podem não se aplicar +a Você. Esta garantia limitada concede a Você direitos específicos, +e Você também poderá ter outros direitos que variam de acordo com o +estado ou a jurisdição. +Limitação da Responsabilidade +NEM A LICENCIADORA NEM QUALQUER UMA DE SUAS LICENCIADORAS +TERCEIRIZADAS, SUBSIDIÁRIAS OU FUNCIONÁRIOS SERÃO, EM QUALQUER CASO, +RESPONSÁVEIS POR QUAISQUER DANOS CONSEQUENTES OU INDIRETOS, SEJAM OU +NÃO BASEADOS EM CONTRATO, NEGLIGÊNCIA, DELITO OU OUTRA TEORIA DE +RESPONSABILIDADE, OU POR PERDA DE LUCROS, NEGÓCIOS OU CORRUPÇÃO DE +DADOS, EM CADA CASO, MESMO SE AVISADA DA POSSIBILIDADE DE TAIS +DANOS. + +EM NENHUMA HIPÓTESE, A RESPONSABILIDADE AGREGADA DA LICENCIADORA SOB +OU EM CONEXÃO COM ESTE EULA (SEJA EM UMA INSTÂNCIA OU EM UMA SÉRIE +DE INSTÂNCIAS) EXCEDERÁ A QUANTIA PAGA POR VOCÊ PELO SOFTWARE QUE +GEROU TAL REIVINDICAÇÃO (OU O VALOR DE US$ 50 SE VOCÊ NÃO PAGOU PELO +SOFTWARE), NOS 12 MESES ANTERIORES À PRIMEIRA REIVINDICAÇÃO SOB ESTE +EULA. +As exclusões e limitações acima não se aplicarão a reivindicações +relacionadas à morte ou lesão pessoal causada por negligência da +Licenciadora ou de seus funcionários, agentes ou prestadores de +serviços. Nas jurisdições que não permitem a exclusão ou a limitação +de danos, incluindo, mas sem limitação, danos por violação de +qualquer um dos termos implícitos, como título ou usufruto tranquilo +de qualquer Software obtido por meio deste EULA, ou por declaração +fraudulenta, a responsabilidade da Licenciadora deve ser limitada ou +excluída ao máximo permitido nessas jurisdições. + +Termos Gerais +Termo +Este EULA entra em vigor na data em que Você faz download do +Software e terminará automaticamente se Você violar qualquer um dos +presentes termos. +Transferência +Este EULA não pode ser transferido ou atribuído sem a aprovação +prévia por escrito da Licenciadora. Qualquer tentativa de +transferência ou atribuição será anulada e não terá nenhum efeito. +Lei +Qualquer assunto decorrente ou relacionado a este EULA será regido +pelas leis relevantes dos Estados Unidos e do Estado de Nova York, +sem levar em consideração as presentes escolhas de cláusulas legais. +Qualquer processo, ação ou procedimento decorrente ou relacionado a +este EULA somente poderá ser apresentado perante um tribunal federal +ou estadual da jurisdição competente em Nova York. Se uma parte +entrar com processos legais relacionados ao EULA, a parte +prevalecente terá o direito de ressarcimento dos honorários +advocatícios cabíveis. No entanto, se o Seu local principal de +atividade for um estado membro da União Europeia ou da Associação de +Livre Comércio Europeu, (1) o tribunal da Inglaterra e do País de +Gales deterá a jurisdição exclusiva sobre qualquer processo legal +relacionado a este EULA; e (2) as leis da Inglaterra serão impostas, +exceto onde as leis de tal país de Seu local principal de atividade +tiverem que ser impostas a todos os processos legais, o que, nesse +caso, determinará a imposição das leis desse país. Nem a Convenção +das Nações Unidas sobre Contratos para a Venda Internacional de +Mercadorias, nem as regras de conflito de leis de Nova York ou da +Inglaterra e do País de Gales se aplicam a este EULA ou ao seu +objeto em foco. +Contrato Completo +Este EULA, junto com qualquer outro documento de compra ou contrato +por escrito entre Você e a Licenciadora ou suas Afiliadas, +representa a compreensão total e o acordo entre Você e a +Licenciadora e deve ser corrigido ou modificado apenas por um +contrato por escrito acordado entre Você e o representante +autorizado da Licenciadora. NENHUM LICENCIADOR TERCEIRIZADO, +DISTRIBUIDOR, REPRESENTANTE, VAREJISTA, REVENDEDOR, VENDEDOR OU +FUNCIONÁRIO ESTÁ AUTORIZADO A MODIFICAR ESTE CONTRATO OU FAZER +QUALQUER DECLARAÇÃO OU ASSUMIR COMPROMISSOS QUE SEJAM DIFERENTES OU +ADICIONEM INFORMAÇŐES AOS TERMOS DESTE CONTRATO. +Desistência +Nenhuma desistência de qualquer direito previsto neste EULA será +efetiva, a não ser que seja feita por escrito e assinada por um +representante devidamente autorizado da parte responsável. Nenhuma +desistência a qualquer direito passado ou presente decorrente de +qualquer violação ou falha na execução será considerada como uma +desistência de qualquer direito futuro decorrente nos termos deste +EULA. +Divisão +Se qualquer cláusula deste EULA for inválida ou não puder ser +imposta, essa cláusula será interpretada, limitada, modificada ou, +se necessário, dividida, de acordo com a necessidade, para eliminar +a invalidade ou a incapacidade de imposição, e as outras cláusulas +deste EULA permanecerão inalteradas. +Conformidade com as Leis de Exportação +Você reconhece que os produtos e/ou a tecnologia da Licenciadora +podem estar sujeitos aos Regulamentos de Administração de Exportação +dos EUA (os "EAR") e às leis comerciais de outros países. Você +concorda em cumprir os EAR e as leis e regulamentos locais que +possam ser aplicáveis e afetar Seu direito de importar, exportar ou +usar os produtos e/ou a tecnologia da Licenciadora. Você não +exportará ou reexportará os produtos da Licenciadora, diretamente ou +indiretamente, para (1) entidades que constem nas listas atuais de +exclusão de exportação dos EUA, nem para qualquer país embargado ou +que preste apoio a terroristas, conforme especificado nos EAR; (2) +qualquer usuário final que Você sabe ou possua razões para saber que +utilizarão os produtos da Licenciadora para projeto, desenvolvimento +ou produção de armas nucleares, químicas ou biológicas, ou sistemas +de foguetes, veículos de lançamento espacial, e foguetes de +sondagem, ou sistemas de veículos aéreos não tripulados, exceto +conforme autorizado pela agência governamental relevante por +regulamentação ou licença específica; ou (3) qualquer usuário final +que esteja proibido de participar de transações de exportação dos +EUA por qualquer agência federal do Governo dos EUA. Você não usará +os produtos e/ou a tecnologia da Licenciadora para fins proibidos de +armas nucleares, mísseis ou armamento químico biológico, conforme +especificado nos EAR. Ao fazer download ou usar o Software, Você +concorda com o precedente e está representando e garantindo que Você +não está localizado, sob o controle nem é cidadão ou residente de +qualquer país ou de qualquer lista relacionada. Além disso, Você é +responsável por cumprir qualquer lei local em sua jurisdição que +possa impactar Seu direito de importar, exportar ou usar os produtos +da Licenciadora. Consulte a página do Bureau of Industry and +Security na Web em https://www.bis.doc.gov antes de exportar itens +sujeitos aos EAR. Para obter mais informações sobre exportação do +Software, incluindo o Número de Classificação de Controle de +Exportação (ECCN, Export Control Classification Number) válido e a +exceção de licença associada (conforme aplicável), consulte +https://www.suse.com/company/legal/. Mediante solicitação, o +Departamento de Serviços de Comércio Internacional da Licenciadora +pode fornecer informações relacionadas a restrições de exportação +aplicáveis aos produtos da Licenciadora. A Licenciadora não se +responsabiliza pela falha em obter as aprovações necessárias para +exportação. + +:versão:2024-02-01:001 +SUSE.com + +Copyright (c) SUSE 2024 + +SUSE Legal +Fevereiro de 2024 diff --git a/live/root/usr/share/agama/eula/license.final/license.ru.txt b/live/root/usr/share/agama/eula/license.final/license.ru.txt new file mode 100644 index 0000000000..f04d74c50f --- /dev/null +++ b/live/root/usr/share/agama/eula/license.final/license.ru.txt @@ -0,0 +1,308 @@ +Лицензионное соглашение с конечным пользователем +программного обеспечения SUSE + + +Лицензионное соглашение с конечным пользователем программного +обеспечения SUSE +ВНИМАТЕЛЬНО ИЗУЧИТЕ ДАННОЕ СОГЛАШЕНИЕ. ПРИОБРЕТАЯ, УСТАНАВЛИВАЯ, +ЗАГРУЖАЯ ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ (В СООТВЕТСТВИИ С +ОПРЕДЕЛЕНИЕМ НИЖЕ, ВКЛЮЧАЯ ЕГО КОМПОНЕНТЫ) ЛИБО ИСПОЛЬЗУЯ ЕГО ЛЮБЫМ +ДРУГИМ ОБРАЗОМ, ВЫ ПРИНИМАЕТЕ УСЛОВИЯ НАСТОЯЩЕГО СОГЛАШЕНИЯ. ЕСЛИ ВЫ +НЕ СОГЛАСНЫ С УСЛОВИЯМИ НАСТОЯЩЕГО СОГЛАШЕНИЯ, ВЫ НЕ ИМЕЕТЕ ПРАВА +ЗАГРУЖАТЬ, УСТАНАВЛИВАТЬ И ИСПОЛЬЗОВАТЬ ДАННОЕ ПРОГРАММНОЕ +ОБЕСПЕЧЕНИЕ. ФИЗИЧЕСКОЕ ЛИЦО, ДЕЙСТВУЮЩЕЕ ОТ ИМЕНИ ЮРИДИЧЕСКОГО +ЛИЦА, ГАРАНТИРУЕТ НАЛИЧИЕ У НЕГО ВСЕХ ПОЛНОМОЧИЙ, НЕОБХОДИМЫХ ДЛЯ +ЗАКЛЮЧЕНИЯ НАСТОЯЩЕГО СОГЛАШЕНИЯ ОТ ИМЕНИ ТАКОГО ЮРИДИЧЕСКОГО ЛИЦА. + +SUSE LLC (далее - "Лицензиар" или "SUSE") предоставляет программное +обеспечение, состоящее из: i) программ, разработанных компанией +SUSE и ее аффилированными лицами; ii) программ, разработанных +третьими лицами; iii) товарных знаков, принадлежащих компании SUSE и +(или) ее аффилированным лицам (далее - "Знаки SUSE"); iv) носителей +или копий (физических или виртуальных) вместе с сопроводительной +документацией на такое программное обеспечение (указанная компиляция +программ, товарных знаков и документации далее именуется +"Программное обеспечение"). + +Программное обеспечение защищено законами и международными +соглашениями в области авторского права, действующими в США, а также +соответствующим законодательством других стран. Настоящее +Лицензионное соглашение с конечным пользователем (далее - "EULA") +представляет собой юридическое соглашение между вами (в лице +организации или физического лица) и компанией SUSE, регулирующее +использование вами Программного обеспечения. Если согласно законам +страны местонахождения вашей компании договор должен быть составлен +на государственном языке, чтобы иметь законную силу, можно письменно +запросить у Лицензиара вариант договора на вашем языке, который +будет регулировать использование вами Программного обеспечения. Все +дополнения, расширения, обновления, мобильные приложения, модули, +адаптеры и вспомогательные выпуски, которые можно скачать или +получить без сопутствующего лицензионного соглашения, относятся к +Программному обеспечению, и на них распространяются условия данного +EULA. + +Условия лицензии +Открытый исходный код +Программное обеспечение содержит множество отдельных компонентов, +которые являются программным обеспечением с открытым исходным кодом, +и лицензию на каждый из них, которая в зависимости от программного +продукта может быть стандартной общественной лицензией GNU версии 2 +(https://www.gnu.org/licenses/oldlicenses/gpl-2.0.en.html), +лицензией Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0) +или другой лицензией на ПО с открытым исходным кодом (далее по +отдельности - "Лицензия OSS"). Она содержится в лицензионной +документации и (или) в исходном коде каждого из таких компонентов. + +Настоящее соглашение EULA регулирует использование вами Программного +обеспечения, включая Знаки SUSE, и не ограничивает, не заменяет +собой и не изменяет ваши права в рамках Лицензии OSS, регулирующей +использование вами открытого исходного кода в Программном +обеспечении без Знаков SUSE. + +Данное ПО может содержать другие программные продукты или +поставляться с другими программными продуктами, которые +предоставляются на иных лицензионных условиях и/или лицензируются +третьей стороной, отличной от Лицензиара. Использование любых +программ, которые сопровождаются отдельными лицензионными +соглашениями, регулируется условиями этих соглашений. + +Лицензия на использование ПО +Лицензиар предоставляет вам бессрочную, неисключительную, не +подлежащую передаче, отзывную, действующую по всему миру лицензию на +копирование и использование экземпляров Программного обеспечения для +внутреннего использования в вашей организации при условии соблюдения +условий EULA. "Организация" - юридическое лицо и его Аффилированные +лица. "Аффилированные лица" - это лица, которые контролируют вас, +контролируются вами либо находятся с вами под общим контролем. +Указанная выше лицензия предоставляется при условии, что вы несете +ответственность за любое нарушение положений EULA вашими +Аффилированными лицами. + +Настоящее соглашение EULA не разрешает вам осуществлять +распространение данного Программного обеспечения или его компонентов +с использованием Знаков SUSE даже в том случае, если речь идет о +модифицированной копии. Вы вправе осуществлять редистрибьюцию за +пределами своей Организации: a) Программного обеспечения, но только +в соответствии с отдельным письменным соглашением с Лицензиаром, +которое разрешает такую редистрибьюцию; b) компонентов Программного +обеспечения, только при условии удаления и замены всех экземпляров +Знака SUSE. + +Если вы получили напрямую или косвенно от SUSE оборудование, ПО или +другое устройство, в которых используется или встроено Программное +обеспечение, вы вправе использовать Программное обеспечение +исключительно с целью эксплуатации такого оборудования, ПО или +устройства, а не обособленно. + +Владелец +Вам не передаются никакие права собственности на Программное +обеспечение. Лицензиар и (или) его сторонние лицензиары сохраняют за +собой все юридические и имущественные права на любую +интеллектуальную собственность, связанные с Программным +обеспечением, включая все их копии и модификации. Данное Программное +обеспечение вам не продается. Вы приобретаете только условную +лицензию на использование данного Программного обеспечения. Право +собственности и права интеллектуальной собственности на содержимое, +доступ к которому вы осуществляете с помощью данного Программного +обеспечения, принадлежат соответствующему владельцу этого +содержимого и могут быть защищены действующим законодательством об +авторском праве или иным законодательством. Настоящее соглашение +EULA не дает вам прав на такое содержимое. + +Знаки SUSE +Настоящее соглашение EULA не предусматривает предоставление явных +или подразумеваемых прав либо лицензий на использование Знаков SUSE, +торгового наименования или знака обслуживания Лицензиара или его +Аффилированных лиц, если только это не требуется для использования +Программного обеспечения в соответствии с EULA. + +Предоставляемые по подписке услуги и поддержка +Лицензиар не имеет обязательств по предоставлению технического +обслуживания или поддержки, за исключением случаев, когда вы +приобрели предложение по подписке в соответствии с дополнительным +соглашением с Лицензиаром или его Аффилированными лицами, которое +явным образом предусматривает оказание таких услуг. + +Гарантия и обязательства +Ограниченная гарантия +Лицензиар гарантирует, что носители, на которых поставляется данное +Программное обеспечение, не будут содержать каких-либо дефектов +материалов или изготовления при условии нормального использования в +течение периода времени продолжительностью в 60 (шестьдесят) дней со +дня поставки в ваш адрес. ВЫШЕУПОМЯНУТАЯ ГАРАНТИЯ ЯВЛЯЕТСЯ ВАШИМ +ГЛАВНЫМ И ЕДИНСТВЕННЫМ СРЕДСТВОМ ВОЗМЕЩЕНИЯ И ОТМЕНЯЕТ ВСЕ ПРОЧИЕ +ПРЯМО ИЛИ КОСВЕННО ВЫРАЖЕННЫЕ ГАРАНТИЙНЫЕ ОБЯЗАТЕЛЬСТВА. ЗА +ИСКЛЮЧЕНИЕМ ВЫШЕУКАЗАННОЙ ГАРАНТИИ ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ +ПРЕДОСТАВЛЯЕТСЯ НА УСЛОВИЯХ "КАК ЕСТЬ" И БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. +ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ НЕ ПРЕДНАЗНАЧЕНО ДЛЯ ИСПОЛЬЗОВАНИЯ И +РАСПРОСТРАНЕНИЯ И НЕ МОЖЕТ ИСПОЛЬЗОВАТЬСЯ И РАСПРОСТРАНЯТЬСЯ С +ОБОРУДОВАНИЕМ ОПЕРАТИВНОГО КОНТРОЛЯ В ОПАСНЫХ СРЕДАХ ПРИ ВЫСОКИХ +ТРЕБОВАНИЯХ К ОТКАЗОУСТОЙЧИВОСТИ (НАПРИМЕР, В СИСТЕМАХ УПРАВЛЕНИЯ +ЯДЕРНЫМИ УСТАНОВКАМИ, СИСТЕМАХ НАВИГАЦИИ, СВЯЗИ И УПРАВЛЕНИЯ +ВОЗДУШНЫМИ СУДАМИ, АППАРАТУРЕ ИСКУССТВЕННОГО ПОДДЕРЖАНИЯ ЖИЗНИ, +ОРУЖЕЙНЫХ СИСТЕМАХ И В ДРУГИХ УСЛОВИЯХ, ПРИ КОТОРЫХ СБОЙ +ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ МОЖЕТ СТАТЬ НЕПОСРЕДСТВЕННОЙ ПРИЧИНОЙ +ГИБЕЛИ ЛЮДЕЙ, ТРАВМ, АВАРИЙ ИЛИ СЕРЬЕЗНОГО УЩЕРБА ДЛЯ ЛЮДЕЙ ЛИБО +ОКРУЖАЮЩЕЙ СРЕДЫ). +Программные продукты, не принадлежащие Лицензиару +Данное Программное обеспечение может включать в себя или +поставляться в комплекте с оборудованием или другими программными +продуктами или услугами, которые предоставляются по лицензии или +продаются не Лицензиаром, а другими производителями. ЛИЦЕНЗИАР НЕ +РАСПРОСТРАНЯЕТ СВОЮ ГАРАНТИЮ НА ПРОДУКЦИЮ ИЛИ УСЛУГИ ДРУГИХ ФИРМ. +ЛЮБЫЕ ПРОГРАММНЫЕ ПРОДУКТЫ ИЛИ УСЛУГИ ТАКОГО РОДА ПОСТАВЛЯЮТСЯ НА +УСЛОВИЯХ "КАК ЕСТЬ". ЛЮБОЕ ГАРАНТИЙНОЕ ОБСЛУЖИВАНИЕ СТОРОННИХ +ПРОДУКТОВ ОСУЩЕСТВЛЯЕТСЯ ЛИЦЕНЗИАРАМИ ЭТИХ ПРОДУКТОВ В СООТВЕТСТВИИ +С ПРЕДОСТАВЛЯЕМОЙ ИМИ ГАРАНТИЕЙ. +ЗА ИСКЛЮЧЕНИЕМ СЛУЧАЕВ, ОГОВОРЕННЫХ В ЗАКОНОДАТЕЛЬСТВЕ, ЛИЦЕНЗИАР +ОТКАЗЫВАЕТСЯ ОТ ЛЮБЫХ ПОДРАЗУМЕВАЕМЫХ ГАРАНТИЙ, ВКЛЮЧАЯ ГАРАНТИИ +ТОВАРОПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ, ПРАВ +СОБСТВЕННОСТИ, ОТСУТСТВИЯ НАРУШЕНИЯ ПРАВ ТРЕТЬИХ ЛИЦ. КРОМЕ ТОГО, +ИСКЛЮЧАЮТСЯ ГАРАНТИИ, ВОЗНИКШИЕ ВСЛЕДСТВИЕ ДЕЛОВЫХ ОТНОШЕНИЙ, ХОДА +ВЫПОЛНЕНИЯ СОГЛАШЕНИЯ ИЛИ ТОРГОВЫХ ОБЫЧАЕВ. ЛИЦЕНЗИАР ОТКАЗЫВАЕТСЯ +ОТ ЛЮБЫХ ГАРАНТИЙ, ЗАЯВЛЕНИЙ И ОБЕЩАНИЙ, НЕ ОГОВОРЕННЫХ В ЯВНОЙ +ФОРМЕ В ДАННОЙ ОГРАНИЧЕННОЙ ГАРАНТИИ. ЛИЦЕНЗИАР НЕ ГАРАНТИРУЕТ, ЧТО +ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ИЛИ УСЛУГИ БУДУТ ПОЛНОСТЬЮ +СООТВЕТСТВОВАТЬ ВАШИМ ТРЕБОВАНИЯМ, БУДУТ СОВМЕСТИМЫ СО ВСЕМИ +ОПЕРАЦИОННЫМИ СИСТЕМАМИ, А ТАКЖЕ НЕ ГАРАНТИРУЕТ ИХ БЕЗОТКАЗНОЙ +РАБОТЫ И ОТСУТСТВИЯ В НИХ ОШИБОК. ПРИВЕДЕННЫЕ ВЫШЕ ИСКЛЮЧЕНИЯ И +ЗАЯВЛЕНИЯ ОБ ОТКАЗЕ ОТ ОТВЕТСТВЕННОСТИ ЯВЛЯЮТСЯ НЕОТЪЕМЛЕМОЙ ЧАСТЬЮ +НАСТОЯЩЕГО СОГЛАШЕНИЯ. Если действующее законодательство не +допускает ограничения действия гарантии или отказа от нее, то +перечисленные выше ограничения могут к вам не относиться. Данная +ограниченная гарантия дает вам определенные права; у вас также могут +быть другие права, которые зависят от государства и юрисдикции. +Ограничение ответственности +НИ ЛИЦЕНЗИАР, НИ ЕГО СТОРОННИЕ ЛИЦЕНЗИАРЫ, ФИЛИАЛЫ ИЛИ СОТРУДНИКИ НИ +ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА КОСВЕННЫЙ ИЛИ +ПОСЛЕДУЮЩИЙ УЩЕРБ, БУДЬ ТО В СИЛУ ДОГОВОРА, В РЕЗУЛЬТАТЕ +ПРАВОНАРУШЕНИЯ ИЛИ НЕБРЕЖНОСТИ, НЕЗАВИСИМО ОТ ПРИЧИНЫ И ВИДА +ОТВЕТСТВЕННОСТИ, А ТАКЖЕ ЗА ПОТЕРЮ ПРИБЫЛИ ИЛИ ПОВРЕЖДЕНИЕ ДАННЫХ, В +КАЖДОМ ОТДЕЛЬНОМ СЛУЧАЕ, ДАЖЕ ЕСЛИ ИМ БЫЛО ИЗВЕСТНО О ВОЗМОЖНОСТИ +ТАКОГО УЩЕРБА. + +СОВОКУПНАЯ ОТВЕТСТВЕННОСТЬ ЛИЦЕНЗИАРА В СООТВЕТСТВИИ ИЛИ В СВЯЗИ С +НАСТОЯЩИМ СОГЛАШЕНИЕМ EULA (БУДЬ ТО В ЕДИНИЧНОМ ИЛИ РЯДЕ СЛУЧАЕВ) НИ +В КОЕМ СЛУЧАЕ НЕ МОЖЕТ ПРЕВЫШАТЬ СУММУ, КОТОРУЮ ВЫ ЗАПЛАТИЛИ ЗА +ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ, В ОТНОШЕНИИ КОТОРОГО ВОЗНИКЛА ПРЕТЕНЗИЯ +(ИЛИ 50 ДОЛЛАРОВ США, ЕСЛИ ВЫ НЕ ПЛАТИЛИ ЗА ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ) +ЗА 12 МЕСЯЦЕВ, ПРЕДШЕСТВУЮЩИХ ПЕРВОЙ ПРЕТЕНЗИИ В РАМКАХ EULA. +Вышеуказанные исключения и ограничения недействительны в случае +подачи исков, связанных со смертью или травмой, вызванными +халатностью Лицензиара, его сотрудников, представителей или +подрядчиков. Если действующее законодательство не допускает +исключения или ограничения ущерба, включая (помимо прочего) ущерб, +понесенный вследствие нарушения подразумеваемых условий в отношении +прав собственности или беспрепятственного пользования каким-либо ПО, +полученным по настоящему соглашению EULA, либо вследствие +намеренного введения в заблуждение, ответственность Лицензиара +должна максимально ограничиваться или исключаться в соответствии с +этим законодательством. + +Общие условия +Сроки +Настоящее соглашение EULA действует с момента загрузки вами +Программного обеспечения и автоматически аннулируется в случае +нарушения вами любого из его условий. +Передача прав и обязательств +Запрещается передача или переуступка прав и обязательств по +настоящему соглашению EULA без предварительного письменного +разрешения Лицензиара. Любые попытки такой передачи или переуступки +считаются недействительными и не имеющими силу. +Закон +Все вопросы в отношении EULA регулируются материальным +законодательством Соединенных Штатов Америки и штата Нью-Йорк +безотносительно норм коллизионного права. Любой судебный иск, +процесс или процессуальное действие, связанные с EULA, должны +рассматриваться только федеральным судом или судом штата +соответствующей юрисдикции в штате Нью-Йорк. Если одна из сторон +инициирует процессуальные действия, связанные с EULA, сторона, +выигравшая дело в суде, имеет право на возмещение обоснованных +расходов на юридические услуги. Однако если страной местонахождения +вашей компании является государство, входящее в Европейский союз или +в Европейскую ассоциацию свободной торговли, то: 1) исключительной +юрисдикцией в отношении любых законных действий, касающихся EULA, +обладают суды Англии и Уэльса; 2) применяется законодательство +Англии, кроме тех случаев, когда в отношении таких судебных +разбирательств должно применяться законодательство страны +местонахождения вашей компании, в случае чего оно имеет +преимущественную силу. Ни Конвенция ООН о договорах международной +купли-продажи товаров, ни нормы коллизионного права штата Нью-Йорк +либо Англии и Уэльса не распространяются на соглашение EULA и его +предмет. +Полнота соглашения +Настоящее соглашение EULA, наряду с иными документами купли-продажи +и прочими соглашениями между вами и Лицензиаром или его +Аффилированными лицами, полностью оговаривает лицензионные отношения +между вами и Лицензиаром, причем любые изменения должны вноситься в +него посредством письменного соглашения между вами и уполномоченным +представителем Лицензиара. СТОРОННИМ ЛИЦЕНЗИАРАМ, ДИСТРИБЬЮТОРАМ, +ДИЛЕРАМ, РОЗНИЧНЫМ ТОРГОВЦАМ, РЕСЕЛЛЕРАМ, ПРОДАВЦАМ И СОТРУДНИКАМ +ЗАПРЕЩЕНО ИЗМЕНЯТЬ НАСТОЯЩЕЕ СОГЛАШЕНИЕ ИЛИ ДЕЛАТЬ ЛЮБЫЕ ЗАЯВЛЕНИЯ И +ОБЕЩАНИЯ, КОТОРЫЕ ПРОТИВОРЕЧАТ УСЛОВИЯМ НАСТОЯЩЕГО СОГЛАШЕНИЯ ИЛИ +ДОПОЛНЯЮТ ИХ. +Отказ от прав +Никакой отказ от прав, предоставляемых настоящим соглашением EULA, +не имеет юридической силы, если он не оформлен письменно и не +заверен подписью уполномоченного представителя соответствующей +стороны. Никакой отказ от прав, возникших в прошлом или настоящем в +связи с нарушением условий или невыполнением обязательств, не +считается отказом от прав, которые могут возникнуть в будущем на +основании EULA. +Делимость соглашения +Если какое-либо положение EULA окажется недействительным или +невыполнимым, оно должно быть истолковано, ограничено, изменено или +при необходимости отделено таким образом, чтобы была устранена его +недействительность или невыполнимость; остальные положения +настоящего Соглашения в этом случае остаются в силе. +Соответствие экспортному законодательству +Вы признаете, что продукты и (или) технологии Лицензиара могут +подпадать под действие Правил экспортного контроля США (далее - +"EAR") и торгового законодательства других стран. Вы обязуетесь +соблюдать EAR и местные законы и нормативные акты, которые могут +регулировать и влиять на ваше права осуществлять импорт, экспорт или +использование продуктов и (или) технологий Лицензиара. Вы обязуетесь +не экспортировать и не реэкспортировать продукты Лицензиара прямым +или косвенным образом: 1) организациям, включенным в санкционные +списки США в текущей редакции, а также государства, в отношении +которых введено эмбарго или которые поддерживают терроризм в +соответствии с терминологией EAR; 2) конечным пользователям, в +отношении которых вы имеете основания полагать, что они будут или +могут использовать продукты Лицензиара для проектирования, +разработки или производства ядерного, химического или биологического +оружия, ракетных систем, космических ракет-носителей и ракетных +зондов либо беспилотных летательных аппаратов (за исключением +случаев, когда такое использование осуществляется на основании +соответствующих разрешений со стороны компетентных правительственных +учреждений в виде постановления или конкретной лицензии); или 3) +конечным пользователям, которым любым федеральным органом +правительства США запрещено участвовать в экспортных операциях США. +Вы обязуетесь не использовать продукты и (или) технологии Лицензиара +для запрещенных целей конечного использования ядерного, химического +и биологического оружия, а также ракетных средств. Загружая или +используя данное ПО, вы соглашаетесь с изложенными выше положениями +и гарантируете, что вы не находитесь на территории или под контролем +какой-либо из стран, входящих в этот список, и не являетесь +гражданином или резидентом такой страны. Кроме того, вы несете +ответственность за соблюдение внутреннего законодательства в вашей +юрисдикции, которое может повлиять на ваше право на импорт, экспорт +и использование продуктов Лицензиара. Перед экспортом продуктов в +соответствии с EAR ознакомьтесь с информацией на странице Бюро +промышленности и безопасности США: https://www.bis.doc.gov. +Дополнительную информацию об экспорте Программного обеспечения, +включая классификационный номер экспортного контроля (ECCN) и +соответствующие лицензионные исключения (в зависимости от применимых +требований), см. на странице https://www.suse.com/company/legal/. По +запросу Отдел обслуживания в области международной торговли +Лицензиара предоставит информацию о применяемых к продуктам +Лицензиара экспортных ограничениях. Лицензиар не принимает на себя +какой-либо ответственности за неполучение вами необходимых +экспортных разрешений. + +:version:2024-02-01:001 +SUSE.com + +(c) SUSE, 2024 г. + +Юридическая документация SUSE +Февраль 2024 г. diff --git a/live/root/usr/share/agama/eula/license.final/license.txt b/live/root/usr/share/agama/eula/license.final/license.txt new file mode 100644 index 0000000000..5e9b4affe4 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.final/license.txt @@ -0,0 +1,263 @@ +End User License Agreement +for SUSE Software + + +End User License Agreement for SUSE Software +PLEASE READ THIS AGREEMENT CAREFULLY. BY PURCHASING, INSTALLING, +DOWNLOADING OR OTHERWISE USING THE SOFTWARE (AS DEFINED BELOW AND +INCLUDING ITS COMPONENTS), YOU AGREE TO THE TERMS OF THIS AGREEMENT. +IF YOU DO NOT AGREE WITH THESE TERMS, YOU ARE NOT PERMITTED TO +DOWNLOAD, INSTALL OR USE THE SOFTWARE. AN INDIVIDUAL ACTING ON +BEHALF OF AN ENTITY REPRESENTS THAT HE OR SHE HAS THE AUTHORITY TO +ENTER INTO THIS AGREEMENT ON BEHALF OF THAT ENTITY. + +SUSE LLC ("Licensor" or "SUSE") makes available software products, +being a compilation of: (i) software programs developed by SUSE and +is affiliates; (ii) software programs developed by third parties; +(iii) trade marks owned by SUSE and/or its affiliates ("SUSE +Marks"); and (iv) media or reproductions (physical or virtual) and +accompanying documentation accompanying such software programs (such +compilation of programs, trade marks and documentation being the +"Software"). + +The Software is protected by the copyright laws and treaties of the +United States and copyright laws in other countries worldwide. This +End User License Agreement ("EULA") is a legal agreement between You +(an entity or a person) and SUSE governing Your use of the Software. +If the laws of Your principal place of business require contracts to +be in the local language to be enforceable, such local language +version may be obtained from Licensor upon written request and shall +be deemed to govern Your use of the Software. Any add-on, extension, +update, mobile application, module, adapter or support release to +the Software that You may download or receive that is not +accompanied by a license agreement is Software and is governed by +this EULA. + +License Terms +Open Source +The Software contains many individual components that are open +source software and the open source license for each component, +which, depending on the software program, may be the GNU General +Public License v.2 +(https://www.gnu.org/licenses/oldlicenses/gpl-2.0.en.html) or Apache +2.0 (https://www.apache.org/licenses/LICENSE-2.0) or other open +source license (each such license being the "OSS License"), is +located in the licensing documentation and/or in the component's +source code. + +This EULA governs Your use of the Software, including SUSE Marks, +and does not limit, supersede or modify your rights under the OSS +License applicable to Your use of any open source code contained in +the Software without the SUSE Marks. + +The Software may include or be bundled with other software programs +licensed under different terms and/or licensed by a third party +other than Licensor. Use of any software programs accompanied by a +separate license agreement is governed by that separate license +agreement. + +License to use the Software +Subject to compliance with the terms and conditions of this EULA, +Licensor grants to You a perpetual, non- exclusive, +non-transferable, revocable, worldwide license to reproduce and use +copies of the Software within Your Organization for Your +Organization's internal use. "Organization" means a legal entity and +its Affiliates. "Affiliates" means entities that control, are +controlled by, or are under common control with You. The above +license is conditioned upon You being responsible and liable for any +breach of the provisions of this EULA by Your Affiliates. + +This EULA does not permit you to distribute the Software or its +components using the SUSE Marks regardless of whether the copy has +been modified. You may make a redistribution outside of Your +Organization: (a) of the Software, only if permitted under a +separate written agreement with Licensor authorizing such +redistribution, or (b) of the constituent components of the +Software, only if You remove and replace all occurrences of any SUSE +Mark. + +If You have received, whether directly or indirectly from SUSE, +hardware, software or other appliance that uses or embeds the +Software, You may use the Software solely for the purpose of running +that hardware, software or appliance and not on a stand-alone basis. + +Ownership +No title to or ownership of the Software is transferred to You. +Licensor and/or its third party licensors retain all right, title +and interest in and to all intellectual property rights in the +Software, including any adaptations or copies thereof. The Software +is not sold to You, You acquire only a conditional license to use +the Software. Title, ownership rights and intellectual property +rights in and to the content accessed through the Software are the +property of the applicable content owner and may be protected by +applicable copyright or other law. This EULA gives You no rights to +such content. + +SUSE Marks +No right or license, express or implied, is granted under this EULA +to use any SUSE Mark, trade name or service mark of Licensor or its +affiliates or licensors otherwise than is necessary to use the +Software as permitted by this EULA. + +Subscription Services and Support +Licensor has no obligation to provide maintenance or support unless +You purchase a subscription offering, pursuant to an additional +contract with Licensor or its affiliates, which expressly includes +such services. + +Warranty and Liability +Limited Warranty +Licensor warrants that the media that the Software is delivered on +will be free from defects in materials and manufacture under normal +use for a period of sixty (60) days from the date of delivery to +you. THE FOREGOING WARRANTY IS YOUR SOLE AND EXCLUSIVE REMEDY AND IS +IN LIEU OF ALL OTHER WARRANTIES, EXPRESS OR IMPLIED. SAVE FOR THE +FOREGOING WARRANTY, THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY +WARRANTIES OF ANY KIND. +THE SOFTWARE IS NOT DESIGNED, MANUFACTURED OR INTENDED FOR USE OR +DISTRIBUTION WITH, AND MUST NOT BE USED FOR, ON-LINE CONTROL +EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE PERFORMANCE, +SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION, +COMMUNICATION, OR CONTROL SYSTEMS, DIRECT LIFE SUPPORT MACHINES, +WEAPONS SYSTEMS, OR OTHER USES IN WHICH FAILURE OF THE SOFTWARE +COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL OR +ENVIRONMENTAL DAMAGE. +Non-Licensor Products +The Software may include or be bundled with hardware or other +software programs or services licensed or sold by an entity other +than Licensor. LICENSOR DOES NOT WARRANT NON-LICENSOR PRODUCTS OR +SERVICES. ANY SUCH PRODUCTS OR SERVICES ARE PROVIDED ON AN "AS IS" +BASIS. WARRANTY SERVICE IF ANY FOR NON-LICENSOR PRODUCTS IS PROVIDED +BY THE PRODUCT LICENSOR IN ACCORDANCE WITH THEIR APPLICABLE +WARRANTY. +EXCEPT AS OTHERWISE RESTRICTED BY LAW, LICENSOR DISCLAIMS AND +EXCLUDES ANY AND ALL IMPLIED WARRANTIES INCLUDING ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE OR +NON-INFRINGEMENT NOR ARE THERE ANY WARRANTIES CREATED BY COURSE OF +DEALING, COURSE OF PERFORMANCE OR TRADE USAGE. LICENSOR MAKES NO +WARRANTY, REPRESENTATION OR PROMISE NOT EXPRESSLY SET FORTH IN THIS +LIMITED WARRANTY. LICENSOR DOES NOT WARRANT THAT THE SOFTWARE OR +SERVICES WILL SATISFY YOUR REQUIREMENTS, BE COMPATIBLE WITH ALL +OPERATING SYSTEMS, OR THAT THE OPERATION OF THE SOFTWARE OR SERVICES +WILL BE UNINTERRUPTED OR ERROR-FREE. THE FOREGOING EXCLUSIONS AND +DISCLAIMERS ARE AN ESSENTIAL PART OF THIS AGREEMENT. Some +jurisdictions do not allow certain disclaimers and limitations of +warranties, so portions of the above limitations may not apply to +You. This limited warranty gives You specific rights and You may +also have other rights which vary by state or jurisdiction. +Limitation of Liability +NEITHER LICENSOR NOR ANY OF ITS THIRD PARTY LICENSORS, SUBSIDIARIES, +OR EMPLOYEES WILL IN ANY CASE BE LIABLE FOR ANY CONSEQUENTIAL OR +INDIRECT DAMAGES, WHETHER BASED ON CONTRACT, NEGLIGENCE, TORT OR +OTHER THEORY OF LIABILITY, OR FOR ANY LOSS OF PROFITS, BUSINESS OR +LOSS OR CORRUPTION OF DATA, IN EACH CASE, EVEN IF ADVISED OF THE +POSSIBILITY OF THOSE DAMAGES. + +IN NO EVENT WILL LICENSOR'S AGGREGATE LIABILITY UNDER OR IN +CONNECTION WITH THIS EULA (WHETHER IN ONE INSTANCE OR A SERIES OF +INSTANCES) EXCEED THE AMOUNT PAID BY YOU FOR THE SOFTWARE OUT OF +WHICH SUCH CLAIM AROSE (OR $50 (U.S.) IF YOU DID NOT PAY FOR THE +SOFTWARE), IN THE 12 MONTHS PRECEDING THE FIRST CLAIM UNDER THIS +EULA. +The above exclusions and limitations will not apply to claims +relating to death or personal injury caused by the negligence of +Licensor or its employees, agents or contractors. In those +jurisdictions that do not allow the exclusion or limitation of +damages, including, without limitation, damages for breach of any +implied terms as to title or quiet enjoyment of any Software +obtained pursuant to this EULA or for fraudulent misrepresentation, +Licensor's liability shall be limited or excluded to the maximum +extent allowed within those jurisdictions. + +General Terms +Term +This EULA becomes effective on the date You download the Software +and will automatically terminate if You breach any of its terms. +Transfer +This EULA may not be transferred or assigned without the prior +written approval of Licensor. Any such attempted transfer or +assignment shall be void and of no effect. +Law +All matters arising out of or relating to this EULA will be governed +by the substantive laws of the United States and the State ofNew +York without regard to its choice of law provisions. Any suit, +action or proceeding arising out of or relating to this EULA may +only be brought before a federal or state court of appropriate +jurisdiction in New York. If a party initiates EULA-related legal +proceedings, the prevailing party will be entitled to recover +reasonable attorneys' fees. If, however, Your principal place of +business is a member state of the European Union or the European +Free Trade Association, (1) the courts of England and Wales shall +have exclusive jurisdiction over any action of law relating to this +EULA; and (2) the laws of England shall apply except where the laws +of such country of Your principal place of business are required to +be applied to any such action of law, in which case the laws of that +country shall apply. Neither the United Nations Convention of +Contracts for the International Sale of Goods nor the New York or +England and Wales conflict of law rules apply to this EULA or its +subject matter. +Entire Agreement +This EULA, together with any other purchase documents or other +written agreement between You and Licensor or its Affiliates, sets +forth the entire understanding and agreement between You and +Licensor and may be amended or modified only by a written agreement +agreed to by You and an authorized representative of Licensor. NO +THIRD PARTY LICENSOR, DISTRIBUTOR, DEALER, RETAILER, RESELLER, SALES +PERSON, OR EMPLOYEE IS AUTHORIZED TO MODIFY THIS AGREEMENT OR TO +MAKE ANY REPRESENTATION OR PROMISE THAT IS DIFFERENT FROM, OR IN +ADDITION TO, THE TERMS OF THIS AGREEMENT. +Waiver +No waiver of any right under this EULA will be effective unless in +writing, signed by a duly authorized representative of the party to +be bound. No waiver of any past or present right arising from any +breach or failure to perform will be deemed to be a waiver of any +future right arising under this EULA. +Severability +If any provision in this EULA is invalid or unenforceable, that +provision will be construed, limited, modified or, if necessary, +severed, to the extent necessary, to eliminate its invalidity or +unenforceability, and the other provisions of this EULA will remain +unaffected. +Export Compliance +You acknowledge that Licensor's products and/or technology may be +subject to the U.S. Export Administration Regulations (the "EAR") +and the trade laws of other countries. You agree to comply with the +EAR and local laws and regulations which may be applicable to and +impact Your right to import, export or use Licensor's products +and/or technology. You will not export or re-export Licensor's +products, directly or indirectly, to (1) entities on the current +U.S. export exclusion lists or to any embargoed or terrorist +supporting countries as specified in the EAR; (2) any end user who +You know or have reason to know will utilize Licensor's products in +the design, development or production of nuclear, chemical or +biological weapons, or rocket systems, space launch vehicles, and +sounding rockets, or unmanned air vehicle systems, except as +authorized by the relevant government agency by regulation or +specific license; or (3) any end user who has been prohibited from +participating in the US export transactions by any federal agency of +the US government. You will not use Licensor's products and/or +technology for prohibited nuclear, missile, or chemical biological +weaponry end uses as specified in the EAR. By downloading or using +the Software, You are agreeing to the foregoing and You are +representing and warranting that You are not located in, under the +control of, or a national or resident of any such country or on any +such list. In addition, You are responsible for complying with any +local laws in Your jurisdiction which may impact Your right to +import, export or use Licensor's products. Please consult the Bureau +of Industry and Security web page https://www.bis.doc.gov before +exporting items subject to the EAR. For more information on +exporting Software, including the applicable Export Control +Classification Number (ECCN) and associated license exception (as +applicable), see https://www.suse.com/company/legal/. Upon request, +Licensor's International Trade Services Department can provide +information regarding applicable export restrictions for Licensor +products. Licensor assumes no responsibility for Your failure to +obtain any necessary export approvals. + +:version:2024-02-01:001 +SUSE.com + +Copyright (c) SUSE 2024 + +SUSE Legal +February 2024 diff --git a/live/root/usr/share/agama/eula/license.final/license.zh_CN.txt b/live/root/usr/share/agama/eula/license.final/license.zh_CN.txt new file mode 100644 index 0000000000..fd05df1624 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.final/license.zh_CN.txt @@ -0,0 +1,187 @@ +SUSE 软件 +最终用户许可协议 + + +SUSE 软件最终用户许可协议 +请仔细阅读本协议。一旦购买、安装、下载或以其他方式使用本软件(如下 +文定义,包括其组件),即表示您同意本协议的条款。如不同意以下条款, +您将不能下载、安装或使用本软件。代表某实体行事的个人表示其有权代表 +该实体签署本协议。 + +SUSE LLC(以下简称"许可证颁发者"或"SUSE")所提供的 +软件产品合集包含以下各项:(i) 由 SUSE 及其关联公司开发的 +软件程序;(ii) 第三方开发的软件程序;(iii) SUSE 及 +/或其关联公司拥有的商标(以下简称"SUSE 商标");以及 +(iv) 媒介或复制品(实体或虚拟格式)以及此类软件程序随附的相关 +文档(此类程序、商标和文档的合集统称为"软件")。 + +本软件受美国版权法和条约以及世界其他国家/地区版权法的保护。本最终 +用户许可协议(以下简称为"EULA")是您(作为个人或实体)与 +SUSE 之间就软件使用达成的法律协议。如果您所在的主要营业地的法 +律要求合同必须使用本地语言才能实施,则此类本地语言版本可按照书面请 +求从许可证颁发者处获得,并且应视为对您使用本软件的行为具有约束力。 +对于您可能下载或接收本软件的任何附加内容、扩展、更新、移动应用程序、 +模块、适配器或支持版本,如果没有随附许可协议,则均视为本软件并受 +本 EULA 的约束。 + +许可条款 +开放源代码 +本本软件包含许多独立组件,这些组件都是开源软件,每个组件的开源许可 +证(取决于软件程序)可能是 GNU 通用公共许可证 v.2 +(https://www.gnu.org/licenses/old +licenses/gpl-2.0.en.html) 或 +Apache 2.0 +(https://www.apache.org/licenses/ +LICENSE-2.0)或其他开放源代码许可(此类任一许可均 +为"OSS 许可"),位于许可文档和/或组件的开放源代码。 + +本 EULA 约束您使用本软件(包括 SUSE 商标)的权利,并不 +限制、替代或修改您根据 OSS 许可证对软件中的开放源代码(不包含 +SUSE 商标)的使用权利。 + +本软件可能包含或捆绑有其他软件程序,这些软件程序使用不同的条款许可, +并/或由许可证颁发者之外的第三方许可。使用任何附带有单独许可协议 +的软件程序的行为受该单独许可协议的约束。 + +本软件的使用许可证 +在遵守本 EULA 条款和条件的前提下,许可证颁发者授予您永久、非 +排他性、不可转让和可撤销的全球范围内的许可,允许在您组织内部复制和 +使用本软件的副本。"组织"指法律实体及其关联公司。"关联公司"指控 +制您、受您控制或受您共同控制的实体。上述许可的前提条件是,如果您的 +关联公司违反本 EULA 的任何条款,您将对此负有责任。 + +本 EULA 不允许您分发带有 SUSE 商标的软件或其组件,无论 +其副本有无改动。但在下列情况,您可以在您的组织范围外进行再分发: +(a) 只有在您与许可证颁发者签署的独立书面协议授权进行软件再分发 +的情况下,方可进行软件再分发;或 (b) 只有在您移除并替换所有 +SUSE 商标的情况下, 方可进行软件组件的再分发。 + +如果您直接或间接从 SUSE 收到使用或嵌入本软件的硬件、软件或其 +他设备,您只能将本软件用于运行该硬件、软件或设备,而不能单独使用本 +软件。 + +所有权 +本软件的所有权并未转让给您。许可证颁发者和/或其第三方许可证颁发者 +对本软件(包括软件的任何改编版本或副本)中的所有知识产权,保留全部 +权利、所有权和权益。本软件并非出售给您,您获得的只是使用本软件的有 +条件许可证。通过本软件访问的内容的相关权利、所有权和知识产权是相应 +内容所有者的财产,并可能受相应的版权法或其他法律的保护。本 +EULA 未授予您对此类内容的任何权利。 + +SUSE 商标 +除非根据本 EULA 的允许,必须使用本软件,否则本 EULA 并 +未以明示或暗示的方式,授予您使用许可证颁发者或其关联公司或其他许可 +证颁发者的任何 SUSE 商标、商号或服务商标的权利或许可。 + +订阅服务和支持 +除非您根据与许可证颁发者或其关联公司签署的附加合同购买的订阅产品中 +明确包含维护或支持服务,否则许可证颁发者无义务提供此类服务。 + +担保和责任 +有限担保 +自产品送达之日起六十 (60) 天内,许可证颁发者担保寄送软件所使 +用的任何介质在正常使用的情况下没有物理缺陷和制造缺陷。上述担保是您 +唯一的和独有的补救措施,它将取代所有其他明示或暗示的担保。除前述担 +保条款之外,本软件按"原样"提供,不提供任何形式的任何担保。 +本软件在设计、制造或使用目的方面,并非用于、分发于且不得用于在危险 +环境中使用的、需要故障自动防护性能的在线控制设备,例如核设备、飞机 +导航或通讯系统、空中交通控制、直接生命保障系统或武器系统。不适用的 +环境还包括由于本软件故障就会导致人员伤亡或严重的人身或环境损害的情 +况。 +非许可证颁发者产品 +本软件可能包含或捆绑着由许可证颁发者之外的实体许可或销售的硬件或其 +他软件程序或服务。对于非许可证颁发者的产品或服务,许可证颁发者不提 +供担保。任何此类产品和服务均按"原样"提供。对于非许可证颁发者的产 +品,如果有担保服务,则该担保服务由该产品的许可证颁发者依据其适用的 +担保提供。 +除非法律另行禁止,否则许可证颁发者不作任何暗示担保,包括对适销性、 +针对特定目的的适用性、所有权或不侵权的任何担保,交易过程、履约过程 +或贸易惯例也不会产生任何担保。除在本有限担保中所作的明示担保外,许 +可证颁发者不作任何担保、陈述或承诺。许可证颁发者不担保本软件或服务 +能满足您的要求并与所有操作系统兼容,也不担保本软件或服务的运行不会 +中断或没有错误。前述免除和免责声明构成本协议的核心部分。部分司法管 +辖区不允许特定免责声明和对担保的限制,因此,上述部分限制对您未必适 +用。本有限担保授予您特定的权利,您可能还拥有其他权利(因各州或司法 +辖区而异)。 +有限责任 +在任何情况下,无论是因合同、疏忽、侵权或其他责任原因,许可证颁发者 +或其任何第三方许可证颁发者、子公司或雇员均不对任何形式的间接或非直 +接损害承担责任,也不对任何利润损失、业务损失或数据丢失或损坏承担责 +任,即便已被告知可能发生此类损害。 + +在任何情况下,许可证颁发者在本 EULA 项下或与本 EULA 相 +关的累计责任(无论是单一事件还是系列事件)均不会超过您根据本 +EULA 在首次提出索赔前 12 个月内支付的与此类索赔有关的软件 +费用(如果您未支付任何软件费用,则或为 50 美元)。 +上述免除和限制不适用于与许可证颁发者或其雇员、代理或订约人所导致的 +死亡或人身伤害有关的索赔。对于不允许免除或限制损失(包括但不限于违 +反与所有权有关的任何隐含条款、安静享用依照本 EULA 获得的任何 +软件或欺诈性陈述所带来的损失)责任的司法管辖区,许可证颁发者的责任 +应在这些司法管辖区允许的最大范围内予以限制或免除。 + +通则 +术语 +本 EULA 自您下载本软件之日起生效,如果您违反了本协议的任何条 +款,本协议将自动终止。 +转移 +未经许可证颁发者的事先书面许可,不得转移或转让本 EULA。尝试进 +行任何此类转移或转让均属无用和无效。 +法律 +因本 EULA 产生或与本 EULA 相关的所有事宜均应受美国和纽 +约州实体法的约束,与所选的法律条款无关。因本 EULA 产生或与本 +EULA 相关的任何诉讼、行动或程序,只能呈交纽约州具有相应司法管 +辖权的联邦或州法庭裁决。如果某方提起与本 EULA 相关的法律诉讼, +则胜诉方有权获得合理的律师费。但是,如果您的主要营业地是欧盟或欧 +洲自由贸易联盟的成员国,则:(1) 英格兰和威尔士法庭将对与本 +EULA 相关的任何法律诉讼具有专属司法管辖权;以及 (2) 除非 +需要依据此类主要营业地所在的国家/地区的法律处理任何此类法律诉讼, +否则英格兰法律将适用。《联合国国际货物销售合同公约》、纽约或英格兰 +及威尔士的法律冲突规则对本 EULA 或其标的均不适用。 +完整协议 +本 EULA 连同其他任何购买单据或您与许可证颁发者或其关联公司之 +间签署的其他书面协议,构成您与许可证颁发者之间的完整理解与协议。未 +经您与许可证颁发者的授权代表的书面同意,不得修正或修改本协议。任何 +第三方许可证颁发者、分销商、经销商、零售商、转售商、销售人员或雇员, +均无权修改本协议,或做出与协议条款不一致或本协议条款之外的任何陈 +述或承诺。 +放弃 +对于本 EULA 中任何权利的放弃,必须以书面形式经受约束方正式授 +权代表签字,方可生效。对违约或未履约引发的任何过往、当前权利的弃权, +不得视为对未来依照本 EULA 而应具有的权利的弃权。 +可分割性 +如本 EULA 中的任何条款无效或不可执行,应在必要的范围内对该条 +款加以解释、限制、修改,如果必要的话,还可删除无效、不可执行的部分。 +本 EULA 的其他条款不受影响。 +符合出口法规 +您确认许可证颁发者的产品和/或技术可能受到《美国出口管理条例》(以 +下简称"EAR")及其他国家/地区贸易法的管辖。您同意遵循 EAR +及可能适用于您或影响您进口、出口或使用许可证颁发者产品和/或技术的 +当地法律和法规。您不得向以下国家/地区或用户直接或间接出口或再出口 +许可证颁发者的产品:(1) 列入美国出口排除名单的实体或 EAR +中规定的任何禁运或支持恐怖主义的其他国家/地区;(2) 任何您知晓 +或有理由知晓的将利用许可证颁发者的产品设计、开发或生产核武器、化学 +武器或生物武器、火箭系统、太空运载火箭和探测火箭或无人飞行器系统的 +最终用户,除非根据条例或特定许可证获得相关政府机构的授权;或者 +(3) 任何遭到美国政府的任何联邦机构禁止参与美国出口交易的最终用 +户。您还不得将许可证颁发者的产品和/或技术用于 EAR 所禁止的任 +何核武器、导弹或化学生物武器的最终用途。下载或使用本软件,即表示您 +同意上述条款并声明和保证,您不在上述任何国家/地区内,不受上述任何 +国家/地区的控制,不是上述任何国家/地区的公民或居民,也不在上述任 +何名单中。此外,您有义务遵守您所在司法管辖区内任何可能会影响您进口、 +出口或使用许可证颁发者产品的权利的当地法律。在依据 EAR 出口 +商品之前,请查阅美国商务部工业安全局网页 +https://www.bis.doc.gov。有关软件出口的更多 +信息,包括适用的出口管制分类号 (ECCN) 及相关的许可证异常 +(如果适用),请访问 +https://www.suse.com/company/lega +l/。如有必要,许可证颁发者的国际贸易服务部可以提供适用于许可证颁 +发者产品的出口限制方面的信息。如果您未能获得任何必要的出口许可,则 +许可证颁发者对此概不负责。 + +:版本:2024-02-01:001 +SUSE.com + +版权所有 (c) SUSE 2024 + +SUSE 法务 +2024 年 2 月 diff --git a/live/root/usr/share/agama/eula/license.final/license.zh_TW.txt b/live/root/usr/share/agama/eula/license.final/license.zh_TW.txt new file mode 100644 index 0000000000..0217d4c6d8 --- /dev/null +++ b/live/root/usr/share/agama/eula/license.final/license.zh_TW.txt @@ -0,0 +1,181 @@ +最終使用者授權合約 +SUSE 軟體適用 + + +SUSE 軟體之最終使用者授權合約 +請仔細閱讀此授權合約。購買、安裝、下載或以其他方式使用本軟體 (定 +義如下,且包括其元件) 即表示您同意本合約的條款。若您不同意本條款, +本合約恕不允許您下載、安裝或使用本軟體。代表某實體行事的個人表示 +其有權代表該實體簽署本合約。 + +SUSE LLC (「授權人」或「SUSE」) 所提供之軟體產品, +包括以下:(I) 由 SUSE 及其關係企業開發之軟體程式; +(ii) 由第三方開發之軟體程式;(iii) SUSE 和 / +或其關係企業所擁有的商標 (「SUSE 標誌」);和 (iv) 媒 +體或複製品 (實體或虛擬) 以及此類軟體程式所附文件 (此類程式編 +譯、商標和文件統稱為「軟體」)。 + +本軟體受到美國著作權法律與條約以及全球各地其他國家 / 地區的著作 +權法律保護。本最終使用者授權合約 (「EULA」) 是您 (實體或 +個人) 與 SUSE 之間為規範您對本軟體的使用所簽訂的法律合約。 +如果您的主要經商國強制要求合約需採用當地語言,您可以向「授權人」 +書面申請當地語言版本的合約,該版合約具備管制您使用本軟體之效力。您 +所下載或接收之本軟體的任何附加元件、延伸、更新、行動應用程式、模組、 +配接器或支援版本,只要未隨附授權合約,均視為本軟體,並受 +EULA 約束。 + +授權條款 +開放原始碼 +本軟體包括開放原始碼,和各元件適用的開放原始碼授權等個別元件,根據 +不同的軟體程式,可能是 GNU 公共授權條款第 2 版 +(https://www.gnu.org/licenses/old +licenses/gpl-2.0.en.html) 或 +Apache 2.0 +(https://www.apache.org/licenses/ +LICENSE-2.0),或是其他開放原始碼授權 (此類授權個別稱 +為「OSS 授權」),其位於授權文件和 / 或元件之原始碼中。 + +本 EULA 規範您對本軟體 (包括 SUSE 標誌) 的使用,且 +並不限制、取代或修改您在 OSS 授權之下所擁有之權利,其適用於您 +對本軟體中除 SUSE 標誌外任何開放原始碼的使用。 + +軟體可包含或隨附於以不同條款授權的其他軟體程式,及/或由非授權人的 +協力廠商所授權之其他軟體程式。使用其他授權合約隨附的任何軟體程式需 +受其他授權合約之約束。 + +使用本軟體之授權 +在遵守本 EULA 條款與條件的前提下,授權人授予您永久有效、非獨 +佔性、不可轉讓、可撤銷的全球性授權,以在貴組織內重製並使用本軟體的 +複本,僅供貴組織內部使用。「組織」是指某一法律實體及其關係企業。 +「關係企業」是指控制您、受您控制或受您共同控制的實體。以上授權的前提 +建立於您對您的關係企業任何違反本 EULA 規定之情形承擔責任的條 +件下。 + +本 EULA 不允許您散佈帶有 SUSE 標誌的軟體或其元件,無論 +其副本有無改動。您得於貴組織外重新分配:(a) 本軟體,僅限於授權 +人藉由其他個別書面合約授權允許此類重新分配之情形,或 (b) 本軟 +體的組成元件,僅限於您移除和替換任何出現的 SUSE 標誌之情形。 + +若您已 (自 SUSE 直接或間接) 收受了使用或嵌入本軟體之硬體、 +軟體或其他裝置,您僅可出於執行該硬體、軟體或裝置之目的使用本軟體, +不可單獨使用之。 + +擁有權 +本軟體之任何所有權或擁有權均未轉移予您。授權人及/或其協力廠商授權 +人保留軟體中所有智慧財產權的所有權利、擁有權和利益,包括任何改寫及 +副本在內。您未買斷本軟體,而是取得本軟體的條件式授權。經由本軟體取 +得的所有權、擁有權,及智慧財產權,屬該內容擁有者所有且受相關之著作 +權或其他法律保護。本 EULA 並未授予您任何此類權利。 + +SUSE 標誌 +除本 EULA 允許且為使用本軟體之必要以外,本 EULA 並未授 +予使用任何 SUSE 標誌、授權人或其關係企業或授權人之商號或服務 +商標的任何明示或默示之權利或授權。 + +訂閱服務與支援 +授權人沒有義務提供維護或支援,除非您根據您與授權人或其關係企業所簽 +訂之附加合約,購買了訂閱制產品,而該附加合約明確包含此類服務。 + +保證和責任 +有限保證 +自產品送達之日起六十 (60) 天內,授權人保證所送達之用於儲存該 +軟體的任何媒體在正常使用情況下沒有物理缺陷和製造缺陷。上述保證是您 +唯一的補償,並且取代其他所有明示或默示的保證除前述擔保之外,本軟體 +「依現狀」提供,不提供任何形式的任何擔保。 +本軟體並非針對在需要防故障性能之危險環境中使用,且不得以線上控制設 +備進行散佈,而設計、製造或意圖用於此類目的,例如操作核子設施、飛機 +導航、通訊或控制系統、直接生命輔助機器、武器系統,或是軟體故障可能 +直接導致死亡、人員受傷,或造成身體或環境嚴重損害之其他用途。 +非授權人產品 +本軟體可能包含授權人以外機構所授權或銷售之硬體、其他軟體程式或服務。 +授權人對於非授權人產品或服務不提供擔保。任何此類產品或服務均係依 +產品既有規格提供。非授權人產品之擔保服務 (若有的話) 均由產品授 +權人根據其適當的擔保而提供。 +除非法律另有明文規定,授權人一律否認並排除任何及所有默示擔保,包括 +但不限於任何適售性、特定目的之適用性、所有權或未侵權,且交易過程、 +實行過程或貿易慣例上亦未有任何擔保。凡未明述於本有限保證之保證、代 +表與承諾,授權人概不承擔。授權人不擔保本軟體或服務符合您的需求、與 +所有作業系統相容,或軟體或服務之運作不中斷或不發生錯誤。上述免責條 +款及聲明為本合約至關重要的條款。部分管轄區域不允許特定棄權聲明或限 +定擔保,此上述部分限制可能並不適用。 此有限擔保賦予您特定權利。除 +此之外,因各州或管轄區而異,您還可能具有其他權利。 +責任限制 +在任何情況下,任何授權人或其第三方授權人、附屬公司或員工均不承擔任 +何衍生或間接損害,無論係因合約、過失、侵權或其他責任理論,或者任何 +利潤損失,業務或資料損失或損毀,即使已被告知此類損害發生之可能性者 +亦同。 + +授權人在本 EULA 下或相關之累計責任 (無論為一次性或一系列賠 +償) 均不得超過在根據本協議首次提出索賠前的 12 個月內,您為產 +生該軟體所支付的金額 (若您未支付本軟體費用則以美金 50 元計)。 + +上述排除與限制事項將不適用於因授權人或其員工、代理人或承包商因疏失 +所造成人員傷亡之索賠。在不允許排除或限制損傷條款的管轄區中,包括但 +不限於違反任何默示條款及權利,或平和享用依照本 EULA 取得的任 +何軟體,或詐欺的不實陳述,授權人的責任應在前述管轄區內允許的最大範 +圍內允許限制或排除。 + +一般條款 +條款 +本 EULA 在您下載本軟體當天生效,如果您違反任何條款,本 +EULA 將自動終止。 +轉移 +未經「授權人」之書面許可,不得轉讓或讓渡本 EULA。任何嘗試轉讓 +或讓渡皆是徒勞無功。 +適用法律 +無論選擇的法律規定為何,凡本 EULA 所產生或相關之事項均由美國 +與紐約州之實體法管制。任何與本 EULA 相關訴訟、判決或處分只於 +紐約州適當管轄區的聯邦或州法庭審理。若一方發起與本 EULA 相關 +的法律訴訟,勝訴方有權追回合理的律師費。但若您的主要營業地為歐盟或 +為歐洲自由貿易協會成員,則 (1) 英格蘭與威爾斯法庭對於與本 +EULA 相關之任何法律訴訟擁有專屬管轄權;(2) 適用英格蘭法律, +除非需要依據您的主要營業地所在之此類國家/地區適用的法律處理任何 +此類法律訴訟,則在此情況下適用該國家/地區的法律。《聯合國國際貨物 +銷售合同公約》、紐約或英格蘭與威爾斯之國際私法原則均不適用於本 +EULA 或其協議事項。 +完整合意條款 +本 EULA,連同任何其他購買文件或您與授權人或其關係企業之間的其 +他書面合約,構成您與授權人之間的全部協議及合約,唯有在您與授權人授 +權代表的書面合約同意下,方能予以修正或修改。任何協力廠商授權人、代 +理商、經銷商、零售商、轉售商、銷售人員或員工未經授權均不得修改本合 +約,所做之任何保證或承諾亦不得異於或超出本合約中之條款。 +棄權 +放棄本 EULA 中之任何權利均應以書面呈現,並由受約束一方之正式 +授權代表負責簽署。既往或目前因任何侵害或無法執行所產生之任何棄權聲 +明,均不應視為放棄根據本 EULA 而產生之任何未來權利。 +合約之可分割性 +如果本 EULA 中之任何條款無效或無法實行,應在必要的範圍內解釋、 +限制、修改,甚至視情況終止該項條款,使其不再無效或無法實行,至於 +本 EULA 中之其他條款則不受影響。 +出口法規限制 +您確認授權人的產品和 / 或技術得受美國《出口管制條例》 +(「EAR」) 和其他國家 / 地區的貿易法規範。您同意遵守 +EAR 以及可能適用於您並影響您進口、出口或使用授權人產品和 / +或技術之權利的當地法律及法規。您不得 將「授權者」的產品直接或間接出 +口或轉出口至:(1) 美國現行出口管制清單上所列之國家 / 地區, +或 EAR 中明定為禁運或「支持恐怖主義」的任何國家 / 地區; +(2) 任何您知道或應該知道將運用「授權者」產品從事核子、化學或生物 +武器或火箭系統、太空發射載具、探空火箭或無人飛機之設計、開發或生產的 +最終使用者;或 (3) 任何美國政府聯邦機構禁止參與美國出口交易的任 +何最終使用者。 您不得將授權人產品和 / 或技術用於 EAR 中所明 +定禁止之核子、飛彈或化學生物武器等終端用途之上。您若下載或使用本軟 +體,即表示您同意前述規定,且您聲明並保證您不在上述任何國家/地區、 +不受上述任何國家/地區控制、不是上述任何國家/地區的公民或居民,或 +您未名列在上述任何清單中。此外,您應負責遵循您管轄區中任何會影響您 +進口、出口或使用授權人產品之權利的當地法律。出口受 EAR 管制的 +項目前,請洽詢美國商務部工業安全局 (Bureau of +Industry and Security) 網頁 +https://www.bis.doc.gov。如需更多有關出口本 +軟體的資訊,包括其所適用的「出口管制分類號碼」(ECCN) 與相關 +授權例外規定 (若適用),請參閱 +https://www.suse.com/company/lega +l/。如要求,授權人的國際貿易服務部能提供授權人產品適用的出口限制 +資訊。若您未取得任何必要的出口許可,授權人不承擔任何責任。 + +:版本:2024-02-01:001 +SUSE.com + +Copyright (c) SUSE 2024 + +SUSE 法律部門 +2024 年 2 月 From 3049292fea4c6e7d786204cde8d5e4d986ba2df9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Fri, 17 Jan 2025 15:47:05 +0000 Subject: [PATCH 070/109] doc: improve license module documentation --- rust/agama-server/src/software/license.rs | 140 +++++++++++++--------- 1 file changed, 81 insertions(+), 59 deletions(-) diff --git a/rust/agama-server/src/software/license.rs b/rust/agama-server/src/software/license.rs index f132231d7c..ec2b06442e 100644 --- a/rust/agama-server/src/software/license.rs +++ b/rust/agama-server/src/software/license.rs @@ -49,58 +49,19 @@ pub struct LicenseContent { pub body: String, } -/// Simplified representation of the RFC 5646 language code. -#[derive(Clone, Debug, Serialize, PartialEq)] -pub struct LanguageTag { - // ISO-639 - pub language: String, - // ISO-3166 - pub territory: Option, -} - -impl Default for LanguageTag { - fn default() -> Self { - LanguageTag { - language: "en".to_string(), - territory: None, - } - } -} - -impl Display for LanguageTag { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if let Some(territory) = &self.territory { - write!(f, "{}-{}", &self.language, territory) - } else { - write!(f, "{}", &self.language) - } - } -} - -#[derive(Error, Debug)] -#[error("Not a valid language code: {0}")] -pub struct InvalidLanguageCode(String); - -impl TryFrom<&str> for LanguageTag { - type Error = InvalidLanguageCode; - - fn try_from(value: &str) -> Result { - let language_regexp: Regex = Regex::new(r"^([[:alpha:]]+)(?:-([A-Z]+))?").unwrap(); - - let captures = language_regexp - .captures(value) - .ok_or_else(|| InvalidLanguageCode(value.to_string()))?; - - Ok(Self { - language: captures.get(1).unwrap().as_str().to_string(), - territory: captures.get(2).map(|e| e.as_str().to_string()), - }) - } -} - +/// Represents a repository of software licenses. +/// +/// The repository consists of a directory in the file system which contains the licenses in +/// different languages. +/// +/// Each license is stored on a separate directory (e.g., "/usr/share/agama/eula/license.beta"). +/// The license diectory contains the default text (license.txt) and a set of translations (e.g., +/// "license.es.txt", "license.zh_CH.txt", etc.). #[derive(Clone)] pub struct LicensesRepo { + /// Repository path. pub path: std::path::PathBuf, + /// Licenses in the repository. pub licenses: Vec, } @@ -111,6 +72,8 @@ impl LicensesRepo { licenses: vec![], } } + + /// Reads the licenses from the repository. pub fn read(&mut self) -> Result<(), std::io::Error> { let entries = read_dir(self.path.as_path())?; @@ -119,7 +82,7 @@ impl LicensesRepo { if entry.file_type()?.is_dir() { let license = License { id: entry.file_name().into_string().unwrap(), - languages: Self::find_locales(&entry.path()), + languages: Self::find_translations(&entry.path()), }; self.licenses.push(license); } @@ -129,16 +92,16 @@ impl LicensesRepo { /// Finds a license with the given ID and language. /// - /// If the license is not found for the given language, it returns the default one. + /// If a translation is not found for the given language, it returns the default text. pub fn find(&self, id: &str, language: &LanguageTag) -> Option { - let mut names: Vec = vec![]; + let mut candidates: Vec = vec![]; if let Some(territory) = &language.territory { - names.push(format!("license.{}_{}.txt", language.language, territory)); + candidates.push(format!("license.{}_{}.txt", language.language, territory)); } - names.push(format!("license.{}.txt", language.language)); - names.push("license.txt".to_string()); + candidates.push(format!("license.{}.txt", language.language)); + candidates.push("license.txt".to_string()); - let license_path = names + let license_path = candidates .into_iter() .map(|p| self.path.join(id).join(p)) .find(|p| p.exists())?; @@ -151,7 +114,10 @@ impl LicensesRepo { }) } - fn find_locales(path: &PathBuf) -> Vec { + /// Finds translations in the given directory. + /// + /// * `path`: directory to search translations. + fn find_translations(path: &PathBuf) -> Vec { let entries = read_dir(path).unwrap().filter_map(|entry| entry.ok()); let files = entries @@ -162,10 +128,15 @@ impl LicensesRepo { file.to_owned().into_string().ok() }); - files.filter_map(|f| Self::file_to_locale(&f)).collect() + files + .filter_map(|f| Self::language_tag_from_file(&f)) + .collect() } - fn file_to_locale(name: &str) -> Option { + /// Returns the language tag for the given file. + /// + /// The language is inferred from the file name (e.g., "es-ES" for license.es_ES.txt"). + fn language_tag_from_file(name: &str) -> Option { if !name.starts_with("license") { return None; } @@ -192,6 +163,57 @@ impl Default for LicensesRepo { } } +/// Simplified representation of the RFC 5646 language code. +/// +/// It only considers xx and xx-XX formats. +#[derive(Clone, Debug, Serialize, PartialEq)] +pub struct LanguageTag { + // ISO-639 + pub language: String, + // ISO-3166 + pub territory: Option, +} + +impl Default for LanguageTag { + fn default() -> Self { + LanguageTag { + language: "en".to_string(), + territory: None, + } + } +} + +impl Display for LanguageTag { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if let Some(territory) = &self.territory { + write!(f, "{}-{}", &self.language, territory) + } else { + write!(f, "{}", &self.language) + } + } +} + +#[derive(Error, Debug)] +#[error("Not a valid language code: {0}")] +pub struct InvalidLanguageCode(String); + +impl TryFrom<&str> for LanguageTag { + type Error = InvalidLanguageCode; + + fn try_from(value: &str) -> Result { + let language_regexp: Regex = Regex::new(r"^([[:alpha:]]+)(?:-([A-Z]+))?").unwrap(); + + let captures = language_regexp + .captures(value) + .ok_or_else(|| InvalidLanguageCode(value.to_string()))?; + + Ok(Self { + language: captures.get(1).unwrap().as_str().to_string(), + territory: captures.get(2).map(|e| e.as_str().to_string()), + }) + } +} + #[cfg(test)] mod test { use super::LicensesRepo; From 4330e12f812ab065723c750d1b04d98e65be4f9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Fri, 17 Jan 2025 16:16:02 +0000 Subject: [PATCH 071/109] fix(rust): fix language tag parsing --- rust/agama-server/src/software/license.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/rust/agama-server/src/software/license.rs b/rust/agama-server/src/software/license.rs index ec2b06442e..e64d42ab7c 100644 --- a/rust/agama-server/src/software/license.rs +++ b/rust/agama-server/src/software/license.rs @@ -22,6 +22,7 @@ use regex::Regex; use serde::Serialize; +use serde_with::{serde_as, DisplayFromStr}; use std::{ fmt::Display, fs::read_dir, @@ -32,9 +33,11 @@ use thiserror::Error; /// Represents a product license. /// /// It contains the license ID and the list of languages that with a translation. +#[serde_as] #[derive(Clone, Debug, Serialize)] pub struct License { pub id: String, + #[serde_as(as = "Vec")] pub languages: Vec, } @@ -201,7 +204,7 @@ impl TryFrom<&str> for LanguageTag { type Error = InvalidLanguageCode; fn try_from(value: &str) -> Result { - let language_regexp: Regex = Regex::new(r"^([[:alpha:]]+)(?:-([A-Z]+))?").unwrap(); + let language_regexp: Regex = Regex::new(r"^([[:alpha:]]+)(?:[_-]([A-Z]+))?").unwrap(); let captures = language_regexp .captures(value) @@ -248,4 +251,11 @@ mod test { let license = repo.find("license.final", &language).unwrap(); assert!(license.body.starts_with("End User License")); } + + #[test] + fn test_language_tag() { + let tag: LanguageTag = "zh-CH".try_into().unwrap(); + assert_eq!(tag.language, "zh"); + assert_eq!(tag.territory, Some("CH".to_string())); + } } From 11e6800beaed5bda04943515346befbbe9dc8eb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 14:43:29 +0000 Subject: [PATCH 072/109] refactor(web): allow not justified Page.Actions Made adjustments to support an acceptable layout for actions on the product selection page. This change is expected to be temporary until the migration to PatternFly 6 is completed, at which point the entire page will be revamped. --- web/src/components/core/Page.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/web/src/components/core/Page.tsx b/web/src/components/core/Page.tsx index f72d6ba171..6cf650f16d 100644 --- a/web/src/components/core/Page.tsx +++ b/web/src/components/core/Page.tsx @@ -190,7 +190,10 @@ const Section = ({ * * */ -const Actions = ({ children }: React.PropsWithChildren) => { +const Actions = ({ + children, + justifyContent = "default", +}: React.PropsWithChildren<{ justifyContent?: "default" | "none" }>) => { return ( { className={flexStyles.flexGrow_0} > - {children} + {justifyContent === "none" && children} + {justifyContent === "default" && ( + {children} + )} ); From e5eb11f8dcedcbacac660f908945adc450573def Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 16:14:28 +0000 Subject: [PATCH 073/109] feat(web): show license acceptance in product selection Still pending retrieving the license to display it in the dialog open when user clicks on the license link. --- web/src/components/product/LicenseDialog.tsx | 91 ++++++++++++++++++ .../product/ProductSelectionPage.test.tsx | 44 ++++++++- .../product/ProductSelectionPage.tsx | 92 ++++++++++++++++--- web/src/components/product/index.ts | 3 +- web/src/types/software.ts | 2 + 5 files changed, 214 insertions(+), 18 deletions(-) create mode 100644 web/src/components/product/LicenseDialog.tsx diff --git a/web/src/components/product/LicenseDialog.tsx b/web/src/components/product/LicenseDialog.tsx new file mode 100644 index 0000000000..c6d2933501 --- /dev/null +++ b/web/src/components/product/LicenseDialog.tsx @@ -0,0 +1,91 @@ +/* + * Copyright (c) [2025] SUSE LLC + * + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, contact SUSE LLC. + * + * To contact SUSE LLC about this file by physical or electronic mail, you may + * find current contact information at www.suse.com. + */ + +import React, { useState } from "react"; +import { Popup } from "~/components/core"; +import { _ } from "~/i18n"; +import { + Divider, + MenuToggle, + ModalProps, + Select, + SelectOption, + Split, + SplitItem, + Stack, +} from "@patternfly/react-core"; +import { Product } from "~/types/software"; +import { sprintf } from "sprintf-js"; + +function LicenseDialog({ onClose, product }: { onClose: ModalProps["onClose"]; product: Product }) { + const [locale, setLocale] = useState("en"); + const [localeSelectorOpen, setLocaleSelectorOpen] = useState(false); + const locales = ["en", "es", "de", "cz", "pt"]; + const localesToggler = (toggleRef) => ( + setLocaleSelectorOpen(!localeSelectorOpen)} + isExpanded={localeSelectorOpen} + > + {locale} + + ); + + const onLocaleSelection = (_, locale: string) => { + setLocale(locale); + setLocaleSelectorOpen(false); + }; + + const eula = "Lorem ipsum"; + + return ( + + + + +

{sprintf(_("License for %s"), product.name)}

+
+ +
+ + {eula} +
+ + {_("Close")} + +
+ ); +} + +export default LicenseDialog; diff --git a/web/src/components/product/ProductSelectionPage.test.tsx b/web/src/components/product/ProductSelectionPage.test.tsx index da2b4d9d67..7211fb3481 100644 --- a/web/src/components/product/ProductSelectionPage.test.tsx +++ b/web/src/components/product/ProductSelectionPage.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * @@ -47,6 +47,7 @@ const microOs: Product = { icon: "microos.svg", description: "MicroOS description", registration: "no", + licenseId: "fake.license", }; let mockSelectedProduct: Product; @@ -67,10 +68,43 @@ jest.mock("~/queries/software", () => ({ describe("ProductSelectionPage", () => { beforeEach(() => { - mockSelectedProduct = tumbleweed; + mockSelectedProduct = microOs; registrationInfoMock = { key: "", email: "" }; }); + describe("when user select a product with license", () => { + beforeEach(() => { + mockSelectedProduct = undefined; + }); + + it("force license acceptance for allowing product selection", async () => { + const { user } = installerRender(); + expect(screen.queryByRole("checkbox", { name: /I have read and accept/ })).toBeNull(); + const selectButton = screen.getByRole("button", { name: "Select" }); + const microOsOption = screen.getByRole("radio", { name: microOs.name }); + await user.click(microOsOption); + const licenseCheckbox = screen.getByRole("checkbox", { name: /I have read and accept/ }); + expect(licenseCheckbox).not.toBeChecked(); + expect(selectButton).toBeDisabled(); + await user.click(licenseCheckbox); + expect(licenseCheckbox).toBeChecked(); + expect(selectButton).not.toBeDisabled(); + }); + }); + + describe("when there is a product with license previouly selected", () => { + beforeEach(() => { + mockSelectedProduct = microOs; + }); + + it("does not allow revoking license acceptance", async () => { + const { user } = installerRender(); + const licenseCheckbox = screen.getByRole("checkbox", { name: /I have read and accept/ }); + expect(licenseCheckbox).toBeChecked(); + expect(licenseCheckbox).toBeDisabled(); + }); + }); + describe("when there is a registration code set", () => { beforeEach(() => { registrationInfoMock = { key: "INTERNAL-USE-ONLY-1234-5678", email: "" }; @@ -103,18 +137,18 @@ describe("ProductSelectionPage", () => { describe("when the user chooses a product and hits the confirmation button", () => { it("triggers the product selection", async () => { const { user } = installerRender(); - const productOption = screen.getByRole("radio", { name: microOs.name }); + const productOption = screen.getByRole("radio", { name: tumbleweed.name }); const selectButton = screen.getByRole("button", { name: "Select" }); await user.click(productOption); await user.click(selectButton); - expect(mockConfigMutation).toHaveBeenCalledWith({ product: microOs.id }); + expect(mockConfigMutation).toHaveBeenCalledWith({ product: tumbleweed.id }); }); }); describe("when the user chooses a product but hits the cancel button", () => { it("does not trigger the product selection and goes back", async () => { const { user } = installerRender(); - const productOption = screen.getByRole("radio", { name: microOs.name }); + const productOption = screen.getByRole("radio", { name: tumbleweed.name }); const cancelButton = screen.getByRole("button", { name: "Cancel" }); await user.click(productOption); await user.click(cancelButton); diff --git a/web/src/components/product/ProductSelectionPage.tsx b/web/src/components/product/ProductSelectionPage.tsx index 994f4ac269..6ccdaebfd9 100644 --- a/web/src/components/product/ProductSelectionPage.tsx +++ b/web/src/components/product/ProductSelectionPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * @@ -33,6 +33,9 @@ import { Stack, FormGroup, Button, + Checkbox, + StackItem, + Flex, } from "@patternfly/react-core"; import { Navigate, useNavigate } from "react-router-dom"; import { Page } from "~/components/core"; @@ -44,6 +47,8 @@ import { sprintf } from "sprintf-js"; import { _ } from "~/i18n"; import { PATHS } from "~/router"; import { isEmpty } from "~/utils"; +import { Product } from "~/types/software"; +import LicenseDialog from "./LicenseDialog"; const ResponsiveGridItem = ({ children }) => ( @@ -102,6 +107,10 @@ function ProductSelectionPage() { const registration = useRegistration(); const { products, selectedProduct } = useProduct({ suspense: true }); const [nextProduct, setNextProduct] = useState(selectedProduct); + // FIXME: should not be accepted by default first selectedProduct is accepted + // because it's a singleProduct iso. + const [licenseAccepted, setLicenseAccepted] = useState(!!selectedProduct); + const [showLicense, setShowLicense] = useState(false); const [isLoading, setIsLoading] = useState(false); if (!isEmpty(registration?.key)) return ; @@ -115,7 +124,22 @@ function ProductSelectionPage() { } }; - const isSelectionDisabled = !nextProduct || nextProduct === selectedProduct; + const selectProduct = (product: Product) => { + setNextProduct(product); + setLicenseAccepted(selectedProduct === product); + }; + + const selectionHasChanged = nextProduct && nextProduct !== selectedProduct; + const mountLicenseCheckbox = !isEmpty(nextProduct?.licenseId); + const isSelectionDisabled = !selectionHasChanged || (mountLicenseCheckbox && !licenseAccepted); + + const [eulaTextStart, eulaTextLink, eulaTextEnd] = sprintf( + // TRANSLATORS: Text used for the license acceptance checkbox. %s will be + // replaced with the product name and the text in the square brackets [] is + // used for the link to show the license, please keep the brackets. + _("I have read and accept the [license] for %s"), + nextProduct?.name || selectedProduct?.name, + ).split(/[[\]]/); return ( @@ -131,7 +155,7 @@ function ProductSelectionPage() { key={index} product={product} isChecked={nextProduct === product} - onChange={() => setNextProduct(product)} + onChange={() => selectProduct(product)} /> ))} @@ -140,16 +164,60 @@ function ProductSelectionPage() { + {showLicense && ( + setShowLicense(false)} + product={nextProduct || selectedProduct} + /> + )} - - {selectedProduct && !isLoading && } - - {_("Select")} - + + + + + + + {mountLicenseCheckbox && ( + setLicenseAccepted(accepted)} + isDisabled={selectedProduct === nextProduct} + id="license-acceptance" + form="productSelectionForm" + label={ + <> + {eulaTextStart}{" "} + {" "} + {eulaTextEnd} + + } + /> + )} + + + + + {selectedProduct && !isLoading && } + + {_("Select")} + + + + + + ); diff --git a/web/src/components/product/index.ts b/web/src/components/product/index.ts index fc63c951d0..2cdef9b4cb 100644 --- a/web/src/components/product/index.ts +++ b/web/src/components/product/index.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * @@ -24,3 +24,4 @@ export { default as ProductSelectionPage } from "./ProductSelectionPage"; export { default as ProductSelectionProgress } from "./ProductSelectionProgress"; export { default as ProductRegistrationPage } from "./ProductRegistrationPage"; export { default as ProductRegistrationAlert } from "./ProductRegistrationAlert"; +export { default as EulaDialog } from "./LicenseDialog"; diff --git a/web/src/types/software.ts b/web/src/types/software.ts index f35a9a609e..adb749021d 100644 --- a/web/src/types/software.ts +++ b/web/src/types/software.ts @@ -43,6 +43,8 @@ type Product = { icon?: string; /** If product is registrable or not */ registration: "no" | "optional" | "mandatory"; + /** The product license id, if any */ + licenseId?: string; }; type PatternsSelection = { [key: string]: SelectedBy }; From 90467920ee3985cff5e5809d1f66c1b63b608918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 17:38:05 +0000 Subject: [PATCH 074/109] feat(web): allow displaying a product license Apart from displaying only available languages, still pending interface improvements and unit tests. --- web/src/api/software.ts | 17 ++++- web/src/components/product/LicenseDialog.tsx | 78 +++++++++++--------- web/src/queries/software.ts | 21 ++++++ web/src/types/software.ts | 16 ++++ 4 files changed, 97 insertions(+), 35 deletions(-) diff --git a/web/src/api/software.ts b/web/src/api/software.ts index 38a6f72bd9..568a0db011 100644 --- a/web/src/api/software.ts +++ b/web/src/api/software.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * @@ -26,6 +26,8 @@ import { SoftwareConfig, RegistrationInfo, SoftwareProposal, + License, + LicenseContent, } from "~/types/software"; import { get, post, put } from "~/api/http"; @@ -44,6 +46,17 @@ const fetchProposal = (): Promise => get("/api/software/propos */ const fetchProducts = (): Promise => get("/api/software/products"); +/** + * Returns the list of available licenses + */ +const fetchLicenses = (): Promise => get("/api/software/licenses"); + +/** + * Returns the content for given license id + */ +const fetchLicense = (id: string, lang: string = "en"): Promise => + get(`/api/software/licenses/${id}?lang=${lang}`); + /** * Returns an object with the registration info */ @@ -72,6 +85,8 @@ export { fetchPatterns, fetchProposal, fetchProducts, + fetchLicenses, + fetchLicense, fetchRegistration, updateConfig, register, diff --git a/web/src/components/product/LicenseDialog.tsx b/web/src/components/product/LicenseDialog.tsx index c6d2933501..1a38c6cf29 100644 --- a/web/src/components/product/LicenseDialog.tsx +++ b/web/src/components/product/LicenseDialog.tsx @@ -20,11 +20,10 @@ * find current contact information at www.suse.com. */ -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import { Popup } from "~/components/core"; import { _ } from "~/i18n"; import { - Divider, MenuToggle, ModalProps, Select, @@ -35,51 +34,62 @@ import { } from "@patternfly/react-core"; import { Product } from "~/types/software"; import { sprintf } from "sprintf-js"; +import { fetchLicense } from "~/api/software"; +import { useInstallerL10n } from "~/context/installerL10n"; +import supportedLanguages from "~/languages.json"; function LicenseDialog({ onClose, product }: { onClose: ModalProps["onClose"]; product: Product }) { - const [locale, setLocale] = useState("en"); - const [localeSelectorOpen, setLocaleSelectorOpen] = useState(false); - const locales = ["en", "es", "de", "cz", "pt"]; + const { language: uiLanguage } = useInstallerL10n(); + const [language, setLanguage] = useState(uiLanguage); + const [license, setLicense] = useState(); + const [languageSelectorOpen, setLanguageSelectorOpen] = useState(false); const localesToggler = (toggleRef) => ( setLocaleSelectorOpen(!localeSelectorOpen)} - isExpanded={localeSelectorOpen} + onClick={() => setLanguageSelectorOpen(!languageSelectorOpen)} + isExpanded={languageSelectorOpen} > - {locale} + {supportedLanguages[language]} ); - const onLocaleSelection = (_, locale: string) => { - setLocale(locale); - setLocaleSelectorOpen(false); - }; + useEffect(() => { + language && fetchLicense(product.licenseId, language).then(({ body }) => setLicense(body)); + }, [language, product.licenseId]); - const eula = "Lorem ipsum"; + const onLocaleSelection = (_, lang: string) => { + setLanguage(lang); + setLanguageSelectorOpen(false); + }; return ( - + + + +

{sprintf(_("License for %s"), product.name)}

+
+ +
+ + } + > - - -

{sprintf(_("License for %s"), product.name)}

-
- -
- - {eula} +
{license}
{_("Close")} diff --git a/web/src/queries/software.ts b/web/src/queries/software.ts index 72afd692e7..2aea9510e0 100644 --- a/web/src/queries/software.ts +++ b/web/src/queries/software.ts @@ -24,12 +24,14 @@ import React from "react"; import { useMutation, useQueries, + useQuery, useQueryClient, useSuspenseQueries, useSuspenseQuery, } from "@tanstack/react-query"; import { useInstallerClient } from "~/context/installer"; import { + License, Pattern, PatternsSelection, Product, @@ -40,6 +42,7 @@ import { } from "~/types/software"; import { fetchConfig, + fetchLicenses, fetchPatterns, fetchProducts, fetchProposal, @@ -75,6 +78,15 @@ const productsQuery = () => ({ staleTime: Infinity, }); +/** + * Query to retrieve available licenses + */ +const licensesQuery = () => ({ + queryKey: ["software/licenses"], + queryFn: fetchLicenses, + staleTime: Infinity, +}); + /** * Query to retrieve selected product */ @@ -166,6 +178,14 @@ const useProduct = ( }; }; +/** + * Returns available products and selected one, if any + */ +const useLicenses = (): { licenses: License[]; isPending: boolean } => { + const { data: licenses, isPending } = useQuery(licensesQuery()); + return { licenses, isPending }; +}; + /** * Returns a list of patterns with their selectedBy property properly set based on current proposal. */ @@ -261,6 +281,7 @@ export { useConfigMutation, usePatterns, useProduct, + useLicenses, useProductChanges, useProposal, useProposalChanges, diff --git a/web/src/types/software.ts b/web/src/types/software.ts index adb749021d..5a0f2d0651 100644 --- a/web/src/types/software.ts +++ b/web/src/types/software.ts @@ -47,6 +47,20 @@ type Product = { licenseId?: string; }; +type License = { + /** License ID (e.g., "license.sle") */ + id: string; + /** Available locales */ + languages: string[]; +}; + +type LicenseContent = { + /** License ID (e.g., "license.sle") */ + id: string; + /** License body */ + body: string; +}; + type PatternsSelection = { [key: string]: SelectedBy }; type SoftwareProposal = { @@ -90,6 +104,8 @@ export type { Pattern, PatternsSelection, Product, + License, + LicenseContent, SoftwareConfig, RegistrationInfo, SoftwareProposal, From 3530726e6b539e8372af228cedd47ef78ef91699 Mon Sep 17 00:00:00 2001 From: Josef Reidinger Date: Fri, 17 Jan 2025 21:41:04 +0100 Subject: [PATCH 075/109] relax versions of rubygems and comment out ostruct with reason --- service/agama-yast.gemspec | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/service/agama-yast.gemspec b/service/agama-yast.gemspec index 38d3043835..99e3f6a9a6 100644 --- a/service/agama-yast.gemspec +++ b/service/agama-yast.gemspec @@ -59,8 +59,10 @@ Gem::Specification.new do |spec| spec.add_dependency "nokogiri", "~> 1.15" spec.add_dependency "rexml", "~> 3.2" spec.add_dependency "ruby-dbus", ">= 0.23.1", "< 1.0" - spec.add_dependency "csv", "~> 3.3" - spec.add_dependency "prime", "~> 0.1.3" - spec.add_dependency "logger", "~> 1.6" - spec.add_dependency "ostruct", "~> 0.6.1" + spec.add_dependency "csv", "~> 3.2" + spec.add_dependency "prime", "~> 0.1" + spec.add_dependency "logger", "~> 1.5" + # here we have problem as ruby3.2 on SLFO does not provide rubygem-ostruct, but newer ruby will separate it after 3.4 + # but dynamic dependencies are not possible in gemspec + # spec.add_dependency "ostruct", "~> 0.6.1" end From a6f1e0063402fb6063b9f0d0914825abc375b6d4 Mon Sep 17 00:00:00 2001 From: Josef Reidinger Date: Fri, 17 Jan 2025 21:43:34 +0100 Subject: [PATCH 076/109] changes --- service/package/rubygem-agama-yast.changes | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/service/package/rubygem-agama-yast.changes b/service/package/rubygem-agama-yast.changes index 328d6c5390..853a1a03f6 100644 --- a/service/package/rubygem-agama-yast.changes +++ b/service/package/rubygem-agama-yast.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Fri Jan 17 20:42:58 UTC 2025 - Josef Reidinger + +- Relax gems version in the gemspec file + (gh#agama-project/agama#1917) + ------------------------------------------------------------------- Thu Jan 16 17:30:03 UTC 2025 - Ladislav Slezák From 6ea77a9c9f39c249cb109bd4c9d0616735bb03ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Sat, 18 Jan 2025 22:38:44 +0000 Subject: [PATCH 077/109] feat(web): add basic unit tests for license dialog --- .../components/product/LicenseDialog.test.tsx | 92 +++++++++++++++++++ web/src/components/product/LicenseDialog.tsx | 1 + web/src/components/product/index.ts | 2 +- 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 web/src/components/product/LicenseDialog.test.tsx diff --git a/web/src/components/product/LicenseDialog.test.tsx b/web/src/components/product/LicenseDialog.test.tsx new file mode 100644 index 0000000000..0c4ec1a461 --- /dev/null +++ b/web/src/components/product/LicenseDialog.test.tsx @@ -0,0 +1,92 @@ +/* + * Copyright (c) [2025] SUSE LLC + * + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, contact SUSE LLC. + * + * To contact SUSE LLC about this file by physical or electronic mail, you may + * find current contact information at www.suse.com. + */ + +import React from "react"; +import { screen, waitFor, within } from "@testing-library/react"; +import { installerRender } from "~/test-utils"; +import LicenseDialog from "./LicenseDialog"; +import { Product } from "~/types/software"; +import * as softwareApi from "~/api/software"; + +const sle: Product = { + id: "SLE", + name: "SUSE Linux Enterprise", + icon: "sle.svg", + description: "SLE description", + registration: "mandatory", + licenseId: "license.sle", +}; + +let mockUILanguage = "es-ES"; +const product: Product = sle; +const onCloseFn = jest.fn(); +let mockFetchLicense: jest.SpyInstance; + +jest.mock("~/utils", () => ({ + ...jest.requireActual("~/utils"), + locationReload: jest.fn(), +})); + +jest.mock("~/context/installerL10n", () => ({ + ...jest.requireActual("~/context/installerL10n"), + useInstallerL10n: () => ({ language: mockUILanguage }), +})); + +describe("LicenseDialog", () => { + beforeEach(() => { + mockFetchLicense = jest + .spyOn(softwareApi, "fetchLicense") + .mockImplementation(jest.fn().mockResolvedValue({ body: "El contenido de la licencia" })); + }); + + it("loads given product license in the interface language", async () => { + installerRender(, { withL10n: true }); + await waitFor(() => { + expect(mockFetchLicense).toHaveBeenCalledWith(sle.licenseId, mockUILanguage); + screen.getByText("El contenido de la licencia"); + }); + }); + + it("requests license in the language selected by user", async () => { + const { user } = installerRender(, { + withL10n: true, + }); + const languageButton = screen.getByRole("button", { name: "License language" }); + within(languageButton).getByText("Español"); + await user.click(languageButton); + expect(languageButton).toHaveAttribute("aria-expanded", "true"); + const languageFrenchOption = screen.getByRole("option", { name: "Français" }); + await user.click(languageFrenchOption); + expect(mockFetchLicense).toHaveBeenCalledWith(sle.licenseId, "fr-FR"); + within(languageButton).getByText("Français"); + expect(languageButton).toHaveAttribute("aria-expanded", "false"); + }); + + it("triggers given callback on Close click", async () => { + const { user } = installerRender(, { + withL10n: true, + }); + const closeButton = screen.getByRole("button", { name: "Close" }); + await user.click(closeButton); + expect(onCloseFn).toHaveBeenCalled(); + }); +}); diff --git a/web/src/components/product/LicenseDialog.tsx b/web/src/components/product/LicenseDialog.tsx index 1a38c6cf29..e31e65c9b5 100644 --- a/web/src/components/product/LicenseDialog.tsx +++ b/web/src/components/product/LicenseDialog.tsx @@ -45,6 +45,7 @@ function LicenseDialog({ onClose, product }: { onClose: ModalProps["onClose"]; p const [languageSelectorOpen, setLanguageSelectorOpen] = useState(false); const localesToggler = (toggleRef) => ( setLanguageSelectorOpen(!languageSelectorOpen)} isExpanded={languageSelectorOpen} diff --git a/web/src/components/product/index.ts b/web/src/components/product/index.ts index 2cdef9b4cb..1e5e4f9676 100644 --- a/web/src/components/product/index.ts +++ b/web/src/components/product/index.ts @@ -24,4 +24,4 @@ export { default as ProductSelectionPage } from "./ProductSelectionPage"; export { default as ProductSelectionProgress } from "./ProductSelectionProgress"; export { default as ProductRegistrationPage } from "./ProductRegistrationPage"; export { default as ProductRegistrationAlert } from "./ProductRegistrationAlert"; -export { default as EulaDialog } from "./LicenseDialog"; +export { default as LicenseDialog } from "./LicenseDialog"; From e7216981e08ce67f9acff773fdb38cc62db227d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Sat, 18 Jan 2025 22:48:53 +0000 Subject: [PATCH 078/109] fix(web): please ESLint --- web/src/components/product/LicenseDialog.test.tsx | 2 +- web/src/components/product/ProductSelectionPage.test.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web/src/components/product/LicenseDialog.test.tsx b/web/src/components/product/LicenseDialog.test.tsx index 0c4ec1a461..d99a5d985b 100644 --- a/web/src/components/product/LicenseDialog.test.tsx +++ b/web/src/components/product/LicenseDialog.test.tsx @@ -36,7 +36,7 @@ const sle: Product = { licenseId: "license.sle", }; -let mockUILanguage = "es-ES"; +const mockUILanguage = "es-ES"; const product: Product = sle; const onCloseFn = jest.fn(); let mockFetchLicense: jest.SpyInstance; diff --git a/web/src/components/product/ProductSelectionPage.test.tsx b/web/src/components/product/ProductSelectionPage.test.tsx index 7211fb3481..5a64ad4784 100644 --- a/web/src/components/product/ProductSelectionPage.test.tsx +++ b/web/src/components/product/ProductSelectionPage.test.tsx @@ -97,8 +97,8 @@ describe("ProductSelectionPage", () => { mockSelectedProduct = microOs; }); - it("does not allow revoking license acceptance", async () => { - const { user } = installerRender(); + it("does not allow revoking license acceptance", () => { + installerRender(); const licenseCheckbox = screen.getByRole("checkbox", { name: /I have read and accept/ }); expect(licenseCheckbox).toBeChecked(); expect(licenseCheckbox).toBeDisabled(); From f254f80c211b2ac342f39c6d154722ed6f65db92 Mon Sep 17 00:00:00 2001 From: YaST Bot Date: Sun, 19 Jan 2025 03:02:45 +0000 Subject: [PATCH 079/109] Update web translation files Agama-weblate commit: 118c829f082da156f1a45847bad46911fff13cdd --- web/src/po/po.ca.js | 28 +++++++++++++++++++++++----- web/src/po/po.ja.js | 28 +++++++++++++++++++++++----- web/src/po/po.sv.js | 28 +++++++++++++++++++++++----- 3 files changed, 69 insertions(+), 15 deletions(-) diff --git a/web/src/po/po.ca.js b/web/src/po/po.ca.js index 34f7a351be..2d98d5a368 100644 --- a/web/src/po/po.ca.js +++ b/web/src/po/po.ca.js @@ -35,7 +35,7 @@ export default { "Disc %s" ], "%s has been registered with below information.": [ - "" + "%s s'ha registrat amb la informació següent." ], "%s is an immutable system with atomic updates. It uses a read-only Btrfs file system updated via snapshots.": [ "%s és un sistema immutable amb actualitzacions atòmiques. Usa un sistema de fitxers Btrfs només de lectura actualitzat a través d'instantànies." @@ -43,11 +43,14 @@ export default { "%s logo": [ "Logotip per a %s" ], + "%s must be registered.": [ + "%s ha d'estar registrat." + ], "%s with %d partitions": [ "%s amb %d particions" ], "(optional)": [ - "" + "(opcional)" ], ", ": [ ", " @@ -462,7 +465,7 @@ export default { "Contrasenya d'encriptació" ], "Enter a registration code and optionally a valid email address for registering the product.": [ - "" + "Introduïu un codi de registre i, opcionalment, una adreça de correu electrònic vàlida per a registrar el producte." ], "Exact size": [ "Mida exacta" @@ -552,7 +555,7 @@ export default { "GiB" ], "Hide": [ - "" + "Amaga" ], "Hide %d subvolume action": [ "Amaga %d acció de subvolum", @@ -627,6 +630,9 @@ export default { "Install new system on": [ "Instal·la el sistema nou" ], + "Install using an advanced configuration.": [ + "Instal·la mitjançant una configuració avançada." + ], "Install using device %s and deleting all its content": [ "Instal·la al dispositiu %s suprimint-ne tot el contingut" ], @@ -990,6 +996,12 @@ export default { "Presence of other volumes (%s)": [ "La presència d'altres volums (%s)" ], + "Product registered": [ + "Producte registrat" + ], + "Product registration form": [ + "Formulari de registre del producte" + ], "Protection for the information stored at the device, including data, programs, and system files.": [ "Protecció per a la informació emmagatzemada al dispositiu, incloses les dades, els programes i els fitxers del sistema." ], @@ -1011,6 +1023,9 @@ export default { "Register": [ "Registra" ], + "Register it now": [ + "Registra'l ara" + ], "Registration": [ "Registre" ], @@ -1122,6 +1137,9 @@ export default { "Setup root user authentication": [ "Configura l'autenticació d'usuari d'arrel" ], + "Show": [ + "Mostra" + ], "Show %d subvolume action": [ "Mostra %d acció de subvolum", "Mostra %d accions de subvolum" @@ -1286,7 +1304,7 @@ export default { "El sistema encara no s'ha configurat per connectar-se a una xarxa de wifi." ], "The system layout was set up using a advanced configuration that cannot be modified with the current version of this visual interface. This limitation will be removed in a future version of Agama.": [ - "" + "El disseny del sistema s'ha establert mitjançant una configuració avançada que no es pot modificar amb la versió actual d'aquesta interfície visual. Aquesta limitació se suprimirà en una versió futura d'Agama." ], "The system will use %s as its default language.": [ "El sistema usarà el %s com a llengua per defecte." diff --git a/web/src/po/po.ja.js b/web/src/po/po.ja.js index 43db56cd46..552d3394ac 100644 --- a/web/src/po/po.ja.js +++ b/web/src/po/po.ja.js @@ -34,7 +34,7 @@ export default { "%s ディスク" ], "%s has been registered with below information.": [ - "" + "%s を下記の情報で登録しました。" ], "%s is an immutable system with atomic updates. It uses a read-only Btrfs file system updated via snapshots.": [ "%s は一括更新のできる不可変なシステムです。読み込み専用の btrfs ルートファイルシステムを利用して更新を適用します。" @@ -42,11 +42,14 @@ export default { "%s logo": [ "%s ロゴ" ], + "%s must be registered.": [ + "%s を登録しなければなりません。" + ], "%s with %d partitions": [ "%s (%d 個のパーティション)" ], "(optional)": [ - "" + "(任意)" ], ", ": [ ", " @@ -460,7 +463,7 @@ export default { "暗号化パスワード" ], "Enter a registration code and optionally a valid email address for registering the product.": [ - "" + "製品を登録するのに必要な登録コードと、任意でメールアドレスを入力してください。" ], "Exact size": [ "正確なサイズ" @@ -550,7 +553,7 @@ export default { "GiB" ], "Hide": [ - "" + "隠す" ], "Hide %d subvolume action": [ "%d 個のサブボリューム処理を隠す" @@ -624,6 +627,9 @@ export default { "Install new system on": [ "新しいシステムのインストール先" ], + "Install using an advanced configuration.": [ + "高度な設定項目を利用してインストールします。" + ], "Install using device %s and deleting all its content": [ "デバイス %s の内容を全て削除してインストールします" ], @@ -987,6 +993,12 @@ export default { "Presence of other volumes (%s)": [ "その他のボリューム (%s) の存在" ], + "Product registered": [ + "製品を登録しました" + ], + "Product registration form": [ + "製品登録フォーム" + ], "Protection for the information stored at the device, including data, programs, and system files.": [ "データやプログラム、システムファイルを含むデバイス内の情報を保護する仕組みです。" ], @@ -1008,6 +1020,9 @@ export default { "Register": [ "登録" ], + "Register it now": [ + "今すぐ登録" + ], "Registration": [ "登録" ], @@ -1119,6 +1134,9 @@ export default { "Setup root user authentication": [ "root の認証方式の設定" ], + "Show": [ + "表示" + ], "Show %d subvolume action": [ "%d 個のサブボリューム処理を表示" ], @@ -1282,7 +1300,7 @@ export default { "このシステムでは、まだ WiFi ネットワークへの接続設定を実施していません。" ], "The system layout was set up using a advanced configuration that cannot be modified with the current version of this visual interface. This limitation will be removed in a future version of Agama.": [ - "" + "現在のバージョンのビジュアルインターフェイスでは編集できない高度な設定を利用して、システム配置を行っています。この制限は将来バージョンの Agama でなくなる予定です。" ], "The system will use %s as its default language.": [ "システムは %s を既定の言語として使用します。" diff --git a/web/src/po/po.sv.js b/web/src/po/po.sv.js index abda56350e..bc429fa3dc 100644 --- a/web/src/po/po.sv.js +++ b/web/src/po/po.sv.js @@ -35,7 +35,7 @@ export default { "%s disk" ], "%s has been registered with below information.": [ - "" + "%s har registrerats med uppgifterna nedan." ], "%s is an immutable system with atomic updates. It uses a read-only Btrfs file system updated via snapshots.": [ "%s är ett oföränderligt system med atomära uppdateringar. Det använder ett skrivskyddat Btrfs filsystem som uppdateras via ögonblicksavbilder." @@ -43,11 +43,14 @@ export default { "%s logo": [ "%s logotyp" ], + "%s must be registered.": [ + "%s måste registreras." + ], "%s with %d partitions": [ "%s med %d partitioner" ], "(optional)": [ - "" + "(valfritt)" ], ", ": [ ", " @@ -462,7 +465,7 @@ export default { "Krypteringslösenord" ], "Enter a registration code and optionally a valid email address for registering the product.": [ - "" + "Ange en registreringskod och valfritt en giltig e-postadress för att registrera produkten." ], "Exact size": [ "Exakt storlek" @@ -552,7 +555,7 @@ export default { "GiB" ], "Hide": [ - "" + "Dölj" ], "Hide %d subvolume action": [ "Dölj %d undervolym åtgärd", @@ -627,6 +630,9 @@ export default { "Install new system on": [ "Installera nytt system på" ], + "Install using an advanced configuration.": [ + "Installera med en avancerad konfiguration." + ], "Install using device %s and deleting all its content": [ "Installerar på enhet %s och raderar allt innehåll" ], @@ -990,6 +996,12 @@ export default { "Presence of other volumes (%s)": [ "Närvaro av andra volymer (%s)" ], + "Product registered": [ + "Produkt registrerad" + ], + "Product registration form": [ + "Produktregistreringsformulär" + ], "Protection for the information stored at the device, including data, programs, and system files.": [ "Skydd för informationen som lagras på enheten, inklusive data, program och systemfiler." ], @@ -1011,6 +1023,9 @@ export default { "Register": [ "Registrera" ], + "Register it now": [ + "Registrera det nu" + ], "Registration": [ "Registrering" ], @@ -1122,6 +1137,9 @@ export default { "Setup root user authentication": [ "Ställ in rootautentisering" ], + "Show": [ + "Visa" + ], "Show %d subvolume action": [ "Visa %d undervolym åtgärd", "Visa %d undervolymer åtgärder" @@ -1286,7 +1304,7 @@ export default { "Systemet har inte konfigurerats för att ansluta till ett WiFi-nätverk än." ], "The system layout was set up using a advanced configuration that cannot be modified with the current version of this visual interface. This limitation will be removed in a future version of Agama.": [ - "" + "Systemlayouten sattes upp med en avancerad konfiguration som inte kan ändras med den aktuella versionen av detta visuella gränssnitt. Denna begränsning kommer att tas bort i en framtida version av Agama." ], "The system will use %s as its default language.": [ "Systemet kommer att använda %s som dess standardspråk." From 1338a131b77c86a3692b41b052fca8ed2b4a8973 Mon Sep 17 00:00:00 2001 From: YaST Bot Date: Sun, 19 Jan 2025 03:02:46 +0000 Subject: [PATCH 080/109] Update service PO files Agama-weblate commit: 118c829f082da156f1a45847bad46911fff13cdd --- service/po/ca.po | 4 +- service/po/cs.po | 4 +- service/po/de.po | 4 +- service/po/es.po | 4 +- service/po/fi.po | 296 ++++++++++++++++++++++++++++++++++++++++++ service/po/fr.po | 4 +- service/po/id.po | 4 +- service/po/ja.po | 4 +- service/po/ka.po | 4 +- service/po/nb_NO.po | 4 +- service/po/nl.po | 4 +- service/po/pt_BR.po | 4 +- service/po/ru.po | 4 +- service/po/sv.po | 4 +- service/po/tr.po | 4 +- service/po/zh_Hans.po | 4 +- 16 files changed, 326 insertions(+), 30 deletions(-) create mode 100644 service/po/fi.po diff --git a/service/po/ca.po b/service/po/ca.po index 20b0882326..9e1c2fc47c 100644 --- a/service/po/ca.po +++ b/service/po/ca.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-10-30 13:48+0000\n" "Last-Translator: David Medina \n" "Language-Team: Catalan ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "S'han trobat %s problemes de dependències." diff --git a/service/po/cs.po b/service/po/cs.po index 717c83494e..f6179d10f7 100644 --- a/service/po/cs.po +++ b/service/po/cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-11-13 18:48+0000\n" "Last-Translator: Jan Papež \n" "Language-Team: Czech ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "Nalezeno %s problémů v závislostech." diff --git a/service/po/de.po b/service/po/de.po index 07d10e07c3..fb492f1a7f 100644 --- a/service/po/de.po +++ b/service/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-12-12 06:48+0000\n" "Last-Translator: Ettore Atalan \n" "Language-Team: German ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "%s Abhängigkeitsprobleme gefunden." diff --git a/service/po/es.po b/service/po/es.po index e426912482..e42213d122 100644 --- a/service/po/es.po +++ b/service/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-12-11 16:48+0000\n" "Last-Translator: \"Marina J. Donis\" \n" "Language-Team: Spanish ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "Se encontraron %s problemas de dependencias." diff --git a/service/po/fi.po b/service/po/fi.po new file mode 100644 index 0000000000..70f54b772a --- /dev/null +++ b/service/po/fi.po @@ -0,0 +1,296 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR SuSE Linux Products GmbH, Nuernberg +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" +"PO-Revision-Date: 2025-01-16 02:34+0000\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Runs the config phase +#: service/lib/agama/manager.rb:93 +msgid "Analyze disks" +msgstr "" + +#: service/lib/agama/manager.rb:93 +msgid "Configure software" +msgstr "" + +#. Runs the install phase +#. rubocop:disable Metrics/AbcSize +#: service/lib/agama/manager.rb:116 +msgid "Prepare disks" +msgstr "" + +#: service/lib/agama/manager.rb:117 +msgid "Install software" +msgstr "" + +#: service/lib/agama/manager.rb:118 +msgid "Configure the system" +msgstr "" + +#. rubocop:enable Metrics/AbcSize +#: service/lib/agama/manager.rb:156 +msgid "Load software translations" +msgstr "" + +#: service/lib/agama/manager.rb:157 +msgid "Load storage translations" +msgstr "" + +#. Callback to handle unsigned files +#. +#. @param filename [String] File name +#. @param repo_id [Integer] Repository ID. It might be -1 if there is not an associated repo. +#: service/lib/agama/software/callbacks/signature.rb:63 +#, perl-brace-format +msgid "The file %{filename} from repository %{repo_name} (%{repo_url})" +msgstr "" + +#: service/lib/agama/software/callbacks/signature.rb:67 +#, perl-brace-format +msgid "The file %{filename}" +msgstr "" + +#: service/lib/agama/software/callbacks/signature.rb:71 +#, perl-brace-format +msgid "" +"%{source} is not digitally signed. The origin and integrity of the file " +"cannot be verified. Use it anyway?" +msgstr "" + +#. Callback to handle signature verification failures +#. +#. @param key [Hash] GPG key data (id, name, fingerprint, etc.) +#. @param _repo_id [Integer] Repository ID +#: service/lib/agama/software/callbacks/signature.rb:94 +#, perl-brace-format +msgid "" +"The key %{id} (%{name}) with fingerprint %{fingerprint} is unknown. Do you " +"want to trust this key?" +msgstr "" + +#. Should an error be raised? +#: service/lib/agama/software/manager.rb:141 +msgid "Initializing sources" +msgstr "" + +#: service/lib/agama/software/manager.rb:146 +msgid "Refreshing repositories metadata" +msgstr "" + +#: service/lib/agama/software/manager.rb:147 +msgid "Calculating the software proposal" +msgstr "" + +#. Issues related to the software proposal. +#. +#. Repositories that could not be probed are reported as errors. +#. +#. @return [Array] +#: service/lib/agama/software/manager.rb:561 +#, c-format +msgid "Could not read repository \"%s\"" +msgstr "" + +#. Issue when a product is missing +#. +#. @return [Agama::Issue] +#: service/lib/agama/software/manager.rb:571 +msgid "Product not selected yet" +msgstr "" + +#. Issue when a product requires registration but it is not registered yet. +#. +#. @return [Agama::Issue] +#: service/lib/agama/software/manager.rb:580 +msgid "Product must be registered" +msgstr "" + +#. Returns solver error messages from the last attempt +#. +#. @return [Array] Error messages +#: service/lib/agama/software/proposal.rb:225 +#, c-format +msgid "Found %s dependency issues." +msgstr "" + +#. Issue for not found device. +#. +#. @param config [Configs::Drive, Configs::Partition] +#. @return [Agama::Issue] +#: service/lib/agama/storage/config_checker.rb:87 +msgid "No device found for a mandatory drive" +msgstr "" + +#: service/lib/agama/storage/config_checker.rb:89 +msgid "No device found for a mandatory partition" +msgstr "" + +#. TRANSLATORS: %s is the replaced by a mount path (e.g., "/home"). +#: service/lib/agama/storage/config_checker.rb:118 +#, c-format +msgid "Missing file system type for '%s'" +msgstr "" + +#. TRANSLATORS: %{filesystem} is replaced by a file system type (e.g., "Btrfs") and +#. %{path} is replaced by a mount path (e.g., "/home"). +#: service/lib/agama/storage/config_checker.rb:145 +#, perl-brace-format +msgid "The file system type '%{filesystem}' is not suitable for '%{path}'" +msgstr "" + +#. TRANSLATORS: 'crypt_method' is the identifier of the method to encrypt the device +#. (e.g., 'luks1', 'random_swap'). +#: service/lib/agama/storage/config_checker.rb:178 +#, perl-brace-format +msgid "" +"No passphrase provided (required for using the method '%{crypt_method}')." +msgstr "" + +#. TRANSLATORS: 'crypt_method' is the identifier of the method to encrypt the device +#. (e.g., 'luks1', 'random_swap'). +#: service/lib/agama/storage/config_checker.rb:196 +#, perl-brace-format +msgid "Encryption method '%{crypt_method}' is not available in this system." +msgstr "" + +#. TRANSLATORS: 'crypt_method' is the identifier of the method to encrypt the device +#. (e.g., 'luks1', 'random_swap'). +#: service/lib/agama/storage/config_checker.rb:226 +#, perl-brace-format +msgid "'%{crypt_method}' is not a suitable method to encrypt the device." +msgstr "" + +#. TRANSLATORS: %s is the replaced by a device alias (e.g., "disk1"). +#: service/lib/agama/storage/config_checker.rb:276 +#, c-format +msgid "" +"The device '%s' is used several times as target device for physical volumes" +msgstr "" + +#. TRANSLATORS: %s is the replaced by a device alias (e.g., "pv1"). +#: service/lib/agama/storage/config_checker.rb:350 +#, c-format +msgid "There is no LVM thin pool volume with alias '%s'" +msgstr "" + +#. TRANSLATORS: %s is the replaced by a device alias (e.g., "pv1"). +#: service/lib/agama/storage/config_checker.rb:375 +#, c-format +msgid "There is no LVM physical volume with alias '%s'" +msgstr "" + +#. TRANSLATORS: %s is the replaced by a device alias (e.g., "disk1"). +#: service/lib/agama/storage/config_checker.rb:401 +#, c-format +msgid "There is no target device for LVM physical volumes with alias '%s'" +msgstr "" + +#. TRANSLATORS: 'crypt_method' is the identifier of the method to encrypt the device +#. (e.g., 'luks1'). +#: service/lib/agama/storage/config_checker.rb:434 +#, perl-brace-format +msgid "" +"'%{crypt_method}' is not a suitable method to encrypt the physical volumes." +msgstr "" + +#. Text of the reason preventing to shrink because there is no content. +#. +#. @return [String, nil] nil if there is content or there is any other reasons. +#: service/lib/agama/storage/device_shrinking.rb:151 +msgid "" +"Neither a file system nor a storage system was detected on the device. In " +"case the device does contain a file system or a storage system that is not " +"supported, resizing will most likely cause data loss." +msgstr "" + +#. Text of the reason preventing to shrink because there is no valid minimum size. +#. +#. @return [String, nil] nil if there is a minimum size or there is any other reasons. +#: service/lib/agama/storage/device_shrinking.rb:162 +msgid "Shrinking is not supported by this device" +msgstr "" + +#. Probes storage devices and performs an initial proposal +#: service/lib/agama/storage/manager.rb:120 +msgid "Activating storage devices" +msgstr "" + +#: service/lib/agama/storage/manager.rb:121 +msgid "Probing storage devices" +msgstr "" + +#: service/lib/agama/storage/manager.rb:122 +msgid "Calculating the storage proposal" +msgstr "" + +#: service/lib/agama/storage/manager.rb:123 +msgid "Selecting Linux Security Modules" +msgstr "" + +#. Prepares the partitioning to install the system +#: service/lib/agama/storage/manager.rb:131 +msgid "Preparing bootloader proposal" +msgstr "" + +#. then also apply changes to that proposal +#: service/lib/agama/storage/manager.rb:138 +msgid "Adding storage-related packages" +msgstr "" + +#: service/lib/agama/storage/manager.rb:139 +msgid "Preparing the storage devices" +msgstr "" + +#: service/lib/agama/storage/manager.rb:140 +msgid "Writing bootloader sysconfig" +msgstr "" + +#. Issue representing the proposal is not valid. +#. +#. @return [Issue] +#: service/lib/agama/storage/proposal.rb:287 +msgid "Cannot accommodate the required file systems for installation" +msgstr "" + +#. Issue to communicate a generic Y2Storage error. +#. +#. @return [Issue] +#: service/lib/agama/storage/proposal.rb:298 +msgid "A problem ocurred while calculating the storage setup" +msgstr "" + +#. Returns an issue if there is no target device. +#. +#. @return [Issue, nil] +#: service/lib/agama/storage/proposal_strategies/guided.rb:127 +msgid "No device selected for installation" +msgstr "" + +#. Returns an issue if any of the devices required for the proposal is not found +#. +#. @return [Issue, nil] +#: service/lib/agama/storage/proposal_strategies/guided.rb:143 +#, perl-brace-format +msgid "The following selected device is not found in the system: %{devices}" +msgid_plural "" +"The following selected devices are not found in the system: %{devices}" +msgstr[0] "" +msgstr[1] "" + +#. Recalculates the list of issues +#: service/lib/agama/users.rb:154 +msgid "" +"Defining a user, setting the root password or a SSH public key is required" +msgstr "" diff --git a/service/po/fr.po b/service/po/fr.po index 5adff6ff64..82db92caaa 100644 --- a/service/po/fr.po +++ b/service/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-04-19 23:43+0000\n" "Last-Translator: faila fail \n" "Language-Team: French ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "%s problème(s) de dépendance trouvé(s)." diff --git a/service/po/id.po b/service/po/id.po index ab77922471..6bdce0e754 100644 --- a/service/po/id.po +++ b/service/po/id.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-12-25 18:50+0000\n" "Last-Translator: Arif Budiman \n" "Language-Team: Indonesian ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "Ditemukan %s masalah ketergantungan." diff --git a/service/po/ja.po b/service/po/ja.po index 123bbc7485..cc89c1ef25 100644 --- a/service/po/ja.po +++ b/service/po/ja.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-10-30 00:48+0000\n" "Last-Translator: Yasuhiko Kamata \n" "Language-Team: Japanese ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "%s 個の依存関係の問題が見つかりました。" diff --git a/service/po/ka.po b/service/po/ka.po index ffbaee16ac..bcf96ca258 100644 --- a/service/po/ka.po +++ b/service/po/ka.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-10-31 13:48+0000\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "" diff --git a/service/po/nb_NO.po b/service/po/nb_NO.po index 1c25c9616b..b8a4e5848b 100644 --- a/service/po/nb_NO.po +++ b/service/po/nb_NO.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-06-29 13:46+0000\n" "Last-Translator: Martin Hansen \n" "Language-Team: Norwegian Bokmål ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "Fant %s avhengighetsproblemer." diff --git a/service/po/nl.po b/service/po/nl.po index 8afd7c32f1..6d0e188772 100644 --- a/service/po/nl.po +++ b/service/po/nl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2025-01-02 16:50+0000\n" "Last-Translator: Natasha Ament \n" "Language-Team: Dutch ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "%s afhankelijkheidsissues gevonden." diff --git a/service/po/pt_BR.po b/service/po/pt_BR.po index 56a7e99af1..6b2f89be40 100644 --- a/service/po/pt_BR.po +++ b/service/po/pt_BR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-11-14 15:48+0000\n" "Last-Translator: Rodrigo Macedo \n" "Language-Team: Portuguese (Brazil) ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "Foram encontrados %s problemas de dependência." diff --git a/service/po/ru.po b/service/po/ru.po index 6007f791a4..b4d4f0aebd 100644 --- a/service/po/ru.po +++ b/service/po/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-06-26 10:46+0000\n" "Last-Translator: Aleksey Fedorov \n" "Language-Team: Russian ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "Найдено %s проблем с зависимостями." diff --git a/service/po/sv.po b/service/po/sv.po index 9181b4674b..66db01cab8 100644 --- a/service/po/sv.po +++ b/service/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-10-29 12:48+0000\n" "Last-Translator: Luna Jernberg \n" "Language-Team: Swedish ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "Hittade %s beroendeproblem." diff --git a/service/po/tr.po b/service/po/tr.po index 27aaecdde9..00914bb4bf 100644 --- a/service/po/tr.po +++ b/service/po/tr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-11-07 21:48+0000\n" "Last-Translator: yok4 \n" "Language-Team: Turkish ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "%s bağımlılık sorunu bulundu." diff --git a/service/po/zh_Hans.po b/service/po/zh_Hans.po index f128a76d0d..fcc7895a0d 100644 --- a/service/po/zh_Hans.po +++ b/service/po/zh_Hans.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-12 02:47+0000\n" +"POT-Creation-Date: 2025-01-19 02:40+0000\n" "PO-Revision-Date: 2024-07-03 14:46+0000\n" "Last-Translator: Monstorix \n" "Language-Team: Chinese (Simplified) ] Error messages -#: service/lib/agama/software/proposal.rb:223 +#: service/lib/agama/software/proposal.rb:225 #, c-format msgid "Found %s dependency issues." msgstr "找到 %s 个依赖问题。" From a65c48fdf93f74deff24794d6bcf4a4bbc1fe2ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 16 Jan 2025 13:45:09 +0000 Subject: [PATCH 081/109] refactor(web): drop all CSS rules and some fonts As part of the migration to PatternFly 6, which recommends starting from scratch, see https://www.patternfly.org/get-started/upgrade#2.-remove-all-css-overrides Fonts drops will no be longer used according with https://brand.suse.com --- web/src/assets/styles/app.scss | 111 ------ web/src/assets/styles/blocks.scss | 192 --------- web/src/assets/styles/composition.scss | 41 -- .../assets/styles/fonts/LatoLatin-Bold.woff2 | Bin 44380 -> 0 bytes .../styles/fonts/LatoLatin-BoldItalic.woff2 | Bin 45036 -> 0 bytes .../styles/fonts/LatoLatin-Italic.woff2 | Bin 45388 -> 0 bytes .../styles/fonts/LatoLatin-Regular.woff2 | Bin 43760 -> 0 bytes ...ns-v19-latin-ext_latin_devanagari-300.woff | Bin 66448 -> 0 bytes ...s-v19-latin-ext_latin_devanagari-300.woff2 | Bin 49476 -> 0 bytes ...-latin-ext_latin_devanagari-300italic.woff | Bin 76672 -> 0 bytes ...latin-ext_latin_devanagari-300italic.woff2 | Bin 56652 -> 0 bytes ...ns-v19-latin-ext_latin_devanagari-500.woff | Bin 65760 -> 0 bytes ...s-v19-latin-ext_latin_devanagari-500.woff2 | Bin 48956 -> 0 bytes ...-latin-ext_latin_devanagari-500italic.woff | Bin 75268 -> 0 bytes ...latin-ext_latin_devanagari-500italic.woff2 | Bin 55660 -> 0 bytes ...19-latin-ext_latin_devanagari-regular.woff | Bin 66572 -> 0 bytes ...9-latin-ext_latin_devanagari-regular.woff2 | Bin 49652 -> 0 bytes web/src/assets/styles/global.scss | 103 ----- web/src/assets/styles/index.scss | 12 +- .../assets/styles/patternfly-overrides.scss | 376 ------------------ web/src/assets/styles/utilities.scss | 147 ------- web/src/assets/styles/variables.scss | 58 --- 22 files changed, 1 insertion(+), 1039 deletions(-) delete mode 100644 web/src/assets/styles/app.scss delete mode 100644 web/src/assets/styles/blocks.scss delete mode 100644 web/src/assets/styles/composition.scss delete mode 100644 web/src/assets/styles/fonts/LatoLatin-Bold.woff2 delete mode 100644 web/src/assets/styles/fonts/LatoLatin-BoldItalic.woff2 delete mode 100644 web/src/assets/styles/fonts/LatoLatin-Italic.woff2 delete mode 100644 web/src/assets/styles/fonts/LatoLatin-Regular.woff2 delete mode 100644 web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-300.woff delete mode 100644 web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-300.woff2 delete mode 100644 web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-300italic.woff delete mode 100644 web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-300italic.woff2 delete mode 100644 web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-500.woff delete mode 100644 web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-500.woff2 delete mode 100644 web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-500italic.woff delete mode 100644 web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-500italic.woff2 delete mode 100644 web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-regular.woff delete mode 100644 web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-regular.woff2 delete mode 100644 web/src/assets/styles/global.scss delete mode 100644 web/src/assets/styles/patternfly-overrides.scss delete mode 100644 web/src/assets/styles/utilities.scss delete mode 100644 web/src/assets/styles/variables.scss diff --git a/web/src/assets/styles/app.scss b/web/src/assets/styles/app.scss deleted file mode 100644 index a8b41c1464..0000000000 --- a/web/src/assets/styles/app.scss +++ /dev/null @@ -1,111 +0,0 @@ -// Better alignment for expandable section with a sibling list -ul.pf-v5-c-list + div.pf-v5-c-expandable-section { - > button { - margin-inline-start: calc( - var(--pf-v5-global--spacer--lg) - var(--pf-v5-global--spacer--sm) - var( - --pf-v5-global--icon--FontSize--sm - ) - ); - } - - > div { - margin-block-start: 0; - } -} - -// *DataLists custom styles -li.pf-v5-c-data-list__item { - border-block-end-width: thin; -} - -div.pf-v5-c-data-list__item-row:has(button.remove-link:hover) { - background-color: #fafafa; -} - -button.remove-link:hover { - color: var(--pf-v5-c-button--m-danger--BackgroundColor); -} - -.first-username-dropdown { - position: absolute; - width: 100%; -} - -.first-username-wrapper { - position: relative; - width: 100%; -} - -#productSelectionForm { - input[type="radio"] { - align-self: center; - flex-shrink: 0; - inline-size: 20px; - block-size: 20px; - } - - .pf-v5-c-card { - img { - max-inline-size: 80px; - } - - label { - cursor: pointer; - } - - label::after { - content: ""; - position: absolute; - width: 100%; - height: 100%; - top: 0; - right: 0; - bottom: 0; - left: 0; - } - } -} - -.agama-install-button { - padding: var(--pf-v5-global--spacer--sm) var(--pf-v5-global--spacer--md); - font-size: var(--fs-large); -} - -.agama-issues-mark { - background: white; - width: 24px; - height: 24px; - border-radius: 24px; - top: -7px; - right: -7px; - position: absolute; - display: flex; - align-content: center; - justify-content: center; -} - -.agama-issues-drawer-body { - padding: var(--pf-v5-global--spacer--lg); - - h4 a { - text-decoration: underline; - font-weight: var(--fw-bold); - } - - ul li.pf-m-info, - ul li.pf-m-warning { - --pf-v5-c-notification-drawer__list-item--before--BackgroundColor: none; - } -} - -.menu-toggle-inline { - padding: 1px 0.5ch; - margin-block-end: 0.5em; - background: var(--color-gray); - border-radius: 4px; - - &.pf-v5-c-menu-toggle.pf-m-plain:not(.pf-m-text) { - text-decoration: none; - color: black; - } -} diff --git a/web/src/assets/styles/blocks.scss b/web/src/assets/styles/blocks.scss deleted file mode 100644 index 33de6e471e..0000000000 --- a/web/src/assets/styles/blocks.scss +++ /dev/null @@ -1,192 +0,0 @@ -// CSS rules used for the standard Agama section (core/Section.jsx) -// In the future we might add different section layouts by using data-variant attribute -// or similar strategy - -// Make progress more compact -.dasd-format-progress { - .pf-v5-c-progress { - --pf-v5-c-progress--GridGap: var(--spacer-small); - } -} - -.issue { - --icon-size: 1rem; - - div:first-child { - svg { - width: var(--icon-size); - height: var(--icon-size); - } - } - - div:nth-child(2) { - padding-left: calc(var(--icon-size) + var(--pf-v5-c-helper-text__item-icon--MarginRight)); - } -} - -table[data-type="agama/tree-table"] { - th:first-child { - padding-inline-end: var(--spacer-normal); - } - - /** - * Temporary PF/Table overrides for small devices - **/ - @media (width <= 768px) { - &.pf-m-tree-view-grid-md.pf-v5-c-table tr[aria-level="1"] td { - padding-inline-start: var(--spacer-medium); - } - - &.pf-m-tree-view-grid-md.pf-v5-c-table tr[aria-level="2"] th { - padding-inline-start: calc(var(--spacer-large) * 1.1); - } - - &.pf-m-tree-view-grid-md.pf-v5-c-table tr[aria-level="2"] td { - padding-inline-start: calc(var(--spacer-large) * 1.4); - } - - &.pf-m-tree-view-grid-md.pf-v5-c-table - tr:where(.pf-v5-c-table__tr).pf-m-tree-view-details-expanded { - padding-block-end: var(--spacer-smaller); - } - - &.pf-m-tree-view-grid-md.pf-v5-c-table tr:where(.pf-v5-c-table__tr) td:empty, - &.pf-m-tree-view-grid-md.pf-v5-c-table tr:where(.pf-v5-c-table__tr) td *:empty, - &.pf-m-tree-view-grid-md.pf-v5-c-table tr:where(.pf-v5-c-table__tr) td:has(> *:empty) { - display: none; - } - - &.pf-m-tree-view-grid-md.pf-v5-c-table tr:where(.pf-v5-c-table__tr) td:has(> *:not(:empty)) { - display: inherit; - } - - &.pf-m-tree-view-grid-md.pf-v5-c-table - tbody:where(.pf-v5-c-table__tbody) - tr:where(.pf-v5-c-table__tr)::before { - inset-inline-start: 0; - } - - &.pf-v5-c-table.pf-m-compact - tr:where(.pf-v5-c-table__tr):not(.pf-v5-c-table__expandable-row) - > *:last-child { - padding-inline-end: 8px; - } - - tbody th:first-child { - font-size: var(--fs-large); - padding-block-start: var(--spacer-small); - } - } -} - -table.devices-table { - tr.dimmed-row { - background-color: #fff; - opacity: 0.8; - background: repeating-linear-gradient(-45deg, #fcfcff, #fcfcff 3px, #fff 3px, #fff 10px); - - td { - color: var(--color-gray-dimmed); - padding-block: 0; - } - } -} - -table.proposal-result { - @extend .devices-table; - - /** - * Temporary hack because the collapse/expand callback was not given to the - * tree table - **/ - th button { - display: none; - } - - tbody th .pf-v5-c-table__tree-view-main { - padding-inline-start: var(--pf-v5-c-table--m-compact--cell--first-last-child--PaddingLeft); - cursor: auto; - } - - tbody tr[aria-level="2"] th .pf-v5-c-table__tree-view-main { - padding-inline-start: calc( - var(--pf-v5-c-table--m-compact--cell--first-last-child--PaddingLeft) + var(--spacer-large) - ); - } - /** End of temporary hack */ -} - -// compact lists in popover -.pf-v5-c-popover li + li { - margin: 0; -} - -.radio-group { - .pf-v5-c-radio { - position: relative; - padding-block-end: var(--spacer-small); - padding-inline-end: var(--spacer-small); - - &.selected::after { - --arrow-size: var(--spacer-small, 10px); - - content: ""; - position: absolute; - bottom: -1px; - left: 50%; - width: 0; - height: 0; - border-bottom: solid var(--arrow-size) var(--color-gray); - border-left: solid var(--arrow-size) transparent; - border-right: solid var(--arrow-size) transparent; - } - } -} - -.size-input-group { - max-inline-size: 20ch; - - input { - text-align: end; - } - - select { - min-inline-size: fit-content; - } -} - -[role="dialog"] { - section:not([class^="pf-c"]) { - > svg:first-child { - block-size: 24px; - inline-size: 24px; - } - - h2 { - font-size: var(--fs-h3); - } - } -} - -[data-type="agama/expandable-selector"] { - // The expandable selector is built on top of PF/Table#expandable - // Let's tweak some styles - tr { - td:first-child { - padding-inline-start: 0; - } - - td:last-child { - padding-inline-end: 0; - } - } - - tr.pf-v5-c-table__expandable-row.pf-m-expanded { - border-bottom: 0; - - .pf-v5-c-table__expandable-row-content { - font-size: var(--fs-medium); - padding-block: var(--spacer-small); - } - } -} diff --git a/web/src/assets/styles/composition.scss b/web/src/assets/styles/composition.scss deleted file mode 100644 index e6f7956fd3..0000000000 --- a/web/src/assets/styles/composition.scss +++ /dev/null @@ -1,41 +0,0 @@ -// TODO: make it less specific. -.location-layout > div { - display: flex; - - form { - display: flex; - flex-direction: column; - flex: 1 1 0; - gap: 0; - } - - form > div:nth-child(2) { - overflow-y: auto; - min-block-size: 120px; - margin-block-end: var(--spacer-medium); - - table { - background: transparent; - } - } - - form > div:last-child { - min-block-size: min-content; - } -} - -// FIXME: Temporary solution to hide expand button. The button should be removed instead. -.location-layout table button[id^="expand-toggle"] { - display: none; -} - -.location-layout table tbody tr:not(:first-child) { - td:nth-child(3) { - padding-inline-start: 5ch; - } -} - -body > div[inert], -body > div[aria-hidden="true"] { - filter: grayscale(1) blur(2px); -} diff --git a/web/src/assets/styles/fonts/LatoLatin-Bold.woff2 b/web/src/assets/styles/fonts/LatoLatin-Bold.woff2 deleted file mode 100644 index 2615c853d5a4488362fa32d762d20d2e3a3273dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44380 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 G=>GspLM*oc diff --git a/web/src/assets/styles/fonts/LatoLatin-BoldItalic.woff2 b/web/src/assets/styles/fonts/LatoLatin-BoldItalic.woff2 deleted file mode 100644 index f7bace137712020f11800e36d15caf022f558a8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45036 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 zor⪚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 diff --git a/web/src/assets/styles/fonts/LatoLatin-Italic.woff2 b/web/src/assets/styles/fonts/LatoLatin-Italic.woff2 deleted file mode 100644 index aaa5a35c3dad00dac08186998c310d26fc2a1df4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45388 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 WZ$y@6puWu(W|-GhiY^Fm1^hoW?zidy diff --git a/web/src/assets/styles/fonts/LatoLatin-Regular.woff2 b/web/src/assets/styles/fonts/LatoLatin-Regular.woff2 deleted file mode 100644 index a4d084bfb7a5f329b56cf141d14aa5ed99fcabfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43760 zcmZ^}1CV50w=G((>auOywr$(CZQHhOblJAiW!rY${(i(e_r*OkGGb?DWbDkGbL@e& zmz$g@BLE=4->SR?K=^wA66XH3eSxI>Km_=V3r&~ zM|*b3*pcfa9{&i#mNV@sSO^f*kX_%Pm?if2bpW%{0uV@WCK%kmJOD zS=g$P<;!sFKP_5de+b0lDrA7C7$U&jm|-;d^3Tw1?DZg-aA#EEP!rt}PZA@f3>T2g z(ncvNNbEVTu@E=mUY@`c1##)K;4HD&#I%yH!j5gUV{IW=+#x&K@&Ru(i^ z`=s?70cKG*8w_K#iMR$dHH;uU#N-4ee5u~dMc1dXu4E@qdkXP)Zp#wkD7egUzT}{t zUr7u42q-Bz#aNmUi`@;gk3Rigqi`)#V-bS2HBd*|H-40QW#nYV&EaEY>^}DTU}W$e{ibM_vTroM zso>q8f!OMC3f2L&WNz`;=^;K~!|mg=cQP}uu@tkn)x$j(i?ewCi$EP3${zWkKxVITfOO@XRex`+VA`;zN;UTAG?pA^e)`bx;^0A-Z3r0tH57hd?ho~ zI;lcjKricQlSfPId3zzBW><#Ic|ojL2B)Nx%2|B^r=Jwb^SA^P2At@=i390N>y|BB zhxrv!KsQ96hXw0(qkM}@JWZW+eU#MzD$2wSAjkI+(a}&`ga$?8zf^m_uM~97_#^Jc zm430|U$p@%;IikhVSmIbi9e~fxRFd1DR` zE{&|dbl#YKmH+7M^gi`^edl$Uy>xBCDIl4LM-20Q*71D!9K%#r@rkdK2UuzjOBM@b zj$@Iuu}Q?gIRfvBmr4HG32~>K6CYeKrtI(4RrMd6pm|=`Ly;&2p!5eN9-P-SQF{QO zoxfxlWEzKn5oe_p6sf@DCTpaAGJ-)oDJJGXD zX}=c`fnl#$WTNDsj$gUqrYJ6GE|DaMF&u}=?W0YA>HJfzE+{y}`deZy*b9CQwG=7H z919NcS-EWg$6UsUq^!JBStlOW{ViPa0Jw527W=yjI&1`)#(2ev1+S5+$`%guF_O}J zq^^?x2SFMddLUqv`IdQC=Z;@fkR}97s^DrU8U!apY5cgFm;E8_7rlV& z8T;%}BA)U+50$?^2*fL$|BqgluS9^wvXbSkq^se<&cY5Kj+>m4W+KH`I_HO6ScN#e z;n=A7XU&+SZ9T~w9)LZED(YB`J>M_B^}x8>5Epo#u?G28C;SS18L<#%7+=kS#i`1I`HP&u;ZD1x1GcBJBXL|9~TGtXb3 zu&9QlH6?5;*NLFeS4mVcRjB}qT%*MI@=V(U?k79y8k$-*_d&k?|`YZ)&HtuPYZpu-Zx$)rasKak>Jlv_UxW-5tF8M9E$w1FR50V_nnj%nm zDh}!9j)CA70$vQ_gbTFyL1hL$0M)2ytQKE@y6>ZD%~=_GP}S~p$5#Qe8h-L|{l5rc zWZ4}s^cP?~AxiCq!4uCPe9C?_T}zG4K9L7o7aLT!Nf=Vx<@P|j!ao!0>l$ud4A#GYj|IGb-!oX6g^}juo{uwsVbycBiWSJj~spp{H|{kmYxEUp(LYYVqMcIjvb)vfuyFMAf(ym zRB)JAu&^yXCN;xy>*WE_5D_1QS&EO*4|F4d#9E0M(ZIf zN!eP_$xAe_a+wJJ;R857Kq3^7OciKLxJQws1)@NcSL2UgQYdz&y+3L%eO1KPTh);x zB4=Bd6%=1JF8hUPij=Pm})}hGs$T>#YxQl^VP_>E{24GSq>J3}@j| zX`D-`h}xo=diK|!yd~FZ8~{4_qet1));+cK7%7C!6~+)aGiWLAIkx~C!u~8b{@IC3 zjuC=r-w-;-S-9jdOeElfte|+@8xvH50R8mq&CU&@4};PnKZJ~M$y2%H)|9aLt!67)tB}=% z%0mOb-9dBwHwEjFK&gELfEq|RRlg0DKSxU*zR*@AFF20Ah01reM`wIiAf43Z7fZ|K zQ9K$42$y~Xy_eys)G05IYii+<_5)5GSC=*SPM$aXBy_u>Qv_oV78DTl@`=w-kNNZg zH#kdWn2}KL?YDW!YcxRw{rJ5+QM7n^Q9rUW(EvMZ*th!Hc>}Ww!Sc^*pphGF`1F(~xcm(hHy)1jFwW zc(?r6fZ!h^a=3c~D0k?uSU+QF<|(M(yaa1oyp@E++Yk~C8o}2oe_QmvI+)(8K+~b4 zAq<)^K&d9-4;)l~?n~TWFpK3mlSea%LKsLR2zo-D+58d#o2WqdSYu3GAV^OnFee`d zF$hH1Z|`SqG7KaME(hrDagE#gEx_7jbhRGA#1JXc0P+hrtb3#YZcYn7U;`0E&3f1x z%Mdfp{xe_!fW6Pb=k_nHcmdz{A5R(M^Jrovfi%dWn3M@pa(lz3FbZX_q^}fL2N#Di zDFMDsN4O*^GnUH%AO6up@+UgwzVY4!PUGP8j5Lu544E?8a4hj&D|VE0x`4wh@qvmN zi{94vEzm=ryd>P}VSDc9HR>p-k4}A|1c93dVBu;sF}}`r3kiD_`Z18%Op67JQ)@i% z{cJ)qE+43y)H~cc={^1F`;i0eGJgYX>?4CuqqqmSCyOWw))1&!VG@86kdkM2Mto;@ zTn1SqjfOVrf9_AX<#u0Wk$UD zmHVq_`wL+L;0K+>3}GzKkdJNuOBLc;fUSUR-faG+C{Lf&2tQpp8b~SntRL2Jr>}jt z`&N2bMsKO+6}P!)h%Fp$z@A$y?~!y_WTZ-0wje820v+hEfUSHP9!|OGlI9xQ$*rGo z32_|~WMbAcu~Ts#XYf~Ip_UL<01etKQ@CQ|v51Wy_JyoolPyseQLDAy@ekF}vw7mF zVd9|!%1qsELLnjzAvKjO2%goTRgxWbTfh9B_k^;_PbrO$mC;l7uV@*ZlT{mg1^R3a zM>bEpa~ei?$z8D>{{N{?0YxKq5yM^PX2vY z@gQ_mdGn}9yQ7fAV}!)s>(-;_s=>k`?CAdR(fR1I@yOHl*mU8E)#aJC>8V$3x|2(u znnwIeR99WGwYk1vz@efeq{NQN)G4Sw{`1qQD@#|Zupx%G@QTRLWNq9%{ORRt-rftA z1H~(fHl^)YMxc-qghC>K@PP@ef3h5c#|@qSehOgNKCt+7N;aLzj$o}fGy!s`^$HgY zK;-&Zh66~WQDa%s4XdRmLH57Rt{g(5EwoXAsL%QzC@&z zHJzF@Z1Mmqn6N>ZGKnggvW2w9t&9y_##Cx0NvJ(=D`E5N2}b}j1e`~YA#dv!$d6n_3@95HelsQ=%ls`%u0;>%m}X4w&{%coHg}XD zauOsuGM69Qab*!0Xa#Q60s94=P5nmbm-Bgal@@(j`@+!ZWlMHFm90x0F zHlc$d!rdB_YD~uzLcEakLia971?8wR)tV(K*&_PPlwy+RGYEL{5ZYi84F#4hdYUYV z(JiX_2_@9+9_vjbq>0rIDEHE7r~4S*9o!w`;oS!FY;u8Wp1e!(4Vo4-gg`@f0ma9` z(5hKJ1u-Ee8XX$6I6PsB3~vRdfSgPo?+h|Q=%9aq&{$|$YI=;Cs=C7ZJKXpE9>yPj zs$RQNxn}SwhM?O2WF4`4;&OOB8pnUuK{R^t|;O0}pdfhUL%}(R2)h4amyP?!$Vx7aC5K5U(@urfZ3|nf;jcz4idT~{HsuxxuwbIn$f~!I zIMH%pE56y$`NorAhNAlfEJWZ+!iuJe@=08nLmOxDN*1BYgZaEnJqlGwT!uYn+`yrY ztLOi(NkJT_&2~B9Q}MlcKiC9mh&Ti{NqXDyR}t3OEafX=`hakeki_t@Z4B#T_SwF{dX{WJgTp?!e+4QKr%sqSge;M)k??Z< z_drWmSv!eNCf!CCJydUV-QUFQJ~GEkHx0gdwH?7d%OItb_|CnLdsVgl5Nl@nM5dY) zA3q(bV&B6zlxSttT7V1}hD^hyHZW^kM6m`~uS8KDuT%X_$iMqiYA>R4I6KU54Nt|% zah;<5MPs7xVzaX6I+=ZrTMoGLfa^*2043+37Q=!*pd@HKcsyew5#@w=Q05<}Fw>rz z)E8`vgv|}h_pBH$AP$b3?r;NBO)s{V_L8w7JAC2Z!(mvno=pk9@@s@X#S}*vLLGWO zC72m7fuz$V6;rfwJ^(kgX zvfH}i0#RZrhnidTjWJe%i-mFDQ2LI zwhP2W#f9-a&7FAGjCR z@88eaur+ho>DNfb zxjpaC&aODYRZC3%lp&mUhcX}+saLX*xya}Mg7p958|FdBE_}(qjM8DC`TM~0vZ(WE zl^U~U%49fvG&Fe_)>L;x&`3UvNeZNYPIO$RQYFh3hf^lw_$Vqt&j)z_hJ`&S^D1A? z5rQ#Q7ll*?Q<~qpvQ3DX>L|a#AQa)vFcdQGE_#skk$P6a$J$>B23V84aieNa_>SCR z!3*rwmO~(kg}OX_UO3v>bZ|=pKEx?oK*^M7wttcCM)ufyf*{mDZpE6H5;Z9nD^p$v z++49-hzTqWZ5k!DFdbi0G0Q|VA{V5@-3BwcUrnb02pqY_5Meoga>%=pT73FmsXu?(nqaGbdVrS4%0>A$IKRlu!p)%LMGT-SOP+n6$4IF7wamb z;*p1vNF|PN=u;d!rVI6N_wdd{`YvQGq1`8=(4)oN%Dem6h*LCa`k?Nf1V0MzBVJM!$?e zjbMZV^of#%f)kLpWXy7?;{M0XE7T&!iQ*$VsR$@Ya-zGaC1G`11$(D=VXr$*dcbif zyo|4J38xYbCgrIt`>C?%)NV@Tth_;byROgxPhNB9~K~dmN19Pp41Skj>H1WC`9O2b>HYRB_Y!oD4%I$f1?g9 znFROBwfN;DCN5U6TESB<&W}(qZGIH0|Y3E2$Fxex2Ss=cnL+oqJRJh&>eQ?6k{P@Ea-Hfp_2*jLzU_Ieojba-(t${?)PaC=z0@ zl5ck1(gZEe_21Y|O~vEZGaZww?4fY5T-$Q(+&#xGF~`)lV2RRmhSR59?FFW1)pM~^ z!)i@p`$id!-A6KpaEya-f$IAM^-E4rR&W-ja%vy!%ZRmz<2RD5LmMbchM96E9NV>K&b-EwOa~_A>oHk!<;5vjyV&(xKrG1f&-zG1P06=tbV8JUXYD9VHF?rJX0x5z6G_@P(8RCTl*wBCNj65`% zc%-R%EZRRdMuts#(p9_8#M-CEp!-(@c1g4(70=bNWU6atVi66l=skHT(qFHEFO7_< z$Bm?FpGm=hRu7=j*y+b^+*S^N4?<+asNF$6c^61NPC=CMFSGrU@v}k>8Hz+KVulcA zOfkL&fkgE8G{(pp|IQAwc4OwRYs4N`g_Z|oL3P>*E4Rf#n*qFaAcn*ke-SP)?j)i& zY_;uD0+@u7b@R`)AWxhsZsHiCSh7+a;^rANZ~XhPL2xGHPafYW9~xl{JiEC%;u4C| zJ#fCs2|z#^f||!?jb5MslKwiZ2Utp74>t5a=l##Xb>aVGjW-;4((T2`BKJVjM$sVP z$dDD|wX>MwbjE7*PS-K?D=j2~);VBvUk#Se%=<9Bn&guRm^@a3#Fwk1OdcGw&q%Pb5~) z9BK9qllsC!RWO+Sd(otPBz8zx>uG(xN+?r_sF7vyqrV@fi6!NLBct@rfE~z0A zx`rg;iIGsa>v^%FibS|NKo_EX&(P_uV;~K*@srY1b0z`)h9BgA(kn*l0qFlH`c^;m zz#U?>A0F!EMOA1#;w34$u2r!|Tef@VQ5y-^|LFk|$iaU9VGxnzj&6k zaWSKYHEi1G%_6P6Trv4S@R=dR9al_r=o>RQeB6fbg9QO#SI^m&CmJEOk}(xLOt+HN zNip9{&%gix@Xz2l!InrQ{`;UHBqS`XJpa1ay4w8t%0iYhjT>7{Ln8n%@01ANngoQ< z_IYqj>W4141A2=dsT0B%$PpaC0Y@()B!)a<1o(e5=lahS>Oh4nADqxXxf4fO^UT?a zY_b#Q&^)S0oan#*YdMl+1DVh(FmDesHp^hD0W~^xmvFui=emOoOO8@m}zQ4iB!k+AhPwoQko6d%k|0c*iefNrLinQR|6D2LZ}mVbU%=;|K4JXrQ{?gg-lsmt0SXsBxPyQC1dyW2xwScZZ_8%i zJZwQ6V94HobO$;hjBw`xr1~d~Nq|E&fHlf41E~Y<#6sgb!C3+BU#${9>;G@7693aG zzLIgtpq5T@@yk(=ar3Y}5Q+H;7`4^8DMH=97?~eC8G`sb1q{&ge*tpg3$^#`aB*n$5RPyjzZJOs#p4}kxAc^E}7%hYEW^<>WczFsaa z-StQ_ra=zIIw0g9U+`GSKr`tNyyur2dard;7KE$O$xw69pxd6gqjMkfDs_{xy6t|E z^FqUpWnlP^07nBYL;u5CXOE#1@=KPlLQv}qb5u%oAt!j3?`{QN?ChKzozTJB7@3qb zrw+_>LlbG3Ee)A$dU4w5E0|-nvR2~hjQy0T4?=Z9IIyh!aSTA#MC_+1m4SxK@&Xpi zK;;Uhx`>!BU&PAlpcoAxio{BJk58c8jS34hOJ@H>H)kusqR7-JaOlEh>BjO5=d+4G z;34M6&cT?&j7WseBImykDCMeli@%p$#rFNbPiMa)>vYOmR*-hWtYS;#3S2#$MS8wr zexiPE232rQoO3tWIvcqB|gvlH4dyx>IP;@b?4mf(k)K#EGrB(laqJJs8a_&ZKh~5z+gsdxf@#l%%xCbb=ZPD})n~)(=NBv((EmHc z6h{Qh8vGqI^C0i>+=$13I=0rr17&OFZ2vtQcb92?yG|BSJ{iZS{ozP`A%AI(bn75^5^;i(Ai05_3 zTAuBR!j%jKo$(c&_ezY|6>+x@wxHjwxouKgXO1L3wKY2}ZiV;SnXzTt)|nCAfR`|( zTh{7M7B1!esZQ6LR$H2)HKZF#7hBi1K;0P{H?7ql@Ox& z)MR310eobYLJD5J%5ep%z-7#?md%&g`1bIf#$;lfeY04POYyelQtA~ScRSBqmJk}*!h@t$qQ>hM*e6vFIQ3Q7MPn=B_;?K=n zU|+o6)S>1(yZv(zbyqX{a}%o0v!H?eS5S&&j+tT^{)I2Je>FR2MJIwZ8~Nt^3=16- zBTM+4HhGvXB+0GkuR)Oe*d1TCBuS!DyykX!)DY1@F%gC$hvJR zgF=Xtj(@dc1zL}Tu$)J0dlss(=@F4Wf#0an@2n6&z)wUMNt01Wsb3s z>j(Voci<@Y2Y~ulG<~VwtNel)8l*%B&0NRyZJ!6(%Uag9s55n58BO)W*@_6d)JY1{ z^~b~FQ)eBYzBiP$lYzl+AKk{Yp5%-}iHr~@gY8Vd)Nljfo_p0vkGI;EoP}Dq)`r#{ zv+Jn!nlHZ(wy-hauke^jeJ<}4g|4Pj+tX8VJ$$O!jRRRQ&~~uZG%PR$udM(B3~Iev zaPzAbHM0~ez>0i>bq<>#SkQrSkB*aA=rSFX%zGtk`ucQ& zc*YB;K454t;4-z)kXc-=BUhGTd&P>pG|`1?#_o}KiN{YKil0>7H6%m8faHX~D;|7P zKrx6-lu?+{IU>NODI${uQwEn5n|JN28w5Dp6qh!@Zn3XF!VPK4mRYf71xsp-jtiN9 z9X!quiup>-Y7(uDGgYqT43(WDO;yl+P8HyG3$Pcb4}md9)i~Tkwx;sv^3?e85sMPy zk`iRV$$!7G6;xFO4W87t)DgVL$le+`?7+ZASWL@+5zC(=!nvPCJ|py%VRAIXY)M{d zLWUDX5TYbmQ4oTli>C)2UHA9FtHqTZL`kXVlC+5=1%a=|*vTRl015}4agjk$!QTGL zsDxba8P3!lGf#X_Zb~kSA&6;khKp>*a%+oS*Z!4A?leR5faW&N@`P+SRt0c6*N}JWfJesu`r3_^R zsc0~OA=OZNYa4oJka=Wnsq}jn_w$h&dM`Ir<`r#qFTmS8nEmrp^&`aN!?t##X+!ZkK5{> z&{ld4bcxduUV3NZ0Ook%ukKJ*AsNsZmKB6;p7dUvgXCXBRp;+bMO?7Y$4qyuxD+fb zNCB@96olN8U=Q1{^}zFkGujZz1(tq~+kE|lD#VnN5ye_e_roAyUOim_qd&ACK39ub zw!L87Tig6xE3t8sZ84ZM;r-)1Y{HU) zyO>*-Q^4fRVS+h=+U|>A*iY|<5!*aMjdBzX?hE{ZOL-jm_*lR@&bcy+Pl++2XB6$) zQJbC|cY8q2<$e&}*|9^JZrm8cq?wKv~B+z37)_$+_ttWFY4 zP~$*VCvk$wzhaAY#W%V*kdKxM-)^HRc!{!6lQXUSgFi~#P2Ns2`_th1jYc zJy&2Kdl_7*J}4fE=iwGU6J4M9A75>IH{txwWqBP=n6XA8i3zBlvPT|%sC-W zf9x=`kH|;gLjJb+fDA}bSx-(tDw~9!pLoj6e0GAtXv}CbZaSVYnaZ|1Hmc$;N8l?W z!N1O3xI3m0UucxiAT?w(OtRlXh7>O;u@;e8u61@o+-+X*!MFfpoXQof(y#7Hg4CWO zw^wJ`0bq?QAOd}x?&_A@QFP}nFCADkfb*7W5{gh{syTM+s@bprhbZJds#q(?Ut;-N z(*@{!I^j6%b#ZHpB=rbxBGB+p^xvIfJEa>9Ztgn;{zbv(=##&GFWM|;Jiu81tJC5o z)ozY*-^TCH`_CGE=EA=qUu!U*CCTyR?Y(19qqX%!TlTzj9$_(hOO@V?-STAk-d*as z++E^vYQfvgGtNPoACnj3GrAMdFt3suKp{D-;IIX?ys{!XPvi7bPeK!!Vt#veTvUrH zC9+&dwCT1W6jjMp8(a~%oHFfKDXDE<%_Et0KPRA~MRU)XEeRjWsz=T>9ymA$@)lgv zkF02jD|XjWI0&lUhJo|ZyV=c>2#*};vE36xgvE*}o%pS&ENnd<@{1H7ZA8pV%eZ}c z1%@T`--Z^wmXRCTTx2BE5VqgV7?c0HK|hYb`Spzuhxb_kN1&OAGkOSAk#GQBJ7%_U zhsPFEF?xSRZT7t@M-291Sb8A#O=fbT_qbRV;^~2+mDp`{KL+;}!no=%?t$bvI6Akl zv!}f?9Naz*M57|sc?&q2=;saw3P)J+wN)!fwIC+JRD0DK)EH9B>wVb0T6T{kWQLG( zJApOaQBHxHnx+3%X_7zVYt5a(`4kkpKU3Pil~wi<{H1A3-UE)a2Yi++B@T)m{9@^a zZPH(nF{(b3$joN?&^XX%mSsI3N>*Q}=-?wMhy8uBCa_dIyAqH?Rp*c+INo9wFpeF6!y*P&hBKtn#0xu9w1Db zzZs)=-C<7s$$(6o`Fn-6cRQRv?Zj05qheoX^eKeNkuCJc&K8y_xiVC~hGL*v=8tQ3 zmHm+h)JfPpc-x&Ah<0ZFSFf~6{fP4;r}ghLn-k})kJ~WL5}_q*z-Vaaet}W}qPa&q z=_b@jRit1ErQ$zojUViBZ2^j4cNR&^(*hZA<*-{kE+BoyUzMGXL3^aIjIEobn;0-| zcuX&wWY)?5++TkqAC4Hql;F9Xqmbs7a*pI6Kp>FU)`Jx35ucK>fETd!Ok%mB)vo1(ZRgB+c9=J8RBdLZAkq?4Jn7w%EHnHWY>Y_XazP&yL`ykdb zlL1mgo1urjlAs4YcYbBt{qBL^=CJscaf_t4$n3k9nWe|#z21(Obc<%o?sK*?e9*4N z%YEPVSa>zr%RKv_W~fND9~Td`#^dI6<(ywUZJ&Z&PsDI*U9Yw4(fNAPpV_Rg$UXY= zT!K}`;|dDT^z=LBJPuRyil8dKbH6;ibakLH_eCbHUz93O4U8Azl=r8xS@ivQ> zuMZ7_>h%((>giUCh@Kliuu2Oilsl7GG29isBcFlSx)}j>@I3=4f4-cc+X~drK~(*c zcGF}<4liPiM1u6w@L2QaP7@~n8ctdDqmX&xTc8_NG>mzXcQ#WLqKF*lfdz@h)Tff! zQt-}EV8E3|L^vNh+7q9j8qxc!miVGxX=?b_f*{}a*gl=FG-SX6rX+SEaOrJ>sxWC+ z1#9;krL$YTP1T@yfBbKPX^hwk_?5XPzCiwTLDC@kY>~3)3B5M=v-^|+tKXyf4B*u2 zO=p2t*Y1ZQZauFk_*4n5Lsolp5QOveBnOBI3T8bEjj&Zvpz9^_${}~k?gEj!HR9jx z);%r1{i8&e%$e18YK;K#h;;b5)(h@jze^*g@}1TBGa7>-4^B;kDIPfga{&2C_B(rJGF>TSuF+r)>=w0S`VmjkXj|12x7c4 z-sjbC1^~}6v2D)VmoJES-;TF_<=9DYCk6q?$P>(u&_TYE1}p#x zjPrkgzGFvbgXn2Psb3AcMtNGePXu z;lxH?Y-%jX1~9*!bpHNiv-nAcza8*!+YHA!w$^IhOI919&Sbu+^}6=jEf7Q4HM72* z40gcl=gR9VkFp2znnF|uqdH|#6%3B(4^M)Oq;9`8lZb#+v0SoX4?SyZQe9do7E0qa zDg`hx>;ju_T-heX9L9zNAt##_X3!wnBH5~^3{yjwfA@Hot~JZD~)Cnbbq}@UxM?;cr7C$1$yA;jM2nDHwK|w%)p8I5h-U)2hH2Xw2J@mq*q3y7G9xcx zlUejHX5g+FV2Rp=FHtE*J%lbaM%O_D-hzG_nl47iiH4^C9TOo?8k&w0tY=>_A|LIg zeU%FuJVHaAYw+yqXwH&?oOx*MR%qxswbBz6E^7?O=GC6=NYVJ3Z0eDDV3G^?TTyHG zf*vpIm1AH>;pcaX!fzu%YDmhk!p+G1jOzE{Oud>(2O^V_ln$C%owv$Or-cn!_o`|~ zY_v<^C(QEt6TsX7{t>-ENW5wyVk+gU5QZ}?dC+f$&NxAVKf zfXc9AW1GP7OTGTm)r9F6kJjO0V^|=no`^Fk`%5gkApAKcP2;mOKISTKNWa(Q@^!+S z8th7$-oTpgwEperiI|$4mwYyO8(soHY6gJ5NmyX?^+-N5^LLAhq{OJ{{ppj#=}y+x z*)^N{=57v!)sB>diU?eF<-AzTN>cg8 z4F~@d>--Jpcqe~;YHRr_t^QZae&zv|iP~9y)O`As{g$iha3II*Jry|PC>UbTIqAxf zXQ@YB*7T+Ea~H}wZJ(s1Bg~R30vh2m1UhFeKroOxY4QfB<3B$0=0FzJyZi9u0nn(x zK#BAc2gi6YA>l>MCK$Ms5A!p`qzou+;c49^YDInbyea+HeK5l1C^VX;*Pw^R`0I|v zfvqG3^jClkRZj1~^Y$i<5UPS&o+Z_$znxc)(@1R^-4eQ(^5{PN17ee)e&2iafy7Ik zdIxIp%`lrrXK!UWFz5@cJwssNm5lKX8Y^gRj4qi2V#)24$X0pqMk#E>`3IHNEiSgA z48NJg*>yz49=qS5Re!O@i&4+w2hzBH8IDlYTQVA4shp>Bg=kv$xa6)Dvf=yDb#RK^ z=x+$K5~@~?Lf(ew!+# zqW~P1b%0J5)TDq=sA8*uo9sdzn&0Hlu&dTjSy;=crdGrQX}M6lPG+u;g*?ryRLe)? z>e#I}=;IKQr_%faJw7l3{kJ&vYiARD)wrE64&UGurYNxafQrF{LXIEkZMz#c+Mb2tnZ&A`bd0tfER5r7{aqp&P!&uPoydss0fS{~=fm+pNs2q<2K1m8WQn{xSdl}^eEQ0Otp{L)rM2;hVm+HK6ZP z_M&4S#Pl_(GG)OKX()P-A6wX5v8QsKU~tS^hAL$OXqyf@ zUaDTbaG}jra8{8BCFwZKgE)NQ%v`}T2#%7Jl(Ir?zax?#Qsl(p2u;0F|3I?vd@K*D4~c( z(rs-BM4~8fje5k_$b;UC9(w9jBv5w~DzXJmkcdF-W3}Hf(kyIH29|TltDtZw+@m^l z=8Wln1TiSqTr{%#ykEXh!55PrgLt8!wK8%t>Qxt0`zhc{L#YHwQnJ1X=>qSl*0`QL zZsAU~eu?@TX*e`f+1uy4J=-GA=TX6nz19Tt3CACh4#J(I)C& zf8(r(CtZSrR9t>pLO8rafexoZo(Bzo72S*7a)I|VB~#Vv^hRCs)3H3-u0X5n<6mo*T4IRo`MtmH{Evq$a z5e94%i!=-J0xjm4sy589MNGDhbK8Eo_qGw0x4g^T4ZkRo>`SSS{Dz53B^wW5Wi5M_n_B`@T^j@_`rceSWHR+n~_7i5G zatkSPCOiUsCIMGZ1dHvt6Ae!)^s5S<=F}P%!aEMi#Dj&)JV&8%P&bz#b=^x`3IhZX z)VHClz#pShLSCQ92kPYIk-6+*L(5;NZlpG=y7XvcOTVUv42shrnTHcSvD`~eIt4}#fcwNK%oBffT)vnN>QL(6(QCmW{eG`gtQln~u&n*WDLe!lH z(L+r@H9Iqt<3BCgx6`K~2TxFMO5?D0!CVu_2~0!85>hjkV=aacr-RWEGf#L_NC_O8 z`YGnLuXjo@!`NjTeU#1z0z4A9b);hS#L+1%g|;(n)p=rjf`~sEUm~ph0p7+T>4&u; zZ1(&_$5E@@tQ=B7j#{^wTEQa)rzL4sIXF1?MBrHQ7_vuiyDuCl9Po#+4mnlxB^eS2 zQJI)@Y3T$o>K>osHiUy|dBO`l-A#r7FtDKnehH)qpydbfzI)ijF2J&Mt+ z7cq_ja}hd!w`g(?A2)06jECfm7WopEl~cDTUurs2aHC9HN0rjdT@?0V_1xsjR1wCYvq_kKAU-{6&y)R3llfc7!b0-Py&Uy(woO9-N_I^oZwJH(a> z>BXgfzITopW3i6F@Y5`UCQ<-6P;Vy6f-~7eEM_Wd#%c?}WllD#)14EvtdZj}R&~o| z*ug!`LS0PvS*>%zvyrgGWEumh@?Xnn^48Rt|13C~rSTppN7Xqq!pMa_7H0dnvE>C; zV!b3)oy9{g$lD<{=2UQ-Sifq^;`1ST*-0kNmVs6^DTEuTs10{+ZJK7uK+tIpf7VAm zMx}3zho2PxE|FDYcYH}KC~9b!pM^hp#Jqb}MUrNn$M`=~onx3NySA>od$w)cw%xOB zo3m}(wr$(CZQHi(zH_a;&$;*J$)EaDsZ>TXMvYXycb8+3x)LFPQ+i=SZ`U*mkWXdA zR?s{J*+uNNHM*s==-1=|@14~IoydN`5D*3uXuYn?vdb?DIGMRm@3FStUIQMqB0^*Q zHY1jLu!T6O77f^DWFnZ2w3#x}yH1JcNkmV6x#U?w^(KM6*1AUlz_WFeA^E74v$!I9 zr$mLy1zNI(W)M81DqYGl;F3C7#^>KgSitf)7LYq9nwa_cvSw0JI%mend-!`6c8ek% z&=Y2}P0pez=MmJZjQ6RZ*8a?jHaJ;5!azC$fqTc$o#Vo6Gi@4U6ut8aUyfpP%p)q=zgl2PP-K>G7{yT0j+P5)=c~wfyOe)lzS^yK zDhDf^T27d^W?1ISpW5n!Is8&vwM!-AeJQ1}@8lE|s!b@0*qg$496J*~KWNQo(LTXC zp#$IvmSW4Qoj7=_sjmiIjpW?_C{Zz_d$_;zkBK4K?e+u279rS|QCp666KvCo`m_{* zRp^aka_ePtP>QwJ35qsHYh*?qW16`W%qF_UqbsX;NAgQ)P;U$Wc32Io}t;%yAPj;9r_74Yi5p1DkM3F2Ta;C6zjDzD*if&&n^#Haz@N zti)+mp9sxX_GKq#;VE^8Xu~gV`2a$+pdCzEZ*fU zpAWy|I$IsF;F=52D2B2Rf(x1j?OSS#d*_6BQKZ6qt6W|!BuyuH5r*86`Gpl`TSvx{ zD+9-vENdo4)5jPp7Dpm@6nc#!yj&bH0&2x13lz>w(L{klHK$i2r|XZ$q~_w9dj^!X zEXE3nU>04?J9WE7>d|}BKoU!j+>PsG^M;{eO6Pb1TW{zlRNps`Kgvg~Lhe>^TCU65 z)En(KmGJ+-e%4Two=y*{b6X}#l-z;78T-gcZw0g)Ol8A3e9n{lzHT<~ z4)?}YT0LkP|MKPP>QvdyxR7Eh;r$k60GV5&GI^@S24W$`VSn1r>#Z{m++Y|#{UgB% z-`*e?PcN^IBqTg1Aq~VB$G$S~%~Xv9^xfwybZP!^-oK2S2_eLPy;+@2g7s$9JS78o7y(JOr#! z{{aTJKW%gYJH#ZHH$%DL0?_Bm>%-EPY5Pr&s@WLxZKfsZQi{XY)G<8hP)z+}Fqj0E z?VJsHkaees1U%`VH_Crj!iW$?4pREj_B?2g9-q)hy6|^lWVcL>m^OZ_tD>+EuGo27 zh=8S8nF_3TZSSC1a3h{Lkb9j+7Bz&MRO)jOGk{lT>ScX>A8-BcgR78G)OOv_1O=2K zXX5kkarDD_M|W#iwE3yW7g`gs2)p6Y(pItT`K9FI8g;}?`?^yPg0cq(Y8uIUTfIyp zIzaZ*R}MLPe8nQT24!jv12^%tw*}`f`!K1o1wijgQtl>Fe?IcH<^H^6M1y@7 z1LMq~T^Dm`_Eda?~AeM}cnJQ%Utj$c#6 zo6E!I7Ysn%YBSk4p1_}_Fv?Xrxr^@2KSaJ74nl?IZoFxq*!lsvv}Y}$Z; zC=u`6@m+-;K)U#9jP;qeOb8}EC}DCCN+mx=MwYE}xVKEM?Wc!shFU34Ymvp6P1j^u z_YdV@zI4ITjL$>`w+tnD1*JROR%zJ}xd7;de0IL&xXwZp|84PDzai}e6yZVz^(Yo6f$0wg}Qlgr&rsMi0M1cgq}i zDYVisqDAs zr~A*6=Vlf*$qyh0WKcb1f;le{vm_IK0K%&Af%q$VOT}u2-~kP0{nKgd&+q!ASHhI@ zn;T}4Wb#}UDed69X9g>A4umSf3srb5VWVaT7~=FW3-&L;C}MTN!g(syT(rFE&AvJB zaS_C-H4-~5o!_As>fN9C>4Hi&Tt&&H>jl$Wcb?K%HIHv@+V@?#jbmRob5*~|s6)RoAM=$$!N4HXCT=rh9L(-|34fV_UZ1+Qk0+?VI@P)c?X zi|(>EW8I312w|em%yAm%ao>4Ol$KxOUEc59M7#H0cqh1h2MxmY%WOq>lI>q6&)ChFwJC-VY2hCra@t~_nk5?6QvpFRV_8wu!pL#0vZu28H@nyyHIom7H zvX(HJK0sgU3D)|BaY4hgKdk?mk*O^;bKV8!li2+vf%ct-=v(cI#Mn2Z)&1UrTKv#V zwed&G=w3oK3|0h{E~h?m!=m~X*pLz|lyA>E&#w#qvw@d9wo_Nwq}Mg~2D|j~ydE_A znZFQzm*04s8R(k$X+13oQk=82r;f(t-E!EIL+L25pf4o-g&}J>B)pUM4gzEDF#!YW z;6;Ta;eq_9Z;Az9yba3;XkxFN*@$spWJ?*!2O)3Tja-|IpD@}}@7~byz#|VzL@LOa z*$z1AT|oO;kXEeEI|`L|F~w+|KUqHyAGzZMQHfy+7=MTW;Sp=QvDSnNq$VQPH=NwM z8)2AW-wb#;a`Bju;z0U13Q?|iuKa_wY%=HJpU@4q09_-JABd+BtJc+1uwzQ}47Qtw zM=42kOuyl>f|FUUG3SCz3VV*O_Dj_0_#Xd5o(YOYU{f1MJVjmF=i*V~S2gaQw<@tZ z=fn<%UU{iiVdwcnd^Qg4&C_Gs15vL* z$fm^F5U)mL>hK+4IGBwqvZr>}P7)P6KZTw?8>I`#EFt4(c02i(ws*`AE4e+YxI!Mu z^e%dS6MKX2^@BIeqH?utO$?j~YK^Jv!xWI+?wTC%s< znxRkK?prO7rN&^LB<+bG5Q;6l>>8hO*|ULiEHx9&Q5~HdOE=y=jwcvq9d7BF2+5Da zxkELOr94B%C+oEj*G(U|>scFqqZ=b{Pz1&Xp)C?8Og1?oHGNq#=RoA9wXp0|R2+X2 z)hF;OZ!<>wJ4lz8)~ktNlZy9u;k|0{@G$AICTJj#O2M@`N|t?1*%$&IdCwkp2aPU) zrZMRz*xL`2U0+LgfiBd~76Jo5l)hFew_cU?hO%>3JVm_0SbrQ75mF%Ee`7nOdsM99 zTx_*U9!J0leAbdSM@xdr@0~tHLz;s(0U4ajE6R;jSWi0N4{4r8O+FN#ncZxdDo(X= zi491i^m)H&{CERlBR%5HH&1N?!tv7O?!<`d<@xmX@J5;-xElpUv(reQw;xsQOz>3 z;wPu?T)9PDKXXDk#;hUw-pD8G?Kp<;Xs+217hNEuku5q(yKLUP^Xd+sb}MTs;W+-D zl_u}OCW>Kwl8nhWtl=s`;h>)&q-yGkOC6F^s`E}^2sp926D@){FuQqqR0;?VE8was zk~je7n$d5t`#g=tZU$S$`-~{R>nZ=i(oM!`%ckO)(21`6ie={fXc?}!OX*BoF!PlA zZLF+W&{$t8aot=HS!Pmi(_PdPw{B%JqdDm>=;hYZs=d?C(`trqh&{H~(xlAB@4A5a z=1%?OUEs@%L%dq$lVBd&wajDMkbH}B)_v|Qz`V<&;1XytBu`?7BRW1(otyeP5)ldb z@uQE-kazTA0Nrs)mWo3{anOcn?h@TZMMUN61DtwK7k&NsLqH+###Db|^rNq!uHLTaa`9&|@j z_ zBgp1rhxVGuzZ7lfnPVBeN5|_>izuB=nH%n!sXing`lznMUP47u!w4@@R(JX7QAtnV zy?e5Xq+*Dpt^@jLV2q!G8%1?M$KjF}NB#;){Ye`6(}A8Sb-||7LrSN+cX zOS<*j5|%U9IhF8HW-8NeCT0Wh_bu!4(4of**v@B;9we(0Wo@AVF z5^6oqz&&WYRIHpRInIK^i-sAB3~s(chMSfjW>Z#XY$@e>EzxLM3g{C_qH=9u(F$x$ z)Vm|8baDlgcq*i*JPZtkr2WMg9Yhw z%`t2N>rwZhoS2NAnQD#XI5kZ8726?H8@{r+q#?H61Ynj|YQQ$7#L2pt6J8@4&NCLZ zbtN9mndsN|8xS>{Q`>X&{;Q6bZN29yVF7KkXY!dv1efjYc*hY|&W;6r zT=EL?knz95e<>2BpD!4$4MhQ~(~F0cS-L zOtGTxyC4VuVcczV3+eNw;=Tp0%Oi(RlU_s1MIl#mq8*fl`_rrzlntw~4G?!fP5stq_PNpPstM9fda@FFLg5{w?0s?e$^kzy;;Tm* zLrFLkm2;8SVwvG{70vml^EeK3J8xNYPw3DgzJVf)$8($(JLaH5nNSKFlY>K3jr7Y} zuBpZ0R`uVPlK&n6DD! zDs96O&nFWySek(ggHXyFinv^`nGa@+xJQi~^E0cE3a}d+sEn1#3+K#MdOcqffFGWG zAC@rn?AmzFUPxW7*$Sr)tm*Wm1DmvNiVG}Mw7Qi^b4Q#lZP&B-M$>Z3rSFpoiS>W zh_cWwBHW0)i%?_&B0rkdoQU0ocD>VKEyLJvKwZ-$B~{##UM}bxrIkf>lPX(&dmDwB zQz=?SW6nL(s+y>`Bu{`bBCYY!#=K9W&Qv3$O{Z0>PtOE#^kzYCA1G98zj2C>%4RmJ z(iJbpA6~nx-f!A?_~sVT{G|n;t?>7vQS&E5NC{pD~wybzvG!6)*?w0E6(2G}--`^C-v@1DbDFb|yYem7KaB z5m4}OvN~;5p(F1Y+3;ZgHhvHEm&ue}I+a_;{UVuaH`*CK+_RPam-V}g-E9XHHMln+ zZH|eNzwE31tVOwDE=b~^QY|rl^8lRd!!ua)#^W=CU3D1b=7Tk)@kauc+cwh?f!B~b z?tHsZjW+0_*Z71?|EBvQ6hjEwgH%a$&)te>ehkqbC}f8}fp7G%Ux2A)(OJ}G z+Y@yXqC8dtOze0ZzXHXKf*gca^gN>CEKZJP_o<81r+W$VaH@+a_Ou1Jb#AbbI;QmW z_zLqxb|jq~@Rk;qa-8P_qj0)NQ1CF5dqUT1`qj#`elqC{nytrKR5-r^=mCQYdZ0~& zsRm{85m^`rHsagfSVziyE(;;jNk=(5T;Hd~!ph-L74NN*j!;}Wo@i5KArMxm`WQA4(>DFwvJ6R~HTGorPWEQ5{6ha#m*r4vY~yr*Cx()a() zs~IR8sG={W4=zHoU!9r)DM2c)fD=|WriY1~{6r*i=ZVe$_Zs?0APFw-<6eC6iEvNN zKVA;}1P;tBUq;7ILQOz&cXUIrTN^MjzWOy9HmdzOd4j*n7G_V{2h+p64XAAA9Pp>g zYD`5^dDGsG@Z?*;#%1_1L(&G(A{2n}?*3wPD7fVt63o!G1nwj-AiDL)I)n=6 zi#RwhKnY{Ydo~SDyRNUPO$#Iw^pFJ2v`O5yNw(VtO-3eekZ-SYhR~^5Vn^;jNLVG(bo2HQc4njaW|u?L6~m#+Lsl&QM3 zask!;HfKX|d22Lv0hIYOL!kOLNv0Ii@kq^Lz+0kp_RdGY!0I=t*q#6kBptUHpT`OH zY?!1PgL|D2Q4$saCrb63E4gPlpP8CpJ-G_slf@`)mR*9A*%A<`Ia^>7jzRxnfH8h_ z9r=%xV4O2CY0o9F4~hRu`VHRfd>OP%SOTG9@NHZRqZkN*h?Ib<2qZ_yKz{NOrF)si zgVgz91suJMp>pzYUt*i<+B998wOEPx4evWNZcD#$pbwm)Q}Xg^kWJfDO2fm91ms5XtD*LF9@59L8P;ELrF7moob*U$EVTes2Sw<3* z0a1N0X*gU7)^O3Lu0Z91$zap%MJR}i`K;&;=#p`U>Ddt`H}qvmBTIExT|=T^K>xu; zwI>UmtdPj8b>ARKC$z;W4CAgsPe_I3`uu~>V(^89*SJ}3>txX-!osoyIj@Ug`YLoN zgW8%1{>&+yf=W64)~$j_8aiWwsFG=N=b?Yq$uZv7xJg5YND2>t!(I*0CtGGP*;r6r#A%M<}e`H^PAY>=l5?_w*x7|m= z^7&oZ6ZnRUz!$pOhVHmU?UpF9J8fgEAf0psZt{EM7mL>oU2}dv79f80N9yi7;a+-inW%VoQDCA#FbErP{ zhxbB3S#EupZp~gDzDNo+KaaMbqvyrV-{h;IKPG$1j#Lj^5k%5CGR(dbXU5Cseo~e7 z%}L7r8m<2HGcYpxe%Z_)og;0Xz+Y1dCdLmgRh%Ax=NV3MAav8V#H3i$Yfq?zECS&4 zJ96Mf*(ge_mt3rz+>hD!y7F_R+AJ^x9}A#3s660&ztU_r{;Vz^`HqvPUYh8Trx6Zr zD+Km_QYHT?FW9}G(S4R0$yNjap9|JoR1vVPtV#;-1=E&0U4S)>-6KGT4B(@N^mpbB zn)%)JA&7-+>~UI;+!BIenCt@%RxR+k_`dis%)(Kij0pp;8C*mXXDM$h|EaP$Qrlfx z%DXz!T6NbaY#GObh_AJY`I55oU2yBj0Qxs5YQsEnn_J;4beiv^=ixSNAo#HRC{*-1plN9f|_!VIwaNc6^_2 zM^{(`13@F2q;&uv^UxH1;`Iw}H<%u-F>3KUoIu^si+iD^(i0by>MycDWZElh6GoF7 z0LNZMANTYDA;!S=UBkBGw%pLoyF-5-fU_~yuWX2!f%vyhGa!T)eMfkjZm%sA3HOmA z^7n_t7WVg1Ipxg&?j|9ze^RjE(|K)R!-PA$#Gf#jkz>eoXgA7Rx#c=D%~{blE`ghq zyVi7DJn6Oe9!L;yu=GWch^x=F9=Aa^wAQoM$HI5gK72x~c62NokWME(e-Ij{uBN7h zD@dw=@r#?o^>#=_B=mF@iMbN$OCp0ODb01xP+0(zrO(L#Olpx8HP;ohx#WcAW@!16 z#}?Z7AKN4^InDcF!a}Vad9D+FN&2V<;)ls;G4qJyC6_{;jg_=&Y;A0kv4JgH^8z}M z=)_z}B^MhEbdpxWZDkOgB13$U&$&ztTd~b__Y(L3gfk>b+0CB)b#fwm!g!jTghUXA-IX@FKo_7vH31;W;>L zX=5=j#N^1z)m6)YTJk20AJfm_d4Gt91F_9Q09~OnM`id{FoQQc@%*h$lFoG_j_q3OGZCff zQa#Wt)QDwO)ooo>L?9Nln>DL}K$*~bkzkQwNZhOVpvzNxqU2lgLLrFT4-Enb$ZeqP zzvW1?VNF_Y41s**)%=0MzDm9j1acKcNqy?B0`aPfZSK$P=fYD|>7CFPLlP&^YnctI zKv6Mc2`NSbEJYgbt3+8`$cGbU_Q*tk`d%FD1QqlP^_K8MU?|Y(XelIxt88E6LiKW_ z)COm&^k!A}qIt*}<0|CD=RlQ`)E7F^n@Z8HMn(i_|FEtK&Oe(e2Yi; zbGbu1FXNYQlsB|H5Md*rYNIqb2P_DgQFj?x?uY`;2$jedc51r4%`&O$NL=K0p=hN{ zJ6n(h;h-80f)4}_7 z-ZOPlK)&HPfr+Q{G;nz1<3LomF6DbWa;)-Vnj?rpv1Z9qTFku`Sg?P=X~U+5rC%o0 zVb6H`EcsnNM4SC>z&Op9Gwmctt3JC{20;ERWAE(v*|k`YrhIUMw!Y zC*jF%vBZlOXu;lvHE4^v-ujrQEqp>-Z?~l0%SX@T5xzg%=vAsAz3*XGjMe)^AHZqI zJJ28D-!7X4^QH_*xANh>$nr8UAV7-Td^*Lh1%d{;Ax}S_|=Ln28$k zWnqh>ALmj`6r6Ozw;1r(k3spjEiLJu7kP)A7U!V~8Jt=syvR0Dz?K_O+J)8SHndlr z+L0X3rwZS|hPfYpIG;FE2xWe`X`-da6EyOd>`=wNg?)(ZgedUEi)mxnV9o5ee9R;# zTr@d?U^QcJEugrbUD@!u&bhvVED~;{o|#tSV@EykJYfs>(A9qQ*3vR$B#*R)?Xpq8o`yXX{t~_*X7wg3F&?;?S?_x9r!$IB*%WT<1l z9D44n@V4THGQ?T+>U`3>ONTHKP%_~jt+0~e(Qm$uW@W=U#-t)^`$BHs#iQLWF@#7= z(veQCAjD)Uijz*0urM^w>{WFoT)R<*{!-Y}l3n`wgLZ~GLDEjWvVp`Y+GEI&p+LWp zA)=d4r?S0(#46ci%4#AyMI~Z!6`fjnk&30`8!#+`* zn4x`M%=vPx%)ByRn?h`Ro#n3L{@l@gqhe@K6h1Do66sJskqR)GabjeRk+c-f_;Z6A zW4_hYyt$2X`7w>he$#lbf9|yYj_#LBP>eOW{LotG1cRv$;{U#y&){TrDV8Wk^jlP9 zSqetN(KwH>G0ym^L_rTbbeM`)HBg~UJ@4f=%G{#dk*2z<4kF~IV5h?E!u8ff9lJ_C zMhAP-2%m}li z*RahF0;?wEcEB)XT5%y?3SqJ#uyYkjo}xN3^WW>k1N)3>5)h3^HVTDbA2FTzo;n#tv?b_LC;w#DWvpr*bt z2Uc5M_?Z_ExR`6^XTgyeUL8Cco}0p-r&TDPl!FrpG@x_9!(hW42XceFc?Pn|c$S2F zw@*tCPNN-8CVS#!EHQDaP_YDk%C~AXAwZixch*fr%HPv661efN*l0R1t$##4pE7{? zFk4`g7Y@Q%iqa9K=N0DBo*zWCutQS8cfuSS1krDV8?yy%fiPHQ2WfLTY(4@AUjy3C zNRmUv11$R(%LVyvm7LVhvOd_+s3yM$=1RQ-6-wb^BppvPuIoT{JdDH`#hK2MKh+z5 zJDtW|9FUAyaRC4VDaha@Ji=AC z#v{IhZSrWQ=nhlBRY^!fQSFu-7Np&^q5lC==4?0hOH>mx%7aYupQG0_p*@vTvITF0C@a*`QNRr! zo2(e?*;@{O+ePZcPK!VGrm9(u0arKQUfG0f6MmQpOJC)ihb4TdTB-%wfRL%mYU1lr zarUm&pUY#Mf@KpmMc{fm6=Zo zv*@ih2oL`$3m0Q|JLy&cv-@NGuy11{w(vdG>+=@GQzn)8hs0h;c`j|9UXq)xo{(t) zGkcgOCec_V5%-ly?MSCPicmS4fwJn7rx>WuQ}aRGujvrHrY_B^k{Cq;MLk)cX8Ob6 zAmb5eR?))Qf|Ry3>EeUchm%D2{?=R=58lRC4S)Uz>M3l(g_q<`GVRg9(ENjp>$!!) z{hip7iY834K&2MZoISIL?_+QC_q2-ue#QniiNQ!&EQ6!bD0VQ~w!G{$3Hv^g(q~{M zyhc8xHxJ{Ndf2x4gsanaEB5hS#ZA9yjD0hkatX-qht^dHOshvv&0FBoz0XpG*NO+} z=o2FArL*vbIzKack4C)4PMB2CIVy69tW>mn5EaPQW;YL+rb)+TXPIWHYrkkww=Xx} zrMucuQ&u$ObSd{QV~cVXO|@5EN=l$&(Uo^qB3Lu%Aemv5+KG5%Z(9n;QO6Yjjg5~M ztZ#~$H14MOijA;uRhF3vj#WGh0XAl^Bp*IYc$I)=d4>J(y5m|PY7p%^U|wVeznVNd z3=%a(S3p*Yu<>7MmILhlB{jfmNxn-&DtY>yLEbu<7<%TBuy>Uq8$sWy6~L zr=76hJyJiN^^@DzQOw#tmhWU`IH@&V+dcZ!1I$?tPdIm}^hqo-B z@xCf2NJy{el9N|}la5S;aByTwBsy29Yi9<8Bsb1w%GaNN(lZX|!Am_whm?+w=r_bm zt-N^p49sofSJokLH?*!Wy^3?&$Si_8>nT2wXE_2Ttw-sylf2J&RB-KzTMKknNp?vf zf7DO&K@;7Q8LcN|GDb4S-_`dGy$to;YyHf|xx6Ybygpnb+2%)3Ya?Q-2;c+Roz4Bb z4MoYN3a=|!p$8?|N$k#~3!mgCbCB`ScMT&Ex;;pgN{QQ&Gc&T=JGTO3NTPTBT6A9;R{TjO*>~?#h-9k|sO`F|}D} zSa@IPL||bp6KyZjf|UCW{8&D~)o)D2#m}day+GVbq63~6*QKw-Iyt&j7)A!zJL)gtz@2HXsg|{K59FAHMXmv|a9b=hF+`anZIFep7C(FAe zS5@(!c%pK+x852Y6!M7(VC)* zbjMkcgxkvk*CDs1>L|X{MDNxf$HP}%qpLO>n*A$3IHZqudPE1O0Xp>mpokMfvyn!a zEmO;Ia8igrs$-`sXJT6?7H+KRXB%OKTEeQJVIgH^5HgEE1`ty8?{225RYp(!Nf~(5 z*?(qw%IhDiDl$PFpEz6Ap-iPlcUP6GGL0zZ(IS&wQ!z*rXGX;lvvjsj>#TmJpCv9V zJL6f;)S%2TDJgd-iM9)OvC+QknY?C}mevFGUH@cE8qaM-o( z6T{Qr?baR37Gs& z0P4A@??cc<9ul{@vpbw`6JA74YjTM$M zYuGdsQwf6CH2q4ihr+)$V`VW+o9a(a9UF4an^*B1FiULxS!WF`9&DWhn4s)xF^Jtp ztj&+aOWX4?1r0^`-ZwVNCw(m``O>URoUuWBlOfX4f{5$_=(|ZUJM&2v|LFNbBg|1r zch0MMKzcU0_g9=8mq}^6gqFM5wK!VV3IrYyt9|fMZ)^j+f(&j(?YkA_ znOk&wn&eo*w&2eh(Yn1COjZ&YG{27PMZt>sUT6!)C)2tHnj?FS4Gd@W0LCM7^u8@H zcPc!O-U=T=xn`iTR#>C%8JuD(xywv!ALDfXboQd-GQ;7aUZ_-*1H&y<DqzjBB`o!Gt3sD^Eu1X6o&-3U@{(M67y_oDX+|$G6lp zvo&XyKW9?V9kpq)@z#8w5S~;JY?)x=Rr5ymOpXAW@*cN~yF1y&)P#KgqvaiD7LTh;?V>m8e#-HRChwP+E~|!8^auJ4?voIifQq*#bI3=gv=mj< z*$-OjAi|eh|B&~A67*Cl1cC71Fhtw3AM3L6*qh1d6BoW{X<0h~3pX?ZFR%Dn*C4?XuL@VsY{t(4oUy#(R{_F4WB3?D#UvdT%xyd&KouWdg zDCB9vur)8k4+Ll`sHKwU_=qcHK4J)j@?pe|8+c&9h)3mem5QjXd@sus^O|=l+R7c* z6N=DWQ$S!_;upNdOXXT$6M*Kr^*v7c{q4eA(|EYU1LqC! zC60Tbd3X58wE|+md6I^JW^k`yXlRzFh6U~}E!7lQ&5!W@JXd1dBP4BV5NBd=oJ&WNPfw`xuqLJD5Urj-ycQh`t&Wol3niN4&Zl#@`OdbJ}mzS0mp+#_k6!NaRekssY79s6B>g$jm|N$ET> zkkCN|CroDIrP}qRE{$^hpCzV@`pgeBC;RBBa1!g9UJkj{yl3t0wP?T@%KjpKvYm=V z{18or+k)o1wHTa%1P7LpeKIcceM5Co&4rI+Y1aVWr?BCm0~V8lZD9SImj$|24D`;? zF%51^fL(rt(quw(qgGO}t~Y~nVN>Tp9kCaoQ&TH~0WLdlcxuR(7z`38q}6f2N?O$q zIF6navYeRc&*WtWwhMX_7dYwEq%qq_X@DfCOco}wnV~e*40_0P+nJa~cFFB`it??u zQ>T(^q~}V%+)#i;a6vexkWBHr$bh!MCNQH1zaatf?^gdX>d_+KtABzGu7LE`@Qt(+ zf8}erDsS2AcvX?rf+6(|fPU)|?SgG~@e>sPIL>4>P6(zQr~dMFJo;^WJb5iQcIfvP zE;cFhZt6{_w?{Pvl~g!3@cY4|Iva-bcZt+#_$61b;=*SyLb9LqoY4U{NK%j$vL$ne z`JREw*rOH&wrqj<7;EIBs5!maarqyNDk`*m@-t+7W?cTe5cFqJ%V2FO)lUTLLc05F zNg#X;3E|l&Lv_L6m0A2`GrFL3ua?aB*?A?=5psCJJkJy5>>H;&&GiQy3cnFee>6?j z3wb7Y=7=0;(8>V1QWU-l1WQBU6(|R?^jCBut>(I)v#}CF{-w@>8&Y}q zr;25w;gfC@yP?R@yO>9<^0?81SVsai9Y&;%2iQ;Sf-KeZ7hDh6sXJ2^qffgiXAABM24xR!P_XWXfl$i?-b@gDj(%9u!7g6cnw!HoC|ySo8O= z$yO4E8Hw;M!V=VZe-AN6=*T*rQl0x*?Bml3o2+zmZhC9Faua1!;hw@tdl_{lz`REw zAy@~7@;hjXHac7{f)DnnTE8qZp4vNoWv5c(1FO!__gu+i%1RnD{iu_9C)Y!pjCFi= z6!{`jLy8o-b2?(w(-S-13%4I;!*}iPPUcOp)>Vb0XHgcPmQHwkl!Qz~ueZB?Oe(QH z%G(Q`m+mg`84U0h$Jqs*Nm8E|gfS?s*EWQc&f`0Oa%?&bHWt|MAum*~j#VPshxy1r zPByHdOO~uhwAahub<>(>n3sO|VrA$drM5(0e*qK#C_0*^j#LL7xFy`V{*eBb=17Eq z&rq1X?Rc9lTgRMAn2=Go*tMW^PXl!r;_k79(6LTykHp?j1@JSW&^pLUu}TACqyq`{ z0s{C20!}>%9UCPAE;R|=?OEODNMMcORl6gY`#Eav2lyIlW+mS!X=$)3e-%vbL(`+c zo_q%G2Fh>JtYj+-WeND4h_C#6>T=*Q?$$i; zI`S6w{hj)Z#lBsM-d|DRM+SzQgRTCo$*$aN@@w> zmOXT9tZO%lZv-&DVVGCiSD(QFadS=gy}!kWxOe$Cf}Wpfuh2c zS*sbcA-0hS;wToGV=OAJP}`!bw;f9`=vQi{!Z&;C$Bs>Dx47MK%Uim>Tt93iBAO7a z45XzkX&Qzr6*sby1~Lj-=qDQDR~%$&#@??R{~a6%4z)Wj$3O6YW%L=3Nd8ATn%(V8 zRbVN-rIE#J6sQXyo|}>TU&z5stkvjkL`!<^RLLIv5jm&1(HV)21bn zI@_fCdb+v$+2}w}Gem~MWU6M(W`16PW);@IPnyzYHY#r^L-L$}XmbP-O zW?4@;EW2}=5648hIC@?`mT>;1Z;`?I^lT|AS;5J83@#9%eZM^m2-^d|R~A+x3iw6N zM+^@tL|H_V`GtuQ{xu1fU(5@}3^j2zP67z1enTYVSmu;YHJQ`-ELBrFQf@l;oai1f zhp-_3mmDDbrxzOy_`laZKTX*;*|JLy91R&k|3C#~)t8kyqALDlKWk|2IPBUdI(JXE zu4D<%*)=B?HTkpv_-f+nMdeQBOHUSyjTOmM1j{0F1O=zFscKmVm>ij)JHK`v0*X+7K6; znyUYOcFm5hJx3=f?id#bqMG3INvY-xbq4>{RO_Ay3NZj*{iHx}bu#|dC8Kt#9KL6& zIA{R9Yw$oQfZkTf!1~NoTgd;|t8V#N{~s`~=rlq~h$!fSiQL>-gGCckG3I1+hrggU zj7OfbCuDSNKcTz{V7_6UQAAq~oX7-46O#O>P!Xa36lTKpJTEzr|J=~mO2nmRntn@g zb<6t#ITtfBy@`LF(@D8z1^u=&!$&En*$@5N$R>N~4V5-`RKl*TJX+7Dr-xMi`Y&Zq zES#70=0o*b)o#j(ZPRhW%4O4O=IbQjm$LGbGTzRo)|ZzD-lAxZ=kw6YNQ;dOsy~hb z(p=DY)KzBNj9;2TG>0~w!z9B9wu4$Z9|uwo7tKE^Tk$yzfTn&5%}H`95Kj=$xO>uu zi7j)fY9Avk!wLLSQuapm#pK1sZUxOOTZ~RPj!(s0Q@(B9Rw{>}$yWy)=@)z4V=fke z{e)-xh-olJ%=HCIDh5>P>|081V1-80sZQmi>TQBkM^<^sRhy<)&#aHok9V1uPVhf; zEjdL66(u%$rpTp$|5#t=#kA}x@jvjyoz-zBj(Z9WD%R#hOe(N7b zL^qL$AC6i`InwKi^Gv_iJ{%bN1olew@8+xbm&fbR@l^}{CGssmHw>+_PF%CU{g$%* zI*iJBr`y<`_yq+BAD!UnCc6@u@DHM6I?(y*dU&p#LaCiP9;F-vqKz|)(zIkH+l*@> zJIf>5^-AQ%x~2f+IbUHv1-biieL|-5^PZ|cu~NE(kl$IGOg^eZrm(`cMwnp13Bq<4 zA_xEh@sCb~ixo&RFAxBH?Upz=ye%1^GyuNdRXY?9B)l4FFz{bWNN+vE5VHqKZVNCo z#OM^tvCSX;sP!wNL2a_pUlsaB>P@Fhrj49keXEb@Yx-6mYuDs6?mC(=eG9xlyj-tK zRFzx!!E)r#xPF59f0vk7c8r-uK+b@%^sQ7P>EUtXZQ~jO?+F~Je{f^CNA4^1|FHB5 z7qF7$7g?GIw)^JB)`pzmet96v#++1@R<#!X*Av+iddPI0jF8pLD**G z7hFEJ04oxC6^JCb08#efNPEP;zKHp+F9L>-6DpQlI9yg)r_smJ?mClU(yOkSd7+Fs zUf|7fn51wh$vMfA?com;zK%$twh+XeOYXZlkaU6=d*vP*FT%v|iMg;X6& zF;YC%$}2fd;qAAdPqLiHmUxm~KkJdiVs@P8)|nKvjJm<^4i6sy&%Mv~9}fm?c*c>Y ztF@<5=U}Fqr>m}lvuDn%k+rR78J&|Eg698;BLN&h z6f1w7&rtXMH~f$V3jf#F>|0daB&R#gE@i+5{GCgvSZb_inemcLGhBGx0DlmIS`n%l zoRCN+g4qfbW3rMg8eY}ho;i1&Jd9qVPydzO&x#Fd>W;Za{|D3YUrv^zyI`A|e3S9> z|0(P$z@q5d_KK8rOLv2GNhly4(%rQ*(p`ddNq0zhcP=g6Ei6h%hm`ccpuVr)fBkWG zuh}zaW_D&yJm-GyXJ_x!f+ck%jA>uUwX^=7eNCFy=G@`voS7HsP&QGcD7`Jp8h3xs zz(FpVjdz!A)E7;<(KrBT2D%avGZ8U`9M-D1he-&40WmC2?rMP<$y`I`8S6@nv|XZ% z`64E7&hj!6r!;B<+pTrs+A2DsU1G&ko*Z5aWs?o-kQ0qpB zl}r(Yn`(X&FsjP1F1r|AOR|dKNB;3KNbe)uq?81LL?ePe7(H0EPBD5e2%aS13IR5X z1sTr-79Vr>yIsUFrK<>Kw30+Y4A9Q{^&Spyv-?y!5TvbVDr%#@Fu7?~-hX1;&WL6Z zz5ETsg=@GPUD_og-RzsbQZWkc&>lGa?FLUQH_f8oi?aBe*>WoifvLvtaI=V@e(BX+ z(jgM!P@zY8m6yY$d?k;QzJqvff(1f)SAK2}KM9%ZFlGjC!uK9Ene^oSFAYqkcH4rg z$Zw`F4EE$P*y~~$U*a6rcp4O^pOs8~ZciooOg!4Yp0yVh1#7?PCKR6NM}j~sD2~Gz zBm3#C0SLQ>T%``0h&>DD+js$A3Ah@Lu(5)&$X^b_E>}$Y2Rt6m~z7;Z`>ylLA*oa&=m#B#d1@PVM zewk;X8S03eoTQ+i@BUPfrDh~c%979+b%X1DQ&3^N97ASAhx79 zJsSp#VQi+8XH3HaenO%Zd6~V6`+QXLL}E*kcGv~+8&a%4lMg_f1y8t!BNwmfWtnDy zSf(W`qOw#I*XafIgwfuMMoodwmgtm{_S!Cb&O%!fDZ37gT1A}6MVV~CF|i(*!r|BU z$Ow4lwv<3Y&V3Wm1<$ya?MD99)G`lR)dn~R4-e)nn5;Rk9 zacJ$w%a7D;yR#dqSciaRgPJESPB~wT!|FY$Pu}l&*uNVB*9#<~B%(Q#TuZCp3*C;+ z+=KM)P6i1MFZV{Cd(I^^9NMNifJFjo=^4W??fMe6C`l4AeGzHTJdO+FtOC#~JSBoo-*w09!v6kenbXJSj=D^*Jo?JI zx-hX@-^V?o2QiiSD(kXP%v1z7-Os_j^2s99i;htSe_ms$6 zGESR>uG3?4;=wvJ2G9u)}QL-mokfT*+>Sx=`W&h{Pxu*=@O52m)}khIYz0)HNO!=qeaSaCB=yA z71$B>N-FaCK*Urt%cXZ{>)Gyotxc5;yyc4UT2n3dC;fniCJayZ0ZnkVrlj~+0zI@W z!*}V8+m9I`uE=G9Dp3OwnBOhlCN1J9vHwJAzIyT{TQ&I0|)yoF`mub&!)pH{U<_ zc%(Z5J5Z06@@vtIukvqlnl)gi020X_7wE=muruXn$u5|PJ`<2vL z>TaHheFJvnN=6X1BX(xy%j9lmu5HzEzNhui$)7l3Z<2pO{NSHkx!+n-en86IrNWmk zM|OO8i$gPN;I3xj60gl?1Zcj9ap7_k0p?#20 zRoF}Uu(-o4jTMc-OiqrD*Pzed4FIsPLom57=nazKSLK}_2@SLWQutn_(o|-L9xu5w zXE~YLW#ny5M_!E*nkCUK^O?E$EL;V&*p%*UxO40q6Sk1;qOQjgOg*s+JMv*5skDW$ zMgF@xsM=|CY>GZV;gwZ%DhA%T05~bb{X}BKf5K>190QjXJ=Jfx%0ePJsXzC(37{T& zFnxn`x~LjSz^j~8nPi}|5IaFlMIF%Y%L1khfo)1XOYQdjOr|ac;IY|;uz8*(inW*H z0*8T@pI-@5?my!R?PgqE{0N0c9cM=t&oz6A78?_NGN3GD5}1dgMX6@UtsFQ_wX~aR z!@7s)HJZaA$LHskf<|LaNfJrih;*9Kb6WeW(SKRuHj&L?$lr)x(HWiJU{w**=fGFc zX{&ZK`#1GFzk^Y0FF{3U@>hq^o(Ch`E+R zC%P6F19?(P=Bj$xq3SX(uS2aB3IVNk^3}AeR%}YGYK zHLqJRL@sOmsWP1J*c4TH-Fz!DZc3^Hj9khJcI^sR3a@N`Z<<+a}7>di? z%zG2;L1R8oy~(EgT-c~AAu)3?Bg3x`Fv%#z zhFyPj$7JkN2uHF;!6XE=Rho%TFG{CInaMX^|oY zv&S8lZ5E^ofb8dl!!`0@MIO%*N>bZA#!clrrcO!LUYC_ps;GptR@mT2OBXBWUt{!K zsPDdLG*-ktbHi0+h<@QDyZK%_m8nfQlD*O)EweIEFc)TB$?e?@vC+HE_=1N{(RK}0 z$MsaVLpS*iD)^GeQ>{-oCS+OeR|Cf>O3^`-d;VV3scN~mM@l#3EltKc-LP6i9*9pj zY=BJ$zKDmo^-d7Cetc~1+_sG-!@b_y<0;ZbTASk{gL|9(yV{9LyUh4g?9Qp!K;GYSi+Fp0xevYw*c_e%Uf5@gQY^oQIqA8L; zR&DRAY6;+5S%ZWwV|5N;&Pv_EbCou0R)Nb6u2w#L2y_vRL@MZ0sfe;$(zGV~FHWw? zE^c?$;T~^93085yoJ-&g$)vhEBCRf{7NxDzj7_Va$%epL-1N)Fxhn~{Aswk4P!m(p>+IWPTsMYWIz>)6pfc{i^Tx;*a;-sT^ldw(}X`s_i2^QfG>B{0c1*9?dg z`EJ_HP>)j72?leGdD04~`Flq;X$*EJMJdV%v~^SYfFe+&mky?YGfz z{**}|Mh(Q7;~?M*GUbv?Y$=!>I&y-+&G5m6pt*;nfrHN4bVO~n@t5hO)Of3|*Ad+y z{wS|!NrimqEjzMMLak-b(tYo`=Cg(l>(w$m!XJVRKx!H4Oy^@8$5>KGB);ybZ|}xL zM~@~Ox-RdqhTy@Z+nN%R1RW7)1(r0@A|df)l|ZCl#)qZiG_j0ba?@zLMs+(EE$=AzIuUY|Nj7@CO1L=KurhNUz3Dp^M&q9CcY5M)_`43%9NGYuX(myhr zzeP7QS8b;;Bp$_b-GB5uU*e+Wg}y1yrPtxaFMIorg$tR(D4Kird(_|p$*DX2nF=~C z9gQyJk=kM0;X@_Vn@OviDN~g`szW~rSnbd{&SPJ2+ssGAf3vTFKPeNmON>ZORd?)q zJPx0fN<*&T3u$EY<1no4GG#PYf0FU{gA(gI*v^M^1^AA5^T;hJkcrsE$6*Pd++2fp zNN(LRx_PI9*e$CkJh;of#cu6I=N_Bv6o>3kHRDiq?X0HdFTB6T6S>AyzS~^B3k4uY z_r7zyt0rZvRvtpNNiaz+@DG;C)(V`=Q!-moo1YHCO#4hp4OSa#MfxG8O#lNcPO7lQ z)`>dL*f`h<5oWY;u#Rq42PpDK9aTmrgt3Nwr7cI7gX*FDjAh}j20P5?niGY97Kx4% zH6V~zr`8RF+x`Kn^Fj1fa^g{AbRhmGeI1rlICV|0#V+xdfoltUe<%?|8}~8Y-9ILh z7n-$ZMZZz8FW0@xiMkrWaI&o@x`GNP`}N%P*di$Fy8AgQKwV{?!62qeJK`p$Ara^#sh^euKpZ7xMco0Km~1tBWcn$^RN8Xkim%w@#SiADC;- zf)4|I!`MLPjBi$ZYdVoK3uMmcXHFJ#UpM96DQYq#g)o|FkK);P9~{0=^k5Xpl*<=S zr+~-SxsU$CO?1cn=luUe=KtRM`+%&5|KZ4givI7de|Ed-Qxh$&v8}v!wL({rG=oSF zK;#~Xb6&9vWmoki8O?kg$~u%R`vX>gvYz8;n_RWHhez{*A>`y^`t2*xPyb#Q{Oz#> z;QuZt{Jlq^?7u)S_xkzh>1*V>OtU|=;!E^<_un5F0DunD3-tde%!2)ARe$BZX&Of4 zgYh2RjlN@l@@b%sglF`!-;<$Eb)api+x0|3LVf#T|Hlg|d$@?%;vuyvXVj~@Srya% zI)r-F+$RA4G!iR@Po)?;n7I61sh?@zK{&AUsD}_yQquaMv8;lO?1`AQWwXf+@79j2 zOUe_6+r`q)$c#(<4jgmcZZU_mkjZYcmx_&G(9Br8sI*U&!>+mL2a3c{8tbldbd7yb z%FvSV3$3P!#eM57ysfpD3x}xrbKa`rYI0!EIIaBC2bomYx%5nZj0g4ccUC5tnH+UR z$-N`iHU{p}i1ilF-D^H`_f974NqM!(49S+c_6>ejX>K;FCm3JRtG_4U%c4;4FX8R% zc5RKYJe|8RyKTnzS4hp5wYnmA4o3_UKre)(830A`23OK8l zk9;%QSlIOiFEe$xj6aghykv-$UL?z`e;F}|P_lhhw#CREw_HONET|*s2^H?#?#*i{V(}{sfGV9HxqijJ2wjotTqmSC&yqzC7gnUk4{-oBJoDDy)v|QY^ z%W??D*=g%YbH`|`*JFmT7J?+?9Xx5T9#HSHbIc> z>M|sUXB?1B7Jd0|!{-w5H%R*v)(80hL&7~|D5dG-0da}|K|0V+J^~II6V3HiX&#?$ z&6?FgZcSeasRLPqX-|DS0R_l+0{{{awlw$Qek89f-yn;1Lu;W75GDvvx$y7%kg^gn z8656nk7Ie~v0Iid3JL5dhT8MKlGx=02D-T!8Qebs+2VX9Igmak5qo zL;Zt~ydC$ZDbN_zgR^_VhVb}njYC;Vmd(;@-ZAx;Fr;BZ56-rFoqvjKO0CETWj`iL zMSZiR%C@hRtyxC;eHac`jPoQ5vU4n4b1*+pMDkZrp5a0TbfQaO;rsV~WgyZ!;e;A3 z7Zt4f(WC_`%3(>$A%h{6p#4xV{ptpwN9*(Y?6Eljzf95i(g2is!;Z6``GnRj zxFpMruJbn$cM_Le(8W(mV3tx}`M~ES|KW4~lZHFv=jfeZ6f|Ru#cF{vEJ?x`DY>q*g}klZ-D2t_%*c#$)nv!Vn0`!F`b4kT{D|M zEqEa(T6#oy08>xga5xLg3lj~JtTU!n#!v4woy9S5s$(6-It*N)i#f}p7mxelL(G}N=Nv{9c^HU&%vT8JTZbb zIh+;pYw|#9?+m=G6N%3=40~Kg^8QRuTMX17J^G>^!rQwwVvCJ1ldy7dE*=-J`f&ZJ*KYf8;Zk29!TNXVv*052dDJ1K{HEOG@s!ot z{H9+d5!bwm0R@N5V;M)Pycs+a#Q%+6HHa%UY~z($+bcVFJZ5?hZz_+IhOJ6 zon6X$RUQ$?AIMT{@${0nnSRIKsl`rw$CxrxXv(5IY&>Ur?yY`q2#-0%rR^!mB#Rqk z%Iy6^CvTR?hOnkzGNN8%PizsIj)ElrveD*C`Lc`kvXhU@d+hzDs3wT?0u?xHHNtaF zG@RyRoN#ttji_5t;)7V>B&xkBU*zGrM~lNqpM z4}X^D6GWUn>_a>_Fwm_G(@EG9%rC65Kuq_AD=NEQBZ_wkd}P+ez%J1ISt_>wXbjsa zCA(x2>-Eqc3fdQSY?dDYm$T=@!`incLF!r~KjiT&5d?-;QtXGthf#?QtY0LG(`#vs z_U*;i3A~AFzFKl3B$i#MzaZA>bvBPu06W*qs_>Pc9J&Y+Bf501_M~@NRB4YgF&8<^ zN9eB+ge37>?Gm5CbBj~^7{k$YGQLh7gF7^{8it3fx0@W3Gtfsoii{h4&;Lb|%{4%v z(>RPe7Pfwm*8EIhdcDXufV~ZD_0=hV`eV?6CqiZ+t+by>%{ow8=d0BsZNHclw~tqY zfC=1|Uk!GF%k)gJ$&5r)Ci7y$SV`W3W7o;d$>ouafEITca3(GDwJtde>Cr}EuxbhJN#Uw^fZ?{f9x%Fiq3lS7=&tthj(|#! zCZjj7*OW1|+bXE}`vMlNc^AyB%s3`>z_TWvPjHSZ>TkC8tdL4s=#qT9g{>n(BW!}u zV=3gfpH<^h8I^v?i=7s8?kn=wR*x~!&K>hb=8%XWjw=lEiI31X6r~(RYN1I5p#{$t zUzs_76K6rj)K^1>&CbZ+6eoNMm7h*T6TYH_nu@U)rOr#A7=3OjaC)yl;2`@yA9W3jyW$&$qSUUgFaZK{Y@&%}4q zCMQ67Wun$Pp>|_{!NvfwY%fq^7`exmot#|OQx7TJuQk{pRBX@O#7`A>+*EVLc2P#5s7oP2pZKXaz1#3Z>0mlQ>M~lT_3oU8A?h_}Tld-R7UVzh)$l!b% z4m5wLHzLB)9AK%2nK*UC054R(R}yso__-p{vu>buQ7GPs*PL`CLYS$-GBmcSHu|1} zacXlVBG!Aw)9R^~uS>2nN?M35jbw4U+B~LAy_vlnzEH>>?TnLKVXDWjnCKJX-t+4b zGSIG!^f6F5h|aT^W8;j8F*TLYDSvd_hHKfgoRENS`EGT$Wxq%SoiWyK(n6;$S6S8Y zRpyc|c;<8Ykb+@8$7$_mJVzV#jaxbLac@5;3y|m!C{89V;=u{y9HEQ+U`Uv^P7K zp`~qUq+F4>S_hn}V5MJ1_UlFBMpLBi8LsuBEV)(7L~qR1ZcXowQM}U+GAbl za9cj2xHk+`xEa_LCKmn_jjz8r5Oz|U%_ozSdDC=N>RdB~1oIFuLnmy#rW0c?JTpyy zn(0)bMhN6X1_tI1C1%8g@@1vt+7VG>+=yiHESVxtSXv{I+B*2P*^)|x%hV!c8EOh;kcN{>b%O-$?CayC;+`%DmP;|wWJ|~O zq@|)Qeq%s$hdd(MAd>#=6H%+cXQ{9pspzoC5`R`tX49#93_a&j*o_<@$9pu}Rrqmi z-h%)n)%}UV(W!0u z{8>IFsu23Kg-?I=%SY|$J3LEI!~;8o0#1*vBx z@6+JQBvo^paig6G0k<{vEG}*wI$de)83znMiN+0gl0K6tz;T74zR2II@`VMt1`2Dp zM5PXoN2q)FMEZ-K@q8krMO=^XQ^MtG+~G>gmW8GNN+J_E{TXQnsEi$2;Vw*7YYQho z;j7?7b}U4$R7Rna7F=u?c=k3=F-^ZMzcw73SNT!}rF#vtWYXk|2F<3#@N(BTrFP+% z$_CJaAt+~Ago7neWG6Fv5{j2pu1ixn*6F#(Y@d`%zGn_j`^O$EHjP;sN%6si4;LOS zp*rMON<5jJmR`>7qp3xk=rQlf%3r;;%Os?8h%lOOZ5mDw7?%=hMlz(f=lP@z&1d_Z zKQ2HVr&>o`NlKjA*(xoSa;WPgl3S@dV2YPa_ePLY?v>?oOW01(UFWS2DF|`8B7vI+l76+B}?E@_>hckRDm#p_}Qk%h>2eo+~#I^AzGYY6TOAWzTh*g%8=qL0IRYWdb zp(<bw)!*6srocFifTm@(Mv7G(oiXtbabN{%#DmR zWQOUeMmywmm)Rz!+GWuZLd{z8Dt8xJ=K6A`>*BSGuo5k7=?YbA`}BMFNj>M5s=j$n zHEmgCPb1A*i>dPNR<0kr2X(kPrpwHBsfu(J_2)Y;W;(6__BBY`Y<%*naJTO&yaJI3 zwoP;T!V@X9Z2E_$cHbX|rd5HT)NBsEYZ8Vr3&n;6(#40hY_X;c<#yvtMcq&7r5Jb@ zgLk$}K&D(faBt|(Y@D2l>8l91Az?FjOrjbBfv8^2tdgaBl1ix`TVp6o}pX~3C0cvjxmj16{6Z)n4EDA8 z_qaahVhK|&mczS0?HF@sGO965BZ}bW(_3Ea^NAi&lKIkcM-U@QRrOQCPgyEnL_P*8 zPdyv4WLU@MU7G!Un~hpvsfOkL^I%9rc^DD)9}88jfq;R4fPg{cf#CkVK@4&KjsJ)IKaZHOi0D5@`hOD~|BN3B9STcKUQX#BW(@=c zEe8aI(s2XyswJkRA_xQo(**>CL;wWzmn8hEwNFloju8k5ck3VTpC6F^dbsP6k&S^p z5D*^qKmNtPg%?<$xKPckJxqas2rz+wM(}`u&j*$^a>dL|42*$*j@ke5SpR3(CnOr? z|GU2V2KsqiX!4}Z$lno-Q@cx7crBtLa z!s!SFxh!EPt^beC%W$z>PFPYQs|B<}X?=3NWwYnfM{d`|sz&(wLHj>zL{L+{5ieD0j-$Ev1K&ZW6NwwbMMG z5b1dO*`m48lj~CpY*eaPt#E}xC2YKIBK38N3A1o+imAeBIeN42c3K zCAG6e**R$o87=X$IQ%G$a0F2*CNWZL0O$ci}GREk3m!)U`_y+&-=`0o;MYE1-sAB zV5^2#`ei*q9$^KhJzQt*wMWAoTG4opErGY#ki#-DM*R%3JbShqFh*(peBeJWTO7O3 zGv-~dq9|Q#(!-Xs$XH=UZle<6?IzqKPlfIk=OOo0yhhw;Ot!4>_l?JHhs`53xviPD zR%7H~a`~psvPVVL`_c11h4W`|WJR-ha)la8KEY&5@U2EFqTz z#R4M*&i7{WjqR1}W#q}naKd$$U@`$>&;GtepDt;(^Kn6mnI#z=qD;&>C>_eDR*|yv z4(PMh5Lrs3-zwgfvpX6;(z9`_WbJ#Zp zd+-x=TU=%aZZo%8do2i$OY&wL_=T$KlbfL#F^Y)vnbiJcpLW$Bk_Yhb^Qn zyNrnYXHi#zqGhXrij*)Z0N8MeWf=$$1r~hp*0y&w$E)5{ixFSYV(iBz3?jcPDNP#Mp%7RkG(HcnF1)8liQ52cc88k!KKG0)#LUR zXXeo}(h6cvv=R>v0mDJ^fK`3x$sJZqCh|QgnQR-SItn*luk4h~VW)K22un=Jx3z~v z_EBf}xO05L@9m zPD-{Ta(7CuVR^@=Zyvt=H%>UVqup(62zv>xi(-$M_>+g%D{==E*#l1Qw6ljM*%Ne* zoW1>3?liTB&tI&)qXZA6J5yTj2!6wmZ}fSGdGCMpkW=^tBS?C+|ALpKYg4U8eNRjR z6tyMACEnAvDBQ+*9Ba48Op2?Mlb|2sl@lrzl@f~sm{Z7(u{>0BiTReZYS!3g`?cT} z;hd=yZv3wE_2f6!GNJFtfPciaj=+ZpnFp3+e)71;i!o$$`W8iMpHKO_GG;{4d4WeX zO?G-eEniZ+b&fweU^H7g2Y}H$pJw&otvai3%71;;Cm+nL{DO~NHH&EJkq*wy<%AKq{9C&)JVlYQD6BZif}74vp+D-d6gi zL8uz0MoU{Tf4`J%2+|J=myc=)QD$95S2}mUd}==dB{)imFHn0A0Hy>TlDlciiW328?CdCEI;D?3lrS$L< z1=5t#TaIGW>@X#B!r2p*sjg5u2a4DdOt&PfBM*EL%jJ+COKB3wXiA#mlBSNUZ3h|t zkr`!w)pH4+LcTLK^iOKnGt+PR-DS8A$=#(@W*Ll2?VN(7YSU==Mc@soq~`8tb%lRo>=(7!QCsOa(YvhK z7)HY=_sImSOsbqoQ5VgnamcWvhlrv{!LW6PsZC&XBGH1Jr?{B~)%3AN6sh8DVT*E- zSaD%;Dpzwra#P#5Y;F8eGju|WcLJR~E5R}7R}602VOO5pJ^D|2;}Oy%eo9xi1zDa! z!pwQ9lsfhCJ9M1YN7Y0v&0E`dx(?4r23$`2OL$s_X-%0w`*|CAi9r=+}c-nah zAygNL*MBNa-{#JN3{V*UpvXHRr=|c*DIQWzk5*8q99>gtRdctZc5Qd-6LT)%nX8+B zvJ|)>&-nZ?%GUpSM*NY^TOelvb6rCBL$?ciulqJ@7xE)Z{%zt9n=HVn9(vGgk7vbF zGe=o~a1G6ZI~xx=f@)v7xD}}cMJW|!!6?Pi9Zb*6XbXsR-5z5Y*sac4}2Gma^c zXp%&{L4%e-urd-v7wScWu0i%N#}0ZzLF{wmId)gV7u&0kwTk1MNvqVdWCcZCdhT<1 z?e^DVw~|(FM}y+dZ;MI5kfO6R*Hc-~N~fnT!iA|$ z16MSOF_#-ma>>Z`55&oO7b0{!D=75?U@a8GENhqWZ|f?-DY*rt1O&^s{2lY)f1;l_2-FM zsfJqCrMbOTf9NUS6Z{wBpBB8NPE%!R@iaDin>d%HXlZ)7-97Ku4*G|Aq9!A2gx#lx z*})TJZLk-@N07l%H5h{G9wW6|fvT*eV@0x_2@gzO+3;Se6E z=^h~c8Ul2#Oye>wBTFqJXji{I`ROh}eaeecElX5QU8-xEn_gD>Kf+uY5aVu`OIR(0 z$B1Ie0fXcX%a|c8&_zJ|>l+i4qR{s(3l>x$HZhCAr!OlZHwE9A&D*h#f?Sb%H#V^A zo}JM2f0WG-?cwMY^Z2Z(g@p1RjgUQ(yxQYKU`zf!N9>z+(pqgQN{l+kcXWSus(%Vzl{vTj;5X0x7>*i!ITiQOg!-{hZR<}9~Pmg(d{5A zXLEi=?)~wQx7)iI_Wgd(*WF!?+G+}HgE<@-Re5FgnDsjKLg_xyRXsW#10xCzqV_C=KWDydd z5hZXJv306(oRe)T8H-eq_hd!<-#V#+{s7mszXoWDZ6SYWGy+qY1mU2$9 zT?+D)&O3MVDI<99{8`f5$hX-j+1@A$La%3!Y9*0su~Z%O+|b7{ApZ84*Vk1M)+s<% zQBYA)qghtPTUPR6QB-nSG@hQT=ulR>(A=)!dJgrSoBfdaHE(ROtcBO;K~ql{uC8!t zzFArQ(D1|27jj6VZu_MWTT+O1R4Grdtf=8MZyT|SJ+bIXwQN^4FQHw1?ofMefBbUj zE?0ZX>{(#@(B(VVvsog2te(rc1#GSFZ00R8rYnIb6frK#Yc(%o#w=VBR9PxS@Gce-;h&BPC`1qc<+fIUFG*G8c2RiPJ5Cx)amF{XS~x0> z7AKNOeev9H4>cCGiq6K4AioUn;_Y(S>TM0Rz3fcygd}_tmx)SRH{-8p(y02ms6g~S zFd#UxT4_v4j}UWzhs^f_RKco9`ztfGJdzW{AS5^g=XJuUs%|E9Z`SU6XH*V4d518| zTj@W}m7;AuF^aHmVnn8Ox~nd6<$Np^Wsx|FDKlG7O#Motx-o6mW9CC+XoS8>qSZi?@eN?58=7sh%$}n+{=Y2XfBiM< zZdZ5J{R@jn_qGh_xOC4qOy&hiuO{7i*q6t0hm>uzEwXiGDq%A`aye@iSh);ckLBVy zRxGE3pqh%^%pzqb71)m4*D}WP&X7uXtnwF61#z=#&r(^Ya>j(BgNcJ}_btHEC13g= z78=&5RMNFsi3H~2P63B{ryO(}Lr!@Q_{z5L#;}7l))Mb8)txDXC>>5w)yKp|&XSt^ zZGKPJ$RxzA*u3wJ+1U_Dh(WM1qjX|)Up#QPGy=)FKM4(I8pO6_%vHsbX+p9klaymn z@W5p+D(5OYs!Sr*jg+FWRG@hT5=}yckicZFWp}+9og7rV5D2a$z z$o|0h@nrB1L!!Cr{CG-$xFH~f!lJbKxk++;eiC}ZKbDdCD;fh;E{XPM^&ym4*@Vql zYvhDHeuArqNg{C1>unb}<~?Izp?7BV1GB2PUgQsWma$dOa3wuU-?zB?Wh71U1Qj}c zuW)*AG%sT~XWuMOKhU0j78l1DWB0g~e%2Sqkfpk;o-YTTq-?tk&kr_A6nsj-E>G8F zcfMcpKGy_KzA*E4e?DAvD979;}74PXjwMVDmGK1GLi{MRm#yl4z-8Ke)E$LeD1n3{w< zIO4n4BA6T~Wryn7kx{x!%AC_`7BrTJ1vX@~EO-FL!^~-=i^AA|oLf1b3Z~|glO_36 z6%`hpMCeCuvoLBz&tDl3Ea_RNzlVeLaw+D1T4h4?c`FGtf_I{k%vD z=>gOcoR~XvWu}SpAhE(sB++l~t@6AuY>_)jKyAc`F8pm@6qHv4#)h|+{-aIm2lj>8 zno>5z?Wod{+TyPqv!o(lzv>eE6HV}F-{(C&Id!laxlvX+?Cvcdejp`e(S$&`BakJw z_}E7p)NANLMGp;PsUyp|5w7_vSCgy(Y%W}MFmMM$==B1O9mUK%TV+%OZ7U7zc zzD-yqo9GHwupNkWV;$)RR#pv`DFEmR+Sv8=dvnn15&FwlW@T-~JkGjPl^i>0doE90 zW-wEH)!?TBNl<1sxzw3*8zsFeaK{9{ngjqwjhQQr%3tNUAlWfg%K(o$>h|BVA7k$d}<(uP(M$1E3#YnueH zowz^9vQm;l=~$y9Lxvzi&c<<(R|@eA$e!5qb-H=Ia;t+qd@GBNn&pz&l7|)~a6gyt zUsL1>`1*|v6&bvl)lWOdC2pmTo>3HCtnKFxtci2%efv^@^rUn1GT#`go zpr|bKv*8DjGc*^pRL&!Ln&iuPniSi3niPI}nv@=Tn!LYEPGHM`0|HdtssPJtl@=+j zk(%u^dXvKw#wB$J8Vb~js}J%ulNub}bhodyObc57?`Zmeo3xJ0xB2@DE*ZZn(0T&KygX0{62`DRER+HWT*7}b^T-@? z5P0zf(39Mu!drtf+Wj8c0}8l(w$_89)%}h&FT|iq48TPUu%P=ey8FO2`>^l^kShjI zrUoFP8JP)+(0)2OHBzg^RSRh64bBoB6jwrD5z z2;#LkowZ0f^%xWNaE|m?3d}eK%t&7E0hp~pwCn+3>p^Vl0odq4#3w;WW+6P~0Uozy z_zqvMiku}?OXB8KO$nM3bVa9%j3s5uKP;)DQg9^@iar&&%4(Iw%c+(UEG5{AE)|)| zDwTg!QYj_SN}v@zDzcSTDTz~3B_;lrAj{%&lkgh=4a?(72FtmJYO#k2t%a(j zhe=?D>Y9g%mY>8Cuo3}v{K{@eA zxEDMGA9;*9#hPWwHR9fMPra8u#2Q(QDZ`Ru$u;C&cTc<*K7<-Mj2Xp>d)^GX?LCkA z!8cy;W10AN=xs*oY=A-n2HQ%;+%MG;nEMF{heSv~oXVl-?F>qudCztVxXF{VjV%u& zq~)RXw-ygF4i6H)2|u`-o32P#R;K)emI^HaUIO9^E&xIz{D;KN1`R9W8d8i0m-%0P z#7N)Z#bC)m-$Y;k!Z1=_U;i$2F4_TBH2MaXzi$8t6z&REypL&UI&U8cbkL3zy}~aF zQ&IgPBN7c0lQifkJvsdahyok}9q7Ucrtx3A&8`$@ZqZGkTzyY@pdP>yb4QNQnkQ9xG zuS6cLQUp+e0auXGl%A>(dl!X&P~JvJ8zBZR>j)fs>@I5xnRYUv9dl_9V>^h~#`Jnj z#2q{OC~OqqFy(G!Jm!8L&ubz6S88ISp~jk)Z36I6$Bo_)rd)1ZUWi;-C#lSOtjudt z?pWD;Q5%}vrhQ%8p~gU8iY9Fk2DZYNfN_+k(mI7Oc=l~NJ!$zGUBgA7&|$+an4Y&sntNk zGn4vc?6oVinYpvM$$p%YY!khcQ~-UJ@?Eu+z6KmwQ6@af}DXcd9&Np(% z9mw4djMxOsA2RRN7kHXX;gr%|38LX!+R)Xoz<-J{$2pQ;t4yJiB3S~A5S-A!tyH?i z1PegfNuGc{a;8PoHNK_Fh^aRs^>QoXsE8ECtwrq6Cpc|Fjvg^Z{6hy<-aT(+p6ST|*T%$~V>SdM3 zUuhZZafngvLpgg>g!`S^Qu^PU9lRD`JwcR%>MNDPW{F-3OQ|qgYXz8BDMrw&GBMl8 zW1=#aNWZ)0CsbT!5M0^DnXFG`DCAX9929DWmTts7;6G*5Zh`*l+RQD17v}o94bwQZ z43;=yD<~;dT`GpQvsJvaEkWsn1EGqiz{dJZi^4di!JRulJ@4(5n*9r(6 z*lwCOmw{!Rx0WWX|>!+E6v4SZ7)q21Oq+%U+g8x|Vrk#?3N}(z^>qFO<}a z{uVHt_e{h;d|io>ha<_!>2@`e>GcTAKtO0Apr@RLsWC)+P!bTc!o?uGC~2PATG&wA zRy894Oz~T2f2_tyt#hEVB5jy3&$JzKoJBMAQFLL7h?FRfIF+&WOXBA$qEk^W<9`y$ zIaV)TFeh2l(pusmv0K-B%?|UR`a=FG3zXtg8*iW5!dj_w;+gXgf6w;bYCD?HO#ucp zvWL0Nt2X;_{4~GD5L?HvmPM?;x+~RQu?FETrV{uqGpz%hnyJi5{jR03e0neGi&w4f007VO`%Sx3?MwbN__?DT5P|eAu z4eGlQruPS`3(~77oKL|A*$&1ziN1J>;jE|8A>T}cXea{S)61EJ1{wS!L#GHv`knnm z*3K?~s9e$LE{>*>e4Fj+Py0{mov5V{Osg~6GdZX4^2hggDQDS?@lXK*I4;iu%|vR! z`OnqW+LV8<6-dUM30EsYc>T#uv)bQ7IUmr?tsL9O^#QrX)5}oGdemq1E>vk*ONzkM zDW=b-qGCBRy8k9uGEiU)c^iX_-A)QN>%*Xd_zgRck!$Z{Nlp|cfkB7xU|vnuF@FNY z-MrX3>AUNIYWaKB@5ENn25Q;f;U9`XmFnkazSU^^=oqF7u8GGI7x;O=FJ|)vV#aLg z`T{tT8e*cum{e>Z!HQ-;%jP$)spwJTrXnwfGeeqNBUzsP^qLl;xoaO(8myUV+fLQS zh3yi3#a9CFe#;1crQ%Rk>8t>X8SA7uGn3erRbAKJJC83iT8%xf+btXF@~UbrznI~p z!_x0`^6(8nK#KD4dO#2E+1XJqioY?(iNV>HU?IY>MuI!Dh{tiD9OLXjHfM0uz|OSe zyIVR@b#6#_W_2-y_Yf@NJP52XEFJz=N`Xm=oJd-rF-D=9w_E*i+K0bO-}Vj(I@-Z< zyTUxRdDj!u_fOU^vxsgP#2EiQxKT43@Y&;_w_PqH*^+u8>k`3NxRO9Pm2 zT{Wk_JKf-v4}WJ~AL&L9-AS>4z|^CiO)C|#gCq8gouBH4sLvnkd40O2SGL}>aw8mi zcPEs!&gzuX4}E`R=E95=z@9!|b@z zTU9w)Rx7K_;?ZYch=1Jf_520<|0EC4w_AG@rgnU_;0YOMlx`hZv#OE5n-%BupYW>R zE@(twTJ#t0J^=3d_BmQ2oQelatXbrnwInl(0L@qcBPC&yUwb9Hp{Ui03VvJ~(xPX8JT&YLiY} zMLD;kZSXW_GuvC9Gc0p@5(%cNr<=0=C6U_g{o5k|z1ik=tSF4-!2(x5x-wNK1w9dw zZbcOlYHd&0tw0)BeVE_YV^BR+DzQ&WHtXty`I<|7n3+8Z1q%rWmHCwe!z;KT-3YxfBv&4wCC20_%^H?S?x(cq75xqg;r;oa1wopFWLUV ztkrCEHnTLdqO6RvXThc^!P{rT@m9I zI4oP0N7!o@j~rPjH4{t9x9)mZzOp-5{AOb&Lu!YKVdw)eTndCfh z$YkI@=r9d_wRSb&E;-LK{dw8LefrACb3MT}b^l}bM=P=+OeIs~^O%8*X4tkYXrTbt zqQWHIcD_guQC%^hn4;NPWbkTQK->HMuNN)VLgpiVe1Yf?QjD{r0MWU9qNT%SIrk!W z=%80iNJ_h4&`HlOT01h#)n-3_5`A%=#SV89X_EkxTlKa=+2evLbBTtiUNj$}epzG^ zjg7A!JjNNM7`7c6^us>kJArNwfnN+Dsx`>>hZOu*Rm!i4!*6?qvr`Bz3d;d*e$!nP z3sK)6jL7E_$G#$wQWjWn#D9nPggVDAi+#<4rGu`BB<^w5bF*36Y*fC}Wi2??Xx93s z|33`vpp~~S9at1+PBu=)#*fq1 z*6s4L^R#SK(`+g}q~5-f@1Vv4FVC85!Y%)OI_vS_4x!V}uKAxJCA{gy!fVPpEXfrc zM@y3)^f+&)OTyh`(UhShPrqtnkyt=5polP?{6j9Vnm>=)aX5+gvTnHi6Fgh-477Q0 z`Xk=+oQP5{ysy!-vvk)W27STV#!AQv1FzITJ=z26c+~T#FPnR?_P-A4dd3U(-7)bR zlG;MNnwo%3Q(JcYBg|I?%SgW%y}LIU!x5OF(Q3>nH$$(YX7zsPry6g`aGug41d+U_wV0 z#?mt3n+FH3_4#OH+Nx74rzTdlesxYl=Vk3M!WK*+7tX3f+dyocjgO&)9a}nk&2sN^ zkJ>^w{KsJkd%l;NMEy@DQEo?a1dZG&bg6yR)eWra&~~p?kdIN{`n=9LQyb{zHI6By z*b890ky-2+ zPjSH}7_U^fNi?7vA$7-6wAtck$B5R4NbOEM|#gaj79} zI5N|e{rnhqkndmE=S&%e99m0|_^U(ThPeJxr;Wa$UN_lJD}?*)vqBu(AV0ooSCbo= zAxF@UKPwxABZ^B&Eo|XfRiUi6mY2>-o0wIAdPU93(PeBVIj;^{JFCv7&RjcTgs*%I zi4!+2vZhTFfpLtU!;Z1jPOdfN-F?zS~Hi_##)}#1G7fw`|vQOBOF|rE0 zs4Idn&jBIG^2zsyUwdpB?Lw!q-*z)kGq&n}2A_!wtLDG+-xAzq>_(bee`);B#zkIW zHZe*?kF@BxUrLJfG(Ew)r5tbP6ZU_gzK1dJIp4zL9YClC`JeFTiYv3!DO96U*M28Z z_hTmXj*MZt!)i-Lj6QQjqqGdi)Bj`a@2GNRJIZgzdvTzupdd)+tl=Y}b9TY%!nblg zH}$Y@A`*{-8=UufB7}SeP9!EM82pnZCy>z>Age=AQOCO%7{FiB+COnJIyK{v^eU(q z-&#c1KT9BFpU*`vf3otx=POuZK$`W%_4Ekq)VgQI26V=9Rb`ukOPCJvx~&TF72|869h<*TT! zM)tE}`<7wKtDE>+#{bU`kH8!NRyoOA_ga`DL9kxZ6gpi$ID_$Nh+*_3!t^yeDaWN% z8l9#a_7SsuY_jUo;cE%eg!B0;iZXFRZZX@WY?aH%<$PD)w`~8neqEt5BK>Dwr#1-7 zlZciu{7^Bbu^QQ2>9qFv@xN~5Kx1dxzv05v<+?{V=Wr0AWI-sLKHU-n5`TJXV!dRe zGk9cki0X^>SoRaHL4WwIr>+~B-rt8cY_|C@W!%>Pygr(f(=%gbAJvv!#r=MrdV3F$oHZ95T3E`_PeBEhQzWSQ5oeBNoS`Bj zJ@1jqUTD9y8fo9(%mk?^t=Aj;I8^S{o4H0`V>iMkFztJJuAat?ne?Q`84MJCn|~h# zwyY-hh0DbQU#>&*>pnyaMB$gTe%Bv4;hNbvMvHxjm3bL{QA6u?d7;1T?p?#TIXZoq zo`m_W;AEJlpX)q=DS$4mqWJidb5VrN_L-@@2=#6(n4~`dXr}aVB3s&qPt2IfnfZK_ zLfd~K`qID(#uqICL>Jl8ha zjEx_y86}Vz`ZUU6ur4{#6v~i@n32CJ2lk|DL7~gUJ(fHwq>ewPaicdb(l4>HejR2r zqa5C-Sqz)2Y;Nz&j5LmQ?*pmgWnM-reKR5VTtWe*{CzZZTYsXaXJVzN`ss`g>jn>U zdy@25NadTLEd_)~je>(Qb|`=_xLCO2e4jCY39WbV$M*ejVH1V`Dwnj|Ve?UbbeF1C z5Vr1wthxG_dGgopFAJ#9RH{x)G+}7UpMOR%*g3S4jQ%jvb1rO;(#bEz{r;;Gq@t)S zvUzoKWnVTHE&nhs%8NFLo{%oq0s4?D$YQ{(ea)3U{#Q70Rtlzn;J(%pPa z(3k`<;ox0z=3MjeTw9+)jAAS06`3g7nJ9OdPd0l~bsTks?JEK_D>U-fZ!3=>xOaSO zN=r+27%%olA|0&M4_1b9FPa)DHa#0XoeRnkxp6)w-0iE@}0IA z`&(vD6x$nZwt_`4t<#j=zjOa;Dt0rkVmvm(FTJyj$zQI%-H9KLirq^!yolu-o*<5f zOdZaQNH{^7*~|`+()z6JUJzhgFMe3%TGiq`w7#sqH3I?reKAPJ?2NK*CZ1J}C7TjC zte-VCAY{y>?8TGm^l zaR;Ogv#Y@-1x5~=2I+{Tl06c9qFO8mL|yq$>P+D6Z(hb{tlj4qya)W#j*!9_w)Cqz zKuy^`0%i5q?*59N@r@EBi$jqC2)~a8&phSjj%=2Qg?nU@cX589Qj_3;6VxIffZC$E zeyLf6kD3d=pyyHe@y*$lC%;&siqKJQd2(dTSV4^8Vm{m*Z z?NVan1w}jf6Px}#ycfh5Rq>l`u`xRXGhLBW((Ytkfhgd8r6$O#qrJEf8q|`(emZD{ zEu+KNfif|HTIaD2F8_V;!`ynbxVd<6zl$?o`@93IfCH-8I8o?B5tF-ksMc6NAbOn2 zm*t*iz1oc&r0bSE-G4Er8fCR+?x3^G>r8j{n4{**wLBb}+Uc$d*g1wkKy>u?L)sQ} z%#S?kBYMkvgCT)zDMF$y3;uww-_MfW)hL+1TR?Kg+&JmF3cfy?iTro!b>F65og4jE zi0@A-^`taLo84k3!fK1$-PJ7dV7ys|Xg-%gclK@`k#H+F=<{(55~;pbE4oFRJr;bS zg0)Z4h5pz{gy4D3o6JdufQ5qn_4dRFSxWyL(-T>yr~$-R%zS?$v41aEV3VI=%tq?P zo2%XC(7%#;V~OMu^(2#d_oquu%5HKAFu_@jNr&FvLj`8dD#uQTTX%@GE)e) zCP*trWjt}NNgw?^BNN^soX`UwHav+SC!O%a^9vZ`lNDp2_M`hjx<4ipA4`Q36vHWH za6vGRsT;2#; z(OalC*vHwNqN1qoFs|4gckIBKm<$8IN!m}BFg3GNxb4)TSRW`Ikpm;~AxOOFUh%gl z5@`Lbi~1+;Hs%6XP91D2%1xipe-CV^No1^9h-i7yNVh2Rjn z|AaH<D1n_g5T$||@4KHkW(nX`_ zGB2V5qM-r7SHesYviRiSln!jU3&v~78!>f%hC`>N-1_Wh8B#f-p?Q|t+48yO|kkl*dXKa zp*DOG=Dm)8=0PjXY1duxJdM`uv-p#LPid8GjJ6}#&u?^XN8vGk9)!xRK94I?)}?jU zsw2jDwA*`u;~cSz;s=>OxI%M0bA>D(EK=<6xrT=&6xx36)D65kG4_q~6>1UuZy}Rm zuKnOLhlSy)jTi(&Z88*^EuhD zX5q^hycj6b4R#xr;EQy5o4{}o@;do9w*kTamPSW86GxujZp!B^+W3VsRkEDm_(aTK z^kc(cR^%nMz9ya6L}jM5URYh>IQG+*8RF-%AggzRQ2N;;KZRvk80I88lPZH3P#>f5 zn&BT~Go{F+LumkvJK0Hsi1+#U7qZU_R5A|5LalKsi5jgy5{Vl2u(k)YFRHlWSL{IM za$l-Cg*|lrU>fs=TEY%VTDCJKWk2rCy0f8L9Zw%LsNnk>4nw2WUsMELsd79b4`Yi) zrK#9!W;s^mmeygtqA4xP&8?H5_jBvf#ZB5 z@VKIgu18dSvtY7tZg`lOR1RS;}OLI&AL6#J2d6c(^Swp3Y(kkrq9}N)e_&kV;YgQ4jPXyA$RJ3 z|JykfXWywfH`Zy2BGD;ZCjYF*W`BK4t-s&8U`NRq0nVL&z5+NmOs(paTbVgxR7%ij zeVR*}Crp`B%PDy}EThy)oM5~GsseN0rd!GGD+X!ghNeC%QVGVL5HMBjTF35E;abj>?GQM=^gk_@_R9lfz?d;K4~S4x0Za_UFg^`p*{}cnTI87^pCag!_-!-yQ)s z=8fup`PBh;?&$vG6=K9^PtPi?rCjqEsaiLVXHTNMJ{kAaw7D!n-sAnjJt=BWCkq&S z;(e&D4DJNdT#7NL|Hi2ftllgjZa5J< z#sToFZ@S9T_EHfVWoYjAH&|ec`oOs0s~|uN4vg2lOxL;(bZxWTF}j!(Qwmhl}+uNh^-O9=$pVFyG~Rd05*)}S2Hg)6=vCqahzk+vTuTJVF3k3x!9bD z{Qh3k=v|mUd`r>@`d)wbukec5czC{y%2mHJo(zSf>*~v4zJe6YB5m~Gqfx2L!UKQg z;0Bgs+sQCwwc?qyuO~N?Ji1>H`yxASDusz|BZHOw!NTF1*OQLqDuUVc;*-3kc0G{C zW#P*$D?lMz$i{L5jz1<3ElFw1a!|sg+wq3?#9hotaC|Q~_$?=kR!EGBOI-XswyMCH zc@;?s>V9AC>-R`PK1ak&>@ZSBS#xZ6ufwJBYAv)3W(*@e0A32s?5SI(qgbYwXJKR8 zr^Q5=yBKHX`2&Kw|aodfyNWA`%j&U ziP(ew3{?{^tJ-Mkj1sUtEbZtv3wRwanbcvgcN+}dp}1y6DuDMi;KOublAsd!@G|W+ zZB!s!u{dx|dx0e1KJEz4KxHK1`tCUVsH52?uaM1O16SyWQJVLz39|*p$CZ`s3kEo{ z7V5mxWUaNl&jPl4)?HWm%FlP}43Z8CStX9)H!Q+!PtrmEj9VhN-Zb2osV+Gdr+|)N zfs32e5?r8wdEQL= z0QTsD{ZN$dceWyaUEAG%UGgWOP?!}3@wkoQu!_%fDyi8S0?u>ZumzgA1A zf>RRD#kHid>@V2rYlAiF(!JC`3Wj#eruA9$OZRJ&+5DHfl@`+5To}>|!_p6PmE)X+ z2gBTd=nllf)1U2>enJwh3cml|JJ=&IewyD4az2%7(_cY^sRap=T$J2D6i)c{3g!Gb zENc^w$=2KdUc3%zB`n8oh(e0snEu5)CQX7Z4knR@2$kKFt)k&R z7P`^8q|!J_kt3=Um@#7#r&QU>Zk#j45jLL;M}#*RRQ`VeCqUT0{@S9Z<%_Hp3tEcG za!i3*=3J%jf|f-n53~2n z<8W5UCw|YOuA4_&hrm+Lqx*rG<^ePPH*I!ofoKkbl@}^Y@R}*^RU1rfAm^#3?aC1oRuuD@dwMN~})EZA@Z#GKC+XFs?OE`4uVjZ5E~t<(N_7~OU$G59hWgYRXh!MB~h5qiftQ_@T(da?Lo zIE(MbRq4kpNNqopm7biDv9MzP63*n?v;+Uj9KkGLANxH%hE`;}mR(k!J8{awj^zu7 zd7TedtefH7#pGu5!TtmKT3YB!(1(XsEK^>cbFHd0*;t`pT$?v%QU*AE9i|-fj8r$L zFD_}kUrFj!*F-Yc>ysgoJA*z6%0DjhfngyZ-j)X)ghq_3i`sB>xrT0!*)6uN>0jW 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 NnhtXP4x*9CWdI8^j+_7h diff --git a/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-300.woff2 b/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-300.woff2 deleted file mode 100644 index d831896f4b616e3c0acaab30343b89a09681077c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49476 zcmV)9K*hgzPew8T0RR910Kr564FCWD0%ars0Kn=10RR9100000000000000000000 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 KQ3tNZ_5T-ReEzTi diff --git a/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-300italic.woff2 b/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-300italic.woff2 deleted file mode 100644 index 4583a9d38f09f2c1b306ec696d1bafd39fa878a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56652 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 diff --git a/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-500.woff b/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-500.woff deleted file mode 100644 index d5e713b46131dd0659f4e1ad34d366f8d9798778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65760 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%0A>Zi=)mbn1ep&IlPlZ*4G62$K@C_FRdXA3*Z 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 diff --git a/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-500italic.woff b/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-500italic.woff deleted file mode 100644 index 347a5352bdaa67302f6337e87a3943dcd6b075aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75268 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 diff --git a/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-500italic.woff2 b/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-500italic.woff2 deleted file mode 100644 index b3acaa16dab2da4d0f8e959cd51575fabcef9924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55660 zcmV(>K-j-`Pew8T0RR910NHE+4FCWD0=9Gj0ND}%0RR9100000000000000000000 z0000QKpUwV9LgvLU;u?u3W(`shpA@^pcnuFHUcCApb`Wi1%wI*!AM(pMRJ8)_gj@X zsJklO_rv(F_#HtvF|i`b_;nkS+r+LOGAeRma5G78w~9Jgfi{Bw|NqZSHpVa@y#qCxWG+DT*47vunHg>KJ;Ucn)j&YAN#~(G%<-BE6g=(Rt!ts| zT}MT)X;jO5WazEFWtUU&xW^dE)#C;QhsDw(Wbjxv)Pf zbfcnb1!w~%V74OH^j;n8(*#h-TYxFoIvhfzaxhuQMjAQDMP9T&eAU>KuX|?q2-p%r zkie&+2<25ApiLwy{yRL)?cd#QMU3b%aEu-uf zZLGq?DAY-cLMy1Cv|xb&I3qWmo4T@Ap>r-=wF`CI-J*1E?ZxWmc2x$TTg5J}fD>lGfaF1XyI*Rd05WoR=%w&?8N&1_%ADZ8V{QiaZFSSe1$%n!c9Wp6WD_5vPa^}viTzlG{(Ej}I_vY+5 zsrRP8iHh5G|3f#f34^lxw%%WuJo?{NsZAz|)~sOT;+QxFl~u$d6c%NxFbIRS48|BB zY|7T+HaQFQnb1feUG>HjTj+3x-S z*Te>j8bXLdZ=-fyJ&ePmn3}5T3H1px(@W|h=>((%@--PzVUe2~BVzi^RoStJtNI+lzZxQHS^5=6g9fFzJ>7hpw{m63=A zI4)p!QhEasJ4R_hYCCOj>@A054#ymh*<0Fek9)lA-f}qZ-u86ey|4K>KU+W&-#K-K z+Y)9q%e&hV=agzUwGFjNWM+M0Dfd9wib#4pKkE0=Liee&c%_ySLI@#*5JEjx_1iyp zBh68?Kc<93LJ+$}LI`5J^U#RBpZN-c9+s$Fz75?M{d*v31bW0V<_q;>Y<{_4xi$(> zr{FudTg9Kh^?oDQ$a008h!XIu+5ERpU`mx9?n{X)c9|UrK+lGE8ywQKQ3VBRBHTQp ztxPnuVxNd{BHDB%`hjOR-Ep=`)yfyy0L9GBP&++*_K1cA0)I~x3PlpTyC*H13H z;M@`8Lr0IZht}!C%Sqc0XHQyV#i47l`DRKxMAzE|pd@b@YlKzn$Mu^%ugYTc<*$pY z(|yv`KJ86e=_`39Yr3LVjge}u5d9=mA-kTXLMM8T3OT)V#$lEtfR5rPodE|bx+>t< zdAe2VLTPfb#1Jxe8*VtFO(PYu*j=tdyr>t+Lrw^wV&r&y5b*fKxF1m41rpLc4?%68YCIo9;Pg00H;Uzk5$}D90y>AEVl}D7-;C&&WCO-xdVvsGY}p&r zk#-p5dvCv0`TscrzciQ1A}`_+Ujzh)z^KjnGv8))mS%pqGr2T} zGpy;J)@hikDI3P*4t-K4WfCWTV#YAK(T-vyBOLBz4`tFPX^cmAsG~IUBVAWDT2&0K zq!#2sIqgbfpp0~w8^hf8z$ipGd}TAYU9wTm1rF7V4trFUs;W>Z6GotEf!LrCEY5r8 zw`7m?q04%gGqScCTM6SrBH>X!Rtxy`Y=@WP>RwB|mF7@6{}ea$J_l$TBqy`Oi`PsP z;BnNpvz)q(xUk#?t`Ts#m5Q~nU9M=}4=;p6&H#X#=hWeEdo2Z3D7#{@>60<4piBV(Cav2&bL6SK2!9!D0dORJt2pWhUTOD*=Dfga0=8u$EAH$4;l zdx7;i1*NkeuXce8pZ^E4QXZ1$WowAAN})OVWMYwOZkka8p7K}-B_5tMxRj%|QV_fL zcqP(SRjWgfps*S(vnE2d<&J9H)|`S(4pVqh@s!(|8sw>G~3hrCQSI zNoEU)EMme4jD|5VAIuL6!lE#6h?=!%)rO3Mrb~}reHfTnIE3UBG|cQg{6fNFfvY)S z`22`86`xWVil4gVIbZhVDzCg%qVDOoZs;o35_MZ?vwD$9jj+L_gtMVAw^b?{1@FOt1G)3|+xxp|`??D+b{GZ{|a)Y)ed`!Ec6#W@j8aoOD_3cTWbdXfq8 zMoc#@V&V1f+m1I16M`8SrOLT*#(!7oKyB6>$<4&8I35V2<%*@2YxskiCvD+Ok^G=wB1>Nl@SIw?bi>nP5>C_n+LGeiF!MChQ zXLJ?LJwoLU>!2l1Hm&yQ5`RhZfLkGAj{Hn@mp)+F4fhu@Mf~f8p@SO)0I_d3XzB`~ z$t{LTuev>{><^kaKEhxJ%S@`_H=2dshK+b3z4Vu}c9pXGR9CU~HTftEvcgm&C573DFSmQuw)y}-QK8>o3) zGWCn=4WR6s!iX6u*W+vbs%-wnsDH65VpXlOrCP=MvM!Z{KAh&x;!L_GYEvy?t!`+y zYW-Yh8rI1<)DJH+_u!hLNk@rp2nwp$CD->4XQy8q?visBN6EwlD8c^(*zHv|K}J0V z`6$YgsV(AVODLFvO4_K(rNlEGb&zgGS1Ah(-NM&=N~=;u+6JmtUQe(O`2QPquA; zBa-8a?@eloMLEhbjr>1HJq%cI;NgQG0R$l+gfK`@plMR2-znqockzpgiA%^R8&j(P zyv~QZce!#;q!0_KcqS}sf{7V)B&z_avi?yh1T}9ajpKk^zZq`_k1eaKWQoc zC1JlvyB2Ix%RxY%HmLK;Gw+&Dlu<>Ul4zohenL4UrUUdR;`93baqvSxgeGthX@i^> zLDltYhzP@N0KkqSuRub?o0){TAAwXN4Us zyd{bVMCFbOK>Weaee<~J1 zr7ge*NA$btm0!Gc!3!rnx8F0Hz?Ol`2ATvg#+Vn48f3&nhIKTgsX?jAl8_}%Nq|oR z;4`J`j~u7^GWPQb8u?3nfHv?^pYZ`L`IcylyQLd+eADt9^1Vn&lAmNHQHk^>{XMOc zXcY*d#_FdMy@QNB8(K4QpoV;eX!sB?hb$@843!i*kYJum_!Tn`OaI3PGjQVG#8Dv>diN~Ea(aRikRsYC#bujdTE zHYgmQWE(H6q2I0$MlGIHT%lTg`;I~-kfX9;3kEd=KG96n8P9^8QUjA zfl52O_FGSYN52HnFD*qqv$tTUcN0LM{fXd5#Muk#iirm$G(d*T86Ad(JwF{nZnVU)C5SNoT&JQ>KfA zq*V(e{K|e|gKZ6Rq9?9GrBQ|Y3z_ixq_)z#>YGF!$Pt~ zI$^JU@)$hAbYjYt^7GXn{_>AaLC~NaM;vuF8X6`)2@$@wCO(KC5`aV$Rm_W?@o69! zhJ|3^NX83qyfEp`2z>C-ZwW#K$UsAVy)G*N?h1=$r#EVtC?bD!FZsrIC3x}c!a;aQ zS3OO&F;l8E+q~@%n=BJ7ED{^SqL{~ox0A{zzSxowB&?)T8fm7rwx+wnLKP}q=^iVr zwAOwnedCfVe({?>{N*42x)lN}9;K*6EiTCpE1ZJnD#kxOHU5D{+@XR>s;H&5mO4t7 zB15JE#jf$5X=YpPnB&g5=v#mKPgh0)d1P`Fqa4RD!wbKdAz<8_r4j%Ql%k@ls;Q&C zJGE1yT%88%T_@c_89wv5FMaKT%YO8;G*g%`8kR;x#U-Mp=O|Q!32K?K%WFhJ8Rb=1 z+_z%oA@fzMQERm|HrOl8OiL_f^GmO>)egJt@rCdF;Htlaz*3Q6_mJ0nx`v*tuuB>n zjLAwyS*oUA*;A1vR@tM>PuA&_Gjg5xeH3D*rR#`_w2jeOu}JGBFRIn`hibINHoIMm zthDqrj8V*EL1B6^>c|+Kx73~Iw9NJ@R_?JH zb;7=&8_C0)s~9Z&IGA(}c&TE?t(L@m|_!m+WpOLq+1Fxshw<$Fm=?(%Rh*Mw`BZ|y4LN^+HQMY@9V3!Am$Z{^>LzeTzE=SJ}jo8z~`??_s?D{;yu zW?U2IK_jd%%XCq^kE24o2xE%kqUh_btN?S(=uz=N)yRVdL8CUw*!TD1w927KiD4RM zdnB-%aeKO2xbgBc!m(%nDdu!2z23Z?TfD*&d_Hx@$RALk4tRm2{44&#y zr1Hz{@u73}i?ie>XU-32DKkDdNot48h!le9HvZ}J7rp)W<4>A@j=eM%zqTiAmW!Pp zft4Px^e{|3^egqj^Q3kSn2P1gM3dx}SP`a-=$922@x(f!{LR%YXxD(1+?j)uwxz}#(_jMHDa47eu zUWQd@{b=`5LvuvBB=Mrm7*m#)6y{}Tq$Y(AlWvWSK+hIV%N2}j2Nv;NOHe$}M8+0q z2z{%sj?+;?x74+IrZ9jXbR%zvcDWbzLbj*?>T5%AoysS}Ux2fnzZUsW&h1#C|TUbfyfX{{~DT@vcd1z1lUYQIUlX`NNhBwr+ED z_QO21r!7S&3?XMBArBO!fcStoVu7)GqMfdY*F*`*20%t7yoBUs3lgPgu@%FaW_(io zY&Y$rzQkHDrv6#q6KD=daYtNM{Cu;_KHJBw+Va+%eZSY9zwy`PFSdjH4Dut$mmnYg ze6XfjDKW`=Kg%-ssEkg$qR*>U%25c*5B)4PFHNu|e-E?eOxcB;dFwM(##t!zQF(@B$1^OM{0nnH`SMB~&|O|sGo zi-Q38i*Kx0z%_}3rCX~8Rmw2rqDzq|UW_>th7_em`8gW}rlQikfMH9^w)Y=c^Ia4cB@E16j)IYHyMZjtZHtws{GA5r5G;OBkK2P0+IL48pYD7 zNtF`$0Uv^ymKg|0rp~J-QEv@@x9D^?^C!Y(91_CI!P-Pi0+kwmL6DIg7spIT zNl3?rVKMpHhvs?cnb4nOEE=5sgjjc0D{39 zUo4q3j-_3lGWo`5LFvHj=e2pSy!67H=eVAkHDlV8NfXA688w3ADYjul2C)q2*QZyH zZe2QcXxFCI6D^uGY1E)zomw@jRjI`EScP(BN|kt|*h36O3KhtgCs&SaSu$my$Aeoi zSd>rzuml4lW;PU@oH}tEKx5E2wJCE^sYO5qs zVKHEnAFP-+jjdY~CWcJO6O!?&=tD~g00000sWS^p=rYs>$NAS^P_ycSvvTaU#VU)< zHpN>;sZ(X4Txk*|s3}Eh2@nF-`Np!BCJpJ-ph6+KByqxw$cy?U2s6@IGp0?MG-2GB zQ6q*88MNDgekDZ(c{y1bX(>qwaWPR5VIe_*_5*yp2#ozk#J*KIiMckw%{EVWOB^%P ziHP);F(zsK7ZI8S7>541>b#S(Y_&>;bQ6tHr$V9Grc02jyrN>jI$tcB#n!1#iEPQ@ zTvwLliE4$~O0npWEjHU^qYc(uXRS3>TV;(IMvTmCypwmy6R8Wh0`BbQORk4w1s>-qv)Y+!&(9FF92r21G|_ z!`AQJhjho)%hI9Dl^m+y+Ldvv`xBEClaixMP1Kqivq$rQ2*S(j{1 zwkMxdJJdmSM0*q{3MvZP6qs^@ayR8ZiUfs7k*8=-oT+JQq4RlVa|7m;p~g$0a4bGZ zUNwz1)7?T}K;DzvFTVhkU-Zt8n+iBBRdG3~M#i^IXVWA?{q6EnI zlcmWdGTC@$i4WjjBf~tP5TCm(^&+o?9cHpa3n`gN4>2jxj;4Kh!k>d*zBLU(g9$G+bG>rb(U8ss?fL5r0Qpf{w z5CI?)6q!07di$ zv``!uC%ltY7Gc1G0}lZrB&auy$oBYlSArl2i59j);9;s+iD7M`#dcU&BU^kGqoUr?}WY_*qPjE;?hIDL-hDupK2o20R7njag6!SR6hWO>be@a#T_JvtZ} zW6z-LW-;Au6mRXA+o>p|1alQLdF*?dp$WfK78gw~; z1c^o`N#Bw=J=I9=yQM|3UjZUSFyDE5}E`qLvB~GYZ3DBQ`D5{`1f|%hI zCN(!Qe_JyaL zJN-SsKR&Rz?@6*q+p>0wvv`zmHCmlY`tUO@C+&D+^}04|#T^gY8C9~9PWy(y7rpIGamKF zgQYIUO}{^sseUrNXlsF1R6|@*9b8SSHnc(x2fO_6u+&J+!K$zU{PP3cFm zrTXD(v)ImpqTMREHx0eJRe5xF;sX0{XupDg#*2&W(uHJycVS|~M%{GU@Z*;Ey(W0q zZL06I%^wGSKW_z|*URE|LZ?6az5d2ldJwljyl_ACE(J z-Pmt*3AB=K=0=%&wcY+k?(J50vVS{1to#w8o>N`gNkNYbKu2Y{xfq{+1t$yM#F-4e z&tgCD^5b7V#250b$K+Zv8j!!FYibeo2%shO|5$sr3l@7VUaQ#;bY0hNUE2#;*wey) z6E~y@{UEue6x=Elm&zdiS!Rde74<&STecg$l1n=|-_R~rZd&8s&+{S zq?e@Eq?b-Vz0)75(-AmbgyMB1Zfbf6^arT#Q7G!}BGEVPXJjT3#V0|5R^$R+Anpb6QgOz3g!m);jo}0phlq$< zME4DmdV=_c_$i1(H2fAIW&z@jb9?VDJpIF6s+)zh%+okjY5-9ihW-NJd_Oqi2|pSZ!Zl$)HU%-rpAnX?5aJe_izw>y?t;{56A>qncl zy)+w*M!nH!wOZ|VXO%#^Jrc4g^dMd*5yTdA^K zBgP>^LV-gsLWy`<<;$Vt2=kB+0g7=kZWZHZ6!+sQ12e&_>SaCWR+Wn4MDw_Y(;7p6 z-tkp{TVYP(cA`NL#9s1X-ZxVyTOlyNuL0!(*p5dzZus1>DVL+j(|#GntDf(zQu^3p zT+fZ;qQ=d*y^Mz9`f-hGK#p7>AlDT|kA=}yT{E7>ktgTe^;LZ?mD#)=)mE~SysJnv z3W9`HN;Sw-j>Ru>oCshhedk zLBoa^n8qU6BKp8uPhZ53RA(wjdNH@daT&M~ksSDPWPxSse!c)oVlE|*OO=p-AfhcL za^c}wKy$nrx*kR{G<5xMfk&|Jwil{wgsr^!TXK?H)9Qzrr2-_7MfmDP>y$9+kmnIA zE|k%6<(I4?^641pz;RGgZ$*PS01vbtjU^817!p?M&Y_^567MNI&d_#0zAe~LPNu{h zRB_F0HgroQe@V(*wNK@1CE|#=oNA#T!j(rYsysf(8(dUW>$(~b;TlUE(2RV@djI+# zXoF+VaQeC!b}Rq_T$GlfC$KE&YO@e=f87mW`Rh=uMJRO^PB*+qn@FvhJ|q_51N-{Z z{QX_eNutouH7R6zTR#F(3z}Fa62!WpwTgaFN@9*A3jGckq4(1d<+}1XYWAYxwJ8G; zsWRdda&QWU)zU{?Nq`|4p>5DjqHcfKnjjQ9ZGA?Pv1`6dh%rK_#8)S+ktVe)VyY_K z5|(pS2o&d$6=7KdqS&t6<9H~`%gj_m{al`v8}8Q25B(`#Xp0oNPz)Nrox6k`c=Pq^ zso=i4ZUzd;VXpp#zw1l4SK~-p=T?iX^YRCX%?Ety)`9mcQZB8?S>PZ|b-Gjt3O%%F zCBI}#FR4Me66lOmx66S#J6+f-5!9qpzf*VA93#B16U1a>*o3lMX$WjvVlKe`obP1L zS_QC7LL@4Mc!0Be`eQ8u!hr#L00I~FljaxvdxPtav6)WCEqmu@VFf$1htIHO(jqh@ z4m2(4TEO?3hekjMQmajOKt~M2By59MtT~iM^)UdUEN`k%h@wRT+F9E(C?#f2Ik-rG zpg&Zi0~%y#@lDxK4)khKC<4HAf;P8JJgvj1nD&GmLYf$_eI#+A>V)8CwoyCt+={8S zaiVO+luT9>;#+ErTi29*n>1XUx&vdNL#QMKUfuyp!DBNdN?Y%+jvj|%fdz17uEE>1 zLJ?WY$Q6OI9{HgM7Ee`8$}-?Mil=O$#{l}R4*Uu56TyMMS}D?!d0{EgnW8+%QaL=0 z(_}el$8g6mxcaOhNlVUS4ma=VhzIYYfa$hs2_yv%IT@=%TQX&I6TyPKS{!S_A5qExKJ!I^Jr6;|2Y% zWbpQ;WZFQ@fMw^d1pWxEQlh_HcE`e!S*+*>)>dUiF*)AuNI4t#FMCuM3mR=n#-tzz zy%_a4E1mOb)%_qdXxY{1FT`NBvEty*oT4gjJ-{agzrhx;iyAoG?7b2Y`5>)Q$gY59 zt>=^yi-cR|DGOOhmLzw(Hd)?yz-#LnR5Tji%DF(6{#f!)rxC6E`;4zh2n?L#2y!i< z8BUIZ@p$mp$fykhHH)C+P|=T!LTetNylQqcLm6WUr$gD~^DV|mQ4{tRY1Oc3`u9;4 zG>atu2pbhq`DfPGlswP`ru51sR58DmOVr#tt4PubN`SoE45`4BNtUwcjnP%m_5yWzPWl>b+%E&|b=-jZ3?TBlV+2 zj750NvOr4&%?!Cw@h@?P<054Uoj(bXASMNlCK7bEAaf?@02y)9if4IxzG>f|B2)4e z`lDO3C~v+klVB}ofZ*?7a)ACLLXaX%p_7~QmeQao(4}e&_e=_zzARR7vOL|~I5RwT zT=#yh?Rg}jlE@9c=9|a?B10!i@~h9Ps0lsety*3?SX-7nBMG&fsC!LfRU{$zyUa9S z*bu(TfwT3}IQauwQU6Yz`t{Wj6r5K)A|3H1Z0fzEFW~1*?X&PX`VMQ~Rr%|rw$~|0M~6qC`qgAko-f1xIVSPX z8+u2ag`Z$Oi==P&)!lwpM%rgD)ug_>yL>!YD__2fk?`9~3uQ`Q{=n{b0_FZDDsbWz zDgB$MGWkwkuz@XG*j#o090wK1G1whT8)-w!>N9KiJW4zb+S@>qr!s_eoYis*ZSHNF z9b%o`JzW4OWmMmR8nSGctncYwbhCuqY=R>pT$$l?aE_E1N&2m^`tCF!S%5&Uxh4aRdeSSl^INlt`)x0P{;FV>$qqN8u4D{4L z>bp)bS=EFimx8(%;Ry+v6OHXRrIT*!i}!=)edcq_1Ng^d4REo(OHcS^?6nJoQG#r~2iMm-38k(>mkB-rKL zohGMs6-9J<)!`H+eF^y-k|?g4m%`MkfM}bmWLtQ?1PKro0+)1|DnK~Eqbxs zQM*UD-3<{lmqV}67xB5EtHy!fP{6WFK>WJ81YGqd$?DM!n$2}epiGtB!x>s^50J?_ z(XeB?9Gy-(>YY#_Y5K)H=sF~}*JQCuBKo*olgfFYn0|sKY;@;Ca_$m-7{?dnqc=2mBthg{OX~)en z_iqT0FvJKcFAa__e>3h$62Q5e|0y`;+7C{C{(m-rC@$^4DLwkIxJ47L?}YX7hh{|D zN?9;l1U}Ky=;rmP%Iz{_fwiq|ZMU@>cfAxc*8br*3>7DuzU|#zkNBRh7>=H$`t=<=ym|>oy`Bhsg}jqCnM)S3S{S5FXy~ccEEL(crZ5sOsve^t zcq2u)Qu!I}ODkG!AESfza_+?^O*eg|HR9(!pY3VUA6!gfSJ7_#mJ01tHzVra9u$Zv zShp!7rqfh<9-bi!1G}6Kx2%L(S6W;wOu~q6aOTP?&g9ld2%Mz^bQ=2&i!ks~wMx+d zsOO5asfkmSEE|RWn|TKML7D|>o6rDl=T7$LPo0iJ0-;jEety?(iiDonbyIn4uP$HY zs$#YFDM^O?*xl&?E7ian!jq{JIL+g(4Z`OA_M2#4P0YCHHC&6 zH^wC#kBpulL{1=?CGr_+vL6c##}o8TMD|PR6{vemq}`qsE$z8FFpEC6n3(2W z+(_a6`Of06^awrQ_RdmnpI@~vK_eFthdPzn0hrNHLHP^wuAkw}d|I&VMo%FVdK?Om zHDmp}L)3r;OcFy+m0<I_=XiG|5lTOhjy|1yQLe$K-g6}8;wmi|brzk9ntY+Er8y@b( z^6l%SJb%Hzp#sB1`WEyprM3?=L?3Ad-6w`Hm_D^+^so(}yt9^w#S?z{L}vl79Vf|; zt9Z~PseC_u6%$Wd9qjof=Q(K7%}efFo+_fFK}KQ|-o2b~Nr&wnJtPG%>d*?Rhy>?6 zYxz8y(9NNtOgVsF6QW0*OWCD5TX2V-^~fMVZ&I-6&*->?n99v0)gd(lrD$LYCx<&* zPG)%5(=I$eIK+b!X-B-9zg>!haqyh`%;9^BbaPJpy*}BR^LI4{J9aHnjnz+P9Q9I_ zswm9O$8FmEfKf z9?77qG5)F`29ag?$_=42qRKflV7R4N^I-8rs&`1qOg%@vj+ayjgY@&%wP@&J9I~?C zSgJdRmbMY_+;yX}XLYvU6Nl6+5VM=uP&Bx`!0IF&0h`It^FvjcvSRM!49_o)MdeG8 z*{>KRe`Jd@S0;alyHrq2cb*4WbeuR^pbIORLB?j8pxuq!TNuDlBs3h88TJ$AQZjfz z-l=qlpM$He;H+sh`o9Q(41r$|nDrq+^MXih$5|nk0+>JgqKiB9yLwQ50{vPHeAmeT)P z6v0bj`o{4%*??K5Qm253D(USr<<*E`Nb3Isc%t?)d$JM1-2$*G009}-EdX#(^?5}h z(f}CV;Iwem`McfqNU+Uko@Sdv+8zpw@!_fWO=3gxB5o@zt0w&CG0s?`(U1Rty+KrF+VTQ&52R3 zS!KeE-;j8jdEvar`gDf>V*Iqq+HaQfl!CoO+7GyW>HM{k+5;f)8?xfDFH{s!HoXQ3 zpl6jB4ho*b{G-W1U058?jNaTKWZ+xc$3EdbzeArBxrDNP0-n^(Nwd+U#&KqK`0avQ4;cvVVGqi;)p{DAwyuKqYucMjAAxhjrhMiYJU&)u?nY=O z`AxP>*P~H~`+kCscQ1eEi_zEYv&FweX|Ng=dX}?ktoc!sRCo6PSajI~0#!L!YGyxh zEr0oAM`ybYAzk$pLJA9dlq*ABc83~pf@nIvL3Cp9 zxNK1p3dQaEOh3TG4nHIK@_#%T>dTQP!8>zPrGrm1mq#WGyOh!0RkDt z@NRceKoyQDqNod6-0A1pji$XuiRDx02S*RVW0XE2jJ;$Go3kUW(P&$6rD2o z#P_u$FkQC$T3jh!HsS-bHfDB904}!c;eC8;h=VVs>^v+=D>bdT#cC>#yP;!~>Hr@) z$WyM#U5;22-yJ!_pUpYcLBgvDNuo#G7)96w;1wxi-t@-B%1t-nW7)|%_(>XK0wu`9Q4QS`6rPnrNCP1wU+A}atM+#!4&1neC_qotoehh^ z{~1}*w<3Q`T%8|}z<;eJEO28IGWI<^K{c#E*z!rwu#LRUSDPzZ^r43$d2tNXCUoZ6 zJOAxNUcJ_?I;4;5ecEp2UOGgmCvuFXdJ$03s0+~CUFsF?oPMV7dTWxMLr34qhAbEd zsPwyxajbb!hd8vYY8&pCLdtQ|;wR(AC+(EZ&FVF7Jeqid!~JZ?8-zY{x_O$>?A*)e z@!&=h)pWQaE!WrtjhI_qmY>Z>P9S{y^a%GR;i#&Oeu#W(4u(G_w^>X(L};DfX>I~N zr4o_IT-_30E6h5ORz0l~c^fda+ETE^&iN{H9iLpWF>;(T!6CwsEtWu|+k>oyiuAA} z_vNfjBP}f0E=`2v_V(q?h$url=&3TK4Ql>^?lWfkYdBrg zzC@(<#V~BzGMqQMR-}P#9i<{)GRuAdm&Q`edU8ulVMD<}y_|Yy^tuxIcU(iUcfy$A z3)8fb0?##YU+R55dWlEQHaJ$Pn_8hra%Jo@vB<|14kcgql_D+KO=wYmWTh8>exZV zDC`PoMfg<4Z!xoB_mm1y$rXv7D>V#fIV1(Iv|m$L8B*b6`j9T zL+Mh?Bq?~txaJ!Q4!maQnu|TJ0|_}n5w$g4_l7u{`GHL<$qxf7vkL~PB`kHF09YI@ zoq&AY&Qe)_Nk$Sd*w`jBz@}UL3g}kr3<1vR6YCHQEmTjSFe!o7kk71^2yC$YPVO{EhpB56w$f*;MBoO7hlu!Vp6+8AL+WfpCqf=f;0z%%{cfe)hBA5QuOvh z3!Q}X8m_W+UOIK%iOw}1O4YQyDoMv`wRJDqN5V>UuYTJCIXOZS901LI)3s%2nrlJa z&_X*=zoE2>jVHuHj8!XSjelSRm`6U4!kRf1qL<0FRzUKIjC!pSeO*6;TrYq!9bGfR zJ@gNEvJuN;k+C{{G?1b{*EKYcVO;w8C2^xCVrc0|0uAd$<3w}H0XxdX#!d62x3hzb zYGqXl%P+1{#Jd;%qK!_o5%cGULgZjmv#39Y$l}|fFhx+ZrNyi#+1dC^_%#zQjRojl z0Y{gT^#0jz1(M)*b{l%)*d@ZYxBlt8y)_A`SrMvkcQVhcf<(BTH=Uw-BB7d-Z`np>L=ee(vMXpVm)_%(K7*w zG+-J^W6^>V-D?I`mD)sF6F(?3YWLiIQzB;3NE{%VYi4op^y6q8Y_>2SLL>;qooj z`6`=8m`t1XWUGq1E~qfPp#pPqV?;%W@4)pWAds!Pm$6{DH?U9mm7tr*pdrJJ@~^fL z$B^ifbXB_0RDu_V&e|2JpsUMBeq>e(oq(o1lyGyD_(3I{jq;0=17%>EeLNZ^u56=m z;8~I?I`)rF^{~SdMxIpC75Jtb+L>BcoHd-#d6wQj@}Ab;z;LlY-1Y@md_HD9dSQWv z*>)eXkQ!XC?cDZ5-1mac#ikj})5Lm@r;Y0s*etjoTzadvyI9ZJG|)5rKeM^=1@@Ih zu>uRTj)V_1yPus6K#hal;i~P0c~E$i;cUPeY-hwR&y{)5R!MJw#81RmJ)p1e0U5&V zX$RMPb(t|WyF7b?qVE3<{bkrW>l*)7d+clbR?oMuF5<#Uvm=HET*_JP_89?wmcU9B z{P=er$S3mfk3yl-$`IaNw;{zcc>v_HykGD(4w9m~I`n&LG6&FE{*T0{82<5t&ETcQ%u^EkkDJ@vG%S zi&)4(g*w;|L@!}iS=yL(r>iy!h~Ht*y>^_|^Sl!o?qb)lP@dsVqg&0G4oYI#ZsI-A zJ>Bu}h|KQTRRhgzQNBj+Ae2%ahD7PSOmuE%FRy4z)Ym#pI^-BJ(Mm3b#NBwAw3X!P zDJqLd2ulAkV=ox1Y4?=GzytO2BV>aHkvzzSvVy0D)V>dJ<9~GFyYy50V|!ollLYUi zL+HT(5O(VMqlFUqV#l?mw4$xJJM!?eb6jg$zWVzcB`TzsXT_kX&Z(-rm8O{g=ZYqY zi*9A+E6tuv5&OH$Q>Eqo<=e&F9;twErV|)!8^xa^ATSGu)P}F4TJYKU*-I}Q-on;A z$7czD55A>3sPox_ORbsX%Fhd3+~a-nN-q?H%TZ`7k_!X_V4b1rV?`1&-}aay9y$CH zap&4EnIyI5>sJ&?y230E9^$ujHih){DEw}Bj}jC_m=jXN^LMlGEK@*AB}%~J;UG3lWLQceW$O+U|`g9*ewaM*et7*Da8np+&= zBZWc{A#Y|oZW}P{+u|0Bxq!6_uOQsPm%J=p^F1jICPG1m1oU zZe5S%KQM_XQM@S0JAWbDkf^))l}!ONu|c4rTAmIK>~eCT+)o1G9j}LPzS`zM*)l1~ zs;{haaHK-bO4Bw!d!i2%N$G>QMipZ>la9IXdxxEF3*W87sgoqG3^B@KRFXZTkb_3y zRu*J%CXX$-a0fn-s?JwRM<&Rxbk`S=l< z0|6T=8jN1aGzrHp*}ET}rj)1$gP=@sDtum;n9Wx3!X_&hiTRPP3N;EcWXB%en!jz)TR5`Zx69G24c@NEv-hZR)I z<4m^3H=;9uxu_zWa(;Y6aMQxaUACBNrJG1TSltD3aq@2ik10#ZK>9nRl1$ zZPBC(+N0B4?SNOdgJFy%FHdl`{!Wd`NDZdVf}?uwg39^H7@vyYIZe|(4JqDFl8b_Z z;Z}b8gtSVkHkl%6tTB_!B!VU3DmoY^By+ODsx(w>WvyYwJ`AWFO~x3QXFthWXV$JB zkfQD!ekzi{A0X*$cD<#XVvCTDm$V=|JO4eBECs^`HA8~LtK`Y zlJg6*%(uMryguPe0rSUM*mbN?NDC~!V}5x?GwWvpj@)fq@6cy)k;A(BMt9_0c=7Tz zpSId~IiVi?QhY@%fpPT={O-tg1ryacBsQF(yoi)lL!cmcS|b+!*C$fQ+9F{DrGY5w zUJ4z|Xo2``D!SD#`e%pM6|sQ8H44Ff^}7HRid3iT1Ke&MF&D%dkE+#uRTsC0;?9jb5d>YaL{d zwIJFUQ2}yoosGJdF&2$@kNmB#H%#O$^d8igxl&4R--)fDpyGo@{%h-Y-aM-hYfbAi z$ZP}kCb_0z4ySPx*4x+i7_I+ycnwm6Ym`VxlS)7o?<`Dfnw|>=Ro}chzg@p{=Q}!`Lycp6!{gh&MB=i^oU=(f7}i9ZmW#vMk!Q_BBkydn`Nc%9tmt6uGaH!L zo78`>3SLExfjK#hxg52-u84`cK&1qXjg??Ub-b}j7!f$}7WJM3BhsHXYuCt7`2uvX zk$C-{k1QC1GJ!zSi-d-2I4$-j4Lv7zC|$8pvt(`Dw$2^}4_=%%_Y8}2VFHU?Ycueg zA#(;B4cSGWFr-6j&^Xik!G>#g%CcarXM9V*TE<*#p1v6Ftl+rEo^zy8gy&g~+Z{eFW>wAm9Qm8b9Zqf9wt_;ro32Qcm0 zsKYQAm{yjc{!aGm#ujI3I8%F6Kh@W4m9~TavFAZGbP(>(Ked3#58T5GU&jiQ)c;L` z-cjq^o}Jl)dUwz3PS|a-W6G1-oSG9Kj0>#n=7zD+-Lh5W?9*ulRILkpTB4_lp_;yn6dkOhhh4PnZqF$2xis)P>^z47oSC?<^UKd~XbdDF58VFa|Zx1~|m zdw+O*T^^F{=A&JllMM1mXXZbwk#CZO89?&xjmmz}oJI>^s8(ZG>cSH^q<=d;zp z5hbV2F7gJ;r(jrg6tZt=Ha-h_#YK{N}RJO3CIG z#R}X|+O=A`Wff(hW~G)?>WqRg7(lYeQJM`?K}A7K^3=(Rgvb9YGFl8wlFJI5(pf;u zvuaH1B+pm3^eT6N#lL2)$xUivp!`cDY%Hb0l-@0|-Tw8AT`5=x)&P| zU3ak;M006u_KQe4ib!?rJ;}H2{;2g=*UR2{ofn{pj|h&J3XtVo4;RGVxC1 zcjV~*B)Ml~GL4$q^J;|X6}DUorV)}}?AG6Tm6I5n$DMNmsjO)PoSMsno>E`)RQHOr%ac99O&_!Y9cF+u`& zsnA-ouDvcY5Rm4k`MGGMa7G)-5qhvwQJLLwHh8;rI?OVdVQug8=*a|#b4UMcYyjDh zEMCp8PR>q&n8>0fy7y{sHf zj!y^c!8X7fVJ^_eMgcqc2u8QXBgxk1F&?ksrXpi3IP;Qyo_;A4!i0!tM|{mTzCOcd zL)cJ%)iI9_S`@a_O%jE2i*hjv(;5Z_r1z^+GgxmONK(ia6NrKmZ33VN z{q7ciq-4SI$o;JZw09q)JbRIYN-d7{oZO#3)Hqt;2NZnf*Pe*3GK9VuXZsKTJB9VzRRMRu6=x7FYSF_8m zY6yacS$j>?poB*eN=+zS8k@}!2R8C=Cb#O04vokn<+Od|Q?Day;NR)IJ|~r}!gxXRApS7OH*ieYJa zGLbqMlsj1} zi&Eft8d@{3?uoaZqs{Z1CfI9IgsH@w0Kl7wR*HTVZ+|r5S<#ZD>dp)}R#Ge+?PTNb zRCbAJ8pp=xjNBaTnUgXgOmJ*oc!o5G)fnWkwZ}_w!=De#l?IY2pAJchwbV_f3KbUR zLKFxx+?5$2N8(E5Jy;vMyrDYLejH|8#fk$~NXZG!eUz(myWWk}6x#mvMLtLF&gFbq z2ZSRP%OaK1&iS44_#6Z)0ws1Pm`zYiWpVpCJc9p+Km+*Eoj{FOKo~!7Q=jQ|baGIY zcP-JJrO9HlB}v#t)&@0D89j)C<$57hP)KEcx@UCH(5;Lks5i= zogrrRHVA+%x>t;EDQSPPVp5h(OIhYj?Mefoq4?xo

>qNT!Y*oG$b*Z5|? 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 diff --git a/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-regular.woff b/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-regular.woff deleted file mode 100644 index ccce523febc97ab824233ac8e1f0c9e94edb5d9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66572 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 Zr{dgX1#iSjMJ&SwnhtXP4x*9CWdOx4YNr4I diff --git a/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-regular.woff2 b/web/src/assets/styles/fonts/poppins-v19-latin-ext_latin_devanagari-regular.woff2 deleted file mode 100644 index 7457692a2805f573989133708a7caf7790daf247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49652 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 R`UU>IDIILO2RmAdodm%|(NF*Y diff --git a/web/src/assets/styles/global.scss b/web/src/assets/styles/global.scss deleted file mode 100644 index 98cfaa3635..0000000000 --- a/web/src/assets/styles/global.scss +++ /dev/null @@ -1,103 +0,0 @@ -// Global CSS starts -h1, -h2, -h3, -h4, -h5, -h6 { - // margin: 0; - font-family: var(--ff-headlines); - font-weight: var(--fw-bold); -} - -h1 { - font-size: var(--pf-v5-global--FontSize--2xl); -} - -h2 { - font-size: var(--pf-v5-global--FontSize--xl); -} - -h3 { - font-size: var(--pf-v5-global--FontSize--lg); -} - -h4 { - font-size: var(--pf-v5-global--FontSize--md); -} - -a { - color: currentcolor; -} - -a:not(.pf-v5-c-button,.pf-v5-c-nav__link,.pf-v5-c-menu__item), -// TODO: make it better, using PatternFly custom properties for overriding it -button.pf-m-plain, -button.pf-m-link { - text-decoration: underline; - text-decoration-thickness: 0.1em; - text-underline-offset: 0.2em; - transition: all 0.15s ease-in-out; - - &:hover { - color: var(--color-link-hover); - } -} - -.pf-v5-c-page__sidebar { - button.pf-m-link, - a.pf-m-link { - color: white; - text-decoration: underline; - } -} - -// Do not reserve space for empty nodes. -div:empty { - display: none; -} - -fieldset { - padding: var(--fs-base); - border: 0; - border-top: 1px solid var(--color-gray); - border-image: linear-gradient(45deg, var(--color-gray), transparent) 1; - - legend { - padding-inline-end: var(--fs-base); - margin-inline-start: calc(var(--fs-base) * -1); - } -} - -table { - border-collapse: collapse; -} - -th { - text-align: start; -} - -svg { - vertical-align: middle; -} - -li { - svg { - vertical-align: middle; - } -} - -// Style focus making use of :focus-visible -*:focus { - outline: none; -} - -*:focus:not(:focus-visible) { - box-shadow: none; -} - -*:focus-visible { - // outline: 1px dotted; - // outline-offset: 0.25rem; - box-shadow: 0 0 0 1px var(--focus-color); -} diff --git a/web/src/assets/styles/index.scss b/web/src/assets/styles/index.scss index d8a72887da..9fec27195c 100644 --- a/web/src/assets/styles/index.scss +++ b/web/src/assets/styles/index.scss @@ -1,11 +1 @@ -// PatternFly overrides -@use "~/assets/styles/patternfly-overrides.scss"; - -@use "~/assets/fonts.scss"; -@use "~/assets/styles/variables.scss"; -// TODO: merge app and global -@use "~/assets/styles/global.scss"; -@use "~/assets/styles/app.scss"; -@use "~/assets/styles/utilities.scss"; -@use "~/assets/styles/composition.scss"; -@use "~/assets/styles/blocks.scss"; +// File empty temporary as part of migration to PF6 diff --git a/web/src/assets/styles/patternfly-overrides.scss b/web/src/assets/styles/patternfly-overrides.scss deleted file mode 100644 index c65bf208d9..0000000000 --- a/web/src/assets/styles/patternfly-overrides.scss +++ /dev/null @@ -1,376 +0,0 @@ -:root { - // Overrides some PatternFly CSS variables using values - // from brand.suse.com - - // Font families - --pf-v5-global--FontFamily--text: var(--ff); - --pf-v5-global--FontFamily--text--vf: var(--ff); - --pf-v5-global--FontFamily--heading: var(--ff-headings); - --pf-v5-global--FontFamily--heading--vf: var(--ff-headings); - --pf-v5-global--FontFamily--monospace: var(--ff-code); - --pf-v5-global--FontFamily--monospace--vf: var(--ff-code); - - // Font sizes - --pf-v5-global--FontSize--4xl: 2em; - --pf-v5-global--FontSize--3xl: 1.75em; - --pf-v5-global--FontSize--2xl: 1.5em; - --pf-v5-global--FontSize--xl: 1.3em; - --pf-v5-global--FontSize--lg: 1.15em; - --pf-v5-global--FontSize--md: var(--fs-base); - - // Font weight - --pf-v5-global--FontWeight--light: var(--fw-light); - --pf-v5-global--FontWeight--normal: var(--fw-normal); - --pf-v5-global--FontWeight--semi-bold: var(--fw-medium); - --pf-v5-global--FontWeight--overpass--semi-bold: var(--fw-medium); - --pf-v5-global--FontWeight--bold: var(--fw-bold); - --pf-v5-global--FontWeight--overpass--bold: var(--fw-bold); - - // Colors - --pf-v5-global--primary-color--100: var(--color-primary); - --pf-v5-global--primary-color--200: var(--color-primary); - --pf-v5-global--link--Color: var(--color-link); - --pf-v5-global--link--Color--hover: var(--color-link-hover); - --pf-v5-global--BackgroundColor--dark-100: var(--color-primary); -} - -.pf-v5-c-button.pf-m-primary { - --pf-v5-c-button--m-primary--BackgroundColor: var(--color-button-primary); - --pf-v5-c-button--m-primary--hover--BackgroundColor: var(--color-button-primary-hover); -} - -// Make :hover style visible when the button is in a :focus state too -.pf-v5-c-button.pf-m-primary:focus:hover { - --pf-v5-c-button--m-primary--BackgroundColor: var(--color-button-primary-hover); -} - -.pf-v5-c-button.pf-m-link { - // Colors for buttons modifiers - --pf-v5-c-button--m-link--Color: var(--color-link); - --pf-v5-c-button--m-link--Color--hover: var(--color-link-hover); - --pf-v5-c-button--m-link--m-inline--hover--Color: var(--link-color-hover); -} - -.pf-v5-c-button.pf-m-plain { - --pf-v5-c-button--m-plain--Color: var(--color-button-plain-link); - --pf-v5-c-button--m-plain--hover--Color: var(--color-button-plain-link-hover); -} - -.pf-v5-c-button.pf-m-secondary { - --pf-v5-c-button--m-secondary--hover--after--BorderColor: var(--color-link-hover); - --pf-v5-c-button--m-secondary--hover--Color: var(--color-link-hover); -} - -// Make :hover style visible when the button is in a :focus state too -.pf-v5-c-button.pf-m-secondary:focus:hover { - --pf-v5-c-button--after--BorderColor: var(--color-link-hover); - --pf-v5-c-button--m-secondary--Color: var(--color-link-hover); -} - -// Redefine style for primary buttons placed at top bar -.pf-v5-c-masthead__content { - .pf-v5-c-button.pf-m-primary { - --pf-v5-c-button--FontSize: 120%; - --pf-v5-c-button--m-primary--BackgroundColor: var(--color-button-primary-hover); - letter-spacing: 1px; - } - - .pf-v5-c-button.pf-m-primary:hover { - --pf-v5-c-button--m-primary--BackgroundColor: #1ea064; // var(--color-button-primary); - } - - .pf-v5-c-button.pf-m-primary:focus:hover { - --pf-v5-c-button--m-primary--BackgroundColor: #1ea064; // var(--color-button-primary); - } - - .pf-v5-c-button.pf-m-warning { - color: var(--color-button-primary); - } -} - -.pf-v5-c-button.pf-m-primary .pf-v5-c-modal-box__body { - padding-block: var(--pf-v5-c-modal-box__body--PaddingTop); -} - -.pf-v5-c-modal-box__footer { - // We prefer buttons placed at the right - flex-direction: row-reverse; - - // Overrides buttons margins. In row-reverse mode, we need margin - // for the :last-child too. - // See https://github.com/patternfly/patternfly/blob/9c8cb7c8609613ab53eef3fe05addda16bc63233/src/patternfly/components/ModalBox/modal-box.scss#L211 - > .pf-v5-c-button { - margin-inline-end: var(--pf-v5-c-modal-box__footer--c-button--MarginRight); - } -} - -// Do not change the default cursor for labels forms because it is confusing -// -// See: -// * https://github.com/openSUSE/Agama/issues/115#issuecomment-1090205696 -// * https://github.com/patternfly/patternfly/issues/4777#issuecomment-1092090484 -.pf-v5-c-form__label { - --pf-v5-c-form__label--hover--Cursor: default; - --pf-v5-c-form__label--m-disabled--hover--Cursor: default; -} - -// Do not show top border for empty data lists -.pf-v5-c-data-list:empty { - --pf-v5-c-data-list--BorderTopWidth: 0; -} - -// Do not use thick border-top for data lists -.pf-v5-c-data-list { - --pf-v5-c-data-list--BorderTopWidth: 2px; -} - -.pf-v5-c-toolbar { - --pf-v5-c-toolbar--PaddingTop: 0; - --pf-v5-c-toolbar--PaddingBottom: 0; -} - -.pf-v5-c-toolbar__content { - --pf-v5-c-toolbar__content--PaddingRight: 0; - --pf-v5-c-toolbar__content--PaddingLeft: 0; -} - -.pf-v5-c-text-input-group__utilities .pf-v5-c-button { - padding: 0; -} - -.pf-m-grid-md { - &.pf-v5-c-table { - tbody:first-of-type { - --pf-v5-c-table--tbody--responsive--border-width--base: 4px; - } - - tr:not(.pf-v5-c-table__expandable-row) { - --pf-v5-c-table-tr--responsive--border-width--base: 4px; - } - } -} - -.pf-v5-c-switch { - // We prefer having same label color for checked and not checked switches - --pf-v5-c-switch__input--not-checked__label--Color: var( - --pf-v5-c-switch__input--checked__label--Color - ); -} - -// Make the switch focus looks like the rest -.pf-v5-c-switch__input:focus ~ .pf-v5-c-switch__toggle { - outline: none; - box-shadow: 0 0 0 1px var(--focus-color); -} - -// Avoid form select toggle icon overlap input Text -.pf-v5-c-form-control__toggle-icon { - padding-inline-end: 0; - margin-inline-start: calc(var(--pf-v5-c-form-control__toggle-icon--PaddingRight) * 2); -} - -// Adjust icons for a menu item -.pf-v5-c-menu__item { - svg { - // let SVGs inherit the same color than text - // useful for a `isDanger` item, for example. - fill: var(--pf-v5-c-menu__item--Color); - // and keep them centered - vertical-align: middle; - } -} - -// Center icon in the visibility button of password input form fields -.password-toggler span.pf-c-button__icon { - display: flex; -} - -.pf-v5-c-toggle-group__button.pf-m-selected { - --pf-v5-c-toggle-group__button--m-selected--BackgroundColor: var(--color-primary); - --pf-v5-c-toggle-group__button--Color: var(--color-gray-light); -} - -// Reduce padding of PF/Hint because it looks like an option of current Agama -// select -.pf-v5-c-hint { - --pf-v5-c-hint--PaddingTop: var(--spacer-small); - --pf-v5-c-hint--PaddingRight: var(--spacer-small); - --pf-v5-c-hint--PaddingBottom: var(--spacer-small); - --pf-v5-c-hint--PaddingLeft: var(--spacer-small); -} - -// Do not reserve space for PF/Hint actions when there are none -.pf-v5-c-hint__actions:empty { - display: none; -} - -// Make PF/ExpandableSection looks a bit different when wrapped in a PF/Hint -.pf-v5-c-hint { - .pf-v5-c-expandable-section { - --pf-v5-c-expandable-section__toggle--Color: var(--color-primary); - } - - .pf-v5-c-expandable-section__toggle, - .pf-v5-c-expandable-section__toggle:hover { - // NOTE. would be nice to being able to use darker variant of primary color - // when hovering the link, but we aren't ready yet. We should switch to hsla - // colors or so. - --pf-v5-c-expandable-section__toggle--Color: var(--color-primary); - text-decoration: underline; - } - - .pf-v5-c-expandable-section__content { - --pf-v5-c-expandable-section__content--PaddingRight: var(--spacer-normal); - --pf-v5-c-expandable-section__content--PaddingLeft: var(--spacer-normal); - } -} - -.pf-v5-c-form__group.pf-m-action { - --pf-v5-c-form__group--m-action--MarginTop: var(--spacer-small); -} - -.pf-v5-c-form__group-label-help { - margin: 0; - padding: 0; - vertical-align: top; -} - -.pf-m-grid-md.pf-v5-c-table .pf-v5-c-menu-toggle { - padding-inline: 0; -} - -// Styles for tree table used by storage page. - -.pf-v5-c-table tbody { - border-block-end: var(--pf-v5-c-table--border-width--base) solid var(--pf-v5-c-table--BorderColor); -} - -.pf-v5-c-table td > .pf-v5-c-form-control { - inline-size: max-content; -} - -.pf-v5-c-table tr[aria-level="1"] { - border-block-end: 0; - border-block-start: var(--pf-v5-c-table--border-width--base) solid - var(--pf-v5-c-table--BorderColor); -} - -.pf-v5-c-table tr[aria-level="2"] { - border-block-end: 0; -} - -.pf-v5-c-radio { - align-items: center; -} - -.pf-v5-c-radio__label { - font-size: var(--pf-v5-c-form__label--FontSize); -} - -@media screen and (width <= 768px) { - .pf-m-grid-md.pf-v5-c-table tr:where(.pf-v5-c-table__tr):not(.pf-v5-c-table__expandable-row) { - padding-inline: 0; - } -} - -// New-ui overrides -// ================ - -// For using icons, set fill as color. -.pf-v5-c-nav__link { - fill: var(--pf-v5-c-nav__link--Color); -} - -.pf-v5-c-page__sidebar-body { - fill: white; -} - -// center alignment and a bit of gap makes links with icons looks better -.pf-v5-c-nav__link { - align-items: center; - gap: calc(var(--pf-v5-c-nav__link--FontSize) / 2); -} - -// Allows the pf-m-current directly in the a element instead of li. -// Needed because setting the pf-m-current in ReactRouter/NavLink (the one -// that know the link "isActive") - -.pf-v5-c-tabs__link.pf-m-current { - --pf-v5-c-tabs__link--after--BorderColor: var( - --pf-v5-c-tabs__item--m-current__link--after--BorderColor - ); - --pf-v5-c-tabs__link--after--BorderWidth: var( - --pf-v5-c-tabs__item--m-current__link--after--BorderWidth - ); -} - -// Color for icons in Masthead -.pf-v5-c-masthead { - fill: white; -} - -:not(.pf-m-light-200).pf-v5-c-masthead { - .pf-v5-c-button.pf-m-link, - .pf-v5-c-button.pf-m-plain { - color: white; - } -} - -// Force sidebar to only use needed width plus an extra padding at the end. -.pf-v5-c-page__sidebar.pf-m-expanded { - --pf-v5-c-page__sidebar--Width: fit-content; - - .pf-v5-c-nav__link { - padding-inline-end: calc(var(--pf-v5-global--spacer--xl) * 1.2); - } -} - -// Makes the NotificationDrawerHeader "plain" -.pf-v5-c-notification-drawer { - --pf-v5-c-notification-drawer--BackgroundColor: white; -} - -.pf-v5-c-notification-drawer__list-item { - --pf-v5-c-notification-drawer__list-item--PaddingBottom: 0; - --pf-v5-c-notification-drawer__list-item--BoxShadow: none; -} - -.pf-v5-c-notification-drawer__list-item-description { - padding-inline-start: calc( - 1em + var(--pf-v5-c-notification-drawer__list-item-header-icon--MarginRight) - ); -} - -.pf-v5-c-progress-stepper.progress-report { - .pf-v5-c-progress-stepper__step-connector, - .pf-v5-c-progress-stepper__step-main { - inline-size: 250px; - } -} - -// A temporary workaround to fix "stacking contexts" problems with scroll and -// sticky page sections in Agama layout. It will not be needed when migrating to -// latest PF6 release, since the root of the problem has been addressed there by -// removing the DrawerContentBody from the Page component. See -// https://github.com/patternfly/patternfly/pull/7130 and related links -.pf-v5-c-drawer__body { - display: contents; -} - -.menu-toggle-inline { - padding-inline-start: 0.5ch; -} - -// FIXME: Some of these pf-v5-c-menu__list overrides shouldn't be needed, specially after migrating a PF6 -.pf-v5-c-menu__list { - --pf-v5-c-list--nested--MarginTop: 0; - --pf-v5-c-list--nested--MarginLeft: 0; - --pf-v5-c-menu__list--PaddingTop: 0; - --pf-v5-c-menu__list--PaddingBottom: 0; - --pf-v5-c-menu__list--c-divider--MarginTop: 0; - --pf-v5-c-menu__list--c-divider--MarginBottom: 0; - - li + li { - --pf-v5-c-list--li--MarginTop: 0; - } -} diff --git a/web/src/assets/styles/utilities.scss b/web/src/assets/styles/utilities.scss deleted file mode 100644 index 3205abd5a0..0000000000 --- a/web/src/assets/styles/utilities.scss +++ /dev/null @@ -1,147 +0,0 @@ -// Sadly, Firefox does not support :has pseudo-selector yet. -// See @components/layout/Center documentation. -// -// main:has(.vertically-centered) { -// display: grid; -// place-items: center; -// block-size: 100%; -// } - -//.content-block-centered { -.vertically-centered { - display: grid; - place-items: center; - block-size: 100%; - inline-size: 100%; -} - -// Utility classes for sizing icons -.icon-xxxs { - block-size: var(--icon-size-xxxs); - inline-size: var(--icon-size-xxxs); -} - -.icon-xxs { - block-size: var(--icon-size-xxs); - inline-size: var(--icon-size-xxs); -} - -.icon-xs { - block-size: var(--icon-size-xs); - inline-size: var(--icon-size-xs); -} - -.icon-s { - block-size: var(--icon-size-s); - inline-size: var(--icon-size-s); -} - -.icon-xl { - block-size: var(--icon-size-xl); - inline-size: var(--icon-size-xl); -} - -.icon-xxl { - block-size: var(--icon-size-xxl); - inline-size: var(--icon-size-xxl); -} - -.icon-xxxl { - block-size: var(--icon-size-xxxl); - inline-size: var(--icon-size-xxxl); -} - -.color-success { - color: var(--color-success); - fill: var(--color-success); -} - -.full-width { - inline-size: 100%; -} - -.block-size-auto { - block-size: auto; -} - -.inline-size-auto { - inline-size: auto; -} - -.block-size-small, -.block-size-medium, -.block-size-large { - block-size: calc(100dvb - var(--space-large)); -} - -.inline-size-small, -.inline-size-medium, -.inline-size-large { - inline-size: calc(100dvi - var(--spacer-large)); -} - -@media (height > 500px) { - .block-size-small { - block-size: 30dvb; - } - - .block-size-medium { - block-size: 60dvb; - } - - .block-size-large { - block-size: 90dvb; - } -} - -@media (width > 500px) { - .inline-size-small, - .inline-size-medium, - .inline-size-large { - min-inline-size: calc(500px - var(--spacer-large)); - } - - .inline-size-small { - inline-size: 30dvi; - } - - .inline-size-medium { - inline-size: 60dvi; - max-inline-size: var(--ui-max-inline-size); - } - - .inline-size-large { - inline-size: 90dvi; - max-inline-size: calc(var(--ui-max-inline-size) * 2); - } -} - -.scrollbox { - background: - linear-gradient(#fff 33%, rgb(255 255 255 / 0%)), - linear-gradient(rgb(255 255 255 / 0%), #fff 66%) 0 100%, - radial-gradient(farthest-side at 50% 0, rgb(102 102 102 / 50%), rgb(0 0 0 / 0%)), - radial-gradient(farthest-side at 50% 100%, rgba(102 102 102 / 50%), rgb(0 0 0 / 0%)) 0 100%; - background-color: #fff; - background-repeat: no-repeat; - background-attachment: local, local, scroll, scroll; - background-size: - 100% 48px, - 100% 48px, - 100% 16px, - 100% 16px; -} - -.cursor-pointer { - cursor: pointer; -} - -// FIXME: drop as soon as Tip component gets rethought / refactored -.label-tip .pf-v5-c-label__text { - display: flex; - gap: var(--spacer-smaller); -} - -.no-padding { - padding: 0; -} diff --git a/web/src/assets/styles/variables.scss b/web/src/assets/styles/variables.scss deleted file mode 100644 index 7e35e4e433..0000000000 --- a/web/src/assets/styles/variables.scss +++ /dev/null @@ -1,58 +0,0 @@ -:root { - --ff: "Lato", arial, helvetica, sans-serif; - --ff-headlines: "Poppins", sans-serif; - --ff-code: "Roboto Mono", monospace; - - --fw-light: 300; - --fw-normal: 400; - --fw-medium: 500; - --fw-bold: 700; - - --fs-small: 0.7rem; - --fs-medium: 12px; - --fs-base: 14px; - --fs-large: 1rem; - --fs-h1: 1.5rem; - --fs-h2: 1.2rem; - --fs-h3: 1rem; - - --lh-normal: 1.5; - --lh-medium: 1.6; - --lh-large: 1.7; - - --ui-max-inline-size: 1024px; - - // FIXME: this should be changed to --spacer-xs, --spacer-s, and so - --spacer-smaller: 0.3rem; - --spacer-small: 0.5rem; - --spacer-normal: 1rem; - --spacer-medium: 1.5rem; - --spacer-large: 2rem; - - --icon-size-xxxs: 12px; - --icon-size-xxs: 16px; - --icon-size-xs: 20px; - --icon-size-s: 24px; - --icon-size: 28px; - --icon-size-m: 32px; - --icon-size-l: 36px; - --icon-size-xl: 40px; - --icon-size-xxl: 5rem; - --icon-size-xxxl: 10rem; - - --color-primary: #0c322c; - --color-gray-light: #fcfcfc; - --color-gray: #f2f2f2; - --color-gray-dark: #efefef; // Fog - --color-gray-dimmed: #888; - --color-success: #30ba78; - - --color-link: #0c322c; - --color-link-hover: #30ba78; - --color-button-primary: var(--color-link); - --color-button-primary-hover: var(--color-link-hover); - --color-button-plain-link: var(--color-link); - --color-button-plain-link-hover: var(--color-link-hover); - - --focus-color: #00b2e2; //cerulean 500 -} From 9b32c8b14c191ffe38ccad948360f90ac5d7b1b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 16 Jan 2025 14:42:02 +0000 Subject: [PATCH 082/109] fix(web): use PF/Content for headings To allow PatternFly style them as expected --- web/src/components/core/ProgressReport.tsx | 11 ++++------- web/src/components/l10n/KeyboardSelection.tsx | 2 +- web/src/components/l10n/L10nPage.tsx | 4 ++-- web/src/components/l10n/LocaleSelection.tsx | 4 ++-- web/src/components/l10n/TimezoneSelection.tsx | 2 +- web/src/components/network/IpSettingsForm.tsx | 5 +++-- web/src/components/network/NetworkPage.tsx | 6 +++--- web/src/components/network/WifiNetworksListPage.tsx | 7 ++++++- web/src/components/network/WifiSelectorPage.tsx | 4 ++-- web/src/components/overview/OverviewPage.tsx | 6 +++--- .../components/product/ProductRegistrationPage.tsx | 3 ++- web/src/components/software/SoftwarePage.tsx | 3 ++- .../components/software/SoftwarePatternsSelection.tsx | 7 ++++--- web/src/components/storage/BootSelection.tsx | 4 ++-- web/src/components/storage/ISCSIPage.tsx | 4 ++-- web/src/components/storage/ProposalPage.tsx | 6 +++--- web/src/components/storage/SpacePolicySelection.tsx | 4 ++-- web/src/components/storage/dasd/DASDPage.tsx | 6 +++--- .../storage/zfcp/ZFCPDiskActivationPage.tsx | 6 +++--- web/src/components/storage/zfcp/ZFCPPage.tsx | 7 ++++--- web/src/components/users/FirstUserForm.tsx | 5 +++-- web/src/components/users/UsersPage.tsx | 6 +++--- 22 files changed, 60 insertions(+), 52 deletions(-) diff --git a/web/src/components/core/ProgressReport.tsx b/web/src/components/core/ProgressReport.tsx index 686b2438a6..a7cf0e3924 100644 --- a/web/src/components/core/ProgressReport.tsx +++ b/web/src/components/core/ProgressReport.tsx @@ -25,6 +25,7 @@ import { Bullseye, Card, CardBody, + Content, Flex, Grid, GridItem, @@ -130,10 +131,6 @@ function ProgressReport({ title, firstStep }: { title: string; firstStep?: React }, [progress, steps]); const detail = findDetail([softwareProgress, storageProgress]); - const Content = () => ( - - ); - return ( @@ -146,10 +143,10 @@ function ProgressReport({ title, firstStep }: { title: string; firstStep?: React alignItems={{ default: "alignItemsCenter" }} > -

+ {title} -

- + + diff --git a/web/src/components/l10n/KeyboardSelection.tsx b/web/src/components/l10n/KeyboardSelection.tsx index dce08d3192..5a5d0ae1b4 100644 --- a/web/src/components/l10n/KeyboardSelection.tsx +++ b/web/src/components/l10n/KeyboardSelection.tsx @@ -75,7 +75,7 @@ export default function KeyboardSelection() { return ( -

{_("Keyboard selection")}

+ {_("Keyboard selection")}
diff --git a/web/src/components/l10n/L10nPage.tsx b/web/src/components/l10n/L10nPage.tsx index 4e0121f788..64ed22dd09 100644 --- a/web/src/components/l10n/L10nPage.tsx +++ b/web/src/components/l10n/L10nPage.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { Gallery, GalleryItem } from "@patternfly/react-core"; +import { Content, Gallery, GalleryItem } from "@patternfly/react-core"; import { Link, Page } from "~/components/core"; import { L10N as PATHS } from "~/routes/paths"; import { _ } from "~/i18n"; @@ -39,7 +39,7 @@ export default function L10nPage() { return ( -

{_("Localization")}

+ {_("Localization")}
diff --git a/web/src/components/l10n/LocaleSelection.tsx b/web/src/components/l10n/LocaleSelection.tsx index 2446a52e09..e2b7830af6 100644 --- a/web/src/components/l10n/LocaleSelection.tsx +++ b/web/src/components/l10n/LocaleSelection.tsx @@ -21,7 +21,7 @@ */ import React, { useState } from "react"; -import { Flex, Form, FormGroup, Radio } from "@patternfly/react-core"; +import { Content, Flex, Form, FormGroup, Radio } from "@patternfly/react-core"; import { useNavigate } from "react-router-dom"; import { ListSearch, Page } from "~/components/core"; import { _ } from "~/i18n"; @@ -78,7 +78,7 @@ export default function LocaleSelection() { return ( -

{_("Locale selection")}

+ {_("Locale selection")}
diff --git a/web/src/components/l10n/TimezoneSelection.tsx b/web/src/components/l10n/TimezoneSelection.tsx index 30136056fe..7720a9df7f 100644 --- a/web/src/components/l10n/TimezoneSelection.tsx +++ b/web/src/components/l10n/TimezoneSelection.tsx @@ -117,7 +117,7 @@ export default function TimezoneSelection() { return ( -

{_(" Timezone selection")}

+ {_(" Timezone selection")} -

{sprintf(_("Edit connection %s"), connection.id)}

+ {sprintf(_("Edit connection %s"), connection.id)}
diff --git a/web/src/components/network/NetworkPage.tsx b/web/src/components/network/NetworkPage.tsx index 83c3a16166..05d318c937 100644 --- a/web/src/components/network/NetworkPage.tsx +++ b/web/src/components/network/NetworkPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * @@ -21,7 +21,7 @@ */ import React from "react"; -import { Grid, GridItem } from "@patternfly/react-core"; +import { Content, Grid, GridItem } from "@patternfly/react-core"; import { Link, EmptyState, Page } from "~/components/core"; import ConnectionsTable from "~/components/network/ConnectionsTable"; import { _ } from "~/i18n"; @@ -103,7 +103,7 @@ export default function NetworkPage() { return ( -

{_("Network")}

+ {_("Network")}
diff --git a/web/src/components/network/WifiNetworksListPage.tsx b/web/src/components/network/WifiNetworksListPage.tsx index b816384f32..1e517c6777 100644 --- a/web/src/components/network/WifiNetworksListPage.tsx +++ b/web/src/components/network/WifiNetworksListPage.tsx @@ -25,6 +25,7 @@ import { Button, Card, CardBody, + Content, DataList, DataListCell, DataListItem, @@ -166,7 +167,11 @@ const WifiDrawerPanelBody = ({ const NetworkFormName = ({ network }) => { if (!network) return; - return

{network === HIDDEN_NETWORK ? _("Connect to hidden network") : network.ssid}

; + return ( + + {network === HIDDEN_NETWORK ? _("Connect to hidden network") : network.ssid} + + ); }; const NetworkListName = ({ network, ...props }) => { diff --git a/web/src/components/network/WifiSelectorPage.tsx b/web/src/components/network/WifiSelectorPage.tsx index c650686362..c1d7d000da 100644 --- a/web/src/components/network/WifiSelectorPage.tsx +++ b/web/src/components/network/WifiSelectorPage.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { Grid, GridItem } from "@patternfly/react-core"; +import { Content, Grid, GridItem } from "@patternfly/react-core"; import { Page } from "~/components/core"; import WifiNetworksListPage from "~/components/network/WifiNetworksListPage"; import { useNetworkConfigChanges } from "~/queries/network"; @@ -33,7 +33,7 @@ function WifiSelectorPage() { return ( -

{_("Connect to a Wi-Fi network")}

+ {_("Connect to a Wi-Fi network")}
diff --git a/web/src/components/overview/OverviewPage.tsx b/web/src/components/overview/OverviewPage.tsx index 17f0efadc9..052c19a7f4 100644 --- a/web/src/components/overview/OverviewPage.tsx +++ b/web/src/components/overview/OverviewPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * @@ -21,7 +21,7 @@ */ import React from "react"; -import { Grid, GridItem, Stack } from "@patternfly/react-core"; +import { Content, Grid, GridItem, Stack } from "@patternfly/react-core"; import { Page } from "~/components/core"; import L10nSection from "./L10nSection"; import StorageSection from "./StorageSection"; @@ -32,7 +32,7 @@ export default function OverviewPage() { return ( -

{_("Overview")}

+ {_("Overview")}
diff --git a/web/src/components/product/ProductRegistrationPage.tsx b/web/src/components/product/ProductRegistrationPage.tsx index 346dbe40c4..45d2dda90e 100644 --- a/web/src/components/product/ProductRegistrationPage.tsx +++ b/web/src/components/product/ProductRegistrationPage.tsx @@ -25,6 +25,7 @@ import { ActionGroup, Alert, Button, + Content, DescriptionList, DescriptionListDescription, DescriptionListGroup, @@ -151,7 +152,7 @@ export default function ProductRegistrationPage() { return ( -

{_("Registration")}

+ {_("Registration")}
diff --git a/web/src/components/software/SoftwarePage.tsx b/web/src/components/software/SoftwarePage.tsx index f22a2ae263..bcdcdacad3 100644 --- a/web/src/components/software/SoftwarePage.tsx +++ b/web/src/components/software/SoftwarePage.tsx @@ -22,6 +22,7 @@ import React from "react"; import { + Content, DescriptionList, DescriptionListDescription, DescriptionListGroup, @@ -103,7 +104,7 @@ function SoftwarePage(): React.ReactNode { return ( -

{_("Software")}

+ {_("Software")}
diff --git a/web/src/components/software/SoftwarePatternsSelection.tsx b/web/src/components/software/SoftwarePatternsSelection.tsx index e2f441cc0e..7f081a5c04 100644 --- a/web/src/components/software/SoftwarePatternsSelection.tsx +++ b/web/src/components/software/SoftwarePatternsSelection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * @@ -31,6 +31,7 @@ import { DataListItemRow, SearchInput, Stack, + Content, } from "@patternfly/react-core"; import { Page } from "~/components/core"; import { useConfigMutation, usePatterns } from "~/queries/software"; @@ -136,7 +137,7 @@ function SoftwarePatternsSelection(): React.ReactNode { .map((p) => p.name); return (
-

{groupName}

+ {groupName} {groups[groupName].map((option) => { const titleId = `${option.name}-title`; @@ -184,7 +185,7 @@ function SoftwarePatternsSelection(): React.ReactNode { return ( -

{_("Software selection")}

+ {_("Software selection")} -

{_("Boot options")}

+ {_("Boot options")}

{description}

diff --git a/web/src/components/storage/ISCSIPage.tsx b/web/src/components/storage/ISCSIPage.tsx index a61fa35d82..32a02eb6c9 100644 --- a/web/src/components/storage/ISCSIPage.tsx +++ b/web/src/components/storage/ISCSIPage.tsx @@ -20,7 +20,7 @@ * find current contact information at www.suse.com. */ -import { Grid, GridItem } from "@patternfly/react-core"; +import { Content, Grid, GridItem } from "@patternfly/react-core"; import React from "react"; import { Page } from "~/components/core"; import { InitiatorSection, TargetsSection } from "~/components/storage/iscsi"; @@ -31,7 +31,7 @@ export default function ISCSIPage() { return ( -

{_("iSCSI")}

+ {_("iSCSI")}
diff --git a/web/src/components/storage/ProposalPage.tsx b/web/src/components/storage/ProposalPage.tsx index 8ceb3dfd33..8271a37681 100644 --- a/web/src/components/storage/ProposalPage.tsx +++ b/web/src/components/storage/ProposalPage.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { Grid, GridItem, SplitItem } from "@patternfly/react-core"; +import { Content, Grid, GridItem, SplitItem } from "@patternfly/react-core"; import { Page } from "~/components/core/"; import { Loading } from "~/components/layout"; import EncryptionField from "~/components/storage/EncryptionField"; @@ -85,7 +85,7 @@ export default function ProposalPage() { return ( -

{_("Storage")}

+ {_("Storage")}
@@ -98,7 +98,7 @@ export default function ProposalPage() { return ( -

{_("Storage")}

+ {_("Storage")}
diff --git a/web/src/components/storage/SpacePolicySelection.tsx b/web/src/components/storage/SpacePolicySelection.tsx index 484da7f7a0..af28551858 100644 --- a/web/src/components/storage/SpacePolicySelection.tsx +++ b/web/src/components/storage/SpacePolicySelection.tsx @@ -21,7 +21,7 @@ */ import React, { useState } from "react"; -import { Card, CardBody, Form, Grid, GridItem } from "@patternfly/react-core"; +import { Card, CardBody, Content, Form, Grid, GridItem } from "@patternfly/react-core"; import { useNavigate, useParams } from "react-router-dom"; import { Page } from "~/components/core"; import { SpaceActionsTable } from "~/components/storage"; @@ -100,7 +100,7 @@ export default function SpacePolicySelection() { return ( -

{sprintf(_("Find space in %s"), device.name)}

+ {sprintf(_("Find space in %s"), device.name)}

{description}

diff --git a/web/src/components/storage/dasd/DASDPage.tsx b/web/src/components/storage/dasd/DASDPage.tsx index 0c10845f67..fba4d4b8b9 100644 --- a/web/src/components/storage/dasd/DASDPage.tsx +++ b/web/src/components/storage/dasd/DASDPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * @@ -21,7 +21,7 @@ */ import React from "react"; -import { Stack } from "@patternfly/react-core"; +import { Content, Stack } from "@patternfly/react-core"; import { Page } from "~/components/core"; import DASDTable from "./DASDTable"; import DASDFormatProgress from "./DASDFormatProgress"; @@ -36,7 +36,7 @@ export default function DASDPage() { return ( -

{_("DASD")}

+ {_("DASD")}
diff --git a/web/src/components/storage/zfcp/ZFCPDiskActivationPage.tsx b/web/src/components/storage/zfcp/ZFCPDiskActivationPage.tsx index 7ffa368ffb..7cdb634d6c 100644 --- a/web/src/components/storage/zfcp/ZFCPDiskActivationPage.tsx +++ b/web/src/components/storage/zfcp/ZFCPDiskActivationPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * @@ -21,7 +21,7 @@ */ import React, { useState } from "react"; -import { Grid, GridItem } from "@patternfly/react-core"; +import { Content, Grid, GridItem } from "@patternfly/react-core"; import { Page } from "~/components/core"; import { _ } from "~/i18n"; import { useCancellablePromise } from "~/utils"; @@ -59,7 +59,7 @@ export default function ZFCPDiskActivationPage() { return ( -

{_("zFCP Disk Activation")}

+ {_("zFCP Disk Activation")}
diff --git a/web/src/components/storage/zfcp/ZFCPPage.tsx b/web/src/components/storage/zfcp/ZFCPPage.tsx index 25294b981c..caa8ded2af 100644 --- a/web/src/components/storage/zfcp/ZFCPPage.tsx +++ b/web/src/components/storage/zfcp/ZFCPPage.tsx @@ -25,6 +25,7 @@ import React from "react"; import { Button, + Content, Grid, GridItem, Toolbar, @@ -145,7 +146,7 @@ const ControllersSection = () => ( ); -const Content = () => { +const PageContent = () => { const controllers = useZFCPControllers(); if (controllers.length === 0) { @@ -187,11 +188,11 @@ export default function ZFCPPage() { return ( -

{_("zFCP")}

+ {_("zFCP")}
- + diff --git a/web/src/components/users/FirstUserForm.tsx b/web/src/components/users/FirstUserForm.tsx index e4ce5cf243..ddc6a61896 100644 --- a/web/src/components/users/FirstUserForm.tsx +++ b/web/src/components/users/FirstUserForm.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * @@ -35,6 +35,7 @@ import { GridItem, Stack, Switch, + Content, } from "@patternfly/react-core"; import { useNavigate } from "react-router-dom"; import { Loading } from "~/components/layout"; @@ -206,7 +207,7 @@ export default function FirstUserForm() { return ( -

{state.isEditing ? _("Edit user") : _("Create user")}

+ {state.isEditing ? _("Edit user") : _("Create user")}
diff --git a/web/src/components/users/UsersPage.tsx b/web/src/components/users/UsersPage.tsx index 038ef94aa6..11401cf595 100644 --- a/web/src/components/users/UsersPage.tsx +++ b/web/src/components/users/UsersPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * @@ -21,7 +21,7 @@ */ import React from "react"; -import { Grid, GridItem } from "@patternfly/react-core"; +import { Content, Grid, GridItem } from "@patternfly/react-core"; import { IssuesHint, Page } from "~/components/core"; import { FirstUser, RootAuthMethods } from "~/components/users"; import { useIssues } from "~/queries/issues"; @@ -33,7 +33,7 @@ export default function UsersPage() { return ( -

{_("Users")}

+ {_("Users")}
From 2b478d5184b1f8dc3ae3057d383c9ce6a9559c33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 16 Jan 2025 14:59:58 +0000 Subject: [PATCH 083/109] fix(web): return back the PF/Modal variant prop Which was replaced by custom size properties for having better control with the previous PatternFly version. --- web/src/components/core/Popup.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/src/components/core/Popup.tsx b/web/src/components/core/Popup.tsx index 8bf1f7fb5b..95a110231c 100644 --- a/web/src/components/core/Popup.tsx +++ b/web/src/components/core/Popup.tsx @@ -46,7 +46,7 @@ export type PopupProps = { isLoading?: boolean; /** Text displayed when `isLoading` is set to `true` */ loadingText?: string; -} & Omit & +} & Omit & Pick; /** @@ -210,6 +210,7 @@ const Popup = ({ loadingText = _("Loading data..."), inlineSize = "medium", blockSize = "auto", + variant = "medium", className = "", children, ...props @@ -224,6 +225,7 @@ const Popup = ({ return ( /** @ts-ignore */ Date: Thu, 16 Jan 2025 15:20:28 +0000 Subject: [PATCH 084/109] fix(web): adjust core/Page code for heading --- web/src/components/core/Page.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/web/src/components/core/Page.tsx b/web/src/components/core/Page.tsx index 83d3593d61..639fd2ef5b 100644 --- a/web/src/components/core/Page.tsx +++ b/web/src/components/core/Page.tsx @@ -37,6 +37,7 @@ import { PageSectionProps, Split, Stack, + Title, TitleProps, } from "@patternfly/react-core"; import { Flex } from "~/components/layout"; @@ -65,7 +66,7 @@ type SectionProps = { /** A React node with a brief description of what the section is for */ description?: React.ReactNode; /** The heading level used for the section title */ - headerLevel?: TitleProps["headingLevel"]; + headingLevel?: TitleProps["headingLevel"]; /** Props to influence PF/Card component wrapping the section */ pfCardProps?: CardProps; /** Props to influence PF/CardHeader component wrapping the section title */ @@ -128,7 +129,7 @@ const Section = ({ value, description, actions, - headerLevel: Title = "h3", + headingLevel = "h3", pfCardProps, pfCardHeaderProps, pfCardBodyProps, @@ -155,7 +156,11 @@ const Section = ({ - {hasTitle && {title}} + {hasTitle && ( + + {title} + + )} {hasValue && ( {value} From 0e06ba87a9c673bb0e2fd7bfe0ef840dd37dfc11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 17 Jan 2025 07:56:37 +0000 Subject: [PATCH 085/109] refactor(web): re-adapt install button to PF v6 --- web/src/assets/styles/index.scss | 23 +++++++++++- .../components/core/InstallButton.test.tsx | 6 +-- web/src/components/core/InstallButton.tsx | 37 ++++++++++--------- web/src/components/layout/Icon.tsx | 2 + 4 files changed, 45 insertions(+), 23 deletions(-) diff --git a/web/src/assets/styles/index.scss b/web/src/assets/styles/index.scss index 9fec27195c..3ebbfdfdc5 100644 --- a/web/src/assets/styles/index.scss +++ b/web/src/assets/styles/index.scss @@ -1 +1,22 @@ -// File empty temporary as part of migration to PF6 +// Temporary CSS rules as part of the migration to PF6. They are expected to +// change significantly, especially the token names, as the interface +// customization is refined. + +:root { + --agm-t--color--pine: #0c322c; + + --agm-t--install--button--background: var(--agm-t--color--pine); + --agm-t--install--button--color: var(--pf-t--color--white); +} + +.agm-install-button { + background: var(--agm-t--install--button--background); + color: var(--agm-t--install--button--color); + font-weight: 600; + font-size: var(--pf-t--global--font--size--md); + align-items: center; + + svg { + fill: var(--agm-t--install--button--color); + } +} diff --git a/web/src/components/core/InstallButton.test.tsx b/web/src/components/core/InstallButton.test.tsx index 405be9e851..206183a215 100644 --- a/web/src/components/core/InstallButton.test.tsx +++ b/web/src/components/core/InstallButton.test.tsx @@ -69,12 +69,10 @@ describe("InstallButton", () => { it("renders additional information to warn users about found problems", () => { const { container } = installerRender(); - const button = screen.getByRole("button", { name: /Install/ }); + screen.getByRole("button", { name: /Install/ }); // An exlamation icon as visual mark const icon = container.querySelector("svg"); - expect(icon).toHaveAttribute("data-icon-name", "exclamation"); - // An aria-label for users using an screen reader - within(button).getByLabelText(/Not possible with the current setup/); + expect(icon).toHaveAttribute("data-icon-name", "error_fill"); }); it("triggers the onClickWithIssues callback without rendering the confirmation dialog", async () => { diff --git a/web/src/components/core/InstallButton.tsx b/web/src/components/core/InstallButton.tsx index 0faaf87461..3fb7b40db4 100644 --- a/web/src/components/core/InstallButton.tsx +++ b/web/src/components/core/InstallButton.tsx @@ -20,8 +20,8 @@ * find current contact information at www.suse.com. */ -import React, { useState } from "react"; -import { Button, ButtonProps, Stack } from "@patternfly/react-core"; +import React, { useId, useState } from "react"; +import { Button, ButtonProps, Stack, Tooltip } from "@patternfly/react-core"; import { Popup } from "~/components/core"; import { startInstallation } from "~/api/manager"; import { useAllIssues } from "~/queries/issues"; @@ -41,7 +41,7 @@ import { Icon } from "../layout"; const InstallConfirmationPopup = ({ onAccept, onClose }) => { return ( - +

{_( @@ -77,6 +77,8 @@ according to the provided installation settings.", const InstallButton = ( props: Omit & { onClickWithIssues?: () => void }, ) => { + const labelId = useId(); + const tooltipId = useId(); const issues = useAllIssues(); const [isOpen, setIsOpen] = useState(false); const location = useLocation(); @@ -94,24 +96,23 @@ const InstallButton = ( // TRANSLATORS: The install button label const buttonText = _("Install"); - // TRANSLATORS: Accessible text included with the install button when there are issues - const withIssuesAriaLabel = _("Not possible with the current setup. Click to know more."); + // TRANSLATORS: Text included with the install button when there are issues + const withIssuesText = _("Not possible with the current setup. Click to know more."); return ( <> - + + + {isOpen && } diff --git a/web/src/components/layout/Icon.tsx b/web/src/components/layout/Icon.tsx index 2a0b5992ae..e5c5ef71ac 100644 --- a/web/src/components/layout/Icon.tsx +++ b/web/src/components/layout/Icon.tsx @@ -39,6 +39,7 @@ import Downloading from "@icons/downloading.svg?component"; import Edit from "@icons/edit.svg?component"; import EditSquare from "@icons/edit_square.svg?component"; import Error from "@icons/error.svg?component"; +import ErrorFill from "@icons/error-fill.svg?component"; import Exclamation from "@icons/exclamation.svg?component"; import ExpandAll from "@icons/expand_all.svg?component"; import ExpandCircleDown from "@icons/expand_circle_down.svg?component"; @@ -106,6 +107,7 @@ const icons = { edit: Edit, edit_square: EditSquare, error: Error, + error_fill: ErrorFill, exclamation: Exclamation, expand_all: ExpandAll, expand_circle_down: ExpandCircleDown, From aef03b81020f8bff63f0765315b31ad1b245378a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Sun, 19 Jan 2025 00:17:18 +0000 Subject: [PATCH 086/109] fix(web): stop using "lg" size for page actions By default, still being possible to influence the size through props, although most probably the Page.Action will be obsoleted. --- web/src/components/core/InstallationFinished.tsx | 2 +- web/src/components/core/Page.test.tsx | 9 +-------- web/src/components/core/Page.tsx | 8 ++------ web/src/components/product/ProductSelectionPage.tsx | 2 +- 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/web/src/components/core/InstallationFinished.tsx b/web/src/components/core/InstallationFinished.tsx index d510638203..5f585667b6 100644 --- a/web/src/components/core/InstallationFinished.tsx +++ b/web/src/components/core/InstallationFinished.tsx @@ -138,7 +138,7 @@ function InstallationFinished() { - diff --git a/web/src/components/core/Page.test.tsx b/web/src/components/core/Page.test.tsx index e85dc4baf3..0b302ffef1 100644 --- a/web/src/components/core/Page.test.tsx +++ b/web/src/components/core/Page.test.tsx @@ -72,12 +72,6 @@ describe("Page", () => { screen.getByRole("button", { name: "Save" }); }); - it("renders an 'lg' button when size prop is not given", () => { - plainRender(Cancel); - const button = screen.getByRole("button", { name: "Cancel" }); - expect(button.classList.contains("pf-m-display-lg")).toBe(true); - }); - describe("when user clicks on it", () => { it("triggers given onClick handler, if valid", async () => { const onClick = jest.fn(); @@ -144,11 +138,10 @@ describe("Page", () => { expect(mockNavigateFn).toHaveBeenCalledWith(-1); }); - it("uses `lg` size and `link` variant by default", () => { + it("uses `link` variant by default", () => { plainRender(); const button = screen.getByRole("button", { name: "Back" }); expect(button.classList.contains("pf-m-link")).toBe(true); - expect(button.classList.contains("pf-m-display-lg")).toBe(true); }); }); diff --git a/web/src/components/core/Page.tsx b/web/src/components/core/Page.tsx index 639fd2ef5b..f68b5de323 100644 --- a/web/src/components/core/Page.tsx +++ b/web/src/components/core/Page.tsx @@ -224,11 +224,7 @@ const Action = ({ navigateTo, children, ...props }: ActionProps) => { if (navigateTo) navigate(navigateTo); }; - return ( - - ); + return ; }; /** @@ -262,7 +258,7 @@ const Back = ({ children, ...props }: Omit) => { const navigate = useNavigate(); return ( - ); diff --git a/web/src/components/product/ProductSelectionPage.tsx b/web/src/components/product/ProductSelectionPage.tsx index 87d680cadd..29c49e1937 100644 --- a/web/src/components/product/ProductSelectionPage.tsx +++ b/web/src/components/product/ProductSelectionPage.tsx @@ -91,7 +91,7 @@ const Option = ({ product, isChecked, onChange }) => { const BackLink = () => { const navigate = useNavigate(); return ( - ); From fa2cdd0f6ae402583ff20ac3610ad3bc888e97a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Sun, 19 Jan 2025 00:33:05 +0000 Subject: [PATCH 087/109] fix(web): add temporary rule for fixing logos size --- web/src/assets/styles/index.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/web/src/assets/styles/index.scss b/web/src/assets/styles/index.scss index 3ebbfdfdc5..77d6c37473 100644 --- a/web/src/assets/styles/index.scss +++ b/web/src/assets/styles/index.scss @@ -20,3 +20,9 @@ fill: var(--agm-t--install--button--color); } } + +// Temporary CSS rules written during migratoin to PFv6 + +#productSelectionForm img { + max-inline-size: 100px; +} From bd6218e7340a377a8d7cef1f4599dd7fe73a1713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Sun, 19 Jan 2025 00:44:06 +0000 Subject: [PATCH 088/109] fix(web): overrides border radius for buttons --- web/src/assets/styles/index.scss | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/web/src/assets/styles/index.scss b/web/src/assets/styles/index.scss index 77d6c37473..0c33476848 100644 --- a/web/src/assets/styles/index.scss +++ b/web/src/assets/styles/index.scss @@ -21,8 +21,14 @@ } } -// Temporary CSS rules written during migratoin to PFv6 +// PatternFly overrides +// +.pf-v6-c-button { + --pf-v6-c-button--BorderRadius: var(--pf-t--global--border--radius--small); +} +// Temporary CSS rules written during migratoin to PFv6 +// #productSelectionForm img { max-inline-size: 100px; } From 54515385c0d45249067a621e1f618cec3eba78c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Sun, 19 Jan 2025 00:47:16 +0000 Subject: [PATCH 089/109] fix(web): stop using hardcoded style in layout/Icon Which was there for setting the fill color to the currentColor value previously but looks no longer needed. --- web/src/components/layout/Icon.tsx | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/web/src/components/layout/Icon.tsx b/web/src/components/layout/Icon.tsx index e5c5ef71ac..c4413dd0b4 100644 --- a/web/src/components/layout/Icon.tsx +++ b/web/src/components/layout/Icon.tsx @@ -204,12 +204,5 @@ export default function Icon({ name, size, color, ...otherProps }: IconProps) { const IconComponent = icons[name]; - return ( -

  • - -
  • + } + /> ); }; @@ -125,29 +147,22 @@ const SpacePolicySelector = ({ drive, driveDevice }: DriveEditorProps) => { onOpenChange={setIsOpen} toggleRef={toggleMenuRef} toggle={ - - - {driveUtils.contentActionsDescription(drive)} - - - + + {driveUtils.contentActionsDescription(drive)} + } menuRef={menuRef} menu={ - - - {SPACE_POLICIES.map((policy) => ( - - ))} - + }> + + + {SPACE_POLICIES.map((policy) => ( + + ))} + + } @@ -262,28 +277,7 @@ const SearchSelectorIntro = ({ drive }: { drive: configModel.Drive }) => { } }; - const Content = () => { - const main = mainText(); - const extra = extraText(); - - if (extra) { - return ( - <> - {main} -
    - {extra} - - ); - } - - return {main}; - }; - - return ( -
  • - -
  • - ); + return ; }; const SearchSelectorMultipleOptions = ({ selected, withNewVg = false, onChange }) => { @@ -382,10 +376,10 @@ const SearchSelectorOptions = ({ drive, selected, onChange }) => { const SearchSelector = ({ drive, selected, onChange }) => { return ( - <> - + }> + - + ); }; @@ -423,17 +417,9 @@ const DriveSelector = ({ drive, selected }) => { onOpenChange={setIsOpen} toggleRef={toggleMenuRef} toggle={ - - - {deviceLabel(selected)} - - + + {deviceLabel(selected)} + } menuRef={menuRef} menu={ @@ -532,18 +518,9 @@ const PartitionsNoContentSelector = () => { onOpenChange={setIsOpen} toggleRef={toggleMenuRef} toggle={ - - - {_("No additional partitions will be created")} - - - + + {_("No additional partitions will be created")} + } menuRef={menuRef} menu={ @@ -579,18 +556,9 @@ const PartitionsWithContentSelector = ({ drive }) => { onOpenChange={setIsOpen} toggleRef={toggleMenuRef} toggle={ - - - {driveUtils.contentDescription(drive)} - - - + + {driveUtils.contentDescription(drive)} + } menuRef={menuRef} menu={ @@ -660,10 +628,11 @@ export default function DriveEditor({ drive, driveDevice }: DriveEditorProps) {
    - - -
    - + + + + + ); From f758ce221ad5fca63175fa942981a75b9516e137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Sun, 19 Jan 2025 13:34:52 +0000 Subject: [PATCH 095/109] fix(web): adapt root password page --- .../components/users/RootAuthMethodsPage.tsx | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/web/src/components/users/RootAuthMethodsPage.tsx b/web/src/components/users/RootAuthMethodsPage.tsx index 4fa898a0ea..cca5fe4943 100644 --- a/web/src/components/users/RootAuthMethodsPage.tsx +++ b/web/src/components/users/RootAuthMethodsPage.tsx @@ -28,8 +28,7 @@ import { useRootUserMutation } from "~/queries/users"; import { ROOT as PATHS } from "~/routes/paths"; import { isEmpty } from "~/utils"; import { _ } from "~/i18n"; -import textStyles from "@patternfly/react-styles/css/utilities/Text/text"; -import sizingStyles from "@patternfly/react-styles/css/utilities/Sizing/sizing"; +import shadowUtils from "@patternfly/react-styles/css/utilities/BoxShadow/box-shadow"; /** * A page component for setting at least one root authentication method @@ -61,22 +60,27 @@ function RootAuthMethodsPage() { -

    - {_("Provide a password to ensure administrative access to the system.")} -

    -

    +

    {_("Provide a password to ensure administrative access to the system.")}

    +

    {_( "You can change it or select another authentication method in the 'Users' section before installing.", )}

    } - pfCardProps={{ isCompact: false, isFullHeight: false }} + pfCardProps={{ + isCompact: false, + isFullHeight: false, + className: shadowUtils.boxShadowMd, + }} pfCardBodyProps={{ isFilled: true }} + actions={ + + } >
    @@ -84,17 +88,14 @@ function RootAuthMethodsPage() { inputRef={passwordRef} id="rootPassword" value={password} - className={sizingStyles.w_50OnMd} onChange={(_, value) => setPassword(value)} + autoFocus />
    - - -
    ); } From 587f4c9e68072ea38a5a107963ee3cc7f023bde9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Mon, 20 Jan 2025 06:52:57 +0000 Subject: [PATCH 096/109] refactor(rust): better error reporting in the license module --- rust/agama-server/src/software/license.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/rust/agama-server/src/software/license.rs b/rust/agama-server/src/software/license.rs index e64d42ab7c..db1d5f6b05 100644 --- a/rust/agama-server/src/software/license.rs +++ b/rust/agama-server/src/software/license.rs @@ -83,9 +83,12 @@ impl LicensesRepo { for entry in entries { let entry = entry?; if entry.file_type()?.is_dir() { + let Ok(id) = entry.file_name().into_string() else { + continue; + }; let license = License { - id: entry.file_name().into_string().unwrap(), - languages: Self::find_translations(&entry.path()), + id, + languages: Self::find_translations(&entry.path())?, }; self.licenses.push(license); } @@ -109,7 +112,7 @@ impl LicensesRepo { .map(|p| self.path.join(id).join(p)) .find(|p| p.exists())?; - let body: String = std::fs::read_to_string(license_path).unwrap(); + let body: String = std::fs::read_to_string(license_path).ok()?; Some(LicenseContent { id: id.to_string(), @@ -120,7 +123,7 @@ impl LicensesRepo { /// Finds translations in the given directory. /// /// * `path`: directory to search translations. - fn find_translations(path: &PathBuf) -> Vec { + fn find_translations(path: &PathBuf) -> Result, std::io::Error> { let entries = read_dir(path).unwrap().filter_map(|entry| entry.ok()); let files = entries @@ -131,9 +134,9 @@ impl LicensesRepo { file.to_owned().into_string().ok() }); - files + Ok(files .filter_map(|f| Self::language_tag_from_file(&f)) - .collect() + .collect()) } /// Returns the language tag for the given file. From 40043daab66ea87f1f5379887ddc0604063120cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Imobach=20Gonz=C3=A1lez=20Sosa?= Date: Mon, 20 Jan 2025 07:02:08 +0000 Subject: [PATCH 097/109] fix(rust): better error reporting software::web --- rust/agama-server/src/software/web.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/rust/agama-server/src/software/web.rs b/rust/agama-server/src/software/web.rs index 8c7616ee28..7831def87b 100644 --- a/rust/agama-server/src/software/web.rs +++ b/rust/agama-server/src/software/web.rs @@ -49,7 +49,7 @@ use agama_lib::{ use axum::{ extract::{Path, Query, State}, http::StatusCode, - response::IntoResponse, + response::{IntoResponse, Response}, routing::{get, post, put}, Json, Router, }; @@ -473,6 +473,9 @@ async fn set_resolvables( Ok(Json(())) } +/// Returns the list of known licenses. +/// +/// It includes the license ID and the languages in which it is available. #[utoipa::path( get, path = "/licenses", @@ -490,12 +493,17 @@ struct LicenseQuery { lang: Option, } +/// Returns the license content. +/// +/// Optionally it can receive a language tag (RFC 5646). Otherwise, it returns +/// the license in English. #[utoipa::path( get, path = "/licenses/:id", context_path = "/api/software", responses( (status = 200, description = "License with the given ID"), + (status = 400, description = "The specified language tag is not valid"), (status = 404, description = "There is not license with the given ID") ) )] @@ -503,9 +511,16 @@ async fn license( State(state): State>, Path(id): Path, Query(query): Query, -) -> Result>, Error> { +) -> Result { let lang = query.lang.unwrap_or("en".to_string()); - let lang = lang.as_str().try_into().unwrap(); - let license = state.licenses.find(&id, &lang); - Ok(Json(license)) + + let Ok(lang) = lang.as_str().try_into() else { + return Ok(StatusCode::BAD_REQUEST.into_response()); + }; + + if let Some(license) = state.licenses.find(&id, &lang) { + Ok(Json(license).into_response()) + } else { + Ok(StatusCode::NOT_FOUND.into_response()) + } } From 441167e848a888268a755b3a81d80f0b2e0cce96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Mon, 20 Jan 2025 07:37:18 +0000 Subject: [PATCH 098/109] fix(web): allow license dialog adjust its size --- web/src/components/product/LicenseDialog.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/components/product/LicenseDialog.tsx b/web/src/components/product/LicenseDialog.tsx index e31e65c9b5..2e6cfa40fd 100644 --- a/web/src/components/product/LicenseDialog.tsx +++ b/web/src/components/product/LicenseDialog.tsx @@ -65,6 +65,7 @@ function LicenseDialog({ onClose, product }: { onClose: ModalProps["onClose"]; p return ( From edf69f596d77a5cad25be8b385d3aaaeae00ce25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Mon, 20 Jan 2025 09:04:22 +0000 Subject: [PATCH 099/109] fix(web): adjust license dialog title --- web/src/components/product/LicenseDialog.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/web/src/components/product/LicenseDialog.tsx b/web/src/components/product/LicenseDialog.tsx index 2e6cfa40fd..d0df191ded 100644 --- a/web/src/components/product/LicenseDialog.tsx +++ b/web/src/components/product/LicenseDialog.tsx @@ -33,7 +33,6 @@ import { Stack, } from "@patternfly/react-core"; import { Product } from "~/types/software"; -import { sprintf } from "sprintf-js"; import { fetchLicense } from "~/api/software"; import { useInstallerL10n } from "~/context/installerL10n"; import supportedLanguages from "~/languages.json"; @@ -69,9 +68,9 @@ function LicenseDialog({ onClose, product }: { onClose: ModalProps["onClose"]; p isOpen title={ <> - + -

    {sprintf(_("License for %s"), product.name)}

    +

    {product.name}