Compare commits

...

146 Commits

Author SHA1 Message Date
odain
93b658646b N°9144 - fix both UI setup wizard and CLI unattended + replace production by ITOP_DEFAULT_ENV 2026-04-03 16:17:44 +02:00
Eric Espie
3590ddedf0 Fix sessions 2026-04-03 15:40:37 +02:00
odain
0d0261b0cc ci: fix tests 2026-04-03 08:43:40 +02:00
odain
7dd6903739 fix merge 2026-04-03 08:17:56 +02:00
odain
7f87182b15 Merge branch 'develop' into feature/uninstallation 2026-04-03 08:17:31 +02:00
odain
2c380e8561 fix fresh install 2026-04-03 08:06:44 +02:00
odain
9cfaf59669 WIP: fix unattended 2026-04-02 19:18:41 +02:00
odain
4ed3323956 bypass audit in setup wizard sometimes 2026-04-02 19:09:10 +02:00
Vincent Dumas
38cda442e3 N°9138 - Presentation details step2 + move sample data (#866)
N°9471 - Rename in FR Rack as Baie - Switch Baie and Chassis icons
2026-04-02 18:23:11 +02:00
Vincent Dumas
20c8b7c0ce N°9137 logo by network device type (#864)
Add Logo on NetworkDeviceType used as object icon on all NetworkDevice of a given type
Add Brand, OSFamily and NetworkDeviceType icons as dashlet ressources
2026-04-02 17:23:08 +02:00
Eric Espie
271fed210a WIP symbolic links 2026-04-02 16:52:36 +02:00
Eric Espie
7bec8d9ad0 Fix unattended install 2026-04-02 16:10:46 +02:00
Eric Espie
9362a0b0ae Fix runtime env 2026-04-02 15:29:25 +02:00
Eric Espie
4f5d6c47fa Setup sequencer side B 2026-04-02 15:17:27 +02:00
Eric Espie
45e0cee1ee Setup sequencer side A 2026-04-01 17:02:17 +02:00
lenaick.moreira
b58a848cc9 Merge remote-tracking branch 'origin/support/3.2' into develop 2026-04-01 16:25:36 +02:00
lenaick.moreira
5c5d98bb78 Enable the retrieval of all data for event notifications in the activity panel 2026-04-01 16:12:36 +02:00
Stephen Abello
a08a9b43f3 N°8737 - Fix search criteria dropdown vertical overflow (#867)
* N°8737 - Fix search criteria dropdown vertical overflow

* Update css/backoffice/components/_search-form.scss
2026-04-01 14:57:10 +02:00
jf-cbd
d9433fead5 Merge remote-tracking branch 'origin/support/3.2' into develop 2026-04-01 10:57:23 +02:00
jf-cbd
abd85ff4db Merge remote-tracking branch 'origin/support/3.2' into support/3.2 2026-04-01 10:37:59 +02:00
jf-cbd
81f328b26e N°8543 - rename security parameter with new convention 2026-04-01 10:37:46 +02:00
lenaick.moreira
9a2c8f10bf Fix CliResetSessionTest by allowing empty POST fields to be defined in the curl options 2026-04-01 10:35:59 +02:00
Lenaick
3cdadf3c6e Add tests for lock acquisition functionality (#865) 2026-03-31 17:01:22 +02:00
Eric Espie
fb8b4a07b3 N°9144 - Split setup in 2 different step - refactor RuntimeEnv 2026-03-31 10:57:47 +02:00
odain
dec5da0136 PHP 8.4 compat: InstallationChoicesToModuleConverter Implicitly marking parameter 2026-03-30 11:33:07 +02:00
odain
63532d20a5 fix merge 2026-03-30 11:26:45 +02:00
odain
5ae8edd2c0 Merge branch 'develop' into feature/uninstallation 2026-03-30 11:24:45 +02:00
Eric Espie
a13543c0d3 Fix CI 2026-03-26 16:34:13 +01:00
Eric Espie
8e581c903b Fix CI 2026-03-26 12:06:31 +01:00
Eric Espie
c9fe2eda36 Fix CI 2026-03-26 10:52:27 +01:00
Eric Espie
bd01cbb031 Designer 3.3.0 - PHPStan level 2 2026-03-26 09:43:55 +01:00
Molkobain
15eb0f86d7 N°9161 - Fix unit test which missed a markup change 2026-03-25 09:13:58 +01:00
odain
12a06fcfc0 Designer 3.3.0: be able to extend nstallationChoicesToModuleConverter 2026-03-24 23:07:35 +01:00
Eric Espie
4743cdcf0f Designer 3.3.0 - PHPStan level 1 2026-03-24 17:39:22 +01:00
Eric Espie
0d1af2964a Designer 3.3.0 - PHPStan level 1 wip 2026-03-24 17:21:55 +01:00
Molkobain
47b93175b3 N°9161 - Change UIBlock badges markup from span to div to improve E2E testing 2026-03-24 10:46:33 +01:00
Eric Espie
9b2259726b Designer 3.3.0 - edit dashboard fix 2026-03-23 10:51:31 +01:00
odain
90ace885cd N°8760 - fix setup/cleanup audit on legacy 1.x packages without any
installation.xml
2026-03-20 19:33:07 +01:00
Eric Espie
b667df2d6c Designer 3.3.0 2026-03-20 09:23:05 +01:00
Eric Espie
99cfe95c32 Designer 3.3.0 2026-03-18 16:41:54 +01:00
Eric Espie
10d1f5735e Designer 3.3.0 2026-03-18 16:41:02 +01:00
Eric Espie
c94ba187bb PHP 8.4 2026-03-18 14:43:16 +01:00
Eric Espie
9396fe6815 autoload 2026-03-18 14:23:00 +01:00
Eric Espie
70f77aac68 Merge branch 'feature/9370-uninstallation' into feature/uninstallation 2026-03-18 14:16:55 +01:00
Eric Espie
358c4383f8 Add explanation messages 2026-03-18 14:16:55 +01:00
odain
e1d0b0d200 PR review - move Prepare in DryRemovalRuntimeEnvironment constr 2026-03-18 14:16:54 +01:00
Eric Espie
890db04fa3 Fix CI 2026-03-18 14:16:54 +01:00
odain
be29343b49 code style 2026-03-18 14:16:54 +01:00
Eric Espie
e1e2da2881 N°8761 - Assist in cleaning up data prior to uninstalling extensions 2026-03-18 14:16:54 +01:00
odain
070b96c9b5 N°9370 - use env-production-build in setup audit sequencer (no more dry-production) 2026-03-18 14:16:54 +01:00
Eric Espie
cb47ea4316 N°8761 - Assist in cleaning up data prior to uninstalling extensions 2026-03-18 14:16:54 +01:00
odain
167cb84c93 N°9370 - use env-production-build for dry removal audit
wip
2026-03-18 14:16:54 +01:00
Eric Espié
a3e8abe520 N°8761 - Assist in cleaning up data prior to uninstalling extensions (#838)
* N°8761 - Assist in cleaning up data prior to uninstalling extensions - handle transaction ID + add deletion plan screen

* N°8761 - poc of deletion plan screen

* code style

* N°8761 - WIP deletion plan execution

* Delete all parent classes objects + cleanup

* 🌐 translation (EN only)

* remove history

* In case of no leaf class to remove, delete also the child classes

* 🎨 refactor & fix typo

* Analysis not stored anymore in DB

* Analysis for removed modules

* 🌐 dico

* Add spinner to setup button "Go to backoffice"

* Fix count after PR review

* Fix after PR review

* Fix Number of elements to remove

* Fix arrays

---------

Co-authored-by: odain <olivier.dain@combodo.com>
2026-03-18 14:16:54 +01:00
Timmy38
48e58f4323 * N°8955 Add UIBlocks markup in the setup 2026-03-18 14:16:54 +01:00
Timothee
337ccbb921 N°9141 Fix missing bCanBeUninstalled flag for installation.xml choices 2026-03-18 14:16:54 +01:00
Timothee
34930a93cb N°9327 Fix phpunit tests 2026-03-18 14:16:54 +01:00
Timmy38
5f731d9f97 N°9327 Do not enter readonly or maintenance mode when doing data audit 2026-03-18 14:16:54 +01:00
Timmy38
9b7fd7b398 N°9141 Log when extension uninstallation is forced 2026-03-18 14:16:54 +01:00
Timmy38
e0eee6798d N°9088 Allow extension uninstallation from production-modules folder 2026-03-18 14:16:54 +01:00
Timothee
a8f1b6ea35 N°9161 Fix missing href 2026-03-18 14:16:54 +01:00
odain
d49a50da5b ci: code style 2026-03-18 14:16:54 +01:00
odain
6a34fb9a15 phpstan cleanup 2026-03-18 14:16:54 +01:00
Timmy38
3befe469e8 N°9161 Add markup for behat in setup recap screen 2026-03-18 14:16:54 +01:00
Timmy38
add7e7a677 N°8955 add UI block for uninstallation 2026-03-18 14:16:54 +01:00
odain
f80a074135 cleanup 2026-03-18 14:16:53 +01:00
Timothee
113e3bc110 Fix Code Style 2026-03-18 14:16:53 +01:00
Timmy38
c20c4644b1 N°9009 Add phpunit test to GetSelectedModules 2026-03-18 14:16:53 +01:00
Timothee
b77a0e3297 N°9144 Fix backup option presence during install 2026-03-18 14:16:53 +01:00
odain
a237b32115 N°9168 - fix ci 2026-03-18 14:16:53 +01:00
odain
681abc84b9 Merge branch 'feature/9168-moveintocore' into feature/uninstallation 2026-03-18 14:16:53 +01:00
Timothee
7775cfeccc N°9144 Small fixes
> Prevent verification when some dependencies are missing
> Close unclosed div
> Change progress bar title depending on step
> Fix ignored "check uninstall check" flag
> Added phpunit tests to cover "check uninstall check" flag
> Progress bar appropriately reflect error status (red & not animated)
2026-03-18 14:16:53 +01:00
odain
222e08e29b N°9168 - merge data feature removal to iTop core code
N°9168 - phpstan fix

N°9168 - align module version with itop core
2026-03-18 14:16:53 +01:00
Timothee
773501baed N°9144 Fix back from module choice 2026-03-18 14:16:53 +01:00
Timothee
150094341f N°9010 Fix Code Style 2026-03-18 14:16:53 +01:00
Timmy38
e1215733e9 N°9010 fix flags when extension is missing 2026-03-18 14:16:53 +01:00
Timmy38
2b2e431d0a N°9144 Add data audit setup step
N°8864 Fix unneeded char
2026-03-18 14:16:53 +01:00
odain
98312d1c15 N°8760 - fix installation choices db query - read code instead of title + add log 2026-03-18 14:16:53 +01:00
odain
fc08bed218 Merge branch 'feature/8760-audit-squashed' into feature/uninstallation 2026-03-18 14:16:52 +01:00
odain
eb01828f06 N°8764 - enhance setup wizards transition computation/tests 2026-03-18 14:16:52 +01:00
odain
4c0b54a0f7 N°8760 - Audit uninstall of extensions that declare final classes
N°8760 - be able to list modules based on extension choices
refactoring: move some classes in a moduleinstallation folder (coming
namespace)

N°8760 - module dependency check applied before audit

N°8760 - make dependency check work during audit

N°8760 - fix ci

N°8760 - fix ci

N°8760 - add GetCreatedIn to get module name based on DBObject class - everything stored in MetaModel during compilation and autoload

N°8760 - be able to describe from which module a datamodel class comes via MetaModel created_in field

N°8760 - rename GetCreatedIn <- GetModuleName + compute module name live instead having complex stuff in MetaModel/compilation

temp review 1

review: renaming InstallationChoicesToModuleConverter

review: renaming InstallationChoicesToModuleConverter

review: ModuleDiscovery:GetModulesOrderedByDependencies replacing deprecated GetAvailableModules method

ci: fix typo

cleanup

review: rework InstallationChoicesToModuleConverter

N°8760 - review tests
2026-03-18 14:16:52 +01:00
Molkobain
8074643231 N°9106 - Adapt extensions pills so they can be read correctly by Behat 2026-03-18 14:16:52 +01:00
odain
1fb264e630 N°8764 - fix setup wizards transitions - damned missing file 2026-03-18 14:16:52 +01:00
odain
2bfafeffe6 N°8764 - fix setup wizards transitions 2026-03-18 14:16:52 +01:00
odain
324a68df32 N°8764 - fix missing setup wizards titles + cache step computation 2026-03-18 14:16:52 +01:00
odain
14c3dafa4d code style 2026-03-18 14:16:52 +01:00
odain
7e78bd8519 N°8764 - use last working model in case setup wizard to do setup audit - skip if no model available to make setup work 2026-03-18 14:16:52 +01:00
Timothee
54aa56c5a8 N°8763 Add phpunit tests for iTopExtension::CanBeUninstalled 2026-03-18 14:16:52 +01:00
odain
62bd1b8f49 N°8864 - code readability 2026-03-18 14:16:52 +01:00
odain
b5e95f297c N°8760 - Audit uninstall of extensions that declare final classes - refactor extension computations and move them in ExtensionMap
N°8760 - Audit uninstall of extensions that declare final classes - refactor extension computations and move them in ExtensionMap
2026-03-18 14:16:52 +01:00
odain
f89cb71f61 simplify WizardStep::GetTitle 2026-03-18 14:16:52 +01:00
odain
b30ff8b832 N°8981 - reduce log verbosity during setup 2026-03-18 14:16:52 +01:00
Timothee
5254a83327 N°8763 Fix non-uninstallable check in multi-modules extensions 2026-03-18 14:16:52 +01:00
odain
b1f49a1568 Merge branch 'feature/8981-prepare' into feature/uninstallation 2026-03-18 14:16:52 +01:00
odain
336898da98 Merge branch 'feature/8981-prepare' into feature/uninstallation 2026-03-18 14:16:51 +01:00
odain
84803abd36 N°8764 - skip audit when itop reinstalled on top of a backup without env-production to read previous datamodel + phpdoc fix 2026-03-18 14:16:51 +01:00
odain
9370c83a69 setup: phpstan level 2
setup: phpstan level 2
2026-03-18 14:16:51 +01:00
odain
f7dfeafa3f setup: phpstan level 1 2026-03-18 14:16:48 +01:00
odain
5b4030a95f setup: phpstan level 0 2026-03-18 14:16:13 +01:00
odain
fe6ba35ada N°8764 halt setup wizard at data issue - 2nd review 2026-03-18 14:16:13 +01:00
odain
789c4bb5ea N°8764 halt setup wizard at data issue - review
- 2 types of SetupAudit constructors
- setup wizard new step management enhancement
- change SetupAudit GetIssue API behaviour
2026-03-18 14:16:13 +01:00
odain
f5f5334e5f ci: test enhancement => use GetTemporaryFilePath 2026-03-18 14:16:13 +01:00
odain
51f0eea8e3 enhance test sdk: add GetTemporaryFilePath
# Conflicts:
#	tests/php-unit-tests/src/BaseTestCase/ItopTestCase.php
2026-03-18 14:16:10 +01:00
odain
875b2f1f29 N°7629: log changed 2026-03-18 14:15:00 +01:00
odain
36fc0fb0ea N°8981: test ModuleDiscovery filtered by removed extensions 2026-03-18 14:15:00 +01:00
odain
4f9a4dcfa5 N°8764 - fix first install 2026-03-18 14:15:00 +01:00
odain
dfc6189cef N°8764 - stop setup and display data to cleanup message 2026-03-18 14:15:00 +01:00
odain
ad33453860 N°7629: improve InterfaceDiscovery::GetCandidateClasses robustness 2026-03-18 14:15:00 +01:00
odain
f787cf0950 N°8764 - Halt setup if database is not compatible with an uninstallation 2026-03-18 14:15:00 +01:00
odain
cf7a193f7b N°8981: fix broken setup wizard due to invalid array passed 2026-03-18 14:14:59 +01:00
odain
8bbd1ab621 Merge branch 'feature/8981-prepare' into feature/uninstallation 2026-03-18 14:14:59 +01:00
odain
20ae350286 N°8981: ModuleInstallationRepository dedicated to module installation queries
N°8981: ModuleInstallationRepository dedicated to module installation queries

fix renaming
2026-03-18 14:14:59 +01:00
odain
df9d69c70f N°8981: review cleanup on module filtering due to extensoin removal 2026-03-18 14:14:59 +01:00
odain
ba09c624f0 N°8981: be able to remove extension during setup even when present on disk 2026-03-18 14:14:59 +01:00
odain
7611a0e5c8 N°8981 setup wizard: reuse AnalyzeInstallation result in wizard module choice step 2026-03-18 14:14:59 +01:00
odain
19e60ea628 N°8981 setup wizard: optimize IsConnectableToITopHub use (perf)
N°8981: revert IsConnectableToITopHub
2026-03-18 14:14:59 +01:00
odain
5aaae3ad9c N°8981 setup wizard: static removal + cleanup 2026-03-18 14:14:59 +01:00
odain
3b6ead1307 N°8981 : add type in function 2026-03-18 14:14:59 +01:00
odain
4678684ce6 N°8981 setup wizard: cache GetParamForConfigArray 2026-03-18 14:14:59 +01:00
odain
c008483625 N°8981 setup wizard: cleanup main actions + remove static when possible 2026-03-18 14:14:59 +01:00
odain
bfef10d636 N°8981 setup wizard: cleanup config use in setup wizard 2026-03-18 14:14:59 +01:00
odain
d84959ce6c test SDK enhancement: be able to compare moduleinstallation
ci: add log and hopefully fix hub test

ci: fix all test that rely on CustomDataTC
2026-03-18 14:14:59 +01:00
odain
b230623a32 N°8981: repair previous setup cleanup (broken setups) 2026-03-18 14:14:59 +01:00
odain
375c1f3a73 N°8981: prepare hub connector test cover
sdk test enhancement : add call itop api

fix ci

ci: fix broken tests

ci: cover hub setup on compile and launch steps

code style

ci: fix ModuleDiscoveryTest redundant class + add logs to investigate ci setup issues

ci: fix log during setup tests
2026-03-18 14:14:59 +01:00
odain
ab7a737512 N°4789 - do not call empty ModuleInstallerAPI class + logs
code style
2026-03-18 14:14:59 +01:00
Timothee
371819f13f N°8864 Passing array instead of html 2026-03-18 14:14:58 +01:00
odain
56cb3cae4f N°8981 - cleanup/simplify setup
fix RecordInstallation due to previous refactoring
2026-03-18 14:14:58 +01:00
Timothee
11b985aaa7 N°9010 Improve tests readability 2026-03-18 14:14:58 +01:00
odain
59fe11b96e ci: fix broken LoginTest 2026-03-18 14:14:58 +01:00
Timmy38
55b03941e8 N°8864 list extensions installation in setup recap 2026-03-18 14:14:58 +01:00
Timothee
2fcd224ffd N°9010 Setup wizard : manage multiple level extension choice 2026-03-18 14:14:58 +01:00
odain
b26e0c8a90 Merge branch 'develop' into feature/uninstallation 2026-03-18 14:14:58 +01:00
odain
b967fb7f20 Merge branch 'develop' into feature/uninstallation 2025-12-19 16:17:12 +01:00
odain
195038c941 Merge branch 'develop' into feature/uninstallation 2025-12-19 15:48:56 +01:00
odain
9a8d87e2b5 Merge branch 'develop' into feature/uninstallation 2025-12-18 14:02:45 +01:00
odain
385302c44c ci: fix nightly 2025-12-08 10:51:28 +01:00
odain
b563f113d0 add combodo-data-feature-removal 2025-12-08 10:38:30 +01:00
odain
715d9d3b1c less logs during setup 2025-12-05 17:37:09 +01:00
odain
7a6c2bc6a4 ci: fix with package 2025-12-05 17:36:57 +01:00
odain
8919184ef9 ci: adapt test to run also with itop packages 2025-12-05 11:36:19 +01:00
odain
7bfaebe4db ci: fix merge and issues with LoadChoicesFromDatabase 2025-12-04 18:40:21 +01:00
odain
8e10cf9b72 N°8760 : fix broken setup
ci: fix merge
2025-12-04 18:28:47 +01:00
odain
9f3d7d2c36 N°8760: revert dry removal audit and use real file deletion again
code formatting
2025-12-04 17:19:18 +01:00
odain
ae980e365d N°8760 :fix ModuleInstallation db query + refactor query in ModuleInstallationService
extensionmap cleanup

fix setup broken
2025-12-04 17:19:18 +01:00
odain
a2b01b3ed4 N°8760 - setupaudit and dry removal API review with Romain - avoid file deletion
N°8760 - be able to simulate extension removal by oerriding GetExtensionMap

be able to simulate SetupAudit errors in Setups for integration tests

fix rebase
2025-12-04 17:19:18 +01:00
odain
9cdc707bc5 N°8760 - Audit uninstall of extensions that declare classes - first prototype
N°8760 - Audit uninstall of extensions that declare classes - be able to trace DM classes created_in

N°8760 - be able to test with additional extensions installed in test SDK

N°8760 - provide a service dedicated to extension removal

N°8760 - compute all rules by default

add comment

adapt audit to both extension and mtp
2025-12-04 17:19:18 +01:00
odain
76178c16b8 N°8760: code legacy refactoring around module computation (AnalyzeInstallation)
AnalyzeInstallation refactoring

fix ci call to ModuleInstallationService

ci: fix code style

get rid of itop_version

refactoring: make code simpler

get rid of unused name_db

refactoring setup: rename version_db by installed_version

refactoring setup: rename version_code by available_version

code cleanup: avoid useless runtimeenv instanciation
2025-12-04 17:19:18 +01:00
322 changed files with 29381 additions and 5717 deletions

View File

@@ -16,5 +16,5 @@ require_once(APPROOT.'/application/audit.category.class.inc.php');
require_once(APPROOT.'/application/audit.domain.class.inc.php');
require_once(APPROOT.'/application/audit.rule.class.inc.php');
require_once(APPROOT.'/application/query.class.inc.php');
require_once(APPROOT.'/setup/moduleinstallation.class.inc.php');
require_once(APPROOT.'/setup/moduleinstallation/moduleinstallation.class.inc.php');
require_once(APPROOT.'/application/utils.inc.php');

View File

@@ -497,7 +497,7 @@ EOF
* @param array $aExtraParams
* @param bool $bCanEdit
*
* @return \Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout
* @return null|\Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout
*/
public function Render($oPage, $bEditMode = false, $aExtraParams = [], $bCanEdit = true)
{

View File

@@ -1387,7 +1387,7 @@ class DesignerIconSelectionField extends DesignerFormField
public function AddAllowedValue($aValue)
{
// Add a null value to the list of allowed values
$this->aAllowedValues = array_merge([$aValue], $this->aAllowedValues);
$this->aAllowedValues = array_merge([$aValue], $this->aAllowedValues ?? [null]);
}
public function EnableUpload($sIconUploadUrl)
{

View File

@@ -976,7 +976,7 @@ class utils
return self::$oConfig;
}
$sProductionEnvConfigPath = self::GetConfigFilePath('production');
$sProductionEnvConfigPath = self::GetConfigFilePath(ITOP_DEFAULT_ENV);
if (file_exists($sProductionEnvConfigPath)) {
$oProductionEnvDiskConfig = new Config($sProductionEnvConfigPath);
self::SetConfig($oProductionEnvDiskConfig);

View File

@@ -24,7 +24,7 @@ MetaModel::IncludeModule('application/user.dashboard.class.inc.php');
MetaModel::IncludeModule('application/audit.rule.class.inc.php');
MetaModel::IncludeModule('application/audit.domain.class.inc.php');
MetaModel::IncludeModule('application/query.class.inc.php');
MetaModel::IncludeModule('setup/moduleinstallation.class.inc.php');
MetaModel::IncludeModule('setup/moduleinstallation/moduleinstallation.class.inc.php');
MetaModel::IncludeModule('core/event.class.inc.php');
MetaModel::IncludeModule('core/action.class.inc.php');

View File

@@ -20,9 +20,6 @@
*
*/
use Combodo\iTop\Config\Validator\iTopConfigAstValidator;
use Combodo\iTop\Config\Validator\iTopConfigSyntaxValidator;
define('ITOP_APPLICATION', 'iTop');
define('ITOP_APPLICATION_SHORT', 'iTop');
@@ -1173,8 +1170,8 @@ class Config
'tracking_level_linked_set_default' => [
'type' => 'integer',
'description' => 'Default tracking level if not explicitly set at the attribute level, for AttributeLinkedSet (defaults to NONE in case of a fresh install, LIST otherwise - this to preserve backward compatibility while upgrading from a version older than 2.0.3 - see TRAC #936)',
'default' => LINKSET_TRACKING_LIST,
'value' => LINKSET_TRACKING_LIST,
'default' => LINKSET_TRACKING_NONE,
'value' => LINKSET_TRACKING_NONE,
'source_of_value' => '',
'show_in_conf_sample' => false,
],
@@ -1756,11 +1753,11 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'security.force_login_when_no_delegated_authentication_endpoints_list' => [
'security.disable_exec_forced_login_for_all_enpoints' => [
'type' => 'bool',
'description' => 'If true, when no execution policy is defined, the user will be forced to log in (instead of being automatically logged in with the default profile)',
'default' => false,
'value' => false,
'description' => 'If true, when no delegated authentication module is defined, no login will be forced on modules exec endpoints',
'default' => true,
'value' => true,
'source_of_value' => '',
'show_in_conf_sample' => false,
],
@@ -2691,14 +2688,13 @@ class Config
*
* @param array $aParamValues
* @param ?string $sModulesDir
* @param bool $bPreserveModuleSettings
*
* @return void The current object is modified directly
*
* @throws \Exception
* @throws \CoreException
*/
public function UpdateFromParams($aParamValues, $sModulesDir = null, $bPreserveModuleSettings = false)
public function UpdateFromParams($aParamValues, $sModulesDir = null)
{
if (isset($aParamValues['application_path'])) {
$this->Set('app_root_url', $aParamValues['application_path']);
@@ -2746,7 +2742,10 @@ class Config
} else {
$aSelectedModules = null;
}
$this->UpdateIncludes($sModulesDir, $aSelectedModules);
if (! is_null($sModulesDir)) {
$this->UpdateIncludes($sModulesDir, $aSelectedModules);
}
if (isset($aParamValues['source_dir'])) {
$this->Set('source_dir', $aParamValues['source_dir']);
@@ -2764,17 +2763,13 @@ class Config
*
* @throws Exception
*/
public function UpdateIncludes($sModulesDir, $aSelectedModules = null)
public function UpdateIncludes(string $sModulesDir, $aSelectedModules = null)
{
if ($sModulesDir === null) {
return;
}
// Initialize the arrays below with default values for the application...
$oEmptyConfig = new Config('dummy_file', false); // Do NOT load any config file, just set the default values
$aAddOns = $oEmptyConfig->GetAddOns();
$aModules = ModuleDiscovery::GetAvailableModules([APPROOT.$sModulesDir]);
$aModules = ModuleDiscovery::GetModulesOrderedByDependencies([APPROOT.$sModulesDir]);
foreach ($aModules as $sModuleId => $aModuleInfo) {
list($sModuleName, $sModuleVersion) = ModuleDiscovery::GetModuleName($sModuleId);
if (is_null($aSelectedModules) || in_array($sModuleName, $aSelectedModules)) {

View File

@@ -5108,8 +5108,8 @@ abstract class DBObject implements iDisplay
protected function GetReferencingObjectsForDeletion($bAllowAllData = false)
{
$aDependentObjects = [];
$aRererencingMe = MetaModel::EnumReferencingClasses(get_class($this));
foreach ($aRererencingMe as $sRemoteClass => $aExtKeys) {
$aReferencingMe = MetaModel::EnumReferencingClasses(get_class($this));
foreach ($aReferencingMe as $sRemoteClass => $aExtKeys) {
/** @var \AttributeExternalKey $oExtKeyAttDef */
foreach ($aExtKeys as $sExtKeyAttCode => $oExtKeyAttDef) {
// skip if external key doesn't require the deletion cascading

View File

@@ -360,10 +360,10 @@ class DesignElement extends \DOMElement
* @param string $sTagName
* @param string|null $sDefault
*
* @return string
* @return null|string
* @throws \DOMFormatException
*/
public function GetChildText($sTagName, $sDefault = null)
public function GetChildText($sTagName, $sDefault = null): ?string
{
$sRet = $sDefault;
if ($oChild = $this->GetOptionalElement($sTagName)) {

View File

@@ -22,6 +22,8 @@ use Combodo\iTop\Application\EventRegister\ApplicationEvents;
use Combodo\iTop\Core\MetaModel\FriendlyNameType;
use Combodo\iTop\Service\Events\EventData;
use Combodo\iTop\Service\Events\EventService;
use Combodo\iTop\Setup\ModuleDependency\Module;
use Combodo\iTop\Setup\ModuleDiscovery\ModuleFileReader;
require_once APPROOT.'core/modulehandler.class.inc.php';
require_once APPROOT.'core/querymodifier.class.inc.php';
@@ -128,7 +130,7 @@ abstract class MetaModel
/** @var array */
private static $m_aClassToFile = [];
/** @var string */
protected static $m_sEnvironment = 'production';
protected static $m_sEnvironment = ITOP_DEFAULT_ENV;
/**
* Objects currently created/updated.
@@ -462,6 +464,43 @@ abstract class MetaModel
return call_user_func([$sClass, 'GetClassDescription'], $sClass);
}
/**
* @param string $sClass
*
* @return string
* @throws \CoreException
*/
final public static function GetModuleName($sClass)
{
try {
$oReflectionClass = new ReflectionClass($sClass);
$sDir = realpath(dirname($oReflectionClass->getFileName()));
$sApproot = realpath(APPROOT);
while (($sDir !== $sApproot) && (str_contains($sDir, $sApproot))) {
$aFiles = glob("$sDir/module.*.php");
if (count($aFiles) > 1) {
return 'core';
}
if (count($aFiles) == 0) {
$sDir = realpath(dirname($sDir));
continue;
}
$sModuleFilePath = $aFiles[0];
$aModuleInfo = ModuleFileReader::GetInstance()->ReadModuleFileInformation($sModuleFilePath);
$sModuleId = $aModuleInfo[ModuleFileReader::MODULE_INFO_ID];
list($sModuleName, ) = ModuleDiscovery::GetModuleName($sModuleId);
return $sModuleName;
}
} catch (\Exception $e) {
throw new CoreException("Cannot find class module", ['class' => $sClass], '', $e);
}
return 'core';
}
/**
* @param string $sClass
*
@@ -5709,7 +5748,7 @@ abstract class MetaModel
* @throws \DictExceptionUnknownLanguage
* @throws \Exception
*/
public static function Startup($config, $bModelOnly = false, $bAllowCache = true, $bTraceSourceFiles = false, $sEnvironment = 'production')
public static function Startup($config, $bModelOnly = false, $bAllowCache = true, $bTraceSourceFiles = false, $sEnvironment = ITOP_DEFAULT_ENV)
{
// Startup on a new environment is not supported
static $bStarted = false;

View File

@@ -22,4 +22,6 @@
@import "medallion-with-blocklist";
@import "field-badge-within-datatable";
@import "jquery-blockui-within-dialog";
@import "jquery-blockui-within-datatable";
@import "jquery-blockui-within-datatable";
@import "badge-with-badge";
@import "extension-details-with-extension-details";

View File

@@ -0,0 +1,10 @@
/*
* @copyright Copyright (C) 2010-2026 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
$ibo-badge--spacing-left--with-same-block: $ibo-spacing-200 !default;
.ibo-badge + .ibo-badge {
margin-left: $ibo-badge--spacing-left--with-same-block;
}

View File

@@ -0,0 +1,11 @@
/*
* @copyright Copyright (C) 2010-2026 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
$ibo-extension-details--margin-top: $ibo-spacing-300 !default;
.ibo-extension-details + .ibo-extension-details,
.ibo-extension-details--information--description .ibo-extension-details {
margin-top: $ibo-extension-details--margin-top;
}

View File

@@ -33,4 +33,5 @@
@import "field-badge";
@import "file-select";
@import "medallion-icon";
@import "toast";
@import "toast";
@import "badge";

View File

@@ -0,0 +1,41 @@
$ibo-badge--padding-x : $ibo-spacing-200 !default;
$ibo-badge--padding-y : $ibo-spacing-100 !default;
$ibo-badge--border-radius : $ibo-border-radius-400 !default;
$ibo-badge-colors: (
'primary': ($ibo-color-primary-100, $ibo-color-primary-900),
'secondary': ($ibo-color-secondary-100, $ibo-color-secondary-900),
'neutral': ($ibo-color-secondary-100, $ibo-color-secondary-900),
'information': ($ibo-color-information-100, $ibo-color-information-900),
'success': ($ibo-color-success-100, $ibo-color-success-900),
'failure': ($ibo-color-danger-100, $ibo-color-danger-900),
'warning': ($ibo-color-warning-100,$ibo-color-warning-900),
'danger': ($ibo-color-danger-100,$ibo-color-danger-900),
'grey' : ($ibo-color-grey-100, $ibo-color-grey-900),
'blue-grey': ($ibo-color-blue-grey-100, $ibo-color-blue-grey-900),
'blue': ($ibo-color-blue-100, $ibo-color-blue-900),
'cyan': ($ibo-color-cyan-100, $ibo-color-cyan-900),
'green': ($ibo-color-green-100, $ibo-color-green-900),
'orange' : ($ibo-color-orange-100, $ibo-color-orange-900),
'red': ($ibo-color-red-100, $ibo-color-red-900),
'pink': ($ibo-color-pink-100, $ibo-color-pink-900),
) !default;
.ibo-badge {
display: inline-block;
white-space: nowrap;
padding : $ibo-badge--padding-y $ibo-badge--padding-x;
border-radius : $ibo-badge--border-radius;
@extend %ibo-font-ral-med-50;
@each $sColor, $aColorValues in $ibo-badge-colors {
$bg-color: nth($aColorValues, 1);
$text-color: nth($aColorValues, 2);
&.ibo-is-#{$sColor} {
background-color: $bg-color;
color: $text-color;
}
}
}

View File

@@ -21,6 +21,8 @@ $ibo-search-form-panel--more-criteria--color: $ibo-color-blue-grey-800 !default;
$ibo-search-form-panel--more-criteria--background-color: $ibo-color-white-100 !default;
$ibo-search-form-panel--more-criteria--icon--color: $ibo-color-primary-600 !default;
$ibo-search-form-panel--more-criteria--border-color: $ibo-search-form-panel--criteria--border-color !default;
// calc is redundant but avoid SCSS min() from being used instead of CSS min()
$ibo-search-form-panel--criteria--max-height: calc(min(#{$ibo-size-750}, 50vh)) !default;
$ibo-search-form-panel--items--hover--color: $ibo-color-grey-200 !default;
@@ -278,9 +280,10 @@ $ibo-search-results-area--datatable-scrollhead--border--is-sticking: $ibo-search
}
.sfc_form_group {
display: block;
margin-top: -1px;
z-index: -1;
display: flex;
flex-direction: column;
margin-top: -1px;
z-index: -1;
}
}
@@ -346,11 +349,15 @@ $ibo-search-results-area--datatable-scrollhead--border--is-sticking: $ibo-search
display: none;
max-width: 450px;
width: max-content;
max-height: 520px;
max-height: $ibo-search-form-panel--criteria--max-height;
overflow-x: auto;
overflow-y: hidden;
.sfc_fg_operators {
display: flex;
flex-direction: column;
overflow: auto;
min-height: 0;
font-size: 12px;
.sfc_fg_operator {
@@ -387,6 +394,9 @@ $ibo-search-results-area--datatable-scrollhead--border--is-sticking: $ibo-search
}
.sfc_opc_multichoices {
display: flex;
flex-direction: column;
height: 100%;
label > input {
vertical-align: text-top;
margin-left: $ibo-spacing-0;
@@ -398,7 +408,6 @@ $ibo-search-results-area--datatable-scrollhead--border--is-sticking: $ibo-search
}
.sfc_opc_mc_items_wrapper {
max-height: 415px; /* Must be less than .sfc_form_group:max-height - .sfc_opc_mc_toggler:height - .sfc_opc_mc_filter:height */
overflow-y: auto;
margin: $ibo-spacing-0 -8px; /* Compensate .sfc_opc_multichoices side padding so the hover style can take the full with */
@@ -560,8 +569,14 @@ $ibo-search-results-area--datatable-scrollhead--border--is-sticking: $ibo-search
&.search_form_criteria_enum {
.sfc_form_group {
.sfc_fg_operator_in {
display: flex;
flex-direction: column;
height: 100%;
min-height: 0;
> label {
display: inline-block;
display: flex;
height: 100%;
min-height: 0;
width: 100%;
line-height: initial;
white-space: nowrap;

View File

@@ -8,6 +8,7 @@ $ibo-toggler--wrapper--height: 20px !default;
$ibo-toggler--slider--border-radius: $ibo-border-radius-900 !default;
$ibo-toggler--slider--background-color: $ibo-color-secondary-600 !default;
$ibo-toggler--slider--disabled--background-color: $ibo-color-secondary-200 !default;
$ibo-toggler--slider--before--left: 3px !default;
$ibo-toggler--slider--before--bottom: 3px !default;
@@ -17,6 +18,7 @@ $ibo-toggler--slider--before--border-radius: $ibo-border-radius-full !default;
$ibo-toggler--slider--before--background-color: $ibo-color-grey-100 !default;
$ibo-toggler--slider--checked--background-color: $ibo-color-primary-600 !default;
$ibo-toggler--slider--checked-disabled--background-color: $ibo-color-primary-200 !default;
$ibo-toggler--slider--focus--box-shadow: 0 0 1px $ibo-color-primary-600 !default;
$ibo-toggler--label--margin-left: 4px !default;
@@ -61,6 +63,13 @@ $ibo-toggler--label--margin-left: 4px !default;
background-color: $ibo-toggler--slider--checked--background-color;
}
.ibo-toggler--wrapper input:disabled + .ibo-toggler--slider {
background-color: $ibo-toggler--slider--disabled--background-color;
}
.ibo-toggler--wrapper input:checked:disabled + .ibo-toggler--slider {
background-color: $ibo-toggler--slider--checked-disabled--background-color;
}
input:focus + .ibo-toggler--slider {
box-shadow: $ibo-toggler--slider--focus--box-shadow;
}

View File

@@ -15,3 +15,4 @@
@import "wizard-container/wizard-container";
@import "object/all";
@import "activity-panel/all";
@import "extension/all";

View File

@@ -0,0 +1 @@
@import "extension-details";

View File

@@ -0,0 +1,65 @@
$ibo-extension-details--information--metadata--padding: $ibo-spacing-200 !default;
$ibo-extension-details--information--metadata--delimiter: "-" !default;
$ibo-extension-details--information--metadata--color: $ibo-color-grey-700 !default;
$ibo-extension-details--actions--button--padding-y: 3px !default;
$ibo-extension-details--actions--button--padding-x: $ibo-button--padding-x !default;
.ibo-extension-details {
display: inline-flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
width: 100%;
}
.ibo-extension-details--information {
flex-grow: 1;
display: flex;
flex-direction: column;
}
.ibo-extension-details--actions {
display: flex;
}
.ibo-extension-details--information--label {
@extend %ibo-font-ral-med-150;
}
.ibo-extension-details--information--metadata {
@extend %ibo-font-ral-med-100;
color: $ibo-extension-details--information--metadata--color;
}
.ibo-extension-details--information--description {
@extend %ibo-font-ral-med-100;
}
.ibo-extension-details--information--metadata span + span:before {
content: $ibo-extension-details--information--metadata--delimiter;
padding-left: $ibo-extension-details--information--metadata--padding;
padding-right: $ibo-extension-details--information--metadata--padding;
}
//ibo-extension-details can have other ibo-extension-details inside its ibo-extension-details--information--description in the setup. We need to only affect direct children
.ibo-extension-details:has(>.ibo-extension-details--actions input:is([type="checkbox"], [type="radio"]):checked){
&>.ibo-extension-details--information>.ibo-extension-details--information--label .ibo-badge.unchecked {
display: none;
}
}
//Merging the two lines below with :is([type="checkbox"], [type="radio"]) will generate a warning in scss compiler
.ibo-extension-details:has(>.ibo-extension-details--actions input[type="checkbox"]:not(:checked)),
.ibo-extension-details:has(>.ibo-extension-details--actions input[type="radio"]:not(:checked)) {
&>.ibo-extension-details--information>.ibo-extension-details--information--label .ibo-badge.checked {
display: none;
}
}
.ibo-extension-details--actions > button {
padding: $ibo-extension-details--actions--button--padding-y $ibo-extension-details--actions--button--padding-x;
}
.ibo-extension-details--actions:has(.toggler-install:not(:disabled)) .ibo-popover-menu--section a[data-resource-id="force_uninstall"] {
display: none;
}

File diff suppressed because one or more lines are too long

View File

@@ -316,29 +316,34 @@ fieldset {
background-color: #F7FAFC;
padding: 10px;
.wiz-choice{
&:checked ~ .description {
#itop-ticket-mgmt-simple-ticket-enhanced-portal:not(:checked),
#itop-ticket-mgmt-itil-enhanced-portal:not(:checked) {
~ .description::after {
content: "Legacy portal is no longer part of iTop, by leaving this option unchecked your portal users won't be able to access iTop anymore.";
display: block;
margin-top: 0.5em;
font-weight: bold;
color: $legacy-portal-removal-text-color;
}
}
}
&:not(:checked) ~ label .setup-extension-tag.checked{
&:not(:checked) ~ label .checked{
display:none;
}
&:checked ~ label .setup-extension-tag.unchecked{
&:checked ~ label .unchecked{
display:none;
}
}
}
.ibo-extension-details:has(>.ibo-extension-details--actions>input:checked) {
.ibo-extension-details:has(#itop-ticket-mgmt-simple-ticket-enhanced-portal:not(:checked), #itop-ticket-mgmt-itil-enhanced-portal:not(:checked)) {
.ibo-extension-details--information--description::after {
content: "Legacy portal is no longer part of iTop, by leaving this option unchecked your portal users won't be able to access iTop anymore.";
display: block;
margin-top: 0.5em;
font-weight: bold;
color: $legacy-portal-removal-text-color;
}
}
}
.ibo-extension-details--information--metadata{
color: $ibo-color-grey-800;
}
.choice-disabled {
color: $ibo-color-grey-700;
}
body {
font-size: 1.17rem;
@@ -522,10 +527,12 @@ body {
}
}
.ibo-setup-summary-title {
font-size: $ibo-font-size-150;
.ibo-setup-summary-title, .ibo-setup-summary-title:visited, .ibo-setup-summary-title:hover {
font-size: $ibo-font-size-150;
color: inherit;
}
#ibo-setup-licenses--components-list {
background-color: $ibo-color-white-200;
padding: 12px;
@@ -605,6 +612,7 @@ body {
color:#a00000;
}
.setup-extension-tag {
display: inline-flex;
background-color: grey;
border-radius: 8px;
padding-left: 3px;
@@ -630,6 +638,21 @@ body {
}
}
.ibo-extension-details {
align-items: flex-start;
}
.ibo-extension-details--actions input{
margin:0.2em 0.5em;
width: 12px;
}
:not(.ibo-badge) ~ .ibo-badge{
margin-left:0.5em;
}
.ibo-extension-details--information--label i{
font-size : 0.9em;
margin-left:0.3em;
}
.setup--wizard-choice--label + .setup--wizard-choice--more-info {
margin-left: 0.5rem;
}
@@ -681,9 +704,6 @@ body {
overflow: auto;
text-align: center;
}
#installation_progress {
display: none;
}
#fresh_content{
border: 0;
min-height: 300px;

View File

@@ -0,0 +1,9 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/*
* CSS of the template page
*/

View File

@@ -0,0 +1,9 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/*
* Javascript file loaded in template page
*/

View File

@@ -0,0 +1,17 @@
{
"config": {
"classmap-authoritative": true
},
"autoload": {
"psr-4": {
"Combodo\\iTop\\DataFeatureRemoval\\": "src",
"": "src/NoNamespace"
}
},
"name": "combodo/combodo-data-feature-removal",
"type": "itop-extension",
"description": "iTop Data Feature Removal",
"require": {
"composer-runtime-api": "^2.0"
}
}

View File

@@ -0,0 +1,20 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "b862a55cbf5448fb99f0905a4db6529b",
"packages": [],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"composer-runtime-api": "^2.0"
},
"platform-dev": {},
"plugin-api-version": "2.6.0"
}

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
<menus>
<menu id="DataFeatureRemovalMenu" xsi:type="WebPageMenuNode" _delta="define">
<rank>30</rank>
<parent>SystemTools</parent>
<url>$pages/exec.php?exec_module=combodo-data-feature-removal&amp;exec_page=index.php&amp;c[menu]=DataFeatureRemovalMenu</url>
<enable_admin_only>1</enable_admin_only>
</menu>
</menus>
<module_parameters>
<parameters id="combodo-data-feature-removal">
<max_count_estimation_for_safe_cleanup>100</max_count_estimation_for_safe_cleanup>
</parameters>
</module_parameters>
</itop_design>

View File

@@ -0,0 +1,58 @@
<?php
/**
* @copyright Copyright (C) 2010-2025 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* Localized data
*/
Dict::Add('EN US', 'English', 'English', [
'Menu:DataFeatureRemovalMenu' => 'Features Removal',
'combodo-data-feature-removal/Operation:Main/Title' => 'Features Removal',
'DataFeatureRemoval:Main:Title' => 'Features Removal',
'DataFeatureRemoval:Main:SubTitle' => 'Prepare features you want to enable/disable in a future setup',
'DataFeatureRemoval:Failure:Title' => 'Feature dry removal errors',
'DataFeatureRemoval:Helper:Title' => 'Enable or disable features that are installed in your iTop.',
'DataFeatureRemoval:Helper:Desc1' => 'It will prepare the setup step that proceeds to feature enabling or disabling.',
'DataFeatureRemoval:Helper:Desc2' => 'Analyze if there are any data or dependency preventing you from enabling/disabling a feature.',
'DataFeatureRemoval:Features:Title' => 'Features',
'DataFeatureRemoval:Analysis:Title' => 'Analysis result',
'DataFeatureRemoval:Analysis:SubTitle' => '%1$s element(s) to clean before continuing',
'DataFeatureRemoval:DeletionPlan:Title' => 'Deletion plan',
'DataFeatureRemoval:DeletionPlan:SubTitle' => '%1$s rows to clean before continuing',
'DataFeatureRemoval:DoDeletion:Title' => 'Do deletion',
'DataFeatureRemoval:DoDeletion:SubTitle' => 'Remove all the entries from the database',
'DataFeatureRemoval:DeletionPlan:ToManyOperations' => 'Too many entries to clean',
'DataFeatureRemoval:Table:Analysis:ClassName' => 'Element to remove',
'DataFeatureRemoval:Table:Analysis:FeatureName' => 'Feature name',
'DataFeatureRemoval:Table:Analysis:Module' => 'Module name',
'DataFeatureRemoval:Table:Analysis:Occurrence' => 'Occurrence',
'UI:Button:Analyze' => 'Analyze',
'UI:Button:ModifyChoices' => 'Modify Choices',
'UI:Button:AnalyzeAndSetup' => 'Analyze and go to setup',
'UI:Button:PlanDeletion' => 'Prepare deletion plan',
'UI:Button:DoDeletion' => 'Delete data',
'UI:Button:BackToMain' => 'Back to Feature Removal',
'UI:Button:Setup' => 'Back to setup',
'UI:Action:ForceUninstall' => 'Force uninstall',
'UI:Action:MoreInfo' => 'More information',
'DataFeatureRemoval:Table:Empty' => 'No data to remove',
'DataFeatureRemoval:Column:Class' => 'Class',
'DataFeatureRemoval:Column:DeleteCount' => 'Entries to delete',
'DataFeatureRemoval:Column:UpdateCount' => 'Entries to update',
'DataFeatureRemoval:Column:Issue' => 'Issue',
'DataFeatureRemoval:Column:DeletedCount' => 'Deleted entries',
'DataFeatureRemoval:Column:UpdatedCount' => 'Updated entries',
]);

View File

@@ -0,0 +1,58 @@
<?php
/**
* @copyright Copyright (C) 2010-2025 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* Localized data
*/
Dict::Add('FR FR', 'French', 'Français', [
'Menu:DataFeatureRemovalMenu' => 'Suppression de fonctionnalités',
'combodo-data-feature-removal/Operation:Main/Title' => 'Suppression de fonctionnalités',
'DataFeatureRemoval:Main:Title' => 'Suppression de fonctionnalités',
'DataFeatureRemoval:Main:SubTitle' => 'Préparez les fonctionnalités que vous souhaitez activer ou désactiver lors dune prochaine configuration',
'DataFeatureRemoval:Failure:Title' => 'Erreurs lors de la simulation de suppression de fonctionnalités',
'DataFeatureRemoval:Helper:Title' => 'Activez ou désactivez les fonctionnalités installées dans votre iTop.',
'DataFeatureRemoval:Helper:Desc1' => 'Cette étape prépare lassistant de configuration à activer ou désactiver des fonctionnalités.',
'DataFeatureRemoval:Helper:Desc2' => 'Analyse si des données ou des dépendances empêchent lactivation ou la désactivation dune fonctionnalité.',
'DataFeatureRemoval:Features:Title' => 'Fonctionnalités',
'DataFeatureRemoval:Analysis:Title' => 'Résultat de lanalyse',
'DataFeatureRemoval:Analysis:SubTitle' => '%1$s élément(s) à nettoyer avant de poursuivre',
'DataFeatureRemoval:DeletionPlan:Title' => 'Plan de suppression',
'DataFeatureRemoval:DeletionPlan:SubTitle' => '%1$s ligne(s) à nettoyer avant de poursuivre',
'DataFeatureRemoval:DoDeletion:Title' => 'Exécuter la suppression',
'DataFeatureRemoval:DoDeletion:SubTitle' => 'Supprime toutes les entrées de la base de données',
'DataFeatureRemoval:DeletionPlan:ToManyOperations' => 'Trop dentrées à nettoyer',
'DataFeatureRemoval:Table:Analysis:ClassName' => 'Élément à supprimer',
'DataFeatureRemoval:Table:Analysis:FeatureName' => 'Fonctionnalité',
'DataFeatureRemoval:Table:Analysis:Module' => 'Module',
'DataFeatureRemoval:Table:Analysis:Occurrence' => 'Occurrence',
'UI:Button:Analyze' => 'Analyser',
'UI:Button:ModifyChoices' => 'Modifier les choix',
'UI:Button:AnalyzeAndSetup' => 'Analyser et ouvrir lassistant de configuration',
'UI:Button:PlanDeletion' => 'Préparer le plan de suppression',
'UI:Button:DoDeletion' => 'Supprimer les données',
'UI:Button:BackToMain' => 'Retour à la suppression de fonctionnalités',
'UI:Button:Setup' => 'Retour à lassistant de configuration',
'UI:Action:ForceUninstall' => 'Forcer la désinstallation',
'UI:Action:MoreInfo' => 'Plus dinformations',
'DataFeatureRemoval:Table:Empty' => 'Aucune donnée à supprimer',
'DataFeatureRemoval:Column:Class' => 'Classe',
'DataFeatureRemoval:Column:DeleteCount' => 'Entrées à supprimer',
'DataFeatureRemoval:Column:UpdateCount' => 'Entrées à mettre à jour',
'DataFeatureRemoval:Column:Issue' => 'Problème',
'DataFeatureRemoval:Column:DeletedCount' => 'Entrées supprimées',
'DataFeatureRemoval:Column:UpdatedCount' => 'Entrées mises à jour',
]);

View File

@@ -0,0 +1,20 @@
<?php
/**
* @copyright Copyright (C) 2010-2025 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\DataFeatureRemoval;
use Combodo\iTop\DataFeatureRemoval\Controller\DataFeatureRemovalController;
use Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalHelper;
use Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalLog;
require_once(APPROOT.'application/startup.inc.php');
DataFeatureRemovalLog::Enable();
$oController = new DataFeatureRemovalController(MODULESROOT.DataFeatureRemovalHelper::MODULE_NAME.'/templates', DataFeatureRemovalHelper::MODULE_NAME);
$oController->SetDefaultOperation('Main');
$oController->HandleOperation();

View File

@@ -0,0 +1,16 @@
<?php
// PHP Data Model definition file
// WARNING - WARNING - WARNING
// DO NOT EDIT THIS FILE (unless you know what you are doing)
//
// If you provide a datamodel.xxxx.xml file with your module,
// this file WILL BE overwritten by the compilation of the
// module (during the setup) if the datamodel.xxxx.xml file
// contains the definition of new classes or menus.
//
// The recommended way to define new classes (for iTop 2.0 and later) is via the XML definition.
// This file remains in the module's template only for the cases where there is:
// - either no new class or menu defined in the XML file
// - or no XML file at all supplied by the module

View File

@@ -0,0 +1,54 @@
<?php
/**
* @copyright Copyright (C) 2010-2025 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
//
// iTop module definition file
//
SetupWebPage::AddModule(
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
'combodo-data-feature-removal/3.3.0',
[
// Identification
//
'label' => 'iTop Data Feature Removal',
'category' => 'business',
// Setup
//
'dependencies' => [
],
'mandatory' => true,
'visible' => false,
// Components
//
'datamodel' => [
'vendor/autoload.php',
'model.combodo-data-feature-removal.php', // Contains the PHP code generated by the "compilation" of datamodel.combodo-data-feature-removal.xml
],
'webservice' => [],
'data.struct' => [
// add your 'structure' definition XML files here,
],
'data.sample' => [
// add your sample data XML files here,
],
// Documentation
//
'doc.manual_setup' => '', // hyperlink to manual setup documentation, if any
'doc.more_information' => '', // hyperlink to more information, if any
// Default settings
//
'settings' => [
// Module specific settings go here, if any
],
]
);

View File

@@ -0,0 +1,257 @@
<?php
/**
* @copyright Copyright (C) 2010-2025 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\DataFeatureRemoval\Controller;
require_once APPROOT.'setup/feature_removal/SetupAudit.php';
require_once APPROOT.'setup/feature_removal/DryRemovalRuntimeEnvironment.php';
use Combodo\iTop\Application\TwigBase\Controller\Controller;
use Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalConfig;
use Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalException;
use Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalHelper;
use Combodo\iTop\DataFeatureRemoval\Service\DataFeatureRemoverExtensionService;
use Combodo\iTop\DataFeatureRemoval\Service\DeletionPlanService;
use Combodo\iTop\Setup\FeatureRemoval\DryRemovalRuntimeEnvironment;
use Combodo\iTop\Setup\FeatureRemoval\SetupAudit;
use Dict;
use Exception;
use IssueLog;
use MetaModel;
use utils;
class DataFeatureRemovalController extends Controller
{
private array $aSelectedExtensionsForCheck = [];
private array $aCountClassesToCleanup = [];
private array $aAnalysisDataTable = [];
private int $iCount = 0;
public function OperationMain($sErrorMessage = null): void
{
$aParams = [];
$this->ReadRemovedExtensions();
$this->AddAnalyzeParams();
$aParams['sTransactionId'] = utils::GetNewTransactionId();
$aParams['aExtensions'] = $this->GetExtensionsTable();
$aParams['aAnalysisDataTable'] = $this->aAnalysisDataTable;
$aParams['aClasses'] = array_keys($this->aCountClassesToCleanup);
$aParams['DataFeatureRemovalErrorMessage'] = $sErrorMessage;
$aParams['bHasData'] = $this->iCount > 0;
$aParams['sSetupUrl'] = utils::GetAbsoluteUrlAppRoot().'setup';
$aParams['iCount'] = $this->iCount;
$this->AddLinkedStylesheet(utils::GetAbsoluteUrlModulesRoot().DataFeatureRemovalHelper::MODULE_NAME.'/assets/css/DataFeatureRemoval.css');
$this->AddLinkedScript(utils::GetAbsoluteUrlModulesRoot().DataFeatureRemovalHelper::MODULE_NAME.'/assets/js/DataFeatureRemoval.js');
$this->DisplayPage($aParams);
}
public function AddAnalyzeParams(): void
{
$aData = [];
$aColumns = [];
$this->iCount = 0;
foreach ($this->aCountClassesToCleanup as $sClass => $iCount) {
$sModuleName = MetaModel::GetModuleName($sClass);
$aExtensions = DataFeatureRemoverExtensionService::GetInstance()->GetIncludingExtensions($sModuleName);
$sExtensions = implode(' ', $aExtensions);
$aColumns = ['ClassName','FeatureName','Module','Occurrence'];
$aData[] = [$sClass,$sExtensions,$sModuleName,$iCount];
$this->iCount += $iCount;
}
$this->aAnalysisDataTable = $this->GetTableData('Analysis', $aColumns, $aData);
}
public function OperationAnalyze(): void
{
$this->ReadRemovedExtensions();
$this->m_sOperation = 'Main';
try {
if (count($this->aSelectedExtensionsForCheck) > 0) {
$this->Analyze();
}
$this->OperationMain();
} catch (Exception $e) {
IssueLog::Error(__METHOD__, null, ['stack' => $e->getTraceAsString(), 'exception' => $e->getMessage()]);
$this->OperationMain($e->getMessage());
}
}
private function Analyze(): void
{
$sSourceEnv = MetaModel::GetEnvironment();
$oDryRemovalRuntimeEnvironment = new DryRemovalRuntimeEnvironment($sSourceEnv, $this->aSelectedExtensionsForCheck);
$oDryRemovalRuntimeEnvironment->CompileFrom($sSourceEnv);
$oSetupAudit = new SetupAudit($sSourceEnv);
$aGetRemovedClasses = $oSetupAudit->GetIssues();
IssueLog::Debug(__METHOD__, null, ['aGetRemovedClasses' => $aGetRemovedClasses]);
$this->aCountClassesToCleanup = $aGetRemovedClasses;
}
public function OperationDeletionPlan(): void
{
$aParams = [];
$this->ValidateTransactionId();
$aClasses = utils::ReadPostedParam('classes', null, utils::ENUM_SANITIZATION_FILTER_CLASS);
$aDeletionPlanSummaryEntities = DeletionPlanService::GetInstance()->GetDeletionPlanSummary($aClasses);
$aColumns = ['Class', 'DeleteCount' , 'UpdateCount', 'Issue'];
$aRows = [];
$iQueryCount = 0;
foreach ($aDeletionPlanSummaryEntities as $oDeletionPlanSummaryEntity) {
$aRows[] = [
$oDeletionPlanSummaryEntity->sClass,
$oDeletionPlanSummaryEntity->iDeleteCount,
$oDeletionPlanSummaryEntity->iUpdateCount,
$oDeletionPlanSummaryEntity->sIssue ?? '',
];
$iQueryCount += $oDeletionPlanSummaryEntity->iDeleteCount;
$iQueryCount += $oDeletionPlanSummaryEntity->iUpdateCount;
}
$aParams['sTransactionId'] = utils::GetNewTransactionId();
$aParams['aDeletionPlanSummary'] = $this->GetTableData('Extensions', $aColumns, $aRows);
$aParams['aClasses'] = $aClasses;
$aParams['iQueryCount'] = $iQueryCount;
$aParams['bDeletionPossible'] = ($iQueryCount <= DataFeatureRemovalConfig::GetInstance()->Get('max_count_estimation_for_safe_cleanup', 100));
$this->DisplayPage($aParams);
}
public function OperationDoDeletion(): void
{
$aParams = [];
$this->ValidateTransactionId();
$aClasses = utils::ReadPostedParam('classes', null, utils::ENUM_SANITIZATION_FILTER_CLASS);
$aDeletionExecutionSummary = DeletionPlanService::GetInstance()->ExecuteDeletionPlan($aClasses);
$aColumns = ['Class', 'DeletedCount' , 'UpdatedCount'];
$aRows = [];
foreach ($aDeletionExecutionSummary as $oDeletionExecutionSummaryEntity) {
$aRows[] = [
$oDeletionExecutionSummaryEntity->sClass,
$oDeletionExecutionSummaryEntity->iDeleteCount,
$oDeletionExecutionSummaryEntity->iUpdateCount,
];
}
$aParams['sTransactionId'] = utils::GetNewTransactionId();
$aParams['aDeletionExecutionSummary'] = $this->GetTableData('Extensions', $aColumns, $aRows);
$this->DisplayPage($aParams);
}
/**
* Get installed extensions from disk
*
* @return array structure for twig datatable
*/
private function GetExtensionsTable(): array
{
$aExtensions = [];
$aColumns = ['', 'Version', 'Name', 'Code'];
foreach (DataFeatureRemoverExtensionService::GetInstance()->ReadItopExtensions() as $sCode => $oExtension) {
/** @var \iTopExtension $oExtension */
$sChecked = '';
$sDisabledHtml = '';
if ($oExtension->bRemovedFromDisk) {
$sDisabledHtml = 'disabled=""';
$sChecked = 'checked';
} elseif (in_array($sCode, $this->aSelectedExtensionsForCheck)) {
$sChecked = 'checked';
}
$sLabel = $oExtension->sLabel;
$sVersion = $oExtension->sVersion;
$sIdEnable = "aExtensions[$sCode][enable]";
$aExtensions[] = [
<<<HTML
<input type="checkbox" $sDisabledHtml class="extension_check" $sChecked id="$sIdEnable" name="$sIdEnable"/>
HTML,
$sVersion,
$sLabel,
$sCode,
];
}
return $this->GetTableData('Extensions', $aColumns, $aExtensions);
}
private function GetTableData(string $sTableName, array $aColumns, array $aData): array
{
if (empty($aData)) {
return [
'Type' => 'Table',
'Columns' => [['label' => '']],
'Data' => [[ Dict::S('DataFeatureRemoval:Table:Empty')]],
];
}
$aNewColumns = [];
foreach ($aColumns as $sColumn) {
$aNewColumns[] = ['label' => Dict::S("DataFeatureRemoval:Table:$sTableName:$sColumn", Dict::S("DataFeatureRemoval:Column:$sColumn", $sColumn))];
}
$aColumns = $aNewColumns;
return [
'Type' => 'Table',
'Columns' => $aColumns,
'Data' => $aData,
];
}
/**
* @return void
* @throws \Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalException
*/
private function ValidateTransactionId(): void
{
if (empty($_POST)) {
return;
}
$sTransactionId = utils::ReadPostedParam('transaction_id', null, utils::ENUM_SANITIZATION_FILTER_TRANSACTION_ID);
IssueLog::Debug(__FUNCTION__.": Transaction [$sTransactionId]");
if (empty($sTransactionId) || !utils::IsTransactionValid($sTransactionId, false)) {
throw new DataFeatureRemovalException(Dict::S("iTopUpdate:Error:InvalidToken"));
}
}
/**
* @return void
*/
public function ReadRemovedExtensions(): void
{
if (count($this->aSelectedExtensionsForCheck) > 0) {
return;
}
$aSelectedExtensionsFromUI = utils::ReadPostedParam('aExtensions', []);
foreach ($aSelectedExtensionsFromUI as $sCode => $aData) {
$sValue = $aData['enable'] ?? 'off';
if (($sValue) === 'on') {
$this->aSelectedExtensionsForCheck[] = $sCode;
}
}
// Add source removed to check
foreach (DataFeatureRemoverExtensionService::GetInstance()->ReadItopExtensions() as $sCode => $oExtension) {
if ($oExtension->bRemovedFromDisk) {
$this->aSelectedExtensionsForCheck[] = $sCode;
}
}
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace Combodo\iTop\DataFeatureRemoval\Entity;
class DeletionPlanSummaryEntity
{
public string $sClass;
/**
* @var int : DEL_MANUAL|DEL_AUTO|DEL_SILENT|DEL_MOVEUP|DEL_NONE
* @see \AttributeDefinition DEL_xxx
*/
public int $iMode = 0;
public ?string $sIssue = null;
public int $iUpdateCount = 0;
public int $iDeleteCount = 0;
/**
* @param string $sClass
*/
public function __construct(string $sClass)
{
$this->sClass = $sClass;
}
}

View File

@@ -0,0 +1,52 @@
<?php
/**
* @copyright Copyright (C) 2010-2025 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\DataFeatureRemoval\Helper;
use MetaModel;
use utils;
class DataFeatureRemovalConfig
{
private static DataFeatureRemovalConfig $oInstance;
protected function __construct()
{
}
final public static function GetInstance(): DataFeatureRemovalConfig
{
if (!isset(static::$oInstance)) {
static::$oInstance = new DataFeatureRemovalConfig();
}
return static::$oInstance;
}
public function Get(string $sParamName, $default = null)
{
return MetaModel::GetModuleSetting(DataFeatureRemovalHelper::MODULE_NAME, $sParamName, $default);
}
public function GetBoolean(string $sParamName, $default = null): bool
{
$res = $this->Get($sParamName, $default);
return boolval($res);
}
public function IsEnabled(): bool
{
return $this->GetBoolean('enable', false);
}
public function Set(string $sParamName, $value)
{
$oConfig = utils::GetConfig();
$oConfig->SetModuleSetting(DataFeatureRemovalHelper::MODULE_NAME, $sParamName, $value);
}
}

View File

@@ -0,0 +1,30 @@
<?php
/**
* @copyright Copyright (C) 2010-2025 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\DataFeatureRemoval\Helper;
use Exception;
use Throwable;
class DataFeatureRemovalException extends Exception
{
public function __construct(string $message = '', int $code = 0, ?Throwable $previous = null, array $aContext = [])
{
if (!is_null($previous)) {
$sStack = $previous->getTraceAsString();
$sError = $previous->getMessage();
} else {
$sStack = $this->getTraceAsString();
$sError = '';
}
$aContext['error'] = $sError;
$aContext['stack'] = $sStack;
DataFeatureRemovalLog::Error($message, null, $aContext);
parent::__construct($message, $code, $previous);
}
}

View File

@@ -0,0 +1,13 @@
<?php
/**
* @copyright Copyright (C) 2010-2025 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\DataFeatureRemoval\Helper;
class DataFeatureRemovalHelper
{
public const MODULE_NAME = 'combodo-data-feature-removal';
}

View File

@@ -0,0 +1,25 @@
<?php
/**
* @copyright Copyright (C) 2010-2025 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\DataFeatureRemoval\Helper;
use LogAPI;
class DataFeatureRemovalLog extends LogAPI
{
public const CHANNEL_DEFAULT = 'DataFeatureRemoval';
protected static $m_oFileLog = null;
public static function Enable($sTargetFile = null)
{
if (empty($sTargetFile)) {
$sTargetFile = APPROOT.'log/error.log';
}
parent::Enable($sTargetFile);
}
}

View File

@@ -0,0 +1,80 @@
<?php
/*
* @copyright Copyright (C) 2010-2026 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\DataFeatureRemoval\Service;
use iTopExtension;
use iTopExtensionsMap;
use MetaModel;
class DataFeatureRemoverExtensionService
{
private static DataFeatureRemoverExtensionService $oInstance;
private array $aItopExtensions = [];
private array $aIncludingExtensionsByModuleName = [];
protected function __construct()
{
}
final public static function GetInstance(): DataFeatureRemoverExtensionService
{
if (!isset(self::$oInstance)) {
self::$oInstance = new DataFeatureRemoverExtensionService();
}
return self::$oInstance;
}
final public static function SetInstance(?DataFeatureRemoverExtensionService $oInstance): void
{
self::$oInstance = $oInstance;
}
/**
* @param string $sModuleName
*
* @return array
* @throws \Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalException
*/
public function GetIncludingExtensions(string $sModuleName): array
{
if (count($this->aIncludingExtensionsByModuleName) === 0) {
foreach ($this->ReadItopExtensions() as $oExtension) {
$aModuleNames = $oExtension->aModules;
if (is_array($aModuleNames) && count($aModuleNames) > 0) {
foreach ($aModuleNames as $sModule) {
$aExtensions = $this->aIncludingExtensionsByModuleName[$sModule] ?? [];
$aExtensions[] = $oExtension->sLabel.'/'.$oExtension->sVersion;
$this->aIncludingExtensionsByModuleName[$sModule] = $aExtensions;
}
}
}
}
return $this->aIncludingExtensionsByModuleName[$sModuleName] ?? [];
}
/**
* @return iTopExtension[]
*/
public function ReadItopExtensions(): array
{
if (count($this->aItopExtensions) === 0) {
$oExtensionsMap = new iTopExtensionsMap();
$oExtensionsMap->LoadInstalledExtensionsFromDatabase(MetaModel::GetConfig());
$this->aItopExtensions = $oExtensionsMap->GetAllExtensionsToDisplayInSetup(true);
uasort($this->aItopExtensions, function (iTopExtension $oiTopExtension1, iTopExtension $oiTopExtension2) {
return strcmp($oiTopExtension1->sLabel, $oiTopExtension2->sLabel);
});
}
return $this->aItopExtensions;
}
}

View File

@@ -0,0 +1,182 @@
<?php
namespace Combodo\iTop\DataFeatureRemoval\Service;
use CMDBSource;
use Combodo\iTop\DataFeatureRemoval\Entity\DeletionPlanSummaryEntity;
use Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalException;
use DBObjectSearch;
use DeletionPlan;
use MetaModel;
class DeletionPlanService
{
private static DeletionPlanService $oInstance;
protected function __construct()
{
}
final public static function GetInstance(): DeletionPlanService
{
if (!isset(self::$oInstance)) {
self::$oInstance = new DeletionPlanService();
}
return self::$oInstance;
}
final public static function SetInstance(?DeletionPlanService $oInstance): void
{
self::$oInstance = $oInstance;
}
/**
* Get a summary of the deletion plan computed for the classes.
* The result is used for display
*
* @param array|null $aClasses
*
* @return array<\Combodo\iTop\DataFeatureRemoval\Entity\DeletionPlanSummaryEntity>
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MySQLException
*/
public function GetDeletionPlanSummary(?array $aClasses): array
{
$aSummary = [];
if (is_null($aClasses)) {
return $aSummary;
}
$oDeletionPlan = $this->GetDeletionPlan($aClasses);
foreach ($oDeletionPlan->ListUpdates() as $sClass => $aUpdates) {
$oDeletionPlanSummaryEntity = new DeletionPlanSummaryEntity($sClass);
$oDeletionPlanSummaryEntity->iUpdateCount = count($aUpdates);
$aSummary[$sClass] = $oDeletionPlanSummaryEntity;
}
foreach ($oDeletionPlan->ListDeletes() as $sClass => $aDeletes) {
$oDeletionPlanSummaryEntity = $aSummary[$sClass] ?? new DeletionPlanSummaryEntity($sClass);
$oDeletionPlanSummaryEntity->iDeleteCount = count($aDeletes);
$aDelete = array_shift($aDeletes);
$oDeletionPlanSummaryEntity->iMode = $aDelete['mode'];
$oDeletionPlanSummaryEntity->sIssue = $aDelete['issue'] ?? null;
$aSummary[$sClass] = $oDeletionPlanSummaryEntity;
}
return $aSummary;
}
/**
* @param string $sClass
*
* @return \DBObject[]
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MySQLException
* @throws \Exception
*/
private function GetAllObjects(string $sClass): array
{
$oFilter = new DBObjectSearch($sClass);
$oFilter->AllowAllData();
$oSet = new \DBObjectSet($oFilter);
return $oSet->ToArray();
}
/**
* @param array $aClasses
*
* @return array<\Combodo\iTop\DataFeatureRemoval\Entity\DeletionPlanSummaryEntity>
* @throws \Combodo\iTop\DataFeatureRemoval\Helper\DataFeatureRemovalException
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MySQLException
*/
public function ExecuteDeletionPlan(array $aClasses): array
{
$oDeletionPlan = $this->GetDeletionPlan($aClasses);
if (count($oDeletionPlan->GetIssues()) > 0) {
throw new DataFeatureRemovalException("Deletion Plan cannot be executed due to issues");
}
$aSummary = [];
foreach ($oDeletionPlan->ListUpdates() as $sClass => $aToUpdate) {
$oDeletionPlanSummaryEntity = $aSummary[$sClass] ?? new DeletionPlanSummaryEntity($sClass);
foreach ($aToUpdate as $aData) {
$oToUpdate = $aData['to_reset'];
/** @var \DBObject $oToUpdate */
foreach ($aData['attributes'] as $sRemoteExtKey => $aRemoteAttDef) {
$oToUpdate->Set($sRemoteExtKey, $aData['values'][$sRemoteExtKey]);
}
$oToUpdate->DBUpdate();
$oDeletionPlanSummaryEntity->iUpdateCount++;
}
$aSummary[$sClass] = $oDeletionPlanSummaryEntity;
}
foreach ($oDeletionPlan->ListDeletes() as $sClass => $aDeletes) {
$oDeletionPlanSummaryEntity = $aSummary[$sClass] ?? new DeletionPlanSummaryEntity($sClass);
foreach ($aDeletes as $sId => $aDelete) {
try {
CMDBSource::Query('START TRANSACTION');
// Delete any existing change tracking about the current object
$oFilter = new DBObjectSearch('CMDBChangeOp');
$oFilter->AddCondition('objclass', $sClass, '=');
$oFilter->AddCondition('objkey', $sId, '=');
MetaModel::PurgeData($oFilter);
// Delete the entry
$aClassesToRemove = array_merge(MetaModel::EnumChildClasses($sClass, ENUM_CHILD_CLASSES_ALL), MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_EXCLUDELEAF, false));
foreach ($aClassesToRemove as $sParentClass) {
$oFilter = DBObjectSearch::FromOQL_AllData("SELECT $sParentClass WHERE id=:id");
$sQuery = $oFilter->MakeDeleteQuery(['id' => $sId]);
CMDBSource::DeleteFrom($sQuery);
}
CMDBSource::Query('COMMIT');
} catch (\Exception $e) {
\IssueLog::Exception(__METHOD__.': Cleanup failed', $e);
CMDBSource::Query('ROLLBACK');
throw $e;
}
$oDeletionPlanSummaryEntity->iDeleteCount++;
}
$aSummary[$sClass] = $oDeletionPlanSummaryEntity;
}
return $aSummary;
}
/**
* Get a deletion plan for all the objects of the classes
*
* @param array $aClasses array of class names to clean
*
* @return \DeletionPlan
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MySQLException
*/
public function GetDeletionPlan(array $aClasses): DeletionPlan
{
$oDeletionPlan = new DeletionPlan();
foreach ($aClasses as $sClass) {
$aObjects = $this->GetAllObjects($sClass);
foreach ($aObjects as $oObject) {
$oObject->CheckToDelete($oDeletionPlan);
}
}
return $oDeletionPlan;
}
}

View File

@@ -0,0 +1,29 @@
{# @copyright Copyright (C) 2010-2026 Combodo SARL #}
{# @license http://opensource.org/licenses/AGPL-3.0 #}
{% UIPanel ForInformation { sTitle:'DataFeatureRemoval:DeletionPlan:Title'|dict_s, sSubTitle: 'DataFeatureRemoval:DeletionPlan:SubTitle'|dict_format(iQueryCount) } %}
{% UIDataTable ForForm { sRef:'aDeletionPlanSummary', aColumns:aDeletionPlanSummary.Columns, aData:aDeletionPlanSummary.Data} %}{% EndUIDataTable %}
{% EndUIPanel %}
{% if bDeletionPossible %}
{% UIForm Standard {} %}
{% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %}
{% UIInput ForHidden { sName:'operation', sValue:'DoDeletion'} %}
{% for sKey, sClass in aClasses %}
{% UIInput ForHidden { sName:"classes[" ~ sKey ~ "]", sValue:sClass } %}
{% endfor %}
{% UIToolbar ForButton {} %}
{% UIButton ForPrimaryAction {sLabel:'UI:Button:DoDeletion'|dict_s, sName:'btn_deletion', sId:'btn_deletion', bIsSubmit:true} %}
{% EndUIToolbar %}
{% EndUIForm %}
{% else %}
{{ 'DataFeatureRemoval:DeletionPlan:ToManyOperations'|dict_s }}
{% endif %}
{% UIForm Standard {} %}
{% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %}
{% UIInput ForHidden { sName:'operation', sValue:'Main'} %}
{% UIToolbar ForButton {} %}
{% UIButton ForPrimaryAction {sLabel:'UI:Button:BackToMain'|dict_s, sName:'btn_back', sId:'btn_back', bIsSubmit:true} %}
{% EndUIToolbar %}
{% EndUIForm %}

View File

@@ -0,0 +1,14 @@
{# @copyright Copyright (C) 2010-2026 Combodo SARL #}
{# @license http://opensource.org/licenses/AGPL-3.0 #}
{% UIPanel ForInformation { sTitle:'DataFeatureRemoval:DoDeletion:Title'|dict_s, sSubTitle: 'DataFeatureRemoval:DoDeletion:SubTitle'|dict_s } %}
{% UIDataTable ForForm { sRef:'aDeletionExecutionSummary', aColumns:aDeletionExecutionSummary.Columns, aData:aDeletionExecutionSummary.Data} %}{% EndUIDataTable %}
{% EndUIPanel %}
{% UIForm Standard {} %}
{% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %}
{% UIInput ForHidden { sName:'operation', sValue:'Main'} %}
{% UIToolbar ForButton {} %}
{% UIButton ForPrimaryAction {sLabel:'UI:Button:BackToMain'|dict_s, sName:'btn_back_to_main', sId:'btn_back_to_main', bIsSubmit:true} %}
{% EndUIToolbar %}
{% EndUIForm %}

View File

@@ -0,0 +1,19 @@
{# @copyright Copyright (C) 2010-2024 Combodo SAS #}
{# @license http://opensource.org/licenses/AGPL-3.0 #}
{% if bHasData %}
{% UIPanel Neutral { sTitle:'DataFeatureRemoval:Analysis:Title'|dict_s, sSubTitle: 'DataFeatureRemoval:Analysis:SubTitle'|dict_format(iCount) } %}
{% UIDataTable ForForm { sRef:'aAnalysisDataTable', aColumns:aAnalysisDataTable.Columns, aData:aAnalysisDataTable.Data} %}{% EndUIDataTable %}
{% EndUIPanel %}
{% UIForm Standard {} %}
{% UIInput ForHidden { sName:'transaction_id', sValue:sTransactionId} %}
{% UIInput ForHidden { sName:'operation', sValue:'DeletionPlan'} %}
{% for sKey, sClass in aClasses %}
{% UIInput ForHidden { sName:"classes[" ~ sKey ~ "]", sValue:sClass } %}
{% endfor %}
{% UIToolbar ForButton {} %}
{% UIButton ForPrimaryAction {sLabel:'UI:Button:PlanDeletion'|dict_s, sName:'btn_plandeletion', sId:'btn_plandeletion', bIsSubmit:true} %}
{% EndUIToolbar %}
{% EndUIForm %}
{% endif %}

View File

@@ -0,0 +1,16 @@
{# @copyright Copyright (C) 2010-2024 Combodo SAS #}
{# @license http://opensource.org/licenses/AGPL-3.0 #}
{% UIForm Standard {} %}
{% UIInput ForHidden {sName:'operation', sValue:'Analyze'} %}
{% UIInput ForHidden {sName:'transaction_id', sValue:sTransactionId} %}
{% UIFieldSet Standard {sLegend:'DataFeatureRemoval:Features:Title'|dict_s} %}
{% UIDataTable ForForm { sRef:'aExtensions', aColumns:aExtensions.Columns, aData:aExtensions.Data} %}{% EndUIDataTable %}
{% EndUIFieldSet %}
{% UIToolbar ForButton {} %}
{% UIButton ForPrimaryAction {sLabel:'UI:Button:Analyze'|dict_s, sName:'btn_apply', sId:'btn_apply', bIsSubmit:true} %}
{% EndUIToolbar %}
{% EndUIForm %}

View File

@@ -0,0 +1,35 @@
{# @copyright Copyright (C) 2010-2025 Combodo SARL #}
{# @license http://opensource.org/licenses/AGPL-3.0 #}
{# Usable variables: #}
{# * sTitle => page title #}
{# * sMessage => success message #}
{# * sError => error message #}
{# DataFeatureRemoval #}
{% UIPanel ForInformation { sTitle:'DataFeatureRemoval:Main:Title'|dict_s, sSubTitle: 'DataFeatureRemoval:Main:SubTitle'|dict_s } %}
{% UIAlert ForInformation { sTitle:'DataFeatureRemoval:Helper:Title'|dict_s } %}
{{ 'DataFeatureRemoval:Helper:Desc1'|dict_s }}<BR>
{{ 'DataFeatureRemoval:Helper:Desc2'|dict_s }}
{% EndUIAlert %}
{% if null != DataFeatureRemovalErrorMessage %}
<div id="feature_removal_error_msg_div" style="display:block">
{% UIAlert ForFailure { sTitle:'DataFeatureRemoval:Failure:Title'|dict_s, sId: 'feature_removal_error_msg', sContent:DataFeatureRemovalErrorMessage } %}
{% EndUIAlert %}
</div>
{% endif %}
{% include 'Features.html.twig' %}
{% include 'ExtensionRemovalData.html.twig' %}
{% if not bHasData %}
{% UIToolbar ForButton {} %}
<a href="{{ sSetupUrl }}">
{% UIButton ForPrimaryAction {sLabel:'UI:Button:Setup'|dict_s, sName:'btn_setup', sId:'btn_setup', bIsSubmit:false} %}
</a>
{% EndUIToolbar %}
{% endif %}
{% EndUIPanel %}

View File

@@ -0,0 +1,22 @@
<?php
// autoload.php @generated by Composer
if (PHP_VERSION_ID < 50600) {
if (!headers_sent()) {
header('HTTP/1.1 500 Internal Server Error');
}
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
if (!ini_get('display_errors')) {
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
fwrite(STDERR, $err);
} elseif (!headers_sent()) {
echo $err;
}
}
throw new RuntimeException($err);
}
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit4f96a7199e2c0d90e547333758b26464::getLoader();

View File

@@ -0,0 +1,579 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Autoload;
/**
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
*
* $loader = new \Composer\Autoload\ClassLoader();
*
* // register classes with namespaces
* $loader->add('Symfony\Component', __DIR__.'/component');
* $loader->add('Symfony', __DIR__.'/framework');
*
* // activate the autoloader
* $loader->register();
*
* // to enable searching the include path (eg. for PEAR packages)
* $loader->setUseIncludePath(true);
*
* In this example, if you try to use a class in the Symfony\Component
* namespace or one of its children (Symfony\Component\Console for instance),
* the autoloader will first look for the class under the component/
* directory, and it will then fallback to the framework/ directory if not
* found before giving up.
*
* This class is loosely based on the Symfony UniversalClassLoader.
*
* @author Fabien Potencier <fabien@symfony.com>
* @author Jordi Boggiano <j.boggiano@seld.be>
* @see https://www.php-fig.org/psr/psr-0/
* @see https://www.php-fig.org/psr/psr-4/
*/
class ClassLoader
{
/** @var \Closure(string):void */
private static $includeFile;
/** @var string|null */
private $vendorDir;
// PSR-4
/**
* @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
* @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
* @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
* List of PSR-0 prefixes
*
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
*
* @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
* @var list<string>
*/
private $fallbackDirsPsr0 = array();
/** @var bool */
private $useIncludePath = false;
/**
* @var array<string, string>
*/
private $classMap = array();
/** @var bool */
private $classMapAuthoritative = false;
/**
* @var array<string, bool>
*/
private $missingClasses = array();
/** @var string|null */
private $apcuPrefix;
/**
* @var array<string, self>
*/
private static $registeredLoaders = array();
/**
* @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
$this->vendorDir = $vendorDir;
self::initializeIncludeClosure();
}
/**
* @return array<string, list<string>>
*/
public function getPrefixes()
{
if (!empty($this->prefixesPsr0)) {
return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
}
return array();
}
/**
* @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
return $this->prefixDirsPsr4;
}
/**
* @return list<string>
*/
public function getFallbackDirs()
{
return $this->fallbackDirsPsr0;
}
/**
* @return list<string>
*/
public function getFallbackDirsPsr4()
{
return $this->fallbackDirsPsr4;
}
/**
* @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
return $this->classMap;
}
/**
* @param array<string, string> $classMap Class to filename map
*
* @return void
*/
public function addClassMap(array $classMap)
{
if ($this->classMap) {
$this->classMap = array_merge($this->classMap, $classMap);
} else {
$this->classMap = $classMap;
}
}
/**
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
* @param string $prefix The prefix
* @param list<string>|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
$paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
$paths
);
}
return;
}
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
$this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
$paths
);
}
}
/**
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param list<string>|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
* @return void
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
$paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
$paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
// Register directories for a new namespace.
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
$paths
);
}
}
/**
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
public function set($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr0 = (array) $paths;
} else {
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
}
}
/**
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
* @return void
*/
public function setPsr4($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr4 = (array) $paths;
} else {
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
}
}
/**
* Turns on searching the include path for class files.
*
* @param bool $useIncludePath
*
* @return void
*/
public function setUseIncludePath($useIncludePath)
{
$this->useIncludePath = $useIncludePath;
}
/**
* Can be used to check if the autoloader uses the include path to check
* for classes.
*
* @return bool
*/
public function getUseIncludePath()
{
return $this->useIncludePath;
}
/**
* Turns off searching the prefix and fallback directories for classes
* that have not been registered with the class map.
*
* @param bool $classMapAuthoritative
*
* @return void
*/
public function setClassMapAuthoritative($classMapAuthoritative)
{
$this->classMapAuthoritative = $classMapAuthoritative;
}
/**
* Should class lookup fail if not found in the current class map?
*
* @return bool
*/
public function isClassMapAuthoritative()
{
return $this->classMapAuthoritative;
}
/**
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
*
* @param string|null $apcuPrefix
*
* @return void
*/
public function setApcuPrefix($apcuPrefix)
{
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
}
/**
* The APCu prefix in use, or null if APCu caching is not enabled.
*
* @return string|null
*/
public function getApcuPrefix()
{
return $this->apcuPrefix;
}
/**
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
*
* @return void
*/
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
if (null === $this->vendorDir) {
return;
}
if ($prepend) {
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
} else {
unset(self::$registeredLoaders[$this->vendorDir]);
self::$registeredLoaders[$this->vendorDir] = $this;
}
}
/**
* Unregisters this instance as an autoloader.
*
* @return void
*/
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
if (null !== $this->vendorDir) {
unset(self::$registeredLoaders[$this->vendorDir]);
}
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return true|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
$includeFile = self::$includeFile;
$includeFile($file);
return true;
}
return null;
}
/**
* Finds the path to the file where the class is defined.
*
* @param string $class The name of the class
*
* @return string|false The path if found, false otherwise
*/
public function findFile($class)
{
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
return false;
}
if (null !== $this->apcuPrefix) {
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
if ($hit) {
return $file;
}
}
$file = $this->findFileWithExtension($class, '.php');
// Search for Hack files if we are running on HHVM
if (false === $file && defined('HHVM_VERSION')) {
$file = $this->findFileWithExtension($class, '.hh');
}
if (null !== $this->apcuPrefix) {
apcu_add($this->apcuPrefix.$class, $file);
}
if (false === $file) {
// Remember that this class does not exist.
$this->missingClasses[$class] = true;
}
return $file;
}
/**
* Returns the currently registered loaders keyed by their corresponding vendor directories.
*
* @return array<string, self>
*/
public static function getRegisteredLoaders()
{
return self::$registeredLoaders;
}
/**
* @param string $class
* @param string $ext
* @return string|false
*/
private function findFileWithExtension($class, $ext)
{
// PSR-4 lookup
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
$first = $class[0];
if (isset($this->prefixLengthsPsr4[$first])) {
$subPath = $class;
while (false !== $lastPos = strrpos($subPath, '\\')) {
$subPath = substr($subPath, 0, $lastPos);
$search = $subPath . '\\';
if (isset($this->prefixDirsPsr4[$search])) {
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
foreach ($this->prefixDirsPsr4[$search] as $dir) {
if (file_exists($file = $dir . $pathEnd)) {
return $file;
}
}
}
}
}
// PSR-4 fallback dirs
foreach ($this->fallbackDirsPsr4 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
return $file;
}
}
// PSR-0 lookup
if (false !== $pos = strrpos($class, '\\')) {
// namespaced class name
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
} else {
// PEAR-like class name
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
}
if (isset($this->prefixesPsr0[$first])) {
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
if (0 === strpos($class, $prefix)) {
foreach ($dirs as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
}
}
}
// PSR-0 fallback dirs
foreach ($this->fallbackDirsPsr0 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
// PSR-0 include paths.
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
return $file;
}
return false;
}
/**
* @return void
*/
private static function initializeIncludeClosure()
{
if (self::$includeFile !== null) {
return;
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*
* @param string $file
* @return void
*/
self::$includeFile = \Closure::bind(static function($file) {
include $file;
}, null, null);
}
}

View File

@@ -0,0 +1,21 @@
Copyright (c) Nils Adermann, Jordi Boggiano
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -0,0 +1,18 @@
<?php
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
'Combodo\\iTop\\DataFeatureRemoval\\Controller\\DataFeatureRemovalController' => $baseDir . '/src/Controller/DataFeatureRemovalController.php',
'Combodo\\iTop\\DataFeatureRemoval\\Entity\\DeletionPlanSummaryEntity' => $baseDir . '/src/Entity/DeletionPlanSummaryEntity.php',
'Combodo\\iTop\\DataFeatureRemoval\\Helper\\DataFeatureRemovalConfig' => $baseDir . '/src/Helper/DataFeatureRemovalConfig.php',
'Combodo\\iTop\\DataFeatureRemoval\\Helper\\DataFeatureRemovalException' => $baseDir . '/src/Helper/DataFeatureRemovalException.php',
'Combodo\\iTop\\DataFeatureRemoval\\Helper\\DataFeatureRemovalHelper' => $baseDir . '/src/Helper/DataFeatureRemovalHelper.php',
'Combodo\\iTop\\DataFeatureRemoval\\Helper\\DataFeatureRemovalLog' => $baseDir . '/src/Helper/DataFeatureRemovalLog.php',
'Combodo\\iTop\\DataFeatureRemoval\\Service\\DataFeatureRemoverExtensionService' => $baseDir . '/src/Service/DataFeatureRemoverExtensionService.php',
'Combodo\\iTop\\DataFeatureRemoval\\Service\\DeletionPlanService' => $baseDir . '/src/Service/DeletionPlanService.php',
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
);

View File

@@ -0,0 +1,9 @@
<?php
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
);

View File

@@ -0,0 +1,11 @@
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
'Combodo\\iTop\\DataFeatureRemoval\\' => array($baseDir . '/src'),
'' => array($baseDir . '/src/NoNamespace'),
);

View File

@@ -0,0 +1,37 @@
<?php
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit4f96a7199e2c0d90e547333758b26464
{
private static $loader;
public static function loadClassLoader($class)
{
if ('Composer\Autoload\ClassLoader' === $class) {
require __DIR__ . '/ClassLoader.php';
}
}
/**
* @return \Composer\Autoload\ClassLoader
*/
public static function getLoader()
{
if (null !== self::$loader) {
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInit4f96a7199e2c0d90e547333758b26464', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInit4f96a7199e2c0d90e547333758b26464', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit4f96a7199e2c0d90e547333758b26464::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
return $loader;
}
}

View File

@@ -0,0 +1,49 @@
<?php
// autoload_static.php @generated by Composer
namespace Composer\Autoload;
class ComposerStaticInit4f96a7199e2c0d90e547333758b26464
{
public static $prefixLengthsPsr4 = array (
'C' =>
array (
'Combodo\\iTop\\DataFeatureRemoval\\' => 32,
),
);
public static $prefixDirsPsr4 = array (
'Combodo\\iTop\\DataFeatureRemoval\\' =>
array (
0 => __DIR__ . '/../..' . '/src',
),
);
public static $fallbackDirsPsr4 = array (
0 => __DIR__ . '/../..' . '/src/NoNamespace',
);
public static $classMap = array (
'Combodo\\iTop\\DataFeatureRemoval\\Controller\\DataFeatureRemovalController' => __DIR__ . '/../..' . '/src/Controller/DataFeatureRemovalController.php',
'Combodo\\iTop\\DataFeatureRemoval\\Entity\\DeletionPlanSummaryEntity' => __DIR__ . '/../..' . '/src/Entity/DeletionPlanSummaryEntity.php',
'Combodo\\iTop\\DataFeatureRemoval\\Helper\\DataFeatureRemovalConfig' => __DIR__ . '/../..' . '/src/Helper/DataFeatureRemovalConfig.php',
'Combodo\\iTop\\DataFeatureRemoval\\Helper\\DataFeatureRemovalException' => __DIR__ . '/../..' . '/src/Helper/DataFeatureRemovalException.php',
'Combodo\\iTop\\DataFeatureRemoval\\Helper\\DataFeatureRemovalHelper' => __DIR__ . '/../..' . '/src/Helper/DataFeatureRemovalHelper.php',
'Combodo\\iTop\\DataFeatureRemoval\\Helper\\DataFeatureRemovalLog' => __DIR__ . '/../..' . '/src/Helper/DataFeatureRemovalLog.php',
'Combodo\\iTop\\DataFeatureRemoval\\Service\\DataFeatureRemoverExtensionService' => __DIR__ . '/../..' . '/src/Service/DataFeatureRemoverExtensionService.php',
'Combodo\\iTop\\DataFeatureRemoval\\Service\\DeletionPlanService' => __DIR__ . '/../..' . '/src/Service/DeletionPlanService.php',
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
);
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit4f96a7199e2c0d90e547333758b26464::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit4f96a7199e2c0d90e547333758b26464::$prefixDirsPsr4;
$loader->fallbackDirsPsr4 = ComposerStaticInit4f96a7199e2c0d90e547333758b26464::$fallbackDirsPsr4;
$loader->classMap = ComposerStaticInit4f96a7199e2c0d90e547333758b26464::$classMap;
}, null, ClassLoader::class);
}
}

View File

@@ -10,6 +10,7 @@ namespace Combodo\iTop\DBTools\Service;
use CMDBSource;
use DBObjectSearch;
use DBObjectSet;
use IssueLog;
class DBToolsUtils
{

View File

@@ -232,7 +232,7 @@
<choice>
<extension_code>itop-problem-mgmt</extension_code>
<title>Problem Management</title>
<description>Select this option track "Problems" in iTop.</description>
<description>Select this option to track "Problems" in iTop.</description>
<modules type="array">
<module>itop-problem-mgmt</module>
</modules>

View File

@@ -131,7 +131,7 @@ try {
$oPage = new JsonPage();
$oPage->SetOutputDataOnly(true);
$sEnvironment = utils::ReadParam('environment', 'production', false, 'raw_data');
$sEnvironment = utils::ReadParam('environment', ITOP_DEFAULT_ENV, false, 'raw_data');
$oRestoreMutex = new iTopMutex('restore.'.$sEnvironment);
if ($oRestoreMutex->IsLocked()) {
DisplayErrorAndDie($oPage, '<p>'.Dict::S('bkp-restore-running').'</p>');
@@ -156,7 +156,7 @@ try {
require_once(APPROOT.'/setup/backup.class.inc.php');
require_once(__DIR__.'/dbrestore.class.inc.php');
$sEnvironment = utils::ReadParam('environment', 'production', false, 'raw_data');
$sEnvironment = utils::ReadParam('environment', ITOP_DEFAULT_ENV, false, 'raw_data');
try {
set_time_limit(0);

View File

@@ -97,7 +97,7 @@ class DBRestore extends DBBackup
*
* @uses \RunTimeEnvironment::CompileFrom()
*/
public function RestoreFromCompressedBackup($sFile, $sEnvironment = 'production')
public function RestoreFromCompressedBackup($sFile, $sEnvironment = ITOP_DEFAULT_ENV)
{
$oRestoreMutex = new iTopMutex('restore.'.$sEnvironment);
IssueLog::Info("Backup Restore - Acquiring the LOCK 'restore.$sEnvironment'");

View File

@@ -126,7 +126,7 @@ function ExecuteMainOperation($oP)
if (MetaModel::GetConfig()->Get('demo_mode')) {
$oP->p("Sorry, iTop is in demonstration mode: the feature is disabled");
} else {
$sEnvironment = utils::ReadParam('environment', 'production', false, 'raw_data');
$sEnvironment = utils::ReadParam('environment', ITOP_DEFAULT_ENV, false, 'raw_data');
$oRestore->RestoreFromCompressedBackup($sBackupFile, $sEnvironment);
}
}

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
id="acer"
x="0px"
y="0px"
width="83"
height="83"
viewBox="0 0 83 83"
xml:space="preserve"
sodipodi:docname="icon-acer.svg"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:svg="http://www.w3.org/2000/svg"><svg:defs
id="defs1" /><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showguides="true"
inkscape:zoom="10.483071"
inkscape:cx="75.78886"
inkscape:cy="35.676568"
inkscape:window-width="2560"
inkscape:window-height="1360"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="acer"><sodipodi:guide
position="40.307919,41.220214"
orientation="0,-1"
id="guide1"
inkscape:locked="false" /></sodipodi:namedview>
<svg:path
id="acer-logo"
style="fill:#80c343"
d="m 82.85,32.760893 c -0.29,-0.42 -0.62,-0.7 -2.04,-0.81 -0.37,-0.03 -1.6,-0.07 -3.66,-0.07 -5.42,0 -9.1,1.65 -10.98,4.91 0.52,-3.28 -2.67,-4.92 -9.55,-4.92 -8.09,0 -13.14,3.27 -15.15,9.81 -0.74,1.91 -0.82,4.02 -0.23,5.98 l -1.91,0.13 c -1.49,0.11 -3.46,0.22 -4.66,0.22 -2.96,0 -4.8,-0.5 -5.51,-1.5 -0.64,-0.9 -0.57,-2.56 0.17,-4.98 1.23,-4.02 4.29,-5.82 9.18,-5.82 2.53,0 5,0.27 5,0.27 0.3,-0.05 0.51,-0.33 0.46,-0.64 0,-0.01 0,-0.02 -0.01,-0.03 l -0.05,-0.38 -0.17,-1.35 c -0.11,-0.89 -0.77,-1.41 -1.97,-1.57 -1.1,-0.07 -1.91,-0.13 -3.12,-0.13 h -0.07 c -6.39,0.01 -10.84,2.12 -13.36,6.32 0.92,-4.21 -2.04,-6.32 -8.87,-6.32 -2.73,-0.05 -5.46,0.06 -8.18,0.33 -1.03,-0.03 -1.96,0.61 -2.33,1.57 l -0.54,1.73 c -0.1,0.32 0.05,0.48 0.46,0.48 h 0.01 c 0.3,-0.04 1.46,-0.15 3.44,-0.31 2.62,-0.21 4.55,-0.32 5.83,-0.32 3.77,0 5.35,0.95 4.76,2.84 -0.11,0.4 -0.44,0.71 -0.85,0.78 -3.56,0.59 -6.39,1.02 -8.48,1.28 -5.89,0.75 -9.29,2.59 -10.2,5.52 -1.25,4.03 1.89,6.04 9.44,6.04 3.17,0.04 6.34,-0.18 9.48,-0.65 1.47,-0.25 2.22,-0.63 2.51,-1.58 l 1.41,-4.49 c -0.15,4.49 2.99,6.75 9.41,6.75 2.23,0.04 4.45,-0.06 6.66,-0.31 1.32,-0.23 1.95,-0.52 2.24,-1.51 l 0.28,-1.41 c 1.37,2.14 4.37,3.21 9.01,3.21 4.89,0 7.74,-0.14 8.55,-0.41 0.57,-0.12 1.04,-0.52 1.25,-1.06 0.03,-0.09 0.05,-0.19 0.06,-0.28 l 0.59,-1.91 c 0.1,-0.33 -0.05,-0.49 -0.45,-0.48 l -3.13,0.15 c -2.09,0.12 -3.72,0.18 -4.9,0.17 -1.54,0.08 -3.08,-0.07 -4.58,-0.46 -1.2,-0.41 -1.94,-1.61 -1.77,-2.86 l 9.91,-1.27 c 4.44,-0.57 7.42,-1.94 8.92,-4.12 l -3.37,11.73 c -0.07,0.18 -0.04,0.38 0.07,0.53 0.18,0.17 0.41,0.25 0.65,0.22 h 4.1 c 0.47,0.07 0.93,-0.22 1.06,-0.68 l 3.62,-12.67 c 0.48,-1.67 2,-2.48 4.67,-2.48 2.41,0 4.22,0.02 5.38,0.07 0.03,0 0.06,0 0.09,0 0.39,0 0.74,-0.26 0.84,-0.63 l 0.63,-1.74 c 0.15,-0.3 0.12,-0.63 -0.05,-0.89 m -66.12,15.24 c -1.83,0.23 -3.68,0.33 -5.52,0.3 -4.17,0 -5.99,-0.84 -5.46,-2.53 0.38,-1.21 1.47,-1.94 3.28,-2.19 l 9.48,-1.28 z m 43.83,-10.27 c -0.4,1.3 -2.25,2.19 -5.56,2.67 l -7.9,1.13 0.2,-0.65 c 0.39,-1.74 1.37,-3.28 2.79,-4.37 1.2,-0.77 3.15,-1.16 5.86,-1.16 3.56,0 5.1,0.8 4.61,2.38" />
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="108"
height="108"
viewBox="0 0 108 108"
role="img"
version="1.1"
id="svg11"
sodipodi:docname="icon-cisco.svg"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<sodipodi:namedview
id="namedview11"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showguides="true"
inkscape:zoom="6.8229602"
inkscape:cx="48.879078"
inkscape:cy="51.737075"
inkscape:window-width="2560"
inkscape:window-height="1360"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg11">
<sodipodi:guide
position="16.939587,53.376303"
orientation="0,-1"
id="guide11"
inkscape:locked="false" />
</sodipodi:namedview>
<title
id="fw-c-header__logo-title">Cisco.com France</title>
<defs
id="defs1">
<path
d="m 0,22.769 a 2.348,2.348 0 0 0 3.935,1.545 c 0.434,-0.403 0.7,-0.955 0.744,-1.545 v -5.2 a 2.34,2.34 0 0 0 -4.679,0 v 5.2"
id="bar_short"
class="bar" />
<path
d="m 12.95,22.769 a 2.349,2.349 0 0 0 2.34,2.171 2.346,2.346 0 0 0 2.339,-2.171 V 11.112 a 2.341,2.341 0 0 0 -4.679,0 V 22.77"
id="bar_tall"
class="bar" />
<path
d="m 25.832,27.464 a 2.345,2.345 0 0 0 4.678,0 V 2.249 a 2.342,2.342 0 0 0 -4.678,0 v 25.215"
id="bar_grande"
class="bar" />
<path
d="m 24.026,56.277 v -5.002 l -0.098,0.043 a 9.253,9.253 0 0 1 -3.605,0.915 5.303,5.303 0 0 1 -3.63,-1.07 4.644,4.644 0 0 1 -1.58,-2.244 5.395,5.395 0 0 1 -0.106,-3 4.6,4.6 0 0 1 1.609,-2.566 4.823,4.823 0 0 1 2.528,-1.09 8.332,8.332 0 0 1 4.774,0.895 l 0.108,0.056 v -5.03 l -0.228,-0.061 a 12.78,12.78 0 0 0 -4.552,-0.596 10.534,10.534 0 0 0 -4.065,0.93 9.29,9.29 0 0 0 -3.329,2.572 10.014,10.014 0 0 0 -0.182,12.18 9.546,9.546 0 0 0 5.292,3.403 c 2.211,0.538 4.528,0.456 6.697,-0.234 l 0.367,-0.101"
id="cisco_c" />
</defs>
<g
fill="#02c8ff"
fill-rule="evenodd"
id="g11"
transform="translate(-0.09466859,26.234946)">
<use
href="#cisco_c"
id="use1" />
<use
href="#cisco_c"
x="49.5"
id="use2" />
<path
d="m 41.69,52.125 -0.019,4.308 0.315,0.054 c 0.989,0.185 1.987,0.313 2.99,0.385 a 18.1,18.1 0 0 0 2.642,0.051 c 0.842,-0.06 1.675,-0.218 2.48,-0.468 a 6.862,6.862 0 0 0 2.573,-1.371 5.19,5.19 0 0 0 1.498,-2.148 5.912,5.912 0 0 0 -0.03,-4.324 4.852,4.852 0 0 0 -1.343,-1.862 5.568,5.568 0 0 0 -1.97,-1.147 l -3.25,-1.206 a 1.742,1.742 0 0 1 -0.887,-0.845 1.107,1.107 0 0 1 0.036,-0.986 1.29,1.29 0 0 1 0.217,-0.291 1.75,1.75 0 0 1 0.48,-0.347 c 0.363,-0.18 0.755,-0.293 1.158,-0.337 a 6.76,6.76 0 0 1 2.072,0.022 c 0.81,0.088 1.613,0.231 2.402,0.43 l 0.168,0.037 v -3.974 l -0.31,-0.067 a 21.14,21.14 0 0 0 -2.444,-0.435 12.545,12.545 0 0 0 -3.213,-0.014 6.945,6.945 0 0 0 -3.699,1.488 4.908,4.908 0 0 0 -1.58,2.178 5.984,5.984 0 0 0 -0.003,4.05 c 0.242,0.65 0.63,1.237 1.136,1.714 0.437,0.422 0.932,0.78 1.47,1.065 0.708,0.38 1.458,0.675 2.235,0.878 0.257,0.077 0.512,0.158 0.766,0.243 l 0.385,0.141 0.11,0.045 c 0.38,0.136 0.726,0.35 1.018,0.628 0.202,0.19 0.358,0.423 0.455,0.683 0.06,0.237 0.061,0.485 0.003,0.723 a 1.536,1.536 0 0 1 -0.744,0.892 3.691,3.691 0 0 1 -1.239,0.387 9,9 0 0 1 -1.92,0.097 21.973,21.973 0 0 1 -2.507,-0.334 c -0.433,-0.09 -0.864,-0.19 -1.291,-0.303 z m -11.144,4.482 h 4.73 V 37.846 h -4.73 z M 85.305,43.386 a 4.934,4.934 0 1 1 6.157,7.711 4.934,4.934 0 0 1 -6.157,-7.71 m -6.867,3.848 a 9.87,9.87 0 0 0 12.002,9.485 9.629,9.629 0 0 0 3.157,-17.729 9.934,9.934 0 0 0 -15.16,8.244"
id="path2" />
<use
href="#bar_short"
x="0"
id="use3" />
<use
href="#bar_tall"
x="0"
id="use4" />
<use
href="#bar_grande"
x="0"
id="use5" />
<use
href="#bar_tall"
x="25.875"
id="use6" />
<use
href="#bar_short"
x="51.75"
id="use7" />
<use
href="#bar_tall"
x="51.75"
id="use8" />
<use
href="#bar_grande"
x="51.75"
id="use9" />
<use
href="#bar_tall"
x="77.625"
id="use10" />
<use
href="#bar_short"
x="103.375"
id="use11" />
</g>
<metadata
id="metadata11">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>Cisco.com France</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 29.5.1, SVG Export Plug-In . SVG Version: 9.03 Build 0) -->
<svg
version="1.0"
id="katman_1"
x="0px"
y="0px"
viewBox="0 0 630 630"
xml:space="preserve"
sodipodi:docname="icon-hpe.svg"
width="630"
height="630"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs2" /><sodipodi:namedview
id="namedview2"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showguides="true"
inkscape:zoom="0.6905515"
inkscape:cx="-217.94175"
inkscape:cy="275.1424"
inkscape:window-width="2560"
inkscape:window-height="1360"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="katman_1"><sodipodi:guide
position="197.66244,314.48848"
orientation="0,-1"
id="guide2"
inkscape:locked="false" /></sodipodi:namedview>
<style
type="text/css"
id="style1">
.st0{fill:none;stroke:#000000;stroke-width:36;}
.st1{fill:none;stroke:#03A883;stroke-width:36;}
</style>
<path
class="st0"
d="m 18.511987,405.93012 v -180 m 154.000003,180 v -180 m -154.000003,89 H 155.51199 m 95,91 v -180 m 0,18 h 102 c 27.6,0 50,22.4 50,50 0,27.6 -22.4,50 -50,50 h -102 m 222,-67 v -33 h 158"
id="path1" />
<path
class="st1"
d="m 630.51199,387.93012 h -158 v -76 h 158"
id="path2" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 231 231"
preserveAspectRatio="xMinYMid"
version="1.1"
id="svg4"
xml:space="preserve"
width="231"
height="231"
sodipodi:docname="icon-oracle-linux.svg"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showguides="true"
inkscape:zoom="7.5332891"
inkscape:cx="107.05815"
inkscape:cy="90.796993"
inkscape:window-width="2560"
inkscape:window-height="1360"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4"><sodipodi:guide
position="41.763589,115.468"
orientation="0,-1"
id="guide1"
inkscape:locked="false" /></sodipodi:namedview><defs
id="defs8"><rect
x="-138.24641"
y="81.567238"
width="382.3674"
height="240.21156"
id="rect495" /><rect
x="-17.612623"
y="104.35898"
width="171.05238"
height="197.31444"
id="rect291" /></defs><g
id="g1407"
transform="translate(0.61321542,76.835533)"><path
d="m 99.59,19.52 h 15.24 L 106.78,6.52 91.98,30 h -6.73 l 18,-28.17 a 4.29,4.29 0 0 1 7,-0.05 L 128.3,30 h -6.73 l -3.17,-5.25 h -15.42 l -3.36,-5.23 m 69.93,5.23 V 0.28 h -5.72 v 26.88 a 2.76,2.76 0 0 0 0.85,2 2.89,2.89 0 0 0 2.08,0.87 h 26 l 3.39,-5.25 h -26.63 m -94.54,-4.4 a 10.05,10.05 0 0 0 0,-20.1 h -25 V 30 h 5.71 V 5.54 h 18.94 a 4.81,4.81 0 0 1 0,9.62 H 58.52 L 75.58,30 h 8.29 L 72.41,20.38 h 2.57 M 14.86,30 h 17.27 a 14.86,14.86 0 0 0 0,-29.71 H 14.86 a 14.86,14.86 0 1 0 0,29.71 m 16.88,-5.23 h -16.5 a 9.62,9.62 0 0 1 0,-19.23 h 16.5 a 9.62,9.62 0 1 1 0,19.23 M 140.23,30 h 17.63 l 3.34,-5.23 h -20.58 a 9.62,9.62 0 1 1 0,-19.23 h 16.75 l 3.38,-5.25 h -20.52 a 14.86,14.86 0 1 0 0,29.71 m 69.87,-5.23 a 9.62,9.62 0 0 1 -9.26,-7 h 24.42 l 3.36,-5.24 h -27.78 a 9.61,9.61 0 0 1 9.26,-7 h 16.76 l 3.35,-5.25 h -20.5 a 14.86,14.86 0 0 0 0,29.71 h 17.63 l 3.35,-5.23 h -20.6"
style="fill:#c74634"
id="path2" /><path
id="rect749"
style="fill:#c74634;fill-opacity:1;stroke-width:5.2519;stroke-linecap:square;paint-order:stroke fill markers"
d="m 25.391517,47.930871 h 4.980863 v 3.830025 h -4.980863 z m 61.5008,18.557061 -7.24,-10.240002 h 4.96 l 4.64,7.080002 h 0.24 l 4.76,-7.080002 h 4.72 l -7.28,10.160002 7.64,10.88 h -4.96 l -5.08,-7.72 h -0.24 l -5.12,7.72 h -4.72 z m -21.599998,11.28 q -6.68,0 -6.68,-7.24 V 56.24793 h 4.12 v 13.760002 q 0,2.36 1.04,3.32 1.08,0.92 3.12,0.92 1.4,0 2.6,-0.68 1.2,-0.72 1.88,-2 0.72,-1.28 0.72,-2.96 V 56.24793 h 4.12 v 21.040002 h -3.32 l -0.4,-2.8 h -0.28 q -1.16,1.6 -2.92,2.44 -1.76,0.84 -4,0.84 z M 35.81232,56.24793 h 3.320001 l 0.4,2.800002 h 0.28 q 1.12,-1.600002 2.88,-2.440002 1.8,-0.84 4.04,-0.84 6.68,0 6.68,7.240002 v 14.28 h -4.12 v -13.76 q 0,-2.36 -1.08,-3.28 -1.04,-0.96 -3.08,-0.96 -1.4,0 -2.6,0.72 -1.2,0.68 -1.92,1.96 -0.68,1.28 -0.68,2.96 v 12.36 H 35.81232 Z M 3.61239,47.930871 h 4.44 v 25.517061 h 14.28 v 3.84 h -18.72 z M 26.256768,59.46395 V 77.287932 H 30.37238 V 56.275464 h -6.387612 v 1.825681 z" /></g></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 1280 1280"
version="1.1"
id="svg1"
sodipodi:docname="icon-sony.svg"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
width="1280"
height="1280"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.63418639"
inkscape:cx="-462.79769"
inkscape:cy="225.48576"
inkscape:window-width="2560"
inkscape:window-height="1360"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g4"
showguides="true">
<sodipodi:guide
position="173.37108,641.89024"
orientation="0,-1"
id="guide1"
inkscape:locked="false" />
</sodipodi:namedview>
<svg:defs
id="defs1" />
<svg:g
id="Layer_2">
<svg:g
id="g4"
inkscape:label="logo">
<svg:path
d="m 456.0129,751.74687 c -46.41279,0 -89.42079,-13.82399 -118.09279,-39.60319 a 96.895989,96.895989 0 0 1 -32.12799,-73.19039 98.329588,98.329588 0 0 1 32.12799,-72.9344 c 26.624,-24.19199 73.728,-39.55199 118.09279,-39.55199 49.07519,0 88.37119,12.3648 118.39999,39.60319 a 97.407989,97.407989 0 0 1 31.69279,72.8832 101.52959,101.52959 0 0 1 -31.69279,73.19039 c -27.9808,25.9328 -71.9104,39.60319 -118.39999,39.60319 v -29.64479 c 24.6016,0 47.43679,-8.4992 63.38559,-24.3712 15.9488,-15.872 23.1936,-35.1232 23.1936,-58.87999 0,-22.6816 -7.9616,-43.8784 -23.1936,-58.88 -15.744,-15.48799 -39.11679,-24.21759 -63.38559,-24.21759 -24.2688,0 -47.74399,8.6528 -63.48799,24.21759 -15.1808,15.0272 -23.04,36.3008 -23.04,58.88 a 82.35519,82.35519 0 0 0 23.04,58.87999 c 15.744,15.6928 39.06559,24.3712 63.48799,24.3712 z M 117.12014,526.4669 c -24.806392,0 -52.991989,4.6592 -76.799986,15.36 C 18.099355,551.7597 1.575e-4,567.70849 1.575e-4,594.15329 a 54.220794,54.220794 0 0 0 14.7199985,37.2736 c 6.425599,5.9392 16.793599,16.0256 43.878396,21.9648 12.108798,2.55999 37.990395,6.68159 63.769588,9.39519 25.7792,2.7136 50.7648,5.12 61.0048,7.8592 8.1408,2.0736 21.83679,4.8896 21.83679,20.2496 0,15.36 -14.41279,19.968 -16.92159,20.9664 -2.5088,0.9984 -19.8144,8.9344 -50.8928,8.9344 a 216.42237,216.42237 0 0 1 -60.59519,-10.4192 c -11.596799,-4.1472 -23.756797,-9.6 -35.097596,-23.4496 a 40.268795,40.268795 0 0 1 -7.295999,-22.2208 H 6.2465567 v 78.84799 H 37.529754 v -10.67519 a 4.4543995,4.4543995 0 0 1 6.7584,-3.84 246.42557,246.42557 0 0 0 45.772794,14.79679 c 16.435202,3.4304 27.059192,5.9136 47.487992,5.9136 a 202.62398,202.62398 0 0 0 63.6416,-8.9856 111.07839,111.07839 0 0 0 37.81119,-18.66239 51.814394,51.814394 0 0 0 20.24959,-41.4976 58.060793,58.060793 0 0 0 -16.35839,-40.80639 72.012792,72.012792 0 0 0 -20.1728,-13.7984 148.60798,148.60798 0 0 0 -24.88319,-8.6784 c -16.2304,-3.968 -52.6848,-8.9344 -70.1184,-10.6752 -18.27839,-1.8944 -49.99679,-4.5312 -62.668789,-8.448 -3.839999,-1.2032 -11.673599,-4.9152 -11.673599,-14.0032 0,-6.4768 3.584,-11.9552 10.649599,-16.384 C 75.26415,560.7709 97.945747,556.3933 121.60014,556.3933 a 166.98878,166.98878 0 0 1 66.7136,13.03039 72.857591,72.857591 0 0 1 15.87199,9.472 47.718394,47.718394 0 0 1 15.6416,26.1632 h 25.2672 V 536.4253 h -28.16 v 7.9616 c 0,2.56 -2.56,5.9392 -7.68,3.1488 -12.69759,-6.6048 -48.38399,-20.8896 -92.13439,-21.0688 z m 618.21433,12.5952 137.62558,124.18558 -1.408,-83.60959 c -0.1536,-10.9824 -2.1504,-15.56479 -14.0288,-15.56479 h -25.85599 v -25.0112 h 117.75998 v 25.0112 h -25.26719 c -12.0832,0 -12.8,3.89119 -13.0048,15.56479 l 2.1248,159.76959 h -40.32 L 714.41927,597.94209 v 100.37759 c 0.128,10.9312 0.64,16.0768 11.8784,16.0768 h 28.16 v 25.0112 H 639.02728 v -25.0112 h 27.0336 c 10.08639,0 9.67679,-9.6256 9.67679,-16.64 V 580.58529 c 0,-7.68 -1.0752,-16.48639 -16.89599,-16.48639 h -21.9136 V 539.0621 Z M 1083.776,714.34528 a 55.859193,55.859193 0 0 0 6.9632,-0.4352 8.627199,8.627199 0 0 0 5.4272,-4.8128 28.006397,28.006397 0 0 0 0.5376,-5.4016 v -39.552 c 0,-1.3312 0,-1.3568 -1.6896,-3.456 -1.6896,-2.0992 -72.0896,-81.91999 -75.2896,-85.50399 -3.9936,-4.352 -11.008,-11.08479 -21.6832,-11.08479 h -24.44796 v -25.0368 h 137.98396 v 24.9856 h -16.64 c -3.84,0 -6.4,3.66079 -3.1232,7.67999 0,0 46.4384,55.552 46.8736,56.1408 0.4352,0.5888 0.8192,0.7168 1.408,0.1792 0.5888,-0.5376 47.5904,-55.808 47.9488,-56.32 a 4.7871994,4.7871994 0 0 0 -4.096,-7.67999 h -17.0752 V 539.0621 H 1280 v 25.0368 h -25.2672 c -9.1648,0 -12.8,1.68959 -19.7888,9.47199 l -76.16,86.88639 a 5.3759994,5.3759994 0 0 0 -0.9216,3.6864 v 39.5264 a 28.159997,28.159997 0 0 0 0.5632,5.4016 8.524799,8.524799 0 0 0 5.4016,4.8128 50.611194,50.611194 0 0 0 6.912,0.4352 h 25.8304 v 25.0368 h -137.2672 v -25.0368 z"
id="path1"
fill="#000000"
style="stroke-width:2.56" />
</svg:g>
</svg:g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@@ -0,0 +1,281 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 96 96"
width="96"
height="96"
version="1.1"
id="svg25"
sodipodi:docname="icons8-acess-point-3.svg"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs25" />
<sodipodi:namedview
id="namedview25"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showguides="true"
inkscape:zoom="2.0255663"
inkscape:cx="-53.071578"
inkscape:cy="-106.14316"
inkscape:window-width="2560"
inkscape:window-height="1360"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg25">
<sodipodi:guide
position="-127.86548,48.359002"
orientation="0,-1"
id="guide25"
inkscape:locked="false" />
<sodipodi:guide
position="47.76442,140.92571"
orientation="1,0"
id="guide26"
inkscape:locked="false" />
<sodipodi:guide
position="44.611364,71.852727"
orientation="1,0"
id="guide27"
inkscape:locked="false" />
</sodipodi:namedview>
<linearGradient
id="sQy7OvPXH0t2mKfqk7XuXa"
x1="34.117001"
x2="33.909"
y1="30.451"
y2="11.826"
gradientTransform="matrix(2.2111455,0,0,-2.2111455,-5.0805451,101.8257)"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#737b80"
id="stop1" />
<stop
offset=".714"
stop-color="#737b80"
id="stop2" />
<stop
offset=".756"
stop-color="#737b80"
id="stop3" />
<stop
offset=".863"
stop-color="#656c71"
id="stop4" />
<stop
offset="1"
stop-color="#575c61"
id="stop5" />
</linearGradient>
<path
fill="url(#sQy7OvPXH0t2mKfqk7XuXa)"
d="m 63.464964,82.168622 c -0.210059,0 -0.42454,-0.03096 -0.636811,-0.09287 -1.169694,-0.351572 -1.83525,-1.58318 -1.483677,-2.752875 L 74.611348,35.09997 c 0.351573,-1.169696 1.585392,-1.835252 2.752877,-1.483679 1.169696,0.351571 1.83525,1.583179 1.483677,2.752876 L 65.581031,80.592076 c -0.285238,0.959638 -1.163063,1.576547 -2.116067,1.576546 z"
id="path5"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXa);stroke-width:2.21115" />
<linearGradient
id="sQy7OvPXH0t2mKfqk7XuXb"
x1="14.121"
x2="13.913"
y1="30.719"
y2="12.094"
gradientTransform="matrix(2.2111455,0,0,-2.2111455,-5.0805451,101.8257)"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#737b80"
id="stop6" />
<stop
offset=".773"
stop-color="#737b80"
id="stop7" />
<stop
offset="1"
stop-color="#575c61"
id="stop8" />
</linearGradient>
<path
fill="url(#sQy7OvPXH0t2mKfqk7XuXb)"
d="m 32.508927,82.168622 c -0.950793,0 -1.828617,-0.619122 -2.118278,-1.576548 L 17.123777,36.369165 c -0.351573,-1.169696 0.313983,-2.401304 1.483679,-2.752876 1.167483,-0.344938 2.401305,0.313984 2.752875,1.483679 l 13.266874,44.22291 c 0.351572,1.169696 -0.313982,2.401304 -1.483679,2.752875 -0.21227,0.06191 -0.42454,0.09287 -0.634599,0.09287 z"
id="path8"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXb);stroke-width:2.21115" />
<linearGradient
id="sQy7OvPXH0t2mKfqk7XuXc"
x1="24"
x2="24"
y1="14.614"
y2="-2.0710001"
gradientTransform="matrix(2.2111455,0,0,-2.2111455,-5.0805451,101.8257)"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#899198"
id="stop9" />
<stop
offset="1"
stop-color="#787e85"
id="stop10" />
</linearGradient>
<path
fill="url(#sQy7OvPXH0t2mKfqk7XuXc)"
d="M 85.576419,88.802058 H 10.397473 c -2.4433136,0 -4.4222888,-1.978974 -4.4222888,-4.42229 V 68.901749 c 0,-2.443315 1.9789752,-4.422291 4.4222888,-4.422291 h 75.178946 c 2.443316,0 4.422291,1.978976 4.422291,4.422291 v 15.478019 c 0,2.443316 -1.978975,4.42229 -4.422291,4.42229 z"
id="path10"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXc);stroke-width:2.21115" />
<rect
width="75.178947"
height="15.478019"
x="10.397472"
y="68.901749"
fill="#737b80"
id="rect10"
style="stroke-width:2.21115" />
<radialGradient
id="sQy7OvPXH0t2mKfqk7XuXd"
cx="36.5"
cy="11.39"
r="2.5"
gradientTransform="matrix(2.2111455,0,0,-2.2111455,-5.0805451,101.8257)"
gradientUnits="userSpaceOnUse">
<stop
offset=".582"
stop-opacity=".2"
id="stop11" />
<stop
offset="1"
stop-opacity="0"
id="stop12" />
</radialGradient>
<circle
cx="75.626282"
cy="76.640755"
r="5.5278635"
fill="url(#sQy7OvPXH0t2mKfqk7XuXd)"
id="circle12"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXd);stroke-width:2.21115" />
<radialGradient
id="sQy7OvPXH0t2mKfqk7XuXe"
cx="30.5"
cy="11.39"
r="2.5"
gradientTransform="matrix(2.2111455,0,0,-2.2111455,-5.0805451,101.8257)"
gradientUnits="userSpaceOnUse">
<stop
offset=".582"
stop-opacity=".2"
id="stop13" />
<stop
offset="1"
stop-opacity="0"
id="stop14" />
</radialGradient>
<circle
cx="62.359394"
cy="76.640755"
r="5.5278635"
fill="url(#sQy7OvPXH0t2mKfqk7XuXe)"
id="circle14"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXe);stroke-width:2.21115" />
<radialGradient
id="sQy7OvPXH0t2mKfqk7XuXf"
cx="24.5"
cy="11.39"
r="2.5"
gradientTransform="matrix(2.2111455,0,0,-2.2111455,-5.0805451,101.8257)"
gradientUnits="userSpaceOnUse">
<stop
offset=".582"
stop-opacity=".2"
id="stop15" />
<stop
offset="1"
stop-opacity="0"
id="stop16" />
</radialGradient>
<circle
cx="49.092525"
cy="76.640755"
r="5.5278635"
fill="url(#sQy7OvPXH0t2mKfqk7XuXf)"
id="circle16"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXf);stroke-width:2.21115" />
<radialGradient
id="sQy7OvPXH0t2mKfqk7XuXg"
cx="11.5"
cy="11.39"
r="2.5"
gradientTransform="matrix(2.2111455,0,0,-2.2111455,-5.0805451,101.8257)"
gradientUnits="userSpaceOnUse">
<stop
offset=".582"
stop-opacity=".2"
id="stop17" />
<stop
offset="1"
stop-opacity="0"
id="stop18" />
</radialGradient>
<circle
cx="20.347635"
cy="76.640755"
r="5.5278635"
fill="url(#sQy7OvPXH0t2mKfqk7XuXg)"
id="circle18"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXg);stroke-width:2.21115" />
<circle
cx="75.626282"
cy="76.640755"
r="3.3167181"
fill="#50e6ff"
id="circle19"
style="stroke-width:2.21115" />
<circle
cx="62.359394"
cy="76.640755"
r="3.3167181"
fill="#50e6ff"
id="circle20"
style="stroke-width:2.21115" />
<circle
cx="49.092525"
cy="76.640755"
r="3.3167181"
fill="#50e6ff"
id="circle21"
style="stroke-width:2.21115" />
<circle
cx="20.347635"
cy="76.640755"
r="3.3167181"
fill="#50e6ff"
id="circle22"
style="stroke-width:2.21115" />
<path
fill="#0078d4"
d="M 76.06186,21.738016 71.411821,26.423432 47.942723,17.974646 24.495735,26.403533 19.894342,21.766761 C 19.049684,20.913259 19.012095,19.504758 19.863382,18.65789 27.279564,11.290354 37.453044,6.9542994 47.942718,6.9476659 c 10.421129,-0.011054 20.76929,4.3272091 28.154515,11.6881131 0.849081,0.844657 0.809281,2.250946 -0.03538,3.102237 z"
id="path22"
style="stroke-width:2.21115" />
<path
fill="#199be2"
d="m 71.414032,26.425643 -0.455497,0.442231 -5.757821,5.757823 -17.253569,-5.819736 -17.233669,5.797623 -5.757823,-5.73571 -0.455494,-0.464341 c 5.779935,-6.507401 14.146909,-10.6334 23.446986,-10.6334 9.319978,0 17.684742,4.123788 23.466887,10.65551 z"
id="path23"
style="stroke-width:2.21115" />
<path
fill="#35c1f1"
d="m 65.198502,32.623485 -0.999438,0.992804 -5.216091,5.207248 -11.04025,-3.192894 -11.018139,3.192894 -5.216092,-5.207248 -0.999437,-1.014916 c 4.194543,-4.897687 10.36585,-8.008769 17.233668,-8.008769 6.889929,0.0023 13.061235,3.111082 17.255779,8.030881 z"
id="path24"
style="stroke-width:2.21115" />
<path
fill="#50e6ff"
d="m 58.982973,38.823537 -1.629615,1.631826 -7.862833,7.907056 c -0.844658,0.85129 -2.208935,0.85129 -3.055803,0.0045 l -7.902635,-7.911521 -1.607503,-1.631824 c 2.587041,-3.287976 6.56268,-5.40404 11.018139,-5.40404 4.477569,-0.0023 8.453208,2.116064 11.04025,5.40404 z"
id="path25"
style="stroke-width:2.21115" />
</svg>

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,256,256" width="48px" height="48px" fill-rule="nonzero"><g fill="#0088cc" fill-rule="nonzero" stroke="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="none" font-weight="none" font-size="none" text-anchor="none" style="mix-blend-mode: normal"><g transform="scale(5.33333,5.33333)"><path d="M28.465,38.611c0.419,-1.105 0.664,-2.365 0.664,-3.714c0,-4.133 -2.211,-7.494 -4.929,-7.494c-2.741,0 -4.951,3.361 -4.951,7.494c0,1.326 0.221,2.586 0.641,3.669c-9.041,0.951 -15.407,4.731 -17.993,6.432c4.355,-6.278 8.909,-13.638 13.262,-22.105c1.083,-2.101 2.101,-4.178 3.05,-6.211c0.375,0.243 0.751,0.509 1.171,0.775c1.945,1.215 3.759,1.879 5.084,2.233c-0.973,-0.73 -2.033,-1.613 -3.116,-2.697c-0.817,-0.817 -1.547,-1.637 -2.167,-2.433c1.835,-4.022 3.427,-7.891 4.819,-11.56c2.32,6.144 5.217,12.842 8.841,19.893c2.343,4.531 4.731,8.754 7.117,12.644c-0.685,-0.375 -1.437,-0.73 -2.233,-1.039c-1.371,-0.53 -2.652,-0.862 -3.759,-1.06c1.503,0.751 3.25,1.747 5.084,3.073c1.194,0.885 2.254,1.769 3.161,2.631c0.021,0.021 0.021,0.021 0.045,0.045c1.26,2.056 2.565,3.957 3.846,5.813c-2.541,-1.681 -8.796,-5.395 -17.637,-6.389z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0,0,256,256"
width="64px"
height="64px"
fill-rule="nonzero"
version="1.1"
id="svg13"
sodipodi:docname="icons8-asus (1).svg"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview13"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="17.1875"
inkscape:cx="31.970909"
inkscape:cy="32"
inkscape:window-width="2560"
inkscape:window-height="1360"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g13" />
<defs
id="defs10">
<radialGradient
cx="34.625"
cy="31.875"
r="23.206"
gradientUnits="userSpaceOnUse"
id="color-1">
<stop
offset="0"
stop-color="#f4e9c3"
id="stop1" />
<stop
offset="0.219"
stop-color="#f8eecd"
id="stop2" />
<stop
offset="0.644"
stop-color="#fdf4dc"
id="stop3" />
<stop
offset="1"
stop-color="#fff6e1"
id="stop4" />
</radialGradient>
<linearGradient
x1="0.365"
y1="32.5"
x2="64"
y2="32.5"
gradientUnits="userSpaceOnUse"
id="color-2">
<stop
offset="0.053"
stop-color="#000000"
id="stop5" />
<stop
offset="1"
stop-color="#000000"
id="stop6" />
</linearGradient>
<radialGradient
cx="34.625"
cy="31.875"
r="23.206"
gradientUnits="userSpaceOnUse"
id="color-3">
<stop
offset="0"
stop-color="#f4e9c3"
id="stop7" />
<stop
offset="0.219"
stop-color="#f8eecd"
id="stop8" />
<stop
offset="0.644"
stop-color="#fdf4dc"
id="stop9" />
<stop
offset="1"
stop-color="#fff6e1"
id="stop10" />
</radialGradient>
</defs>
<g
fill="none"
fill-rule="nonzero"
stroke="none"
stroke-width="1"
stroke-linecap="butt"
stroke-linejoin="miter"
stroke-miterlimit="10"
stroke-dasharray=""
stroke-dashoffset="0"
font-family="none"
font-weight="none"
font-size="none"
text-anchor="none"
style="mix-blend-mode: normal"
id="g13">
<g
transform="scale(4,4)"
id="g12">
<path
d="M6.156,29.243l-5.723,9.919c-0.192,0.333 0.048,0.75 0.433,0.75h2.764c0.356,0 0.686,-0.19 0.865,-0.498l5.629,-9.701zM6.299,29.005c0,0 0.815,-1.486 1.625,-2.92c0.354,-0.628 1.019,-1.014 1.74,-1.014c1.408,0.001 3.757,0.003 5.086,0.004c0.552,0 0.995,0.448 0.995,1.001v2.61c0,0 0.323,-1.386 0.891,-2.043c0.534,-0.619 1.246,-1.478 2.872,-1.592h10.963c0.552,0 1,0.448 1,1v1.955c0,0.552 -0.448,1 -1,1zM64,28.008v-1.958c0,-0.552 -0.448,-1 -1,-1h-11.8c-1.622,0.114 -2.337,0.972 -2.872,1.592c-0.569,0.657 -0.89,2.043 -0.89,2.043v0.318l15.562,0.005c0.552,0 1,-0.448 1,-1zM33.095,25.07h1.578c0.552,0 1,0.448 1,1v2.935h-3.578v-2.935c0,-0.552 0.448,-1 1,-1zM44.839,25.07h1.574c0.552,0 1,0.448 1,1v2.935h-3.574v-2.935c0,-0.552 0.447,-1 1,-1zM47.413,30.425l-3.514,-0.233v4.566c0,0 -0.01,1.314 -1.158,1.314c-1.138,0 -6.039,0 -6.039,0c0,0 -1.023,-0.093 -1.023,-1.303c0,-1.207 0,-5.196 0,-5.196l-3.549,-0.285v7.001c0.574,3.359 3.311,3.617 3.311,3.617c0,0 0.278,0.022 0.324,0.026h8.156c0,0 3.491,-0.311 3.491,-4.023c0.001,-3.713 0.001,-5.484 0.001,-5.484zM13.111,39.914h15.73c2.914,-0.647 3.218,-3.577 3.218,-3.577c0.136,-0.871 0.057,-1.574 0.057,-1.574c-0.088,-0.588 -1.094,-3.178 -3.281,-3.405c-1.304,-0.134 -12.91,-1.155 -12.91,-1.155c0.225,1.288 0.748,1.938 1.094,2.311c0.805,0.857 2.087,1.099 2.087,1.099c0.309,0.033 8.945,0.824 8.945,0.824c0.274,0.017 0.797,0.093 0.79,0.849c0,0.091 -0.075,0.757 -0.738,0.757h-12.014c-0.276,0 -0.5,-0.224 -0.5,-0.5v-5.373l-3.478,-0.281v9.027c0,0.55 0.448,0.998 1,0.998zM47.444,37.017c0.001,-0.552 0.448,-0.998 1,-0.998h11.429c0.286,0 0.595,-0.187 0.595,-0.187c0.13,-0.129 0.235,-0.364 0.235,-0.591c0,-0.753 -0.561,-0.786 -0.843,-0.803c0,0 -8.732,-0.808 -9.036,-0.834c0,0 -1.211,-0.207 -2.017,-1.068c-0.351,-0.369 -0.815,-0.771 -1.161,-2.099c0,0 11.671,0.763 12.968,0.897c2.189,0.232 3.215,2.632 3.308,3.43c0,0 0.093,0.722 -0.02,1.607c0,0 -0.454,3.374 -3.664,3.579h-11.797c-0.553,0 -1.001,-0.449 -1,-1.002z"
fill="url(#color-2)"
id="path11" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><path fill="#E91E63" d="M26.763,24.548c-0.614,0.01,0.117,0.317,0.918,0.44c0.22-0.172,0.419-0.348,0.6-0.515C27.781,24.592,27.274,24.594,26.763,24.548 M30.054,23.727c0.364-0.5,0.631-1.055,0.723-1.624c-0.082,0.405-0.303,0.755-0.51,1.128c-1.146,0.721-0.108-0.43,0-0.865C29.035,23.913,30.098,23.293,30.054,23.727 M31.269,20.568c0.073-1.105-0.219-0.756-0.317-0.336C31.068,20.294,31.156,21.013,31.269,20.568 M24.439,5.478c0.327,0.058,0.706,0.104,0.653,0.183C25.449,5.582,25.531,5.51,24.439,5.478 M25.093,5.66l-0.232,0.047l0.215-0.017L25.093,5.66 M35.294,20.986c0.038,0.991-0.29,1.472-0.585,2.322l-0.529,0.266c-0.435,0.841,0.041,0.535-0.268,1.202c-0.679,0.603-2.055,1.883-2.496,2.004c-0.321-0.009,0.218-0.382,0.289-0.526c-0.906,0.62-0.728,0.934-2.113,1.313l-0.041-0.09c-3.419,1.607-8.166-1.576-8.103-5.928c-0.037,0.275-0.104,0.209-0.18,0.32c-0.175-2.237,1.033-4.486,3.073-5.403c1.995-0.987,4.335-0.58,5.763,0.75c-0.785-1.028-2.348-2.119-4.199-2.017c-1.814,0.029-3.51,1.182-4.077,2.434c-0.929,0.585-1.038,2.256-1.441,2.563c-0.545,4.003,1.024,5.733,3.68,7.768c0.417,0.282,0.118,0.326,0.175,0.541c-0.883-0.412-1.69-1.037-2.354-1.801c0.353,0.517,0.733,1.017,1.223,1.41c-0.831-0.279-1.942-2.013-2.267-2.084c1.435,2.567,5.818,4.502,8.113,3.541c-1.062,0.04-2.412,0.021-3.604-0.42c-0.501-0.257-1.183-0.791-1.062-0.893c3.133,1.171,6.369,0.887,9.078-1.286c0.689-0.537,1.443-1.449,1.662-1.464c-0.327,0.493,0.057,0.239-0.197,0.674c0.688-1.109-0.299-0.449,0.711-1.913l0.373,0.512c-0.139-0.917,1.143-2.033,1.012-3.489c0.291-0.445,0.326,0.478,0.015,1.502c0.434-1.136,0.113-1.317,0.224-2.254c0.121,0.315,0.279,0.648,0.359,0.981c-0.281-1.097,0.289-1.848,0.433-2.485c-0.142-0.063-0.435,0.485-0.503-0.812c0.01-0.562,0.156-0.295,0.214-0.435c-0.111-0.064-0.4-0.496-0.577-1.323c0.127-0.193,0.342,0.506,0.516,0.533c-0.112-0.655-0.304-1.159-0.313-1.665c-0.51-1.061-0.181,0.143-0.592-0.458c-0.543-1.687,0.449-0.39,0.514-1.156c0.82,1.188,1.289,3.029,1.504,3.792c-0.164-0.93-0.428-1.832-0.752-2.704c0.249,0.108-0.401-1.911,0.324-0.575c-0.772-2.848-3.314-5.511-5.65-6.76c0.286,0.262,0.646,0.591,0.517,0.642c-1.163-0.69-0.959-0.745-1.124-1.041c-0.946-0.383-1.01,0.034-1.636,0c-1.786-0.943-2.129-0.845-3.772-1.437l0.078,0.349c-1.184-0.394-1.379,0.146-2.657,0.002c-0.078-0.062,0.41-0.219,0.811-0.278c-1.143,0.15-1.09-0.228-2.208,0.042c0.277-0.197,0.566-0.322,0.861-0.486c-0.932,0.059-2.226,0.542-1.825,0.103c-1.521,0.676-4.22,1.63-5.735,3.051l-0.047-0.322c-0.694,0.835-3.028,2.492-3.215,3.57l-0.185,0.043c-0.361,0.613-0.595,1.305-0.881,1.935c-0.474,0.806-0.692,0.311-0.626,0.436c-0.929,1.883-1.39,3.467-1.79,4.768c0.284,0.424,0.007,2.558,0.113,4.264c-0.467,8.429,5.916,16.609,12.891,18.5c1.023,0.365,2.542,0.354,3.836,0.39c-1.525-0.438-1.722-0.232-3.209-0.749c-1.074-0.506-1.308-1.082-2.066-1.74l0.3,0.53c-1.49-0.526-0.867-0.652-2.078-1.034l0.321-0.424c-0.482-0.032-1.279-0.811-1.497-1.241l-0.528,0.021c-0.634-0.783-0.972-1.348-0.948-1.785l-0.17,0.305c-0.194-0.332-2.335-2.937-1.224-2.33c-0.207-0.188-0.481-0.307-0.779-0.85l0.227-0.258c-0.535-0.686-0.983-1.568-0.949-1.86c0.284,0.384,0.482,0.454,0.679,0.522c-1.351-3.349-1.426-0.187-2.448-3.409l0.216-0.019c-0.166-0.246-0.265-0.521-0.399-0.785l0.094-0.938c-0.972-1.125-0.272-4.781-0.132-6.783c0.097-0.816,0.811-1.684,1.354-3.045l-0.332-0.055c0.632-1.104,3.612-4.433,4.99-4.26c0.669-0.841-0.132-0.002-0.263-0.215c1.469-1.52,1.93-1.073,2.92-1.349c1.068-0.633-0.917,0.251-0.41-0.239c1.848-0.473,1.31-1.073,3.718-1.311c0.254,0.145-0.59,0.223-0.8,0.41c1.538-0.753,4.87-0.584,7.034,0.417c2.511,1.173,5.33,4.642,5.443,7.904l0.126,0.035c-0.063,1.298,0.198,2.798-0.257,4.175L35.294,20.986 M20.072,25.389l-0.086,0.431c0.403,0.547,0.724,1.142,1.237,1.567C20.853,26.664,20.577,26.364,20.072,25.389 M21.023,25.353c-0.213-0.237-0.34-0.518-0.48-0.802c0.135,0.495,0.411,0.922,0.669,1.357L21.023,25.353 M37.877,21.688l-0.088,0.226c-0.166,1.174-0.523,2.332-1.068,3.412C37.324,24.189,37.714,22.947,37.877,21.688 M24.56,5.185C24.974,5.031,25.579,5.101,26.019,5c-0.573,0.048-1.144,0.079-1.706,0.151L24.56,5.185 M10.007,12.923c0.095,0.882-0.667,1.229,0.167,0.644C10.623,12.562,10,13.286,10.007,12.923 M9.028,17.016c0.191-0.592,0.226-0.943,0.3-1.285C8.797,16.41,9.084,16.553,9.028,17.016"/></svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><path fill="#0288d1" d="M24,4C12.956,4,4,12.956,4,24s8.956,20,20,20s20-8.956,20-20S35.044,4,24,4z M24,41c-9.391,0-17-7.609-17-17S14.609,7,24,7s17,7.609,17,17S33.391,41,24,41z"/><path fill="#0288d1" d="M35.641,25.563l2.84,0.004l-0.004,2.395l-5.691-0.012l0.012-8.172l2.855,0.004L35.641,25.563z M26.34,25.102l-4.699,3.684l-4.285-3.379c-0.621,1.484-2.109,2.52-3.836,2.516l-3.664-0.004l0.008-8.172l3.668,0.004c1.926,0.004,3.309,1.223,3.828,2.531l4.297-3.367l1.586,1.25l-3.934,3.086l0.754,0.594l3.934-3.086l1.59,1.254l-3.934,3.082l0.75,0.594l3.941-3.082l0.004-2.836l2.852,0.004l-0.008,5.781l2.84,0.004l-0.004,2.391l-5.691-0.008L26.34,25.102z M15.012,23.84c0-1.113-0.73-1.742-1.77-1.742h-0.637l-0.004,3.477h0.621C14.184,25.574,15.012,25.051,15.012,23.84"/></svg>

After

Width:  |  Height:  |  Size: 843 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><linearGradient id="TGbgz7YIIasADw2jo2LPPa" x1="24" x2="24" y1="44.346" y2="13.335" gradientTransform="matrix(1 0 0 -1 0 48)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#f44f5a"/><stop offset=".443" stop-color="#ee3d4a"/><stop offset=".651" stop-color="#ed3b48"/><stop offset=".726" stop-color="#eb3442"/><stop offset=".779" stop-color="#e82938"/><stop offset=".804" stop-color="#e52030"/></linearGradient><path fill="url(#TGbgz7YIIasADw2jo2LPPa)" d="M21.62,6.991c-0.013-0.046-0.02-0.126-0.02-0.186C21.6,6.36,21.958,6,22.4,6 c0.188,0,0.319,0.071,0.371,0.091c0.978,0.384,7.697,3.572,6.143,12.787C31.17,17.51,30.211,15,31.116,15 c0.277,0,0.39,0.104,0.56,0.348C34.144,18.892,36,22.973,36,26.927C36,33.595,30.628,39,24,39c-7.288,0-12-6.176-12-12.073 C12,17.118,23.49,15.307,21.62,6.991z"/><linearGradient id="TGbgz7YIIasADw2jo2LPPb" x1="23.5" x2="23.5" y1="30.346" y2="17.849" gradientTransform="matrix(1 0 0 -1 0 48)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fed100"/><stop offset=".353" stop-color="#fdcf00"/><stop offset=".523" stop-color="#fcc700"/><stop offset=".655" stop-color="#f9ba00"/><stop offset=".766" stop-color="#f4a800"/><stop offset=".865" stop-color="#ee9001"/><stop offset=".954" stop-color="#e77201"/><stop offset="1" stop-color="#e36001"/></linearGradient><path fill="url(#TGbgz7YIIasADw2jo2LPPb)" d="M23.225,18.152c0,0-0.182-0.152-0.446-0.152c-0.398,0-0.722,0.317-0.722,0.708 c0.722,4.25-4.329,5.667-4.329,10.625c0,3.13,2.584,5.667,5.772,5.667s5.772-2.537,5.772-5.667 C29.272,25.295,25.65,19.906,23.225,18.152z"/><path fill="#64717c" d="M30,42h-4l-5.5-1L15,42h-4l-5-5v-4l11.667-5H22l5,1l6-1h4l5,5v4L30,42z"/><linearGradient id="TGbgz7YIIasADw2jo2LPPc" x1="19.087" x2="29.046" y1="22.239" y2="3.511" gradientTransform="matrix(1 0 0 -1 0 48)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#bec5c8"/><stop offset=".968" stop-color="#b9c1c4"/></linearGradient><path fill="url(#TGbgz7YIIasADw2jo2LPPc)" d="M27,41c0,0.552-0.448,1-1,1H15c-0.552,0-1-0.448-1-1v-4c0-0.552,0.448-1,1-1h11 c0.552,0,1,0.448,1,1V41z M42,41c0,0.552-0.448,1-1,1H30c-0.552,0-1-0.448-1-1v-4c0-0.552,0.448-1,1-1h11c0.552,0,1,0.448,1,1V41z M33,33c0,0.552-0.448,1-1,1H21c-0.552,0-1-0.448-1-1v-4c0-0.552,0.448-1,1-1h11c0.552,0,1,0.448,1,1V33z M6,33c0,0.552,0.448,1,1,1 h10c0.552,0,1-0.448,1-1v-4c0-0.552-0.448-1-1-1H7c-0.552,0-1,0.448-1,1V33z M41,28h-5c-0.552,0-1,0.448-1,1v4c0,0.552,0.448,1,1,1 h6v-5C42,28.448,41.552,28,41,28z M11,36H6v5c0,0.552,0.448,1,1,1h4c0.552,0,1-0.448,1-1v-4C12,36.448,11.552,36,11,36z"/></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><path fill="#fff" d="M24 4A20 20 0 1 0 24 44A20 20 0 1 0 24 4Z"/><path fill="#1976d2" d="M24,43.997c-0.199,0-0.652,0.006-0.85,0l4-10.999h5.625c0.987,0,2.071-0.759,2.409-1.686l4.748-12.687c0.725-1.995-0.417-3.626-2.539-3.626h-7.804l-6.518,18.257h-0.002l-3.712,10.198C10.55,41.361,4,33.445,4,23.999c0-9.174,6.178-16.905,14.6-19.261l-3.83,10.526h-0.001L8.15,32.998h4.239l5.576-14.999h3.185l-5.576,14.999l3.919,0.001l5.438-14.374c0.726-1.995-0.416-3.626-2.536-3.626H19.15l3.951-10.978C23.399,4.008,23.699,4,24,4c11.046,0,20,8.953,20,19.999S35.046,43.997,24,43.997z M36.15,17.999h-3.185l-4.509,11.999h3.185L36.15,17.999z"/></svg>

After

Width:  |  Height:  |  Size: 712 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><path fill="#3f51b5" d="M48 16L48 14 40.469 14 39.809 16zM33 31L33 29 29 29 27 29 27 31zM39.766 28L40.51 26 34.51 26 35.266 28zM29 26H33V28H29zM29 23H33V25H29zM42 29L42 31 48 31 48 29 46 29zM36.181 19L35.521 17 27 17 27 19 29 19zM37.17 22L36.51 20 29 20 29 22zM33.378 23L34.133 25 40.883 25 41.628 23zM42 23H46V25H42zM27 32H33V34H27zM35.191 16L34.531 14 27 14 27 16zM36.776 32L37.531 34 38.276 32zM42 32H48V34H42zM39.479 17L38.819 19 46 19 48 19 48 17zM39.393 29L35.643 29 36.398 31 38.648 31zM42 26H46V28H42zM38.49 20L37.83 22 46 22 46 20zM0 14H8V16H0zM0 17H8V19H0zM2 20H6V22H2zM2 23H6V25H2zM2 26H6V28H2zM0 29H8V31H0zM0 32H8V34H0zM10 17H18V19H10zM24.977 16c-.913-1.208-2.347-2-3.977-2H10v2h7.023H24.977z"/><path fill="#3f51b5" d="M25.578 17h-9.131C16.171 17.613 16 18.283 16 19h10C26 18.288 25.846 17.613 25.578 17zM23.975 23H12v2h11.973c-.833-.62-1.854-1-2.973-1C22.119 24 23.142 23.621 23.975 23zM17.023 32H10v2h11c1.63 0 3.065-.792 3.977-2H17.023zM18 29h-2-6v2h6.447H18h7.578C25.846 30.387 26 29.712 26 29H18zM21 20c0 0 0 .083 0 1s-1 1-1 1h4.979c.441-.584.77-1.257.921-2H21zM12 20H17V22H12z"/><g><path fill="#3f51b5" d="M21 28h4.885c-.156-.738-.467-1.418-.907-2H20c0 0 1 .167 1 1S21 28 21 28zM12 26H17V28H12z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><rect width="48" height="16" y="16" fill="#ff1744"/><path fill="#fff" d="M11.935,26.062c0.37,0.341,0.782,0.45,1.227,0.478c0.645,0.039,1.217-0.156,1.724-0.546 c0.124-0.096,0.163-0.126,0.163-0.126s0.777,0.609,1.097,0.855c-0.261,0.309-0.567,0.521-0.901,0.692 c-1.103,0.565-2.249,0.687-3.424,0.264c-1.346-0.485-2.131-1.693-2.059-3.117c0.073-1.441,1.005-2.608,2.392-2.944 c1.064-0.257,2.084-0.143,2.98,0.539c0.651,0.496,1.001,1.28,1.147,2.068c0,0-2.595,1.11-3.795,1.606 C12.313,25.903,12.141,25.975,11.935,26.062z M11.472,24.928c0.969-0.401,1.935-0.801,2.901-1.201 c-0.334-0.722-1.096-1.017-1.866-0.748C11.758,23.24,11.28,24.124,11.472,24.928z"/><path fill="#fff" d="M27.076,27.934c-1.632-0.017-2.956-1.068-3.261-2.6c-0.37-1.852,0.969-3.633,2.86-3.808 c1.281-0.118,2.373,0.254,3.155,1.3c1.451,1.941,0.22,4.757-2.193,5.055C27.45,27.905,27.263,27.917,27.076,27.934z M27.11,26.434 c0.929,0.002,1.622-0.723,1.628-1.704c0.006-0.97-0.724-1.742-1.649-1.745c-0.936-0.003-1.631,0.734-1.628,1.726 C25.465,25.675,26.189,26.432,27.11,26.434z"/><path fill="#fff" d="M40.624,27.934c-1.632-0.017-2.956-1.068-3.261-2.6c-0.37-1.852,0.969-3.633,2.86-3.808 c1.281-0.118,2.373,0.254,3.155,1.3c1.451,1.941,0.22,4.757-2.193,5.055C40.998,27.905,40.811,27.917,40.624,27.934z M40.658,26.434c0.929,0.002,1.623-0.723,1.628-1.704c0.006-0.97-0.724-1.742-1.649-1.745c-0.936-0.003-1.631,0.734-1.628,1.726 C39.013,25.675,39.737,26.432,40.658,26.434z"/><path fill="#fff" d="M21.377,27.987c0-0.095,0.001-2.587,0-3.663c-0.001-0.759-0.605-1.327-1.414-1.331 c-0.794-0.005-1.383,0.56-1.384,1.332c-0.001,1.076,0,3.679,0,3.679l-1.741,0.002l0.007-6.378c0,0,1.168-0.018,1.722-0.018 c0,0.264-0.006,0.832-0.006,0.832s0.138-0.128,0.181-0.171c1.157-1.174,3.226-0.973,4.031,0.391 c0.223,0.378,0.338,0.789,0.34,1.223c0.008,1.264,0.003,4.104,0.003,4.104S21.964,27.987,21.377,27.987z"/><path fill="#fff" d="M30.164,21.608c0.642,0,1.964,0.015,1.964,0.015s1.478,4.024,1.526,4.149 c0.115-0.311,1.208-3.29,1.521-4.174c0.646,0.018,1.288,0.01,1.97,0.01c-0.029,0.084-2.562,6.398-2.562,6.398l-1.876-0.003 C31.905,26.042,30.191,21.692,30.164,21.608z"/><path fill="#fff" d="M5.767,26.393c0.104,0,3.868,0.011,3.868,0.011l-0.002,1.581L4,27.989v-8.073h1.77 C5.77,19.916,5.767,26.284,5.767,26.393z"/></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,395 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 96 96"
width="96"
height="96"
version="1.1"
id="svg16"
sodipodi:docname="icons8-loadbalancer-6.svg"
xml:space="preserve"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs16"><linearGradient
id="rgtybR5fDU8R4IgIFkOP5b"
x1="19.388"
x2="28.413"
y1="-9.9449997"
y2="52.098999"
gradientTransform="matrix(0,-0.49311513,-0.49311513,0,46.019494,43.995025)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#1ea2e4"
id="stop7-6" /><stop
offset="1"
stop-color="#32bdef"
id="stop8-2" /></linearGradient><linearGradient
id="rgtybR5fDU8R4IgIFkOP5a"
x1="477.17899"
x2="472.772"
y1="522.18701"
y2="522.18701"
gradientTransform="matrix(-0.34868505,0.34868505,0.34868505,0.34868505,23.783091,-306.66044)"
gradientUnits="userSpaceOnUse"><stop
offset=".365"
stop-color="#199ae0"
id="stop1" /><stop
offset=".699"
stop-color="#1898de"
id="stop2" /><stop
offset=".819"
stop-color="#1691d8"
id="stop3-9" /><stop
offset=".905"
stop-color="#1186cc"
id="stop4-1" /><stop
offset=".974"
stop-color="#0a75bc"
id="stop5-2" /><stop
offset="1"
stop-color="#076cb3"
id="stop6-7" /></linearGradient><linearGradient
id="ArtDYZ2lT75vkabREsTDEb"
x1="10.443"
x2="34.894001"
y1="35.985001"
y2="11.533"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.73295303,0,0,0.73295303,60.409094,29.991812)"><stop
offset="0"
stop-color="#32bdef"
id="stop7-3" /><stop
offset="1"
stop-color="#1ea2e4"
id="stop8-7" /></linearGradient><linearGradient
id="ArtDYZ2lT75vkabREsTDEa"
x1="37"
x2="37"
y1="41.555"
y2="28.030001"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.73295303,0,0,0.73295303,60.409094,29.991812)"><stop
offset=".365"
stop-color="#199ae0"
id="stop1-5" /><stop
offset=".699"
stop-color="#1898de"
id="stop2-9" /><stop
offset=".819"
stop-color="#1691d8"
id="stop3-2" /><stop
offset=".905"
stop-color="#1186cc"
id="stop4-2" /><stop
offset=".974"
stop-color="#0a75bc"
id="stop5-8" /><stop
offset="1"
stop-color="#076cb3"
id="stop6-9" /></linearGradient><linearGradient
id="901RIHcLyz6dZPGSvSf1Xc"
x1="33.436001"
x2="38.157001"
y1="21.563999"
y2="16.843"
gradientTransform="matrix(-1,0,0,1,121.71219,17.368129)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#ae4cd5"
id="stop5-6" /><stop
offset="1"
stop-color="#ac4ad5"
id="stop6-1" /></linearGradient><linearGradient
id="901RIHcLyz6dZPGSvSf1Xb"
x1="694.97601"
x2="717.71802"
y1="35.709"
y2="12.967"
gradientTransform="translate(-606.28782,17.368129)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#ae4cd5"
id="stop3-29" /><stop
offset="1"
stop-color="#ac4ad5"
id="stop4-3" /></linearGradient><linearGradient
id="901RIHcLyz6dZPGSvSf1Xa"
x1="36.25"
x2="36.25"
y1="38.042999"
y2="23.006001"
gradientTransform="matrix(-1,0,0,1,121.71219,17.368129)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#912fbd"
id="stop1-1" /><stop
offset="1"
stop-color="#9332bf"
id="stop2-94" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#ArtDYZ2lT75vkabREsTDEa"
id="linearGradient24"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,0.73295303,-0.73295303,0,65.635592,60.153515)"
x1="37"
y1="41.555"
x2="37"
y2="28.030001" /><linearGradient
inkscape:collect="always"
xlink:href="#ArtDYZ2lT75vkabREsTDEb"
id="linearGradient25"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,0.73295303,-0.73295303,0,65.635592,60.153515)"
x1="10.443"
y1="35.985001"
x2="34.894001"
y2="11.533" /><linearGradient
inkscape:collect="always"
xlink:href="#ArtDYZ2lT75vkabREsTDEb"
id="linearGradient26"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.51827606,0.51827606,-0.51827606,0.51827606,65.099589,38.283295)"
x1="10.443"
y1="35.985001"
x2="34.894001"
y2="11.533" /><linearGradient
inkscape:collect="always"
xlink:href="#ArtDYZ2lT75vkabREsTDEa"
id="linearGradient27"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.51827606,0.51827606,-0.51827606,0.51827606,65.099589,38.283295)"
x1="37"
y1="41.555"
x2="37"
y2="28.030001" /><linearGradient
inkscape:collect="always"
xlink:href="#ArtDYZ2lT75vkabREsTDEa"
id="linearGradient28"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.51827606,0.51827606,0.51827606,0.51827606,31.063993,38.239101)"
x1="37"
y1="41.555"
x2="37"
y2="28.030001" /><linearGradient
inkscape:collect="always"
xlink:href="#ArtDYZ2lT75vkabREsTDEb"
id="linearGradient29"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.51827606,0.51827606,0.51827606,0.51827606,31.063993,38.239101)"
x1="10.443"
y1="35.985001"
x2="34.894001"
y2="11.533" /><linearGradient
id="901RIHcLyz6dZPGSvSf1Xc-8"
x1="33.436001"
x2="38.157001"
y1="21.563999"
y2="16.843"
gradientTransform="matrix(0,0.78639422,0.78639422,0,28.708615,-1.1133533)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#ae4cd5"
id="stop5-84" /><stop
offset="1"
stop-color="#ac4ad5"
id="stop6-3" /></linearGradient><linearGradient
id="901RIHcLyz6dZPGSvSf1Xb-1"
x1="694.97601"
x2="717.71802"
y1="35.709"
y2="12.967"
gradientTransform="matrix(0,-0.78639422,0.78639422,0,28.708615,571.38165)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#ae4cd5"
id="stop3-4" /><stop
offset="1"
stop-color="#ac4ad5"
id="stop4-9" /></linearGradient><linearGradient
id="901RIHcLyz6dZPGSvSf1Xa-2"
x1="36.25"
x2="36.25"
y1="38.042999"
y2="23.006001"
gradientTransform="matrix(0,0.78639422,0.78639422,0,28.708615,-1.1133533)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#912fbd"
id="stop1-0" /><stop
offset="1"
stop-color="#9332bf"
id="stop2-6" /></linearGradient></defs><sodipodi:namedview
id="namedview16"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showguides="true"
inkscape:zoom="5.6568543"
inkscape:cx="45.343222"
inkscape:cy="30.405592"
inkscape:window-width="2560"
inkscape:window-height="1360"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg16"><sodipodi:guide
position="19.559789,143.73834"
orientation="1,0"
id="guide17"
inkscape:locked="false" /><sodipodi:guide
position="24.084469,98.224212"
orientation="0,-1"
id="guide18"
inkscape:locked="false" /><sodipodi:guide
position="19.845169,116.43962"
orientation="0,-1"
id="guide19"
inkscape:locked="false" /><sodipodi:guide
position="48.041504,83.46582"
orientation="1,0"
id="guide20"
inkscape:locked="false" /><sodipodi:guide
position="78.25,47.75"
orientation="0,-1"
id="guide21"
inkscape:locked="false" /><sodipodi:guide
position="50.394457,65.316468"
orientation="0,-1"
id="guide29"
inkscape:locked="false" /><sodipodi:guide
position="67.605347,21.060837"
orientation="0,-1"
id="guide30"
inkscape:locked="false" /></sodipodi:namedview><linearGradient
id="6fSOUPa~CP8tcsIx_Wvufa"
x1="22.011"
x2="26.212"
y1="785.79102"
y2="789.99298"
gradientTransform="translate(0,-781.78)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#33bef0"
id="stop3" /><stop
offset="1"
stop-color="#0a85d9"
id="stop4" /></linearGradient><linearGradient
id="6fSOUPa~CP8tcsIx_Wvufb"
x1="6.0110002"
x2="10.213"
y1="794.79102"
y2="798.992"
gradientTransform="translate(0,-781.78)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#33bef0"
id="stop5" /><stop
offset="1"
stop-color="#0a85d9"
id="stop6" /></linearGradient><linearGradient
id="6fSOUPa~CP8tcsIx_Wvufc"
x1="6.0110002"
x2="10.213"
y1="812.79102"
y2="816.992"
gradientTransform="translate(0,-781.78)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#33bef0"
id="stop7" /><stop
offset="1"
stop-color="#0a85d9"
id="stop8" /></linearGradient><linearGradient
id="6fSOUPa~CP8tcsIx_Wvufd"
x1="38.011002"
x2="42.212002"
y1="794.79102"
y2="798.992"
gradientTransform="translate(0,-781.78)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#33bef0"
id="stop9" /><stop
offset="1"
stop-color="#0a85d9"
id="stop10" /></linearGradient><linearGradient
id="6fSOUPa~CP8tcsIx_Wvufe"
x1="38.011002"
x2="42.212002"
y1="812.79102"
y2="816.992"
gradientTransform="translate(0,-781.78)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#33bef0"
id="stop11" /><stop
offset="1"
stop-color="#0a85d9"
id="stop12" /></linearGradient><linearGradient
id="6fSOUPa~CP8tcsIx_Wvuff"
x1="22.011"
x2="26.212"
y1="821.79102"
y2="825.992"
gradientTransform="translate(0,-781.78)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#33bef0"
id="stop13" /><stop
offset="1"
stop-color="#0a85d9"
id="stop14" /></linearGradient><linearGradient
id="6fSOUPa~CP8tcsIx_Wvufg"
x1="22.389999"
x2="25.51"
y1="27.841"
y2="20.184"
gradientTransform="matrix(2.2750649,0,0,-2.2750649,-6.4704976,71.078659)"
gradientUnits="userSpaceOnUse"><stop
offset="0"
stop-color="#2aa4f4"
id="stop15" /><stop
offset="1"
stop-color="#007ad9"
id="stop16" /></linearGradient><circle
cx="48.13105"
cy="16.727356"
fill="url(#6fSOUPa~CP8tcsIx_Wvufg)"
id="circle16"
style="fill:url(#6fSOUPa~CP8tcsIx_Wvufg);stroke-width:2.27506"
r="11.375324" /><path
fill="url(#ArtDYZ2lT75vkabREsTDEa)"
d="m 76.856164,73.706426 v -3.471413 c 10e-7,-0.668576 -0.541598,-1.210175 -1.210175,-1.210175 l -10.028123,-2.236361 -6.633415,6.633416 c -0.551964,0.551964 -0.161185,1.495226 0.61934,1.495226 h 16.04168 c 0.668577,0 1.210694,-0.542117 1.210693,-1.210693 z"
id="path6-7"
style="fill:url(#linearGradient27);stroke-width:0.732953" /><path
fill="url(#ArtDYZ2lT75vkabREsTDEb)"
d="m 76.856164,73.706426 v -16.04168 c 0,-0.780525 -0.943262,-1.171304 -1.495226,-0.61934 L 69.764074,62.642269 51.794199,45.172393 c -0.580717,-0.564559 -1.893097,0.66519 -1.791854,1.46875 l 0.702843,5.578407 c 0.101243,0.80356 -0.159842,1.087631 0.40625,1.666854 l 20.207465,20.676214 c 0.216702,0.221729 0.521385,0.354501 0.855673,0.353982 h 3.471413 c 0.668059,5.19e-4 1.210176,-0.541598 1.210175,-1.210174 z"
id="path8-3"
style="fill:url(#linearGradient26);stroke-width:0.732953"
sodipodi:nodetypes="csscsssssccc" /><path
fill="url(#ArtDYZ2lT75vkabREsTDEa)"
d="m 19.307418,73.662232 v -3.471413 c -10e-7,-0.668576 0.541598,-1.210175 1.210175,-1.210175 l 10.028123,-2.236361 6.633415,6.633416 c 0.551964,0.551964 0.161185,1.495226 -0.61934,1.495226 h -16.04168 c -0.668577,0 -1.210694,-0.542117 -1.210693,-1.210693 z"
id="path6-7-8"
style="fill:url(#linearGradient28);stroke-width:0.732953"
sodipodi:nodetypes="ssccssss" /><path
fill="url(#ArtDYZ2lT75vkabREsTDEb)"
d="m 19.307418,73.662232 v -16.04168 c 0,-0.780525 0.943262,-1.171304 1.495226,-0.61934 l 5.596864,5.596863 19.219875,-19.032376 c 0.575495,-0.569881 0.534597,1.292441 0.416854,2.09375 l -0.952843,6.484657 c -0.117743,0.801309 0.507099,1.40358 -0.0625,1.979354 L 24.844679,74.518424 c -0.218045,0.220409 -0.521385,0.354501 -0.855673,0.353982 h -3.471413 c -0.668059,5.19e-4 -1.210176,-0.541598 -1.210175,-1.210174 z"
id="path8-3-6"
style="fill:url(#linearGradient29);stroke-width:0.732953"
sodipodi:nodetypes="csscsssssccc" /><path
fill="url(#ArtDYZ2lT75vkabREsTDEa)"
d="m 48.900809,93.514605 2.45466,-2.45466 c 0.472755,-0.472754 0.472755,-1.23869 0,-1.711445 l -5.509608,-8.6723 h -9.381066 c -0.780595,0 -1.171259,0.94331 -0.619345,1.495224 l 11.343181,11.343181 c 0.472755,0.472755 1.239424,0.472755 1.712178,0 z"
id="path6-7-4"
style="fill:url(#linearGradient24);stroke-width:0.732953" /><path
fill="url(#ArtDYZ2lT75vkabREsTDEb)"
d="M 48.900809,93.514605 60.24399,82.171424 C 60.795904,81.61951 60.40524,80.6762 59.624645,80.6762 h -7.91516 l 0.02115,-50.103052 C 51.730977,29.763235 51.240112,29.301365 50.4302,29.30223 l -4.396838,0.0047 c -0.809912,8.64e-4 -1.649447,0.452869 -1.6495,1.262781 l -0.0039,59.634887 c -2e-5,0.310039 0.118005,0.619345 0.354749,0.855356 l 2.45466,2.45466 c 0.472022,0.472755 1.238691,0.472755 1.711445,0 z"
id="path8-3-5"
style="fill:url(#linearGradient25);stroke-width:0.732953"
sodipodi:nodetypes="ssscsssssccs" /></svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><path fill="#0883d9" d="M36.232,23.985c0-5.865,4.766-8.51,4.966-8.636c-2.596-3.993-6.79-4.467-8.362-4.468 c-3.643,0-6.863,2.022-8.585,2.022c-1.797,0-4.418-2.121-7.363-2.022c-3.843,0.075-7.363,2.346-9.334,5.691 c-1.397,2.396-1.947,5.217-1.896,8.087c0.002,0.113,0.017,0.228,0.02,0.341H36.32C36.279,24.671,36.243,24.337,36.232,23.985z"/><path fill="#0883d9" d="M30.565,7.063C32.261,5.191,33.21,2.621,33.06,0c-2.346,0-5.066,1.372-6.788,3.394 c-1.348,1.672-2.795,4.293-2.271,6.913C26.422,10.607,29.043,9.085,30.565,7.063z"/><path fill="#0370c8" d="M17.511,45c2.771,0,3.794-1.848,7.413-1.848c3.37,0,4.418,1.848,7.338,1.848 c3.07,0,5.092-2.795,6.913-5.567c2.295-3.218,3.07-6.288,3.169-6.414c-0.094,0-5.287-2.112-6.026-8.019H5.678 c0.157,5.311,2.228,10.79,4.671,14.309C12.27,42.055,14.441,45,17.511,45z"/></svg>

After

Width:  |  Height:  |  Size: 891 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -0,0 +1,309 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 96 96"
width="96"
height="96"
version="1.1"
id="svg25"
sodipodi:docname="icons8-router-4g.svg"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs25">
<linearGradient
id="eww6fSHXLG3h4YeAqg9u_a"
x1="17.59"
x2="32.07"
y1="25.934999"
y2="48.230999"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1618717,0,0,1.1618717,20.507254,2.1916049)">
<stop
offset="0"
stop-color="#85929e"
id="stop1-3" />
<stop
offset="1"
stop-color="#6d7882"
id="stop2-6" />
</linearGradient>
</defs>
<sodipodi:namedview
id="namedview25"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="8.1022652"
inkscape:cx="21.413765"
inkscape:cy="37.396949"
inkscape:window-width="2560"
inkscape:window-height="1360"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg25"
showguides="true">
<sodipodi:guide
position="9.8178562,30.140718"
orientation="1,0"
id="guide1"
inkscape:locked="false" />
<sodipodi:guide
position="86.470802,38.181968"
orientation="1,0"
id="guide2"
inkscape:locked="false" />
<sodipodi:guide
position="46.258636,9.4810232"
orientation="0,-1"
id="guide3"
inkscape:locked="false" />
<sodipodi:guide
position="53.641442,101.298"
orientation="0,-1"
id="guide4"
inkscape:locked="false" />
</sodipodi:namedview>
<linearGradient
id="sQy7OvPXH0t2mKfqk7XuXa"
x1="34.117001"
x2="33.909"
y1="30.451"
y2="11.826"
gradientTransform="matrix(2.0151121,0,0,-2.0151121,-0.28283295,98.172694)"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#737b80"
id="stop1" />
<stop
offset=".714"
stop-color="#737b80"
id="stop2" />
<stop
offset=".756"
stop-color="#737b80"
id="stop3" />
<stop
offset=".863"
stop-color="#656c71"
id="stop4" />
<stop
offset="1"
stop-color="#575c61"
id="stop5" />
</linearGradient>
<path
fill="url(#sQy7OvPXH0t2mKfqk7XuXa)"
d="m 62.185641,80.258348 c -0.191435,0 -0.386902,-0.02821 -0.580352,-0.08463 -1.065993,-0.3204 -1.672543,-1.44282 -1.35214,-2.508817 L 72.343823,37.362659 c 0.320404,-1.065994 1.444834,-1.672543 2.508815,-1.35214 1.06599,0.320402 1.672539,1.442821 1.352141,2.508814 L 64.114104,78.821578 c -0.25995,0.874555 -1.05995,1.43677 -1.928463,1.43677 z"
id="path5"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXa);stroke-width:2.01511" />
<linearGradient
id="sQy7OvPXH0t2mKfqk7XuXb"
x1="14.121"
x2="13.913"
y1="30.719"
y2="12.094"
gradientTransform="matrix(2.0151121,0,0,-2.0151121,-0.28283295,98.172694)"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#737b80"
id="stop6" />
<stop
offset=".773"
stop-color="#737b80"
id="stop7" />
<stop
offset="1"
stop-color="#575c61"
id="stop8" />
</linearGradient>
<path
fill="url(#sQy7OvPXH0t2mKfqk7XuXb)"
d="m 33.974071,80.258348 c -0.866497,0 -1.666498,-0.564231 -1.930475,-1.43677 L 19.952922,38.519333 c -0.320404,-1.065993 0.286146,-2.188412 1.352141,-2.508814 1.063979,-0.314357 2.188411,0.286146 2.508815,1.35214 l 12.090671,40.302239 c 0.320402,1.065996 -0.286146,2.188417 -1.352139,2.508815 -0.193452,0.05643 -0.386902,0.08463 -0.578339,0.08463 z"
id="path8"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXb);stroke-width:2.01511" />
<linearGradient
id="sQy7OvPXH0t2mKfqk7XuXc"
x1="24"
x2="24"
y1="14.614"
y2="-2.0710001"
gradientTransform="matrix(2.0151121,0,0,-2.0151121,-0.28283295,98.172694)"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#899198"
id="stop9" />
<stop
offset="1"
stop-color="#787e85"
id="stop10" />
</linearGradient>
<path
fill="url(#sQy7OvPXH0t2mKfqk7XuXc)"
d="M 82.336765,86.303689 H 13.822951 c -2.226698,0 -4.0302237,-1.803531 -4.0302237,-4.030227 V 68.167678 c 0,-2.226699 1.8035257,-4.030225 4.0302237,-4.030225 h 68.513814 c 2.226696,0 4.030221,1.803526 4.030221,4.030225 v 14.105784 c 0,2.226696 -1.803525,4.030227 -4.030221,4.030227 z"
id="path10"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXc);stroke-width:2.01511" />
<rect
width="68.513809"
height="14.105785"
x="13.822952"
y="68.167671"
fill="#737b80"
id="rect10"
style="stroke-width:2.01511" />
<radialGradient
id="sQy7OvPXH0t2mKfqk7XuXd"
cx="36.5"
cy="11.39"
r="2.5"
gradientTransform="matrix(2.0151121,0,0,-2.0151121,-0.28283295,98.172694)"
gradientUnits="userSpaceOnUse">
<stop
offset=".582"
stop-opacity=".2"
id="stop11" />
<stop
offset="1"
stop-opacity="0"
id="stop12" />
</radialGradient>
<circle
cx="73.268753"
cy="75.220573"
fill="url(#sQy7OvPXH0t2mKfqk7XuXd)"
id="circle12"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXd);stroke-width:2.01511"
r="5.0377803" />
<radialGradient
id="sQy7OvPXH0t2mKfqk7XuXe"
cx="30.5"
cy="11.39"
r="2.5"
gradientTransform="matrix(2.0151121,0,0,-2.0151121,-0.28283295,98.172694)"
gradientUnits="userSpaceOnUse">
<stop
offset=".582"
stop-opacity=".2"
id="stop13" />
<stop
offset="1"
stop-opacity="0"
id="stop14" />
</radialGradient>
<circle
cx="61.178082"
cy="75.220573"
fill="url(#sQy7OvPXH0t2mKfqk7XuXe)"
id="circle14"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXe);stroke-width:2.01511"
r="5.0377803" />
<radialGradient
id="sQy7OvPXH0t2mKfqk7XuXf"
cx="24.5"
cy="11.39"
r="2.5"
gradientTransform="matrix(2.0151121,0,0,-2.0151121,-0.28283295,98.172694)"
gradientUnits="userSpaceOnUse">
<stop
offset=".582"
stop-opacity=".2"
id="stop15" />
<stop
offset="1"
stop-opacity="0"
id="stop16" />
</radialGradient>
<circle
cx="49.087414"
cy="75.220573"
fill="url(#sQy7OvPXH0t2mKfqk7XuXf)"
id="circle16"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXf);stroke-width:2.01511"
r="5.0377803" />
<radialGradient
id="sQy7OvPXH0t2mKfqk7XuXg"
cx="11.5"
cy="11.39"
r="2.5"
gradientTransform="matrix(2.0151121,0,0,-2.0151121,-0.28283295,98.172694)"
gradientUnits="userSpaceOnUse">
<stop
offset=".582"
stop-opacity=".2"
id="stop17" />
<stop
offset="1"
stop-opacity="0"
id="stop18" />
</radialGradient>
<circle
cx="22.890959"
cy="75.220573"
fill="url(#sQy7OvPXH0t2mKfqk7XuXg)"
id="circle18"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXg);stroke-width:2.01511"
r="5.0377803" />
<circle
cx="73.268753"
cy="75.220573"
fill="#50e6ff"
id="circle19"
style="stroke-width:2.01511"
r="3.0226684" />
<circle
cx="61.178082"
cy="75.220573"
fill="#50e6ff"
id="circle20"
style="stroke-width:2.01511"
r="3.0226684" />
<circle
cx="49.087414"
cy="75.220573"
fill="#50e6ff"
id="circle21"
style="stroke-width:2.01511"
r="3.0226684" />
<circle
cx="22.890959"
cy="75.220573"
fill="#50e6ff"
id="circle22"
style="stroke-width:2.01511"
r="3.0226684" />
<path
fill="url(#eww6fSHXLG3h4YeAqg9u_a)"
d="m 43.111467,33.670197 v 13.078026 h 2.488729 v 3.414741 h -2.488729 v 4.252451 H 38.944994 V 50.162964 H 29.90331 v -3.573917 c 0.800529,-0.895805 1.630105,-1.877584 2.488727,-2.943021 0.858624,-1.065436 1.688201,-2.162243 2.488731,-3.291582 0.80053,-1.129339 1.545288,-2.263326 2.23544,-3.40777 0.690152,-1.14212 1.275736,-2.235441 1.757913,-3.276477 z m -9.113722,13.078026 h 4.947249 V 39.50163 c -0.338105,0.626248 -0.704093,1.26063 -1.09913,1.901984 -0.396198,0.642514 -0.809826,1.273412 -1.244364,1.896174 -0.433377,0.621602 -0.872566,1.224614 -1.316401,1.807871 -0.443835,0.5821 -0.872565,1.12934 -1.287354,1.640564 z m 31.783001,6.278754 c -2.025142,1.167682 -4.542919,1.750943 -7.552166,1.750943 -3.336895,0 -5.967374,-0.923688 -7.891433,-2.771064 -1.924059,-1.846217 -2.884927,-4.389553 -2.884927,-7.630013 0,-3.260212 1.050332,-5.917413 3.15332,-7.971602 2.102987,-2.054189 4.899612,-3.081283 8.391037,-3.081283 2.199423,0 4.137424,0.304411 5.816329,0.91207 v 4.38258 c -1.602219,-0.926013 -3.558812,-1.388439 -5.874422,-1.388439 -1.939165,0 -3.516984,0.629736 -4.738114,1.888044 -1.219964,1.258306 -1.829947,2.938371 -1.829947,5.04136 0,2.132036 0.548404,3.78073 1.642887,4.948413 1.093321,1.166518 2.572384,1.750938 4.433702,1.750938 1.11772,0 2.005392,-0.160341 2.661848,-0.477529 v -4.050283 h -4.153692 v -3.733095 h 8.825578 z"
id="path2"
style="fill:url(#eww6fSHXLG3h4YeAqg9u_a);stroke-width:1.16187" />
<path
fill="#50e6ff"
d="m 57.257255,26.846523 -7.640468,4.790396 c -0.755219,0.474043 -1.716086,0.472883 -2.471302,-0.0012 l -7.618393,-4.789237 c 1.90547,-3.020866 5.298135,-4.903098 8.865081,-4.903098 3.566947,0 6.959613,1.882232 8.865082,4.903098 z"
id="path3"
style="stroke-width:1.16187" />
<path
fill="#199be2"
d="m 67.09947,20.682792 -6.889897,4.321002 c -5.566528,-8.816284 -18.25533,-8.485148 -23.634798,0 l -3.937581,-2.468977 -2.953479,-1.852025 v -0.0012 C 38.31526,6.9435901 58.429584,6.8971154 67.09947,20.682792 Z"
id="path4"
style="stroke-width:1.16187" />
<path
fill="#0078d4"
d="m 70.217935,16.986879 c 0.470557,0.66343 0.306733,1.58247 -0.382256,2.013525 l -3.706371,2.321418 v -0.0012 c -8.033182,-12.7817497 -27.063479,-13.3533905 -35.470782,0 v 0.0012 L 26.952155,19.000404 C 26.263165,18.569349 26.099343,17.650309 26.568739,16.986879 31.539224,9.9749835 39.7676,5.67722 48.392173,5.67722 c 8.624576,0 16.85295,4.2977635 21.825762,11.309659 z"
id="path5-7"
style="stroke-width:1.16187" />
<path
fill="#35c1f1"
d="m 61.193677,24.386841 -4.921689,3.08593 c -3.750521,-5.917413 -12.175255,-5.624621 -15.759629,0 l -4.921687,-3.08593 0.0024,-0.0034 c 5.810521,-9.21132 19.531064,-9.569176 25.596034,-0.0034 z"
id="path6"
style="stroke-width:1.16187" />
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,284 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 96 96"
width="96"
height="96"
version="1.1"
id="svg25"
sodipodi:docname="icons8-router.svg"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs25" />
<sodipodi:namedview
id="namedview25"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="11.458333"
inkscape:cx="69.905457"
inkscape:cy="51.490911"
inkscape:window-width="2560"
inkscape:window-height="1360"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg25"
showguides="true">
<sodipodi:guide
position="9.9968182,23.832614"
orientation="0,-1"
id="guide25"
inkscape:locked="false" />
<sodipodi:guide
position="46.36841,50.879999"
orientation="0,-1"
id="guide1"
inkscape:locked="false" />
<sodipodi:guide
position="4.1706847,29.588569"
orientation="1,0"
id="guide2"
inkscape:locked="false" />
<sodipodi:guide
position="9.9808125,20.062033"
orientation="1,0"
id="guide3"
inkscape:locked="false" />
<sodipodi:guide
position="86.185391,34.472066"
orientation="1,0"
id="guide4"
inkscape:locked="false" />
<sodipodi:guide
position="32.72426,12.415637"
orientation="0,-1"
id="guide5"
inkscape:locked="false" />
</sodipodi:namedview>
<linearGradient
id="sQy7OvPXH0t2mKfqk7XuXa"
x1="34.117001"
x2="33.909"
y1="30.451"
y2="11.826"
gradientTransform="matrix(2.0049622,0,0,-2.0493466,-0.02712327,82.339673)"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#737b80"
id="stop1" />
<stop
offset=".714"
stop-color="#737b80"
id="stop2" />
<stop
offset=".756"
stop-color="#737b80"
id="stop3" />
<stop
offset=".863"
stop-color="#656c71"
id="stop4" />
<stop
offset="1"
stop-color="#575c61"
id="stop5" />
</linearGradient>
<path
fill="url(#sQy7OvPXH0t2mKfqk7XuXa)"
d="m 62.126702,64.120983 c -0.190473,0 -0.384955,-0.02869 -0.57743,-0.08608 -1.060625,-0.325845 -1.664117,-1.467333 -1.345331,-2.551435 L 72.233716,20.496545 c 0.318787,-1.084107 1.437558,-1.700958 2.496177,-1.375114 1.060625,0.325846 1.664119,1.467334 1.345331,2.551437 L 64.04545,62.659803 c -0.25864,0.889415 -1.05461,1.461184 -1.918748,1.461184 z"
id="path5"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXa);stroke-width:2.02704" />
<linearGradient
id="sQy7OvPXH0t2mKfqk7XuXb"
x1="14.121"
x2="13.913"
y1="30.719"
y2="12.094"
gradientTransform="matrix(2.0049622,0,0,-2.0493466,-0.02712327,82.339673)"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#737b80"
id="stop6" />
<stop
offset=".773"
stop-color="#737b80"
id="stop7" />
<stop
offset="1"
stop-color="#575c61"
id="stop8" />
</linearGradient>
<path
fill="url(#sQy7OvPXH0t2mKfqk7XuXb)"
d="m 34.05723,64.120983 c -0.862132,0 -1.658104,-0.573816 -1.920752,-1.461182 L 20.106705,21.672866 c -0.318788,-1.084103 0.284706,-2.225591 1.34533,-2.551437 1.058621,-0.319698 2.177389,0.291007 2.496178,1.375114 l 12.02977,40.986932 c 0.31879,1.084103 -0.284702,2.225591 -1.345328,2.551436 -0.192476,0.05738 -0.384952,0.08608 -0.575425,0.08608 z"
id="path8"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXb);stroke-width:2.02704" />
<linearGradient
id="sQy7OvPXH0t2mKfqk7XuXc"
x1="24"
x2="24"
y1="14.614"
y2="-2.0710001"
gradientTransform="matrix(2.0049622,0,0,-2.0493466,-0.02712327,82.339673)"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
stop-color="#899198"
id="stop9" />
<stop
offset="1"
stop-color="#787e85"
id="stop10" />
</linearGradient>
<path
fill="url(#sQy7OvPXH0t2mKfqk7XuXc)"
d="M 82.176323,70.269024 H 14.007611 c -2.215484,0 -4.0099252,-1.834165 -4.0099252,-4.098693 V 51.824905 c 0,-2.264529 1.7944412,-4.098694 4.0099252,-4.098694 h 68.168712 c 2.215484,0 4.009924,1.834165 4.009924,4.098694 v 14.345426 c 0,2.264528 -1.79444,4.098693 -4.009924,4.098693 z"
id="path10"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXc);stroke-width:2.02704" />
<rect
width="68.168709"
height="14.345426"
x="14.007612"
y="51.824905"
fill="#737b80"
id="rect10"
style="stroke-width:2.02704" />
<radialGradient
id="sQy7OvPXH0t2mKfqk7XuXd"
cx="36.5"
cy="11.39"
r="2.5"
gradientTransform="matrix(2.0049622,0,0,-2.0493466,-0.02712327,82.339673)"
gradientUnits="userSpaceOnUse">
<stop
offset=".582"
stop-opacity=".2"
id="stop11" />
<stop
offset="1"
stop-opacity="0"
id="stop12" />
</radialGradient>
<ellipse
cx="73.153992"
cy="58.997623"
fill="url(#sQy7OvPXH0t2mKfqk7XuXd)"
id="circle12"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXd);stroke-width:2.02704"
rx="5.0124054"
ry="5.1233664" />
<radialGradient
id="sQy7OvPXH0t2mKfqk7XuXe"
cx="30.5"
cy="11.39"
r="2.5"
gradientTransform="matrix(2.0049622,0,0,-2.0493466,-0.02712327,82.339673)"
gradientUnits="userSpaceOnUse">
<stop
offset=".582"
stop-opacity=".2"
id="stop13" />
<stop
offset="1"
stop-opacity="0"
id="stop14" />
</radialGradient>
<ellipse
cx="61.124226"
cy="58.997623"
fill="url(#sQy7OvPXH0t2mKfqk7XuXe)"
id="circle14"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXe);stroke-width:2.02704"
rx="5.0124054"
ry="5.1233664" />
<radialGradient
id="sQy7OvPXH0t2mKfqk7XuXf"
cx="24.5"
cy="11.39"
r="2.5"
gradientTransform="matrix(2.0049622,0,0,-2.0493466,-0.02712327,82.339673)"
gradientUnits="userSpaceOnUse">
<stop
offset=".582"
stop-opacity=".2"
id="stop15" />
<stop
offset="1"
stop-opacity="0"
id="stop16" />
</radialGradient>
<ellipse
cx="49.094448"
cy="58.997623"
fill="url(#sQy7OvPXH0t2mKfqk7XuXf)"
id="circle16"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXf);stroke-width:2.02704"
rx="5.0124054"
ry="5.1233664" />
<radialGradient
id="sQy7OvPXH0t2mKfqk7XuXg"
cx="11.5"
cy="11.39"
r="2.5"
gradientTransform="matrix(2.0049622,0,0,-2.0493466,-0.02712327,82.339673)"
gradientUnits="userSpaceOnUse">
<stop
offset=".582"
stop-opacity=".2"
id="stop17" />
<stop
offset="1"
stop-opacity="0"
id="stop18" />
</radialGradient>
<ellipse
cx="23.029943"
cy="58.997623"
fill="url(#sQy7OvPXH0t2mKfqk7XuXg)"
id="circle18"
style="fill:url(#sQy7OvPXH0t2mKfqk7XuXg);stroke-width:2.02704"
rx="5.0124054"
ry="5.1233664" />
<ellipse
cx="73.153992"
cy="58.997623"
fill="#50e6ff"
id="circle19"
rx="3.0074432"
ry="3.0740201"
style="stroke-width:2.02704" />
<ellipse
cx="61.124226"
cy="58.997623"
fill="#50e6ff"
id="circle20"
rx="3.0074432"
ry="3.0740201"
style="stroke-width:2.02704" />
<ellipse
cx="49.094448"
cy="58.997623"
fill="#50e6ff"
id="circle21"
rx="3.0074432"
ry="3.0740201"
style="stroke-width:2.02704" />
<ellipse
cx="23.029943"
cy="58.997623"
fill="#50e6ff"
id="circle22"
rx="3.0074432"
ry="3.0740201"
style="stroke-width:2.02704" />
</svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><path fill="#0d47a1" d="M47.97,19.826c0.654,3.747-9.547,8.655-22.788,10.96c-13.238,2.306-24.5,1.136-25.153-2.613 c-0.653-3.747,9.551-8.654,22.79-10.958C36.059,14.907,47.318,16.078,47.97,19.826z"/><polygon fill="#fafafa" points="35.51,25.388 35.442,21.492 36.671,21.492 36.671,26.403 34.905,26.403 33.678,22.373 33.652,22.373 33.72,26.403 32.499,26.403 32.499,21.492 34.342,21.492 35.483,25.388"/><polygon fill="#fafafa" points="13.177,21.952 12.497,26.455 11.157,26.455 12.076,21.492 14.284,21.492 15.201,26.455 13.865,26.455 13.204,21.952"/><polygon fill="#fafafa" points="18.964,25.286 19.577,21.492 21.601,21.492 21.708,26.455 20.468,26.455 20.435,21.993 20.409,21.993 19.58,26.455 18.321,26.455 17.49,21.993 17.464,21.993 17.433,26.455 16.19,26.455 16.3,21.492 18.325,21.492 18.937,25.286"/><path fill="#fafafa" d="M9.067,25.055c0.049,0.12,0.034,0.275,0.011,0.368c-0.042,0.165-0.154,0.333-0.483,0.333 c-0.312,0-0.5-0.179-0.5-0.45v-0.48H6.763L6.762,25.21c0,1.106,0.871,1.441,1.805,1.441c0.898,0,1.637-0.307,1.754-1.134 c0.061-0.429,0.015-0.709-0.005-0.816c-0.209-1.039-2.093-1.349-2.233-1.93c-0.024-0.099-0.017-0.205-0.005-0.262 c0.035-0.158,0.143-0.332,0.453-0.332c0.29,0,0.461,0.18,0.461,0.45c0,0.091,0,0.307,0,0.307h1.237v-0.348 c0-1.081-0.97-1.25-1.673-1.25c-0.883,0-1.604,0.292-1.736,1.099c-0.036,0.223-0.041,0.422,0.011,0.671 C7.049,24.118,8.811,24.412,9.067,25.055z"/><path fill="#fafafa" d="M25.204,25.046c0.049,0.119,0.033,0.27,0.011,0.363c-0.041,0.165-0.152,0.33-0.479,0.33 c-0.307,0-0.494-0.179-0.494-0.444l-0.001-0.476h-1.318l-0.002,0.379c0,1.095,0.863,1.426,1.787,1.426 c0.888,0,1.62-0.303,1.736-1.122c0.061-0.426,0.018-0.702-0.004-0.807c-0.208-1.029-2.073-1.336-2.211-1.912 c-0.024-0.099-0.017-0.203-0.005-0.257c0.036-0.16,0.142-0.329,0.449-0.329c0.288,0,0.455,0.175,0.455,0.444 c0,0.09,0,0.304,0,0.304h1.228v-0.345c0-1.07-0.962-1.237-1.659-1.237c-0.873,0-1.588,0.288-1.717,1.09 c-0.036,0.22-0.04,0.415,0.012,0.663C23.206,24.118,24.951,24.41,25.204,25.046z"/><path fill="#fafafa" d="M29.372,25.713c0.344,0,0.451-0.238,0.475-0.36c0.01-0.054,0.013-0.125,0.012-0.19V21.49h1.255 v3.56c0.003,0.091-0.006,0.279-0.011,0.325c-0.088,0.927-0.821,1.227-1.732,1.227c-0.913,0-1.646-0.301-1.733-1.227 c-0.004-0.047-0.013-0.235-0.011-0.325v-3.56h1.254v3.672c0,0.064,0.002,0.137,0.012,0.19 C28.921,25.473,29.025,25.713,29.372,25.713z"/><path fill="#fafafa" d="M39.725,25.66c0.359,0,0.485-0.227,0.508-0.359c0.009-0.057,0.012-0.126,0.011-0.189v-0.72 h-0.509v-0.724h1.76V25c-0.001,0.093-0.003,0.162-0.018,0.327c-0.082,0.903-0.866,1.225-1.745,1.225 c-0.881,0-1.663-0.322-1.747-1.225c-0.014-0.166-0.016-0.234-0.018-0.327l0.001-2.089c0-0.088,0.011-0.244,0.021-0.327 c0.11-0.928,0.862-1.226,1.743-1.226c0.88,0,1.651,0.297,1.742,1.226c0.016,0.158,0.011,0.327,0.011,0.327v0.166h-1.251v-0.278 c0.001,0.001-0.002-0.118-0.016-0.189c-0.021-0.11-0.116-0.362-0.495-0.362c-0.362,0-0.467,0.238-0.494,0.362 c-0.015,0.065-0.021,0.154-0.021,0.234v2.27c-0.001,0.063,0.003,0.132,0.013,0.189C39.241,25.433,39.366,25.66,39.725,25.66z"/></svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><path fill="#fff" d="M40,24c0,8.8-7.2,16-16,16S8,32.8,8,24S15.2,8,24,8S40,15.2,40,24z"/><path fill="#e64a19" d="M30 24c0 3.3-2.7 6-6 6-3.3 0-6-2.7-6-6s2.7-6 6-6C27.3 18 30 20.7 30 24zM12 21.5c1.4 0 2.5 1.1 2.5 2.5s-1.1 2.5-2.5 2.5S9.5 25.4 9.5 24 10.6 21.5 12 21.5M12 20.5c-1.9 0-3.5 1.6-3.5 3.5s1.6 3.5 3.5 3.5 3.5-1.6 3.5-3.5S13.9 20.5 12 20.5zM30 31.5c1.4 0 2.5 1.1 2.5 2.5s-1.1 2.5-2.5 2.5-2.5-1.1-2.5-2.5S28.6 31.5 30 31.5M30 30.5c-1.9 0-3.5 1.6-3.5 3.5s1.6 3.5 3.5 3.5 3.5-1.6 3.5-3.5S31.9 30.5 30 30.5z"/><path fill="#e64a19" d="M24,4C13,4,4,13,4,24s9,20,20,20s20-9,20-20S35,4,24,4z M32.5,34c0,1.4-1.1,2.5-2.5,2.5 s-2.5-1.1-2.5-2.5c0-0.2,0-0.5,0.1-0.7C26.5,33.8,25.3,34,24,34c-5.1,0-9.2-3.8-9.9-8.7c-0.4,0.7-1.2,1.2-2.1,1.2 c-1.4,0-2.5-1.1-2.5-2.5s1.1-2.5,2.5-2.5c0.9,0,1.7,0.5,2.1,1.2c0.7-4.9,4.8-8.7,9.9-8.7c1.3,0,2.5,0.2,3.6,0.7 c-0.1-0.2-0.1-0.4-0.1-0.7c0-1.4,1.1-2.5,2.5-2.5s2.5,1.1,2.5,2.5c0,1.2-0.8,2.2-2,2.4C32.7,18.3,34,21,34,24s-1.3,5.7-3.5,7.6 C31.7,31.8,32.5,32.8,32.5,34z"/><path fill="#e64a19" d="M30 11.5c1.4 0 2.5 1.1 2.5 2.5 0 1.4-1.1 2.5-2.5 2.5s-2.5-1.1-2.5-2.5C27.5 12.6 28.6 11.5 30 11.5M30 10.5c-1.9 0-3.5 1.6-3.5 3.5s1.6 3.5 3.5 3.5 3.5-1.6 3.5-3.5S31.9 10.5 30 10.5zM24 24c-2.6-4.1-5.2-8.1-7.8-12.2"/><path fill="#e64a19" d="M19.1 10.7H21.1V25.1H19.1z" transform="rotate(-32.467 20.127 17.911)"/><path fill="#e64a19" d="M24 23H38.4V25H24z"/><g><path fill="#e64a19" d="M24,24c-2.7,4-5.3,8-8,12"/><path fill="#e64a19" d="M12.8 29H27.200000000000003V31H12.8z" transform="rotate(-56.312 19.998 30.006)"/></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><path fill="#00b0ff" d="M20 25.026L5.011 25 5.012 37.744 20 39.818zM22 25.03L22 40.095 42.995 43 43 25.066zM20 8.256L5 10.38 5.014 23 20 23zM22 7.973L22 23 42.995 23 42.995 5z"/></svg>

After

Width:  |  Height:  |  Size: 272 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><path fill="#1976d2" d="M6,6h17v17H6V6z"/><path fill="#1976d2" d="M25.042,22.958V6H42v16.958H25.042z"/><path fill="#1976d2" d="M6,25h17v17H6V25z"/><path fill="#1976d2" d="M25,42V25h17v17H25z"/></svg>

After

Width:  |  Height:  |  Size: 287 B

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xml:space="preserve"
width="800"
height="800"
version="1.0"
viewBox="0 0 800 800.01969"
id="svg1"
sodipodi:docname="logo-toshiba.svg"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:svg="http://www.w3.org/2000/svg"><svg:defs
id="defs1" /><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showguides="true"
inkscape:zoom="1.538125"
inkscape:cx="378.70784"
inkscape:cy="288.013"
inkscape:window-width="2560"
inkscape:window-height="1360"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1"><sodipodi:guide
position="227.31716,399.38542"
orientation="0,-1"
id="guide1"
inkscape:locked="false" /></sodipodi:namedview>
<svg:path
fill="#e61e1e"
d="m 766.10016,459.7136 h 34.55 l -35.65,-117.66 -49.1,-0.002 -35.65,117.66 h 34.56 l 6.3,-21.78 h 38.66 l 6.33,21.78 m -37.51,-47.943 11.76,-40.651 h 0.2 l 11.76,40.651 z m -555.46,50.055 c 35.48,0 52.63,-6.25 55.06,-38.265 0.58,-7.618 0.69,-15.439 0.69,-22.689 0.01,-7.225 -0.11,-15.054 -0.69,-22.671 -2.43,-32.025 -19.58,-38.265 -55.06,-38.265 -35.48,0 -52.62,6.24 -55.04,38.265 -0.59,7.617 -0.71,15.446 -0.71,22.671 0.01,7.25 0.12,15.071 0.71,22.689 2.42,32.015 19.56,38.265 55.04,38.265 m -22.31,-60.954 c 0,-6.461 0.16,-10.28 0.3,-13.114 0.9,-18.161 8.07,-20.278 22.01,-20.278 13.95,0 21.12,2.117 22.01,20.278 0.14,2.833 0.31,6.652 0.31,13.114 0,6.482 -0.17,10.308 -0.31,13.135 -0.89,18.164 -8.06,20.285 -22.01,20.285 -13.94,0 -21.11,-2.121 -22.01,-20.285 -0.14,-2.827 -0.3,-6.653 -0.3,-13.135 z M 0.65015822,342.1056 v 29.331 H 35.822158 v 88.327 h 35.185 v -88.327 h 35.173002 v -29.331 H 0.65015822 M 540.50016,459.7136 v -117.662 h -33.39 v 117.662 h 33.39 m -134.35,-74.703 v -42.959 h -33.2 v 117.662 h 33.2 v -45.372 h 38.58 v 45.372 h 33.19 v -117.662 h -33.19 v 42.959 h -38.58 m 244.17,13.206 c 14.79,-3.781 19.13,-12.616 19.13,-25.386 0,-25.859 -16.27,-30.78 -39.4,-30.78 h -59.95 v 117.66 h 62.92 c 28.97,0 38.71,-12.48 38.71,-31.675 0,-13.383 -3.06,-25.191 -21.41,-29.822 m -47.03,13.169 h 23.02 c 9.3,0 11.24,4.074 11.24,10.7 0,6.632 -3.64,10.717 -11.24,10.717 h -23.02 z m 0,-42.425 h 23.02 c 6.01,0 9.73,2.851 9.73,9.708 0,5.878 -3.68,9.496 -9.73,9.496 h -23.02 z m -355.06,52.143 h 31.65 c 0.03,5.708 0.76,9.523 3.53,11.63 3.15,2.374 5.97,3.158 15.32,3.158 9,0 18.86,0 18.86,-11.085 0,-8.742 -5.51,-10.737 -15.68,-11.279 -25.22,-1.336 -34.34,-2.049 -43.73,-9.025 -6.4,-4.757 -9.72,-14.018 -9.72,-26.542 0,-21.297 7.43,-28.768 18.15,-33.981 11.06,-5.381 54.47,-5.381 66.15,0 14.69,6.768 15.12,21.42 15.12,35.011 h -31.57 c -0.06,-6.929 -1.62,-8.886 -2.89,-10.175 -3.28,-2.908 -7.95,-3.522 -14.69,-3.522 -8.16,0 -17.6,0.368 -17.6,10.277 0,7.56 3.27,10.72 11.85,11.276 11.79,0.754 35.02,1.497 43.3,6.383 11.61,6.867 14.62,16.159 14.62,31.319 0,21.908 -7.84,28.338 -18.75,33.158 -12.59,5.56 -54.64,5.56 -68.31,-0.43 -15.3,-6.67 -15.61,-19.964 -15.61,-36.173"
id="path1" />
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -10,7 +10,7 @@
<location_id>1</location_id>
<status>production</status>
<brand_id>10</brand_id>
<model_id>0</model_id>
<model_id>5</model_id>
<asset_number></asset_number>
<purchase_date></purchase_date>
<end_of_warranty></end_of_warranty>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Set>
<Brand alias="Brand" id="1">
<Brand alias="Brand" id="6">
<name>Acer</name>
<logo><mimetype>image/svg+xml</mimetype><filename>icon-acer.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmc6c3ZnIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIiB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiIHhtbG5zOnN2Zz0iaH
R0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgaWQ9ImFjZXIiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iODMiIGhlaWdodD0iODMiIHZpZXdCb3g9IjAgMCA4MyA4MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgc29kaXBvZGk6ZG9jbmFtZT0iaWNvbi1hY2VyLnN2ZyIgaW5rc2NhcGU6dmVyc2lvbj0iMS40LjMgKDBkMTVmNzUwNDIsIDIwMjUtMTItMjUpIj48c3ZnOmRlZnMgaWQ9ImRlZnMxIi8+PHNvZGlwb2RpOm5hbWVkdmlldyBpZD0ibmFtZWR2
@@ -45,7 +45,7 @@
<finalclass>Brand</finalclass>
<friendlyname>Asus</friendlyname>
</Brand>
<Brand alias="Brand" id="4">
<Brand alias="Brand" id="10">
<name>Cisco</name>
<logo><mimetype>image/svg+xml</mimetype><filename>icon-cisco.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIgeG1sbnM9Imh0dHA6Ly93d
3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgd2lkdGg9IjEwOCIgaGVpZ2h0PSIxMDgiIHZpZXdCb3g9IjAgMCAxMDggMTA4IiByb2xlPSJpbWciIHZlcnNpb24
@@ -74,7 +74,7 @@
<finalclass>Brand</finalclass>
<friendlyname>Dell</friendlyname>
</Brand>
<Brand alias="Brand" id="6">
<Brand alias="Brand" id="7">
<name>HP Inc</name>
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-hp.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0yNCA0QTIwIDIwIDAgMSAwIDI0IDQ0QTIwIDIwIDAgMSAwIDI0IDRaIi8+PHBhdGggZmlsbD0iIzE5NzZkMiIgZD0iTTI0LDQzLj
k5N2MtMC4xOTksMC0wLjY1MiwwLjAwNi0wLjg1LDBsNC0xMC45OTloNS42MjVjMC45ODcsMCwyLjA3MS0wLjc1OSwyLjQwOS0xLjY4Nmw0Ljc0OC0xMi42ODdjMC43MjUtMS45OTUtMC40MTctMy42MjYtMi41MzktMy42MjZoLTcuODA0bC02LjUxOCwxOC4yNTdoLTAuMDAybC0zLjcxMiwxMC4xOThDMTAuNTUsNDEuMzYxLDQsMzMuNDQ1LDQsMjMuOTk5YzAtOS4xNzQsNi4xNzgtMTYuOTA1LDE0LjYtMTkuMjYxbC0zLjgzLDEwLjUyNmgtMC4wMDFMOC4xNSwzMi45OTho
@@ -82,7 +82,7 @@
<finalclass>Brand</finalclass>
<friendlyname>HP Inc</friendlyname>
</Brand>
<Brand alias="Brand" id="7">
<Brand alias="Brand" id="1">
<name>HPE</name>
<logo><mimetype>image/svg+xml</mimetype><filename>icon-hpe.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIgeG1sbnM9Imh0dHA6Ly93d3c
udzMub3JnLzIwMDAvc3ZnIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIGlkPSJrYXRtYW5fMSIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCA2MzAgNjMwIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzb2RpcG9kaTpkb2NuYW1lPSJpY29uLWhwZS5zdmciIHdpZHRoPSI2MzAiIGhlaWdodD0iNjMwIiBpbmtzY2FwZTp2ZXJzaW9uPSIxLjQuMyAoMGQxNWY3NTA0MiwgMjAyNS0xMi0yNSkiPjxkZWZzIGlkPSJkZWZzM
@@ -117,7 +117,7 @@
<finalclass>Brand</finalclass>
<friendlyname>Lenovo</friendlyname>
</Brand>
<Brand alias="Brand" id="10">
<Brand alias="Brand" id="4">
<name>Razer</name>
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-razer.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiM2NGRkMTciIGQ9Ik0yNiwyMGMwLjEsMCwwLjIsMCwwLjMsMGMwLjMtMC4xLDAuNS0wLjMsMC42LTAuNWMwLjEtMC4yLDAuMS0wLjUsMC4xLTA
uOGMtMC4yLTAuNi0xLTEuOC0yLTIuNCBjMCwwLjcsMCwxLjMsMCwxLjljMCwwLjUsMCwxLDAsMS4yYzAuMSwwLjIsMC4zLDAuNCwwLjUsMC42QzI1LjcsMjAsMjUuOCwyMCwyNiwyMCBNMjkuNCwyM2MwLjcsMCwxLjYtMC4xLDIuMy0wLjUgYy0wLjUtMC4zLTEtMC42LTEuNS0wLjljLTAuNC0wLjMtMC45LTAuNi0xLjEtMC42YzAsMC0wLjEsMC0wLjEsMGMtMC4yLDAtMC40LDAuMS0wLjYsMC4yYy0wLjIsMC4xLTAuNCwwLjQtMC40LDAuNiBjLTAuMSwwLjUsMC4zLDEuM

View File

@@ -0,0 +1,256 @@
<?xml version="1.0" encoding="UTF-8"?>
<Set>
<NetworkDeviceType alias="NetworkDeviceType" id="1">
<name>Firewall</name>
<logo><mimetype>image/png</mimetype><filename>firewall.png</filename><data>iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABmJLR0QA/wD/AP+gvaeTAAAIdUlEQVR4nO2bXWwc1RXH/3f2a3bXiXHiJM4HCVRqBXEqHG8SlGRJtgGS2okLJjhNRHmoWvJQJKQgtahVK0VVRamqqlVppSK1AlW8IJ6gUkMlxEsAKbHBJHZQCyLB2EqMwd71bryza+/e04dknV3veHbufOzswv1J98E7c885c/537tx7ZgxIJBKJRCKRSCQSiUQikUi+LjCvAxAh3ff9hxixfwA0xoj+HI3Qy+zVV4tex2UHxesARGCcngbx1SDqJuCl61l2Pn34+B6v47JDUwlAHCkioKx1g/jb6Z5jz9Hp0011LSWaKmgGXAYISxoDo2cyg5f+lXz44du8jVCcphKAg1+uzv/NxtGr5ANvpftOtHsZoyhNJYAClseSOai8MaLtrLDwxlRioMXrWM3SVAIQaKX+8L/ViCimqvRPapIVXlMJAM7bDG6Askb96UNHn/Q6XDM0lQAEutdE9kvtd8neR7Z4HXMtmkYA6ukJETGRNX9EKeA51wJyiKYRIFMM9TCisMAdABAdSx88epfXsRvRNAIQZ0+L5R4ggsI5nfI6diOaYqUw80B/XAGdtdh9tjWQX8fOnMk7GpRDNPwdQImEX6HiX0SHfllrzcyrD3p9HcvR8AKkfa2/ALF7aiz/DVuR6JAXsZvB73UARqQO9B0gol/ZtcMY7XAiHjdo2GdA8kDvFpB/EMAau7YYkGttD7U04ruDhrwD0om+ds5xhkC2kw8ABKhzM/l2AJ87Yc9JGu4ZMN3Ts7IIeoNAd1ue9HXaAucdJR+p/UeeSCaOTM7u79tZvyvTp6EEuJJIqErW9xoIMQdzDxDAimx1mat+ENZx0MvjuwfC9bk6fRpGAEok/K08+goRJYgIjjeFeMkXJ7rn5u/figayv/byuhtCAMJpJUnRFwF8zz0frAAAqX19dwLYUHboVCrR69kqqSEESO47/zw4/cDGZqt2TaLANQDgVHx0yTEf53iePFoRer4Mnbmv91kAP3fbT8GH9X7/vIZ8cBTApqXHGfDDtrP/fsntOJbi6R0wEz/8DASTrz5wGa1/+A8ij10E/Lx2hxvk13wRnaH5wIvQST4AEPDs1VhfRCQWJ/BMgJl47wkw+q1ov+DecbBQEcHdE2h56hxYdN5Mt3Sybe5NRqzf4Jz1oSj/iWg8dvFkCkrdd6ibk3IWgPCIa/npu/BvmV38uzixEtf/dC8o58ie8ssiBb6x5p3XM04YM0Pd74DZ3YdWcVJeg4Xk6+HblEb0yUGwoCNVhnaFFZ5wwpBZ6i5A0af8FcvMw2ZgrfmqfZbvzhTCj404Eh8DPUUDAz5HjJmgrgJM7+09RsBxqxtatkqDcltO13Ygdg3BfWNObJq3TF/NPOT4xS9D3QS4kkioYPR7OzYCsWuGmQv3/7fi+WAVprAf2TZikroJsGIhcgrAZqv9mVpA6DufGp/k5wg/fkFkeaoP4eDknoNr7RkxR10EuBrrizAUf2ZnJ6v2fAylJV9z/vCtnYP64Cd2d87+oKI8Wo/c1EWAoLowADDLXy77N88iFB8DOEw19f7L8HVctxUzEQ7bMmCSugjAAMtzKgsVoD5+EaSQ+QHs4wgd+chu2PupcyBo10gtXBdgKtHbASButX/4+Ch8q+dMj/5SC2ydgu+OlJ3Qo8m2zC47BszgugC++UIcRMzKXBzaO4bAtyeFk784FX33I1vPAiq6/zLf9XfCnGMPAwn3890+i1DP/0AF6759d8xA2ZhCcbzVUn/GcLd17+ZwXQBGfLtwJ4Wg9n8IAgdsCAAAwV3j0D5bYakvJ2y15702rgtAnITX08H4GJQ1GVujv4SvcxJ4/ZtWi3Xr7UdgjPufpXBaJXI6i84jGL8CMlVlNhUA/Fs/x8LQhtqnVmNt7hLA/TugWGgTOT/Q/RmIiiAHP6VVNn8JOmdpY/tVEECsTKzcNQXu2Oi/aXNjCsQLAAm//nD9Szr3BSgUMwBCZs5VVmmgYA7FrNNRFMBWZ8Ano6IdXX8xIzwk3nrn3GGAXgCw0clACpnreHd4BBNT0xW/b1y/Dju3b0M4rArbNFz80o2j83NZXBi6gE+mkxWHN3SsXfRrZhFNwISP8ZP3x+NnRGK0sBGjv8Hh5AOAf0ULYju7qn7f0SWe/FJtTv8gLSYfAILRCDp36fjdvg2qyeQDACPaxDl7QShQWJuCLL/NMoIARMLVXwlGIuaTb2bE66Hn17TolXZvN9fpFp5/Hb0YvkGCTNvQPWjdrrFTZ+x6JoATia+wU3XAvF2hCAzsWrmSugsgE19J3QSQidfH/X1AxR8uzPNNmvgSrgrQSA9YJ5LmxuPcFQGcmm6Wd9D8iS8hvBHLZvU/jALKNkBLNjumbWuasT8Bu4absSofOn61nJANqwgLcO79i1Ui2E08AMxpGs6/V/154eDwyI0EuZB4ECGb1TA0PFrt9
4NRaNryg80phGtBPz71S7cHRVPz9z/+RiinDfEvSl9npAAeIwXwGOFl6Imj5r7Yy2ZzOD88gmuTUxW/b1ha3xd4uJryq+UwNDyCa5NfVPrtWIsdXZ1QLbxXuBUELRuLpuUw9MElYZOu3QGRiIqd3duqfl+s7wsuKU37VUPY0VXtN
2Yn+WWxLhdLOKwi1tUpbNrVjZhufT8cciXx5TYjOom28kat3KaZWPT81sJRAZxanzpVs7EXhPGIdwpHBGikxNuOpU6JL2FbgK9MlbLOiS9hWQCZeGcQFkAm3lnsPwMEH4IihTLbNgzsep34EvYEcGMF4nLibdtxGPGNGGHC7CZKt
75vVOI1WNmIJE3Ph1af+v64aAdhARjDSQATtc6b0zQMvl9dZx8aHq1O0DKCWklYVsvhPd36/iW36/vjxOmkmw4kEolEIpFIJBKJRCKRSCTNzf8B9DlMYsFrhfAAAAAASUVORK5CYII=</data><downloads_count>0</downloads_count></logo>
</NetworkDeviceType>
<NetworkDeviceType alias="NetworkDeviceType" id="2">
<name>Load Balancer</name>
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-loadbalancer-6.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcg
eG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIg
eG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAw
IDk2IDk2IiB3aWR0aD0iOTYiIGhlaWdodD0iOTYiIHZlcnNpb249IjEuMSIgaWQ9InN2ZzE2IiBzb2RpcG9kaTpkb2NuYW1lPSJpY29uczgtbG9hZGJhbGFuY2VyLTYuc3ZnIiB4bWw6c3BhY2U9InByZXNlcnZlIiBpbmtzY2Fw
ZTp2ZXJzaW9uPSIxLjQuMyAoMGQxNWY3NTA0MiwgMjAyNS0xMi0yNSkiPjxkZWZzIGlkPSJkZWZzMTYiPjxsaW5lYXJHcmFkaWVudCBpZD0icmd0eWJSNWZEVThSNElnSUZrT1A1YiIgeDE9IjE5LjM4OCIgeDI9IjI4LjQxMyIg
eTE9Ii05Ljk0NDk5OTciIHkyPSI1Mi4wOTg5OTkiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMCwtMC40OTMxMTUxMywtMC40OTMxMTUxMywwLDQ2LjAxOTQ5NCw0My45OTUwMjUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3Bh
Y2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMWVhMmU0IiBpZD0ic3RvcDctNiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzMyYmRlZiIgaWQ9InN0b3A4LTIiLz48L2xpbmVhckdyYWRpZW50
PjxsaW5lYXJHcmFkaWVudCBpZD0icmd0eWJSNWZEVThSNElnSUZrT1A1YSIgeDE9IjQ3Ny4xNzg5OSIgeDI9IjQ3Mi43NzIiIHkxPSI1MjIuMTg3MDEiIHkyPSI1MjIuMTg3MDEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgo
LTAuMzQ4Njg1MDUsMC4zNDg2ODUwNSwwLjM0ODY4NTA1LDAuMzQ4Njg1MDUsMjMuNzgzMDkxLC0zMDYuNjYwNDQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIuMzY1IiBzdG9wLWNvbG9y
PSIjMTk5YWUwIiBpZD0ic3RvcDEiLz48c3RvcCBvZmZzZXQ9Ii42OTkiIHN0b3AtY29sb3I9IiMxODk4ZGUiIGlkPSJzdG9wMiIvPjxzdG9wIG9mZnNldD0iLjgxOSIgc3RvcC1jb2xvcj0iIzE2OTFkOCIgaWQ9InN0b3AzLTki
Lz48c3RvcCBvZmZzZXQ9Ii45MDUiIHN0b3AtY29sb3I9IiMxMTg2Y2MiIGlkPSJzdG9wNC0xIi8+PHN0b3Agb2Zmc2V0PSIuOTc0IiBzdG9wLWNvbG9yPSIjMGE3NWJjIiBpZD0ic3RvcDUtMiIvPjxzdG9wIG9mZnNldD0iMSIg
c3RvcC1jb2xvcj0iIzA3NmNiMyIgaWQ9InN0b3A2LTciLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iQXJ0RFlaMmxUNzV2a2FiUkVzVERFYiIgeDE9IjEwLjQ0MyIgeDI9IjM0Ljg5NDAwMSIgeTE9IjM1
Ljk4NTAwMSIgeTI9IjExLjUzMyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC43MzI5NTMwMywwLDAsMC43MzI5NTMwMyw2MC40MDkwOTQsMjkuOTkxODEyKSI+PHN0
b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMzJiZGVmIiBpZD0ic3RvcDctMyIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzFlYTJlNCIgaWQ9InN0b3A4LTciLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFk
aWVudCBpZD0iQXJ0RFlaMmxUNzV2a2FiUkVzVERFYSIgeDE9IjM3IiB4Mj0iMzciIHkxPSI0MS41NTUiIHkyPSIyOC4wMzAwMDEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0
cml4KDAuNzMyOTUzMDMsMCwwLDAuNzMyOTUzMDMsNjAuNDA5MDk0LDI5Ljk5MTgxMikiPjxzdG9wIG9mZnNldD0iLjM2NSIgc3RvcC1jb2xvcj0iIzE5OWFlMCIgaWQ9InN0b3AxLTUiLz48c3RvcCBvZmZzZXQ9Ii42OTkiIHN0
b3AtY29sb3I9IiMxODk4ZGUiIGlkPSJzdG9wMi05Ii8+PHN0b3Agb2Zmc2V0PSIuODE5IiBzdG9wLWNvbG9yPSIjMTY5MWQ4IiBpZD0ic3RvcDMtMiIvPjxzdG9wIG9mZnNldD0iLjkwNSIgc3RvcC1jb2xvcj0iIzExODZjYyIg
aWQ9InN0b3A0LTIiLz48c3RvcCBvZmZzZXQ9Ii45NzQiIHN0b3AtY29sb3I9IiMwYTc1YmMiIGlkPSJzdG9wNS04Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDc2Y2IzIiBpZD0ic3RvcDYtOSIvPjwvbGluZWFy
R3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSI5MDFSSUhjTHl6NmRaUEdTdlNmMVhjIiB4MT0iMzMuNDM2MDAxIiB4Mj0iMzguMTU3MDAxIiB5MT0iMjEuNTYzOTk5IiB5Mj0iMTYuODQzIiBncmFkaWVudFRyYW5zZm9ybT0i
bWF0cml4KC0xLDAsMCwxLDEyMS43MTIxOSwxNy4zNjgxMjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjYWU0Y2Q1IiBpZD0ic3RvcDUtNiIvPjxzdG9wIG9m
ZnNldD0iMSIgc3RvcC1jb2xvcj0iI2FjNGFkNSIgaWQ9InN0b3A2LTEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iOTAxUklIY0x5ejZkWlBHU3ZTZjFYYiIgeDE9IjY5NC45NzYwMSIgeDI9IjcxNy43
MTgwMiIgeTE9IjM1LjcwOSIgeTI9IjEyLjk2NyIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtNjA2LjI4NzgyLDE3LjM2ODEyOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAi
IHN0b3AtY29sb3I9IiNhZTRjZDUiIGlkPSJzdG9wMy0yOSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2FjNGFkNSIgaWQ9InN0b3A0LTMiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iOTAx
UklIY0x5ejZkWlBHU3ZTZjFYYSIgeDE9IjM2LjI1IiB4Mj0iMzYuMjUiIHkxPSIzOC4wNDI5OTkiIHkyPSIyMy4wMDYwMDEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTEsMCwwLDEsMTIxLjcxMjE5LDE3LjM2ODEyOSki
IGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM5MTJmYmQiIGlkPSJzdG9wMS0xIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjOTMzMmJmIiBpZD0ic3Rv
cDItOTQiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIHhsaW5rOmhyZWY9IiNBcnREWVoybFQ3NXZrYWJSRXNUREVhIiBpZD0ibGluZWFyR3JhZGllbnQyNCIgZ3Jh
ZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMCwwLjczMjk1MzAzLC0wLjczMjk1MzAzLDAsNjUuNjM1NTkyLDYwLjE1MzUxNSkiIHgxPSIzNyIgeTE9IjQxLjU1NSIgeDI9IjM3
IiB5Mj0iMjguMDMwMDAxIi8+PGxpbmVhckdyYWRpZW50IGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgeGxpbms6aHJlZj0iI0FydERZWjJsVDc1dmthYlJFc1RERWIiIGlkPSJsaW5lYXJHcmFkaWVudDI1IiBncmFkaWVudFVu
aXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLDAuNzMyOTUzMDMsLTAuNzMyOTUzMDMsMCw2NS42MzU1OTIsNjAuMTUzNTE1KSIgeDE9IjEwLjQ0MyIgeTE9IjM1Ljk4NTAwMSIgeDI9IjM0
Ljg5NDAwMSIgeTI9IjExLjUzMyIvPjxsaW5lYXJHcmFkaWVudCBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIHhsaW5rOmhyZWY9IiNBcnREWVoybFQ3NXZrYWJSRXNUREViIiBpZD0ibGluZWFyR3JhZGllbnQyNiIgZ3JhZGll
bnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC41MTgyNzYwNiwwLjUxODI3NjA2LC0wLjUxODI3NjA2LDAuNTE4Mjc2MDYsNjUuMDk5NTg5LDM4LjI4MzI5NSkiIHgxPSIxMC40NDMi
IHkxPSIzNS45ODUwMDEiIHgyPSIzNC44OTQwMDEiIHkyPSIxMS41MzMiLz48bGluZWFyR3JhZGllbnQgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiB4bGluazpocmVmPSIjQXJ0RFlaMmxUNzV2a2FiUkVzVERFYSIgaWQ9Imxp
bmVhckdyYWRpZW50MjciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTE4Mjc2MDYsMC41MTgyNzYwNiwtMC41MTgyNzYwNiwwLjUxODI3NjA2LDY1LjA5OTU4OSwz
OC4yODMyOTUpIiB4MT0iMzciIHkxPSI0MS41NTUiIHgyPSIzNyIgeTI9IjI4LjAzMDAwMSIvPjxsaW5lYXJHcmFkaWVudCBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIHhsaW5rOmhyZWY9IiNBcnREWVoybFQ3NXZrYWJSRXNU
REVhIiBpZD0ibGluZWFyR3JhZGllbnQyOCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNTE4Mjc2MDYsMC41MTgyNzYwNiwwLjUxODI3NjA2LDAuNTE4Mjc2MDYs
MzEuMDYzOTkzLDM4LjIzOTEwMSkiIHgxPSIzNyIgeTE9IjQxLjU1NSIgeDI9IjM3IiB5Mj0iMjguMDMwMDAxIi8+PGxpbmVhckdyYWRpZW50IGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgeGxpbms6aHJlZj0iI0FydERZWjJs
VDc1dmthYlJFc1RERWIiIGlkPSJsaW5lYXJHcmFkaWVudDI5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC41MTgyNzYwNiwwLjUxODI3NjA2LDAuNTE4Mjc2MDYs
MC41MTgyNzYwNiwzMS4wNjM5OTMsMzguMjM5MTAxKSIgeDE9IjEwLjQ0MyIgeTE9IjM1Ljk4NTAwMSIgeDI9IjM0Ljg5NDAwMSIgeTI9IjExLjUzMyIvPjxsaW5lYXJHcmFkaWVudCBpZD0iOTAxUklIY0x5ejZkWlBHU3ZTZjFY
Yy04IiB4MT0iMzMuNDM2MDAxIiB4Mj0iMzguMTU3MDAxIiB5MT0iMjEuNTYzOTk5IiB5Mj0iMTYuODQzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAsMC43ODYzOTQyMiwwLjc4NjM5NDIyLDAsMjguNzA4NjE1LC0xLjEx
MzM1MzMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjYWU0Y2Q1IiBpZD0ic3RvcDUtODQiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNhYzRhZDUi
IGlkPSJzdG9wNi0zIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9IjkwMVJJSGNMeXo2ZFpQR1N2U2YxWGItMSIgeDE9IjY5NC45NzYwMSIgeDI9IjcxNy43MTgwMiIgeTE9IjM1LjcwOSIgeTI9IjEyLjk2
NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLC0wLjc4NjM5NDIyLDAuNzg2Mzk0MjIsMCwyOC43MDg2MTUsNTcxLjM4MTY1KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3Rv
cC1jb2xvcj0iI2FlNGNkNSIgaWQ9InN0b3AzLTQiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNhYzRhZDUiIGlkPSJzdG9wNC05Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9IjkwMVJJSGNM
eXo2ZFpQR1N2U2YxWGEtMiIgeDE9IjM2LjI1IiB4Mj0iMzYuMjUiIHkxPSIzOC4wNDI5OTkiIHkyPSIyMy4wMDYwMDEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMCwwLjc4NjM5NDIyLDAuNzg2Mzk0MjIsMCwyOC43MDg2
MTUsLTEuMTEzMzUzMykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM5MTJmYmQiIGlkPSJzdG9wMS0wIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIj
OTMzMmJmIiBpZD0ic3RvcDItNiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxzb2RpcG9kaTpuYW1lZHZpZXcgaWQ9Im5hbWVkdmlldzE2IiBwYWdlY29sb3I9IiNmZmZmZmYiIGJvcmRlcmNvbG9yPSIjMDAwMDAwIiBib3Jk
ZXJvcGFjaXR5PSIwLjI1IiBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iMiIgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIgaW5rc2NhcGU6cGFnZWNoZWNrZXJib2FyZD0iMCIgaW5rc2NhcGU6ZGVza2NvbG9yPSIjZDFkMWQx
IiBzaG93Z3VpZGVzPSJ0cnVlIiBpbmtzY2FwZTp6b29tPSI1LjY1Njg1NDMiIGlua3NjYXBlOmN4PSI0NS4zNDMyMjIiIGlua3NjYXBlOmN5PSIzMC40MDU1OTIiIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMjU2MCIgaW5rc2Nh
cGU6d2luZG93LWhlaWdodD0iMTM2MCIgaW5rc2NhcGU6d2luZG93LXg9IjAiIGlua3NjYXBlOndpbmRvdy15PSIwIiBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIiBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcxNiI+
PHNvZGlwb2RpOmd1aWRlIHBvc2l0aW9uPSIxOS41NTk3ODksMTQzLjczODM0IiBvcmllbnRhdGlvbj0iMSwwIiBpZD0iZ3VpZGUxNyIgaW5rc2NhcGU6bG9ja2VkPSJmYWxzZSIvPjxzb2RpcG9kaTpndWlkZSBwb3NpdGlvbj0i
MjQuMDg0NDY5LDk4LjIyNDIxMiIgb3JpZW50YXRpb249IjAsLTEiIGlkPSJndWlkZTE4IiBpbmtzY2FwZTpsb2NrZWQ9ImZhbHNlIi8+PHNvZGlwb2RpOmd1aWRlIHBvc2l0aW9uPSIxOS44NDUxNjksMTE2LjQzOTYyIiBvcmll
bnRhdGlvbj0iMCwtMSIgaWQ9Imd1aWRlMTkiIGlua3NjYXBlOmxvY2tlZD0iZmFsc2UiLz48c29kaXBvZGk6Z3VpZGUgcG9zaXRpb249IjQ4LjA0MTUwNCw4My40NjU4MiIgb3JpZW50YXRpb249IjEsMCIgaWQ9Imd1aWRlMjAi
IGlua3NjYXBlOmxvY2tlZD0iZmFsc2UiLz48c29kaXBvZGk6Z3VpZGUgcG9zaXRpb249Ijc4LjI1LDQ3Ljc1IiBvcmllbnRhdGlvbj0iMCwtMSIgaWQ9Imd1aWRlMjEiIGlua3NjYXBlOmxvY2tlZD0iZmFsc2UiLz48c29kaXBv
ZGk6Z3VpZGUgcG9zaXRpb249IjUwLjM5NDQ1Nyw2NS4zMTY0NjgiIG9yaWVudGF0aW9uPSIwLC0xIiBpZD0iZ3VpZGUyOSIgaW5rc2NhcGU6bG9ja2VkPSJmYWxzZSIvPjxzb2RpcG9kaTpndWlkZSBwb3NpdGlvbj0iNjcuNjA1
MzQ3LDIxLjA2MDgzNyIgb3JpZW50YXRpb249IjAsLTEiIGlkPSJndWlkZTMwIiBpbmtzY2FwZTpsb2NrZWQ9ImZhbHNlIi8+PC9zb2RpcG9kaTpuYW1lZHZpZXc+PGxpbmVhckdyYWRpZW50IGlkPSI2ZlNPVVBhfkNQOHRjc0l4
X1d2dWZhIiB4MT0iMjIuMDExIiB4Mj0iMjYuMjEyIiB5MT0iNzg1Ljc5MTAyIiB5Mj0iNzg5Ljk5Mjk4IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTc4MS43OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9u
VXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMzM2JlZjAiIGlkPSJzdG9wMyIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzBhODVkOSIgaWQ9InN0b3A0Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFy
R3JhZGllbnQgaWQ9IjZmU09VUGF+Q1A4dGNzSXhfV3Z1ZmIiIHgxPSI2LjAxMTAwMDIiIHgyPSIxMC4yMTMiIHkxPSI3OTQuNzkxMDIiIHkyPSI3OTguOTkyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTc4MS43
OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMzM2JlZjAiIGlkPSJzdG9wNSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzBhODVkOSIgaWQ9InN0
b3A2Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9IjZmU09VUGF+Q1A4dGNzSXhfV3Z1ZmMiIHgxPSI2LjAxMTAwMDIiIHgyPSIxMC4yMTMiIHkxPSI4MTIuNzkxMDIiIHkyPSI4MTYuOTkyIiBncmFkaWVu
dFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTc4MS43OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMzM2JlZjAiIGlkPSJzdG9wNyIvPjxzdG9wIG9mZnNldD0i
MSIgc3RvcC1jb2xvcj0iIzBhODVkOSIgaWQ9InN0b3A4Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9IjZmU09VUGF+Q1A4dGNzSXhfV3Z1ZmQiIHgxPSIzOC4wMTEwMDIiIHgyPSI0Mi4yMTIwMDIiIHkx
PSI3OTQuNzkxMDIiIHkyPSI3OTguOTkyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTc4MS43OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMz
M2JlZjAiIGlkPSJzdG9wOSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzBhODVkOSIgaWQ9InN0b3AxMCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSI2ZlNPVVBhfkNQOHRjc0l4X1d2dWZl
IiB4MT0iMzguMDExMDAyIiB4Mj0iNDIuMjEyMDAyIiB5MT0iODEyLjc5MTAyIiB5Mj0iODE2Ljk5MiIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwLC03ODEuNzgpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVz
ZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMzNiZWYwIiBpZD0ic3RvcDExIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMGE4NWQ5IiBpZD0ic3RvcDEyIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFy
R3JhZGllbnQgaWQ9IjZmU09VUGF+Q1A4dGNzSXhfV3Z1ZmYiIHgxPSIyMi4wMTEiIHgyPSIyNi4yMTIiIHkxPSI4MjEuNzkxMDIiIHkyPSI4MjUuOTkyIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTc4MS43OCki
IGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMzM2JlZjAiIGlkPSJzdG9wMTMiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwYTg1ZDkiIGlkPSJzdG9w
MTQiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iNmZTT1VQYX5DUDh0Y3NJeF9XdnVmZyIgeDE9IjIyLjM4OTk5OSIgeDI9IjI1LjUxIiB5MT0iMjcuODQxIiB5Mj0iMjAuMTg0IiBncmFkaWVudFRyYW5z
Zm9ybT0ibWF0cml4KDIuMjc1MDY0OSwwLDAsLTIuMjc1MDY0OSwtNi40NzA0OTc2LDcxLjA3ODY1OSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMyYWE0ZjQi
IGlkPSJzdG9wMTUiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwMDdhZDkiIGlkPSJzdG9wMTYiLz48L2xpbmVhckdyYWRpZW50PjxjaXJjbGUgY3g9IjQ4LjEzMTA1IiBjeT0iMTYuNzI3MzU2IiBmaWxsPSJ1cmwo
IzZmU09VUGF+Q1A4dGNzSXhfV3Z1ZmcpIiBpZD0iY2lyY2xlMTYiIHN0eWxlPSJmaWxsOnVybCgjNmZTT1VQYX5DUDh0Y3NJeF9XdnVmZyk7c3Ryb2tlLXdpZHRoOjIuMjc1MDYiIHI9IjExLjM3NTMyNCIvPjxwYXRoIGZpbGw9
InVybCgjQXJ0RFlaMmxUNzV2a2FiUkVzVERFYSkiIGQ9Im0gNzYuODU2MTY0LDczLjcwNjQyNiB2IC0zLjQ3MTQxMyBjIDEwZS03LC0wLjY2ODU3NiAtMC41NDE1OTgsLTEuMjEwMTc1IC0xLjIxMDE3NSwtMS4yMTAxNzUgbCAt
MTAuMDI4MTIzLC0yLjIzNjM2MSAtNi42MzM0MTUsNi42MzM0MTYgYyAtMC41NTE5NjQsMC41NTE5NjQgLTAuMTYxMTg1LDEuNDk1MjI2IDAuNjE5MzQsMS40OTUyMjYgaCAxNi4wNDE2OCBjIDAuNjY4NTc3LDAgMS4yMTA2OTQs
LTAuNTQyMTE3IDEuMjEwNjkzLC0xLjIxMDY5MyB6IiBpZD0icGF0aDYtNyIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDI3KTtzdHJva2Utd2lkdGg6MC43MzI5NTMiLz48cGF0aCBmaWxsPSJ1cmwoI0FydERZWjJs
VDc1dmthYlJFc1RERWIpIiBkPSJtIDc2Ljg1NjE2NCw3My43MDY0MjYgdiAtMTYuMDQxNjggYyAwLC0wLjc4MDUyNSAtMC45NDMyNjIsLTEuMTcxMzA0IC0xLjQ5NTIyNiwtMC42MTkzNCBMIDY5Ljc2NDA3NCw2Mi42NDIyNjkg
NTEuNzk0MTk5LDQ1LjE3MjM5MyBjIC0wLjU4MDcxNywtMC41NjQ1NTkgLTEuODkzMDk3LDAuNjY1MTkgLTEuNzkxODU0LDEuNDY4NzUgbCAwLjcwMjg0Myw1LjU3ODQwNyBjIDAuMTAxMjQzLDAuODAzNTYgLTAuMTU5ODQyLDEu
MDg3NjMxIDAuNDA2MjUsMS42NjY4NTQgbCAyMC4yMDc0NjUsMjAuNjc2MjE0IGMgMC4yMTY3MDIsMC4yMjE3MjkgMC41MjEzODUsMC4zNTQ1MDEgMC44NTU2NzMsMC4zNTM5ODIgaCAzLjQ3MTQxMyBjIDAuNjY4MDU5LDUuMTll
LTQgMS4yMTAxNzYsLTAuNTQxNTk4IDEuMjEwMTc1LC0xLjIxMDE3NCB6IiBpZD0icGF0aDgtMyIgc3R5bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDI2KTtzdHJva2Utd2lkdGg6MC43MzI5NTMiIHNvZGlwb2RpOm5vZGV0
eXBlcz0iY3NzY3Nzc3NzY2NjIi8+PHBhdGggZmlsbD0idXJsKCNBcnREWVoybFQ3NXZrYWJSRXNUREVhKSIgZD0ibSAxOS4zMDc0MTgsNzMuNjYyMjMyIHYgLTMuNDcxNDEzIGMgLTEwZS03LC0wLjY2ODU3NiAwLjU0MTU5OCwt
MS4yMTAxNzUgMS4yMTAxNzUsLTEuMjEwMTc1IGwgMTAuMDI4MTIzLC0yLjIzNjM2MSA2LjYzMzQxNSw2LjYzMzQxNiBjIDAuNTUxOTY0LDAuNTUxOTY0IDAuMTYxMTg1LDEuNDk1MjI2IC0wLjYxOTM0LDEuNDk1MjI2IGggLTE2
LjA0MTY4IGMgLTAuNjY4NTc3LDAgLTEuMjEwNjk0LC0wLjU0MjExNyAtMS4yMTA2OTMsLTEuMjEwNjkzIHoiIGlkPSJwYXRoNi03LTgiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyOCk7c3Ryb2tlLXdpZHRoOjAu
NzMyOTUzIiBzb2RpcG9kaTpub2RldHlwZXM9InNzY2Nzc3NzIi8+PHBhdGggZmlsbD0idXJsKCNBcnREWVoybFQ3NXZrYWJSRXNUREViKSIgZD0ibSAxOS4zMDc0MTgsNzMuNjYyMjMyIHYgLTE2LjA0MTY4IGMgMCwtMC43ODA1
MjUgMC45NDMyNjIsLTEuMTcxMzA0IDEuNDk1MjI2LC0wLjYxOTM0IGwgNS41OTY4NjQsNS41OTY4NjMgMTkuMjE5ODc1LC0xOS4wMzIzNzYgYyAwLjU3NTQ5NSwtMC41Njk4ODEgMC41MzQ1OTcsMS4yOTI0NDEgMC40MTY4NTQs
Mi4wOTM3NSBsIC0wLjk1Mjg0Myw2LjQ4NDY1NyBjIC0wLjExNzc0MywwLjgwMTMwOSAwLjUwNzA5OSwxLjQwMzU4IC0wLjA2MjUsMS45NzkzNTQgTCAyNC44NDQ2NzksNzQuNTE4NDI0IGMgLTAuMjE4MDQ1LDAuMjIwNDA5IC0w
LjUyMTM4NSwwLjM1NDUwMSAtMC44NTU2NzMsMC4zNTM5ODIgaCAtMy40NzE0MTMgYyAtMC42NjgwNTksNS4xOWUtNCAtMS4yMTAxNzYsLTAuNTQxNTk4IC0xLjIxMDE3NSwtMS4yMTAxNzQgeiIgaWQ9InBhdGg4LTMtNiIgc3R5
bGU9ImZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDI5KTtzdHJva2Utd2lkdGg6MC43MzI5NTMiIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NzY3Nzc3NzY2NjIi8+PHBhdGggZmlsbD0idXJsKCNBcnREWVoybFQ3NXZrYWJSRXNUREVh
KSIgZD0ibSA0OC45MDA4MDksOTMuNTE0NjA1IDIuNDU0NjYsLTIuNDU0NjYgYyAwLjQ3Mjc1NSwtMC40NzI3NTQgMC40NzI3NTUsLTEuMjM4NjkgMCwtMS43MTE0NDUgbCAtNS41MDk2MDgsLTguNjcyMyBoIC05LjM4MTA2NiBj
IC0wLjc4MDU5NSwwIC0xLjE3MTI1OSwwLjk0MzMxIC0wLjYxOTM0NSwxLjQ5NTIyNCBsIDExLjM0MzE4MSwxMS4zNDMxODEgYyAwLjQ3Mjc1NSwwLjQ3Mjc1NSAxLjIzOTQyNCwwLjQ3Mjc1NSAxLjcxMjE3OCwwIHoiIGlkPSJw
YXRoNi03LTQiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyNCk7c3Ryb2tlLXdpZHRoOjAuNzMyOTUzIi8+PHBhdGggZmlsbD0idXJsKCNBcnREWVoybFQ3NXZrYWJSRXNUREViKSIgZD0iTSA0OC45MDA4MDksOTMu
NTE0NjA1IDYwLjI0Mzk5LDgyLjE3MTQyNCBDIDYwLjc5NTkwNCw4MS42MTk1MSA2MC40MDUyNCw4MC42NzYyIDU5LjYyNDY0NSw4MC42NzYyIGggLTcuOTE1MTYgbCAwLjAyMTE1LC01MC4xMDMwNTIgQyA1MS43MzA5NzcsMjku
NzYzMjM1IDUxLjI0MDExMiwyOS4zMDEzNjUgNTAuNDMwMiwyOS4zMDIyMyBsIC00LjM5NjgzOCwwLjAwNDcgYyAtMC44MDk5MTIsOC42NGUtNCAtMS42NDk0NDcsMC40NTI4NjkgLTEuNjQ5NSwxLjI2Mjc4MSBsIC0wLjAwMzks
NTkuNjM0ODg3IGMgLTJlLTUsMC4zMTAwMzkgMC4xMTgwMDUsMC42MTkzNDUgMC4zNTQ3NDksMC44NTUzNTYgbCAyLjQ1NDY2LDIuNDU0NjYgYyAwLjQ3MjAyMiwwLjQ3Mjc1NSAxLjIzODY5MSwwLjQ3Mjc1NSAxLjcxMTQ0NSww
IHoiIGlkPSJwYXRoOC0zLTUiIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQyNSk7c3Ryb2tlLXdpZHRoOjAuNzMyOTUzIiBzb2RpcG9kaTpub2RldHlwZXM9InNzc2Nzc3Nzc2NjcyIvPjwvc3ZnPgo=</data><downloads_count>0</downloads_count></logo>
</NetworkDeviceType>
<NetworkDeviceType alias="NetworkDeviceType" id="10">
<name>Router</name>
<logo><mimetype>image/png</mimetype><filename>icons8-collect-96.png</filename><data>iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFoklEQVR4nO1c
y27bRhQlcul8jLM0lZWCGl3FyKJB2yRrR/JLEh/9i6bpD7RetXZaoKvKjpM6ji1SEkUVyDJA06YpGjt7k6a0FKYYynEcVxJJkZyhyXuAAwgCgbn3HHKoGR1SEBAIBAKBSDlA694CtfsOtC6ZTOsIVGuBd72ZA1BhfcU/pWod8q43
cwDNImHIu97MAdAANCDXALwC0IBcA9QOCUPe9WYOgAagAbkG4BWABmQSoLYfgdIegGoSphyOuSHkHaCYh8zF/8C3Qt4hyp1PQDF77K8As0fH5t1/KiAqrSIobReUNmHDVh9q5qe8+06hCS0XlBZJls0+1AwUf6wJctMFuUmSoYHi
+18JjSLIhguyQeKljuIHno4qjSLUdBdqOomHDRSfnwkNFD+SCdUDF6oNMiX7UNvHG25kE9b2XagckJDswyqKHwvEyl4R1vZcqDwnAYnixw1xea8IK89cWN0jPuzD6i5OO4mZsPybCyu7ZAxR/KQhLj8pwtITF5afkgvsQ3kHz3xm
JpQfu7C0QzyWd/IrPqjWIxoFFL9ivLO4+OsslLe+o6SfWQ5Ne6U9g9rdFHgDVGtwmsfsgWrNCxkHqNa81+uw50EaUsvnk8l90LqZnQpExSqC1nXP95zCxFonkyaInviWm7oQ8OjIYLZMEMeIn2IDsmOCOEH8lBsQvwmzL8lVybDv
SYbzU0G3XxUMp+dRt1+dfneXHsNK/EtgQHwmSMbxFwXdeVMwHOLDvyX9+POo44la94af+OkwIFBizeyDNt2f4Hd+ISAZ9rcBhP+Yuv1QIOTKNGOKWvsGqB33UoSAg0cGpzNBmkb8U0qG/SBJ8RMxADTzFijmu7BZzED08j/BF2sS
nXamFP89rzdPbodaZHk1JtC7agZ7enN4YBIFhDNh9iW5SufzqAZIuvNPkBtzsuKf9e7/9GaiBYSYjiTDvhdV/LOrQLfvxDntRGEAA1jFA9sTTSjozs9xGSDpzuZk8U2XVd8pMmBogiA3R+5kSob9V1wG0HXCqDFmtNY170Rg2HPK
DDDpvPj9qDoKhuPGZoDhuCN7Vcx11v0GMKBNmFJpJW6ApDvOaANa66z79Tcg8XDsx0FZYdwUpNt/xncF2H+MnYJoWJdhzykyYHJK2dvbie8esME/lR3UgMSSyeFSygXdvhuXAXPN4y/5prI/0N+AqnEENYMkxqrRg2rDdyE294LM
FAzndfSz33kTaCFWbcx7tSXZe00PsBCr6QtQ1Y/iSyafY1UPJP570F3NyGe/cfKZEBBDE/ReIr3XGodQadwU4kbSQdmCbj+c+teP4XyddCBY4A2oHpAAnD6lTMiVgm5/E158+8HU29GeCftukN4E3mCVUr7ePLkd8J7wOsy0EzWV
LfAGy5Ty3AsyQzfW6N4O/W1/ulhz6Wf6Hf21Q49hmcoWeANWn5ExzERQVvRS2bvuuD551yfkIaUsTkhl865NyEtKWRyTyuZdl3CWUM5BSlm8mMpe2kmBAaXtAZS3CZS3elDazn44t7Q97/VKey5tpyCcW6pvQqn+r7i4xTSePqP9
fg3U7jol/cxybNor3K+/hVL9RyGPEL3Q1PmUcrZT2SkXv4smsBXfcrMeCE4lxIBZTTSBq/gWmsBffAtNiDWfr0ZJrE2fys49xMjiowkcz/wOmpAe8Ts4HfEXv4Mm+IvfKrJJKU9OZecSIjPx0YT/iy/jq4u5AuT2IbtXFl+g3MaX
d4Pc2gC5OWCbym7RnOYA5OYPfE+/SwSIOwSLCGtAuFcVo74xA0KGYdGAuA2ohntrLhrAJwRMUhOazRqgsk/CkHe9mQOs7ZEw5F1v5gCruyQMedebOcDKUxKGvOvNHOB8BjUAedebOUBp62iYQQ1E/6cRESENWNxagPv1IyjViQ8PoVSP/2lEBAKBQCCEePEfD3q/JRB0b7YAAAAASUVORK5CYII=</data><downloads_count>0</downloads_count></logo>
</NetworkDeviceType>
<NetworkDeviceType alias="NetworkDeviceType" id="4">
<name>Router 4G</name>
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-router-4g.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sb
nM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIgeG1sb
nM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgOTYgOTYiIHdpZHRoPSI5NiIgaGVpZ2h0PSI5NiIgdmVyc2lvbj0iMS4xIiBpZ
D0ic3ZnMjUiIHNvZGlwb2RpOmRvY25hbWU9Imljb25zOC1yb3V0ZXItNGcuc3ZnIiBpbmtzY2FwZTp2ZXJzaW9uPSIxLjQuMyAoMGQxNWY3NTA0MiwgMjAyNS0xMi0yNSkiPjxkZWZzIGlkPSJkZWZzMjUiPjxsaW5lYXJHcmFka
WVudCBpZD0iZXd3NmZTSFhMRzNoNFllQXFnOXVfYSIgeDE9IjE3LjU5IiB4Mj0iMzIuMDciIHkxPSIyNS45MzQ5OTkiIHkyPSI0OC4yMzA5OTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZ
m9ybT0ibWF0cml4KDEuMTYxODcxNywwLDAsMS4xNjE4NzE3LDIwLjUwNzI1NCwyLjE5MTYwNDkpIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM4NTkyOWUiIGlkPSJzdG9wMS0zIi8+PHN0b3Agb2Zmc2V0PSIxIiBzd
G9wLWNvbG9yPSIjNmQ3ODgyIiBpZD0ic3RvcDItNiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxzb2RpcG9kaTpuYW1lZHZpZXcgaWQ9Im5hbWVkdmlldzI1IiBwYWdlY29sb3I9IiNmZmZmZmYiIGJvcmRlcmNvbG9yPSIjM
DAwMDAwIiBib3JkZXJvcGFjaXR5PSIwLjI1IiBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iMiIgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIgaW5rc2NhcGU6cGFnZWNoZWNrZXJib2FyZD0iMCIgaW5rc2NhcGU6ZGVza2Nvb
G9yPSIjZDFkMWQxIiBpbmtzY2FwZTp6b29tPSI4LjEwMjI2NTIiIGlua3NjYXBlOmN4PSIyMS40MTM3NjUiIGlua3NjYXBlOmN5PSIzNy4zOTY5NDkiIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMjU2MCIgaW5rc2NhcGU6d2luZ
G93LWhlaWdodD0iMTM2MCIgaW5rc2NhcGU6d2luZG93LXg9IjAiIGlua3NjYXBlOndpbmRvdy15PSIwIiBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIiBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcyNSIgc2hvd2d1a
WRlcz0idHJ1ZSI+PHNvZGlwb2RpOmd1aWRlIHBvc2l0aW9uPSI5LjgxNzg1NjIsMzAuMTQwNzE4IiBvcmllbnRhdGlvbj0iMSwwIiBpZD0iZ3VpZGUxIiBpbmtzY2FwZTpsb2NrZWQ9ImZhbHNlIi8+PHNvZGlwb2RpOmd1aWRlI
HBvc2l0aW9uPSI4Ni40NzA4MDIsMzguMTgxOTY4IiBvcmllbnRhdGlvbj0iMSwwIiBpZD0iZ3VpZGUyIiBpbmtzY2FwZTpsb2NrZWQ9ImZhbHNlIi8+PHNvZGlwb2RpOmd1aWRlIHBvc2l0aW9uPSI0Ni4yNTg2MzYsOS40ODEwM
jMyIiBvcmllbnRhdGlvbj0iMCwtMSIgaWQ9Imd1aWRlMyIgaW5rc2NhcGU6bG9ja2VkPSJmYWxzZSIvPjxzb2RpcG9kaTpndWlkZSBwb3NpdGlvbj0iNTMuNjQxNDQyLDEwMS4yOTgiIG9yaWVudGF0aW9uPSIwLC0xIiBpZD0iZ
3VpZGU0IiBpbmtzY2FwZTpsb2NrZWQ9ImZhbHNlIi8+PC9zb2RpcG9kaTpuYW1lZHZpZXc+PGxpbmVhckdyYWRpZW50IGlkPSJzUXk3T3ZQWEgwdDJtS2ZxazdYdVhhIiB4MT0iMzQuMTE3MDAxIiB4Mj0iMzMuOTA5IiB5MT0iM
zAuNDUxIiB5Mj0iMTEuODI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDE1MTEyMSwwLDAsLTIuMDE1MTEyMSwtMC4yODI4MzI5NSw5OC4xNzI2OTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b
3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNzM3YjgwIiBpZD0ic3RvcDEiLz48c3RvcCBvZmZzZXQ9Ii43MTQiIHN0b3AtY29sb3I9IiM3MzdiODAiIGlkPSJzdG9wMiIvPjxzdG9wIG9mZnNldD0iLjc1NiIgc3RvcC1jb2xvc
j0iIzczN2I4MCIgaWQ9InN0b3AzIi8+PHN0b3Agb2Zmc2V0PSIuODYzIiBzdG9wLWNvbG9yPSIjNjU2YzcxIiBpZD0ic3RvcDQiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM1NzVjNjEiIGlkPSJzdG9wNSIvPjwvb
GluZWFyR3JhZGllbnQ+PHBhdGggZmlsbD0idXJsKCNzUXk3T3ZQWEgwdDJtS2ZxazdYdVhhKSIgZD0ibSA2Mi4xODU2NDEsODAuMjU4MzQ4IGMgLTAuMTkxNDM1LDAgLTAuMzg2OTAyLC0wLjAyODIxIC0wLjU4MDM1MiwtMC4wO
DQ2MyAtMS4wNjU5OTMsLTAuMzIwNCAtMS42NzI1NDMsLTEuNDQyODIgLTEuMzUyMTQsLTIuNTA4ODE3IEwgNzIuMzQzODIzLDM3LjM2MjY1OSBjIDAuMzIwNDA0LC0xLjA2NTk5NCAxLjQ0NDgzNCwtMS42NzI1NDMgMi41MDg4M
TUsLTEuMzUyMTQgMS4wNjU5OSwwLjMyMDQwMiAxLjY3MjUzOSwxLjQ0MjgyMSAxLjM1MjE0MSwyLjUwODgxNCBMIDY0LjExNDEwNCw3OC44MjE1NzggYyAtMC4yNTk5NSwwLjg3NDU1NSAtMS4wNTk5NSwxLjQzNjc3IC0xLjkyO
DQ2MywxLjQzNjc3IHoiIGlkPSJwYXRoNSIgc3R5bGU9ImZpbGw6dXJsKCNzUXk3T3ZQWEgwdDJtS2ZxazdYdVhhKTtzdHJva2Utd2lkdGg6Mi4wMTUxMSIvPjxsaW5lYXJHcmFkaWVudCBpZD0ic1F5N092UFhIMHQybUtmcWs3W
HVYYiIgeDE9IjE0LjEyMSIgeDI9IjEzLjkxMyIgeTE9IjMwLjcxOSIgeTI9IjEyLjA5NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjAxNTExMjEsMCwwLC0yLjAxNTExMjEsLTAuMjgyODMyOTUsOTguMTcyNjk0KSIgZ
3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzczN2I4MCIgaWQ9InN0b3A2Ii8+PHN0b3Agb2Zmc2V0PSIuNzczIiBzdG9wLWNvbG9yPSIjNzM3YjgwIiBpZD0ic3Rvc
DciLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM1NzVjNjEiIGlkPSJzdG9wOCIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggZmlsbD0idXJsKCNzUXk3T3ZQWEgwdDJtS2ZxazdYdVhiKSIgZD0ibSAzMy45NzQwNzEsO
DAuMjU4MzQ4IGMgLTAuODY2NDk3LDAgLTEuNjY2NDk4LC0wLjU2NDIzMSAtMS45MzA0NzUsLTEuNDM2NzcgTCAxOS45NTI5MjIsMzguNTE5MzMzIGMgLTAuMzIwNDA0LC0xLjA2NTk5MyAwLjI4NjE0NiwtMi4xODg0MTIgMS4zN
TIxNDEsLTIuNTA4ODE0IDEuMDYzOTc5LC0wLjMxNDM1NyAyLjE4ODQxMSwwLjI4NjE0NiAyLjUwODgxNSwxLjM1MjE0IGwgMTIuMDkwNjcxLDQwLjMwMjIzOSBjIDAuMzIwNDAyLDEuMDY1OTk2IC0wLjI4NjE0NiwyLjE4ODQxN
yAtMS4zNTIxMzksMi41MDg4MTUgLTAuMTkzNDUyLDAuMDU2NDMgLTAuMzg2OTAyLDAuMDg0NjMgLTAuNTc4MzM5LDAuMDg0NjMgeiIgaWQ9InBhdGg4IiBzdHlsZT0iZmlsbDp1cmwoI3NReTdPdlBYSDB0Mm1LZnFrN1h1WGIpO
3N0cm9rZS13aWR0aDoyLjAxNTExIi8+PGxpbmVhckdyYWRpZW50IGlkPSJzUXk3T3ZQWEgwdDJtS2ZxazdYdVhjIiB4MT0iMjQiIHgyPSIyNCIgeTE9IjE0LjYxNCIgeTI9Ii0yLjA3MTAwMDEiIGdyYWRpZW50VHJhbnNmb3JtP
SJtYXRyaXgoMi4wMTUxMTIxLDAsMCwtMi4wMTUxMTIxLC0wLjI4MjgzMjk1LDk4LjE3MjY5NCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM4OTkxOTgiIGlkP
SJzdG9wOSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzc4N2U4NSIgaWQ9InN0b3AxMCIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggZmlsbD0idXJsKCNzUXk3T3ZQWEgwdDJtS2ZxazdYdVhjKSIgZD0iTSA4Mi4zM
zY3NjUsODYuMzAzNjg5IEggMTMuODIyOTUxIGMgLTIuMjI2Njk4LDAgLTQuMDMwMjIzNywtMS44MDM1MzEgLTQuMDMwMjIzNywtNC4wMzAyMjcgViA2OC4xNjc2NzggYyAwLC0yLjIyNjY5OSAxLjgwMzUyNTcsLTQuMDMwMjI1I
DQuMDMwMjIzNywtNC4wMzAyMjUgaCA2OC41MTM4MTQgYyAyLjIyNjY5NiwwIDQuMDMwMjIxLDEuODAzNTI2IDQuMDMwMjIxLDQuMDMwMjI1IHYgMTQuMTA1Nzg0IGMgMCwyLjIyNjY5NiAtMS44MDM1MjUsNC4wMzAyMjcgLTQuM
DMwMjIxLDQuMDMwMjI3IHoiIGlkPSJwYXRoMTAiIHN0eWxlPSJmaWxsOnVybCgjc1F5N092UFhIMHQybUtmcWs3WHVYYyk7c3Ryb2tlLXdpZHRoOjIuMDE1MTEiLz48cmVjdCB3aWR0aD0iNjguNTEzODA5IiBoZWlnaHQ9IjE0L
jEwNTc4NSIgeD0iMTMuODIyOTUyIiB5PSI2OC4xNjc2NzEiIGZpbGw9IiM3MzdiODAiIGlkPSJyZWN0MTAiIHN0eWxlPSJzdHJva2Utd2lkdGg6Mi4wMTUxMSIvPjxyYWRpYWxHcmFkaWVudCBpZD0ic1F5N092UFhIMHQybUtmc
Ws3WHVYZCIgY3g9IjM2LjUiIGN5PSIxMS4zOSIgcj0iMi41IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDE1MTEyMSwwLDAsLTIuMDE1MTEyMSwtMC4yODI4MzI5NSw5OC4xNzI2OTQpIiBncmFkaWVudFVuaXRzPSJ1c
2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIuNTgyIiBzdG9wLW9wYWNpdHk9Ii4yIiBpZD0ic3RvcDExIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLW9wYWNpdHk9IjAiIGlkPSJzdG9wMTIiLz48L3JhZGlhbEdyYWRpZW50P
jxjaXJjbGUgY3g9IjczLjI2ODc1MyIgY3k9Ijc1LjIyMDU3MyIgZmlsbD0idXJsKCNzUXk3T3ZQWEgwdDJtS2ZxazdYdVhkKSIgaWQ9ImNpcmNsZTEyIiBzdHlsZT0iZmlsbDp1cmwoI3NReTdPdlBYSDB0Mm1LZnFrN1h1WGQpO
3N0cm9rZS13aWR0aDoyLjAxNTExIiByPSI1LjAzNzc4MDMiLz48cmFkaWFsR3JhZGllbnQgaWQ9InNReTdPdlBYSDB0Mm1LZnFrN1h1WGUiIGN4PSIzMC41IiBjeT0iMTEuMzkiIHI9IjIuNSIgZ3JhZGllbnRUcmFuc2Zvcm09I
m1hdHJpeCgyLjAxNTExMjEsMCwwLC0yLjAxNTExMjEsLTAuMjgyODMyOTUsOTguMTcyNjk0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iLjU4MiIgc3RvcC1vcGFjaXR5PSIuMiIgaWQ9I
nN0b3AxMyIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1vcGFjaXR5PSIwIiBpZD0ic3RvcDE0Ii8+PC9yYWRpYWxHcmFkaWVudD48Y2lyY2xlIGN4PSI2MS4xNzgwODIiIGN5PSI3NS4yMjA1NzMiIGZpbGw9InVybCgjc1F5N092U
FhIMHQybUtmcWs3WHVYZSkiIGlkPSJjaXJjbGUxNCIgc3R5bGU9ImZpbGw6dXJsKCNzUXk3T3ZQWEgwdDJtS2ZxazdYdVhlKTtzdHJva2Utd2lkdGg6Mi4wMTUxMSIgcj0iNS4wMzc3ODAzIi8+PHJhZGlhbEdyYWRpZW50IGlkP
SJzUXk3T3ZQWEgwdDJtS2ZxazdYdVhmIiBjeD0iMjQuNSIgY3k9IjExLjM5IiByPSIyLjUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMi4wMTUxMTIxLDAsMCwtMi4wMTUxMTIxLC0wLjI4MjgzMjk1LDk4LjE3MjY5NCkiI
GdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9Ii41ODIiIHN0b3Atb3BhY2l0eT0iLjIiIGlkPSJzdG9wMTUiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3Atb3BhY2l0eT0iMCIgaWQ9InN0b3AxNiIvP
jwvcmFkaWFsR3JhZGllbnQ+PGNpcmNsZSBjeD0iNDkuMDg3NDE0IiBjeT0iNzUuMjIwNTczIiBmaWxsPSJ1cmwoI3NReTdPdlBYSDB0Mm1LZnFrN1h1WGYpIiBpZD0iY2lyY2xlMTYiIHN0eWxlPSJmaWxsOnVybCgjc1F5N092U
FhIMHQybUtmcWs3WHVYZik7c3Ryb2tlLXdpZHRoOjIuMDE1MTEiIHI9IjUuMDM3NzgwMyIvPjxyYWRpYWxHcmFkaWVudCBpZD0ic1F5N092UFhIMHQybUtmcWs3WHVYZyIgY3g9IjExLjUiIGN5PSIxMS4zOSIgcj0iMi41IiBnc
mFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMDE1MTEyMSwwLDAsLTIuMDE1MTEyMSwtMC4yODI4MzI5NSw5OC4xNzI2OTQpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIuNTgyIiBzdG9wL
W9wYWNpdHk9Ii4yIiBpZD0ic3RvcDE3Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLW9wYWNpdHk9IjAiIGlkPSJzdG9wMTgiLz48L3JhZGlhbEdyYWRpZW50PjxjaXJjbGUgY3g9IjIyLjg5MDk1OSIgY3k9Ijc1LjIyMDU3MyIgZ
mlsbD0idXJsKCNzUXk3T3ZQWEgwdDJtS2ZxazdYdVhnKSIgaWQ9ImNpcmNsZTE4IiBzdHlsZT0iZmlsbDp1cmwoI3NReTdPdlBYSDB0Mm1LZnFrN1h1WGcpO3N0cm9rZS13aWR0aDoyLjAxNTExIiByPSI1LjAzNzc4MDMiLz48Y
2lyY2xlIGN4PSI3My4yNjg3NTMiIGN5PSI3NS4yMjA1NzMiIGZpbGw9IiM1MGU2ZmYiIGlkPSJjaXJjbGUxOSIgc3R5bGU9InN0cm9rZS13aWR0aDoyLjAxNTExIiByPSIzLjAyMjY2ODQiLz48Y2lyY2xlIGN4PSI2MS4xNzgwO
DIiIGN5PSI3NS4yMjA1NzMiIGZpbGw9IiM1MGU2ZmYiIGlkPSJjaXJjbGUyMCIgc3R5bGU9InN0cm9rZS13aWR0aDoyLjAxNTExIiByPSIzLjAyMjY2ODQiLz48Y2lyY2xlIGN4PSI0OS4wODc0MTQiIGN5PSI3NS4yMjA1NzMiI
GZpbGw9IiM1MGU2ZmYiIGlkPSJjaXJjbGUyMSIgc3R5bGU9InN0cm9rZS13aWR0aDoyLjAxNTExIiByPSIzLjAyMjY2ODQiLz48Y2lyY2xlIGN4PSIyMi44OTA5NTkiIGN5PSI3NS4yMjA1NzMiIGZpbGw9IiM1MGU2ZmYiIGlkP
SJjaXJjbGUyMiIgc3R5bGU9InN0cm9rZS13aWR0aDoyLjAxNTExIiByPSIzLjAyMjY2ODQiLz48cGF0aCBmaWxsPSJ1cmwoI2V3dzZmU0hYTEczaDRZZUFxZzl1X2EpIiBkPSJtIDQzLjExMTQ2NywzMy42NzAxOTcgdiAxMy4wN
zgwMjYgaCAyLjQ4ODcyOSB2IDMuNDE0NzQxIGggLTIuNDg4NzI5IHYgNC4yNTI0NTEgSCAzOC45NDQ5OTQgViA1MC4xNjI5NjQgSCAyOS45MDMzMSB2IC0zLjU3MzkxNyBjIDAuODAwNTI5LC0wLjg5NTgwNSAxLjYzMDEwNSwtM
S44Nzc1ODQgMi40ODg3MjcsLTIuOTQzMDIxIDAuODU4NjI0LC0xLjA2NTQzNiAxLjY4ODIwMSwtMi4xNjIyNDMgMi40ODg3MzEsLTMuMjkxNTgyIDAuODAwNTMsLTEuMTI5MzM5IDEuNTQ1Mjg4LC0yLjI2MzMyNiAyLjIzNTQ0L
C0zLjQwNzc3IDAuNjkwMTUyLC0xLjE0MjEyIDEuMjc1NzM2LC0yLjIzNTQ0MSAxLjc1NzkxMywtMy4yNzY0NzcgeiBtIC05LjExMzcyMiwxMy4wNzgwMjYgaCA0Ljk0NzI0OSBWIDM5LjUwMTYzIGMgLTAuMzM4MTA1LDAuNjI2M
jQ4IC0wLjcwNDA5MywxLjI2MDYzIC0xLjA5OTEzLDEuOTAxOTg0IC0wLjM5NjE5OCwwLjY0MjUxNCAtMC44MDk4MjYsMS4yNzM0MTIgLTEuMjQ0MzY0LDEuODk2MTc0IC0wLjQzMzM3NywwLjYyMTYwMiAtMC44NzI1NjYsMS4yM
jQ2MTQgLTEuMzE2NDAxLDEuODA3ODcxIC0wLjQ0MzgzNSwwLjU4MjEgLTAuODcyNTY1LDEuMTI5MzQgLTEuMjg3MzU0LDEuNjQwNTY0IHogbSAzMS43ODMwMDEsNi4yNzg3NTQgYyAtMi4wMjUxNDIsMS4xNjc2ODIgLTQuNTQyO
TE5LDEuNzUwOTQzIC03LjU1MjE2NiwxLjc1MDk0MyAtMy4zMzY4OTUsMCAtNS45NjczNzQsLTAuOTIzNjg4IC03Ljg5MTQzMywtMi43NzEwNjQgLTEuOTI0MDU5LC0xLjg0NjIxNyAtMi44ODQ5MjcsLTQuMzg5NTUzIC0yLjg4N
DkyNywtNy42MzAwMTMgMCwtMy4yNjAyMTIgMS4wNTAzMzIsLTUuOTE3NDEzIDMuMTUzMzIsLTcuOTcxNjAyIDIuMTAyOTg3LC0yLjA1NDE4OSA0Ljg5OTYxMiwtMy4wODEyODMgOC4zOTEwMzcsLTMuMDgxMjgzIDIuMTk5NDIzL
DAgNC4xMzc0MjQsMC4zMDQ0MTEgNS44MTYzMjksMC45MTIwNyB2IDQuMzgyNTggYyAtMS42MDIyMTksLTAuOTI2MDEzIC0zLjU1ODgxMiwtMS4zODg0MzkgLTUuODc0NDIyLC0xLjM4ODQzOSAtMS45MzkxNjUsMCAtMy41MTY5O
DQsMC42Mjk3MzYgLTQuNzM4MTE0LDEuODg4MDQ0IC0xLjIxOTk2NCwxLjI1ODMwNiAtMS44Mjk5NDcsMi45MzgzNzEgLTEuODI5OTQ3LDUuMDQxMzYgMCwyLjEzMjAzNiAwLjU0ODQwNCwzLjc4MDczIDEuNjQyODg3LDQuOTQ4N
DEzIDEuMDkzMzIxLDEuMTY2NTE4IDIuNTcyMzg0LDEuNzUwOTM4IDQuNDMzNzAyLDEuNzUwOTM4IDEuMTE3NzIsMCAyLjAwNTM5MiwtMC4xNjAzNDEgMi42NjE4NDgsLTAuNDc3NTI5IHYgLTQuMDUwMjgzIGggLTQuMTUzNjkyI
HYgLTMuNzMzMDk1IGggOC44MjU1NzggeiIgaWQ9InBhdGgyIiBzdHlsZT0iZmlsbDp1cmwoI2V3dzZmU0hYTEczaDRZZUFxZzl1X2EpO3N0cm9rZS13aWR0aDoxLjE2MTg3Ii8+PHBhdGggZmlsbD0iIzUwZTZmZiIgZD0ibSA1N
y4yNTcyNTUsMjYuODQ2NTIzIC03LjY0MDQ2OCw0Ljc5MDM5NiBjIC0wLjc1NTIxOSwwLjQ3NDA0MyAtMS43MTYwODYsMC40NzI4ODMgLTIuNDcxMzAyLC0wLjAwMTIgbCAtNy42MTgzOTMsLTQuNzg5MjM3IGMgMS45MDU0NywtM
y4wMjA4NjYgNS4yOTgxMzUsLTQuOTAzMDk4IDguODY1MDgxLC00LjkwMzA5OCAzLjU2Njk0NywwIDYuOTU5NjEzLDEuODgyMjMyIDguODY1MDgyLDQuOTAzMDk4IHoiIGlkPSJwYXRoMyIgc3R5bGU9InN0cm9rZS13aWR0aDoxL
jE2MTg3Ii8+PHBhdGggZmlsbD0iIzE5OWJlMiIgZD0ibSA2Ny4wOTk0NywyMC42ODI3OTIgLTYuODg5ODk3LDQuMzIxMDAyIGMgLTUuNTY2NTI4LC04LjgxNjI4NCAtMTguMjU1MzMsLTguNDg1MTQ4IC0yMy42MzQ3OTgsMCBsI
C0zLjkzNzU4MSwtMi40Njg5NzcgLTIuOTUzNDc5LC0xLjg1MjAyNSB2IC0wLjAwMTIgQyAzOC4zMTUyNiw2Ljk0MzU5MDEgNTguNDI5NTg0LDYuODk3MTE1NCA2Ny4wOTk0NywyMC42ODI3OTIgWiIgaWQ9InBhdGg0IiBzdHlsZ
T0ic3Ryb2tlLXdpZHRoOjEuMTYxODciLz48cGF0aCBmaWxsPSIjMDA3OGQ0IiBkPSJtIDcwLjIxNzkzNSwxNi45ODY4NzkgYyAwLjQ3MDU1NywwLjY2MzQzIDAuMzA2NzMzLDEuNTgyNDcgLTAuMzgyMjU2LDIuMDEzNTI1IGwgL
TMuNzA2MzcxLDIuMzIxNDE4IHYgLTAuMDAxMiBjIC04LjAzMzE4MiwtMTIuNzgxNzQ5NyAtMjcuMDYzNDc5LC0xMy4zNTMzOTA1IC0zNS40NzA3ODIsMCB2IDAuMDAxMiBMIDI2Ljk1MjE1NSwxOS4wMDA0MDQgQyAyNi4yNjMxN
jUsMTguNTY5MzQ5IDI2LjA5OTM0MywxNy42NTAzMDkgMjYuNTY4NzM5LDE2Ljk4Njg3OSAzMS41MzkyMjQsOS45NzQ5ODM1IDM5Ljc2NzYsNS42NzcyMiA0OC4zOTIxNzMsNS42NzcyMiBjIDguNjI0NTc2LDAgMTYuODUyOTUsN
C4yOTc3NjM1IDIxLjgyNTc2MiwxMS4zMDk2NTkgeiIgaWQ9InBhdGg1LTciIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xNjE4NyIvPjxwYXRoIGZpbGw9IiMzNWMxZjEiIGQ9Im0gNjEuMTkzNjc3LDI0LjM4Njg0MSAtNC45MjE2O
DksMy4wODU5MyBjIC0zLjc1MDUyMSwtNS45MTc0MTMgLTEyLjE3NTI1NSwtNS42MjQ2MjEgLTE1Ljc1OTYyOSwwIGwgLTQuOTIxNjg3LC0zLjA4NTkzIDAuMDAyNCwtMC4wMDM0IGMgNS44MTA1MjEsLTkuMjExMzIgMTkuNTMxMDY0LC05LjU2OTE3NiAyNS41OTYwMzQsLTAuMDAzNCB6IiBpZD0icGF0aDYiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xNjE4NyIvPjwvc3ZnPgo=</data><downloads_count>0</downloads_count></logo>
</NetworkDeviceType>
<NetworkDeviceType alias="NetworkDeviceType" id="11">
<name>Switch</name>
<logo><mimetype>image/svg+xml</mimetype><filename>icons8-switch.svg</filename><data>PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3
Qm94PSIwIDAgNDggNDgiIHdpZHRoPSIyNDBweCIgaGVpZ2h0PSIyNDBweCI+PGxpbmVhckdyYWRpZW50IGlkPSJGcnRMVXlMNHo1VUU5blBZQV9HelFhIiB4MT0iMTEuMjM1IiB4Mj0iNDIuNzIxIiB5MT0iNDEuMjk3IiB5Mj0i
LTEuNjM5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgNDcuODkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMjFhZDY0Ii8+PHN0b3Ag
b2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDg4MjQyIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBmaWxsPSJ1cmwoI0ZydExVeUw0ejVVRTluUFlBX0d6UWEpIiBkPSJNMzgsNDJIMTBjLTIuMiwwLTQtMS44LTQtNFYxMGMwLTIu
MiwxLjgtNCw0LTRoMjhjMi4yLDAsNCwxLjgsNCw0djI4QzQyLDQwLjIsNDAuMiw0MiwzOCw0MnoiLz48cGF0aCBkPSJNMTQuOTMsMjZjLTAuNDE5LDAtMC44MTUtMC4xNjItMS4xMTctMC40NTVMOS42MzIsMjEuNDkgQzkuMjI1
LDIxLjA5Myw5LDIwLjU2NCw5LDIwczAuMjI1LTEuMDkzLDAuNjMyLTEuNDg5bDQuMTgxLTQuMDU3QzE0LjExNSwxNC4xNjEsMTQuNTEyLDE0LDE0LjkzLDE0YzAuODg1LDAsMS42MDQsMC43MSwxLjYwNCwxLjU4MyBWMTdoNC43
MTZjMC45NjUsMCwxLjc1LDAuNzc1LDEuNzUsMS43Mjh2Mi41NDVDMjMsMjIuMjI1LDIyLjIxNSwyMywyMS4yNSwyM2gtNC43MTZ2MS40MTdjMCwwLjQ0OS0wLjE4MywwLjg2Mi0wLjUxNSwxLjE2NCBDMTUuNzIxLDI1Ljg1MSwx
NS4zMzQsMjYsMTQuOTMsMjZ6IiBvcGFjaXR5PSIuMDUiLz48cGF0aCBkPSJNMTQuOTMsMjUuNWMtMC4yODcsMC0wLjU2MS0wLjExMS0wLjc2OS0wLjMxM0w5Ljk4LDIxLjEzMSBDOS42NzEsMjAuODMsOS41LDIwLjQyOCw5LjUs
MjBzMC4xNzEtMC44MywwLjQ4LTEuMTNsNC4xODEtNC4wNTdjMC4yMDgtMC4yMDIsMC40ODEtMC4zMTMsMC43NjktMC4zMTMgYzAuNjA5LDAsMS4xMDQsMC40ODYsMS4xMDQsMS4wODNWMTcuNWg1LjIxNmMwLjY4OSwwLDEuMjUs
MC41NTEsMS4yNSwxLjIyOHYyLjU0NWMwLDAuNjc3LTAuNTYxLDEuMjI4LTEuMjUsMS4yMjhoLTUuMjE2djEuOTE3IGMwLDAuMzA3LTAuMTI1LDAuNTg5LTAuMzUxLDAuNzk0QzE1LjQ3OCwyNS4zOTcsMTUuMjEsMjUuNSwxNC45
MywyNS41TDE0LjkzLDI1LjV6IiBvcGFjaXR5PSIuMDciLz48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTUuNTM0LDI0LjQxN1YyMmg1LjcxNmMwLjQxNCwwLDAuNzUtMC4zMjYsMC43NS0wLjcyOHYtMi41NDRDMjIsMTguMzI2LDIx
LjY2NCwxOCwyMS4yNSwxOGgtNS43MTYgdi0yLjQxN2MwLTAuNTE5LTAuNjQ2LTAuNzc4LTEuMDI0LTAuNDEybC00LjE4LDQuMDU2Yy0wLjQzOSwwLjQyNi0wLjQzOSwxLjExOCwwLDEuNTQ0bDQuMTgsNC4wNTYgQzE0Ljg4OCwy
NS4xOTUsMTUuNTM0LDI0LjkzNSwxNS41MzQsMjQuNDE3eiIvPjxwYXRoIGQ9Ik0xNC45MywzOWMtMC40MTksMC0wLjgxNS0wLjE2Mi0xLjExNy0wLjQ1NUw5LjYzMiwzNC40OSBDOS4yMjUsMzQuMDkzLDksMzMuNTY0LDksMzNz
MC4yMjUtMS4wOTMsMC42MzItMS40ODlsNC4xODEtNC4wNTdDMTQuMTE1LDI3LjE2MSwxNC41MTIsMjcsMTQuOTMsMjdjMC44ODUsMCwxLjYwNCwwLjcxLDEuNjA0LDEuNTgzIFYzMGg0LjcxNmMwLjk2NSwwLDEuNzUsMC43NzUs
MS43NSwxLjcyOHYyLjU0NUMyMywzNS4yMjUsMjIuMjE1LDM2LDIxLjI1LDM2aC00LjcxNnYxLjQxN2MwLDAuNDQ5LTAuMTgzLDAuODYyLTAuNTE1LDEuMTY0IEMxNS43MjEsMzguODUxLDE1LjMzNCwzOSwxNC45MywzOXoiIG9w
YWNpdHk9Ii4wNSIvPjxwYXRoIGQ9Ik0xNC45MywzOC41Yy0wLjI4NywwLTAuNTYxLTAuMTExLTAuNzY5LTAuMzEzTDkuOTgsMzQuMTMxIEM5LjY3MSwzMy44Myw5LjUsMzMuNDI4LDkuNSwzM3MwLjE3MS0wLjgzLDAuNDgtMS4x
M2w0LjE4MS00LjA1N2MwLjIwOC0wLjIwMiwwLjQ4MS0wLjMxMywwLjc2OS0wLjMxMyBjMC42MDksMCwxLjEwNCwwLjQ4NiwxLjEwNCwxLjA4M1YzMC41aDUuMjE2YzAuNjg5LDAsMS4yNSwwLjU1MSwxLjI1LDEuMjI4djIuNTQ1
YzAsMC42NzctMC41NjEsMS4yMjgtMS4yNSwxLjIyOGgtNS4yMTZ2MS45MTcgYzAsMC4zMDctMC4xMjUsMC41ODktMC4zNTEsMC43OTRDMTUuNDc4LDM4LjM5NywxNS4yMSwzOC41LDE0LjkzLDM4LjVMMTQuOTMsMzguNXoiIG9w
YWNpdHk9Ii4wNyIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xNS41MzQsMzcuNDE3VjM1aDUuNzE2YzAuNDE0LDAsMC43NS0wLjMyNiwwLjc1LTAuNzI4di0yLjU0NEMyMiwzMS4zMjYsMjEuNjY0LDMxLDIxLjI1LDMxaC01Ljcx
NiB2LTIuNDE3YzAtMC41MTktMC42NDYtMC43NzgtMS4wMjQtMC40MTJsLTQuMTgsNC4wNTZjLTAuNDM5LDAuNDI2LTAuNDM5LDEuMTE4LDAsMS41NDRsNC4xOCw0LjA1NiBDMTQuODg4LDM4LjE5NSwxNS41MzQsMzcuOTM1LDE1
LjUzNCwzNy40MTd6Ii8+PHBhdGggZD0iTTMzLjA3LDM0Yy0wLjg4NSwwLTEuNjA0LTAuNzEtMS42MDQtMS41ODNWMzFIMjYuNzUgQzI1Ljc4NSwzMSwyNSwzMC4yMjUsMjUsMjkuMjcydi0yLjU0NUMyNSwyNS43NzUsMjUuNzg1
LDI1LDI2Ljc1LDI1aDQuNzE2di0xLjQxN2MwLTAuODczLDAuNzItMS41ODMsMS42MDQtMS41ODMgYzAuNDE5LDAsMC44MTUsMC4xNjIsMS4xMTcsMC40NTVsNC4xODEsNC4wNTVDMzguNzc1LDI2LjkwNywzOSwyNy40MzYsMzks
MjhzLTAuMjI1LDEuMDkzLTAuNjMyLDEuNDg5bC00LjE4MSw0LjA1NyBDMzMuODg1LDMzLjgzOSwzMy40ODgsMzQsMzMuMDcsMzR6IiBvcGFjaXR5PSIuMDUiLz48cGF0aCBkPSJNMzMuMDcsMzMuNWMtMC42MDksMC0xLjEwNC0w
LjQ4Ni0xLjEwNC0xLjA4M1YzMC41SDI2Ljc1IGMtMC42ODksMC0xLjI1LTAuNTUxLTEuMjUtMS4yMjh2LTIuNTQ1YzAtMC42NzcsMC41NjEtMS4yMjgsMS4yNS0xLjIyOGg1LjIxNnYtMS45MTdjMC0wLjU5OCwwLjQ5NS0xLjA4
MywxLjEwNC0xLjA4MyBjMC4yODcsMCwwLjU2MSwwLjExMSwwLjc2OSwwLjMxM2w0LjE4MSw0LjA1NmMwLjMxLDAuMzAxLDAuNDgsMC43MDMsMC40OCwxLjEzMXMtMC4xNzEsMC44My0wLjQ4LDEuMTNsLTQuMTgxLDQuMDU3IEMz
My42MzEsMzMuMzg5LDMzLjM1NywzMy41LDMzLjA3LDMzLjVMMzMuMDcsMzMuNXoiIG9wYWNpdHk9Ii4wNyIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0zMi40NjYsMjMuNTgzVjI2SDI2Ljc1QzI2LjMzNiwyNiwyNiwyNi4zMjYs
MjYsMjYuNzI4djIuNTQ0QzI2LDI5LjY3NCwyNi4zMzYsMzAsMjYuNzUsMzBoNS43MTYgdjIuNDE3YzAsMC41MTksMC42NDYsMC43NzgsMS4wMjQsMC40MTJsNC4xOC00LjA1NmMwLjQzOS0wLjQyNiwwLjQzOS0xLjExOCwwLTEu
NTQ0bC00LjE4LTQuMDU2IEMzMy4xMTIsMjIuODA1LDMyLjQ2NiwyMy4wNjUsMzIuNDY2LDIzLjU4M3oiLz48cGF0aCBkPSJNMzMuMDcsMjFjLTAuODg1LDAtMS42MDQtMC43MS0xLjYwNC0xLjU4M1YxOEgyNi43NSBDMjUuNzg1
LDE4LDI1LDE3LjIyNSwyNSwxNi4yNzJ2LTIuNTQ1QzI1LDEyLjc3NSwyNS43ODUsMTIsMjYuNzUsMTJoNC43MTZ2LTEuNDE3QzMxLjQ2Niw5LjcxLDMyLjE4Niw5LDMzLjA3LDkgYzAuNDE5LDAsMC44MTUsMC4xNjIsMS4xMTcs
MC40NTVsNC4xODEsNC4wNTVDMzguNzc1LDEzLjkwNywzOSwxNC40MzYsMzksMTVzLTAuMjI1LDEuMDkzLTAuNjMyLDEuNDg5bC00LjE4MSw0LjA1NyBDMzMuODg1LDIwLjgzOSwzMy40ODgsMjEsMzMuMDcsMjF6IiBvcGFjaXR5
PSIuMDUiLz48cGF0aCBkPSJNMzMuMDcsMjAuNWMtMC42MDksMC0xLjEwNC0wLjQ4Ni0xLjEwNC0xLjA4M1YxNy41SDI2Ljc1IGMtMC42ODksMC0xLjI1LTAuNTUxLTEuMjUtMS4yMjh2LTIuNTQ1YzAtMC42NzcsMC41NjEtMS4y
MjgsMS4yNS0xLjIyOGg1LjIxNnYtMS45MTdjMC0wLjU5OCwwLjQ5NS0xLjA4MywxLjEwNC0xLjA4MyBjMC4yODcsMCwwLjU2MSwwLjExMSwwLjc2OSwwLjMxM2w0LjE4MSw0LjA1NmMwLjMxLDAuMzAxLDAuNDgsMC43MDMsMC40
OCwxLjEzMXMtMC4xNzEsMC44My0wLjQ4LDEuMTNsLTQuMTgxLDQuMDU3IEMzMy42MzEsMjAuMzg5LDMzLjM1NywyMC41LDMzLjA3LDIwLjVMMzMuMDcsMjAuNXoiIG9wYWNpdHk9Ii4wNyIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9
Ik0zMi40NjYsMTAuNTgzVjEzSDI2Ljc1QzI2LjMzNiwxMywyNiwxMy4zMjYsMjYsMTMuNzI4djIuNTQ0QzI2LDE2LjY3NCwyNi4zMzYsMTcsMjYuNzUsMTdoNS43MTYgdjIuNDE3YzAsMC41MTksMC42NDYsMC43NzgsMS4wMjQs
MC40MTJsNC4xOC00LjA1NmMwLjQzOS0wLjQyNiwwLjQzOS0xLjExOCwwLTEuNTQ0bC00LjE4LTQuMDU2IEMzMy4xMTIsOS44MDUsMzIuNDY2LDEwLjA2NSwzMi40NjYsMTAuNTgzeiIvPjwvc3ZnPgo=</data><downloads_count>0</downloads_count></logo>
</NetworkDeviceType>
<NetworkDeviceType alias="NetworkDeviceType" id="12">
<name>Wireless Access Point</name>
<logo><mimetype>image/png</mimetype><filename>icons8-wi-fi-router-96.png</filename><data>iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAIXUlEQVR
4nO1af3ATVR5/WBR1bkA5HWJrmdO7Ob3zZA4snbkRb+6PE8VqkxbK6D/3D3OcowKXhutuEmA3FGkibZOg2NCCDtzNKYwO6nj+GKu0OKMz/vinuwntAf2RJqlQ2iTciW2B+968xcBm+yO7yW7S3b7PzGemk7zse+/zee/78nkNQgQ
EBAQEBAQEBAQEBAQEslFztAghmCf/AwTKBa7jyxHd9SyieC+i+Y8QxfUgij+HaP4ionn4kRcRzQ0jmu9GNPcBorlmVMf/BTlCKxADNxDZlcDetQTR/AuI5t9DNJ8QiZwtRxHFHRNMpEM/JWZMhY3f3IjquKcRxf0LUfwlFUSfmhQ
3jijuXWTn1yHm+HxixqZ/L0AU9ydEcac0E31acn2I4rYg6xe3zD0jcF0WSgJ/Nv/CTzJiCNn5P8+dswIfjDT3ZeGF56Xl6VtEd/0OGRa45tJcA6K4KwUXm57WhCvCGA13Pji5UkRzn6st2Dx7EObZtTCC/wrRXfciQ4DiVyGaG8l
aZEcQFtR3w088p+B2by/cua8fluwfgLvaMMMCTa1hWBIYgDte6YPbvGeEtgt2dudoDjcijF3XoIJmSWCSvbJv3d0Di/f2CeKmhFZKU+sALPb3wi0v9gjPzMKIi8getCBdguafQTR/WcmEi7aFYFHTaTAJKzysKvGuWdh4GoqcIaU
m4Dk8g3QHiv9O7iRvcAZhUePpnFa7kl2xcM8poU8FZ0IE6Q4U3ytncjfv6hbqt9bCT9oRgX64ub5brgkhpDvUcY8J0X+GVb/Y15t34aXEhzY+6Gc8ByjuD0iXqAuuQTQ3Jp3U/O0huHNfX8HFTxF/s8Lnz9R3R10VSNegg0+ITbj
JdRJM+9URruTgIJQcVK8k3cicTBef5p5EhgBeRTQ3dhOLxe//n1Jxig+G4Z43huBX7wzDsg9H4KHPErCyM5nGFZ/Ghffuf+cc3PPPGBQfGFRsAh6bYMLVW9OnkJFQtJ1ba2od+I8SQX729yg88P4wlHVMFjwTy44n4dfvDcPSwxF
lJrSGR4scIZ2XnWlg2j+49q628EQmEZYejsCDH4woFn06/ub981B6KLMRptbweHHbgLFWvhSmtsHq6UwoPhCGX759NqsVn3FHdCSEZxfPZfFTWHKgv8LUFh4TC3D3axFY9vGo6sJLiXcWPrznrPhTmVB6KALL2+Oai5/ibz8ZhZL
XI3NXfLEJJa8Nji9vj0/kS/wUl7fHL5YcHJyYs+Kn8NCnIzUrOxKKDSjH/PyCwKzOhM7ED8s+HjWe+DaHq6LWwfTbnEzE5nCtkfOZss74WjkmrPr6e3j05Dg82X8FLFEAS+wqzVGAir4r8GhoHB7+6r+yxF95PPG4/PmwUWFOMud
TUAjCO1m4SiZWI/x6LTcTHvnme0HglOCZWNF7GVZNY4QgfmfiMTljwmOvdbBD1+bjYMJotgOLft0AFmqdjOz/KpV1xKvFJpSfSMLq7gnZwkv5x9C4UKquG5AYW3kiKft64W921yPiueC5odmOWgdzOG3QDtaj5PNlP5qAa/uaM5e
zFj/FNacvCUZi8cs7k4oSrs3B7kk3gD2EZjtsdmZ9ugGM4rv0so549RO9l6O5ip/i46cmBso7E6sVz8XJnkzfza4aNNuxiWEW1jrYcfHArTTzC6XPscSg2hyFCRUMGKsaAsV3O1ud9T+XlJ+JLQxzG9IDbE6mPW3lbGO3ZPMcyxC
st0ThUrbim2PwgyUKq7OawzbWmjYHB/sJ0guw4JLV057tsypjsC6bnWCOwbhlCLK+z7c5mc8kpXQz0gv+SjP3qrl9K2OwTslOwOKbI5B1yKIo9yI85lzLaEFR62SDaSbYmfW5PK9Spgm5io9hszNPpx++bBDpDfjrZ3oNZQ7n+sz
KDCZg8SsjUJn72Jl/SLKMG+kNOIBJ8sAIwzDztTLBrJL4Qvp1MufFY99qdz2M9AY8EZuDHc42FSsxQThwo2BGKsDmZH4vGfN5udcphkvFM8EcBYs5BoOWKPRWxUDWxZph06+WqTjf0GX61ToV5wu6Tr9ap+J8QNfpNx+pWGvoOv3
mKxVrBUOk33ylYi1giPSbz1SsNgyRfvOditWCYdJvIVKxGjBU+i1EKs4Vhkq/ekzFNiOlX72l4q1GTL96SsU2I6ZfPaVim57Sb2PjvlK3P/CW299yweMPAGHgmgZYE7e/5ZjH++p9GorfMkJED8y88HyBUayV6gbglU/ED8ja9W5
/y1ENDCBlxyPXAF8gqboB0k4kwWXO0yPRR30DfC0gJhGdTdNAqo/qBrh9LSDmTAZY7dthc51DoNW+QzOzrAr70bK9VB/VDWjwvgpiTj0QBp63UbBxkxU2PLdZIP4bv4bfU098RmE/Wrdn07TBLIgBeIAbNllh/ZGPoKonAVU9ceH
vDdcGr44BzyvsR+v2eTFgd/M+EHOq7YpXCR6o9Fdr+DX8nhrlyKqwH63bpyjVJ+8G4DqJtypeMdKBV/Ukhfdwm1wN2KywH63b582AF5teATGnFyY+aeDV3XENDIjL6kfr9ilK9VHfgMaXQczJpWHHtFu35s0PVSxBOxT1o3X7awZ
I9FHdgF2NL4OYU4mTfnjF83QIxxUequq3x5Tqo74Be/aCmFOLM3e/hu6S6KO6AfV79oKYmcpEfoLYDoXBSrv2Un3UN+AlP4iplag2nVKqj+oG7HzJD2IWesK2WUapPqob4HL7Luz0+IDQl1EDl8eXUN+AhuZjLrcXCL0ZNWAbvEd
UN2Cnx3sf624eJQZ4Zxbf3XyecfvvRlqgvr6xlGloPso2NCXZhmYgbBZp0JRkdzcd0Ux8AgICAgICAgICAgICAgICAgKkd/wfA+F5ouAmxqQAAAAASUVORK5CYII=</data><downloads_count>0</downloads_count></logo>
</NetworkDeviceType>
</Set>

View File

@@ -1068,7 +1068,7 @@
<item id="col:col1">
<rank>10</rank>
<items>
<item id="fieldset:Server:baseinfo">
<item id="fieldset:ConfigMgmt:baseinfo">
<rank>10</rank>
<items>
<item id="name">
@@ -1131,7 +1131,7 @@
<item id="col:col2">
<rank>20</rank>
<items>
<item id="fieldset:Server:Date">
<item id="fieldset:ConfigMgmt:dates">
<rank>10</rank>
<items>
<item id="move2production">
@@ -1159,7 +1159,7 @@
</item>
</items>
</item>
<item id="fieldset:Server:otherinfo">
<item id="fieldset:ConfigMgmt:otherinfo">
<rank>30</rank>
<items>
<item id="description">
@@ -1283,7 +1283,39 @@
</items>
</summary>
</presentation>
<methods/>
<methods>
<method id="GetIcon">
<comment> /**
* Overrides the GetIcon method to return the logo of the associated NetworkDeviceType if any, otherwise the default icon of the class will be returned
*
*/</comment>
<static>false</static>
<access>public</access>
<type>Custom</type>
<code><![CDATA[ public function GetIcon($bImgTag = true)
{
$sIconClass = 'NetworkDeviceType'; // the class storing the image which will be used as icon for the current object
$sExtKeyCode = 'networkdevicetype_id'; // the external key attribute code pointing to the class storing the image attribute
$sIconAttCode = 'logo'; // the attribute code of the image in the IconClass
$iObj = $this->Get($sExtKeyCode);
if ($iObj > 0) {
$oObj = MetaModel::GetObject($sIconClass, $iObj, true, true);
$oImage = $oObj->Get($sIconAttCode);
$sIconUrl = $oImage->IsEmpty() ? '' : $oImage->GetDisplayURL($sIconClass, $iObj, $sIconAttCode);
if (strlen($sIconUrl) > 0) {
if ($bImgTag) {
return "<img src=\"$sIconUrl\" alt=''/>";
} else {
return $sIconUrl;
}
}
}
// Return the default image
return parent::GetIcon($bImgTag);
}]]></code>
</method>
</methods>
<relations>
<relation id="impacts">
<neighbours>
@@ -1419,7 +1451,7 @@
<item id="col:col1">
<rank>120</rank>
<items>
<item id="fieldset:Server:baseinfo">
<item id="fieldset:ConfigMgmt:baseinfo">
<rank>10</rank>
<items>
<item id="name">
@@ -1488,7 +1520,7 @@
<item id="col:col2">
<rank>130</rank>
<items>
<item id="fieldset:Server:Date">
<item id="fieldset:ConfigMgmt:dates">
<rank>10</rank>
<items>
<item id="move2production">
@@ -1516,7 +1548,7 @@
</item>
</items>
</item>
<item id="fieldset:Server:otherinfo">
<item id="fieldset:ConfigMgmt:otherinfo">
<rank>30</rank>
<items>
<item id="description">
@@ -1749,20 +1781,25 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="move2production">
<rank>50</rank>
</item>
<item id="logo">
<rank>60</rank>
</item>
<item id="description">
<rank>70</rank>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
<item id="logo">
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
@@ -1937,20 +1974,25 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="move2production">
<rank>50</rank>
</item>
<item id="logo">
<rank>60</rank>
</item>
<item id="description">
<rank>70</rank>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
<item id="logo">
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
@@ -2330,18 +2372,18 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:Server:Date">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="move2production">
<rank>90</rank>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:Server:otherinfo">
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>100</rank>
<rank>10</rank>
</item>
</items>
<rank>20</rank>
@@ -2514,18 +2556,18 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:Server:Date">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="move2production">
<rank>90</rank>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:Server:otherinfo">
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>100</rank>
<rank>10</rank>
</item>
</items>
<rank>20</rank>
@@ -2698,18 +2740,18 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:Server:Date">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="move2production">
<rank>90</rank>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:Server:otherinfo">
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>100</rank>
<rank>10</rank>
</item>
</items>
<rank>20</rank>
@@ -2874,18 +2916,18 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:Server:Date">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="move2production">
<rank>90</rank>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:Server:otherinfo">
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>100</rank>
<rank>10</rank>
</item>
</items>
<rank>20</rank>
@@ -3037,18 +3079,18 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:Server:Date">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="move2production">
<rank>90</rank>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:Server:otherinfo">
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>100</rank>
<rank>10</rank>
</item>
</items>
<rank>20</rank>
@@ -3198,7 +3240,7 @@
</items>
<rank>10</rank>
</item>
<item id="fieldset:ConfigMgmt:moreinfo">
<item id="fieldset:Software:moreinfo">
<items>
<item id="middleware_id">
<rank>30</rank>
@@ -3211,20 +3253,25 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="move2production">
<rank>50</rank>
</item>
<item id="logo">
<rank>60</rank>
</item>
<item id="description">
<rank>70</rank>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
<item id="logo">
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
@@ -3363,7 +3410,7 @@
</items>
<rank>10</rank>
</item>
<item id="fieldset:ConfigMgmt:moreinfo">
<item id="fieldset:Software:moreinfo">
<items>
<item id="dbserver_id">
<rank>10</rank>
@@ -3376,17 +3423,22 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="move2production">
<rank>50</rank>
</item>
<item id="description">
<rank>60</rank>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
</items>
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
@@ -3557,20 +3609,25 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="move2production">
<rank>50</rank>
</item>
<item id="logo">
<rank>60</rank>
</item>
<item id="description">
<rank>70</rank>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
<item id="logo">
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
@@ -3769,21 +3826,46 @@
<presentation>
<details>
<items>
<item id="name">
<item id="col:col1">
<items>
<item id="fieldset:ConfigMgmt:baseinfo">
<items>
<item id="name">
<rank>10</rank>
</item>
<item id="version">
<rank>20</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:Software:moreinfo">
<items>
<item id="vendor">
<rank>30</rank>
</item>
<item id="type">
<rank>40</rank>
</item>
</items>
<rank>20</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="version">
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="logo">
<rank>20</rank>
</item>
</items>
<rank>10</rank>
</item>
</items>
<rank>20</rank>
</item>
<item id="vendor">
<rank>30</rank>
</item>
<item id="type">
<rank>40</rank>
</item>
<item id="logo">
<rank>50</rank>
</item>
<item id="documents_list">
<rank>60</rank>
</item>
@@ -3903,13 +3985,33 @@
<presentation>
<details>
<items>
<item id="name">
<item id="col:col1">
<items>
<item id="fieldset:ConfigMgmt:baseinfo">
<items>
<item id="name">
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="documents_list">
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
</items>
<rank>20</rank>
</item>
<item id="description">
<item id="documents_list">
<rank>30</rank>
</item>
</items>
@@ -3993,21 +4095,46 @@
<presentation>
<details>
<items>
<item id="name">
<item id="col:col1">
<items>
<item id="fieldset:ConfigMgmt:baseinfo">
<items>
<item id="name">
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:Software:moreinfo">
<items>
<item id="osversion_id">
<rank>10</rank>
</item>
</items>
<rank>20</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="documents_list">
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
</items>
<rank>20</rank>
</item>
<item id="functionalcis_list">
<item id="documents_list">
<rank>30</rank>
</item>
<item id="osversion_id">
<item id="functionalcis_list">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
</items>
</details>
<search>
@@ -4095,18 +4222,43 @@
<presentation>
<details>
<items>
<item id="name">
<item id="col:col1">
<items>
<item id="fieldset:ConfigMgmt:baseinfo">
<items>
<item id="name">
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:Software:moreinfo">
<items>
<item id="software_id">
<rank>10</rank>
</item>
</items>
<rank>20</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="documents_list">
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
</items>
<rank>20</rank>
</item>
<item id="software_id">
<item id="documents_list">
<rank>30</rank>
</item>
<item id="description">
<rank>40</rank>
</item>
<item id="softwareinstances_list">
<rank>50</rank>
</item>
@@ -4460,20 +4612,25 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="start_date">
<rank>70</rank>
<rank>10</rank>
</item>
<item id="end_date">
<rank>80</rank>
</item>
<item id="description">
<rank>90</rank>
<rank>20</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
</items>
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
@@ -4636,7 +4793,7 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="start_date">
<rank>70</rank>
@@ -4644,12 +4801,17 @@
<item id="end_date">
<rank>80</rank>
</item>
<item id="description">
<rank>90</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
</items>
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
@@ -5313,6 +5475,13 @@
</reconciliation>
</properties>
<fields>
<field id="logo" xsi:type="AttributeImage">
<display_max_width>96</display_max_width>
<display_max_height>96</display_max_height>
<storage_max_width>128</storage_max_width>
<storage_max_height>128</storage_max_height>
<is_null_allowed>true</is_null_allowed>
</field>
<field id="networkdevicesdevices_list" xsi:type="AttributeLinkedSet">
<linked_class>NetworkDevice</linked_class>
<ext_key_to_me>networkdevicetype_id</ext_key_to_me>
@@ -5329,9 +5498,12 @@
<item id="name">
<rank>10</rank>
</item>
<item id="networkdevicesdevices_list">
<item id="logo">
<rank>20</rank>
</item>
<item id="networkdevicesdevices_list">
<rank>30</rank>
</item>
</items>
</details>
<search>
@@ -5343,7 +5515,7 @@
</search>
<list>
<items>
<item id="name">
<item id="logo">
<rank>10</rank>
</item>
</items>
@@ -6127,21 +6299,46 @@
<presentation>
<details>
<items>
<item id="ip">
<item id="col:col1">
<items>
<item id="fieldset:ConfigMgmt:baseinfo">
<items>
<item id="subnet_name">
<rank>10</rank>
</item>
<item id="org_id">
<rank>30</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:ConfigMgmt:moreinfo">
<items>
<item id="ip">
<rank>10</rank>
</item>
<item id="ip_mask">
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="ip_mask">
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
</items>
<rank>20</rank>
</item>
<item id="subnet_name">
<rank>25</rank>
</item>
<item id="org_id">
<rank>30</rank>
</item>
<item id="description">
<rank>40</rank>
</item>
<item id="vlans_list">
<rank>50</rank>
</item>
@@ -6289,15 +6486,35 @@
<presentation>
<details>
<items>
<item id="vlan_tag">
<item id="col:col1">
<items>
<item id="fieldset:ConfigMgmt:baseinfo">
<items>
<item id="vlan_tag">
<rank>10</rank>
</item>
<item id="org_id">
<rank>20</rank>
</item>
</items>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="org_id">
<item id="col:col2">
<items>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
</items>
<rank>20</rank>
</item>
<item id="description">
<rank>30</rank>
</item>
<item id="subnets_list">
<rank>40</rank>
</item>
@@ -6763,10 +6980,10 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:Server:otherinfo">
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="comment">
<rank>60</rank>
<rank>10</rank>
</item>
</items>
<rank>10</rank>
@@ -7579,10 +7796,10 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:Server:otherinfo">
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>50</rank>
<rank>10</rank>
</item>
</items>
<rank>10</rank>

View File

@@ -1160,6 +1160,8 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [
Dict::Add('CS CZ', 'Czech', 'Čeština', [
'Class:NetworkDeviceType' => 'Typ síťového zařízení',
'Class:NetworkDeviceType+' => '',
'Class:NetworkDeviceType/Attribute:logo' => 'Logo~~',
'Class:NetworkDeviceType/Attribute:logo+' => 'Used as icon for all Network Device of this type, when displayed in console (details, summary card and impact analysis graphs)~~',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list' => 'Síťová zařízení',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list+' => 'Všechna síťová zařízení odpovídající tomuto typu',
]);
@@ -1547,7 +1549,8 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [
'ConfigMgmt:baseinfo' => 'General~~',
'ConfigMgmt:moreinfo' => 'CI specifics~~',
'Storage:moreinfo' => 'Storage specifics~~',
'ConfigMgmt:otherinfo' => 'Dates and description~~',
'ConfigMgmt:otherinfo' => 'Description~~',
'ConfigMgmt:dates' => 'Dates~~',
'Software:moreinfo' => 'Software specifics~~',
'Phone:moreinfo' => 'Phone specifics~~',
'Server:baseinfo' => 'Obecné informace',

View File

@@ -1159,6 +1159,8 @@ Dict::Add('DA DA', 'Danish', 'Dansk', [
Dict::Add('DA DA', 'Danish', 'Dansk', [
'Class:NetworkDeviceType' => 'Netværksenhed type',
'Class:NetworkDeviceType+' => '',
'Class:NetworkDeviceType/Attribute:logo' => 'Logo~~',
'Class:NetworkDeviceType/Attribute:logo+' => 'Used as icon for all Network Device of this type, when displayed in console (details, summary card and impact analysis graphs)~~',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list' => 'Netværks enheder',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list+' => 'All the network devices corresponding to this type~~',
]);
@@ -1546,7 +1548,8 @@ Dict::Add('DA DA', 'Danish', 'Dansk', [
'ConfigMgmt:baseinfo' => 'General~~',
'ConfigMgmt:moreinfo' => 'CI specifics~~',
'Storage:moreinfo' => 'Storage specifics~~',
'ConfigMgmt:otherinfo' => 'Dates and description~~',
'ConfigMgmt:otherinfo' => 'Description~~',
'ConfigMgmt:dates' => 'Dates~~',
'Software:moreinfo' => 'Software specifics~~',
'Phone:moreinfo' => 'Phone specifics~~',
'Server:baseinfo' => 'Almindelig Informationen',

View File

@@ -1159,6 +1159,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', [
Dict::Add('DE DE', 'German', 'Deutsch', [
'Class:NetworkDeviceType' => 'Netzwerkgerätetyp',
'Class:NetworkDeviceType+' => '',
'Class:NetworkDeviceType/Attribute:logo' => 'Logo~~',
'Class:NetworkDeviceType/Attribute:logo+' => 'Used as icon for all Network Device of this type, when displayed in console (details, summary card and impact analysis graphs)~~',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list' => 'Netzwerkgeräte',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list+' => 'Alle Netzwerkgeräte, die diesem Typ entsprechen',
]);
@@ -1546,7 +1548,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', [
'ConfigMgmt:baseinfo' => 'General~~',
'ConfigMgmt:moreinfo' => 'CI specifics~~',
'Storage:moreinfo' => 'Storage specifics~~',
'ConfigMgmt:otherinfo' => 'Dates and description~~',
'ConfigMgmt:otherinfo' => 'Description~~',
'ConfigMgmt:dates' => 'Dates~~',
'Software:moreinfo' => 'Software specifics~~',
'Phone:moreinfo' => 'Phone specifics~~',
'Server:baseinfo' => 'Allgemeine Informationen',

View File

@@ -163,7 +163,7 @@ Dict::Add('EN US', 'English', 'English', [
Dict::Add('EN US', 'English', 'English', [
'Class:Rack' => 'Rack',
'Class:Rack+' => 'A physical container for Datacenter Devices and Enclosures.',
'Class:Rack+' => 'A physical cabinet for Datacenter Devices and Chassis.',
'Class:Rack/ComplementaryName' => '%1$s - %2$s',
'Class:Rack/Attribute:nb_u' => 'Rack units',
'Class:Rack/Attribute:nb_u+' => '',
@@ -470,7 +470,7 @@ For example: external hard drives, scanners, input devices (trackballs, bar code
Dict::Add('EN US', 'English', 'English', [
'Class:Enclosure' => 'Enclosure',
'Class:Enclosure+' => 'Cabinet is a physical structure in which to mount IT equipment such as Servers, Network Device... In '.ITOP_APPLICATION_SHORT.' an Enclosure can be mounted inside a Rack or directly fitted on the wall of a datacenter.',
'Class:Enclosure+' => 'An open-frame chassis mounted inside a Rack, in which to mount IT equipment such as Blade Servers, Network Device...',
'Class:Enclosure/ComplementaryName' => '%1$s - %2$s - %3$s',
'Class:Enclosure/Attribute:rack_id' => 'Rack',
'Class:Enclosure/Attribute:rack_id+' => '',
@@ -1167,6 +1167,8 @@ Dict::Add('EN US', 'English', 'English', [
Dict::Add('EN US', 'English', 'English', [
'Class:NetworkDeviceType' => 'Network Device Type',
'Class:NetworkDeviceType+' => 'Typology. The possible values for the "Type" of a Network Device (e.g. Router, Switch, Firewall, etc.).',
'Class:NetworkDeviceType/Attribute:logo' => 'Logo',
'Class:NetworkDeviceType/Attribute:logo+' => 'Used as icon for all Network Device of this type, when displayed in console (details, summary card and impact analysis graphs)',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list' => 'Network devices',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list+' => 'All the network devices corresponding to this type',
]);
@@ -1578,7 +1580,8 @@ Dict::Add('EN US', 'English', 'English', [
Dict::Add('EN US', 'English', 'English', [
'ConfigMgmt:baseinfo' => 'General',
'ConfigMgmt:moreinfo' => 'CI specifics',
'ConfigMgmt:otherinfo' => 'Dates and description',
'ConfigMgmt:otherinfo' => 'Description',
'ConfigMgmt:dates' => 'Dates',
'Storage:moreinfo' => 'Storage specifics',
'Software:moreinfo' => 'Software specifics',
'Phone:moreinfo' => 'Phone specifics',

Some files were not shown because too many files have changed in this diff Show More