From f6fcad885b4f35d572e920ce5c1209eadd2658ff Mon Sep 17 00:00:00 2001 From: Sascha Mester Date: Sat, 4 Feb 2023 08:18:43 +0100 Subject: [PATCH] INITIAL COMMIT --- src/Build/Clean.bat | 73 + src/Build/KeePassLib_Distrib/KeePassLib.dll | Bin 0 -> 365976 bytes src/Build/KeePassLib_Distrib/KeePassLib.xml | 3152 ++++ src/Build/PrepMonoDev.sh | 66 + src/Docs/Chm/KeePass.hhp | 61 + src/Docs/Chm/KeePassContents.hhc | 198 + src/Docs/Chm/default.css | 524 + src/Docs/Chm/help/base/autotype.html | 641 + src/Docs/Chm/help/base/autourl.html | 302 + src/Docs/Chm/help/base/cmdline.html | 229 + src/Docs/Chm/help/base/configuration.html | 198 + src/Docs/Chm/help/base/credits.html | 887 ++ src/Docs/Chm/help/base/faq.html | 162 + src/Docs/Chm/help/base/faq_tech.html | 766 + src/Docs/Chm/help/base/fieldrefs.html | 141 + src/Docs/Chm/help/base/firststeps.html | 168 + src/Docs/Chm/help/base/importexport.html | 522 + src/Docs/Chm/help/base/index.html | 137 + src/Docs/Chm/help/base/integration.html | 98 + src/Docs/Chm/help/base/keys.html | 355 + src/Docs/Chm/help/base/license_lgpl.html | 551 + src/Docs/Chm/help/base/multiuser.html | 144 + src/Docs/Chm/help/base/placeholders.html | 785 + src/Docs/Chm/help/base/pwgenerator.html | 400 + src/Docs/Chm/help/base/repair.html | 112 + src/Docs/Chm/help/base/search.html | 414 + src/Docs/Chm/help/base/secedits.html | 63 + src/Docs/Chm/help/base/security.html | 710 + src/Docs/Chm/help/base/tans.html | 93 + src/Docs/Chm/help/base/terms.html | 1311 ++ src/Docs/Chm/help/base/usingpws.html | 116 + src/Docs/Chm/help/images/appicons.png | Bin 0 -> 17279 bytes src/Docs/Chm/help/images/b16x16_ascii.png | Bin 0 -> 391 bytes src/Docs/Chm/help/images/b16x16_binary.png | Bin 0 -> 839 bytes .../Chm/help/images/b16x16_blockdevice.png | Bin 0 -> 848 bytes src/Docs/Chm/help/images/b16x16_cancel.png | Bin 0 -> 1133 bytes .../Chm/help/images/b16x16_chardevice.png | Bin 0 -> 1022 bytes .../Chm/help/images/b16x16_dataexchange.png | Bin 0 -> 653 bytes src/Docs/Chm/help/images/b16x16_desktop.png | Bin 0 -> 1077 bytes src/Docs/Chm/help/images/b16x16_donate.png | Bin 0 -> 1106 bytes .../help/images/b16x16_enhanced_browsing.png | Bin 0 -> 595 bytes .../Chm/help/images/b16x16_file_locked.png | Bin 0 -> 999 bytes .../Chm/help/images/b16x16_filesaveas.png | Bin 0 -> 1009 bytes src/Docs/Chm/help/images/b16x16_help.png | Bin 0 -> 795 bytes src/Docs/Chm/help/images/b16x16_history.png | Bin 0 -> 1166 bytes src/Docs/Chm/help/images/b16x16_kblackbox.png | Bin 0 -> 848 bytes .../Chm/help/images/b16x16_kcmdrkonqi.png | Bin 0 -> 1139 bytes src/Docs/Chm/help/images/b16x16_kcmsystem.png | Bin 0 -> 937 bytes src/Docs/Chm/help/images/b16x16_kdmconfig.png | Bin 0 -> 1164 bytes .../help/images/b16x16_keyboard_layout.png | Bin 0 -> 699 bytes src/Docs/Chm/help/images/b16x16_kgpg.png | Bin 0 -> 675 bytes src/Docs/Chm/help/images/b16x16_kgpg_key3.png | Bin 0 -> 946 bytes src/Docs/Chm/help/images/b16x16_kmultiple.png | Bin 0 -> 487 bytes src/Docs/Chm/help/images/b16x16_konsole.png | Bin 0 -> 682 bytes src/Docs/Chm/help/images/b16x16_ktouch.png | Bin 0 -> 695 bytes .../Chm/help/images/b16x16_make_kdevelop.png | Bin 0 -> 973 bytes src/Docs/Chm/help/images/b16x16_message.png | Bin 0 -> 953 bytes src/Docs/Chm/help/images/b16x16_ok.png | Bin 0 -> 883 bytes src/Docs/Chm/help/images/b16x16_openterm.png | Bin 0 -> 925 bytes .../Chm/help/images/b16x16_package_system.png | Bin 0 -> 1129 bytes src/Docs/Chm/help/images/b16x16_password.png | Bin 0 -> 949 bytes src/Docs/Chm/help/images/b16x16_rotate_cw.png | Bin 0 -> 834 bytes src/Docs/Chm/help/images/b16x16_server.png | Bin 0 -> 914 bytes src/Docs/Chm/help/images/b16x16_tar.png | Bin 0 -> 1050 bytes .../images/b16x16_usbpendrive_unmount.png | Bin 0 -> 777 bytes src/Docs/Chm/help/images/b16x16_vcard.png | Bin 0 -> 888 bytes src/Docs/Chm/help/images/b16x16_warning.png | Bin 0 -> 937 bytes .../Chm/help/images/b16x16_window_list.png | Bin 0 -> 915 bytes src/Docs/Chm/help/images/b16x16_xmag.png | Bin 0 -> 601 bytes src/Docs/Chm/help/images/b64x64_binary.png | Bin 0 -> 3703 bytes .../Chm/help/images/b64x64_blockdevice.png | Bin 0 -> 4758 bytes .../Chm/help/images/b64x64_chardevice.png | Bin 0 -> 5210 bytes .../Chm/help/images/b64x64_dataexchange.png | Bin 0 -> 3301 bytes src/Docs/Chm/help/images/b64x64_desktop.png | Bin 0 -> 7360 bytes src/Docs/Chm/help/images/b64x64_doc.png | Bin 0 -> 1474 bytes .../help/images/b64x64_enhanced_browsing.png | Bin 0 -> 3668 bytes .../Chm/help/images/b64x64_file_locked.png | Bin 0 -> 4106 bytes src/Docs/Chm/help/images/b64x64_help.png | Bin 0 -> 5854 bytes .../Chm/help/images/b64x64_kcmdrkonqi.png | Bin 0 -> 6614 bytes src/Docs/Chm/help/images/b64x64_kcmsystem.png | Bin 0 -> 6892 bytes src/Docs/Chm/help/images/b64x64_kdmconfig.png | Bin 0 -> 7506 bytes .../help/images/b64x64_keyboard_layout.png | Bin 0 -> 3452 bytes src/Docs/Chm/help/images/b64x64_kgpg.png | Bin 0 -> 6229 bytes src/Docs/Chm/help/images/b64x64_kmultiple.png | Bin 0 -> 1305 bytes src/Docs/Chm/help/images/b64x64_konsole.png | Bin 0 -> 3530 bytes src/Docs/Chm/help/images/b64x64_ktouch.png | Bin 0 -> 3537 bytes .../Chm/help/images/b64x64_package_system.png | Bin 0 -> 7822 bytes src/Docs/Chm/help/images/b64x64_usb.png | Bin 0 -> 4691 bytes src/Docs/Chm/help/images/b64x64_vcard.png | Bin 0 -> 4003 bytes src/Docs/Chm/help/images/b64x64_winprops.png | Bin 0 -> 4493 bytes src/Docs/Chm/help/images/b64x64_xmag.png | Bin 0 -> 4399 bytes src/Docs/Chm/help/images/clienticons.gif | Bin 0 -> 11388 bytes .../Chm/help/images/dlgbanner_bluecarbon.png | Bin 0 -> 9926 bytes src/Docs/Chm/help/images/dlgbanner_win32.png | Bin 0 -> 10392 bytes .../help/images/dlgbanner_winvistablack.png | Bin 0 -> 10142 bytes .../Chm/help/images/dlgbanner_winxplogin.png | Bin 0 -> 12037 bytes src/Docs/Chm/help/images/dragndrop.png | Bin 0 -> 41439 bytes src/Docs/Chm/help/images/flageng_small.gif | Bin 0 -> 86 bytes src/Docs/Chm/help/images/flagger_small.gif | Bin 0 -> 83 bytes src/Docs/Chm/help/images/folder_closed.png | Bin 0 -> 410 bytes src/Docs/Chm/help/images/getkey_dark.png | Bin 0 -> 14593 bytes src/Docs/Chm/help/images/plockb_64.png | Bin 0 -> 4281 bytes .../Chm/help/images/pwgen_adv_excltab.png | Bin 0 -> 1033 bytes src/Docs/Chm/help/images/rtfeditor.png | Bin 0 -> 21063 bytes src/Docs/Chm/help/images/rtfeditor_small.png | Bin 0 -> 7779 bytes src/Docs/Chm/help/index.html | 15 + .../Chm/help/v2/autotype_obfuscation.html | 277 + src/Docs/Chm/help/v2/dbsettings.html | 154 + src/Docs/Chm/help/v2/entry.html | 323 + src/Docs/Chm/help/v2/guioptions.html | 68 + src/Docs/Chm/help/v2/index.html | 15 + src/Docs/Chm/help/v2/ioconnect.html | 89 + src/Docs/Chm/help/v2/license.html | 539 + src/Docs/Chm/help/v2/plugins.html | 154 + src/Docs/Chm/help/v2/policy.html | 138 + src/Docs/Chm/help/v2/setup.html | 480 + src/Docs/Chm/help/v2/sync.html | 184 + src/Docs/Chm/help/v2/translation.html | 92 + src/Docs/Chm/help/v2/triggers.html | 458 + src/Docs/Chm/help/v2/version.html | 56 + src/Docs/Chm/help/v2/xml_replace.html | 395 + src/Docs/Chm/help/v2_dev/customize.html | 255 + src/Docs/Chm/help/v2_dev/plg_index.html | 661 + src/Docs/Chm/help/v2_dev/scr_index.html | 73 + src/Docs/Chm/help/v2_dev/scr_kps_index.html | 86 + src/Docs/Chm/help/v2_dev/scr_sc_index.html | 493 + src/Docs/Chm/images/back.gif | Bin 0 -> 263 bytes src/Docs/Chm/images/osi_certified_72x60.gif | Bin 0 -> 2339 bytes .../Chm/screenshots/keepass_2x/gencsvimp.png | Bin 0 -> 28252 bytes src/Docs/Chm/screenshots/keepass_2x/main.jpg | Bin 0 -> 54092 bytes .../windows_vista/comboboxform.png | Bin 0 -> 6662 bytes .../screenshots/windows_vista/pickchars.png | Bin 0 -> 12156 bytes .../windows_vista/readonlymode.png | Bin 0 -> 30433 bytes .../screenshots/windows_vista/syncorsave.png | Bin 0 -> 37135 bytes src/Docs/History.txt | 4674 ++++++ src/Docs/License.txt | 347 + src/Ext/Icons_04_CB/Finals/Untitled.ico | Bin 0 -> 23558 bytes src/Ext/Icons_04_CB/Finals/key-blu.png | Bin 0 -> 37767 bytes src/Ext/Icons_04_CB/Finals/key-bw.png | Bin 0 -> 10090 bytes src/Ext/Icons_04_CB/Finals/key-grn.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/Finals/key-grn.png | Bin 0 -> 37727 bytes src/Ext/Icons_04_CB/Finals/plock-blu.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/Finals/plock-blu.png | Bin 0 -> 34880 bytes src/Ext/Icons_04_CB/Finals/plock-bw.png | Bin 0 -> 9346 bytes src/Ext/Icons_04_CB/Finals/plock-dis.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/Finals/plock-grn.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/Finals/plock-grn.png | Bin 0 -> 34868 bytes src/Ext/Icons_04_CB/Finals/plock.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/Finals/plock.png | Bin 0 -> 40174 bytes src/Ext/Icons_04_CB/Finals/plockb.png | Bin 0 -> 39444 bytes src/Ext/Icons_04_CB/Finals/plockbw-r.png | Bin 0 -> 14618 bytes src/Ext/Icons_04_CB/Finals/plockbw.png | Bin 0 -> 15994 bytes src/Ext/Icons_04_CB/Finals2/plock-blu.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/Finals2/plock-dis.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/Finals2/plock.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/Finals2/plockb.ico | Bin 0 -> 23558 bytes src/Ext/Icons_04_CB/ReadMe.txt | 2 + src/Ext/Icons_04_CB/key-org.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/keyhole-grn.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/lockblue.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/lockgreen.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/lockred.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/lockyellow.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/plockb.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/plockb2.ico | Bin 0 -> 23558 bytes src/Ext/Icons_04_CB/plockbw.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/plockg.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/plocko.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/plockr.ico | Bin 0 -> 25214 bytes src/Ext/Icons_04_CB/plocky.ico | Bin 0 -> 25214 bytes .../KeePass_Round/KeePass_Round_1024.png | Bin 0 -> 82764 bytes .../KeePass_Round/KeePass_Round_128.png | Bin 0 -> 8753 bytes .../KeePass_Round/KeePass_Round_16.png | Bin 0 -> 862 bytes .../KeePass_Round/KeePass_Round_20.png | Bin 0 -> 1076 bytes .../KeePass_Round/KeePass_Round_24.png | Bin 0 -> 1404 bytes .../KeePass_Round/KeePass_Round_256.png | Bin 0 -> 17797 bytes .../KeePass_Round/KeePass_Round_32.png | Bin 0 -> 2065 bytes .../KeePass_Round/KeePass_Round_48.png | Bin 0 -> 3261 bytes .../KeePass_Round/KeePass_Round_512.png | Bin 0 -> 36925 bytes .../KeePass_Round/KeePass_Round_64.png | Bin 0 -> 4281 bytes .../KeePass_Round_Keyhole_128.png | Bin 0 -> 8062 bytes .../KeePass_Round_Keyhole_16.png | Bin 0 -> 828 bytes .../KeePass_Round_Keyhole_256.png | Bin 0 -> 16849 bytes .../KeePass_Round_Keyhole_32.png | Bin 0 -> 1795 bytes .../KeePass_Round_Keyhole_48.png | Bin 0 -> 2840 bytes .../KeePass_Round_Keyhole_64.png | Bin 0 -> 3917 bytes .../KeePass_Round_Locked_128.png | Bin 0 -> 9123 bytes .../KeePass_Round_Locked_16.png | Bin 0 -> 910 bytes .../KeePass_Round_Locked_256.png | Bin 0 -> 18574 bytes .../KeePass_Round_Locked_32.png | Bin 0 -> 2193 bytes .../KeePass_Round_Locked_48.png | Bin 0 -> 3355 bytes .../KeePass_Round_Locked_64.png | Bin 0 -> 4482 bytes .../KeePass_Square_Blue_128.png | Bin 0 -> 5011 bytes .../KeePass_Square_Blue_16.png | Bin 0 -> 699 bytes .../KeePass_Square_Blue_24.png | Bin 0 -> 1089 bytes .../KeePass_Square_Blue_256.png | Bin 0 -> 9953 bytes .../KeePass_Square_Blue_32.png | Bin 0 -> 1364 bytes .../KeePass_Square_Blue_48.png | Bin 0 -> 2088 bytes .../KeePass_Square_Blue_64.png | Bin 0 -> 2720 bytes .../KeePass_Square_Blue_Locked_128.png | Bin 0 -> 6380 bytes .../KeePass_Square_Blue_Locked_16.png | Bin 0 -> 788 bytes .../KeePass_Square_Blue_Locked_24.png | Bin 0 -> 1297 bytes .../KeePass_Square_Blue_Locked_256.png | Bin 0 -> 12765 bytes .../KeePass_Square_Blue_Locked_32.png | Bin 0 -> 1704 bytes .../KeePass_Square_Blue_Locked_48.png | Bin 0 -> 2502 bytes .../KeePass_Square_Blue_Locked_64.png | Bin 0 -> 3323 bytes .../KeePass_Square_Yellow_128.png | Bin 0 -> 4945 bytes .../KeePass_Square_Yellow_16.png | Bin 0 -> 747 bytes .../KeePass_Square_Yellow_256.png | Bin 0 -> 9756 bytes .../KeePass_Square_Yellow_32.png | Bin 0 -> 1419 bytes .../KeePass_Square_Yellow_48.png | Bin 0 -> 2040 bytes .../KeePass_Square_Yellow_64.png | Bin 0 -> 2672 bytes .../Icons_15_VA/LowResIcons/KeePass_LR.ico | Bin 0 -> 44702 bytes .../Icons_15_VA/LowResIcons/KeePass_LR_G.ico | Bin 0 -> 44702 bytes .../Icons_15_VA/LowResIcons/KeePass_LR_R.ico | Bin 0 -> 44702 bytes .../Icons_15_VA/LowResIcons/KeePass_LR_Y.ico | Bin 0 -> 44702 bytes src/Ext/Icons_15_VA/ReadMe.txt | 2 + src/Ext/Icons_Nuvola/License.txt | 504 + src/Ext/Icons_Nuvola/ReadMe.txt | 60 + .../Images/B48x48_FontBold.png | Bin 0 -> 3011 bytes .../Images/B48x48_FontItalic.png | Bin 0 -> 2944 bytes .../Images/B48x48_FontStrikeout.png | Bin 0 -> 3132 bytes .../Images/B48x48_FontUnderline.png | Bin 0 -> 3069 bytes .../Images/B48x48_KeePass.png | Bin 0 -> 3222 bytes .../Images/B48x48_LockWorkspace.png | Bin 0 -> 2126 bytes .../Images/B48x48_Transparent.png | Bin 0 -> 2831 bytes .../Images/B57x21_3BlackDots.png | Bin 0 -> 306 bytes .../Nuvola/B32x32_KRec_Record.png | Bin 0 -> 1515 bytes .../Nuvola/B48x48_1DownArrow.png | Bin 0 -> 2459 bytes .../Nuvola/B48x48_1UpArrow.png | Bin 0 -> 2457 bytes .../Nuvola/B48x48_2DownArrow.png | Bin 0 -> 3671 bytes .../Nuvola/B48x48_2UpArrow.png | Bin 0 -> 3585 bytes .../Nuvola/B48x48_ASCII.png | Bin 0 -> 1536 bytes .../Nuvola/B48x48_Apply.png | Bin 0 -> 2855 bytes .../Nuvola/B48x48_Attach.png | Bin 0 -> 3906 bytes .../Nuvola/B48x48_Binary.png | Bin 0 -> 2728 bytes .../Nuvola/B48x48_BlockDevice.png | Bin 0 -> 3365 bytes .../Nuvola/B48x48_Browser.png | Bin 0 -> 5597 bytes .../Nuvola/B48x48_Color_Fill.png | Bin 0 -> 3354 bytes .../Nuvola/B48x48_Colorize.png | Bin 0 -> 4642 bytes .../Nuvola/B48x48_CompFile.png | Bin 0 -> 2195 bytes .../Nuvola/B48x48_Configure.png | Bin 0 -> 2897 bytes .../Images_App_HighRes/Nuvola/B48x48_Cut.png | Bin 0 -> 3406 bytes .../Images_App_HighRes/Nuvola/B48x48_Edit.png | Bin 0 -> 2011 bytes .../Nuvola/B48x48_EditCopy.png | Bin 0 -> 1989 bytes .../Nuvola/B48x48_EditDelete.png | Bin 0 -> 2893 bytes .../Nuvola/B48x48_EditPaste.png | Bin 0 -> 2704 bytes .../Nuvola/B48x48_EditShred.png | Bin 0 -> 1924 bytes .../Nuvola/B48x48_Error.png | Bin 0 -> 4477 bytes .../Images_App_HighRes/Nuvola/B48x48_Exit.png | Bin 0 -> 4269 bytes .../Images_App_HighRes/Nuvola/B48x48_FTP.png | Bin 0 -> 5699 bytes .../Nuvola/B48x48_FileNew.png | Bin 0 -> 3005 bytes .../Nuvola/B48x48_FilePrint.png | Bin 0 -> 3369 bytes .../Nuvola/B48x48_FileQuickPrint.png | Bin 0 -> 5095 bytes .../Nuvola/B48x48_FileSave.png | Bin 0 -> 2627 bytes .../Nuvola/B48x48_FileSaveAs.png | Bin 0 -> 3846 bytes .../Nuvola/B48x48_File_Locked.png | Bin 0 -> 2761 bytes .../Nuvola/B48x48_Folder.png | Bin 0 -> 4789 bytes .../Nuvola/B48x48_Folder_Blue_Open.png | Bin 0 -> 3806 bytes .../Nuvola/B48x48_Folder_Home.png | Bin 0 -> 5001 bytes .../Nuvola/B48x48_Folder_Locked.png | Bin 0 -> 5067 bytes .../Nuvola/B48x48_Folder_Txt.png | Bin 0 -> 5527 bytes .../Nuvola/B48x48_Folder_Yellow_Open.png | Bin 0 -> 3695 bytes .../Images_App_HighRes/Nuvola/B48x48_HTML.png | Bin 0 -> 3382 bytes .../Images_App_HighRes/Nuvola/B48x48_Help.png | Bin 0 -> 4662 bytes .../Nuvola/B48x48_History.png | Bin 0 -> 5804 bytes .../Nuvola/B48x48_History_Clear.png | Bin 0 -> 6408 bytes .../Nuvola/B48x48_HwInfo.png | Bin 0 -> 4180 bytes .../Nuvola/B48x48_Identity.png | Bin 0 -> 3024 bytes .../Nuvola/B48x48_KGPG_Gen.png | Bin 0 -> 5140 bytes .../Nuvola/B48x48_KGPG_Import.png | Bin 0 -> 4691 bytes .../Nuvola/B48x48_KGPG_Info.png | Bin 0 -> 3352 bytes .../Nuvola/B48x48_KGPG_Key1.png | Bin 0 -> 2339 bytes .../Nuvola/B48x48_KGPG_Key2.png | Bin 0 -> 4199 bytes .../Nuvola/B48x48_KGPG_Key3.png | Bin 0 -> 5167 bytes .../Nuvola/B48x48_KGPG_Sign.png | Bin 0 -> 4476 bytes .../Nuvola/B48x48_KNotes.png | Bin 0 -> 3267 bytes .../Nuvola/B48x48_KOrganizer.png | Bin 0 -> 6476 bytes .../Nuvola/B48x48_KTouch.png | Bin 0 -> 3461 bytes .../Nuvola/B48x48_KaboodleLoop.png | Bin 0 -> 3375 bytes .../Nuvola/B48x48_Keyboard_Layout.png | Bin 0 -> 3548 bytes .../Nuvola/B48x48_Laptop_Charge.png | Bin 0 -> 4943 bytes .../Nuvola/B48x48_Make_KDevelop.png | Bin 0 -> 3190 bytes .../Nuvola/B48x48_MessageBox_Critical.png | Bin 0 -> 3699 bytes .../Nuvola/B48x48_MessageBox_Info.png | Bin 0 -> 3829 bytes .../Nuvola/B48x48_MessageBox_Warning.png | Bin 0 -> 3259 bytes .../Images_App_HighRes/Nuvola/B48x48_Misc.png | Bin 0 -> 5083 bytes .../Images_App_HighRes/Nuvola/B48x48_No.png | Bin 0 -> 3062 bytes .../Nuvola/B48x48_Package_Development.png | Bin 0 -> 3919 bytes .../Nuvola/B48x48_Package_Settings.png | Bin 0 -> 5994 bytes .../Nuvola/B48x48_Personal.png | Bin 0 -> 4684 bytes .../Images_App_HighRes/Nuvola/B48x48_Redo.png | Bin 0 -> 2545 bytes .../Nuvola/B48x48_Reload_Page.png | Bin 0 -> 4186 bytes .../Nuvola/B48x48_Services.png | Bin 0 -> 3381 bytes .../Nuvola/B48x48_Spreadsheet.png | Bin 0 -> 3271 bytes .../Nuvola/B48x48_Toggle_Log.png | Bin 0 -> 4069 bytes .../Nuvola/B48x48_Trashcan_Full.png | Bin 0 -> 4997 bytes .../Images_App_HighRes/Nuvola/B48x48_Undo.png | Bin 0 -> 2653 bytes .../Nuvola/B48x48_View_Detailed.png | Bin 0 -> 2768 bytes .../Images_App_HighRes/Nuvola/B48x48_WWW.png | Bin 0 -> 5594 bytes .../Nuvola/B48x48_Wizard.png | Bin 0 -> 2743 bytes .../Images_App_HighRes/Nuvola/B48x48_XMag.png | Bin 0 -> 3779 bytes .../Nuvola_Assembled/B48x48_Folder_Inbox.png | Bin 0 -> 1260 bytes .../Nuvola_Assembled/B48x48_Folder_Outbox.png | Bin 0 -> 1138 bytes .../Nuvola_Derived/B48x48_DeleteEntry.png | Bin 0 -> 4247 bytes .../Nuvola_Derived/B48x48_EditCopyLink.png | Bin 0 -> 2653 bytes .../Nuvola_Derived/B48x48_EditCopyUrl.png | Bin 0 -> 3598 bytes .../B48x48_FileSave_Disabled.png | Bin 0 -> 1428 bytes .../Nuvola_Derived/B48x48_File_Close.png | Bin 0 -> 3062 bytes .../Nuvola_Derived/B48x48_File_SaveAll.png | Bin 0 -> 3085 bytes .../B48x48_File_SaveAll_Disabled.png | Bin 0 -> 2852 bytes .../Nuvola_Derived/B48x48_Folder_2.png | Bin 0 -> 3481 bytes .../Nuvola_Derived/B48x48_Folder_New_Ex.png | Bin 0 -> 4432 bytes .../Nuvola_Derived/B48x48_Key_New.png | Bin 0 -> 4285 bytes .../Nuvola_Derived/B48x48_TextAlignCenter.png | Bin 0 -> 970 bytes .../Nuvola_Derived/B48x48_TextAlignLeft.png | Bin 0 -> 978 bytes .../Nuvola_Derived/B48x48_TextAlignRight.png | Bin 0 -> 976 bytes .../B48x48_Window_2Horz1Vert.png | Bin 0 -> 1765 bytes .../Nuvola_Derived/B48x48_Window_3Horz.png | Bin 0 -> 1704 bytes src/Ext/Images_Client_16/C00_Password.png | Bin 0 -> 949 bytes .../Images_Client_16/C01_Package_Network.png | Bin 0 -> 1154 bytes .../C02_MessageBox_Warning.png | Bin 0 -> 937 bytes src/Ext/Images_Client_16/C03_Server.png | Bin 0 -> 914 bytes src/Ext/Images_Client_16/C04_Klipper.png | Bin 0 -> 731 bytes .../Images_Client_16/C05_Edu_Languages.png | Bin 0 -> 1068 bytes src/Ext/Images_Client_16/C06_KCMDF.png | Bin 0 -> 964 bytes src/Ext/Images_Client_16/C07_Kate.png | Bin 0 -> 1097 bytes src/Ext/Images_Client_16/C08_Socket.png | Bin 0 -> 1180 bytes src/Ext/Images_Client_16/C09_Identity.png | Bin 0 -> 874 bytes src/Ext/Images_Client_16/C10_Kontact.png | Bin 0 -> 1043 bytes src/Ext/Images_Client_16/C11_Camera.png | Bin 0 -> 902 bytes src/Ext/Images_Client_16/C12_IRKickFlash.png | Bin 0 -> 1108 bytes src/Ext/Images_Client_16/C13_KGPG_Key3.png | Bin 0 -> 946 bytes src/Ext/Images_Client_16/C14_Laptop_Power.png | Bin 0 -> 921 bytes src/Ext/Images_Client_16/C15_Scanner.png | Bin 0 -> 1086 bytes .../Images_Client_16/C16_Mozilla_Firebird.png | Bin 0 -> 1002 bytes .../Images_Client_16/C17_CDROM_Unmount.png | Bin 0 -> 1078 bytes src/Ext/Images_Client_16/C18_Display.png | Bin 0 -> 888 bytes src/Ext/Images_Client_16/C19_Mail_Generic.png | Bin 0 -> 1148 bytes src/Ext/Images_Client_16/C20_Misc.png | Bin 0 -> 1041 bytes src/Ext/Images_Client_16/C21_KOrganizer.png | Bin 0 -> 1073 bytes src/Ext/Images_Client_16/C22_ASCII.png | Bin 0 -> 560 bytes src/Ext/Images_Client_16/C23_Icons.png | Bin 0 -> 781 bytes .../C24_Connect_Established.png | Bin 0 -> 1155 bytes src/Ext/Images_Client_16/C25_Folder_Mail.png | Bin 0 -> 843 bytes src/Ext/Images_Client_16/C26_FileSave.png | Bin 0 -> 898 bytes src/Ext/Images_Client_16/C27_NFS_Unmount.png | Bin 0 -> 1022 bytes src/Ext/Images_Client_16/C28_Message.png | Bin 0 -> 953 bytes src/Ext/Images_Client_16/C29_KGPG_Term.png | Bin 0 -> 897 bytes src/Ext/Images_Client_16/C30_Konsole.png | Bin 0 -> 960 bytes src/Ext/Images_Client_16/C31_FilePrint.png | Bin 0 -> 1020 bytes src/Ext/Images_Client_16/C32_FSView.png | Bin 0 -> 916 bytes src/Ext/Images_Client_16/C33_Run.png | Bin 0 -> 987 bytes src/Ext/Images_Client_16/C34_Configure.png | Bin 0 -> 980 bytes src/Ext/Images_Client_16/C35_KRFB.png | Bin 0 -> 1197 bytes src/Ext/Images_Client_16/C36_Ark.png | Bin 0 -> 1078 bytes src/Ext/Images_Client_16/C37_KPercentage.png | Bin 0 -> 1107 bytes .../Images_Client_16/C38_Samba_Unmount.png | Bin 0 -> 1144 bytes src/Ext/Images_Client_16/C39_History.png | Bin 0 -> 1166 bytes src/Ext/Images_Client_16/C40_Mail_Find.png | Bin 0 -> 1141 bytes src/Ext/Images_Client_16/C41_VectorGfx.png | Bin 0 -> 875 bytes src/Ext/Images_Client_16/C42_KCMMemory.png | Bin 0 -> 913 bytes .../Images_Client_16/C43_Trashcan_Full.png | Bin 0 -> 1115 bytes src/Ext/Images_Client_16/C44_KNotes.png | Bin 0 -> 954 bytes src/Ext/Images_Client_16/C45_Cancel.png | Bin 0 -> 1133 bytes src/Ext/Images_Client_16/C46_Help.png | Bin 0 -> 1187 bytes src/Ext/Images_Client_16/C47_KPackage.png | Bin 0 -> 983 bytes src/Ext/Images_Client_16/C48_Folder.png | Bin 0 -> 403 bytes .../Images_Client_16/C49_Folder_Blue_Open.png | Bin 0 -> 599 bytes src/Ext/Images_Client_16/C50_Folder_Tar.png | Bin 0 -> 865 bytes src/Ext/Images_Client_16/C51_Decrypted.png | Bin 0 -> 972 bytes src/Ext/Images_Client_16/C52_Encrypted.png | Bin 0 -> 894 bytes src/Ext/Images_Client_16/C53_Apply.png | Bin 0 -> 883 bytes src/Ext/Images_Client_16/C54_Signature.png | Bin 0 -> 790 bytes src/Ext/Images_Client_16/C55_Thumbnail.png | Bin 0 -> 922 bytes src/Ext/Images_Client_16/C56_KAddressBook.png | Bin 0 -> 954 bytes src/Ext/Images_Client_16/C57_View_Text.png | Bin 0 -> 895 bytes src/Ext/Images_Client_16/C58_KGPG.png | Bin 0 -> 1157 bytes .../C59_Package_Development.png | Bin 0 -> 985 bytes src/Ext/Images_Client_16/C60_KFM_Home.png | Bin 0 -> 1063 bytes src/Ext/Images_Client_16/C61_Services.png | Bin 0 -> 1030 bytes src/Ext/Images_Client_16/C62_Tux.png | Bin 0 -> 636 bytes src/Ext/Images_Client_16/C63_Feather.png | Bin 0 -> 589 bytes src/Ext/Images_Client_16/C64_Apple.png | Bin 0 -> 825 bytes src/Ext/Images_Client_16/C65_W.png | Bin 0 -> 409 bytes src/Ext/Images_Client_16/C66_Money.png | Bin 0 -> 381 bytes src/Ext/Images_Client_16/C67_Certificate.png | Bin 0 -> 540 bytes src/Ext/Images_Client_16/C68_Smartphone.png | Bin 0 -> 488 bytes .../Images_Client_HighRes/C00_Password.png | Bin 0 -> 3365 bytes .../C01_Package_Network.png | Bin 0 -> 5597 bytes .../C02_MessageBox_Warning.png | Bin 0 -> 3259 bytes src/Ext/Images_Client_HighRes/C03_Server.png | Bin 0 -> 2991 bytes src/Ext/Images_Client_HighRes/C04_Klipper.png | Bin 0 -> 3248 bytes .../C05_Edu_Languages.png | Bin 0 -> 4550 bytes src/Ext/Images_Client_HighRes/C06_KCMDF.png | Bin 0 -> 3346 bytes src/Ext/Images_Client_HighRes/C07_Kate.png | Bin 0 -> 4979 bytes src/Ext/Images_Client_HighRes/C08_Socket.png | Bin 0 -> 5395 bytes .../Images_Client_HighRes/C09_Identity.png | Bin 0 -> 3024 bytes src/Ext/Images_Client_HighRes/C10_Kontact.png | Bin 0 -> 4486 bytes src/Ext/Images_Client_HighRes/C11_Camera.png | Bin 0 -> 3094 bytes .../Images_Client_HighRes/C12_IRKickFlash.png | Bin 0 -> 5365 bytes .../Images_Client_HighRes/C13_KGPG_Key3.png | Bin 0 -> 5167 bytes .../C14_Laptop_Power.png | Bin 0 -> 3855 bytes src/Ext/Images_Client_HighRes/C15_Scanner.png | Bin 0 -> 4185 bytes .../C16_Mozilla_Firebird.png | Bin 0 -> 6066 bytes .../C17_CDROM_Unmount.png | Bin 0 -> 4058 bytes src/Ext/Images_Client_HighRes/C18_Display.png | Bin 0 -> 3071 bytes .../C19_Mail_Generic.png | Bin 0 -> 4286 bytes src/Ext/Images_Client_HighRes/C20_Misc.png | Bin 0 -> 5083 bytes .../Images_Client_HighRes/C21_KOrganizer.png | Bin 0 -> 6476 bytes src/Ext/Images_Client_HighRes/C22_ASCII.png | Bin 0 -> 1536 bytes src/Ext/Images_Client_HighRes/C23_Icons.png | Bin 0 -> 2461 bytes .../C24_Connect_Established.png | Bin 0 -> 4447 bytes .../Images_Client_HighRes/C25_Folder_Mail.png | Bin 0 -> 4733 bytes .../Images_Client_HighRes/C26_FileSave.png | Bin 0 -> 2627 bytes .../Images_Client_HighRes/C27_NFS_Unmount.png | Bin 0 -> 3021 bytes src/Ext/Images_Client_HighRes/C28_Message.png | Bin 0 -> 3816 bytes .../Images_Client_HighRes/C29_KGPG_Term.png | Bin 0 -> 3955 bytes src/Ext/Images_Client_HighRes/C30_Konsole.png | Bin 0 -> 3180 bytes .../Images_Client_HighRes/C31_FilePrint.png | Bin 0 -> 3369 bytes src/Ext/Images_Client_HighRes/C32_FSView.png | Bin 0 -> 2643 bytes src/Ext/Images_Client_HighRes/C33_Run.png | Bin 0 -> 3171 bytes .../Images_Client_HighRes/C34_Configure.png | Bin 0 -> 2897 bytes src/Ext/Images_Client_HighRes/C35_KRFB.png | Bin 0 -> 5622 bytes src/Ext/Images_Client_HighRes/C36_Ark.png | Bin 0 -> 3979 bytes .../Images_Client_HighRes/C37_KPercentage.png | Bin 0 -> 6344 bytes .../C38_Samba_Unmount.png | Bin 0 -> 4689 bytes src/Ext/Images_Client_HighRes/C39_History.png | Bin 0 -> 5804 bytes .../Images_Client_HighRes/C40_Mail_Find.png | Bin 0 -> 4526 bytes .../Images_Client_HighRes/C41_VectorGfx.png | Bin 0 -> 2717 bytes .../Images_Client_HighRes/C42_KCMMemory.png | Bin 0 -> 4185 bytes .../C43_Trashcan_Full.png | Bin 0 -> 4997 bytes src/Ext/Images_Client_HighRes/C44_KNotes.png | Bin 0 -> 3267 bytes src/Ext/Images_Client_HighRes/C45_Cancel.png | Bin 0 -> 3640 bytes src/Ext/Images_Client_HighRes/C46_Help.png | Bin 0 -> 4662 bytes .../Images_Client_HighRes/C47_KPackage.png | Bin 0 -> 3383 bytes src/Ext/Images_Client_HighRes/C48_Folder.png | Bin 0 -> 4789 bytes .../C49_Folder_Blue_Open.png | Bin 0 -> 3806 bytes .../Images_Client_HighRes/C50_Folder_Tar.png | Bin 0 -> 5151 bytes .../Images_Client_HighRes/C51_Decrypted.png | Bin 0 -> 3115 bytes .../Images_Client_HighRes/C52_Encrypted.png | Bin 0 -> 2804 bytes src/Ext/Images_Client_HighRes/C53_Apply.png | Bin 0 -> 2855 bytes .../Images_Client_HighRes/C54_Signature.png | Bin 0 -> 2367 bytes .../Images_Client_HighRes/C55_Thumbnail.png | Bin 0 -> 2806 bytes .../C56_KAddressBook.png | Bin 0 -> 4069 bytes .../Images_Client_HighRes/C57_View_Text.png | Bin 0 -> 2372 bytes src/Ext/Images_Client_HighRes/C58_KGPG.png | Bin 0 -> 5715 bytes .../C59_Package_Development.png | Bin 0 -> 3919 bytes .../Images_Client_HighRes/C60_KFM_Home.png | Bin 0 -> 5001 bytes .../Images_Client_HighRes/C61_Services.png | Bin 0 -> 3381 bytes src/Ext/Images_Client_HighRes/C62_Tux.png | Bin 0 -> 2614 bytes src/Ext/Images_Client_HighRes/C63_Feather.png | Bin 0 -> 2155 bytes src/Ext/Images_Client_HighRes/C64_Apple.png | Bin 0 -> 3622 bytes src/Ext/Images_Client_HighRes/C65_W.png | Bin 0 -> 1188 bytes src/Ext/Images_Client_HighRes/C66_Money.png | Bin 0 -> 1279 bytes .../Images_Client_HighRes/C67_Certificate.png | Bin 0 -> 2291 bytes .../Images_Client_HighRes/C68_Smartphone.png | Bin 0 -> 1683 bytes src/Ext/KPDummyKey.pfx | Bin 0 -> 1756 bytes src/Ext/KeePass.config.xml | 6 + src/Ext/KeePass.exe.config | 23 + src/Ext/KeePass.iss | 363 + src/Ext/KeePassMsi/KeePassMsi.sln | 22 + src/Ext/KeePassMsi/KeePassMsi.vdproj | 1250 ++ src/Ext/KeePass_NoVer.exe.config | 14 + src/Ext/PublicKeys/ArcFourCipher.pk | Bin 0 -> 160 bytes src/Ext/PublicKeys/KPScript.pk | Bin 0 -> 160 bytes src/Ext/PublicKeys/KeePass.pk | Bin 0 -> 160 bytes src/Ext/PublicKeys/KeePassLib.pk | Bin 0 -> 160 bytes src/Ext/PublicKeys/KeePassLibSD.pk | Bin 0 -> 160 bytes src/Ext/PublicKeys/SamplePlugin.pk | Bin 0 -> 160 bytes src/Ext/Resources/LockOverlay16.png | Bin 0 -> 804 bytes src/Ext/Resources/LockOverlay32.png | Bin 0 -> 2059 bytes src/Ext/TrlUtil.exe.config | 14 + src/Ext/XSL/KDBX_Common.xsl | 111 + src/Ext/XSL/KDBX_DetailsFull_HTML.xsl | 122 + src/Ext/XSL/KDBX_DetailsLight_HTML.xsl | 106 + src/Ext/XSL/KDBX_PasswordsOnly_TXT.xsl | 33 + src/Ext/XSL/KDBX_Tabular_HTML.xsl | 100 + src/KeePass.sln | 61 + src/KeePass/App/AppDefs.cs | 374 + src/KeePass/App/AppHelp.cs | 257 + src/KeePass/App/AppIcons.cs | 166 + src/KeePass/App/AppPolicy.cs | 429 + .../App/Configuration/AceApplication.cs | 564 + .../App/Configuration/AceCustomConfig.cs | 199 + src/KeePass/App/Configuration/AceDefaults.cs | 335 + .../App/Configuration/AceIntegration.cs | 617 + src/KeePass/App/Configuration/AceLogging.cs | 41 + .../App/Configuration/AceMainWindow.cs | 758 + src/KeePass/App/Configuration/AceNative.cs | 41 + .../App/Configuration/AcePasswordGenerator.cs | 69 + src/KeePass/App/Configuration/AceSearch.cs | 89 + src/KeePass/App/Configuration/AceSecurity.cs | 274 + src/KeePass/App/Configuration/AceToolBar.cs | 41 + src/KeePass/App/Configuration/AceTrayIcon.cs | 70 + src/KeePass/App/Configuration/AceUI.cs | 584 + src/KeePass/App/Configuration/AppConfigEx.cs | 797 + .../App/Configuration/AppConfigSerializer.cs | 415 + src/KeePass/DataExchange/CsvStreamReader.cs | 135 + src/KeePass/DataExchange/CsvStreamReaderEx.cs | 202 + src/KeePass/DataExchange/CsvStreamWriter.cs | 86 + .../DataExchange/CsvTableEntryReader.cs | 74 + .../DataExchange/CsvTableObjectReader.cs | 118 + src/KeePass/DataExchange/ExportUtil.cs | 274 + src/KeePass/DataExchange/FileFormatPool.cs | 227 + .../DataExchange/FileFormatProvider.cs | 168 + src/KeePass/DataExchange/Formats/AmpXml250.cs | 207 + .../DataExchange/Formats/AnyPwCsv144.cs | 121 + .../DataExchange/Formats/BitwardenJson112.cs | 275 + .../DataExchange/Formats/ChromeCsv66.cs | 88 + .../DataExchange/Formats/CodeWalletTxt605.cs | 114 + .../DataExchange/Formats/DashlaneCsv2.cs | 165 + .../DataExchange/Formats/DashlaneJson6.cs | 228 + .../DataExchange/Formats/DataVaultCsv47.cs | 95 + .../DataExchange/Formats/DesktopKnoxXml32.cs | 111 + .../DataExchange/Formats/EnpassTxt5.cs | 140 + .../DataExchange/Formats/FlexWalletXml17.cs | 186 + .../DataExchange/Formats/GenericCsv.cs | 62 + .../DataExchange/Formats/HandySafeProXml12.cs | 145 + .../DataExchange/Formats/HandySafeTxt512.cs | 139 + .../Formats/KasperskyPwMgrTxt90.cs | 186 + .../Formats/KasperskyPwMgrXml50.cs | 42 + .../DataExchange/Formats/KeePassCsv1x.cs | 180 + .../DataExchange/Formats/KeePassHtml2x.cs | 121 + .../DataExchange/Formats/KeePassKdb1x.cs | 123 + .../DataExchange/Formats/KeePassKdb2x.cs | 159 + .../Formats/KeePassKdb2xRepair.cs | 139 + .../DataExchange/Formats/KeePassXXml041.cs | 219 + .../DataExchange/Formats/KeePassXml1x.cs | 204 + .../DataExchange/Formats/KeePassXml2x.cs | 73 + .../DataExchange/Formats/KeeperJson16.cs | 134 + .../DataExchange/Formats/KeyFolderXml1.cs | 186 + .../DataExchange/Formats/LastPassCsv2.cs | 154 + .../DataExchange/Formats/MSecureCsv355.cs | 318 + .../Formats/MozillaBookmarksHtml100.cs | 413 + .../Formats/MozillaBookmarksJson100.cs | 199 + .../DataExchange/Formats/NPasswordNpw102.cs | 242 + .../DataExchange/Formats/NetworkPwMgrCsv4.cs | 124 + .../Formats/NortonIdSafeCsv2013.cs | 84 + .../DataExchange/Formats/OnePw1Pux8.cs | 318 + .../DataExchange/Formats/OnePwProCsv599.cs | 200 + .../DataExchange/Formats/PVaultTxt14.cs | 117 + .../DataExchange/Formats/PassKeeper12.cs | 127 + .../DataExchange/Formats/PinsTxt450.cs | 117 + .../DataExchange/Formats/PpKeeperHtml270.cs | 191 + .../DataExchange/Formats/PwAgentXml2.cs | 155 + .../DataExchange/Formats/PwAgentXml3.cs | 200 + .../DataExchange/Formats/PwDepotXml26.cs | 458 + .../DataExchange/Formats/PwExporterXml105.cs | 178 + .../DataExchange/Formats/PwKeeperCsv70.cs | 102 + .../Formats/PwMemory2008Xml104.cs | 129 + .../DataExchange/Formats/PwPrompterDat12.cs | 160 + .../DataExchange/Formats/PwSafeXml302.cs | 351 + .../DataExchange/Formats/PwSaverXml412.cs | 209 + .../DataExchange/Formats/PwTresorXml100.cs | 123 + .../DataExchange/Formats/PwsPlusCsv1007.cs | 113 + .../DataExchange/Formats/RevelationXml04.cs | 184 + .../DataExchange/Formats/RoboFormHtml69.cs | 209 + .../DataExchange/Formats/SafeWalletXml3.cs | 183 + .../DataExchange/Formats/SecurityTxt12.cs | 135 + .../DataExchange/Formats/Spamex20070328.cs | 245 + .../DataExchange/Formats/SplashIdCsv402.cs | 296 + .../DataExchange/Formats/SteganosCsv20.cs | 182 + .../DataExchange/Formats/SteganosUI2007.cs | 142 + .../DataExchange/Formats/StickyPwXml50.cs | 253 + .../DataExchange/Formats/TrueKeyCsv4.cs | 259 + .../DataExchange/Formats/TurboPwsCsv5.cs | 117 + .../DataExchange/Formats/VisKeeperTxt3.cs | 133 + .../DataExchange/Formats/Whisper32Csv116.cs | 158 + .../DataExchange/Formats/WinFavorites10.cs | 331 + .../DataExchange/Formats/XslTransform2x.cs | 136 + .../DataExchange/Formats/ZdnPwProTxt314.cs | 172 + src/KeePass/DataExchange/GxiImporter.cs | 383 + src/KeePass/DataExchange/GxiProfile.cs | 387 + src/KeePass/DataExchange/ImportUtil.cs | 732 + src/KeePass/DataExchange/JsonObject.cs | 397 + src/KeePass/DataExchange/KdbFile.cs | 818 + src/KeePass/DataExchange/KdbManager.cs | 1163 ++ src/KeePass/DataExchange/PwExportInfo.cs | 118 + src/KeePass/Ecas/EcasAction.cs | 79 + src/KeePass/Ecas/EcasActionProvider.cs | 90 + src/KeePass/Ecas/EcasActionType.cs | 82 + src/KeePass/Ecas/EcasCondition.cs | 87 + src/KeePass/Ecas/EcasConditionProvider.cs | 87 + src/KeePass/Ecas/EcasConditionType.cs | 83 + src/KeePass/Ecas/EcasContext.cs | 73 + src/KeePass/Ecas/EcasDefaultActionProvider.cs | 738 + .../Ecas/EcasDefaultConditionProvider.cs | 179 + src/KeePass/Ecas/EcasDefaultEventProvider.cs | 224 + src/KeePass/Ecas/EcasEnum.cs | 101 + src/KeePass/Ecas/EcasEvent.cs | 112 + src/KeePass/Ecas/EcasEventProvider.cs | 91 + src/KeePass/Ecas/EcasEventType.cs | 83 + src/KeePass/Ecas/EcasParameter.cs | 69 + src/KeePass/Ecas/EcasPool.cs | 235 + src/KeePass/Ecas/EcasPropertyDictionary.cs | 69 + src/KeePass/Ecas/EcasSystemEvents.cs | 46 + src/KeePass/Ecas/EcasTrigger.cs | 248 + src/KeePass/Ecas/EcasTriggerSystem.cs | 242 + src/KeePass/Ecas/EcasUtil.cs | 527 + src/KeePass/Ecas/EcasValueType.cs | 33 + src/KeePass/Ecas/IEcasObject.cs | 43 + src/KeePass/Ecas/IEcasParameterized.cs | 34 + src/KeePass/Forms/AboutForm.Designer.cs | 206 + src/KeePass/Forms/AboutForm.cs | 286 + src/KeePass/Forms/AboutForm.resx | 120 + src/KeePass/Forms/AutoTypeCtxForm.Designer.cs | 173 + src/KeePass/Forms/AutoTypeCtxForm.cs | 282 + src/KeePass/Forms/AutoTypeCtxForm.resx | 120 + src/KeePass/Forms/CharPickerForm.Designer.cs | 269 + src/KeePass/Forms/CharPickerForm.cs | 351 + src/KeePass/Forms/CharPickerForm.resx | 120 + src/KeePass/Forms/ColumnsForm.Designer.cs | 182 + src/KeePass/Forms/ColumnsForm.cs | 461 + src/KeePass/Forms/ColumnsForm.resx | 120 + src/KeePass/Forms/CsvImportForm.Designer.cs | 605 + src/KeePass/Forms/CsvImportForm.cs | 937 ++ src/KeePass/Forms/CsvImportForm.resx | 120 + src/KeePass/Forms/DataEditorForm.Designer.cs | 597 + src/KeePass/Forms/DataEditorForm.cs | 695 + src/KeePass/Forms/DataEditorForm.resx | 132 + src/KeePass/Forms/DataViewerForm.Designer.cs | 239 + src/KeePass/Forms/DataViewerForm.cs | 675 + src/KeePass/Forms/DataViewerForm.resx | 126 + .../Forms/DatabaseOperationsForm.Designer.cs | 328 + src/KeePass/Forms/DatabaseOperationsForm.cs | 183 + src/KeePass/Forms/DatabaseOperationsForm.resx | 120 + .../Forms/DatabaseSettingsForm.Designer.cs | 869 ++ src/KeePass/Forms/DatabaseSettingsForm.cs | 827 ++ src/KeePass/Forms/DatabaseSettingsForm.resx | 123 + src/KeePass/Forms/DuplicationForm.Designer.cs | 160 + src/KeePass/Forms/DuplicationForm.cs | 131 + src/KeePass/Forms/DuplicationForm.resx | 123 + src/KeePass/Forms/EcasActionForm.Designer.cs | 161 + src/KeePass/Forms/EcasActionForm.cs | 114 + src/KeePass/Forms/EcasActionForm.resx | 120 + .../Forms/EcasConditionForm.Designer.cs | 174 + src/KeePass/Forms/EcasConditionForm.cs | 117 + src/KeePass/Forms/EcasConditionForm.resx | 120 + src/KeePass/Forms/EcasEventForm.Designer.cs | 161 + src/KeePass/Forms/EcasEventForm.cs | 112 + src/KeePass/Forms/EcasEventForm.resx | 120 + src/KeePass/Forms/EcasTriggerForm.Designer.cs | 620 + src/KeePass/Forms/EcasTriggerForm.cs | 424 + src/KeePass/Forms/EcasTriggerForm.resx | 120 + .../Forms/EcasTriggersForm.Designer.cs | 282 + src/KeePass/Forms/EcasTriggersForm.cs | 294 + src/KeePass/Forms/EcasTriggersForm.resx | 123 + .../Forms/EditAutoTypeItemForm.Designer.cs | 250 + src/KeePass/Forms/EditAutoTypeItemForm.cs | 712 + src/KeePass/Forms/EditAutoTypeItemForm.resx | 120 + src/KeePass/Forms/EditStringForm.Designer.cs | 222 + src/KeePass/Forms/EditStringForm.cs | 370 + src/KeePass/Forms/EditStringForm.resx | 126 + src/KeePass/Forms/EntropyForm.Designer.cs | 227 + src/KeePass/Forms/EntropyForm.cs | 235 + src/KeePass/Forms/EntropyForm.resx | 120 + .../Forms/ExchangeDataForm.Designer.cs | 350 + src/KeePass/Forms/ExchangeDataForm.cs | 402 + src/KeePass/Forms/ExchangeDataForm.resx | 123 + src/KeePass/Forms/FieldPickerForm.Designer.cs | 103 + src/KeePass/Forms/FieldPickerForm.cs | 184 + src/KeePass/Forms/FieldPickerForm.resx | 120 + src/KeePass/Forms/FieldRefForm.Designer.cs | 324 + src/KeePass/Forms/FieldRefForm.cs | 250 + src/KeePass/Forms/FieldRefForm.resx | 120 + src/KeePass/Forms/FileBrowserForm.Designer.cs | 140 + src/KeePass/Forms/FileBrowserForm.cs | 571 + src/KeePass/Forms/FileBrowserForm.resx | 120 + src/KeePass/Forms/GroupForm.Designer.cs | 478 + src/KeePass/Forms/GroupForm.cs | 293 + src/KeePass/Forms/GroupForm.resx | 123 + src/KeePass/Forms/HelpSourceForm.Designer.cs | 175 + src/KeePass/Forms/HelpSourceForm.cs | 104 + src/KeePass/Forms/HelpSourceForm.resx | 120 + .../Forms/IOConnectionForm.Designer.cs | 296 + src/KeePass/Forms/IOConnectionForm.cs | 494 + src/KeePass/Forms/IOConnectionForm.resx | 120 + src/KeePass/Forms/IconPickerForm.Designer.cs | 221 + src/KeePass/Forms/IconPickerForm.cs | 616 + src/KeePass/Forms/IconPickerForm.resx | 120 + .../Forms/ImportMethodForm.Designer.cs | 253 + src/KeePass/Forms/ImportMethodForm.cs | 102 + src/KeePass/Forms/ImportMethodForm.resx | 123 + .../Forms/InternalBrowserForm.Designer.cs | 231 + src/KeePass/Forms/InternalBrowserForm.cs | 147 + src/KeePass/Forms/InternalBrowserForm.resx | 129 + src/KeePass/Forms/KeyCreationForm.Designer.cs | 440 + src/KeePass/Forms/KeyCreationForm.cs | 398 + src/KeePass/Forms/KeyCreationForm.resx | 129 + .../Forms/KeyFileCreationForm.Designer.cs | 245 + src/KeePass/Forms/KeyFileCreationForm.cs | 241 + src/KeePass/Forms/KeyFileCreationForm.resx | 120 + src/KeePass/Forms/KeyPromptForm.Designer.cs | 239 + src/KeePass/Forms/KeyPromptForm.cs | 545 + src/KeePass/Forms/KeyPromptForm.resx | 123 + src/KeePass/Forms/LanguageForm.Designer.cs | 128 + src/KeePass/Forms/LanguageForm.cs | 311 + src/KeePass/Forms/LanguageForm.resx | 120 + src/KeePass/Forms/ListViewForm.Designer.cs | 167 + src/KeePass/Forms/ListViewForm.cs | 700 + src/KeePass/Forms/ListViewForm.resx | 123 + src/KeePass/Forms/MainForm.Designer.cs | 2811 ++++ src/KeePass/Forms/MainForm.cs | 2878 ++++ src/KeePass/Forms/MainForm.resx | 144 + src/KeePass/Forms/MainForm_Events.cs | 75 + src/KeePass/Forms/MainForm_Functions.cs | 6788 +++++++++ src/KeePass/Forms/OptionsForm.Designer.cs | 967 ++ src/KeePass/Forms/OptionsForm.cs | 1043 ++ src/KeePass/Forms/OptionsForm.resx | 123 + .../Forms/OtpGeneratorForm.Designer.cs | 469 + src/KeePass/Forms/OtpGeneratorForm.cs | 424 + src/KeePass/Forms/OtpGeneratorForm.resx | 126 + src/KeePass/Forms/PluginsForm.Designer.cs | 214 + src/KeePass/Forms/PluginsForm.cs | 222 + src/KeePass/Forms/PluginsForm.resx | 120 + src/KeePass/Forms/PrintForm.Designer.cs | 764 + src/KeePass/Forms/PrintForm.cs | 1130 ++ src/KeePass/Forms/PrintForm.resx | 120 + src/KeePass/Forms/ProxyForm.Designer.cs | 293 + src/KeePass/Forms/ProxyForm.cs | 183 + src/KeePass/Forms/ProxyForm.resx | 120 + src/KeePass/Forms/PwEntryForm.Designer.cs | 1784 +++ src/KeePass/Forms/PwEntryForm.cs | 2613 ++++ src/KeePass/Forms/PwEntryForm.resx | 141 + src/KeePass/Forms/PwGeneratorForm.Designer.cs | 611 + src/KeePass/Forms/PwGeneratorForm.cs | 650 + src/KeePass/Forms/PwGeneratorForm.resx | 123 + src/KeePass/Forms/SearchForm.Designer.cs | 489 + src/KeePass/Forms/SearchForm.cs | 414 + src/KeePass/Forms/SearchForm.resx | 123 + .../Forms/SingleLineEditForm.Designer.cs | 134 + src/KeePass/Forms/SingleLineEditForm.cs | 132 + src/KeePass/Forms/SingleLineEditForm.resx | 120 + .../Forms/StatusLoggerForm.Designer.cs | 110 + src/KeePass/Forms/StatusLoggerForm.cs | 196 + src/KeePass/Forms/StatusLoggerForm.resx | 120 + .../Forms/StatusProgressForm.Designer.cs | 92 + src/KeePass/Forms/StatusProgressForm.cs | 213 + src/KeePass/Forms/StatusProgressForm.resx | 120 + src/KeePass/Forms/TanWizardForm.Designer.cs | 200 + src/KeePass/Forms/TanWizardForm.cs | 157 + src/KeePass/Forms/TanWizardForm.resx | 123 + .../Forms/TextEncodingForm.Designer.cs | 150 + src/KeePass/Forms/TextEncodingForm.cs | 136 + src/KeePass/Forms/TextEncodingForm.resx | 120 + src/KeePass/Forms/UpdateCheckForm.Designer.cs | 129 + src/KeePass/Forms/UpdateCheckForm.cs | 204 + src/KeePass/Forms/UpdateCheckForm.resx | 120 + src/KeePass/Forms/UrlOverrideForm.Designer.cs | 128 + src/KeePass/Forms/UrlOverrideForm.cs | 73 + src/KeePass/Forms/UrlOverrideForm.resx | 120 + .../Forms/UrlOverridesForm.Designer.cs | 176 + src/KeePass/Forms/UrlOverridesForm.cs | 236 + src/KeePass/Forms/UrlOverridesForm.resx | 120 + src/KeePass/Forms/WebDocForm.Designer.cs | 69 + src/KeePass/Forms/WebDocForm.cs | 95 + src/KeePass/Forms/WebDocForm.resx | 120 + src/KeePass/Forms/XmlReplaceForm.Designer.cs | 349 + src/KeePass/Forms/XmlReplaceForm.cs | 154 + src/KeePass/Forms/XmlReplaceForm.resx | 120 + src/KeePass/Forms/_Accessories.cs | 314 + src/KeePass/KeePass.csproj | 1448 ++ src/KeePass/KeePass.ico | Bin 0 -> 64601 bytes src/KeePass/KeePass.pfx | Bin 0 -> 1756 bytes src/KeePass/Native/NativeMethods.Defs.cs | 471 + src/KeePass/Native/NativeMethods.New.cs | 877 ++ src/KeePass/Native/NativeMethods.Structs.cs | 397 + src/KeePass/Native/NativeMethods.Unix.cs | 233 + src/KeePass/Native/NativeMethods.cs | 526 + src/KeePass/Native/NativeProgressDialog.cs | 163 + src/KeePass/Native/ShellLinkEx.cs | 183 + src/KeePass/Plugins/DefaultPluginHost.cs | 132 + src/KeePass/Plugins/IPluginHost.cs | 82 + src/KeePass/Plugins/PlgxCache.cs | 277 + src/KeePass/Plugins/PlgxCsprojLoader.cs | 169 + src/KeePass/Plugins/PlgxPlugin.cs | 846 ++ src/KeePass/Plugins/PlgxPluginInfo.cs | 163 + src/KeePass/Plugins/Plugin.cs | 116 + src/KeePass/Plugins/PluginInfo.cs | 109 + src/KeePass/Plugins/PluginManager.cs | 576 + src/KeePass/Program.cs | 1154 ++ src/KeePass/Properties/AssemblyInfo.cs | 42 + src/KeePass/Properties/Resources.Designer.cs | 1015 ++ src/KeePass/Properties/Resources.resx | 529 + .../Resources/Data/Images_App_HighRes.bin | Bin 0 -> 348772 bytes .../Resources/Data/Images_Client_16.bin | Bin 0 -> 66057 bytes .../Resources/Data/Images_Client_HighRes.bin | Bin 0 -> 263307 bytes .../Data/MostPopularPasswords.txt.gz | Bin 0 -> 25584 bytes src/KeePass/Resources/Icons/KeePass.ico | Bin 0 -> 64601 bytes src/KeePass/Resources/Icons/LockOverlay.ico | Bin 0 -> 5430 bytes src/KeePass/Resources/Icons/QuadLocked.ico | Bin 0 -> 26678 bytes src/KeePass/Resources/Icons/QuadNormal.ico | Bin 0 -> 26678 bytes .../Resources/Images/B16x16_FontBold.png | Bin 0 -> 156 bytes .../Resources/Images/B16x16_FontItalic.png | Bin 0 -> 155 bytes .../Resources/Images/B16x16_FontStrikeout.png | Bin 0 -> 120 bytes .../Resources/Images/B16x16_FontUnderline.png | Bin 0 -> 107 bytes .../Resources/Images/B16x16_KeePass.png | Bin 0 -> 823 bytes .../Resources/Images/B16x16_LockWorkspace.png | Bin 0 -> 696 bytes .../Resources/Images/B16x16_MenuCheck.png | Bin 0 -> 269 bytes .../Resources/Images/B16x16_MenuRadio.png | Bin 0 -> 342 bytes .../Resources/Images/B16x16_Transparent.png | Bin 0 -> 85 bytes .../Resources/Images/B19x07_3BlackDots.png | Bin 0 -> 104 bytes .../Resources/Images/B48x35_WritingHand.png | Bin 0 -> 1257 bytes src/KeePass/Resources/KPRes.Generated.cs | 12311 ++++++++++++++++ src/KeePass/Resources/KPRes.cs | 133 + .../Resources/Nuvola/B16x16_1DownArrow.png | Bin 0 -> 808 bytes .../Resources/Nuvola/B16x16_1UpArrow.png | Bin 0 -> 781 bytes .../Resources/Nuvola/B16x16_2DownArrow.png | Bin 0 -> 1063 bytes .../Resources/Nuvola/B16x16_2UpArrow.png | Bin 0 -> 1037 bytes src/KeePass/Resources/Nuvola/B16x16_ASCII.png | Bin 0 -> 560 bytes src/KeePass/Resources/Nuvola/B16x16_Apply.png | Bin 0 -> 883 bytes .../Resources/Nuvola/B16x16_Attach.png | Bin 0 -> 1026 bytes .../Resources/Nuvola/B16x16_Binary.png | Bin 0 -> 839 bytes .../Resources/Nuvola/B16x16_BlockDevice.png | Bin 0 -> 848 bytes .../Resources/Nuvola/B16x16_Browser.png | Bin 0 -> 1154 bytes .../Resources/Nuvola/B16x16_Color_Fill.png | Bin 0 -> 996 bytes .../Resources/Nuvola/B16x16_Colorize.png | Bin 0 -> 1137 bytes .../Resources/Nuvola/B16x16_CompFile.png | Bin 0 -> 623 bytes .../Resources/Nuvola/B16x16_Configure.png | Bin 0 -> 980 bytes src/KeePass/Resources/Nuvola/B16x16_Cut.png | Bin 0 -> 1024 bytes src/KeePass/Resources/Nuvola/B16x16_Edit.png | Bin 0 -> 734 bytes .../Resources/Nuvola/B16x16_EditCopy.png | Bin 0 -> 730 bytes .../Resources/Nuvola/B16x16_EditDelete.png | Bin 0 -> 860 bytes .../Resources/Nuvola/B16x16_EditPaste.png | Bin 0 -> 911 bytes .../Resources/Nuvola/B16x16_EditShred.png | Bin 0 -> 703 bytes src/KeePass/Resources/Nuvola/B16x16_Error.png | Bin 0 -> 1150 bytes src/KeePass/Resources/Nuvola/B16x16_Exit.png | Bin 0 -> 995 bytes src/KeePass/Resources/Nuvola/B16x16_FTP.png | Bin 0 -> 919 bytes .../Resources/Nuvola/B16x16_FileNew.png | Bin 0 -> 805 bytes .../Resources/Nuvola/B16x16_FilePrint.png | Bin 0 -> 1020 bytes .../Nuvola/B16x16_FileQuickPrint.png | Bin 0 -> 1192 bytes .../Resources/Nuvola/B16x16_FileSave.png | Bin 0 -> 898 bytes .../Resources/Nuvola/B16x16_FileSaveAs.png | Bin 0 -> 1009 bytes .../Resources/Nuvola/B16x16_File_Locked.png | Bin 0 -> 999 bytes .../Resources/Nuvola/B16x16_Folder.png | Bin 0 -> 403 bytes .../Nuvola/B16x16_Folder_Blue_Open.png | Bin 0 -> 599 bytes .../Resources/Nuvola/B16x16_Folder_Home.png | Bin 0 -> 1063 bytes .../Resources/Nuvola/B16x16_Folder_Inbox.png | Bin 0 -> 500 bytes .../Resources/Nuvola/B16x16_Folder_Locked.png | Bin 0 -> 798 bytes .../Resources/Nuvola/B16x16_Folder_Outbox.png | Bin 0 -> 452 bytes .../Resources/Nuvola/B16x16_Folder_Txt.png | Bin 0 -> 834 bytes .../Nuvola/B16x16_Folder_Yellow_Open.png | Bin 0 -> 617 bytes src/KeePass/Resources/Nuvola/B16x16_HTML.png | Bin 0 -> 951 bytes src/KeePass/Resources/Nuvola/B16x16_Help.png | Bin 0 -> 896 bytes .../Resources/Nuvola/B16x16_History.png | Bin 0 -> 1166 bytes .../Resources/Nuvola/B16x16_History_Clear.png | Bin 0 -> 1199 bytes .../Resources/Nuvola/B16x16_HwInfo.png | Bin 0 -> 1122 bytes .../Resources/Nuvola/B16x16_Identity.png | Bin 0 -> 874 bytes .../Resources/Nuvola/B16x16_KGPG_Gen.png | Bin 0 -> 1015 bytes .../Resources/Nuvola/B16x16_KGPG_Import.png | Bin 0 -> 986 bytes .../Resources/Nuvola/B16x16_KGPG_Info.png | Bin 0 -> 774 bytes .../Resources/Nuvola/B16x16_KGPG_Key1.png | Bin 0 -> 570 bytes .../Resources/Nuvola/B16x16_KGPG_Key2.png | Bin 0 -> 850 bytes .../Resources/Nuvola/B16x16_KGPG_Key3.png | Bin 0 -> 946 bytes .../Resources/Nuvola/B16x16_KGPG_Sign.png | Bin 0 -> 944 bytes .../Resources/Nuvola/B16x16_KNotes.png | Bin 0 -> 954 bytes .../Resources/Nuvola/B16x16_KOrganizer.png | Bin 0 -> 1073 bytes .../Resources/Nuvola/B16x16_KRec_Record.png | Bin 0 -> 647 bytes .../Resources/Nuvola/B16x16_KTouch.png | Bin 0 -> 1130 bytes .../Resources/Nuvola/B16x16_KaboodleLoop.png | Bin 0 -> 1068 bytes .../Nuvola/B16x16_Keyboard_Layout.png | Bin 0 -> 1078 bytes .../Resources/Nuvola/B16x16_Laptop_Charge.png | Bin 0 -> 1189 bytes .../Resources/Nuvola/B16x16_Make_KDevelop.png | Bin 0 -> 973 bytes .../Nuvola/B16x16_MessageBox_Critical.png | Bin 0 -> 1032 bytes .../Nuvola/B16x16_MessageBox_Info.png | Bin 0 -> 978 bytes .../Nuvola/B16x16_MessageBox_Warning.png | Bin 0 -> 937 bytes src/KeePass/Resources/Nuvola/B16x16_Misc.png | Bin 0 -> 1041 bytes src/KeePass/Resources/Nuvola/B16x16_No.png | Bin 0 -> 746 bytes .../Nuvola/B16x16_Package_Development.png | Bin 0 -> 985 bytes .../Nuvola/B16x16_Package_Settings.png | Bin 0 -> 1139 bytes .../Resources/Nuvola/B16x16_Personal.png | Bin 0 -> 1130 bytes src/KeePass/Resources/Nuvola/B16x16_Redo.png | Bin 0 -> 708 bytes .../Resources/Nuvola/B16x16_Reload_Page.png | Bin 0 -> 1147 bytes .../Resources/Nuvola/B16x16_Services.png | Bin 0 -> 1030 bytes .../Resources/Nuvola/B16x16_Spreadsheet.png | Bin 0 -> 990 bytes .../Resources/Nuvola/B16x16_Toggle_Log.png | Bin 0 -> 954 bytes .../Resources/Nuvola/B16x16_Trashcan_Full.png | Bin 0 -> 1115 bytes src/KeePass/Resources/Nuvola/B16x16_Undo.png | Bin 0 -> 707 bytes .../Resources/Nuvola/B16x16_View_Detailed.png | Bin 0 -> 961 bytes src/KeePass/Resources/Nuvola/B16x16_WWW.png | Bin 0 -> 1154 bytes .../Resources/Nuvola/B16x16_Wizard.png | Bin 0 -> 899 bytes src/KeePass/Resources/Nuvola/B16x16_XMag.png | Bin 0 -> 601 bytes .../Resources/Nuvola/B32x32_Trashcan_Full.png | Bin 0 -> 2844 bytes src/KeePass/Resources/Nuvola/B48x48_Ark.png | Bin 0 -> 3979 bytes .../Resources/Nuvola/B48x48_Binary.png | Bin 0 -> 2728 bytes .../Resources/Nuvola/B48x48_BlockDevice.png | Bin 0 -> 3365 bytes .../Resources/Nuvola/B48x48_FilePrint.png | Bin 0 -> 3369 bytes .../Nuvola/B48x48_Folder_Download.png | Bin 0 -> 5102 bytes .../Resources/Nuvola/B48x48_Folder_Txt.png | Bin 0 -> 5527 bytes src/KeePass/Resources/Nuvola/B48x48_Font.png | Bin 0 -> 2301 bytes .../Resources/Nuvola/B48x48_KCMSystem.png | Bin 0 -> 4436 bytes .../Resources/Nuvola/B48x48_KGPG_Gen.png | Bin 0 -> 5140 bytes .../Resources/Nuvola/B48x48_KGPG_Key2.png | Bin 0 -> 4199 bytes .../Resources/Nuvola/B48x48_KGPG_Sign.png | Bin 0 -> 4476 bytes src/KeePass/Resources/Nuvola/B48x48_KMag.png | Bin 0 -> 4442 bytes .../Resources/Nuvola/B48x48_KOrganizer.png | Bin 0 -> 6476 bytes .../Nuvola/B48x48_Keyboard_Layout.png | Bin 0 -> 3548 bytes .../Resources/Nuvola/B48x48_Make_KDevelop.png | Bin 0 -> 3190 bytes .../Nuvola/B48x48_MessageBox_Info.png | Bin 0 -> 3829 bytes .../Nuvola/B48x48_Package_Settings.png | Bin 0 -> 5994 bytes src/KeePass/Resources/Nuvola/B48x48_Run.png | Bin 0 -> 3171 bytes .../Resources/Nuvola/B48x48_Source_Moc.png | Bin 0 -> 3342 bytes .../Resources/Nuvola/B48x48_View_Detailed.png | Bin 0 -> 2768 bytes src/KeePass/Resources/Nuvola/B48x48_WWW.png | Bin 0 -> 5594 bytes .../Resources/Nuvola/B48x48_Wizard.png | Bin 0 -> 2743 bytes src/KeePass/Resources/Nuvola/B48x48_XMag.png | Bin 0 -> 3779 bytes .../Nuvola_Derived/B15x14_FileNew.png | Bin 0 -> 579 bytes .../Nuvola_Derived/B16x16_DeleteEntry.png | Bin 0 -> 641 bytes .../Nuvola_Derived/B16x16_EditCopyLink.png | Bin 0 -> 703 bytes .../Nuvola_Derived/B16x16_EditCopyUrl.png | Bin 0 -> 673 bytes .../B16x16_FileSave_Disabled.png | Bin 0 -> 532 bytes .../Nuvola_Derived/B16x16_File_Close.png | Bin 0 -> 746 bytes .../Nuvola_Derived/B16x16_File_SaveAll.png | Bin 0 -> 433 bytes .../B16x16_File_SaveAll_Disabled.png | Bin 0 -> 398 bytes .../Nuvola_Derived/B16x16_Folder_2.png | Bin 0 -> 629 bytes .../Nuvola_Derived/B16x16_Folder_New_Ex.png | Bin 0 -> 679 bytes .../Nuvola_Derived/B16x16_Key_New.png | Bin 0 -> 718 bytes .../Nuvola_Derived/B16x16_TextAlignCenter.png | Bin 0 -> 424 bytes .../Nuvola_Derived/B16x16_TextAlignLeft.png | Bin 0 -> 422 bytes .../Nuvola_Derived/B16x16_TextAlignRight.png | Bin 0 -> 424 bytes .../B16x16_Window_2Horz1Vert.png | Bin 0 -> 575 bytes .../Nuvola_Derived/B16x16_Window_3Horz.png | Bin 0 -> 533 bytes src/KeePass/UI/AccessKeyManagerEx.cs | 148 + src/KeePass/UI/AccessibilityEx.cs | 293 + src/KeePass/UI/AsyncPwListUpdate.cs | 270 + src/KeePass/UI/BackgroundForm.cs | 49 + src/KeePass/UI/BannerFactory.cs | 470 + src/KeePass/UI/CheckedLVItemDXList.cs | 304 + src/KeePass/UI/ColorButtonEx.cs | 174 + src/KeePass/UI/ColorMenuItem.cs | 86 + src/KeePass/UI/ColumnProvider.cs | 62 + src/KeePass/UI/ColumnProviderPool.cs | 133 + src/KeePass/UI/CustomContextMenuEx.cs | 46 + src/KeePass/UI/CustomContextMenuStripEx.cs | 68 + src/KeePass/UI/CustomListViewEx.cs | 382 + src/KeePass/UI/CustomMenuStripEx.cs | 77 + src/KeePass/UI/CustomMessageFilterEx.cs | 58 + src/KeePass/UI/CustomRichTextBoxEx.cs | 729 + src/KeePass/UI/CustomSplitContainerEx.cs | 195 + src/KeePass/UI/CustomToolStripEx.cs | 97 + src/KeePass/UI/CustomTreeViewEx.cs | 230 + src/KeePass/UI/DocumentManagerEx.cs | 307 + src/KeePass/UI/DpiUtil.cs | 304 + src/KeePass/UI/DwmUtil.cs | 227 + src/KeePass/UI/DynamicMenu.cs | 143 + src/KeePass/UI/EnableThemingInScope.cs | 141 + src/KeePass/UI/ExpiryControlGroup.cs | 131 + src/KeePass/UI/FileDialogsEx.cs | 443 + src/KeePass/UI/FileIcons.cs | 265 + src/KeePass/UI/FontControlGroup.cs | 167 + src/KeePass/UI/FontUtil.cs | 263 + src/KeePass/UI/GlobalWindowManager.cs | 429 + src/KeePass/UI/HotKeyControlEx.cs | 179 + src/KeePass/UI/IGwmWindow.cs | 33 + src/KeePass/UI/IconColorizer.cs | 270 + src/KeePass/UI/ImageComboBoxEx.cs | 123 + src/KeePass/UI/KeyboardControl.cs | 157 + src/KeePass/UI/ListSorter.cs | 127 + src/KeePass/UI/ListViewGroupingMenu.cs | 153 + src/KeePass/UI/ListViewSortMenu.cs | 217 + src/KeePass/UI/ListViewStateEx.cs | 54 + src/KeePass/UI/MenuItemLinks.cs | 174 + src/KeePass/UI/MruList.cs | 388 + src/KeePass/UI/NotifyIconEx.cs | 177 + src/KeePass/UI/OnDemandStatusDialog.cs | 253 + src/KeePass/UI/OpenWithMenu.cs | 488 + src/KeePass/UI/PromptedTextBox.cs | 69 + src/KeePass/UI/ProtectedDialog.cs | 470 + src/KeePass/UI/PwGeneratorMenu.cs | 268 + src/KeePass/UI/PwInputControlGroup.cs | 571 + src/KeePass/UI/QualityProgressBar.cs | 257 + src/KeePass/UI/RichTextBoxContextMenu.cs | 253 + src/KeePass/UI/RichTextBuilder.cs | 314 + src/KeePass/UI/RtlAwareResizeScope.cs | 96 + src/KeePass/UI/SecureTextBoxEx.cs | 276 + src/KeePass/UI/ShowWarningsLogger.cs | 204 + src/KeePass/UI/SplitButtonEx.cs | 109 + src/KeePass/UI/StatusBarLogger.cs | 139 + src/KeePass/UI/StatusUtil.cs | 121 + src/KeePass/UI/SuspendLayoutScope.cs | 75 + src/KeePass/UI/TabControlEx.cs | 61 + src/KeePass/UI/TaskbarList.cs | 162 + .../UI/ToolStripRendering/KeePassTsr.cs | 205 + .../UI/ToolStripRendering/ProExtTsr.cs | 293 + .../UI/ToolStripRendering/SystemTsr.cs | 510 + .../UI/ToolStripRendering/TsrFactory.cs | 41 + src/KeePass/UI/ToolStripRendering/TsrPool.cs | 170 + .../UI/ToolStripRendering/VisualStyleTsr.cs | 287 + src/KeePass/UI/ToolStripRendering/Win10Tsr.cs | 398 + src/KeePass/UI/ToolStripRendering/Win81Tsr.cs | 397 + src/KeePass/UI/UISystemFonts.cs | 201 + src/KeePass/UI/UIUtil.cs | 3905 +++++ src/KeePass/UI/VistaTaskDialog.cs | 590 + src/KeePass/Util/AppLocator.cs | 510 + src/KeePass/Util/Archive/ImageArchive.cs | 174 + src/KeePass/Util/Archive/XspArchive.cs | 142 + src/KeePass/Util/Archive/ZipArchiveEx.cs | 93 + src/KeePass/Util/AutoType.cs | 779 + src/KeePass/Util/AutoTypeCtx.cs | 162 + src/KeePass/Util/BinaryDataClassifier.cs | 212 + src/KeePass/Util/BinaryDataUtil.cs | 392 + .../Util/CancellableOperationEventArgs.cs | 47 + src/KeePass/Util/ChildProcessesSnapshot.cs | 195 + src/KeePass/Util/ClipboardContents.cs | 95 + .../Util/ClipboardEventChainBlocker.cs | 105 + src/KeePass/Util/ClipboardUtil.Unix.cs | 206 + src/KeePass/Util/ClipboardUtil.Uwp.cs | 174 + src/KeePass/Util/ClipboardUtil.Windows.cs | 234 + src/KeePass/Util/ClipboardUtil.cs | 342 + src/KeePass/Util/CommandLineArgs.cs | 186 + src/KeePass/Util/CriticalSectionEx.cs | 79 + src/KeePass/Util/CustomResourceManager.cs | 206 + src/KeePass/Util/DiffUtil.cs | 919 ++ src/KeePass/Util/EmergencySheet.cs | 514 + src/KeePass/Util/EntryMenu.cs | 212 + src/KeePass/Util/EntryTemplates.cs | 291 + src/KeePass/Util/EntryUtil.cs | 1711 +++ src/KeePass/Util/FileSearchEx.cs | 467 + src/KeePass/Util/GlobalMutexPool.cs | 224 + src/KeePass/Util/HotKeyManager.cs | 304 + src/KeePass/Util/IniFile.cs | 94 + src/KeePass/Util/IpcBroadcast.Fsw.cs | 302 + src/KeePass/Util/IpcBroadcast.Tcp.cs | 271 + src/KeePass/Util/IpcBroadcast.cs | 161 + src/KeePass/Util/IpcUtilEx.cs | 312 + src/KeePass/Util/KeyUtil.cs | 331 + .../MultipleValues/MultipleValuesContext.cs | 50 + .../MultipleValuesEntryContext.cs | 522 + .../Util/MultipleValues/MultipleValuesEx.cs | 190 + src/KeePass/Util/NetUtil.cs | 139 + src/KeePass/Util/PrintUtil.cs | 160 + src/KeePass/Util/PwGeneratorUtil.cs | 221 + src/KeePass/Util/SearchUtil.cs | 87 + src/KeePass/Util/SendInputEx.cs | 681 + src/KeePass/Util/SendInputExt/ISiEngine.cs | 41 + src/KeePass/Util/SendInputExt/SiCodes.cs | 458 + src/KeePass/Util/SendInputExt/SiEngineStd.cs | 196 + src/KeePass/Util/SendInputExt/SiEngineUnix.cs | 112 + src/KeePass/Util/SendInputExt/SiEngineWin.cs | 791 + src/KeePass/Util/SendInputExt/SiEventArgs.cs | 39 + src/KeePass/Util/SendInputExt/SiObf.cs | 173 + src/KeePass/Util/SendInputExt/SiWindowInfo.cs | 232 + src/KeePass/Util/SessionLockNotifier.cs | 136 + src/KeePass/Util/ShellUtil.cs | 185 + src/KeePass/Util/ShutdownBlocker.cs | 92 + src/KeePass/Util/Spr/SprContext.cs | 224 + src/KeePass/Util/Spr/SprEncoding.cs | 79 + src/KeePass/Util/Spr/SprEngine.PickChars.cs | 291 + src/KeePass/Util/Spr/SprEngine.cs | 1026 ++ src/KeePass/Util/Spr/SprRefCache.cs | 123 + src/KeePass/Util/Spr/SprSyntax.cs | 359 + src/KeePass/Util/TagUtil.cs | 208 + src/KeePass/Util/TempFilesPool.cs | 356 + src/KeePass/Util/TextSimilarity.cs | 90 + src/KeePass/Util/UpdateCheckEx.cs | 623 + src/KeePass/Util/WinUtil.cs | 902 ++ .../XmlSerialization/XmlSerializerEx.Gen.cs | 3346 +++++ .../Util/XmlSerialization/XmlSerializerEx.cs | 558 + src/KeePass/Util/XmlUtil.Merge.cs | 586 + src/KeePass/Util/XmlUtil.Replace.cs | 360 + src/KeePass/Util/XmlUtil.cs | 399 + src/KeePassLib/Collections/AutoTypeConfig.cs | 244 + .../Collections/ProtectedBinaryDictionary.cs | 172 + .../Collections/ProtectedBinarySet.cs | 170 + .../Collections/ProtectedStringDictionary.cs | 298 + src/KeePassLib/Collections/PwObjectList.cs | 298 + src/KeePassLib/Collections/PwObjectPool.cs | 232 + .../Collections/StringDictionaryEx.cs | 171 + .../Collections/VariantDictionary.cs | 415 + .../Cryptography/Cipher/ChaCha20Cipher.cs | 254 + .../Cryptography/Cipher/ChaCha20Engine.cs | 190 + .../Cryptography/Cipher/CipherPool.cs | 165 + .../Cryptography/Cipher/CtrBlockCipher.cs | 109 + .../Cryptography/Cipher/ICipherEngine.cs | 69 + .../Cryptography/Cipher/Salsa20Cipher.cs | 165 + .../Cryptography/Cipher/StandardAesEngine.cs | 133 + src/KeePassLib/Cryptography/CryptoRandom.cs | 385 + .../Cryptography/CryptoRandomStream.cs | 281 + src/KeePassLib/Cryptography/CryptoStreamEx.cs | 66 + src/KeePassLib/Cryptography/CryptoUtil.cs | 254 + src/KeePassLib/Cryptography/Hash/Blake2b.cs | 232 + .../Cryptography/HashingStreamEx.cs | 187 + src/KeePassLib/Cryptography/HmacOtp.cs | 148 + .../KeyDerivation/AesKdf.GCrypt.cs | 223 + .../Cryptography/KeyDerivation/AesKdf.cs | 279 + .../KeyDerivation/Argon2Kdf.Core.cs | 682 + .../Cryptography/KeyDerivation/Argon2Kdf.cs | 255 + .../Cryptography/KeyDerivation/KdfEngine.cs | 142 + .../KeyDerivation/KdfParameters.cs | 80 + .../Cryptography/KeyDerivation/KdfPool.cs | 97 + .../CharSetBasedGenerator.cs | 64 + .../PasswordGenerator/CustomPwGenerator.cs | 66 + .../CustomPwGeneratorPool.cs | 110 + .../PatternBasedGenerator.cs | 173 + .../PasswordGenerator/PwCharSet.cs | 306 + .../PasswordGenerator/PwGenerator.cs | 221 + .../PasswordGenerator/PwProfile.cs | 276 + .../Cryptography/PopularPasswords.cs | 133 + .../Cryptography/QualityEstimation.cs | 779 + src/KeePassLib/Cryptography/SelfTest.cs | 1364 ++ src/KeePassLib/Delegates/Handlers.cs | 66 + src/KeePassLib/Interfaces/IDeepCloneable.cs | 37 + src/KeePassLib/Interfaces/IStatusLogger.cs | 105 + src/KeePassLib/Interfaces/IStructureItem.cs | 42 + src/KeePassLib/Interfaces/ITimeLogger.cs | 105 + src/KeePassLib/Interfaces/IUIOperations.cs | 37 + src/KeePassLib/Interfaces/IXmlSerializerEx.cs | 33 + src/KeePassLib/KeePassLib.csproj | 174 + src/KeePassLib/KeePassLib.pfx | Bin 0 -> 1756 bytes src/KeePassLib/Keys/CompositeKey.cs | 357 + src/KeePassLib/Keys/IUserKey.cs | 46 + src/KeePassLib/Keys/KcpCustomKey.cs | 68 + src/KeePassLib/Keys/KcpKeyFile.Xml.cs | 281 + src/KeePassLib/Keys/KcpKeyFile.cs | 198 + src/KeePassLib/Keys/KcpPassword.cs | 111 + src/KeePassLib/Keys/KcpUserAccount.cs | 149 + src/KeePassLib/Keys/KeyProvider.cs | 152 + src/KeePassLib/Keys/KeyProviderPool.cs | 78 + src/KeePassLib/Keys/KeyValidator.cs | 51 + src/KeePassLib/Keys/KeyValidatorPool.cs | 86 + src/KeePassLib/Keys/UserKeyType.cs | 33 + src/KeePassLib/Native/ClipboardU.cs | 190 + src/KeePassLib/Native/NativeBufferEx.cs | 141 + src/KeePassLib/Native/NativeLib.cs | 664 + src/KeePassLib/Native/NativeMethods.Unix.cs | 237 + src/KeePassLib/Native/NativeMethods.cs | 270 + src/KeePassLib/Native/SimpleStat.cs | 150 + src/KeePassLib/Properties/AssemblyInfo.cs | 42 + src/KeePassLib/PwCustomIcon.cs | 154 + src/KeePassLib/PwDatabase.cs | 2251 +++ src/KeePassLib/PwDefs.cs | 599 + src/KeePassLib/PwDeletedObject.cs | 86 + src/KeePassLib/PwEntry.cs | 962 ++ src/KeePassLib/PwEnums.cs | 327 + src/KeePassLib/PwGroup.Search.cs | 414 + src/KeePassLib/PwGroup.cs | 1605 ++ src/KeePassLib/PwUuid.cs | 218 + src/KeePassLib/Resources/KLRes.Generated.cs | 689 + src/KeePassLib/Resources/KLRes.cs | 33 + src/KeePassLib/Resources/KSRes.Generated.cs | 52 + src/KeePassLib/Security/ProtectedBinary.cs | 464 + src/KeePassLib/Security/ProtectedString.cs | 434 + src/KeePassLib/Security/XorredBuffer.cs | 109 + .../Serialization/BinaryReaderEx.cs | 92 + src/KeePassLib/Serialization/FileLock.cs | 265 + .../Serialization/FileTransactionEx.cs | 541 + .../Serialization/HashedBlockStream.cs | 319 + .../Serialization/HmacBlockStream.cs | 333 + src/KeePassLib/Serialization/IOConnection.cs | 904 ++ .../Serialization/IOConnectionInfo.cs | 359 + src/KeePassLib/Serialization/IocProperties.cs | 192 + .../Serialization/IocPropertyInfo.cs | 99 + .../Serialization/IocPropertyInfoPool.cs | 123 + .../Serialization/KdbxFile.Read.Streamed.cs | 1085 ++ src/KeePassLib/Serialization/KdbxFile.Read.cs | 560 + .../Serialization/KdbxFile.Write.cs | 1066 ++ src/KeePassLib/Serialization/KdbxFile.cs | 565 + .../Serialization/OldFormatException.cs | 66 + .../Translation/KPControlCustomization.cs | 399 + .../Translation/KPFormCustomization.cs | 108 + src/KeePassLib/Translation/KPStringTable.cs | 102 + .../Translation/KPStringTableItem.cs | 51 + src/KeePassLib/Translation/KPTranslation.cs | 326 + .../Translation/KPTranslationProperties.cs | 105 + src/KeePassLib/Utility/AppLogEx.cs | 103 + src/KeePassLib/Utility/GfxUtil.cs | 580 + src/KeePassLib/Utility/MemUtil.cs | 992 ++ src/KeePassLib/Utility/MessageService.cs | 458 + src/KeePassLib/Utility/MonoWorkarounds.cs | 647 + src/KeePassLib/Utility/StrUtil.cs | 2102 +++ src/KeePassLib/Utility/TimeUtil.cs | 497 + src/KeePassLib/Utility/TypeOverridePool.cs | 65 + src/KeePassLib/Utility/UrlUtil.cs | 997 ++ src/KeePassLib/Utility/XmlUtilEx.cs | 290 + src/ReadMe_PFX.txt | 16 + src/ShInstUtil/Resource.h | 14 + .../Resources/TrustInfoManifest.xml | 10 + src/ShInstUtil/ShInstUtil.cpp | 306 + src/ShInstUtil/ShInstUtil.h | 112 + src/ShInstUtil/ShInstUtil.rc | 114 + src/ShInstUtil/ShInstUtil.sln | 20 + src/ShInstUtil/ShInstUtil.vcproj | 212 + src/Translation/DefaultText.xml | 2990 ++++ src/Translation/DefaultTextSD.xml | 8 + src/Translation/DefaultUpdateCs.bat | 9 + src/Translation/TrlUtil/AccelKeysCheck.cs | 141 + .../App/Configuration/TceApplication.cs | 45 + .../TrlUtil/App/Configuration/TceConfig.cs | 102 + src/Translation/TrlUtil/App/TuDefs.cs | 32 + src/Translation/TrlUtil/FormTrlMgr.cs | 244 + src/Translation/TrlUtil/MainForm.Designer.cs | 899 ++ src/Translation/TrlUtil/MainForm.cs | 1255 ++ src/Translation/TrlUtil/MainForm.resx | 126 + .../TrlUtil/Native/NativeMethods.cs | 58 + src/Translation/TrlUtil/PreviewForm.cs | 277 + src/Translation/TrlUtil/Program.cs | 254 + .../TrlUtil/Properties/AssemblyInfo.cs | 42 + .../TrlUtil/Properties/Resources.Designer.cs | 154 + .../TrlUtil/Properties/Resources.resx | 160 + .../TrlUtil/Resources/B16x16_Binary.png | Bin 0 -> 839 bytes .../TrlUtil/Resources/B16x16_Down.png | Bin 0 -> 912 bytes .../TrlUtil/Resources/B16x16_FileSave.png | Bin 0 -> 898 bytes .../TrlUtil/Resources/B16x16_FileSaveAs.png | Bin 0 -> 1009 bytes .../Resources/B16x16_Folder_Yellow_Open.png | Bin 0 -> 617 bytes .../TrlUtil/Resources/B16x16_KRec_Record.png | Bin 0 -> 707 bytes .../Resources/B16x16_Keyboard_Layout.png | Bin 0 -> 1078 bytes .../TrlUtil/Resources/B16x16_LedGreen.png | Bin 0 -> 1160 bytes .../TrlUtil/Resources/B16x16_LedLightBlue.png | Bin 0 -> 1025 bytes .../Resources/B16x16_LedLightGreen.png | Bin 0 -> 1074 bytes .../TrlUtil/Resources/B16x16_LedOrange.png | Bin 0 -> 1033 bytes .../TrlUtil/Resources/B16x16_View_Remove.png | Bin 0 -> 708 bytes src/Translation/TrlUtil/Resources/KeePass.ico | Bin 0 -> 64601 bytes src/Translation/TrlUtil/TrlImport.cs | 151 + src/Translation/TrlUtil/TrlUtil.csproj | 129 + 1215 files changed, 220549 insertions(+) create mode 100644 src/Build/Clean.bat create mode 100644 src/Build/KeePassLib_Distrib/KeePassLib.dll create mode 100644 src/Build/KeePassLib_Distrib/KeePassLib.xml create mode 100644 src/Build/PrepMonoDev.sh create mode 100644 src/Docs/Chm/KeePass.hhp create mode 100644 src/Docs/Chm/KeePassContents.hhc create mode 100644 src/Docs/Chm/default.css create mode 100644 src/Docs/Chm/help/base/autotype.html create mode 100644 src/Docs/Chm/help/base/autourl.html create mode 100644 src/Docs/Chm/help/base/cmdline.html create mode 100644 src/Docs/Chm/help/base/configuration.html create mode 100644 src/Docs/Chm/help/base/credits.html create mode 100644 src/Docs/Chm/help/base/faq.html create mode 100644 src/Docs/Chm/help/base/faq_tech.html create mode 100644 src/Docs/Chm/help/base/fieldrefs.html create mode 100644 src/Docs/Chm/help/base/firststeps.html create mode 100644 src/Docs/Chm/help/base/importexport.html create mode 100644 src/Docs/Chm/help/base/index.html create mode 100644 src/Docs/Chm/help/base/integration.html create mode 100644 src/Docs/Chm/help/base/keys.html create mode 100644 src/Docs/Chm/help/base/license_lgpl.html create mode 100644 src/Docs/Chm/help/base/multiuser.html create mode 100644 src/Docs/Chm/help/base/placeholders.html create mode 100644 src/Docs/Chm/help/base/pwgenerator.html create mode 100644 src/Docs/Chm/help/base/repair.html create mode 100644 src/Docs/Chm/help/base/search.html create mode 100644 src/Docs/Chm/help/base/secedits.html create mode 100644 src/Docs/Chm/help/base/security.html create mode 100644 src/Docs/Chm/help/base/tans.html create mode 100644 src/Docs/Chm/help/base/terms.html create mode 100644 src/Docs/Chm/help/base/usingpws.html create mode 100644 src/Docs/Chm/help/images/appicons.png create mode 100644 src/Docs/Chm/help/images/b16x16_ascii.png create mode 100644 src/Docs/Chm/help/images/b16x16_binary.png create mode 100644 src/Docs/Chm/help/images/b16x16_blockdevice.png create mode 100644 src/Docs/Chm/help/images/b16x16_cancel.png create mode 100644 src/Docs/Chm/help/images/b16x16_chardevice.png create mode 100644 src/Docs/Chm/help/images/b16x16_dataexchange.png create mode 100644 src/Docs/Chm/help/images/b16x16_desktop.png create mode 100644 src/Docs/Chm/help/images/b16x16_donate.png create mode 100644 src/Docs/Chm/help/images/b16x16_enhanced_browsing.png create mode 100644 src/Docs/Chm/help/images/b16x16_file_locked.png create mode 100644 src/Docs/Chm/help/images/b16x16_filesaveas.png create mode 100644 src/Docs/Chm/help/images/b16x16_help.png create mode 100644 src/Docs/Chm/help/images/b16x16_history.png create mode 100644 src/Docs/Chm/help/images/b16x16_kblackbox.png create mode 100644 src/Docs/Chm/help/images/b16x16_kcmdrkonqi.png create mode 100644 src/Docs/Chm/help/images/b16x16_kcmsystem.png create mode 100644 src/Docs/Chm/help/images/b16x16_kdmconfig.png create mode 100644 src/Docs/Chm/help/images/b16x16_keyboard_layout.png create mode 100644 src/Docs/Chm/help/images/b16x16_kgpg.png create mode 100644 src/Docs/Chm/help/images/b16x16_kgpg_key3.png create mode 100644 src/Docs/Chm/help/images/b16x16_kmultiple.png create mode 100644 src/Docs/Chm/help/images/b16x16_konsole.png create mode 100644 src/Docs/Chm/help/images/b16x16_ktouch.png create mode 100644 src/Docs/Chm/help/images/b16x16_make_kdevelop.png create mode 100644 src/Docs/Chm/help/images/b16x16_message.png create mode 100644 src/Docs/Chm/help/images/b16x16_ok.png create mode 100644 src/Docs/Chm/help/images/b16x16_openterm.png create mode 100644 src/Docs/Chm/help/images/b16x16_package_system.png create mode 100644 src/Docs/Chm/help/images/b16x16_password.png create mode 100644 src/Docs/Chm/help/images/b16x16_rotate_cw.png create mode 100644 src/Docs/Chm/help/images/b16x16_server.png create mode 100644 src/Docs/Chm/help/images/b16x16_tar.png create mode 100644 src/Docs/Chm/help/images/b16x16_usbpendrive_unmount.png create mode 100644 src/Docs/Chm/help/images/b16x16_vcard.png create mode 100644 src/Docs/Chm/help/images/b16x16_warning.png create mode 100644 src/Docs/Chm/help/images/b16x16_window_list.png create mode 100644 src/Docs/Chm/help/images/b16x16_xmag.png create mode 100644 src/Docs/Chm/help/images/b64x64_binary.png create mode 100644 src/Docs/Chm/help/images/b64x64_blockdevice.png create mode 100644 src/Docs/Chm/help/images/b64x64_chardevice.png create mode 100644 src/Docs/Chm/help/images/b64x64_dataexchange.png create mode 100644 src/Docs/Chm/help/images/b64x64_desktop.png create mode 100644 src/Docs/Chm/help/images/b64x64_doc.png create mode 100644 src/Docs/Chm/help/images/b64x64_enhanced_browsing.png create mode 100644 src/Docs/Chm/help/images/b64x64_file_locked.png create mode 100644 src/Docs/Chm/help/images/b64x64_help.png create mode 100644 src/Docs/Chm/help/images/b64x64_kcmdrkonqi.png create mode 100644 src/Docs/Chm/help/images/b64x64_kcmsystem.png create mode 100644 src/Docs/Chm/help/images/b64x64_kdmconfig.png create mode 100644 src/Docs/Chm/help/images/b64x64_keyboard_layout.png create mode 100644 src/Docs/Chm/help/images/b64x64_kgpg.png create mode 100644 src/Docs/Chm/help/images/b64x64_kmultiple.png create mode 100644 src/Docs/Chm/help/images/b64x64_konsole.png create mode 100644 src/Docs/Chm/help/images/b64x64_ktouch.png create mode 100644 src/Docs/Chm/help/images/b64x64_package_system.png create mode 100644 src/Docs/Chm/help/images/b64x64_usb.png create mode 100644 src/Docs/Chm/help/images/b64x64_vcard.png create mode 100644 src/Docs/Chm/help/images/b64x64_winprops.png create mode 100644 src/Docs/Chm/help/images/b64x64_xmag.png create mode 100644 src/Docs/Chm/help/images/clienticons.gif create mode 100644 src/Docs/Chm/help/images/dlgbanner_bluecarbon.png create mode 100644 src/Docs/Chm/help/images/dlgbanner_win32.png create mode 100644 src/Docs/Chm/help/images/dlgbanner_winvistablack.png create mode 100644 src/Docs/Chm/help/images/dlgbanner_winxplogin.png create mode 100644 src/Docs/Chm/help/images/dragndrop.png create mode 100644 src/Docs/Chm/help/images/flageng_small.gif create mode 100644 src/Docs/Chm/help/images/flagger_small.gif create mode 100644 src/Docs/Chm/help/images/folder_closed.png create mode 100644 src/Docs/Chm/help/images/getkey_dark.png create mode 100644 src/Docs/Chm/help/images/plockb_64.png create mode 100644 src/Docs/Chm/help/images/pwgen_adv_excltab.png create mode 100644 src/Docs/Chm/help/images/rtfeditor.png create mode 100644 src/Docs/Chm/help/images/rtfeditor_small.png create mode 100644 src/Docs/Chm/help/index.html create mode 100644 src/Docs/Chm/help/v2/autotype_obfuscation.html create mode 100644 src/Docs/Chm/help/v2/dbsettings.html create mode 100644 src/Docs/Chm/help/v2/entry.html create mode 100644 src/Docs/Chm/help/v2/guioptions.html create mode 100644 src/Docs/Chm/help/v2/index.html create mode 100644 src/Docs/Chm/help/v2/ioconnect.html create mode 100644 src/Docs/Chm/help/v2/license.html create mode 100644 src/Docs/Chm/help/v2/plugins.html create mode 100644 src/Docs/Chm/help/v2/policy.html create mode 100644 src/Docs/Chm/help/v2/setup.html create mode 100644 src/Docs/Chm/help/v2/sync.html create mode 100644 src/Docs/Chm/help/v2/translation.html create mode 100644 src/Docs/Chm/help/v2/triggers.html create mode 100644 src/Docs/Chm/help/v2/version.html create mode 100644 src/Docs/Chm/help/v2/xml_replace.html create mode 100644 src/Docs/Chm/help/v2_dev/customize.html create mode 100644 src/Docs/Chm/help/v2_dev/plg_index.html create mode 100644 src/Docs/Chm/help/v2_dev/scr_index.html create mode 100644 src/Docs/Chm/help/v2_dev/scr_kps_index.html create mode 100644 src/Docs/Chm/help/v2_dev/scr_sc_index.html create mode 100644 src/Docs/Chm/images/back.gif create mode 100644 src/Docs/Chm/images/osi_certified_72x60.gif create mode 100644 src/Docs/Chm/screenshots/keepass_2x/gencsvimp.png create mode 100644 src/Docs/Chm/screenshots/keepass_2x/main.jpg create mode 100644 src/Docs/Chm/screenshots/windows_vista/comboboxform.png create mode 100644 src/Docs/Chm/screenshots/windows_vista/pickchars.png create mode 100644 src/Docs/Chm/screenshots/windows_vista/readonlymode.png create mode 100644 src/Docs/Chm/screenshots/windows_vista/syncorsave.png create mode 100644 src/Docs/History.txt create mode 100644 src/Docs/License.txt create mode 100644 src/Ext/Icons_04_CB/Finals/Untitled.ico create mode 100644 src/Ext/Icons_04_CB/Finals/key-blu.png create mode 100644 src/Ext/Icons_04_CB/Finals/key-bw.png create mode 100644 src/Ext/Icons_04_CB/Finals/key-grn.ico create mode 100644 src/Ext/Icons_04_CB/Finals/key-grn.png create mode 100644 src/Ext/Icons_04_CB/Finals/plock-blu.ico create mode 100644 src/Ext/Icons_04_CB/Finals/plock-blu.png create mode 100644 src/Ext/Icons_04_CB/Finals/plock-bw.png create mode 100644 src/Ext/Icons_04_CB/Finals/plock-dis.ico create mode 100644 src/Ext/Icons_04_CB/Finals/plock-grn.ico create mode 100644 src/Ext/Icons_04_CB/Finals/plock-grn.png create mode 100644 src/Ext/Icons_04_CB/Finals/plock.ico create mode 100644 src/Ext/Icons_04_CB/Finals/plock.png create mode 100644 src/Ext/Icons_04_CB/Finals/plockb.png create mode 100644 src/Ext/Icons_04_CB/Finals/plockbw-r.png create mode 100644 src/Ext/Icons_04_CB/Finals/plockbw.png create mode 100644 src/Ext/Icons_04_CB/Finals2/plock-blu.ico create mode 100644 src/Ext/Icons_04_CB/Finals2/plock-dis.ico create mode 100644 src/Ext/Icons_04_CB/Finals2/plock.ico create mode 100644 src/Ext/Icons_04_CB/Finals2/plockb.ico create mode 100644 src/Ext/Icons_04_CB/ReadMe.txt create mode 100644 src/Ext/Icons_04_CB/key-org.ico create mode 100644 src/Ext/Icons_04_CB/keyhole-grn.ico create mode 100644 src/Ext/Icons_04_CB/lockblue.ico create mode 100644 src/Ext/Icons_04_CB/lockgreen.ico create mode 100644 src/Ext/Icons_04_CB/lockred.ico create mode 100644 src/Ext/Icons_04_CB/lockyellow.ico create mode 100644 src/Ext/Icons_04_CB/plockb.ico create mode 100644 src/Ext/Icons_04_CB/plockb2.ico create mode 100644 src/Ext/Icons_04_CB/plockbw.ico create mode 100644 src/Ext/Icons_04_CB/plockg.ico create mode 100644 src/Ext/Icons_04_CB/plocko.ico create mode 100644 src/Ext/Icons_04_CB/plockr.ico create mode 100644 src/Ext/Icons_04_CB/plocky.ico create mode 100644 src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_1024.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_128.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_16.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_20.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_24.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_256.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_32.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_48.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_512.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_64.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round_Keyhole/KeePass_Round_Keyhole_128.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round_Keyhole/KeePass_Round_Keyhole_16.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round_Keyhole/KeePass_Round_Keyhole_256.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round_Keyhole/KeePass_Round_Keyhole_32.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round_Keyhole/KeePass_Round_Keyhole_48.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round_Keyhole/KeePass_Round_Keyhole_64.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round_Locked/KeePass_Round_Locked_128.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round_Locked/KeePass_Round_Locked_16.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round_Locked/KeePass_Round_Locked_256.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round_Locked/KeePass_Round_Locked_32.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round_Locked/KeePass_Round_Locked_48.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Round_Locked/KeePass_Round_Locked_64.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_128.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_16.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_24.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_256.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_32.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_48.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_64.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_128.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_16.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_24.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_256.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_32.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_48.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_64.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_128.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_16.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_256.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_32.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_48.png create mode 100644 src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_64.png create mode 100644 src/Ext/Icons_15_VA/LowResIcons/KeePass_LR.ico create mode 100644 src/Ext/Icons_15_VA/LowResIcons/KeePass_LR_G.ico create mode 100644 src/Ext/Icons_15_VA/LowResIcons/KeePass_LR_R.ico create mode 100644 src/Ext/Icons_15_VA/LowResIcons/KeePass_LR_Y.ico create mode 100644 src/Ext/Icons_15_VA/ReadMe.txt create mode 100644 src/Ext/Icons_Nuvola/License.txt create mode 100644 src/Ext/Icons_Nuvola/ReadMe.txt create mode 100644 src/Ext/Images_App_HighRes/Images/B48x48_FontBold.png create mode 100644 src/Ext/Images_App_HighRes/Images/B48x48_FontItalic.png create mode 100644 src/Ext/Images_App_HighRes/Images/B48x48_FontStrikeout.png create mode 100644 src/Ext/Images_App_HighRes/Images/B48x48_FontUnderline.png create mode 100644 src/Ext/Images_App_HighRes/Images/B48x48_KeePass.png create mode 100644 src/Ext/Images_App_HighRes/Images/B48x48_LockWorkspace.png create mode 100644 src/Ext/Images_App_HighRes/Images/B48x48_Transparent.png create mode 100644 src/Ext/Images_App_HighRes/Images/B57x21_3BlackDots.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B32x32_KRec_Record.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_1DownArrow.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_1UpArrow.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_2DownArrow.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_2UpArrow.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_ASCII.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Apply.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Attach.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Binary.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_BlockDevice.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Browser.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Color_Fill.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Colorize.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_CompFile.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Configure.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Cut.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Edit.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_EditCopy.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_EditDelete.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_EditPaste.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_EditShred.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Error.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Exit.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_FTP.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_FileNew.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_FilePrint.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_FileQuickPrint.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_FileSave.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_FileSaveAs.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_File_Locked.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Folder.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Folder_Blue_Open.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Folder_Home.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Folder_Locked.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Folder_Txt.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Folder_Yellow_Open.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_HTML.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Help.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_History.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_History_Clear.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_HwInfo.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Identity.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Gen.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Import.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Info.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Key1.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Key2.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Key3.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Sign.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_KNotes.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_KOrganizer.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_KTouch.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_KaboodleLoop.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Keyboard_Layout.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Laptop_Charge.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Make_KDevelop.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_MessageBox_Critical.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_MessageBox_Info.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_MessageBox_Warning.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Misc.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_No.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Package_Development.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Package_Settings.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Personal.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Redo.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Reload_Page.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Services.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Spreadsheet.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Toggle_Log.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Trashcan_Full.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Undo.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_View_Detailed.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_WWW.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_Wizard.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola/B48x48_XMag.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Assembled/B48x48_Folder_Inbox.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Assembled/B48x48_Folder_Outbox.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_DeleteEntry.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_EditCopyLink.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_EditCopyUrl.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_FileSave_Disabled.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_File_Close.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_File_SaveAll.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_File_SaveAll_Disabled.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_Folder_2.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_Folder_New_Ex.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_Key_New.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_TextAlignCenter.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_TextAlignLeft.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_TextAlignRight.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_Window_2Horz1Vert.png create mode 100644 src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_Window_3Horz.png create mode 100644 src/Ext/Images_Client_16/C00_Password.png create mode 100644 src/Ext/Images_Client_16/C01_Package_Network.png create mode 100644 src/Ext/Images_Client_16/C02_MessageBox_Warning.png create mode 100644 src/Ext/Images_Client_16/C03_Server.png create mode 100644 src/Ext/Images_Client_16/C04_Klipper.png create mode 100644 src/Ext/Images_Client_16/C05_Edu_Languages.png create mode 100644 src/Ext/Images_Client_16/C06_KCMDF.png create mode 100644 src/Ext/Images_Client_16/C07_Kate.png create mode 100644 src/Ext/Images_Client_16/C08_Socket.png create mode 100644 src/Ext/Images_Client_16/C09_Identity.png create mode 100644 src/Ext/Images_Client_16/C10_Kontact.png create mode 100644 src/Ext/Images_Client_16/C11_Camera.png create mode 100644 src/Ext/Images_Client_16/C12_IRKickFlash.png create mode 100644 src/Ext/Images_Client_16/C13_KGPG_Key3.png create mode 100644 src/Ext/Images_Client_16/C14_Laptop_Power.png create mode 100644 src/Ext/Images_Client_16/C15_Scanner.png create mode 100644 src/Ext/Images_Client_16/C16_Mozilla_Firebird.png create mode 100644 src/Ext/Images_Client_16/C17_CDROM_Unmount.png create mode 100644 src/Ext/Images_Client_16/C18_Display.png create mode 100644 src/Ext/Images_Client_16/C19_Mail_Generic.png create mode 100644 src/Ext/Images_Client_16/C20_Misc.png create mode 100644 src/Ext/Images_Client_16/C21_KOrganizer.png create mode 100644 src/Ext/Images_Client_16/C22_ASCII.png create mode 100644 src/Ext/Images_Client_16/C23_Icons.png create mode 100644 src/Ext/Images_Client_16/C24_Connect_Established.png create mode 100644 src/Ext/Images_Client_16/C25_Folder_Mail.png create mode 100644 src/Ext/Images_Client_16/C26_FileSave.png create mode 100644 src/Ext/Images_Client_16/C27_NFS_Unmount.png create mode 100644 src/Ext/Images_Client_16/C28_Message.png create mode 100644 src/Ext/Images_Client_16/C29_KGPG_Term.png create mode 100644 src/Ext/Images_Client_16/C30_Konsole.png create mode 100644 src/Ext/Images_Client_16/C31_FilePrint.png create mode 100644 src/Ext/Images_Client_16/C32_FSView.png create mode 100644 src/Ext/Images_Client_16/C33_Run.png create mode 100644 src/Ext/Images_Client_16/C34_Configure.png create mode 100644 src/Ext/Images_Client_16/C35_KRFB.png create mode 100644 src/Ext/Images_Client_16/C36_Ark.png create mode 100644 src/Ext/Images_Client_16/C37_KPercentage.png create mode 100644 src/Ext/Images_Client_16/C38_Samba_Unmount.png create mode 100644 src/Ext/Images_Client_16/C39_History.png create mode 100644 src/Ext/Images_Client_16/C40_Mail_Find.png create mode 100644 src/Ext/Images_Client_16/C41_VectorGfx.png create mode 100644 src/Ext/Images_Client_16/C42_KCMMemory.png create mode 100644 src/Ext/Images_Client_16/C43_Trashcan_Full.png create mode 100644 src/Ext/Images_Client_16/C44_KNotes.png create mode 100644 src/Ext/Images_Client_16/C45_Cancel.png create mode 100644 src/Ext/Images_Client_16/C46_Help.png create mode 100644 src/Ext/Images_Client_16/C47_KPackage.png create mode 100644 src/Ext/Images_Client_16/C48_Folder.png create mode 100644 src/Ext/Images_Client_16/C49_Folder_Blue_Open.png create mode 100644 src/Ext/Images_Client_16/C50_Folder_Tar.png create mode 100644 src/Ext/Images_Client_16/C51_Decrypted.png create mode 100644 src/Ext/Images_Client_16/C52_Encrypted.png create mode 100644 src/Ext/Images_Client_16/C53_Apply.png create mode 100644 src/Ext/Images_Client_16/C54_Signature.png create mode 100644 src/Ext/Images_Client_16/C55_Thumbnail.png create mode 100644 src/Ext/Images_Client_16/C56_KAddressBook.png create mode 100644 src/Ext/Images_Client_16/C57_View_Text.png create mode 100644 src/Ext/Images_Client_16/C58_KGPG.png create mode 100644 src/Ext/Images_Client_16/C59_Package_Development.png create mode 100644 src/Ext/Images_Client_16/C60_KFM_Home.png create mode 100644 src/Ext/Images_Client_16/C61_Services.png create mode 100644 src/Ext/Images_Client_16/C62_Tux.png create mode 100644 src/Ext/Images_Client_16/C63_Feather.png create mode 100644 src/Ext/Images_Client_16/C64_Apple.png create mode 100644 src/Ext/Images_Client_16/C65_W.png create mode 100644 src/Ext/Images_Client_16/C66_Money.png create mode 100644 src/Ext/Images_Client_16/C67_Certificate.png create mode 100644 src/Ext/Images_Client_16/C68_Smartphone.png create mode 100644 src/Ext/Images_Client_HighRes/C00_Password.png create mode 100644 src/Ext/Images_Client_HighRes/C01_Package_Network.png create mode 100644 src/Ext/Images_Client_HighRes/C02_MessageBox_Warning.png create mode 100644 src/Ext/Images_Client_HighRes/C03_Server.png create mode 100644 src/Ext/Images_Client_HighRes/C04_Klipper.png create mode 100644 src/Ext/Images_Client_HighRes/C05_Edu_Languages.png create mode 100644 src/Ext/Images_Client_HighRes/C06_KCMDF.png create mode 100644 src/Ext/Images_Client_HighRes/C07_Kate.png create mode 100644 src/Ext/Images_Client_HighRes/C08_Socket.png create mode 100644 src/Ext/Images_Client_HighRes/C09_Identity.png create mode 100644 src/Ext/Images_Client_HighRes/C10_Kontact.png create mode 100644 src/Ext/Images_Client_HighRes/C11_Camera.png create mode 100644 src/Ext/Images_Client_HighRes/C12_IRKickFlash.png create mode 100644 src/Ext/Images_Client_HighRes/C13_KGPG_Key3.png create mode 100644 src/Ext/Images_Client_HighRes/C14_Laptop_Power.png create mode 100644 src/Ext/Images_Client_HighRes/C15_Scanner.png create mode 100644 src/Ext/Images_Client_HighRes/C16_Mozilla_Firebird.png create mode 100644 src/Ext/Images_Client_HighRes/C17_CDROM_Unmount.png create mode 100644 src/Ext/Images_Client_HighRes/C18_Display.png create mode 100644 src/Ext/Images_Client_HighRes/C19_Mail_Generic.png create mode 100644 src/Ext/Images_Client_HighRes/C20_Misc.png create mode 100644 src/Ext/Images_Client_HighRes/C21_KOrganizer.png create mode 100644 src/Ext/Images_Client_HighRes/C22_ASCII.png create mode 100644 src/Ext/Images_Client_HighRes/C23_Icons.png create mode 100644 src/Ext/Images_Client_HighRes/C24_Connect_Established.png create mode 100644 src/Ext/Images_Client_HighRes/C25_Folder_Mail.png create mode 100644 src/Ext/Images_Client_HighRes/C26_FileSave.png create mode 100644 src/Ext/Images_Client_HighRes/C27_NFS_Unmount.png create mode 100644 src/Ext/Images_Client_HighRes/C28_Message.png create mode 100644 src/Ext/Images_Client_HighRes/C29_KGPG_Term.png create mode 100644 src/Ext/Images_Client_HighRes/C30_Konsole.png create mode 100644 src/Ext/Images_Client_HighRes/C31_FilePrint.png create mode 100644 src/Ext/Images_Client_HighRes/C32_FSView.png create mode 100644 src/Ext/Images_Client_HighRes/C33_Run.png create mode 100644 src/Ext/Images_Client_HighRes/C34_Configure.png create mode 100644 src/Ext/Images_Client_HighRes/C35_KRFB.png create mode 100644 src/Ext/Images_Client_HighRes/C36_Ark.png create mode 100644 src/Ext/Images_Client_HighRes/C37_KPercentage.png create mode 100644 src/Ext/Images_Client_HighRes/C38_Samba_Unmount.png create mode 100644 src/Ext/Images_Client_HighRes/C39_History.png create mode 100644 src/Ext/Images_Client_HighRes/C40_Mail_Find.png create mode 100644 src/Ext/Images_Client_HighRes/C41_VectorGfx.png create mode 100644 src/Ext/Images_Client_HighRes/C42_KCMMemory.png create mode 100644 src/Ext/Images_Client_HighRes/C43_Trashcan_Full.png create mode 100644 src/Ext/Images_Client_HighRes/C44_KNotes.png create mode 100644 src/Ext/Images_Client_HighRes/C45_Cancel.png create mode 100644 src/Ext/Images_Client_HighRes/C46_Help.png create mode 100644 src/Ext/Images_Client_HighRes/C47_KPackage.png create mode 100644 src/Ext/Images_Client_HighRes/C48_Folder.png create mode 100644 src/Ext/Images_Client_HighRes/C49_Folder_Blue_Open.png create mode 100644 src/Ext/Images_Client_HighRes/C50_Folder_Tar.png create mode 100644 src/Ext/Images_Client_HighRes/C51_Decrypted.png create mode 100644 src/Ext/Images_Client_HighRes/C52_Encrypted.png create mode 100644 src/Ext/Images_Client_HighRes/C53_Apply.png create mode 100644 src/Ext/Images_Client_HighRes/C54_Signature.png create mode 100644 src/Ext/Images_Client_HighRes/C55_Thumbnail.png create mode 100644 src/Ext/Images_Client_HighRes/C56_KAddressBook.png create mode 100644 src/Ext/Images_Client_HighRes/C57_View_Text.png create mode 100644 src/Ext/Images_Client_HighRes/C58_KGPG.png create mode 100644 src/Ext/Images_Client_HighRes/C59_Package_Development.png create mode 100644 src/Ext/Images_Client_HighRes/C60_KFM_Home.png create mode 100644 src/Ext/Images_Client_HighRes/C61_Services.png create mode 100644 src/Ext/Images_Client_HighRes/C62_Tux.png create mode 100644 src/Ext/Images_Client_HighRes/C63_Feather.png create mode 100644 src/Ext/Images_Client_HighRes/C64_Apple.png create mode 100644 src/Ext/Images_Client_HighRes/C65_W.png create mode 100644 src/Ext/Images_Client_HighRes/C66_Money.png create mode 100644 src/Ext/Images_Client_HighRes/C67_Certificate.png create mode 100644 src/Ext/Images_Client_HighRes/C68_Smartphone.png create mode 100644 src/Ext/KPDummyKey.pfx create mode 100644 src/Ext/KeePass.config.xml create mode 100644 src/Ext/KeePass.exe.config create mode 100644 src/Ext/KeePass.iss create mode 100644 src/Ext/KeePassMsi/KeePassMsi.sln create mode 100644 src/Ext/KeePassMsi/KeePassMsi.vdproj create mode 100644 src/Ext/KeePass_NoVer.exe.config create mode 100644 src/Ext/PublicKeys/ArcFourCipher.pk create mode 100644 src/Ext/PublicKeys/KPScript.pk create mode 100644 src/Ext/PublicKeys/KeePass.pk create mode 100644 src/Ext/PublicKeys/KeePassLib.pk create mode 100644 src/Ext/PublicKeys/KeePassLibSD.pk create mode 100644 src/Ext/PublicKeys/SamplePlugin.pk create mode 100644 src/Ext/Resources/LockOverlay16.png create mode 100644 src/Ext/Resources/LockOverlay32.png create mode 100644 src/Ext/TrlUtil.exe.config create mode 100644 src/Ext/XSL/KDBX_Common.xsl create mode 100644 src/Ext/XSL/KDBX_DetailsFull_HTML.xsl create mode 100644 src/Ext/XSL/KDBX_DetailsLight_HTML.xsl create mode 100644 src/Ext/XSL/KDBX_PasswordsOnly_TXT.xsl create mode 100644 src/Ext/XSL/KDBX_Tabular_HTML.xsl create mode 100644 src/KeePass.sln create mode 100644 src/KeePass/App/AppDefs.cs create mode 100644 src/KeePass/App/AppHelp.cs create mode 100644 src/KeePass/App/AppIcons.cs create mode 100644 src/KeePass/App/AppPolicy.cs create mode 100644 src/KeePass/App/Configuration/AceApplication.cs create mode 100644 src/KeePass/App/Configuration/AceCustomConfig.cs create mode 100644 src/KeePass/App/Configuration/AceDefaults.cs create mode 100644 src/KeePass/App/Configuration/AceIntegration.cs create mode 100644 src/KeePass/App/Configuration/AceLogging.cs create mode 100644 src/KeePass/App/Configuration/AceMainWindow.cs create mode 100644 src/KeePass/App/Configuration/AceNative.cs create mode 100644 src/KeePass/App/Configuration/AcePasswordGenerator.cs create mode 100644 src/KeePass/App/Configuration/AceSearch.cs create mode 100644 src/KeePass/App/Configuration/AceSecurity.cs create mode 100644 src/KeePass/App/Configuration/AceToolBar.cs create mode 100644 src/KeePass/App/Configuration/AceTrayIcon.cs create mode 100644 src/KeePass/App/Configuration/AceUI.cs create mode 100644 src/KeePass/App/Configuration/AppConfigEx.cs create mode 100644 src/KeePass/App/Configuration/AppConfigSerializer.cs create mode 100644 src/KeePass/DataExchange/CsvStreamReader.cs create mode 100644 src/KeePass/DataExchange/CsvStreamReaderEx.cs create mode 100644 src/KeePass/DataExchange/CsvStreamWriter.cs create mode 100644 src/KeePass/DataExchange/CsvTableEntryReader.cs create mode 100644 src/KeePass/DataExchange/CsvTableObjectReader.cs create mode 100644 src/KeePass/DataExchange/ExportUtil.cs create mode 100644 src/KeePass/DataExchange/FileFormatPool.cs create mode 100644 src/KeePass/DataExchange/FileFormatProvider.cs create mode 100644 src/KeePass/DataExchange/Formats/AmpXml250.cs create mode 100644 src/KeePass/DataExchange/Formats/AnyPwCsv144.cs create mode 100644 src/KeePass/DataExchange/Formats/BitwardenJson112.cs create mode 100644 src/KeePass/DataExchange/Formats/ChromeCsv66.cs create mode 100644 src/KeePass/DataExchange/Formats/CodeWalletTxt605.cs create mode 100644 src/KeePass/DataExchange/Formats/DashlaneCsv2.cs create mode 100644 src/KeePass/DataExchange/Formats/DashlaneJson6.cs create mode 100644 src/KeePass/DataExchange/Formats/DataVaultCsv47.cs create mode 100644 src/KeePass/DataExchange/Formats/DesktopKnoxXml32.cs create mode 100644 src/KeePass/DataExchange/Formats/EnpassTxt5.cs create mode 100644 src/KeePass/DataExchange/Formats/FlexWalletXml17.cs create mode 100644 src/KeePass/DataExchange/Formats/GenericCsv.cs create mode 100644 src/KeePass/DataExchange/Formats/HandySafeProXml12.cs create mode 100644 src/KeePass/DataExchange/Formats/HandySafeTxt512.cs create mode 100644 src/KeePass/DataExchange/Formats/KasperskyPwMgrTxt90.cs create mode 100644 src/KeePass/DataExchange/Formats/KasperskyPwMgrXml50.cs create mode 100644 src/KeePass/DataExchange/Formats/KeePassCsv1x.cs create mode 100644 src/KeePass/DataExchange/Formats/KeePassHtml2x.cs create mode 100644 src/KeePass/DataExchange/Formats/KeePassKdb1x.cs create mode 100644 src/KeePass/DataExchange/Formats/KeePassKdb2x.cs create mode 100644 src/KeePass/DataExchange/Formats/KeePassKdb2xRepair.cs create mode 100644 src/KeePass/DataExchange/Formats/KeePassXXml041.cs create mode 100644 src/KeePass/DataExchange/Formats/KeePassXml1x.cs create mode 100644 src/KeePass/DataExchange/Formats/KeePassXml2x.cs create mode 100644 src/KeePass/DataExchange/Formats/KeeperJson16.cs create mode 100644 src/KeePass/DataExchange/Formats/KeyFolderXml1.cs create mode 100644 src/KeePass/DataExchange/Formats/LastPassCsv2.cs create mode 100644 src/KeePass/DataExchange/Formats/MSecureCsv355.cs create mode 100644 src/KeePass/DataExchange/Formats/MozillaBookmarksHtml100.cs create mode 100644 src/KeePass/DataExchange/Formats/MozillaBookmarksJson100.cs create mode 100644 src/KeePass/DataExchange/Formats/NPasswordNpw102.cs create mode 100644 src/KeePass/DataExchange/Formats/NetworkPwMgrCsv4.cs create mode 100644 src/KeePass/DataExchange/Formats/NortonIdSafeCsv2013.cs create mode 100644 src/KeePass/DataExchange/Formats/OnePw1Pux8.cs create mode 100644 src/KeePass/DataExchange/Formats/OnePwProCsv599.cs create mode 100644 src/KeePass/DataExchange/Formats/PVaultTxt14.cs create mode 100644 src/KeePass/DataExchange/Formats/PassKeeper12.cs create mode 100644 src/KeePass/DataExchange/Formats/PinsTxt450.cs create mode 100644 src/KeePass/DataExchange/Formats/PpKeeperHtml270.cs create mode 100644 src/KeePass/DataExchange/Formats/PwAgentXml2.cs create mode 100644 src/KeePass/DataExchange/Formats/PwAgentXml3.cs create mode 100644 src/KeePass/DataExchange/Formats/PwDepotXml26.cs create mode 100644 src/KeePass/DataExchange/Formats/PwExporterXml105.cs create mode 100644 src/KeePass/DataExchange/Formats/PwKeeperCsv70.cs create mode 100644 src/KeePass/DataExchange/Formats/PwMemory2008Xml104.cs create mode 100644 src/KeePass/DataExchange/Formats/PwPrompterDat12.cs create mode 100644 src/KeePass/DataExchange/Formats/PwSafeXml302.cs create mode 100644 src/KeePass/DataExchange/Formats/PwSaverXml412.cs create mode 100644 src/KeePass/DataExchange/Formats/PwTresorXml100.cs create mode 100644 src/KeePass/DataExchange/Formats/PwsPlusCsv1007.cs create mode 100644 src/KeePass/DataExchange/Formats/RevelationXml04.cs create mode 100644 src/KeePass/DataExchange/Formats/RoboFormHtml69.cs create mode 100644 src/KeePass/DataExchange/Formats/SafeWalletXml3.cs create mode 100644 src/KeePass/DataExchange/Formats/SecurityTxt12.cs create mode 100644 src/KeePass/DataExchange/Formats/Spamex20070328.cs create mode 100644 src/KeePass/DataExchange/Formats/SplashIdCsv402.cs create mode 100644 src/KeePass/DataExchange/Formats/SteganosCsv20.cs create mode 100644 src/KeePass/DataExchange/Formats/SteganosUI2007.cs create mode 100644 src/KeePass/DataExchange/Formats/StickyPwXml50.cs create mode 100644 src/KeePass/DataExchange/Formats/TrueKeyCsv4.cs create mode 100644 src/KeePass/DataExchange/Formats/TurboPwsCsv5.cs create mode 100644 src/KeePass/DataExchange/Formats/VisKeeperTxt3.cs create mode 100644 src/KeePass/DataExchange/Formats/Whisper32Csv116.cs create mode 100644 src/KeePass/DataExchange/Formats/WinFavorites10.cs create mode 100644 src/KeePass/DataExchange/Formats/XslTransform2x.cs create mode 100644 src/KeePass/DataExchange/Formats/ZdnPwProTxt314.cs create mode 100644 src/KeePass/DataExchange/GxiImporter.cs create mode 100644 src/KeePass/DataExchange/GxiProfile.cs create mode 100644 src/KeePass/DataExchange/ImportUtil.cs create mode 100644 src/KeePass/DataExchange/JsonObject.cs create mode 100644 src/KeePass/DataExchange/KdbFile.cs create mode 100644 src/KeePass/DataExchange/KdbManager.cs create mode 100644 src/KeePass/DataExchange/PwExportInfo.cs create mode 100644 src/KeePass/Ecas/EcasAction.cs create mode 100644 src/KeePass/Ecas/EcasActionProvider.cs create mode 100644 src/KeePass/Ecas/EcasActionType.cs create mode 100644 src/KeePass/Ecas/EcasCondition.cs create mode 100644 src/KeePass/Ecas/EcasConditionProvider.cs create mode 100644 src/KeePass/Ecas/EcasConditionType.cs create mode 100644 src/KeePass/Ecas/EcasContext.cs create mode 100644 src/KeePass/Ecas/EcasDefaultActionProvider.cs create mode 100644 src/KeePass/Ecas/EcasDefaultConditionProvider.cs create mode 100644 src/KeePass/Ecas/EcasDefaultEventProvider.cs create mode 100644 src/KeePass/Ecas/EcasEnum.cs create mode 100644 src/KeePass/Ecas/EcasEvent.cs create mode 100644 src/KeePass/Ecas/EcasEventProvider.cs create mode 100644 src/KeePass/Ecas/EcasEventType.cs create mode 100644 src/KeePass/Ecas/EcasParameter.cs create mode 100644 src/KeePass/Ecas/EcasPool.cs create mode 100644 src/KeePass/Ecas/EcasPropertyDictionary.cs create mode 100644 src/KeePass/Ecas/EcasSystemEvents.cs create mode 100644 src/KeePass/Ecas/EcasTrigger.cs create mode 100644 src/KeePass/Ecas/EcasTriggerSystem.cs create mode 100644 src/KeePass/Ecas/EcasUtil.cs create mode 100644 src/KeePass/Ecas/EcasValueType.cs create mode 100644 src/KeePass/Ecas/IEcasObject.cs create mode 100644 src/KeePass/Ecas/IEcasParameterized.cs create mode 100644 src/KeePass/Forms/AboutForm.Designer.cs create mode 100644 src/KeePass/Forms/AboutForm.cs create mode 100644 src/KeePass/Forms/AboutForm.resx create mode 100644 src/KeePass/Forms/AutoTypeCtxForm.Designer.cs create mode 100644 src/KeePass/Forms/AutoTypeCtxForm.cs create mode 100644 src/KeePass/Forms/AutoTypeCtxForm.resx create mode 100644 src/KeePass/Forms/CharPickerForm.Designer.cs create mode 100644 src/KeePass/Forms/CharPickerForm.cs create mode 100644 src/KeePass/Forms/CharPickerForm.resx create mode 100644 src/KeePass/Forms/ColumnsForm.Designer.cs create mode 100644 src/KeePass/Forms/ColumnsForm.cs create mode 100644 src/KeePass/Forms/ColumnsForm.resx create mode 100644 src/KeePass/Forms/CsvImportForm.Designer.cs create mode 100644 src/KeePass/Forms/CsvImportForm.cs create mode 100644 src/KeePass/Forms/CsvImportForm.resx create mode 100644 src/KeePass/Forms/DataEditorForm.Designer.cs create mode 100644 src/KeePass/Forms/DataEditorForm.cs create mode 100644 src/KeePass/Forms/DataEditorForm.resx create mode 100644 src/KeePass/Forms/DataViewerForm.Designer.cs create mode 100644 src/KeePass/Forms/DataViewerForm.cs create mode 100644 src/KeePass/Forms/DataViewerForm.resx create mode 100644 src/KeePass/Forms/DatabaseOperationsForm.Designer.cs create mode 100644 src/KeePass/Forms/DatabaseOperationsForm.cs create mode 100644 src/KeePass/Forms/DatabaseOperationsForm.resx create mode 100644 src/KeePass/Forms/DatabaseSettingsForm.Designer.cs create mode 100644 src/KeePass/Forms/DatabaseSettingsForm.cs create mode 100644 src/KeePass/Forms/DatabaseSettingsForm.resx create mode 100644 src/KeePass/Forms/DuplicationForm.Designer.cs create mode 100644 src/KeePass/Forms/DuplicationForm.cs create mode 100644 src/KeePass/Forms/DuplicationForm.resx create mode 100644 src/KeePass/Forms/EcasActionForm.Designer.cs create mode 100644 src/KeePass/Forms/EcasActionForm.cs create mode 100644 src/KeePass/Forms/EcasActionForm.resx create mode 100644 src/KeePass/Forms/EcasConditionForm.Designer.cs create mode 100644 src/KeePass/Forms/EcasConditionForm.cs create mode 100644 src/KeePass/Forms/EcasConditionForm.resx create mode 100644 src/KeePass/Forms/EcasEventForm.Designer.cs create mode 100644 src/KeePass/Forms/EcasEventForm.cs create mode 100644 src/KeePass/Forms/EcasEventForm.resx create mode 100644 src/KeePass/Forms/EcasTriggerForm.Designer.cs create mode 100644 src/KeePass/Forms/EcasTriggerForm.cs create mode 100644 src/KeePass/Forms/EcasTriggerForm.resx create mode 100644 src/KeePass/Forms/EcasTriggersForm.Designer.cs create mode 100644 src/KeePass/Forms/EcasTriggersForm.cs create mode 100644 src/KeePass/Forms/EcasTriggersForm.resx create mode 100644 src/KeePass/Forms/EditAutoTypeItemForm.Designer.cs create mode 100644 src/KeePass/Forms/EditAutoTypeItemForm.cs create mode 100644 src/KeePass/Forms/EditAutoTypeItemForm.resx create mode 100644 src/KeePass/Forms/EditStringForm.Designer.cs create mode 100644 src/KeePass/Forms/EditStringForm.cs create mode 100644 src/KeePass/Forms/EditStringForm.resx create mode 100644 src/KeePass/Forms/EntropyForm.Designer.cs create mode 100644 src/KeePass/Forms/EntropyForm.cs create mode 100644 src/KeePass/Forms/EntropyForm.resx create mode 100644 src/KeePass/Forms/ExchangeDataForm.Designer.cs create mode 100644 src/KeePass/Forms/ExchangeDataForm.cs create mode 100644 src/KeePass/Forms/ExchangeDataForm.resx create mode 100644 src/KeePass/Forms/FieldPickerForm.Designer.cs create mode 100644 src/KeePass/Forms/FieldPickerForm.cs create mode 100644 src/KeePass/Forms/FieldPickerForm.resx create mode 100644 src/KeePass/Forms/FieldRefForm.Designer.cs create mode 100644 src/KeePass/Forms/FieldRefForm.cs create mode 100644 src/KeePass/Forms/FieldRefForm.resx create mode 100644 src/KeePass/Forms/FileBrowserForm.Designer.cs create mode 100644 src/KeePass/Forms/FileBrowserForm.cs create mode 100644 src/KeePass/Forms/FileBrowserForm.resx create mode 100644 src/KeePass/Forms/GroupForm.Designer.cs create mode 100644 src/KeePass/Forms/GroupForm.cs create mode 100644 src/KeePass/Forms/GroupForm.resx create mode 100644 src/KeePass/Forms/HelpSourceForm.Designer.cs create mode 100644 src/KeePass/Forms/HelpSourceForm.cs create mode 100644 src/KeePass/Forms/HelpSourceForm.resx create mode 100644 src/KeePass/Forms/IOConnectionForm.Designer.cs create mode 100644 src/KeePass/Forms/IOConnectionForm.cs create mode 100644 src/KeePass/Forms/IOConnectionForm.resx create mode 100644 src/KeePass/Forms/IconPickerForm.Designer.cs create mode 100644 src/KeePass/Forms/IconPickerForm.cs create mode 100644 src/KeePass/Forms/IconPickerForm.resx create mode 100644 src/KeePass/Forms/ImportMethodForm.Designer.cs create mode 100644 src/KeePass/Forms/ImportMethodForm.cs create mode 100644 src/KeePass/Forms/ImportMethodForm.resx create mode 100644 src/KeePass/Forms/InternalBrowserForm.Designer.cs create mode 100644 src/KeePass/Forms/InternalBrowserForm.cs create mode 100644 src/KeePass/Forms/InternalBrowserForm.resx create mode 100644 src/KeePass/Forms/KeyCreationForm.Designer.cs create mode 100644 src/KeePass/Forms/KeyCreationForm.cs create mode 100644 src/KeePass/Forms/KeyCreationForm.resx create mode 100644 src/KeePass/Forms/KeyFileCreationForm.Designer.cs create mode 100644 src/KeePass/Forms/KeyFileCreationForm.cs create mode 100644 src/KeePass/Forms/KeyFileCreationForm.resx create mode 100644 src/KeePass/Forms/KeyPromptForm.Designer.cs create mode 100644 src/KeePass/Forms/KeyPromptForm.cs create mode 100644 src/KeePass/Forms/KeyPromptForm.resx create mode 100644 src/KeePass/Forms/LanguageForm.Designer.cs create mode 100644 src/KeePass/Forms/LanguageForm.cs create mode 100644 src/KeePass/Forms/LanguageForm.resx create mode 100644 src/KeePass/Forms/ListViewForm.Designer.cs create mode 100644 src/KeePass/Forms/ListViewForm.cs create mode 100644 src/KeePass/Forms/ListViewForm.resx create mode 100644 src/KeePass/Forms/MainForm.Designer.cs create mode 100644 src/KeePass/Forms/MainForm.cs create mode 100644 src/KeePass/Forms/MainForm.resx create mode 100644 src/KeePass/Forms/MainForm_Events.cs create mode 100644 src/KeePass/Forms/MainForm_Functions.cs create mode 100644 src/KeePass/Forms/OptionsForm.Designer.cs create mode 100644 src/KeePass/Forms/OptionsForm.cs create mode 100644 src/KeePass/Forms/OptionsForm.resx create mode 100644 src/KeePass/Forms/OtpGeneratorForm.Designer.cs create mode 100644 src/KeePass/Forms/OtpGeneratorForm.cs create mode 100644 src/KeePass/Forms/OtpGeneratorForm.resx create mode 100644 src/KeePass/Forms/PluginsForm.Designer.cs create mode 100644 src/KeePass/Forms/PluginsForm.cs create mode 100644 src/KeePass/Forms/PluginsForm.resx create mode 100644 src/KeePass/Forms/PrintForm.Designer.cs create mode 100644 src/KeePass/Forms/PrintForm.cs create mode 100644 src/KeePass/Forms/PrintForm.resx create mode 100644 src/KeePass/Forms/ProxyForm.Designer.cs create mode 100644 src/KeePass/Forms/ProxyForm.cs create mode 100644 src/KeePass/Forms/ProxyForm.resx create mode 100644 src/KeePass/Forms/PwEntryForm.Designer.cs create mode 100644 src/KeePass/Forms/PwEntryForm.cs create mode 100644 src/KeePass/Forms/PwEntryForm.resx create mode 100644 src/KeePass/Forms/PwGeneratorForm.Designer.cs create mode 100644 src/KeePass/Forms/PwGeneratorForm.cs create mode 100644 src/KeePass/Forms/PwGeneratorForm.resx create mode 100644 src/KeePass/Forms/SearchForm.Designer.cs create mode 100644 src/KeePass/Forms/SearchForm.cs create mode 100644 src/KeePass/Forms/SearchForm.resx create mode 100644 src/KeePass/Forms/SingleLineEditForm.Designer.cs create mode 100644 src/KeePass/Forms/SingleLineEditForm.cs create mode 100644 src/KeePass/Forms/SingleLineEditForm.resx create mode 100644 src/KeePass/Forms/StatusLoggerForm.Designer.cs create mode 100644 src/KeePass/Forms/StatusLoggerForm.cs create mode 100644 src/KeePass/Forms/StatusLoggerForm.resx create mode 100644 src/KeePass/Forms/StatusProgressForm.Designer.cs create mode 100644 src/KeePass/Forms/StatusProgressForm.cs create mode 100644 src/KeePass/Forms/StatusProgressForm.resx create mode 100644 src/KeePass/Forms/TanWizardForm.Designer.cs create mode 100644 src/KeePass/Forms/TanWizardForm.cs create mode 100644 src/KeePass/Forms/TanWizardForm.resx create mode 100644 src/KeePass/Forms/TextEncodingForm.Designer.cs create mode 100644 src/KeePass/Forms/TextEncodingForm.cs create mode 100644 src/KeePass/Forms/TextEncodingForm.resx create mode 100644 src/KeePass/Forms/UpdateCheckForm.Designer.cs create mode 100644 src/KeePass/Forms/UpdateCheckForm.cs create mode 100644 src/KeePass/Forms/UpdateCheckForm.resx create mode 100644 src/KeePass/Forms/UrlOverrideForm.Designer.cs create mode 100644 src/KeePass/Forms/UrlOverrideForm.cs create mode 100644 src/KeePass/Forms/UrlOverrideForm.resx create mode 100644 src/KeePass/Forms/UrlOverridesForm.Designer.cs create mode 100644 src/KeePass/Forms/UrlOverridesForm.cs create mode 100644 src/KeePass/Forms/UrlOverridesForm.resx create mode 100644 src/KeePass/Forms/WebDocForm.Designer.cs create mode 100644 src/KeePass/Forms/WebDocForm.cs create mode 100644 src/KeePass/Forms/WebDocForm.resx create mode 100644 src/KeePass/Forms/XmlReplaceForm.Designer.cs create mode 100644 src/KeePass/Forms/XmlReplaceForm.cs create mode 100644 src/KeePass/Forms/XmlReplaceForm.resx create mode 100644 src/KeePass/Forms/_Accessories.cs create mode 100644 src/KeePass/KeePass.csproj create mode 100644 src/KeePass/KeePass.ico create mode 100644 src/KeePass/KeePass.pfx create mode 100644 src/KeePass/Native/NativeMethods.Defs.cs create mode 100644 src/KeePass/Native/NativeMethods.New.cs create mode 100644 src/KeePass/Native/NativeMethods.Structs.cs create mode 100644 src/KeePass/Native/NativeMethods.Unix.cs create mode 100644 src/KeePass/Native/NativeMethods.cs create mode 100644 src/KeePass/Native/NativeProgressDialog.cs create mode 100644 src/KeePass/Native/ShellLinkEx.cs create mode 100644 src/KeePass/Plugins/DefaultPluginHost.cs create mode 100644 src/KeePass/Plugins/IPluginHost.cs create mode 100644 src/KeePass/Plugins/PlgxCache.cs create mode 100644 src/KeePass/Plugins/PlgxCsprojLoader.cs create mode 100644 src/KeePass/Plugins/PlgxPlugin.cs create mode 100644 src/KeePass/Plugins/PlgxPluginInfo.cs create mode 100644 src/KeePass/Plugins/Plugin.cs create mode 100644 src/KeePass/Plugins/PluginInfo.cs create mode 100644 src/KeePass/Plugins/PluginManager.cs create mode 100644 src/KeePass/Program.cs create mode 100644 src/KeePass/Properties/AssemblyInfo.cs create mode 100644 src/KeePass/Properties/Resources.Designer.cs create mode 100644 src/KeePass/Properties/Resources.resx create mode 100644 src/KeePass/Resources/Data/Images_App_HighRes.bin create mode 100644 src/KeePass/Resources/Data/Images_Client_16.bin create mode 100644 src/KeePass/Resources/Data/Images_Client_HighRes.bin create mode 100644 src/KeePass/Resources/Data/MostPopularPasswords.txt.gz create mode 100644 src/KeePass/Resources/Icons/KeePass.ico create mode 100644 src/KeePass/Resources/Icons/LockOverlay.ico create mode 100644 src/KeePass/Resources/Icons/QuadLocked.ico create mode 100644 src/KeePass/Resources/Icons/QuadNormal.ico create mode 100644 src/KeePass/Resources/Images/B16x16_FontBold.png create mode 100644 src/KeePass/Resources/Images/B16x16_FontItalic.png create mode 100644 src/KeePass/Resources/Images/B16x16_FontStrikeout.png create mode 100644 src/KeePass/Resources/Images/B16x16_FontUnderline.png create mode 100644 src/KeePass/Resources/Images/B16x16_KeePass.png create mode 100644 src/KeePass/Resources/Images/B16x16_LockWorkspace.png create mode 100644 src/KeePass/Resources/Images/B16x16_MenuCheck.png create mode 100644 src/KeePass/Resources/Images/B16x16_MenuRadio.png create mode 100644 src/KeePass/Resources/Images/B16x16_Transparent.png create mode 100644 src/KeePass/Resources/Images/B19x07_3BlackDots.png create mode 100644 src/KeePass/Resources/Images/B48x35_WritingHand.png create mode 100644 src/KeePass/Resources/KPRes.Generated.cs create mode 100644 src/KeePass/Resources/KPRes.cs create mode 100644 src/KeePass/Resources/Nuvola/B16x16_1DownArrow.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_1UpArrow.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_2DownArrow.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_2UpArrow.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_ASCII.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Apply.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Attach.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Binary.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_BlockDevice.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Browser.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Color_Fill.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Colorize.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_CompFile.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Configure.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Cut.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Edit.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_EditCopy.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_EditDelete.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_EditPaste.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_EditShred.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Error.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Exit.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_FTP.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_FileNew.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_FilePrint.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_FileQuickPrint.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_FileSave.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_FileSaveAs.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_File_Locked.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Folder.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Folder_Blue_Open.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Folder_Home.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Folder_Inbox.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Folder_Locked.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Folder_Outbox.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Folder_Txt.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Folder_Yellow_Open.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_HTML.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Help.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_History.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_History_Clear.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_HwInfo.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Identity.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_KGPG_Gen.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_KGPG_Import.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_KGPG_Info.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_KGPG_Key1.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_KGPG_Key2.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_KGPG_Key3.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_KGPG_Sign.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_KNotes.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_KOrganizer.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_KRec_Record.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_KTouch.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_KaboodleLoop.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Keyboard_Layout.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Laptop_Charge.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Make_KDevelop.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_MessageBox_Critical.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_MessageBox_Info.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_MessageBox_Warning.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Misc.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_No.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Package_Development.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Package_Settings.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Personal.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Redo.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Reload_Page.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Services.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Spreadsheet.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Toggle_Log.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Trashcan_Full.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Undo.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_View_Detailed.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_WWW.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_Wizard.png create mode 100644 src/KeePass/Resources/Nuvola/B16x16_XMag.png create mode 100644 src/KeePass/Resources/Nuvola/B32x32_Trashcan_Full.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_Ark.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_Binary.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_BlockDevice.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_FilePrint.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_Folder_Download.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_Folder_Txt.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_Font.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_KCMSystem.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_KGPG_Gen.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_KGPG_Key2.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_KGPG_Sign.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_KMag.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_KOrganizer.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_Keyboard_Layout.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_Make_KDevelop.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_MessageBox_Info.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_Package_Settings.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_Run.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_Source_Moc.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_View_Detailed.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_WWW.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_Wizard.png create mode 100644 src/KeePass/Resources/Nuvola/B48x48_XMag.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B15x14_FileNew.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_DeleteEntry.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_EditCopyLink.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_EditCopyUrl.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_FileSave_Disabled.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_File_Close.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_File_SaveAll.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_File_SaveAll_Disabled.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_Folder_2.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_Folder_New_Ex.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_Key_New.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_TextAlignCenter.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_TextAlignLeft.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_TextAlignRight.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_Window_2Horz1Vert.png create mode 100644 src/KeePass/Resources/Nuvola_Derived/B16x16_Window_3Horz.png create mode 100644 src/KeePass/UI/AccessKeyManagerEx.cs create mode 100644 src/KeePass/UI/AccessibilityEx.cs create mode 100644 src/KeePass/UI/AsyncPwListUpdate.cs create mode 100644 src/KeePass/UI/BackgroundForm.cs create mode 100644 src/KeePass/UI/BannerFactory.cs create mode 100644 src/KeePass/UI/CheckedLVItemDXList.cs create mode 100644 src/KeePass/UI/ColorButtonEx.cs create mode 100644 src/KeePass/UI/ColorMenuItem.cs create mode 100644 src/KeePass/UI/ColumnProvider.cs create mode 100644 src/KeePass/UI/ColumnProviderPool.cs create mode 100644 src/KeePass/UI/CustomContextMenuEx.cs create mode 100644 src/KeePass/UI/CustomContextMenuStripEx.cs create mode 100644 src/KeePass/UI/CustomListViewEx.cs create mode 100644 src/KeePass/UI/CustomMenuStripEx.cs create mode 100644 src/KeePass/UI/CustomMessageFilterEx.cs create mode 100644 src/KeePass/UI/CustomRichTextBoxEx.cs create mode 100644 src/KeePass/UI/CustomSplitContainerEx.cs create mode 100644 src/KeePass/UI/CustomToolStripEx.cs create mode 100644 src/KeePass/UI/CustomTreeViewEx.cs create mode 100644 src/KeePass/UI/DocumentManagerEx.cs create mode 100644 src/KeePass/UI/DpiUtil.cs create mode 100644 src/KeePass/UI/DwmUtil.cs create mode 100644 src/KeePass/UI/DynamicMenu.cs create mode 100644 src/KeePass/UI/EnableThemingInScope.cs create mode 100644 src/KeePass/UI/ExpiryControlGroup.cs create mode 100644 src/KeePass/UI/FileDialogsEx.cs create mode 100644 src/KeePass/UI/FileIcons.cs create mode 100644 src/KeePass/UI/FontControlGroup.cs create mode 100644 src/KeePass/UI/FontUtil.cs create mode 100644 src/KeePass/UI/GlobalWindowManager.cs create mode 100644 src/KeePass/UI/HotKeyControlEx.cs create mode 100644 src/KeePass/UI/IGwmWindow.cs create mode 100644 src/KeePass/UI/IconColorizer.cs create mode 100644 src/KeePass/UI/ImageComboBoxEx.cs create mode 100644 src/KeePass/UI/KeyboardControl.cs create mode 100644 src/KeePass/UI/ListSorter.cs create mode 100644 src/KeePass/UI/ListViewGroupingMenu.cs create mode 100644 src/KeePass/UI/ListViewSortMenu.cs create mode 100644 src/KeePass/UI/ListViewStateEx.cs create mode 100644 src/KeePass/UI/MenuItemLinks.cs create mode 100644 src/KeePass/UI/MruList.cs create mode 100644 src/KeePass/UI/NotifyIconEx.cs create mode 100644 src/KeePass/UI/OnDemandStatusDialog.cs create mode 100644 src/KeePass/UI/OpenWithMenu.cs create mode 100644 src/KeePass/UI/PromptedTextBox.cs create mode 100644 src/KeePass/UI/ProtectedDialog.cs create mode 100644 src/KeePass/UI/PwGeneratorMenu.cs create mode 100644 src/KeePass/UI/PwInputControlGroup.cs create mode 100644 src/KeePass/UI/QualityProgressBar.cs create mode 100644 src/KeePass/UI/RichTextBoxContextMenu.cs create mode 100644 src/KeePass/UI/RichTextBuilder.cs create mode 100644 src/KeePass/UI/RtlAwareResizeScope.cs create mode 100644 src/KeePass/UI/SecureTextBoxEx.cs create mode 100644 src/KeePass/UI/ShowWarningsLogger.cs create mode 100644 src/KeePass/UI/SplitButtonEx.cs create mode 100644 src/KeePass/UI/StatusBarLogger.cs create mode 100644 src/KeePass/UI/StatusUtil.cs create mode 100644 src/KeePass/UI/SuspendLayoutScope.cs create mode 100644 src/KeePass/UI/TabControlEx.cs create mode 100644 src/KeePass/UI/TaskbarList.cs create mode 100644 src/KeePass/UI/ToolStripRendering/KeePassTsr.cs create mode 100644 src/KeePass/UI/ToolStripRendering/ProExtTsr.cs create mode 100644 src/KeePass/UI/ToolStripRendering/SystemTsr.cs create mode 100644 src/KeePass/UI/ToolStripRendering/TsrFactory.cs create mode 100644 src/KeePass/UI/ToolStripRendering/TsrPool.cs create mode 100644 src/KeePass/UI/ToolStripRendering/VisualStyleTsr.cs create mode 100644 src/KeePass/UI/ToolStripRendering/Win10Tsr.cs create mode 100644 src/KeePass/UI/ToolStripRendering/Win81Tsr.cs create mode 100644 src/KeePass/UI/UISystemFonts.cs create mode 100644 src/KeePass/UI/UIUtil.cs create mode 100644 src/KeePass/UI/VistaTaskDialog.cs create mode 100644 src/KeePass/Util/AppLocator.cs create mode 100644 src/KeePass/Util/Archive/ImageArchive.cs create mode 100644 src/KeePass/Util/Archive/XspArchive.cs create mode 100644 src/KeePass/Util/Archive/ZipArchiveEx.cs create mode 100644 src/KeePass/Util/AutoType.cs create mode 100644 src/KeePass/Util/AutoTypeCtx.cs create mode 100644 src/KeePass/Util/BinaryDataClassifier.cs create mode 100644 src/KeePass/Util/BinaryDataUtil.cs create mode 100644 src/KeePass/Util/CancellableOperationEventArgs.cs create mode 100644 src/KeePass/Util/ChildProcessesSnapshot.cs create mode 100644 src/KeePass/Util/ClipboardContents.cs create mode 100644 src/KeePass/Util/ClipboardEventChainBlocker.cs create mode 100644 src/KeePass/Util/ClipboardUtil.Unix.cs create mode 100644 src/KeePass/Util/ClipboardUtil.Uwp.cs create mode 100644 src/KeePass/Util/ClipboardUtil.Windows.cs create mode 100644 src/KeePass/Util/ClipboardUtil.cs create mode 100644 src/KeePass/Util/CommandLineArgs.cs create mode 100644 src/KeePass/Util/CriticalSectionEx.cs create mode 100644 src/KeePass/Util/CustomResourceManager.cs create mode 100644 src/KeePass/Util/DiffUtil.cs create mode 100644 src/KeePass/Util/EmergencySheet.cs create mode 100644 src/KeePass/Util/EntryMenu.cs create mode 100644 src/KeePass/Util/EntryTemplates.cs create mode 100644 src/KeePass/Util/EntryUtil.cs create mode 100644 src/KeePass/Util/FileSearchEx.cs create mode 100644 src/KeePass/Util/GlobalMutexPool.cs create mode 100644 src/KeePass/Util/HotKeyManager.cs create mode 100644 src/KeePass/Util/IniFile.cs create mode 100644 src/KeePass/Util/IpcBroadcast.Fsw.cs create mode 100644 src/KeePass/Util/IpcBroadcast.Tcp.cs create mode 100644 src/KeePass/Util/IpcBroadcast.cs create mode 100644 src/KeePass/Util/IpcUtilEx.cs create mode 100644 src/KeePass/Util/KeyUtil.cs create mode 100644 src/KeePass/Util/MultipleValues/MultipleValuesContext.cs create mode 100644 src/KeePass/Util/MultipleValues/MultipleValuesEntryContext.cs create mode 100644 src/KeePass/Util/MultipleValues/MultipleValuesEx.cs create mode 100644 src/KeePass/Util/NetUtil.cs create mode 100644 src/KeePass/Util/PrintUtil.cs create mode 100644 src/KeePass/Util/PwGeneratorUtil.cs create mode 100644 src/KeePass/Util/SearchUtil.cs create mode 100644 src/KeePass/Util/SendInputEx.cs create mode 100644 src/KeePass/Util/SendInputExt/ISiEngine.cs create mode 100644 src/KeePass/Util/SendInputExt/SiCodes.cs create mode 100644 src/KeePass/Util/SendInputExt/SiEngineStd.cs create mode 100644 src/KeePass/Util/SendInputExt/SiEngineUnix.cs create mode 100644 src/KeePass/Util/SendInputExt/SiEngineWin.cs create mode 100644 src/KeePass/Util/SendInputExt/SiEventArgs.cs create mode 100644 src/KeePass/Util/SendInputExt/SiObf.cs create mode 100644 src/KeePass/Util/SendInputExt/SiWindowInfo.cs create mode 100644 src/KeePass/Util/SessionLockNotifier.cs create mode 100644 src/KeePass/Util/ShellUtil.cs create mode 100644 src/KeePass/Util/ShutdownBlocker.cs create mode 100644 src/KeePass/Util/Spr/SprContext.cs create mode 100644 src/KeePass/Util/Spr/SprEncoding.cs create mode 100644 src/KeePass/Util/Spr/SprEngine.PickChars.cs create mode 100644 src/KeePass/Util/Spr/SprEngine.cs create mode 100644 src/KeePass/Util/Spr/SprRefCache.cs create mode 100644 src/KeePass/Util/Spr/SprSyntax.cs create mode 100644 src/KeePass/Util/TagUtil.cs create mode 100644 src/KeePass/Util/TempFilesPool.cs create mode 100644 src/KeePass/Util/TextSimilarity.cs create mode 100644 src/KeePass/Util/UpdateCheckEx.cs create mode 100644 src/KeePass/Util/WinUtil.cs create mode 100644 src/KeePass/Util/XmlSerialization/XmlSerializerEx.Gen.cs create mode 100644 src/KeePass/Util/XmlSerialization/XmlSerializerEx.cs create mode 100644 src/KeePass/Util/XmlUtil.Merge.cs create mode 100644 src/KeePass/Util/XmlUtil.Replace.cs create mode 100644 src/KeePass/Util/XmlUtil.cs create mode 100644 src/KeePassLib/Collections/AutoTypeConfig.cs create mode 100644 src/KeePassLib/Collections/ProtectedBinaryDictionary.cs create mode 100644 src/KeePassLib/Collections/ProtectedBinarySet.cs create mode 100644 src/KeePassLib/Collections/ProtectedStringDictionary.cs create mode 100644 src/KeePassLib/Collections/PwObjectList.cs create mode 100644 src/KeePassLib/Collections/PwObjectPool.cs create mode 100644 src/KeePassLib/Collections/StringDictionaryEx.cs create mode 100644 src/KeePassLib/Collections/VariantDictionary.cs create mode 100644 src/KeePassLib/Cryptography/Cipher/ChaCha20Cipher.cs create mode 100644 src/KeePassLib/Cryptography/Cipher/ChaCha20Engine.cs create mode 100644 src/KeePassLib/Cryptography/Cipher/CipherPool.cs create mode 100644 src/KeePassLib/Cryptography/Cipher/CtrBlockCipher.cs create mode 100644 src/KeePassLib/Cryptography/Cipher/ICipherEngine.cs create mode 100644 src/KeePassLib/Cryptography/Cipher/Salsa20Cipher.cs create mode 100644 src/KeePassLib/Cryptography/Cipher/StandardAesEngine.cs create mode 100644 src/KeePassLib/Cryptography/CryptoRandom.cs create mode 100644 src/KeePassLib/Cryptography/CryptoRandomStream.cs create mode 100644 src/KeePassLib/Cryptography/CryptoStreamEx.cs create mode 100644 src/KeePassLib/Cryptography/CryptoUtil.cs create mode 100644 src/KeePassLib/Cryptography/Hash/Blake2b.cs create mode 100644 src/KeePassLib/Cryptography/HashingStreamEx.cs create mode 100644 src/KeePassLib/Cryptography/HmacOtp.cs create mode 100644 src/KeePassLib/Cryptography/KeyDerivation/AesKdf.GCrypt.cs create mode 100644 src/KeePassLib/Cryptography/KeyDerivation/AesKdf.cs create mode 100644 src/KeePassLib/Cryptography/KeyDerivation/Argon2Kdf.Core.cs create mode 100644 src/KeePassLib/Cryptography/KeyDerivation/Argon2Kdf.cs create mode 100644 src/KeePassLib/Cryptography/KeyDerivation/KdfEngine.cs create mode 100644 src/KeePassLib/Cryptography/KeyDerivation/KdfParameters.cs create mode 100644 src/KeePassLib/Cryptography/KeyDerivation/KdfPool.cs create mode 100644 src/KeePassLib/Cryptography/PasswordGenerator/CharSetBasedGenerator.cs create mode 100644 src/KeePassLib/Cryptography/PasswordGenerator/CustomPwGenerator.cs create mode 100644 src/KeePassLib/Cryptography/PasswordGenerator/CustomPwGeneratorPool.cs create mode 100644 src/KeePassLib/Cryptography/PasswordGenerator/PatternBasedGenerator.cs create mode 100644 src/KeePassLib/Cryptography/PasswordGenerator/PwCharSet.cs create mode 100644 src/KeePassLib/Cryptography/PasswordGenerator/PwGenerator.cs create mode 100644 src/KeePassLib/Cryptography/PasswordGenerator/PwProfile.cs create mode 100644 src/KeePassLib/Cryptography/PopularPasswords.cs create mode 100644 src/KeePassLib/Cryptography/QualityEstimation.cs create mode 100644 src/KeePassLib/Cryptography/SelfTest.cs create mode 100644 src/KeePassLib/Delegates/Handlers.cs create mode 100644 src/KeePassLib/Interfaces/IDeepCloneable.cs create mode 100644 src/KeePassLib/Interfaces/IStatusLogger.cs create mode 100644 src/KeePassLib/Interfaces/IStructureItem.cs create mode 100644 src/KeePassLib/Interfaces/ITimeLogger.cs create mode 100644 src/KeePassLib/Interfaces/IUIOperations.cs create mode 100644 src/KeePassLib/Interfaces/IXmlSerializerEx.cs create mode 100644 src/KeePassLib/KeePassLib.csproj create mode 100644 src/KeePassLib/KeePassLib.pfx create mode 100644 src/KeePassLib/Keys/CompositeKey.cs create mode 100644 src/KeePassLib/Keys/IUserKey.cs create mode 100644 src/KeePassLib/Keys/KcpCustomKey.cs create mode 100644 src/KeePassLib/Keys/KcpKeyFile.Xml.cs create mode 100644 src/KeePassLib/Keys/KcpKeyFile.cs create mode 100644 src/KeePassLib/Keys/KcpPassword.cs create mode 100644 src/KeePassLib/Keys/KcpUserAccount.cs create mode 100644 src/KeePassLib/Keys/KeyProvider.cs create mode 100644 src/KeePassLib/Keys/KeyProviderPool.cs create mode 100644 src/KeePassLib/Keys/KeyValidator.cs create mode 100644 src/KeePassLib/Keys/KeyValidatorPool.cs create mode 100644 src/KeePassLib/Keys/UserKeyType.cs create mode 100644 src/KeePassLib/Native/ClipboardU.cs create mode 100644 src/KeePassLib/Native/NativeBufferEx.cs create mode 100644 src/KeePassLib/Native/NativeLib.cs create mode 100644 src/KeePassLib/Native/NativeMethods.Unix.cs create mode 100644 src/KeePassLib/Native/NativeMethods.cs create mode 100644 src/KeePassLib/Native/SimpleStat.cs create mode 100644 src/KeePassLib/Properties/AssemblyInfo.cs create mode 100644 src/KeePassLib/PwCustomIcon.cs create mode 100644 src/KeePassLib/PwDatabase.cs create mode 100644 src/KeePassLib/PwDefs.cs create mode 100644 src/KeePassLib/PwDeletedObject.cs create mode 100644 src/KeePassLib/PwEntry.cs create mode 100644 src/KeePassLib/PwEnums.cs create mode 100644 src/KeePassLib/PwGroup.Search.cs create mode 100644 src/KeePassLib/PwGroup.cs create mode 100644 src/KeePassLib/PwUuid.cs create mode 100644 src/KeePassLib/Resources/KLRes.Generated.cs create mode 100644 src/KeePassLib/Resources/KLRes.cs create mode 100644 src/KeePassLib/Resources/KSRes.Generated.cs create mode 100644 src/KeePassLib/Security/ProtectedBinary.cs create mode 100644 src/KeePassLib/Security/ProtectedString.cs create mode 100644 src/KeePassLib/Security/XorredBuffer.cs create mode 100644 src/KeePassLib/Serialization/BinaryReaderEx.cs create mode 100644 src/KeePassLib/Serialization/FileLock.cs create mode 100644 src/KeePassLib/Serialization/FileTransactionEx.cs create mode 100644 src/KeePassLib/Serialization/HashedBlockStream.cs create mode 100644 src/KeePassLib/Serialization/HmacBlockStream.cs create mode 100644 src/KeePassLib/Serialization/IOConnection.cs create mode 100644 src/KeePassLib/Serialization/IOConnectionInfo.cs create mode 100644 src/KeePassLib/Serialization/IocProperties.cs create mode 100644 src/KeePassLib/Serialization/IocPropertyInfo.cs create mode 100644 src/KeePassLib/Serialization/IocPropertyInfoPool.cs create mode 100644 src/KeePassLib/Serialization/KdbxFile.Read.Streamed.cs create mode 100644 src/KeePassLib/Serialization/KdbxFile.Read.cs create mode 100644 src/KeePassLib/Serialization/KdbxFile.Write.cs create mode 100644 src/KeePassLib/Serialization/KdbxFile.cs create mode 100644 src/KeePassLib/Serialization/OldFormatException.cs create mode 100644 src/KeePassLib/Translation/KPControlCustomization.cs create mode 100644 src/KeePassLib/Translation/KPFormCustomization.cs create mode 100644 src/KeePassLib/Translation/KPStringTable.cs create mode 100644 src/KeePassLib/Translation/KPStringTableItem.cs create mode 100644 src/KeePassLib/Translation/KPTranslation.cs create mode 100644 src/KeePassLib/Translation/KPTranslationProperties.cs create mode 100644 src/KeePassLib/Utility/AppLogEx.cs create mode 100644 src/KeePassLib/Utility/GfxUtil.cs create mode 100644 src/KeePassLib/Utility/MemUtil.cs create mode 100644 src/KeePassLib/Utility/MessageService.cs create mode 100644 src/KeePassLib/Utility/MonoWorkarounds.cs create mode 100644 src/KeePassLib/Utility/StrUtil.cs create mode 100644 src/KeePassLib/Utility/TimeUtil.cs create mode 100644 src/KeePassLib/Utility/TypeOverridePool.cs create mode 100644 src/KeePassLib/Utility/UrlUtil.cs create mode 100644 src/KeePassLib/Utility/XmlUtilEx.cs create mode 100644 src/ReadMe_PFX.txt create mode 100644 src/ShInstUtil/Resource.h create mode 100644 src/ShInstUtil/Resources/TrustInfoManifest.xml create mode 100644 src/ShInstUtil/ShInstUtil.cpp create mode 100644 src/ShInstUtil/ShInstUtil.h create mode 100644 src/ShInstUtil/ShInstUtil.rc create mode 100644 src/ShInstUtil/ShInstUtil.sln create mode 100644 src/ShInstUtil/ShInstUtil.vcproj create mode 100644 src/Translation/DefaultText.xml create mode 100644 src/Translation/DefaultTextSD.xml create mode 100644 src/Translation/DefaultUpdateCs.bat create mode 100644 src/Translation/TrlUtil/AccelKeysCheck.cs create mode 100644 src/Translation/TrlUtil/App/Configuration/TceApplication.cs create mode 100644 src/Translation/TrlUtil/App/Configuration/TceConfig.cs create mode 100644 src/Translation/TrlUtil/App/TuDefs.cs create mode 100644 src/Translation/TrlUtil/FormTrlMgr.cs create mode 100644 src/Translation/TrlUtil/MainForm.Designer.cs create mode 100644 src/Translation/TrlUtil/MainForm.cs create mode 100644 src/Translation/TrlUtil/MainForm.resx create mode 100644 src/Translation/TrlUtil/Native/NativeMethods.cs create mode 100644 src/Translation/TrlUtil/PreviewForm.cs create mode 100644 src/Translation/TrlUtil/Program.cs create mode 100644 src/Translation/TrlUtil/Properties/AssemblyInfo.cs create mode 100644 src/Translation/TrlUtil/Properties/Resources.Designer.cs create mode 100644 src/Translation/TrlUtil/Properties/Resources.resx create mode 100644 src/Translation/TrlUtil/Resources/B16x16_Binary.png create mode 100644 src/Translation/TrlUtil/Resources/B16x16_Down.png create mode 100644 src/Translation/TrlUtil/Resources/B16x16_FileSave.png create mode 100644 src/Translation/TrlUtil/Resources/B16x16_FileSaveAs.png create mode 100644 src/Translation/TrlUtil/Resources/B16x16_Folder_Yellow_Open.png create mode 100644 src/Translation/TrlUtil/Resources/B16x16_KRec_Record.png create mode 100644 src/Translation/TrlUtil/Resources/B16x16_Keyboard_Layout.png create mode 100644 src/Translation/TrlUtil/Resources/B16x16_LedGreen.png create mode 100644 src/Translation/TrlUtil/Resources/B16x16_LedLightBlue.png create mode 100644 src/Translation/TrlUtil/Resources/B16x16_LedLightGreen.png create mode 100644 src/Translation/TrlUtil/Resources/B16x16_LedOrange.png create mode 100644 src/Translation/TrlUtil/Resources/B16x16_View_Remove.png create mode 100644 src/Translation/TrlUtil/Resources/KeePass.ico create mode 100644 src/Translation/TrlUtil/TrlImport.cs create mode 100644 src/Translation/TrlUtil/TrlUtil.csproj diff --git a/src/Build/Clean.bat b/src/Build/Clean.bat new file mode 100644 index 0000000..8ac526f --- /dev/null +++ b/src/Build/Clean.bat @@ -0,0 +1,73 @@ +RMDIR /S /Q KeePass +RMDIR /S /Q KeePass_Distrib +RMDIR /S /Q KeePassLib +RMDIR /S /Q KeePassLibDoc +REM RMDIR /S /Q KeePassLibSD +REM RMDIR /S /Q KeePassNtv +RMDIR /S /Q ShInstUtil + +RMDIR /S /Q ..\Ext\Output + +RMDIR /S /Q ..\KeePass\obj +DEL ..\KeePass\KeePass.csproj.user + +RMDIR /S /Q ..\KeePassLib\obj +DEL ..\KeePassLib\KeePassLib.csproj.user + +REM RMDIR /S /Q ..\KeePassLibSD\obj +REM DEL ..\KeePassLibSD\KeePassLibSD.csproj.user + +REM RMDIR /S /Q ..\ShInstUtil\obj +REM DEL ..\ShInstUtil\ShInstUtil.csproj.user +DEL ..\ShInstUtil\ShInstUtil.aps +DEL ..\ShInstUtil\ShInstUtil.ncb +DEL /A:H ..\ShInstUtil\ShInstUtil.suo +DEL /Q ..\ShInstUtil\*.user + +DEL /A:H ..\KeePass.suo +DEL ..\KeePass.ncb + +REM DEL /Q ..\KeePassNtv\*.aps +REM DEL /Q ..\KeePassNtv\*.user + +RMDIR /S /Q ArcFourCipher +RMDIR /S /Q ..\Plugins\ArcFourCipher\obj +DEL ..\Plugins\ArcFourCipher\ArcFourCipher.csproj.user +DEL /A:H ..\Plugins\ArcFourCipher\ArcFourCipher.suo + +RMDIR /S /Q KPScript +RMDIR /S /Q ..\Plugins\KPScript\obj +DEL ..\Plugins\KPScript\KPScript.csproj.user +DEL /A:H ..\Plugins\KPScript\KPScript.suo + +RMDIR /S /Q SamplePlugin +RMDIR /S /Q ..\Plugins\SamplePlugin\obj +DEL ..\Plugins\SamplePlugin\SamplePlugin.csproj.user +DEL /A:H ..\Plugins\SamplePlugin\SamplePlugin.suo + +RMDIR /S /Q ..\Plugins\SamplePluginCpp\Build +DEL /Q ..\Plugins\SamplePluginCpp\*.aps +DEL /Q ..\Plugins\SamplePluginCpp\*.user +DEL /Q ..\Plugins\SamplePluginCpp\*.ncb +DEL /A:H ..\Plugins\SamplePluginCpp\SamplePluginCpp.suo + +RMDIR /S /Q ..\Translation\TrlUtil\Build +RMDIR /S /Q ..\Translation\TrlUtil\obj +DEL ..\Translation\KeePass.config.xml +DEL ..\Translation\KeePass.exe +DEL ..\Translation\KeePass.exe.config +DEL ..\Translation\KeePass.pdb +DEL ..\Translation\KeePass.XmlSerializers.dll +DEL ..\Translation\TrlUtil.exe +DEL ..\Translation\TrlUtil.exe.config +DEL ..\Translation\TrlUtil.pdb +DEL ..\Translation\TrlUtil.vshost.exe +DEL ..\Translation\TrlUtil.vshost.exe.manifest + +DEL /A:H ..\Ext\KeePassMsi\KeePassMsi.suo +RMDIR /S /Q ..\Ext\KeePassMsi\.vs +RMDIR /S /Q KeePassMsi + +RMDIR /S /Q KPScript + +CLS \ No newline at end of file diff --git a/src/Build/KeePassLib_Distrib/KeePassLib.dll b/src/Build/KeePassLib_Distrib/KeePassLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..3c0f0d6ec68fe9405fefc0c42c74f2b12135e140 GIT binary patch literal 365976 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%0D8#u*Mto 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 Ojs3PS + + + KeePassLib + + + + + A class containing various static path utility helper methods (like + stripping extension from a file, etc.). + + + + + Get the directory (path) of a file name. The returned string may be + terminated by a directory separator character. Example: + passing C:\\My Documents\\My File.kdb in + and true to + would produce this string: C:\\My Documents\\. + + Full path of a file. + Append a terminating directory separator + character to the returned path. + If true, the returned path + is guaranteed to be a valid directory path (for example X:\\ instead + of X:, overriding ). + This should only be set to true, if the returned path is directly + passed to some directory API. + Directory of the file. + + + + Gets the file name of the specified file (full path). Example: + if is C:\\My Documents\\My File.kdb + the returned string is My File.kdb. + + Full path of a file. + File name of the specified file. + + + + Strip the extension of a file. + + Full path of a file with extension. + File name without extension. + + + + Get the extension of a file. + + Full path of a file with extension. + Extension without prepending dot. + + + + Ensure that a path is terminated with a directory separator character. + + Input path. + If true, a slash (/) is appended to + the string if it's not terminated already. If false, the + default system directory separator character is used. + Path having a directory separator as last character. + + + + Get the host component of a URL. + This method is faster and more fault-tolerant than creating + an Uri object and querying its Host + property. + + + For the input s://u:p@d.tld:p/p?q#f the return + value is d.tld. + + + + + Expand shell variables in a string. + [0] is the value of %1, etc. + + + + + The fully qualified name of the form. + + + + + Serialization to KeePass KDBX files. + + + Serialization to KeePass KDBX files. + + + Serialization to KeePass KDBX files. + + + Serialization to KeePass KDBX files. + + + + + File identifier, first 32-bit value. + + + + + File identifier, second 32-bit value. + + + + + Maximum supported version of database files. + KeePass 2.07 has version 1.01, 2.08 has 1.02, 2.09 has 2.00, + 2.10 has 2.02, 2.11 has 2.04, 2.15 has 3.00, 2.20 has 3.01. + The first 2 bytes are critical (i.e. loading will fail, if the + file version is too high), the last 2 bytes are informational. + + + + + Load a KDBX file. + + File to load. + Format. + Status logger (optional). + + + + Load a KDBX file from a stream. + + Stream to read the data from. Must contain + a KDBX stream. + Format. + Status logger (optional). + + + + Save the contents of the current PwDatabase to a KDBX file. + + Stream to write the KDBX file into. + Group containing all groups and + entries to write. If null, the complete database will + be written. + Format of the file to create. + Logger that recieves status information. + + + + Default constructor. + + The PwDatabase instance that the + class will load file data into or use to create a KDBX file. + + + + Call this once to determine the current localization settings. + + + + + Detach binaries when opening a file. If this isn't null, + all binaries are saved to the specified path and are removed + from the database. + + + + + Contains KeePassLib-global definitions and enums. + + + + + Default identifier string for the title field. + Should not contain spaces, tabs or other whitespace. + + + + + Default identifier string for the user name field. + Should not contain spaces, tabs or other whitespace. + + + + + Default identifier string for the password field. + Should not contain spaces, tabs or other whitespace. + + + + + Default identifier string for the URL field. + Should not contain spaces, tabs or other whitespace. + + + + + Default identifier string for the notes field. + Should not contain spaces, tabs or other whitespace. + + + + + Maximum time (in milliseconds) after which the user interface + should be updated. + + + + + The product name. + + + + + A short, simple string representing the product name. The string + should contain no spaces, directory separator characters, etc. + + + + + Version, encoded as 32-bit unsigned integer. + 2.00 = 0x02000000, 2.01 = 0x02000100, ..., 2.18 = 0x02010800. + As of 2.19, the version is encoded component-wise per byte, + e.g. 2.19 = 0x02130000. + It is highly recommended to use FileVersion64 instead. + + + + + Version, encoded as 64-bit unsigned integer + (component-wise, 16 bits per component). + + + + + Version, encoded as string. + + + + + Product website URL. Terminated by a forward slash. + + + + + URL to the online translations page. + + + + + URL to the online plugins page. + + + + + Product donations URL. + + + + + URL to the root path of the online KeePass help. Terminated by + a forward slash. + + + + + URL to a TXT file (eventually compressed) that contains information + about the latest KeePass version available on the website. + + + + + A DateTime object that represents the time when the assembly + was loaded. + + + + + Default number of master key encryption/transformation rounds + (making dictionary attacks harder). + + + + + Default identifier string for the field which will contain TAN indices. + + + + + Default title of an entry that is really a TAN entry. + + + + + Prefix of a custom auto-type string field. + + + + + Default string representing a hidden password. + + + + + Default auto-type keystroke sequence. If no custom sequence is + specified, this sequence is used. + + + + + Default auto-type keystroke sequence for TAN entries. If no custom + sequence is specified, this sequence is used. + + + + + Check if a name is a standard field name. + + Input field name. + Returns true, if the field name is a standard + field name (title, user name, password, ...), otherwise false. + + + + Check whether an entry is a TAN entry. + + + + + Search parameters for group and entry searches. + + + + + Construct a new search parameters object. + + + + + String comparison type. Specifies the condition when the specified + text matches a group/entry string. + + + + + Only for serialization. + + + + + Memory protection configuration structure (for default fields). + + + + + Interface for objects that are deeply cloneable. + + Reference type. + + + + Deeply clone the object. + + Cloned object. + + + + Validate a key. + + Key to validate. + Type of the validation to perform. + Returns null, if the validation is successful. + If there is a problem with the key, the returned string describes + the problem. + + + + Name of your key validator (should be unique). + + + + + Generate HMAC-based one-time passwords as specified in RFC 4226. + + + + + A dictionary of ProtectedString objects. + + + + + Construct a new dictionary of protected strings. + + + + + Get one of the protected strings. + + String identifier. + Protected string. If the string identified by + cannot be found, the function + returns null. + Thrown if the input + parameter is null. + + + + Get one of the protected strings. The return value is never null. + If the requested string cannot be found, an empty protected string + object is returned. + + String identifier. + Returns a protected string object. If the standard string + has not been set yet, the return value is an empty string (""). + Thrown if the input + parameter is null. + + + + Test if a named string exists. + + Name of the string to try. + Returns true if the string exists, otherwise false. + Thrown if + is null. + + + + Get one of the protected strings. If the string doesn't exist, the + return value is an empty string (""). + + Name of the requested string. + Requested string value or an empty string, if the named + string doesn't exist. + Thrown if the input + parameter is null. + + + + Get one of the entry strings. If the string doesn't exist, the + return value is an empty string (""). If the string is + in-memory protected, the return value is PwDefs.HiddenPassword. + + Name of the requested string. + Returns the requested string in plain-text or + PwDefs.HiddenPassword if the string cannot be found. + Thrown if the input + parameter is null. + + + + Set a string. + + Identifier of the string field to modify. + New value. This parameter must not be null. + Thrown if one of the input + parameters is null. + + + + Delete a string. + + Name of the string field to delete. + Returns true if the field has been successfully + removed, otherwise the return value is false. + Thrown if the input + parameter is null. + + + + Get the number of strings. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Look up a localized string similar to + 'The algorithm is unknown.'. + + + + + Look up a localized string similar to + 'The character set is invalid.'. + + + + + Look up a localized string similar to + 'There are too few characters in the character set.'. + + + + + Look up a localized string similar to + 'Failed to initialize encryption/decryption stream!'. + + + + + Look up a localized string similar to + 'The data is too large to be encrypted/decrypted securely using {PARAM}.'. + + + + + Look up a localized string similar to + 'entry'. + + + + + Look up a localized string similar to + 'An extended error report has been copied to the clipboard.'. + + + + + Look up a localized string similar to + 'Expect 100-Continue responses'. + + + + + Look up a localized string similar to + 'Fatal Error'. + + + + + Look up a localized string similar to + 'A fatal error has occurred!'. + + + + + Look up a localized string similar to + 'The file is corrupted.'. + + + + + Look up a localized string similar to + 'The file header is corrupted.'. + + + + + Look up a localized string similar to + 'Data is missing at the end of the file, i.e. the file is incomplete.'. + + + + + Look up a localized string similar to + 'Less data than expected could be read from the file.'. + + + + + Look up a localized string similar to + 'Failed to load the specified file!'. + + + + + Look up a localized string similar to + 'The file is locked, because the following user is currently writing to it:'. + + + + + Look up a localized string similar to + 'A newer KeePass version or a plugin is required to open this file.'. + + + + + Look up a localized string similar to + 'A newer KeePass version is required to open this file.'. + + + + + Look up a localized string similar to + 'The target file might be corrupted. Please try saving again. If that fails, save the database to a different location.'. + + + + + Look up a localized string similar to + 'Failed to save to the specified file!'. + + + + + Look up a localized string similar to + 'The file signature is invalid. Either the file isn't a KeePass database file at all or it is corrupted.'. + + + + + Look up a localized string similar to + 'The file is encrypted using an unknown encryption algorithm!'. + + + + + Look up a localized string similar to + 'The file is compressed using an unknown compression algorithm!'. + + + + + Look up a localized string similar to + 'The file format version is unsupported.'. + + + + + Look up a localized string similar to + 'Failed to create the final encryption/decryption key!'. + + + + + Look up a localized string similar to + 'The .NET Framework/runtime under which KeePass is currently running does not support this operation.'. + + + + + Look up a localized string similar to + 'General'. + + + + + Look up a localized string similar to + 'group'. + + + + + Look up a localized string similar to + 'The master key is invalid!'. + + + + + Look up a localized string similar to + 'Make sure that the master key is correct and try it again.'. + + + + + Look up a localized string similar to + 'Found invalid data while decoding.'. + + + + + Look up a localized string similar to + 'In order to import KeePass 1.x KDB files, create a new 2.x database file and click 'File' -> 'Import' in the main menu. In the import dialog, choose 'KeePass KDB (1.x)' as file format.'. + + + + + Look up a localized string similar to + '{PARAM}-bit key'. + + + + + Look up a localized string similar to + 'Database files cannot be used as key files.'. + + + + + Look up a localized string similar to + 'The key and the hash do not match, i.e. the key or the hash is invalid.'. + + + + + Look up a localized string similar to + 'The length of the master key seed is invalid!'. + + + + + Look up a localized string similar to + 'The selected file appears to be an old format'. + + + + + Look up a localized string similar to + 'Passive'. + + + + + Look up a localized string similar to + 'The path contains a backslash. Such paths are not supported (for security reasons).'. + + + + + Look up a localized string similar to + 'The pattern is invalid.'. + + + + + Look up a localized string similar to + 'Pre-authenticate'. + + + + + Look up a localized string similar to + 'Failed to generate a password.'. + + + + + Look up a localized string similar to + 'Structures are nested too deeply.'. + + + + + Look up a localized string similar to + 'Timeout'. + + + + + Look up a localized string similar to + 'Please try it again in a few seconds.'. + + + + + Look up a localized string similar to + 'An unknown error occurred.'. + + + + + Look up a localized string similar to + 'Unknown header ID!'. + + + + + Look up a localized string similar to + 'Unknown key derivation function!'. + + + + + Look up a localized string similar to + 'The operating system did not grant KeePass read/write access to the user profile folder, where the protected user key is stored.'. + + + + + Look up a localized string similar to + 'User agent'. + + + + + Algorithms supported by CryptoRandomStream. + + + + + Not supported. + + + + + A variant of the ARCFour algorithm (RC4 incompatible). + Insecure; for backward compatibility only. + + + + + Salsa20 stream cipher algorithm. + + + + + ChaCha20 stream cipher algorithm. + + + + + A random stream class. The class is initialized using random + bytes provided by the caller. The produced stream has random + properties, but for the same seed always the same stream + is produced, i.e. this class can be used as stream cipher. + + + + + Construct a new cryptographically secure random stream object. + + Algorithm to use. + Initialization key. Must not be null + and must contain at least 1 byte. + + + + Get random bytes. + + Number of random bytes to retrieve. + Returns random bytes. + + + + Character stream class. + + + + + Size of a character in bytes. + + + + + Start signature of the text (byte order mark). + May be null or empty, if no signature is known. + + + + + A class containing various string helper methods. + + + + + Convert a string to a HTML sequence representing that string. + + String to convert. + String, HTML-encoded. + + + + Convert a Color to a HTML color identifier string. + + Color to convert. + If this is true, an empty string + is returned if the color is transparent. + HTML color identifier string. + + + + Format an exception and convert it to a string. + + Exception to convert/format. + String representing the exception. + + + + Removes all characters that are not valid XML characters, + according to https://www.w3.org/TR/xml/#charsets . + + Source text. + Text containing only valid XML characters. + + + + Normalize new line characters in a string. Input strings may + contain mixed new line character sequences from all commonly + used operating systems (i.e. \r\n from Windows, \n from Unix + and \r from MacOS. + + String with mixed new line characters. + If true, new line characters + are normalized for Windows (\r\n); if false, new line + characters are normalized for Unix (\n). + String with normalized new line characters. + + + + Split a string and include the separators in the splitted array. + + String to split. + Separators. + Specifies whether separators are + matched case-sensitively or not. + Splitted string including separators. + + + + Create a data URI (according to RFC 2397). + + Data to encode. + Optional MIME type. If null, + an appropriate type is used. + Data URI. + + + + Convert a data URI (according to RFC 2397) to binary data. + + Data URI to decode. + Decoded binary data. + + + + Remove placeholders from a string (wrapped in '{' and '}'). + This doesn't remove environment variables (wrapped in '%'). + + + + + Find a character that does not occur within a given text. + + + + + Generate random seeds and store them in . + + + + + Set the value of the private shown_raised member + variable of a form. + + Previous shown_raised value. + + + + Ensure that the file ~/.recently-used is valid (in order to + prevent Mono's FileDialog from crashing). + + + + + Member variable name of the control to be translated. + + + + + A XorredBuffer object stores data that is encrypted + using a XOR pad. + + + + + Construct a new XorredBuffer object. + The byte array must have the same + length as the byte array. + The XorredBuffer object takes ownership of the two byte + arrays, i.e. the caller must not use them afterwards. + + Data with XOR pad applied. + XOR pad that can be used to decrypt the + byte array. + + + + Get a copy of the plain-text. The caller is responsible + for clearing the byte array safely after using it. + + Plain-text byte array. + + + + Contains various static time structure manipulation and conversion + routines. + + + + + Length of a compressed PW_TIME structure in bytes. + + + + + Pack a DateTime object into 5 bytes. Layout: 2 zero bits, + year 12 bits, month 4 bits, day 5 bits, hour 5 bits, minute 6 + bits, second 6 bits. + + + + + Unpack a packed time (5 bytes, packed by the PackTime + member function) to a DateTime object. + + Packed time, 5 bytes. + Unpacked DateTime object. + + + + Pack a DateTime object into 7 bytes (PW_TIME). + + Object to be encoded. + Packed time, 7 bytes (PW_TIME). + + + + Unpack a packed time (7 bytes, PW_TIME) to a DateTime object. + + Packed time, 7 bytes. + Unpacked DateTime object. + + + + Convert a DateTime object to a displayable string. + + DateTime object to convert to a string. + String representing the specified DateTime object. + + + + Parse a US textual date string, like e.g. "January 02, 2012". + + + + + Check equality of two times with precision 1 s, floor-rounded. + Ticks finer than 1 s are ignored. + + + + + Do not remember user name or password. + + + + + Remember the user name only, not the password. + + + + + Save both user name and password. + + + + + For serialization only; use Properties in code. + + + + + Status message types. + + + + + Default type: simple information type. + + + + + Warning message. + + + + + Error message. + + + + + Additional information. Depends on lines above. + + + + + Status logging interface. + + + + + Function which needs to be called when logging is started. + + This string should roughly describe + the operation, of which the status is logged. + Specifies whether the + operation is written to the log or not. + + + + Function which needs to be called when logging is ended + (i.e. when no more messages will be logged and when the + percent value won't change any more). + + + + + Set the current progress in percent. + + Percent of work finished. + Returns true if the caller should continue + the current work. + + + + Set the current status text. + + Status text. + Type of the message. + Returns true if the caller should continue + the current work. + + + + Check whether the user cancelled the current work. + + Returns true if the caller should continue + the current work. + + + + Interface for objects that support various times (creation time, last + access time, last modification time and expiry time). Offers + several helper functions (for example a function to touch the current + object). + + + + + Touch the object. This function updates the internal last access + time. If the parameter is true, + the last modification time gets updated, too. Each time you call + Touch, the usage count of the object is increased by one. + + Update last modification time. + + + + The date/time when the object was created. + + + + + The date/time when the object was last modified. + + + + + The date/time when the object was last accessed. + + + + + The date/time when the object expires. + + + + + Flag that determines whether the object expires. + + + + + Get or set the usage count of the object. To increase the usage + count by one, use the Touch function. + + + + + The date/time when the location of the object was last changed. + + + + + UUID of the engine. If you want to write an engine/plugin, + please contact the KeePass team to obtain a new UUID. + + + + + Name displayed in the list of available encryption/decryption + engines in the GUI. + + + + + Interface to a user key, like a password, key file data, etc. + + + + + Get key data. Querying this property is fast (it returns a + reference to a cached ProtectedBinary object). + If no key data is available, null is returned. + + + + + Let the user interface save the current database. + + If true, the UI will not ask for + whether to synchronize or overwrite, it'll simply overwrite the + file. + Returns true if the file has been saved. + + + + Latin-1 Supplement except U+00A0 (NBSP) and U+00AD (SHY). + + + + + Create a new, empty character set. + + + + + Remove all characters from this set. + + + + + Add characters to the set. + + Character to add. + + + + Add characters to the set. + + String containing characters to add. + + + + Convert the character set to a string containing all its characters. + + String containing all character set characters. + + + + Number of characters in this set. + + + + + Get a character of the set using an index. + + Index of the character to get. + Character at the specified position. If the index is invalid, + an ArgumentOutOfRangeException is thrown. + + + + Create a cryptographic key of length + (in bytes) from . + + + + + Password generator. + + + + + Rename/move a file. For local file system and WebDAV, the + specified file is moved, i.e. the file destination can be + in a different directory/path. In contrast, for FTP the + file is renamed, i.e. its destination must be in the same + directory/path. + + Source file path. + Target file path. + + + + A group containing subgroups and entries. + + + + + Search this group and all subgroups for entries. + + Specifies the search parameters. + Entry list in which the search results + will be stored. + + + + Search this group and all subgroups for entries. + + Specifies the search parameters. + Entry list in which the search results + will be stored. + Optional status reporting object. + + + + Construct a new, empty group. + + + + + Construct a new, empty group. + + Create a new UUID for this group. + Set creation, last access and last modification times to the current time. + + + + Construct a new group. + + Create a new UUID for this group. + Set creation, last access and last modification times to the current time. + Name of the new group. + Icon of the new group. + + + + Deeply clone the current group. The returned group will be an exact + value copy of the current object (including UUID, etc.). + + Exact value copy of the current PwGroup object. + + + + Assign properties to the current group based on a template group. + + Template group. Must not be null. + Only set the properties of the template group + if it is newer than the current one. + If true, the + LocationChanged property is copied, otherwise not. + + + + Touch the group. This function updates the internal last access + time. If the parameter is true, + the last modification time gets updated, too. + + Modify last modification time. + + + + Touch the group. This function updates the internal last access + time. If the parameter is true, + the last modification time gets updated, too. + + Modify last modification time. + If true, all parent objects + get touched, too. + + + + Get number of groups and entries in the current group. This function + can also traverse through all subgroups and accumulate their counts + (recursive mode). + + If this parameter is true, all + subgroups and entries in subgroups will be counted and added to + the returned value. If it is false, only the number of + subgroups and entries of the current group is returned. + Number of subgroups. + Number of entries. + + + + Traverse the group/entry tree in the current group. Various traversal + methods are available. + + Specifies the traversal method. + Function that performs an action on + the currently visited group (see GroupHandler for more). + This parameter may be null, in this case the tree is traversed but + you don't get notifications for each visited group. + Function that performs an action on + the currently visited entry (see EntryHandler for more). + This parameter may be null. + Returns true if all entries and groups have been + traversed. If the traversal has been canceled by one of the two + handlers, the return value is false. + + + + Pack all groups into one flat linked list of references (recursively). + + Flat list of all groups. + + + + Pack all entries into one flat linked list of references. Temporary + group IDs are assigned automatically. + + A flat group list created by + GetFlatGroupList. + Flat list of all entries. + + + + Enable protection of a specific string field type. + + Name of the string field to protect or unprotect. + Enable protection or not. + Returns true, if the operation completed successfully, + otherwise false. + + + + Find a group. + + UUID identifying the group the caller is looking for. + If true, the search is recursive. + Returns reference to found group, otherwise null. + + + + Find an object. + + UUID of the object to find. + Specifies whether to search recursively. + If null, groups and entries are + searched. If true, only entries are searched. If false, + only groups are searched. + Reference to the object, if found. Otherwise null. + + + + Try to find a subgroup and create it, if it doesn't exist yet. + + Name of the subgroup. + If the group isn't found: create it. + Returns a reference to the requested group or null if + it doesn't exist and shouldn't be created. + + + + Find an entry. + + UUID identifying the entry the caller is looking for. + If true, the search is recursive. + Returns reference to found entry, otherwise null. + + + + Get the full path of the group. + + + + + Get the full path of the group. + + String that separates the group + names. + Specifies whether the returned + path starts with the topmost group. + + + + Assign new UUIDs to groups and entries. + + Create new UUIDs for subgroups. + Create new UUIDs for entries. + Recursive tree traversal. + + + + Find/create a subtree of groups. + + Tree string. + Separators that delimit groups in the + strTree parameter. + + + + Get the depth of this group (i.e. the number of ancestors). + + Depth of this group. + + + + Get a list of subgroups (not including this one). + + If true, subgroups are added + recursively, i.e. all child groups are returned, too. + List of subgroups. If is + true, it is guaranteed that subsubgroups appear after + subgroups. + + + + Get objects contained in this group. + + Specifies whether to search recursively. + If null, the returned list contains + groups and entries. If true, the returned list contains only + entries. If false, the returned list contains only groups. + List of objects. + + + + Add a subgroup to this group. + + Group to be added. Must not be null. + If this parameter is true, the + parent group reference of the subgroup will be set to the current + group (i.e. the current group takes ownership of the subgroup). + + + + Add a subgroup to this group. + + Group to be added. Must not be null. + If this parameter is true, the + parent group reference of the subgroup will be set to the current + group (i.e. the current group takes ownership of the subgroup). + If true, the + LocationChanged property of the subgroup is updated. + + + + Add an entry to this group. + + Entry to be added. Must not be null. + If this parameter is true, the + parent group reference of the entry will be set to the current + group (i.e. the current group takes ownership of the entry). + + + + Add an entry to this group. + + Entry to be added. Must not be null. + If this parameter is true, the + parent group reference of the entry will be set to the current + group (i.e. the current group takes ownership of the entry). + If true, the + LocationChanged property of the entry is updated. + + + + UUID of this group. + + + + + Reference to the group to which this group belongs. May be null. + + + + + The date/time when the location of the object was last changed. + + + + + The name of this group. Cannot be null. + + + + + Comments about this group. Cannot be null. + + + + + Icon of the group. + + + + + Get the custom icon ID. This value is 0, if no custom icon is + being used (i.e. the icon specified by the IconID property + should be displayed). + + + + + A flag that specifies if the group is shown as expanded or + collapsed in the user interface. + + + + + The date/time when this group was created. + + + + + The date/time when this group was last modified. + + + + + The date/time when this group was last accessed (read). + + + + + The date/time when this group expires. + + + + + Flag that determines if the group expires. + + + + + Get or set the usage count of the group. To increase the usage + count by one, use the Touch function. + + + + + Get a list of subgroups in this group. + + + + + Get a list of entries in this group. + + + + + A flag specifying whether this group is virtual or not. Virtual + groups can contain links to entries stored in other groups. + Note that this flag has to be interpreted and set by the calling + code; it won't prevent you from accessing and modifying the list + of entries in this group in any way. + + + + + Default auto-type keystroke sequence for all entries in + this group. This property can be an empty string, which + means that the value should be inherited from the parent. + + + + + Custom data container that can be used by plugins to store + own data in KeePass groups. + The data is stored in the encrypted part of encrypted + database files. + Use unique names for your items, e.g. "PluginName_ItemName". + + + + + Password generation function. + + Password generation options chosen + by the user. This may be null, if the default + options should be used. + Source that the algorithm + can use to generate random numbers. + Generated password or null in case + of failure. If returning null, the caller assumes + that an error message has already been shown to the user. + + + + Each custom password generation algorithm must have + its own unique UUID. + + + + + Displayable name of the password generation algorithm. + + + + + A list of auto-type associations. + + + + + Construct a new auto-type associations list. + + + + + Remove all associations. + + + + + Clone the auto-type associations list. + + New, cloned object. + + + + Specify whether auto-type is enabled or not. + + + + + Specify whether the typing should be obfuscated. + + + + + The default keystroke sequence that is auto-typed if + no matching window is found in the Associations + container. + + + + + Get all auto-type window/keystroke sequence pairs. + + + + + Name of your key provider (should be unique). + + + + + Property indicating whether the provider is exclusive. + If the provider is exclusive, KeePass does not allow other + key sources (master password, Windows user account, ...) + to be combined with the provider. + Key providers typically should return false + (to allow non-exclusive use), i.e. do not override this + property. + + + + + Property that specifies whether the returned key data + gets hashed by KeePass first or is written directly to + the user key data stream. + Standard key provider plugins should return false + (i.e. don't overwrite this property). Returning true + may cause severe security problems and is highly + discouraged. + + + + + This property specifies whether the GetKey method might + show a form or dialog. If there is any chance that the method shows + one, this property must return true. Only if it's guaranteed + that the GetKey method doesn't show any form or dialog, this + property should return false. + + + + + This property specifies whether the key provider is compatible + with the secure desktop mode. This almost never is the case, + so you usually won't override this property. + + + + + Implementation of the ChaCha20 cipher with a 96-bit nonce, + as specified in RFC 7539. + https://tools.ietf.org/html/rfc7539 + + + + + Constructor. + + Key (32 bytes). + Nonce (12 bytes). + If false, the RFC 7539 version + of ChaCha20 is used. In this case, only 256 GB of data can be + encrypted securely (because the block counter is a 32-bit variable); + an attempt to encrypt more data throws an exception. + If is true, the 32-bit + counter overflows to another 32-bit variable (i.e. the counter + effectively is a 64-bit variable), like in the original ChaCha20 + specification by D. J. Bernstein (which has a 64-bit counter and a + 64-bit nonce). To be compatible with this version, the 64-bit nonce + must be stored in the last 8 bytes of + and the first 4 bytes must be 0. + If the IV was generated randomly, a 12-byte IV and a large counter + can be used to securely encrypt more than 256 GB of data (but note + this is incompatible with RFC 7539 and the original specification). + + + + List of objects that implement IDeepCloneable + and cannot be null. + + Object type. + + + + Type of the password generator. Different types like generators + based on given patterns, based on character sets, etc. are + available. + + + + + Generator based on character spaces/sets, i.e. groups + of characters like lower-case, upper-case or numeric characters. + + + + + Password generation based on a pattern. The user has provided + a pattern, which describes how the generated password has to + look like. + + + + + Cryptographically secure pseudo-random number generator. + The returned values are unpredictable and cannot be reproduced. + CryptoRandom is a singleton class. + + + + + Update the internal seed of the random number generator based + on entropy data. + This method is thread-safe. + + Entropy bytes. + + + + Get a number of cryptographically strong random bytes. + This method is thread-safe. + + Number of requested random bytes. + A byte array consisting of + random bytes. + + + + Get the number of random bytes that this instance generated so far. + Note that this number can be higher than the number of random bytes + actually requested using the GetRandomBytes method. + + + + + Event that is triggered whenever the internal GenerateRandom256 + method is called to generate random bytes. + + + + + Interface to native library (library containing fast versions of + several cryptographic functions). + + + + + Determine if the native library is installed. + + Returns true, if the native library is installed. + + + + Transform a key. + + Source and destination buffer. + Key to use for the transformation. + Number of transformation rounds. + Returns true, if the key was transformed successfully. + + + + Benchmark key transformation. + + Number of milliseconds to perform the benchmark. + Number of transformations done. + Returns true, if the benchmark was successful. + + + + If true, the native library is used. + + + + + Resize an image. + + Image to resize. + Width of the returned image. + Height of the returned image. + Flags to customize scaling behavior. + Resized image. This object is always different + from (i.e. they can be + disposed separately). + + + + Buffer manipulation and conversion routines. + + + + + Convert a hexadecimal string to a byte array. The input string must be + even (i.e. its length is a multiple of 2). + + String containing hexadecimal characters. + Returns a byte array. Returns null if the string parameter + was null or is an uneven string (i.e. if its length isn't a + multiple of 2). + Thrown if + is null. + + + + Convert a byte array to a hexadecimal string. + + Input byte array. + Returns the hexadecimal string representing the byte + array. Returns null, if the input byte array was null. Returns + an empty string, if the input byte array has length 0. + + + + Decode Base32 strings according to RFC 4648. + + + + + Set all bytes in a byte array to zero. + + Input array. All bytes of this array + will be set to zero. + + + + Set all elements of an array to the default value. + + Input array. + + + + Convert 2 bytes to a 16-bit unsigned integer (little-endian). + + + + + Convert 2 bytes to a 16-bit unsigned integer (little-endian). + + + + + Convert 4 bytes to a 32-bit unsigned integer (little-endian). + + + + + Convert 4 bytes to a 32-bit unsigned integer (little-endian). + + + + + Convert 8 bytes to a 64-bit unsigned integer (little-endian). + + + + + Convert 8 bytes to a 64-bit unsigned integer (little-endian). + + + + + Convert a 16-bit unsigned integer to 2 bytes (little-endian). + + + + + Convert a 32-bit unsigned integer to 4 bytes (little-endian). + + + + + Convert a 32-bit unsigned integer to 4 bytes (little-endian). + + + + + Convert a 64-bit unsigned integer to 8 bytes (little-endian). + + + + + Convert a 64-bit unsigned integer to 8 bytes (little-endian). + + + + + Fast 32-bit hash (e.g. for hash tables). + The algorithm might change in the future; do not store + the hashes for later use. + + + + + A user key depending on the currently logged on Windows user account. + + + + + Construct a user account key. + + + + + Get key data. Querying this property is fast (it returns a + reference to a cached ProtectedBinary object). + If no key data is available, null is returned. + + + + + Function definition of a method that performs an action on a group. + When traversing the internal tree, this function will be invoked + for all visited groups. + + Currently visited group. + You must return true if you want to continue the + traversal. If you want to immediately stop the whole traversal, + return false. + + + + Function definition of a method that performs an action on an entry. + When traversing the internal tree, this function will be invoked + for all visited entries. + + Currently visited entry. + You must return true if you want to continue the + traversal. If you want to immediately stop the whole traversal, + return false. + + + + Pool of encryption/decryption algorithms (ciphers). + + + + + Remove all cipher engines from the current pool. + + + + + Add a cipher engine to the pool. + + Cipher engine to add. Must not be null. + + + + Get a cipher identified by its UUID. + + UUID of the cipher to return. + Reference to the requested cipher. If the cipher is + not found, null is returned. + + + + Get the index of a cipher. This index is temporary and should + not be stored or used to identify a cipher. + + UUID of the cipher. + Index of the requested cipher. Returns -1 if + the specified cipher is not found. + + + + Get the index of a cipher. This index is temporary and should + not be stored or used to identify a cipher. + + Name of the cipher. Note that + multiple ciphers can have the same name. In this case, the + first matching cipher is returned. + Cipher with the specified name or -1 if + no cipher with that name is found. + + + + Get the number of cipher engines in this pool. + + + + + Get the cipher engine at the specified position. Throws + an exception if the index is invalid. You can use this + to iterate over all ciphers, but do not use it to + identify ciphers. + + Index of the requested cipher engine. + Reference to the cipher engine at the specified + position. + + + + The core password manager class. It contains a number of groups, which + contain the actual entries. + + + + + Constructs an empty password manager object. + + + + + Initialize the class for managing a new database. Previously loaded + data is deleted. + + I/O connection of the new database. + Key to open the database. + + + + Open a database. The URL may point to any supported data source. + + I/O connection to load the database from. + Key used to open the specified database. + Logger, which gets all status messages. + + + + Save the currently open database. The file is written to the + location it has been opened from. + + Logger that recieves status information. + + + + Save the currently open database to a different location. If + is true, the specified + location is made the default location for future saves + using SaveDatabase. + + New location to serialize the database to. + If true, the new location is made + the standard location for the database. If false, a copy of the + currently open database is saved to the specified location, but it + isn't made the default location (i.e. no lock files will be moved for + example). + Logger that recieves status information. + + + + Closes the currently open database. No confirmation message + is shown before closing. Unsaved changes will be lost. + + + + + Load only the unencrypted header of a database file. + In the returned database object, any data that is not stored + in the unencrypted header is set to its default value. + Intended primarily for plugins. + + + + + Get the index of a custom icon. + + ID of the icon. + Index of the icon. + + + + Get a custom icon. This method can return null, + e.g. if no cached image of the icon is available. + + ID of the icon. + Width of the returned image. If this is + negative, the image is returned in its original size. + Height of the returned image. If this is + negative, the image is returned in its original size. + + + + Get the root group that contains all groups and entries stored in the + database. + + Root group. The return value is null, if the database + is not open. + + + + IOConnection of the currently open database file. + Is never null. + + + + + If this is true, a database is currently open. + + + + + Modification flag. If true, the class has been modified and the + user interface should prompt the user to save the changes before + closing the database for example. + + + + + The user key used for database encryption. This key must be created + and set before using any of the database load/save functions. + + + + + Name of the database. + + + + + Database description. + + + + + Default user name used for new entries. + + + + + Number of days until history entries are being deleted + in a database maintenance operation. + + + + + The encryption algorithm used to encrypt the data part of the database. + + + + + Compression algorithm used to encrypt the data part of the database. + + + + + Memory protection configuration (for default fields). + + + + + Get a list of all deleted objects. + + + + + Get all custom icons stored in this database. + + + + + This is a dirty-flag for the UI. It is used to indicate when an + icon list update is required. + + + + + UUID of the group containing template entries. May be + PwUuid.Zero, if no entry templates group has been specified. + + + + + Custom data container that can be used by plugins to store + own data in KeePass databases. + The data is stored in the encrypted part of encrypted + database files. + Use unique names for your items, e.g. "PluginName_ItemName". + + + + + Custom data container that can be used by plugins to store + own data in KeePass databases. + The data is stored in the *unencrypted* part of database files, + and it is not supported by all file formats (e.g. supported by KDBX, + unsupported by XML). + It is highly recommended to use CustomData instead, + if possible. + Use unique names for your items, e.g. "PluginName_ItemName". + + + + + Hash value of the primary file on disk (last read or last write). + A call to SaveAs without making the saved file primary will + not change this hash. May be null. + + + + + Detach binaries when opening a file. If this isn't null, + all binaries are saved to the specified path and are removed + from the database. + + + + + Localized application name. + + + + + Create a deep copy. + + + + + Unsupported. + + + + + Length of an encryption key in bytes. + The base ICipherEngine assumes 32. + + + + + Length of the initialization vector in bytes. + The base ICipherEngine assumes 16. + + + + + Represents a key. A key can be build up using several user key data sources + like a password, a key file, the currently logged on user credentials, + the current computer ID, etc. + + + + + Construct a new, empty key object. + + + + + Add a user key. + + User key to add. + + + + Remove a user key. + + User key to remove. + Returns true if the key was removed successfully. + + + + Test whether the composite key contains a specific type of + user keys (password, key file, ...). If at least one user + key of that type is present, the function returns true. + + User key type. + Returns true, if the composite key contains + a user key of the specified type. + + + + Get the first user key of a specified type. + + Type of the user key to get. + Returns the first user key of the specified type + or null if no key of that type is found. + + + + Creates the composite key from the supplied user key sources (password, + key file, user account, computer ID, etc.). + + + + + Generate a 32-byte (256-bit) key from the composite key. + + + + + List of all user keys contained in the current composite key. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Look up a localized string similar to + 'Test'. + + + + + Get the icon as an Image (original size). + + + + + Get the icon as an Image (with the specified size). + + Width of the returned image. + Height of the returned image. + + + + A class that offers static functions to estimate the quality of + passwords. + + + + + Estimate the quality of a password. + + Password to check. + Estimated bit-strength of the password. + + + + Estimate the quality of a password. + + Password to check, UTF-8 encoded. + Estimated bit-strength of the password. + + + + The KdbxFile class supports saving the data to various + formats. + + + + + The default, encrypted file format. + + + + + Use this flag when exporting data to a plain-text XML file. + + + + + If this property is set to a non-null stream, all data that + is read from the input stream is automatically written to + the copy stream (before returning the read data). + + + + + Represents an UUID of a password entry or group. Once created, + PwUuid objects aren't modifyable anymore (immutable). + + + + + Standard size in bytes of a UUID. + + + + + Zero UUID (all bytes are zero). + + + + + Construct a new UUID object. + + If this parameter is true, a new + UUID is generated. If it is false, the UUID is initialized + to zero. + + + + Construct a new UUID object. + + Initial value of the PwUuid object. + + + + Create a new, random UUID. + + Returns true if a random UUID has been generated, + otherwise it returns false. + + + + Convert the UUID to its string representation. + + String containing the UUID value. + + + + Get the 16 UUID bytes. + + + + + Name of the provider that generated the custom key. + + + + + Compression algorithm specifiers. + + + + + No compression. + + + + + GZip compression. + + + + + Virtual field: currently known number of algorithms. Should not be used + by plugins or libraries -- it's used internally only. + + + + + Tree traversal methods. + + + + + Don't traverse the tree. + + + + + Traverse the tree in pre-order mode, i.e. first visit all items + in the current node, then visit all subnodes. + + + + + Methods for merging databases/entries. + + + + + Icon identifiers for groups and password entries. + + + + + Virtual identifier -- represents the number of icons. + + + + + Use default user credentials (provided by the system). + + + + + Default or Manual, depending on whether + manual credentials are available. + This type exists for supporting upgrading from KeePass + 2.28 to 2.29; the user cannot select this type. + + + + + Comparison modes for in-memory protected objects. + + + + + Ignore the in-memory protection states. + + + + + Ignore the in-memory protection states of standard + objects; do compare in-memory protection states of + custom objects. + + + + + Compare in-memory protection states. + + + + + Empty standard string fields are considered to be the + same as non-existing standard string fields. + This doesn't affect custom string comparisons. + + + + + The I/O connection is being opened for reading. + + + + + The I/O connection is being opened for writing. + + + + + The I/O connection is being opened for testing + whether a file/object exists. + + + + + The I/O connection is being opened for deleting a file/object. + + + + + The I/O connection is being opened for renaming/moving a file/object. + + + + + This flag prevents any handles being garbage-collected + before the started process has terminated, without + blocking the current thread. + + + + + UIIcon indicates that the returned image is going + to be displayed as icon in the UI and that it is not + subject to future changes in size. + + + + + A class representing a password entry. A password entry consists of several + fields like title, user name, password, etc. Each password entry has a + unique ID (UUID). + + + + + Construct a new, empty password entry. Member variables will be initialized + to their default values. + + If true, a new UUID will be created + for this entry. If false, the UUID is zero and you must set it + manually later. + If true, the creation, last modification + and last access times will be set to the current system time. + + + + Clone the current entry. The returned entry is an exact value copy + of the current entry (including UUID and parent group reference). + All mutable members are cloned. + + Exact value clone. All references to mutable values changed. + + + + Assign properties to the current entry based on a template entry. + + Template entry. Must not be null. + Only set the properties of the template entry + if it is newer than the current one. + If true, the history will be + copied, too. + If true, the + LocationChanged property is copied, otherwise not. + + + + Touch the entry. This function updates the internal last access + time. If the parameter is true, + the last modification time gets updated, too. + + Modify last modification time. + + + + Touch the entry. This function updates the internal last access + time. If the parameter is true, + the last modification time gets updated, too. + + Modify last modification time. + If true, all parent objects + get touched, too. + + + + Create a backup of this entry. The backup item doesn't contain any + history items. + + + + + Create a backup of this entry. The backup item doesn't contain any + history items. + If this parameter isn't null, + the history list is maintained automatically (i.e. old backups are + deleted if there are too many or the history size is too large). + This parameter may be null (no maintenance then). + + + + + Restore an entry snapshot from backups. + + Index of the backup item, to which + should be reverted. + + + + Restore an entry snapshot from backups. + + Index of the backup item, to which + should be reverted. + If this parameter isn't null, + the history list is maintained automatically (i.e. old backups are + deleted if there are too many or the history size is too large). + This parameter may be null (no maintenance then). + + + + Delete old history entries if there are too many or the + history size is too large. + If one or more history entries have been deleted, + true is returned. Otherwise false. + + + + + Approximate the total size (in process memory) of this entry + in bytes (including strings, binaries and history entries). + + Size in bytes. + + + + UUID of this entry. + + + + + Reference to a group which contains the current entry. + + + + + The date/time when the location of the object was last changed. + + + + + Get or set all entry strings. + + + + + Get or set all entry binaries. + + + + + Get or set all auto-type window/keystroke sequence associations. + + + + + Get all previous versions of this entry (backups). + + + + + Image ID specifying the icon that will be used for this entry. + + + + + Get the custom icon ID. This value is 0, if no custom icon is + being used (i.e. the icon specified by the IconID property + should be displayed). + + + + + Get or set the foreground color of this entry. + + + + + Get or set the background color of this entry. + + + + + The date/time when this entry was created. + + + + + The date/time when this entry was last modified. + + + + + The date/time when this entry was last accessed (read). + + + + + The date/time when this entry expires. Use the Expires property + to specify if the entry does actually expire or not. + + + + + Specifies whether the entry expires or not. + + + + + Get or set the usage count of the entry. To increase the usage + count by one, use the Touch function. + + + + + Entry-specific override URL. + + + + + List of tags associated with this entry. + + + + + Custom data container that can be used by plugins to store + own data in KeePass entries. + The data is stored in the encrypted part of encrypted + database files. + Use unique names for your items, e.g. "PluginName_ItemName". + + + + + A string that is protected in process memory. + ProtectedString objects are immutable and thread-safe. + + + + + Construct a new protected string object. Protection is + disabled. + + + + + Construct a new protected string. The string is initialized + to the value supplied in the parameters. + + If this parameter is true, + the string will be protected in memory (encrypted). If it + is false, the string will be stored as plain-text. + The initial string value. + + + + Construct a new protected string. The string is initialized + to the value supplied in the parameters (UTF-8 encoded string). + + If this parameter is true, + the string will be protected in memory (encrypted). If it + is false, the string will be stored as plain-text. + The initial string value, encoded as + UTF-8 byte array. This parameter won't be modified; the caller + is responsible for clearing it. + + + + Construct a new protected string. The string is initialized + to the value passed in the XorredBuffer object. + + Enable protection or not. + XorredBuffer object containing the + string in UTF-8 representation. The UTF-8 string must not + be null-terminated. + + + + Convert the protected string to a standard string object. + Be careful with this function, as the returned string object + isn't protected anymore and stored in plain-text in the + process memory. + + Plain-text string. Is never null. + + + + Read out the string and return it as a char array. + The returned array is not protected and should be cleared by + the caller. + + Plain-text char array. + + + + Read out the string and return a byte array that contains the + string encoded using UTF-8. + The returned array is not protected and should be cleared by + the caller. + + Plain-text UTF-8 byte array. + + + + Get the string as an UTF-8 sequence xorred with bytes + from a CryptoRandomStream. + + + + + Get an empty ProtectedString object, without protection. + + + + + Get an empty ProtectedString object, with protection turned on. + + + + + A flag specifying whether the ProtectedString object + has turned on memory protection or not. + + + + + Length of the protected string, in characters. + + + + + A protected binary, i.e. a byte array that is encrypted in memory. + A ProtectedBinary object is immutable and thread-safe. + + + + + Construct a new, empty protected binary data object. + Protection is disabled. + + + + + Construct a new protected binary data object. + + If this paremeter is true, + the data will be encrypted in memory. If it is false, the + data is stored in plain-text in the process memory. + Value of the protected object. + The input parameter is not modified and + ProtectedBinary doesn't take ownership of the data, + i.e. the caller is responsible for clearing it. + + + + Construct a new protected binary data object. + + If this paremeter is true, + the data will be encrypted in memory. If it is false, the + data is stored in plain-text in the process memory. + Value of the protected object. + The input parameter is not modified and + ProtectedBinary doesn't take ownership of the data, + i.e. the caller is responsible for clearing it. + Offset for . + Size for . + + + + Construct a new protected binary data object. + Copy the data from a XorredBuffer object. + + Enable protection or not. + XorredBuffer object containing the data. + + + + Get a copy of the protected data as a byte array. + Please note that the returned byte array is not protected and + can therefore been read by any other application. + Make sure that your clear it properly after usage. + + Unprotected byte array. This is always a copy of the internal + protected data and can therefore be cleared safely. + + + + Get the data xorred with bytes from a CryptoRandomStream. + + + + + A plugin can provide a custom memory protection method + by assigning a non-null delegate to this property. + + + + + A flag specifying whether the ProtectedBinary object has + turned on memory protection or not. + + + + + Length of the stored data. + + + + + Class containing self-test methods. + + + + + Perform a self-test. + + + + + Application-wide logging services. + + + + + Represents an object that has been deleted. + + + + + Construct a new PwDeletedObject object. + + + + + Clone the object. + + Value copy of the current object. + + + + UUID of the entry that has been deleted. + + + + + The date/time when the entry has been deleted. + + + + + Master password/passphrase as provided by the user. + + + + + Get the password as protected string. This is null + unless remembering the password has been turned on. + + + + + Get key data. Querying this property is fast (it returns a + reference to a cached ProtectedBinary object). + If no key data is available, null is returned. + + + + + A list of ProtectedBinary objects (dictionary). + + + + + Construct a new list of protected binaries. + + + + + Clone the current ProtectedBinaryList object, including all + stored protected strings. + + New ProtectedBinaryList object. + + + + Get one of the stored binaries. + + Binary identifier. + Protected binary. If the binary identified by + cannot be found, the function + returns null. + Thrown if the input + parameter is null. + + + + Set a binary object. + + Identifier of the binary field to modify. + New value. This parameter must not be null. + Thrown if any of the input + parameters is null. + + + + Remove a binary object. + + Identifier of the binary field to remove. + Returns true if the object has been successfully + removed, otherwise false. + Thrown if the input parameter + is null. + + + + Get the number of binaries in this entry. + + + + diff --git a/src/Build/PrepMonoDev.sh b/src/Build/PrepMonoDev.sh new file mode 100644 index 0000000..af5ffcb --- /dev/null +++ b/src/Build/PrepMonoDev.sh @@ -0,0 +1,66 @@ +#!/bin/sh + +kpBuild="$(pwd)" +kpRoot="${kpBuild}/.." + +# Mono's resource compiler/linker doesn't support ICO files +# containing high resolution images (in PNG format) +kpIco="${kpRoot}/Ext/Icons_15_VA/LowResIcons/KeePass_LR.ico" +kpIcoG="${kpRoot}/Ext/Icons_15_VA/LowResIcons/KeePass_LR_G.ico" +kpIcoR="${kpRoot}/Ext/Icons_15_VA/LowResIcons/KeePass_LR_R.ico" +kpIcoY="${kpRoot}/Ext/Icons_15_VA/LowResIcons/KeePass_LR_Y.ico" + +fnPrepSolution() +{ + cd "${kpRoot}" + local kpSln="KeePass.sln" + + # Update solution format to 11 (this targets Mono 4 rather than 3.5) + sed -i 's!Format Version 10\.00!Format Version 11\.00!g' "${kpSln}" +} + +fnPrepKeePass() +{ + cd "${kpRoot}/KeePass" + local kpCsProj="KeePass.csproj" + + sed -i 's! ToolsVersion="3\.5"!!g' "${kpCsProj}" + sed -i 's!true!false!g' "${kpCsProj}" + sed -i '/sgen\.exe/d' "${kpCsProj}" + + cp -f "${kpIco}" KeePass.ico + cp -f "${kpIco}" Resources/Icons/KeePass.ico + cp -f "${kpIcoG}" Resources/Icons/KeePass_G.ico + cp -f "${kpIcoR}" Resources/Icons/KeePass_R.ico + cp -f "${kpIcoY}" Resources/Icons/KeePass_Y.ico +} + +fnPrepKeePassLib() +{ + cd "${kpRoot}/KeePassLib" + local kpCsProj="KeePassLib.csproj" + local kpXmlUtilEx="Utility/XmlUtilEx.cs" + + sed -i 's! ToolsVersion="3\.5"!!g' "${kpCsProj}" + sed -i 's!true!false!g' "${kpCsProj}" + + sed -i -E 's!(xrs\.ProhibitDtd = true;)!// \1!g' "${kpXmlUtilEx}" + sed -i -E 's!// (xrs\.DtdProcessing = DtdProcessing\.Prohibit;)!\1!g' "${kpXmlUtilEx}" +} + +fnPrepTrlUtil() +{ + cd "${kpRoot}/Translation/TrlUtil" + local kpCsProj="TrlUtil.csproj" + + sed -i 's! ToolsVersion="3\.5"!!g' "${kpCsProj}" + + cp -f "${kpIco}" Resources/KeePass.ico +} + +fnPrepSolution +fnPrepKeePass +fnPrepKeePassLib +fnPrepTrlUtil + +cd "${kpBuild}" diff --git a/src/Docs/Chm/KeePass.hhp b/src/Docs/Chm/KeePass.hhp new file mode 100644 index 0000000..7f9e08a --- /dev/null +++ b/src/Docs/Chm/KeePass.hhp @@ -0,0 +1,61 @@ +[OPTIONS] +Compatibility=1.1 or later +Compiled file=KeePass.chm +Contents file=KeePassContents.hhc +Default topic=help\base\index.html +Display compile progress=No +Full-text search=Yes +Language=0x409 Englisch (USA) +Title=KeePass Help + + +[FILES] +help\index.html +help\base\autotype.html +help\base\autourl.html +help\base\cmdline.html +help\base\configuration.html +help\base\credits.html +help\base\faq.html +help\base\faq_tech.html +help\base\fieldrefs.html +help\base\firststeps.html +help\base\importexport.html +help\base\index.html +help\base\integration.html +help\base\keys.html +help\base\license_lgpl.html +help\base\multiuser.html +help\base\placeholders.html +help\base\pwgenerator.html +help\base\repair.html +help\base\search.html +help\base\secedits.html +help\base\security.html +help\base\tans.html +help\base\terms.html +help\base\usingpws.html +help\v2\autotype_obfuscation.html +help\v2\dbsettings.html +help\v2\entry.html +help\v2\guioptions.html +help\v2\index.html +help\v2\ioconnect.html +help\v2\license.html +help\v2\plugins.html +help\v2\policy.html +help\v2\setup.html +help\v2\sync.html +help\v2\translation.html +help\v2\triggers.html +help\v2\version.html +help\v2\xml_replace.html +help\v2_dev\customize.html +help\v2_dev\plg_index.html +help\v2_dev\scr_index.html +help\v2_dev\scr_kps_index.html +help\v2_dev\scr_sc_index.html +images\back.gif + +[INFOTYPES] + diff --git a/src/Docs/Chm/KeePassContents.hhc b/src/Docs/Chm/KeePassContents.hhc new file mode 100644 index 0000000..8601085 --- /dev/null +++ b/src/Docs/Chm/KeePassContents.hhc @@ -0,0 +1,198 @@ + + + + + + + + + +
    +
  • + + +
      +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    +
  • + + +
      +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    +
  • + + +
      +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    +
  • + + +
      +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    +
  • + + +
      +
    • + + + +
    • + + + +
    +
  • + + +
      +
    • + + + +
    • + + + +
    • + + + +
    +
+ diff --git a/src/Docs/Chm/default.css b/src/Docs/Chm/default.css new file mode 100644 index 0000000..5fdb13a --- /dev/null +++ b/src/Docs/Chm/default.css @@ -0,0 +1,524 @@ +/* + Copyright (C) 2003-2023 Dominik Reichl. +*/ + +body, kbd kbd { + font-family: Verdana, Arial, sans-serif; + font-size: 9.75pt; +} + +body { + color: #000000; + background-color: #FFFFFF; +} +@media not all and (forced-colors: active) { + body { + background-image: url("images/back.gif"); + background-repeat: repeat; + background-attachment: fixed; + } +} + +p { + margin-left: 0px; +} + +/* ul { + margin-left: 20px; + list-style: disc; +} */ + +h1 { + font-size: 15.00pt; + font-weight: bold; +} + +h2 { + font-size: 13.50pt; + font-weight: bold; +} + +h3 { + font-size: 11.25pt; + font-weight: bold; +} + +h4 { + font-size: 9.75pt; + font-weight: bold; +} + +h5 { + font-size: 9.00pt; + font-weight: bold; +} + +h6 { + font-size: 7.50pt; + font-weight: normal; +} + +hr { + display: block; + height: 0px; + border-style: none none solid none; + border-width: 0px 0px 1px 0px; + border-bottom-color: #7F7F7F; + margin: 0px auto 0px auto; + padding: 0px 0px 0px 0px; +} + +table { + empty-cells: show; +} + +th, td { + text-align: left; + vertical-align: top; +} + +pre { + display: block; + background-color: #EEEEEE; /* #E6E6E6 */ + white-space: pre-wrap; + overflow: auto; + overflow-wrap: break-word; + word-wrap: break-word; + word-break: break-all; + -moz-tab-size: 4; + tab-size: 4; +} + +kbd kbd { + padding: 0px 4px 1px 4px; + border: 1px solid #808080; + border-collapse: collapse; + border-radius: 2px; + box-shadow: 0.1em 0.15em 0.2em #C5C5C5; + color: #000000; + background-color: #EEEEEE; + background-image: -webkit-linear-gradient(top, #EEEEEE, #FAFAFA, #EEEEEE); + background-image: -moz-linear-gradient(top, #EEEEEE, #FAFAFA, #EEEEEE); + background-image: -ms-linear-gradient(top, #EEEEEE, #FAFAFA, #EEEEEE); + background-image: linear-gradient(to bottom, #EEEEEE, #FAFAFA, #EEEEEE); +} + +/* --------------------------------------------------------------------- */ + +a { + color: #0000DD; + text-decoration: none; +} + +a:hover, a:active { + color: #6699FF; + text-decoration: underline; +} + +/* --------------------------------------------------------------------- */ + +.menubox { + display: block; + border: 1px solid #C5C5C5; + margin: 0px 1px 0px 0px; + padding: 0px 0px 0px 0px; + color: #000000; + background-color: #FFFFFF; + font-size: 8.25pt; +} + +.menubox .menutitle { + padding: 1px 1px 1px 3px; + color: #005101; + background-color: #C5C5C5; + background-image: -webkit-linear-gradient(left, #C5C5C5, #E5E5E5); + background-image: -moz-linear-gradient(left, #C5C5C5, #E5E5E5); + background-image: -ms-linear-gradient(left, #C5C5C5, #E5E5E5); + background-image: linear-gradient(to right, #C5C5C5, #E5E5E5); + font-size: 7.50pt; + font-weight: bold; +} + +.menubox > img { /* Icon of a folder */ + margin: 2px 0px 2px 2px; /* See 'a' (border + padding) */ +} + +.menubox a { + display: block; + padding: 1px 1px 1px 1px; /* See also '> img' */ + border: 1px solid #FFFFFF; /* See also '> img' */ + border-radius: 2px; + color: #000000; + text-decoration: none; + hyphens: none; + white-space: nowrap; +} + +.menubox a:hover, .menubox a:active { + border: 1px solid #0A246A; + background-color: #B6BDD2; + background-image: -webkit-linear-gradient(top, #D9E5F9, #B8BED8); + background-image: -moz-linear-gradient(top, #D9E5F9, #B8BED8); + background-image: -ms-linear-gradient(top, #D9E5F9, #B8BED8); + background-image: linear-gradient(to bottom, #D9E5F9, #B8BED8); +} + +/* --------------------------------------------------------------------- */ + +table.laytable, table.laytablews { + width: 100%; + border: 0px none; +} + +table.laytable { + border-collapse: collapse; +} + +table.laytable > tr > th, table.laytable > tbody > tr > th, +table.laytable > tr > td, table.laytable > tbody > tr > td { + padding: 2px 2px 2px 2px; +} + +table.laytable > tr:first-of-type > th, table.laytable > tbody > tr:first-of-type > th, +table.laytable > tr:first-of-type > td, table.laytable > tbody > tr:first-of-type > td { + padding-top: 0px; +} + +table.laytable > tr > th:first-of-type, table.laytable > tbody > tr > th:first-of-type, +table.laytable > tr > td:first-of-type, table.laytable > tbody > tr > td:first-of-type { + padding-left: 0px; +} + +table.laytable > tr:last-of-type > th, table.laytable > tbody > tr:last-of-type > th, +table.laytable > tr:last-of-type > td, table.laytable > tbody > tr:last-of-type > td { + padding-bottom: 0px; +} + +table.laytable > tr > th:last-of-type, table.laytable > tbody > tr > th:last-of-type, +table.laytable > tr > td:last-of-type, table.laytable > tbody > tr > td:last-of-type { + padding-right: 0px; +} + +/* --------------------------------------------------------------------- */ + +table.tablebox, table.tablebox75 { + background-color: #EEEEEE; + padding: 0px 0px 0px 0px; +} + +table.tablebox { + width: 100%; + margin: 0px 0px 0px 0px; +} + +table.tablebox75 { + width: 75%; + margin: 0px auto 0px auto; +} + +table.tablebox, table.tablebox75, +table.tablebox tr th, table.tablebox75 tr th, +table.tablebox tr td, table.tablebox75 tr td { + border: 1px solid #AFB5CF; + border-collapse: collapse; +} + +table.tablebox tr th, table.tablebox75 tr th { + padding: 2px 5px 2px 5px; + background-color: #EEEEEE; + background-image: -webkit-linear-gradient(top, #C1C1C1, #EEEEEE); + background-image: -moz-linear-gradient(top, #C1C1C1, #EEEEEE); + background-image: -ms-linear-gradient(top, #C1C1C1, #EEEEEE); + background-image: linear-gradient(to bottom, #C1C1C1, #EEEEEE); + font-weight: bold; +} + +table.tablebox tr td, table.tablebox75 tr td { + padding: 5px 5px 5px 5px; + background-color: #F0F0F0; +} + +/* --------------------------------------------------------------------- */ + +img { + border: 0px none; + vertical-align: middle; +} + +img.textimg { + height: 1em; +} + +/* --------------------------------------------------------------------- */ + +.tooltipex { + position: absolute; + display: none; + background-color: #FFFFE0; + padding: 1px 2px 1px 2px; + opacity: 0.9; + border: 1px solid #000000; +} + +/* --------------------------------------------------------------------- */ + +div.specificbox { + border: 1px solid #808080; + border-radius: 5px; + display: block; + background-color: #EEF0FF; + padding: 1px 2px 2px 2px; +} + +div.specificbox div.specifictitle { + font-size: 7.50pt; + font-weight: bold; + border-left: 0px none; + border-right: 0px none; + border-bottom: thin dotted #808080; + border-top: 0px none; + text-align: left; + margin-bottom: 3px; +} + +/* --------------------------------------------------------------------- */ + +table.sectionheader { + width: 100%; + border: thin solid #808080; + -moz-box-shadow: 1px 1px 5px #808080; + -webkit-box-shadow: 1px 1px 5px #808080; + box-shadow: 1px 1px 5px #808080; + background-color: #F0F8FF; + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; +} + +table.sectionheader tr td { + border: 0px none; + border-collapse: collapse; + vertical-align: middle; + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; +} + +table.sectionheader tr td:nth-of-type(1) { + width: 68px; +} + +table.sectionheader tr td img { + display: block; /* Inline results in additional space at the bottom */ + width: 64px; + height: 64px; +} + +table.sectionheader tr td h1 { + font-weight: normal; + margin: 0px 0px 0px 0px; +} + +table.sectionheader tr td p { /* Tag is optional (e.g. in news) */ + font-size: smaller; + margin: 0px 0px 0px 0px; +} + +/* --------------------------------------------------------------------- */ + +h2.sectiontitle { + font-size: 9.75pt; + font-weight: bold; + color: #005101; + background-color: #D0D6E6; + background-image: -webkit-linear-gradient(top, #C5C9DB, #DBE3F2); + background-image: -moz-linear-gradient(top, #C5C9DB, #DBE3F2); + background-image: -ms-linear-gradient(top, #C5C9DB, #DBE3F2); + background-image: linear-gradient(to bottom, #C5C9DB, #DBE3F2); + border: 1px solid #AFB5CF; + margin: 0px 0px 0px 0px; + padding: 2px 2px 2px 6px; +} + +h2.sectiontitle img { + margin-right: 2px; +} + +/* --------------------------------------------------------------------- */ + +td.helptopheader { + background-color: #E7E7FF; + background-image: -webkit-linear-gradient(top, #CFCFFF, #FFFFFF); + background-image: -moz-linear-gradient(top, #CFCFFF, #FFFFFF); + background-image: -ms-linear-gradient(top, #CFCFFF, #FFFFFF); + background-image: linear-gradient(to bottom, #CFCFFF, #FFFFFF); +} + +/* --------------------------------------------------------------------- */ + +div.tipdiv { + background-color: #FFFFE0; + padding: 1px 1px 1px 1px; + border: 1px solid #000000; +} + +.box100 { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; +} + +.withspc > li + li { + margin-top: 0.75em; +} + +.floatrightws { + float: right; + margin: 0px 0px 0.5em 0.5em; +} + +.big { + font-size: larger; +} + +/* .nowrap { + word-break: keep-all; + overflow-wrap: normal; + word-wrap: normal; + hyphens: none; + white-space: nowrap; +} */ + +.codekw { color: #0000FF; } +.codetp { color: #008888; } +.codecm { color: #008800; } +.codest { color: #880000; } + +.codexml { } /* For automatic syntax highlighting */ +.codexmldecl { color: #008888; } +.codexmltag { color: #880088; } + +.uiex_w { + border: 1px solid #808080; + background-color: #FFFFFF; + color: #000000; +} + +.uiex_t_sel { + background-color: #99D1FF; + color: #000000; +} + +/* --------------------------------------------------------------------- */ + +.il-m { + background: transparent url("images/il_main_v02.png") no-repeat; + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + border: 0px none; + overflow: hidden; + display: inline-block; + vertical-align: middle; +} + +.spr-m-kp-h { background-position: -1px -1px; width: 75px; height: 75px; } +.spr-m-home-mh { background-position: -78px -1px; width: 31px; height: 21px; } +.spr-m-contact-mh { background-position: -78px -24px; width: 31px; height: 21px; } +.spr-m-news-mh { background-position: -78px -47px; width: 31px; height: 21px; } +.spr-m-scrsh-mh { background-position: -111px -1px; width: 31px; height: 21px; } +.spr-m-dl-mh { background-position: -111px -24px; width: 31px; height: 21px; } +.spr-m-lang-mh { background-position: -111px -47px; width: 31px; height: 21px; } +.spr-m-ext-mh { background-position: -144px -1px; width: 31px; height: 21px; } +.spr-m-write-mh { background-position: -144px -24px; width: 31px; height: 21px; } +.spr-m-write-s { background-position: -151px -26px; width: 16px; height: 16px; } +.spr-m-help-ml { background-position: -177px -1px; width: 31px; height: 18px; } +.spr-m-info-ml { background-position: -177px -21px; width: 31px; height: 18px; } +.spr-m-sec-ml { background-position: -177px -41px; width: 31px; height: 18px; } +.spr-m-donate-ml { background-position: -177px -61px; width: 31px; height: 18px; } +.spr-m-award-ml { background-position: -210px -1px; width: 31px; height: 18px; } +.spr-m-links-ml { background-position: -210px -21px; width: 31px; height: 18px; } +.spr-m-xmag-ml { background-position: -210px -41px; width: 31px; height: 18px; } +.spr-m-osi-h { background-position: -1px -96px; width: 72px; height: 60px; } +.spr-m-award-s { background-position: -1px -158px; width: 16px; height: 16px; } +.spr-m-feed-s { background-position: -19px -158px; width: 16px; height: 16px; } +.spr-m-w3valid-b { background-position: -1px -176px; width: 80px; height: 15px; } +.spr-m-kp-b { background-position: -83px -176px; width: 80px; height: 15px; } + +/* --------------------------------------------------------------------- */ + +#consent_c { + display: none; + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + border: 0px none; + position: fixed; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + z-index: 254; + overflow: auto; + background-color: rgba(0, 0, 0, 0.85); + transition: background 1.5s; /* Cf. JavaScript timeout */ +} + +#consent_dlg { + border: 1px solid #808080; + position: relative; + width: 33%; + margin: 96px auto 0px auto; + padding: 16px 16px 16px 16px; + background-color: #EEEEEE; +} +@media (max-height: 540px) { + #consent_dlg { + margin-top: 4px; + } +} + +#consent_dlg button { + display: block; + width: 50%; + margin: 8px auto 8px auto; + padding: 8px 2px 8px 2px; + cursor: pointer; + color: #000000; + background-color: #E0E0E0; + background-image: -webkit-linear-gradient(top, #F0F0F0, #D0D0D0); + background-image: -moz-linear-gradient(top, #F0F0F0, #D0D0D0); + background-image: -ms-linear-gradient(top, #F0F0F0, #D0D0D0); + background-image: linear-gradient(to bottom, #F0F0F0, #D0D0D0); + border: 1px solid #A0A0A0; + border-radius: 5px; +} + +#consent_dlg button:first-of-type { + margin-top: 1em; +} +#consent_dlg button:last-of-type { + margin-bottom: 1em; +} + +#consent_dlg button:hover { + background-color: #E0F0FF; + background-image: -webkit-linear-gradient(top, #E8F8FF, #D8E8F8); + background-image: -moz-linear-gradient(top, #E8F8FF, #D8E8F8); + background-image: -ms-linear-gradient(top, #E8F8FF, #D8E8F8); + background-image: linear-gradient(to bottom, #E8F8FF, #D8E8F8); + border-color: #0080FF; +} + +#consent_dlg button:active { + background-color: #C8E0F0; + background-image: -webkit-linear-gradient(top, #D0E8F8, #C0D8E8); + background-image: -moz-linear-gradient(top, #D0E8F8, #C0D8E8); + background-image: -ms-linear-gradient(top, #D0E8F8, #C0D8E8); + background-image: linear-gradient(to bottom, #D0E8F8, #C0D8E8); + border-color: #004080; +} + +#consent_dlg button:focus { + outline: none; +} +#consent_dlg button[data-focusvisible="true"]:focus { /* Focus with keyboard, see JS */ + outline: 2px dotted #000080; +} diff --git a/src/Docs/Chm/help/base/autotype.html b/src/Docs/Chm/help/base/autotype.html new file mode 100644 index 0000000..1e2fc84 --- /dev/null +++ b/src/Docs/Chm/help/base/autotype.html @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Auto-Type - KeePass + + + + + + + + + + + + + + + + +

Auto-Type

+

Powerful feature that sends simulated keypresses to other applications.

+ +
+ +
+ + +

+Basic Auto-Type Information

+ +

KeePass features an "Auto-Type" functionality. This feature allows you to define +a sequence of keypresses, which KeePass can automatically perform for you. The +simulated keypresses can be sent to any other currently open window of your choice (browser windows, +login dialogs, ...).

+ +

By default, the sent keystroke sequence is {USERNAME}{TAB}{PASSWORD}{ENTER}, +i.e. it first types the user name of the selected entry, then presses the Tab key, +then types the password of the entry and finally presses the Enter key.

+ +

For TAN entries, the default sequence is {PASSWORD}, +i.e. it just types the TAN into the target window, without pressing Enter.

+ + + + + + +Auto-Type can be configured individually for each entry using the +Auto-Type tab page on the entry dialog (select an entry → Edit Entry). +On this page you can specify a default sequence and customize specific +window/sequence associations.
+
+Two-Channel Auto-Type Obfuscation is supported (making +Auto-Type resistant against keyloggers). + + +

Additionally, you can create customized window/sequence associations, which override the +default sequence. You can specify different keystroke sequences for different windows for each entry. +For example, imagine a webpage, to which you want to login, that has multiple +pages where one can login. These pages could all look a bit different (on one +you could additionally need to check some checkbox – like often seen in forums). +Here creating customized window/sequence associations solves the problems: you simply +specify different auto-type sequences for each windows (identified by their window +titles).

+ +

Invoking Auto-Type:
+There are three different methods to invoke auto-type:

+ +
    +
  • Invoke auto-type for an entry by using the +context menu command Perform Auto-Type while the entry is selected.
  • +
  • Select the entry and press Ctrl+V +(that's the menu shortcut for the context menu command above).
  • +
  • Using the system-wide auto-type hot key. KeePass will +search all entries in the currently opened database for matching sequences.
  • +
+ +

All methods are explained in detail below.

+ +

Input Focus:
+Note that auto-type starts typing into the control of the target window +that has the input focus. Thus, for example for the default +sequence you have to ensure that the input focus is set to the +user name control of the target window before invoking auto-type using any of +the above methods.

+ +
+ + +

+Requirements and Limitations

+ +

Rights:
+For auto-type to work, KeePass must be running with the same or higher +rights as the target application. Especially, if the target application +is running with administrative rights, KeePass must be running with +administrative rights, too. For details, see + +Windows Integrity Mechanism Design. +An example are certain instances of VMware Workstation that run on +a higher integrity level.

+ +

Remote Desktops and Virtual Machines:
+KeePass does not know the keyboard layout that has been selected in +a remote desktop or virtual machine window. +If you want to auto-type into such a window, you must ensure +that the local and the remote/virtual system are using the same +keyboard layout.

+ +

When performing auto-type into a remote desktop or virtual machine +window, the following characters may be problematic (depending on the +exact circumstances) and should therefore be avoided, if possible: +" (U+0022), +' (U+0027), +^ (U+005E), +` (U+0060), +~ (U+007E), +¨ (U+00A8), +¯ (U+00AF), +° (U+00B0), +´ (U+00B4), +¸ (U+00B8), +spacing modifier letters (U+02B0 to U+02FF), +and characters that cannot be realized with a direct key combination.

+ +

Wayland:
+On a Unix-like system with a Wayland compositor, there may be further +limitations; see the Auto-Type on Wayland page.

+ +
+ + +

+Context Menu: 'Perform Auto-Type' Command

+ +

This method is the one that requires the least amount of configuration and is +the simpler one, but it has the disadvantage that you need to select the entry +in KeePass which you want to auto-type.

+ +

The method is simple: right-click on an entry of your currently opened database +and click 'Perform Auto-Type' (or alternatively press the +Ctrl+V +shortcut for this command). The window that previously got the focus +(i.e. the one in which you worked before switching to KeePass) will be brought +to the foreground and KeePass auto-types into this window.

+ +

The sequence which is auto-typed depends on the window's title. If you didn't +specify any custom window/sequence associations, the default sequence is sent. If +you created associations, KeePass uses the sequence of the first matching +association. If none of the associations match, the default sequence is used.

+ +
+ + +

+Global Auto-Type Hot Key

+ +

This is the more powerful method, but it also requires a little bit more +work/knowledge, before it can be used.

+ +

Simple Global Auto-Type Example:

+ +
    +
  1. Create an entry in KeePass titled Notepad with values for user name and password.
  2. +
  3. Start Notepad (under 'Programs' → 'Accessories').
  4. +
  5. Press Ctrl+Alt+A within Notepad. +The user name and password will be typed into Notepad.
  6. +
+ +

The KeePass entry title Notepad is matched with the window title of +Notepad and the default Auto-Type sequence is typed.

+ +

How It Works - Details:

+ +

KeePass registers a system-wide hot key for auto-type. The advantage of +this hot key is that you don't need to switch to the KeePass window and +select the entry. You simply press the hot key while having the target window +open (i.e. the window which will receive the simulated keypresses).

+ +

By default, the global hot key is +Ctrl+Alt+A +(i.e. hold the Ctrl and Alt keys, +press A and release all keys). +You can change this hot key in the options dialog +(main menu 'Tools' → 'Options' → tab + + + +'Integration'): + +here, click into the global auto-type hot key textbox and press the hot key +that you wish to use. If the hot key is usable, it will appear in the textbox.

+ +

When you press the hot key, KeePass looks at the title of the currently opened window and +searches the currently opened database for usable entries. If KeePass finds multiple +entries that can be used, it displays a selection dialog. +An entry is considered to be usable for the current window title when +at least one of the following conditions is fulfilled:

+ +
    +
  • The title of the entry is a substring of the currently active window title.
  • +
  • The entry has a window/sequence association, of which the window specifier matches +the currently active window title.
  • +
+ +

The second condition has been mentioned already, but the first one +is new. By using entry titles as filters for window titles, the configuration amount +for auto-type is almost zero: you only need to make sure that the entry title +is contained in the window title of the window into which you want the entry to be +auto-typed. Of course, this is not always possible (for example, if a webpage has a +very generic title like "Welcome"), here you need to +use custom window/sequence associations.

+ + + + + + +Custom window/sequence associations can be specified on the 'Auto-Type' tab +page of each entry.
+
+The associations complement the KeePass entry title. +Any associations specified will be used in addition to the KeePass entry +title to determine a match. + + +

Auto-Type window definitions, entry titles and URLs are Spr-compiled, i.e. +placeholders, +environment variables, +field references, etc. can be used.

+ +
+ + +

+Auto-Type Keystroke Sequences

+ +

An auto-type keystroke sequence is a one-line string that can contain +placeholders and special key codes.

+ +

A complete list of all supported placeholders can be found on the page +Placeholders. The special key codes can +be found below.

+ +

Above you've seen already that the +default auto-type is {USERNAME}{TAB}{PASSWORD}{ENTER}. Here, +{USERNAME} and {PASSWORD} are placeholders: when auto-type +is performed, these are replaced by the appropriate field values of the entry. +{TAB} and {ENTER} are special key codes: these are replaced +by the appropriate keypresses. Special key codes are the only way to specify special +keys like Arrow-Down, Shift, Escape, etc.

+ +

Of course, keystroke sequences can also contain simple characters to be sent. +For example, the following string is perfectly valid as keystroke sequence string:
+{USERNAME}{TAB}Some text to be sent!{ENTER}.

+ + + + + + +Special key codes are case-insensitive. + + +

Special Keys:
+The following codes for special keys are supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Special KeyCode
Tab{TAB}
Enter{ENTER} or ~
Arrow Up{UP}
Arrow Down{DOWN}
Arrow Left{LEFT}
Arrow Right{RIGHT}
Insert{INSERT} or {INS}
Delete{DELETE} or {DEL}
Home{HOME}
End{END}
Page Up{PGUP}
Page Down{PGDN}
Space{SPACE}
Backspace{BACKSPACE}, +{BS} or {BKSP}
Break{BREAK}
Caps-Lock{CAPSLOCK}
Escape{ESC}
Windows Key{WIN} (equ. to {LWIN})
Windows Key: left, right{LWIN}, {RWIN}
Apps / Menu{APPS}
Help{HELP}
Numlock{NUMLOCK}
Print Screen{PRTSC}
Scroll Lock{SCROLLLOCK}
F1 - F16{F1} - {F16}
Numeric Keypad +{ADD}
Numeric Keypad -{SUBTRACT}
Numeric Keypad *{MULTIPLY}
Numeric Keypad /{DIVIDE}
Numeric Keypad 0 to 9{NUMPAD0} to {NUMPAD9}
Shift+
Ctrl^
Alt%
+ +
+ + + + + + + + + + + + + + + + +
Special KeyCode
+{+}
%{%}
^{^}
~{~}
(, ){(}, {)}
[, ]{[}, {]}
{, }{{}, {}}
+ + +

Additionally, some special commands are supported:

+ + + + + + + + + + +
Command SyntaxAction
{DELAY X}Delays X milliseconds.
{DELAY=X}Sets the default +delay to X milliseconds for all following keypresses.
{CLEARFIELD}Clears the contents of the +edit control that currently has the focus (only single-line edit controls).
{VKEY X}Sends the + +virtual key of value X.
{APPACTIVATE WindowTitle}Activates +the window "WindowTitle".
{BEEP X Y}Beeps with +a frequency of X hertz and a duration of Y milliseconds.
+ +
+ + + + + + + +
Command SyntaxAction
{VKEY X F}Sends the +virtual key of value X; see below.
+ + +
+ + + +{VKEY X F}:
+This command sends the +virtual key of value X. +The parameter F is optional and may be a combination of the following +values: +
    +
  • E: +Send an extended key; see below.
  • +
  • N: +Send a non-extended key; see below.
  • +
  • D: +Press and hold down the key (without releasing it).
  • +
  • U: +Release the key (without pressing it).
  • +
+ +

The values E and N are mutually exclusive. +It is recommended to specify neither E nor N, +if possible; KeePass then determines automatically whether the virtual key +is typically realized using an extended key.

+ +

The values D and U are mutually exclusive. +If neither D nor U is specified, KeePass +sends a keypress (i.e. down and up).

+ +

On Linux systems, KeePass automatically converts most Windows virtual key codes +to Linux key codes (i.e. the {VKEY ...} command works on both +systems).

+ +Examples: +
    +
  • {VKEY 13}
    +Presses and releases the primary Enter key. +This is equivalent to {ENTER}.
  • +
  • {VKEY 13 E}
    +Presses and releases the Enter key of the +numeric keypad.
  • +
  • {VKEY 91 D}e{VKEY 91 U}
    +Sends Win+E +(i.e. it presses and holds down the left Win +key, presses and releases the E key, and +releases the Win key), +which starts Windows Explorer (on Windows). +This is not equivalent to {LWIN}e +(which first presses and releases the left Win key +and then presses and releases the E key).
    +Note that Windows Explorer can also be started using +{CMD:/Explorer.exe/W=0/} +(the {CMD:/.../} +placeholder can run arbitrary command lines).
  • +
+ +Do not use the {VKEY ...} command to change the state of the +Shift, Ctrl and +Alt modifiers. For this, use +, +^ and % instead (see above). + + +
+ + +Keys and special keys (not placeholders or commands) can be repeated by +appending a number within the code. For example, {TAB 5} +presses the Tab key 5 times. + + +

Examples:

+ +

{TITLE}{TAB}{USERNAME}{TAB}{PASSWORD}{ENTER}
+Types the entry's title, a Tab, the user name, +a Tab, the password of the +currently selected entry, and presses Enter.

+ +

{TAB}{PASSWORD}{ENTER}
+Presses the Tab key, enters the entry's password and +presses Enter.

+ +

{USERNAME}{TAB}^v{ENTER}
+Types the user name, presses Tab, presses +Ctrl+V (which pastes data from the Windows +clipboard in most applications), and presses Enter.

+ +

Toggling Checkboxes:
+A checkbox (e.g. "Stay logged in on this computer") can +usually be toggled by sending a space character (' '). +Example:
+{USERNAME}{TAB}{PASSWORD}{TAB} {TAB}{ENTER}
+If there is a form with a user name field, a password field and a checkbox, +this sequence would enter the user name, the password and toggle the checkbox +that follows the password control.

+ +

Pressing Non-Default Buttons:
+Pressing non-default buttons works the same as toggling checkboxes: send +a space character (' '). +Note that this should only be used for non-default buttons; for +default buttons, {ENTER} should be sent instead.

+ +

Higher ANSI Characters:
+The auto-type function supports sending of higher ANSI characters in range 126-255. This +means that you can send special characters like ©, @, etc. without any problems; +you can write them directly into the keystroke sequence definition.

+ +
+ + +

+Target Window Filters

+ +

When creating a custom window/sequence association, you need to tell +KeePass how the matching window titles look like. Here, KeePass supports +simple wildcards:

+ + + + + + + + +
String with WildcardMeaning
STRINGMatches all window titles that are named exactly "STRING".
STRING*Matches all window titles that start with "STRING".
*STRINGMatches all window titles that end with "STRING".
*STRING*Matches all window titles that have "STRING" somewhere in the window title. This includes the string being directly at the start or at the end of the window title.
+ +
+ + + + + + +Wildcards may also appear in the middle of patterns. +For example, *Windows*Explorer* would match +Windows Internet Explorer.
+
+Additionally, matching using + +regular expressions is supported. In order to +tell KeePass that the pattern is a regular expression, enclose it in +//. For example, //B.?g Window// would +match Big Window, Bug Window and Bg Window. + + +

By using wildcards, you can make your auto-type associations browser-independent. +See the usage examples for more information.

+ +
+ + +

+Change Default Auto-Type Sequence

+ +

The default auto-type sequence (i.e. the one which is used when you don't specify +a custom one) is {USERNAME}{TAB}{PASSWORD}{ENTER}. KeePass allows you +to change this default sequence. Normally you won't need to change it (use +custom window/sequence definitions instead!), but it is quite useful when some +other application is interfering with KeePass (for example a security software that +always asks you for permission before allowing KeePass to auto-type).

+ + + + + + +By default, entries inherit the auto-type sequence of their containing group. +Groups also inherit the auto-type sequence of their parent groups. There is +only one top group (the first group contains all other groups). Consequently, if +you change the auto-type sequence of this very first group, all other groups +and their entries will use this sequence. Practically, this is a global override. +To change it, right-click on the first group, choose 'Edit Group' and switch +to the 'Auto-Type' tab. +
+ + +

+ + +

+Usage Example

+ +

Now let's have a look at a real-world example: logging into a website. In this example, +will we use the global auto-type hot key to fill out the login webpage. +First open the test page, and afterwards create a new entry +in KeePass with title Test Form and a user name and password +of your choice.

+ +

Let's assume the global auto-type hot key is set to +Ctrl+Alt+A (the default). +KeePass is running in the background, you have opened your database and the workspace is unlocked.

+ +

When you now navigate to the test page and are being prompted for your user name and password, +just click into the user name field and press +Ctrl+Alt+A. +KeePass enters the user name and password for you!

+ +

Why did this work? The window title of your browser window was +"Test Form - KeePass - Internet Explorer" or +"Test Form - KeePass - Mozilla Firefox", depending on the browser +you are using. Because we gave the entry in KeePass the title Test Form, the +entry title is contained in the window title, therefore KeePass uses this entry.

+ +

Here you see the huge advantages of auto-type: it not only doesn't require +any additional browser software +(the browser knows nothing of KeePass – there are no helper browser plugins required), +it is also browser-independent: the one entry that you created within KeePass works +for Internet Explorer and Mozilla Firefox (and other browsers) without +requiring any modifications or definitions.

+ +

When you would use window/sequence associations +(instead of entry title matching), you can achieve the same +browser-independent effect using wildcards: you could for example have used +Test Form - KeePass - * as window filter. This filter matches both +the Internet Explorer and the Firefox window.

+ + + diff --git a/src/Docs/Chm/help/base/autourl.html b/src/Docs/Chm/help/base/autourl.html new file mode 100644 index 0000000..098681f --- /dev/null +++ b/src/Docs/Chm/help/base/autourl.html @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + URL Field - KeePass + + + + + + + + + + + + + +

URL Field

+

The URL field supports various special protocols and placeholders.

+ + + +Usage Tips & Tricks: + + +
+ + +

+Standard Capabilities

+ +

The URL field can execute any valid URL for which a protocol handler is defined. +On most systems at least the http://, https://, +ftp:// and mailto: protocols are defined. +KeePass supports all protocols that Windows supports.

+ +

For example, if you globally (i.e. using the Windows Explorer) register PuTTY for ssh:// URLs, +KeePass will automatically use PuTTY for ssh:// URLs, too.

+ +
+ + +

+Executing Command Lines

+ +

Instead of a URL, you can also execute command lines using the URL field. +To tell KeePass that the line you entered +is a command line, prefix it using cmd://. For example if you would like to execute +Notepad, your URL could look like this:

+ +
cmd://C:\Windows\Notepad.exe C:\Test\MyTestFile.txt
+ +

The virtual cmd:// protocol also supports parameters for executable +files, in contrast to +the file:// protocol. This was the main reason why cmd:// +was introduced; with file:// you +aren't able to pass any parameters to started applications. Use the cmd:// +protocol instead.

+ +

The paths for the cmd:// protocol don't need to be encoded. For example, +you do not have to replace space characters by %20, as it is normally +required for other URLs. KeePass just cuts away the cmd:// virtual +protocol prefix and passes the remaining command line to the system.

+ +

If the file path contains spaces, you must enclose it in quotes (").

+ +

Environment Variables:
+System environment variables are supported. +The name of the variable must be enclosed in '%' characters. +For example %TEMP% is replaced by the user's temporary path.

+ +

UNC Paths:
+Windows-style UNC paths (starting with \\) are directly +supported, i.e. do not need to be prefixed with cmd://.

+ +

Double Quotes (") and Backslashes (\):
+There are multiple rule sets for parsing command lines +(SHELLEXECUTEINFOW structure, +CommandLineToArgvW function, + +Microsoft C/C++ startup code, etc.). +These rule sets are contradictory; command lines are interpreted differently. +For example, in the SHELLEXECUTEINFOW structure documentation, +backslashes have no special meaning, whereas the +CommandLineToArgvW function sometimes interprets a backslash +as an escape character. +Another example: A"""B C"""D is +interpreted as one argument (namely A"B C"D) +by the Microsoft C/C++ startup code, whereas the CommandLineToArgvW +function returns two arguments +(namely A"B and C"D). +KeePass cannot know how the executed application will interpret its +command line, and there is no command line encoding that is +interpreted as intended by all applications. +Therefore, we recommend:

+
    +
  • Use double quotes (") only to indicate the start and the end of +the file path or of an argument. Do not use a quote in data that +requires encoding. For example, if your command line contains a +{PASSWORD} placeholder, +the password should not contain a quote.
  • +
  • Use a backslash only when the next character is not a quote, +i.e. avoid \". +Especially, avoid data ending with a backslash if a quote follows on +the command line. For example, if the command line contains an +argument like -pw:"{PASSWORD}", the password should +not end with a backslash, because otherwise the placeholder replacement +results in the problematic \" sequence.
  • +
+ +

Unix-like Systems:
+On Unix-like systems, KeePass assumes that double quotes (") +and backslashes (\) must be encoded. +Furthermore, KeePass assumes that single quotes (') +only occur in contexts where they must not be encoded (e.g. within +double quotes). So, if any of your arguments may contain a single quote, +you have to ensure that it occurs within such a context. +On Windows, this is irrelevant, as single quotes do not have a special meaning here.

+ +
+ + +

+Placeholders

+ +

In the URL field, you can use several placeholders that will get automatically replaced +when the URL is executed. For example:

+ +
https://www.example.com/default.php?user={USERNAME}&pass={PASSWORD}
+ +

For this entry, KeePass will replace {USERNAME} by the data of the username field and {PASSWORD} +by the data in the password field when you execute the link.

+ +

For a complete list of supported placeholders, see the page +Placeholders.

+ +

Also note that the special placeholders are supported, too. For example, +the {APPDIR} placeholder is replaced by the application +directory path of the currently running KeePass instance. It's the absolute path of the +directory containing the KeePass executable, without a trailing backslash. +If you would like to start a new KeePass instance, you could set the URL to:

+ +
cmd://"{APPDIR}\KeePass.exe"
+ +

To use different browsers for entries, you can use URLs like the following:
+cmd://{INTERNETEXPLORER} "https://www.example.com/"
+cmd://{FIREFOX} "https://www.example.com/"
+cmd://{OPERA} "https://www.example.com/"
+cmd://{GOOGLECHROME} "https://www.example.com/"
+cmd://{SAFARI} "https://www.example.com/"
+The browser placeholder will be replaced by the browser's executable path (if the +browser is installed).

+ +
+ + +

+Changing the URL Handler (URL Override)

+ +
+ + + + + + +

The URL field behavior can be overridden individually for each entry +using the field 'Override URL' (tab 'Properties' in the entry dialog). +This allows you to execute a specific URL, while still using the URL +field to (only) store data. +When double-clicking the URL field of the entry in the main window, the +specified command line (in the URL override field) will be run.

+ +

Using a different browser:
+If your default browser is Firefox and you want to open a specific site with +Internet Explorer, specify the following in the URL override field:

+ +

cmd://{INTERNETEXPLORER} "{URL}"

+ +

KeePass will open Internet Explorer and pass the data from the URL field +as the parameter. This uses a placeholder to find Internet +Explorer.

+ +

Globally changing the URL behavior:
+If you want to change the default URL action for a URL scheme +(e.g. http://, https:// or ftp://), +you can define a URL scheme override +in 'Tools' → 'Options' → tab 'Integration' → 'URL Overrides'. +This for example allows to specify a browser as default for websites +(in the dialog you can find several overrides for browsers like Internet Explorer, +Mozilla Firefox, Opera and Google Chrome).

+ +

URL scheme overrides can also be used to define new protocols. For example, +if you want to define a protocol kdbx:// that opens another KeePass database, +specify the following as override for the kdbx scheme (on Windows):
+cmd://"{APPDIR}\KeePass.exe" "{BASE:RMVSCM}" -pw-enc:"{PASSWORD_ENC}"
+or on Unix-like systems (Mono):
+cmd://mono "{APPDIR}/KeePass.exe" "{BASE:RMVSCM}" -pw-enc:"{PASSWORD_ENC}"
+If an entry now has a URL looking like kdbx://PathToYourDatabase.kdbx +and the master password for this database in the password field, +double-clicking the URL of the entry in the main window opens the other database. +The -pw-enc command line parameter and +the {PASSWORD_ENC} placeholder +allow passing the master password of the other database in encrypted form, +i.e. process monitors and similar utilities aren't be able to read the master password.

+ + +

+ + +

+Starting RDP/TS Sessions

+ +

You can use the URL field of entries and the virtual cmd:// +protocol to start remote desktop connections.

+ +

For this, enter the following in the URL field of an entry:

+ +
cmd://mstsc.exe
+ +

When you now double-click the URL field of the entry in the main window, a +Windows remote desktop connection is initiated.

+ +

MSTSC is the Windows terminal server connection program (remote desktop connection). +You can pass a path to an existing RDP file to the program to open it. For example, +the following URL opens the specified RDP file:

+ +
cmd://mstsc.exe "C:\My Files\Connection.rdp"
+ +

MSTSC also supports several command line options:

+ +
    +
  • /v:<Server[:Port]>
    Defines the terminal server to connect to.
  • +
  • /console
    Connects to the terminal session of the server.
  • +
  • /f
    Starts the client in full screen mode.
  • +
  • /w:<Width>
    Defines the width of the remote desktop screen.
  • +
  • /h:<Height>
    Defines the height of the remote desktop screen.
  • +
  • /edit
    Opens the specified RDP file for editing.
  • +
  • /migrate
    Migrates old connection files to new RDP files.
  • +
+ +
+ + +

+Executing Built-In Shell Commands

+ +

The URL field can be used to start applications/documents and URLs. +If you want to execute a built-in shell command, like COPY for +example, this however doesn't work directly, because there is no COPY.EXE +(in Windows 9x times there actually was one, but on all modern Windows operating +systems these commands are built-in to the command line window).

+ +

In order to execute built-in shell commands, you need to pass them to the +command line interpreter cmd.exe.

+ +

For the COPY command you would specify cmd.exe +as executable file and /C COPY from to as arguments (where +'from' and 'to' are paths). The /C +parameter tells cmd.exe to execute the command line that +follows.

+ +

In the URL field, your URL would look like the following:
+cmd://cmd.exe /C COPY from to
+In other locations, like command lines in the trigger system, +you can leave out the cmd:// URL prefix.

+ + + diff --git a/src/Docs/Chm/help/base/cmdline.html b/src/Docs/Chm/help/base/cmdline.html new file mode 100644 index 0000000..541098a --- /dev/null +++ b/src/Docs/Chm/help/base/cmdline.html @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Command Line Options - KeePass + + + + + + + + + + + + + +

Command Line Options

+

Command line options to automate KeePass tasks.

+ +

You can pass a file path in the command line in order to tell KeePass to open +this file immediately after startup.

+ +

Switches can be either prefixed using +a minus (-) or two minus characters (--). +On Windows, a slash (/) is another alternative. +The prefixes are equivalent; it doesn't matter which one you use.

+ +

Database file. +The database file location is passed as argument. Only one database file is allowed. +If the path contains a space, it must be enclosed in quotes (").

+ +

Password. +Passwords can be passed using the -pw: option. In order to +pass 'abc' as password, you would add the following argument to the command line: +-pw:abc. Note that there must be no space between the ':' and the +password. If your password contains a space, you must enclose it in quotes. For +example: -pw:"my secret password".

+ +

Using the -pw: option is not recommended, due to +security reasons (the operating system allows reading the command line +options of other applications).

+ +

When passing the -pw-stdin option, KeePass +reads the password from the StdIn stream. +This option is intended for programmatically passing the password to KeePass. +For entering the password by hand, it is recommended to use the +normal master key dialog instead (because in this dialog the password +is hidden by bullets/asterisks and it is encrypted by the process memory +protection).

+ +

Key file. +For supplying the key file location, the -keyfile: switch +exists. The same rules as above apply, just that you specify the key file location: +-keyfile:D:\pwsafe.key. You also need to quote the value, if it contains +a space, tab or other whitespace characters.

+ +

Preselection. +In order to just preselect a key file, use the -preselect: option. +For example, if you lock your database with a password and a key file, but +just want to type in the password (so, without selecting the key file manually), +your command line would look like this:

+ +
KeePass.exe "C:\My Documents\MyDatabase.kdbx" -preselect:C:\pwsafe.key
+ +

KeePass would then show a prompt for the password for the database, but in +the key file list, the C:\pwsafe.key file is selected already. When using the +-preselect: switch, KeePass by default activates the key file switch and +sets the focus to the password edit window.

+ +

Note the difference! The -preselect: switch just preselects the key file +for you and displays the login prompt. In contrast, the -keyfile: switch +doesn't prompt you for the (maybe missing) password.

+ +

Other. +The -minimize command line option makes KeePass start up minimized. +This option may not work when KeePass runs on Mono (due to a bug in Mono).

+ +

The -auto-type command line option makes other already opened +KeePass instances perform a global auto-type.

+ + + + + + +Additionally, the -useraccount switch is supported. If specified, the +current user account credentials will be used.
+
+The -iocredfromrecent switch makes KeePass load file +system credentials (not database key) from the most recently used files list. +Alternatively, the file system credentials can be specified using the +-iousername: and -iopassword: parameters. +The optional -ioiscomplete switch +tells KeePass that the path and file system credentials are complete +(the 'Open URL' dialog will not be displayed then).
+
+The -pw-enc: parameter is similar to -pw:, but +it requires the password to be encrypted. Encrypted passwords can be +generated using the {PASSWORD_ENC} +placeholder.
+
+The -entry-url-open option makes other already opened KeePass instances +search for an entry and open its URL. The entry is identified by its UUID, +which you can pass as -uuid: command line parameter.
+
+The -auto-type-password option is similar to -auto-type, +but auto-types only the password of a matching entry. +-auto-type-selected performs auto-type for the currently selected entry.
+
+The -cancel option causes all other KeePass instances to +cancel opening/saving a database file.
+
+The path of the local configuration file can be changed +using the -cfg-local: command line parameter. + + +

The order of the arguments is arbitrary.

+ +
+ +

+Usage Examples

+ +

Open the database file 'C:\My Documents\MyDatabase.kdbx' (KeePass will prompt you +for the password and/or key file location):

+ +
KeePass.exe "C:\My Documents\MyDatabase.kdbx"
+ +

If you got a database that is locked with a password 'abc', you could open it like this:

+ +
KeePass.exe "C:\My Documents\MyDatabaseWithPw.kdbx" -pw:abc
+ +

If your USB stick always mounts to drive F: and you've locked your database with a key file +on the USB stick, you could open your database as follows:

+ +
KeePass.exe "C:\My Documents\MyDatabaseWithFile.kdbx" -keyfile:F:\pwsafe.key
+ +

If you've locked your database using a password and a key file, you can combine +the two switches and open your database as follows:

+ +
KeePass.exe "C:\My Documents\MyDatabaseWithTwo.kdbx" -pw:abc -keyfile:F:\pwsafe.key
+ +

You have locked your database using a password and a key file, but only +want to have the key file preselected (i.e. you want to get prompted for the +password), your command line would look like this:

+ +
KeePass.exe "C:\My Documents\MyDatabaseWithTwo.kdbx" -preselect:F:\pwsafe.key
+ +
+ +

+Starting KeePass using a Batch File

+ +

Batch files can be used to start KeePass. Mostly you want to +specify some of the parameters listed above. You can theoretically +simply put the command line (i.e. application path and parameters) +into the batch file, but this is not recommended as the command +window will stay open until KeePass is closed. The following +method is recommended instead:

+ +
START "" KeePass.exe ..\MyDb.kdbx -pw:MySecretPw
+ +

This START command will run KeePass (which opens the +..\MyDb.kdbx file using +MySecretPw as password). KeePass is assumed to be in the same +directory (working directory) as the batch file, otherwise you need to +specify a different path.

+ +

START executes the given command line and immediately exits, +i.e. it doesn't wait until the application is terminated. Consequently, +the command window will disappear after KeePass has been started.

+ +

Please note the two quotes (") after the +START command. These quotes +are required if the application path contains quotes (in the example +above, the quotes could also be removed). +If you want to learn more about the START command syntax, type +START /? into the command window.

+ +
+ +

+Closing/Locking KeePass using a Batch File

+ +

To close all currently running KeePass instances, call +KeePass.exe with the '--exit-all' parameter:

+ +
KeePass.exe --exit-all
+ +

All KeePass windows will attempt to close. If a database has been modified, +KeePass will ask you whether you want to save or not. If you wish to save in +any case (i.e. a forced exit without any confirmation dialog), enable the +'Automatically save database on exit and workspace locking' option +in 'Tools' → 'Options' → tab 'Advanced'.

+ +

The KeePass instance that has been created by the command above is not visible (i.e. +it does not show a main window) and will immediately terminate after sending close +requests to the other instances.

+ +

The --lock-all and +--unlock-all command line options lock/unlock the workspaces +of all other KeePass instances.

+ + + diff --git a/src/Docs/Chm/help/base/configuration.html b/src/Docs/Chm/help/base/configuration.html new file mode 100644 index 0000000..dc679c9 --- /dev/null +++ b/src/Docs/Chm/help/base/configuration.html @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Configuration - KeePass + + + + + + + + + + + + + +

Configuration

+

Details about how and where KeePass stores its configuration.

+ +

KeePass supports multiple locations for storing configuration information: +the global configuration file in the KeePass application directory, +a local user-dependent one in the user's private configuration folder, and +an enforced configuration file in the KeePass application directory. +The first one is called global, +because everyone using this KeePass installation will +write to the same configuration file (and possibly overwriting settings of other +users). The second one is called local, because changes made to this configuration +file only affect the current user.

+ + + + + + +Configuration files are stored in XML format.

+ + + + + + + + + + + + + + + + + + + + + + +
ConfigurationLocationTypical File Path
GlobalApplication DirectoryC:\Program Files\KeePass Password Safe 2\KeePass.config.xml
Global (Virtualized)Windows Virtual StoreC:\Users\User Name\AppData\Local\VirtualStore\Program Files\KeePass Password Safe 2\KeePass.config.xml
LocalUser Application DataC:\Users\User Name\AppData\Roaming\KeePass\KeePass.config.xml
EnforcedApplication DirectoryC:\Program Files\KeePass Password Safe 2\KeePass.config.enforced.xml
+ + + + +

On Linux systems, the local configuration file is typically stored in +'$XDG_CONFIG_HOME/KeePass' (which often is '~/.config/KeePass', +where '~' is the user's home directory).

+ +
+ + +

+Installation by Administrator, Usage by User

+ +

If you use the KeePass installer and install the program with administrator rights, +the program directory will be write-protected when working +as a normal/limited user. KeePass will use local configuration files, i.e. save and load +the configuration from a file in your user directory.

+ +

Multiple users can use the locally installed KeePass. Configuration settings +will not be shared and can be configured individually by each user.

+ +
+ + +

+Portable Version

+ +

If you downloaded the portable version of KeePass (ZIP package), KeePass will +try to store its configuration in the application directory. No configuration +settings will be stored in the user directory (if the global configuration file is +writable).

+ +
+ + +

+Create Portable Version of Installed KeePass

+ +

If you are currently using a locally installed version of KeePass +(installed by the KeePass installer) and want to create a portable version of it, +first copy all files of KeePass to the portable device. Then get the configuration file +from your user directory (application data, see above) and copy it +over the configuration file on the portable device.

+ +
+ + +

+For Network Administrators: Enforced Configuration

+ +

Settings in an enforced configuration file +take precedence over settings in global and local +configuration files.

+ +

This feature is intended primarily for network administrators +who want to enforce certain settings for users of a shared +KeePass installation.

+ +

For details, please see the +Enforced Configuration +help page.

+ +
+ + +

+Technical Details

+ +

This section explains in detail how loading and saving the configuration works.

+ +

When KeePass starts up and finds both global and local configuration files, it must +decide the order in which KeePass tries to get the configuration items. +This is controlled by the +(Kee)PreferUserConfiguration flag in the global configuration +file. If it is not present, it defaults to false.

+ +

The flag is set to true in the global configuration file of the +KeePass installer package. The portable ZIP package does not contain a configuration file, +consequently the flag defaults to false.

+ + + + + + +Loading: +
    +
  • Try to get the configuration item from the enforced configuration file. +If found, use this one.
  • +
  • If the PreferUserConfiguration flag is true, use the item from +the local configuration file, otherwise use the item from the global one. +If the chosen configuration file does not contain the item, use the default value.
  • +
+ +Saving: +
    +
  • If the PreferUserConfiguration flag is true, try to store +all configuration items into the local configuration file. +If this fails, report the error and try to store them into the global configuration file. +If this fails, report the error.
  • +
  • If the PreferUserConfiguration flag is false, try to store +all configuration items into the global configuration file. +If this fails, report the error and try to store them into the local configuration file. +If this fails, report the error.
  • +
+ +The path of the local configuration file can be changed +using the '-cfg-local:' command line parameter. + + + + + + diff --git a/src/Docs/Chm/help/base/credits.html b/src/Docs/Chm/help/base/credits.html new file mode 100644 index 0000000..e854936 --- /dev/null +++ b/src/Docs/Chm/help/base/credits.html @@ -0,0 +1,887 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Acknowledgements / Credits - KeePass + + + + + + + + + + + + + +

Acknowledgements / Credits

+

Thanks to various people for contributions and/or work.

+ +

At this place I want to thank a lot of people very much for their help, +source code, suggestions and other contributions (in no particular order).

+ + + +
+ + +

+Donation Acknowledgements

+ +

Developing high-quality applications takes much time and resources. +Donations make it possible to keep up the current development standard. +Therefore, many thanks to all who donated to the project.

+ +

More information about donations and a list of people who donated +can be found here: +KeePass +Donations.

+ +
+ + +

+Source Code Acknowledgements

+ +

KeePass uses some classes and libraries written by different +people and given away for free. Here I want to thank them for writing +these classes and libraries.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AuthorClass / Library
Szymon StefanekC++ implementation +of the AES/Rijndael encryption algorithm.
Niels FergusonC implementation of the Twofish encryption algorithm.
Brian GladmanC implementation +of the SHA-2 (256/384/512) hashing algorithms.
Alvaro MendezMFC class for validating edit controls (CAMSEdit).
Brent CorkumMFC class for XP-style menu (BCMenu).
Davide CalabroMFC class for buttons with icons (CButtonST).
Zorglab, Chris Maunder, Alexander Bischofberger, James White, Descartes Systems Sciences Inc.MFC class for color pickers (CColourPickerXP).
Peter MaresMFC class for window side banners (CKCSideBannerWnd).
Chris MaunderMFC class for system tray icons (CSystemTray).
Hans Dietrich, Chris MaunderMFC class for hyperlinks in dialogs (XHyperLink).
LallousClass for sending simulated keystrokes to other applications + +(CSendKeys).
PJ NaughterMFC classes for checking for single instance +(CSingleInstance) +and version information +(CVersionInfo).
Bill RubinCommand line C++ classes.
Boost DevelopersBoost C++ libraries.
Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, Samuel Neves, +Thomas PorninC implementation +of the Argon2 password hashing function.
+ +
+ + + + + + + +
AuthorResource
Mark BurnettList of + + +10000 Top Passwords, which KeePass uses in its +password quality estimation algorithm.
+ +

+ + +

+Icon Acknowledgements

+ +

Many thanks to Christopher Bolin for creating the main KeePass icon +(see top left on this page) and its +variations. +Many thanks to Victor Andreyenkov for refining the application icons.

+ +

Many thanks to David Vignoni for creating the nice 'Nuvola' icon theme. +Most of the icons used in KeePass and on its website are icons of this theme. You can find the +original images on the website +of the author, and the license below.

+ +

Furthermore, thanks to the authors of the following icons that KeePass uses:

+ + +
+ + +

+Translation Acknowledgements

+ +

Many thanks to all people who created translations for KeePass.

+ +
+ + +

+Plugin Acknowledgements

+ +

Many thanks to all people who wrote plugins for KeePass. Without you, KeePass +would be a lot less powerful and useful!

+ +
+ + +

+Tools Acknowledgements

+ + + +

Thanks to Jordan Russell for creating Inno Setup. This +tool is used to create the KeePass installation program.

+ + +

Thanks to Dimitri van Heesch for the Doxygen utility, which is used to compile the source +code documentation.

+ +
+ + +

+Hosting/Distribution Acknowledgements

+ +
+ + ++ + + + + + + + + + + + + + +
+Thanks to SourceForge +for hosting the KeePass downloads / translations / plugins and for providing the +project support platform (forums, feature requests / bug trackers, ...) for free. +
+Thanks to domain)FACTORY +for hosting the KeePass website. +
+Thanks to datensysteme-lenk +for hosting the German KeePass support forum in the past. +
+ +

+ + +

+Suggestions and Forum Support Acknowledgements

+ +

Thanks to all the people answering questions of others in the KeePass +forums! A product is only as good as its support is, and I alone could +never provide such an excellent individual help platform.

+ +

A few persons should be mentioned here, because of an extraordinary amount +of suggestions (features, bug reports, ...) and helping others in the forums: +Paul Tannard, Wellread1 and Michael Scheer.

+ +
+ + +

+Special Acknowledgements

+ +

Thanks to Daniel Turini for suggesting "KeePass" +as the name of the project.

+ +

An especially big thanks to Bill Rubin. He not only contributed a lot of +source code to KeePass, he also had an enormous amount of feature and improvement suggestions, +helped people in the KeePass forums, and wrote a KeePass plugin for backing up +databases. He's also the reason why many of the sections in the KeePass Help +are very precise, helpful, clear and easy to understand. +In our countless hours long IM chats, we not only discussed much about the design +of KeePass, Bill also told me a lot about C++ and other stuff. Thanks!

+ +
+ + +

+Licenses of Components/Resources/etc.

+ + +

Nuvola Icon Theme

+ +

Usage of the icons is allowed under the terms of the LGPL license (which you can find +here: GNU Lesser General Public License), plus +an addition.

+ +
TITLE:  NUVOLA ICON THEME for KDE 3.x
+AUTHOR: David Vignoni | ICON KING
+SITE:   http://www.icon-king.com
+MAILING LIST: http://mail.icon-king.com/mailman/listinfo/nuvola_icon-king.com
+
+Copyright (c)  2003-2004  David Vignoni.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation,
+version 2.1 of the License.
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+You should have received a copy of the GNU Lesser General Public
+License along with this library (see the the license.txt file); if not, write
+to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+MA  02111-1307  USA
+#######**** NOTE THIS ADD-ON ****#######
+The GNU Lesser General Public License or LGPL is written for software libraries
+in the first place. The LGPL has to be considered valid for this artwork
+library too.
+Nuvola icon theme for KDE 3.x is a special kind of software library, it is an
+artwork library, it's elements can be used in a Graphical User Interface, or
+GUI.
+Source code, for this library means:
+ - raster png image* .
+The LGPL in some sections obliges you to make the files carry
+notices. With images this is in some cases impossible or hardly usefull.
+With this library a notice is placed at a prominent place in the directory
+containing the elements. You may follow this practice.
+The exception in section 6 of the GNU Lesser General Public License covers
+the use of elements of this art library in a GUI.
+dave [at] icon-king.com
+
+Date:       15 october 2004
+Version:    1.0
+
+DESCRIPTION:
+
+Icon theme for KDE 3.x.
+Icons where designed using Adobe Illustrator, and then exported to PNG format.
+Icons shadows and minor corrections were done using Adobe Photoshop.
+Kiconedit was used to correct some 16x16 and 22x22 icons.
+
+LICENSE
+
+Released under GNU Lesser General Public License (LGPL)
+Look at the license.txt file.
+
+CONTACT
+
+David Vignoni
+e-mail :        david [at] icon-king.com
+ICQ :           117761009
+http:           http://www.icon-king.com
+ +
+ + +

Boost

+ +
Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+ +
+ + +

Twofish Implementation

+ +
Fast, portable, and easy-to-use Twofish implementation,
+Version 0.3.
+Copyright (c) 2002 by Niels Ferguson.
+
+The author hereby grants a perpetual license to everybody to
+use this code for any purpose as long as the copyright message is included
+in the source code of this or any derived work.
+ +
+ + +

SHA-2 Implementation

+ +
Copyright (c) 2003, Dr Brian Gladman, Worcester, UK.   All rights reserved.
+
+LICENSE TERMS
+
+The free distribution and use of this software in both source and binary
+form is allowed (with or without changes) provided that:
+
+  1. distributions of this source code include the above copyright
+     notice, this list of conditions and the following disclaimer;
+
+  2. distributions in binary form include the above copyright
+     notice, this list of conditions and the following disclaimer
+     in the documentation and/or other associated materials;
+
+  3. the copyright holder's name is not used to endorse products
+     built using this software without specific written permission.
+
+ALTERNATIVELY, provided that this notice is retained in full, this product
+may be distributed under the terms of the GNU General Public License (GPL),
+in which case the provisions of the GPL apply INSTEAD OF those given above.
+
+DISCLAIMER
+
+This software is provided 'as is' with no explicit or implied warranties
+in respect of its properties, including, but not limited to, correctness
+and/or fitness for purpose.
+---------------------------------------------------------------------------
+Issue 01/08/2005
+ +
+ + +

CSendKeys

+ +
Copyright (c) 2004 lallous <lallousx86@yahoo.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+---------------------------------------
+
+The Original SendKeys copyright info
+
+SendKeys (sndkeys32.pas) routine for 32-bit Delphi.
+Written by Ken Henderson
+Copyright (c) 1995 Ken Henderson <khen@compuserve.com>
+ +
+ + +

Command Line Classes

+ +
Copyright (c) 2006, Bill Rubin <rubin@contractor.net>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of Quality Object Software, Inc., nor the names of
+      its contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+ +
+ + +

Argon2 Implementation

+ +
Argon2 reference source code package - reference C implementations
+
+Copyright 2015
+Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves
+
+You may use this work under the terms of a Creative Commons CC0 1.0
+License/Waiver or the Apache Public License 2.0, at your option. The terms of
+these licenses can be found at:
+
+- CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
+- Apache 2.0        : http://www.apache.org/licenses/LICENSE-2.0
+
+The terms of the licenses are reproduced below.
+
+--------------------------------------------------------------------------------
+
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+    REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+    PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+    HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+  i. the right to reproduce, adapt, distribute, perform, display,
+     communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+     likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+     subject to the limitations in paragraph 4(a), below;
+  v. rights protecting the extraction, dissemination, use and reuse of data
+     in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+     European Parliament and of the Council of 11 March 1996 on the legal
+     protection of databases, and under any national implementation
+     thereof, including any amended or successor version of such
+     directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+     world based on applicable law or treaty, and any national
+     implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+    surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+    warranties of any kind concerning the Work, express, implied,
+    statutory or otherwise, including without limitation warranties of
+    title, merchantability, fitness for a particular purpose, non
+    infringement, or the absence of latent or other defects, accuracy, or
+    the present or absence of errors, whether or not discoverable, all to
+    the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+    that may apply to the Work or any use thereof, including without
+    limitation any person's Copyright and Related Rights in the Work.
+    Further, Affirmer disclaims responsibility for obtaining any necessary
+    consents, permissions or other rights required for any use of the
+    Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+    party to this document and has no duty or obligation with respect to
+    this CC0 or use of the Work.
+
+--------------------------------------------------------------------------------
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+ +
+ + + diff --git a/src/Docs/Chm/help/base/faq.html b/src/Docs/Chm/help/base/faq.html new file mode 100644 index 0000000..5f25e6e --- /dev/null +++ b/src/Docs/Chm/help/base/faq.html @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Administrative FAQ - KeePass + + + + + + + + + + + + + +

Administrative FAQ

+

Frequently Asked Questions about the project, licensing, ...

+ + + +
+ + +

+How can I help you?

+ +

If you like KeePass and would like to help the developers in some way:

+ +
    +
  • Donate
    +This is the best way of helping, if you don't have that much time or experience +in application development.
  • +
  • Make a translation
    +If you have some free time, you could make a translation of KeePass (of course only if you're +language isn't offered already).
  • + +
  • Test new releases and report bugs
    +KeePass is under constant development, new features get implemented, bugs get fixed. If you +have some free time, you could +test new releases thoroughly and report bugs. If you're a programmer, look through the sources to +find bugs and maybe even submit fixes.
  • +
  • Spread the word
    +If you like KeePass, tell all your friends how great KeePass is, publish articles +about it, press it on CDs/DVDs, ship USB sticks preinstalled with it, submit it to software +archives, talk in forums about it, etc.!
  • +
+ +
+ + +

+May KeePass be used in a company?

+ +

Yes. KeePass is free software and you don't have to pay any +fees. You may freely use KeePass under the terms of its + + + + +license. + + +

+ +

But of course, if you like KeePass, +donations +are always greatly appreciated.

+ + + + + + +You might be interested in this page: +Customization (2.x). + + +

+ + +

+What about a centralized KeePass Internet server?

+ +

The idea on the first glance sounds simple and useful: there should be a centralized +KeePass Internet server, on which all users can store their passwords. By having +Internet connection, you'd have access to all your passwords.

+ +

Note that this idea is different from simply providing webspace. KeePass 2.x already +supports storing databases on servers using HTTP/FTP. The point is +having one server for all users.

+ +

When creating such a server, there are several difficulties:

+ +
    +
  • A fairly complex synchronization and caching mechanism will be required. +You won't want to transfer the complete database, otherwise the service will be unusable +for everyone storing attachments, etc.

  • + +
  • Directly related to the previous point: in order to do synchronization, the server needs +to be able to read and understand databases, i.e. some dedicated KeePass server +would need to be written. While the transport way could be secure HTTPS, the server +certainly has some user data as plain text in memory for some time. One needs +to be very careful here. What to do if the server gets compromised? The security +implications would be horrible, if an attacker could read any user data.

  • + +
  • How to avoid server compromises? If a normal Internet server is compromised, +the security implications are minimal: in the worst case all user accounts and data for this +website are lost. But with a KeePass server, whole identities would be lost. An attacker +couldn't only impersonate someone on this particular server, but on the complete Internet +and real world, depending on what is stored in the databases.
    +
    +Therefore, banking-level security systems would be required for a KeePass server. +Keeping PHP / ASP / Linux / Windows (or whatever will be used) up-to-date definitely +is not enough here.
    +
  • + +
  • Basically you offer people webspace for their databases, therefore the service +obviously will cost something. By charging people, they expect reliability and you +need to make up-time guarantees. Therefore, at least 2 servers are required (by +different hosters), which need to be synchronized.
  • +
+ +

Summary: a centralized Internet server currently is out of range. If someone wants +to start a company providing such a service, feel free to use KeePass as base +application (of course respect the Open Source terms).

+ +

But what can and probably will be done later is a local intranet KeePass server (for +companies for example). +Employees could log in to the company's password server and use it. But a centralized Internet +server – no chance.

+ + + diff --git a/src/Docs/Chm/help/base/faq_tech.html b/src/Docs/Chm/help/base/faq_tech.html new file mode 100644 index 0000000..8790a05 --- /dev/null +++ b/src/Docs/Chm/help/base/faq_tech.html @@ -0,0 +1,766 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Technical FAQ - KeePass + + + + + + + + + + + + + +

Technical FAQ

+

Frequently Asked Questions about the usage of KeePass.

+ +
+Configuration: + + +Installation / Integration: + + +Security: + + +Usage: + + +
+ + +

+I've saved my options, but when I reopen KeePass I get the old options. What's wrong?

+ +

KeePass supports two different locations for storing configuration information: +the global configuration file in the KeePass directory and a local, user-dependent +one in the user's private configuration folder. Most likely you do not have write +access to your global configuration file.

+ +

For more details, see + +Configuration.

+ +
+ + + + +

+Why doesn't KeePass 2.x run on my computer?

+ +

Symptoms: When trying to run KeePass 2.x on Windows ≤ XP, +an error message like the following is displayed:
+"A required .DLL file, MSCOREE.DLL, was not found" or
+"The application failed to initialize properly (0xc0000135)".

+ +

Cause: KeePass 2.x requires Microsoft .NET Framework ≥ 2.0.

+ +

Resolution: Install Microsoft .NET Framework 2.0 or higher. +It is available as a free download from the Microsoft website: + +Microsoft .NET Framework. +Alternatively, you can install it through +Windows Update (the framework is an optional component).

+ +

KeePass 1.x does not require this framework.

+ +
+ + +

+Why does KeePass 2.x crash when starting it from a network drive/share?

+ +

Symptoms: When trying to run KeePass 2.x from a network drive/share, +you get an error message like the following:
+"Application has generated an exception that could not be +handled" or
+"KeePass has encountered a problem and needs to close".

+ +

Cause: The strict default security policy by the Microsoft .NET +Framework disallows running .NET applications from a network drive/share.

+ +

Recommended resolution: Copy/install KeePass 2.x onto a local hard +disk, and run the copy.

+ +

Alternative, not recommended resolution: +Configure the security policy to allow running .NET applications from +network drives/shares. Ask your administrator to do this (administrative +rights are required). If you have administrative rights and want to do +it yourself, you can use the + +Code Access Security Policy Tool (Caspol.exe) +that ships with the .NET framework (helpful instructions can be found + + +here and + + + +here).

+ +
+ + +

+Does KeePass 2.x use FIPS-validated algorithm implementations?

+ +

KeePass uses many algorithms. This FAQ answer focuses on the algorithms +used for encrypting/decrypting a database file. +Typically, KeePass primarily uses AES-256, SHA-256, HMAC-SHA-256 and SHA-512 +here (unless the user has specified a different +encryption algorithm or a different +key derivation function in the +database settings). +For these algorithms, the .NET Framework provides classes, and KeePass +uses these.

+ +

Since version 4.8, the .NET Framework supports using FIPS-validated +implementations of the algorithms above +(see 'What's new in .NET Framework 4.8').

+ +

For compatibility with older .NET Framework versions, KeePass ignores +the FIPS mode by default. If all your PCs have the .NET Framework 4.8 or higher +installed, you can enable the usage of FIPS-validated algorithm +implementations by opening the 'KeePass.exe.config' file using a text editor +and deleting the line +'<enforceFIPSPolicy enabled="false" />'.

+ +

Implementations of other algorithms (such as ChaCha20 and Argon2) are not +FIPS-validated. If Microsoft provides validated implementations of those +algorithms in the future, we will consider using them.

+ +
+ + + +

+Why doesn't the CHM help file work?

+ +

Symptoms: When trying to open the KeePass CHM help file from +a remote computer or shared network drive, it's not displayed correctly +(navigation aborted, ...).

+ +

Solution: See + + +Microsoft Security Bulletin MS05-026.

+ +
+ + +

+Where can I find more application icons for Windows shortcuts?

+ +
+ + +
+Application icons are icons in Windows ICO format. They can be used in +Windows shortcuts and/or as file association icons. The KeePass executable +contains various application icons which can be used for these purposes.
+
+Additional application icons are available from the "Ext/Icons_*" +directories of the KeePass source code package. +Most of them, shown at right, are slight variations of the main KeePass icon.
+
+Even more, contributed icons (by users) can be found on the +plugins page.
+
+If you have multiple KeePass databases, you can use differently colored KeePass +application icons in order to distinguish them.
+
+These icons are not included in the binary distribution because this would make +the application file too large.

+
+Application Icons +
+ +
+ + +

+How can I add more client icons for password entries?

+ +
+ + +
+Client icons are the icons used for password entries and groups within KeePass. +Each entry can be assigned its own icon.
+
+ + + +You can import your own icons into KeePass databases. For this, click the 'Add...' +button in the icon picker dialog.
+
+Supported formats are BMP, EMF, GIF, ICO, JPEG, PNG, TIFF and WMF. + +
+
+Client Icons +
+ +
+ + +

+Does KeePass support a mini mode?

+ +
+ + + + + + + +Functions can be blocked/enforced using an enforced configuration file. + + +

+ + +

+Why doesn't KeePass lock after Auto-Type?

+ +
+ + + + + + +This does not apply to KeePass 2.x. + + +

+ + +

+Why doesn't Auto-Type work correctly on Polish systems?

+ +

On Polish systems, the default auto-type hot key +Ctrl+Alt+A +conflicts with a system command and is frequently used in typing. +Therefore, auto-type is often executed accidentally.

+ +

The global auto-type hot key can be changed to a different key combination +in the KeePass options (see +Auto-Type for details).

+ +
+ + + +

+Why doesn't printing work in KeePass 1.x?

+ +

Symptoms: When trying to print a password list in KeePass 1.x, +nothing happens after clicking OK in the 'Print Options' dialog.

+ +

Cause: KeePass 1.x uses the application associated with .html +files to print the password list. If this application doesn't support the +"print" shell verb (like Mozilla Firefox), nothing happens.

+ +

Resolution: Associate .html files with a different +application that supports the "print" shell verb (like Internet Explorer).

+ +

Alternative Resolution / Workaround: +Click 'File' → 'Print Preview' in KeePass 1.x and +manually print the document in the application that just opened the file.

+ +
+ + + +

+Why does KeePass try to connect to the Internet?

+ +

KeePass has an option to automatically check for updates on each program start. +In order to check for updates, KeePass downloads a small version information +file and compares the available version with the installed version. +No personal information is sent to the KeePass web server.

+ +

Automatic update checks are performed unintrusively in the background. +A notification is only displayed when an update is available. Updates are not +downloaded or installed automatically.

+ +

The option is disabled by default. You can enable/disable it in +'Tools' → 'Options' → tab 'Advanced'.

+ +
+ + +

+Does the GUI support dark themes?

+ +

Yes. KeePass supports all system themes, including dark ones.

+ +
    +
  • On Windows 11, a (dark) theme can be selected in the +Windows Settings → 'Accessibility' → 'Contrast themes'.
  • +
  • On Windows 10, a (dark) theme can be selected in the +Windows Settings → 'Ease of Access' → 'High contrast'.
  • +
  • On Windows 7, 8 and 8.1, a (dark) theme can be selected in the +Windows Control Panel → 'Appearance and Personalization' → 'Personalization'.
  • +
+ + +

Example (Windows 11, 'Dusk' theme):

+ +
+Dark Master Key Prompt Dialog +
+ +

Option 'Choose your (default app) mode' → 'Dark'.
+Windows 11 has an option 'Choose your mode' (on Windows 10, it is called +'Choose your default app mode'), which can be set to 'Dark'. +Note that this option applies to UWP apps only, not to regular Windows applications. +Windows allows the UWP option to contradict the system theme +(e.g. a light system theme may be active even when the UWP option is set to 'Dark'). +KeePass is a regular Windows application, not a UWP app, +thus it follows the system theme, not the UWP option. +This is the expected behavior; KeePass does not have anything to do +with UWP options.

+ +

Custom appearance.
+If you want to change KeePass' appearance independent of the active +system theme, you might be interested in the +KeeTheme plugin.

+ +
+ + +

+How to change the GUI font (size)?

+ +

KeePass uses the default graphical user interface (GUI) font that has +been specified in the operating system settings. +So, if you want to change the font (especially the size of the font) +that KeePass uses, change it globally.

+ +
    +
  • On Windows 11, the font size can be changed in the Windows Settings → +'System' → 'Display' → 'Scale & layout' → +option 'Scale'. +Restart Windows after changing this option.
    +Warning +Do not use the option 'Text size' (in the +Windows Settings → 'Accessibility' → 'Vision'), +because this option does not scale all texts properly.
  • + +
  • On Windows 10, the font size can be changed in the Windows Settings → +'System' → 'Display' → 'Scale & layout' → +option 'Change the size of text, apps, and other items'. +Restart Windows after changing this option.
    +Warning +Do not use the option 'Make text bigger' (in the +Windows Settings → 'Ease of Access' → 'Display'), +because this option does not scale all texts properly.
  • + +
  • On Windows 7, 8 and 8.1, the font size can be changed in the +Windows Control Panel → 'Appearance and Personalization' → 'Display'.
  • + +
  • On Linux systems with KDE 5 or higher, the font can be +changed in the system settings → 'Fonts'.
  • + +
  • On Linux systems with GNOME 3 or higher, the font can be +changed using GNOME Tweaks → 'Fonts'.
  • +
+ +

In addition to supporting these system settings, KeePass allows +to customize the fonts that are used in lists and for passwords +(in the options dialog; these settings affect KeePass only, +no other applications).

+ + + +
+ + +

+Is Auto-Type keylogger-safe?

+ +

Is the Auto-Type feature resistant to keyloggers?

+ + + + + + +By default: no. The Auto-Type method in KeePass 2.x works the same as the one in +1.x and consequently is not keylogger-safe.
+
+However, KeePass features an alternative method called +Two-Channel Auto-Type Obfuscation (TCATO), +which renders keyloggers useless. This is an opt-in feature (because it +doesn't work with all windows) and must be enabled for entries manually. +See the TCATO documentation for details.
+ + +

+ + +

+Can Auto-Type locate child controls?

+ +

No. Auto-Type only checks whether the title of the currently active top level +window matches.

+ +

Browsers like Mozilla Firefox completely draw the window (all controls) +themselves, without using standard Windows controls. Consequently it is +technically impossible for KeePass to check whether a URL matches (methods +like creating a screenshot and using optical character recognition +are not reliable and secure). Also, it's impossible to check which child +control currently has the focus. These problems can only be avoided by using +browser integration plugins, i.e. not using auto-type at all.

+ +

The user must make sure that the focus +is placed in the correct control before starting auto-type.

+ +
+ + +

+Could you add the ... encryption algorithm to KeePass?

+ +
+ + + + + + +AES (Rijndael) and ChaCha20 are supported. +There exist various +plugins +that provide support for additional encryption algorithms, +including but not limited to Twofish, Serpent and GOST.
+
+If you'd like to implement an algorithm, have a look at the ArcFourCipher sample plugin. + + +

+ + +

+Why doesn't KeePass lock while a sub-dialog is open?

+ +

KeePass has various options to lock its workspace automatically +(after some time of inactivity, when the computer gets locked or the user +is switched, when the computer gets suspended, etc.). +However, the workspace is not locked automatically while a sub-dialog +(like the 'Edit Entry' dialog) is open.

+ +

To understand why this behavior makes sense, it is first important to know what happens +when the workspace gets locked. When locking, KeePass completely closes the database +and only remembers several view parameters, like the last selected group, the top visible +entry, selected entries, etc. From a security point of view, this achieves the best +security possible: breaking a locked workspace is equal to breaking the database itself.

+ +

Now back to the original question. Let's assume a sub-dialog is open and +one of the events occurs that should automatically lock the workspace. +What should KeePass do now? +In this situation, KeePass cannot ask the user what to do, +and must make an automatic decision. There are several possibilities:

+ +
    +
  • Do not save the database and lock.
    +In this case, all unsaved data of the database would be lost. This not only applies to +the data entered in the current dialog, but to all other entries and groups +that have been modified previously.
  • + +
  • Save the database and lock.
    +In this case, possibly unwanted changes are saved. Often you open files, try something, +having in mind that you can just close the file without saving the changes. +KeePass has an option 'Automatically save database when KeePass closes or the workspace +is locked'. If this option is enabled and no sub-dialog is open, it's clear what to do: +try to save the database and if successful: lock the workspace. But what to do with +the unsaved changes in the sub-dialog? Should it be saved automatically, taking away the +possibility of pressing the 'Cancel' button?
  • + +
  • Save to a temporary file and lock.
    +This appears to be the best alternative at first glance, but there are several problems with +it, too. First of all, saving to a temporary file could fail (for example, there could be too +few free disk space, or some other program like a virus scanner could block it). +Secondly, saving to a temporary file isn't uncritical from a security point of view. +When having to choose a location, typically the user's temporary directory on the hard +disk is chosen (because it likely has enough free space, required rights for access, etc.). +KeePass databases could be leaked and accumulated there. +It's not clear what should happen when the computer is being shutdown or crashes while being +locked. When the database is opened the next time, should it use the database stored in +the temporary directory instead? What should happen if the 'real' database has been modified +in the meanwhile (a quite realistic situation if you're carrying your database on an +USB stick)?
  • +
+ +

Obviously, none of these alternatives is satisfactory. +Therefore, KeePass implements the following simple and easy to understand behavior:

+ +

KeePass doesn't lock while a sub-dialog is open.

+ +

This simple concept avoids the problems above. The user is responsible for the +state of the program.

+ + + +

Note that opening a sub-dialog is typically only required for +editing something; it is not required for using +entries, as the main window provides +various methods for this.

+ +

Locking when Windows locks. +On Windows XP and older, the Windows service 'Terminal Services' +should be enabled. If this service is disabled, locking KeePass +when Windows locks might not work. This service isn't required on newer +operating systems.

+ +
+ + +

+Printing creates a temporary file. Will it be erased securely?

+ +

KeePass creates a temporary HTML file when printing password lists and showing +print previews. This file is securely deleted when closing the database.

+ +

You must wait for the file being printed completely before closing KeePass +(and close the print preview before closing KeePass), otherwise it could happen +that the printing application blocks KeePass from deleting the file.

+ +

There is no way around the temporary file in the current printing system. +If you want to write a plugin that directly sends the data to the printer, you can +find a plugin development tutorial here: +KeePass 2.x Plugin Development.

+ +
+ + + + +

+Why the estimated quality of a password suddenly drops?

+ +

For estimating the quality/strength of a password, KeePass not only uses +statistical methods (like checking which character ranges are used, +repeating characters and differences), it also has a built-in list of +common passwords and checks for patterns. When completing a common password or a +repetition, the estimated quality can drop.

+ +

Details can be found on the +Password Quality Estimation help page.

+ +
+ + +

+How to store and work with large amounts of (formatted) text?

+ +
+ + + + + + + + +
+KeePass has a built-in editor that allows working conveniently with +large amounts of (formatted) texts.
+
+To add a large text to an entry, import the file as attachment +(or click 'Attach' → 'Create Empty Attachment'). +The built-in editor supports *.TXT (simple text) and *.RTF (formatted text) files.
+
+In order to edit an attachment, right-click onto the entry in the main window, +point on 'Attachments' and click 'YourFile.*'. Alternatively, +if the text file +is the only attachment, you can open it by just double-clicking onto +it in the main window (enable showing the attachment column in 'View' → +'Configure Columns' → 'Attachments'). Alternatively, it's also possible to click the name of +the attachment in the entry details view in the main window.
+
+For TXT files, the built-in editor supports standard operations like cut, +copy, paste, undo, word wrap, etc. For RTF files, additionally standard formatting +commands are available: choosing the font, font size, bold, italic, underline, +strikeout, text and background colors, align left/center/right, etc. +
+ +
+ + +

+ + +

+Can an e-mail address field be added?

+ +

A few times it has been requested that a standard entry field for e-mail addresses +is added (on the main tab page in the entry editing dialog). +The short answer: an e-mail address field will not be added +due to usability reasons. Now the long answer.

+ +

First of all, let's assume that most of the entries stored in KeePass +contain information for logging in to websites. +When you register an account for a website, you often have to specify a +user name as well as an e-mail address. When you regularly +log in later, you usually only need to provide either user name + password +or e-mail + password (never user name + e-mail + password). +Here the first part (which is either user name or e-mail) serves as +identification: you tell the website who you are. +The second part (password) provides authentication: you prove to the +website that you're really the one who you claim to be.

+ +

There are various methods how KeePass can transfer data to +other applications. All of these methods by default assume that the content +of the user name field is used for identification. For example, +the default auto-type sequence of +an entry is +{USERNAME}{TAB}{PASSWORD}{ENTER}, the default +KeeForm +configuration uses the user name, etc. +Now on the one hand some websites require an e-mail address instead +of a user name. On the other hand we want the default data transfer configuration +to work for most websites (such that the work that the user has to put +into the configuration is kept minimal and only needed for +websites using special login forms).

+ +

The solution is simple: instead of interpreting the 'User Name' field +strictly as a field containing a user name, users should rather interpret +it as a field in which the data required for identification is stored. +This data can consist of a user name, an e-mail address or something else +(e.g. an account number for an online banking website). +By handling it like this, the default data transfer configuration will work for most +websites, i.e. zero amount of work needs to be put into +the configuration. +If you had to provide both a user name and an e-mail address at +registration time, the other information (which isn't required +on a regular basis) can be stored e.g. in +the notes field or a custom string field of the KeePass entry.

+ +

Now assume a separate e-mail field would be added. +When users store both a user name and an e-mail address, +KeePass cannot know which of the two is required for identification. +So, in order to setup data transfer for the entry, users would be forced +to choose which of the two fields should be used.

+ +

So, adding an e-mail field would be a step back in usability, +because it forces users to put additional time into data transfer configuration. +The current system ('User Name' containing identification information, +without a separate e-mail field) doesn't require this, and thus is +the better solution.

+ +

For users that are willing to manually configure the data transfer for each +entry, there are multiple ways to get a separate e-mail address field. +After switching to the 'Advanced' tab in the entry editing dialog, +an e-mail address field can be added as custom string. +If the field should appear on the main tab page of the dialog, the +KPEntryTemplates plugin can be used.

+ + + diff --git a/src/Docs/Chm/help/base/fieldrefs.html b/src/Docs/Chm/help/base/fieldrefs.html new file mode 100644 index 0000000..24a9441 --- /dev/null +++ b/src/Docs/Chm/help/base/fieldrefs.html @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Field References - KeePass + + + + + + + + + + + + +

Field References

+

How to put references to data in fields of other entries.

+ + + +
+ + +

+Introduction

+ +

KeePass can insert data stored in different +entries into fields of an entry. +This means that multiple entries can share a common +field (user name, password, ...), and by changing the actual data entry, +all other entries will also use the new value.

+ +

To create a field reference, you can either use the +convenient field references wizard (in the entry editing window, +click the 'Tools' button at the bottom left and select +'Insert Field Reference'), or insert the placeholder manually +(see the syntax below).

+ +

Note that field references are intended for referencing data stored +in different entries. If you want to insert data from the +same/current entry, you should use local placeholders, like +{TITLE} and {S:FieldName}; +see Placeholders.

+ +
+ + +

+Placeholder Syntax

+ +

The placeholder syntax for field references is the following:

+ +

{REF:<WantedField>@<SearchIn>:<Text>}

+ +

The WantedField and SearchIn parts need to be replaced by +1-letter codes identifying the field:

+ + + + + + + + + + + +
CodeField
TTitle
UUser name
PPassword
AURL
NNotes
IUUID
OOther custom strings (KeePass 2.x only)
+ +

The Text part is the search string, which describes the text(s) +that must occur in the specified field of an entry to match.

+ +

If multiple entries match the specified search criterion, the first +entry will be used. +To avoid ambiguity, an entry can be identified by its UUID, which is unique. +Example: +{REF:P@I:46C9B1FFBD4ABC4BBB260C6190BAD20C} would insert the +password of the entry having 46C9B1FFBD4ABC4BBB260C6190BAD20C as UUID.

+ + +Referencing fields of other entries only works with standard fields, not +with custom user strings. +If you want to reference a custom user string, you need +to place a redirection in a standard field of the entry with the custom string, +using {S:<Name>}, +and reference the standard field.
+
+Custom strings can locally (i.e. within an entry) be referenced using +{S:<Name>}, +see the page Placeholders for details.
+
+You can use the O code to make KeePass search the database for +custom string fields (to identify the referenced source entry), +but O cannot be used to retrieve data from custom fields (i.e. the +code can't be used as WantedField). + + +
+ +
+ + +

+Example

+ +

Let's assume you have two entries: one with title "Example Website" +and one with "Example Forum", and you want to insert the user name +of the website account into the URL of the forum entry. Within the forum entry's +URL, you could reference the user name like this:
+https://forum.example.com/?user={REF:U@T:Example Website}

+ + + diff --git a/src/Docs/Chm/help/base/firststeps.html b/src/Docs/Chm/help/base/firststeps.html new file mode 100644 index 0000000..5fe16bc --- /dev/null +++ b/src/Docs/Chm/help/base/firststeps.html @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + First Steps Tutorial - KeePass + + + + + + + + + + + + + +

First Steps Tutorial

+

A short tutorial showing you the basic usage of KeePass.

+ +

This short tutorial will show you how to actually use KeePass. It describes +only the basic usage, advanced features are covered on separate pages.

+
+ +

Creating a new database

+ +

The very first step is creating a new password database. KeePass will store all +your passwords in such a database. To create one, click +'File' → 'New...' in the main menu or click the leftmost toolbar button. +A window will appear, which prompts you for a master password and/or key file. +The database will be encrypted with the password you enter here. The password +you enter here will be the only password you'll ever have to remember from on +now. It should be long and built up of mixed characters. Keep in mind that when +someone gets your database file and guesses the password, he could access all +passwords you stored in the database.

+ +

For this tutorial, we'll just use a password, not a key file. Click into the password edit +field and enter a password of your choice. The password edit control isn't limited in length, so +feel free to even enter a whole sentence (just keep in mind that you'll need to +remember it).

+ + + + + + +After clicking [OK], a second dialog appears. In this dialog you can configure +some generic database properties. For now, just leave everything as it is and +click [OK]. + + +

Now you see the main window. On the left, you see the entry groups. On the +right, you see the actual password entries. The password entries are +grouped together into the password groups you see on the left. So, depending +on which group on the left you selected, it'll show you the entries in this group +in the right view. KeePass has created a few default groups for you, but you're +totally free to delete them and create your own ones.

+
+ +

Adding an entry

+ +

Time to store your very first password in the KeePass database! Right-click +into the right password entry view and choose 'Add Entry...'. A window +will pop up. In this window you can now edit your entry: enter a title for +it, a user name, a URL, the password, etc. If you don't need some of the +fields, just leave them empty. When you're done, click [OK].

+
+ +

Using entries

+ +

Your new entry is displayed in the +main entry list now. +There are various ways how you can use it.

+ +

For example, you can copy the user name of the entry into the clipboard. +In order to invoke the 'Copy User Name' command, double-click onto the +user name cell in the main entry list. +Alternatively, the command can be invoked via the main menu, +the context menu, the toolbar button, or by pressing +Ctrl+B. +When the user name is in the clipboard, you can paste it into the +target window.

+ +

Copying passwords and other fields works analogously.

+ +

Alternatively, you can drag&drop fields into other windows. +For details, see Drag&Drop.

+
+ +

Saving the database

+ +

It's time to save your database. Click onto the 'Save' toolbar button +(which has a disk icon).

+
+ +

More

+ +

That's it! You've made the first steps in using KeePass! You can now have a look +at the more advanced features of KeePass.

+ +

Passwords and Key Files: In the tutorial above we've encrypted +the database using a password. But KeePass also supports key files, i.e. you can +lock your database using a file (which you can carry around on your USB stick +for example). It even supports combining those two methods for maximum security.

+ +

TAN Entries: TAN entries are one-time passwords. Many +banks are using TANs for better security. KeePass supports TAN entries, by +making them expire automatically when using them.

+ +

Auto-Type: The auto-typing functionality is a very +powerful feature. In the tutorial above you've copied the user name and password +of an entry to the clipboard. Wouldn't it be nice if KeePass would just type +those strings for you into other windows? Wouldn't it be nice if you could define +whole sequences of keypresses that KeePass should type for you? That's exactly +what the auto-type feature does: it sends simulated keypresses for you to +other windows!

+ +

URL Field: The URL field supports URLs +of course. In the tutorial, you've learned that you can enter simple URLs into +this field and KeePass will open the browser window for you. But the URL field +can do more! It actually supports many different protocols (not just http) +and supports executing +Windows command lines through the cmd:// virtual protocol. The +field also features a powerful substitution engine, replacing codes +by other fields (user name, password, ...) of this entry.

+ +

Command Line Parameters: You can open .kdb(x) files by +passing the file name to the KeePass executable file. But did you know that you can +also send the password for the database and key file location over the command line? +You can also use the command line to preselect a key file for you.

+ + + + +

Plugins: + + +KeePass features a powerful plugin architecture. +If you miss some functionality, have a look at the plugins page to see if there +are other people that have already written plugins for this. Many plugins exist +to import/export data from/to other file formats.

+ + + diff --git a/src/Docs/Chm/help/base/importexport.html b/src/Docs/Chm/help/base/importexport.html new file mode 100644 index 0000000..1b323d3 --- /dev/null +++ b/src/Docs/Chm/help/base/importexport.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Import / Export - KeePass + + + + + + + + + + + + + + + + +

Import / Export

+

KeePass supports importing/exporting data from/to various file formats.

+ +

KeePass 1.x supports importing data from CSV files (special form), +CodeWallet, Password Safe, and Personal Vault.

+ +

KeePass 2.x supports importing data from CSV files (all), +KeePass 1.x (KDB, XML and CSV), KeePass 2.x XML, +1Password, +1Password Pro, 1PW, Alle meine Passworte, +Any Password, Bitwarden, CodeWallet, Dashlane, +DataVault, DesktopKnox, Enpass, +FlexWallet, Google Chrome, Handy Safe, Handy Safe Pro, +Kaspersky Password Manager, KeePassX, Keeper, +Key Folder, LastPass, +Mozilla Bookmarks, mSecure, Network Password Manager, +Norton Identity Safe, nPassword, PassKeeper, +Passphrase Keeper, Password Agent, +Password Depot, Password Exporter, +Password Keeper, Password Memory, Password Prompter, +Password Safe, Password Saver, Passwords Plus, +Passwort.Tresor, Personal Vault, +PINs, Revelation, RoboForm, SafeWallet, +Security TXT, SplashID, Steganos Password Manager, +Sticky Password, True Key, TurboPasswords, VisKeeper, +Whisper 32, ZDNet's Password Pro, and Spamex.com.

+ +

For both KeePass 1.x and 2.x, there are plugins available that +add more import/export capabilities.

+ + + +
+ +

Unfortunately there isn't any standard password database format. Every password +manager uses its own file format. Anyway, almost all support exporting to CSV or XML +files. This sounds good at first glance, but CSV and XML files aren't specialized password +database formats, they only specify a low-level layout of the stored data (for CSV: data fields +are separated by commas; for XML: hierarchical form using tags). These formats do not +specify the high-level arrangement of the data (for CSV: order/meaning of the fields; for +XML: tag names and structure). Because of this, many users are confused when application #1 +exports data to CSV/XML and application #2 can't read the CSV/XML file, although it claims +that it can read those files.

+ +

This help page details the expected CSV and XML file formats. Knowing the formats which +KeePass expects, you can reformat CSV and XML files exported by other password managers to +match the KeePass formats. CSV files can be reformatted using e.g. LibreOffice Calc +(see below). +XML files can be reformatted using an XML editor.

+ +

KeePass can import many password database formats directly (see top of this page). +Additionally, there are specialized KeePass +plugins available +for importing more formats (like AnyPassword CSV, Oubliette files, PINs TXT, ZSafe files, +and many more). Using these plugins, you don't need to manually reformat the output of +other password managers; you can directly import the exported files.

+ +

If no import plugin exists for importing data from your previous password manager, +feel free to post a request for it in the +KeePass Feature Requests Tracker +or in the +Open +Discussion forum.

+ +
+ + +

+File Format: CSV (KeePass 1.x)

+ +

KeePass imports and exports data from/to CSV files in the following format:

+ +

"Account","Login Name","Password","Web Site","Comments"

+ +

The 'Account' field in a CSV file corresponds to the title field of +a KeePass entry, 'Login Name' corresponds to the user name, +'Web Site' corresponds to the URL, and 'Comments' correspond to the notes. +The CSV field names differ from the KeePass entry field names +in order to ensure the compatibility with certain other applications.

+ +

For a detailed example, download this file: +ZIP Package +FileSample_CSV.zip. +This file is zipped only in order to ensure correct encoding (if not zipped, browsers or +download managers could automatically convert the file to a different encoding). When importing +a CSV file, it must not be zipped!

+ +

Important notes about the format:

+ +
    +
  • The file must be encoded using UTF-8 (Unicode). Other encodings are not supported.
  • +
  • CSV files only support the following fields: title, user name, password, URL and notes. +Other fields like last entry modification time, expiration time, icon, entry file attachments, +etc. are not supported. If you want to transfer such information, you have to use +a different format (like XML).
  • +
  • All fields must be enclosed in quotes ("). These quotes are mandatory, unquoted fields are not allowed.
  • +
  • Quotes (") in strings are encoded as \" (two characters). +Backslashes (\) are encoded as \\.
  • +
  • Multiline comments are realized through normal line breaks. Encoding line breaks +by \n is not supported.
  • +
+ +

Microsoft Excel by default does not enclose fields in quotes ("). +It is recommended that you use +LibreOffice Calc +to create a correct CSV file (see below), or use the Generic CSV Importer +of KeePass 2.x (import your CSV file into KeePass 2.x, then export the data to a +KeePass 1.x KDB file), or fix the CSV file by manually adding the quotes using a text editor.

+ +

If you want to transfer data between KeePass 1.x databases, you must +not change the default export options of KeePass. +Do not export additional fields or uncheck any options, otherwise +KeePass will not be able to re-import the CSV file, because it does not comply to the +specification above any more.

+ +

Using LibreOffice Calc to create a CSV file:
+LibreOffice Calc +can be used to create CSV files that can be imported correctly into KeePass. Follow these steps:

+ +
    +
  • Make sure you got 5 columns as described above.
  • +
  • Select everything, right-click and select 'Format Cells'. In the dialog, choose Text +as category. Click [OK].
  • +
  • Go 'File' → 'Save As...', choose a location and the +'Text CSV' file type, and make sure that the check box +'Edit Filter Settings' is enabled. Click the 'Save' button.
  • +
  • Choose 'Unicode (UTF-8)' as character set. The field separator must be set to a comma. +The text separator must be ". Make sure that the +'Quote all text cells' option is checked, and that the 'Fixed column width' +option is not checked. Click [OK].
  • +
+ +
+ + +

+File Format: XML (KeePass 1.x)

+ +

This section describes the KeePass 1.x XML format. Note that this format +is different from the XML format used by KeePass 2.x (anyway, KeePass 2.x +can import KeePass 1.x XML files).

+ +

You can download a detailed XML sample file here: +ZIP Package +FileSample_XML.zip. +This file is zipped only in order to ensure correct encoding (if not zipped, browsers or +download managers could automatically convert the file to a different encoding). When importing +a XML file, it of course must not be zipped!

+ +

Important notes about the format:

+ +
    +
  • The files must be encoded using UTF-8 (Unicode). Other encodings are not supported.
  • +
  • The following five entities must be encoded: < > & " '. They are encoded +by &lt; &gt; &amp; &quot; &apos;.
  • +
  • The UUID is a hex-encoded 16-byte string (i.e. an 32 ANSI hex +character string in the XML file). It +is unique (also across multiple databases) and can be used to identify entries.
  • +
  • Dates/times are encoded in the standard date/time XML format (YYYY-MM-DDTHH:mm:ss): +first the date in form YYYY-MM-DD, a 'T' character, and the +time in form HH:mm:ss.
  • +
+ +
+ + +

+Generic CSV Importer

+ +

KeePass 2.x features a generic CSV importer. +This tool can import almost all CSV formats. The CSV +files are loaded and you can manually specify the encoding / character set, assign columns +to data fields, and specify how the low-level structure looks like (usage of quotes, etc.).

+ +

To start the generic CSV file importer, click 'File' → 'Import' and +choose 'Generic CSV Importer'.

+ +
+ +
+ +

Details about the generic CSV importer (with descriptions of the +options, examples, etc.) can be found on the +Generic CSV Importer help page.

+ +
+ + +

+How to Import CodeWallet TXT

+ +

CodeWallet is a password manager that supports different card types (fields). +KeePass cannot know which of the CodeWallet fields correspond to the KeePass +standard fields (title, user name, ...), because they don't have fixed names (language-dependent, +user-customizable, ...). +Therefore all fields from the CodeWallet file are imported into custom string fields +of KeePass entries. After importing the file, you can move some of the strings +to the correct standard fields (by clicking the 'Move' button on the second tab page +of the entries dialog.

+ +
+ + + + +

+How to Import PINs TXT

+ +

In order to successfully import a PINs TXT file, you need to do the following:

+ +
    +
  • Switch PINs language to 'English'.
  • +
  • In PINs export dialog: Enable all fields.
  • +
  • In PINs export dialog: Set separator to 'tab'.
  • +
  • In PINs export dialog: Enable 'Quote texts'.
  • +
+ +

After exporting a TXT file using the settings above, import it using +'File → Import' in KeePass 2.x.

+ +
+ + +

+How to Import Data from RoboForm

+ +
    + +
  1. Export your logins to a HTML file. To do this, open +RoboForm's Passcard Editor ('Edit Passcards' or 'RoboForm Editor' +in the Windows start menu) +and in the editor's main menu go 'Passcard''Print List' +(in newer versions you have to click the 'RoboForm' button and go +'Print List''Logins'). In the +dialog that opens, click the 'Save' button. Choose a location and file name, +and click 'Save'.
  2. + +
  3. Open your KeePass 2.x database file and go 'File''Import'. +Choose 'RoboForm HTML' as format and select the HTML file you just exported, +then click 'OK'.
  4. +
+ +
+ + +

+How to Import Data from Steganos Password Manager 2007

+ +

Warning! It is possible that the transfer fails and that KeePass accidently +overwrites your existing passwords in Steganos Password Manager. Therefore, back up your +SEF file before starting the import! In any case you should restore your passwords by +restoring the backup you just created after the import process! Even if you think +KeePass hasn't changed anything, restore from the backup!

+ +

Unfortunately Steganos Password Manager (SPM) lacks any form of export functionality. As the +SEF file format (in which the data is stored) is proprietary and no specification +is available, KeePass needs to try to get all the data out of the windows of +SPM.

+ +

The import process works as follows. First you start SPM and open your password +database. The main password management window should be open (i.e. the one which lists +your items in the middle of the screen, and got toolbar-like buttons at the top). Make +sure that all your items are displayed in the list (select the correct filter in +the combobox above the item list).

+ +

Now switch to KeePass 2.x and open your KeePass database. Go File → Import and +choose Steganos Password Manager 2007. Click [OK]. Now read the rest before continuing.

+ +

After pressing the [Yes] button in the KeePass import confirmation dialog, you got +10 seconds to switch to the SPM window. Select the very first entry within the SPM window +(but do not open it, just select it). This is important! The first entry must have the +keyboard focus and must be selected.

+ +

When the 10 seconds are over, KeePass will start importing. You will see how +KeePass opens the SPM items, copies the data, closes the item's window, select the +next item, etc. Everything goes automatic now and you can just sit back and watch. +Sometimes Windows playes a ding sound, this is normal.

+ +

Note that it can take quite some time to import your items. Do not do +anything while KeePass is importing! One single mouse click or keypress can ruin the +complete import process.

+ +

The last item will be scanned twice. When completed, KeePass will +show a message "The import process has finished!".

+ +

It is possible that KeePass failed to import some items (mainly caused by SPM's +unpredictable slow response times). It is highly recommended that you compare each of +the entries.

+ +
+ + +

+How to Import Data from PassKeeper 1.2

+ +

The import process works visually, exactly like the import method for +Steganos Password Manager data. Please read all instructions in +How to Import Data from Steganos Password Manager 2007.

+ +
+ + +

+How to Import 1PW and 1Password Pro CSV

+ +

KeePass can import CSV files exported by 1PW and 1Password Pro. +When exporting the data, make sure:

+ +
    +
  • Choose the tabulator (Tab) as field separator.
  • +
  • The option for enclosing fields in quotes must be enabled.
  • +
  • All fields must be exported, in the original order.
  • +
+ +
+ + +

+Export: Option 'Additionally Export Parent Groups'

+ +

In KeePass 2.x, there is an option 'Additionally export parent groups' +in the export dialog. +If this option is turned on, the parent groups of the selected groups/entries +are exported, too (all up to the root group of the database). +Unselected groups/entries in parent groups are not exported.

+ +

If the selected file format does not support groups, the option +has no effect. +When exporting the whole database (via 'File' → 'Export') or the +root group, the option is disabled, because the root group has no parent +group.

+ +

Properties of the parent groups (icons, notes, auto-type settings, etc.) +are exported, if the selected file format supports them. +When importing a file, the properties of the groups in the current database +may be overwritten by the properties of the groups in the file +(depending on the import mode and the last modification times).

+ +

Example. +Assume that the user selects the entry 'Entry B' that is stored in +the groups 'Group 1' → 'Group 1.2' of a database.

+ +
+ + + + + + + + + + + +
Root Group
Group 1
Group 1.1
Group 1.2
Group 2
+  + + + + + + + + + + + + +
TitleUser NamePasswordURLNotes
Entry AMichael42********https://example.net/None.
Entry BMichael42********https://example.com/None.
Entry CMichael42********https://example.org/None.
+
+ +

Exporting the selected entry (via 'Entry' → 'Data Exchange' → +'Export Entry') to a KDBX database file without turning on the option results in:

+ +
+ + + +
Root Group
+  + + + + +
TitleUser NamePasswordURLNotes
Entry BMichael42********https://example.com/None.
+
+ +

In contrast, exporting the selected entry to a KDBX database file with +the option turned on results in:

+ +
+ + + + + + + +
Root Group
Group 1
Group 1.2
+  + + + + +
TitleUser NamePasswordURLNotes
Entry BMichael42********https://example.com/None.
+
+ + + diff --git a/src/Docs/Chm/help/base/index.html b/src/Docs/Chm/help/base/index.html new file mode 100644 index 0000000..78acee5 --- /dev/null +++ b/src/Docs/Chm/help/base/index.html @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Help Center - KeePass + + + + + + + + + + + + + + + + + + +
+ + +

+KeePass Password Safe

+
+ +
+ + +

KeePass: Copyright © 2003-2023 Dominik Reichl. +The program is OSI Certified Open Source Software. +OSI Certified is a certification mark of the Open Source Initiative. +For more information, see the + + + +License page. + +

+ +

Introduction

+ + + + +Main Window Screenshot + + + +

Today, you have to remember many passwords. You need a password for a lot of +websites, your e-mail account, your webserver, network logins, etc. +The list is endless. +Also, you should use a different password for each account, because +if you would use only one password everywhere and someone gets this password, +you would have a problem: the thief would have access to all of your +accounts.

+ +

KeePass is a free open source password manager, which helps you to manage +your passwords in a secure way. You can store all your passwords in one +database, which is locked with a +master key. So you only have to remember one +single master key to unlock the whole database. Database files are +encrypted +using the best and most secure encryption algorithms currently known +(AES-256, ChaCha20 and Twofish).

+ +

The database consists of only one file, so it can be transferred +easily from one computer to another. +Data can also be imported/exported +from/to various other formats +(import from more than 40 different formats of other password managers, + +generic CSV importer, + +...). Of course, printing entries is supported, too.

+ +

KeePass supports groups, which allow you to organize your entries +conveniently. For quickly locating specific entries, there are search +functions.

+ +

There are various methods for transferring entry data (like user names +and passwords) from KeePass to other applications +(clipboard, +drag&drop, etc.). The powerful +auto-type feature can simulate keypresses.

+ +

KeePass has a strong password generator +(you can define allowed characters, length, generation rules, ...).

+ +

The program features a plugin architecture. Plugins can add features +in many areas (integration, transfer, backup, network, even more +import/export formats, and much more).

+ +

As KeePass is open source, +you can have a look at its full source code and check whether the security +features are implemented correctly.

+ +

This documentation applies to + + + +KeePass 2.x. + +

+ + + diff --git a/src/Docs/Chm/help/base/integration.html b/src/Docs/Chm/help/base/integration.html new file mode 100644 index 0000000..b550cd1 --- /dev/null +++ b/src/Docs/Chm/help/base/integration.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Integration - KeePass + + + + + + + + + + + + +

Integration

+

How KeePass integrates into your operating system environment.

+ + + +
+ + +

+Global Hot Key to Restore KeePass Window

+ +

To quickly switch back from an application to KeePass, you can use the +global hot key that restores the KeePass main window.

+ +

If you have multiple instances of KeePass running, pressing the global hot +key will restore the first instance that has been started.

+ +

The global hot key is Ctrl+Alt+K.

+ + + + + + +The hot key can freely be changed to a different key combination +(or disabled) in the 'Options' dialog, tab page 'Integration'. + + +

+ + +

+Limit to Single Instance Option

+ +

If you enable the 'Limit to Single Instance' option, at most one KeePass instance can +be running at a time. If you try to start a second KeePass instance, it is +immediately terminated, and the first instance is brought to +the foreground.

+ + + + + + +KeePass 2.x can open multiple databases in one instance/window (a tab bar appears, +which allows you to conveniently switch between the databases).
+
+When multiple databases are opened in one instance and you press the +global auto-type hot key, auto-type searches in all opened databases for +matching entries. Note that only exactly one KeePass instance can register +the global hot key; so when you disable the single instance option and +open databases in different instances, only the first instance searches +for matching entries when global auto-type is invoked, not the others. + + + + diff --git a/src/Docs/Chm/help/base/keys.html b/src/Docs/Chm/help/base/keys.html new file mode 100644 index 0000000..af79f3e --- /dev/null +++ b/src/Docs/Chm/help/base/keys.html @@ -0,0 +1,355 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Master Key - KeePass + + + + + + + + + + + + + + + + +

Master Key

+

Details about components of a master key.

+ + + +
+ +

Your KeePass database file is encrypted using a master key. +This master key can consist of multiple components: +a master password, a key file and/or a key that is protected +using the current Windows user account.

+ +

For opening a database file, all components of the +master key are required.

+ +

If you forget/lose any of the master key components (or forget the +composition), all data stored in the database is lost. +There is no backdoor and no universal key that can open your database.

+ +
+ + +

+Master Password

+ +

If you use a master password, you only have to remember one password or +passphrase (which should be good!) to open your database.

+ +

KeePass features a protection against brute-force and dictionary attacks; +see the security help page +for details.

+ +
+ + +

+Key File

+ +

A key file is a file that contains a key (and possibly additional data, +e.g. a hash that allows to verify the integrity of the key). +The file extension typically is 'keyx' or 'key'.

+ +

A key file must not be modified, otherwise you cannot open your database +anymore. If you want to use a different key file, open the dialog for +changing the master key (via 'File' → 'Change Master Key') +and create/select the new key file.

+ +

Two-factor protection. +A key file is something that you must have in order to be able +to open the database +(in contrast to a master password, which you must know). +If you use both a key file and a master password, you have a two-factor +protection: possession and knowledge.

+ +

Location. +As mentioned above, the idea of a key file is that you have +something. If an attacker obtains both your database file and your +key file, then the key file provides no protection. +Therefore, the two files must be stored in different locations. +For example, you could store the key file on a separate USB stick.

+ +

Hiding the location. +The key file content must be kept secret, not its location +(file path/name). +Trying to hide the key file (e.g. by storing it among +a thousand other files, in the hope that an attacker does not know which +file is the correct one) typically does not increase the security, because +it is easy to find out the correct file (e.g. by inspecting the last access +times of files, lists of recently used files of the operating system, +file system auditing logs, anti-virus software logs, etc.). +KeePass has an option for remembering the paths of key files, +which is turned on by default; turning it off typically just decreases +the usability without increasing the security.

+ +

Backup. +You should create a backup of your key file (onto an independent data +storage device). +If your key file is an XML file (which is the default), you can also create +a backup on paper (KeePass 2.x provides a command for printing a key file +backup in the menu 'File' → 'Print'). +In any case, the backup should be stored in a secure location, where only +you and possibly a few other people that you trust have access to. +More details about backing up a key file can be found in the +ABP FAQ.

+ +

Formats. +KeePass supports the following key file formats:

+
    +
  • XML (recommended, default). +There is an XML format for key files. +KeePass 2.x uses this format by default, i.e. when creating a key file +in the master key dialog, an XML key file is created. +The syntax and the semantics of the XML format allow to detect certain +corruptions (especially such caused by faulty hardware or transfer problems), +and a hash (in XML key files version 2.0 or higher) allows to +verify the integrity of the key. +This format is resistant to most encoding and new-line character changes +(which is useful for instance when the user is opening and saving the +key file or when transferring it from/to a server). +Such a key file can be printed (as a backup on paper), +and comments can be added in the file (with the usual XML syntax: +<!-- ... -->). +It is the most flexible format; new features can be added easily +in the future.
  • + +
  • 32 bytes. +If the key file contains exactly 32 bytes, these are used as +a 256-bit cryptographic key. +This format requires the least disk space.
  • + +
  • Hexadecimal. +If the key file contains exactly 64 hexadecimal characters +(0-9 and A-F, in UTF-8/ASCII encoding, one line, no spaces), +these are decoded to a 256-bit cryptographic key.
  • + +
  • Hashed. +If a key file does not match any of the formats above, +its content is hashed using a cryptographic hash function +in order to build a key (typically a 256-bit key with SHA-256). +This allows to use arbitrary files as key files.
  • +
+ +

Reuse. +You can use one key file for multiple database files. +This can be convenient, but please keep in mind that when an +attacker obtains your key file, you have to change the master keys +of all database files protected with this key file.

+ + + + + + +In order to reuse an existing key file, click on the 'Browse' button +in the master key creation dialog. + + +

+ + +

+Windows User Account

+ +
+ + + + + + +KeePass can make the database dependent on the current Windows user +account. If you enable this option, you can only open the database when +you are logged in as the same Windows user when creating the database.
+
+Warning +Be very careful with using this option. If your Windows user account +gets deleted, you won't be able to open your KeePass database anymore. +Also, when using this option at home and your computer breaks (hard disk +damaged), it is not +enough to just create a new Windows account on the new installation with the +same name and password; +you need to copy the complete account (i.e. SID, ...). This is not +a simple task, so if you don't know how to do this, it is highly recommended +that you don't enable this option. +Detailed instructions how to recover a Windows user account can be found here: +Recover Windows User Account Credentials +(a short technical tutorial can be found in a Microsoft TechNet article: + +How to recover a Vault corrupted by lost DPAPI keys).
+
+You can change the password of the Windows user account freely; +this does not affect the KeePass database. +Note that changing the password (e.g. a user using the Control Panel +or pressing Ctrl+Alt+Del +and selecting 'Change Password') and +resetting it to a new one (e.g. an administrator using a +NET USER <User> <NewPassword> +command) are two different things. +After changing your password, you can still open your KeePass database. +When resetting the password to a new one, access usually is not possible +anymore (because the user's DPAPI keys are lost), but there are exceptions +(for example when the user is in a domain, Windows can retrieve the user's DPAPI keys +from a domain controller, or a home user can use a previously created +Password Reset Disk). +Details can be found in the MSDN article + +Windows Data Protection and in the support article + + +How to troubleshoot the Data Protection API (DPAPI).
+
+If you decide to use this option, it is highly recommended not to rely +on it exclusively, but to additionally use one of the other two options (password +or key file).
+
+Protection using user accounts is unsupported on Windows 98 / ME. + + +

+ + +

+For Administrators: Specifying Minimum Properties of Master Keys

+ +

Administrators can specify a minimum length +and/or the minimum estimated quality that master passwords must have in +order to be accepted. You can tell KeePass +to check these two minimum requirements by adding/editing +appropriate definitions in the +INI/XML configuration file.

+ + + + + + +The value of the +Security/MasterPassword/MinimumLength node specifies +the minimum master password length (in characters). For example, by setting +it to 10, KeePass will only accept +master passwords that consist of at least 10 characters.
+
+The value of the +Security/MasterPassword/MinimumQuality node specifies +the minimum estimated quality (in bits) that master passwords must have. +For example, by setting it to 80, only master passwords +with an estimated quality of at least 80 bits will be accepted.
+
+The Security/MasterKeyExpiryRec node can be set to an +XSD date or an XSD duration (see +XSD Date and Time Data Types). +If the master key has not been changed since the specified date or +if the time span between now and the last master key change exceeds +the specified duration, KeePass recommends to change it. +This setting applies to all databases that are opened with this +KeePass instance; a master key expiry can also be configured for +each database individually (in 'File' → 'Database Settings' → +tab 'Advanced').
+
+By specifying KeyCreationFlags and/or KeyPromptFlags +(in the UI node), you can force states (enabled, disabled, +checked, unchecked) of key source controls in the master key creation and +prompt dialogs. These values can be bitwise combinations of one or more of +the following flags:
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Flag (Hex)Flag (Dec)Description
0x00Don't force any states (default).
0x11Enable password.
0x22Enable key file.
0x44Enable user account.
0x88Enable 'hide password' button.
0x100256Disable password.
0x200512Disable key file.
0x4001024Disable user account.
0x8002048Disable 'hide password' button.
0x1000065536Check password.
0x20000131072Check key file.
0x40000262144Check user account.
0x80000524288Check 'hide password' option/button.
0x100000016777216Uncheck password.
0x200000033554432Uncheck key file.
0x400000067108864Uncheck user account.
0x8000000134217728Uncheck 'hide password' option/button.
+ +
+The values of KeyCreationFlags and KeyPromptFlags +must be specified in decimal notation.
+
+For example, if you want to enforce using the user account option, you could +check and disable the control (such that the user can't uncheck it anymore) +by specifying 263168 as value (0x40000 + 0x400 = 0x40400 = 263168). + + + + diff --git a/src/Docs/Chm/help/base/license_lgpl.html b/src/Docs/Chm/help/base/license_lgpl.html new file mode 100644 index 0000000..6a14c2d --- /dev/null +++ b/src/Docs/Chm/help/base/license_lgpl.html @@ -0,0 +1,551 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + LGPL License - KeePass + + + + + + + + + + + + + +

LGPL License

+

GNU Lesser General Public License.

+ +
+ +
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+ + + diff --git a/src/Docs/Chm/help/base/multiuser.html b/src/Docs/Chm/help/base/multiuser.html new file mode 100644 index 0000000..a9cc905 --- /dev/null +++ b/src/Docs/Chm/help/base/multiuser.html @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Multiple Users - KeePass + + + + + + + + + + + + +

Multiple Users

+

Details about multi-user features of KeePass.

+ + + +
+ + +

+General Information about Shared Databases

+ +

Both KeePass 1.x and 2.x allow multiple users working with one database, +which is typically stored on a shared network drive or a file server.

+ +

All users use the same master password and/or key file to open the +database. There are no per-group or per-entry access control lists (ACLs).

+ +

In order to restrict write access to the database file (i.e. only a select +set of users may change the stored data), use file system access rights.

+ +
+ + +

+KeePass 1.x: Office-Style Locking

+ +
+ + + +
+With KeePass 1.x, a database can be stored on a shared network drive and used by multiple +users. When a user tries to open a database that is already opened by +someone else, a prompt asks whether to open the database in read-only +or normal mode (see image on the right).
+
+By opening a database in normal mode, the current user takes ownership +of the file (i.e. subsequent opening attempts will show the current user +as owner).
+
+KeePass 1.x does not provide synchronization, i.e. by saving the database you +are saving your current data to disk. If another user has changed an entry +in the meanwhile (i.e. since you loaded the database), these changes are overwritten. +
+ +
+ +

If you want to use KeePass 1.x with a database on a shared network drive, it +is recommended to let an administrator write to the database and let +users only read it (ensure this using file system access rights). +By using the -readonly command line switch, +KeePass will automatically open +a given database in read-only mode (i.e. not show the mode prompt). Users +would open the database using a shortcut that contains this command line +switch.

+ +

If there is no central administrator managing the database, users need to +be careful to not overwrite each others changes.

+ +
+ + +

+KeePass 2.x: Synchronize or Overwrite

+ +
+ + + +
+With KeePass 2.x, a database can be stored on a shared network drive and used by multiple +users. When attempting to save, KeePass first checks whether the file on disk has been +modified since it was loaded. If yes, KeePass asks whether to synchronize or +overwrite the file (see image on the right).
+
+By synchronizing, changes made by other users (file on disk) +and changes made by the current user are merged. +After the synchronization process has finished, +the current user also sees the changes made by others (i.e. the data in the +current KeePass instance is up-to-date).
+
+If there is a conflict (multiple users edited the same +entry), KeePass uses the latest version of the entry based on the last +modification time. +
+ +
+ +

Note: the synchronize prompt is only triggered by the 'Save' command, +not by the 'Save As' command. When executing the 'Save As' command and +manually selecting a file, this file will always be overwritten.

+ + + diff --git a/src/Docs/Chm/help/base/placeholders.html b/src/Docs/Chm/help/base/placeholders.html new file mode 100644 index 0000000..ce83ef3 --- /dev/null +++ b/src/Docs/Chm/help/base/placeholders.html @@ -0,0 +1,785 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Placeholders - KeePass + + + + + + + + + + + + + +

Placeholders

+

KeePass supports various placeholders.

+ +

In many places in KeePass (auto-type, URL field, triggers, ...), +placeholders can be used.

+ + + + + + + + + + +Placeholders are case-insensitive. + + + +
+ +

KeePass uses the abbreviation "Spr" for "String placeholder replacement". +An Spr-compiled field is a field where placeholders are replaced +when performing an action with this field (like copying it to the +clipboard, sending it using auto-type, etc.).

+ +

References in a field to (parts of) the field itself are +unsupported. For example, the {URL:HOST} placeholder +cannot be used in the URL field (but it can be used in the +'Override URL' field).

+ +
+ + +

+Entry Field Placeholders

+ +
+ + + + + + + + + +
PlaceholderField
{TITLE}Title
{USERNAME}User name
{URL}URL
{PASSWORD}Password
{NOTES}Notes
+ +
+ + +Custom strings can be referenced using {S:Name}. +For example, if you have a custom string named "eMail", +you can use the placeholder {S:eMail}. + + +
+ +
+ + + + + + + + + + + + + + + +
PlaceholderIs Replaced By
{URL:RMVSCM}Entry URL without scheme name.
{URL:SCM}Scheme name of the entry URL.
{URL:HOST}Host component of the entry URL.
{URL:PORT}Port number of the entry URL.
{URL:PATH}Path component of the entry URL.
{URL:QUERY}Query information of the entry URL.
{URL:USERINFO}User information of the entry URL.
{URL:USERNAME}User name of the entry URL.
{URL:PASSWORD}Password of the entry URL.
{UUID}UUID of the entry (32 hexadecimal characters).
+
+An example for the {URL:...} placeholders can be found below. + + +

+ + +

+Entry Field References

+ +

Fields of other entries can be inserted using +Field References.

+ +
+ + +

+Paths and Date/Time Placeholders

+ +
+ + + + + + + + + + +
PlaceholderIs Replaced By
{EDGE}Path to Microsoft Edge, if installed.
{FIREFOX}Path to Mozilla Firefox, if installed.
{GOOGLECHROME}Path to Google Chrome (or Chromium +on Unix-like systems), if installed.
{INTERNETEXPLORER}Path to Internet Explorer, if installed.
{OPERA}Path to Opera, if installed.
{SAFARI}Path to Safari, if installed.
+ + + +
+ + + + + +
PlaceholderIs Replaced By
{APPDIR}KeePass application directory path.
+ +
+ + + + + + + + + + + + + + + + + + +
PlaceholderIs Replaced By
{GROUP}Name of the entry's parent group.
{GROUP_PATH}Full path of the entry's parent group.
{GROUP_NOTES}Notes of the entry's parent group.
{GROUP_SEL}Name of the group that is currently selected in the main window.
{GROUP_SEL_PATH}Full path of the group that is currently selected in the main window.
{GROUP_SEL_NOTES}Notes of the group that is currently selected in the main window.
{DB_PATH}Full path of the current database.
{DB_DIR}Directory of the current database.
{DB_NAME}File name (including extension) of the current database.
{DB_BASENAME}File name (excluding extension) of the current database.
{DB_EXT}File name extension of the current database.
{ENV_DIRSEP}Directory separator ('\' on Windows, '/' on Unix).
{ENV_PROGRAMFILES_X86}This is +%ProgramFiles(x86)%, if it exists, otherwise %ProgramFiles%.
+ + +
+ + + + + + + + + + + + + + + + + + +
PlaceholderIs Replaced By
{DT_SIMPLE}Current local date/time as a simple, +sortable string. For example, for 2012-07-25 17:05:34 the value is 20120725170534.
{DT_YEAR}Year component of the current local date/time.
{DT_MONTH}Month component of the current local date/time.
{DT_DAY}Day component of the current local date/time.
{DT_HOUR}Hour component of the current local date/time.
{DT_MINUTE}Minute component of the current local date/time.
{DT_SECOND}Second component of the current local date/time.
{DT_UTC_SIMPLE}Current UTC date/time as a simple, sortable string.
{DT_UTC_YEAR}Year component of the current UTC date/time.
{DT_UTC_MONTH}Month component of the current UTC date/time.
{DT_UTC_DAY}Day component of the current UTC date/time.
{DT_UTC_HOUR}Hour component of the current UTC date/time.
{DT_UTC_MINUTE}Minute component of the current UTC date/time.
{DT_UTC_SECOND}Second component of the current UTC date/time.
+ +

+ + +

+Environment Variables

+ +

System environment variables are supported. +The name of the variable must be enclosed in '%' characters. +For example %TEMP% is replaced by the user's temporary path.

+ +
+ + +

+Text Transformations

+ +
+ + + + + + + + + +
PlaceholderAction
{T-REPLACE-RX:/Text/Search/Replace/}Searches the regular expression Search in Text +and replaces all matches by Replace. +See below.
{T-CONV:/Text/Type/}Convert Text to Type. +See below.
+ + +

+ + + +{T-REPLACE-RX:/Text/Search/Replace/} – Replace +Using Regular Expression:
+This placeholder searches the + +regular expression Search in Text +and replaces all matches by Replace.
+
+All parameters are Spr-compiled, i.e. placeholders can be used within them.
+
+The first character after the first ':' specifies the +separator character. Any character except '}' can be used as separator +character. +It must not appear within the parameters. +For example, +{T-REPLACE-RX:/A/B/C/} and +{T-REPLACE-RX:!A!B!C!} are equivalent. +The last separator character (before the '}') is required.
+
+Usage example. +Let the user name field contain the e-mail address 'myname@example.com' and +the URL field '{T-REPLACE-RX:!{USERNAME}!.*@(.*)!https://$1!}'. +When running the URL field, KeePass opens +'https://example.com'. + + +

+ + + +{T-CONV:/Text/Type/} – Convert:
+This placeholder converts Text to Type.
+
+All parameters are Spr-compiled, i.e. placeholders can be used within them.
+
+Supported types are: +
    +
  • Upper or U:
    +Upper-case.
  • +
  • Lower or L:
    +Lower-case.
    +Example. +Let the user name of an entry be 'Bob' and +the URL 'https://example.com/?user={T-CONV:/{USERNAME}/L/}'. +When running the URL, KeePass opens +'https://example.com/?user=bob'.
  • +
  • Base64:
    +The Base64 encoding of the UTF-8 representation of the text.
  • +
  • Hex:
    +The Hex encoding of the UTF-8 representation of the text.
  • +
  • Uri:
    +The URI-escaped representation of the text.
  • +
  • Uri-Dec:
    +The URI-unescaped representation of the text.
  • +
  • Raw:
    +Spr-compiles Text without encoding the result for the current context.
    +Example. +Let the user name of an entry be '+'. +The auto-type sequence '{USERNAME}a' results in the text +'+a', whereas the auto-type sequence +'{T-CONV:/{USERNAME}/Raw/}a' results in the text +'A' +(because this placeholder inserts '+' into the auto-type +sequence without encoding it, and +'+a' means to press Shift+A, +which results in the text 'A').
  • +
+ + +

+ + +

+Other Placeholders

+ +
+ + + + + + + + + + + + + + + + + + + +
PlaceholderAction
{PICKCHARS}
+{PICKCHARS:Fld:Opt}
Shows a dialog to pick certain characters from an entry string. +See below.
{PICKFIELD}Shows a dialog to pick a field +whose value will be inserted.
{NEWPASSWORD}
+{NEWPASSWORD:/Profile/}
Generates a new password. +See below.
{PASSWORD_ENC}Password in encrypted form. +See below.
{HMACOTP}Generates an HMAC-based one-time password. +See below.
{TIMEOTP}Generates a time-based one-time password. +See below.
{C:Comment}Comment; is removed.
{BASE}
+{BASE:RMVSCM}
+{BASE:SCM}
+{BASE:HOST}
+{BASE:PORT}
+{BASE:PATH}
+{BASE:QUERY}
+{BASE:USERINFO}
+{BASE:USERNAME}
+{BASE:PASSWORD}
Within a URL override, +each of these placeholders is replaced by the specified part of the string that is +being overridden. +See below.
{CLIPBOARD}Gets the clipboard content (text).
{CLIPBOARD-SET:/Text/}Copies Text into the clipboard.
{CMD:/CommandLine/Options/}Runs a command line. See below.
+ + + + +

+ + + +{PICKCHARS} – Picking Characters:
+Character Picking Dialog +The {PICKCHARS} placeholder shows a dialog, in which you can +pick characters of an entry string (like the password) at certain positions.
+
+{PICKCHARS} without any parameters lets you pick an arbitrary +amount of characters from the password of the entry. +A different entry string can be specified by appending a ':' +and the name of the field; e.g. {PICKCHARS:UserName}. +The names of the standard fields are Title, UserName (without a space), +Password, URL and Notes. A custom entry string can +be referenced by its name (without an S: prefix).
+
+Additionally, the placeholder supports various (optional!) options. Options are appended +after the field name, separated by a ':'. If you want to specify +multiple options, separate them by a comma ','. Options are +key-value pairs, separated by a '='. The following options +are supported: +
    +
  • ID: Specifies an alphanumeric ID for the placeholder (see below).
  • +
  • C or Count: Specifies the number of characters to pick from +the string. When enough characters have been picked, +the dialog closes automatically (i.e. you don't need to manually click [OK] +anymore).
  • +
  • Hide: If set to False, the picked characters in the dialog +are shown as plain text by default, i.e. not hidden by asterisks. +By default, KeePass uses the hiding setting of passwords in the main window.
  • +
  • Conv: Specifies how to convert the picked characters. +When this parameter is omitted, no conversion is performed, i.e. the selected +characters are auto-typed directly. The option supports the following values: +
      +
    • D: Convert the picked characters to down arrow keypresses; e.g. +'2', 'c' and 'C' are converted to 2 down arrow keypresses.
      +
      +A fixed number of +down arrow keypresses can be added by specifying them using the Conv-Offset +option. For example, if you specify Conv=D, Conv-Offset=1, +then '2', 'c' and 'C' are converted to 3 down arrow keypresses.
      +
      +By using the Conv-Fmt option, you can specify the layout of comboboxes. +By default, KeePass assumes a combobox containing values from 0 to 9 or from A to Z. +If the combobox contains values 0-9A-Z (i.e. first all ten digits, immediately followed +by all characters from A to Z), specify Conv=D, Conv-Fmt=0A. +Similarly, if it contains values A-Z0-9, specify Conv=D, Conv-Fmt=A0. +If digits start with 1 instead of 0 (i.e. the 0 appears after the 9), use +1A and A1 instead of 0A and A0. +If the combobox contains values 0-9A-Za-z (i.e. case-sensitive characters), +specify 0Aa. All combinations of '0', 'A', +'a' and '?' are supported. +If 'A' and 'a' are not specified both, +characters are treated as case-insensitive. +'?' skips a combobox item.
    • +
  • +
+If you want to show the character picking dialog multiple times within one sequence, +assign different IDs to the placeholders. +If an ID is specified multiple times (or no ID is specified +and the placeholders are the same), +KeePass shows the character picking dialog once and reuses the picked characters +in all following placeholders with the same ID.
+
+Usage examples:
+
+{USERNAME}{TAB}{PICKCHARS:Password:C=5}{ENTER}
+First a dialog is shown in which the user can pick exactly 5 characters +from the entry password. +Afterwards KeePass types the user name into the target window, presses +Tab, types the 5 picked characters and presses +Enter.
+
+ComboBox Form +{S:Memorable}{TAB}{PICKCHARS:Password:ID=1, C=1, Conv=D, +Conv-Offset=1}{TAB}{PICKCHARS:Password:ID=2, C=1, Conv=D, +Conv-Offset=1}{TAB}{PICKCHARS:Password:ID=3, C=1, Conv=D, +Conv-Offset=1}{ENTER}
+First the character picking dialog is shown three times and each time the user +can pick exactly one character from the entry password. +Afterwards the auto-type process starts: +KeePass types the contents of a custom entry string named "Memorable" +into the target window. +The focus is switched to the next control by pressing Tab, +and the first previously picked character is converted to +down arrow keypresses (with one additional keypress; e.g. a '1' is converted +to two down arrow keypresses). +This is repeated two more times with the other picked characters, +and finally Enter is pressed.
+
+Note this is not equivalent to picking three characters at once. +If you'd use {S:Memorable}{TAB}{PICKCHARS:Password:C=3, Conv=D, Conv-Offset=1}, +all the down arrow keypresses are sent to the same, currently active control.
+
+In some browsers (e.g. Opera), setting the focus to a combobox can +be slow. If you experience auto-type failures, consider slowing down +the focus changes, e.g. by adding {DELAY 250} after each {TAB}, +or slowing down the whole sequence, e.g. by prepending {DELAY=150}. + + +

+ + + +{NEWPASSWORD} and {NEWPASSWORD:/Profile/} +– Generating New Passwords:
+The {NEWPASSWORD} placeholder +generates a new password for the current entry, based on the 'Automatically +generated passwords for new entries' generator profile.
+
+This placeholder is evaluated only once in an auto-type process, i.e. +for a typical 'Old Password' - 'New Password' - 'Repeat New Password' +dialog you can use +{PASSWORD}{TAB}{NEWPASSWORD}{TAB}{NEWPASSWORD}{ENTER} +as auto-type sequence.
+
+In order to use a different password generator profile, use +{NEWPASSWORD:/Profile/}, where Profile +is the name of the profile. +If the specified profile cannot be found, the +'Automatically generated passwords for new entries' profile is used.
+
+When specifying '~' as name of the profile +(i.e. when using the placeholder {NEWPASSWORD:/~/}), KeePass derives +a profile from the current entry password. +Not recommended, as the quality can decay. + + +

+ + + +{PASSWORD_ENC} – Encrypting Passwords:
+The {PASSWORD_ENC} placeholder is replaced by the password +of the current entry in encrypted form. The password is encrypted using +credentials of the current Windows user. The encrypted password should +not be stored and only works for the current user.
+
+It is intended to be used in conjunction with the +-pw-enc command line parameter +(see the URL Field page for +an example how to define a URL to open an additional KeePass database). +The placeholder cannot be used to transfer passwords to other applications +(except KeePass), because the target applications don't know how to decrypt +encrypted passwords generated by {PASSWORD_ENC}. + + +

+ + + + +One-Time Passwords (OTPs):
+KeePass provides menu commands in the main window for generating one-time +passwords ('Copy HMAC-Based OTP', 'Show HMAC-Based OTP', 'Copy Time-Based OTP', +'Show Time-Based OTP'). +Furthermore, one-time passwords can be generated during +auto-type using the {HMACOTP} and +{TIMEOTP} placeholders. + +

The parameters for the OTP generation are stored as entry strings and +can be edited conveniently using the 'OTP Generator Settings' dialog +(which checks the entered values, shows a preview, etc.). +Alternatively, you can edit the entry strings directly, as documented below.

+ +

{HMACOTP} – Generating HMAC-Based One-Time Passwords:
+The {HMACOTP} placeholder generates an HMAC-based one-time +password (HOTP) according to RFC 4226.

+ +

The shared secret and other parameters can be specified using the +following entry string fields (which can be added/edited in the entry +dialog on the 'Advanced' tab page):

+
    +
  • HmacOtp-Secret
    +HmacOtp-Secret-Hex
    +HmacOtp-Secret-Base32
    +HmacOtp-Secret-Base64
    +Exactly one of these fields must be present, and its value must be set +to the shared secret in the corresponding encoding. +In the first case ('HmacOtp-Secret'), the UTF-8 encoding of the +value is used as shared secret.
  • + +
  • HmacOtp-Counter (automatic)
    +This field stores the counter value in decimal representation. +The default value is 0. +When the {HMACOTP} placeholder is replaced (i.e. when generating +a one-time password), KeePass updates the counter value automatically.
  • +
+ +

{TIMEOTP} – Generating Time-Based One-Time Passwords:
+The {TIMEOTP} placeholder generates a time-based one-time +password (TOTP) according to RFC 6238.

+ +

The shared secret and other parameters can be specified using the +following entry string fields (which can be added/edited in the entry +dialog on the 'Advanced' tab page):

+
    +
  • TimeOtp-Secret
    +TimeOtp-Secret-Hex
    +TimeOtp-Secret-Base32 (most common)
    +TimeOtp-Secret-Base64
    +Exactly one of these fields must be present, and its value must be set +to the shared secret in the corresponding encoding. +In the first case ('TimeOtp-Secret'), the UTF-8 encoding of the +value is used as shared secret. +Most services use the Base32 encoding.
  • + +
  • TimeOtp-Length (optional)
    +Specifies the length of the generated one-time password. +The default value is 6; the maximum is 8.
  • + +
  • TimeOtp-Period (optional)
    +Specifies the time-step size in seconds. +The default value is 30.
  • + +
  • TimeOtp-Algorithm (optional)
    +Specifies the cryptographic algorithm used for the generation +of the one-time password. The following algorithms are supported: +
      +
    • HMAC-SHA-1
    • +
    • HMAC-SHA-256
    • +
    • HMAC-SHA-512
    • +
    +The default value is HMAC-SHA-1.
  • +
+ +

The date and the time of your system must be correct, otherwise +the service/server may reject the generated OTP.

+ +

Usage example. +Create a new entry and change its default auto-type sequence to +{USERNAME}{TAB}{PASSWORD}{ENTER}{DELAY 3000}{HMACOTP}{ENTER}. +Open the 'OTP Generator Settings' dialog, set the shared secret +for HMAC-based OTPs to '12345678901234567890' and select the UTF-8 encoding. +When performing auto-type, KeePass sends the user name, presses +Tab, sends the password, presses Enter, +waits 3 seconds, generates and sends a HMAC-based OTP and finally presses +Enter again. +The counter value for the OTP generation is updated automatically. +With the shared secret above and initial counter value 0, the following +OTPs are generated: 755224, 287082, 359152, 969429, 338314, ... +(more generated OTPs can be found in the example in RFC 4226).

+ +Plugins. +There are plugins +that add support for non-standard OTPs (e.g. Steam) and +provide additional functions related to OTPs. + + +

+ + + +{URL:...} and {BASE:...}:
+The {URL:...} placeholder is replaced by the specified part +of the current entry's URL; this typically is useful in an +entry-specific URL override (defined on the 'Properties' tab of the entry dialog). +The {BASE:...} placeholder is replaced by the specified part +of the URL being overridden; this typically is useful in a +global URL override (defined in 'Tools' → 'Options' → tab 'Integration' → +button 'URL Overrides'), because there no entry context may be available.
+
+Usage example. For the entry URL +https://user:pw@keepass.info:80/path/example.php?q=e&s=t, +the placeholders return the following values:
+
+ + + + + + + + + + + + + + + + + + + + + + + +
PlaceholderValue
{URL}https://user:pw@keepass.info:80/path/example.php?q=e&s=t
{URL:RMVSCM}user:pw@keepass.info:80/path/example.php?q=e&s=t
{URL:SCM}https
{URL:HOST}keepass.info
{URL:PORT}80
{URL:PATH}/path/example.php
{URL:QUERY}?q=e&s=t
{URL:USERINFO}user:pw
{URL:USERNAME}user
{URL:PASSWORD}pw
+
+{BASE} supports exactly the same parts as {URL}. + + +

+ + + +{CMD:/CommandLine/Options/} – Running a command line:
+The {CMD:/CommandLine/Options/} placeholder +runs the specified command line.
+
+A command line consists of a path to an executable file or a document +and command line parameters. +If the path contains spaces, it must be enclosed in quotes (").
+
+The character after the first ':' specifies the separator +character. It can be chosen freely (except '{' and '}'), +but it must not occur in the command line or any of the options. +For example, {CMD:/Notepad.exe/W=0/} and +{CMD:!Notepad.exe!W=0!} are equivalent. +The separator character at the end (before the '}') is mandatory.
+
+An option is a key-value pair, separated by '='. +Multiple options must be separated using commas ','.
+
+Options: +
    +
  • M: +Specifies the method for running/opening the executable/document.
    +The default value is S. +
      +
    • S: +Use the system shell (via ShellExecute). +With this, executable files are executed and documents are opened +using their associated applications. +However, no standard input/output is supported.
    • +
    • C: +Run an executable file (EXE or COM, via CreateProcess); +documents are not supported. +Standard input/output is supported.
    • +
    +
  • + +
  • O: +Specifies what to do with the standard output of the executed application.
    +The default value is 1. +
      +
    • 0: +Ignore the standard output. The placeholder is replaced by an empty string.
    • +
    • 1: +Replace the placeholder by the standard output.
    • +
    +
  • + +
  • W: +Specifies whether to wait for the termination of the executed application.
    +The default value is 1. +
      +
    • 0: +Do not wait.
    • +
    • 1: +Wait.
    • +
    +
  • + +
  • WS: +Specifies the window style. Not all applications support this option.
    +The default value is N. +
      +
    • N: +Normal.
    • +
    • H: +Hidden.
    • +
    • Min: +Minimized.
    • +
    • Max: +Maximized.
    • +
    +
  • + +
  • V: +Specifies the verb (action to be performed), +e.g. 'Open' or 'Print'. +When using the verb 'RunAs', the application is executed with administrative +rights (this may require a confirmation via the UAC dialog).
  • +
+ +

New-line characters at the end of the output are removed (analogous to +'$(...)' and '`...`' shell command substitutions).

+ +Usage examples: +
    +
  • {CMD:/Notepad.exe/W=0/}
    +Runs Notepad and continues immediately.
  • +
  • {CMD:/PowerShell.exe -Command "(Get-FileHash '%SYSTEMROOT%\Win.ini' +-Algorithm SHA256).Hash"/M=C,WS=H/}
    +The placeholder is replaced by the SHA-256 hash of Windows' Win.ini file.
  • +
+ + + + diff --git a/src/Docs/Chm/help/base/pwgenerator.html b/src/Docs/Chm/help/base/pwgenerator.html new file mode 100644 index 0000000..da35d3f --- /dev/null +++ b/src/Docs/Chm/help/base/pwgenerator.html @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Password Generator - KeePass + + + + + + + + + + + + + +

Password Generator

+

Details about the built-in password generator of KeePass.

+ + + +
+ + +

+Generation Based on Character Sets

+ +

This password generation method is the recommended way to generate random passwords. +Other methods (pattern-based generation, ...) should only be used if passwords must +follow special rules or fulfill certain conditions.

+ +

Generation based on a character set is very simple. You simply let KeePass know +which characters can be used (e.g. upper-case letters, digits, ...) and KeePass will +randomly pick characters out of the set.

+ +

Defining a character set:
+The character set can be defined directly in the password generator window. For convenience, +KeePass offers adding commonly used ranges of characters to the set. This is done by +ticking the appropriate check box. Additionally to these predefined character ranges, you +can specify characters manually: all characters that you enter in the 'Also include the +following characters' text box will be directly added to the character set.

+ +

The characters that you enter in the 'Also include the following characters' +text box are included in the character set from which the password generator randomly +chooses characters from. +This means that these additional characters are allowed to appear in the +generated passwords, but they are not forced to. +If you want to force that some characters appear in the generated passwords, +you have to use the pattern-based generation.

+ +

Character sets are sets:
+In mathematical terms, character sets are sets, not vectors. This means that characters +cannot be added twice to the set. Either a character is in the set or it is not.

+ +

For example, if you enter 'AAAAB' into the additional characters box, this is +exactly the same set as 'AB'. 'A' will not be 4 times as likely as 'B'! +If you need to follow rules like 'character A is more likely than B', you must +use pattern-based generation + permuting password characters.

+ +

KeePass will 'optimize' your character set by removing all duplicate characters. If +you'd enter the character set 'AAAAB' into the additional characters box, +close and reopen the password generator, it'll show the shorter character set 'AB'. +Similarly, if you tick the 'Digits' check box and enter '3' into the +additional box, the '3' will be ignored because it is already included in the +'Digits' character range.

+ +

Supported characters:
+All Unicode +characters in the ranges [U+0001, U+D7FF] and [U+E000, U+FFFF] +except { U+0009 / '\t', U+000A / '\n', U+000D / '\r' } are supported. +Characters in the range [U+010000, U+10FFFF] (which need to be encoded +in UTF-16 using surrogate pairs from [0xD800, 0xDFFF]) are not supported. +Subsequent processing of passwords may have further limitations +(for example, the character U+FFFF is forbidden in XML/KDBX files +and will be replaced or removed).

+ +
+ + +

+Generation Based on Patterns

+ +

The password generator can create passwords using patterns. A pattern is a +string defining the layout of the new password. The following placeholders +are supported:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlaceholderTypeCharacter Set
aLower-Case Alphanumericabcdefghijklmnopqrstuvwxyz 0123456789
AMixed-Case AlphanumericABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789
UUpper-Case AlphanumericABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789
dDigit0123456789
hLower-Case Hex Character0123456789 abcdef
HUpper-Case Hex Character0123456789 ABCDEF
lLower-Case Letterabcdefghijklmnopqrstuvwxyz
LMixed-Case LetterABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
uUpper-Case LetterABCDEFGHIJKLMNOPQRSTUVWXYZ
vLower-Case Vowelaeiou
VMixed-Case VowelAEIOU aeiou
ZUpper-Case VowelAEIOU
cLower-Case Consonantbcdfghjklmnpqrstvwxyz
CMixed-Case ConsonantBCDFGHJKLMNPQRSTVWXYZ bcdfghjklmnpqrstvwxyz
zUpper-Case ConsonantBCDFGHJKLMNPQRSTVWXYZ
pPunctuation,.;:
bBracket()[]{}<>
sPrintable 7-Bit Special Character!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
SPrintable 7-Bit ASCIIA-Z, a-z, 0-9, !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
xLatin-1 SupplementRange [U+00A1, U+00FF] except U+00AD:
+¡¢£¤¥¦§¨©ª«¬®¯ +°±²³´µ¶·¸¹º»¼½¾¿ +ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ +ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß +àáâãäåæçèéêëìíîï +ðñòóôõö÷øùúûüýþÿ
\Escape (Fixed Char)Use following character as is.
{n}Escape (Repeat)Repeat the previous placeholder n times.
[...]Custom Char SetDefine a custom character set.
+ +

The \ placeholder is special: it's an escape character. The next character that follows +the \ is written directly into the generated password. If you want a \ in your +password at a specific place, you have to write \\.

+ +

Using the {n} code you can define how many times the previous placeholder +should occur. The { } operator duplicates placeholders, not generated characters. Examples:
d{4} is equivalent to dddd,
dH{4}a is equivalent to dHHHHa and
Hda{1}dH is equivalent to HdadH.

+ +

The [...] notation can be used to define a custom character set, from which +the password generator will pick one character randomly. All characters between the '[' +and ']' brackets follow the same rules as the placeholders above. +The '^' character removes the next placeholders from the character set. +Examples:
[dp] generates exactly 1 random character out of the set +digits + punctuation,
[d\m\@^\3]{5} generates 5 characters out of the set "012456789m@",
[u\_][u\_] generates 2 characters out of the set upper-case + '_'.

+ +

More examples:

+ +

ddddd
+Generates for example: 41922, 12733, 43960, 07660, 12390, 74680, ...

+ +

\H\e\x\:\ HHHHHH
+Generates for example: 'Hex: 13567A', 'Hex: A6B99D', 'Hex: 02243C', ...

+ +

Common password patterns:

+ + + + + + + + + + + + + + + + + + + +
NamePattern
Hex Key - 40-BitH{10}
Hex Key - 128-BitH{32}
Hex Key - 256-BitH{64}
MAC AddressHH\-HH\-HH\-HH\-HH\-HH
+ +

+ + +

+Generating Passwords that Follow Rules

+ +

Below are a few examples how the pattern generation feature can be used to generate +passwords that follow certain rules.

+ +

Important! For all of the following examples you must enable the 'Randomly permute +characters of password' option!

+ + + + + + + + + + + + + + + + + + + + + +
RulePattern
Must consist of 2 upper-case letters, 2 lower-case letters and 2 digits.uulldd
Must consist of 9 digits and 1 letter.d{9}L
Must consist of 10 alphanumeric characters, where at least 1 is +a letter and at least 1 is a digit.LdA{8}
Must consist of 10 alphanumeric characters, where at least 2 are +upper-case letters and at least 2 are lower-case letters.uullA{6}
Must consist of 9 characters of the set "ABCDEF" and +an '@' symbol.\@[\A\B\C\D\E\F]{9}
+ +

+ + +

+Security-Reducing Options

+ +

The password generator supports several options like 'Each character must occur at most once', +'Exclude look-alike characters' (O0, Il1|) +and a field to explicitly specify characters that should not appear in generated passwords.

+ +

These options are reducing the security of generated passwords. You should +only enable them if you are forced to follow such rules by the website/application, +for which you are generating the password.

+ +

The options can be found in the 'Advanced' dialog / tab page.

+ + + + + + +Tab Control +If you enable a security-reducing option, an exclamation mark (!)
+is appended to the 'Advanced' tab. + + +

+ + +

+Creating and Using Password Generator Profiles

+ +

Password generator options (character set, length, pattern, ...) can be saved +as password generator profiles.

+ +

Creating/modifying a profile:

+ +
    +
  1. Open the Password Generator window.
  2. +
  3. Specify all options of the new profile.
  4. +
  5. Click the +'Save as Profile' button.
  6. +
  7. Enter the name of the new profile, or select an existing profile name from +the drop-down list to overwrite it. Close the dialog with OK.
  8. +
  9. If you want to immediately create a password using the new profile, +click OK/Accept. Otherwise click Cancel/Close (the profile is not lost; +profile management is independent of password generation).
  10. +
+ +

Using a profile:
+To use a profile, simply select it from the drop-down profiles list +in the password generator window. All settings of this profile will be +restored accordingly.

+ +

Meta-profile 'Derive from previous password':
+When this meta-profile is selected, a password is generated based on +a character set derived from the previous password. The new password +has the same length as the old one, and every character of the old +password turns on the character subset that contains this character. +For example, if the old password contains the letter 'R', then the character +set used for generating the new password contains the range 'A' to 'Z'.
+Warning! This meta-profile should not be used blindly +(i.e. without reviewing the used character set). +The new password does not necessarily contain at least one character +from each character subset (see 'Generation +Based on Character Sets'), thus blindly generating new passwords +with this meta-profile can result in a quality degradation of the +effectively used profile.

+ +
+ + +

+Configuring Settings of Automatically Generated Passwords for New Entries

+ +

When you create a new entry, KeePass will automatically generate a random +password for it. The properties of these generated passwords can be configured +in the password generator dialog.

+ +

To configure, specify the options of your choice and overwrite the +'(Automatically generated passwords for new entries)' profile (see +section above).

+ +

Disabling automatically generated passwords:
+To disable automatically generated passwords for new entries, select +'Generate using character set' and specify 0 as password length. +Overwrite the appropriate profile (see above).

+ + + diff --git a/src/Docs/Chm/help/base/repair.html b/src/Docs/Chm/help/base/repair.html new file mode 100644 index 0000000..837e227 --- /dev/null +++ b/src/Docs/Chm/help/base/repair.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Repairing Databases - KeePass + + + + + + + + + + + + +

Repairing Databases

+

KeePass can repair corrupted databases in some cases.

+ +
+ +

KeePass has quite some features to avoid database file corruption +(transacted database writing, device buffer flushing, ...). However, +data corruption can still be caused by other programs, the system or +broken storage devices (note that KeePass by default is verifying the integrity +of database files immediately after writing them, i.e. at this point of time, +KeePass guarantees file integrity; however, KeePass of course can't do anything +when the data becomes corrupted/unreadable at a later point of time).

+ +

In these cases, the database repair functionality might help you. +Here, KeePass tries to read as much data as possible from the corrupted file.

+ +

Warning +In repair mode, the integrity of the data is not checked +(in order to rescue as much data as possible). +When no integrity checks are performed, corrupted/malicious data might +be incorporated into the database. +Thus the repair functionality should only be used when there really is no other solution. +If you use it, afterwards you should thoroughly check your whole +database for corrupted/malicious data.

+ + + + + + +In order to use the repair functionality in KeePass 2.x, first +create a new database file. Then, go 'File''Import' and import +the corrupted database file, using 'KeePass KDBX (2.x) (Repair Mode)' +as format. + + +

Anyway, if you've lost the master key for the database, the repair functionality +cannot help you. Also, if the header of the database (first few bytes) is +corrupted, you're out of luck, too: the repair functionality won't be able +to restore any entries (because the header contains information required +to decrypt the database).

+ +

The repair functionality should be seen as last hope. Regularly making +backups of your databases is much better and has to be preferred. +Backups have no cryptographic security implications. +There are plugins that automate the backup process, see the +KeePass plugins page.

+ +
+ + +

+File Header/Signature

+ +

If your database file has been deleted and you want to try recovering +it using a tool that supports a file header/signature detection: +below you can find the first bytes (in hex notation) with which all +database files begin.

+ +
    +
  • KeePass 1.x KDB File:
    +03 D9 A2 9A 65 FB 4B B5
  • +
  • KeePass 2.x KDBX File:
    +03 D9 A2 9A 67 FB 4B B5
  • +
+ +

The file header does not contain a field that specifies the length +of the file. If the length cannot be determined from the file system, +try to recover sufficiently much data (i.e. the database file data and +maybe some subsequent, unnecessary data) and use the +repair functionality above, which will simply ignore any subsequent data.

+ + + diff --git a/src/Docs/Chm/help/base/search.html b/src/Docs/Chm/help/base/search.html new file mode 100644 index 0000000..11b59bf --- /dev/null +++ b/src/Docs/Chm/help/base/search.html @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Search - KeePass + + + + + + + + + + + + + + + + + +

Search

+

Details about the search functions of KeePass.

+ + + +
+ + +

+Search Mode 'Simple Expression'

+ +

In this mode, KeePass searches the specified terms in the selected fields. +For an entry to match, all terms must match.

+ +
    +
  • Multiple terms.
    +In order to search for multiple terms, separate the terms using spaces. +If you want to search for a term containing spaces, enclose the term +in double quotes ("...").
  • + +
  • Exclusions (2.x).
    +In order to find entries that do not contain a certain term, +prepend a minus sign to the term.
  • +
+ +

An entry matches if the specified terms can be found as substrings. +If you want to find exact matches instead, use a +regular expression +(see the example 'Exact term').

+ +

Examples.

+ + + + + + + + +
Multiple terms
Find what:Michael Home
Options:☑ Title
Finds every entry whose title contains both the term +'Michael' and the term 'Home' (in any order).
+ +
+ + + + + + + + +
Terms with spaces
Find what:Michael "Web Server"
Options:☑ Title
Finds every entry whose title contains both the term +'Michael' and the term 'Web Server'.
+ +
+ + + + + + + + +
Exclusions (2.x)
Find what:Michael -Home
Options:☑ Title
Finds every entry whose title contains the term +'Michael', but not the term 'Home'.
+ +

+ + +

+Search Mode 'Regular Expression'

+ +

In this mode, KeePass searches for matches of a regular expression +in the selected fields.

+ +

Information about regular expressions and tools can be found here:

+ + +

Examples.

+ + + + + + + + +
Exact term
Find what:^Michael$
Options:☑ User name
Finds every entry whose user name is 'Michael' (exactly, +i.e. 'Michael' is not only a substring of the entry's user name).
+ +
+ + + + + + + + + +
Short passwords
Find what:^.{1,10}$
Options:☑ Password
Finds every entry whose password has a length +between 1 and 10 (inclusive).
If you want to find weak passwords instead, +use the 'Password Quality' command in the 'Find' menu.
+ +
+ + + + + + + + +
Multiple tags (OR, exact)
Find what:^(Home|Private)$
Options:☑ Tags
Finds every entry that has the tag 'Home' or the tag 'Private' +(or both).
+ +

+ + +

+Search Mode 'XPath Expression' (2.x)

+ +

In this mode, a KeePass 2.x XML DOM of the current database is +created in memory and the specified XPath expression is used to +find entries.

+ +

Information about XPath expressions can be found here:

+ + +

In order to see your database in the KeePass 2.x XML format, you can +export it (via 'File' → 'Export') to a 'KeePass XML (2.x)' file.

+ +

If you want to find and replace data using XPath and regular +expressions, see the XML Replace feature.

+ +

Examples.

+ + + + + + + + +
Icon
Find what://Entry[(IconID = '3') and not(CustomIconUUID)]
Finds every entry that has a +Server icon.
+ +
+ + + + + + + + +
Expired in specific year
Find what://Entry/Times[(Expires = 'True') and starts-with(ExpiryTime, '2022-')]/..
Finds every entry that has expired in 2022.
+ +
+ + + + + + + + + +
Custom string field
Find what://Entry/String[(Key = 'Telephone') and contains(Value, '12345')]/..
Options:☑ Other strings
Finds every entry that has a custom string field +named 'Telephone' whose value contains '12345'.
+ +
+ + + + + + + + + +
Attached PDF files
Find what://Entry/Binary/Key[(string-length(.) >= 4) and (substring(., string-length(.) - 3) = '.pdf')]/../..
Finds every entry that has a file attachment whose +name ends with '.pdf'.
If you want to find large entries instead, use the +'Large Entries' command in the 'Find' menu.
+ +
+ + + + + + + + + +
Background color
Find what://Entry[BackgroundColor = '#CCFFCC']
Finds every entry that has a +light green +background color.
The standard background colors are +light red (#FFCCCC), +light green (#CCFFCC), +light blue (#99CCFF) and +light yellow (#FFFF99).
+ +
+ + + + + + + + + + +
Multiple tags (AND, exact)
Find what://Entry[contains(concat(';', Tags, ';'), ';Home;') and +contains(concat(';', Tags, ';'), ';Private;')]
Options:☑ Tags
Finds every entry that has both the tag 'Home' +and the tag 'Private'.
In contrast to this, searching with the +simple expression 'Home Private' +also finds entries that have 'Home' and 'Private' as substrings in +the tags.
+ +
+ + + + + + + + + +
History entry count
Find what://Entry[count(History/Entry) >= 4]
Options:☑ History
Finds every entry that has at least 4 history entries.
+ +
+ + + + + + + + +
Group notes
Find what://Group[contains(Notes, 'Private')]/Entry
Finds every entry whose (direct) parent group +contains the word 'Private' in the notes (of the group, not of the entry). +If there are multiple such groups, the entries of all these groups are found.
+ +

+ + +

+Search Profiles (2.x)

+ +

KeePass can save search parameters as a search profile. +This can be useful when you are regularly performing similar searches.

+ +

Creating a profile.
+In order to save the current search parameters specified in the 'Find' dialog, +click the +profile creation button. KeePass then shows a dialog where you can enter +a name for the new profile.

+ +

Overwriting a profile.
+Overwriting an existing profile works the same as creating a profile, +except that you select an existing profile name in the name dialog.

+ +

Using a profile.
+There are two ways to load a profile and perform a search with it:

+
    +
  • Open the 'Find' dialog (via the menu 'Find' or +Ctrl+F), click on the 'Profile' +combo box and select the desired profile; this causes KeePass to load +the profile. If necessary, adjust the search parameters. +Finally, click the 'Find' button.
  • + +
  • In the menu of the main window, click 'Find' → 'Search Profiles'. +In this menu, all profiles are listed. For each profile, +there are commands to directly perform a search with the profile +(commands 'Find ...') and commands to show the profile in the +'Find' dialog (commands 'Open ...').
  • +
+ +

Deleting a profile.
+In order to delete a profile, select it in the 'Find' dialog and +click the profile deletion button.

+ +
+ + +

+Quick Search Box

+ +

The quick search box in the toolbar of the main window supports +simple expression and +regular expression searches.

+ +

In order to indicate that the search string is a regular expression, +enclose it in '//'. +For example, '//A{6}//' finds all entries containing +the string 'AAAAAA'. +Note that this special syntax does not work in the 'Find' dialog; +in this dialog, you need to select the regular expression mode +and specify the regular expression as-is, i.e. without enclosing it +in '//'.

+ +

Options.
+The 'Find' dialog and the quick search box are independent; +options/parameters in the 'Find' dialog do not affect quick searches. +Options for quick searches can be found in the options dialog +(menu 'Tools' → 'Options' → tab 'Interface').

+ + + diff --git a/src/Docs/Chm/help/base/secedits.html b/src/Docs/Chm/help/base/secedits.html new file mode 100644 index 0000000..31f42da --- /dev/null +++ b/src/Docs/Chm/help/base/secedits.html @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Secure Edit Controls - KeePass + + + + + + + + + + + + +

Secure Edit Controls

+

KeePass supports security-enhanced edit controls.

+ +

KeePass was one of the first password managers featuring secure edit controls. The +edit controls used in KeePass are resistant to password revealers and password +control spies. Additionally, the entered passwords are protected against +memory dumping attacks: the passwords aren't even visible in the process memory space +of KeePass!

+ +

KeePass uses secure edit controls only when the hiding behind asterisks option +is turned on! If you show the passwords in plaintext, they won't be protected +(secure edit controls are just disabled then, replaced by standard Windows edit +controls).

+ + + + + + +There are no selection limitations. Secure edit controls behave exactly like +standard Windows edit controls. + + + + diff --git a/src/Docs/Chm/help/base/security.html b/src/Docs/Chm/help/base/security.html new file mode 100644 index 0000000..442a542 --- /dev/null +++ b/src/Docs/Chm/help/base/security.html @@ -0,0 +1,710 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Security - KeePass + + + + + + + + + + + + + +

Security

+

Detailed information on the security of KeePass.

+ + + +
+ + +

+Database Encryption

+ +

KeePass database files are encrypted. KeePass encrypts the whole +database, i.e. not only your passwords, but also your user names, URLs, +notes, etc.

+ +

The following encryption algorithms are supported:

+ +

KeePass 1.x:

+ + + + + + + + + + + + +
AlgorithmKey SizeStd. / Ref.
Advanced Encryption Standard (AES / Rijndael)256 bitsNIST FIPS 197
Twofish256 bitsInfo
+ +

KeePass 2.x:

+ + + + + + + + + + + + + + +
AlgorithmKey SizeStd. / Ref.
Advanced Encryption Standard (AES / Rijndael)256 bitsNIST FIPS 197
ChaCha20256 bitsRFC 7539
There exist various +plugins +that provide support for additional encryption algorithms, +including but not limited to Twofish, Serpent and GOST.
+ +

These well-known and thoroughly analyzed algorithms are +considered to be very secure. +AES (Rijndael) became effective as a U.S. federal government standard +and is approved by the National Security Agency (NSA) +for top secret information. +Twofish was one of the other four AES finalists. +ChaCha20 is the successor of the Salsa20 algorithm (which is included in the +eSTREAM portfolio).

+ +

The block ciphers are used in the Cipher Block Chaining (CBC) +block cipher mode. +In CBC mode, plaintext patterns are concealed.

+ +

An initialization vector (IV) is generated +randomly each time +a database is saved. Thus, multiple databases encrypted with the same +master key (e.g. backups) are no problem.

+ +

Data authenticity and integrity:

+ + + + + + +The authenticity and integrity of the data is ensured using +a HMAC-SHA-256 hash of the ciphertext (Encrypt-then-MAC scheme). + + + + +

KeePass 2.x supports the FIPS mode.

+ +
+ + +

+Key Hashing and Key Derivation

+ +

SHA-256 is used for compressing the components +of the master key +(consisting of a master password, a key file, a Windows user account key +and/or a key provided by a plugin) to a 256-bit key K.

+ +

SHA-256 is a cryptographic hash function that is considered to be +very secure. It has been standardized in +NIST FIPS 180-4. +The attack against SHA-1 discovered in 2005 does not affect +the security of SHA-256.

+ +

In order to generate the key for the encryption algorithm, +K is transformed using a key derivation function (with +a random salt). This prevents precomputation of keys and makes dictionary +and guessing attacks harder. For details, see the section +'Protection against Dictionary Attacks'.

+ +
+ + +

+Protection against Dictionary Attacks

+ +

KeePass features a protection against dictionary and guessing attacks.

+ +

Such attacks cannot be prevented, but they can be made harder. +For this, the key K derived from the user's master key +(see above) is transformed using a +key derivation function with a random salt. +This prevents a precomputation of keys and adds a work factor +that the user can make as large as desired +to increase the computational effort of a dictionary or guessing attack.

+ +

Multiple key derivation functions are supported. In the database +settings dialog, you can select one and specify certain parameters +for it.

+ +

By clicking the '1 Second Delay' button in the database settings +dialog, KeePass computes the number of iterations that results in a +1 second delay when loading/saving a database. +Furthermore, KeePass 2.x has a button 'Test' that performs a key +transformation with the specified parameters (which can be cancelled) +and reports the required time.

+ +

The key transformation may require more or less time on other +devices. If you are using KeePass or a port of it on other devices, +make sure that all devices are fast enough (and have sufficient memory) +to load the database with your parameters within an acceptable time.

+ +

Supported key derivation functions:

+ +
    +
  • AES-KDF (KeePass 1.x and 2.x):
    +This key derivation function is based on iterating +AES. + +

    In the database settings dialog, you can change the number of +iterations. The more iterations, the harder are dictionary and guessing +attacks, but also database loading/saving takes more time (linearly).

    + +On Windows Vista and higher, KeePass can use Windows' CNG/BCrypt API +for the key transformation, which is about 50% faster than the +key transformation code built-in to KeePass.
  • + +
  • Argon2 (KeePass 2.x only):
    +Argon2 +is the winner of the Password Hashing Competition. +The main advantage of Argon2 over AES-KDF is that it provides a better +resistance against GPU/ASIC attacks (due to being a memory-hard function). + +

    The official specification of the Argon2 algorithm defines three +variants: Argon2d, Argon2id and Argon2i. +Argon2i is the least suitable variant in our case (KeePass database file); +therefore, KeePass only offers Argon2d and Argon2id.

    + +

    Argon2d provides the best resistance against GPU/ASIC attacks. +The resistance of Argon2id against GPU/ASIC attacks is somewhat weaker, +but Argon2id additionally makes certain side-channel attacks slightly harder.

    + +

    Side-channel attacks try to gain information from a system by +observing its behavior (e.g. the duration and the power consumption of +certain operations). On servers, side-channel attacks are a real threat. +On client devices (PCs), side-channel attacks are more difficult (more +noise, etc.); there are ideas how some might work in theory, but we are +not aware of any real attack in practice. +For example, the attack described in the article +'The Spy in the Sandbox / Side-Channel Attacks in Web Browsers' +was interesting (JavaScript code was able to detect certain user interactions), +but not a real threat (no extraction of sensitive data, as mentioned +explicitly in the article). This may or may not change in the future. +Note that this has nothing to do with cloud storage; KeePass encrypts/decrypts +a database file on a client device, and thus it is irrelevant where the +database file is stored (for side-channel attacks). +Furthermore, there are side-channel attacks that neither Argon2d nor Argon2id +(nor Argon2i, nor any other key derivation function) protects against (e.g. +Spectre/Meltdown side-channel attacks, which allow +spyware to read all memory).

    + +

    In the case of KeePass, we currently recommend Argon2d instead +of Argon2id, because we believe that a better protection against a +really existing threat (password cracking using GPUs/ASICs is state +of the art) is more important than a protection against certain +side-channel attacks that may or may not become a problem on client +devices in the future. +If you worry about side-channel attacks (and are willing to sacrifice +some GPU/ASIC resistance) or if you are developing a software where +side-channel attacks could be a problem (e.g. a server service that +operates with KeePass database files), use Argon2id.

    + +

    Side note: the IRTF CFRG Argon2 Internet standard recommends +Argon2id by default. For server applications, Argon2id is in general +indeed more suitable than Argon2d, but our situation (client device) +is different, as mentioned above.

    + +

    The number of iterations scales linearly with the required time. +By increasing the memory parameter, GPU/ASIC attacks become +harder (and the required time increases). +The parallelism parameter specifies how many threads should be used.

    + +

    We recommend the following procedure for determining the +Argon2 parameters:

    +
      +
    1. Set the number of iterations to 2.
    2. + +
    3. Find out the RAM size of each of your devices on which you want to +open your database file. Let M be the minimum of these sizes. +Set the memory parameter to min(M/2, 1 GB) +(i.e. use the half of M, if it is less than 1 GB, otherwise use 1 GB). +
        +
      • Example 1: if you have a PC with 32 GB RAM and a mobile phone +with 1 GB RAM (on which you want to open your database file), +set the memory parameter to 500 MB.
      • +
      • Example 2: if you have a PC with 32 GB RAM and a PC with 8 GB RAM, +set the memory parameter to 1 GB.
      • +
      +On Windows 10 and higher, the RAM size can be found in the system settings +→ 'System' → 'About'.
    4. + +
    5. Find out the number of logical processors of each of your devices. +Set the parallelism parameter to the minimum of these numbers. +On Windows 10 and higher, the number of logical processors can be found +in the Task Manager (right-click onto the taskbar → 'Task Manager') +on the 'Performance' tab page.
    6. + +
    7. Click the 'Test' button. +
        +
      • If the key transformation takes too much time (longer than you are +willing to wait when opening/saving the database file, e.g. more than +1 second), cancel it, decrease the memory parameter and click +the 'Test' button again. +Repeat this until the required time is acceptable.
      • + +
      • If the key transformation takes too few time (in the case of 1 GB memory), +increase the number of iterations and click the 'Test' button again. +Repeat this until you like the required time.
      • +
    8. + +
    9. Save the database file and try to open it on each of your other +devices. If this takes too long on one of the devices, +decrease the number of iterations (recommendation: not less than 2) +and/or decrease the memory parameter, and try it again.
    10. +
    + +

    When clicking the '1 Second Delay' button, KeePass uses a different +strategy for determining the parameters (relatively low values for the +memory and parallelism parameters, relatively high number of iterations), +because KeePass does not know the RAM and processor details of your other +devices (the default values should be compatible with most devices). +If you know these details, it is recommended to follow the +procedure above instead.

    +
  • + + +
+ +

Argon2 on iOS. If you are using a KeePass-compatible app +on iOS, please note the following limitation of iOS. +If the app uses a lot of RAM (e.g. due to using Argon2 with a +large memory parameter), then AutoFill may not work. +In this case, we recommend to use a relatively low value for the +Argon2 memory parameter (64 MB or less, depending on the app and the +database size) and a relatively high number of iterations.

+ +

KeePassX. In contrast to KeePass, the Linux port KeePassX +only partially supports protection against dictionary and guessing attacks.

+ +
+ + +

+Random Number Generation

+ +

KeePass first creates an entropy pool using various entropy sources +(including random numbers generated by the system cryptographic provider, +current date/time and uptime, cursor position, operating system version, +processor count, environment variables, process and memory statistics, +current culture, a new random GUID, etc.).

+ +

The random bits for the high-level generation methods are generated +using a cryptographically secure pseudo-random number generator +(based on SHA-256/SHA-512 and ChaCha20) that is initialized using the entropy pool.

+ +
+ + +

+Process Memory Protection

+ +

While KeePass is running, sensitive data is stored encryptedly +in the process memory. +This means that even if you would dump the KeePass process memory to disk, +you could not find any sensitive data. +For performance reasons, the process memory protection only applies +to sensitive data; sensitive data here includes for instance the master key +and entry passwords, but not user names, notes and file attachments. +Note that this has nothing to do with the +encryption of database files; +in database files, all data (including user names, etc.) is encrypted.

+ +

Furthermore, KeePass erases all security-critical memory (if possible) +when it is not needed anymore, i.e. it overwrites these memory areas +before releasing them.

+ +

KeePass uses the Windows DPAPI for encrypting sensitive data in memory + +(via CryptProtectMemory / + +ProtectedMemory). +With DPAPI, the key for the memory encryption is stored in a +secure, non-swappable memory area managed by Windows. +DPAPI is available on Windows 2000 and higher. +KeePass 2.x always uses DPAPI when it is available; +in KeePass 1.x, this can be disabled (in the advanced options; by default +using DPAPI is enabled; if it is disabled, KeePass 1.x uses the ARC4 encryption +algorithm with a random key; note that this is less secure than DPAPI, mainly not +because ARC4 cryptographically is not that strong, but because the key for +the memory encryption is also stored in swappable process memory; +similarly, KeePass 2.x falls back to encrypting the process memory using +ChaCha20, if DPAPI is unavailable). +On Unix-like systems, KeePass 2.x uses ChaCha20, because Mono does not provide +any effective memory protection method.

+ +

For some operations, KeePass must make sensitive data available +unencryptedly in the process memory. For example, in order to show a password +in the standard list view control provided by Windows, KeePass must supply +the cell content (the password) as unencrypted string +(unless hiding using asterisks is enabled). +Operations that result in unencrypted data in the process memory include, +but are not limited to: displaying data (not asterisks) in standard controls, +searching data, replacing placeholders (during auto-type, drag&drop, +copying to clipboard, ...), importing/exporting files (except KDBX) +and loading/saving unencrypted files. +Windows and .NET may make copies of the data (in the process memory) +that cannot be erased by KeePass.

+ +
+ + +

+Enter Master Key on Secure Desktop (Protection against Keyloggers)

+ +

KeePass 2.x has an option (in 'Tools' → 'Options' → tab 'Security') +to show master key dialogs on a different/secure desktop +(supported on Windows 2000 and higher), similar to Windows' +User Account Control (UAC). Almost no keylogger works on a secure desktop.

+ +

The option is turned off by default for compatibility reasons.

+ +

More information can be found on the +Secure Desktop +help page.

+ + +Note that auto-type can be secured against keyloggers, too, by using +Two-Channel Auto-Type Obfuscation. + + +

Note: KeePass was one of the first password managers that allow +entering the master key on a different/secure desktop!

+ +
+ + +

+Locking the Workspace

+ +

When locking the workspace, KeePass closes the database file and +only remembers its path and certain view parameters.

+ +

This provides maximum security: unlocking the +workspace is as hard as opening the database file the normal way. Also, it prevents +data loss (the computer can crash while KeePass is locked, without doing any damage +to the database).

+ +

When a sub-dialog is open, the workspace may not be locked; +for details, see the FAQ.

+ +
+ + +

+Viewing/Editing Attachments

+ +

KeePass 2.x has an internal viewer/editor for attachments. +For details how to use it for working with texts, see +'How to store and work with large amounts of +(formatted) text?'.

+ +

The internal viewer/editor works with the data in main memory. +It does not extract/store the data onto disk.

+ +

When trying to open an attachment that the internal viewer/editor cannot handle +(e.g. a PDF file), KeePass extracts the attachment to a (EFS-encrypted) +temporary file and opens it using the default application associated with this file type. +After finishing viewing/editing, the user can choose between importing +or discarding any changes made to the temporary file. +In any case, KeePass afterwards securely deletes the temporary file +(including overwriting it).

+ +
+ + +

+Plugins

+ + + + +

A separate page exist about the security of plugins: +Plugin Security.

+ + +
+ + +

+Self-Tests

+ +

Each time you start KeePass, the program performs a quick self-test to see +whether the encryption and hash algorithms work correctly and pass +their test vectors. If one of the algorithms does not pass its test vectors, +KeePass shows a security exception dialog.

+ +
+ + +

+Specialized Spyware

+ +

This section gives answers to questions like the following:

+ +
    +
  • Would encrypting the configuration file increase security by preventing +changes by a malicious program?
  • +
  • Would encrypting the application (executable file, eventually together +with the configuration file) increase security by preventing changes +by a malicious program?
  • +
  • Would an option to prevent plugins from being loaded increase security?
  • +
  • Would storing security options in the database (to override the settings of +the KeePass instance) increase security?
  • +
  • Would locking the main window in such a way that only auto-type is allowed +increase security?
  • +
+ +

The answer to all these questions is: no. Adding any of these features +would not increase security.

+ +

All security features in KeePass protect against generic threats like +keyloggers, clipboard monitors, password control monitors, etc. (and against +non-runtime attacks on the database, memory dump analyzers, ...). +However in all the questions above we are assuming that there is a spyware +program running on the system that is specialized on attacking KeePass.

+ +

In this situation, the best security features will fail. +This is law #1 of the + + +Ten Immutable Laws of Security +(Microsoft TechNet article; see also the +Microsoft TechNet article + +Revisiting the 10 Immutable Laws of Security, Part 1):
+"If a bad guy can persuade you to run his program on your +computer, it's not your computer anymore".

+ +

For example, consider the following very simple spyware specialized +for KeePass: an application that waits for KeePass to be started, then hides +the started application and imitates KeePass itself. All interactions +(like entering a password for decrypting the configuration, etc.) can be +simulated. +The only way to discover this spyware is to use a program that the spyware +does not know about or cannot manipulate (secure desktop); +in any case it cannot be KeePass.

+ +

For protecting your PC, we recommend using an anti-virus software. +Use a proper firewall, only run software from trusted sources, +do not open unknown e-mail attachments, etc.

+ +
+ + +

+Malicious Data

+ +

The user should check all data that he enters and/or runs.

+ +

If you enter/run data without checking it first, this can lead to +security problems (like for instance a disclosure of sensitive data +or an execution of malicious code). This is a general principle; +it applies to most applications, not only to KeePass.

+ +

Examples:

+
    +
  • The URL field of an entry supports running +a command line. +So, if you (enter and) run a URL without checking it first, +you might run a malicious program/code.
  • + +
  • When running a URL, a malicious URL override +(global or entry-specific) may be executed instead, if you did not check it.
  • + +
  • KeePass supports placeholders. +All regular placeholders are of the form '{...}', and +environment variables +are of the form '%...%'. +All data should be checked for malicious placeholders and environment variables. + +
      +
    • Field references can insert data of +other entries into the current data. For example, if you have a Facebook account, +entering and running the following URL might send your Facebook user name +and the password to the 'example.com' server:
      +https://example.com/?u={REF:U@T:Facebook}&p={REF:P@T:Facebook}
    • + +
    • The {CMD:...} placeholder +runs a command line. For example, the following URL opens +'https://example.com/' and runs 'Calc.exe':
      +https://example.com/{CMD:/Calc.exe/W=0/}
    • +
    + +Text transformation placeholders +may be used to obfuscate parts of the data.
  • + +
  • The following auto-type sequence +performs a login and additionally runs 'Calc.exe':
    +{USERNAME}{TAB}{PASSWORD}{ENTER}{VKEY +91}{T-CONV:/%43%61%6C%63%2E%65%78%65/Uri-Dec/}{VKEY 13}
    +This sequence typically only works on a Windows system, but similar +sequences can be constructed for other operating systems +(like Linux and MacOS).
  • + +
  • If you specify weak key transformation +settings suggested by an attacker, this might make it easier for the +attacker to decrypt/open your database.
  • + +
  • If you enter/use a password generator +profile (suggested by an attacker) that allows weak passwords only, +accounts using such weak passwords may not be well protected.
  • + +
  • Using the XML Replace feature with malicious parameters may +result in a malicious modification of data in your database.
  • + +
  • Pasting/entering malicious triggers in the triggers dialog without checking +them can result in security problems.
  • +
+ +

If the user checks the data that he enters/runs, none of the +"attacks" above works. Entering data is a manual operation +(i.e. an attacker cannot do this himself), and only the user can +decide whether the resulting effect is intended or not. +Showing warning/confirmation dialogs all the time would not be reasonable.

+ +

When opening a database that has been created/modified by +someone else, you should carefully check all data that you want to use. +If you do not fully trust the creator of the database, do not +open any files attached to entries.

+ +
+ + +

+Options for Experts

+ +

Most security options can be configured in the options dialog of +KeePass (menu 'Tools' → 'Options') and in the database settings +dialog (menu 'File' → 'Database Settings').

+ +

However, in KeePass 2.x, there additionally are a few security options +for experts that cannot be configured in the user interface. +For example, KeePass can protect its process with a +discretionary access control list (DACL), and +its windows can be protected against certain screen capture operations.

+ +

Warning +Activating these options for experts may result in compatibility problems and +may make KeePass unusable. Therefore, these options can only be activated by +editing the configuration file manually (using an XML or text editor). +This ensures that users know how they can deactivate the problematic options +(by editing the configuration file once more) +in order to make KeePass usable again.

+ +

If you know how the configuration +system of KeePass works, then see the +customization +help page, on which these options are documented.

+ +
+ + +

+Options for Administrators

+ +

Administrators can enforce certain settings, disallow certain functions, +specify requirements for master passwords, and much more. +Details can be found on the following help pages:

+ + + +
+ + +

+Security Issues

+ +

For a list of security issues, their status and clarifications, please see the page +Security Issues.

+ + + diff --git a/src/Docs/Chm/help/base/tans.html b/src/Docs/Chm/help/base/tans.html new file mode 100644 index 0000000..4507a5f --- /dev/null +++ b/src/Docs/Chm/help/base/tans.html @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + TAN Support - KeePass + + + + + + + + + + + + +

TAN Support

+

KeePass supports Transaction Authentication Numbers (TANs).

+ + + +

KeePass supports TANs, i.e. passwords that can be used only +once. +These special passwords are used by some banks: you need to confirm +transactions using such TANs. This provides additional security, as +a spy cannot perform transactions, even if he knows the password of +your banking account.

+ +
+ + +

+Using the TAN Wizard to add TANs

+ +

You can use the KeePass TAN Wizard to add several TANs at once to your +database. Just open the TAN wizard dialog (menu Tools - TAN Wizard) and enter +all your TANs. The formatting doesn't really +matter, KeePass just uses all alphanumerical strings, i.e. characters like line breaks, +tabs, spaces, dots, etc. are interpreted as separators.

+ +

The wizard will then generate several TAN entries from the data you entered into the dialog. Each +TAN is a standard KeePass entry. The title of a TAN entry always is set to "<TAN>". +This tells KeePass that the entry is a TAN entry. You cannot change the title, user +name and URL of a TAN. But you can freely add notes to a TAN entry, if you wish.

+ +
+ + +

+Using TANs

+ +

When you use the TAN (e.g. execute the "Copy Password" command on +it), its expiration date will be set +to the current time, which expires the entry. It will get a red +X as icon. +If you later want to know when you used a specific TAN, +you can just have a look at its expiration date.

+ +

When copying a TAN to the clipboard, the database is marked as modified. You must save +the file in order to remember the usage of a TAN.

+ +

If you accidently used a TAN without needing it, you can reset it (i.e. remove the red +X and show it as valid TAN again). To do this, open the +TAN entry (right-click it and choose 'Edit/View Entry...'). Here, uncheck the +'Expires' checkbox. Click [OK] to close the dialog.

+ + + diff --git a/src/Docs/Chm/help/base/terms.html b/src/Docs/Chm/help/base/terms.html new file mode 100644 index 0000000..b02e90c --- /dev/null +++ b/src/Docs/Chm/help/base/terms.html @@ -0,0 +1,1311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Legal Documentation - KeePass + + + + + + + + + + + + + + + + + + +

Legal Documentation

+

Terms of use, disclaimer and privacy policy.

+ +

+English:

+ + +

+German (Deutsch):

+ + +

Only the German version is legally binding.

+ +
+ +

+English

+ + +

Content

+ +

The author reserves the right not to be responsible for the topicality, +correctness, completeness or quality of the information provided. +Liability claims against the author relating to material or non-material +damage caused by the use or non-use of the information provided or by the +use of incorrect or incomplete information are generally excluded, +unless it can be proven that the author acted intentionally or +with gross negligence.

+ +

All offers are subject to change and non-binding. +The author expressly reserves the right to change, extend or delete +parts of the pages or the entire publication or to cease the publication +temporarily or permanently without separate announcement.

+ +
+ + +

Referrals and Links

+ +

In the case of direct or indirect referrals and links to external +websites that lie outside the author's area of responsibility, +liability would only come into force if the author had knowledge of +the content and it were technically possible and reasonable for him +to prevent use in the case of illegal content.

+ +

The author hereby expressly declares that at the time of setting the +referral or link no illegal content was discernible on the referred/linked pages. +The author has no influence whatsoever on the current and future design, +content or authorship of the referred/linked pages. +Therefore, he hereby expressly dissociates himself from all contents of all +referred/linked pages which were changed after the referral or link setting. +This statement applies to all referrals and links within the author's own +Internet offer as well as to foreign entries in guest books, discussion +forums, link directories, mailing lists and all other forms of databases +set up by the author to whose content external write accesses are possible. +For illegal, incorrect or incomplete contents and in particular for damages +arising from the use or non-use of information presented in this way, +only the provider of the page to which the referral/link was made is liable, +not the person who merely refers/links to the respective publication.

+ +
+ + +

Copyright and Trademark Rights

+ +

The author endeavours to respect applicable copyrights in all publications. +However, if in spite of all efforts a copyright is violated, we will +remove the relevant item from the publication on notification or +will insert information on the copyright.

+ +

All brands and trademarks mentioned within the publication that are +subject to property rights of third parties are subject to the +provisions of the applicable trademark law and the property rights of the +registered owner without restriction. +The mere mention of a trademark does not imply that it is not protected +by third-party rights.

+ +

The copyright for any material (images, diagrams, sounds, videos, texts, etc.) +created by the author is reserved. +Any duplication or use of such material in other electronic or printed +publications is not permitted without the author's explicit consent.

+ +
+ + +

Privacy

+ +

Controller

+ +

See Imprint.

+ +
+ +

General Information on Data Processing

+ +

If the opportunity for the input of personal or business data (e-mail +addresses, name, addresses) is given, the input of this data takes place +voluntarily. The use and payment of all offered services is permitted – +if and so far technically possible and reasonable – without +specification of any personal data or under specification of anonymized data +or an alias.

+ +

The use of published postal addresses, telephone or fax numbers and +e-mail addresses for marketing purposes is prohibited. +We expressly reserve the right to take legal action against senders of +so-called spam mails who violate this prohibition.

+ +
Scope of Processing of Personal Data
+ +

We only process personal data of our users if this is necessary to +provide a functional website as well as our contents and services. +The processing of personal data of our users takes place regularly only +after consent of the user. +An exception applies in those cases where prior consent cannot be obtained +for real reasons and the processing of the data is permitted by law.

+ +
Legal Basis for the Processing of Personal Data
+ +
    +
  • If we obtain the consent of the data subject for the processing of +personal data, Art. 6 para. 1 lit. a EU General Data Protection Regulation +(GDPR) serves as the legal basis.
  • + +
  • In the processing of personal data required for the performance of a +contract to which the data subject is a party, Art. 6 para. 1 lit. b GDPR +serves as the legal basis. +This also applies to processing operations that are necessary to carry out +pre-contractual measures.
  • + +
  • If the processing of personal data is necessary to comply with a legal +obligation to which the controller is subject, Art. 6 para. 1 lit. c GDPR +serves as the legal basis.
  • + +
  • In the event that the vital interests of the data subject or another +natural person require the processing of personal data, +Art. 6 para. 1 lit. d GDPR serves as the legal basis.
  • + +
  • If the processing is necessary for the purposes of the legitimate interests +pursued by the controller or by a third party and if the interests, +fundamental rights and freedoms of the data subject do not outweigh the +former interest, Art. 6 para. 1 lit. f GDPR serves as the legal basis.
  • +
+ +
Data Erasure and Storage Time
+ +

The personal data of the data subject will be erased or blocked as soon +as the purpose of storage ceases to apply. +The data may be stored beyond that if the European or national legislator +has provided for this in EU regulations, laws or other provisions to which +the controller is subject. +The data will also be erased or blocked if a storage period prescribed by +the aforementioned standards expires, unless there is a need for further +storage of the data for the conclusion or performance of a contract.

+ +
+ +

Provision of the Website and Creation of Log Files

+ +

Every time you visit our website, our system automatically collects data +and information of the calling computer. +The following data is collected:

+ +
    +
  1. Information about the browser type and version used.
  2. +
  3. The user's operating system.
  4. +
  5. The user's Internet service provider.
  6. +
  7. The IP address of the user.
  8. +
  9. Date and time of access.
  10. +
  11. Websites from which the user's system reaches our website.
  12. +
  13. Websites that are accessed by the user's system via our website.
  14. +
+ +

The data is also stored in the log files of our system. +This data is not stored together with other personal data of the user.

+ +

The temporary storage of the IP address by the system is necessary to +enable the website to be delivered to the user's computer. +For this the IP address of the user must remain stored for the duration +of the session.

+ +

The data is stored in log files to ensure the functionality of the website. +In addition, the data serves us to optimize the website and to ensure +the security of our information technology systems. +An evaluation of the data for marketing purposes does not take place in +this context.

+ +

The legal basis for the temporary storage of the data and the log files +is Art. 6 para. 1 lit. f GDPR. +Our legitimate interests lie in the above-mentioned purposes.

+ +

The data will be deleted as soon as they are no longer necessary to +achieve the purpose for which they were collected:

+ +
    +
  • In the case of the collection of data for the provision of the +website, this is the case when the respective session has ended.
  • + +
  • In the case of storing the data in log files, this is the case +after seven days at the latest. Further storage is possible; +in this case, the IP addresses of the users are erased or anonymized, +so that an association of the calling client is no longer possible.
  • +
+ +

The collection of the data for the provision of the website and the +storage of the data in log files is absolutely necessary for the +operation of the website. +Consequently, there is no possibility of objection on the part of the user.

+ +
+ +

Cookies

+ +

Our website uses cookies. +Cookies are text files that are stored in the browser or by the +browser on the user's computer system. +If a user visits a website, a cookie may be stored on the user's system. +This cookie may contain a characteristic string that uniquely identifies +the browser when you return to the website.

+ +

We use cookies to make our website more user-friendly. +Some elements of our website require that the calling browser can +be identified even after a page change.

+ +

The following data is stored and transmitted in the cookies:

+
    +
  • Status of the notification about the use of cookies (Cookie Consent).
    +Cookie name: RwlConsent, lifetime: ≤ 1 year.
  • +
  • Third-party data (see below).
  • +
+ +

The purpose of using technically necessary cookies is to simplify +the use of websites for users. +Some functions of our website cannot be offered without the use of cookies. +For this it is necessary that the browser is recognized even after a page change.

+ +

We need cookies for the following applications:

+
    +
  • Remembering the status of the notification about the use of cookies (Cookie Consent).
  • +
  • Third-party applications (see below).
  • +
+ +

The user data collected via technically necessary cookies are not +used to create user profiles.

+ +

The legal basis for the processing of personal data using cookies +is Art. 6 para. 1 lit. f GDPR. +Our legitimate interests lie in the above-mentioned purposes.

+ +

The user's computer stores and transmits cookies. +Therefore, you as a user also have full control over the use of cookies. +You can deactivate or restrict the transmission of cookies by changing +the settings in your browser. +Cookies that have already been saved can be erased at any time. +This can also be done automatically. +Please consult the documentation of your browser. +Links to the cookie management documentations of some popular browsers:

+ + +

If cookies are deactivated for our website, it may no longer be possible +to use all functions of the website to the full extent.

+ +
+ +

Advertising

+ +

We use third-party advertising companies (Google) to serve ads when you visit our +website. These companies may use information (not including your name, address, +e-mail address or telephone number) about your visits to this and other websites +in order to provide advertisements about goods and services of interest to you. +For more information about the methods and how you can prevent this information +from being used by third parties, see:

+ + +

In the European Economic Area and California, +only non-personalized advertising is displayed on our website.

+ +

When you visit a page on our website, your browser contacts the +third party servers. +The third party provider obtains among other things your IP address, +the browser type and the address (URL) of the visited page.

+ +

The legal basis is Art. 6 para. 1 lit. f GDPR; +our website is financed by advertising.

+ +
+ +

Contact Form and E-Mail Contact

+ +

There is a contact form on our website, which can be used for +electronic contact. +When a user takes advantage of this possibility, the data entered in +the input mask is transmitted to us and stored. +At the time the message is sent, the current date and time are also stored.

+ +

Alternatively, it is possible to contact us via the e-mail address provided. +In this case, the user's personal data transmitted by e-mail is stored.

+ +

In this context, the data is not passed on to third parties.

+ +

The data is used only to process the contact or conversation.

+ +

The legal basis for the processing of the data is Art. 6 para. 1 lit. f GDPR. +Our legitimate interests lie in the above-mentioned purposes. +If the contact is aimed at the conclusion of a contract, +Art. 6 para. 1 lit. b GDPR is an additional legal basis.

+ +

If a legal archiving obligation applies, the data is stored for +the prescribed duration. +Otherwise, the data are erased as soon as they are no longer necessary +to achieve the purposes of their collection. +For the personal data sent via contact form or e-mail, this is the case +when the conversation with the user is finished. +The conversation is finished when the circumstances indicate that the +matter in question has been finally clarified.

+ +

You have the possibility to object to the storage of your personal data +at any time. To do this, send an appropriate e-mail to the controller. +In this case, all data stored in the course of the contact or conversation +will be erased without undue delay, and the conversation cannot be continued.

+ +
+ +

Rights of the Data Subject

+ +

If your personal data is processed, you are a data subject in terms of +the GDPR and have the following rights.

+ +
Right of Access
+ +

You can ask the controller to confirm whether personal data concerning +you is processed by us.

+ +

If such processing takes place, you can request the following information +from the controller:

+
    +
  1. the purposes of the processing;
  2. +
  3. the categories of personal data concerned;
  4. +
  5. the recipients or categories of recipient to whom the personal data +have been or will be disclosed;
  6. +
  7. the envisaged period for which the personal data will be stored, +if possible, or otherwise the criteria used to determine that period;
  8. +
  9. the existence of the right to request from the controller +rectification or erasure of personal data or restriction of processing of +personal data concerning the data subject or to object to such processing;
  10. +
  11. the right to lodge a complaint with a supervisory authority;
  12. +
  13. where the personal data are not collected from the data subject, +any available information as to their source;
  14. +
  15. the existence of automated decision-making, including profiling, +referred to in Art. 22 para. 1 and 4 GDPR and, at least in those cases, +meaningful information about the logic involved, as well as the significance +and the envisaged consequences of such processing for the data subject.
  16. +
+ +

You have the right to request information as to whether the personal +data concerning you is transferred to a third country or to an +international organization. +In this context, pursuant to Art. 46 GDPR you may request to be informed +of the appropriate safeguards relating to the transfer.

+ +
Right to Rectification
+ +

You have the right to rectification and/or completion if the personal +data processed concerning you is incorrect or incomplete. +The controller shall make the correction without undue delay.

+ +
Right to Restriction of Processing
+ +

Under the following conditions, you may request the restriction of the +processing of personal data concerning you:

+ +
    +
  1. if you contest the accuracy of the personal data, for a period +enabling the controller to verify the accuracy of the personal data;
  2. +
  3. the processing is unlawful and you oppose the erasure of the personal +data and request the restriction of their use instead;
  4. +
  5. the controller no longer needs the personal data for the purposes of +the processing, but they are required by you for the establishment, +exercise or defence of legal claims;
  6. +
  7. you object to processing pursuant to Art. 21 para. 1 GDPR pending the +verification whether the legitimate grounds of the controller override yours.
  8. +
+ +

Where processing has been restricted, your personal data shall, +with the exception of storage, only be processed with your consent or +for the establishment, exercise or defence of legal claims or for the +protection of the rights of another natural or legal person or for reasons +of important public interest of the Union or of a Member State.

+ +

If processing has been restricted pursuant to the above conditions, +you will be informed by the controller before the restriction is lifted.

+ +
Right to Erasure
+ +

Erasure Obligation. +You have the right to obtain from the controller the erasure of personal data +concerning you without undue delay. +The controller has the obligation to erase personal data without undue delay +where one of the following grounds applies:

+
    +
  1. The personal data are no longer necessary in relation to the purposes +for which they were collected or otherwise processed.
  2. +
  3. You withdraw your consent on which the processing is based (according to +Art. 6 para. 1 lit. a or Art. 9 para. 2 lit. a GDPR), and where there is no +other legal ground for the processing.
  4. +
  5. You object to the processing pursuant to Art. 21 para. 1 GDPR and +there are no overriding legitimate grounds for the processing, or you +object to the processing pursuant to Art. 21 para. 2 GDPR.
  6. +
  7. The personal data have been unlawfully processed.
  8. +
  9. The personal data have to be erased for compliance with a legal +obligation in Union or Member State law to which the controller is subject.
  10. +
  11. The personal data have been collected in relation to the offer of +information society services referred to in Art. 8 para. 1 GDPR.
  12. +
+ +

Information to Third Parties. +Where the controller has made the personal data public and is obliged +pursuant to Art. 17 para. 1 GDPR to erase the personal data, the controller, +taking account of available technology and the cost of implementation, +shall take reasonable steps, including technical measures, to inform +controllers which are processing the personal data that you have requested +the erasure by such controllers of any links to, or copy or replication of, +those personal data.

+ +

Exceptions. +The right to erasure does not apply where processing is necessary

+
    +
  1. for exercising the right of freedom of expression and information;
  2. +
  3. for compliance with a legal obligation which requires processing by +Union or Member State law to which the controller is subject or for +the performance of a task carried out in the public interest or in the +exercise of official authority vested in the controller;
  4. +
  5. for reasons of public interest in the area of public health in +accordance with Art. 9 para. 2 lit. h and i as well as Art. 9 para. 3 GDPR;
  6. +
  7. for archiving purposes in the public interest, scientific or +historical research purposes or statistical purposes in accordance with +Art. 89 para. 1 GDPR in so far as the right referred to in +Art. 17 para. 1 GDPR is likely to render impossible or seriously +impair the achievement of the objectives of that processing;
  8. +
  9. for the establishment, exercise or defence of legal claims.
  10. +
+ +
Right to Notification
+ +

The controller communicates any rectification or erasure of personal +data or restriction of processing carried out in accordance with +Art. 16, Art. 17 para. 1 and Art. 18 GDPR to each recipient to whom +the personal data have been disclosed, unless this proves impossible +or involves disproportionate effort.

+ +

You have the right to request to be informed about those recipients +by the controller.

+ +
Right to Data Portability
+ +

You have the right to receive the personal data concerning you, +which you have provided to the controller, in a structured, +commonly used and machine-readable format and have the right to +transmit those data to another controller without hindrance from +the controller to which the personal data have been provided, where

+
    +
  1. the processing is based on consent pursuant to Art. 6 para. 1 lit. a +or Art. 9 para. 2 lit. a GDPR or on a contract pursuant to +Art. 6 para. 1 lit. b GDPR, and
  2. +
  3. the processing is carried out by automated means.
  4. +
+ +

In exercising this right, you further have the right to have the +personal data transmitted directly from one controller to another, +where technically feasible. +Freedoms and rights of others must not be affected adversely.

+ +

The right to data portability does not apply to processing necessary +for the performance of a task carried out in the public interest or in +the exercise of official authority vested in the controller.

+ +
Right to Object
+ +

You have the right to object, on grounds relating to your particular +situation, at any time to processing of personal data concerning you +which is based on Art. 6 para. 1 lit. e or f GDPR, +including profiling based on those provisions.

+ +

The controller no longer processes your personal data unless the +controller demonstrates compelling legitimate grounds for the processing +which override your interests, rights and freedoms or for the +establishment, exercise or defence of legal claims.

+ +

Where personal data are processed for direct marketing purposes, +you have the right to object at any time to processing of personal data +concerning you for such marketing, which includes profiling to the +extent that it is related to such direct marketing.

+ +

If you object to processing for direct marketing purposes, your +personal data is no longer processed for such purposes.

+ +

In the context of the use of information society services, and +notwithstanding Directive 2002/58/EC, you may exercise your right +to object by automated means using technical specifications.

+ +
Right to Withdraw the Data Protection Declaration of Consent
+ +

You have the right to withdraw your consent at any time. +The withdrawal of consent does not affect the lawfulness of processing +based on consent before its withdrawal.

+ +
Automated Individual Decision-Making, Including Profiling
+ +

You have the right not to be subject to a decision based solely on +automated processing, including profiling, which produces legal effects +concerning you or similarly significantly affects you. +This does not apply if the decision

+
    +
  1. is necessary for entering into, or performance of, a contract between +you and the controller;
  2. +
  3. is authorised by Union or Member State law to which the controller +is subject and which also lays down suitable measures to safeguard your +rights and freedoms and legitimate interests; or
  4. +
  5. is based on your explicit consent.
  6. +
+ +

However, these decisions are not based on special categories of +personal data referred to in Art. 9 para. 1 GDPR, unless +Art. 9 para. 2 lit. a or g GDPR applies and suitable measures to +safeguard your rights and freedoms and legitimate interests are in place.

+ +

In the cases 1. and 3., the data controller implements suitable +measures to safeguard your rights and freedoms and legitimate interests, +at least the right to obtain human intervention on the part of the +controller, to express your point of view and to contest the decision.

+ +
Right to Lodge a Complaint With a Supervisory Authority
+ +

Without prejudice to any other administrative or judicial remedy, +you have the right to lodge a complaint with a supervisory authority, +in particular in the Member State of your habitual residence, place of +work or place of the alleged infringement if you consider that the +processing of personal data relating to you infringes the GDPR.

+ +

The supervisory authority with which the complaint has been lodged +informs the complainant on the progress and the outcome of the +complaint including the possibility of a judicial remedy pursuant to +Art. 78 GDPR.

+ +
+ + + +

KeePass License

+ +

The terms under which KeePass is distributed can be found on the +following pages: +KeePass 1.x License, +KeePass 2.x License.

+ +

See also the Acknowledgements/Credits page +(includes third-party licenses).

+ +
+ + + +

Legal Validity of this Documentation

+ +

This legal documentation is to be regarded as part of the Internet +publication from which you were referred to this page. +If sections or individual terms of this statement are not legal or +correct, the content or validity of the other parts remain uninfluenced +by this fact.

+ +

+ +

+German (Deutsch)

+ + +

Inhalt

+ +

Der Autor übernimmt keinerlei Gewähr für die Aktualität, Korrektheit, +Vollständigkeit oder Qualität der bereitgestellten Informationen. +Haftungsansprüche gegen den Autor, welche sich auf Schäden materieller +oder nicht-materieller Art beziehen, die durch die Nutzung oder Nichtnutzung +der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter +oder unvollständiger Informationen verursacht wurden, sind +grundsätzlich ausgeschlossen, sofern seitens des Autors kein +nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt.

+ +

Alle Angebote sind freibleibend und unverbindlich. +Der Autor behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte +Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu +löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen.

+ +
+ + +

Verweise und Links

+ +

Bei direkten oder indirekten Verweisen und Links auf fremde Webseiten, +die außerhalb des Verantwortungsbereiches des Autors liegen, +würde eine Haftungsverpflichtung ausschließlich in +dem Fall in Kraft treten, in dem der Autor von den Inhalten Kenntnis +hat und es ihm technisch möglich und zumutbar wäre, die Nutzung im +Falle rechtswidriger Inhalte zu verhindern.

+ +

Der Autor erklärt hiermit ausdrücklich, dass zum Zeitpunkt der +Verweis- bzw. Linksetzung keine illegalen Inhalte auf den verwiesenen/verlinkten +Seiten erkennbar waren. Auf die aktuelle und zukünftige Gestaltung, +die Inhalte oder die Urheberschaft der verwiesenen/verlinkten Seiten +hat der Autor keinerlei Einfluss. Deshalb distanziert er sich +hiermit ausdrücklich von allen Inhalten aller verwiesenen/verlinkten Seiten, +die nach der Verweis- bzw. Linksetzung verändert wurden. +Diese Feststellung gilt für alle innerhalb des eigenen Internetangebotes +gesetzten Verweise und Links sowie für Fremdeinträge in vom Autor +eingerichteten Gästebüchern, Diskussionsforen, Linkverzeichnissen, +Mailinglisten und in allen anderen Formen von Datenbanken, auf +deren Inhalt externe Schreibzugriffe möglich sind. Für illegale, +fehlerhafte oder unvollständige Inhalte und insbesondere für +Schäden, die aus der Nutzung oder Nichtnutzung solcherart +dargebotener Informationen entstehen, haftet allein der +Anbieter der Seite, auf welche verwiesen wurde, nicht derjenige, +der über Verweise oder Links auf die jeweilige Veröffentlichung +lediglich verweist.

+ +
+ + +

Urheber- und Kennzeichenrecht

+ +

Der Autor ist bestrebt, in allen Publikationen geltende Urheberrechte +zu beachten. Sollte es trotzdem zu einer Urheberrechtsverletzung kommen, +werden wir das entsprechende Objekt nach Benachrichtigung aus unserer +Publikation entfernen oder Informationen zum Urheberrecht hinzufügen.

+ +

Alle innerhalb des Internetangebots genannten und ggf. durch Dritte +geschützten Marken- und Warenzeichen unterliegen uneingeschränkt den +Bestimmungen des jeweils gültigen Kennzeichenrechts und den +Besitzrechten der jeweiligen eingetragenen Eigentümer. +Allein aufgrund der bloßen Nennung ist nicht der Schluss zu ziehen, +dass Markenzeichen nicht durch Rechte Dritter geschützt sind.

+ +

Das Copyright für veröffentlichte, vom Autor selbst erstellte +Objekte (Bilder, Grafiken, Tondokumente, Videosequenzen, Texte, usw.) +bleibt allein beim Autor der Seiten. +Eine Vervielfältigung oder Verwendung solcher Objekte in anderen +elektronischen oder gedruckten Publikationen ist ohne ausdrückliche +Zustimmung des Autors nicht gestattet.

+ +
+ + +

Datenschutz

+ +

Verantwortlicher

+ +

Siehe Impressum.

+ +
+ +

Allgemeines zur Datenverarbeitung

+ +

Sofern innerhalb des Internetangebotes die Möglichkeit zur +Eingabe persönlicher oder geschäftlicher Daten (E-Mail-Adressen, +Namen, Anschriften) besteht, so erfolgt die Preisgabe dieser Daten seitens +des Nutzers auf ausdrücklich freiwilliger Basis. Die Inanspruchnahme +und Bezahlung aller angebotenen Dienste ist – soweit technisch +möglich und zumutbar – auch ohne Angabe solcher Daten bzw. +unter Angabe anonymisierter Daten oder eines Pseudonyms gestattet.

+ +

Die Nutzung der im Rahmen des Impressums oder vergleichbarer +Angaben veröffentlichten Kontaktdaten wie Postanschriften, +Telefon- und Faxnummern sowie E-Mail-Adressen durch Dritte zur +Übersendung von nicht ausdrücklich angeforderten Informationen +zu Marketing-Zwecken ist nicht gestattet. +Rechtliche Schritte gegen die Versender von sogenannten Spam-Mails +bei Verstößen gegen dieses Verbot sind ausdrücklich vorbehalten.

+ +
Umfang der Verarbeitung personenbezogener Daten
+ +

Wir verarbeiten personenbezogene Daten unserer Nutzer grundsätzlich nur, +soweit dies zur Bereitstellung einer funktionsfähigen Website sowie +unserer Inhalte und Leistungen erforderlich ist. Die Verarbeitung +personenbezogener Daten unserer Nutzer erfolgt regelmäßig nur nach +Einwilligung des Nutzers. Eine Ausnahme gilt in solchen Fällen, +in denen eine vorherige Einholung einer Einwilligung aus tatsächlichen +Gründen nicht möglich ist und die Verarbeitung der Daten durch +gesetzliche Vorschriften gestattet ist.

+ +
Rechtsgrundlage für die Verarbeitung personenbezogener Daten
+ +
    +
  • Soweit wir für Verarbeitungsvorgänge personenbezogener Daten eine +Einwilligung der betroffenen Person einholen, dient Art. 6 Abs. 1 lit. a +EU-Datenschutzgrundverordnung (DSGVO) als Rechtsgrundlage.
  • + +
  • Bei der Verarbeitung von personenbezogenen Daten, die zur Erfüllung eines +Vertrages, dessen Vertragspartei die betroffene Person ist, erforderlich ist, +dient Art. 6 Abs. 1 lit. b DSGVO als Rechtsgrundlage. Dies gilt auch für +Verarbeitungsvorgänge, die zur Durchführung vorvertraglicher Maßnahmen +erforderlich sind.
  • + +
  • Soweit eine Verarbeitung personenbezogener Daten zur Erfüllung einer +rechtlichen Verpflichtung erforderlich ist, der der Verantwortliche +unterliegt, dient Art. 6 Abs. 1 lit. c DSGVO als Rechtsgrundlage.
  • + +
  • Für den Fall, dass lebenswichtige Interessen der betroffenen Person oder +einer anderen natürlichen Person eine Verarbeitung personenbezogener Daten +erforderlich machen, dient Art. 6 Abs. 1 lit. d DSGVO als Rechtsgrundlage.
  • + +
  • Ist die Verarbeitung zur Wahrung eines berechtigten Interesses des +Verantwortlichen oder eines Dritten erforderlich und überwiegen die Interessen, +Grundrechte und Grundfreiheiten des Betroffenen das erstgenannte Interesse +nicht, so dient Art. 6 Abs. 1 lit. f DSGVO als Rechtsgrundlage.
  • +
+ +
Datenlöschung und Speicherdauer
+ +

Die personenbezogenen Daten der betroffenen Person werden gelöscht +oder gesperrt, sobald der Zweck der Speicherung entfällt. +Eine Speicherung kann darüber hinaus erfolgen, wenn dies durch den +europäischen oder nationalen Gesetzgeber in unionsrechtlichen Verordnungen, +Gesetzen oder sonstigen Vorschriften, denen der Verantwortliche unterliegt, +vorgesehen wurde. Eine Löschung oder Sperrung der Daten erfolgt auch dann, +wenn eine durch die genannten Normen vorgeschriebene Speicherfrist abläuft, +es sei denn, dass eine Erforderlichkeit zur weiteren Speicherung der Daten +für einen Vertragsabschluss oder eine Vertragserfüllung besteht.

+ +
+ +

Bereitstellung der Website und Erstellung von Logfiles

+ +

Bei jedem Aufruf unserer Internetseite erfasst unser System automatisiert +Daten und Informationen des aufrufenden Rechners. +Folgende Daten werden hierbei erhoben:

+ +
    +
  1. Informationen über den Browsertyp und die verwendete Version.
  2. +
  3. Das Betriebssystem des Nutzers.
  4. +
  5. Den Internet-Service-Provider des Nutzers.
  6. +
  7. Die IP-Adresse des Nutzers.
  8. +
  9. Datum und Uhrzeit des Zugriffs.
  10. +
  11. Websites, von denen das System des Nutzers auf unsere Internetseite gelangt.
  12. +
  13. Websites, die vom System des Nutzers über unsere Website aufgerufen werden.
  14. +
+ +

Die Daten werden ebenfalls in den Logfiles unseres Systems gespeichert. +Eine Speicherung dieser Daten zusammen mit anderen personenbezogenen Daten +des Nutzers findet nicht statt.

+ +

Die vorübergehende Speicherung der IP-Adresse durch das System ist +notwendig, um eine Auslieferung der Website an den Rechner des Nutzers zu +ermöglichen. Hierfür muss die IP-Adresse des Nutzers für die Dauer der +Sitzung gespeichert bleiben.

+ +

Die Speicherung in Logfiles erfolgt, um die Funktionsfähigkeit der Website +sicherzustellen. Zudem dienen uns die Daten zur Optimierung der Website und +zur Sicherstellung der Sicherheit unserer informationstechnischen Systeme. +Eine Auswertung der Daten zu Marketingzwecken findet in diesem Zusammenhang +nicht statt.

+ +

Rechtsgrundlage für die vorübergehende Speicherung der Daten und der +Logfiles ist Art. 6 Abs. 1 lit. f DSGVO. +Unsere berechtigten Interessen liegen in den oben genannten Zwecken.

+ +

Die Daten werden gelöscht, sobald sie für die Erreichung des Zweckes +ihrer Erhebung nicht mehr erforderlich sind:

+ +
    +
  • Im Falle der Erfassung der Daten zur Bereitstellung der Website ist +dies der Fall, wenn die jeweilige Sitzung beendet ist.
  • + +
  • Im Falle der Speicherung der Daten in Logfiles ist dies nach spätestens +sieben Tagen der Fall. Eine darüberhinausgehende Speicherung ist möglich; +in diesem Fall werden die IP-Adressen der Nutzer gelöscht oder verfremdet, +sodass eine Zuordnung des aufrufenden Clients nicht mehr möglich ist.
  • +
+ +

Die Erfassung der Daten zur Bereitstellung der Website und die Speicherung +der Daten in Logfiles ist für den Betrieb der Website zwingend erforderlich. +Es besteht folglich seitens des Nutzers keine Widerspruchsmöglichkeit.

+ +
+ +

Cookies

+ +

Unsere Website verwendet Cookies. Bei Cookies handelt es sich +um Textdateien, die im Browser bzw. vom Browser +auf dem Computersystem des Nutzers gespeichert werden. +Ruft ein Nutzer eine Website auf, so kann ein Cookie auf dem +System des Nutzers gespeichert werden. +Dieser Cookie kann eine charakteristische Zeichenfolge enthalten, +die eine eindeutige Identifizierung des Browsers beim +erneuten Aufrufen der Website ermöglicht.

+ +

Wir setzen Cookies ein, um unsere Website nutzerfreundlicher zu +gestalten. Einige Elemente unserer Internetseite erfordern es, +dass der aufrufende Browser auch nach einem Seitenwechsel +identifiziert werden kann.

+ +

In den Cookies werden dabei folgende Daten gespeichert und übermittelt:

+
    +
  • Zustand der Benachrichtigung zur Verwendung von Cookies (Cookie Consent).
    +Cookie-Name: RwlConsent, Gültigkeitsdauer: ≤ 1 Jahr.
  • +
  • Daten von Drittanbietern (siehe unten).
  • +
+ +

Der Zweck der Verwendung technisch notwendiger Cookies ist, +die Nutzung von Websites für die Nutzer zu vereinfachen. +Einige Funktionen unserer Internetseite können ohne den Einsatz +von Cookies nicht angeboten werden. Für diese ist es erforderlich, +dass der Browser auch nach einem Seitenwechsel wiedererkannt wird.

+ +

Für folgende Anwendungen benötigen wir Cookies:

+
    +
  • Merken des Zustands der Benachrichtigung zur Verwendung von Cookies (Cookie Consent).
  • +
  • Drittanbieter-Anwendungen (siehe unten).
  • +
+ +

Die durch technisch notwendige Cookies erhobenen Nutzerdaten werden +nicht zur Erstellung von Nutzerprofilen verwendet.

+ +

Die Rechtsgrundlage für die Verarbeitung personenbezogener Daten +unter Verwendung von Cookies ist Art. 6 Abs. 1 lit. f DSGVO. +Unsere berechtigten Interessen liegen in den oben genannten Zwecken.

+ +

Cookies werden auf dem Rechner des Nutzers gespeichert und von diesem +übermittelt. Daher haben Sie als Nutzer auch die volle +Kontrolle über die Verwendung von Cookies. Durch eine Änderung der +Einstellungen in Ihrem Browser können Sie die Übertragung von +Cookies deaktivieren oder einschränken. Bereits gespeicherte Cookies +können jederzeit gelöscht werden. Dies kann auch automatisiert erfolgen. +Bitte konsultieren Sie die Dokumentation Ihres Browsers. +Links zu den Cookie-Management-Dokumentationen einiger gängiger Browser:

+ + +

Werden Cookies für unsere Website deaktiviert, können möglicherweise +nicht mehr alle Funktionen der Website vollumfänglich genutzt werden.

+ +
+ +

Werbung

+ +

Wir greifen auf Drittanbieter (Google) zurück, um Anzeigen zu schalten, +wenn Sie unsere Website besuchen. Diese Unternehmen nutzen möglicherweise +Informationen (dies schließt nicht Ihren Namen, Ihre Adresse, +E-Mail-Adresse oder Telefonnummer ein) zu Ihren Besuchen dieser und anderer +Websites, damit Anzeigen zu Produkten und Diensten geschaltet werden +können, die Sie interessieren. +Weitere Informationen über die Methoden und darüber, welche Möglichkeiten +Sie haben, damit diese Informationen nicht von den Drittanbietern +verwendet werden können, finden Sie hier:

+ + +

Im Europäischen Wirtschaftsraum und in Kalifornien +wird auf unserer Website nur nicht-personalisierte Werbung angezeigt.

+ +

Beim Aufruf einer Seite unserer Website kontaktiert Ihr Browser +die Server des Drittanbieters; hierbei erfährt der Drittanbieter unter anderem +Ihre IP-Adresse, den Browsertyp und die Adresse (URL) der aufgerufenen Seite.

+ +

Die Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO; +unsere Website wird durch die Werbung finanziert.

+ +
+ +

Kontaktformular und E-Mail-Kontakt

+ +

Auf unserer Internetseite ist ein Kontaktformular vorhanden, +welches für die elektronische Kontaktaufnahme genutzt werden kann. +Nimmt ein Nutzer diese Möglichkeit wahr, so werden die in der +Eingabemaske eingegebenen Daten an uns übermittelt und gespeichert. +Zum Zeitpunkt der Absendung der Nachricht werden zudem das aktuelle +Datum und die aktuelle Uhrzeit gespeichert.

+ +

Alternativ ist eine Kontaktaufnahme über die bereitgestellte +E-Mail-Adresse möglich. In diesem Fall werden die mit der E-Mail +übermittelten personenbezogenen Daten des Nutzers gespeichert.

+ +

Es erfolgt in diesem Zusammenhang keine Weitergabe der Daten an Dritte.

+ +

Die Daten dienen allein zur Bearbeitung der Kontaktaufnahme bzw. +Konversation.

+ +

Die Rechtsgrundlage für die Verarbeitung der Daten ist +Art. 6 Abs. 1 lit. f DSGVO. +Unsere berechtigten Interessen liegen in den oben genannten Zwecken. +Zielt der Kontakt auf den Abschluss eines Vertrages ab, so ist +Art. 6 Abs. 1 lit. b DSGVO eine zusätzliche Rechtsgrundlage.

+ +

Falls eine gesetzliche Archivierungspflicht gilt, werden die Daten +für die vorgeschriebene Dauer gespeichert. +Anderenfalls werden die Daten gelöscht, sobald sie für die Erreichung der Zwecke +ihrer Erhebung nicht mehr erforderlich sind. Für die personenbezogenen Daten, +die per Kontaktformular oder E-Mail übersandt wurden, ist dies dann der Fall, +wenn die jeweilige Konversation mit dem Nutzer beendet ist. +Beendet ist die Konversation dann, wenn sich aus den Umständen entnehmen +lässt, dass der betroffene Sachverhalt abschließend geklärt ist.

+ +

Sie haben jederzeit die Möglichkeit, der Speicherung Ihrer +personenbezogenen Daten zu widersprechen. +Senden Sie dazu eine entsprechende E-Mail an den Verantwortlichen. +In diesem Fall werden alle Daten, die im Zuge der Kontaktaufnahme bzw. +Konversation gespeichert wurden, unverzüglich gelöscht, und +die Konversation kann nicht fortgeführt werden.

+ +
+ +

Rechte der betroffenen Person

+ +

Werden personenbezogene Daten von Ihnen verarbeitet, sind Sie Betroffener +im Sinne der DSGVO und es stehen Ihnen die folgenden Rechte zu.

+ +
Auskunftsrecht
+ +

Sie können von dem Verantwortlichen eine Bestätigung darüber verlangen, +ob personenbezogene Daten, die Sie betreffen, von uns verarbeitet werden.

+ +

Liegt eine solche Verarbeitung vor, können Sie von dem Verantwortlichen +über folgende Informationen Auskunft verlangen:

+
    +
  1. die Verarbeitungszwecke;
  2. +
  3. die Kategorien von personenbezogenen Daten, welche verarbeitet werden;
  4. +
  5. die Empfänger bzw. die Kategorien von Empfängern, gegenüber denen die Sie +betreffenden personenbezogenen Daten offengelegt wurden oder noch offengelegt werden;
  6. +
  7. die geplante Dauer der Speicherung der Sie betreffenden personenbezogenen Daten +oder, falls konkrete Angaben hierzu nicht möglich sind, Kriterien für die +Festlegung der Speicherdauer;
  8. +
  9. das Bestehen eines Rechts auf Berichtigung oder Löschung der Sie +betreffenden personenbezogenen Daten, eines Rechts auf Einschränkung der +Verarbeitung durch den Verantwortlichen oder eines Widerspruchsrechts +gegen diese Verarbeitung;
  10. +
  11. das Bestehen eines Beschwerderechts bei einer Aufsichtsbehörde;
  12. +
  13. alle verfügbaren Informationen über die Herkunft der Daten, wenn die +personenbezogenen Daten nicht bei der betroffenen Person erhoben werden;
  14. +
  15. das Bestehen einer automatisierten Entscheidungsfindung einschließlich +Profiling gemäß Art. 22 Abs. 1 und 4 DSGVO und – zumindest in diesen Fällen – +aussagekräftige Informationen über die involvierte Logik sowie die Tragweite +und die angestrebten Auswirkungen einer derartigen Verarbeitung für die +betroffene Person.
  16. +
+ +

Ihnen steht das Recht zu, Auskunft darüber zu verlangen, ob die Sie +betreffenden personenbezogenen Daten in ein Drittland oder an eine +internationale Organisation übermittelt werden. In diesem Zusammenhang können +Sie verlangen, gemäß Art. 46 DSGVO über die geeigneten Garantien im Zusammenhang +mit der Übermittlung unterrichtet zu werden.

+ +
Recht auf Berichtigung
+ +

Sie haben das Recht auf Berichtigung und/oder Vervollständigung, +sofern die verarbeiteten personenbezogenen Daten, die Sie betreffen, +unrichtig oder unvollständig sind. +Der Verantwortliche hat die Berichtigung unverzüglich vorzunehmen.

+ +
Recht auf Einschränkung der Verarbeitung
+ +

Unter den folgenden Voraussetzungen können Sie die Einschränkung der +Verarbeitung der Sie betreffenden personenbezogenen Daten verlangen:

+ +
    +
  1. wenn Sie die Richtigkeit der Sie betreffenden personenbezogenen Daten für +eine Dauer bestreiten, die es dem Verantwortlichen ermöglicht, die Richtigkeit +der personenbezogenen Daten zu überprüfen;
  2. +
  3. die Verarbeitung unrechtmäßig ist und Sie die Löschung der +personenbezogenen Daten ablehnen und stattdessen die Einschränkung der +Nutzung der personenbezogenen Daten verlangen;
  4. +
  5. der Verantwortliche die personenbezogenen Daten für die Zwecke der +Verarbeitung nicht länger benötigt, Sie diese jedoch zur Geltendmachung, +Ausübung oder Verteidigung von Rechtsansprüchen benötigen;
  6. +
  7. wenn Sie Widerspruch gegen die Verarbeitung gemäß Art. 21 Abs. 1 DSGVO +eingelegt haben und noch nicht feststeht, ob die berechtigten Gründe des +Verantwortlichen gegenüber Ihren Gründen überwiegen.
  8. +
+ +

Wurde die Verarbeitung der Sie betreffenden personenbezogenen Daten +eingeschränkt, dürfen diese Daten – von ihrer Speicherung abgesehen – nur +mit Ihrer Einwilligung oder zur Geltendmachung, Ausübung oder Verteidigung +von Rechtsansprüchen oder zum Schutz der Rechte einer anderen natürlichen +oder juristischen Person oder aus Gründen eines wichtigen öffentlichen +Interesses der Union oder eines Mitgliedstaats verarbeitet werden.

+ +

Wurde die Verarbeitung nach den o.g. Voraussetzungen eingeschränkt, +werden Sie von dem Verantwortlichen unterrichtet bevor die +Einschränkung aufgehoben wird.

+ +
Recht auf Löschung
+ +

Löschungspflicht. +Sie können von dem Verantwortlichen verlangen, dass die Sie betreffenden +personenbezogenen Daten unverzüglich gelöscht werden. +Der Verantwortliche ist verpflichtet, diese Daten unverzüglich zu löschen, +sofern einer der folgenden Gründe zutrifft:

+
    +
  1. Die Sie betreffenden personenbezogenen Daten sind für die Zwecke, für +die sie erhoben oder auf sonstige Weise verarbeitet wurden, nicht mehr notwendig.
  2. +
  3. Sie widerrufen Ihre Einwilligung, auf die sich die Verarbeitung (gemäß +Art. 6 Abs. 1 lit. a oder Art. 9 Abs. 2 lit. a DSGVO) stützte, und es fehlt +an einer anderweitigen Rechtsgrundlage für die Verarbeitung.
  4. +
  5. Sie legen gemäß Art. 21 Abs. 1 DSGVO Widerspruch gegen die Verarbeitung +ein und es liegen keine vorrangigen berechtigten Gründe für die Verarbeitung vor, +oder Sie legen gemäß Art. 21 Abs. 2 DSGVO Widerspruch gegen die Verarbeitung ein.
  6. +
  7. Die Sie betreffenden personenbezogenen Daten wurden unrechtmäßig verarbeitet.
  8. +
  9. Die Löschung der Sie betreffenden personenbezogenen Daten ist zur Erfüllung +einer rechtlichen Verpflichtung nach dem Unionsrecht oder dem Recht der +Mitgliedstaaten erforderlich, dem der Verantwortliche unterliegt.
  10. +
  11. Die Sie betreffenden personenbezogenen Daten wurden in Bezug auf angebotene +Dienste der Informationsgesellschaft gemäß Art. 8 Abs. 1 DSGVO erhoben.
  12. +
+ +

Information an Dritte. +Hat der Verantwortliche die Sie betreffenden personenbezogenen Daten +öffentlich gemacht und ist er gemäß Art. 17 Abs. 1 DSGVO zu deren Löschung +verpflichtet, so trifft er unter Berücksichtigung der verfügbaren Technologie +und der Implementierungskosten angemessene Maßnahmen, auch technischer Art, +um für die Datenverarbeitung Verantwortliche, die die personenbezogenen Daten +verarbeiten, darüber zu informieren, dass Sie als betroffene Person von ihnen +die Löschung aller Links zu diesen personenbezogenen Daten oder von Kopien +oder Replikationen dieser personenbezogenen Daten verlangt haben.

+ +

Ausnahmen. +Das Recht auf Löschung besteht nicht, soweit die Verarbeitung erforderlich ist

+
    +
  1. zur Ausübung des Rechts auf freie Meinungsäußerung und Information;
  2. +
  3. zur Erfüllung einer rechtlichen Verpflichtung, die die Verarbeitung +nach dem Recht der Union oder der Mitgliedstaaten, dem der Verantwortliche +unterliegt, erfordert, oder zur Wahrnehmung einer Aufgabe, die im öffentlichen +Interesse liegt oder in Ausübung öffentlicher Gewalt erfolgt, die dem +Verantwortlichen übertragen wurde;
  4. +
  5. aus Gründen des öffentlichen Interesses im Bereich der öffentlichen +Gesundheit gemäß Art. 9 Abs. 2 lit. h und i sowie Art. 9 Abs. 3 DSGVO;
  6. +
  7. für im öffentlichen Interesse liegende Archivzwecke, wissenschaftliche +oder historische Forschungszwecke oder für statistische Zwecke gemäß +Art. 89 Abs. 1 DSGVO, soweit das unter Art. 17 Abs. 1 DSGVO genannte Recht +voraussichtlich die Verwirklichung der Ziele dieser Verarbeitung unmöglich +macht oder ernsthaft beeinträchtigt;
  8. +
  9. zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen.
  10. +
+ +
Recht auf Unterrichtung
+ +

Haben Sie das Recht auf Berichtigung, Löschung oder Einschränkung der +Verarbeitung gegenüber dem Verantwortlichen geltend gemacht, ist dieser +verpflichtet, allen Empfängern, denen die Sie betreffenden personenbezogenen +Daten offengelegt wurden, diese Berichtigung oder Löschung der Daten oder +Einschränkung der Verarbeitung mitzuteilen, es sei denn, dies erweist sich +als unmöglich oder ist mit einem unverhältnismäßigen Aufwand verbunden.

+ +

Ihnen steht gegenüber dem Verantwortlichen das Recht zu, über diese +Empfänger unterrichtet zu werden.

+ +
Recht auf Datenübertragbarkeit
+ +

Sie haben das Recht, die Sie betreffenden personenbezogenen Daten, +die Sie dem Verantwortlichen bereitgestellt haben, in einem strukturierten, +gängigen und maschinenlesbaren Format zu erhalten. Außerdem haben Sie das +Recht diese Daten einem anderen Verantwortlichen ohne Behinderung durch den +Verantwortlichen, dem die personenbezogenen Daten bereitgestellt wurden, +zu übermitteln, sofern

+
    +
  1. die Verarbeitung auf einer Einwilligung gemäß Art. 6 Abs. 1 lit. a DSGVO +oder Art. 9 Abs. 2 lit. a DSGVO oder auf einem Vertrag gemäß +Art. 6 Abs. 1 lit. b DSGVO beruht und
  2. +
  3. die Verarbeitung mithilfe automatisierter Verfahren erfolgt.
  4. +
+ +

In Ausübung dieses Rechts haben Sie ferner das Recht, zu erwirken, +dass die Sie betreffenden personenbezogenen Daten direkt von einem +Verantwortlichen einem anderen Verantwortlichen übermittelt werden, +soweit dies technisch machbar ist. Freiheiten und Rechte anderer Personen +dürfen hierdurch nicht beeinträchtigt werden.

+ +

Das Recht auf Datenübertragbarkeit gilt nicht für eine Verarbeitung +personenbezogener Daten, die für die Wahrnehmung einer Aufgabe erforderlich +ist, die im öffentlichen Interesse liegt oder in Ausübung öffentlicher +Gewalt erfolgt, die dem Verantwortlichen übertragen wurde.

+ +
Widerspruchsrecht
+ +

Sie haben das Recht, aus Gründen, die sich aus Ihrer besonderen +Situation ergeben, jederzeit gegen die Verarbeitung der Sie betreffenden +personenbezogenen Daten, die aufgrund von Art. 6 Abs. 1 lit. e oder f DSGVO +erfolgt, Widerspruch einzulegen; dies gilt auch für ein auf diese +Bestimmungen gestütztes Profiling.

+ +

Der Verantwortliche verarbeitet die Sie betreffenden personenbezogenen Daten +nicht mehr, es sei denn, er kann zwingende schutzwürdige Gründe für die +Verarbeitung nachweisen, die Ihre Interessen, Rechte und Freiheiten +überwiegen, oder die Verarbeitung dient der Geltendmachung, Ausübung oder +Verteidigung von Rechtsansprüchen.

+ +

Werden die Sie betreffenden personenbezogenen Daten verarbeitet, +um Direktwerbung zu betreiben, haben Sie das Recht, jederzeit Widerspruch +gegen die Verarbeitung der Sie betreffenden personenbezogenen Daten zum +Zwecke derartiger Werbung einzulegen; dies gilt auch für das Profiling, +soweit es mit solcher Direktwerbung in Verbindung steht.

+ +

Widersprechen Sie der Verarbeitung für Zwecke der Direktwerbung, +so werden die Sie betreffenden personenbezogenen Daten nicht mehr für diese +Zwecke verarbeitet.

+ +

Sie haben die Möglichkeit, im Zusammenhang mit der Nutzung von +Diensten der Informationsgesellschaft – ungeachtet der Richtlinie +2002/58/EG – Ihr Widerspruchsrecht mittels automatisierter Verfahren +auszuüben, bei denen technische Spezifikationen verwendet werden.

+ +
Recht auf Widerruf der datenschutzrechtlichen Einwilligungserklärung
+ +

Sie haben das Recht, Ihre datenschutzrechtliche Einwilligungserklärung +jederzeit zu widerrufen. Durch den Widerruf der Einwilligung wird die +Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten +Verarbeitung nicht berührt.

+ +
Automatisierte Entscheidung im Einzelfall einschließlich Profiling
+ +

Sie haben das Recht, nicht einer ausschließlich auf einer +automatisierten Verarbeitung – einschließlich Profiling – beruhenden +Entscheidung unterworfen zu werden, die Ihnen gegenüber rechtliche Wirkung +entfaltet oder Sie in ähnlicher Weise erheblich beeinträchtigt. +Dies gilt nicht, wenn die Entscheidung

+
    +
  1. für den Abschluss oder die Erfüllung eines Vertrags zwischen Ihnen +und dem Verantwortlichen erforderlich ist;
  2. +
  3. aufgrund von Rechtsvorschriften der Union oder der Mitgliedstaaten, +denen der Verantwortliche unterliegt, zulässig ist und diese Rechtsvorschriften +angemessene Maßnahmen zur Wahrung Ihrer Rechte und Freiheiten sowie Ihrer +berechtigten Interessen enthalten; oder
  4. +
  5. mit Ihrer ausdrücklichen Einwilligung erfolgt.
  6. +
+ +

Allerdings dürfen diese Entscheidungen nicht auf besonderen Kategorien +personenbezogener Daten nach Art. 9 Abs. 1 DSGVO beruhen, +sofern nicht Art. 9 Abs. 2 lit. a oder g DSGVO gilt und angemessene Maßnahmen +zum Schutz der Rechte und Freiheiten sowie Ihrer berechtigten Interessen getroffen wurden.

+ +

Hinsichtlich der in 1. und 3. genannten Fälle trifft der +Verantwortliche angemessene Maßnahmen, um die Rechte und Freiheiten sowie +Ihre berechtigten Interessen zu wahren, wozu mindestens das Recht auf +Erwirkung des Eingreifens einer Person seitens des Verantwortlichen, +auf Darlegung des eigenen Standpunkts und auf Anfechtung der Entscheidung gehört.

+ +
Recht auf Beschwerde bei einer Aufsichtsbehörde
+ +

Unbeschadet eines anderweitigen verwaltungsrechtlichen oder gerichtlichen +Rechtsbehelfs steht Ihnen das Recht auf Beschwerde bei einer Aufsichtsbehörde, +insbesondere in dem Mitgliedstaat ihres Aufenthaltsorts, ihres Arbeitsplatzes +oder des Orts des mutmaßlichen Verstoßes, zu, wenn Sie der Ansicht sind, +dass die Verarbeitung der Sie betreffenden personenbezogenen Daten gegen +die DSGVO verstößt.

+ +

Die Aufsichtsbehörde, bei der die Beschwerde eingereicht wurde, unterrichtet +den Beschwerdeführer über den Stand und die Ergebnisse der Beschwerde +einschließlich der Möglichkeit eines gerichtlichen Rechtsbehelfs nach Art. 78 DSGVO.

+ +
+ + + +

KeePass-Lizenz

+ +

Die Bestimmungen, unter denen KeePass vertrieben wird, sind auf den +folgenden Seiten zu finden: +KeePass 1.x Lizenz, +KeePass 2.x Lizenz.

+ +

Siehe auch die Danksagungen-Seite +(enthält Lizenzen von Dritten).

+ +
+ + + +

Rechtswirksamkeit dieser Bestimmungen

+ +

Diese rechtlichen Bestimmungen sind als Teil des Internetangebotes +zu betrachten, von dem aus auf diese Seite verwiesen wurde. +Sofern Teile oder einzelne Formulierungen dieses Textes der +geltenden Rechtslage nicht, nicht mehr oder nicht vollständig +entsprechen sollten, bleiben die übrigen Teile des Dokumentes +in ihrem Inhalt und ihrer Gültigkeit davon unberührt.

+ + + diff --git a/src/Docs/Chm/help/base/usingpws.html b/src/Docs/Chm/help/base/usingpws.html new file mode 100644 index 0000000..a8afec5 --- /dev/null +++ b/src/Docs/Chm/help/base/usingpws.html @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Using Stored Passwords - KeePass + + + + + + + + + + + + +

Using Stored Passwords

+

How to transfer passwords stored in KeePass to other applications.

+ +

There are many different methods to transfer passwords stored in KeePass +to other applications:

+ + + +
+ + +

+Main Entry List

+ +

Depending on which field you double-click in the entry list of the main window, +different actions are performed:

+ +
    +
  • Title field: open the entry editing dialog for this entry.
    +If you hold down the Shift key while double-clicking, +the title is copied to the clipboard instead.
  • +
  • User name field: copy user name to the clipboard.
  • +
  • Password field: copy password to the clipboard.
  • +
  • URL field: open URL.
    +If you hold down the Shift key while double-clicking, +the URL is copied to the clipboard instead. +This behavior can be reversed by turning on the option +'Copy URLs to clipboard instead of opening them'.
  • +
  • Notes field: copy notes to the clipboard.
  • +
  • Attachment field: [1.x] copy to clipboard, [2.x] open in +internal editor / viewer.
  • +
  • Other fields (like time +and UUID fields): copy the contents of that field to the clipboard.
  • +
+ +
+ + +

+Drag&Drop

+ +

You can drag&drop all fields of KeePass entries into other windows:

+ +
+Drag&Drop +
+ +

+ + +

+Auto-Type

+ +

Auto-Type is a powerful feature that sends simulated keypresses to +other applications.

+ +

You can find more details about it here: +Auto-Type documentation page.

+ +
+ + +

+Plugins

+ +

There are a lot of plugins available that integrate KeePass with +other applications.

+ +

You can find these integration plugins on the +plugins page.

+ + + diff --git a/src/Docs/Chm/help/images/appicons.png b/src/Docs/Chm/help/images/appicons.png new file mode 100644 index 0000000000000000000000000000000000000000..14c8c138e320b9483b73e2f6399ba9239e3f52c1 GIT binary patch literal 17279 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 IM6N<$f=De+hyVZp literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_ascii.png b/src/Docs/Chm/help/images/b16x16_ascii.png new file mode 100644 index 0000000000000000000000000000000000000000..7462fa2e61268e80377c276dbaf817459429d1de GIT binary patch literal 391 zcmV;20eJq2P)nzqF>7LlkZW@ zwC~$?W}?Mn(d+d9Kvkhe6h$7VX__R-X0yrj99FB9{z62UnVGAqIv$U=+pQ>y>2w;* zn21Eg>MSrUwOlSoqfwG1sv3(309X;c<0p+q0}-wAC2+ith*;;zWYX<+%d%9}*v)=o zsr`O`xm*xYRbyuMkv^K3Ktv9Q!}WT#dyCzszN>4@Zaf~h+wI5W0RX`(K4kR(5#N^f z#P{k^6p6@oyFHywAp}*8ebDcRQ&nbG)jZGBG$o=x!T*Rzzu#}QT4hfN&@BiM?(oz5r zfP*o%0RRSJSU=(a6Igo!udskXq$QKBSjth=_yIGsKvki;>6y8wWJGXxcQ!MFh}@APpcI=q(1IH$Z*|(>y#p3?Nqr1_mAi2*3dun*ad7 zAgoJKC=UMrY|+snA=rXglN6BT0H{b(&)eOx-Q>HgAYAqfzyTTC004v_ko||$5MwNC zt*AZ^0~`mw{O%AD29U(e7?7EeWc{l0obJZ%y7cD>z!4b}0RVs?@cWmsg_dxzfTO!g z0RDIoAR;g`s)|$ME)u}q>2795<9#SIxd){74ORdF!~!A|6coT3K%uXxsmZ{}$qBYi zOiT={2;>D&On?jm(I7ccSbzc-Ab?mv0i>#`${;H%3l1!6YiqFoKng%?kQm5owzjqm zz_b8X%g@ixaOTVzu;Bm!!~&880gwwoia~-PF_7u76bR$P07wmt1_&S)kiVWhdBX7Q z*)s+W4Go6t*RO+Z0L8%3qemH(m6gGoK>??xrp9pL!Ub@Q!2m!2F@gN^{{4G~bLY;1 zO#~SRN|hinP#}Ur9~2W;uU-X*!L@7Gz<~(zB1kVl0D-)~2ns}yOF-Dr&=4F3pa6}E ziUQLhU}0ea4qO)(7jRO3`SK;mYfJzE#B}=f>F=O;1|<$q{KJy)n>TO33PH94GZ5HY zpd<`RWS|rY@(NJ=7eD|p0#jC^l$2B&D8Yd;B?BISl)YJiVe%E|%}D?O1^_w~p4ar< R%1QtL002ovPDHLkV1kkcU48%n literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_blockdevice.png b/src/Docs/Chm/help/images/b16x16_blockdevice.png new file mode 100644 index 0000000000000000000000000000000000000000..18e10cd3cfdd2578592929768cb272157a7ca051 GIT binary patch literal 848 zcmV-W1F!svP)k7RCwBA z{Qv(y10?_;fS4F41ONfVfb4=PtgOi^G&F8WGcra1xm?H=JPVY`y_U~&&rpCFMGhc< zzy`E3FtE=R7H)eUAOGine*XVU_VzyvI5;K%<%K4yNprnSm6`N=7wfns$D0 zWq1a3=`Em^FF^d6fuXXGVSC3lhD3k>0y{(F`EwigJ$o1!{`_HJ;N%1<`pWR_=qUz% z@qezbCBHc^+y!d>4OGYm#9x8<5d(t>4}(6Cr2r5>EFc4ZegFQ8VeeixhI{uI{%Pwn zT;8*rVX+Md!{-TRoKx;RWq7suK0|`mU!X#u;&VX!gMs1WPX{NF#P`ckAd~yKL%M@9){Wcatw#wGBYr6FfeR9&hWPU zCc|o=^6vlv1a`qh28QWJf%X?NFtq>u`&;?s)rAaS1Y{Vv`B)h~{$OI*dF3C&yVpz% zY~Ps}8u$Ob*7S&B;Xek3>p-nf0Rjjd3yh46K%*IWL>U;A1S15dnU%|0F#Pz<@P~88_3^(pD|Csmc(H918 zZdQg*Uw$!s{{^&*gOTC?#h>3EfBw4<6jBTj+n<2q1R#JIu;c|UMmv@a<35>JzDIQa zGfvd~&tNTiALz^`pqvj7D>A?W9S8sd2%7;QSMf7Qb9e~F$X;Vo7X*ecLnaV=0I@10 z4j33=iU9%$76#Z10i|~dAeIE;KcD~u;#WZY6Nurq0t65)0~nyTfSk$+)$k3HWKaP> afB^u%MF5dKi_@W|M}sAhw_srY>W~TKsPfouoxLJNIief_Uq!sAfaEsA{^Y@xOjmE zgETUH_`vZ0)G3BDOP2h+bm&kaKmak@u(Mx&^y$-mrq{2%AP9OrSt~`cWMBe}Df@WdXVtAb^-{fqrKM zhBm{WKbK$p{CV}~>(@b&Z{ISrfec|{VqpC9hvEOnj||^|n$Pav|M&czJ4yfk{hPxK ziXor@00G3p|Me>aP=MhdQ1O2@wh#Zfxc+?xI`hkm7YtzU0Ks3N8c+cLWnuXTwCn>L zPz;1Y=>#Bvm|a;}8UBK7;o$HwmX%#&_3Ev z8Du=HOuX z4|L&Apeyv`#@8bfBxE!U^>5?3)J&j7~IN0z^T7prh^aQ_9m=nqi-_p@gVCMG7_z;K%h5I{^nzkYr61?WsB zppBr|;1UpEcqk=KX*K!*JM@s)v*nVsS9FGi4t-(V7G z7C->8fJl&YL7Ed15*V&syT)+w;zh7`KwDev!|!`F z4CV^Q8D%*cyaa?8Ha_^sa2g_96NT5FETQc;TJGJ z2m!tIOG=C3%Fi4IPEkPy$@lv?fNHb=0*DzD+Ms9xf?uHc1tmlvJ_^KKj~+eJla^NG zRFGF;c>DGfFslDCu6S$*QZ@2YB${#cRQXcog*@ zwCJS=MWm-vTG>=uiByWRt?AEnvzxd3X2!#|wVAqd9GjY&qW=K^0HBl#!%#{|M2_Q(jEso5F#sT<&NYqe5CP|0Q54A5 zf!MMvr4$hfL}ZK+vV=&iZEnu~np^kQ+eCJ-aK1B}YxrK=QPZ^er65Gc*lXvd+gRg9 zJ>S`|In|K_|6J-W*0ynOUb`rUi>Cs2t4>I1 zBh?D!UjZNzW0^$e>WMDPvfj+rI{XWxx9+7((cJb|*Ec=cw9=-TG2__;B67xL$R`%v zOhRWt+qdm6Z$G?WY%GZ!m?^{cSB|6o;QD=Hv4D^anomcX$AY6F& z{fC;ld%5Riv$gQ49!eyn*faq`AzSEe@8ufJ*Or!7-DD!kQY|u8mK$qZo=<#;6OSVn zM8p{nR1l~jlS=(`e?NTnWXE<+_rsZde&%COxKrq{GE7(du@Vu*<1x<}BorsG|5&XH(0@XE!~fPL2YWzx`5Kp=ypW&j`n5RuSz zT?k>Cd#S~Fa|1I;0}x0t!$<;vX`1PDnutWTS}m8$Q53~L?p?}02Xz!hj^ik$gl*fE nN<}Gk_@4g-5v7!4V`F~+x4oq%{;m0J00000NkvXXu0mjf`@%Vg literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_desktop.png b/src/Docs/Chm/help/images/b16x16_desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..291f8a4ac92dc9947249c141340352c0eacaa093 GIT binary patch literal 1077 zcmV-51j_q~P))u00RS(b00sK@0R8>~0RIO40092}0RR8~008>^01FER0QmL`0RI5|01OK80Q2OZ z0RIpGMi@CEs_@e3-1yYaO#+CCfdKgTpNZk$Ul3+w`2X*xnpuGS(zr%LexWdVV@6Ki zZh!z{!Kw4_KZajGSN#9;)lNc~E&JD>zx=B1vYNq#79z*~9%1-)@6P}KKYzRd2p|jt z{sT2K{QfJ>z``CZEXbBt6}(;B$?6)*gfk`#Vu79v=UI+39O%Er@NvQOEe!vDRRIJL z3&fd>U}rM?_+iSx#gVR{A>eIiDJvdqEy?Jop~%uB94%>Ms!^H!jT82|!^DbVbzZNC3r#ut2E4Ch}n zG5q=c6K=r8+qW35+_=gh^Gu8(L%E0{OwWjc>GypGeO(hb1}1I~kQ#shVtV@c$=h4! zeHm{4@?p5~nVI3(m8Wn6-hTYR@c7v$203mk27ePzhJQcbG3YQJWhivs#4IbL+rhxV z!UhlkK>)u01LNxv2M92FLINKr00ssK0PpGK05BX100jjE022)m06#G|02C4w0Q~*= z00#yV067n?04XBL0J-vd7vk5@=mLoO@7JH_zHx{}I=NU1erEwD7zS2`|DRtlD2eg_ z!{8qS8_*zLb`}O^4qk>YUw<+PeBZ)wE-M0 zH83$yHWuCi{R9yJ+2;iSArJxp77PCX=k4$S$>a9`t=JqrnRQo zAFuBJ^X&>SE}tFU$nf{$0$?y*0|+1%26ka!O8Uca>*&UkMK>F_fuDB*norfHLo2Bm@3400bBS^(|##vXdG600000NkvXXu0mjfk$UTd literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_donate.png b/src/Docs/Chm/help/images/b16x16_donate.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7b46f06ed49a006539d57f7782dfc8468b2848 GIT binary patch literal 1106 zcmXYxdrVVz6vxlKg;L8^tN7>@2VKOl33F}P=rqQ*iV;RI3?DO#4hxhz#TgwFoYl6} zRE8jNDn6!mf6UBGGC(rN7NFWzrBGyx2GG7}DNq7}v=py>{nllkDk(XB#3bDSKy&A0iFZ`KC@P80KAB9mPb!sC{)yB9hpu*;IlU}` z%O^GR4U>9AUeW1-)bNwbeTB#Pys*XV8|yoR5Rxe|B@~?|@0-ny-s$9T?zFdOH{Ve& zZf$A7X+mMDq0fQXQ`YZ#n@^xan%v9Uy;R_3aZi(0*smvm!J*&A)=aJpouT1Yq}{*^ zB8OwSs-YcoEfj?oR8NO>Cl7{EjrSS)q2N>P?%mH5BmoQuF?1ptV8B3;*o(PaKhF8_ zdMTu&tOSbkLo9s?e6MU^w++IA1#_@$`4ZTil>`CrL|o64@%6zF)f@fX@iqp-@a%UI zNoB(sHlDHupu2|&t|2!B-k88W><6cFDU6QUfQApiqJ{s!NAEs`?!I~P7Ke|8P_PxR zzN%7nr0a9_DXXdV`Mgzzpu~C6 zx$=g6Z)IrJ+}P_sRsm*=nXNzndw(ijQ!gZwI%bNgfL~x3NfVG870yx?>tbo!aUY)+ z-&06Gm?)(0I$x@}ASfoEWoa|A&+?f(E_WP{VZ|rlr_5n)}kOyEClfe7@T$uGvLnIP`%*;$kPx}Dc+Kuqo)D6V&C17F!a5*p-eHlgo zk;(u0-~gzt#e{*~3P6AJ5~e&>V6u{+zuy9bgU=zBnE=GppFlJ0f#h&6z$^y0^f=5> z5f?zX4`;CBQDJ+??0NLS_+G=$igV83g$|-gca+aav+(wNZu8{wV`}ltsio?MzZ2-o zzFe!RizCS|?s2)HK(JzI{`4j#;4ALGT2x(l<5ZXDfw#WSwmq1jp41r#q1`5}oV%n| z`R#K0>Zx1;4W3qBLtOXTi0Rd+MduUsek(dzkKxtlF-&A?HRP%D(jPY55a(eYv!aS9 zGb_lA9q2*xq-VKijE_W(amJsz=p#0Ph$zoA#Bw64MmFa@?4=I1-aH|ijg|uB NY}uCe+opY0{{m&o|LXt% literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_enhanced_browsing.png b/src/Docs/Chm/help/images/b16x16_enhanced_browsing.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c9ec31578e4a2b5727a9bc700f17cbad44dd0b GIT binary patch literal 595 zcmV-Z0<8UsP)v#Xb#q#py^EBaTCW5L@+&b}@>Ce)%#gcrI zCytz8_|NbkKl1DH>pnSk*UPE{S$_EYe($Dzp&p?O3=9na8UAav7;Jxap!;zj zZ=}@v^&60l*C{oeb$4FLi3$Ndf$P_=Lv8r?gW(t7=T|(B{xUHiJ$f8&{H`;**!kE+ zBn3BZ-fpL8r=h9Az`(%7z`$Vi%^<(Ld{NbQ&U0*DUhZ%W^Y$z@w=}=-rh(62vbwq& zUBleNbEj^fhO9w1!#eAHrq8Y*K{bgxckaN&nHU%t!e&Nnezb4>dhR3F zdv+<-bDJ;QYgsC*D8oI*#K6FCh93`q&A&Q-`{ljg@BL+9WoBStIQjatxHT~p29Hg3>TF?Rm>gijzZtdH*@BRDt5N>u!p@oxu hL`>X+2M^FR000Y$P@%A^md5}9002ovPDHLkV1gZNG=Bg9 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_file_locked.png b/src/Docs/Chm/help/images/b16x16_file_locked.png new file mode 100644 index 0000000000000000000000000000000000000000..cab5794cecb196ee6da9ea2cd20f3f6aeb2e799a GIT binary patch literal 999 zcmV>Ge;{B00T9i|fB^p)K;jS)Mn*;k4t5U4Lx&E0Z)$2P00i z`TGIGk6(ZP0|cOWj*S2WfdB~J{E*lnKL57yr(xKs!}U{WqbmN1r|`>fBXRl(4Rj)8P1$N$MEy}PX;b-9)@pU zUo+gi^N7K~P@jQ?nVI4D?>`Lxng4)Y3JPq10Al+4_b)u;S=c!kuHAaX@Z~#@&B4p? z{_{5mE`A|~-~ZVduHLxMz|6`CRtLi%01!YdFa{G7GsD}*HyK`D+sp8uk(uEKFh&e@ zG#MT|y1~Hs?GMB2Cm$JJ3$iiriOT@P;y*Y>KmZ_sSpGv9-@bfh_Vv;Acd zl~-n9VEqsD$}ff$2YxX`n(#7c^4g@NHG1B2NAI}GkhObnu2PZ=2a*clkOfT91532ZaW`5*ugK;S?GG5`K%WcbhY zj)9RE=ubut23h_049SMSflgxu`db)C15JGcQuhaJJ1F)*dI1861(-m9Nr!=fmyeI( zBa<-0hxcp@Osw3%faC+G3$R5$fl2hwH-_K;M1X07lYx_y1Bf|6@=O2$#B%=p`R^8% zmK>m@`hh2m;o(yoU^Fr@F#Jc#i9qxZm^xYb1Q-PW{$zOh;wi)B%a<8GfByUnAb=RT zxw#Xiq@>b-YFU|B*#9vyvw{7{0MF1+lYp*a02=ZS7#l#FSzf<>{q_C(_mcnu3;@#0 Vt`E>+U*-S+002ovPDHLkV1hh^&#?di literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_filesaveas.png b/src/Docs/Chm/help/images/b16x16_filesaveas.png new file mode 100644 index 0000000000000000000000000000000000000000..71602bc361a05354dad0d36590d326abda7a6a5e GIT binary patch literal 1009 zcmVjfNKB${|7YmKS&Sbe~4a&e+-PwJPhAoJ^T|Bz@i&k<}3X5!Y0Le zQ~&S*1Q6H&J%5wx)B+to7qLGKob2oje}KAwfz1NC31|pA3k$>hS1%dfUfsiBZf5}$ zywAX`%fKM6$RrIAKwtxSg}MLovNJPC2?AZi!OHOaF9R6=`pv+=#=*ew{nJ;5KM$re zm{^N2u<<@;VEDO-Vb==&S9`ZGr2qsF*nmI3|Ni^=6KLz7e+=wE{_j6PF(76H2Fbg3 z-x(gBoW`K4!N9;N^aU71s~HX*Q)MXVbXfEA#q)gt0R%RH5folbj0{Z7OyD461&Xq= zGBAAo`iJ4knb{1A>R%beRDe$TFpc5t8F7Xw=h_(VvA+NF^T$O7fB<5Gg*Q+;12YpO z=+BfxhHiDAH=N~c-cPzRefau2p}ey3mAdK zzdwH&{{H#J@a@N6hU>>yG4SzSXONTTWnj24nc>;~R}3%yG%?7Vcrvgu{sKnKKd`j` z0R)Lgmj4XTzA!P&Im62E;Wrb*pVvJ`p&>`_Vz!9e{X&;@P2*8pr-4<@c;e|hLbw^5AKPM|U|G9=^3^_@Uv# z;NqXi@M`BrhFd$?7+4s%82$oX&jbl?27my9hXF|NA21-V-+sz4bNo@{Q3(~3v&TL06|;;nS_!)J!yz!+j<5ENiycm#AQ$p1`C;K*kH2q3Tvn3(>vGjTF7d;_Lm5fKiCxt$%~0=kCIaw3d$0t+|unjztg{aQQzJb{~Yu?P}9b#3-7F8q<2fR98wIE*%k1Z zkja@N@5k$$slik0T3hP>1ZvtCIP-el)-{{EqUsMjJC$1$4QORDGEwm<5hR9FlScOK z(5>^`ZHXA-zz0r0pOaY8vo@AgEoU~nzdJHIWk#z-gxKKyoaRb`RP!^>L#Y=}@9h&_ zzDs9FXk$mLP=xe!xpS#fTOGLZtaR={F&+ya?ybvfRw0)YurNlKT)jT*BlWu$cdTrx z59T#uyIh^tKP8P42^B5AG=|!jgde^s6bxpSD;WMOo2L|C(Y|a zrE%2+pU0UCi~;eG0Eoi;FcJFqw&>qe@rD3+F1QY0wr4}__ICL|Zwzb?C;{pMaYQ9d z^ZJoPt-`jRrnV}*nw6tb1#HL9S$86|YN6ECS_KsshzFkIm*fDFTSe{Y(JsV+rzVPh z$DcY)i5Umw)XcKRV0T;1;~_OOJu8SlQK|AHxi&p^|H}5xwedgmB~!(dXJ37sQJ|qN zU-HVj74%cTh!NpzrnD-gUmV=pzIxvOTYq!=?w89qza|SnaFA2ZEjzAwNBWwN9b5m; Z`2{Gce-_B3T4MkJ002ovPDHLkV1lsQcd`Hg literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_history.png b/src/Docs/Chm/help/images/b16x16_history.png new file mode 100644 index 0000000000000000000000000000000000000000..8d658e0de0ebb7e670b92bf3064f85fbaa7ce740 GIT binary patch literal 1166 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 FV1g5T6F&d| literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_kcmsystem.png b/src/Docs/Chm/help/images/b16x16_kcmsystem.png new file mode 100644 index 0000000000000000000000000000000000000000..ecce34d7e018153f9b89580df5de075546a51417 GIT binary patch literal 937 zcmV;a16KTrP)mC86e}dEi z1P}v07eqv)SKht*`v3Lo4}ZUX`|0oR-+%r$H&5PNQ`6mVYHBM6asWU8;WQvAsYtuI zdCL6<58nQN_wM`u`}g1c|Mcm{e-L>5_|^Z2h?Gj8G7*3PVnWy0+BzRB_WASsj@Z~( z1x`+OhW`G^_ubs=w@;fk|I@#J3=Geozxa9Q&NYztg#iKxZa_`VWTr`zmRD+ODxdZ6 z2&vH5H*vdihw>|;2 z2?7KV*notDd>JMt#u89u{QUWo;qPBYh6fK`F?{;;nc?!~n+%eYq6`560SZh^ObpD- ztPI<>ZT;Ne-!ccN^)EmGfem=@;7-MqDYKn~g}E7CzI?|}S66%e_3M|vJv{t$`S{ov zA3XTR@a4%DzP$p}`V=65zy_$OXjnaa_L_l-=^xO~-x$uH zKe^@h?Q16=KD-;WdGpRFARB1#LxwF|Rv+)_slWRD`?upDdx7``Kmai}G&C^8#)ds$ zVq!HlH8mFz5a4AH7nfE1`}f~-Q6LBn4b?U>(qj-2k!0Mxd)M)sH?M94YP=1^k3o?I z5I|rTeEIVEinO$hATUh=qwgDov$KnqrtLHCz z@!~ni<~Kn69i$ng7a)LODUp$xnc0wyjXl-G#PY!T^N;_pS+nPFe0=7MrAxQ{cXjnS z1(c5is?!5vZsddq5I~F|1E86S0~D{EoLsIpHqMz}zkd91{P^K*TwL6WU%!4i3Y2>e z#J7O>9o%*x00&MlsdsOtw0K*l_Ls8tO#fa5Ji%Z!|}pe>VZfC3Z=@F zYFmw>qE+fK6a+eU%CwL%BZn8Yb*vXhuvLUWLL%Y48g#HN*g_raAR|2y;M)~j2BMc#qEhm6YsQp8P{{Tzzv(f_WillNlE4J20K%V z+g6VUspLgU8L{V(G`BF{654|@B7+JZy3zP6JF4vx&~AmAn5nB`2!X}_hV^G5CvgAN zrho=n_WU1;alD~It=)IWV7PgkAEaKmJ@RIUv+i7<)N!2gqqh=@u6X$MQRxs@xZa`X@-DPxwt-5Le{ru6IjD zHq&%_@N5f^LMLLz`2$!SlsF=4VWQU@CZHJ$(6j@rFHL}K^FWZZ4KQynKyPfo#1IH$ z7qiIcPnQ1rc<_Q}3o}>^`CUM`vD_5eau}hE2O}mq-Ax=ay|^5N_uoG&;~#5P49`2M zB9L&j(b6EK89ce7sE9yQvHcwf(|modw?Fp`a#joL4?e<^S7u%WQ7Y$_WeDc9wZR)V z2?Mc#5R4-Ln-yqk27q>h%R`wnHn2>L(M}rJfM~#KQd9GO>>7+P8nOmYn;x|I;%|MZ zm00alQC60hq%6_-t#tSalcUaNRBMy(H6`C03QbVx+b7KKesszqp%fbUUrMYvI@`yW zhRNw62;m5TE-e9$7Y5vMHW(%XA=dpEgyun@9MeF%T=2Uy0^G~?__IgqM6Ri453&Co z`T4Q^MqL9iMOwgz<#FW01N$2io<0!4qJ?7c@e6`S1OLFVV;uZN!Qi(b1P-S$0w{8_ z`9{O8IIL#F(~p13Sy55(`o+)vcmpa^5`=4!vGGolFptiYj9&RHnrn-eth((T6R~x* zB%;?AT{9IELuuIE9~`}8H5EMT!dQHJkGA$0<n zz8uF3b*7n#Af_=htlU@GMR=}a%!_G!7HY;XJ0=wvH|)eK*HCwJ8NK7`@r$}^I)OMK zz@A%esry`bsZk)9JSdY5vpAxVsOcES`uMN=tO5G_<;((Wu)aylFouNb@&tNee`gYz z|H|B#n~3A)ZUa~IH-DLI@zqUR?00JGD;DT?ZqSC~1p6IbcJHp2#Cz45i;EMO+^~<% zZ>&fsB=P4eI65;ZL?TAxX!z;Q=+f_Rd)J)11i(yEc#VlX>x&^~=|6k15@%eYR8?MNenEF;1qA7~9|8==%ukQ3qEbuIc Z8wCWf7Fr(#Uh}*YNKajx(!4@e`7cxL7D503 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_keyboard_layout.png b/src/Docs/Chm/help/images/b16x16_keyboard_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..01d751bf9b45a289dc8f63a9aa330beb02570f92 GIT binary patch literal 699 zcmV;s0!00ZP)vm3Yn5+iZWfw*E8~SbH8Cy(-*$;I}I!mQZ$7%B$R`{$_a=|CCgk zWG!-OHfQn#J-BIzvQ>Nb*u1x+G3X6$KnEvqKqJPP5bg@ttm1YdYi&^?(Qv3Uc%nBf zMk6XS!7%V2tXi#kectYHDA4SdL?WFDjB52dH#m-i34#y~2ZKQ$=bUrHB#VM9@qY+J zX0yl?A_d&SA%F=2EEdTybbtU(oRcgO=VlVDPMbwUHeV{PTJ^L|)NBpiV7hKN99BsZ zi2#5AC}NVa4Yjs9Jr$pe<$i72-RDO=E!np}i=|ywDD1~#-wK62lS$wloEy!}-bKi< zdU-IL85_IN6YV+ju)LgHU;k67R0V+maBjGqu0(R}*2Kin@X#^S9UW|DX3AtDA_71} hsg&k)T935>`~~(=5kXUaW10W}002ovPDHLkV1mhfIbZ+) literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_kgpg.png b/src/Docs/Chm/help/images/b16x16_kgpg.png new file mode 100644 index 0000000000000000000000000000000000000000..79b708bd5de4c59ffc56d0ec17ec3b729c4afe6b GIT binary patch literal 675 zcmV;U0$lxxP)dD}eDA&yCqT7BAs5MisMnBieH5$*|0)f6q@Fy57)sq}s=90|daz)(#^3#y;1s@sptcFDvStr7)YA2~*;ME0 z0q7zG)OZbU?7a|UU4iBjV1s}nYTCr(J&OQqv(~{3Bl8o`p{Af_d`p0VZ-Q&^Nf{Pot`mMJ`rUld77| zrnu$#MR$9DdBcTAFNd#BpX>eQbWq<1#nI@1UQK(ZK0589CiBs_I-}kwEYT;o6972b ztHKiC(6=<#t^?hdZ}v$Y_aj5%`k*LxzwWY=it8G?5VC=zXyj7JKuaxmns1elL?2*1c8<};ws@Xu#50zd7H#9tQW$sN6}u* z_9p6ub;E5E@H~uI0tl7>DU~X!8br%xh*XiunQ#MfS5CIwq9}??B#f-Yk^$Ba1`#PTYPK?CeM;lvqrX<$`H~rfm#E`x*M5joRtG{{qn^7I8vehKB$E002ov JPDHLkV1mv&I`sem literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_kgpg_key3.png b/src/Docs/Chm/help/images/b16x16_kgpg_key3.png new file mode 100644 index 0000000000000000000000000000000000000000..e68afac8ba0c0410121f3f494e8a1bf4545c3288 GIT binary patch literal 946 zcmV;j15NyiP)L&84k8i)YeQx)yJ@;Y_@9x1 zk>T6t-|xSC|GojF4BNK}PrQzF^SP(O}@^v zvzFo3jaUX_g?kJi9x^bnurn~c0@7Su3=F@&Fueuo1qdLp0lK=H2efpw70#bI&+zr@ zCk9tnONPUT&oI3I@S5S(8QE_uw!g0b@%qPoj=z6I-+yN~!@e^=f8gal7W>KXf`mAK79BHG8Bk^GH`G(vbcNLMTRDXUy*Zl zo%mDRNaBZEAUs9@0tjrt*RMY|U%7H^?S~I<8NPk{&G7W;TZX%LA2M9Lc=gEX(`PR} ze)NDrT2hQH#Lqp?#?0U}BO{{>%m9D@VuI4YA3uJXdgjczBe!nd00!z`U_kOQC@4t( zI&N5O%Jb`~a!@(K>0*D2XJpRAGfB%`?%a?DHKYjYt zrK6)OsHdmtbnDjrm^W`el)ioYk>$;scik*3tS^9G+xg(zXRt1S00O%JCQZ|U%YtT`SP zkM0BpAR7bFZwyRKj0}JN{N4TN(eoX*Zrx^3S67jgk`k){iZKE$09wL~lB@v&2pS9b z7_MJG4-sHu0vg1?@b>NJp!4T1-umY4%jM?9b=iW3k`w$K$cqnwbFr5JE6B5lJbx z+wE$#YPOnqN)Cs^(P#vKnH^)Twbn9o5Cj0?IDW_bH=wl!@OV6!*3Mk(crW@hK?m;!kD_40ua0AGK;27`gt zS}EllQ%WhNf*`0?s|DakB%(Nu8;ynsT&>pHX0v%dpPlnJFrUxY>vfVO<+_;JZEv^R dY&OFY{{ZMqv1Fa0jllo_002ovPDHLkV1j^Z-8BFJ literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_konsole.png b/src/Docs/Chm/help/images/b16x16_konsole.png new file mode 100644 index 0000000000000000000000000000000000000000..86072082e8dff4bdda37965d60e0f545bf442b6f GIT binary patch literal 682 zcmV;b0#*HqP)HsPNFL2Gn$W_)kP=lk=0Ek@6Ud$^0sfy0lUK6%`G;~D^^6f+YMQGJ8zCy1C_ z*IwV)YH4kk-51aML1km(k8N98YXAW1MgTMsLn-At&fq}r>o@Ntv-q<5WA|^-FojB$ zWm|-^7?9E`P17V!qv)jPQWqGKn1$e@qjFbQr&6j|EP9?7MNtq0f$vvqwJ;2ikHc)X z)i6yWmWDJcmCDZU&h+&2&d$!M$;q{~H9rVyVTd%vnOw&bLIA|lFv{i9$jFH2d7qY+ zVxq#q!HL#LQZf=R=IG4+PU0G@C=y;XS-yI#b3w+1U1s10df`#e2`+J4^Tx>;3)t`T5VQtIDz< z1hgj8kU~I13YKgc;X!$9Y;1dbJDcDbi?c<41X4PL$CnxAie0^KhytnE?=;QFJO&S}Ua+8yleFD30Xj?@h0fs9Y-S{i{~1^4I#-`wt(b6aazf6jUg!p#kXnXb{CwG&FScKj$hNs`U-! QdH?_b07*qoM6N<$f=6~dc>n+a literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_ktouch.png b/src/Docs/Chm/help/images/b16x16_ktouch.png new file mode 100644 index 0000000000000000000000000000000000000000..21ca8b01345fc2bd35554a3e7267d132f49776e6 GIT binary patch literal 695 zcmV;o0!aOdP)&58vvD;6<{-6WBY}Zbn>Pqz_yH9sk?DBeM{lI|iEt6kAOum|- zHLJQ+pWa$tLaVnP4&4C*{{^7!TE*gYZN6-8u5hQ}m(!m)RcX0xRknaeJzs_Uz(hAgpg^PxVQH_V^nY<6jq#=O1iK!ec4y+ zx{|nbvHNW6@1Ig4)~eSjrR8#UWMq_tLSe?3SJ!>fXyMSW0>XAOb^#m@n(>nQS#h?Z zNAvqVet$sME1R2H;_;}7L_%;*n1(SXz&#Q-T`mwN8h{N5J33;R3q|oLih~d$guu2o z)wThqm=Y`rLYgX@94OSK7-Ha27=nOML@5G5lEuaEtE<23R;^C3cVQu#%P$~Eq-+u# zTwAj;8#Ci$s&u_xuawep9FoiBW@l%mldyN!k&2m~C*mQwBmT-O~Qe!w~3ajI6c=H})QLamlyOequ! dx~}gm{{gk!5a~hGt3Ch#002ovPDHLkV1f@xH<S#@)vN0mNeCVJPEJ z6w31O8AQV`82*F6KcV>dABfzK-wX_F+zbqiD>sS&1Q5%+Pyhby-}9E?)B7I`%*+f7 z|A0392igEcK+FilOhA>441fRr0gJN$F)vW=D>Dbf*ROy70|XGu$IpKm;UaDn09g^LW|pFCj@D=uab)zM}6`Rg|WJKKK-c6OlQK)nC~ z#Pat)6WG~c8-M?1c>nMr!>8xZ8JPJ683eCfXJ9>Wkm3EKM-2DHBp7%*JAi6{fx!5W z;Xg1W{{g)R5I{_SfTsKdc@79ZJ$nW=KvG|yK~ztNfmvRW;rp964FBJ~WB9pZ1;gtH z4;UC&S%HT9gLsdbi2)#hSpG3E0}X(P2=kW>(Fnp`1VBmT4n&CIl z>HmF$7+5uR7`}b}!tn9^M}}|jKQIXLO8{K}3oXV>SJO62q2&r zfGO<{FpV<&1@ixc6Ne{bk^0{l~xw zj7mnJ0RRES!pXzQwEsR6!|gZkf$1ISoxh;yVPRn9v1Rys@fXAQqaPT40W$z71N{Sr z`rm&{3@kv+cRsK({AOoo0tg_M7muI6+PL#S$LDW<{{R2a2vrD5#{Z#gprQX5VVMJh vL4nS~#K`dNjeAKo)8Ik|!%$iSCDT0)xP z(&y6*eE*mk{xE)H@Ro>XVE@a*&~&1VL4tEBgMo$)+yH<8g1g}8%`*(&xIQw7iU}|r zezTWBj75}zjgg5#@s}CH+4uVx6nQim7`Ry&)?VHKRu8inAb^i_}71PRf<465=n41V%44AV9*VL18l48wPzhTngf7(Rdh!EpcGBZhM)ZZO2k zCNS6=m@|C+`4t|B00G1TF@S;L%a6|tLDudJT&&y-Gfzxsc>HTG11l3d!`~ka3@pDm z7$S8-8DbrS8U8T*V)*r&86JoL0R&A*{~3P&{=@L$&j$t@5I`*F&Yk;iVPV1X`}c3Ksjy@Xi)*kK zfrc;wA&d`F3(QOmpFe;81rR`t+}zxWQc_ZBK=rJkjEA0;(X%*642W4?zkdDo{rmTm b00ImEcz3pHt`who00000NkvXXu0mjfg`2ga literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_ok.png b/src/Docs/Chm/help/images/b16x16_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0f6a6174f67879d89b8c970d88734cd6f9f844 GIT binary patch literal 883 zcmV-(1C0EMP)wF51aIxG|t0o~WeTux?(*f!J?S`!vJrWM3^ z)v?u>(g^>@;xO#mkNlu=e*%b!BkO=S9U%&s|{QUTj4;ur+Qxv`b{1=&{q{_{@=tdkKKPJjPv{N-R+ z=H{q0b!wOgrI|?`QkZ(!{_7i9LV-VtRJx`%DQ2F^23wD{DqBhIRk` zF);r5{m+$GoMl&Put7+Jt2=`@4-Z4{!AlI=w!d7({+qd+0V(7F0suh(zW)OTFd63V z^!sFSNlF9<4gMd;*WzU&Dh*+FS2`3*A~OK^{__Bz$W0R(*Uum z?9l=80a*nF0_+3*1ONs71^@>82>=H93IGBCK>)u00}wAF|NZm@`|<(rTQ4UU0WcOM z00aL60Pp?k0KeVV0IsF+;Q#FbO$G-6;062!00#UB00{XE00{OE015OE00M|vNJE=} z^$*A6FQ5Ne@vDAS;$dfD`1Jo3!|5mY7`86`{^s{nmH;M>-&g)K|ATm%5g73x%=8b8 z0Ro7L;}<&v=RdZejL-PCo<9Aa;W^_ShKsN6GwfXY>&vg(Trted45#rWFn|DJV*bm{ z0Ky#q*cZJ%!~O8Y?dJ?fS26$kepw(JsCg%$6bcYP%o1uwz$j&AU}9wa&h(8#?9FW+ ziyzl{>lm2-O#9FFhv6UdZ-)OYzzhWT0wab200G2EX?6w(FaS`kAv2YZ@FM^K002ov JPDHLkV1n^7jC=q9 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_openterm.png b/src/Docs/Chm/help/images/b16x16_openterm.png new file mode 100644 index 0000000000000000000000000000000000000000..9715fea3db7b8b0288037781547537bf6da7d18d GIT binary patch literal 925 zcmV;O17iG%P)Cj&Dx6VO~n21Z5@3Bvyv7(uQCyA)y=J1Yx=h@c?D z_8oiK0Ro5xsOaD2yEhq@?%&8DCn>=IQpUu{1a=-H6BEcN1_+l4Y$yve3&Yz_?-_h` z%^3dv{{0^yfLK5ZK7IefASl7bpl_hW@axwvph8B72a$pY=n1gF%q&a{$2T5i_@Jo4 zzzpOA1Q5%Apnup|*%)rTy3X+Z=4*!k|3J2)1?+#YUl=&JI2cZ!JceA(WRp0Cv-i(3Y`?Xgfq|KUft87sf$1MJ1LGeS2F6d! z3}0V-XZXwbmw|avnj)$ z=X?zRUJ5Y$f5pr2=PMfnJ2wvl10N>?0~;$iOhA?c1Q5%ge}5Uc*f<$ZUOvenV8F*9 ztEkNI>hVv8Lg##jSMOgjwC$eEz{m^?>OX&hq5g+~`R@+~Miz(x|A2Y{0*L89P=b|_ zh2j0j?+mZLzGXz))uaCn6B|_xB$- z(Ek7Z!|;RuJA){v5Cc043&Wp3zZn1mh~@A9e~fa{(hOV6XEXf#15C<5rvVc?!#{A^ z{{yxK6x9rjko*CO+=GPtV;00000NkvXXu0mjfc72>q literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_package_system.png b/src/Docs/Chm/help/images/b16x16_package_system.png new file mode 100644 index 0000000000000000000000000000000000000000..7a750b9e46ee9220d749b7b2ff405fc01fa208c2 GIT binary patch literal 1129 zcmV-v1eW`WP)w>=+8AU&=F^6V`AW7oNzg&9p;>nNy|JgW~tbNbGpexM4AjHAIz|GFU zz{149@ZlH3o8#{p^1S6av^2HK??1R-01!Y-fB*hvfZ_lD|KED_=;?cHElCD`EfEF= z1t8XxW?;}(WMEJSVrf1GKOad3J6mf;6;-VmpdLkl0Adjk5P`dZoBP*~w{Jh)6%yu@ zlHp@w`1s}%1A_q21wDTK4 z05Sbx;a~t`W;S3f{AGCc`t6x-U%&jK^XDgbA2G<@y~v;^F3sSgE6HFZ z_?h9we|d&VLwN=%Zbk-{KOY#LzI?~b$jHPC5CA~{zW)R!-_`*90002|3=RMqVR8T% z9T;Nn*wO($1nB@56XO8g?;!xZ*6aKG_ww)e_44iM?CHpZ)*@5DO^uK`vltW(u{lHkxK*s>#i8<|M=6joTQWs_8SR8e1~tc?8R_ zF>`N`kXGV-_44Vz|H+^buu8Ic;AQllpf!fHH z`f4o$ZN@J%Cjo8V%CODA<)4SG8xzm3KMY*#tiZtj#qj6%cLr`?vS#OEXAqYcVfg>U zgpZq>F9{$306_r0{{hBVP4zimSPJ@{m;koH$N+xt{NmLI42LWwDL_3uK1feaP!A_4 zB>?g7?EvEBKnwy549+?X3_E~{wF?v+ATbUu v9tKbnXJuuDDdT`KSXfvYfbkF44-jAg=ki{>6w4Rz00000NkvXXu0mjffQ}FU literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_password.png b/src/Docs/Chm/help/images/b16x16_password.png new file mode 100644 index 0000000000000000000000000000000000000000..56568249866353fa1c4ee8f2c39492dce90c4322 GIT binary patch literal 949 zcmV;m14{gfP)ezn|R)&A?*ctva+-3O301!Yd z3^>5w-;50G>`26qB@^)?;4<)AUK)Zwh0*Kj9 zL70J!jR}sK8JQRq41cV5N_eNs#sbm|R3`F|flGj!QRP1ypO&2%yQsepqxPr!ikl99 z=K%;HmIKc}f_=dVb^gzvj0}#dzh&5%fuj5j5X{cRz^Bf@;MK3e#lY&s!0_-1!-Xdfr;@i!{-fG8Ln*q!0_YiABOI&e_m|=z*q+K z)M8ka0|XGuzkk5s`^R8v@B41ETl{OGKkxoCaI>%ho&TF*Mc>DN`!D|fu>ZmTU4Iz< zKY7c*unMU8G;*2&2q1=HJ1x^yby6?B+-Cm&?H14-?|A=TnZ^A-LY4g!Cj;9A1_mZ$ z20Q>DfEecF$zJ|)i~0Zen+*SdoniU^dI#VCVke%TK#eg#%)r6Gj8{KE05R;JD*WaD z3kIOg9RIgA^ZYj!~fr92g13>@~K#aOloPEsy{+a&%!}$NsyWd-W{`=d-!~hCcr~)AT&w$$`fB*vk XU$iZYw~u!)00000NkvXXu0mjf`}okY literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_rotate_cw.png b/src/Docs/Chm/help/images/b16x16_rotate_cw.png new file mode 100644 index 0000000000000000000000000000000000000000..4753c10c4c3392a2555989793c90b1416d8f8761 GIT binary patch literal 834 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 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_usbpendrive_unmount.png b/src/Docs/Chm/help/images/b16x16_usbpendrive_unmount.png new file mode 100644 index 0000000000000000000000000000000000000000..eaafc2b6b3b9d1b3cd7cc58b7b43d8dde5357557 GIT binary patch literal 777 zcmV+k1NQuhP)W?*FGXL$GSIRg_D6Hx3Q1ITgTzyAO# z`)SX|CzL2DsbDW7BP%5$!ozam!v2>_m$t+L1P}`@lYjj9$-v6W?kX)US)!|}XQ!^N z!@0Vb%trv`oI4E{eC_`0KpCT{ri^|H@C=KA0K-&Gcz@&KYy4R zUcLmy&~KoP{}^Otc^L$Sm>ITgzQa&eRr~wp%Om|j$#nn$1UBIB-@m3361rR6+^j`4 zGz5V*GBAAk@|%H;?KcBIKLgNKE(UHcCWht9&oQ*N*8jMBZ|h{Bwpx&0fB<4)W@cm( z5#dYG(=!ki6c7a4%F6neK|z6$L0X!Nfs>Pg;mM=l4BcI88RpIJdj0zKnFgS~X)u=q z1P}{Q^J+^=ML$_tCWbGce=vwka4<+purP3QGcbJm#K5p?=S_xLGZ+2avv=;PU%y{g z0QDS14mW@RVwgUC?T`QefBk>``sM%QC!YL&|L*VqpFjWq-@pI)|BUpx|D~jC-U8LN z1F->oF8?b-AH|A$tfx)Zq4 z3qSxd%E(w~`1*Pu`S$G<@7Aq5u1HFn$US&)_T}f#x7vX6t3a`fFDU~A5F;liKPXEC zeEHb@#m zL)ah;aum=&usA>fvHS-r1hN_K-hI#T`}ZFPCT3=!QA|KXegn6|1f-fbe!Sin@0?Pe}7{T{LAp?*H4BwAO13& zeaOoo#h}S>=QcBghR`<#7IB~pnVA?kx!8f>z{v3J+Yg{dc6iJH1Q6JO|G=m@bM`5N z#PiP#pWiVvoMDn<5WIYW;ivFlhJ81ffnoF?teKUSnc?!~R}5BGs*sce)C&+mEFizx z+KMxL{ie+D7w9xKMFz0n{{LrX`1KbU1b-oc1+wwapMMP2)-pf?B!SU+6KnuL0I~e} z^Ou2-kCnm2Sq^N=UvO&s4@oF6`u~4;sszOVD=R20{(xNp5I`)<%*;R!Fau3zW`N`+ zMriUy(1@fA5@P@+A`T$t1Z6ZPfB<4SckbMG3kwU5-@ku@qX(8`VSYsCgD^-fFf#$8 z^z$!(0Al3k=1!E7l1c;0v;GIU7cDEJXK|1i5VO2~{rcHLq O00004jL0tm$gKm{x;EX--DKE8a69NY{a`1u*$$;mP> zuyZizs;F?Xv$3WEoz3wFq85w+0*HwbNH9We2MQR;ni_>k>KiaHh>I~a^!GEAcXcuR z)zV^+=Hg~hk(KfN!oXk&3=f8%Pz(@2Ot9zxg**orXRf-Z7Z1pG1{oQKhxhL@+`V>< zfyvB_fl)w^!I+PqgNK8?@H@~=us{R|Ab1#n{4TAl878J6&%huo1o8}ns-hx;lB_HP zBPS;VgOwG7%-63BYJvjZ!02;=c>y4RnEpWHla+_3P=Wg&+mF3#8UD)4fn6moF3un= zEe%OnF3t=O1-Ti-8GbTxb8+PXy}|@^2?Ia?F+teJK%^_YC5oP!mo4~;E2IiMFn?4Q4XGYI$vGW=22WRU#+jh&x^JsW5M4?qBcykILMFB!=5 zAJ0*G;|y5cuWC0@>NFJ3VG`T3jS*MDY)-+%rw{QCVDn0~k! z{s5i${=;X6KR``?fSUgN`~`FkBLf%Eu=D@^{Qw9c#yMOZyM!gh9Dz>$`{&m$hQC0+ zf)s*m{`2<_!|%WU8UBL!|3LI#hQEwVz-VU#%Kc@2_WREXfB*vkY-A!yS_)YS00000 LNkvXXu0mjfySbgi literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_window_list.png b/src/Docs/Chm/help/images/b16x16_window_list.png new file mode 100644 index 0000000000000000000000000000000000000000..085baffff2cea406c1a05068eaabe8518c69d860 GIT binary patch literal 915 zcmV;E18n?>P)9>2sDuisF@9@i4jP%05!7y z{m<~1fr;TaBMSrbX>oZeaRE_dBZUuNzI+9{03d)^zQ6nSFV6Wl1DD!g29OCLLqM1T z%m#Yz|33yMW+sLU5C1Y`e);}SR)j_L_n)6{|NQyG3iSR3W7gRzA*uYkeC32iJ2S&8yh>rvEv^Ye*OCO2Oxl0{`_NNfJ7xDhUVYEX!rv( zfEgGLK(!2fe0&VbDhgn=d{=LQ)c^z#)9?RGaNGa=13CFWF#16FFBty<8Ui*57!<#L z16}gt2QXNG@<28tFw_A8a6kq*0DvG28w?Wv|6Ku{o_1TCh6XEscaR5^ZkXtzQa0X= zv_kq|o}rp-lx*LD;|d^_UyK}#4_^Id;OAgq_zMj2Kfiu4`~}00M~R+LDwipkYo7-#&j8Q&2MKXzx%rFxCYJ5J(j$Q2+e? z3pDI6gBU+E!FkA@4A*Zx0{b6i0LTU4 z=mn?h|KQZg%F4>{?%fAa(q{$;AVv;;Wd5ZIii-dM002ovPDHLkV1krllb!$o literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b16x16_xmag.png b/src/Docs/Chm/help/images/b16x16_xmag.png new file mode 100644 index 0000000000000000000000000000000000000000..d4e71b5f40dea2b781173d8d82b927ab5d392f82 GIT binary patch literal 601 zcmV-f0;c_mP)r5cHzG z3W^uC{sArpDQHkgi;YXLwKaR1effDv1u3aebzqq9Ts{ml-vRzHsNb8bS1#|hSUS$> z3`##mfla4Up+r0yIC1jS-Sq&>FLCq6wehaLf&12NeRfx;gWGJjFoLeVjba4<(C(ck zNs^xigF&(uKm)*q^Akf`x_r094j-r1x1h#~sL}$|&3ecVFAVnHu}Zmkw$TJM0GP~{ ziK5O;6(|;o6<}#KV_6_y0g5^gd;^1Lc#e}A0-Cg~I}$YwQh6Yj2YzIM%aDq(i`@1%N1zI&wt^w&{ zJxet}RslwJ6|u-%;#)KxZg>TTrlQ?0>xj{8g{%UaI6xx;iUhREK;df;lXq?hKFxo8 z+z=3&otsTY7rE_D+b%^hpjqOf5djq`U@0_%TrQ4HR4#MPv+M((pHaqbf16! zX@}G8q8Wybd=4)>pL#YqtjM+_7xx^K<4>wHV{eZRM$!-d}JOH!+FigW1 z8f6#BbU(?wI#7OOk`Hg#^ERO8{UKq2y!Mjh3xD~ZQ+IsB5EF&&HwXDIif(zdN1|xQ%;E)!T*S#-TtxYWFs``00000NkvXXu0mjfx^4-+ literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_binary.png b/src/Docs/Chm/help/images/b64x64_binary.png new file mode 100644 index 0000000000000000000000000000000000000000..005d8c0ee65a14775aaaf0391c13f9ca35bed3d0 GIT binary patch literal 3703 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 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_chardevice.png b/src/Docs/Chm/help/images/b64x64_chardevice.png new file mode 100644 index 0000000000000000000000000000000000000000..078f4cd9547ab6b6fc1e963addfd615f65d192b4 GIT binary patch literal 5210 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 COC=Nl literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_dataexchange.png b/src/Docs/Chm/help/images/b64x64_dataexchange.png new file mode 100644 index 0000000000000000000000000000000000000000..7238a4fcca3dbbe0acd2f03413ac21ed5cc6e3bf GIT binary patch literal 3301 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 Jad#b@{y)Uhr8xiq literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_doc.png b/src/Docs/Chm/help/images/b64x64_doc.png new file mode 100644 index 0000000000000000000000000000000000000000..04c6547adb3d8789cbb26e9eefee6ff4f33df49a GIT binary patch literal 1474 zcmV;z1wHzSP)00006bW%=J0RI30 z0RM@=FOUEL1$RkAK~#9!)mlqSD_Ick^GMVfg8`Ko-3b~&LBXiOg_?k;scqhGNN-KS+ppc^yBnv7H6iX?N0iYq+1UXx|52js#EpV zcd8m_jK+ND1(|QYu=TB9fBrf?K0Z4;V;DwN)zDQ;CX=hHt7~g(gXux*r@$0KKmYi7 zbaXU7Kc7ma{ucruL<7p@aTRLI}e!>2z8Y#mC1-2NY5i#pD}%ZS3FoDj>@;)gB=f ziA0R@s;X+5R;^a;P{@cmjxKC|mrMfDX!QL2{OaloA=KaBzp}DoiZNAHt*D3_xhi1o z>5^snb-3Dhl0xUK0({dLND>iX1k4g^mnAcT=f z1OT9E8X?5UEd8KRz~u~M{PgrxsZ=n=i9{lk$#5Lkh-Lddf0#l;0eD3wZ$ zjg7gX;?N(JXy&M3V;+PM{kI%RghLXybrTvL#}q}8BuQ0O3PC0TZ%G`m_Ks}STOkWx zdrBpYWX_6FuIO~#P!0@~2qCpv4P(snyq`K?C38V)4*(#9yuZI=j5&_8V!8(^5xn*^ ziL2FWrBaDTqlrX9Q50iy#T6F{mr97DI6gkUwY3Ey?CI$tgg^*AQ;87ImV}T@CNnuX zNg0tK2-N)^*r-mVLZK1>07;T)AFi%^T@-@8>p=5I=eoE0A;$VEt*is>=#A2@L`O#l zgpj5$&-0X-`l$oKcXp%E=*`W|?d>f>XkcJqd3o70l?YLL`YK6MwOU08#p7|Szgy6i zXrK0`Otr$lt0SfTZUobn5JeF}NXeX^5DJk>Py+-(KnT(1ihnj57L|}BiIO=%5bOsc zUy(}atwl=atlE2q(crrhq9{@}TC3HpQQ)VL1rYZ}Dxs<>O5;WI!wydwF@G($+Dp&3LrQ>8g=YQ>E!E?G(~y&sdg4 z2w6etlL3W7VS9UfXJ==0bkrV6+`r=pN{;`htE=n&{{F|0AN~FPot>R_2F%UPEiNu@ zY;5fB?~ja(*rZWlkHP`~9v&VJ4-Z+E&FAyO!^36))04Zu|Neb&aBy;R^7{Jf5(nD7 z5JG)@eN$6Yxm>PLD9q>P?F?WT=JBt`tE;QKySvxdSN++w5ElTTtE+2hXlP<$!lZqD c1HRY#2l&$fn#*1$q5uE@07*qoM6N<$g4N=(%>V!Z literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_enhanced_browsing.png b/src/Docs/Chm/help/images/b64x64_enhanced_browsing.png new file mode 100644 index 0000000000000000000000000000000000000000..91d9c62485d8fedf27fe881fcf53f178e6344afe GIT binary patch literal 3668 zcmV-a4y*BrP)00006bW%=J0RI30 z0RM@=FOUEL4hcy_K~#9!?V4F^T-SNWzkBE2**ToyaQ2yd=MIOPWG$3QOSVEwmK-~9 z;w4KTiq=kwxJDnEqG*7iFp^Y8)ue#!8VPJCZWN=AWW`b~RhuoDlB#`+DQXwD;c(w( zIGmZgpS$*fMjv9C6iGv3fP9#T!2svX`Q3BQ|9s#7T+9R${*(iUKk@i8!2J$lNsZ=> zwl}U0UR5;}3=B*#OmLFU=T<+vY57KXh5L?8u%)w!pM2xVwyvWZxX zZBUdj6-yC`s;Vl7!?8qVbl0U_;B?r1;b)ju&fsNTHZc8quDfIKI3%?QrjDb*c!WnScnDpc0A15P90aE=TFq>rnoDXKnFw&>{NUxW z@j>9QfbL60k~B>Rf`O$7uwPt;R4U0NmmnN{4@x7)TpN7i7(o|_aET>b04Ut0Ts5d*R+xZA?cE8s#8+& zWX}cQFkB_-TuFvug2CVt1vq^56R;CDkMH65YF_14Lp5=uH{U-nF$4nP(VaCxnx^S+ zB)sr+dblv$cB}2?@J&fZ0atJ>v-Yv&kGkBh#gG1c_r=>=yTET*6I)JKMFfpUCNjV{ z-`8%GM35XYJP?gWXW71U1H5wJmAC%&t-Lq|7y-Hk6dY5Drf}1b|M!RA-1PKf<^SwX z9mAl)_EfqRw}6CX)l>^Y@odi@fF%fxsP`mkny#v0 z4pc8>23|e<>W;lTAR2PU=ocHGTNi0WrgUqnYyZ`cdb_*%A>t<={33EN@Xe>6UEt$C z{ribu=OK)5tZDIAc&Fq7GLfn&XL>F{Ne5(M$OuJI(P(rbCFK-1_1aHfgUSkLIKF-J z)@M?!!|Lb+nhb}$$$0RW<~u!H-}I2XDhfBIXgO#{-%m^6_?`B7m^C6uqU zv{<|bSkajecx$pwqYQt5XAfr4&XWQqp9_REkpRQtxHpNL(fA+=*l|IlKJN1~4`~0j34VEKaMnpiZ+o%W5pEvoj35 z&J%VFz|d5Ddb%hG!h8XCpW6p^a8^~VuUW&XJTj4i8@ETghlYoMcT}0~nh>2#CTExb z*#H90ASk#laM|*pXoxeT|Lmi&CAB1QB4}2^By>%?W0^Nge0;gBXQB@rdP{O;#2e&Q z9vKK3=weSh6g7}Znha1B6^q3dZfvcJtpddYMgB<7@v>g#4Zf_G%UYS$SRUiYC&$H{ z2%N`_6KR5UFdf#mjTsDnt@Fy9DN!O+q4)FMj zP1Uv_6s?pQp`Nep9=>{G7CO+eY)A{uot9hWFiTPmwT=POJWLH zTMd$TrfF%$JkA9sDJ^87AX56A9m>0b+O>`#>PM(FhBh{ zy$7s7RJtBXH;LM3*?)F&aA0T*%`)c8vMpiNd)|khDfBbu5RtxweuQ10PH@y zPc>C=st++M39CgGWz|$TiNDp?3A_VWiJIytMNxjg|4VbH8yXw_cHsHVE$c@{Mp%|L z48!4Y1cO0_VOFeMF>mwd%zm&LHlMpCy_#1AWFigMGh^BDk#XPxKFm=QP9zeEU?}*d z0RRA=C-7-*zwIfX+8(k)uoK)0CZfp>*1ZaOwU`M;+CzyA2W0$&2B)RbP~blXKu zL?+^qaI5Z-&25{C-#9=$Gzl(>6MZuAp>ccHj*0|9Ucd+(qmfd zqx5{`|K0&y$=tlqbp@PKGDby1Azl?`wr^)|mr*c5bSA9c#9Zdj{RDXb#9j?laG^D| zD}cacLsmd3^2JQ14>&KO5e;-`$w1=T#o*NXNDQ!G3mv1I`m9 zoykZ%nM}@Eyf0ivPjsH>9PJckDO?e0VVdiyy1Vav@7a$BwvIqhSe9DpsdSf68JS4d z31{?W|qi-G1oVpMUT0iMF|Ohm!|8dON`>1tZmoSd3HoneChH%W4G!cz4Y1 zrWUb%XPbe29sAyV`%UmwLOjIyQqBHa4Ak2b-8YAB0BD0_6F>dk>w!J@>H5&c zbcdUI9f!;>hqYaBfT|8E+t&OwKnazbk+(`?rA04$;uxum0|jnqM$U zeM*}e5l4@79sjSk9TG2J9?pE&cF>>oe^Eg*Rhs_f#j`-_xEHHqYGqwkOhw1Ed?7zQ zS_F>r0GSF!6N$uK7Vq;|LLXiG=-Svd@K$^+z3KJVA6iIkQqE0EIZkI+)i-Wvc?2qX z6E}`@T*zj>&{NrWt}S0GLPa?o35LT#K^0_OMxgX(vUcR&*>biu`{kjNi9hh$x&ei zOciBgd}5O4`8)K`*LD8ZRdDmRN_$OBN>D{)APv{XhsK0S8Q7|T)s~7UX1Tgs6aZ=3 zLB$Of6;YAX*|JuinSruiW;K@8SWQ#GAV9|@Nm3N$4yW(2{i>;egH2LNx7Rh3y-Auh z)Hei07fAM$$2a@c-J$?iMpgpC)#CKUk#-s6naBT`FJ$slcg6MMMBuU&^1OEHu z5pYP>D&oO4O|l`&x~yXA^z`)9U;#?iE{v#;L}$OcTNJ?K%Qj;Q2}S*b_B~yNUX@Td zgX0Ze0D(2w?DdRMAb_t3IBb<3&*$G?*mve=|M(cVN=!}CANGr?hzz7)%2@xXK7|42 zi8>rqVzKf+8^9ASo7X0qq2L(k&1~KC@1OQvo|dPl(e&8V*tJtvCT~o^Xp+>e%R<3O zB$BF0{jvA|$$qe^P^qNSDP$m7mk}UA62|++pyAr zDH{;=;qbh?+eKxgPk!}@*o|l=lNlNwE|p3+hPhm>NFfq6^}&a|w#w3g zDNl%?0{{jl27rM^0_&kGYz##ulS%mU;;!CW92y*wW!W@MtJONEoBQ6L-LGzcZ?aI- zH4{t#69d3;3?eT3SL*5>+qiMVh7F-`=$-=1H_n_s)7jZsEEWyJ`2Qd6b~{bet5>i7 myl^c!fO{E#es}tQ$NvE)Ya2v4=okI~0000?N08){c8*59#n^3t@$&`440IJF91qPt<#2{d5YMOua=uwBo#f4*I^;~5z zlqA~Oa^=H1bMqUHP>oG({MT1SukVJ`qg5Bveqru_R9-B|%gx+0$h2KxGwz_0E2jDK?$RmqU`fXn3DnuB~JBO~<1ix-_5XPNqEThdO+xP)or9mJI? z3T1X*dc{Yk!vm*oXo+i_q@D{on5tpgNbr^}aYVQNevx0=l6DOesm4c*I}np~}wRDIVuX zZ;NmT6Kx$p#2HW+!uw_jt=vfc=%E4dfJS`)PI*5(T+eNo2;nN|)*I&1q(kGwL{WuO zY24q)4e(G#LftL_kGKOLL{ean(p4wDaKU(Dg?7ABA=$I^r4LwP-_{+9wkAH^t4dSC z=(7k0!rvIwqIsGZNIpxUt|kJ<6b-1Q;Q@_Av#e6^-(b)_UP+#u^G|)m6-{pRyP~9~ z(fA#)Vf831`4upieSQ$?K{Ye9v<3GC%LrGiIPPwmJQ7{>xgmVbV0%_-HDh2?7Y98uB`m=*#qOh1afL!)fxib4*(0ul$SR|xxAiiUk(7?qr1`nD!(-IS|el^xO zTvebfLG?$x58D&Q=0r3_tt-Xw024jH2mYgPlK{`n)jhRn?4_~^vK2XG+ZNWCQmJjCii$4L_3O=WYb$ z_z=9ggk4iK+V4>ogF!rKvQKS$p!eZWz~94liCPlG2})D*b$;<-jxZ+&Kl{%*{;iZ# z(y3uCd|sxOZ}OLI@YCab&RE9u8l-u4{l00W5rl*QrgnANIyOH*p z+uQGkI>mj^6I{M*ASfsR1sMe60K-?pc}$p~8gD?`*kqHF= z4bdMCu}>Ele%gS3e(vDz-M-+#DK`6CWLQ3vYb43D34!;mtfa*L|G>Z}I>7Vj=xCy@ z&0p++C&!Ehm6d9O@^W;5T(>Wm3%BodaVcU21!eK`whLJS0oeStO%1l{cB50n#?S^E zL2mAP$$0NDVrZ z9*JzEVRPE9ngh0V$qQf*HO|&@)hg7>a+;^NH;utnq)1z{r(j?-LR=lk9(a0!F8TLf zB*n+qmp{rBKhFKzg-qpn9>9~U_09+T7dfGbsmAb<-6Z>R!k0i`rp7El-AeK-*+cK# zvbUtHA=1csbjNUOwlQFytOb%tBsSI4j*<8cYe=xO8->3F3OGtdGO?hbfc=A(E!@;6 z{SyVC+-QL3G^1<;^YT9nKSO*=nFH;SE5p*%RINgDfWKpuOamUGbDvPfKCv8OZZ76# zexc(*bZ4e1^fZKGVq(Jka-F~Ry>o2hl{n8P==p_(bh&&!xBNe(+=ZH4 zZ!$ao0jlCoy>m|UFL}mu{<-kepWV=+()AS$ABESYNz#wec@dYAl9DLF!NGdpzkk;| za^#2}!U}kWLXuv?t4by_V%4k`ao7a-rA3(!D$&TnYU92bUZ+2Dha<~9ef}0So3}}V zgC|CARAyulB!!N~ysgrcvXS!2%GI^ac<&x+qVOi9r>!?RX+#|FxePqSA3&*ju*8W< zr7}Wz@gl}SRBT&!a#4Sk`_mgV2*|mBrn%||jo(8TKISTH8Huw+tS!N5Qf6OGv|$l3 z3Dy~|eDaf0{4}9ObgQycbp0w`dmP!h{j`O{?b#V%^kbhdQ-HlAn`!g18?KPvnf9+7Z- zQCpI`e-(60&Yt@=p(&|nb`crM4RpqnL+7Mt$#~37Ar@oc$n1Mp;+7X!yAOp_$9hM? zH->oM!nAa)qPE_b$a;RJLPgynN{rK5Z`bf=)@$`iqoFsMDxdfUZz*^F`Wi9UZPqN(8fvCigf_{>Uz0Mc zkwn*=P#Yl<0*WKY*tJ#rH(+L3pAzq!eg^l$J#Z78VOLBDHTkuu6oNV8^@JNbAHkq2 zcmv0|-ln$L8Te${j8y@p>#!~@b|#iCUsy%bS#NIk+SW1WiSq&PF$LvCGi6ZHnQ z0k*n@@sV^u?e);xlbFv;f_#ePCTC`W9hhB7L?slH$`yX53YlCk+QHy2(;FB2EJ|6k z)ibtjQTuI+p2VJ&Hs5O{uKJ?yHpUHJiS&S=wr`9i@)YwLg!a9rKpoHAOdd@Pc#j|W zehP~{Px5&s0ujuopx!tdjj#{>@(hh8PiTc@lXe(MucK)1UaAtKxTMj-gk{(_t=KPX zl;KdwSDuyCh$@mYCXdNY7jXeu*yc|qHo^h0*}CmLRo`%-emNgCdM}Pn%lLynm^_;; zm5${R8(m%yAFp~$^ttOur`0**?8gnvw$f;!XDA{DjjW^##&WiolUG$73jZDBbvSAy zO8ZZxA{C2vYIk*(8|woj(45LNP@*YmxvWcZh#r#2W?uV)=Ir>Wy%BA~C7fPZF%M$I zOL0FK4*|e;A>|FK&NIA=n|WM-WMAOse9gpraXwoZL{ zkScE+7w`prLV@qk@timIQ(~=7&dE@c-eE3fASnOJRrjosxDO3iTZu&PVe&1)cGbDg za}ME)CD-_xN026q?F8ypubTU{EI?-t*C4hAX6?^+17pgBPHIbgH{95jwe6>^ZAKi* z`R99;YlfUr_%d1{c8y{bTZBK;LR!4%UMKc$U99dL=5%<1G`&cEg+D#xEGYj(0^?Wu zr7>mm8$j?7>L|E*ok*TOlhL1|rEGj0!5_3n{%+=*HBzolJscS2rC@Gi5&YGeJm;1? zV%0}$Vo^obNc&c@hW&?7A)DC_1FNt~*G{bpJ^fm@E&nv>q#%e+HxW!3+6tB$%*{xV zF*jid{Tgg+HCM?_n7NoE9S>o95Xz=W;^#B7i`zZd^Ddx{sRNy8(Z4(Idj)wHG$Kd5 z>euu3l*mcNrxyh>ggr!BuX5u^?-ZqnIoB@xYIDsn9QAla{yqe*=*2~kp==Fkegi>O zdyeXe8T$?wQ$hz21ll{YkvS5ur3DS;EmdWUI6$qgz#Ht@Or5FNHE zn^U`xb6NU|E~FI2`iHi{5Idap)k}Ue$_MFSmS5Bx?*Z194ONTAt7nx^HQw@6-HCSD z=kEPrjL}J1rgM<*FSUWk3)7kdSOsy5MMLHrUFZjBh7;j8@K0+d?LgA4&3I{=`yX{{ z*rB1kJJ-UX-S@#C#QQqJB`14?D`uBiW_=XZi^eP_=Mmfbcan*U2M8 z12JZ+!h30T7NGArYbe{c%JsxP*>m+MDRlbg^KzC>M5$_2=&lSzM!9%b?6JaXx;FX< z<@4E>_(ypv_TRI%VRD8^0FtSp%U7bs+9|R%sItSZUje|vQs;xY<@43sf)PA2deBa4 zEcT+RQ9c{fqM>`=?B)(Yj>$94%JK4k76XzvIULR>u$=pgZ~R%JOE1ikbs#LkQ!$GIj zkzpbinD>^#)%)w&T!(DeixNJjUld9`pg`*)`+`w0cIP`6%cXL~{AHGpB$efS)Lha$ zbeku?+gGmfcGH5=?V7#MgHI8>IiJi-;y3qm#88uzk(?DSXN}83#Iw}^ny?*6LUiBi zV0u*5l38tFqI*%^K)o5+PAxysC_^-6)>w6$Mr%t;)@l=T4qqYt7=~E@A3nerjD^F0xSNv*5J!%|ASAu;9|O z+$<*EP`^N}8GLj& z{mR|DByGYlU%m)2qXF+2{0o2fm;bxZE7iJx@D3^?nI9zN^EsX|g{R`Hpmjh7i~e^j zKf#6^g8nsc;Ddqy>D%>0{lbf2Xx|^YYon+%QWXFsPOc|2aidmHl2!&&?(xkYF&kp2 zuQr>%lCSj|=%A8-02Kx0#cmuPtX5J0G!fY1(oi$BQ2PoI^MKbzKeszB?3Dij8Z{wZ literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_help.png b/src/Docs/Chm/help/images/b64x64_help.png new file mode 100644 index 0000000000000000000000000000000000000000..7a6ee429ac6c17cc20fd20a31d3175990d306078 GIT binary patch literal 5854 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 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_kcmdrkonqi.png b/src/Docs/Chm/help/images/b64x64_kcmdrkonqi.png new file mode 100644 index 0000000000000000000000000000000000000000..996ddc6c68aa97411d16ef4fa861323800dce520 GIT binary patch literal 6614 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 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_kdmconfig.png b/src/Docs/Chm/help/images/b64x64_kdmconfig.png new file mode 100644 index 0000000000000000000000000000000000000000..0def963e879544834c6b7746a9885056387ac83a GIT binary patch literal 7506 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 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_kmultiple.png b/src/Docs/Chm/help/images/b64x64_kmultiple.png new file mode 100644 index 0000000000000000000000000000000000000000..bd347e0ffe4d0fc2abd928c43cad06fc844eb9b2 GIT binary patch literal 1305 zcmV+!1?KvRP)00006bW%=J0RI30 z0RM@=FOUEL1kOoBK~#9!?OIJsBS{#pPDc$L%|y&45RZu&)PqYlbC^9D0{R0+Gakg# zAc4V)Ui|~&+#(+Q2OhlaNMPp}c7lsDAbZj{!DJ8=G?0Mlbh@kO(9nc*_1j(5U9${p z9RjINx}W#!d7r9kK}S0Jl}7;m;^WzX|9S+8v$d<*(a}-8Ue|SA6@oFIo0}^X3h9?= zFZU6wMf~mh+u`Bi+S*zy7SlA%nDo~YK@c#;<#M@Fscda+WnX3eG~mPjhkQOiKR@s0 z|At}2Pt#`N)nG6visH`B&gkgq#>NJ790)0NcXt<$#|J?W(J(_dK4n>sMx)cy)75IV z(P*Sm+P5Oc7-NiyX=8=R7M#IPMNvAPj-M=K=Dmr7%E2yio6gcS&G46>EaZsKBYKxH zWQ@SztvR6|jIBpY$Odrrz4azO8!(uWT+tiP@@PX4NFnd&hq8s}dyXl@6+IOrvqyk8 zdW>@QK*a9J9>TIFLIK(c_=4UV z1emqiS%?#QbH-)Qp)VR!83L>081lk159e8axmMH(o7Fx zCpO2>Ruwx7`Gwvp_!xHns9DH&^l&G3*~r{Rz{}kCuC9)ck2}f=K)b{9V`F0v4-aQ&XPcXwFt<`miDI$1 zzP^5Sb(KgYfF3T(avR^8dPEJmU zyD@?wbi3V1B$CNwy4^0U!|Vo}Qk( zkQHzg?eg#@h?vII)Re#HXs}#m+?j)4)c}^>ZgPnVJzXPnIe^uckLZbK?>=XZ=!x@y1`$QE-EQyg?ZslTP$)!}Rm?BG ze*XLO_V#wW-4;c0@TqL_&Tib_-%FCTxVV_l=ijWn@zVf=(AO_t&(F^rjYhB6LmY-t zY2k11PA}=LY-$=ZuV;8mrOe P00000NkvXXu0mjfjF*9f literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_konsole.png b/src/Docs/Chm/help/images/b64x64_konsole.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c961e28c130f4308ab6b6751f94af970e735e6 GIT binary patch literal 3530 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 LNkvXXu0mjft7yfX literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_package_system.png b/src/Docs/Chm/help/images/b64x64_package_system.png new file mode 100644 index 0000000000000000000000000000000000000000..ea8e84f9809705ee5a4a5925c39572bcab282580 GIT binary patch literal 7822 zcmW+*XH*kg7oBv@zal7I!VVtEt`gixQNfQles3Sa<5K~Vt<#Ln}f z@DwX0fl#FcE12r7_B4J2f~_{~}~cimre@4086z4y79K0Cd%G>kL=0MPQ@vT=`U zr2To-(5mmFzhnDU12V#6hX(+ZHaVfr{ZP#bCpY<@+#4N!GCuft7~l~a%?KlT9}SKO z+Y=TXdOEf_%oPC4NZuPg_9c8_C?JR`+=2#Rb#>%g7!9}}0{}JN5+VS={B1%k(r)82 zYFAq10gg z#pT{E7k4Mdj^wl-KDxr*KJQDLsm;#ZbLr2bCMN~=k1vVcLq;r((Rt|j1utoQ(K{hm zCZ7Ai8V`UZ%YY-HQ3w)<@K_nUU1zDqRs;4LJonJ;V3;LsDZ*!R*DkN%s%hcR*yUeH6Iwv7l_I2W_NXW6_WgjG3pg&sf=961hw>K0DXaeot^(3n<+oPX?kmF8lrda_C~9#?=HWG zt|2vYTwy23bsM1DlTZzV1We-9Qe7A2b3w1(P+3aPVW_5_7Ue@y%uiwQa){8?-AzEE zPy~(*P2buatc#*4O#l3%Z0GC>HG~JQPa_-%aoq?$0s>%&dTj+AOXslh7MV0rORtEm0-buO=(#;}KxnJ15LjnQiO(QuLi#ix_i`R=h5?z*7Kh1LMgW#W$H@}X#3OwdRE}+ zxrv!<7Nm?}E==p&HZ(W4$4vAr=c?=e_VAs>b^!YKwyd;NVII z*#Rhj{}flbgh-Bd@TgNRM!=I6BvjsB2vN^Q{pzP?HfQbe>e6Ayf?q4{xtFgdPcQj?AFi`0g@RPuTxXkoLa@3<+WLMT>s}>! zHJ4PwPCAPT1Wd~L{y_t@hh3j}$JS0C!rXU6ZLy&hE_qb&+)MUcZo@9t0ZId_WR@#e z#{c^8aPBRYbqZsv+VtTf~1+4XZYckJA$jgF1=Hlts#m>h2L z+8L>S{<$TfMmoGEO^L{zo5?2jbJh{5o=-VxX%?v^CS_ZpMZ%zYIDYfF)3|Vt+5t8P ztz+!Sra8Kh50pKl!EuKQbFYdG9k9Zw5uzX%{fJp#SJx$*M|u3^;N;GNBXOU;zyzTz z{d_G!Gc*<917z5%sjHK%Z8Yu2dLh*1d%=`8jU7KpB7vJ$Zp7w$faT`M#YP~L=3~Ha zbl=iOEjA*x2^*zD-7a+ae2bv1txX^lwiOo_M?ESnHHXysl&ln#gk zc|YTux?v=Cu>qih+?y%oVuh0+ytppUjw*z z?wc%f|()h)Z35r5Gyg*j`ku!3D`ng4g5&WfC0pXC<${pSnt)H60Bq6dVEhtA^B!_w@+J6unut=Vs29x4p~~9* z&~wXZZHIkcgrL!*xeq1y_FHcCF;flmeu7GtS+QIPM@8!UH625%Hi;I9im03&gD?9z zDD%$FQYyy=-jyGARxho@1dC^~P>BOSlIThx(G!Qq!4J|zFyk$@V1_~)t5!VXQH_~h zf~V~m%Pzv>`w$fC7>G=fK649=xs;@}J@^Uu@|au5t0akf`7+e>kGqY6E-Gp)H<_iK zmG44JrP&PVzPX{|m`5;R4Cf}F{_#PVeta(?E`@dx7MK3ll~8;dlIc*X&{`p7@1EBk zt$iu@C>^%Cw}7~>MsMX9yYPnEkVoOE*DLs}4I1t^^k1AT-sUA%sg57kako4+1mE3$ z2WHvUf)95VMkLHEXd#L#e*d2G;(B52DAJfI`z_o4jqRyCjdHY)qZ9#YU%mHLXcWGJ#{0{)Ws|9eN&nOg#|JlW?3M*rDwdDM`|CWAO+z+kQXIwr<=%=VJvjKR zP7TB4=1uVD)}^#vN_L{o0f4k7okJ0+fq;(_;iH>U*wjFhjjv918KH2eX&5wN`3CO! zykq3Cug@+8OD=SRPRanXLbnr%Hn0=siN-*vz@LDW%@g`yx#<}h*6BQ6@z8n0>{n%R z=TzWEtK`P}bS#ktEy~kp8nc52s$sfiMBeQO0zvJmi(+hX45C}(hRXDEfBwNn>9DRU7jF>rvE~$W4O_jd_nh&4)tGQigS8)zQ8b&TcuPVz z)AN8UZq9gTs4|4Cs621}&ZDrV_RB4C&0QxDGYbz{9MtEov|RwHLpuns*lm4Oz7l?> zPHoJJvpJnMf8mB${L7A~z5bP*isI@?wzlV7U1w3cDDY8FL)Y zU1fO8;h=6zD1A?C_<+u(U_k37gn4iU+CDZQwvV|wKMoW2N2mx3{)|{m`YskDv$f4p zfQCvT7#Jae$SblhUOsnG{(Us~02N_eM*6r1c=PQec1x=RrM9AqmvZqE;eG2>MZ)!( zT~bRjAL9@s-Qr-f?)c?k5oa8Xa6e9|yfhg~H@Ff3oLY~^Q>noNko+v?nc5siXe%Im65Nf3BNcNR0I%R*!hN;CX6tEJFqMpinsr3DF zZUqKQPGD8mmIcvL#G3!Y5yFv|yl`WL;Rq4Ech(sEXZ9(0?L{z{ZN`u2dVRt{c-PC1 zP#)(}hI}6})Ip#D>_-tl_!#Q{i%Uz3`cWEG6aXoqM(NnX8m{R~7)b4_WZ-1V z3pH1=bH%^Db%Uj!q6pI#O#3ppu~TV~YjDOS7*-Z1MXx!CKQ-Q0D;-cSr*GSN)+2DI ze%I~6@Ke#Kx79zc}sI}FSA+e z^BB%xEld}{92K)Ozv9sy$#v=2B4yPXxl%GUV#lmJBme&O>&sI2LlvjK_w`ozdGykK zvZeZotUstX0@kc?$Y;+aJTE9P_|Tkdh^L`$>rt%`x@E>IOG=tZ2Dt*d+V#h+%?#(Y z(G=l$o`jIh&?O|iPU9S%odVOfkA@8lhefEVsfBmEe~%KaVj{yYVTsjnw*|E8SLCDx znGRJa{2r92VUQ(v)JA?RaN=~(8I!J{d}*5Gmw_M38&X_ zbzSD{d%nEBR^z$YtORu`?0OXx2Rq7vaZKHB}4fa}fWcSwnm+jS2DC>1knvVUGDWSN-QUegd* zN*+2z6WUi5wn&ft*p3b{^F>$uG~%*MOu&8#0s-V}FyX_m9iQW;iPT`3T)JB5pt3&e zLiW;o+uDKcLZ0~KYHjU{R8@@K0MmvA4bx_ixgjdUH4_V{JPRBs@ABNZedG9-i$_6u z;u}JKbYO6XG$yzsGc!VFXI&?q`Mio-R2m3J4Cv$dblLBPHHZo}kUAku2l*5IVXxvN zsi~EZmmyrpywI>=yregm3_Rej>rluueYb`F5z;W}(YfQoq?A+PhQ1`X*Pf~OKuKN|VaYiRYYV&B0LdVG5u-A65(Awxyo zV4aT17GpZ@@&i*{q3dG#R0LSWxp0R_Tfmn6WXKTSRV9LtpxH9m+Pt%AX?TnJ`*?*S z1#cJVY6=J0rXBB%uSf_Fb{uF?PK{uh^joEBV~GfP4HQ5@(HP~=-^IJr|aymmH7f*~b>gkt*S_KatHA}~TZ{QZ~GDEm2&xx(9MTlJaoYgM8 z`=K{LiF%)XGUgOhrC1j1Hix6N=@m0>Wf!5lci!^A?G(5m5mEseJbd^k*xue}fB3NI zUl42+X{f1b{P*-}%OV7MT}!{QEhRJa5+WmjChX_c>sMALXJ=h_9PfI1lHNQy>>%>o zb|z&QK?5jDOZAqAUG=YK)6w6uqaSk_3eP8}yTQxiSdhv;6Cs0T%>)TtmA|w;PVsDk zbMq_n2uwb+F{UUzTg=VD3+;Bta`}Q;d68WaL76PC6&#Ih=8X@bqB=EeNA&VJtJZgf zS|za4uA+KAqSnmkvwQyzrxt zUC98mGND~M^IePEAKg#s861pow)#gP4f>Gb;km)EYnv|o#Wu)6!Nk}avP}ug^|eMd z$Q?23jS(wdFbGX!mpY-X33#)oQV>;(Fe8LB(3unm#lm8dcQ2ZE?HL(wAT&)=s@F)paco!<%r9CZLyX;}*S) z2Hcb>VyyLN&W>JcM;9j8hXAZV5~ycF6EwHKF?@|8F#k2O&xl-4#{WEEpP}Z!G1b`b zh`tywnq$_p4C1xGlpAzc9mkqwVv8v04*+Q$#b>AgKDNic)--Wj?-V#Du&?XwB}8`a zlB?J${#bwYBYg3+d(=5q9;%^f=EeuyB-xUg>SN!*2HgnwO4Ci;{?1ae0+qO6*YSbH zra+i$iXcx{=vTLcN`_S@*VnekT-lq?`P5VB(bk>oaWLb8SWvhO?5T7GCnxuSm)|c1 zO%B=)Y@C-+FI(L<3*9)JqV9h=BJJ^igY2w-?UhiA;O%stxO1*lP%G1oq-#eKS0;Fy zMjopbiFEf>BvdEPjD7BY=4A=&NP=rPuz}hF)Fb}@0w0o7cMtX#_2i_H(D&P$L5OyL zEtwB-8l0U!2W_}aeN~6ClotsA;8ZU@ko+ITWDplF)10n+dV`qy<`EjPvg1DQ$5V;m z3tXjbT5D?s*fGcErmYTY=hZl87Id%cD3{(xqDMWK_=b0Fy+j=#+_5X_b4XrPEO8y3 z9G-HDDc!vt)RTMCR&58P#-auS7#-I)baZqLw{+qycNHp63b~v9q3ykhSX8PSN-+=E zM3!>rl`ut~abSKO=~IVLIyV);RY7YhL#gHX*#icgJIx#MNd8Ww;tR>o98Bn_&m(Uh zfNyA`BY#IaC@`B%BXi)cA)xIvEq6I@#e`K^J74=G-U(}1w!xyAWN8E2*|?pz>9Rlp zd-PqYSWurHwc=uf`0#DAXt2ng$;nDVxa`Vm?V+8J5tI(+5Spz{;N?BZ0{jSSB)WsK zwP`=Ymky=qW^pco`yEl&x4c4Mw?nFtN?<;%P5vvJrFKqltP4C!o*0k*=mc5pv%P$$ z4hsmaBOj>6`fIZ)i$VU zSL^VAntA11QIM*4%w*tp>myr)dmKW`GqhT(PmLQ0&*}eC22~|0wL=Y1mxTaaZJFj3 zd;7#GCB&z=_vHmVIf54UVlch~eB?Hzkoa zW_PwT=Z~BCKcs&C=(sQM((dwozP`D8{rn={b@+tf^z~6m8ZXT7Pv06py@M#fY2a7@ zKj9j=$$5*J{m=|{y?h$;2A#RYKkjJ?=FmEhjmABUBLiu)6j3lU{?&>5^`(U4b!~3K zO*%h0{GpTR`YH|?Sr-^-kbuR}tYJPaO--7%`66^daq)G#gW6_Qi&I19&fTdD$jK3< zK+ldctC+B3(+c?l>ZYFv`WEW^RxmR%@G#r3l)0Fw7Yf4#ak%9sWL(M6(7v1cdi% zLT-q*ze#1y_ut=U*iTJPm=g=rU#>TJdEfD3JUi{SIkx_j; zS%Il2W-?BBXlG(x_&z6 zc$sr*z@RC_{%C>5F#`zm(4a#)_u-+4FwxIyijnj!;~G01Q&zK}zH~#oLX~`(Y+igB z9n`nMNT&j^YLQyQZBV7ia)2F+ySKEqMzF%NK|1ozjmxqt^mNtM0CGk=@T2p5Nk63w zzKVrt-71G->~AXTWlYIPyj7n>xM;?9zcUkK?kk5@uVe1w0Y}R%}eb`3-nKV1LyyJtNO7bVF zu6yjflmp+~pf$0y zRaxk+4f4k-ITY=!lN}B1EhBUV(cdW5U`4;8?QM+I&_(!z$R`qIlk=mh3z>G$T(?N% zh+Co3Wtro^>6#XA0zNb$LFPC-wC~pa`@=ipPM)-QT+*6<@BZ?dyKkfWDq)EWTGrS8 z7#zijsy*$I$}4g|lZdtG<1eWE%~TPU&*x|}tIwhpD@RkBvOC&4uu*Osa{6I^0z8N> zNcq&A@7vg9@31vsKSiN)DO@%M?}}$BkvE43EM=%nns-TD=VZXm<@+;l$&`x=uO>5P9)*jjI{kZ z-$mu(FSm~&L>^2_Sj00ejP7_MC3;Q(^QI(r#}Qbc|K@<@1tH{}KB|)rzSR_{XV{+uq|=%R?T~S`mR#>~?*ct=6GYg{Dz) zQO;AH)?6y@lrmKCY!y1_53wf#z>!#Vw{`gU;RaV*19WoEn)P-}iha+5ddW7{A{6s` zPVzO6xwsy)kEx$wNAnB1cO=^ud=d_?0}roH{){S->4 z2ANWTI8UGTgCG`DCXwXcU@3cKn%>_#d8Zc%FPO7FFcKeu#6777tkHUGf6ePA0lfJM zo0I>EPeeXd2+3)%CJ6vbi*{ve?cXy+%N@qvYtG<1Yl^O YPw3Nsao6=#fa>wyv~%MVPkPG#0N`Yp<^TWy literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_usb.png b/src/Docs/Chm/help/images/b64x64_usb.png new file mode 100644 index 0000000000000000000000000000000000000000..6bdf1da86cdc2b203aa06a9220e1b47cac00051c GIT binary patch literal 4691 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 VW1lT<(7Qr_-=>`#ANep({|~*3uEziX literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_vcard.png b/src/Docs/Chm/help/images/b64x64_vcard.png new file mode 100644 index 0000000000000000000000000000000000000000..c3f8a68d05326b9d392d6ecc6f33e6cd2001ebf4 GIT binary patch literal 4003 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 G&ix--uj14I literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/b64x64_xmag.png b/src/Docs/Chm/help/images/b64x64_xmag.png new file mode 100644 index 0000000000000000000000000000000000000000..9165030883fc65ff57d4d0e4b30c342743f25d38 GIT binary patch literal 4399 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 Ef(M!5lmGw# literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/dlgbanner_win32.png b/src/Docs/Chm/help/images/dlgbanner_win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e940348d35c73e3df5ea224e0b99c90f3b24747d GIT binary patch literal 10392 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 M07*qoM6N<$f)Fu>GXMYp literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/dlgbanner_winxplogin.png b/src/Docs/Chm/help/images/dlgbanner_winxplogin.png new file mode 100644 index 0000000000000000000000000000000000000000..a6199b318828f18e767da5796ee26f26031c8f3a GIT binary patch literal 12037 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 jp0x6~6oW5u00000NkvXXu0mjfn`k(i literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/dragndrop.png b/src/Docs/Chm/help/images/dragndrop.png new file mode 100644 index 0000000000000000000000000000000000000000..ed9b19b8ccd2bb684ef054d33f9c3b49de4b9b83 GIT binary patch literal 41439 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 b$=v?|mjoQOC@7gV00000NkvXXu0mjf8+2Z5 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/pwgen_adv_excltab.png b/src/Docs/Chm/help/images/pwgen_adv_excltab.png new file mode 100644 index 0000000000000000000000000000000000000000..cc0169fb2a075fee8f6f202b2f2fa6c48f656bca GIT binary patch literal 1033 zcmV+k1or!hP)8+Qx|AYTe3l;>=y?F5^QfR>1gDpX1 zAcdN;3Z|N5H=FHYWPHB);Tkt)6Xy}an{U3^`QFaknYTg7-#y1NW-PP~m|I}XWQ?&6 znk_{e4c9L(kADB;{cFWaZYzDO@%VKz|2COSn8k}x#`xvs%&(=?^l0Ly9V@xbW52rd zxoQ(@=ABu*7-dYew4RzsCT`eP5HqMuzI!xG zDeZ1(ND|u4~qmk5k^HwpJWUnRyJ+1 zW5{uw>GAG|1|>z1F+(=-ngRQ0l7M${$7=?bF`12xp8A6Wv6B?#sT8*)AnM1HT;Y=| z&czUpUq}o&Yti18$ljIOJE~9`vE7I}=o>Ln79xUZb?;)hzAJKrbB!cO%?%jBzH4qk z2&uV2NRg1K8mKWodv`Jh9!6qvK%XOM;iZ`bQwI^GGF;zk1!yBB2gkukf*c&nht#j| z-4D&hn-G`ksW+_wf&{E`AZ?=ON$m*q-n088r3<|=n<7jW7KF?kvm(*h#)*!^b0S(rHiF;m}e2*4*fF? zH=9C^{MAgX*(IV>%W!~b|w2WR`- zq`g@_Q`Z!7gdvc|{LONc_3|!}qe1vw8U*=pY7M7tP*kFd5iuc69MbVR=JK!Q7b=E) z-`6x5QlyQ!Nn6U{zLbNQkW-|Ma}kxi=TpfdZD=&N0g6gg@v4}rA@R+a_9_+Eb-BM$ zs=_8jHcC}-2;w6S>=myAyHp60$D3$g#8H7_bO;ochy+a(s@oFZjA_qmwOX%8UE8X> zoXxClRX8&LB)hg%k%kcexOz2XJkRSPwX4P7P%vutR$OL}F>zgwjM?7a?z3E3TKyKc zxR|7V$e6_s3zo6o+GG5d`D2%BYUclyjG2rv)=B#h)|Alz>Wzq600000NkvXXu0mjf DIQI9> literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/images/rtfeditor.png b/src/Docs/Chm/help/images/rtfeditor.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc01a1dd5052663390ba5c594e31e36fe77251f GIT binary patch literal 21063 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 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/help/index.html b/src/Docs/Chm/help/index.html new file mode 100644 index 0000000..26655e8 --- /dev/null +++ b/src/Docs/Chm/help/index.html @@ -0,0 +1,15 @@ + + + + + + + + Redirection - KeePass + + + + + + diff --git a/src/Docs/Chm/help/v2/autotype_obfuscation.html b/src/Docs/Chm/help/v2/autotype_obfuscation.html new file mode 100644 index 0000000..d066389 --- /dev/null +++ b/src/Docs/Chm/help/v2/autotype_obfuscation.html @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Two-Channel Auto-Type Obfuscation - KeePass + + + + + + + + + + + + + +

Two-Channel Auto-Type Obfuscation

+

Description of the Two-Channel Auto-Type Obfuscation feature in KeePass 2.x.

+ + + +
+ + +

+Introduction: What is Two-Channel Auto-Type Obfuscation?

+ +

The Auto-Type feature of KeePass +is very powerful: it sends simulated keypresses to other applications. +This works with all Windows applications and +for the target applications it's not possible to distinguish between +real keypresses and the ones simulated by Auto-Type. + +This at the same time is the main disadvantage of Auto-Type, because +keyloggers can eavesdrop the simulated keys. + +That's where Two-Channel Auto-Type Obfuscation (TCATO) comes into play.

+ +

TCATO makes standard keyloggers useless. It uses the +Windows clipboard to transfer parts of the auto-typed text into the +target application. Keyloggers can see the Ctrl+V +presses, but do not log the actual contents pasted from the clipboard.

+ +

Clipboard spies don't work either, because only parts of the sensitive +information is transferred on this way.

+ +

Anyway, it's not perfectly secure (and unfortunately cannot be made +by theory). None of the currently available keyloggers or clipboard spies +can eavesdrop an obfuscated auto-type process, but it is theoretically possible +to write a dedicated spy application that specializes on logging obfuscated +auto-type.

+ +
+ + +

+When can Two-Channel Auto-Type Obfuscation be used?

+ +

TCATO cannot be used with all windows. The target window(s) must +support clipboard operations and navigation within edit controls using arrow keys. +Additionally, the target user interface must not contain automation features like +jumping focus when maximum length of a text box is reached (as seen in registration +number dialogs for example).

+ +

Rules of thumb:

+ +
    +
  • Can be used in: + +
      +
    • Browsers.
    • +
    • Windows programs with standard text boxes.
    • +
    + +
  • +
  • Can not be used in: + +
      +
    • Console-based applications (interactive terminals, ...).
    • +
    • Games.
    • +
    + +
  • +
+ +

Because it doesn't work with all windows, it's an opt-in feature for each +entry. You have to enable it explicitly on the 'Auto-Type' tab page in the +'Edit Entry' dialog.

+ +
+ + +

+How to enable / configure Two-Channel Auto-Type Obfuscation?

+ +

All you need to do is to tick the checkbox "Two-channel auto-type obfuscation" +of an entry ('Auto-Type' tab page of the entry editing window); KeePass will do the rest.

+ +
+ + +

+Technical Overview

+ +

Instead of simply sending simulated keypresses to the target application (as normal +auto-type does), obfuscated auto-type does the following:

+ +
    + +
  • Back up the current clipboard contents.
  • +
  • Intelligently split the text into parts.
  • +
  • For each part: check if the clipboard can be used. + +
      +
    • If yes: Split it into two subparts (character-wise, like two +flat intertwining combs). Copy/paste the first part, merge the rest by sending keypresses.
    • +
    • If no: Send it normally using simulated keypresses.
    • +
    + +
  • +
  • Restore previous clipboard contents.
  • + +
+ +

These steps are described in detail below.

+ +
+ + + + +

+Intelligently Splitting the Text

+ +

The text to be sent must first be split intelligently. Not all parts of the +string can be sent using the clipboard: special key codes and key modifiers must be passed +unchanged to the SendInput function. For an example, have a look at the following +string:

+ +
mymail@myprovider.com{TAB}MyTopSecretPassword{TAB} {TAB}{ENTER}
+ +

This is an example of a typical string sent by KeePass to another application. First +it types the user's email address, then a Tab, +then the password, a Tab, toggles a checkbox, +another Tab and finally presses the Enter key. +This sequence can be split into the following parts:

+ +
mymail@myprovider.com
+{TAB}
+MyTopSecretPassword
+{TAB}
+' ' (space)
+{TAB}
+{ENTER}
+ +

For each line, it is checked if the clipboard can be used. If the line contains a '{', '}', '(', ')', +'+', '^', '%' or whitespace (space), it can only be sent by the SendInput function +directly. For example, '+' presses the Shift key, +it should not be copy/pasted as '+' character. +Spaces cannot be copy/pasted either, because they are usually used to toggle checkboxes.

+ +

In the example above, "mymail@myprovider.com" and "MyTopSecretPassword" can +be sent using the clipboard.

+ +
+ + +

+Splitting the Secrets

+ +

Let's transfer "mymail@myprovider.com" to the target application using +TCATO.

+ +

First, the secret string "mymail@myprovider.com" is randomly split character-wise +into two parts like two flat intertwining combs:

+ +
 y  il m   o  d  .c
+m ma  @ ypr vi er  om
+ +

The first string "yilmod.c" is now copied to the clipboard. The string to be +sent by the SendInput function is now assembled as follows:

+ +
    +
  • Begin with pasting from the clipboard: ^v.
  • +
  • Press the key n times, +with n = length of the clipboard string.
  • +
  • Send the remaining characters and press the +key to skip the ones that were already pasted from the clipboard.
  • +
+ +

In our example above, the key sequence would be assembled to:

+ +
^v{LEFT 8}m{RIGHT}ma{RIGHT}{RIGHT}@{RIGHT}ypr{RIGHT}vi{RIGHT}er{RIGHT}{RIGHT}om
+ +

This will first paste the clipboard contents, go to its start and fill in the remaining characters, +building up the original string "mymail@myprovider.com".

+ +

The time in which the first string part remains in the clipboard is minimal. +It is copied to the clipboard, pasted into the target application and immediately +cleared. This process usually takes only a few milliseconds at maximum.

+ +

More about secret string splitting:
+In the above example, the string "mymail@myprovider.com" was +split and sent. If the string would be split differently each time, +a malicious application could reassemble the string by +capturing multiple auto-types and combining them. In order to prevent this, +KeePass initializes the random number generator for splitting based on a +hash of the string. This means that each string is split differently, +but the partitions of a string are uniquely determined. So, by invoking +auto-type multiple times, an attacker cannot reassemble the original string, +because he always captures the same half part.

+ + + diff --git a/src/Docs/Chm/help/v2/dbsettings.html b/src/Docs/Chm/help/v2/dbsettings.html new file mode 100644 index 0000000..9fc2d7d --- /dev/null +++ b/src/Docs/Chm/help/v2/dbsettings.html @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Database Settings - KeePass + + + + + + + + + + + + +

Database Settings

+

Describes the various database options.

+ +

On the database settings dialog, you can configure various database-related +settings.

+ + + +
+ + +

+General

+ +

On this tab page you can specify general things like the name of the database and +a description. Additionally, you can set various defaults like a default user +name for new entries (created in this database).

+ +
+ + +

+Security Options

+ +

On this tab page you can specify various settings related to encryption. +Only change these settings if you really know what you are doing.

+ +

Encryption Algorithm:
+You can choose the algorithm that is used to encrypt the database. +All encryption algorithms offered by KeePass are well-known, secure algorithms, +see Database Encryption.

+ +

Key Transformation:
+See Protection against +Dictionary Attacks.

+ +

KeePass has a button on this tab page to compute the number of key transformations +that your computer can do in 1 second. If you for instance only want to wait 0.5 seconds, +half the number resulted from the benchmark.

+ +
+ + + + +

+Compression Options

+ +

KeePass databases can be compressed before being encrypted. Compression +reduces the size of the database, but also slows down the database +saving/loading process a bit.

+ +

It is recommended to use the GZip compression option. This algorithm +is very fast (you won't notice any difference to saving the database without +compression) and its compression rate is acceptable.

+ +

It is not recommended to save databases without compression.

+ +

On modern PCs, saving files with compression can actually be faster than +saving without compression, because the compression process is performed by +the CPU (which is very fast) and fewer data has to be transferred from/to +the storage device. Especially when the device is slow (like saving to USB +stick), compression can reduce the saving/loading time significantly.

+ +
+ + +

+Templates

+ +

Templates are a great way to predefine often used user names or +additional fields, or combinations of each.

+ +
    +
  • A template is a normal KeePass entry with all required data already +entered.
  • +
  • Templates must be kept in a single group.
  • +
  • Do not put real data entries in the template group.
  • +
+ +

First create a normal group in the main window and then set it as the +templates group in 'File' → +'Database Settings' → tab 'Advanced'.

+ +

In order to create a new entry based on a template, +click the drop-down arrow of the 'Add Entry' toolbar button +and choose the template to be used.

+ + + diff --git a/src/Docs/Chm/help/v2/entry.html b/src/Docs/Chm/help/v2/entry.html new file mode 100644 index 0000000..77ba37c --- /dev/null +++ b/src/Docs/Chm/help/v2/entry.html @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Entry Dialog - KeePass + + + + + + + + + + + + + +

Entry Dialog

+

Edit new/existing entries.

+ + + +
+ + +

+General

+ +

On the tab page 'General', you can specify the main information +of an account.

+ +

Title.
+In the title field, the name of the system/service should be entered.

+ +

For certain systems/services, it can make sense to ensure that the +entry title occurs within the target window title, because this allows +auto-type to associate the entry +with the target window. +For details, see global auto-type. +However, if the target window title does not contain the system/service name +(e.g. 'Login - Browser Name'), it is recommended to create a +custom window/sequence association instead.

+ +

User name.
+In the user name field, you should specify the data that you are entering +during a login in order to identify yourself. This typically is a user name, +an e-mail address or a number.

+ +

There is no separate e-mail address field by default, because this +would decrease the usability. For details, see the section +'Can an e-mail address field be added?' +in the FAQ.

+ +

When typing into the user name field, KeePass may display a list of +suggestions for the user name. +This list is generated dynamically: when opening the entry dialog, +KeePass collects the user names of all entries stored in the currently +active database. +If you see an incorrect user name in the list, you need to search this +user name in your entries (using the search function) and fix it there.

+ +

In the database settings (menu 'File' → +'Database Settings'), you can define a default user name for new entries.

+ +

Password.
+By default, KeePass generates a password for a new entry (this can be +customized/disabled). +You can use this password or replace it.

+ +

There is a button (right of the password repetition field) that opens +the password generator.

+ +

Furthermore, there is a button for disabling/enabling the +password quality estimation for the current entry. +Disabling the password quality estimation for an entry also +excludes the entry from password quality reports (menu 'Find' → +'Password Quality').

+ +

URL.
+See the help page 'URL Field'.

+ + +

Expires.
+In the entry list of the main window, an expired entry is displayed +with a red X icon and a +strikeout font. +Expired entries are not deleted/moved automatically.

+ +

You can search for expired entries using the menu 'Find' → +'Expired'. +Expired entries can also be displayed automatically when opening +the database (menu 'Tools' → 'Options' → tab 'Advanced' → +option 'Show expired entries (if any)').

+ +
+ + +

+Advanced

+ + +

Custom string fields.
+Each entry may have an arbitrary number of custom string fields. +Such a field consists of a name and a value. +The name must be unique (within the entry).

+ +

In the main window, the value of a custom string field can be +copied into the clipboard by right-clicking on the entry, pointing +on 'Other Data' and clicking on the name of the custom string field +(this is also possible via the menu 'Entry').

+ +

The value of a custom string field can also be used in an +auto-type sequence; +see the placeholders help page. +For example, the value of a custom string field named 'BIC' +(acronym for Business Identifier Code) can be inserted using the +'{S:BIC}' placeholder.

+ +

In database files, custom string fields are stored in encrypted form +(see 'Database Encryption'). +The option 'Protect value in process memory' (in the custom string field dialog) +allows to activate/deactivate the +process memory protection +for the value of the custom string field. +Activating this protection induces certain limitations (e.g. the value must +be hidden using asterisks for the protection to be effective) and increases +the time required by various operations. Therefore, it should be activated +only for really sensitive data (e.g. a second password).

+ + +

File attachments.
+You can attach arbitrary files to an entry.

+ +

Attached files are stored within the database file in encrypted form +(see 'Database Encryption'). +When importing a file as attachment, KeePass does not delete the +source file; you need to delete it yourself, if desired.

+ +

This feature is intended to store few/small files (e.g. registration files, +public/private key pair files, etc.). +Encrypting many/large files is considered to be out of the scope of a +password manager and it is recommended to use a specialized file encryption +software (e.g. VeraCrypt) for this task instead (KeePass can be used +to store the password for the encrypted file container).

+ +
+ + +

+Properties

+ + +

Tags.
+You can assign arbitrary tags to an entry. +Multiple tags have to be separated by commas (or semicolons). +When clicking the button right of the tags input field, a menu is +displayed that allows to add tags found in other entries.

+ +

Tags can also be added/removed in the main window: right-click onto +one or more entries → 'Edit Entry (Quick)' → 'Add Tag' or +'Remove Tag'.

+ +

A common use case is to mark frequently used entries (tag 'Favorite').

+ +

In order to show all entries that have a specific tag, click the +three-keys button +[3 Keys] +in the toolbar of the main window (to the right of +the 'Find' toolbar button) and choose the tag. +Alternatively, this command is also accessible via the main menu: +'Find' → 'Tag' → choose the tag.

+ +

If you want to see all entries with a specific tag (e.g. 'Favorite') +when opening a database, you can create a trigger +for this: click 'Tools' → 'Triggers', add a new trigger, +enter a name (e.g. 'Show favorites when opening a database'), +add an event 'Opened database file', and add an action +'Show entries by tag' with the parameter 'Tag' set to the tag name +(e.g. 'Favorite').

+ +

Override URL.
+See 'Changing the URL Handler'.

+ + +

UUID.
+A UUID is a 128-bit number that uniquely identifies an object +(an entry in this case).

+ +

In some places (e.g. in field references), +a UUID needs to be specified in hexadecimal form. +In some other places (e.g. in KDBX XML files), a UUID is stored in +Base64 form.

+ +

The entry dialog shows both forms (hexadecimal and Base64), such that +you can directly copy the form that you currently need.

+ +
+ + +

+Auto-Type

+ +

On this tab page, you can configure the auto-type behavior for +the current entry. +See the auto-type help page.

+ +
+ + +

+History

+ +

Each entry has an own history. When modifying an entry, KeePass +automatically creates a history entry, which contains the previous data. +The history entries are listed on the 'History' tab page of the entry dialog.

+ +

By default, the number of history entries per entry and the +history size per entry are limited to reasonable values. +You can change these limitations in the database settings dialog +(menu 'File' → 'Database Settings').

+ +

If you want to delete certain history entries manually, +there are two possibilities:

+
    +
  • On the 'History' tab page of the entry dialog, you can delete +specific history entries.
  • +
  • In 'Tools' → 'Database Tools' → 'Database Maintenance', +you can delete all history entries that are older than a specific +number of days.
  • +
+ +
+ + +

+Tools

+ +

When clicking the 'Tools' button (bottom left in the entry dialog), +a menu is displayed that provides some useful commands.

+ +

Copy initial password.
+Copies (to the clipboard) the password that was current when the dialog +was opened. +This command can be useful for instance when you try to change the password +and the website/service requests the previous password as confirmation +after specifying the new password.

+ +

URL field commands.
+These commands edit the URL field.

+ +

Insert field reference.
+When clicking one of the commands in this submenu, a dialog is displayed +that allows to conveniently create a +field reference in the chosen field.

+ +

OTP generator settings.
+Displays a dialog for conveniently editing the +one-time password +generator settings of the entry.

+ +
+ + +

+Editing Multiple Entries At Once

+ +

The entry dialog supports editing multiple entries at once. +For this, select multiple entries in the entry list of the main window +and invoke the 'Edit Entries' command.

+ +
    +
  • If the entries contain different values for a field (e.g. if the +entries have different user names), the text box in the entry dialog +shows "(Multiple values)". +If you do not change this, the values for this field will not be modified. +If you change it, the new value will be assigned to all entries.
  • + +
  • In case of a boolean option, the check box may support three states: +
      +
    • Unchecked. The option is/will be turned off for all entries.
    • +
    • Checked. The option is/will be turned on for all entries.
    • +
    • Indeterminate. For some entries, the option is turned off, whereas +for the other entries, it is turned on. The states will not be modified.
    • +
  • +
+ +

Controls for data that cannot be modified in multiple entries at once +(e.g. file attachments) are disabled. Such data will not be modified.

+ + + diff --git a/src/Docs/Chm/help/v2/guioptions.html b/src/Docs/Chm/help/v2/guioptions.html new file mode 100644 index 0000000..94e4b75 --- /dev/null +++ b/src/Docs/Chm/help/v2/guioptions.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + GUI Options - KeePass + + + + + + + + + + + + +

GUI Options

+

Explains various Graphical User Interface (GUI) options.

+ + + +
+ + +

+Dialog Banner Styles

+ +

KeePass supports various different dialog banner styles. These styles are +independent from the operating system and can freely be used on all systems.

+ +

WinXP Login:
+WinXP Login Style

+ +

WinVista Black:
+WinVista Black Style

+ +

KeePass Win32:
+KeePass Win32 Style

+ +

Blue Carbon:
+Blue Carbon Style

+ + + diff --git a/src/Docs/Chm/help/v2/index.html b/src/Docs/Chm/help/v2/index.html new file mode 100644 index 0000000..7452cf0 --- /dev/null +++ b/src/Docs/Chm/help/v2/index.html @@ -0,0 +1,15 @@ + + + + + + Redirection - KeePass + + + +Redirecting to +KeePass Help Center...
+ + + + diff --git a/src/Docs/Chm/help/v2/ioconnect.html b/src/Docs/Chm/help/v2/ioconnect.html new file mode 100644 index 0000000..3d4e635 --- /dev/null +++ b/src/Docs/Chm/help/v2/ioconnect.html @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Load/Save From/To URL - KeePass + + + + + + + + + + + + +

Load/Save From/To URL

+

KeePass can load/save databases from/to URLs.

+ +

In this dialog you can specify a URL, from/to which data is read/written.

+ +

By default, KeePass supports FTP, HTTP, HTTPS +and WebDAV. More protocols may be available on your system +(if specific providers are installed).

+ +

The IOProtocolExt plugin adds support for +SCP, SFTP and FTPS.

+ +

Cloud storage:
+If you want to store your database file in a cloud storage: +for most cloud storages, there is an integration with the local file system +available (i.e. you can access your stored files using Windows Explorer). +For example, Dropbox, Microsoft OneDrive and Google Drive provide such +an integration. +If such an integration is available, it is recommended that you access +your database file this way; this often works better than accessing it +via a protocol like FTP or WebDAV. +If no such integration is available and your cloud storage also is not +accessible via a standard protocol, a specialized KeePass +plugin +for this cloud storage might be available.

+ +
+ + +

+Example: Using FTP Server

+ +

In order to load/save your database from/to an FTP server, you first need to +upload the database file to the server manually. This only needs to be done once.

+ +

Then start KeePass and go 'File''Open''Open URL...'. +Enter the full database path on the server and don't forget the ftp:// prefix! +This prefix is required, otherwise KeePass doesn't know which protocol to use. +Enter the FTP credentials and click [OK]. KeePass will download the file and open it.

+ +

KeePass can remember the FTP credentials, if you wish. You can choose between remembering +everything (user name and password), partially (user name only) and not remembering +the credentials at all.

+ +

When you press the 'Save' button, KeePass will automatically upload the new +database file to the server (same location as before, i.e. overwriting the previous +one).

+ + + diff --git a/src/Docs/Chm/help/v2/license.html b/src/Docs/Chm/help/v2/license.html new file mode 100644 index 0000000..5cd5fca --- /dev/null +++ b/src/Docs/Chm/help/v2/license.html @@ -0,0 +1,539 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + License (2.x) - KeePass + + + + + + + + + + + + + +

License (2.x)

+

License terms of KeePass 2.x.

+ +

KeePass: Copyright © 2003-2023 Dominik Reichl.

+ +

The program is distributed under the +terms of the GNU General Public License version 2 or later.

+ +

For acknowledgements and licenses of components/resources/etc., see the +Acknowledgements page.

+ +
+ +
+ +

GNU GENERAL PUBLIC LICENSE

+

+Version 2, June 1991 +

+ +
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.  
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+ +

Preamble

+ +

+ The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. +

+ +

+ When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. +

+ +

+ To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. +

+ +

+ For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. +

+ +

+ We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. +

+ +

+ Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. +

+ +

+ Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. +

+ +

+ The precise terms and conditions for copying, distribution and +modification follow. +

+ + +

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

+ + +

+0. + This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". +

+ +

+Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. +

+ +

+1. + You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. +

+ +

+You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. +

+ +

+2. + You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: +

+ +
+
+
+ a) + You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. +
+
+
+ b) + You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. +
+
+
+ c) + If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) +
+
+ +

+These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. +

+ +

+Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. +

+ +

+In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. +

+ +

+3. + You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: +

+ + + + +
+
+
+ a) + Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, +
+
+
+ b) + Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, +
+
+
+ c) + Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) +
+
+ +

+The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. +

+ +

+If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. +

+ +

+4. + You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. +

+ +

+5. + You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. +

+ +

+6. + Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. +

+ +

+7. + If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. +

+ +

+If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. +

+ +

+It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. +

+ +

+This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. +

+ +

+8. + If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. +

+ +

+9. + The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. +

+ +

+Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. +

+ +

+10. + If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. +

+ +

NO WARRANTY

+ +

+11. + BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. +

+ +

+12. + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. +

+ +

END OF TERMS AND CONDITIONS

+ +

How to Apply These Terms to Your New Programs

+ +

+ If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. +

+ +

+ To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. +

+ +
+one line to give the program's name and an idea of what it does.
+Copyright (C) yyyy  name of author
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+ +

+Also add information on how to contact you by electronic and paper mail. +

+ +

+If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: +

+ +
+Gnomovision version 69, Copyright (C) year name of author
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'.  This is free software, and you are welcome
+to redistribute it under certain conditions; type `show c' 
+for details.
+
+ +

+The hypothetical commands `show w' and `show c' should show +the appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w' and +`show c'; they could even be mouse-clicks or menu items--whatever +suits your program. +

+ +

+You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: +

+ + +
+Yoyodyne, Inc., hereby disclaims all copyright
+interest in the program `Gnomovision'
+(which makes passes at compilers) written 
+by James Hacker.
+
+signature of Ty Coon, 1 April 1989
+Ty Coon, President of Vice
+
+ +

+This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the +GNU Lesser General Public License +instead of this License. +

+ +
+End GNU General Public License +
+ +
+ + + diff --git a/src/Docs/Chm/help/v2/plugins.html b/src/Docs/Chm/help/v2/plugins.html new file mode 100644 index 0000000..1b27511 --- /dev/null +++ b/src/Docs/Chm/help/v2/plugins.html @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Plugins (2.x) - KeePass + + + + + + + + + + + + +

Plugins (2.x)

+

Installation, uninstallation and security of KeePass 2.x plugins.

+ +
+ +

+Introduction

+ +

KeePass features a plugin framework. Plugins can provide additional +functionality, like support of more file formats for import/export, +network functionalities, backup features, etc.

+ +
+ +

+Online Resources

+ +

Plugins can be found on the +Plugins page.

+ +
+ +

+Plugin Installation and Uninstallation

+ +

If there are no explicit instructions how to install the plugin, +follow these steps:

+ +
    +
  1. Download the plugin from the page above and unpack the ZIP file to a +new folder.
  2. +
  3. In KeePass, click 'Tools' → 'Plugins' → button +'Open Folder'; KeePass now opens a folder called 'Plugins'. +Move the new folder (containing the plugin files) into the 'Plugins' folder.
  4. +
  5. Restart KeePass in order to load the new plugin.
  6. +
+ + + +

To uninstall a plugin, delete the plugin files.

+ +

Linux:
+On some Linux systems, the mono-complete package may be +required for plugins to work properly.

+ +

Portability:
+PLGX plugins are compiled by KeePass and the generated files are stored +in a plugin cache, which by default is located in the +user's application data directory (so, running a PLGX plugin by default +creates files outside the KeePass application directory). +These plugin cache files do not need to be copied to other systems though, +because they are generated on each system and do not contain any user data.

+ +
+ +

+Security

+ +

What about the security of plugins? Can't malicious plugins +'inject' themselves into KeePass?

+ +

If plugins can register themselves +(i.e. have write access to the KeePass directory), they could also just +replace the whole 'KeePass.exe' file. It's a problem of file access +rights, not the plugin system.

+ +

If you worry about this, +install KeePass as administrator into the program files directory +(which is the default, typically in a folder in 'C:\Program Files'). +Afterwards, run KeePass and other applications only as normal user +(without administrator privileges).

+ +

This solves the problem above. As the KeePass directory is write-protected +for normal users, no other program can copy files into it. KeePass requires the plugins to +be in the application directory. Therefore, plugins cannot inject themselves anymore.

+ +

If you use the portable package of KeePass or installed it into a different +directory, you need to adjust the directory permissions yourself.

+ +

KeePass supports two plugin file formats: DLL and +PLGX. +A DLL plugin can be loaded directly, whereas KeePass needs to compile a PLGX +plugin to a DLL plugin first, which is then stored in a +plugin cache (see the section below). +By default, the user has write access in the plugin cache directory +(without administrator privileges). +If you want to use a PLGX plugin, consider to adjust the access rights of the +plugin cache directory to require administrator privileges for write access.

+ +
+ + +

+Plugin Cache

+ +

PLGX plugins are compiled and stored in a plugin cache directory on the +user's system. This cache highly improves the startup performance of KeePass. +Old files are normally deleted from the cache +automatically (this can be disabled in the plugins dialog). +The cache does not contain any user data.

+ +

By default, the plugin cache is located in the user's application data +directory. However, this can be overridden using the +Application/PluginCachePath setting in the configuration file +(this setting supports placeholders and environment variables). +So, if you're for example using KeePass on a portable device and don't want +the cache to be on the system, you could set the path to {APPDIR}\PluginCache.

+ +

Warning +Do not relocate the plugin cache into the 'Plugins' folder of the +KeePass application directory, because this can result in a severe +performance degradation.

+ + + diff --git a/src/Docs/Chm/help/v2/policy.html b/src/Docs/Chm/help/v2/policy.html new file mode 100644 index 0000000..c36ae89 --- /dev/null +++ b/src/Docs/Chm/help/v2/policy.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Application Policy - KeePass + + + + + + + + + + + + +

Application Policy

+

Details about the application policy system within KeePass.

+ + + +
+ + +

+Help for Users

+ +

Application policy is a KeePass feature that enables administrators +to prevent you from accidently compromising the security +system of your company.

+ +

Operations like exporting entries to non-encrypted +files or printing for example can be prevented effectively +using the application policy.

+ +

If you are using KeePass at home, you can ignore the +application policy (everything allowed anyway) or reduce +your rights using the policy yourself, in order to avoid +accidental leakage of sensitive information.

+ +

In order to prevent changing the policy after it has +been specified, it is recommended to use an +enforced +configuration file.

+ +
+ + +

+Help for Administrators

+ +

KeePass can be installed on a network drive and a policy +can be enforced (like not permitting users to print the +entry list).

+ +

The application policy enforcement is based on +the mechanism how KeePass stores configuration settings. You +first need to understand this method before you can continue +creating a policy; see the +configuration help page.

+ +

A policy-enforcing KeePass installation looks like +the following: the KeePass application files are stored +on the network drive and all users are starting KeePass from +this drive (i.e. they only have links to the executable on +the network drive). By using an enforced configuration file +on the network drive +(remember that this file overrides all others), +a policy can be enforced.

+ +

In order to create such an installation, follow these steps:

+ +
    +
  1. Copy KeePass to a shared network drive that supports file +access rights (like NTFS).
  2. + +
  3. Create an enforced configuration file that enforces the +application policy settings that you wish.
  4. + +
  5. Adjust the file access rights: allow users only to read and +execute all KeePass files, no write access.
  6. +
+ + + +
+ + +

+Policy Security

+ +

Recall what the policy mechanism looks like: KeePass and the +configuration file are stored on the network drive. If you +grant your users free access to the Internet or allow them +to insert CD-ROMs/DVDs/USB-sticks, nothing prevents +a user to download a separate copy of KeePass and run it. In +this case the policy isn't enforced, as the downloaded KeePass +doesn't know anything of the enforced configuration file on the network +drive.

+ +

Policy enforcement therefore only is effective if your users +really use the KeePass version installed on the network drive.

+ + + diff --git a/src/Docs/Chm/help/v2/setup.html b/src/Docs/Chm/help/v2/setup.html new file mode 100644 index 0000000..d101667 --- /dev/null +++ b/src/Docs/Chm/help/v2/setup.html @@ -0,0 +1,480 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Installation / Portability - KeePass + + + + + + + + + + + + + +

Installation / Portability

+

KeePass 2.x installation, uninstallation, portability and updates.

+ + + +
+ +

+General information

+ +

When downloading KeePass, you have the choice between 3 different packages:

+ +
    +
  • KeePass-2.xx-Setup.exe: An installer program for Windows.
  • +
  • KeePass-2.xx.zip: A KeePass ZIP package (portable version).
  • +
  • KeePass-2.xx-Source.zip: The source code.
  • +
+ +

The installer and the portable version are described in detail below.

+ +

The source code package contains everything you need to compile KeePass. +It includes the C#/C++ source code and header files, resource files, +sources for building the installer, etc.

+ + + +

Updating KeePass:
+When a new KeePass version has been released, you can update your existing KeePass +installation, without losing any configuration settings. The steps are +depending on which package you are using (installer or portable), see below.

+ +

Translations should also be updated when you install a new KeePass version. +You can find the latest translation files here: +KeePass Translations.

+ +
+ +

+Installer program (KeePass-2.xx-Setup.exe file)

+ +

The KeePass development team provides an installer, which copies KeePass +to your hard disk, creates shortcuts in the start menu and associates +KDBX files with KeePass, if desired.

+ +

Additionally, KeePass is automatically configured to store its settings in +the application data directory of the current user. +This way multiple users can use one KeePass +installation without overwriting each other's settings (each user has his +own configuration file). +The setup program must run with administrative +rights, however KeePass runs fine without administrative rights once it +is installed.

+ +

Installation:
+To install KeePass, run the KeePass-2.xx-Setup.exe file +and follow the wizard.

+ +

Updating:
+Run the KeePass-2.xx-Setup.exe file. +You do not need to uninstall the old version first. +Your configuration options will not be lost.

+ +

Uninstallation:
+In order to uninstall KeePass, run the uninstallation program, which is +accessible by a shortcut in the start menu folder of KeePass, or in +the program section of the system control panel. If you also want +to remove your configuration settings, you need to delete the configuration +file in the application data directory of your user profile, see +Configuration.

+ +

Silent Installation:
+The KeePass installer KeePass-2.xx-Setup.exe supports command line +switches for silent installation, i.e. the program gets installed without +asking the user for target directory or association options. The default settings +of the installer are used.

+ +

The /SILENT command line switch performs a silent +installation and shows a status dialog during the setup process. No questions +will be asked though.

+ +

The /VERYSILENT command line switch performs a silent +installation and does not show a status dialog during the setup process.

+ +

Destination Path:
+The installer allows to choose the destination path to which KeePass is +installed. +However, when the installer detects an existing KeePass installation, it +assumes that the user wants to perform an upgrade and thus doesn't +display the destination path selection page; the old version will be overwritten +by the new version. +If you want to move an existing KeePass installation to a different path, +first uninstall the old version; the installer of the new version will then +display the destination path selection page again.

+ +

Options/Components:
+The installation options/components are explained in detail here: +What +do the 2.x installation options/components mean in detail?.

+ +
+ + +

+Portable version (KeePass-2.xx.zip file)

+ +

The portable version can be carried around on portable devices (like USB +sticks) and runs on any computer directly from the device, without any +installation. +It doesn't store anything on your system (in contrast to +the setup package, see above). KeePass doesn't create any new +registry keys and it doesn't create any configuration files in your Windows +or application data directory of your user profile.

+ +

Make sure that KeePass has write access to +its application directory. Otherwise, if it doesn't have, it'll attempt +to store the configuration options (nothing security-relevant though) into the +application data directory of the currently logged on user. +For more about that, see this page: +Configuration.

+ +

Installation:
+KeePass does not need to be installed. Just download the ZIP package, unpack +it with your favorite ZIP program and KeePass is ready to be used. Copy it to +a location of your choice (for example onto your USB stick); no +additional configuration or installation is needed.

+ +

Updating:
+Download the latest portable package of KeePass, unpack it +and copy all new files over the old ones. Your configuration settings will not +be lost (the settings are stored in the KeePass.config.xml file, +which won't be overwritten, because KeePass ZIP packages don't +include a KeePass.config.xml file).

+ +

Uninstallation:
+Simply delete the KeePass folder.

+ +
+ + +

+Running KeePass under Mono (Linux, MacOS, BSD, ...)

+ +

In addition to Windows, KeePass 2.x runs under Mono, +i.e. Linux, MacOS, BSD, etc.

+ +

Links to all supported packages can be found on the +Downloads page.

+ +
    +
  • Debian/Ubuntu Linux:
    +Install the keepass2 / +KeePass 2.x for Debian/Ubuntu Linux package (e.g. using APT). +A link to a page with more information about this package can be found on the +downloads page.
    +
  • + +
  • Fedora Linux:
    +Install the keepass package +(from the Fedora repository; link on the downloads page).
    +
  • + +
  • OpenSUSE Linux:
    +Install the keepass package +(from the OpenSUSE Mono repository; link on the downloads page).
    +
  • + +
  • Gentoo Linux:
    +Install the keepass package +(from the Gentoo Linux repository; link on the downloads page).
    +
  • + +
  • Arch Linux:
    +Install the keepass package +(from the Arch Linux repository; link on the downloads page).
    +
  • + +
  • MacOS:
    +Install the KeePass 2.x for MacOS package +(link on the downloads page).
    +
  • + +
  • FreeBSD:
    +Install the keepass package +(from the FreeBSD ports tree or binary pkg repository; link on the downloads page).
    +
  • + +
  • Other Unix-like systems:
    +In order to run KeePass, follow these steps: +
      +
    1. Install Mono ≥ 2.6 (older versions will not work and are +not supported). Depending on your platform, the packages to install are called +mono-stable, MonoFramework, +mono-devel or mono-2.0-devel; see +the Mono project page, +if you are unsure which packages to install.
    2. + +
    3. On some platforms, the Windows Forms implementation (System.Windows.Forms) +is offered as a separate package. +KeePass requires this package; so if you see one, install it, too.
    4. + +
    5. On some platforms, the Runtime namespace (System.Runtime) +is offered as a separate package. +KeePass requires this package; so if you see one, install it, too.
    6. + +
    7. If you want to use auto-type on Linux/MacOS/BSD/etc., you additionally +need the xdotool package.
    8. + +
    9. Download the portable version of KeePass (ZIP package) +and unpack it to a location of your choice.
    10. + +
    11. When being in the KeePass directory, run the command line +"mono KeePass.exe". Alternatively, right-click onto +the KeePass.exe file, choose "Open with Other Application" +and type in mono as custom command.
    12. +
    + +

    For the last step you might want to create a shortcut +or shell script file with this command line (use an absolute path to +KeePass.exe, if the shortcut / shell script file is in a +different location).

    + +

    Clipboard:
    +On some systems, Mono's clipboard routines don't work properly. +In this case, install the xsel and xdotool packages. +If these are installed, KeePass uses them for clipboard operations.

    + +

    Global Auto-Type:
    +In order to use global auto-type, +you need to create an appropriate system-wide hot key. This only needs to be done +manually once. KeePass performs global auto-type when it's invoked with +the --auto-type command line option.

    + +

    Some examples how to create a system-wide hot key for global auto-type, +for different operating systems:

    + +
      +
    • KDE. +On Linux systems with KDE, the hot key can be created in Computer +→ System SettingsShortcuts and Gestures: +in this dialog, go EditNewGlobal Shortcut → +Command/URL, specify the shortcut on the Trigger tab +and enter
      +mono /YourPathToKeePass/KeePass.exe --auto-type
      +into the Command/URL field on the Action tab. +
    • + +
    • Ubuntu Linux ≥ 11.04 (Unity/GNOME). +Open the dialog Keyboard Shortcuts in the system preferences, +click the Add button, enter KeePass Auto-Type as name +and
      +mono /YourPathToKeePass/KeePass.exe --auto-type
      +as command, then click [Apply]. Click on Disabled of the newly +created item (such that the text 'New shortcut...' appears), +press Ctrl+Alt+A, and close the dialog. +
    • + +
    • Ubuntu Linux ≤ 10.10 (GNOME). +
        +
      1. Press Alt+F2, +enter gconf-editor and click [OK].
      2. +
      3. Navigate to appsmetacitykeybinding_commands.
      4. +
      5. Double-click one of the command_i items, enter
        +mono /YourPathToKeePass/KeePass.exe --auto-type
        +and click [OK].
      6. +
      7. Click the global_keybindings node on the left.
      8. +
      9. Double-click the appropriate run_command_i item +(for example, when you've used command_5 in the previous steps, +double-click run_command_5 now) and specify the hot key of your +choice. For example, to use Ctrl+Alt+A +as hot key, you'd enter <Control><Alt>a.
      10. +
      +
    • +
    + +

    Important: for global auto-type, the version of the xdotool package +must be 2.20100818.3004 or higher! If your distribution only offers an +older version, you can download and install the latest version of the +package manually, see the xdotool website.

    + +

    Auto-Type on Wayland:
    +If you want to use auto-type on a system with a Wayland compositor, +see the Auto-Type on Wayland page.

    + +

    AES-KDF:
    +For fast key transformations +using AES-KDF, make sure that the libgcrypt library is installed.

    + +

    Argon2:
    +For fast key transformations +using Argon2, make sure that the libargon2 library is installed.

    + +

    Plugins:
    +On some Linux systems, the mono-complete package +may be required for plugins to work properly.

    + +

    TLS 1.2:
    +For TLS 1.2 support, Mono 4.8.0 or higher (or .NET Framework 4.5 or higher) +is required.

    + +

    Fonts:
    +On some Linux systems, the ttf-mscorefonts-installer package +may be required.

    +
  • +
+ +
+ + +

+Running KeePass under Wine (Linux, MacOS, BSD, ...)

+ +

Although you can run KeePass 2.x more or less natively on Unix-like systems +using Mono (see above), the user interface does not always look pretty. +Some users therefore prefer running KeePass 2.x under Wine.

+ +

In order to run KeePass 2.x under Wine, follow these steps:

+ +
    +
  1. Make sure that Wine is installed. +Typically the package to install is called wine.
  2. +
  3. Make sure that .NET Framework 4.5 or higher is installed in Wine, see +WineHQ AppDB: .NET Framework.
    +For installing .NET Framework 4.5, winetricks can be used, see +WineHQ AppDB: .NET Framework 4.5.
  4. +
  5. Download the latest portable package of KeePass 2.x (ZIP file) and unpack it +into some directory of your choice.
  6. +
  7. Run wine KeePass.exe.
  8. +
+ +

Theme. +By default, Wine uses the classic Windows theme. If you prefer some other +theme, you can install it in 'Applications' → 'Wine' → 'Configure Wine' → +tab 'Desktop Integration'. +Links to themes can for instance be found on +Wikipedia: Windows XP visual styles.

+ +

Auto-Type. +Wine currently does not implement all Windows API functions required for +auto-type, i.e. auto-type does not work when running KeePass under Wine.

+ + + + + +
+ + +

+Migrating from KeePass 1.x to 2.x

+ +

In order to migrate from KeePass 1.x to 2.x, follow these steps:

+ +
    +
  1. Install KeePass 2.x.
    +If you're using the installer, make sure that the component +'Native Support Library' is being installed +(by default this component is enabled).
  2. +
  3. Run KeePass 2.x and create a new KDBX database file (via 'File' → +'New').
  4. +
  5. Import your old KDB database file into your new KDBX database file +(via 'File' → 'Import', file format 'KeePass KDB (1.x)').
  6. +
+ +

If everything works fine, you can delete your old KeePass 1.x +installation. The old KDB database file also isn't required anymore, +but you may want to keep it as a backup.

+ + + diff --git a/src/Docs/Chm/help/v2/sync.html b/src/Docs/Chm/help/v2/sync.html new file mode 100644 index 0000000..0ad8c38 --- /dev/null +++ b/src/Docs/Chm/help/v2/sync.html @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Synchronization - KeePass + + + + + + + + + + + + +

Synchronization

+

Merge changes made in multiple copies of a database.

+ + + +
+ + +

+Introduction and Requirements

+ +

KeePass 2.x features a powerful, built-in synchronization mechanism. +Changes made in multiple copies of a database file can be merged safely.

+ +

After synchronizing two files A and B, both A and B are up-to-date +(i.e. KeePass saves the merged data to both locations when performing +a synchronization).

+ +

Requirements.

+
    +
  • If the files to be synchronized are accessible via a protocol that +KeePass supports by default (e.g. files on a local hard disk or a network +share, FTP, HTTP, HTTPS, WebDAV, ..., see the page +'Loading/Saving From/To URL' for details), +then no plugins/extensions are required.
  • + +
  • If one of the files to be synchronized should be accessed via +SCP, SFTP or FTPS, you need the +IOProtocolExt +plugin, which adds support for these protocols to KeePass.
  • + +
  • If one of the files to be synchronized is stored in a cloud storage: +for most cloud storages, there is an integration with the local file system +available (i.e. you can access your stored files using Windows Explorer). +For example, Dropbox, Microsoft OneDrive and Google Drive provide such +an integration. +If such an integration is available, it is recommended that you access +your database file this way; this often works better than accessing it +via a protocol like FTP or WebDAV. +If no such integration is available and your cloud storage also is not +accessible via a standard protocol, a specialized KeePass +plugin +for this cloud storage might be available.
  • +
+ +
+ + +

+Invoking a Synchronization

+ +

There are multiple ways how a synchronization can be invoked:

+ +
    +
  • Manually. +A synchronization can be started manually by navigating to +'File''Synchronize' and clicking 'Synchronize with File' +or 'Synchronize with URL' (depending on whether the file to be synchronized +with is stored on a local drive / network share or on a server accessible via a URL). +If you've previously opened or synchronized with the target file, you can +also simply point on 'Recent Files' (in the 'Synchronize' menu) +and select the file. +Manual synchronization is only possible when the currently opened database +is a local file +(files on a network share are here considered to be local files); +when you've opened a file from a server using a URL, +the 'Synchronize' menu is disabled.
  • + +
  • Command 'Save'. +When invoking the 'Save' command, KeePass checks whether the file on disk/server +has been modified while you were editing it. If it has been modified, +KeePass prompts whether you want to overwrite or synchronize with the file. +Note this applies only to the 'Save' command, not the 'Save As' command. +See the page +'Multiple Users' for details +(section 'KeePass 2.x: Synchronize or Overwrite').
  • + +
  • Triggers. +In more complex situations you can use the synchronization trigger action. +See the page +'Triggers' for details.
  • + +
  • Scripting. +In order to perform a synchronization without opening KeePass, +the synchronization command of KPScript can be used. See the KPScript +help page +'Single Command Operations' +for details.
  • +
+ +
+ + +

+Technical Details

+ +

The synchronization algorithm is rather complex and it would take +many pages to describe in detail how it is working. +Developers interested in this can have a look into the KeePass source code. +Here are the most important properties of the synchronization algorithm:

+ +
    +
  • In order to decide which copy of an object is the latest one, +KeePass mainly uses the last modification time of the object +(which KeePass updates automatically each time the object is changed).
  • +
  • The synchronization is performed on entry level. This e.g. means that +a combination of user name / password is always consistent +(synchronization on field level will not be implemented, because +combinations could become inconsistent with this).
  • +
  • In case of parallel updates and collisions, KeePass tries to store +all information in an appropriate place. For example, when you have an +entry E in a database A, make a copy B of A, change E in B, change E in A, +and synchronize A and B, then E in A is treated as current and the changes +made to E in B are stored as a history entry of E (see the tab page 'History' +in the entry dialog), i.e. the changes made in B are not lost.
  • +
+ +
+ + +

+Advanced Synchronization Schemes

+ +
    +
  • Local↔Master Synchronization.
    +A synchronization scheme that prevents data loss when database files are +overwritten by other applications (e.g. cloud storage service software), +using a trigger.
  • + +
  • Plugins.
    +There are plugins for more complex synchronization schemes, +for example to synchronize only a subset of the entries.
  • +
+ + + diff --git a/src/Docs/Chm/help/v2/translation.html b/src/Docs/Chm/help/v2/translation.html new file mode 100644 index 0000000..0ed2a03 --- /dev/null +++ b/src/Docs/Chm/help/v2/translation.html @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Translations - KeePass + + + + + + + + + + + + +

Translations

+

How to install translations of KeePass 2.x.

+ + + + + +
+ + +

+Installing User Interface Translations

+ +

To install a user interface translation, follow these steps:

+ +
    +
  1. Download the translation ZIP file from the +Translations page +and unpack it (to the current directory).
  2. +
  3. In KeePass, click 'View' → 'Change Language' → button +'Open Folder'; KeePass now opens a folder called 'Languages'. +Move the unpacked file(s) into the 'Languages' folder.
  4. +
  5. Switch to KeePass, click 'View' → 'Change Language', +and select your language. Restart KeePass.
  6. +
+ + + +

Note. +For moving the unpacked file(s) (in step 2), we recommend to use Windows Explorer. +Other file managers may have problems with access rights.

+ +
+ + +

+Additional Localized Content

+ +

For some languages (not for all) there is additional localized content available, +like translated help files, tutorials, etc. All this content is available +from the same page where the user interface translations are downloadable: +Translations page.

+ +

If you'd like to create some translated content yourself, please first ask +the KeePass team if the thing you're planning to create isn't in work already by +someone else. If not, you'll make a lot of people very happy by creating translated content!

+ + + diff --git a/src/Docs/Chm/help/v2/triggers.html b/src/Docs/Chm/help/v2/triggers.html new file mode 100644 index 0000000..10147ea --- /dev/null +++ b/src/Docs/Chm/help/v2/triggers.html @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Triggers - KeePass + + + + + + + + + + + + + +

Triggers

+

Automate workflows using the trigger system.

+ + + +
+ + +

+Trigger System Introduction

+ +

KeePass features a powerful event-condition-action trigger system. +With this system, workflows can be automated. For example, you could define +a trigger that automatically uploads your database to a backup server after +saving the file locally.

+ +

A trigger starts to run when any of the specified events matches. +When this happens, the conditions are checked. If all conditions +are fulfilled, the actions of the trigger are performed. +Actions are performed consecutively; if one action fails, typically the execution +of the event is aborted (i.e. all following actions aren't performed).

+ +

A trigger must be both enabled and on in order to get executed. +The enabled state is set by the user; a disabled trigger has no +function. The on state is dependent on the state of the program. By +enabling the 'Initially On' option, a trigger is on by default. +If you enable the option 'Turn off after executing actions', the trigger +will be off after running once. There are actions to turn triggers on and off, +i.e. triggers can turn themselves and other triggers on and off, which allows +to define a complex state-dependent system of triggers.

+ +

Most strings in the trigger system are Spr-compiled, i.e. +placeholders +(except state-changing ones), environment variables, etc. can be used.

+ +

Sensitive Data.
+Some trigger events/conditions/actions support fields for potentially +sensitive data (for instance the password field of the 'Open database file' +action). As triggers are saved in a plain text +configuration file, +it is generally not recommended to directly enter sensitive data in trigger fields. +If a database is open when the trigger runs, the sensitive data can be +stored in the database and the trigger field can point to the data using +a field reference +(which KeePass resolves when evaluating the field). +In this way, only the field reference appears in the configuration file +and the actual sensitive data is stored in the encrypted database file.

+ +

I/O Connection Properties.
+Most trigger actions having a file path/URL parameter only allow +specifying the path/URL and possibly credentials (user name and password) +for accessing the file; advanced connection properties (like +timeout, user agent, passive mode, etc.) cannot be specified here. +If advanced connection properties are required, open the file once +(using 'File' → 'Open') with the desired connection properties. +This will create an item in the 'Open Recent' file list +(which remembers connection properties). +When a trigger action is executed, KeePass loads the connection properties +from the corresponding item (same path/URL) in the 'Open Recent' file list.

+ +
+ + +

+Events

+ +
    + +
  • Application initialized:
    +This event occurs when KeePass has finished initializing, but didn't perform +any main window automations (like opening a default database) yet. +
      +
    • Parameters: None.
    • +
  • + +
  • Application started and ready:
    +This event occurs when KeePass has started up, performed main window +automations (like opening a default database) and is ready for user actions. +
      +
    • Parameters: None.
    • +
  • + +
  • Application exit:
    +This event occurs when KeePass is about to exit. Databases have been closed +already, but resources (like fonts, ...) are still valid. +
      +
    • Parameters: None.
    • +
  • + +
  • Opened database file:
    +This event occurs right after a database file has been opened successfully. +
      +
    • File/URL: An optional event filter. If a filter is specified +(i.e. something is entered in 'File/URL - Filter'), the trigger +is only evaluated, if the filter matches the actual database file path. +For example, if you enter F:\ as filter string and specify +'Starts with' as comparison method, the trigger will only be evaluated, +if the database (that has just been opened) path starts with F:\.
    • +
  • + +
  • Saving database file:
    +This event occurs right before a database file is saved. +
      +
    • Parameters: See 'Opened database file' event.
    • +
  • + +
  • Saved database file:
    +This event occurs right after a database file has been saved successfully. +
      +
    • Parameters: See 'Opened database file' event.
    • +
  • + +
  • Synchronizing database file:
    +This event occurs right before a database file is synchronized +with another database file. +
      +
    • Parameters: See 'Opened database file' event.
    • +
  • + +
  • Synchronized database file:
    +This event occurs right after a database file has been synchronized +with another database file. +
      +
    • Parameters: See 'Opened database file' event.
    • +
  • + +
  • Closing database file (before saving):
    +This event occurs right before a database file is closed. +It occurs before KeePass saves the database automatically or asks the +user whether to save unsaved changes. +
      +
    • Parameters: See 'Opened database file' event.
    • +
  • + +
  • Closing database file (after saving):
    +This event occurs right before a database file is closed. +The database file already was saved automatically or unsaved changes were +saved/discarded depending on the user's choice. +
      +
    • Parameters: See 'Opened database file' event.
    • +
  • + +
  • Copied entry data to clipboard:
    +This event occurs when entry data (user name, password, ...) is copied +to the Windows clipboard. +
      +
    • Value: An optional value (copied data) filter.
    • +
  • + + + +
  • Time - Periodic:
    +This event occurs at user-defined intervals. +The event is raised only if KeePass is not occupied +with a different task (like showing a subdialog). +
      +
    • Interval: Time span between the events, in seconds.
    • +
    • Restart timer on KeePass activity: +If this option is turned on, a KeePass activity +(user interaction, automation, subdialog, plugin activity, ...) +causes a restart of the timer, i.e. one full interval must +pass for the next event.
    • +
  • + +
  • Custom toolbar button clicked:
    +This event occurs when the user clicks a custom toolbar button. Custom +toolbar buttons can be created using the 'Add custom toolbar button' +trigger action. +
      +
    • ID: ID of the toolbar button that must have been clicked (see action).
    • +
  • + +
+ +
+ + +

+Conditions

+ +
    + +
  • Environment variable:
    +
      +
    • Name: Name of the environment variable to check. The name must not +be enclosed in percent (%) characters.
    • +
    • Value: The value that the specified environment variable must have +for the condition to be true.
    • +
  • + +
  • String:
    +
      +
    • String: A string (KeePass Spr-compiles this, i.e. you can e.g. use +placeholders).
    • +
    • Value: The value that the specified, evaluated string must have +for the condition to be true.
    • +
  • + +
  • File exists:
    +
      +
    • File: The file that must exist in order for the condition to be true.
    • +
  • + +
  • Remote host is reachable (ping):
    +
      +
    • Host: Host to send the ping to.
    • +
  • + +
  • Database has unsaved changes:
    +Evaluates to true, if the specified database has unsaved changes. +
      +
    • Database: The database to check for unsaved changes.
    • +
  • + +
+ +
+ + +

+Actions

+ +
    + +
  • Execute command line / URL:
    +The file/URL and arguments are parsed by the Spr engine before they +are sent to the shell, i.e. generic and database-dependent +placeholders can +be used. +If you want to use built-in shell commands, like COPY, please +see: Executing Built-In Shell Commands. +
      +
    • File/URL: The string to be executed by the shell.
    • +
    • Arguments: Optional. If 'File/URL' points to an executable +file, this string is sent to the executable as command line argument(s).
    • +
    • Wait for exit: If this option is checked, KeePass waits indefinitely +for the started process to exit.
    • +
    • Window style: Specifies how the main window of the executed +file/URL should be displayed. Not all applications respect this setting.
    • +
    • Verb: Specifies the action to be performed. An empty string means +to use the default verb. Some applications support additional verbs (e.g. +"Print" to print the specified document). +When using the verb "RunAs", the application is executed with +administrative rights (this may require a confirmation via the UAC +dialog).
    • +
  • + +
  • Change trigger on/off state:
    +
      +
    • Trigger name: Name of the target trigger whose on/off state +should be changed. If this field is left empty, the target trigger is +the current one.
    • +
    • New state: Specifies the new state of the target trigger.
    • +
  • + +
  • Open database file:
    +Open a KDBX database file (in a new tab). If the given database file is opened +already, KeePass brings it to the foreground. +
      +
    • File/URL: Path of the database file to open. If it is a URL, +the protocol (prefix) must be specified.
    • +
    • I/O Connection - User Name / Password: Optional credentials that are used +for connecting to the target file system (for example FTP account user name / +password). These credentials are not used to decrypt the database.
    • +
    • Password / Key file / User account: Optional credentials that are used +to decrypt the database file.
    • +
  • + +
  • Save active database:
    +Save the currently active database. This action always saves the database, +even if there are no unsaved changes. To only save if there are unsaved changes, +use the 'Database has unsaved changes' trigger condition. +
      +
    • Parameters: None.
    • +
  • + +
  • Synchronize active database with a file/URL:
    +Synchronize the currently opened and active database with a file. +
      +
    • File/URL: Path of the database file to synchronize with. +If it is a URL, the protocol (prefix) must be specified.
    • +
    • I/O Connection - User Name / Password: Optional credentials that are used +for connecting to the target file system (for example FTP account user name / +password). These credentials are not used to decrypt the database.
    • +
  • + +
  • Import into active database:
    +Import a file into the currently opened and active database. +
      +
    • File/URL: Path of the source file to import. +If it is a URL, the protocol (prefix) must be specified.
    • +
    • File format: Specifies the import format (see the import +dialog for possible values).
    • +
    • Method: Specifies the behavior for groups/entries that exist +in both the currently active database and the import file.
    • +
    • Password / Key file / User account: Optional credentials that are used +to decrypt the import file, if required. +If no credentials are specified, but the import file is encrypted, KeePass +shows a key prompt dialog.
    • +
  • + +
  • Export active database:
    +Export the currently opened and active database to a file. +
      +
    • File/URL: Path of the target file to export to. +If it is a URL, the protocol (prefix) must be specified.
    • +
    • File format: Specifies the export format (see the export +dialog for possible values).
    • +
    • Filter - Group: Specifies the path of the group to export +(optional; an empty string means the whole database). +The path must start with the character used as separator, and the +name of the root group of the database must not be specified. +For example, to export a group 'B' that is a subgroup of the group +'A', specify /A/B as group path.
    • +
    • Filter - Tag: Export only the entries that have the +specified tag (optional parameter).
    • +
  • + +
  • Close active database:
    +Close the currently active database. +
      +
    • Parameters: None.
    • +
  • + +
  • Activate database (select tab):
    +
      +
    • File/URL: Path of the database to activate. This may be a +substring of the actual database path. For example, specifying +MyDatabase would match a database +C:\Documents\KeePass\MyDatabase.kdbx.
    • +
    • Filter: Specifies the databases that are being +considered. If 'Triggering' is selected and the 'File/URL' field is empty, +the database that triggered the event is activated.
    • +
  • + +
  • Wait:
    +Wait for the specified amount of time. +
      +
    • Time span: Number of milliseconds to wait.
    • +
  • + +
  • Show message box:
    +Displays a message box. +
      +
    • Main instruction: First line of the message text +(which is possibly displayed using a stronger font).
    • +
    • Text: Message text.
    • +
    • Icon: The icon that is displayed next to the message text.
    • +
    • Buttons: Specifies the available buttons.
    • +
    • Default button: The button that initially has the focus.
    • +
    • Action - Condition: Specifies the condition that must be fulfilled +for the following action to be performed. For example, if 'Button OK/Yes' is +selected, the action is only performed if the user clicks the 'OK' or +'Yes' button of the message box.
    • +
    • Action: The action to perform after showing the message box.
    • +
    • Action - Parameters: Parameters for the specified action. For +example, if executing a command line / URL is specified as action, this field +must contain the command line / URL.
    • +
  • + +
  • Perform global auto-type:
    +Execute global auto-type (like pressing the global auto-type hot key). +
      +
    • Parameters: None.
    • +
  • + +
  • Perform auto-type with selected entry:
    +Executes auto-type with the currently selected entry as context. +
      +
    • Sequence: The keystroke sequence to send. If this field is empty, +the default sequence is used.
    • +
  • + +
  • Show entries by tag:
    +Search all entries having the specified tag and show them in the +entry list of the main window. +
      +
    • Tag: Tag that the entries must have.
    • +
  • + +
  • Add custom toolbar button:
    +Add a custom button to the toolbar in the main window. +
      +
    • ID: ID of the toolbar button (see the event handler).
    • +
    • Name: Text that is shown on the toolbar button.
    • +
    • Description: Text that is shown in the tooltip of the button.
    • +
  • + +
  • Remove custom toolbar button:
    +Remove a custom button from the toolbar in the main window. +
      +
    • ID: ID of the toolbar button (see the event handler).
    • +
  • + +
+ +
+ + +

+Examples

+ +

See the Trigger Examples page.

+ + + diff --git a/src/Docs/Chm/help/v2/version.html b/src/Docs/Chm/help/v2/version.html new file mode 100644 index 0000000..263283f --- /dev/null +++ b/src/Docs/Chm/help/v2/version.html @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Compatibility - KeePass + + + + + + + + + + + + +

Compatibility

+

Compatibility of KeePass editions.

+ +

KDBX files (created by KeePass 2.x) and KDB files (created by +KeePass 1.x) are not compatible. KeePass 2.x supports +a lot of features, which 1.x doesn't support, therefore these formats +are incompatible.

+ +

But KeePass 2.x can import KDB files created by KeePass 1.x. For +this, you first need to create a new database in KeePass 2.x +and then import the 1.x database using 'File' → 'Import'.

+ +

By 'File' → 'Export', KeePass 2.x can also export data to +1.x KDB files. However note that not all 2.x fields +are supported by 1.x (i.e. the export is lossy).

+ + + diff --git a/src/Docs/Chm/help/v2/xml_replace.html b/src/Docs/Chm/help/v2/xml_replace.html new file mode 100644 index 0000000..2cc7830 --- /dev/null +++ b/src/Docs/Chm/help/v2/xml_replace.html @@ -0,0 +1,395 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + XML Replace - KeePass + + + + + + + + + + + + + + +

XML Replace

+

About the XML replacement functionality.

+ + + +
+ + +

+General Information

+ +

XML Replace is a powerful feature that modifies a database by manipulating +its XML representation.

+ +

It creates a KeePass 2.x XML DOM of the current database +in memory, performs the operation specified by the user +(e.g. remove nodes or replace text), loads the modified XML tree, +and merges the current database with the modified database.

+ +

Warning +This is a feature for experts. Use with caution!

+ +

XML Replace can be invoked via 'Tools' → 'Database Tools' → +'XML Replace'.

+ +

Information about XPath and regular expressions can be found on the +Search help page.

+ +

KeePass protects history entries; XML Replace cannot be used to modify +these. Furthermore, any changes to database properties +(database name/description, etc.) may be ignored.

+ +
+ + +

+Examples

+ +
+ + + + + + + + + + + + +
Replace text in all entry titles and notes
Select nodes://Entry/String[(Key = 'Title') or (Key = 'Notes')]/Value
Action:Replace data
Data:Inner text
Find what:TheTextToFind
Replace with:TheReplacement
Within all entry titles and notes, this +replaces all occurences of TheTextToFind by +TheReplacement.
+ +
+ + + + + + + + + + + + + +
Replace all HTTP URLs by HTTPS URLs
Select nodes://Entry/String[Key = 'URL']/Value
Action:Replace data
Data:Inner text
Find what:^http:
Replace with:https:
Options:☑ Regular expressions
Within all entry URL fields, this replaces all +HTTP URLs by HTTPS URLs.
+ +
+ + + + + + + + + + + + + +
Replace group icons
Select nodes://Group/IconID
Action:Replace data
Data:Inner text
Find what:^48$
Replace with:36
Options:☑ Regular expressions
This assigns the ZIP package icon to all groups that +currently have a closed folder as icon.
+
+All icon IDs can be found in the icon picker dialog.
+ +
+ + + + + + + + + + +
Delete entry strings by name
Select nodes://Entry/String[Key = 'TheName']
Action:Remove nodes
Removes all entry strings named +TheName.
+ +
+ + + + + + + + + +
Delete entry attachments by name extension
Select nodes://Entry/Binary/Key[(string-length(.) >= 4) and (substring(., string-length(.) - 3) = '.jpg')]/..
Action:Remove nodes
Removes all entry attachments that have a name +ending in '.jpg'.
+ +
+ + + + + + + + + +
Reset background colors
Select nodes://Entry/BackgroundColor
Action:Remove nodes
Sets the background color of all entries to the +default (transparent/alternating).
+ +
+ + + + + + + + + + + + +
Disable auto-type for entries with empty fields
Select nodes://Entry/String[((Key = 'UserName') or (Key = 'Password')) and (Value = '')]/../AutoType/Enabled
Action:Replace data
Data:Inner text
Find what:True
Replace with:False
Disables auto-type for all entries that have an empty +user name field or an empty password field.
+ +
+ + + + + + + + + + + + +
Convert {DELAY= to upper-case
Select nodes://DefaultSequence | //KeystrokeSequence
Action:Replace data
Data:Inner text
Find what:{DELAY=
Replace with:{DELAY=
Converts all {DELAY= codes +within auto-type sequence overrides and associations to upper-case +(by default the case sensitivity option is turned off, thus the 'Find what' +text matches all cases).
+
+In KeePass 2.x, placeholders are case-insensitive. However, this XML Replace operation +may be useful as preparation for the following example (which matches +{DELAY= in a case-sensitive way).
+ +
+ + + + + + + + + + + + + +
Prepend {DELAY=50} to all sequences without a {DELAY=
Select nodes:(//DefaultSequence | //KeystrokeSequence)[not(contains(., '{DELAY=')) +and (. != '')]
Action:Replace data
Data:Inner text
Find what:^(.*)$
Replace with:{DELAY=50}$1
Options:☑ Regular expressions
Prepends a {DELAY=50} to all auto-type +sequence overrides and associations that do not contain any +{DELAY= already and are not empty.
+
+Note that the node selection is case-sensitive (independent of the data +case sensitivity option), thus you need to ensure that all +{DELAY= codes are upper-case before performing this operation. +This can e.g. be done using the XML Replace operation mentioned +above.
+ +
+ + + + + + + + + + + + + +
Change {DELAY= values
Select nodes://DefaultSequence | //KeystrokeSequence
Action:Replace data
Data:Inner text
Find what:\{DELAY=[\d\s]*\}
Replace with:{DELAY=50}
Options:☑ Regular expressions
Sets the values of all {DELAY= codes +within auto-type sequence overrides and associations to 50.
+ +
+ + + + + + + + + + + + + +
Remove {DELAY=x} from all sequences
Select nodes://DefaultSequence | //KeystrokeSequence
Action:Replace data
Data:Inner text
Find what:\{DELAY=[\d\s]*\}
Replace with:(Leave empty)
Options:☑ Regular expressions
Removes all {DELAY=x} codes from +all auto-type sequences.
+ +
+ + + + + + + + + +
Reset default sequences that contain {DELAY=
Select nodes://DefaultSequence[contains(., '{DELAY=')]
Action:Remove nodes
If a sequence has been specified in the field +'Override default sequence' (in the entry dialog) and it contains +{DELAY=, the sequence is reset, +i.e. the option 'Inherit default auto-type sequence from group' is activated.
+ +
+ + + + + + + + + + + + + +
Add an auto-type association to all entries
Select nodes://Entry/AutoType
Action:Replace data
Data:Outer XML
Find what:</AutoType>\Z
Replace with:<Association><Window>* - Notepad</Window><KeystrokeSequence>{PASSWORD}</KeystrokeSequence></Association></AutoType>
Options:☑ Regular expressions
Adds an auto-type association to all entries: the window title +'* - Notepad' is associated with the sequence '{PASSWORD}'.
+ +
+ + + + + + + + + + + + + +
Copy entry URLs into title fields
Select nodes://Entry
Action:Replace data
Data:Inner XML
Find what:(?s)(<Key>Title</Key>\s*)(<Value>.*?</Value>|<Value\s*/>)(.*?<Key>URL</Key>\s*)(<Value>.*?</Value>|<Value\s*/>)
Replace with:$1$4$3$4
Options:☑ Case-sensitive
+☑ Regular expressions
Copies the entry URL into the title field of the +entry (overwriting any existing data in the title field).
+
+If you want the entry URL to be copied only if the title field is empty, +use the following for 'Select nodes':
+//Entry/String[(Key = 'Title') and (Value = '')]/..
+ +
+ + + + + + + + + + + + + +
Copy entry titles into empty user name fields
Select nodes://Entry/String[(Key = 'UserName') and (Value = '')]/..
Action:Replace data
Data:Inner XML
Find what:(?s)(<Key>Title</Key>\s*<Value>)(.*?)(</Value>.*?<Key>UserName</Key>\s*)(<Value></Value>|<Value\s*/>)
Replace with:$1$2$3<Value>$2</Value>
Options:☑ Case-sensitive
+☑ Regular expressions
Copies the entry title into the user name field of the +entry, if this field is empty.
+ +
+ + + + + + + + + + + + + +
Ensure first line is not empty
Select nodes://Entry/String/Value
Action:Replace data
Data:Inner text
Find what:(?s)^(\r?\n)
Replace with:--$1
Options:☑ Regular expressions
For all multi-line fields, +this inserts '--' into the first line of the field value, +if this line is empty and the value has at least two lines. +Example:
+
+

+
+Sample data
+
+is replaced by
+
+
--
+
+Sample data
+ + + diff --git a/src/Docs/Chm/help/v2_dev/customize.html b/src/Docs/Chm/help/v2_dev/customize.html new file mode 100644 index 0000000..c8a194a --- /dev/null +++ b/src/Docs/Chm/help/v2_dev/customize.html @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Customization (2.x) - KeePass + + + + + + + + + + + + + + + + +

Customization (2.x)

+

KeePass 2.x features various options for network administrators to +customize the program's appearance and behavior.

+ + + +
+ + +

+Preliminaries

+ +

Most options below are configured by directly editing the +KeePass.config.xml configuration file. If you're planning to +deploy a customized KeePass version, you should fully understand the +KeePass configuration system, +especially how to enforce some settings and leave others up to users.

+ +

Note that KeePass features a rich plugin framework. If there's no +item in the XML file to configure what you're thinking about, you might +want to write a plugin.

+ +
+ + +

+Minimum Master Password Requirements

+ +

You can specify several properties that master passwords must have +in order to be accepted (length, estimated quality, ...). +See Specifying Minimum Master Password +Properties.

+ +
+ + +

+Specifying UI Element States

+ +

The state (enabled, disabled, visible, hidden) of several user interface +(UI) elements can be specified using the UIFlags value +of the UI node in the configuration file. +This can be a bitwise combination of one or more of +the following flags:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Flag (Hex)Flag (Dec)Description
0x00Don't force any states (default).
0x11Disable 'Tools' → 'Options' menu item.
0x22Disable 'Tools' → 'Plugins' menu item.
0x44Disable 'Tools' → 'Triggers' menu item.
0x88Disable controls to specify after how many +days the master key should/must be changed.
0x1016Hide password quality progress bars and information labels.
0x2032Disable 'Help' → 'Check for Updates' menu item.
0x4064Disable 'Tools' → 'Database Tools' → 'XML Replace' menu item.
0x80128Disable 'File' → 'Database Settings' menu item.
0x1000065536Hide built-in profiles in the +password generator context menu of the entry editing dialog.
0x20000131072Show UI elements related to last access times.
+Note: Databases are not marked as modified when a last access time +changes. Thus, when only last access times are changed and the user closes the +database (without saving manually first and without a save forced e.g. by a trigger or plugin), +the changes to the last access times are lost.
0x40000262144Do not display information dialogs when creating a new database.
0x80000524288Do not display auto-type obfuscation compatibility information dialogs.
0x1000001048576Do not clear the quick search terms list when closing/locking a database.
+Note: Even if this flag is set, the list is cleared when exiting +KeePass. If you frequently perform the same searches, consider using +tags or +search profiles.
0x2000002097152Enable the Input Method Editor (IME) on +secure desktops.
+Warning +This can result in problems (black screen, IME/CTF process with +high CPU usage, ...). See +'Why +does the Input Method Editor (IME) not work?'.
+ +

The value of UIFlags must be specified in decimal notation.

+ +

For example, if you want to disable the 'Options' and 'Check for Updates' +menu items, you'd specify 33 as value for the UIFlags node +(0x1 + 0x20 = 1 + 32 = 33).

+ +
+ + +

+More Options

+ +
    +
  • Configuration/Application/ConfigSave:
    +If this option is set to false, KeePass does not save +any configuration settings (i.e. the configuration is loaded normally, +but changes to it are discarded when exiting KeePass).
  • + +
  • Configuration/Application/ExpirySoonDays:
    +Specifies the number of days within which entries are considered +to expire "soon". The default value is 7.
  • + +
  • Configuration/Application/HelpUrl:
    +Specifies the URL that is opened for a help page. +This overrides all other help sources (local and online). +Spr-compiled; +the relative help page path is inserted by {BASE}.
  • + +
  • Configuration/Defaults/WinFavsBaseFolderName:
    +For the 'Windows Favorites' export: +name of the root folder; the default value is 'KeePass'.
  • + +
  • Configuration/Defaults/WinFavsFileNamePrefix:
    +For the 'Windows Favorites' export: +prefix for the title of every favorite; the default value is an empty string.
  • + +
  • Configuration/Defaults/WinFavsFileNameSuffix:
    +For the 'Windows Favorites' export: +suffix for the title of every favorite; the default value is an empty string.
  • + +
  • Configuration/Integration/AutoTypeInterKeyDelay:
    +Specifies the default delay (in ms) between two keypresses sent by auto-type. +The minimum is 1 ms. +Note that very small delays may result in target applications not being able +to process the keypresses correctly.
  • + +
  • Configuration/Integration/AutoTypeAbortOnWindows:
    +This node may contain one or more Window nodes that +specify disallowed auto-type target windows (the value of each node must +be a target window filter). + +

    For example, the following configuration disallows auto-typing into +WordPad and LibreOffice Writer:

    +
    <AutoTypeAbortOnWindows>
    +    <Window>* - WordPad</Window>
    +    <Window>* - LibreOffice Writer</Window>
    +</AutoTypeAbortOnWindows>
  • + +
  • Configuration/Security/MasterKeyTries:
    +Specifies how often the master key dialog appears when entering incorrect +master keys. The default value is 3.
  • + +
  • Configuration/Security/PreventScreenCapture:
    +If this option is set to true, KeePass protects its windows +against certain screen capture operations (on Windows 7 and higher; +for details, see the +SetWindowDisplayAffinity function).
    +Warning +This may also prevent legitimate other software +(accessibility-related tools like Windows Magnifier, remote desktop +solutions, etc.) from seeing KeePass windows.
  • + +
  • Configuration/Security/ProtectProcessWithDacl:
    +If this option is set to true, KeePass protects its process +with a discretionary access control list (DACL).
    +Warning +Please note that this also blocks legitimate other software +(accessibility-related tools like Windows Narrator, other security +products like anti-virus programs or firewalls, tools providing user interface +enhancements, etc.) from working with KeePass. Furthermore, various problems +like application hangs, exceptions and crashes may occur. +Therefore, this option is turned off by default and can only be turned on +by manually editing the configuration file. +It only works reasonably in very specific, limited usage scenarios +and is not recommended for most users.
    +This option works on Windows only and requires the KeePassLibC DLL +(included in default installations and packages).
  • + +
  • Configuration/UI/TrayIcon/ShowOnlyIfTrayedEx:
    +If this option is set to true, the KeePass icon in the +system tray is displayed only if the main window has been minimized +to the tray.
    +Warning +Turning on this option can result in denial-of-service problems. +If you want to hide the KeePass icon, it is recommended to configure +this in the system settings instead; +see 'Customize the taskbar notification area'.
  • +
+ + + diff --git a/src/Docs/Chm/help/v2_dev/plg_index.html b/src/Docs/Chm/help/v2_dev/plg_index.html new file mode 100644 index 0000000..ae16989 --- /dev/null +++ b/src/Docs/Chm/help/v2_dev/plg_index.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Plugin Development (2.x) - KeePass + + + + + + + + + + + + + +

Plugin Development (2.x)

+

How to develop plugins for KeePass 2.x.

+ +

This documentation applies to KeePass 2.x plugins. 2.x plugins are fundamentally +different from 1.x plugins. 1.x plugins cannot be loaded by KeePass 2.x.

+ + + +
+ + +

+Requirements

+ +

Before you can start developing a KeePass plugin, you need the following +prerequisites:

+ + + +
+ + +

+Step-by-Step Tutorial

+ +

Start your favorite IDE and create a new C# Class Library project +(for the .NET Framework, not .NET Standard/Core). +In this tutorial, the example plugin we're developing is called SimplePlugin. +The first thing you need to do now is to add a reference to KeePass: +go to the references dialog and select the KeePass.exe file +(from the portable ZIP package). +After you added the reference, the namespaces KeePass and +KeePassLib should be available.

+ +

It is important that you reference an official KeePass.exe, +not a development snapshot or own build, because otherwise your +plugin will be incompatible with official KeePass builds.

+ +

All KeePass plugins need to derive from a base KeePass plugin class +(Plugin in the KeePass.Plugins namespace). +By overriding methods and properties of this class, you can customize +the behavior of your plugin.

+ +

A minimal plugin looks like this:

+ +
using System;
+using System.Collections.Generic;
+
+using KeePass.Plugins;
+
+namespace SimplePlugin
+{
+	public sealed class SimplePluginExt : Plugin
+	{
+		private IPluginHost m_host = null;
+
+		public override bool Initialize(IPluginHost host)
+		{
+			if(host == null) return false;
+			m_host = host;
+			return true;
+		}
+	}
+}
+ +

You can find a fully documented and extended version of this simple +plugin on the KeePass plugins web page.

+ +

This plugin does exactly nothing, but it shows some important conventions +already, which must be followed by all plugins:

+ +
    +
  • The namespace must be named like the DLL file without extension. Our DLL +file is named SimplePlugin.dll, therefore the namespace must +be called SimplePlugin.
  • +
  • The main plugin class (which KeePass will instantiate when it loads your +plugin) must be called exactly the same as the namespace plus "Ext". +In this case: "SimplePlugin" + "Ext" = "SimplePluginExt".
  • +
  • The main plugin class must be derived from the KeePass.Plugins.Plugin +base class.
  • +
+ +

The Initialize function is the most important one and you +probably will always override it. In this function, you get an interface +to the KeePass internals: an IPluginHost interface reference. +Through this interface you can access the KeePass main menu, the currently +opened database, etc. The Initialize function is called immediately +after KeePass loads your plugin. All initialization should be done in this +method (not in the constructor of your plugin class!). If you +successfully initialized everything, you must return true. If +you return false, KeePass will immediately unload your plugin.

+ +

A second function that you will need very often is the Terminate +method:

+ +
public override void Terminate()
+{
+}
+ +

This function is called shortly before KeePass unloads your plugin. You cannot +abort this process (it's just a notification and your last chance to clean up +all used resources, etc.). Immediately after you return from this method, KeePass +can unload your plugin. It is highly recommended to free all resources in this +method (not in the destructor of your plugin class!).

+ +

We're almost done! We now need to tell KeePass that +our file is a KeePass plugin. This is done by editing the Version Information Block +of the file. Open the file version editing dialog (in Visual Studio 2005: right-click +onto the project name → 'Properties' → button 'Assembly Information'). +All fields can be assigned freely except the Product Name field (for more information +see Plugin Conventions). This field must be set to +"KeePass Plugin" (without the quotes).

+ + + +

That's it! Now try to compile your plugin and copy the resulting DLL +file into the KeePass directory. If you start KeePass and go to the plugins +dialog, you should see your plugin in the list of loaded plugins.

+ +
+ + +

+Providing Menu Items

+ +

Many plugins provide menu items (with subitems, if necessary) +in prominent locations like the 'Tools' menu, the entry context menu, etc. +Such a menu item can be supplied to KeePass by overriding the +GetMenuItem method of your plugin class +(which derives from the Plugin base class). +In this method, the plugin can construct and return a ToolStripMenuItem, +which KeePass will then show in the appropriate location.

+ +

Users should be able to associate the menu item with your plugin. +Typically, plugins set the text of the menu item to the name of the plugin or +a string that starts with the name of the plugin. For example, a plugin 'Abcd' +that wants to provide one menu item only (for accessing the plugin options) +could set the text of the menu item to 'Abcd Options'. +If the plugin supports multiple commands, set the menu item's text to +the plugin name (e.g. 'Abcd') and add a subitem for each command.

+ +

The GetMenuItem method should always construct and return +a new ToolStripMenuItem. Do not cache the menu item +or any of its subitems for +later purposes (KeePass may invoke the GetMenuItem method +multiple times and show the menu items in multiple places; if your plugin +would cache a menu item, trying to show it in multiple places would +result in problems, because a ToolStripMenuItem can have +only one parent item). +If you want to update the state of subitems (like disabling certain items +or showing checkmarks), you can do this for instance +in an anonymous method that handles the DropDownOpening +event of the returned menu item (this way you do not need to remember +menu item references manually); see +SamplePlugin +for an example.

+ +

KeePass takes ownership of the returned menu item (and its subitems). +The plugin should not add or remove the item to/from any menu itself; +KeePass will do this.

+ +

If your plugin does not provide a menu item in the location specified +by the PluginMenuType parameter t, +return null.

+ +

Example:

+ +
public override ToolStripMenuItem GetMenuItem(PluginMenuType t)
+{
+	// Provide a menu item for the main location(s)
+	if(t == PluginMenuType.Main)
+	{
+		ToolStripMenuItem tsmi = new ToolStripMenuItem();
+		tsmi.Text = "Abcd Options";
+		tsmi.Click += this.OnOptionsClicked;
+		return tsmi;
+	}
+
+	return null; // No menu items in other locations
+}
+
+private void OnOptionsClicked(object sender, EventArgs e)
+{
+	// Called when the menu item is clicked
+}
+ + + +

For an example how to create a menu item with subitems (and +update their states dynamically), see the +SamplePlugin +example plugin.

+ + + +
+ + +

+Plugin Conventions

+ +

File version information block:

+ +

KeePass uses the file version information block to detect if a DLL file is a +KeePass plugin and retrieves information from it to show in the plugins dialog. +The fields are used as follows:

+ +
    +
  • Title: Should contain the full name of the plugin.
  • +
  • Description: Should contain a short description (not more than 5 lines) +of your plugin.
  • +
  • Company: Should contain the author name of the plugin.
  • +
  • Product name: Must be set to "KeePass Plugin" (without +the quotes).
  • +
  • Copyright: Not used by KeePass; freely assignable by the plugin.
  • +
  • Trademarks: Not used by KeePass; freely assignable by the plugin.
  • +
  • Assembly version: Should be set to the version of your plugin.
  • +
  • File version: Should be set to the version of your plugin. It is up +to you how you are versioning your plugin builds, but it should be a scheme that +allows version comparisons (by comparing the version components). +Do not use asterisks for creating a version number at build time.
  • +
  • GUID: Not used by KeePass; freely assignable by the plugin.
  • +
+ +

Name, namespace and class name:

+ +

If you want to use the name "KeePass" as part of the name of +your plugin, directly prepend/append a non-numeric prefix/suffix. +For example, "KeePassSync" is ok, but "KeePass Sync" is not.

+ +

The namespace must be named like the DLL file without +extension. For example, if the DLL file is named SecretImporter.dll, +you must call the namespace SecretImporter.

+ +

The plugin class must be named like the namespace plus "Ext". +For the SecretImporter plugin, this would be SecretImporterExt.

+ +
+ + +

+Update Checking

+ +

The update check of KeePass ≥ 2.18 can also check for plugin updates. +Update check support is optional; plugins don't have to support update +checks.

+ +

In order to support update checks, plugin developers need to do the following:

+ +
    +
  • Provide version information file. +When an end-user invokes an update check, KeePass downloads a version information +file, which specifies the current version numbers of one or more plugins. +Every plugin author hosts an own version information file. +The format of the version information file is described in detail below.
  • +
  • Let KeePass know. +In order to be able to check the plugin's version, KeePass must know where +your version information file is located. To let KeePass know, +override the UpdateUrl string property of your plugin class +(the one derived from Plugin) +to return the full, absolute URL of your version information file. +This should be an https:// URL +(for backward compatibility, KeePass also supports http:// +and ftp://, but for security reasons https:// +should be used).
  • +
+ +

Plugin developers have to update their version information file each time +they release new versions of their plugins.

+ +

Version information file format.

+
    +
  • The file is a simple text file. It must be encoded using UTF-8 without +a byte order mark (KeePass ≥ 2.21 supports UTF-8 BOMs in version information +files, but for compatibility with KeePass < 2.21 it is recommended +not to use a BOM). +All line endings are supported.
  • +
  • The first line of the file must start with a separator character of +your choice. The separator character may be any character, +but it must not appear within plugin names and versions. +Suggested is ':'.
  • +
  • Each of the following lines specifies a plugin name and its currently +available version, separated by the separator character that was specified in +the header line.
  • +
  • As plugin name, the value of the 'Title' field in the version information +block of the plugin must be specified. +For managed plugins, this is the value specified using the +AssemblyTitle assembly attribute.
  • +
  • As version number, the value of the file version in the version information +block of the plugin must be specified. +For managed plugins, this is the value specified using the +AssemblyFileVersion assembly attribute. +Trailing .0 may be removed +(e.g. specify 1.3 instead of 1.3.0.0).
  • +
  • The file must end with a line containing only the separator character.
  • +
  • You may optionally compress your version information file using GZip +(note this is not the same as Zip). The file +name must then end with ".gz".
  • +
+ +

Example. Let's assume you're developing two plugins: MyPlugin1 +(version 1.5) and MyPlugin2 (version 1.13.2.17). Then your version +information file could look as follows:

+
:
+MyPlugin1:1.5
+MyPlugin2:1.13.2.17
+:
+ +

If you've developed multiple plugins, it is recommended to create one +version information file, list all your plugins in this file and specify +the URL of the file in all your plugins. When KeePass checks for updates, +it'll download your version information file only once. +This reduces network traffic and is faster than downloading a version information +file for every plugin separately.

+ +

Signing. Since KeePass 2.34, +you can optionally digitally sign your version information file using RSA / SHA-512.

+
    +
  • An RSA key pair can for instance be generated like the following: + +
    using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(4096))
    +{
    +	rsa.PersistKeyInCsp = false;
    +	Console.WriteLine("Private key: " + rsa.ToXmlString(true));
    +	Console.WriteLine("Public key: " + rsa.ToXmlString(false));
    +}
    + +All key lengths supported by RSACryptoServiceProvider +are supported by KeePass (up to .NET 4.5 that is 384 to 16384 bits in 8 bit steps). +We recommend at least 2048 bits; the main version information file +(containing the KeePass version) uses 4096 bits.
  • +
  • In order to tell KeePass to accept a specific version information file +only when it's verifiable with a specific public key, your plugin must call the +UpdateCheckEx.SetFileSigKey +method to associate the specified URL with the specified public key. +The public key must be an XML string in the format as returned by the +RSACryptoServiceProvider.ToXmlString method. +Do not store the private key in your plugin, only the public key.
  • +
  • To sign an unsigned version information file, hash all trimmed non-empty lines +between the header and the footer line +using SHA-512, UTF-8 encoding, each line terminated by '\n' +(not "\r\n"). +Sign the hash using the private key +(if you're using RSACryptoServiceProvider: +load the private key using its FromXmlString method, +then compute the signature using the SignData method). +Encode the hash using Base64 and append it to the first line of the +version information file.
  • +
+ +
+ + +

+Can KeePass 2.x Plugins be Written in Unmanaged C++?

+ +

Yes and no. You can write the logic of your plugin in unmanaged C++ (native +Win32 APIs can be used). However, you must provide a managed interface to your plugin, +i.e. you must export a managed class derived from the Plugin base class +as described in the tutorial. +Also, managed C++ is required to modify the KeePass internals (entries, +groups, main window, ...).

+ +

For an example how to use unmanaged APIs in a managed C++ plugin assembly, +see the +SamplePluginCpp +example plugin.

+ +

It is highly recommended to develop plugins in C#, not in C++, due to +compatibility reasons (in the case of native plugins, separate 32- and +64-bit builds are necessary; native plugins do not run on Unix-like +systems; etc.).

+ +
+ + +

+PLGX Files

+ +

PLGX is an optional plugin file format for KeePass ≥ 2.09. +Instead of compiling your plugin to a DLL file, the plugin source code +files can be packed into a PLGX file and KeePass will compile the plugin +itself when loading it.

+ +

One advantage of the PLGX approach is a strong compatibility detection. +In the case of a DLL plugin, an incompatibility (caused by an API +change within KeePass) is detected by the runtime when the plugin tries +to call/access the method/class, not at loading time. +So, an incompatibility is detected late and might crash KeePass. +In contrast, when using the PLGX format, an incompatibility is +detected immediately at loading time: if there is a problem, the +compile process fails and KeePass can show an informative +plugin incompatibility message to the user. +For DLL plugins, KeePass performs an own compatibility check, +which does not detect all incompatibilities though; +PLGX is far superior here.

+ +

Another advantage of the PLGX approach is compatibility with +custom KeePass builds. +A DLL plugin references an official KeePass build, and unless there +is a change within KeePass that breaks the plugin, the plugin is +also compatible with all future KeePass builds that are compiled +with the same assembly signing key (strong name). +This applies to all operating systems. +Especially, a DLL plugin that does not use any Windows-specific +function works fine on Linux with a KeePass build from the +official portable ZIP package. +However, some Linux packages compile KeePass from the source code; +such builds are not signed at all or are signed with a different +assembly signing key and are thus incompatible with DLL plugins. +In contrast, PLGX plugins are compatible with custom KeePass builds, +because KeePass can adjust the KeePass reference of the plugin +before compiling it.

+ +

For users, the procedure to install a DLL plugin is exactly the +same as for a PLGX plugin; both need to be copied into the 'Plugins' +folder.

+ +

Comparison.

+ + + + + + + + + + + + + + + + + + + + + +
 DLLPLGX
Compatibility checkNo Weak only.Yes Strong.
Compatibility with custom builds (Linux)No +Partial, see above.Yes
Authenticode signing supportYesNo
No compilation on the user's systemYesNo
No plugin cacheYesNo
+ +

So, both formats have unique advantages and disadvantages; +there is no "best" format.

+ +

Dual package. +You can ship a plugin both as a DLL and as a PLGX in one package +(e.g. 'SecretImporter.dll' and 'SecretImporter.plgx' within one folder). +KeePass will load the most appropriate file +(if KeePass has been signed with the official assembly signing key, +it will load the DLL, otherwise the PLGX). +If KeePass loads the DLL, the PLGX is ignored, which especially means +that only a weak compatibility check is performed (i.e. the strong +compatibility detection ensured by the PLGX is lost). +So, a dual package inherits the DLL disadvantages and is not +the "best" solution either.

+ +

Recommendation. +In any case, create a PLGX file (in order to ensure +compatibility with all KeePass builds). +If you think that the advantages of a DLL outweigh the risk +of an undetected compatibility problem, additionally provide +the plugin in DLL form.

+ +

Creating PLGX files. +PLGX files can be created from plugin sources by calling KeePass.exe +with the --plgx-create command line option. If you additionally +pass a path to the plugin sources directory (without terminating separator), +KeePass will use this one; otherwise +it'll show a folder browser dialog to allow you selecting the directory. If +you want to pass the directory location using the command line, make sure that +you're specifying a full, absolute path; relative paths will not work.

+ +

In order to keep the size of the PLGX file small, it is recommended +that you clean up the plugin sources directory before compiling the PLGX. +Remove all unnecessary binary files (files in the bin +and obj directory); especially, delete any plugin assembly DLL +that you compiled yourself. Temporary files by the IDE +(like .suo and .user files) +can also be deleted.

+ +

PLGX features.

+
    +
  • Extensible, object-oriented file format.
  • +
  • Compression support (data files are compressed using GZip).
  • +
  • .csproj support. KeePass retrieves all information required +for compiling the plugin assembly from the .csproj file in the +plugin sources.
  • +
  • Embedded resources support.
  • +
  • Referenced .NET assemblies support. References information is read from +the .csproj file.
  • +
  • Referenced custom assemblies support. Third-party assemblies required by the plugin +(references to DLLs) are supported, provided that the third-party assembly is +located in the plugin source code directory (or any subdirectory of it).
  • +
  • ResX support. .resx files are automatically compiled to +binary .resources files.
  • + +
  • PLGX cache. PLGX files are compiled once and the generated assembly is stored in a cache. +For all following KeePass starts, no compiling is required.
  • +
  • PLGX cache maintenance. The size of the PLGX cache can be seen in the KeePass plugins dialog. +Here, the cache can also be marked to be cleared (it will be cleared when KeePass +is started the next time). An option to automatically delete old files from the +cache is supported and enabled by default.
  • +
+ +

PLGX limitations.

+
    +
  • Only C# is supported (not Visual Basic or any other .NET language).
  • +
  • The compiler that is included in the .NET Framework supports at most +C# 5. In order to avoid using features of a newer C# version, it is therefore +recommended to set the C# version of your plugin project to 5: +
      +
    • In Visual Studio 2017 and earlier, open the project properties → +tab 'Build' → button 'Advanced' → set the option 'Language version' +to 'C# 5'.
    • +
    • In Visual Studio 2019 and later, the project XML file must be edited: +the element 'LangVersion' must contain '5'. +For details, see +C# Language Versioning.
    • +
  • +
  • Linked resources (in different assemblies) are unsupported.
  • +
  • Dependencies on other projects are unsupported (reorganize your project to +use custom assembly references instead).
  • +
+ +

Defining prerequisites. You can optionally specify a minimum +KeePass version, a minimum installed .NET Framework, an operating system and +the minimum size of a pointer (x86 vs. x64) using the +--plgx-prereq-kp:, --plgx-prereq-net:, +--plgx-prereq-os: and --plgx-prereq-ptr: +command line options. If one of the plugin prerequisites isn't met, KeePass shows a detailed +error message to the end-user (instead of a generic plugin incompatibility +message). Build example:
+KeePass.exe --plgx-create C:\YourPluginDir --plgx-prereq-kp:2.09 +--plgx-prereq-net:3.5

+ +

Valid operating system values are Windows and Unix. +When running on an unknown operating system, KeePass defaults to Windows. +Pointer sizes (checking for x86 vs. x64) are specified in bytes; for example, +to only allow running on x64, you specify --plgx-prereq-ptr:8.

+ +

Build commands. Optionally you can specify pre-build +and post-build commands using --plgx-build-pre: and +--plgx-build-post:. These commands are embedded in the PLGX file +and executed when compiling the plugin on the end-user's system.

+ +

In the build commands, the placeholder {PLGX_TEMP_DIR} +specifies the temporary directory (including a terminating separator), +to which the files were extracted. In the post-build command, {PLGX_CACHE_DIR} +is replaced by the cache directory of the plugin (including a terminating +separator), into which the generated assembly was stored.

+ +

These build commands can for example be used to copy additional files into +the cache directory. Example:
+KeePass.exe --plgx-create C:\YourPluginDir +--plgx-build-post:"cmd /c COPY """{PLGX_TEMP_DIR}MyFile.txt""" +"""{PLGX_CACHE_DIR}MyFile.txt""""

+ +

In order to specify a quote character on the command line, it has +to be encoded using three quotes (this is Windows standard, see + +MSDN: SHELLEXECUTEINFOW). So, the command +line above will actually embed the post-build command +cmd /c COPY "{PLGX_TEMP_DIR}MyFile.txt" +"{PLGX_CACHE_DIR}MyFile.txt" +into the PLGX, which is correct. +It is highly recommended to surround paths including PLGX placeholders +using quotes, otherwise the command will not run correctly if the +path contains a space character (which happens very often).

+ +

If you need to run multiple commands, write them into a batch file and +execute it (with cmd). If you need to perform more complex +build tasks, write an own building executable and run it using the build +commands (typically it is useful to pass the directory locations as arguments +to your building executable), for example:
+KeePass.exe --plgx-create C:\YourPluginDir +--plgx-build-post:"{PLGX_TEMP_DIR}MyBuild.exe {PLGX_TEMP_DIR} {PLGX_CACHE_DIR}"

+ +

PLGX debugging. +When the command line option --debug is +passed and a PLGX plugin fails to compile, the output of all +tried compilers is saved to a temporary file.

+ + + diff --git a/src/Docs/Chm/help/v2_dev/scr_index.html b/src/Docs/Chm/help/v2_dev/scr_index.html new file mode 100644 index 0000000..4424d2b --- /dev/null +++ b/src/Docs/Chm/help/v2_dev/scr_index.html @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Scripting KeePass (2.x) - KeePass + + + + + + + + + + + + +

Scripting KeePass (2.x)

+

How to automate database operations in KeePass 2.x.

+ +

Prerequisites:

+ +

In order to automate KeePass, you need the KPScript plugin/extension. +You can find the latest version of KPScript on the KeePass plugins +web page. +The KPScript.exe file needs to be copied into the directory +where KeePass is installed (where the KeePass.exe file is).

+ +
+ +

There are two ways to automate KeePass: single command operations +and KPS script files.

+ +
    +
  • Single Command Operations: +KPScript can be invoked using single commands. By passing the database location, +its key, a command and eventually some parameters, simple operations like adding +an entry can be performed. The syntax is very simple, no scripting knowledge is +required. This method is ideal when you quickly want to do some small changes to +the database. It is not recommended when you need to perform many operations, because +for each command the database needs to be loaded from file, decrypted, modified, +encrypted and written back to file.
    +
  • + +
  • KPS Script Files: These files are a lot more +powerful than single command operations, but are also more complicated. You need +to have heavy experience in C# programming and the KeePass 2.x internals. +Within KPS files you can do everything that KeePass does.
  • +
+ + + diff --git a/src/Docs/Chm/help/v2_dev/scr_kps_index.html b/src/Docs/Chm/help/v2_dev/scr_kps_index.html new file mode 100644 index 0000000..6677f1f --- /dev/null +++ b/src/Docs/Chm/help/v2_dev/scr_kps_index.html @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + KPS Script Files - KeePass + + + + + + + + + + + + +

KPS Script Files

+

How to use KPS script files to automate KeePass 2.x.

+ +

KPS script files are a lot more powerful than single command operations, +but are also more complicated. You need +to have heavy experience in C# programming and the KeePass 2.x internals. +Within KPS files you can do everything that KeePass does.

+ +

What are KPS files?

+ +

KPS files are C# files that are loaded, +compiled and executed by the KPScript.exe program. +Within the script file, you got full access to the KeePass internals.

+ +

The main differences to "normal" C# files are:

+ +
    +
  • No need for using directives.
  • +
  • No need to add a reference to the KeePass assembly.
  • +
  • No need to write a wrapper class. Simply start with Main(). The +complete script file is embedded in a static class.
  • +
+ +

Here's the famous Hello World program as KPS script:

+ +
public static void Main()
+{
+	MessageService.ShowInfo("Hello World!");
+}
+ +

For the most important namespaces, KPScript automatically adds +using directives at the start of the file before compiling it. +MessageService for example is located in KeePassLib.Utility, +but as it's included automatically by KPScript, you can use it directly.

+ +
+ +

Executing a KPS file:

+ +

To run a KPS file, you simply pass it to KPScript:

+ +
KPScript.exe C:\KeePass\MyScriptFile.kps
+ +

It is important that the file extension is .kps, otherwise KPScript won't +recognize the file and will interpret it as database for single command operations.

+ + + diff --git a/src/Docs/Chm/help/v2_dev/scr_sc_index.html b/src/Docs/Chm/help/v2_dev/scr_sc_index.html new file mode 100644 index 0000000..5615a44 --- /dev/null +++ b/src/Docs/Chm/help/v2_dev/scr_sc_index.html @@ -0,0 +1,493 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Single Command Operations - KeePass + + + + + + + + + + + + + +

Single Command Operations

+

How to use KPScript with single command operations to perform simple +database operations.

+ +

KPScript can be invoked using single commands. By passing the database location, +its key, a command and eventually some parameters, simple operations like adding +an entry can be performed. The syntax is very simple, no scripting knowledge is +required. This method is ideal when you quickly want to do some small changes to +the database. It is not recommended when you need to perform many operations, because +for each command the database needs to be loaded from file, decrypted, modified, +encrypted and written back to file.

+ +

Commands are specified by passing -c:COMMAND to KPScript, where COMMAND +is the command to execute (see below for a list of available commands).

+ +

The database location is passed to KPScript by just passing it as a parameter, +without any option prefix.

+ +
+ + +

+Master Key

+ +

The master key for the database can be passed to KPScript +using one of the following ways:

+ +
    +
  • Command line parameters. +Using the -pw:, -pw-enc:, +-keyfile: and -useraccount parameters. +For example, to pass "Secret" as password, you'd give +KPScript the following parameter: -pw:Secret. If the password contains +spaces or other special characters, it must be enclosed in quotes: -pw:"My Top +Secret Password". +For -pw-enc:, see the +{PASSWORD_ENC} placeholder. +The -keyfile: parameter can +specify the key file location. If -useraccount is passed to KPScript, the +user account credentials of the currently logged on user are used, otherwise not.
  • + +
  • Reading from StdIn. +If you pass -keyprompt to KPScript, it will read the +password, the key file path and the user account flag from the StdIn stream. +This option is intended for programmatically passing the key to KPScript. +For entering the password by hand, it is recommended to use the +normal master key dialog instead (because in this dialog the password +is hidden by bullets/asterisks and it is encrypted by the process memory +protection), see -guikeyprompt.
  • + +
  • Entering interactively using graphical user interface. +If you pass -guikeyprompt to KPScript, it will prompt you for the +key using the normal master key dialog of KeePass.
  • +
+ +
+ + +

+Available Commands

+ +

Please note that commands are added incrementally based on user requests. If you are +missing a command, please let the KeePass team know and it will be added to the +next release of KPScript.

+ +

Currently, the following commands are available:

+ + +
+
+ +

Command: ListGroups

+ +

This command lists all groups in a format that easily machine-readable. The output +is not intended to be printed/used directly. Usage example:

+ +

KPScript -c:ListGroups "C:\KeePass\MyDb.kdbx" -pw:MyPassword
+This will list all groups contained in the MyDb.kdbx database file.

+ +
+
+ +

Command: ListEntries

+ +

This command lists all entries in a format that easily machine-readable. The output +is not intended to be printed/used directly. The entry identification +syntax is exactly the same as in the EditEntry command. +Usage example:

+ +

KPScript -c:ListEntries "C:\KeePass\MyDb.kdbx" -pw:MyPassword +-keyfile:"C:\KeePass\MyDb.key"
+Opens the MyDb.kdbx database using 'MyPassword' as password and the MyDb.key file as key file. +It will output a list of all entries contained in the MyDb.kdbx database file.

+ +
+
+ +

Command: GetEntryString

+ +

Retrieves the value of an entry string field. The entry identification syntax +is exactly the same as in the EditEntry command. +Additional command line parameters:

+
    +
  • -Field:NAME
    +The field name can be specified using the '-Field' parameter. Supported +field names are e.g. Title, UserName, Password, URL, Notes, etc.
  • + +
  • -FailIfNotExists
    +If you pass the option '-FailIfNotExists' and the specified +field does not exist, the operation is aborted and an error is returned.
  • + +
  • -FailIfNoEntry
    +If you pass the option '-FailIfNoEntry' and no entry is found, +KPScript terminates with an error.
  • + +
  • -Spr
    +Spr-compiles the value of the field, i.e. +placeholders are replaced, +field references are resolved, etc.
  • +
+ +

Usage example:

+ +

KPScript -c:GetEntryString "C:\KeePass\MyDb.kdbx" -pw:MyPassword +-Field:UserName -ref-Title:"Demo Account"
+Opens the MyDb.kdbx database using 'MyPassword' as password. +It outputs the user names of all entries that have the title +"Demo Account".

+ +
+
+ +

Command: AddEntry

+ +

This command adds an entry to the database. To specify the entry details, use the +standard string field identifiers as parameter names and their values for the contents. +Supported standard string fields are: Title, UserName, Password, URL, and Notes. +Usage examples:

+ +

KPScript -c:AddEntry "C:\KeePass\MyDb.kdbx" -pw:MyPw -Title:"New entry title"

+ +

KPScript -c:AddEntry "C:\KeePass\MyDb.kdbx" -pw:MyPw -Title:SomeWebsite +-UserName:Don -Password:pao5j3eg -URL:https://example.com/

+ +

Additional command line parameters:

+
    +
  • -GroupName:NAME
    +The -GroupName: parameter can be used to specify the group in which the +entry is created. For searching, KPScript performs a pre-order traversal and uses the +first matching group (the name is case-sensitive). If no group with the specified name is +found, it will be created in the root group.
  • + +
  • -GroupPath:PATH
    +The full path of the group can be specified using the +-GroupPath: parameter (use '/' as separator). +If you do not specify a group name or path, +the entry will be created in the root group.
  • + +
  • -setx-Icon:ID
    +Set the icon of the entry to the standard icon having index ID.
  • +
  • -setx-CustomIcon:ID
    +Set the icon of the entry to the custom icon having index ID.
  • +
  • -setx-Expires:VALUE
    +Sets whether the entry expires or not. VALUE must be either +true or false.
  • +
  • -setx-ExpiryTime:VALUE
    +Sets the expiry date/time of the entry.
  • +
+ +

Usage example:

+ +

KPScript -c:AddEntry "C:\KeePass\MyDb.kdbx" -pw:MyPw -Title:"My Provider" +-GroupName:"Internet Sites"

+ +
+
+ +

Command: EditEntry

+ +

This command edits existing entries.

+ +

Use one or more of the following parameters to identify the entries +to be edited; all of the specified conditions must match:

+
    +
  • -ref-FIELDNAME:FIELDVALUE
    +The string field FIELDNAME must have the value FIELDVALUE.
    +If the value is enclosed in '//', it is treated as a + +regular expression, +which must occur in the entry field for the entry to match. +For example, -ref-Title:"//Test\d\d//" matches every entry +whose title contains 'Test' followed by at least two digits.
  • +
  • -refx-UUID:VALUE
    +The UUID of the entry must be VALUE.
  • +
  • -refx-Tags:VALUE
    +The entry must have the specified tags. Multiple tags can be separated using +commas ','.
  • +
  • -refx-Expires:VALUE
    +VALUE must be true or false. +This parameter allows to specify whether the entry expires sometime (i.e. whether +the 'Expires' checkbox is checked, independent of the expiry time).
  • +
  • -refx-Expired:VALUE
    +VALUE must be true or false. +This parameter allows to specify whether the entry has expired (i.e. whether +the 'Expires' checkbox is checked and the expiry time is not in the future).
  • +
  • -refx-Group:VALUE
    +The name of the parent group of the entry must be VALUE.
  • +
  • -refx-GroupPath:VALUE
    +The full path of the parent group of the entry must be VALUE. +Use '/' as group separator in the path.
  • +
  • -refx-All
    +Matches all entries.
  • +
+ +

Use one or more of the following parameters to specify how the +entry should be edited:

+
    +
  • -set-FIELDNAME:FIELDVALUE
    +Sets the string field FIELDNAME of the entry to the value +FIELDVALUE.
  • +
  • -setx-Icon:ID
    +Set the icon of the entry to the standard icon having index ID.
  • +
  • -setx-CustomIcon:ID
    +Set the icon of the entry to the custom icon having index ID.
  • +
  • -setx-Expires:VALUE
    +Sets whether the entry expires or not. VALUE must be either +true or false.
  • +
  • -setx-ExpiryTime:VALUE
    +Sets the expiry date/time of the entry.
  • +
+ +

Usage examples:

+ +

KPScript -c:EditEntry "C:\KeePass\MyDb.kdbx" -pw:MyPw -ref-Title:"Existing +entry title" -set-UserName:"New user name"

+ +

KPScript -c:EditEntry "C:\KeePass\MyDb.kdbx" -pw:MyPw -ref-UserName:MyName +-set-UserName:NewName -set-Password:"Top Secret"

+ +

If you additionally pass -CreateBackup, KPScript will +first create backups of entries before modifying them.

+ +
+
+ +

Command: MoveEntry

+ +

This command moves one or more existing entries. The entry identification +syntax is exactly the same as in the EditEntry command.

+ +
    +
  • -GroupPath:PATH
    +The target group can be specified using the -GroupPath: +parameter. '/' must be used as separator +(e.g. -GroupPath:Internet/eMail moves the specified entries +to the subgroup 'eMail' of the subgroup 'Internet').
  • + +
  • -GroupName:NAME
    +The -GroupName: parameter can be used +(see the AddEntry command for details).
  • +
+ +
+
+ +

Command: DeleteEntry

+ +

This command deletes one or more existing entries. The entry identification +syntax is exactly the same as in the EditEntry command.

+ +
+
+ +

Command: DeleteAllEntries

+ +

This command deletes all entries (in all subgroups).

+ +
+
+ +

Command: Import

+ +

This command imports a file into the database.

+ +
    +
  • -Format:NAME
    +The format is specified by +setting the "-Format" parameter (see names in the +import dialog of KeePass).
  • + +
  • -File:PATH
    +The file to import to is specified using the +"-File" parameter.
  • + +
  • -MM:VALUE
    +If the format supports UUIDs, the behavior for groups/entries that exist +in both the current database and the import file can be specified using the +optional "-MM" parameter. Possible values are +"CreateNewUuids", +"KeepExisting", +"OverwriteExisting", +"OverwriteIfNewer", and +"Sync". +By default, new UUIDs are created.
  • + +
  • -imp_*:VALUE
    +For encrypted import files, by default the master key of the target database +is used. However, it is also possible to specify a different master key, +using the usual +master key command line parameters +with the prefix '-imp_' +(i.e. -imp_pw:, -imp_pw-enc:, -imp_keyfile:, +-imp_useraccount, -imp_keyprompt, +-imp_guikeyprompt).
  • +
+ +

Usage example:

+ +

KPScript -c:Import "C:\KeePass\MyDb.kdbx" -pw:MyPw -Format:"KeePass XML (2.x)" -File:SourceFile.xml

+ +
+
+ +

Command: Export

+ +

This command exports (parts of) the database.

+ +
    +
  • -Format:NAME
    +The format is specified by +setting the "-Format" parameter (see names in the +export dialog of KeePass).
  • + +
  • -OutFile:PATH
    +The file to export to is specified using the +"-OutFile" parameter.
  • + +
  • -GroupPath:PATH
    +If a specific group should be exported (instead of the whole database), +specify the group using the "-GroupPath" parameter (use '/' as separator).
  • + +
  • -XslFile:PATH
    +For the XSL transformation export module, the path of the XSL file +can be passed using the "-XslFile" parameter.
  • +
+ +

Usage example:

+ +

KPScript -c:Export "C:\KeePass\MyDb.kdbx" -pw:MyPw -Format:"KeePass XML (2.x)" -OutFile:TargetFile.xml

+ +
+
+ +

Command: Sync

+ +

This command synchronizes the database with another one. +The other database path has to be specified using the +"-File" command line parameter. Usage example:

+ +

KPScript -c:Sync -guikeyprompt "C:\Path\A.kdbx" -File:"C:\Path\B.kdbx"

+ +
+
+ +

Command: ChangeMasterKey

+ +

This command changes the master key of the database. +The new key values are specified using the standard +options prefixed with 'new', i.e. -newpw:, -newkeyfile: +and -newuseraccount (all are optional). Usage example:

+ +

KPScript -c:ChangeMasterKey "C:\KeePass\MyDb.kdbx" -pw:MyPw -newpw:MyNewPw

+ +
+
+ +

Command: DetachBins

+ +

This command saves all entry attachments (into the directory of the database) +and removes them from the database. + +Usage example:

+ +

KPScript -c:DetachBins -guikeyprompt "C:\KeePass\MyDb.kdbx"

+ +
+
+ +

Command: GenPw

+ +

Generates passwords.

+ +
    +
  • -count:NUMBER
    +The number of passwords can be specified using the +optional -count: parameter.
  • + +
  • -profile:NAME
    +A password generator profile can be specified using the optional +-profile: parameter +(the names of all available profiles can be found in the password generator +dialog).
  • +
+ +

Usage examples:

+ +

KPScript -c:GenPw
+Generates one password using the default generator profile.

+ +

KPScript -c:GenPw -count:5 -profile:"Hex Key - 128-Bit (built-in)"
+Generates five 128-bit hex passwords (when no translation is used).

+ +
+
+ +

Command: EstimateQuality

+ +

Estimates the quality (in bits) of the password specified via the +-text: parameter. +Usage example:

+ +

KPScript -c:EstimateQuality -text:MyTopSecretPassword

+ +
+ + +

+Console Character Encoding

+ +

If you observe garbled special characters in the output, please read the page +Console +Character Encoding.

+ + + diff --git a/src/Docs/Chm/images/back.gif b/src/Docs/Chm/images/back.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a864421800661e4ae51bada1831ffd949851456 GIT binary patch literal 263 zcmV+i0r>t$Nk%w1VL$;O0FeLy_xJbz|Nj6000000EC2ui06+mC06+-g00RgdNU)&6 zg9sBUT*$DY!-o(fN}NcsqQ#3CGiuz(v7^V2AVZ2ANwTELlPFWFT*)F0EQDQUd*_$({Vj%brcUw(Z-vbL-yCySMM( Nz=I1PPQ3WcfB?b~iKzep literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/images/osi_certified_72x60.gif b/src/Docs/Chm/images/osi_certified_72x60.gif new file mode 100644 index 0000000000000000000000000000000000000000..aacec250ddf4080a31a026d8d993433a005604cf GIT binary patch literal 2339 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 Jbx1$}06P?}=xP7} literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/screenshots/keepass_2x/gencsvimp.png b/src/Docs/Chm/screenshots/keepass_2x/gencsvimp.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe4dc679d2ce3fa3f113d22c94a4c88f0aafe45 GIT binary patch literal 28252 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%0D# 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 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/screenshots/windows_vista/comboboxform.png b/src/Docs/Chm/screenshots/windows_vista/comboboxform.png new file mode 100644 index 0000000000000000000000000000000000000000..6d49bdf3d908208e130fce12f8599c19ca2b09a7 GIT binary patch literal 6662 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 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/screenshots/windows_vista/readonlymode.png b/src/Docs/Chm/screenshots/windows_vista/readonlymode.png new file mode 100644 index 0000000000000000000000000000000000000000..652b629542db2db05637f751b276d77c6dabf809 GIT binary patch literal 30433 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

@ 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 literal 0 HcmV?d00001 diff --git a/src/Docs/Chm/screenshots/windows_vista/syncorsave.png b/src/Docs/Chm/screenshots/windows_vista/syncorsave.png new file mode 100644 index 0000000000000000000000000000000000000000..669d23c5642dee8b5ee9ca7e6caa30e5d2f647a8 GIT binary patch literal 37135 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

fz>LzU7qlWu#gZC0{SdYqtOV6 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 'Sort By' menu +- Added access keys in the entry templates menu +- Added access keys in the 'Perform Auto-Type' menu (which is + displayed if the 'Show additional auto-type menu commands' + option is turned on) +- Added {HMACOTP} and {TIMEOTP} in the 'Perform Auto-Type' menu +- Added keyboard shortcut Ctrl+T for the 'Copy Time-Based OTP' + entry data command +- Added keyboard shortcut Ctrl+Shift+T for the 'Show Time-Based + OTP' entry data command +- Enhanced Password Depot XML import module to support the new + format (added support for the new node names, group icons, + recycle bin, tags, favorites, auto-type delay conversion, + history, enhanced icon mapping, enhanced date/time parsing, + ...) +- Added border for headings in HTML exports/printouts +- Added support for running KeePass in FIPS mode + +- History entries listed on the 'History' tab page of the entry + dialog are now sorted from newest to oldest +- The icons in the list on the 'History' tab page of the entry + dialog now indicate the type of the entry +- History entry controls of the entry dialog are now disabled + when creating a new entry +- The history entry 'Restore' button is now disabled when any + change has been made in the current dialog +- The 'Password modified' time is now updated immediately when + deleting a history entry +- Improved URL override suggestion for Microsoft Edge in the + URL override suggestions drop-down list of the entry dialog + (changed from 'microsoft-edge:{URL}' to 'cmd://{EDGE} + "{URL}"') +- Improved optional built-in global URL overrides for opening + HTTP/HTTPS URLs with Microsoft Edge (changed from + 'microsoft-edge:{BASE}' to 'cmd://{EDGE} "{BASE}"') +- Reordered web browser URL overrides alphabetically +- Improved dynamic menu item access key assignment +- Improved item separation in the entry details view +- In most places, groups in a group path are now separated by + right arrows instead of hyphens +- Improved last modification time comparison for plugin data + dictionaries +- Unified generation of common HTML parts +- The 'Copy Initial Password' command in the 'Tools' menu of + the entry dialog now requires the 'Copy' application policy + flag +- Various UI text improvements +- Various code optimizations +- Minor other improvements + +- The history entry 'Restore' button now always works as + expected + +2022-09-09: 2.52 +- Added 'Copy Initial Password' command in the tools menu of + the entry dialog; it copies (to the clipboard) the password + that was current when the dialog was opened +- When multiple entries are selected (containing at least one + attachment), the number of attachments is now displayed in + the 'Attachments' submenu of the entry menu +- Added option 'Alt. item background color' (supporting the + states 'Off', 'On, default color' and 'On, custom color'); + this combines the previous two options 'Use alternating item + background colors' and 'Custom alt. item color' +- Comment placeholders ({C:...}) may now contain balanced + braces +- In the auto-type entry selection dialog, values in the + 'Sequence - Comments' column are dereferenced now +- The time when the password of an entry was last changed is + now displayed in the entry dialog on the 'History' tab page +- The {FIREFOX} placeholder and the 'URL(s)' menu ('Open with + ...' commands) now support detecting the Microsoft Store + version of Firefox (in addition to the regular versions) +- Added support for importing 1Password 8.7 1PUX files +- Added support for importing Key Folder 1.22 XML files +- Sticky Password XML import: added support for importing + groups and expiry dates +- Steganos Password Manager CSV import: added support for the + new encoding of double quotes +- Bitwarden JSON import: time-based one-time password generator + settings are converted automatically now +- KeePass now checks the 'KeePass.exe.config' file and shows a + warning message when finding a problem +- For development builds: added command for showing GC + information +- Plugins can now load the header of a database file more + easily +- Plugins can now subscribe to a master key change event +- TrlUtil: added workaround for .NET tab control focus bug + +- Moved the command 'Save Attached File(s) To' into the + 'Attachments' submenu of the entry menu and renamed it to + 'Save File(s) To' +- The command for saving attached files is now available only + if at least one of the selected entries has at least one + attachment +- The {APPACTIVATE ...} auto-type command now ignores the + options 'Cancel auto-type when the target window changes' and + 'Cancel auto-type when the target window title changes' +- {APPACTIVATE ...} auto-type command: if the specified window + does not exist or cannot be focused, auto-type is aborted now +- Unified creation of fields with indices +- Improved database modification state and UI updating after + imports/synchronizations +- In the master key creation/prompt dialogs, the [OK] button is + now disabled when checking the 'Key file/provider' check box + and selecting '(None)' in the combo box +- Improved drop-down menu width adjustment for certain combo + boxes in the options dialog +- Improved hashing performance of protected binaries, UUIDs, + ... +- Performance improvements related to empty arrays +- Improved Mono framework version detection +- TrlUtil: improved preview dialog update performance +- Various UI text improvements +- Various code optimizations +- Minor other improvements + +- Fixed a bug that caused a minimized main window to be + restored to a normal window instead of a maximized window in + certain situations +- The 'Help' menu item in the entry dialog and the 'Help' + button in the entry string field dialog now open the correct + help sections + +2022-05-09: 2.51.1 +- The option 'Use alternating item background colors' is now + compatible with automatic sorting again +- Improved entry list update performance when duplicating + entries +- Fixed an entry list scrolling bug +- Minor other improvements + +2022-05-06: 2.51 +- Most dialogs with fixed size now detect whether they fit onto + the current screen, and when a dialog does not fit (e.g. due + to a very high DPI factor), its size is reduced and scroll + bars are displayed +- Added plural entry command names in the main window (e.g. the + command for editing the currently selected entry/entries is + now called either 'Edit Entry' or 'Edit Entries', depending + on the number of selected entries) +- Added tooltip for the main part of the status bar of the main + window +- Enhanced color buttons (tooltips, accessible names, ...) in + the entry dialog, in the database settings dialog and in the + options dialog +- Added 'Interface (2)' tab page in the options dialog, renamed + the existing 'Interface' tab page to 'Interface (1)', moved + some controls from 'Interface (1)' to 'Interface (2)' +- Enhanced font selection controls (with a checkbox that allows + to return to the default, the button shows the currently + selected font, tooltip, improved accessibility, ...) in the + options dialog +- Added help links 'Dark theme' and 'Main font (size)' in the + options dialog +- The options 'Custom alt. item color' and 'Esc keypress in + main window' are now disabled if they are enforced (by an + enforced configuration file) +- Added support for opening URLs with Waterfox in private mode +- Added dialog for editing (HMAC-based and time-based) one-time + password generator settings (can be opened using the 'OTP + Generator Settings' commands in the entry dialog or in the + 'Edit Entry (Quick)' menu of the main window) +- Added entry commands 'Copy HMAC-Based OTP', 'Show HMAC-Based + OTP', 'Copy Time-Based OTP' and 'Show Time-Based OTP' (in the + 'Other Data' menu) +- Added entry commands 'Copy Title' and 'Copy Notes' (in the + 'Other Data' menu) +- When switching to the 'Generate' tab page of the password + generator dialog (no database open), the entropy collection + dialog is displayed now, if the option 'Show dialog for + collecting user input as additional entropy' is turned on +- Added option 'Colorize password characters' in the HTML + export/print dialog; the colors are customizable +- Added options 'Custom main font' and 'Custom password font' + in the HTML export/print dialog +- Added horizontal entry separator lines in tabular HTML + exports/printouts +- In the plugins dialog, the 'Delete old files from cache + automatically' option and the 'Clear' button are now disabled + if they are enforced (by an enforced configuration file) +- Plugins can now change the expiry date of an entry more + easily +- Added workaround for Wine bug 52457 + +- Improved main window initialization performance +- Improved initial emergence of a minimized or maximized main + window (less flickering, improved performance, ...) +- Improved names/tooltips of the database toolbar buttons in + the main window +- Improved handling of bold/italic list fonts +- Improved entry list update performance in certain situations +- Improved dynamic menu deconstruction performance +- Fields starting with 'HmacOtp-' or 'TimeOtp-' are not shown + in the entry string copy menu anymore +- Improved tooltips and accessibility of password repetition + text boxes +- When a dark theme is active, the error background color of + text boxes is darker now +- Improved accessibility of expiry control groups +- The title of the master key creation/change dialog is now + adjusted to the context +- Improved 'Compression' tab page of the database settings + dialog (extended 'None' option description, improved + accessibility, ...) +- If no color has been specified, the 'Custom alt. item color' + button in the options dialog now shows the default color +- Improved HTML generation for HTML exports/printouts +- Improved default fonts used when printing or exporting to + HTML +- In block HTML exports/printouts, field names are not italic + anymore (unless the user has selected an italic main font) +- In HTML exports/printouts, all field values except passwords + are trimmed now +- HTML exports/printouts: improved encoding of white-space + characters in passwords +- Improved horizontal entry separator lines in block HTML + exports/printouts +- TrlUtil: improved control classification +- Increased Authenticode certificate key length +- Various CHM/help improvements +- Upgraded installer +- Various UI text improvements +- Various code optimizations +- Minor other improvements + +- The command line parameter '-preselect:' now works as + expected when the option 'Clear master key command line + parameters after using them once' is turned on +- Font selections in the options dialog are now applied only + when closing the dialog with [OK] + +2022-01-09: 2.50 +- On most Windows systems, AES-KDF is now about twice as fast + as before +- On most Linux systems, AES-KDF is now about 4 times as fast + as before, if the 'libgcrypt' library is installed +- On most Windows systems, Argon2d and Argon2id are now about + twice as fast as before (for default parameters) +- On most Linux systems, Argon2d and Argon2id are now about 3 + times as fast as before (for default parameters), if the + 'libargon2' library is installed +- The option 'Enter master key on secure desktop' is now also + supported by master key prompt dialogs shown during imports, + confirmations (before exporting, printing, changing the + master key, ...) and trigger actions +- The option 'Enter master key on secure desktop' is now also + supported by master key creation/change dialogs +- The key file/provider combo boxes in the master key dialogs + now have a tooltip that shows the current value, if the value + is very long +- When running on .NET 4.7.2 or higher, GZip decompression is + faster now (i.e. most databases are opened a bit faster, + pasting entries from the clipboard is a bit faster, ...) +- Added password generation button in the entry string field + dialog +- When double-clicking the title cell of an entry in the main + entry list while holding down the Shift key, the title is now + copied to the clipboard +- Added support for opening URLs with Pale Moon, Epiphany and + Midori in private mode +- Enhanced application detection on Unix-like systems (support + for certain Snap packages, ...) +- Added support for detecting the latest versions of Chromium + on Unix-like systems (for 'Open with ...' commands in the + 'URL(s)' menu, for the {GOOGLECHROME} placeholder, ...) +- In the 'URL(s)' menu, there now are separate commands for + Google Chrome and Chromium, if both are installed +- Enhanced support for detecting Vivaldi, Brave, Pale Moon and + Epiphany +- Added support for importing Kaspersky Password Manager 9.0.2 + TXT files +- Bitwarden import module: added support for importing + subfolders, and collection names are now imported as tags +- In the 'About KeePass' dialog, each item in the components + list now has a tooltip that shows the file/folder path of the + component, if it is installed +- In the 'About KeePass' dialog, a double-click onto a + component now shows the component file/folder with the file + manager +- In the 'About KeePass' dialog, the components list now has a + context menu that provides the following new commands: 'Show + with File Manager', 'Copy Version/Status' and 'Copy Path' + +- If the option 'An entry matches if one of its tags is + contained in the target window title' is turned on, auto-type + now additionally considers tags inherited from groups +- The built-in password generation patterns 'Hex Key - *-Bit' + now use upper-case hexadecimal symbols +- Improved Spr variance check of the password generator (custom + string references, ...) +- All commands in the password generator menu (shown by the + password generator buttons in entry/string dialogs) support + the option 'Show dialog for collecting user input as + additional entropy' now +- Improved entropy collection dialog +- Improved control state updating in the master key prompt + dialog and in the master key creation/change dialog +- Improved key file existence check in the master key + creation/change dialog +- Improved master key construction +- Improved handling of exclusive key providers +- Improved compatibility of some dialogs with plugins that can + cancel closing the dialog +- Improved automatic entry selections in the main entry list +- Access key improvements +- Improved entry equality test in order to prevent the creation + of unnecessary history entries during certain operations +- XML Replace: improved entry modification detection +- Improved initial input focus in the single edit dialog +- In the import/export dialog, the icon of an import/export + module now matches the file/procedure type +- DataVault CSV import module: improved importing of notes +- Improved native buffer handling +- When opening/copying the URL of an entry, the last access + time of the entry is updated now +- TrlUtil: added DPI awareness mode declaration +- Various UI text improvements +- Various code optimizations +- Minor other improvements + +- Column header context menus are not shown for non-report list + views anymore +- When copying a URL to the clipboard fails, the main entry + list is updated now +- Toggling the password generator option 'Show dialog for + collecting user input as additional entropy' now causes a + switch to the '(Custom)' profile +- In the TAN wizard dialog, group names containing ampersands + are displayed correctly now + +2021-09-10: 2.49 +- Added dedicated context menu for custom string fields in the + entry dialog, which provides the following new commands: + 'Copy Name(s)', 'Copy Value(s)', 'Copy Item(s)', 'Paste + Item(s)', 'Select All' and 'Move To' +- Added button 'More' to the right of the custom string fields + list in the entry dialog, which shows the context menu +- Added dedicated context menu for auto-type associations in + the entry dialog, which provides the following new commands: + 'Copy Target Window(s)', 'Copy Sequence(s)', 'Copy Item(s)', + 'Paste Item(s)', 'Duplicate Item(s)' and 'Select All' +- Added button 'More' to the right of the auto-type + associations list in the entry dialog, which shows the + context menu +- Added optional 'Auto-Type - Enabled' main entry list column + (turned off by default, can be turned on in 'View' -> + 'Configure Columns') +- Added optional 'Auto-Type - Sequences' main entry list column + (turned off by default, can be turned on in 'View' -> + 'Configure Columns') +- Added support for importing Keeper 16.0.0 JSON files +- Added option 'Show confirmation dialog when opening a + database file whose minor format version is unknown' (in + 'Tools' -> 'Options' -> tab 'Interface', turned on by + default) +- Added tooltips for some controls +- Dialog banners can now be read by screen readers (if the + option 'Optimize for screen reader' is turned on) +- Added accessibility names for some controls (text boxes after + check boxes, image/color buttons, warning icons, ...; if the + option 'Optimize for screen reader' is turned on) +- Controls in the accessibility/automation control tree are now + ordered by their visual locations (if the option 'Optimize + for screen reader' is turned on) +- Added automatic screen reader detection based on the + operating system's screen reader parameter (this does not + make the option 'Optimize for screen reader' obsolete though, + because not all screen readers set the parameter) +- Various accessibility enhancements (when running on .NET + 4.7.1 or higher) +- Added UIFlags bit for not clearing the quick search terms + list when closing/locking a database +- Added UIFlags bit for enabling the Input Method Editor (IME) + on secure desktops +- Added customization option to override the URL that is opened + for a help page + +- In most list views, tooltips are now displayed for a longer + time +- The entry string move commands can now move multiple strings + at once +- Removed the entry string button 'Move' in the entry dialog + (the move commands are available in the context menu) +- Reordered fields/columns in the entry details view and in the + 'Configure Columns' dialog for improved consistency with the + entry dialog +- When running on .NET 4.7 or higher, rich text boxes now + instantiate Rich Edit 4.1 (or higher) controls, which support + various new features (e.g. Tamil characters are now displayed + correctly even when the 'Latha' font is not installed) +- Improved linkification in the entry details view of the main + window (URLs, attachments, ...) and in the internal data + viewer (URLs) +- URLs in the hex view of the internal data viewer are not + linkified anymore +- Improved tab order in various dialogs +- Improved accessibility control name provision +- Improved temporary file/directory deletion performance +- Improved hashing of protected binaries, UUIDs, popular + passwords, images, ... +- Improved quality of some icons +- In the HTML export/printing dialog, the option 'Group name' + is now disabled when group names are unavailable +- Reduced space between tables and group headings in HTML + exports/printouts +- In the help source selection dialog, controls are now + disabled if a help source is enforced (by an enforced + configuration file) or if a help URL override is specified +- Improved keyboard shortcut check +- TrlUtil: improved string table handling +- Various CHM file improvements +- Upgraded installer +- Various UI text improvements +- Various code optimizations +- Minor other improvements + +- The save confirmation dialog of the entry dialog does not + create unnecessary history entries anymore +- The tags button drop-down menu in the entry/group dialogs now + uses the correct font +- TrlUtil: fixed a string table association bug + +2021-05-10: 2.48.1 +- Improved compatibility with certain plugins/ports +- In the main entry list, new-line characters in text inserted + by a placeholder are now filtered +- Minor other improvements + +2021-05-07: 2.48 +- New KDBX 4.1 file format, which supports various new features + (listed below) +- Added support for group tags (KDBX 4.1) +- In the entry/group dialogs, there now is a button to show a + menu for adding/removing existing tags +- If an entry/group inherits a tag from a parent group, a link + is displayed in the entry/group dialog to show the parent + groups and their tags +- Added option in the entry dialog for disabling/enabling the + password quality estimation for the current entry (KDBX 4.1) +- If the password quality estimation is disabled for an entry, + the entry is now excluded from password quality reports (menu + 'Find' -> 'Password Quality') +- When moving an entry/group into a different group (e.g. into + the recycle bin), the previous parent group is remembered now + (KDBX 4.1, not enforcing) +- Added command 'Move to Previous Parent Group' (in the + 'Rearrange' popup menu; if the command will move all selected + entries/groups out of the recycle bin, a '(Restore)' suffix + is appended to the command name; if at least one entry/group + will be moved into/within the recycle bin, a confirmation + dialog is displayed) +- Renaming a list view item (if supported, e.g. a file attached + to an entry) can now be initiated by pressing the F2 key +- Each custom icon may now have a name, and its last + modification time is remembered (KDBX 4.1) +- In the icon picker dialog, a custom icon can now be renamed + (click on an already selected name or press the F2 key) +- In the icon picker dialog, the dimensions and the size of a + custom icon are now displayed in a tooltip +- The UUID and the deletion time of a deleted custom icon are + remembered now, and this information is used in order to + delete the custom icon during a synchronization (if the last + modification time is older than the deletion time) +- Added built-in URL override for associating the 'ssh' URL + scheme with 'SSH.exe' (OpenSSH, included in Windows 10; + activatable/deactivatable in 'Tools' -> 'Options' -> tab + 'Integration' -> button 'URL Overrides') +- Added support for loading images with Exif orientation tags +- Enhanced the LastPass import module to support CSV files + created by the latest versions +- Enhanced the nPassword import module to import group tags +- The last modification time of a database-specific custom data + item (by a plugin/port) is now saved (KDBX 4.1) +- When synchronizing databases, database-specific custom data + items (by plugins/ports) are now merged based on their last + modification times +- Added support for loading KDBX 4 files created by other + applications that do not perform a binary content + deduplication +- Added workaround for .NET/Windows TopMost/WS_EX_TOPMOST + desynchronization bug + +- Various user interface improvements in the group dialog + (moved the notes box to the first tab page, moved the auto- + type behavior option to the auto-type tab, ...) +- Tags are sorted naturally now +- Improved tag handling performance +- Various user interface improvements in the icon picker dialog +- The temporary icon that represents multiple icons (when + editing multiple entries at once) is now named '(Multiple + values)' +- Improved custom icon handling performance +- The placeholders {HMACOTP} and {TIMEOTP} now automatically + add padding to shared secrets in Base32 encoding, if + necessary +- Improved error handling of the placeholders {HMACOTP} and + {TIMEOTP} +- Internal data viewer/editor: '*.asc', '*.tab' and '*.tsv' + files are now treated as text files by default +- The internal data viewer now does not try to display non-HTML + files using the web browser control anymore +- Improved error handling of the Bitwarden JSON and nPassword + NPW import modules +- Improved merging of custom data items (by plugins/ports) in + the KDBX file header +- Improved image hashing +- Improved version display in the 'About' dialog +- Installer: improved file overwriting +- On 64-bit operating systems, the registry value for the setup + option 'Optimize KeePass start-up performance' is now created + in the 64-bit view of the registry +- ShInstUtil now fully supports Unicode +- Various UI text improvements +- Various code optimizations +- Minor other improvements + +- The command 'Delete Unused Custom Icons' does not delete + icons anymore that are still used by history entries + +2021-01-09: 2.47 +- In the 'Find' dialog, search parameters can now be saved as + profiles; the profiles can be accessed quickly via the main + menu ('Find' -> 'Search Profiles') and the group context menu +- Added search mode 'XPath expression' in the 'Find' dialog, + which creates a KeePass 2.x XML DOM of the current database + in memory and finds entries using the specified XPath + expression +- Added option 'History' in the 'Find' dialog, which includes + history entries in searches +- Added 'Help' button in the 'Find' dialog +- Added auto-type matching option 'Consider similar dashes as + identical' (in 'Tools' -> 'Options' -> tab 'Advanced', turned + on by default) +- Added commands 'Copy Group (Encrypted)', 'Copy Group + (Unencrypted)' and 'Paste Group' (in the menu 'Group' -> + 'Data Exchange') +- When loading/saving a configuration file fails, an error + message is displayed now, and in certain cases a backup of + the configuration file is created (the path is mentioned in + the error message) +- Added configuration option for saving the configuration + (turned on by default) +- On the 'Security' tab page of the options dialog, two links + have been added, which open help pages for experts and + administrators +- Added {TIMEOTP} placeholder, which generates a time-based + one-time password (as specified in RFC 6238) +- Enhanced XML key file format (added hash that allows to + verify the integrity of the key; values are now encoded using + hexadecimal characters in order to improve the readability) +- Added command 'Print Key File Backup' (in 'File' -> 'Print') +- In the dialog that asks whether to print an emergency sheet, + there is now an option 'Also print a key file backup' (on + Windows), if the master key contains a key file +- Added command 'Create Key File' (in 'Tools' -> 'Advanced + Tools'), which shows a dialog for creating a new key file + (random key) or for recreating a key file from a printed + backup +- Added Argon2id key derivation function +- Added support for importing Dashlane 6.2039.0 JSON files +- Dashlane and RoboForm import: domains are now mapped to HTTPS + URLs (instead of HTTP URLs) +- Added option 'Use a different master key' in the + import/export dialog (tab page 'Options') +- Added option 'Additionally export parent groups' in the + import/export dialog (tab page 'Options') +- Added options 'Open exported file (with associated + application)' and 'Show exported file (with file manager)' in + the import/export dialog (tab page 'Options') +- The 'About' dialog now shows whether KeePass is currently + running as 32- or 64-bit application +- Plugins can now disable/enable specific Mono workarounds +- Added workaround for Mono URL opening bug +- Added workaround for Mono HTML document opening bug + +- Improved performance of certain searches +- Various user interface improvements in the search dialog +- Improved keyboard shortcut handling (e.g. Ctrl+Tab and Ctrl+ + Shift+Tab now also work when the quick search box is focused) +- The local configuration file is now loaded only if necessary +- Improved performance of configuration saving +- Changed default key file extension from 'key' to 'keyx' +- Most key file dialogs now only show '*.keyx' and '*.key' + files by default +- When clicking the key file 'Browse' button in the master key + creation dialog and selecting a file that is not an XML key + file, KeePass now asks whether to use the file as key file + anyway +- Improved key file loading/saving error messages +- Various user interface improvements in the import/export + dialog +- The import/export dialog does not accept relative file paths + anymore +- The import/export dialog now shows an error message when + trying to export to multiple files +- Removed indeterminate progress indicators while displaying + the import/export dialog +- Improved field to standard field mapping function +- Moved command 'Empty Recycle Bin' directly below the 'Delete + Group' command +- Moved commands 'Print Group' and 'Export Group' into the + 'Data Exchange' popup menu +- Improved quality of some icons +- Improved dialog banner caching +- Improved performance of certain object collection operations +- History entry UUIDs are now fixed automatically +- Increased default value of Argon2 memory parameter +- Improved task dialog parent determination +- The setup program now installs KeePass into a folder in + 'C:\Program Files' by default (i.e. without '(x86)' suffix; + this is reasonable, because on a 64-bit operating system, + KeePass runs as 64-bit application) +- Upgraded installer +- Various UI text improvements +- Various code optimizations +- Minor other improvements + +- Search: regular expressions starting with a '-' are not + treated as exclusions anymore +- Fixed a bug that caused KeePass to hang when trying to read a + configuration file that contains certain unsupported nodes + +2020-09-10: 2.46 +- The entry editing dialog can now edit all currently selected + entries at once +- As entry attachment icons, the icons associated with the + respective file types (in the system settings) are used now +- When running on .NET 4.8 or higher, secure connections (e.g. + for WebDAV) now support TLS 1.3 +- Added keyboard shortcut Ctrl+* (numeric keypad) for the + 'Expand Recursively' group command +- Added keyboard shortcut Ctrl+/ (numeric keypad) for the + 'Collapse Recursively' group command +- Right-clicking on the header of the main entry list now shows + the 'Configure Columns' command +- The {VKEY ...} command now supports some flags (for + specifying whether to send a key down or up event only and/or + whether to send an extended key) +- Added configuration option for protecting KeePass windows + against certain screen capture operations +- Added command line parameter '-wa-enable:' for enabling + specific Mono workarounds +- On Unix-like systems with a Wayland compositor, KeePass (with + the KPUInput plugin) can now auto-type the default sequence + and manually selected sequences of the currently selected + entry + +- Improved quality of the icons in the entry 'URL(s)' menu +- Improved quality of the icons in the drop-down list of the + 'Override URL' field in the entry editing dialog +- Improved control state updating in the entry editing dialog +- The file selection dialog for the Generic CSV Importer now + shows only CSV, TSV, TAB, TXT and ASC files by default +- Improved user interface of the Generic CSV Importer +- For large texts containing probably invalid characters, the + internal data viewer now shortens the text and provides a + 'Show more' link for expanding the text; this ensures a + responsive user interface in this case +- Improved caching of dialog banners +- Moved the help source selection from the 'Help' main menu to + the options dialog (tab 'Integration') +- If the application policy option 'Export - No Key Repeat' is + turned off, the master key must now be entered directly + before the export is performed, i.e. after choosing the + format and the target +- The application policy option 'Export - No Key Repeat' now + also applies to the trigger action 'Export active database' +- When running on Mono, the options 'Focus quick search box + when restoring from taskbar' and 'Focus quick search box when + restoring from tray' are disabled now (because they do not + work reliably due to a bug in Mono) +- Various code optimizations +- Minor other improvements + +- The attachment button drop-down menus in the entry editing + dialog now use the correct font +- The 'Tools' button in the entry editing dialog is not + disabled for TAN entries anymore + +2020-05-07: 2.45 +- Added support for opening URLs with the new (Chromium-based) + Microsoft Edge in private mode +- Added support for opening URLs with Vivaldi in private mode +- Added automatic assignment of mnemonics for 'Open with ...' + commands in the 'URL(s)' menu +- The entry templates menu now supports showing templates that + are stored in subgroups of the templates group; each subgroup + is displayed as a submenu +- When adding a new entry based on a template that has an empty + user name, the user name is now set to the default user name + of the database, unless the new entry is stored in the + templates group +- When adding a new entry based on a template that has an empty + password, a random password is generated now (based on the + password generator profile 'Automatically generated passwords + for new entries'), unless the new entry is stored in the + templates group +- When adding a new entry based on a template that does not + expire, the expiry date is now set based on the option 'By + default, new entries expire in the following number of days' + (in 'Tools' -> 'Options' -> tab 'Security'), unless the new + entry is stored in the templates group +- New icon recoloring (with high DPI support, by deconstructing + an ICO, modifying BMP palettes and data, and assembling a new + ICO); there are 24 database colors now +- Added {UUID} placeholder, which is replaced by the UUID of + the current entry +- The UUID of a group is now displayed in the group editing + dialog (tab 'General') +- When specifying a weak master password in the master key + creation dialog, KeePass now shows a warning +- Triggers: added string comparison mode 'Matches regular + expression' +- Enforced configuration: added support for attributes that + allow to specify the desired merge behavior +- Enforced configuration: for most lists, node keys are now + used to find corresponding list items +- Plugins: added I/O connection event for customizing web + requests +- Added workaround for Mono pre-authenticated anonymous web + request bug + +- Auto-Type: improved compatibility with VMware Horizon Client + and Kaseya Live Connect +- Enhanced detection of Microsoft Edge +- The 'Open with ...' commands in the 'URL(s)' menu are sorted + now +- Improved performance of the entry templates menu; removed + limitation to 30 templates +- Database descriptions are now displayed in file tab tooltips +- When editing an attachment directly from the main window, a + history entry is created now +- UUIDs in the group and entry editing dialogs are now + displayed both in hexadecimal and base 64 form +- Improved Bitwarden import module to support JSON files + without groups +- If the trigger system is disabled using an enforced + configuration file, most controls in the triggers dialog are + disabled now, too +- Plugins: an I/O access event is now raised when checking the + existence of a local database file +- In texts that are about to be displayed in a rich text box, + U+FFFC characters are now replaced by question marks (in + order to avoid the text being cut off at this point) +- When running on Mono 5.10 or higher, a monospaced font is + used in password text boxes by default again, as the Mono bug + 5795 has been fixed +- Various code optimizations +- Minor other improvements + +- Fixed a default value type problem in the hot key + configuration settings +- Database file tab colors are now rounded to the nearest + supported colors + +2020-01-20: 2.44 +- Added option 'Use file transactions for writing configuration + settings' (turned on by default) +- If the option 'Do not store data in the Windows clipboard + history and the cloud clipboard' is turned on (which it is by + default), KeePass now additionally excludes its clipboard + contents from processing by Windows' internal + ClipboardMonitor component +- Added commands to find database files ('File' -> 'Open' -> + 'Find Files' and 'Find Files (In Folder)') +- Added 'Edit' menu in the internal text editor (including new + 'Select All' and 'Find' commands with keyboard shortcuts) +- Added keyboard shortcuts for formatting commands in the + internal text editor +- Added 'Cancel' button in the save confirmation dialog of the + internal text editor +- Added {CLIPBOARD} and {CLIPBOARD-SET:/T/} placeholders, which + get/set the clipboard content +- Added support for importing True Key 4 CSV files +- Added command line options for adding/removing scheme- + specific URL overrides +- Added an auto-type event for plugins +- When loading a plugin on a Unix-like system fails, the error + message now includes a hint that the 'mono-complete' package + may be required +- In order to avoid a Windows Input Method Editor (IME) bug + (resulting in a black screen and/or an IME/CTF process with + high CPU usage), KeePass now disables the IME on secure + desktops + +- Auto-Type: improved compatibility with VMware Workstation +- Auto-Type into virtual machines: improved compatibility with + certain guest systems +- The option to use the 'Clipboard Viewer Ignore' clipboard + format is now turned on by default +- Improved menu/toolbar item state updating in the internal + text editor +- Improved performance of Spr compilations +- Before writing a local configuration file whose path has been + specified using the '-cfg-local:' command line parameter, + KeePass now tries to create the parent directory, if it does + not exist yet +- Improved conversion of file URIs to local file paths +- Improved compatibility of the list view dialog with plugins +- If ChaCha20 is selected as file encryption algorithm, the + database is now saved in the KDBX 4 format (thanks to + AMOSSYS) +- Minor process memory protection improvements +- HTML export/printing: KeePass now generates HTML 5 documents + (instead of XHTML 1.0 documents) +- HTML export/printing: improved internal CSS +- HTML exports do not contain temporary content identifiers + anymore +- XSL files: HTML output now conforms to HTML 5 instead of + XHTML 1.0 +- XSL files: improved internal CSS +- CHM pages are now rendered in the highest standards mode + supported by Internet Explorer (EdgeHTML mode) +- Migrated most of the documentation from XHTML 1.0 to HTML 5 +- Various code optimizations +- Minor other improvements + +- In the internal text editor, the 'Delete' command does not + reset RTF text formattings anymore +- The KeyCreationFlags bit 2^19 (for hiding the passwords) now + works as intended + +2019-09-10: 2.43 +- Added tooltips for certain character set options in the + password generator dialog +- Added option 'Remember password hiding setting in the main + window' (in 'Tools' -> 'Options' -> tab 'Advanced'; the + option is turned on by default) +- Added yellow intermediate step in password quality progress + bars +- When the URL override field in the entry editing dialog is + not empty, but the URL field is empty, a warning is displayed + now +- When an explicit request to generate a password fails (for + instance due to an invalid pattern), an error message is + displayed now +- Added trigger events 'Synchronizing database file' and + 'Synchronized database file' +- Enhanced the Password Agent import module to support XML + files created by version 3 +- The 'MasterKeyExpiryRec' configuration setting can now also + be set to an XSD duration instead of an XSD date (for + periodic master key change recommendations) +- KeePass now excludes itself from Windows Error Reporting +- On Unix-like systems, file transactions now preserve the Unix + file access permissions, the user ID and the group ID +- Added workaround for .NET initial focus bug + +- Auto-Type: improved sending of modifier keys +- Auto-Type: improved sending of characters that are realized + with Ctrl+Alt/AltGr +- Auto-Type: improved compatibility with VMware Remote Console + and Dameware Mini Remote Control +- Improved main window state handling +- Improved construction and updates of the main menu and the + group/entry context menus +- Main menu items can now be deselected by pressing the Esc key +- Top-level nodes in tree views cannot be collapsed anymore if + no root lines are displayed +- New entries in a group with the e-mail folder icon now have + the e-mail icon by default +- Improved performance of automatic scrolling in the main entry + list +- If user names are hidden in the main window, no user name + suggestions are displayed in the entry editing dialog anymore +- Function keys without modifiers can be registered as system- + wide hot keys now +- For file rename/move web requests, a canonical representation + of the destination name/path is used now +- URL override base placeholders can now be used within + {CMD:...} placeholders +- Directly after an import, the deleted object information is + now applied/removed (depending on the last modification time + and the deletion time) +- Improved compatibility of the 'Delete Duplicate Entries' + command with the process memory protection +- Improved handling of command lines containing quotes or + backslashes +- Various UI text improvements +- Various code optimizations +- Minor other improvements + +2019-05-04: 2.42.1 +- Improved menu item state updating +- Improved backward compatibility with certain plugins +- Minor other improvements + +2019-05-01: 2.42 +- Added main menu items 'Group', 'Entry' and 'Find', which + contain all commands related to groups and entries (supersets + of context menus); removed 'Edit' main menu item, because all + of its commands are included in the three new main menu items +- Added support for a system-wide hot key to auto-type only the + password of a matching entry; by default, the hot key is + Ctrl+Alt+Shift+A, changeable in the options dialog +- When double-clicking the URL cell of an entry in the main + entry list while holding down the Shift key, KeePass now + copies the URL to the clipboard (a double-click without Shift + continues to open the URL; the option 'Copy URLs to clipboard + instead of opening them' reverses this behavior) +- Added quick edit commands 'Expires: Now' and 'Expires: Never' +- There now are two commands for copying a whole entry to the + clipboard: 'Copy Entry (Encrypted)' and 'Copy Entry + (Unencrypted)'; the first one encrypts the data for the + current user using the Windows DPAPI +- Added Ctrl+Shift+P shortcut for printing the currently + selected group +- The creation time and the last modification time of an entry + are now displayed on the 'History' tab of the entry editing + dialog +- Added support for importing Steganos Password Manager 20 CSV + files +- Added support for importing Bitwarden 1.12 JSON files +- Mozilla Bookmarks JSON import: added support for importing + tags (new format, in addition to the old format) and keywords +- Enhanced the Enpass import module to support TXT files + created by version 6.0.4 +- The language selection dialog now also lists KeePass 1.x LNG + files; when trying to select such a file, an informative + error message is displayed +- Added 'Cancel' command in the context menu of KeePass' system + tray icon, which can be used to abort opening and saving a + database file +- Added '-cancel' command line option, which causes all other + KeePass instances to cancel opening/saving a database file +- Added '-auto-type-password' command line option (other + running KeePass instances auto-type only the password of a + matching entry) +- Added '-e1:' command line parameter, which works like '-e:', + but is handled by only one other instance; '-e:' is handled + by all other instances +- When compiling a PLGX plugin, KeePass now defines a + 'KP_V_*_*_*' symbol, where the asterisks specify the KeePass + version (for example, 'KP_V_2_42_0' for version 2.42) +- Added workarounds for .NET Caps Lock warning tooltip bug +- Added workaround for Mono grid view default color bug +- Added workaround for OneDrive bug on Windows 1809 + +- Auto-Type: improved sending of characters that are realized + with the AltGr key +- Auto-Type: improved compatibility with VirtualBox 6 and + VMware Player +- Improved user interface behavior while opening a database + file +- Accelerator key improvements +- Replaced 4 and 8 weeks expiry date search commands by 1 and 2 + months (taking the number of days in the months into account) +- Improved hot key controls (better key combination handling + and display) +- The hot key controls in the options dialog now support + entering hot keys that are already registered by KeePass +- Improved field to standard field mapping function +- Improved new-line handling of several import modules +- When a file import fails, KeePass now shows a more detailed + error message +- After changing the color of an entry using a quick edit + command, the entries are deselected now, such that the new + color is visible immediately +- Moved 'Print Emergency Sheet' command into 'File' -> 'Print' +- The pattern-based password generator now supports repeating + escaped characters using '{...}' +- The pattern-based password generator now refuses to generate + a password if the pattern is (partially) invalid +- Turning off the 'Unhide Passwords' policy now enforces hiding + passwords in a few more places/situations +- New-line characters at the end of the output of a {CMD:...} + placeholder are now removed (analogous to $(...) and `...` + shell command substitutions) +- The {URL:SCM} and {BASE:SCM} placeholders now work with + arbitrary data having a ':'-terminated prefix +- Improved {URL:RMVSCM} and {BASE:RMVSCM} placeholders ('//' + authority prefix is removed, but not '/') +- The '-entry-url-open' command line option is now handled by + all other KeePass instances (instead of only one) +- Path traversal with attachment names is not possible anymore +- Removed the option 'Show tray icon only if main window has + been sent to tray' from the options dialog (due to possible + denial-of-service problems); if you want to hide the icon, it + is recommended to configure this in the system settings + instead +- Improved reading of KDBX XML documents with unknown elements +- Improved JSON parser +- Various UI text improvements +- Various code optimizations +- Minor other improvements + +- Fixed a crash that could occur when trying to import certain + Mozilla Bookmarks JSON files +- Fixed a crash that could occur when trying to import certain + files with very deeply nested groups +- Fixed handling of paths with folder/file names containing + quotes (which can occur on Unix-like systems only) + +2019-01-09: 2.41 +- Added option 'Do not store data in the Windows clipboard + history and the cloud clipboard' (the option is turned on by + default; for entry clipboard commands in the main window) +- Added option 'Esc keypress in main window' (in 'Tools' -> + 'Options' -> tab 'Interface'), which allows to specify the + action of the Esc key (ignore, lock workspace, minimize, + minimize to tray, exit) +- Added option 'Ignore search settings of groups' in the 'Find' + dialog +- Internal data viewer: added support for zooming images using + the OEM + and - keys with Ctrl +- Added accelerator keys (especially for labels) in various + dialogs +- Added UIFlags bit for disabling the 'Database Settings' menu + item +- Added workarounds for Windows RTF character encoding bug +- Added workaround for Mono input focus restoration problem + that occurs when a form gets activated +- Plugins: added method to provide menu items +- Plugins: added property to get the edit mode of an entry + dialog +- TrlUtil: added tab 'Validation', which shows the results of + all checks that TrlUtil performs +- TrlUtil: the tab in the preview form that contains the + currently selected control is now selected automatically +- TrlUtil: the preview form now shows accelerator keys + permanently +- TrlUtil: enhanced support for derived control classes +- TrlUtil: the current file name is now displayed in the title + bar +- Enhanced installer (added user directory checks, added option + to open the plugins web page, component/option names can be + translated now, updated NGen size estimation, improved file + associations update, ...) + +- In order to avoid selection/Ctrl+A problems, the user name + auto-completion now does not append suggestions anymore; it + only shows a list of suggestions (in which a suggestion can + be selected manually) +- Improved accelerator keys in the 'Find' dialog +- The history list in the entry dialog now supports showing + custom icons +- Mass entry modifications (colors/icons) now create history + entries, if necessary +- Improved text rendering in dialog banners +- In the database settings dialog, the path of the database + file is now shown in the dialog banner +- Improved selection/view preservation of the entry view +- While importing/synchronizing, a status dialog is displayed + now if and only if the main window is not constructed + completely yet (otherwise the status is displayed in the main + window) +- Improved reliability of clipboard operations +- Improved error reporting for the 'Paste Entries' command +- Renamed the automatic clipboard clearing option and added a + tooltip in order to clarify the behavior of the option +- The commands 'Find Similar Passwords (Pairs)', 'Find Similar + Passwords (Clusters)' and 'Password Quality Report' now + ignore TAN entries +- The report of clusters of similar passwords now shows more + clusters in certain cases +- In the 'Plugins' dialog, the plugins are now sorted + alphabetically +- KeePass does not try to load satellite assemblies as plugins + anymore +- Improved configuration saving when an enforced configuration + file exists, but no global one +- Improved reading of KDBX XML documents with unknown elements +- The export module 'Customizable HTML File' now works fine on + Unix-like systems, too +- On Unix-like systems: improved support for executing KeePass + while no X server is running +- ShInstUtil: improved NGen detection on 64-bit systems +- TrlUtil: the preview form does not steal the input focus + anymore +- TrlUtil: improved accelerator key check +- Various code optimizations +- Minor other improvements + +- Fixed a bug that caused KeePass to crash when trying to view + certain password generator profiles +- The option 'Use monospace font for passwords' in the 'Print' + / HTML export dialog now works for all translations + +2018-09-10: 2.40 +- Added automatic completion support for the user name box in + the entry editing dialog and the auto-type sequence boxes in + the entry/group editing dialogs (suggesting user names and + auto-type sequences that are used in other entries/groups) +- Added automatic completion support for the URL and user name + boxes in the 'Open From URL' dialog (suggesting URLs and user + names of items in the list of most recently used database + files) +- Added option 'Group path' in the 'Find' dialog (enabled by + default for quick searches) +- Added read-only mode for the entry string dialog, which is + used by the entry dialog when viewing a history entry +- The internal data viewer now supports zooming images using + Ctrl+Add, Ctrl+Subtract and the mouse wheel with Ctrl; + furthermore, there are now '+' and '-' buttons right of the + zoom selection box in the toolbar +- Added option 'Remember master password (in encrypted form) of + a database while it is open' (which is the default; turning + off this option prevents the usage of certain features) +- Enhanced compatibility check for DLL plugins +- Added URL opening event for plugins +- On Unix-like systems: added support for opening the local + help file with KChmViewer +- Added workaround for initial input focus problem in the + master key prompt dialog +- Added workaround for Mono not always raising the FormClosed + event properly +- TrlUtil now remembers the last translation file directory + +- The 'Configure Columns' dialog now computes a display order + for the new columns, taking the previous display order into + account +- While importing/synchronizing, no status dialog is displayed + anymore (the status is displayed in the main window) +- Improved UI responsiveness during long operations +- When hiding/restoring the main window via the system tray + icon fails, KeePass now shows a notification +- Improved Return key handling in text boxes +- Improved initial input focus in some dialogs +- Enhanced database file path unification +- The configuration system does not create a KeePass folder in + the user's application data folder anymore when the target + configuration file location is outside this folder +- Improved window text query method +- Improved Unicode environment detection +- Various improvements for right-to-left writing systems +- Improved support for case-sensitive command line parameter + names (for plugins and KPScript) +- If a plugin is available both as a DLL and as a PLGX (in the + same folder), KeePass now loads either the DLL or the PLGX +- For plugins: most public definitions are now static +- KPScript: improved parsing of escape sequences +- Renamed native support library item in the installer +- Upgraded installer +- Various code optimizations +- Minor other improvements + +2018-05-12: 2.39.1 +- File transactions: improved access control list (ACL) + restoration +- File transactions are not used anymore when attempting to + write to a local file that does not exist yet (to ensure a + correct default ACL) +- The option to minimize the main window after performing + auto-type is now ignored while displaying a subdialog +- Plugins can now implement classes derived from KeePass' + custom rich text boxes + +2018-05-06: 2.39 +- KeePass now uses Transactional NTFS (TxF) for writing + database and configuration files, if possible; this improves + the compatibility with other programs that are watching these + files (e.g. file synchronization services) +- Added command 'Edit' -> 'Show Entries' -> 'Large Entries' +- Added command 'Edit' -> 'Show Entries' -> 'Last Modified + Entries' +- Added option 'Automatically save after modifying an entry + using the entry editing dialog' (turned off by default) +- Added option 'Minimize main window after performing + auto-type' (turned off by default) +- Added option 'Show lines between nodes in tree views' (turned + off by default) +- Added support for importing Google Chrome 66 password CSV + files +- Added trigger event 'Time - Periodic', which is raised at + user-defined intervals +- Links in the entry string editing dialog are clickable now +- Added UIFlags bit for disabling the 'XML Replace' menu item +- Added UIFlags bit for hiding auto-type obfuscation + compatibility information dialogs +- Added workaround for .NET 'urtf' RTF round-trip bug +- Secure edit controls are now extensible by plugins +- KPScript: the 'AddEntry' command now supports the + '-setx-Expires' and '-setx-ExpiryTime' parameters + +- In printouts and HTML exports, expired entries now have a red + 'X' icon (if the option 'Icon' is turned on) +- Improved string normalization in the entry and string editing + dialogs +- Improved and optimized process memory protection, especially + in the entry editing dialog +- Secure edit control improvements +- Improved behavior when moving a custom string to a standard + field +- Improved entry size calculation +- URL overrides are now used also for application URLs +- Improved input focus restoration +- When trying to toggle the auto-start option and + creating/deleting the registry value fails, KeePass now shows + a detailed error message +- Improved XML serialization +- Stream disposal improvements in exceptional situations +- Process object disposal improvements +- Extended inter-process communication (IPC) messages are + compressed and encrypted now +- New IPC mechanism on Unix-like systems +- Enhanced desktop type detection on Unix-like systems +- On the Cinnamon desktop, the 'Always on Top' option is now + disabled (because it is not supported properly by the + environment) +- KeePass now ignores hidden Git and Visual Studio directories + when building a PLGX file +- The trigger system now ignores state-changing placeholders in + most places +- Removed trigger event 'User interface state updated' + (consider using the new event 'Time - Periodic' instead) +- Various code optimizations +- Minor other improvements + +- The 'View' button on the 'History' tab of the entry editing + dialog is now disabled when multiple items are selected +- The main window state is now updated after closing an entry + report dialog + +2018-01-09: 2.38 +- The installers (regular and MSI) now create an empty + 'Languages' folder in the application directory, and the + portable package now also contains such a folder; language + files should now be stored in this folder +- Added button 'Open Folder' in the language selection dialog, + which opens the 'Languages' folder +- Added button 'Open Folder' in the plugins dialog, which opens + the 'Plugins' folder +- Added a runtime activation policy setting (to improve + compatibility with Microsoft User Experience Virtualization) +- Added option 'Icon' and an option for specifying the + placeholder behavior (replace or not, or both forms) in the + 'Print' / HTML export dialog +- Printing / HTML export: the notes of a group are now + displayed below the group name +- Enhanced the Password Exporter import module to support XML + files created by version 1.3.4 +- Added workaround for Microsoft Office breaking the 'Print' + shell verb for HTML files +- Added workaround for Mono list view item deletion bug +- Added workaround for Mono command line argument encoding bug +- KPScript: the 'AddEntry' and 'EditEntry' commands now support + the '-setx-Icon' and '-setx-CustomIcon' parameters, which set + the icon of the entry +- KPScript: the 'ChangeMasterKey' command now supports the + '-newpw-enc' parameter (for specifying the new master + password in encrypted form, compatible with the + {PASSWORD_ENC} placeholder) +- KPScript: the 'ListEntries' command now supports all '-ref-*' + and '-refx-*' parameters + +- Password quality estimation: improved compatibility with + process memory protection +- Improved UI scaling when using KeePass on multiple systems + with different DPI values +- Printing / HTML export: improved embedding of CSS +- Printing / HTML export: spaces in passwords are now encoded + as non-breaking spaces +- Improved UI updating in the 'Print' / HTML export dialog +- Enhanced KDE system font detection +- Improved fatal error handling +- Various improvements in the language selection dialog +- KPScript: improved behavior of '-ref-*' parameters when + combined with the '-refx-All' option +- Various code optimizations +- Minor other improvements + +- Fixed HTML generation bug: when the option 'Use monospace + font for passwords' was turned off, a generated HTML file in + 'Details' mode could contain invalid end tags + +2017-10-12: 2.37 +- When creating a new database, KeePass now offers to print a + KeePass emergency sheet (which can then be filled out and + stored in a secure location, where only the user and possibly + a few other people that the user trusts have access to); an + emergency sheet can also be created via 'Tools' -> 'Database + Tools' -> 'Print Emergency Sheet' +- Added database file information dialog that is displayed when + creating a new database +- Added function to search similar password clusters ('Edit' -> + 'Show Entries' -> 'Find Similar Passwords (Clusters)') +- On Unix-like systems: if the library 'libgcrypt.so.20' is + available, KeePass uses it for AES-KDF transformations +- Enhanced PrepMonoDev.sh script to upgrade a DTD processing + definition +- Added workaround for .NET/Windows column header drawing bug + when switching to TAN-only entry list mode +- Added workaround for Mono tab switching bug +- Added workaround for Mono '}' character RTF encoding bug +- TrlUtil: added support for .NET 4.* + +- Improved dialog for changing the master key (key file and + user account are now expert options, added more information + and links to help page sections) +- KeePass now directly offers to save the database after + changing the master key, and it asks whether to print a new + emergency sheet +- Various improvements in the translation selection dialog (the + selected translation can now be activated by pressing Return, + the list view now uses the Explorer style, ...) +- KeePass now refuses to attach files that are larger than 512 + MB (as larger files can result in serialization problems) +- Increased default number of AES-KDF rounds +- On Unix-like systems, KeePass now uses the CSP implementation + of the AES algorithm for encrypting data, which is a bit + faster +- Improved tool strip checkmark rendering on Unix-like systems +- Updated links (to the website, help pages, etc.) +- The MSI file is now built using Visual Studio 2017 +- Various code optimizations +- Minor other improvements + +2017-06-09: 2.36 +- Added commands 'Find Duplicate Passwords' and 'Find Similar + Passwords' (in 'Edit' -> 'Show Entries'), which show entries + that are using the same or similar passwords +- Added command 'Password Quality Report' (in 'Edit' -> 'Show + Entries'), which shows all entries and the estimated quality + of their passwords +- Added option 'String name' in the 'Edit' -> 'Find' dialog + (for searching entries that have a specific custom string + field) +- Added option for using a gray tray icon +- Added {CMD:/.../} placeholder, which runs a command line +- Added {T-CONV:/.../Raw/} placeholder, which inserts a text + without encoding it for the current context +- Added optional 'Last Password Modification Time (Based on + History)' entry list column +- The internal text editor now supports editing PS1 files +- The position and size of the internal data viewer is now + remembered and restored +- For various dialogs, the maximized state is now remembered + and restored +- Added configuration option for specifying an expiry date for + master keys +- Added configuration option for specifying disallowed + auto-type target windows +- Added workaround for Edge throwing away all keyboard input + for a short time after its activation +- Added workaround for Mono not properly rendering bold and + italic text in rich text boxes +- TrlUtil now performs a case-sensitive word validation + +- The password input controls in the I/O connection dialog and + the proxy dialog now are secure edit controls +- The icon of the 'Save' command in the main menu is now grayed + out when there are no database changes (like the toolbar + button) +- Auto-Type: improved support for target applications that + redirect the focus immediately +- Auto-Type: improved compatibility with VMware vSphere client +- When an error occurs during auto-type, KeePass is now brought + to the foreground before showing an error message box +- Entries in groups where searching is disabled (e.g. the + recycle bin group) are now ignored by the commands that show + expired entries +- Improved scrolling when moving entries while grouping in the + entry list is on +- Improved support for right-to-left writing systems +- Improved application and system tray icon handling +- Updated low resolution ICO files (for Mono development) +- Moved single-click tray icon action option from the + 'Integration' tab to the 'Interface' tab of the options + dialog +- Synchronization file path comparisons are case-insensitive + now +- Improved workaround for Mono clipboard bug (improved + performance and window detection; the workaround is now + applied only if 'xsel' and 'xdotool' are installed) +- Enhanced PrepMonoDev.sh script +- KPScript: times in group and entry lists now contain a time + zone identifier (typically 'Z' for UTC) +- Various code optimizations +- Minor other improvements + +- The drop-down menu commands in the entry editing dialog for + setting the expiry date now work as expected + +2017-01-09: 2.35 +- New KDBX 4 file format, which supports various new features + (listed below; e.g. Argon2) +- Added Argon2 key derivation function (it can be activated in + the database settings dialog) +- Improved header and data authentication in KDBX 4 files + (using HMAC-SHA-256, Encrypt-then-MAC scheme) +- Added ChaCha20 (RFC 7539) encryption algorithm (it can be + activated as KDBX file encryption algorithm in the database + settings dialog; furthermore, it supersedes Salsa20 as + default for generating the inner random stream of KDBX 4 + files) +- Added support for opening entry URLs with Firefox or Opera in + private mode via the context menu -> 'URL(s)' -> 'Open with + ... (Private)' +- Added URL override suggestions for Firefox and Opera in + private mode in the URL override suggestions drop-down list + in the entry dialog +- Added optional built-in global URL overrides for opening + HTTP/HTTPS URLs with Firefox or Opera in private mode +- Added {PICKFIELD} placeholder, which shows a dialog to pick a + field whose value will be inserted +- Added option 'Hide "Close Database" toolbar button when at + most one database is opened' (turned on by default) +- Added option 'Show additional auto-type menu commands', which + can be turned on to show menu commands for performing entry + auto-type with some specific sequences +- Added menu command 'Selected Entry's Group' (with keyboard + shortcut Ctrl+G) in 'Edit' -> 'Show Entries' (and a context + menu equivalent 'Show Parent Group' in 'Selected Entries'), + which opens the parent group of the currently selected entry + and selects the entry again +- Added menu commands in 'Edit' -> 'Show Entries' to show + entries that expire in a specific number of days (1, 2, 3) or + weeks (1, 2, 4, 8) or in the future +- Added configuration option that specifies the number of days + within which entries are considered to expire 'soon' (the + default is 7) +- Added option for changing the alternate item background color +- When the option 'Remember key sources' is enabled, KeePass + now also remembers whether a master password has been used +- Added option 'Force changing the master key the next time + (once)' (in 'File' -> 'Database Settings' -> tab 'Advanced') +- Added parameters 'Window style' and 'Verb' for the 'Execute + command line / URL' trigger action +- Added support for importing mSecure 3.5.5 CSV files +- Added support for importing Password Saver 4.1.2 XML files +- Added support for importing Enpass 5.3.0.1 TXT files +- Enhanced SplashID CSV import (added support for the old + version 3.4, added mappings for types of the latest version, + groups are now created only for categories, and types are + imported as tags) +- LastPass import: added support for CSV files exported by the + LastPass Chrome extension, which encodes some special + characters as XML entities +- Added 'KeePass KDBX (2.34, Old Format)' export module +- Export using XSL transformation: added support for the + 'xsl:output' element in XSL files +- If the global auto-type hot key is Ctrl+Alt+A and the current + input locale is Polish, KeePass now shows a warning dialog + (telling the user that Ctrl+Alt+A is in conflict with a + system key combination producing a character) +- Added Alt+X Unicode character conversion support in rich text + boxes on Unix-like systems +- For development snapshots, the 'About' dialog now shows the + snapshot version (in the form 'YYMMDD') +- Plugins can provide other key derivation functions now +- The header of KDBX 4 files is extensible by plugins +- Enhanced support for developing encryption algorithm plugins +- Plugins can now store custom data in groups and entries +- Plugin data stored in the database, a group or an entry can + now be inspected (and deleted) in the database maintenance + dialog, the group dialog and the entry dialog, respectively +- For plugins: file closing events now contain information + about whether KeePass is exiting, locking or performing a + trigger action +- Added workaround for .NET handle cast overflow bug in + InputLanguage.Culture +- Added workaround for Mono ignoring the Ctrl+I shortcut +- Added workaround for Mono clipboard bug +- Added workaround for Mono not focusing the default control in + the entry editing dialog +- Added workaround for a Mono timer bug that caused high CPU + load while showing a file save confirmation dialog +- Added Mono workaround: when running on MacOS, KeePass now + does not try to instantiate a tray icon anymore +- Added workaround for XDoTool sending diacritic characters in + incorrect case +- TrlUtil now recommends to clear the 'Unused Text' tab + +- Improved behavior when searching entries with exclusions + (terms prefixed with '-') +- Improved support for auto-typing into target windows using + different keyboard layouts +- Auto-Type: improved support for keyboard layouts with keys + where Shift, Caps Lock and no modifier result in 3 different + characters +- Auto-Type: improved support for spacing modifier letters + (U+02B0 to U+02FF) +- Global auto-type now works with target windows having empty + titles +- When copying entries to the clipboard, the data package now + includes custom icons used by the entries +- Unified behavior when drag&dropping a field containing a + placeholder +- Improved entry edit confirmation dialog +- If the screen height is insufficient to display a dialog, the + dialog's banner (if the dialog has one) is now removed to + save some space +- Some tooltips are now displayed for a longer time +- A new entry created using a template now does not include the + history of the template anymore +- For empty RTF attachments, the internal data editor now by + default uses the font that is specified for TXT files +- Internal data editor: added support for changing the format + of mixed-format selections +- Internal data viewer and editor: null characters ('\0', not + '0') in texts are now automatically replaced by spaces (like + Notepad on Windows 10) +- Improved encoding signature handling for conversions during + text attachment imports (via the 'Text Encoding' dialog) +- File transactions are not used anymore for files that have a + reparse point (e.g. symbolic links) +- Improved XSL stylesheets for KDBX XML files +- The internal window manager is now thread-safe +- Improved date/time handling +- Improved button image disposal +- When synchronizing two databases, custom data (by plugins) is + now merged +- When opening a database file, corrupted icon indices are now + automatically replaced by default values +- Added some more entropy sources for the seed of the + cryptographically secure pseudo-random number generator + (environment variables, command line, full operating system + version, current culture) +- ChaCha20 is now used during password generation (instead of + Salsa20) +- ChaCha20 is now used as fallback process memory encryption + algorithm (instead of Salsa20) +- When the encryption algorithm for a database file is unknown, + the error message now shows the UUID of the algorithm +- In KDBX 4, header field lengths are now 4 bytes wide +- In KDBX 4, entry attachments are now stored in an inner, + binary header (encrypted, possibly compressed), before the + XML part; this reduces the database file size and improves + the loading/saving performance +- In KDBX 4, the inner random stream cipher ID and key (to + support process memory protection) are now stored in the + inner header instead of in the outer header +- KPScript: the 'ChangeMasterKey' command now also updates the + master key change date +- TrlUtil: improved validation warning dialogs +- The MSI file now requires any .NET Framework version, not a + specific one +- The MSI file is now built using Visual Studio 2015 +- Various code optimizations +- Minor other improvements + +- When executing a {HMACOTP} placeholder, the last modification + time of the corresponding entry is now updated +- Key files containing exactly 64 alphanumeric characters are + now loaded as intended + +2016-06-11: 2.34 +- The version information file (which the optional update check + downloads to see if there exists a newer version) is now + digitally signed (using RSA-4096 / SHA-512); furthermore, it + is downloaded over HTTPS +- Added option 'Lock workspace when minimizing main window to + tray' +- Added option 'Esc minimizes to tray instead of locking the + workspace' +- Added Ctrl+Q shortcut for closing KeePass (as alternative to + Alt+F4) +- Added UIFlags bit for disabling the 'Check for Updates' menu + item +- The installers (regular and MSI) now create an empty + 'Plugins' folder in the application directory, and the + portable package now also contains such a folder +- Plugins: added support for digitally signed version + information files + +- Plugins are now loaded only directly from the application + directory and from any subdirectory of the 'Plugins' folder + in the application directory +- Improved startup performance (by filtering plugin candidates) +- When closing a database, KeePass now searches and deletes any + temporary files that may have been created and forgotten by + MSHTML when printing failed +- CHM help file: improved high DPI support +- Various code optimizations +- Minor other improvements + +2016-05-07: 2.33 +- Added commands in the group context menu (under 'Rearrange'): + 'Expand Recursively' and 'Collapse Recursively' +- Added option 'When selecting an entry, automatically select + its parent group, too' (turned on by default) +- Added placeholders for data of the group that is currently + selected in the main window: {GROUP_SEL}, {GROUP_SEL_PATH} + and {GROUP_SEL_NOTES} +- While importing/synchronizing, indeterminate progress is now + displayed on the taskbar button (on Windows 7 and higher) +- Added optional parameters 'Filter - Group' and 'Filter - Tag' + for the 'Export active database' trigger action +- Pressing the Escape key in the main window now locks the + workspace (independent of the current database locking state, + in contrast to Ctrl+L) +- Added option 'Extra-safe file transactions' in 'Tools' -> + 'Options' -> tab 'Advanced' +- Added customization option to specify how often the master + key dialog appears when entering incorrect master keys +- Plugins: added event 'FormLoadPost' for the main window +- KPScript: the 'GetEntryString' command now supports the + '-Spr' option, which causes KPScript to Spr-compile the field + value (i.e. placeholders are replaced, field references are + resolved, environment variables are inserted, etc.) + +- Improved database synchronization performance +- Improved object reordering during a database synchronization + for new and relocated groups/entries +- Improved synchronization of deleted objects information +- Improved database synchronization to prevent implicit object + deletions +- HTML export/printing: the notes column now is twice as wide + as the other columns +- When entering a Spr-variant password in the entry dialog, the + quality estimation is now disabled +- Group tooltips are now displayed for about 30 seconds +- The root group is now always expanded when opening a database +- Improved private mode browser detection +- Improved DPI awareness declaration (on Windows 10 and higher) +- Improved regular expression searching performance in usual + use cases +- Improved natural string comparison performance (on Unix-like + systems) +- Improved mnemonic characters in the 'Rearrange' menus +- Upgraded installer +- Various UI text improvements +- Various code optimizations +- Minor other improvements + +2016-03-09: 2.32 +- The quick search box (in the toolbar of the main window) now + supports searching using a regular expression; in order to + indicate that the search text is a regular expression, + enclose it in '//'; for example, performing a quick search + for '//Michael|Adam//' shows all entries containing 'Michael' + or 'Adam' +- Added 'Advanced' tab in the 'Open From URL' dialog (easily + extensible by plugins); added options: timeout, pre- + authenticate, HTTP/HTTPS/WebDAV user agent and 100-Continue + behavior, FTP passive mode +- Added per-user Start Menu Internet Application detection +- When selecting an entry in the main entry list, its parent + group is now selected automatically in the group tree view +- Auto-Type matching: added option 'Expired entries can match' + (turned off by default, i.e. expired entries are ignored) +- Added option 'Always show global auto-type entry selection + dialog' (to show the dialog even when no or one entry is + found for the currently active target window; turned off by + default) +- Added {GROUP_NOTES} placeholder +- Added support for importing nPassword 1.0.2.41 NPW files +- In triggers and KPScript, an import/export module can now be + specified both using its display name and its format name +- When running under .NET 4.5 or higher, secure connections + (e.g. for WebDAV) now support TLS 1.1 and TLS 1.2 (in + addition to SSL 3 and TLS 1.0) +- Added Mono workaround: when running on the Unity or Pantheon + desktop, KeePass now does not try to instantiate a tray icon + anymore; if you want a tray icon on Unity/Pantheon, use the + application indicator plugin +- Added workaround for Mono not implementing the property + SystemInformation.SmallIconSize for MacOS systems +- Added command line parameter '-wa-disable:' for disabling + specific Mono workarounds (IDs separated by commas) +- KPScript: if the value of a '-ref-*:' parameter is enclosed + in '//', it is now treated as a regular expression, which + must occur in the entry field for an entry to match +- KPScript: .NET 4.0/4.5 is now preferred, if installed +- KPScript: enhanced high DPI support + +- Auto-Type: improved compatibility with target windows that + handle activation slowly and ignore any input until being + ready (like Microsoft Edge) +- Auto-Type: improved sending of characters that are typically + realized with the AltGr key +- When editing a custom entry string, the value text box now + has the initial focus +- Improved image/icon shrinking +- Improved icon recoloring on high DPI resolutions +- Changed some ICO files such that higher resolution images are + used +- Changed some PNG files to workaround the image DPI scaling + behavior on Windows XP +- Improved new-line filtering in the main entry view +- When trying to use the Windows user account as part of a + composite master key fails, a more detailed error message is + displayed now +- The 'About' dialog now indicates whether the current build is + a development snapshot +- Changed code signing certificate +- Upgraded installer +- Various code optimizations +- Minor other improvements + +- After an incomplete drag&drop operation over the group tree + view, the previous group selection is now restored + +2016-01-09: 2.31 +- Added menu/toolbar styles, freely selectable in 'Tools' -> + 'Options' -> tab 'Interface'; available styles are 'Windows + 10', 'Windows 8.1', 'KeePass - Gradient', '.NET/Office - + Professional' and 'System - Classic'; by default KeePass uses + the style most similar to the one of the current operating + system +- Refined application icons (thanks to Victor Andreyenkov) +- Auto-Type: new target window classification method, which + improves compatibility with target windows hosted within + other windows (e.g. a PuTTY window within SuperPuTTY/MTPuTTY) +- Auto-Type: added workaround for the default Ctrl+Alt behavior + of KiTTY variants (which differs from Windows' behavior) +- Before clearing the clipboard, KeePass now first copies a + non-sensitive text into it; this ensures that no sensitive + information remains in the clipboard even when clearing is + prevented by the environment (e.g. when running in a virtual + machine, when using a clipboard extension utility, ...) +- Added support for opening entry URLs with Internet Explorer + or Google Chrome in private mode via the context menu -> + 'URL(s)' -> 'Open with ... (Private)' +- Added URL override suggestions for Internet Explorer and + Google Chrome in private mode in the URL override suggestions + drop-down list in the entry dialog +- Added optional built-in global URL overrides for opening + HTTP/HTTPS URLs with Internet Explorer or Google Chrome in + private mode +- Added Ctrl+K shortcut for the 'Duplicate Entry' command +- Mozilla Bookmarks HTML import: added support for importing + tags +- Added support for exporting to Mozilla Bookmarks HTML files +- Windows/IE favorites export: entry fields are Spr-compiled + now, and entries with cmd:// URLs are now exported as LNK + files +- HTML export/printing: added support for UUIDs, added + horizontal lines between entries in details mode, added + background color for group headings, long field names are + hyphenated now, and long field data now breaks and wraps onto + the next line +- Plugins: added possibility to configure file transactions for + each URI scheme +- Plugins: added possibility to provide custom 'Save As' + dialogs more easily +- Converted some PNG images as a workaround for a problem in + Cairo/LibPNG on Unix-like systems +- As a workaround for a weakness in Mono's FileDialog, before + showing such a dialog on Unix-like systems KeePass now tries + to load the file '~/.recently-used' and deletes it, if it is + not a valid XML file +- KPScript: added support for specifying the master password in + encrypted form using the '-pw-enc:' command line parameter + (exactly like in KeePass, compatible with the {PASSWORD_ENC} + placeholder) +- KPScript: the 'Export' command now supports the optional + '-GroupPath:' parameter (to export a specific group instead + of the whole database) +- KPScript: the 'GetEntryString' command now supports the + '-FailIfNoEntry' option +- KPScript: added '-refx-Expires' and '-refx-Expired' entry + identification parameters +- KPScript: the 'Import' command now prints more specific error + messages +- All KeePass program binaries are now dual signed using SHA-1 + and SHA-256 + +- Auto-Type: improved keyboard layout handling when the target + window changes during an auto-type process +- Auto-Type: improved compatibility with Remote Desktop + Connection client and VirtualBox +- Improved icon recoloring +- Improved printing of dates/times and tags +- The password generator based on a character set now ensures + that the generated password is Spr-invariant +- Password generator based on a pattern or a custom algorithm: + when a Spr-variant password is generated, a confirmation + dialog for accepting this password is displayed +- If the 'Save Database' policy prevents saving, the auto-save + option is now ignored +- Improved .NET Framework version detection +- PLGX debugging: when the command line option '-debug' is + passed and a PLGX plugin fails to compile, the output of all + tried compilers is saved to a temporary file +- Improved file transaction creation time handling on Unix-like + systems +- Improved compatibility with Mono on BSD systems +- Enhanced PrepMonoDev.sh script for compatibility with Mono + 4.x +- Removed KeePassLibSD sub-project (a KeePass library for + Pocket PC / Windows Mobile) from the main solution +- Upgraded installer +- Various code optimizations +- Minor other improvements + +- When running under Mono (Linux, MacOS, ...), two options + related to window minimization are disabled now (because they + do not work properly due to a Mono bug) + +2015-08-09: 2.30 +- When opening a database via a URL fails, the error message + dialog now has a button 'Specify different server + credentials' (on Windows Vista and higher) +- Added support for opening entry URLs with Microsoft Edge via + the context menu -> 'URL(s)' -> 'Open with Edge' +- Added URL override suggestion for Microsoft Edge in the URL + override suggestions drop-down list in the entry dialog +- Added optional built-in global URL overrides for opening + HTTP/HTTPS URLs with Microsoft Edge +- When clicking on a group link in the entry view, KeePass now + ensures that the group is visible in the group tree +- The main window is now moved onto the primary screen when it + is restored outside all screens +- KDBX loader: added support for non-empty protected binary + value reference elements +- Plugins: added two auto-type sequence query events +- Added workaround for Mono drawing bug when scrolling a rich + text box +- When running under Mono, some automatic locking options are + now disabled (because Mono doesn't implement the required + events) +- The installer now prevents running the installer while it is + already running +- KPScript: added '-GroupPath:' parameter (for specifying the + full path of a group) +- KPScript: the 'MoveEntry' command now also supports the + '-GroupName:' parameter (as alternative to '-GroupPath:') +- KPScript: added support for specifying the path of an XSL + stylesheet file using the command line parameter '-XslFile:' +- KPScript: the 'ListGroups' command now also outputs the + parent group UUID for each group +- KPScript: the parameters for specifying new field data (for + the 'AddEntry' and the 'EditEntry' command) now support + escape sequences (e.g. '\n' is replaced by a new-line + character) + +- The 'Synchronize' file dialog now shows only KDBX files by + default +- In the 'Attachments (Count)' column, only non-zero counts are + shown now +- Improved MRU item refreshes +- The entry string dialog now supports changing the case of a + string name +- The entry string dialog now does not allow adding a string + whose name differs from another existing string name in this + entry only by case +- The entry view in the main window is now updated immediately + after pressing Ctrl+H or Ctrl+J +- The KDB import module now tries to round any invalid + date/time to the nearest valid date/time +- XML serializers are now loaded/created at KeePass startup in + order to avoid a problem when shutting down Windows and + KeePass.XmlSerializers.dll not being present +- Changed tab bar behavior in the options dialog to avoid a tab + content cropping issue caused by plugins +- Improved workaround for Mono splitter bug +- Upgraded installer +- Various performance improvements +- Various code optimizations +- Minor other improvements + +2015-04-10: 2.29 +- Added high resolution icons +- Added support for high resolution custom icons +- Added option in the proxy configuration dialog to use the + user's default credentials (provided by the system) +- {FIREFOX} placeholder: if no regular Firefox is installed, + KeePass now looks for Firefox ESR +- {PICKCHARS} placeholder: the Conv-Fmt option now supports all + combinations of '0', 'A', 'a' and '?'; '?' skips a combobox + item +- Added {BEEP X Y} auto-type command (where X is the frequency + in hertz and Y the duration in milliseconds) +- Added optional 'Attachments (Count)' entry list column +- Added Ctrl+Insert shortcut as alternative for Ctrl+C in the + entry list of the main window +- Added shortcut keys for 'Copy Entries' (Ctrl+Shift+C) and + 'Paste Entries' (Ctrl+Shift+V) +- Added some access keys in various dialogs +- In the field reference dialog, the field in which the + reference will be inserted is now selected as source field by + default +- Added UUID uniqueness check +- Added support for importing Passphrase Keeper 2.60 HTML files + (in addition to the already supported 2.50 and 2.70 formats) +- The path of the local configuration file can now be changed + using the '-cfg-local:' command line parameter +- Plugins can now access the KeePass resources (images, icons, + etc.) through the IPluginHost interface +- Added a few workarounds for external window manipulations + before the main window has been fully constructed +- Added workaround for .NET gradient drawing bug; 'Blue Carbon' + dialog banners are now drawn correctly on high DPI +- Added workaround for Mono file version information block + generation bug +- KPScript: added 'EstimateQuality' command (to estimate the + quality of a specified password) +- All KeePass program binaries are now digitally signed (thanks + to Certum/Unizeto) + +- In the master key creation dialog, the 'Create' and 'Browse' + buttons are now disabled when a key provider is selected +- Changed behavior of the 'Use system proxy settings' option + (KeePass now directly gets the system proxy settings, not the + .NET default proxy settings) +- Improved focus restoration after closing the character + picking dialog +- Removed 'O' and 'C' access keys from 'OK' and 'Cancel' + buttons (instead, press Enter for 'OK' and Esc for 'Cancel') +- Improved remembering of splitter positions +- Improved assignments of check mark images to menu items +- Improved behavior when synchronizing a local EFS-encrypted + database file with a local database file +- On Unix-like systems, hot key boxes now show 'External' + instead of 'None' +- Various code optimizations +- Minor other improvements + +- AltGr+E (i.e. Ctrl+Alt+E) does not focus the quick search box + anymore + +2014-10-08: 2.28 +- Enhanced high DPI support +- Added trigger action 'Show message box' (which can abort the + current trigger execution or execute a command line / URL) +- The 'Database has unsaved changes' trigger condition now + supports choosing between the active database and the + database that triggered the event +- Added parameter for the trigger action 'Activate database + (select tab)' that allows activating the database that + triggered the event +- Auto-Type: added workaround for KiTTY's default Ctrl+Alt + behavior (which differs from Windows' behavior) +- Auto-Type: added workaround for PuTTYjp's default Ctrl+Alt + behavior (which differs from Windows' behavior) +- Added up/down arrow buttons for reordering auto-type + associations in the entry editing dialog +- While entering the master key on a secure desktop, dimmed + screenshots are now also displayed on all non-primary screens +- Added support for importing VisKeeper 3.3.0 TXT files +- The group tree view is now saved and restored during most + group tree updates +- In the main entry list, multiple entries can now be moved by + one step up/down at once +- If Caps Lock is on, a balloon tip indicating this is now also + displayed for password text boxes immediately after opening a + dialog (where the password text box is the initially focused + control) +- In the cases where Windows would display outdated thumbnail + and peek preview images for the main window, KeePass now + requests Windows to use a static bitmap instead (showing only + the KeePass logo) +- Added fallback method for parsing dates/times (the default + parser fails for some custom formats specified in the Control + Panel) +- Added workaround for .NET ToolStrip height bug +- Added own process memory protection for Unix-like systems (as + Mono doesn't provide any effective memory protection method) +- On Unix-like systems, Shift+F10 (and Ctrl+Alt+5 and + Ctrl+NumPad5 on MacOS) now shows the context menu in most + list/tree view controls and rich text boxes (like on Windows) +- KPScript: for the 'Import' command, a different master key + can now be specified using the standard master key command + line parameters with the prefix 'imp_' (e.g. -imp_pw:Secret) +- KPScript: added option '-FailIfNotExists' for the + 'GetEntryString' command +- KPScript: added '-refx-Group' and '-refx-GroupPath' entry + identification parameters + +- Improved compatibility with ClearType +- Improved support for high contrast themes +- When duplicating a group/entry, the creation time and the + last access time of the copy are now set to the current time +- Character picker dialog: initially the text box is now + focused, improved tab order, and picked characters are now + inserted at the current insertion point (instead of the end) +- Ctrl+Tab is now handled only once when the database tab bar + has the focus +- When exporting to a KeePass 1.x KDB file, a warning/error is + now shown if the master key contains/is a Windows User + Account +- Unknown trigger events/conditions/actions are now ignored by + the trigger dialog +- Reduced group tree view flickering +- Improved default value for the entry history size limit +- Improved menu check mark and radio images +- Improved list view column resizing +- Improved list view scrolling +- Secure edit control performance improvements +- In some cases, double-clicking the tray icon now brings + KeePass to the foreground +- Improved concurrent UI behavior during auto-type +- Auto-Type: improved compatibility with keyboard layouts with + combining apostrophes, quotation marks and tildes +- Auto-Type: improved virtual key translation on Unix-like + systems +- KPScript: the 'EditEntry' command now also updates the time + fields of all affected entries +- KPScript: the 'DeleteEntry' and 'DeleteAllEntries' commands + now create deleted object information (improving + synchronization behavior) +- Upgraded installer +- Various code optimizations +- Minor other improvements + +- When auto-typing a sequence containing a {NEWPASSWORD} + placeholder, the raw new password is now stored (in the + password field of the entry), not its corresponding auto-type + sequence +- Synchronizing two unrelated databases now always works as + expected + +2014-07-06: 2.27 +- The estimated password quality (in bits) is now displayed on + the quality progress bar, and right of the quality progress + bar the length of the password is displayed +- Auto-Type: before sending a character using a key combination + involving at least two modifiers, KeePass now first tests + whether this key combination is a registered system-wide hot + key, and, if so, tries to send the character as a Unicode + packet instead +- Auto-Type: added workaround for Cygwin's default Ctrl+Alt + behavior (which differs from Windows' behavior) +- Auto-Type: added {APPACTIVATE ...} command +- {HMACOTP} placeholder: added support for specifying the + shared secret using the entry strings 'HmacOtp-Secret-Hex' + (secret as hex string), 'HmacOtp-Secret-Base32' (secret as + Base32 string) and 'HmacOtp-Secret-Base64' (secret as Base64 + string) +- {T-CONV:...} placeholder: added 'Uri-Dec' type (for + converting the string to its URI-unescaped representation) +- Added placeholders: {URL:USERINFO}, {URL:USERNAME} and + {URL:PASSWORD} +- Added placeholders: {BASE}, {BASE:RMVSCM}, {BASE:SCM}, + {BASE:HOST}, {BASE:PORT}, {BASE:PATH}, {BASE:QUERY}, + {BASE:USERINFO}, {BASE:USERNAME}, {BASE:PASSWORD} (within a + URL override, each of these placeholders is replaced by the + specified part of the string that is being overridden) +- Added {NEWPASSWORD:/Profile/} placeholder, which generates a + new password for the current entry using the specified + password generator profile +- Pattern-based password generator: the '^' character now + removes the next character from the current custom character + set (for example, [a^y] contains all lower-case alphanumeric + characters except 'y') +- Enhanced syntax highlighting in the sequence field of the + 'Edit Auto-Type Item' dialog +- Added option 'Do not ask whether to synchronize or overwrite; + force synchronization' +- Added synchronization support for the group behavior + properties 'Auto-Type for entries in this group' and + 'Searching entries in this group' +- Root group properties are now synchronized based on the last + modification time +- While saving a database, a shutdown block reason is now + specified +- Added 'Move to Group' menu in the 'Selected Entries' popup of + the main entry list context menu +- Items of dynamic menus (tags, strings, attachments, password + generator profiles, ...) now have auto-assigned accelerator + keys +- As alternative to Ctrl+F, pressing F3 in the main window now + displays the 'Find' dialog +- Added UIFlags bit for hiding password quality progress bars + and information labels +- Enhanced system font detection on Unix-like systems +- When using 'xsel' for clipboard operations on Unix-like + systems, text is now copied into both the primary selection + and the clipboard +- Added '--version' command line option (for Unix-like systems) +- Plugins can now subscribe to an IPC event that is raised when + running KeePass with the '-e:' command line parameter +- Added workaround for .NET AutoWordSelection bug +- Added workaround for Mono bug 10163; saving files using + WebDAV now also works under Mono 2.11 and higher +- Added workaround for Mono image tabs bug +- Added workaround for Mono NumericUpDown drawing bug + +- Merged the URL scheme overrides and the 'Override all URLs' + option into a new dialog 'URL Overrides' +- Improved autocompletion of I/O connection parameters using + the MRU list (now treating the user name as filter) +- Improved interaction of I/O connection trigger parameters and + the MRU list +- The master key prompt dialog now validates key files only + when clicking [OK], and invalid ones are not removed + automatically from the list anymore +- Improved support for managing columns leftover from + uninstalled plugins in the 'Configure Columns' dialog +- If the 'Unhide Passwords' policy is turned off, the passwords + column in the auto-type entry selection dialog is now + unavailable +- The entry list in the main window is now updated immediately + after performing auto-type or copying data to the clipboard +- Various list view performance improvements +- The 'Searching entries in this group' group behavior + properties are now ignored during resolving field references +- Improved behavior in case of syntax errors in placeholders + with parameters +- Two-channel auto-type obfuscation: improved realization of + clipboard paste commands +- General main window keyboard shortcuts now also work within + the quick search box and the database tab bar +- Pressing Ctrl+Shift+Tab in the main window now always selects + the previous database tab (independent of which control has + the focus) +- Changed shortcut keys for moving entries/groups on Unix-like + systems, due to Mono's incorrect handling of Alt (preventing + key events) and navigation keys (selection updated at the + wrong time) +- Auto-Type: improved modifier key releasing on Unix-like + systems +- Various code optimizations +- Minor other improvements + +- A key-up event to the groups tree in the main window without + a corresponding key-down event does not change the entry list + anymore + +2014-04-13: 2.26 +- Added option to show a confirmation dialog when moving + entries/groups to the recycle bin +- Auto-Type: added workaround for applications with broken + time-dependent message processing +- Auto-Type: added workaround for PuTTY's default Ctrl+Alt + behavior (which differs from Windows' behavior) +- Auto-Type: added configuration option to specify the default + delay between two keypresses +- Added optional sequence comments column in the auto-type + entry selection dialog (in this column, only {C:...} comments + in the sequence are displayed; if a comment starts with '!', + only this comment is shown) +- If the option 'Automatically search key files' is activated, + all drives are now scanned in parallel and any key files are + added asynchronously (this avoids issues caused by slow + network drives) +- Added trigger action 'Show entries by tag' +- {OPERA} placeholder: updated detection code to also support + the latest versions of Opera +- {T-CONV:...} placeholder: added 'Uri' type (for converting + the string to its URI-escaped representation) +- Synchronization functions are now available for remote + databases, too +- Enhanced RoboForm importer to additionally support the new + file format +- Summary lists are now also available in delete confirmation + dialogs on Unix-like systems and Windows XP and earlier +- Added workaround for Mono Process StdIn BOM bug +- KPScript: added 'refx-All' option (matches all entries) +- KPScript: added optional parameters 'setx-Expires' and + 'setx-ExpiryTime' for the 'EditEntry' command + +- Improved database tab selection after closing an inactive + database +- New just-in-time MRU files list +- Improved selection of entries created by the password + generator +- The internal text editor now determines the newline sequence + that the data is using the most when opening it, and converts + all newline sequences to the initial sequence when saving the + data +- Improved realization of the {CLEARFIELD} command (now using + Bksp instead of Del, in order to avoid Ctrl+Alt+Del issues on + newer Windows systems) +- The note that deleting a group will also delete all subgroups + and entries within this group is now only displayed if the + group is not empty +- Improved GUI thread safety of the update check dialog +- Improved HTML generation +- Improved version formatting +- On Unix-like systems, window state automations are now + disabled during initial auto-type target window switches +- On Unix-like systems, the button to choose a password font is + disabled now (because this is unsupported due to Mono bug + 5795) +- Various files (e.g. 'History.txt') are now encoded using + UTF-8 +- Improved build system +- Various code optimizations +- Minor other improvements + +- In the 'Configure Columns' dialog, the activation states of + plugin-provided columns are now preset correctly + +2014-02-03: 2.25 +- New auto-type key sending engine (improved support for + sending Unicode characters and for sending keypresses into + virtual machine/emulator windows; now largely compatible with + the Neo keyboard layout; sequence parsing is faster, more + flexible and optimizes the sequence; improved behavior for + invalid sequences; differential delays, making the auto-type + process less susceptible to externally caused delays; + automatic cancelling is now more precise up to at most one + keypress and also works on Unix-like systems; improved + message processing during auto-type) +- When trying to open an entry attachment that the built-in + editor/viewer cannot handle, KeePass now extracts the + attachment to a (EFS-encrypted) temporary file and opens it + using the default application associated with this file; + afterwards the user can choose between importing/discarding + changes and KeePass deletes the temporary file securely +- On Windows Vista and higher, the button in the entry editing + dialog to open attachments is now a split button; the drop- + down menu allows to choose between the built-in viewer, the + built-in editor and an external application +- Added 'XML Replace' functionality +- Generic CSV importer: added option to merge imported groups + with groups already existing in the database +- Added support for importing Dashlane 2.3.2 CSV files +- On Windows 8 and higher, some running Metro apps are now + listed in the 'Edit Auto-Type Item' dialog +- Added {T-CONV:/T/C/} placeholder (to convert text to upper- + case, lower-case, or its UTF-8 representation to Base64 or + Hex) +- Added {SPACE} special key code (as alternative for the ' ' + character, for improved readability of auto-type sequences) +- XML merge (used e.g. when an enforced configuration file is + present): added support for comments in inner nodes +- Added UIFlags bit for showing last access times + +- In the history entry viewing dialog, the 'Open' and 'Save' + commands are now available for attachments +- When replacing the {PASSWORD_ENC} placeholder, KeePass now + first Spr-compiles the entry password (i.e. placeholders, + environment variables, etc. can be used) +- Improved configuration loading performance +- Improved displaying of fatal exceptions +- Various code optimizations +- Minor other improvements + +- Data inserted by entry URL component placeholders is now + encoded correctly + +2013-11-03: 2.24 +- The URL override field in the entry editing dialog is now an + editable combo box, where the drop-down list contains + suggestions for browser overrides +- Password quality estimations are now computed in separate + threads to improve the UI responsiveness +- The password generator profile 'Automatically generated + passwords for new entries' is now available in the password + generator context menu of the entry editing dialog +- Added UIFlags bit for hiding built-in profiles in the + password generator context menu of the entry editing dialog +- Tags can be included in printouts now +- Generic CSV importer: added support for importing tags +- Added support for importing Norton Identity Safe 2013 CSV + files +- Mozilla Bookmarks JSON import: added support for importing + tags +- RoboForm import: URLs are now terminated using a '/', added + support for the new file format and for the new note fields +- Added support for showing modern task dialogs even when no + form exists (requiring a theming activation context) +- KeePass now terminates CtfMon child processes started by + .NET/Windows, if they are not terminated automatically +- Added workarounds for '#', '{', '}', '[', ']', '~' and + diaeresis .NET SendKeys issues +- Added workaround for 'xsel' hanging on Unix-like systems +- Converted some PNG images as a workaround for a problem in + Cairo/LibPNG on Unix-like systems +- Installer: the version is now shown in the 'Version' field of + the item in the Windows 'Programs and Features' dialog +- TrlUtil: added 'Go to Next Untranslated' command +- TrlUtil: added shortcut keys + +- The 'Open From URL' dialog is now brought to the foreground + when trying to perform global auto-type while the database is + locked and the main window is minimized to tray +- Profiles are now shown directly in the password generator + context menu of the entry editing dialog +- After duplicating entries, KeePass now ensures that the + copies are visible +- User names of TAN entries are now dereferenced, if the option + for showing dereferenced data in the main window is enabled +- When creating an entry from a template, the new entry is now + selected and focused +- Empty fields are not included in detailed printouts anymore +- Enhanced Internet Explorer detection +- The '-preselect' command line option now works together with + relative database file paths +- Improved quoted app paths parsing +- Extended culture invariance +- Improved synchronization performance +- Improved internal keypress routing +- Last access times by default are not shown in the UI anymore +- TrlUtil: improved dialog focusing when showing message boxes +- KeePassLib/KPScript: improved support for running on systems + without any GUI +- Various code optimizations +- Minor other improvements + +- Fixed a crash that could occur if the option 'Show expired + entries (if any)' is enabled and a trigger switches to a + different locked database when unlocking a database +- The tab bar is now updated correctly after closing an + inactive database by middle-clicking its tab +- Column display orders that are unstable with respect to + linear auto-adjusting assignment are now restored correctly + +2013-07-20: 2.23 +- New password quality estimation algorithm +- Added toolbar buttons: 'Open URL(s)', 'Copy URL(s) to + Clipboard' and 'Perform Auto-Type' +- Added 'Generate Password' command in the context menu of the + KeePass system tray icon +- Added 'Copy history' option in the entry duplication dialog + (enabled by default) +- Added 'Duplicate Group' context menu command +- In the MRU list, currently opened files now have an + '[Opened]' suffix and are blue +- When a dialog is displayed, (double) clicking the KeePass + system tray icon now activates the dialog +- Added {T-REPLACE-RX:...} placeholder, which replaces text + using a regular expression +- Added {VKEY-NX X} and {VKEY-EX X} special key codes +- Added 'Perform auto-type with selected entry' trigger action +- Added 'Import into active database' trigger action +- Mozilla Bookmarks HTML import: added support for groups, + bookmark descriptions and icons +- Mozilla Bookmarks JSON import: bookmark descriptions are now + imported into the note fields of entries +- RoboForm import: added support for the new file format +- Added support for importing Network Password Manager 4.0 CSV + files +- Enhanced SafeWallet XML importer to additionally support + importing web entries and groups from very old export file + versions (for newer versions this was already supported) +- Added database repair mode warning +- Added option to accept invalid SSL certificates (turned off + by default) +- Added user activity notification event for plugins +- File transactions for FTP URLs are now always disabled when + running under .NET 4.0 in order to workaround .NET bug 621450 +- Added workaround for Mono list view item selection bug +- Added workaround for Mono bug 649266; minimizing to tray now + removes the task bar item and restoring does not result in a + broken window anymore +- Added workaround for Mono bug 5795; text and selections in + password boxes are now drawn properly (a monospace font can + only be used on Windows due to the bug) +- Added workaround for Mono bug 12525; dialog banners are now + drawn correctly again +- Added workaround for Mono form loading bug +- KPScript: added 'Import' command +- KPScript: the 'ListEntries' command now also outputs + date/time fields of entries + +- When the option for remembering the last used database is + enabled, KeePass now remembers the last active database + (instead of the last opened or saved database) +- The 'Add Group' command and the F2 key in the groups tree + view now open the group editing dialog; in-place tree node + label editing is disabled +- Custom string and plugin-provided columns in the 'Configure + Columns' dialog are sorted alphabetically now +- Improved behavior when closing inactive databases +- Improved support for trigger actions during database closing +- The 'Special' GUI character set now includes '|' and '~' +- The 'High ANSI' character set now consists of the range + [U+0080, U+00FF] except control and non-printable characters +- The options dialog is now listed in the task bar when it is + opened while KeePass is minimized to the system tray +- A remembered user account usage state can now be preset even + when the user account option is disabled using key prompt + configuration flags +- Improved initial input focus in key creation/prompt dialogs + when key creation/prompt configuration flags are specified +- During synchronization, the status dialog is now closed after + all files have been saved +- Improved behavior of the global KeePass activation hot key + when a dialog is displayed +- Changed auto-type command icon +- Shortened product name in main window title +- Improved data URI validation +- Custom clipboard data is now encoded as data URI (with a + vendor-specific MIME type) +- Improved configuration loading performance +- Enhanced I/O connection problem diagnostics +- Improved single instance checking on Unix-like systems +- KeePassLibC DLLs and ShInstUtil are now explicitly marked as + DEP- and ASLR-compatible (like the executable file) +- Various UI improvements +- Various code optimizations +- Minor other improvements + +- The suffixes to the 'Inherit setting from parent' options on + the 'Behavior' tab of the group editing dialog now correctly + show the inherited settings of the current group's parent +- When locked, the main window's title doesn't show the full + path of the database anymore when the option 'Show full path + in title bar (instead of file name only)' is turned off +- The status bar is now updated correctly after sorting by a + column + +2013-04-05: 2.22 +- When the option for remembering key sources is enabled, + KeePass now also remembers whether the user account is + required +- Added 'View' -> 'Grouping in Entry List' menu +- Added 'Close active database' trigger action +- Added '-ioiscomplete' command line option, which tells + KeePass that the path and file system credentials are + complete (the 'Open URL' dialog will not be displayed then) +- Added support for importing SafeWallet XML files (3.0.4 and + 3.0.5) +- Added support for importing TurboPasswords 5.0.1 CSV files +- LastPass CSV importer: added support for group trees +- Alle meine Passworte XML importer: added support for custom + fields and group names with special characters +- Password Safe XML importer: added support for the e-mail + field +- Added 'Help' button in the generic CSV importer dialog +- Added workaround for .NET bug 642188; top visible list view + items are now remembered in details view with groups enabled +- Added workaround for Mono form title bar text update bug + (which e.g. caused bug 801414) + +- After closing a character picking dialog, KeePass now + explicitly activates the previous window +- Improved behavior when cancelling the icon picker dialog +- Main window activation redirection now works with all KeePass + dialogs automatically +- The window state of the current database is now remembered + before opening another database +- Previous parameters are now discarded when switching between + different trigger event/condition/action types +- Unified separators in group paths +- The UI state is now updated after adding an entry and + clicking an entry reference link in the entry view +- The '-entry-url-open' command line option now searches for + matching entries in all open databases +- Improved database context determination when opening a URL +- Added support for special values in date/time fields imported + from KeePass 1.x +- Improved HTML entity decoding (support for more entities and + CDATA sections, improved performance, ...) +- RoboForm HTML importer: URLs are converted to lower-case now + and support for a special order rotation of attributes has + been added +- Removed Password Gorilla CSV importer; users should use the + generic CSV importer (which can import more data than the old + specialized CSV importer) +- Improved file discoveries +- Improved test form entry auto-type window definition +- In the MSI package, the version is now included in the + product name +- Native key transformation library: replaced Boost threads by + Windows API threads (because Boost threads can result in + crashes on restricted Windows 7 x64 systems) +- Various UI improvements +- Various code optimizations +- Minor other improvements + +2013-02-03: 2.21 +- Generic CSV importer: a group separator can be specified now + (for importing group trees) +- Internal data viewer: added hex viewer mode (which is now the + default for unknown data types) +- In the 'Show Entries by Tag' menu, the number of entries + having a specific tag is now shown right of the tag +- In the 'Add Tag' menu, a tag is now disabled if all selected + entries already have this tag +- Auto-Type: added support for right modifier keys +- Added special key codes: {WIN}, {LWIN}, {RWIN}, {APPS}, + {NUMPAD0} to {NUMPAD9} +- Interleaved sending of keys is now prevented by default (if + you e.g. have an auto-type sequence that triggers another + auto-type, enable the new option 'Allow interleaved sending + of keys' in 'Tools' -> 'Options' -> tab 'Advanced') +- Added '-auto-type-selected' command line option (other + running KeePass instances perform auto-type for the currently + selected entry) +- Added option to additionally show references when showing + dereferenced data (enabled by default) +- The selection in a secure edit control is now preserved when + unhiding and hiding the content +- The auto-type association editing dialog now does not hang + anymore when a window of any other application hangs +- When an application switches from the secure desktop to a + different desktop, KeePass now shows a warning message box; + clicking [OK] switches back to the secure desktop +- Added 'OK'/'Cancel' buttons in the icon picker dialog +- Added support for importing LastPass 2.0.2 CSV files +- KeePass now shows an error message when the user accidentally + attempts to use a database file as key file +- Added support for UTF-16 surrogate pairs +- Added UTF-8 BOM support for version information files +- The KeePass version is now also shown in the components list + in the 'About' dialog +- File operations are now context-independent (this e.g. makes + it possible to use the 'Activate database' trigger action + during locking) +- Plugins can now register their placeholders to be shown in + the auto-type item editing dialog +- Plugins can now subscribe to I/O access events +- Added workaround for .NET bug 694242; status dialogs now + scale properly with the DPI resolution +- Added workaround for Mono DataGridView.EditMode bug +- Added workaround for Mono bug 586901; high Unicode characters + in rich text boxes are displayed properly now + +- When the main window UI is being unblocked, the focus is not + reset anymore, if a primary control has the focus +- When opening the icon picker dialog, KeePass now ensures that + the currently selected icon is visible +- Internal data viewer: improved visibility updating +- The e-mail box icon by default is not inherited by new + entries anymore +- The database is now marked as modified when auto-typing a TAN + entry +- Enhanced AnyPassword importer to additionally support CSV + files exported by AnyPassword Pro 1.07 +- Enhanced Password Safe XML importer (KeePass tries to fix the + broken XML files exported by Password Safe 3.29 + automatically) +- I/O credentials can be loaded over IPC now +- Enhanced user switch detection +- Even when an exception occurs, temporary files created during + KDB exports are now deleted immediately +- Improved behavior on Unix-like systems when the operating + system does not grant KeePass access to the temporary + directory +- Improved critical sections that are not supposed to be re- + entered by the same thread +- Improved secure desktop name generation +- When a dialog is closed, references within the global client + image list to controls (event handlers) are removed now +- .NET 4.5 is now preferred, if installed +- PLGX plugins are now preferably compiled using the .NET 4.5 + compiler, if KeePass is currently running under the 4.5 CLR +- Updated KB links +- Changed naming of translation files +- The installer now always overwrites the KeePassLibC 1.x + support libraries +- Upgraded installer +- Various code optimizations +- Minor other improvements + +- When locking multiple databases and cancelling a 'Save + Changes?' dialog, the UI is now updated correctly +- '&' characters in dynamic menu texts, in dialog banner texts, + in image combobox texts, in text box prompts and in tooltips + are now displayed properly + +2012-10-04: 2.20.1 +- Improved support for images with DPI resolutions different + from the DPI resolution of the display device +- {GOOGLECHROME} placeholder: updated detection code to also + support the latest versions of Chrome +- The option to lock on remote control mode changes now + additionally watches for remote connects and disconnects +- Improved Windows registry accesses +- Improved behavior when the user deletes the system temporary + directory +- On Unix-like systems, KeePass now stores most of its + temporary files in a private temporary directory (preferably + in $XDG_RUNTIME_DIR) +- Added detection support for the following web browsers on + Unix-like systems: Rekonq, Midori and Dooble +- KeePass does not try to set the WM_CLASS property on MacOS + systems anymore +- Modified some icons to work around unsupported PNG + transparency keys in Mono +- Various code optimizations +- Minor other improvements + +2012-09-08: 2.20 +- Header data in KDBX files is now authenticated (to prevent + silent data corruption attacks; thanks to P. Gasti and K. B. + Rasmussen) +- Added management of working directories (a separate working + directory is remembered for each file dialog context; working + directories are remembered relatively to KeePass.exe; the + management can be deactivated by turning off the new option + 'Remember working directories') +- Added option to cancel auto-type when the target window title + changes +- Added quick search box in the toolbar of the internal text + editor +- Files can now be attached to entries by using drag&drop from + Windows Explorer to the attachments list in the entry editing + dialog +- Added '-pw-stdin' command line option to make KeePass read + the master password from the StdIn stream +- Added placeholders to get parts of the entry URL: {URL:SCM}, + {URL:HOST}, {URL:PORT}, {URL:PATH} and {URL:QUERY} +- Added a 'Details' button in the plugin load failure message + box (when clicked, detailed error information for developers + is shown) +- Added warning icon left of the Windows user account option + description in the master key creation dialog +- Added support for more image file formats (e.g. when + importing custom client icons) +- Added support for importing DesktopKnox 3.2 XML files +- The generic CSV importer now guesses whether the option to + ignore the first row should be enabled or not (the user of + course can still specify it manually, too) +- Added support for exporting to KeePass 1.x CSV files +- Added support for moving the PLGX cache to a different remote + drive +- The Spr engine is now extensible, i.e. plugins can provide + additional transformations/placeholders +- On Unix-like systems, KeePass now uses the 'xsel' utility for + clipboard operations, if 'xsel' is installed (in order to + work around Mono clipboard bugs) +- Added Mono workaround to set the WM_CLASS property +- Added workaround for Mono splitter bug +- The 'PrepMonoDev.sh' script now removes the serialization + assembly generating post build event +- TrlUtil: added support for importing PO files + +- Improved FTP file existence checking +- High DPI UI improvements +- The database is not marked as modified anymore when using in- + place label editing to fake-edit a group's name (i.e. when + the final new name is the same as the previous one) +- Password is not auto-repeated anymore when trying to unhide + it fails due to the policy 'Unhide Passwords' being disabled +- Improved menu accelerator and shortcut keys +- Changed I/O connection name display format +- Improved browser detection on MacOS +- Task dialog thread safety improvements +- Added UI check during import for KPScript +- Upgraded and improved installer (now uses Unicode, LZMA2 + compression, ...) +- Various UI improvements +- Various code optimizations +- Minor other improvements + +- On Windows systems, new line sequences in text to be shown in + a standard multiline text box are now converted to Windows + format + +2012-05-01: 2.19 +- New generic CSV importer (now supports multi-line fields, '\' + as escape character, field & record separators and the text + qualifier can be specified, white space characters can be + removed from the beginning/end of fields, the fields and + their order can be defined, supported fields now are group + name & standard fields like e.g. title & custom strings & + times & ignore column, the first row can be ignored, KeePass + initially tries to guess the fields and their order based on + the first row) +- Native master key transformations are now computed in two + threads on 64-bit systems, too; on dual/multi core processors + this results in almost twice the performance as before (by + doubling the amount of rounds you'll get the same waiting + time as in 2.18, but the protection against dictionary and + guessing attacks is doubled) +- New XML configuration and translation deserializer to improve + the startup performance +- Added option to require a password repetition only when + hiding using asterisks is enabled (enabled by default) +- Entry attachments can now be renamed using in-place label + editing (click on an already selected item to show an edit + box) +- Empty entry attachments can now be created using 'Attach' -> + 'Create Empty Attachment' +- Sizes of entry attachments are now shown in a column of the + attachments list in the entry editing dialog +- Added {ENV_PROGRAMFILES_X86} placeholder (this is + %ProgramFiles(x86)%, if it exists, otherwise %ProgramFiles%) +- Added auto-type option 'An entry matches if one of its tags + is contained in the target window title' +- URLs in HTML exports are now linkified +- Import modules may now specify multiple default/equivalent + file extensions (like e.g. 'htm' and 'html') +- Added support for reading texts encoded using UTF-32 Big + Endian +- Enhanced text encoding detection (now detects UTF-32 LE/BE + and UTF-16 LE/BE by zeros, improved UTF-8 detection, ...) +- Added zoom function for images in internal data viewer +- Drop-down image buttons in the entry editing dialog are now + marked using small black triangle overlays +- Added support for loading key files from URLs +- Controls in the options dialog are now disabled when the + options are enforced (using an enforced configuration file) +- If KeePass is started with the '-debug' command line option, + KeePass now shows a developer-friendly error message when + opening a database file fails +- Added 'Wait for exit' property in the 'Execute command line / + URL' trigger action +- The 'File exists' trigger condition now also supports URLs +- Added two file closing trigger events (one raised before and + one after saving the database file) +- Plugins: added file closing events +- Plugins: added events (AutoType.Sequence*) that allow plugins + to provide auto-type sequence suggestions +- Added workaround to support loading data from version + information files even when they have incorrectly been + decompressed by a web filter +- Added workarounds for '°', '|' and '£' .NET SendKeys issues +- Added workaround for topmost window .NET/Windows issue (the + 'Always on Top' option now works even when switching to a + different window while KeePass is starting up) +- Added workaround for Mono dialog event ordering bug +- Added workaround for Mono clipboard bugs on MacOS +- KPScript: added 'MoveEntry', 'GetEntryString' and 'GenPw' + commands +- KPScript: added '-refx-UUID' and '-refx-Tags' entry + identification parameters + +- When only deleting history entries (without changing any data + field of an entry), no backup entry is created anymore +- Unified text encoding handling for internal data viewer and + editor, generic CSV importer and text encoding selection + dialog +- Improved font sizing in HTML exports/printouts +- Improved encoding of group names in HTML exports/printouts +- If an entry doesn't expire, 'Never expires' is now shown in + the 'Expiry Time' column in HTML exports/printouts +- The expiry edit control now accepts incomplete edits and the + 'Expires' checkbox is checked immediately +- The time component of the default expiry suggestion is now + 00:00:00 +- The last selected/focused item in the attachments list of the + entry editing dialog is now selected/focused after editing an + attachment +- Improved field to standard field mapping function +- Enhanced RoboForm importer to concatenate values of fields + with conflicting names +- Updated Spamex.com importer +- Removed KeePass 1.x CSV importer; users should use the new + generic CSV importer (which can import more data than the old + specialized 1.x CSV importer) +- When trying to open another database while a dialog is + displayed, KeePass now just brings itself to the foreground + without attempting to open the second database +- More list views use the Vista Explorer style +- Modifier keys without another key aren't registered as global + hot key anymore +- Improved default suggestions for custom sequences in the + auto-type sequence editing dialog +- Improved default focus in the auto-type sequence editing + dialog +- Added {C:Comment} placeholder in the auto-type sequence + editing dialog +- On Unix-like systems, the {GOOGLECHROME} placeholder now + first searches for Google Chrome and then (if not found) for + Chromium +- Versions displayed in the update checking dialog now consist + of at least two components +- Added '@' and '`' to the printable 7-bit ASCII character set +- Merged simple and extended special character spaces to one + special character space +- Reduced control character space from 60 to 32 +- The first sample entry's URL now points to the KeePass + website +- Improved key transformation delay calculation +- Improved key file loading performance +- The main menu now isn't a tab stop anymore +- Some configuration nodes are now allocated only on demand +- Improved UI update when moving/copying entries to the + currently active group or a subgroup of it using drag&drop +- Improved behavior when closing an inactive database having + unsaved changes +- Changed versioning scheme in file version information blocks + from digit- to component-based +- Development snapshots don't ask anymore whether to enable the + automatic update check (only stable releases do) +- Improved PLGX cache directory naming +- The PLGX cache directory by default is now located in the + local application data folder instead of the roaming one +- Improved support for PLGX plugins that are using LINQ +- Various UI improvements +- Various code optimizations +- Minor other improvements + +- Fixed sorting of items in the most recently used files list +- Fixed tab order in the 'Advanced' tab of the entry editing + dialog + +2012-01-05: 2.18 +- The update check now also checks for plugin updates (if + plugin developers provide version information files) +- When starting KeePass 2.18 for the first time, it asks + whether to enable the automatic update check or not (if not + enabled already) +- When closing the entry editing dialog by closing the window + (using [X], Esc, ...) and there are unsaved changes, KeePass + now asks whether to save or discard the changes; only when + explicitly clicking the 'Cancel' button, KeePass doesn't + prompt +- When not hiding passwords using asterisks, they don't need to + be repeated anymore +- Password repetition boxes now provide instant visual feedback + whether the password has been repeated correctly (if + incorrect, the background color is changed to light red) +- When clicking an '***' button to change the visibility of the + entered password, KeePass now automatically transfers the + input focus into the password box +- Visibility of columns in the auto-type entry selection dialog + can now be customized using the new 'Options' button +- Added auto-type option 'An entry matches if the host + component of its URL is contained in the target window title' +- Added shortcut keys: Ctrl+Shift+O for 'Open URL', + Ctrl+Shift+U for copying URLs to the clipboard, Ctrl+I for + 'Add Entry', Ctrl+R for synchronizing with a file, + Ctrl+Shift+R for synchronizing with a URL +- Ensuring same keyboard layouts during auto-type is now + optional (option enabled by default) +- Plain text KDB4 XML exports now store the memory protection + flag of strings in an attribute 'ProtectInMemory' +- Added option to use database lock files (intended for storage + providers that don't lock files while writing to them, like + e.g. some FTP servers); the option is turned off by default + (and especially for local files and files on a network share + it's recommended to leave it turned off) +- Added UIFlags bit for disabling the controls to specify after + how many days the master key should/must be changed +- Added support for in-memory protecting strings that are + longer than 65536 characters +- Added workaround for '@' .NET SendKeys issue + +- .NET 4.0 is now preferred, if installed +- PLGX plugins are now preferably compiled using the .NET 4.0 + compiler, if KeePass is currently running under the 4.0 CLR +- Automatic update checks are now performed at maximum once per + day (you can still check manually as often as you wish) +- Auto-Type: entry titles and URLs are now Spr-compiled before + being compared with the target window title +- Decoupled the options 'Show expired entries' and 'Show + entries that will expire soon' +- Specifying the data hiding setting (using asterisks) in the + column configuration dialog is now done using a checkbox +- The entry view now preferably uses the hiding settings + (asterisks) of the entry list columns +- Improved entry expiry date calculation +- Enhanced Password Agent importer to support version 2.6.2 +- Enhanced SplashID importer to import last modification dates +- Improved locating of system executables +- Password generator profiles are now sorted by name +- Separated built-in and user-defined password generator + profiles (built-in profiles aren't stored in the + configuration file anymore) +- Improved naming of shortcut keys, and shortcut keys are now + displayed in tooltips +- Internal window manager can now close windows opened in other + threads +- Improved entry touching when closing the entry editing dialog + by closing the window (using [X], Esc, ...) +- Improved behavior when entering an invalid URL in the 'Open + URL' dialog +- Improved workaround for Mono tab bar height bug +- ShInstUtil: improved Native Image Generator version detection +- Unified in-memory protection +- In-memory protection performance improvements +- Developers: in-memory protected objects are now immutable and + thread-safe +- Various UI text improvements +- Various code optimizations +- Minor other improvements + +- The cached/temporary custom icons image list is now updated + correctly after running the 'Delete unused custom icons' + command + +2011-10-19: 2.17 +- Multiple auto-type sequences can now be defined for a window + in one entry +- The auto-type entry selection dialog now displays the + sequence that will be typed +- The auto-type entry selection dialog is now resizable; + KeePass remembers the dialog's position, size and the list + view column widths +- Added auto-type option 'An entry matches if its URL is + contained in the target window title' +- Added two options to show dereferenced data in the main entry + list (synchronously or asynchronously) +- Dereferenced data fields are now shown in the entry view of + the main window and the auto-type entry selection dialog + (additionally to the references) +- Field references in the entry view are now clickable; when + clicking one, KeePass jumps to the data source entry +- Added option in the 'Find' dialog to search in dereferenced + data fields +- Added option to search in dereferenced data fields when + performing a quick search (toolbar in main window) +- The 'Find' dialog now shows a status dialog while searching + for entries +- The main window now shows a status bar and the UI is disabled + while performing a quick search +- Added context menu commands to open the URL of an entry in a + specific browser +- Added {SAFARI} browser path placeholder +- Added {C:...} comment placeholder +- Added entry duplication options dialog (appending "- Copy" to + entry titles, and/or replacing user names and passwords by + field references to the original entries) +- Added option to focus the quick search box when restoring + from taskbar (disabled by default) +- Added tray context menu command to show the options dialog +- Source fields are now compiled before using them in a + {PICKCHARS} dialog +- Added 'Copy Link' rich text box context menu command +- Before printing, the data/format dialog now shows a print + dialog, in which the printer can be selected +- Added application policy to ask for the current master key + before printing +- Added support for importing Passphrase Keeper 2.50 HTML files + (in addition to the already supported 2.70 format) +- KeePass now removes zone identifiers from itself, ShInstUtil + and the CHM help file +- Listing currently opened windows works under Unix-like + systems now, too +- Alternating item background colors are now also supported in + list views with item groups +- IOConnection now supports reading from data URIs (RFC 2397) +- Group headers are now skipped when navigating in single + selection list views using the arrow keys +- Added detection support for the following web browsers on + Unix-like systems: Firefox, Opera, Chromium, Epiphany, Arora, + Galeon and Konqueror +- Added documentation of the synchronization feature +- Key provider plugins can now declare that they're compatible + with the secure desktop mode, and a new property in the query + context specifies whether the user currently is on the secure + desktop +- Added workaround for a list view sorting bug under Windows XP +- Added workaround for a .NET bug where a cached window state + gets out of sync with the real window state +- Added workaround for a Mono WebRequest bug affecting WebDAV + support + +- Items in the auto-type entry selection dialog can now be + selected using a single click +- When performing global auto-type, the Spr engine now uses the + entry container database instead of the current database as + data source +- The generated passwords list in the password generator dialog + now uses the password font (monospace by default) +- The last modification time of an entry is now updated when a + new password is generated using the {NEWPASSWORD} placeholder +- The overlay icon for the taskbar button (on Windows 7) is now + restored when Windows Explorer crashes and when starting in + minimized and locked mode +- Improved opening of CHM help file +- The buttons in file save dialogs now have accelerator keys +- Separated URL scheme overrides into built-in and custom ones +- Improved tray command state updating +- The default tray command is now rendered using a bold font +- The main window is now disabled while searching and removing + duplicate entries +- Improved banner handling/updating in resizable dialogs +- The 'Ctrl+U' shortcut hint is now moved either to the open or + to the copy command, depending on whether the option 'Copy + URLs to clipboard instead of opening them' is enabled or not +- Improved command availability updating of rich text context + menus +- Quick searches are now invoked asynchronously +- Improved quick search performance +- The option to minimize the main window after locking the + KeePass workspace is now enabled by default +- When performing auto-type, newline characters are now + converted to Enter keypresses +- Auto-type on Unix-like systems: improved sending of backslash + characters +- On Unix-like systems, the default delay between auto-typed + keystrokes is now 3 ms +- Spr engine performance improvements +- Changing the in-memory protection state of a custom entry + string is now treated as a database change +- Some options in the options dialog are now linked (e.g. the + option 'Automatically search key files also on removable + media' can only be enabled when 'Automatically search key + files' is enabled) +- Most items with default values aren't written to the + configuration file anymore (resulting in a smaller file and + making it possible to change defaults in future versions) +- Path separators in the configuration file are now updated for + the current operating system +- Improved 'xdotool' version detection +- Improved I/O response handling when deleting/renaming files +- Various UI text improvements +- Various code optimizations +- Minor other improvements + +- Status bar text is now correctly updated to 'Ready' after an + unsuccessful/cancelled database opening attempt +- Password generation based on patterns: escaped curly brackets + are now parsed correctly + +2011-07-12: 2.16 +- When searching for a string containing a whitespace + character, KeePass now splits the terms and reports all + entries containing all of the terms (e.g. when you search for + "Forum KeePass" without the quotes, all entries containing + both "Forum" and "KeePass" are reported); the order of the + terms is arbitrary; if you want to search for a term + containing whitespace, enclose the term in quotes +- When searching for a term starting with a minus ('-'), all + entries that do not contain the term are reported (e.g. when + you search for "Forum -KeePass" without the quotes, all + entries containing "Forum" but not "KeePass" are reported) +- Added dialog in the options to specify a web proxy (none, + system or manual) and user name and password for it +- Added option to always exit instead of locking the workspace +- Added option to play the UAC sound when switching to a secure + desktop (enabled by default) +- Added filter box in the field references creation dialog +- Added command to delete duplicate entries (entries are + considered to be equal when their strings and attachments are + the same, all other data is ignored; if one of two equal + entries is in the recycle bin, it is deleted preferably; + otherwise the decision is based on the last modification + time) +- Added command to delete empty groups +- Added command to delete unused custom icons +- For Unix-like systems: new file-based IPC broadcast mechanism + (supporting multiple endpoints) +- For Unix-like systems: added file-based global mutex + mechanism +- Auto-type on Unix-like systems: added support for sending + square brackets and apostrophes +- Two-channel auto-type obfuscation is now supported on + Unix-like systems, too +- Web access on Unix-like systems: added workarounds for non- + implemented cache policy and credentials requirement +- Added context menu command to empty the recycle bin (without + deleting the recycle bin group) +- On Windows Vista and higher, when trying to delete a group, + the confirmation dialog now shows a short summary of the + subgroups and entries that will be deleted, too +- In the auto-type target window drop-down combobox, icons are + now shown left of the window names +- Added {CLEARFIELD} auto-type command (to clear the contents + of single-line edit controls) +- Added support for importing Sticky Password 5.0 XML files + (formatted memos are imported as RTF file attachments, which + you can edit using the internal KeePass editor; e.g. right- + click on the entry in the main window and go 'Attachments' -> + 'Edit Notes.rtf' or click on the attachment in the entry view + at the bottom of the main window; see 'How to store and work + with large amounts of formatted text?' in the FAQ) +- Added support for importing Kaspersky Password Manager 5.0 + XML files (formatted memos are imported the same as by the + Sticky Password importer, see above) +- Password Depot importer: added support for more fields (new + time fields and usage count), time fields can be imported + using the stored format specifier, vertical tabulators are + removed, improved import of information cards, and auto-type + sequences are converted now +- Added ability to export links into the root directory of + Windows/IE favorites +- Windows/IE favorites export: added configuration items to + specify a prefix and a suffix for exported links/files +- In the entry editing dialog, KeePass now opens an attachment + either in the internal editor or in the internal viewer, + depending on whether the format is supported by the editor +- When creating a new database, KeePass now automatically + creates a second sample entry, which is configured for the + test form in the online help center +- Added configuration option to disable the 'Options', + 'Plugins' and/or 'Triggers' menu items +- Added workaround for Mono tab bar height bug +- Added workaround for Mono FTP bug +- Added workaround for Mono CryptoStream bug +- Added workaround for a Mono bug related to focusing list view + items +- Added shell script to prepare the sources for MonoDevelop +- Translations can now also be loaded from the KeePass + application data directory +- TrlUtil: added support for ellipses as alternative to 3 dots +- KPScript: added 'DetachBins' command to save all entry + attachments (into the directory of the database) and remove + them from the database + +- After performing a quick-find, the search text is now + selected +- Improved quick-find deselection performance +- On Unix-like systems, command line parameters prefixed with a + '/' are now treated as absolute file paths instead of options +- Improved IPC support on Unix-like systems +- Locked databases can now be dismissed using the close command +- Invalid target windows (like the taskbar, own KeePass + windows, etc.) are not shown in the auto-type target window + drop-down combobox anymore +- Newly created entries are now selected and focused +- The entry list is now focused when duplicating and selecting + all entries +- If KeePass is blocked from showing a dialog on the secure + desktop, KeePass now shows the dialog on the normal desktop +- Improved dialog initialization on the secure desktop +- The current status is now shown while exporting Windows/IE + favorites +- Windows/IE favorites export: improved naming of containing + folder when exporting selected entries only +- Windows/IE favorites export: if a group doesn't contain any + exportable entry, no directory is created for this group + anymore +- Improved data editor window position/size remembering +- Key modifiers of shortcut key strings are translated now +- Shortcut keys of group and entry commands are now also shown + in the main menu +- When no template entries are specified/found, this is now + indicated in the 'Add Entry' toolbar drop-down menu +- When deleting a group, its subgroups and entries are now + added correctly to the list of deleted objects +- Font handling improvements +- Improved lock timeout updating when a dialog is displayed +- Improved export error handling +- Improved FIPS compliance problems self-test (error message + immediately at start), and specified configuration option to + prevent .NET from enforcing FIPS policy +- Various code optimizations +- Minor other improvements + +- Last modification time is now updated when restoring an older + version of an entry +- When duplicating an entry, the UUIDs of history items are now + changed, too + +2011-04-10: 2.15 +- Added option to show the master key dialog on a secure + desktop (similar to Windows' UAC; almost no keylogger works + on a secure desktop; the option is disabled by default for + compatibility reasons) +- Added option to limit the number of history items per entry + (the default is 10) +- Added option to limit the history size per entry (the default + is 6 MB) +- Added {PICKCHARS} placeholder, which shows a dialog to pick + certain characters from an entry string; various options like + specifying the number of characters to pick and conversion to + down arrow keypresses are supported; see the one page long + documentation on the auto-type help page; the less powerful + {PICKPASSWORDCHARS} is now obsolete (but still supported for + backward compatibility) +- The character picking dialog now remembers and restores its + last position and size +- KDBX file format: attachments are now stored in a pool within + the file and entries reference these items; this reduces the + file size a lot when there are history items of entries + having attachments +- KDBX file format: attachments are now compressed (if the + compression option is enabled) before being Base64-encoded, + compressed and encrypted; this results in a smaller file, + because the compression algorithm works better on the raw + data than on its encoded form +- PLGX plugins can now be loaded on Unix-like systems, too +- Added option to specify a database color; by specifying a + color, the main window icon and the tray icon are recolored + and the database tab (shown when multiple databases are + opened in one window) gets a colored rectangle icon +- New rich text builder, which supports using multiple + languages in one text (e.g. different Chinese variants) +- Added 'Sort By' popup menu in the 'View' menu +- Added context menu commands to sort subgroups of a group +- Added option to clear master key command line parameters + after using them once (enabled by default) +- Added application policies to ask for the current master key + before changing the master key and/or exporting +- Added option to also unhide source characters when unhiding + the selected characters in the character picking dialog +- Added ability to export custom icons +- Added 'String' trigger condition +- Added support for importing DataViz Passwords Plus 1.007 CSV + files +- Enhanced 1Password Pro importer to also support 1PW CSV files +- Enhanced FlexWallet importer to also support version 2006 XML + files (in addition to version 1.7 XML files) +- Enabled auto-suggest for editable drop-down combo boxes (and + auto-append where it makes sense) +- Pressing Ctrl+Enter in the rich text boxes of the entry + dialog and the custom string dialog now closes with OK (if + possible) +- Added option to cancel auto-type when the target window + changes +- Auto-type on Unix-like systems: added support for key + modifiers +- Added '--saveplgxcr' command line option to save compiler + results in case the compilation of a PLGX plugin fails +- Added workaround for % .NET SendKeys issue +- Added workaround for Mono bug 620618 in the main entry list + +- Improved key file suggestion performance +- When the master key change application policy is disabled and + the master key expires (forced change), KeePass now shows the + two information dialogs only once per opening +- After removing the password column, hiding behind asterisks + is suggested by default now when showing the column again +- TAN entries now expire on auto-type, if the option for + expiring TANs on use is enabled +- Auto-type now sends acute and grave accents as separate + characters +- Auto-type now explicitly skips the taskbar window when + searching for the target window +- Multiple lines are now separated in the entry list and in the + custom string list of the entry dialog by a space +- RoboForm importer: improved multiline value support +- Improved UNC path support +- Improved entry list refresh performance +- Improved UI state update performance +- Entry list context menus are now configured instantly +- Inapplicable group commands are now disabled +- Improved control focusing +- Improved clipboard handling +- Copying and pasting whole entries is now also supported on + Windows 98 and ME +- Improved releasing of dialog resources +- Improved keys/placeholders box in auto-type editing dialog +- Improved user-friendliness in UAC dialogs +- Tooltips of the tab close button and the password repeat box + can be translated now +- Improved help (moved placeholders to separate page, ...) +- KeePassLibSD now uses the SHA-256 implementation of Bouncy + Castle +- Upgraded installer +- Various code optimizations +- Minor other improvements + +- Window titles are now trimmed, such that auto-type also works + with windows whose titles have leading or trailing whitespace + characters +- Detection of XSL files works under Linux/MacOS now, too + +2011-01-02: 2.14 +- Added option to lock after some time of global user + inactivity +- Added option to lock when the remote control status changes +- Auto-type on Unix-like systems: added special key code + support (translation to X KeySyms) and support for {DELAY X} + and {DELAY=X} +- Added window activation support on Unix-like systems +- Auto-type on Windows: added {VKEY X} special key code (sends + virtual key X) +- Added support for importing DataVault 4.7 CSV files +- Added support for importing Revelation 0.4 XML files +- Added 'Auto-Type - Without Context' application policy to + disable the 'Perform Auto-Type' command (Ctrl+V), but still + leave global auto-type available +- Added option to collapse newly-created recycle bin tree nodes +- Added 'Size' column in the history list of the entry dialog +- Added trigger action to remove custom toolbar buttons +- Added kdbx:// URL scheme overrides (for Windows and Unix-like + systems; disabled by default) +- Added KeePass.exe.config file to redirect old assemblies to + the latest one, and explicitly declare .NET 4.0 runtime + support +- Added documentation for the '-pw-enc' command line parameter, + the {PASSWORD_ENC} placeholder and URL overrides +- Added workaround for ^/& .NET SendKeys issue + +- New locking timer (using a timeout instead of a countdown) +- Improved locking when the Windows session is being ended or + switched +- Improved multi-database locking +- Separated the options for locking when the computer is locked + and the computer is about to be suspended +- {FIREFOX} placeholder: added support for registry-redirected + 32-bit Firefox installations on 64-bit Windows systems +- File transactions: the NTFS/EFS encryption flag is now also + preserved when the containing directory isn't encrypted +- The IPC channel name on Unix-like systems is now dependent on + the current user and machine name +- KeePass now selects the parent group after deleting a group +- Entries are now marked as modified when mass-changing their + colors or icons +- Key states are now queried on interrupt level +- A {DELAY=X} global delay now affects all characters of a + keystroke sequence when TCATO is enabled, too +- Improved dialog closing when exiting automatically +- Plugin-provided entry list columns can now be right-aligned + at KeePass startup already +- Removed KDBX DOM code +- Installer: the KeePass start menu shortcut is now created + directly in the programs folder; the other shortcuts have + been removed (use the Control Panel for uninstalling and the + 'Help' menu in KeePass to access the help) +- Various code optimizations +- Minor other improvements + +- Quotes in parameters for the 'Execute command line / URL' + trigger action are now escaped correctly +- Auto-type on Unix-like systems: window filters without + wildcards now match correctly + +2010-09-06: 2.13 +- Password quality estimation algorithm: added check for about + 1500 most common passwords (these are rated down to 1/8th of + their statistical rating; Bloom filter-based implementation) +- Global auto-type (using a system-wide hot key) is now + possible on Unix-like systems (see the documentation for + setup instructions, section 'Installation / Portability' in + the 'KeePass 2.x' group; thanks to Jordan Sissel for + enhancing 'xdotool') +- Added IPC functionality for Unix-like systems +- Added possibility to write export plugins that don't require + an output file +- Tag lists are sorted alphabetically now +- Password text boxes now use a monospace font by default +- Added option to select a different font for password text + boxes (menu 'Tools' -> 'Options' -> tab 'Interface') +- Added support for importing Password Prompter 1.2 DAT files +- Added ability to export to Windows/IE favorites +- Added ability to specify I/O credentials in the 'Synchronize' + trigger action +- Added ability to specify I/O credentials and a master key in + the 'Open database file' trigger action +- If I/O credentials are stored, they are now obfuscated +- Custom colors in the Windows color selection dialog are now + remembered +- Added high resolution version of the KeePass application icon +- Improved lock overlay icon (higher resolution) +- PLGX loader: added support for unversioned KeePass assembly + references + +- Added workaround to avoid alpha transparency corruption when + adding images to an image list +- Improved image list generation performance +- Added workaround to display the lock overlay icon when having + enabled the option to start minimized and locked +- Improved group and entries deletion confirmation dialogs + (with preview; only Windows Vista and higher) +- The password character picking dialog now offers the raw + password characters instead of an auto-type encoded sequence +- PINs importer: improved importing of expiry dates +- Some button icons are now resized to 16x15 when the 16x16 + icon is too large +- Renamed character repetition option in the password generator + for improved clarity +- Improved workspace locking +- Locking timer is now thread-safe +- Added code to prevent loading libraries from the current + working directory (to avoid binary planting attacks) +- Removed Tomboy references (on Unix-like systems) +- Various code optimizations +- Minor other improvements + +- {NEWPASSWORD} placeholder: special characters in generated + passwords are now transformed correctly based on context + (auto-type, command line, etc.) + +2010-07-09: 2.12 +- Auto-type window definitions in custom window-sequence pairs + are now Spr-compiled (i.e. placeholders, environment + variables, etc. can be used) +- Global auto-type delay: added support for multi-modified keys + and special keys +- Added 'New Database' application policy flag +- Added 'Copy Whole Entries' application policy flag +- Multi-monitor support: at startup, KeePass now ensures that + the main window's normal area at least partially overlaps the + virtual screen rectangle of at least one monitor +- RoboForm importer: URLs without protocol prefix are now + prefixed automatically (HTTP) +- Entry-dependent placeholders can now be used in most trigger + events, conditions and actions (the currently focused entry + is used) +- Auto-type on Unix-like systems: KeePass now shows an + informative error message when trying to invoke auto-type + without having installed the 'xdotool' package + +- New column engine: drag&dropping hidden fields works as + expected again (the field data is transferred, not asterisks) +- Improved restoration of a maximized main window +- Improved error message when trying to import/export data + from/to a KDB file on a non-Windows operating system +- Minor other improvements + +2010-07-03: 2.11 +- Added entry tags (you can assign tags to entries in the entry + editing window or by using the 'Selected Entries' context + menu; to list all entries having a specific tag, choose the + tag either in the 'Edit' main menu or in the 'Show Entries' + toolbar drop-down button) +- Completely new entry list column engine; the columns are + dynamic now, custom entry strings can be shown in the list, + to configure go 'View' -> 'Configure Columns...'; the column + engine is also extensible now, i.e. plugins can provide new + columns +- Added 'Size' entry list column (shows the approximate memory + required for the entry) +- Added 'History (Count)' entry list column (double-clicking a + cell of this column opens the entry editing window and + automatically switches to the 'History' tab) +- Added 'Expiry Time (Date Only)' entry list column +- Added options to specify the number of days until the master + key of a database is recommended to and/or must be changed +- Added support for exporting selected entries to KDB +- Added 'FileSaveAsDirectory' configuration key to specify the + default directory for 'Save As' database file dialogs +- Double-clicking a history entry in the entry editing dialog + now opens/views the entry +- It's now possible to tab from menus and toolbars to dialog + controls +- Added option to turn off hiding in-memory protected custom + strings using asterisks in the entry view +- Added workaround for FTP servers sending a 550 error after + opening and closing a file without downloading data +- Added 'Unhide Passwords' application policy flag +- Password Depot importer: some icons are converted now +- {GOOGLECHROME} placeholder: updated detection code to also + support the latest versions of Chrome +- The main window now uses the shell font by default +- On Windows Vista and higher, Explorer-themed tree and list + views are now used in the main window +- On Windows 7 and higher, the main window peek preview is now + disabled when the KeePass workspace is locked +- Installer: added option to optimize the on-demand start-up + performance of KeePass +- TrlUtil: added 3 dots string validation + +- Improved entry list item selection performance (defer UI + state update on selection change burst) +- Improved special key code conversion in KDB importer +- Icon picker dialog now has a 'Close' button +- When sorting is enabled, the entry list view now doesn't get + destroyed anymore when trying to move entries +- Main window is now brought to the foreground when untraying +- Removed grid lines option +- Reduced size of MSI file +- Various performance improvements +- Various code optimizations +- Minor other improvements + +- No file path is requested anymore when double-clicking an + import source that doesn't require a file + +2010-03-05: 2.10 +- Translation system: added support for right-to-left scripts +- Added {HMACOTP} placeholder to generate HMAC-based one-time + passwords as specified in RFC 4226 (the shared secret is the + UTF-8 representation of the value of the 'HmacOtp-Secret' + custom entry string field, and the counter is stored in + decimal form in the 'HmacOtp-Counter' field) +- On Windows 7, KeePass now shows a 'locked' overlay icon on + the taskbar button when the database is locked +- On Windows 7, the database loading/saving progress is now + shown on the taskbar button +- Added option to disable automatic searching for key files +- Added KDBX database repair functionality (in File -> Import) +- Added support for expired root groups +- Added global delay support for shifted special keys +- Added 'Change Master Key' application policy flag +- Added 'Edit Triggers' application policy flag +- Added trigger action to activate a database (select tab) +- Added configuration options to allow enforcing states + (enabled, disabled, checked, unchecked) of key source + controls in the master key creation and prompt dialogs + (see 'Composite Master Key' documentation page) +- Added option to disable the 'Save' command (instead of + graying it out) if the database hasn't been modified +- Added support for importing KeePassX 0.4.1 XML files +- Added support for importing Handy Safe 5.12 TXT files +- Added support for importing Handy Safe Pro 1.2 XML files +- Added support for importing ZDNet's Password Pro 3.1.4 TXT + files +- Added dialog for selecting the encoding of text files to be + attached to an entry +- Added option to search for passwords in quick finds (disabled + by default) +- Added Ctrl+S shortcut in the internal data editor +- Internal data editor window can now be maximized +- Document tabs can now be closed by middle-clicking on them +- Most strings in the trigger system are now Spr-compiled (i.e. + placeholders, environment variables, etc. can be used) +- Added '--lock-all' and '--unlock-all' command line options to + lock/unlock the workspaces of all other KeePass instances +- Added 'pw-enc' command line option and {PASSWORD_ENC} + placeholder +- Added preliminary auto-type support for Linux (right-click on + an entry and select 'Perform Auto-Type'; the 'xdotool' + package is required) +- Added option to enforce using the system font when running + under KDE and Gnome (option enabled by default) +- HTML exports are now XHTML 1.0 compliant +- Printing: added option to sort entries +- Printing: group names are now shown as headings +- KPScript: added '-CreateBackup' option for the EditEntry + command (to create backups of entries before modifying them) +- The PLGX plugin cache root path can now be specified in the + configuration file (Application/PluginCachePath) +- Plugin developers: added ability to write entropy providers + that can update the internal pool of the cryptographically + strong random number generator +- Plugin developers: added some public PwEntryForm properties, + events and methods +- Plugin developers: added entry template events +- Plugin developers: added group and entry touching events +- Plugin developers: added main window focus changing event +- Plugin developers: added support for writing format providers + for the internal attachments viewer + +- Expired icons of groups are non-permanent now +- Improved search performance and in-memory protection + compatibility +- The SendKeys class now always uses the SendInput method (not + JournalHook anymore) +- Improved auto-type delay handling +- Two-channel auto-type obfuscation: added support for default + delays +- The default auto-type delay is now 10 ms +- Improved top-most window auto-type support +- Improved high DPI support (text rendering, banners, ...) +- Temporary file transaction files are now deleted before + writing to them +- Broadcasted file IPC notification messages do not wait + infinitely for hanging applications anymore +- On Windows XP and higher, KeePass now uses alpha-transparent + icons in the main entry list +- In the entry editing dialog, when moving a custom string to a + standard field, the string is now appended to the field + (instead of overwriting the previous contents of the field) +- Improved UTF-8 encoding (don't emit byte order marks) +- Improved field to standard field mapping function +- HTML exports do not contain byte-order marks anymore +- For improved clarity, some controls are now renamed/changed + dynamically when using the password generator without having + a database open +- Improved auto-type definition conversion for KDB exports +- Standard field placeholders are now correctly removed when + auto-typing, if the standard field doesn't exist +- Improved icon picker cancel blocking when removing an icon +- The default workspace locking time is now 300 seconds (but + the option is still disabled by default) +- Modern task dialogs are now displayed on 64-bit Windows + systems, too +- Improved file corruption error messages +- Improved entry attachments renaming method +- Double-clicking an attachment in the entry editing dialog now + opens it in the internal viewer (the internal editor can only + be invoked in the main window) +- When attachments are edited using the internal editor, the + entry's last modification time is now updated +- Improved plugin loading (detect PLGX cache files) +- If the application policy disallows clipboard operations, + KeePass doesn't unnecessarily decrypt sensitive data anymore +- Added tooltip for the 'View' toolbar drop-down button +- Improved menu accelerator and shortcut keys +- Upgraded installer +- Installer: various minor improvements +- Various performance improvements +- Various code optimizations +- Minor other improvements + +- No exception is thrown anymore when lowering the clipboard + auto-clear time in the options below the value of a currently + running clearing countdown +- The 'Show expired entries' functionality now also works when + there's exactly one matching entry + +2009-09-12: 2.09 +- Added option to use file transactions when writing databases + (enabled by default; writing to a temporary file and + replacing the actual file afterwards avoids data loss when + KeePass is prevented from saving the database completely) +- Added PLGX plugin file format +- Enhanced database synchronization by structure merging + (relocation/moving and reordering groups and entries) +- Added synchronization 'Recent Files' list (in 'File' menu) +- Synchronization / import: added merging of entry histories +- Synchronization / import: backups of current entries are + created automatically, if their data would be lost in the + merging process +- Database name, description, default user name, entry + templates group and the recycle bin settings are now + synchronized +- Added {NEWPASSWORD} placeholder, which generates a new + password for the current entry, based on the "Automatically + generated passwords for new entries" generator profile; this + placeholder is replaced once in an auto-type process, i.e. + for a typical 'Old Password'-'New Password'-'Repeat New + Password' dialog you can use + {PASSWORD}{TAB}{NEWPASSWORD}{TAB}{NEWPASSWORD}{ENTER} +- Added scheme-specific URL overrides (this way you can for + example tell KeePass to open all http- and https-URLs with + Firefox or Opera instead of the system default browser; PuTTY + is set as handler for ssh-URLs by default; see Options -> + Integration) +- Added option to drop to the background when copying data to + the clipboard +- Added option to use alternating item background colors in the + main entry list (option enabled by default) +- The Ctrl+E shortcut key now jumps to the quick search box +- Added auto-type sequence conversion routine to convert key + codes between 1.x and 2.x format +- Added workaround for internal queue issue in SendKeys.Flush +- Added more simple clipboard backup routine to workaround + clipboard issues when special formats are present +- Added native clipboard clearing method to avoid empty data + objects being left in the clipboard +- Added import support for custom icons +- Added {GOOGLECHROME} placeholder, which is replaced by the + executable path of Google Chrome, if installed +- Added {URL:RMVSCM} placeholder, which inserts the URL of the + current entry without the scheme specifier +- Added ability to search for UUIDs and group names +- Toolbar searches now also search in UUIDs and group names +- Added {DELAY=X} placeholder to specify a default delay of X + milliseconds between standard keypresses in this sequence +- Added option to disable verifying written database files +- Attachment names in the entry view are now clickable (to open + the attachments in the internal editor or viewer) +- Added Unicode support in entry details view +- Added option to render menus and toolbars with gradient + backgrounds (enabled by default) +- MRU lists now have numeric access keys +- Added '--entry-url-open' command line option (specify the + UUID of the entry as '--uuid:' command line parameter) +- Added 'Application initialized' trigger event +- Added 'User interface state updated' trigger event +- Added host reachability trigger condition +- Added 'Active database has unsaved changes' trigger condition +- Added 'Save active database' trigger action +- Added database file synchronization trigger action +- Added database file export trigger action +- KeePass now restores the last view when opening databases +- Added system-wide hot key to execute auto-type for the + currently selected entry (configurable in the options) +- Added option to disable auto-type entry matching based on + title (by default an entry matches if its title is contained + in the target window title) +- Added option to disable marking TAN entries as expired when + using them +- Added option to focus the quick search box when restoring + from tray (disabled by default) +- Added entry context menu commands to sort by UUID and + file attachments +- Custom string fields are now appended to the notes when + exporting to KeePass 1.x KDB files +- Enforced configuration files are now item-based (items not + defined in the enforced configuration file are now loaded + from the global/local configuration files instead of being + set to defaults) +- File transactions are used when writing configuration files +- KPScript: added 'ChangeMasterKey' command +- ShInstUtil: added check for the presence of .NET +- TrlUtil: added command under 'Import' that loads 2.x LNGX + files without checking base hashes +- TrlUtil: added control docking support +- Plugin developers: added static window addition and removal + events to the GlobalWindowManager class +- Plugin developers: added ability to write custom dialog + banner generators (CustomGenerator of BannerFactory) +- Plugin developers: the IOConnectionInfo of the database is + now accessible through the key provider query context +- Plugin developers: added static auto-type filter events + (plugins can provide own placeholders, do sequence + customizations like inserting delays, and provide alternative + key sending methods) +- Plugin developers: added UIStateUpdated main window event + +- Simple text boxes now convert rich text immediately +- Improved entry change detection (avoid unnecessary backups + when closing the entry dialog with [OK] but without any + changes; detect by content instead of change events) +- Header in entry selection dialog is now non-clickable +- Entry list header now uses native sorting icons +- Key providers are now remembered separately from key files +- The main window is now the owner of the import method dialog +- The global URL override is now also applied for main entry + URLs in the entry details view +- Improved grouping behavior when disabling entry sorting +- Improved field mapping in RoboForm import +- Root groups now support custom icons +- In the entry dialog, string values are now copied to the + clipboard instead of asterisks +- Improved import/synchronization status dialog +- Improved import/synchronization error message dialogs +- Entry history items are now identified by the last + modification time instead of last access time +- The trigger system can now be accessed directly through + 'Tools' -> 'Triggers...', not the options anymore +- Changed order of commands in the 'Tools' menu +- Improved auto-type target window validity checking +- Ctrl-V does not make the main window lose the focus anymore + if auto-type is disabled for the currently selected entry +- When restoring from tray, the main window is now brought to + the foreground +- Double-clicking an icon in the icon picker dialog now chooses + the icon and closes the dialog +- When adding a custom icon to the database, the new icon is + selected automatically +- When opening a database by running KeePass.exe with the + database file path as parameter (and single instance option + enabled), the existing KeePass instance will not prompt for + keys of previously locked databases anymore when restoring + (they are just left in locked state) +- Unlocking routine doesn't display multiple dialogs anymore +- Improved shortcut key handling in main window +- Master key change success message now has a distinguishable + window title +- Improved start position and focus of the URL dialog +- Improved layout in options dialog +- Improved UUID and UI updates when removing custom icons +- Improved window deconstruction when closing with [X] +- Improved user activity detection +- Improved state updating of sorting context menu commands +- Improved sorting by UUIDs +- Improved naming of options to clarify their meaning +- Converted ShInstUtil to a native application (in order to be + able to show a warning in case .NET is not installed) +- Plugins: improved IOConnection to allow using registered + custom WebRequest descendants (WebRequest.RegisterPrefix) +- TrlUtil: improved XML comments generation +- Various code optimizations +- Minor other improvements + +- Password profile derivation function doesn't incorrectly + always add standard character ranges anymore +- In-memory protection for the title field of new entries can + be enabled now + +2009-07-05: 2.08 +- Key transformation library: KeePass can now use Windows' + CNG/BCrypt API for key transformations (about 50% faster than + the KeePass built-in key transformation code; by increasing + the amount of rounds by 50%, you'll get the same waiting time + as in 2.07, but the protection against dictionary and + guessing attacks is raised by a factor of 1.5; only Windows + Vista and higher) +- Added support for sending keystrokes (auto-type) to windows + that are using different keyboard layouts +- Added option to remember key file paths (enabled by default) +- Added internal editor for text files (text only and RTF + formatted text; editor can edit entry attachments) +- Internal data viewer: added support for showing rich text + (text with formatting) +- Added inheritable group settings for disabling auto-type and + searching for all entries in this group (see tab 'Behavior'); + for new recycle bins, both properties are set to disabled +- Added new placeholders: {DB_PATH}, {DB_DIR}, {DB_NAME}, + {DB_BASENAME}, {DB_EXT}, {ENV_DIRSEP}, {DT_SIMPLE}, + {DT_YEAR}, {DT_MONTH}, {DT_DAY}, {DT_HOUR}, {DT_MINUTE}, + {DT_SECOND}, {DT_UTC_SIMPLE}, {DT_UTC_YEAR}, {DT_UTC_MONTH}, + {DT_UTC_DAY}, {DT_UTC_HOUR}, {DT_UTC_MINUTE}, {DT_UTC_SECOND} +- The password character picking dialog now supports pre- + defining the number of characters to pick; append :k in the + placeholder to specify a length of k (for example, + {PICKPASSWORDCHARS3:5} would be a placeholder with ID 3 and + would pick 5 characters from the password); advantage: when + having picked k characters, the dialog closes automatically, + i.e. saves you to click [OK] +- IDs in {PICKPASSWORDCHARSn} do not need to be consecutive + anymore +- The password character picking dialog now first dereferences + passwords (i.e. placeholders can be used here, too) +- Added '-minimize' command line option +- Added '-iousername', '-iopassword' and '-iocredfromrecent' + command line options +- Added '--auto-type' command line option +- Added support for importing FlexWallet 1.7 XML files +- Added option to disable protecting the clipboard using the + CF_CLIPBOARD_VIEWER_IGNORE clipboard format +- Added support for WebDAV URLs (thanks to Ryan Press) +- Added shortcut keys in master key prompt dialog +- Added entry templates functionality (first specify an entry + templates group in the database settings dialog, then use the + 'Add Entry' toolbar drop-down button) +- Added AceCustomConfig class (accessible through host + interface), that allows plugins to store their configuration + data in the KeePass configuration file +- Added ability for plugins to store custom data in KDBX + database files (PwDatabase.CustomData) +- Added interface for custom password generation algorithm + plugins +- URLs in the entry preview window are now always clickable + (especially including cmd:// URLs) +- Added option to copy URLs to the clipboard instead of opening + them (Options -> Interface, turned off by default) +- Added option to automatically resize entry list columns when + resizing the main window (turned off by default) +- Added 'Sync' command in KPScript scripting tool +- Added FIPS compliance problems self-test (see FAQ for details + about FIPS compliance) +- Added Rijndael/AES block size validation and configuration +- Added NotifyIcon workaround for Mono under MacOS +- Added confirmation box for empty master passwords +- Added radio buttons in auto-type sequence editing dialog to + choose between the default entry sequence and a custom one +- Added hint that group notes are shown in group tooltips +- Added test for KeePass 1.x plugins and an appropriate error + message +- Added interface for writing master password requirements + validation plugins +- Key provider plugin API: enhanced key query method by a + context information object +- Key provider plugin API: added 'DirectKey' property to key + provider base class that allows returning keys that are + directly written to the user key data stream +- Key provider plugin API: added support for exclusive plugins +- The '-keyfile' command line option now supports selecting key + providers (plugins) +- Auto-Type: added option to send an Alt keypress when only the + Alt modifier is active (option enabled by default) +- Added warning when trying to use only Alt or Alt-Shift as + global hot key modifier +- TrlUtil: added search functionality and toolbar +- TrlUtil: version is now shown in the window title + +- Improved database file versioning and changed KDBX file + signature in order to prevent older versions from corrupting + newer files +- ShInstUtil now first tries to uninstall a previous native + image before creating a new one +- Improved file corruption error messages (instead of index out + of array bounds exception text, ...) +- The 'Open in Browser' command now opens all selected entries + instead of just the focused one +- Data-editing commands in the 'Tools' menu in the entry dialog + are now disabled when being in history viewing mode +- Right arrow key now works correctly in group tree view +- Entry list is now updated when selecting a group by pressing + a A-Z, 0-9 or numpad key +- Improved entry list performance and sorting behavior +- Improved splitter distance remembering +- Improved self-tests (KeePass now correctly terminates when a + self-test fails) +- The attachment column in the main window now shows the names + of the attached files instead of the attachments count +- Double-clicking an attachment field in the main window now + edits (if possible) or shows the first attachment of the + entry +- Group modification times are now updated after editing groups +- Improved scrolling of the entry list in item grouping mode +- Changed history view to show last modification times, titles + and user names of history entries +- KeePass now also automatically prompts to unlock when + restoring to a maximized window +- Improved file system root directory support +- Improved generic CSV importer preview performance +- When saving a file, its path is not remembered anymore, if + the option for opening the recently used file at startup is + disabled +- Improved auto-type input blocking +- Instead of a blank text, the entry dialog now shows + "(Default)" if the default auto-type sequence is used in a + window-sequence association +- Most broadcasted Windows messages do not wait for hanging + applications anymore +- Improved main window hiding at startup when the options to + minimize after opening a database and to tray are enabled +- Default tray action is now dependent on mouse button +- New entries can now inherit custom icons from their parent + groups +- Improved maximized state handling when exiting while the main + window is minimized +- Improved state updating in key creation form +- Improved MRU list updating performance +- Improved plugin incompatibility error message +- Deprecated {DOCDIR}, use {DB_DIR} instead ({DOCDIR} is still + supported for backward compatibility though) +- Last modification times of TAN entries are now updated +- F12 cannot be registered as global hot key anymore, because + it is reserved for kernel-mode / JIT debuggers +- Improved auto-type statement conversion routine in KeePass + 1.x KDB file importer +- Improved column width calculation in file/data format dialog +- Improved synchronization status bar messages +- TrlUtil: base hash for forms is now computed using the form's + client rectangle instead of its window size +- Various code optimizations +- Minor other improvements + +- Recycle bin is now cleared correctly when clearing the + database + +2009-03-14: 2.07 Beta +- Added powerful trigger system (when events occur, check some + conditions and execute a list of actions; see options dialog + in 'Advanced'; more events / conditions / actions can be + added later based on user requests, and can also be provided + by plugins) +- Native master key transformations (rounds) are now computed + by the native KeePassLibC support library (which contains the + new, highly optimized transformation code used by KeePass + 1.15, in two threads); on dual/multi core processors this + results in almost triple the performance as before (by + tripling the amount of rounds you'll get the same waiting + time as in 2.06, but the protection against dictionary and + guessing attacks is tripled) +- Added recycle bin (enabled by default, it can be disabled in + the database settings dialog) +- Added Salsa20 stream cipher for CryptoRandomStream (this + algorithm is not only more secure than ArcFour, but also + achieves a higher performance; CryptoRandomStream defaults to + Salsa20 now; port developers: KeePass uses Salsa20 for the + inner random stream in KDBX files) +- KeePass is now storing file paths (last used file, MRU list) + in relative form in the configuration file +- Added support for importing 1Password Pro CSV files +- Added support for importing KeePass 1.x XML files +- Windows XP and higher: added support for double-buffering in + all list views (including entry lists) +- Windows Vista and higher: added support for alpha-blended + marquee selection in all list views (including entry lists) +- Added 'EditEntry', 'DeleteEntry', 'AddEntries' and + 'DeleteAllEntries' commands in KPScript scripting tool +- Added support for importing special ICO files +- Added option to exit instead of locking the workspace after + the specified time of inactivity +- Added option to minimize the main window after locking the + KeePass workspace +- Added option to minimize the main window after opening a + database +- Added support for exporting to KDBX files +- Added command to remove deleted objects information +- TrlUtil now checks for duplicate accelerator keys in dialogs +- Added controls in the entry editing dialog to specify a + custom text foreground color for entries +- KeePass now retrieves the default auto-type sequence from + parent groups when adding new entries +- The password character picking dialog can now be invoked + multiple times when auto-typing (use {PICKPASSWORDCHARS}, + {PICKPASSWORDCHARS2}, {PICKPASSWORDCHARS3}, etc.) +- Added '-set-urloverride', '-clear-urloverride' and + '-get-urloverride' command line options +- Added '-set-translation' command line option +- Added option to print custom string fields in details mode +- Various entry listings now support custom foreground and + background colors for entry items +- Added 'click through' behavior for menus and toolbars +- File association methods are now UAC aware + +- User interface is now blocked while saving to a file (in + order to prevent accidental user actions that might interfere + with the saving process) +- Improved native modifier keys handling on 64-bit systems +- Improved application startup performance +- Added image list processing workaround for Windows 7 +- OK button is now reenabled after manually activating the key + file checkbox and selecting a file in the master key dialog +- The master key dialog now appears in the task bar +- When KeePass is minimized to tray and locked, pressing the + global auto-type hot key doesn't restore the main window + anymore +- The installer now by default installs KeePass 1.x and 2.x + into separate directories in the program files folder +- The optional autorun registry keys of KeePass 1.x and 2.x do + not collide anymore +- File type association identifiers of KeePass 1.x and 2.x do + not collide anymore +- File MRU list now uses case-insensitive comparisons +- Improved preview updates in Print and Data Viewer dialogs +- Message service provider is thread safe now +- Threading safety improvements in KPScript scripting plugin +- Improved control state updates in password generator dialog +- Improved master password validation in 'New Database' dialog +- Times are now stored as UTC in KDBX files (ISO 8601 format) +- Last access time fields are now updated when auto-typing, + copying fields to the clipboard and drag&drop operations +- KPScript scripting tool now supports in-memory protection +- Database is not marked as modified anymore when closing the + import dialog with Cancel +- Added asterisks in application policy editing dialog to make + clearer that changing the policy requires a KeePass restart +- Double-clicking a format in the import/export dialog now + automatically shows the file browsing dialog +- Improved permanent entry deletion confirmation prompt +- Improved font objects handling +- Expired groups are now rendered using a striked out font +- Improved auto-type statement conversion routine in KeePass + 1.x KDB file importer +- Clipboard clearing countdown is not started anymore when + copying data fails (e.g. policy disabled) +- Improved synchronization with URLs +- The database maintenance dialog now only marks the database + as modified when it actually has removed something +- KeePass now broadcasts a shell notification after changing + the KDBX file association +- Improved warning message when trying to directly open KeePass + 1.x KDB files +- Improved Linux/MacOS compatibility +- Improved MSI package (removed unnecessary dependency) +- TrlUtil: improved NumericUpDown and RichTextBox handling +- Installer now checks for minimum operating system version +- Installer: file association is now a task, not a component +- Installer: various other improvements +- Various code optimizations +- Minor other improvements + +- When cloning a group tree using drag&drop, KeePass now + assigns correct parent group references to cloned groups and + entries +- Fixed crash when clicking 'Cancel' in the settings dialog + when creating a new database + +2008-11-01: 2.06 Beta +- Translation system is now complete (translations to various + languages will be published on the KeePass translations page + when translators finish them) +- When saving the database, KeePass now first checks whether + the file on disk/server has been modified since it was loaded + and if so, asks the user whether to synchronize with the + changed file instead of overwriting it (i.e. multiple users + can now use a shared database on a network drive) +- Database files are now verified (read and hashed) after + writing them to disk (in order to prevent data loss caused by + damaged/broken devices and/or file systems) +- Completely new auto-type/URL placeholder replacement and + field reference engine +- On Windows Vista, some of the message boxes are now displayed + as modern task dialogs +- KeePass is now also available as MSI package +- Accessibility: added advanced option to optimize the user + interface for screen readers (only enable this option if + you're really using a screen reader) +- Added standard client icons: Tux, feather, apple, generic + Wiki icon, '$', certificate and BlackBerry +- Secure edit controls in the master key and entry dialogs now + accept text drops +- Added ability to store notes for each group (see 'Notes' tab + in the group editing window), these notes are shown in the + tooltip of the group in the group tree of the main window +- Group names in the entry details view are now clickable; + click it to jump to the group of the entry (especially useful + for jumping from search results to the real group of an + entry) +- Added 'GROUPPATH', 'DELAY' and 'PICKPASSWORDCHARS' special + placeholders to auto-type sequence editing dialog +- Wildcards (*) may now also appear in the middle of auto-type + target window filters +- For auto-type target window filters, regular expressions are + now supported (enclose in //) +- KeePass now shows an explicit file corruption warning message + when saving to a file fails +- Added option to prepend a special auto-type initialization + sequence for Internet Explorer and Maxthon windows to fix a + focus issue (option enabled by default) +- Added ability to specify a minimum length and minimum + estimated quality that master passwords must have (see help + file -> Features -> Composite Master Key; for admins) +- Added field reference creation dialog (accessible through + the 'Tools' menu in the entry editing dialog) +- Field references are dereferenced when copying data to the + clipboard +- Entry field references are now dereferenced in drag&drop + operations +- KeePass now follows field references in indirect auto-type + sequence paths +- Added internal field reference cache (highly improves + performance of multiple-cyclic/recursive field references) +- Added managed system power mode change handler +- Added "Lock Workspace" tray context menu command +- Moved all export commands into a new export dialog +- Added context menu command to export the selected group only +- Added context menu command to export selected entries only +- Added support for importing Password Memory 2008 XML files +- Added support for importing Password Keeper 7.0 CSV files +- Added support for importing Passphrase Keeper 2.70 HTML files +- Added support for importing data from PassKeeper 1.2 +- Added support for importing Mozilla bookmarks JSON files + (Firefox 3 bookmark files) +- Added support for exporting to KeePass 1.x CSV files +- Added XSL transformation file to export passwords only + (useful for generating and exporting password lists) +- Added support for writing databases to hidden files +- When passing '/?', '--help' or similar on the command line, + KeePass will now open the command line help +- When single instance mode is enabled and a second instance is + started with command line parameters, these parameters are + now sent to the already open KeePass instance +- KeePass now ships with a compiled XML serializer library, + which highly improves startup performance +- Added support for Uniform Naming Convention (UNC) paths + (Windows) in the URL field (without cmd:// prefix) +- Added option to exclude expired entries in the 'Find' dialog +- Added option to exclude expired entries in quick searches + (toolbar; disabled by default) +- The box to enter the name of a custom string field is now a + combobox that suggests previously-used names in its drop-down + list +- Added Shift, Control and Alt key modifiers to placeholder + overview in the auto-type sequence editing dialog +- Added support for 64 byte key files which don't contain hex + keys +- Added Ctrl-Shift-F accelerator for the 'Find in this Group' + context menu command (group tree must have the focus) +- Added export ability to KPScript plugin +- Ctrl-Tab now also works in the password list, groups tree and + entry details view +- Added multi-user documentation +- Plugin developers: DocumentManagerEx now has an + ActiveDocumentSelected event +- Plugin developers: instead of manually setting the parent + group property and adding an object to a group, use the new + AddEntry / AddGroup methods of PwGroup (can take ownership) +- Plugins can now add new export file formats (in addition to + import formats) +- Plugins: added static message service event + +- When using the installation package and Windows Vista, + settings are now stored in the user's profile directory + (instead of Virtual Store; like on Windows XP and earlier) +- Accessibility: multi-line edit controls do not accept tabs + anymore (i.e. tab jumps to the next dialog control), and + inserting a new line doesn't require pressing Ctrl anymore +- When moving entries, KeePass doesn't switch to the target + group anymore +- When deleting entries from the search results, the entry list + is not cleared anymore +- Improved entry duplication method (now also works correctly + in search results list and grouped list views) +- A more useful error message is shown when checking for + updates fails +- Improved formats sorting in the import dialog +- The 'Limit to single instance' option is now turned on by + default (multiple databases are opened in tabs) +- Removed 'sort up', 'sort down' and empty client icons +- Improved program termination code (common clean-up) +- Improved error message that is shown when reading/writing the + protected user key fails +- The key file selection dialog now by default shows all files +- Plugins: improved event handlers (now using generic delegate) +- Implemented several workarounds for Mono (1.9.1+) +- Added conformance level specification for XSL transformations + (in order to improve non-XML text exports using XSLT) +- Improved key state toggling for auto-type on 64-bit systems +- Removed several unnecessary .NET assembly dependencies +- Threading safety improvements +- Highly improved entry context menu performance when many + entries are selected +- Entry selection performance improvements in main window +- Improved entries list view performance (state caching) +- List view group assignment improvements (to avoid splitting) +- Removed tab stops from quality progress bars +- After moving entries to a different group, the original group + is selected instead of the target group +- Layout and text improvements in the master key creation form +- Text in the URL field is now shown in blue (if it's black in + the standard theme) +- Improved auto-type tab in entry dialog (default sequence) +- Improved AES/Rijndael cipher engine initialization +- Improved build scripts +- Various code optimizations +- Minor other improvements +- Installer: changed AppId to allow parallel installation of + KeePass 1.x and 2.x +- Minor other installer improvements + +- The 'View' -> 'Show Columns' -> 'Last Access Time' menu + command now works correctly +- The 'Clipboard' -> 'Paste Entries' menu command now assigns + correct group references to pasted entries + +2008-04-08: 2.05 Alpha +- Added placeholders for referencing fields of other entries + (dereferenced when starting URLs and performing auto-type, + see the auto-type placeholders documentation) +- Added natural sorting (when sorting the entry list, KeePass + now performs a human-like comparison instead of a simple + lexicographical one; this sorts entries with numbers more + logically) +- Added support for importing RoboForm passcards (HTML) +- Added {DELAY X} auto-type command (to delay X milliseconds) +- Added {GROUPPATH} placeholder (will be replaced by the group + hierarchy path to the entry; groups are separated by dots) +- When saving databases to removable media, KeePass now tries + to lock and unlock the volume, which effectively flushes all + system caches related to this drive (this prevents data loss + caused by removing USB sticks without correctly unmounting in + Windows first; but it only works when no other program is + using the drive) +- Added pattern placeholder 's' to generate special characters + of the printable 7-bit ASCII character set +- A " - Copy" suffix is now appended to duplicated entries +- After duplicating entries, the new entries are selected +- The list view item sorter now supports dates/times, i.e. + sorting based on entry times is logically now, not + lexicographically +- Added GUI option to focus the entry list after a successful + quick search (toolbar; disabled by default) +- Several entry context menu commands are now only enabled if + applicable (if the user name field of an entry is empty, the + 'Copy User Name' command is disabled, etc.) +- Added a 'Tools' button menu in the entry editing dialog +- Tools button menu: Added command to select an application for + the URL field (will be prefixed with cmd://) +- Tools button menu: Added command to select a document for the + URL field (will be prefixed with cmd://) +- Added password generator option to exclude/omit + user-specified characters in generated passwords +- Added clearification paragraph in master key creation dialog + about using the Windows user account as source (backup, ...) +- Added menu command to synchronize with a URL (database stored + on a server) +- KeePass is now checking the network connection immediately + when trying to close the URL dialog +- Added file closed event arguments (I/O connection info) +- Added "file created" event for plugins + +- The document manager is now accessible by plugins +- Improved field to standard field mapping function +- KeePass now locks when the system is suspending (if the + option for locking on locking Windows or switching user is + enabled) +- All documents are now locked when the session is ended or the + user is switched (if the option for this is enabled) +- Moving a group into one of its child groups does not make the + group vanish anymore +- Auto-type validator now supports "{{}" and "{}}" sequences + (i.e. auto-type can send '{' and '}' characters) +- Undo buffers of secure edit controls are now cleared + correctly +- Disabling sorting does not clear search results anymore +- Entry editing dialog: Return and Esc work correctly now +- Column sort order indicators are now rendered using text + instead of images (improves Windows Vista compatibility) +- Splitter positions are now saved correctly when exiting after + minimizing the main window to tray +- Added handler code for some more unsupported image file + format features (when importing special ICO files) +- Translation system is now about 75% complete +- KeePass is now developed using Visual Studio 2008 +- Minor UI improvements +- Minor Windows installer improvements + +- The CSV importer does not crash anymore when clicking Cancel + while trying to import entries into an empty folder +- I/O connection credentials saving works correctly now +- Fixed duplicate accelerator keys in the entry context menu +- Help button in master key creation dialog now works correctly + +2008-01-06: 2.04 Alpha +- Added key provider API (it now is very easy to write a plugin + that provides additional key methods, like locking to USB + device ID, certificates, smart cards, ... see the developers + section in the online KeePass help center) +- Added option to show entries of sub-groups in the entry list + of a group (see 'View' -> 'Show Entries of Sub-Groups') +- Added XML valid characters filter (to prevent XML document + corruption by ASCII/DOS control characters) +- Added context menu command to print selected entries only +- Added option to disallow repeating characters in generated + passwords (both character set-based and pattern-based) +- Moved security-reducing / dangerous password generator + options to a separate 'Advanced' tab page (if you enable a + security-reducing option, an exclamation mark (!) is + appended to the 'Advanced' tab text) +- Added 'Get more languages' button to the translations dialog +- Added textual cue for the quick-search edit control +- The TAN wizard now shows the name of the group into which the + TANs will be imported +- Improved random number generator (it now additionally + collects system entropy manually and hashes it with random + numbers provided by the system's default CSP and a counter) +- For determining the default text in the 'Override default + sequence' edit box in the 'Edit Entry' window, KeePass now + recursively traverses up the group tree +- Last entry list sorting mode (column, ascending / descending) + is now remembered and restored +- First item in the auto-type entry selection window is now + focused (allowing to immediately navigate using the keyboard) +- Text in secure edit controls is now selected when the control + gets the focus the first time +- For TAN entries, only a command 'Copy TAN' is now shown in + the context menu, others (that don't apply) are invisible +- Regular expressions are validated before they are matched +- KeePass now checks the auto-type string for invalid entry + field references before sending it +- The clipboard auto-clear information message is now shown in + the status bar instead of the tray balloon tooltip +- Matching entries are shown only once in the search results + list, even when multiple fields match the search text +- First item of search results is selected automatically, if no + other item is already selected (selection restoration) +- Entries with empty titles do not match all windows any more +- Improved high DPI support in entry window +- When having enabled the option to automatically lock the + workspace after some time and saving a file fails, KeePass + will prompt again after the specified amount of time instead + of 1 second +- KeePass now suggests the current file name as name for new + files (save as, save as copy) +- The password generator profile combo box can now show more + profiles in the list without scrolling +- Improved native methods exception handling (Mono) +- Updated CHM documentation file +- TAN wizard now assigns correct indices to TANs after new line + characters +- Copying KeePass entries to the clipboard now works together + with the CF_CLIPBOARD_VIEWER_IGNORE clipboard format +- KeePass now uses the correct client icons image list + immediately after adding a custom icon to the database +- Fixed 'generic error in GDI+' when trying to import a 16x16 + icon (thanks to 'stroebele' for the patch) +- File close button in the toolbar (multiple files) works now +- Fixed minor bug in provider registration of cipher pool + +2007-10-11: 2.03 Alpha +- Added multi-document support (tabbed interface when multiple + files are opened) +- KeePass 2.x now runs on Windows 98 / ME, too! (with .NET 2.0) +- Added option to permute passwords generated using a pattern + (this allows generating passwords that follow complex rules) +- Added option to start minimized and locked +- Added support for importing Passwort.Tresor XML files +- Added support for importing SplashID CSV files +- Added '--exit-all' command line parameter; call KeePass.exe + with this parameter to close all other open KeePass instances + (if you do not wish to see the 'Save?' confirmation dialog, + enable the 'Automatically save database on exit' option) +- Added support for CF_CLIPBOARD_VIEWER_IGNORE clipboard format + (clipboard viewers/extenders compliant with this format + ignore data copied by KeePass) +- Added support for synchronizing with multiple other databases + (select multiple files in the file selection dialog) +- Added ability to specify custom character sets in password + generation patterns +- Added pattern placeholder 'S' to generate printable 7-bit + ASCII characters +- Added pattern placeholder 'b' to generate brackets +- Added support for starting very long command lines +- Entry UUID is now shown on the 'Properties' tab page +- Added Spanish language for installer +- KeePass now creates a mutex in the global name space +- Added menu command to save a copy of the current database +- The database name is now shown in the title of the 'Enter + Password' window +- Added "Exit" command to tray icon context menu +- Pressing the 'Enter' key in the password list now opens the + currently selected entry for editing +- Added '-GroupName:' parameter for 'AddEntry' command in the + KPScript KeePass scripting tool (see plugins web page) +- Added URL example in 'Open URL' dialog +- Added support for plugin namespaces with dots (nested) +- Added ability to specify the characters a TAN can consist of +- '-' is now treated as TAN character by default, not as + separator any more +- Added ability to search using a regular expression +- Notes in the entry list are now CR/LF-filtered +- Added {PICKPASSWORDCHARS} placeholder, KeePass will show a + dialog which allows you to pick certain characters +- The password generator dialog is now shown in the Windows + taskbar if the main window is minimized to tray +- Caps lock is now disabled before auto-typing +- Improved installer (added start menu link to the CHM help + file, mutex checking at uninstallation, version information + block, ...) +- Plugin architecture: added cancellable default entry action + event handler +- Added support for subitem infotips in various list controls +- Group name is now shown in the 'Find' dialog (if not root) +- Pressing the 'Insert' key in the password list now opens the + 'Add Entry' dialog +- Last search settings are now remembered (except search text) +- The column order in the main window is now remembered +- Pressing F2 in the groups tree now initiates editing the name + of the currently selected group +- Pressing F2 in the password list now opens the editing dialog +- The 'About' dialog is now automatically closed when clicking + an hyperlink +- Entries generated by 'Tools' - 'Password Generator' are now + highlighted in the main window (visible and selected) +- Extended auto-close functionality to some more dialogs +- Protected user key is now stored in the application data + directory instead of the registry (when upgrading from 2.02, + first change the master key so it doesn't use the user + account credentials option!) +- Improved configuration file format (now using XML + serialization, allowing serialization of complex structures) +- Improved configuration saving/loading (avoid file system + virtualization on Windows Vista when using the installer, + improved out of the box support for installation by admin / + usage by user, better limited user account handling, ...) +- Improved password generator profile management (UI) +- Improved password generator character set definition +- Custom icons can be deleted from the database now +- Changed password pattern placeholders to support ANSI +- Removed plugin projects from core distribution (plugin source + codes will be available separately, like in 1.x) +- Window position and size is saved now when exiting KeePass + while minimized +- Splitter positions are restored correctly now when the main + window is maximized +- Password list refreshes now restore the previous view + (including selected and focused items, ...) +- Improved session ending handler +- Improved help menu +- Added more JPEG extensions in the icon dialog (JFIF/JFI/JIF) +- Navigation through the group tree using the keyboard is now + possible (entries list is updated) +- Options dialog now remembers the last opened tab page +- Synchronization: deletion information is merged correctly now +- Improved importing status dialog +- Improved search results presentation +- Title field is now the first control in the focus cycle of + the entry dialog +- The auto-type entry selection dialog now also shows custom / + imported icons +- The quick-find box now has the focus after opening a database +- The main window title now shows 'File - KeePass Password + Safe' instead of 'KeePass Password Safe [File]'; improved + tooltip text for tray icon +- The 'Save Attachments' context menu command is disabled now + if the currently selected entry doesn't have any attachments +- A more useful error message is shown when trying to import an + unsupported image format +- Replaced 'Search All Fields' by an additional 'Other' option +- Expired/used TAN entries are not shown in the expired entries + dialog any more +- UI now mostly follows the Windows Vista UI text guidelines +- Improved UI behavior in options dialog +- Improved text in password generator preview window +- After activating a language, the restart dialog is only shown + if the selected language is different from the current one +- Online help browser is now started in a separate thread +- Value field in 'Edit String' window now accepts 'Return' key +- The name prompt in the 'Edit String' window now initially + shows a prompt instead of an invalid field name warning +- Expired entries are now also shown when unlocking the + database +- Expired entries are not shown any more in the auto-type entry + selection dialog +- Various dialogs: Return and Esc work correctly now +- Improved key handling in password list +- Updated SharpZipLib component in KeePassLibSD +- Updated CHM documentation file +- Deleting custom string fields of entries works correctly now +- Fixed a small bug in the password list view restoration + routines (the item above the previous top one was visible) +- KeePass doesn't prevent Windows from shutting down any more + when the 'Close button minimizes window' option is enabled +- The "Application Policy Help" link in the options dialog + works now +- KeePass doesn't crash any more when viewing an history entry + that has a custom/imported icon +- Icon in group editing dialog is now initialized correctly +- Last TAN is not ignored any more by the TAN wizard +- Other minor features and bugfixes + +2007-04-11: 2.02 Alpha +- Added "Two-Channel Auto-Type Obfuscation" feature, which + makes auto-type resistant against keyloggers; this is an opt- + in feature, see the documentation +- Added KDBX data integrity verification (partial content + hashes); note: this is a breaking change to the KDBX format +- Added internal data viewer to display attachments (text + files, images, and web documents); see the new 'View' button + in the 'Edit Entry' window and the new dynamic entry context + menu popup 'Show In Internal Viewer' +- External images can now be imported and used as entry icons +- Added KeePassLibC and KeePassNtv 64-bit compatibility +- Added Spamex.com import support +- Added KeePass CSV 1.x import support +- When adding a group, users are immediately prompted for a + name (like Windows Explorer does when creating new folders) +- Added prompts for various text boxes +- The installer's version is now set to the KeePass version +- The key prompt dialog now shows an 'Exit' button when + unlocking a database +- Added F1 menu shortcut for opening the help file/page +- URL override is now displayed in the entry view +- Added ability to check if the composite key is valid + immdiately after starting to decrypt the file +- Added ability to move groups on the same level (up / down), + use either the context menu or the Alt+... shortcuts +- The database isn't marked as modified any more when closing + the 'Edit Entry' dialog with OK but without modifying + anything +- Added version information for native transformations library +- Local file name isn't displayed any more in URL dialog +- Improved path clipping (tray text, ...) +- Improved data field retrieval in SPM 2007 import module +- Improved attachments display/handling in 'Edit Entry' dialog +- Improved entry context menu (added some keyboard shortcut + indicators, updated icons, ...) +- Improved performance of secure password edit controls +- Clearified auto-type documentation +- Installer uses best compression now +- Improved auto-type state handling +- In-memory protected custom strings are hidden by asterisks + in the entry details window now +- Improved entropy collection dialog +- Updated import/export documentation +- Added delete shortcut key for deleting groups +- Instead of showing the number of attachments in the entry + view, the actual attachment names are shown now +- Improved asterisks hiding behavior in entry view +- New entries now by default inherit the icon of their parent + groups, except if it's a folder-like icon +- Updated AES code in native library +- Improved native library detection and configuration +- Improved entry/group dragging behavior (window updates, ...) +- A more useful error message is shown when you try to export + to a KDB3 file without having KeePassLibC installed +- Configuration class supports DLL assemblies +- KeePass doesn't create an empty directory in the application + data path any more, if the global config file is writable +- Clipboard isn't cleared any more at exit if it doesn't + contain data copied by KeePass +- Empty auto-type sequences in custom window-sequence pairs now + map to the inherited ones or default overrides, if specified +- Cleaned up notify tray resources +- Improved help menu +- A *lot* code quality improvements +- ShInstUtil doesn't crash any more when called without any + parameter +- Auto-type now sends modifier keys (+ for Shift, % for Alt, + ...) and character groups correctly +- Fixed alpha transparency multi-shadow bug in groups list +- Overwrite confirmation now isn't displayed twice any more + when saving an attachment from the 'Edit Entry' window +- User interface state is updated after 'Select All' command +- Auto-Type warnings are now shown correctly +- Fixed auto-type definition in sample entry (when creating a + new database) +- The global auto-type hot key now also works when KeePass is + locked and minimized to tray +- Fixed bug in initialization of Random class (KeePass could + have crashed 1 time in 2^32 starts) + +2007-03-23: 2.01 Alpha +- Improved auto-type engine (releases and restores modifier + keys, improved focusing, etc.) +- Implemented update-checking functionality +- Added KPScript plugin (see source code package) for scripting + (details about it can be found in the online help center) +- Added Whisper 32 1.16 import support +- Added Steganos Password Manager 2007 import support +- Search results now show the full path of the container group +- Entry windows (main password list, auto-type entry selection + dialog, etc.) now show item tooltips when hovering over them +- Added window box drop-down hint in the auto-type item dialog +- Database maintenance history days setting is now remembered +- Improved main window update after importing a file +- Improved command line handling +- If opening/starting external files fails, helpful messages + are displayed now +- Completely new exception handling mechanism in the Kdb4File + class (allows to show more detailed messages) +- New message service class (KeePassLib.Utility.MessageService) +- Added option to disable remembering the password hiding + setting in the 'Edit Entry' window +- Added menu shortcuts for opening the current entry URL + (Ctrl+U) and performing current entry auto-type (Ctrl+V) +- Changed file extension to KDBX +- Password generation profiles are now saved when the dialog is + closed with 'Close'/'Cancel' +- Entry URL overrides now precede the global URL override +- Standard password generation profiles are now included in the + executable file +- Restructured plugin architecture, it's much clearer now + (abstract base class, assembly-internal manager class, ...) +- Only non-empty strings are now displayed in the entry view +- Current working directory is set to the KeePass application + directory before executing external files/URLs +- Changed fields shown in the auto-type entry selection dialog: + title, user name and URL are displayed instead of title, user + name and password +- Clearified clipboard commands in context menus +- Help buttons now open the correct topics in the CHM +- Fixed name in the installer script +- Workspace is not locked any more if a window is open (this + prevents data loss) +- The 'Find' toolbar button works now +- The OK button in the Import dialog is now enabled when you + manually enter a path into the file text box +- Fixed entry list focus bug +- Fixed menu focus bug +- The 'Copy Custom String' menu item doesn't disappear any more +- Fixed enabled/disabled state of auto-type menu command + +2007-03-17: 2.00 Alpha +- Strings containing quotes are now passed correctly over the + command-line +- Created small help file with links to online resources +- Rewrote cipher engines pool +- Restructured KeePassLib +- Added dialog for browser selection +- Added option to disable searching for key files on removable + media +- Improved KDB3 support (especially added support for empty + times as created by the KeePass Toolbar for example) +- Added confirmations for deleting entries and groups +- Fixed a lot of bugs and inconsistencies; added features +- Fixed a bug in the 'Start KeePass at Windows startup' + registration method +- Added custom split container control to avoid focus problems +- Clipboard is only cleared if it contains KeePass data +- New system for configuration defaults +- A LOT of other features, bugfixes, ... + +... (a lot of versions here) ... + +2006-10-07: 2.00 Pre-Alpha 29 +- Various small additions and bugfixes + +2006-10-06: 2.00 Pre-Alpha 28 +- Implemented entry data drag-n-drop for main entry list +- Implemented URL overriding +- Added {} repeat operator in password generator +- Added database maintenance dialog (deleting history entries) +- Custom entry strings are now shown in the entry preview +- Added alternative window layout: side by side +- A lot of other features and bugfixes + +... (some versions here) ... + +2006-09-17: 2.00 Pre-Alpha 25 +- Fixed exception that occured when WTS notifications are + unavailable + +2006-09-16: 2.00 Pre-Alpha 24 +- Implemented quality progress bars (gradient bars) +- Added special key codes into placeholder insertion field in + the 'Edit AutoType' dialog +- Currently opened windows are listed in the 'Edit AutoType' + dialog +- Entries can be copied/pasted to/from Windows clipboard +- Added {APPDIR}, {DOCDIR} and {GROUP} codes +- Foreground and background colors can be assigned to entries +- Expired entries are displayed using a striked-out font +- Password generator supports profiles now +- Password generator supports patterns now +- VariousImport: Added support for Password Exporter XML files +- A _lot_ of other features and bugfixes + +2006-09-07: 2.00 Pre-Alpha 23 +- Internal release + +2006-09-07: 2.00 Pre-Alpha 22 +- Improved password quality estimation +- Implemented secure edit controls (in key creation dialog, key + prompt dialog and entry editing dialog) + +2006-09-05: 2.00 Pre-Alpha 21 +- Removed BZip2 compression +- Added font selection for main window lists +- Added file association creation/removal buttons in the + options dialog +- Installer supports associating KDB files with KeePass +- Added option to run KeePass at Windows startup (for current + user; see Options dialog, Integration page) +- Added default tray action (sending/restoring to/from tray) +- Added single-click option for default tray action +- Added option to automatically open last used database on + KeePass startup (see Options dialog, Advanced page) +- Added option to automatically save the current database on + exit and workspace locking (Options dialog, Advanced page) +- Implemented system-wide KeePass application messages +- Added 'Limit to single instance' option +- Added option to check for update at KeePass startup +- Added options to show expired entries and entries that will + expire soon after opening a database +- Added option to generate random passwords for new entries +- Links in the entry view are clickable now +- Links in the notes field of the entry dialog are clickable + now +- Fixed context menu auto-type command (inheriting defaults) +- Improved entry list state updating performance +- Classic databases are listed in the main MRU list, prefixed + with '[Classic]' +- Other features and bugfixes + +2006-09-03: 2.00 Pre-Alpha 20 +- First testing release + +... (a lot of versions here) ... + +2006-03-21: 2.00 Pre-Alpha 0 +- Project started diff --git a/src/Docs/License.txt b/src/Docs/License.txt new file mode 100644 index 0000000..4a09f45 --- /dev/null +++ b/src/Docs/License.txt @@ -0,0 +1,347 @@ +KeePass: Copyright (C) 2003-2023 Dominik Reichl . + +The software is distributed under the terms of the GNU General Public License +version 2 or later. + +For acknowledgements and licenses of components/resources/etc., see the file +'KeePass.chm'. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/src/Ext/Icons_04_CB/Finals/Untitled.ico b/src/Ext/Icons_04_CB/Finals/Untitled.ico new file mode 100644 index 0000000000000000000000000000000000000000..d22bedef61935e269f86e485e87a2cbe1f8edf84 GIT binary patch literal 23558 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/Finals/key-bw.png b/src/Ext/Icons_04_CB/Finals/key-bw.png new file mode 100644 index 0000000000000000000000000000000000000000..85bc1fe77ba890f85096496fd9251856b595b752 GIT binary patch literal 10090 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 Iho(XQ3#IVnWdHyG literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/Finals/key-grn.ico b/src/Ext/Icons_04_CB/Finals/key-grn.ico new file mode 100644 index 0000000000000000000000000000000000000000..5c30b16a8cd33777e6e98c9ef9c8e0a7f36af9b0 GIT binary patch literal 25214 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/Finals/key-grn.png b/src/Ext/Icons_04_CB/Finals/key-grn.png new file mode 100644 index 0000000000000000000000000000000000000000..b904b5b3cbaffe6fa1ccdc2fcdcce3ae2daef7a5 GIT binary patch literal 37727 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/Finals/plock-blu.ico b/src/Ext/Icons_04_CB/Finals/plock-blu.ico new file mode 100644 index 0000000000000000000000000000000000000000..d213a442f9e0632e13c86d23b362129a1560914e GIT binary patch literal 25214 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/Finals/plock-bw.png b/src/Ext/Icons_04_CB/Finals/plock-bw.png new file mode 100644 index 0000000000000000000000000000000000000000..7abaae5eb2eb169e4c59ef05c4181a150ad30e1e GIT binary patch literal 9346 zcmaL7byQSc_%^(Up}V_Vq(vp98xfEON$Ktu7!?ue5a|#Eq`PYnDJcPI>F)0EJW^7_&e``lbH{bA``UZXCk-`4JZx%g005q{lAI<0Fz71`V4_2Vk^6URXuxt+ zGVlNZhvdHx45X%00)YL(PF7Y!!`8*q#lzOcl~Gw%meJMS#oEr%3IN}k3@so1gbQ+s zg$pYJU74xF$|T3PfSIKPvzO2yhcF(PhY%7=b$tlK)+Hq)N>|eP`EDFrDI;t-o3p`2 zIy}rULdQsWpW$yoZJ__b-rmjRP0L35#_f>bFad&ym_2Si#~z4iet0H2#So*e^s}!O zfkLLVh{{N~-v7e}tqXudxSwy3XNBY~tlR~l0M~I|R^pzefA5<#*!2Ko99U!~-oSyy zYJy%~?OsyQO9?8psx7g>X8;`i-pDY6B0R8rsw{y9rV11OQh=!(+Coea1p_IZimWJ7 z&A?3OttK}L@(0K+kz(dWMV7%326cjpD2P@x;2o_WOCV(i5GgX;1AtK&1<2Bq48j>z z;o1D7?Tdw`t{)ndU;x>lIGFT&^bu)8;%{o7BMLFdry{jC2Xa7&d+DMjYKzjHHp_Ab+m-sne_5pcfPV7c%45PTQ?U}RaS(ukWZ z{7C;(g9h`99=}G-I60=i#AV{GV8J7XFLzi8K6s!cR2`{Shf&+_hz#0?p+w;8k9q^C zpc9@*YMeMgXd@)(cL6{``&Eq8Ll_uL`nCc<%O<7K_sN<9|mr*eMHoQeq;Pcz6m+(I*UQ&(U8K}d%vpq&Ug$RrhUveBq zsB7rO5p_8QBhNRzJV9W1v;|^B0N*-t+T1AeqrBNCeQNd|a*H+n$GS0(E$H;0dXv#0 zGtCb$Sy3VoB)gaZ|I@erMZdsUdE{)WdooBJhKQIpMo{4Vypl)lc8o zqLs1w3MK6OO!Q2dY$hD|B&G>UtoVKLt7_OxY_WpMILZ!6vr0VQw7yA<656G!vhTz? z_06whRv}6llj7=Q31ZdbZ~8h{>q$ks!j@IBa#%ILeI{0UY$dsdnwKRglagKZavWt#B*E!c4 zvbbNwiK2k{iY>x^}`K^T5_<>H~pbh^qA(-7WJ01uo;lBaUQzSO!jsPyTK z|4iG=>pk~9^1Ypz125MMsSNInGf^ke3oopuCrvM#J~YjG4R1?~S?u_2VV(Ut!{3@4 zQ9N@x%{`;oKA1QdVR*_fg!v?v%27br;&33=V$&hnu3_XbWa&Fmzim_8PutuPD!GK8Bce}G;f=3nZ1qrkSCwsr4sQZqUX!ZmpA=rUtWBGOT$eQP3y1wUYb_=(>u*+fpnQP=E3NLGcD&Cf!*6(?A_E|^gWSt^K-Uy zr}JUD0a{|Z2{BKxH}0NZ1Ky6VEj!*1pc& z+or_cQPa_4H?0BDP}K0&_v5AfQ4+By2`kp#r`4ZRKgB<-c%W=JranqvP1XM5X;HTJ zH>Z(eeQT&c)90DNV}sZ?!XJ`}ld2@w-ZRQ*@KLI-6*#}3BRLL9`=Bo0mJ^lpva-HG zW&`f{hStgoqaZ14B?I9l`lXkMP|!*_Z@iG`p0`kl*84I3@U%o8nj4(yZ0U+D&O zQ6!p{xR!h`yR1-XSYOstGaY|(=I1msGp|zrYi~zs=i82R$%R3Cxk{_O^!V@4L%dR& zqo_3+Qzw;q&#(UWXVHT-gTDshkIf(Ny&9-1nLYmcB=_7uBiOiK_pY?KzHOR)W}bjPOaG6QlOZBOBHRQtoA-&eYv5@~JU`1o|>rm(4&cTJ0 z;QBMn9VNeqqoVCzB|N!K+2UVY4>lunGw4j{6x-_m1sw>iSa|h3j?v4^&fpY3x>|jg zuu@=IkeQ(-DgGzruiu60ZHj~OOXF4>+2Kq{3eSDjdee)(llhGpku_HEeFcy4mj~w@yyqx4U&hl$L=-#ENcV?fX zZD4CUyYxQaqwvArSN&`3ALCno+ctBzjd4w|9b9u?X@zuJyfj0a4R;z49N=Sp%)I~n zZ|vjJsN#U)IEw;HR7?f~0}UQ^>#^lf!csw10m<;MAl-j{J08Uw3wO&m&xiGIrw(zh zB8J<`{0dLp4~h%RMSEC!7+Qw>#E9A%NU0TjTDw%uxV{_jNZUOwyq@(E{Oz# zEi*g2Zmr~*oD?mCsI_b@HPLpeYK1Jj61NngF*hnSWqvI;Dka&^4|5P$T;Yt2Mj_2D z?UKl#NS5%w9z%0&SsP1*94CPXfk}KDkSx7WlEKtZU{#g{mWbXfT(nrb@v8!FpcGGv zVupe^0-<2D*G)>Tq(lHU9_*rOtj59^l}D>VCI%rMGU86{)YKl(qEyf$*_#P~a{Mz` z3(6uIXq{@8EayE z;Yz5kNNc!M{5LsJ4!0e?XO1^!L#R^+cg(0k-u%HsX8o?HQkVOsg2K-rl{x;O|gdi`Xx<&$7EdN-0Qs~lB0YrsSn zhn};^1qhjJm=ZiJJ$IS9lu*Fk!EcY=TUuYoE6o>IU011bi!gth@Iqj&H>9!*_wo1| zXQMaW7FA>NS+~7IVERK_-|Hu(m z_ZxX(*CwJhxE`TMTs@--e$}owxa|dkq5}R3__l*7yhP`N!Cxlt_v600I-C%)I_X8z zx(nyzgX=0s%Z+sDKNbgtI!?rh9tL4R&9HkV)u;aCaLM^{a!3vpEu5L!E=W^TC{aUh%6)YkI~e2OuOd+Dw8iG49j0$bgB1|1shrhlGd+A+412KGrFX zh-sfa*GL84!rL$CNFR+&zkB1pVC2-x_e<*%#0VTk5XUcL+Jft5+mqiXf`~#`$w~zTuroLqMdJ3vsQc*V2<3yd-hd{G6jFOZkdmxZgmwueKCI7WwhL zJT0%~uOP9blYeg5zb~80Y#UV;5^pgsZ_cd_i24{;zs6nK*OoY(i~yNbdYCFAvV4bH z%${HG=96WP-2w?oPgGpBQhB$?KM&CB-5wm&AxZ6W%*5R28!8c+U{_^AM7baYLVI5> zBR)1W2?^7-bjB!I$K&{)(}zfi%dB#_VFIP7fALI;pC}@pFtJ`zd6UPlxm>FDUF>(#NW0R~j-DQjrKKg`?ZN_nGb9KJ4P_Ptst~cl8LR3Kh|p+&LGZW5!SEy8Y+Do6Dt-m*=xCFSWER#QPnq=s&-k=bm7>1Sxv!HKUb+SSz+GZT~a<@GhTa(s#V_l21( z>G$ZL@MxY?kXW5hEAsssktEOjM{)mN{3~NZA8Vb{EPGB)&aVCF!qv*b0iQ|motNAG z-^Q#-zTWE{KyHeDdg3&^BJhEff@0-q`xTz`K=NA_#ptOsp9efVT}3*@hkvxxm(pC? zq@A32#HM62P~fG(RKEuY)5MuBt}>=0Z*SiWq&+1lEG*=w#Ko@;bvs^F9!PzRqgQ6s zQC!~k>v<^oq4Vs>H7tAl7*om_4GqordaEEVApxE{vgx`|UR6bmL(YwiqInvdoZO4= z!lp+c8PQ*HNh-A?7%R?{dwS~mv%8yFOl+2kfQo zT}iODw*G+>r`b9@m$oZ*Xhoi}E*9YDw{+CQ(6c>WytJ~?DSentq90!pfGTx-xm{dd z;kqPK0Krp3OY8mKZ2ihwlBt5UGz{Y%nZ760TkiHepOx;Y9K{%V@4yuG=q$Uje5?$$ z9_b@sw)g6-AG8VJ-%78ntn9l}T7NjEE?FrJRMVc|efsn%EG*2-;=3z05>yZ;^o6Xh zTB>GA&?P1&I>xf+tET*T3`0j)JXcdwFfyXu-rk;~^brWU_1&FsO~dPum+Coz9C^L{ zr!f8YqQd9EK{M{hlm>f^XgYUmzteI<3ST%CQ1xWo_(;t(=Mq_7`5`@M@dkDrrh^Uf9+~zqPfcUt>$;DN0AP3M(~j zr!UqkSMc)_p?ME83x>{`1nfOdmkge_mds^UCg`f@0=vJzzq87! z-}U;`E_u*;RwXzJot~b4b2JYJ1rB%Hncy*M@g*W7BYRRW%7 zPfkf&NHhe*ymu=KoA+uAOAjwDC@i`oiTe8bWXdOTm_i`@{4nFkgiu>%(#l27XTr_Q z%v@48V(THyP?X@%U34s7<$->l83b?ew8r-IBM(GlPhDJ@ETbW`P z^DTZ_Mh&jgyEC=VpI!X*U}j{LvK68(4kmc|^yyKt>79yEtA8Rq5@yycC@3iB=vXq& z5m{VZ?7JGL_!A0GE+{CdxGln@oB{&%>+{`dh)AZk7y9PrjJXY}mVh5PMvT~!I!u%h z88>^^ZlkB4tPhfW`0ydz5m`97(=}20s_Ss6v$RQp-)&hgE-|qSn1QKih!j4VwE7!3 zX`b%Q>h1n*)Ji-sG&bg0A4p-jy}K(t52WBV>iy3&v_FY2!Y0#C!Pnp4(8|s6c(sq2 zgG2G`pw)ZNaHK$;p%_)l*SA5x*_#KBfSCn~W(;v{bVH%O9?6l{HKvkuT||tNi<1x& zQvzJDBN}wu5ccWQ%fQ2%%gZnkkM*$daO~oGX%&@lN@3URZ6`uXO3p9b20x(R)*ptv zFFl@hfpDAC)HGu~!}Q>R^5xZ4;r(^h_wStO0FLzk*gi5cQlx$lWd|Z4ku>{=?QQ!? z^G@`ojg12PR}ke%x7_SEFLy`L;DX1dcnZk2z#G@i-%L6?w1SqH*29@my}e3l_Bece ze5$EJSdVOmLb9^5?9X(ywHG7!+NA949$>I$p=qca8m3Y{aZKL!xnSeqn0+&=nj$EF zmX@_XoW&O&5#fi5WC31|Qx&kDXgaMkthV}vAR0Kv%sovCl+^c|o3`WIk5W|iTm2tj z82QE?{baYLtDcT*X?d0|;-OG0T5HJTf3Y8RdFhLahBp0%CW=x3Mg7?k>fgCJo#N`c zI&vy1s^2?jwBMegX{Z?+XC#Yy6%|e1b#`{jdwbXMr>J_5sVU^XWMyYB^5-HXC1ri$ zGC!aNGEq2_Q)L(*J<_VZ_!|%qV6i(@xjEPTREYX!>q)6@1mu_J!Mt&;=yMg7h684G z*k>(6!|;W>eV+#RwQzec1$p_UP6ElA;=bV7-Z+*@+Yx4+dfM44D;!NtO<{d1@Cy~0 z`q)9k*tk?B(A?ZSS;&r9)O*)9>%D5Ow6-?s^78WH`g*=fMoLP`RHFw6#zVMNP-A0b zQCr1pC@;w(9{I-g2KxGx6J^E`yv9x6b#2VenVjca`e6MaR^8uURN`_GKE53h87Wt8 z(n_1NXJll=Z#_U+<1nd~cpXhI9{vG`!u_`(Sk=wisr)Zpli0Ex>Ea69o9vB=Q+28*>u?ebX zrOSfEpUFuN@Ca~2JV)<1T_vB`RAa~kLGvAxY^bo27_WW>fVf;Mugqbx%)Bd{tif#s z9fKc^6!i1+_S~7kd-?KZQE6&%-|#R2!t*A9`0y1!EzpE=!A1ieF5rUO0Xcf-oHP_$e+$LdL1rRSEWrHzdT<0D|W@uyI$C|wa99esI3k-;nc2_6A~ zqN-{nmzR~5RiXa@Ivm*nNuckV>QJ5LgZ~Al1!rna0_aG1ad~;q z@mjwd#LYU}J2SP#TD9fn<$N--vO0ds%=fHRj&$faZnd{-Aw6?A;mx-Q+2H}q%Khix2?S&|x`SL$|_KdXrdBK?5 ziUzt=zfs#8Du&=&fuf=!(sGBH8av8I){$Cu)y2gR*M~BSf8qB$cLDSYwX z-rhboF%j*3N4Bpq)GMT=q!5s;Zt;IqNkmUy=4%Y4sJFj=Wzib^%^I=QUOSW&6eOk- z^>n>H-=A-7=6WhwI8uNM#Pm!|qM=@_GZak0t&a%0yA}ydYrozu4vUJ?X~~2{jHRWe zYwRPCS}?X%;kBdNwR3cQ`~xaI-F4l<7i>H{9jlWB$n4GC*(B{ME@Iud)t}73z#x2L zX?gkG{#hYA^DKDxK|Qu6X>YU#oq-PS-zy?pXv(B1+hPa%MY#>5cNw7hh5 z)~PhCwg)J#ZMfW8f=T>4b2HKvybQda}m(J3yHz$ z!ZUGkvIXu{ND=5ac@~Z_VDW?f<=yG(aF^Syot=n|_ZZcc2h5zDm;{oy6**pzMqY*< z9<_fVjPOO?GUMj_%YHTtJnE2z`}2Co-DXOOH^TFN8+7tJ{M1pL+}xhm#_uS>;H|fY zp_CMusdMV@c2=;o{I*;G)6vo4PaDJq*TMd+CW$`x)15o5rG0~gFOC9HA{AIXMKiQM z0{9|++EW+ZTi!}2!Ax9S;ZcDEP%V&`M=NBl98#EXq1G*ORt>{Nh}~YU#Bg$PY1Twn zTJ$jU@$4+AAvfyAI+SJh$TQUHq)U z)Z5fl>aHEA#aheO$5O{A6(2P`g(KBC0}a003}>n}pA5qZhPpG}eGbx2jXxO$eK~x5X>F~m&jkjFANl^tEzbtmB@{T4DlsXEg^f+V z@)hDSHQu{-??{7N#^Y*T7EDI;@;6pj7ojH%7uaYU8%L3FsBwCuA?N1k0&mWBZtIg- zaImnX<>W$MuThYZF+F{n1Y3*@A^azB#iks;hhggr--jr6aciru+d1$4?q(%Ukv^_9 z*!d!E+R^)$7r;VPcpekRC9+q1D3E`K!sz}Q7cip(A`un}#e4VGfC~j-PBN%)c@yFlmEYN{*Pz>X9N#^e62_I@bdc5VTOQY>6ll^=)%ppnh=Clwc3;T4l~#9 z2c1qGpLYFFJf8FaUl}kQ`bq(tt#gW)nKAVB^%XYmnfUW38|q)ee#hUK4-}sHpK?Mg z!9^%;?Fhv9_&9#;{@U_p#`tO05G9HVo^C?lsR!Lpt^fCw{(t%UKZS^YD|>)hV?WMC z8Kuwwi9F*TYFzZo%S+C4XGB;S=6?%iXfdu<%a&|X?gIsIfkHTag1R06``?u`g4^0d zGDGdgSxQsE%8KnjQS=xD=)+y}yB=u9@I?8Q!Tz6x{y)9?zX9UnrC$6GT~_xA;Oe&1 ztIJx2V$or~gMs*37AY=miRPulMxJDT^u_FY+r44d7Vg&b+TBveO0Ogs)pc#g>l`(X z%&0}%@(u{6yM_LD0Y>yIi3{#|Qc|FrIQ_e3r=Oll^HZZR&P?pv2}u-ynECbQ95XK5 z*+i7>xkwc%@Uo?kBtt3I>!Qv;y=uZGU# zE6KE&9Cq>T1-d8YdCMLx3`lw7m!lIFF4?ZPTRnVU#{$6j_9lihn7}R*^M^lMnv3%R z>5gl505`F?;>Wu&=q%b+)#w_x^XA@D91{$)BQ5d3fDg-;_h+tnlzo}Z@dkG(t(#)| zBCB`WT#9a1GMMeN4j{$-v#*K|QKO9-_|ZGh9G}n^w$h`ymU=5Wd^HP;Wz{RZd%Z4e z+VYW3fi*XcqmFSK+R8Gp)Eom-SlJ3?@jm-k`0GVR=hShy14$kgc0Kqa5hZr%Cz2Ra zLNZL z=db2(y8k*jbLR!zj09w)*K!*-5{1U!?aJrqejm#-8~Mez#;eN_GUZthZC|(d8;mIi z-*b5HDO+O_*1kS=nW=(3Y?t8l8TlvBlP7lnn*`|w#8*p>TKy6Z_x~0iLOW&wU%sP# zyo->yLwWd=F1~rw2)qv=yk18Ezy!TQXJH{D}?oRF1M7mjpzm#%u&%UwOI%vQhqVHKR8M}W%;RB~E zS9ni5b0mhlIZI)34`-~!+rVV{$f7cwTeQd-ZB5_VAX5CN=!r7sk*`NEw0FCSZYG8> zu@9UHvCBQW#)(;`Fz#I1Iw2HlyAyWrbxw(>c0Cz=kS-EHo#m|3)%}@ayu<`!aZ)C% zWdeGk)&{wqyTjcPUwy;g6xe*aY!uh@1#pNZ8B!r@HRd4=g_5G(Od+#(%b>97| zdf4Dwh=~!M)$uN|x#TRa4EUO0#(9_jQ?@rZA4a*vMesGJ_O2(weM`6Kf(PxkG7)KD zz=bLbL(U^+&YCO`moP)Xc;p;& zI%5d_o(m!xWBmdIm^l(~%+@l*uBK$6*M9I*;v4=NH>$WcfTRj?&7xi>oT>ymtiGVq=cvWPKc srLjdY0YPE>UMxH^8B4qAUTd$lr?b}sQ7v+# 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 NzAk-F`tN@f{vWKuEcgHb literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/Finals/plock-grn.ico b/src/Ext/Icons_04_CB/Finals/plock-grn.ico new file mode 100644 index 0000000000000000000000000000000000000000..0e06752487606efb92941d307f6768f81497cb08 GIT binary patch literal 25214 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/Finals/plock.ico b/src/Ext/Icons_04_CB/Finals/plock.ico new file mode 100644 index 0000000000000000000000000000000000000000..8e711cfcecb34751134dc42a104a206beeffee52 GIT binary patch literal 25214 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/Finals/plock.png b/src/Ext/Icons_04_CB/Finals/plock.png new file mode 100644 index 0000000000000000000000000000000000000000..06390bccce4324465dba27f7bb15bad3fb836dd6 GIT binary patch literal 40174 zcmX6^Ra6|!5}svocXxLP?jGFT-6go&0>Oj3dk7NTgKQEA5G=U61$PL3`OkfrQ`4s& zrn{!?OnZGJ?&lHC>5loDcw9=Z5^C#0KjjlK+9J@?G9gT{muqMS8CzBG0Qm& zpr)xs9Ktjx#Y_b(K4M}^3`E8t>*C^J<;&~zhtDF*7sPB8Gj`ZX#>E)M>lh21Qmj7>HHbff>RkaCz-^YD7JG2>HKI$MUJsy50XC?y_fbH}n!pgd_7E;GLXvDA0$N$RHFgM*9u~Az(Q5p3IVWCN?L^oB!GY%Mmbs-iEn_pPM9Vu4D<(3 zTq{A%4hyXVK@8fs58;l%}|GJ2L(d`(B=JY*B6faBh^cAYj6@McSdx&&s30k>3X^kD~$r@%`lY z7Xk6){k@&dJ==Zfv+IG<7pHSqYB8#d^_T8XFt7lo>crWS+3xNf*liHh;N9m`Wdtng z0`}|oCfv(N#fHd#0`BAe1)e0x3rp08M94^yQBY3kEK7Pgx8ucLxi?)m;zMrVxG&2A z=YV^zM9x=eS;Vuu#Rs1{&BXl?SgCg(?)GV31|vhC6PYHrcp8ma@!~G@V>{HTRR;Y# zHB)4$hBLOX4??*vC^Das(tOc?+9)-sY8yi9h%+?g6a*8Gu0Q1iNQ7LmeIiCl0Wj@& zxcu(`Ag%8{NrD9gjAfN?13>p*LgO##1j@e<0YIiWjJZJ)0rfj>EfhWfJ6SiB0LB7d zMgo-_mG)de-E(&QYt(;W) z>+J;u$0b@pCf}jkep<9J{uKS*JXW8Weh}YkSD#lmiPwrupWg?M1X^fuhDZw&55YM` zH2sMA!#O-TSx#SBU-}E(F-;407or|g#K(6(7^u^}sI|}qVBh!qSqe2K>&w>CpHh)i z71Eh9pyQaO$mZxJY^4f^+!d4VOxwLAb+3rCu_>-FT%n8LBzE$Dq0j; z#Gt$-BastPAW^2Fl=|Kw=t z%-gL%qJXvFM#x3z&Ks$VuS=sVvTNCU;!teb>d5~9>E`zh`oZd?+>Oh1*$u(r+1%MA z1wSVbB409*^E&~n^U-9hzfRc>9h2uDH@{$w*mtG$+m}r$lrePBpGMnl^ZF5p+19#} zTGsNc*{nE;SXer6EtmI~5A5_Zjio!~+ICI0OnZ%v4zaG(F4PVmCkoEyI~7{=E_N?J zB}7)d&mT~X=ZhcAT*?d@fy-3MysORD71QsKYrjvP%R25BZW7ZJ(~Z`LrFX|q$H>RI$M7eDw-&c_w=TC6WTT|mWOKq^!a*Kh z-lIOwZrw-an>;_O`m25(=-H9jm3S6h@e+JiN*=+^^2s95a;c1~{7@7ylCevC+BMZW zeN&eAEpO%PqRY(csOUg&&7%r?9?7uDPth~U>+?JPE%(vwg37$gA6Loy9Hu^|2Bwca zq0U?(sIYz}M%0xw(w+&6d*R53g$R3tP53Xe2b zD8VJky%qP09c%6+-fzSLJVTNP&QW@0@;R);s0qY%%n;Yl_sR#OZHO@&a?UXw6b?i= z1oy$XOw3%>?1vgHT3+s6cdT=@I|h$-J&6}dRi8SAmmS+YeC%o+oi&}Uj`KPo9n~FS ze$oHlUu0o>;m{(T#P0Mj^oz!Bd&2BH=W^%o5VYBJgE@XQJ6J@t&C1?Lcouhpvxk%V0F>_H|^C}5&yh$8u8T&m3 z=C$BGF&b^FUA`>gE4vLS2sIheeg0b0-n&S@G}pK48+e5tL53&1c9wqJ-OA#p=hX8) z_~ygZY4~aqu_Z}Y-(JXShn%n4Kw(l~MIgfM`?DiQFIVT4`o6vr&oHu5YWGAv5|9$=&Y^>z{)Hx7GiajQ?EuIkuh?+J1w0B=65MCDi9#%U0%6ELzfY z_V-g+0huY8TyOhp$l1GXEAK(xB)!7o0!Gn``O0G2x^|_nqIIHjA#Tr`^7TfpM>cmOCwd}v zUe_u|!josyp%0GGSs2}tZb^pnfM)|`|5w>S+l?Xy!EIwq5rgSj&dJA(O2hRb>(qZQ&lfCNHa*$J?<}h z@%icN_;T=B$643pqD3(yN_3obW=s#Z_y^KourB+ z05m2BJ!+)AttqYKHB|s0fDQm45dd)i`bG}`z?%~Q4$T2TC>sC>TvN>kWC0)*ML|YV z+i&SO*f)RGCga8P^jg`LzDF-rLJAF39)YVNqoKk2k^f~?$XGxE2mEHVqXQSoN=MXU~&Yb1myWoky zanHglk&lP1?PfS2Wq^|$DgczF6=4mlkwA0-X%H&t4{R|=f((+oBlrLu1AoBgB#^H_ z8?XRtP6J8Yv2(d>CYBI}=m5I9ec?TKrH5<_EOnEBEhrnw9RBTupF!Ek=D$CLxQ>8W z!40@jY#<&af?%$J&04L;3uxDK)m;GSFm9BPXV55!Q&@29?sE+oDg~&4^??lq;3{pj zBtQo&aiduG42&v;?9q#tnU)lJlR*Yki{w&^?5dTDi2+j=hNqO_2`7LQRJ^Mbz`+Oh z!-Rr?Q?-z4A}L;=d#f%2AVt{F2L@?*gKjS8v4K0Fg9K`#Fs$BF4KlCqMu$5$1Q_VW ze^$4b*Vf=b*Her7VEkGFl-{^%eYbFK$Pg`1zVYfcm>Bf~f*T2>5AbXIKesa%)D40< z0H#TnPIUojYptlzG2jE}+zv3AHPS=_zSY!;gP{k2>X)^|RgYEBh8pmpdJAqAXsD^1 z2m5(ma#sWh-^MrzLP*kz@@m@40?@8!VK+zty)yZ%-NOm;`{}eGxqaGogB#+%sE`~p zQT}LqSV%L_En0PTmwWU_djG4?=|3E&z43y10hfpC2P_)7`L@u=uNhMCc(?r0>gq@8jv=!x(QL z`h<9&-wOGY_X`}<6)?VXM1-9M{`BR|qi(DYPgDg?1q%Nyj#w7=co`&46x&-U!C_FT zBAJ>|R)*u$>S|6C>FDqzLWRNHnI9P97r^5ebbrYElzjS+$2?}gd`ED4eRszf1r`&| zd3kBzq(=AHZ{y`#`_tCG_^JQl@cs5(L;W2epa<%R%lTFfdQ+z3gg}1C9U$PT<|ppz zf3&O{d>%pJD7y3KXRa(Ng#qKtj3(l}!}x(LT$q6P;$p!+k8SR3d23+!pvc)C{z!rf zEQzg>%@}&RbHVi&5+)S}I^9+w5&rSSK)&d+TOZPU@R=mEuQDBzALvNUsjr5II067x z4?6TQwdlvG$R@|X9|U5xx6|bBtCJ(p@cq^rzS3v(YHEdguYZnr09? z8Rd@NhyqcvX!g}Uq69WpT$r3K3bP-rnl>ej28HWieH`+Djnlfb*R$87fWxZQTq;;V z59kQbas3Jp(X#+3OTj>X-qUd=@$K{3tHk3y#q+|speMS$J?T`fs^5?bEuTTaVPzk# z#DM7UV}2gW7x3_}j0r^piD7P(dm#til>E~$K(RUU+FPLOetO>~vtH{HeJiiT+3nY- zl~OoSJ!7AXsG9ojAYZtMS%4kEO^{n$2MwqX2a;#*DU?Id*JtZrCzFDMZsf)v|HkAz zp6clt8L2rY!3PEeY}9!LaDZh)O83nO?1&_9Llw&Z<&zx(O2?E6R|e(x*b>@#V!wJ0(GZHmZV&(=jqTguH;cQ<^CX5~fc)m` zf>ycLFEejLU-miB#m}J;#D|A@j9*}kJ}~#hUTNWodGB9~;PHwyD$Eb;jl5vQs@P8j z4~5R3QH^j~erE_oA6LRl5d~1ug;*}=kV-Ov;%EX9~>M&oeOMq@7P_|`Hi);wT;Jfyf|!@r>T)GO-<>V2Uc?fikeoP{@fo$p9_N0 zBw9}dl*V%6V<3(0FR4H(wz-bzpcA=@-U^2X~iS_ zQV$o<=7M^+{upY+{%=L@=Vuj?=#$djCK%`h@boE1PX`P&B?n^ujsfEc=bue9=ZhZ0 zZc*6(ZGCZ=zN@0ErfVdNcj2>L^vQ~q$YdYkGYY{@6X0bM7R6K5gDIF$^@y9j|6>xq zGu9Y`*{$`56GI>0`V)K)YCLAedqbb{Ft&Juf!8nfN87VCnb)RI5w3OLZV$~)t7|tf zfRG=f{JL-7Cj?^bQ6Wim;t{>}A%2rdLTe#&i$9m5&^SIG@8IU)18}r1Jh$dWUpMLA z$%#?ygXr3FP7cN>-Ldmjlogn$!o=q2Vgo~>Y96J3;2_c?`mKcxV=jb8HkxPFcXkO$ zP0WqE9Tn9bJx#%d_Ob9_FN2;4p-DOZD!jlk9S9Pm3V)7-%hVm=!^_X_+Vybggfd7L zYUvp)jkAj+;4iZ>ch@GCR0y@*j)hRFjSF~SM03c169dsYW0_p9I+aWQondQR+fpLA zJ>1*OQQyNq+*=t$1Svlh0<@O*H};a*?b%oQbQ^i8J8N%NIX z_#gXib?ObMfp^VPcS;qn2Y3rJ_x(bY9pb^93PnYuukClJwMGRF^i%5dBNMEC9gkP9 z=V4zS?!-Tjd!L5?)E94VPtvbjG{ zh$)}>lgFpqE^J%$#2r&DF}s0pJiQ20v$P!HE7-soj(sE;j!LKuQ5sf5WUm=Ais~)j z_$$kilY_`PHCdQ5sZZf|!JTvybeeXy$}<$U@d)%zjK;tD&x!j#^$6zzeOD)^ zqo?N^{+Yf#UO8So$3w)^ky1!5!oxks z)7qWz+H0?8G={?mD!4r?8WxdCXi0RX!RHaf9BpL0e2LxQ-dTW+y*ON z$3N2)j7vlhj0%TVX0yw?6E!3EIBvNi34_EmJCr>!2W2R%fKF2~yPbZPA?ldQhP5v1g8J4q&1PpE=qC z(G1Xq_v=kjf&ocSRsr2Z!Y3Wf_R)IS^@D>@?PSd_ivs(^z@kZTd(QXWNP;0}NOsCAODa^kSGc~JwAy0+6 zR-bGdz5J_r`$dJw|DzvdGjH&v-63CT;2g}q#APU zT-G%02KdGJ#h|rR!vgvF0n~!a$_Xq@!tvW*tJ_x)ENe*2^_;hmN(w5}ntAvadQ%%g zHq4MMqJIn0)&=RJ8&_U(-a3qL#UAPmZK)-jR4e;c9}NgyRtN``hX=FGi}mdJhuvE9 z?eKjPy0t+ACX_$>zUggK9T+zXfEg^Oc{Nwo%U08P^ZLbj+tLHPW{V-p%wh|Fll`V@ z2u9{^2f%bbDniR;W49RE)|~9hHw(WLjIYMnVb!hjV_CKW}s;Hp>F-V?@Gw(FOKKwXoMzOeYlO+cUKs1f!Zs@ z-y$H02nzWlYBy2X^AJViO3Z6>cx@;p6C@3C@JK~>G#6V~rsT(4oJLGhVT2F(c$lbo z?}EuVi7yQcmxU@tB*V&PfN@0FU!;WiX=omY;YCR!NrxU#r2SR=4-opciP$-0C-m^F zna)%G4gH~TZXT=6hyCpNcyPV#!-Xdbf?|?64y2y@s{M8cXjrCgFx`v3=YrH@%d<&)+PV1?b!$CSkOL9^@wL za0aw@`*d*1ZFq#8@L^9T(~|(?^yJfz4Q0}HqQe{nGOsn~ODA9M zhha_fC7&&NAQuS9nFjgB|* zP7mk>f%;ar?ge{=IlsYlB(eSQH17RJui6J6E<3KT;dheJF3XZcr%axlROW^y_#*41 zRetThy7-zF@_xBv;*(Ei;JDU;#o;840*u7y&Nu*a&Bz}dms)~j+17h>Onvl}3cs62 zEQ63TY^0;)Hu*y@p1obHS`q}yFVuW{|M+eVyOJ_WCWnI0Gpt?oxFK1H!0S8pyw}qB zkeQ1xjF;7OQ>ao)c6VKAh z0C9@Cj!|CK_n`&XV>L9kh9g${a&e5P0Qm0+MB`O4QFAD~PQ{gECErlrZM>r{VZVS= z^PpDIfiJ75N^*Uj=HP#t*MqM$`KM$1qKF5(;y?D<8s=B`?X=5o8LM8fdbsqM3$Ujn znK}{g6hu?cKtQ_8n_Qu3r6lXfW);IGib{TfK_nG1kZ;6*4vG!K+)jz-QJ*;+ z-Mi+lWJay7j}_fHazx6F=b@+))oTl51oyG>7Y;B_s40vO3)SvlflT-j<|s>-x{t$z z$Jc0VR>QWU5-Xz8`+OVF)nWQ5Gw+OBq+H;wHc?|y7)ir!ieg$&xND_f$U29|q2bl6 zLd?PsklrQt)-2h} zVg?mjEsiLlj_K_)`4UKB>KQ47s1YJGYCWI79x25{!A4Zzj(}-O#%mW-(MLaR6Om%^ z4mW|RTlj7-(dLaiPUQ$*9{+~0KkEQ5HpN5{fq3xAZjXIoAya{&_aiKPh0o)@tr{i2 zCau_z7@qm5{k{gyl5u_#{>_g^6uCyYI~yKppyGHA&V!ee6hLUu@Z#ZfoU*`;5>fnM z=+%_y6Cu@zUub=gl;b%~tsG&K45^%a80o_xllRc2cKTF?dz8#An(;Ruk|*jW^`*;Z zC<>Sp`grljq;K_K2Fgp_*CHcxDhLPa&N0*!2S}~zbuBH55N%%xFq)687p)R>UG;~? z$)isv6aKwm;PKm67VdcIIxQQlZHvSCO1INT4O4{vQKsLZvVR!=Y7acEieSGG(mt6e zjdWN)%l_$h!-B6%aFqs@;@bgUH1(1cUZw9JlPpFXLNSuq=>~o5}x9<`vSf_X(%AEaI*K5!6yD$Wb!$M(SQ!9sfR_QRj=R4}>ai@O=D$baW z*p;ag_?EK7AA&N5S->`x`4)fOQ*C5^V*;}HBj<=a8_8I&F$FL8!KLzsr^6ytGy=O0 zKHBi4DRa3FNWXFTC&G)ZNAlqol_nu7<`+xR=RYd2)zqPsgWR<{6Tbp}M9sbhHFt#} zX;B|w&nLho3=M+_5Siiq<-e8LgHQKrAJ$#_o{w}$7|7<;UY9@58?2(L-Fc5nFxgdr zrB_;hGS46eL3qr><_2x~ZI4C>M0E(AkbdR+GY*Sw3Dcj&rMTq?f2^G2M4~pM5p-j3j*bo0rAU z6Mr5)cKULF&hKBCQBKfYpc6N~S8qwU^y=ejduWfNmP5e^>64{kdK&YhV^j|KvrLUb z=}jgnY-Fa9Im`OfsP!M`G<3T}!F;N@dv}#MyewZtYbbU&*{C8^CN6QI?&J2RlJWPL zTv)!+%2-7VnpYglGFZ9`oo=%4O;?nLK8NXcgARplKX{(do8+ZD2bFyhD zv1P5LOgS|wm@;>$YDUbnQ;PRf&|yiTZFR7;{%bH)M#RHeRI#vzF>K(avmXJK)DGV< zSmf-8fO@OgxirEFDQ*H^+u&zc+n#aGP@9Ti_VN2I!YW##L9mB*RZQ@0M(YzTodFt% z&gJ*UnGWX$%_vV9ac=k?vDcY7DoLRF_N(dB;ENDSDElH!eK(LS?;8sLjCtPul%?k^ za?#4b8;H#KZJ^fc5mqo#rLG91Z5aVK#E}lWX}i9I30ab`Llbr8&5A1K_hM^%Tt{6w*>mcVv5wKnaeR%$6S59^qPR zpVPq_;dF@22e`rdF@8f!`5UqsRN)Cl^gO#D<;*g}7}6Yw^~5A(4|%9Kxp!X01mu|% zVzhi;^mNzyyuj`W1PLv2*Jq<{X#I_L7+ka~>N#vKdK}bGK=To}`|3XjqFo+ox2_ z{c4FHVZHyEx+X$mxJo&3X%v&G_h4RH(-Unkwd^)FqZ5w>iL+9`W}O@5c)$t0oX4r4 zAW|MRS^G>Ra55+9McBij>`9~`56M;FNUKcMKe&%D!nL1L$oOQ6U1DoiuaRe}KNe?R z^rByjCc3Rfvs;|K@~=5zP+@u*U!*^Twn-vr7&m9TJ#_{7Tr=4EUjU(ll1iZrRslrw zGxSiHCzPPu88L9|N^X zINcAPsUE&x2Zjtct-bl^`K2)wnu>uo9Lk#;8a6Tiu7Tqo%V*!J7$>7h2=75mjdVGO$~vB@Exq#N4iVt_yu@qX516 znm&%f48J4?F!m%NE?XDN+LP~^_e2}g+b)}c=9YZzkD0_ZIaYZTZS!gYacpyZ;CvT? zyaW(;ikveHxW9u1Yp8T-qt>;4>Hv^#oi&hZh!OM3l7RbNY*fg(Ju*%e)ALsWGQlN9 znZhe?z#-agRf%C?7$n(3mf@6=bDHvuWr@&-0&9V9=XVP)Uy;PKh#oze0LfM3{ zC-S0|z|`ZhEyTI(EtyX_uINDr|09I7>pg75vp;AIzJ-WQNchg&g+BQKN|i3v*ay_* zmKe)j`8r7p?Zxsf>9F}WnvRHkd8Ap9f4?HkX$E{RAm7tYagkv`+2e#;B~xep=Ddjw zD>y;AWZU#(kf`A9hhfYDL|9Gj&t*rfU9v{W|J< z8G&a-^^abE-Whw3>02@2d{AJ*p5XAI7_t^Mbmoz9gP(ojx#RePvy%Up?MR5E(2ZfBhyqA)0QXksZS341%>L1mRzusFc60JETK z-xDd)P++zeXBQT$oY)r7FI=EOspqQneXQ08UnC|K zYKVm7j=yd)%J3%vr@2j#1f^k*e5U~iR-Fblng9TFP`_>`$%z2E@r8nP=_@<8sJon@cU~f>1Dl>Yt7EjxP~%E zyS8f`_g{@c@LW^tKJPqWwUVcuj`KZfA6WfSO^;Ix{9-MaB@x673>z9}TVWWHJDQ=4 zPCRSD?6x)-=uuX;3aymGE7GtoS>I_8btvvT!?*Ms2!tEMn3Hc=J`!MNI4d&IVrTPy zA;eL^qiFLqavHk}36Tr^`@>c7cCOF}26NKk*+1>|s^HZ`-1oFwwtZ-GTGGGELD8Ya+{#qLkH@m=gspeS<`DR(hRyNoa_9ON+q9dmZ~rPSpHj}nhhs(D>I zUmncL=VYl68=hUif6|sJS1)TGcZGUT?qvJ4P0CMaScwGDXB{5hC2x_#ijvykhEs+o zqvjqf$#)JlvFfLnb^2Ho-tMlJZ3Wts__}Q~h~2F}UyuoKELsJczI94$0SXw-PU;TN z+vC~&;GHs>>+sB``C6yYw&$P=#QDtWl~7gn?Q69f@qKkKmKmnbt*x)>GKNY;OX+1> zn$~})&(5QY7410Z?D#25*?d`J;H}=1W1fYS?__7UnYvk%t`Z?(nE^=Ij=6OQ5<@D) z2X})R@rwygHOka}-c|}8O$qSv-uewG5jIp!4=c65-k(*)?-d*XXk6s7@5)WrOeD8ac?A^Ru%}e%4qB(S(eZV zRrjNH6?A-odr#rZ(N*@CuA*^CN3k4i=y_Z(=_Epf4X#~&VC4|bi2f(GtfO(Mn&XAd z!fXz6_G+n=yZj^)yRgVqJ}Ql<1tSOd$5n^R)M7?%f6wV5`8F-WIQ7rcQlb=^`iqY# zzT`6$ArcDVe?EMFYeE13MeX%PmT7>&etOlk6V;SBzF>j#2z2Jf?aAXywb;55t>10! zmmj7?2%qtGoHY7kuQ>8y+bJR6`@2Nn(ElW?>XR)g3g#j;ja|TwbX{m zHl?Ft3b6F{VcM$Kurn=o>;i1Vh9w_7PQ-(ED+`_%JSdcJSID(s@=-R<70Cr$*Sc?g z^Pk80=IjduR;L3}g7T08z)Cizf|0g%w@jbOwG~Ix7BUbDiT0-@1Zc2y@CaE<&foglrTO5SDQ0}=OZLG6-e0{`S<}Ge zLG61N!=gbfqWqC|24giYELCh>xK6*Jab6nX@ec=rfLX?6zESaLcXeBH#;?cEe*>A> z;dH?QSvjt&t8~yu=G7V-rHTH&bHOdY_V6Nbrpeaes zuuaPJr9W(T1f`JLm+bYp@^+dnVN$UCs>q$aFLq_E6SRf`2?v-dm;JCklSyJqi>-AJ zB^;mj#X|9w!pzm-=MzU-VXj#7n~o((ceCQFI__D0vzWb74|^ix&* za%$+pe{q~zsY-JY?4@K;gRC09-DES* z)Ub}&eZJ4I9RL3GQ(4G1U5{i(A1Q#+gLsgO%vRKYDACH?(C_@#yzyFeFB0h2PI3+v zqb9HBVn|$SWkHAQ#;n>(cmok41B@~w-}B1xoL2X%J(Zu#3wn>PKML5HL__u&I**mz z%JFTyf23BmiuQ@iG(jwja=ORETn4B#=YKM;0*dVroCdZpXoG9VS{^VfsBmv1XEx1n zr{Ap5em9mlf}_Tm!b>&HkncZZIMYopVwIbp3Zsa^(=Ec6U8aK)=(!QylC;oANh>3{ z!A?R>2Q05w(TX~eD8SluQJZ-FqN2uL?pm2t?5@2#l4NQ`Kh3vYB@L{3QvJrIhyd zw(2Wuw!jkC>jfm<-*odbc1W4PI|(L}PrBs7rEA}~J^gA*lt`3A95nIB}lXblY@p+e7H3o z-wio)$~3vA$nsL@V3KVUiYL#fcd#nU!lcavAtV)lhg%dgvWgd>pprz4uIGM7$qd@E%^Pshz; z*_2lBTn2;X4IGVnD!Y$VohofJnp|rIHmh9QoE0gZv;ue1mu;*;Rhte6sq}1cqioGw zT|NzY5-Etlg)?d+bZCOR>ua?5WgC*V1?E2`Y*-<9VX#2W)Y$9e(Q8A6gFFgTyj`j= zfE8a)okMHQkfeHciEDb*S@6D1df!HdAx3#JA5uR3G1>EB*Da3XxN&N2XNa++e}8Pz zmiQdZs%IL4K82F5f|A&ZruTbet9#Ik5ZT+qw+~!X96S8(wO;Q>bW|A|1-_;>U8Q*X1}p!Aw8j1&{NR zko;9z|2LM242CiduaVAR7bD?SKee>BdKY?4F^vfk;fr~0!8_?VNl~JGuE?Wdp_D&* zUS=dWA7V?E{AjKsJT*X=UsqU+5?eMh=NEHu_>+6hxodcwDVywkAcq7)EjG&4qL&P?D%J_XT_2RUyADmMtymxr2x!z%#C`2c>AW*< z6GE7_AoawQRzA!aT&!Xef@lCMFGBbr)4&uZog(!}1{6B;tZGlbG__=4f$106B!|ET zbfZB@nEmbgo>$RsTD@-s%YMztrI2KX3|m(Prn9atY)35W6GcSKWZ|V7$d~)FhSBhG z!!;Iq?O4YPjSy;L%QuDGsFJds{@~E;$1YiAUHTGxHIbG#}m%2O5Jn1`h+Vgns)=kOLc6piw@?k7QB5_ z9A%Vm)h(qj%}VU|qRn9*@!yqUN=)ydSk2a)*vQfcXPcOC=m>GI=jR##nD#y7EMceQS+dzx*dy%OH2D_ia-;b*hfX@$FSk#=w^R2e%+IX2= z#)8O_G@VsO@Z2YyVALq*Fa8uJHMzE|v) z#yG&C-|<)&z1Soa%{m>SsL-;TbWBY6^J5fH?;nmr8_3FN@j-;y;bMlCx>(V+@+>D7 z@NnLvv3Wg5&JyFr!0H37kz-aaAB-2GQE z`!elnwo*)?t%O_5LJ*N9hSOY9-A%->JS?7wz6!$pXParb-y``NI2bO@#8cf>;Q%My zVlx;U$OYw_DiC&ERy(0Y<_c*lv-TU(L|G$z&8dIh@TN4M1l!fjvlsoGv9_-2igTBB zpTsaQA$%52m$<7yqPI>e;B`tGL;A{%ixwr@b6D0DB-HwT=%A?!rI;v561%WJS)0$^ z#whtuTsLS=i87kz+PZ@EVBtdG(%n&<#@wiuHNZ{PflyZ=w#Tx$jCFqn4d05?G@$3B zPWC2T$JC$&pY4|zq?04bqWjC;j3#e2wc8JUU?>TYuRbg+aNB{CHyacxLvA=x9C&RK z>!|--^*trkY?iN7(PwtF^7pi3db^I=Ro!5B<{A$EE$<43>m5qW$F!6L%f|A)t`gee z6gwQ$C*`2eKUhAhu~J51o1p0=c1kk1|9}sEEtM(f(Ne-I%+3gbG%HsYzzW&C|DcF) zv^FC2_q&&}U^4+ZBQhPNCH zfHtl4Qv}7+m$JIv*knYiOwIfZAZg_f*Zgl8+Np#QTSNijDVq^HJ0{LNoWXEm`X4w| z0V>{%rSd^RE3@Gy{`DfVk-TDXwiZ8NkrQNd-sixlC4Yl&%u(0E-S{*;;n>BY&-VQq zC9H9gOLtk)otc_uN)|~zrM`B&sA3yNwQ?PUC5N3Og=JXrfEMPW&D+@&HhsafBH4Hs7DR(%;vGq}#&{we(%4Ixv1>o0s%2N=UbI89YBy3X#R zOdNInlqRxi8@jQnaseYucMb{O+VUm|KE4xNURDt7uBgAC8GtUd#rBgK6{uIcbsGR}-~w7B z!LxULuiz6G7aC+AEd!bLaO-3dKTl@(%M(VEddY+^p%(beB8**n+~pW&j{pO(Q3FEe zAUplP7G~6~UxnkQidQS0{Vk-zt$Bo0gFvsi+GG@s(^E%k-sT4`!JniG3DU-{dMk;ARX7@kene^c({?1R&*ij+aEkzSO6Ijor zv4t3x7NGvhTx#-2zk7cL0JEx71a3Zs~&Z7mM34G6_UN?{<_ipg2vb`v-j z-_MBjg3<|7kp*nb>$e{DRB|RrSk4d;7hVl=OS%9_SrUrhz6~uigs}5aYe`t{ZOUP> zbj}kIjp@Sk#bm=ggQ|PJKKKASoSQJDX)5Wz;m}=gO4ujJuh0yAZ|4u%u-}eEH&sje@p`c))+kabC+)7D_GbkOB$!SB;W zequ$Nn)wXDkpO);yFGR%=OY^(1-Vnd;y>Zkm}|qxtE^!(;y(-x{!$nYjby~PI(wJJ z+Lw;(KKEi>hR@c3wsUz|twcLdvJ5%N$duNe9F9oZmJ5Hqc_JcdPp>CiK-#bdl779o z+okr`v-w_up-CZ6(=f=q>F+naPT<{VzW-r-&og#b-Tf{gU5^oVXA-XKwQy~t7xPc2 z1^8`nee(eB>S9Rx&SG==>SCodQvb@*hFLj}-?e{ljO5}+T*cwpU_#NyVB67Owa@7N zR9A^VJ{cgGFEpgsJCLAL$1$Qd`aO~s49m&nNtC>bg^dz4CiN0XOMmKHAH8Zjy3Q~6MD`7p%5u>-v^VBOUZk~hu_9EWLj#v;m!TSo%^Pq4l!8H z<+-EDvuWV+4Iji3{3D-Iq@R;Fl+@-Z`nP-HsrY=gKEnlplXY<XrrQ6Gp_^Rm^SFeI3fUL+vYnBpwD?Oj%+a3kYz>Hgf`2C) zUju^RnV3KWZyj>2B+q|Iqd`GMdeH9vbyZ7M9-6RL_0huUFbnLF;ksS6^KSwfgsB~8 zOFKVtwkRT+i; zdqzv^S8JX|czMcmkH*eb{$vtlCqwFHWF3RFpGYt(aKvx_Ms%F!nr%g|Khl4A9Vu#X zKDb(Fb7AqBZ4C~@&~2}W;v}sm$&q)UTewN-Ff1c> zp^=d&Mg4D0I}5e0xvwS(-cEW}yK!`H+`i3g{-TIy3?WjhLDjfNaz@&vTsO*63W*TL z0kI;u;qXw=Wyw)TZ!Tr_)I2WqCWl$;TL(eQTz{-{jf!JqF7@}~2#O0KBvt%sFH~w{ ziC=fkxzOyFJ@0emd-#|%!OKvNjK%?!_Jo3I^-XLMd}xxXD*W3er9LpB>3DO|+uecs zkY|z!=ajPQCKEX61_>l#`xK+ zPHu{jlOkOT)8gXTDJkbCh;qS}V9Z@JEe1V8uXyrg+L4f?9B<5O$89A!iLE&dP*RCm zZ(#37q4*RL5ZB`q_8yV5r~}Bo{*FFi-zuy7T)gCwT0kLB37*w!`r0_x;p`;|8HFS;W4XBcVOp7-17#XY;h^X$p zzyxCLQpt+|Fl5+_x(b)vkx6%Nry0P%0GM9Rv%c^BA83EmnP;_RDHe(7WflZM_d(fk z0vuQr(FX*s~oUX|6#ED6=-+`4~2t zl-LIf-RVdMx$J3_{Qdl-6Nsc1 zamhuv_NvRUY}xaE)?lv;0s$L3)?&r-#n`c<2h*nShsLI6Gv|<}(;0Tkwr!ORlc*Gx z;$=YuAyoj-~R5g5q$N>>y#L3bJOa|=qfiJKvBBhU^^noz%m&62K z@HFyZ4lSkg7%8bFWm*o7=}gU+4a7d6=yq`Ng?982X6-Yv?#^2-FSi>o3Po!0`cfsp zyaX&L>zXs?fCk0wH!CW;xs=~Da_&C1{YNgcx3{mvr9b-tuKLxb*tl^6UTN3rRmL}1c0)x0}nd5y}q&89W(kgV26l?SbC#Wa#?|a8#i|1 z@=Je=UtDt0D{}KoaPaCYzK0uscPX}R*&NZixB7I}E09cpurv7VPqD}>JgXK&a^?qe z3PSR{4MM;~dnB4*6y(5?cz!M+`oSfbdl5ZEbUx3d!9p8@Ps&a-{%f40n`P!9`d-aQu*c}M4vOs{ zs0@=#@MF!ib8{EAHCl?nXl?3j_GEkf0`Ee^nOS?_=u9U0w{1PZjA^6zp}VgyHxt+j z;FqxsU_5}ic4EXr@#b=Uk7m;B^=ujrFsx3?J^ z)~~@ezq}BCz4dn@8=^=%6mgW_D&zv02Vi!;gV8mxrWyfCyAaT7y1FICxk(4$bPEF_ z*5b@1O*uI#>lM*26t-Lll!Jai2_FN}0v*|@%gSR=1y_bPOF>MHI_G1A7#Yc6B0&m| zMmi0_WjJuO105~WC3Cg-gjv7;dImHRuT$7EGj`EH(3<*0d@|Rn0 z!o?ST2dh`F#H;OE^}_SG`ttw9V-Me{>eb-VU_WLWwc2LCxnNy)(&q|dW0SSo(vs_% z8?SA^GCn~NYB-USP}!HuA8W9Z{(cZ-9G2#&5g}A~#o*LSFn2I!)jD+wPjXC~wRWM3 zQUoR9YDb)<8gp)LO4=7QlHEB0TL7pVQORJ?C(i4{8_EE}pq+el ztJRoS2xX>JUQIgMD1QPahs|DPSM|X2>_(o5%KI-wNJr4-su_lnnwqed(pDKlU>%48 zD{)Ze3uxMl+Eaic0X9$DL#8J{#`au5fz~aEv_L7xRI?3v$&!@Tbb^jN{>(}^?+3;L z!2abv%ef!;P%8&9<&`ceGdigUIM@Ll%(jOLw69u$-(GtK?!N1GyxOma?!6U%`SVrS zuUr*^mYMC!6n=n!m zUs1dGh%ksUe3j*@9cflU(nzBRW9<#uxu7fv6wOX^UI8*+1=0@Ffed9@ADS6)N@^n- z45Vi}aO6qvtHeTV|5yN+Q|_}IGIw56$rGQXV5R(Da!4qNfDr(6_jKdlyZ?sUZu!G* znc~~iuAZK4xchH6V*X?IVEgtSPd~LfdNQR(#0WGdb}5ZVjR&9H=u)#WSfdN!1)w*j z7BJyheU3;;V906 zi8#C2t5&{%n{K=gt5&W+^-4GpFD$_wxBm_s)~|6BcDiLorln;?Jvn3k>1jFgUWvBO z6_}2*4_6jjLNYu%S;;%&sPhLHbTfK~tH>|}NU zQoUhvTmwY20}`Yk$-f|F%g!QY$?JZr`zRQc4iF?|bR%ujZ3d7A_6?h<5- zU}m`s^1Smt))1Vsitgt~f&>sZwak!%e{jqcieUzmOS^Q z<>&}-%mRhh&4vw|ki9Dptk*(baxGQT_(v|S*W@+4L-XRgNL zl$PcnF<}%97;0k}#LP#7mvQ&PtDJdGX4dG&1UBY0&16d;Wh|KoI@LKV{@tdn0mq;A z;YwJ6Gi3mnQSPIUJnGn?dd{33!mA=<%s?aSi54HbdDBMRcFRpzx@2*6x0kqnX+?NHQLo9VISF%Fn=LCix~Lb+Ex%j*-bExa1f$3*d~Ey|`9D3X$%K zwj?7=p81-g6)dG0G5}03_t6t4O|G-_M6#1-;?rjoN(TgS*4KUL!FzG%9k-#Ur@Ok- zO96u2Tk+7nx8Rut52G){$6A%sPN{kn=6h1;l?V!IV$Ig)q|kFMW1hF+9ok}F4C zAp{y^TQeA$EMx4N9X>(g1V)i6rX?71FF%OS1ZP2S1D)U-fE>8(`uC2zLE3eR$=Tg0 zyLT}+lb0uXN!HXlv6AuN=`sLJEBDb&O+%?ToUdodGRcH{u0-UWzS&#qj#dWw@0}TYwfuR7zII7en3s67Q#UgbUCLN~E z)-6M+T>!xm5lFrQCp8EcVs6cmAjd+oUTsL(VKC#xx%diaaY89IGds<}04;sTPWFtv z%o`$Q0#gZAVDbO=geIzB8BLP`pe*~Z88c?CR)Y&-)H15=mi2?R;DKC1&n$Qf4?b{r z_4I$4S-?||-GvoPpVfVN>3r+v*JbK&+Dhv8SO`}7I$qbLBVbi;A!V->l&@N{Knk~!Mt5(izX)r$(2g5 z16-m-D1*UZZ=8BI+Cz(fF3%6a73?|M(6FNui3*heW=SsJN=r$q);j}q>_ z^DkJu=$Y#7ewo*j#ZThN$L`Ae^5P^5Fy@t_4&WH~o~31)nLdLw?iA0Lu0WElvIzHp z?Wvlh;<*oAY^silBQWy=UEPeskAG*m?Z7DjCKdopD0lH4b@cJgNZt&AL<=O=dLe=I zN}5Cd#jjqy68GJE$4gprRj>TovS|b6KY9l?tXnMzG3+;-8e}nq6cT-YkTYM+?5*vI zL?liujstRR=LJ{;jA}Ab>*3k{y$)!e?Fe{V_RO1r*^fM@&lTdTMImA>F9EyMQ5uF0 z9AjNlilZW<$DU*qM0f zc8jc`)aax*jUIaN9z6TZQ`KEv=JouukK=E*UhQSF6&ui4u_X&Xqysf;C|R;s?vz8hjQ#iZ3qWH`b0^(it`Mfv-I z#twk^#!Sm2#p+{tH6>^TA&3lHl}W@=zs$B#`&7~j9AAr~Ye-qwu;C+XU@Wo`vy4)p z26Tjg#%nLaRX_i)$iJ4BO52k~)b=KYH}2;ze&j!wx*(d` z-w~jO=pevEJ$+mJv!<@Crh<UX80Se$^e-LRi zR>WMES@{hBxw~-3=71Ud&0V$lna9cj^+%K)0FFKG#2Rhh2ycdt(C>%+nY zPhk7@o;G?7K9!G896W+3d}sm%sI!_EPm#(a^Av-0)V!19&zy8LmMrs z8w7`12`L(ZNUN!~v2#5ZKljX_lYjP^IR_v5=ofJ832y`yYU4vC7X6k24$P=;Y{Dt8 ze<$Aa!GFZ~iPNg9w|Wgs4Is=>lokUUE=RU7#h5d+l>3BfhcuS?2HFY$%2E`WI(46V zMGzrf&p45X*k?}ua{02QSlvFjT7TmwOu>83{S*#8{5XKj0EgWEKa%!yT!@0W_Bey!^OmtTYjHXL;*vP5%Wxj*f0)Vn6iAIbZ zRhxw!%Kh0`Nl3F{ImJX07)zHdLQnU$LA$?=jYDwqX>Y^vuYDsL8k-`b6r@IJS@f?h zV=gUa8k<`1+EdTMYmPY$wRQE?MO?l5asIRLdo;M9o1kT-d?bZY(w1RE^T=|Yf`%3V z3@PUkEv>@}#c|NYs8Ks4id32+0~lgn8-y2DEFIj`f7bpu>D0HPb=Zh}bCb3%&=X#M z%v6b7CjW2LmjSP?(>`eCo@2&M#1TiIf|izH-Zwt5*3JuvIKv>~jYnD8&^BT;<{f!5TH8icS90~L zumm8l?MQk;5m2(ATHC-(TlR6;vH%SQ0A)R@koo`s-dMs+{7DxYwa1cw-_Wss(8w$^ zW*&f1W5(x}T7dDr7jKkE=&%Xl5~aJBOg@U~yRqY^V)B%It1G#B^#cXS!9Et_g9=j% zURsZtGf+ESqkUW`mkn4~fcFP{Dc~|!IWUuB62#EP3pz5SzrUel-JoRvGiL3Np)JF* z6Fn$VN^+y4TDUTEZiuSoq-of&5o0iE>a6NIu3i;xf0))E8_mRgd>PVP0Rm%V%J8fm zz2#TRwdKESSrd~vU7_r%of!z}k;%=QHVzsEc+%9FXc{s!$0wAvRKyZHy@IqeCzsLW zzfWjs9f5HZrdL;T^{VU&PWCQ5e?(2T z=mRfZW3{x@)~$m#05o>oB-GZ`o9Qw(VheC?E1566aF7K{ANU-=sjF|qh*9IK3%Pn# zmH`lFYQx3NVlV(o#auMn$IgklxS{F_WoOfUwE%XM697W!W99-WQAy$MOG%2IZz^L9 zF6xEBqyV?Hj!+#51@6IYdeymrR%n4IGf7^8e z05R38dR4kcgOo}G`;t>AFBfBmI8cqVa}CM{0eT7m%A(?RcXtOZu}o1Zs;J;2bf=(h z5SetFHm*0PKO0$S)_VDz3rS|ks&FgTH=MJ)t!wk9>PoI&{W+$J{}sIcpmH%rz8Izd zqEaOe-Q@ym+X?`-mbI}qbp~|;B9C6Gkd|-GoTlkN4rcniX7ws;-@d(sKb{<9A}vcT z2|__yZjrO&?%Cdh_3PTJ>$rMVxcx~Ph$!AkdPtF+O%ZNGDsuopgx;P_9agVgT3yN2tFi#V?Ci!eOez@$$}P#fU09akCQs7c)lqH@u%!T?tQ>avvL)NI z=mnVe8b!MT(gRK!PYfGAGLt+W=xfR11=zf)Q-OTib6$^LI%ijb9i(EHA!R>?Vj9-j zu?8zwEUK>L>eY`RP~!gwR(b$h{v8oPQDEcxrQ6G`lnVgL(&B#N@khF~7a%*2d6iC! z`Z;e}7QwS&!$+Y&gOdR)Ui1{!uWNS!3Buz(4Pb0kS|vRb*<&nt2&`^jju)0aTV2J~ zt6!U+BevqwLXD7T+tM@9PT8(n_C&eD8XF4$I?8#(z4zSFXVpqrSsw}gcEJJAMu)|p zk)y_f1}Otr`{GJGc<=4lvU!sTP6;iUN!)nWn?4vRCh4{#h(Q}W*5a`TZ^x!h9o3aw zz4{FUvYf491_{tFYo}AhKvk^O=NH~x?qpp@*#Y43#~ztbQ(%SmYZn=k*ru8Xfbez$ z1LG%5Mxmx=P;P8rUoRfG=N2q^Zb1f2rp~e1`*2ZMN-~kg4kS4Pz%vUU!jq5Q2@X|Z z&gxb9=2!Fm5I%>Q&IY`ncy>7D|30F%fajlmY(gagU~T#DJZRTa>l`cF6+mXeEHF1P z0~00|i?Z3yy&W=2NV$$V`^R%b9ldDL{)~#8Ed;afww69uHUB%U_UlG9C zd_mCvoiL3w+@%~0WMT|$s^}f8ttbF&-?5Du*3(R+B+}|BSbOFC)SWzK1{&%c2JQZK zcW=cVx8Hz!@B9_jvfeThO~>dvy_4uYO_x z(zI3hC5D{!rzcXiF=?8T*46ZIr2(L9vHOi1I{E;us#Bb=CoNQHB#$I1m;p?fG!0|M zO&Zjj+`e)tuDkMwc>K}3h3}dX{Qx;TV>^1827!m~y#+V@?kDKnu%^0#tJeS|0Tyf) zj>qXWu4Up0A({-mM(d&M;ky&(9Fmc0m_I`y3n=_8;R*N_Cx(3 zW&y=g;3-^j$v1G{-G4^t>x-zcNIPuSvjgeeLiaY@aoe@H_Ltwr>Xp^hzj_VO=Ff~w zb00)m4P=-ZNi869+4QE4C6x@;wATVyRqmr6xc~01gXW#ooTkr^zUZ)AW~s6-w9J`N zDAZuqeh1^;yKWoQ!JyvW9eC>T`|#^azlBvVEWu$%or+15i*x)zytj}z8E3rgfiZjkL($OCh%JL`4IV-t7Cdnu)~{{H z!Y3cZk;lIg6DH2Uh*9IwGHgUq>MVKBJGOVDbHh5UU%Lv+pMM(n-+dDnEqnwWdm!z1 zXzNIP`xlF|_a0#J4Ma#zMpl|xNu$GcNbEEvDe)9(MQ%k@!Lb7Y_@B@1i)~$%w@@3K zhvQ>ke;UefQe>CAYB8EHMsrWYs-zM%K@xR1wodT69ASxzj$1Mg61Uy8pv=r+)UgNgNQJ5 zzk@J-;#6$tSi4L70bguih8NqH;qgcA#Eg9p#??2d@lovf*=5}6u|N2Ji5EPi>bDS{O9557q1pUI^e*J zk)y_8-r>h%$>N3R+Oq2=>(;Mbh4pJ!;eosVyw}!{O+#8SbN{1->XAL^qzH=vVol#E z9em0r&w?gNQG~Lp%07_(-j!{foW)3d@B3-3#-UGZ=#wnxWR}Bvat@}Yrf$fohetK`iu1&Y!>08lonwYq)94kXOE6!cT*I>xkqFAj5*aEUFJ1m%Kn%(^DsA~ zpk~IMKx;zFmLt;1cSFQt!{?$dHjB$kI#!|;EYoWlFqA$dpb@VAY%JsPDF2=#lc+|m z+D_pOKI$(@71q>bLBqzmzVvxr%=Q0%`hlQ#YojJ zawgxJY>XZ|5%XSi0)`H4tM2NTc{L9mj#&pDkLK3V=0s$5--DbZ7q${? zII|SV?#z7>v{SA7epv&B{PHmSm${iJ6LNtZm=VD+4TPHA$$Egr^xX%3i2q-^A z4tvdOF=bj+V*6#E{!{nI%>9qaWzD73Ics1H2Jo}<4XlJFWwsF6%z<4Q$3~?l_gB=< zrC(!UG5~Ojibqab`~R2?;6_SmXYdjMQgbFsaxR0;*uD4cJ_Q03*?&Y}VDvENWzRoZ zt}<;$vgfk^uol3=azEC_jq8F$I3-Y_7ne}r_7&l>GMH9{IbJ8a+YiAiRbuN@?m{dI++gM7g&ZVugMI~+GS?k^p)W$O9OfcDH z-r8g>SqHs72eSwWtPMP5B+e@CM z-IlqTFeTPsEXIKC4HpYic0`!bP~U`kN1lXxkuyhqfV}70WWd-??3lcOqp>gK!gx76f#1%M~ZeU?An^!o{Qg}(gO$#x%1v`Wo56+=s=ia>L7D~>tw zjhHmKngx`)#!sGu{SSQ|>Kli`y0K;pDm~Fdes442osAS4SO90Fv>oLzSB?jeV+^K8 zl#;FrI`{yQ0Mze|McHeCpnM>iS#>4yY#^Fz8&%e=*?Qu%3B4Irl9 z^Y~HVNAA6GLIrQ@$yflG4`5x{IKYNAfitlUscu5io+h)Y2cfOH_nUJVPB`UlXsYr8 z+|@Ls6^9=4R!o?BpgBF*^!bz8Q*MMH@fVRP1QPo6EG(%>^!+VeRioNL_}phHIGGe% zS+Nfs2*`rSq=samCErv_nw0Uj3V4GD0%{vDPB|7ZN?OtuOaw6!K`;G_+R#x+{l6~R z>n;Ga19+_5XM6a;d%D;->55!X)u6dKrwjz7QljSOR-F2Vcj1tE$DvTDsqXspi>j%` zeg~g~c}JgxhQ?-7>kAiI0~A5YOIvRSQ&cMLMwl)RE4+ZCcJQ+9w#F66HspZqGpplh z-h*nT$zRNBCelh)JUH@n4giFHU5$&1FN!pVBhx5m;KgP4bye_o9)p+wE=2yZtm{YL z|3+6`4HOU~+kp^TXL|aHbxI?m_vrDHaKb5X!|1USt2;lrMva+3mchgi4C zILfnN$^|8h1{9ogHrS^30<|W}Q+mLVf=Hp;It#I^LRO5of$9V}$#>b(G!v?s*rsGi z5}N=qSUdpnfrZnLZMn+4MDZ`AC{6O`$hHFR{Nr~k4FD(=03InDPFyg5eCXY#xDC=! zL$;%2VG|IUPD?&EC4`VT>}m};*Hp6_A#iftw%1oMwt(z>hsI~ ze4@o5{pFi#?hq&mV#yAG9STw>0U2$3!qzS8`gKpXZCR&>ld_YQ6yO}o zLb4M$kiw+GVEDXQKMaGb#Jnlg{g-J!ast-KmhHT}{Qke&c=-O?U)2F%&fHUR`0?*V>#(uv zG)~PTgPFHg*6a{}7f99L-YiwCBXQ*9QI8{tmM<%bD|td^aJ*1o`s6p4c)q>_?c|}! zzPm(#c|B5tK`a&{8$^x8V^!;OurAg#;2cMxBnwGKgd#qg`L`$7icHwn@k|eZ#xmc@ zW*Y!(2Jj4k2h06@S6y-OhMI!a)XxE>fcWr8kible=5oq^3YA1H)|FOON&D{CMd|OAc26BK19dkdcejih~5s8J`i{ z(WSf@PsDW)guI+e|BIapHmIN<0%D_?KeM&B7jJ#nC(t~!^;NU^ zhqjKwYtQ(59D4LwD&fH5=z;qvoSqw;bER0_D#aywC^; z?AnX@=3s?KWQx*;!VDX96uy+#%NmG=nnh3<19lA+SiUZE#7W!MWJYcu0uW>Zdbcdu zQQ=#;|K$dNvh@M3x$>tSg&K(IDt3b;lB=Dc{>kqJLlX`8mswL=htuEkVVrT+`KYUV z<+B7Enug+p(?5zMPIz~ILX(_yvz`VqU@2cPZo?>oOtQkrkDF@rp7e$dh>repWRz9E z4|aCzY6?yr3jTT2scNQB9Ua=9uqF)+5sYe3uLxrj>d=#_KoZa>W>5q|b3*}7+;dqa zQc6o+ZUATpa8J3PHF+;d8JbvP5ZH6@?ck5z{FG$dnBH6do-46%4xYufHjDP^;i()9vhxO8WJcKn9*`$G3Dv> z0amz#WEPr;J!fh~h8rNI_RsmZb~o>k3vniEmhGv|;&c~Tl>k0TBZ0_7;iY|k7)zs8s?8JR>^eN}!nAd#>Lt95DADzTv@;!W({dLv= z7rWDq6^Lg*W|N|lYNLh7ta`@hkN}@ltTe5|po}a@>DyZ^!TkRSArrQyGjX+H$&Pe# z+t4Dmhy_#j_nneWFaOl{gWSQE2Q3m=oZQ-oe5dKH%()#!8GxksKdgX9Z~oHS)hidZ zl)1z@0sIGmH7_>+tO0N|fZ1hb0M9+s@^|NbDg-o;Zn;pjjgx-|q;%x;Pzp@MXEY6I z!Q^Rk(AYE->(;Ks=8fz7r7^!duR={NCQm;E$G`qO9DdxpFl6WmT_Z~ph#LzfRT`+@ zNp=2`=OK`yoo2tI7Bg$AZYp67-9@mh&MfO7vk^^j(cE`L!8aG=WME>7t{Q&G0b(^24fCCPF9Zq`Fr!Z&kX=rF_$+tVl$4IlzP)gIawhZ}zS;p%p2)=-s`qP0$ z2v16(I@4;5wXc{cVb+n;-jf=5l%?$cWV9P1-%QCyC3b-&8(S7;nNW{`kkTfF%){#P zyDWozxsiTWak6KxOXLka?8b*4na=qEFsZ-DMAGNj@PC`7?5p)Ze z9YXH`I=E~_o}2-a2?uXtlI~~IE`t#yQP~jX%EoyqWQ=NKHNVUT)KCtqfEYNIx#rmq zneU7wekB76!Kf&c`W`c8pzzk<#NS~0_yS-4wb>iHwrnaF0q+EGGJr>8|5&?|2R@nv zfV0ZN0XA(M_TuWLJBAM5r%sKlMs9wf1Sm8Mzmye{Mu3ZdSKlxMv*sLuw&7zjbI#%T z+bvgO`H}_LuzvL(x$%dMoPf#G55eKbzY9}m9)`A&lgw&41lN$+OdG1l9C8s|RR7Szdvw$N33$UBtwC%q3xo&0{x-2XT<3~5!VVF+S_lI*{m8Geyh zItHbwmpS@-Y)CQrAdNkhnB`q3L*^nU8pt{+)`lUxle#~Kb-=tohgTqyu9NO&$UIl_ z6ii_8D5t<$C}~Zo84Fg%9Z)786mgj*#f}6FCPKb+NVBgI!wOjNe_vhm!qO*ODp-2o z2k=nIGV~=Lyf1)T08B0SRsZ_Hs?bYq1(%YtQJ|IW6O(dsB&C(pYyQ;BZ|JiN?#E*f z-iG_{ydLXcT!9@swxf4|jURVj-xF$T>rq=z8|}9%KR6N+ z*J9Cy2t!WQ+rexOsm@Gr>O6WQk#4cEp6$?N9XZymTX4lpB~|F5NJ+vaEZCtWu-UZ~ z(_kccgK7QfT5u6h#2D}v?I=W^$KLA*rC0JJ@ z7AjbV%K)4P;Mqzufb{_80647NSDrd``i5yU4{cJdD$$C`{!Z#2Ff^zofx7K*#Q z$fFZz8!;C99dH!(JK!h`8$K4y0h>0i+hswZsksd^W*>zkPkc8{KJ(K!@UYjTZTNT; zJ?luNp(^7cRxC)lD6^S;MxXrUj{aCt`7td2gzZZvzDBjtA*AsW-f6wUWKp zdh^%R5Vo%P?S`ixyQQguWq1vM%XWHDy^JS$JAmI*vI*{bw1c^-F1Z>*aflZxju>AR_uxP;pSh4getXi=M8#lZ-;Pw63iTh&Wl>ISv z-y<+#%KjKSbR>qfjLg$!P8Y6Ttnqtc+h81V?Inkeq(T>^<}mCmdi2zE*@r*DtYWPq zeMw>tN3sOB21u1Bq%sEfElfiw3KrNyj6R$L0d6=gn9QFe(|b&+yaAVfEmeL|9=yqn zy~`|0k2x2w{U-PE_dY+h(lNz%0Jv^vzfk)!p5)H}?f`H?xv&1jqjz=9IN+3_s#cP< zB}W7(WPK%NreicxU*JW|FAHdC9fg+GQ5ZjYHfGH^3hURcLTATnEPwtyEG%jOPj-O`C|TQ~3gbRW`+Aw!3uxn%@e+D4(ZZ7fEPor(!l_D4(GSPUCE0c|5D zm^5GbyM=tQ2M3<9QHo7A2eF$GXPbtq#VSv)BY^}FDovz9d(i0o<5xj+&F7 zxi=%Z5~x!=2F_`Ffem0ty8EF{Yz5wFoIo)p!5WK_(`RH4AhG9yPZ27a2h3s{6YDR3eahN3wU(-wXf%z5w9=mHQ5c3~AnU^WCdjx_W9UYXQl~ z&)SsI*Ye3}VCDlrWa?e<`wm3pc#A49)~;EO)hicc&8p|I_QhrBSo;DxJ62;;=UQ}a z*^mK=08m?3kH)4J3~3&QmbOu78!;ZkM@_=WF;g*S{5}{xeinw0oZv=SAxIu^wU-$8 zfql9iVY;!vMPRJixkQW2wHU<$4Ju313tgS~j5w1sWeqx#S43SnBgn|M9yyLalJ7gX z$wN)K4Q7_XfrcRgl356G1gVy6W+l>f#+IZL%R=>$A3L;iW47cy2cuPBaSkTTngss& zSN7YyZCh6*1o~Z3l=cfQU zW{C2BbG&d$$^@TcYVwhBC?>+_F;g*W%vA8)lSCRO!8b0kNjbU*tW8>4^97?!W7A;G zR*~F4pE}EQ7#2`cuk?N4Kx-Wv6*1V%MNT`WR5<6hixna?cC8+)* za`3cg!xP;VZvN%To_)#da z&8ervHa~fzOJx&9A{cSJj#M}Xc`Ixa*n(VXtkL>ZEF+uDlYeLC?;#B?At&5OP5Vi4 zkJL|&EuWub%E1DxGpBekj6knbPr9y_H9dsLC^RWZ{~fv61kN68TK{57kqy-@NO04( z>e%~L!e(NEw*sZ49Ko(s+HZo2sl_x`f^@b*zC}7?BJmBEer$7vwf~I}(%%CS0MaKd z8$y5Kg=J%wKKEFU1bPC;T1}+B#GqVj?Sf;i<<1-te?Xpk3f+2plCh~rt&f`qd03_3 zLFm#4Ha6+WxGba?B>U3Do}Ma=7n?Q6)1Ng&9qVO#OKCDH%=uysqFf1C3QKBK)k}=U z)PSTFxR3zj+=w&J;&eB|XIsf8CF%Res(jF%f7<9I%jS$%0C~cK@q0V2sx zWkUH7T2mF4vP_YLmy##$+w@e=n$^q4RIvHCmvdN`698@o@cT-_(HB4a{!K#~1FM;A zsoNHEagZQZW)P7ZM!w2w-}#CJxe&lbv&~I9b`A zFs!A%q<_6>qe*2TYj$bp-~(70hGf(GLCSg;ZN|W<5|a?kK#YPcPB-}(nN6K8@tORd z1RxH8sSH7j$LQ411VKYconH5ltmlsZw`uo(U(@?S(*Keeg0FY|^F} z6afR3SC}5MLG*iwApX!IB+68jS&NH84A7`7%9zCpCVl{!AmgdQs?!mW`%V&zLxS8! zwIC?NSe6G3Bw6-i<}4)fD=B}Lv%!oL6FJ`oHAR_ZMLioH-B#i0U-lj?x4+l~;I{zY zQ0}{GX>IGg{`RG9Tej7a=YHGMST4ATeNsf2A;%BMobC}ID0{q-CFj`8Jv5))D&@Ma z1z@%6ShSfuyD_h8Ls}08Q=W*E$qIC;{@jkxq*QK(j?p5gT!zkZ zo1YDG&c>`lE8Y+@V4pk94ubKOi@v^|PRvUa7RtMMrjlbCqN@R+NXz;JRwKXAuMwmM zo~XgW`si0CArgd=tyLi^;srlh{TpO$9ozhf>i|GuJ&|cZNqQ2k-h7tE>Ijk&E@k6F z1%m;|b{@IRg@sXw1%TOU0f4oQ8YF;hv$9x;s*d3Ft`au2-`!Q==0~zOw+&_n001Kr zis31hyu(}XUBg{FhLG}@ho$~fyoYb*wf*!PnGs@S{Z`E+R9x0S*fHJuK@C-wa{f_1Bt9wLd0x!~cS8PFY#GDuxLVhol zI36Y3=E!GYM_rE20*LmSHXMlzQrWRx`FP8L619~(eTK0eeGk2guYA^uY_QzjsXs9)t!>Q4hFoQ5^xG>uIMes^*tUyqT zw$`CY*48081w+t6lKJ8fN)0C$+LTh>~ zIT*I5EqDoXmV*-=aha7!Mw{*wn1Bm5-!*%zA^5Hg!bAgL^J}x)c{Vd z3!`hiFr?%Im`!U=Wk`*6!6u7m2ilgZl&-y6a6z9ce&${<@?yjwIoT$N zFr}=va+)aXe!Rg1qBdRDT8$(4fuzrhV=Y+0N-Ge8oUp^0TBqMI8vTYS$4HZPBuH9H z>rZ@7ey~U~N+nT@)b~M%sQq$mJX(Ku6lM8o4Tha!4nzin;Ea!94+i<)vnO=+{osoS zR%(QK8-RB)a|cm*Te^}F!!!%Hs?tz(@%O&8X6TS4r6n`SqFiN+{(WX|C0Kia89cGl z)M69IREgk?Bb4NpIkocE4wp=!bypy*WjU^is5%X-+JOM&zW341uMM!Q4Yjt$58#=8p`_L9P#xb+NfQsyt`OaWL5! zliu(Fnz5&Xnf^>NEn`HovsBPi`ed^2xJ({f!2N&x>Y9F>{#R9U`d1tP(ia7ALnRNq z>G~_juUz^>ckUxk9)v^0FOCupHM3(-1X~LNX44yGnUI@YF!{Oh?4%PdInLTlnlTqc z!2NI%dE4$%+;x*8s-WhGIHUzY40}-e31;`eIRCJ#^Etv(r|5U1dgK9q79wiVmHR&i zHl2ys{ec!f%v*e{IwS#pI**yb#0WuCaW%NA;}8p$Pi7&WX#lc~S*3JDiU2b!d{6+F zoZaWz?giZs-g(XV3isg+{W**)4gk#D1>j1>!zknW^he&NTmQjZ?2Yb>{5 zSfl(9i{27)SgN-&WsQDjZIvxg1F&#xu_hG3ocvL3JzJ2Y6rK~#xXWKFUZN(X=0bahZd#KUHXM4lW3JHZG& zUMD5xVw(L9FCa5mPY(R+@1E6N;Wi8au1xkKc69~-X1)r* z6_vIH|9bPUH#F2sOD8hXTT^i5q+C$Ik7o+zTz__7HfIAmDN~LRm~t-z_G6{2P98E` z02l%il{o34@qiTgV&l#m3255=R|`k#Aprw|!T0Iev;zVE?}+F*%6_~9+?XS$H)jJ# zvZMgKPJld#$ymvG9lyxEF=|GzGXW6aT};#@iCrX4o*buOa155VfyYRq5yYBGA3%9I zHlmfVa>2D5`qB2gBH4o#UloCX>IsNm2jFr571{S*eba(oZkSYyhzFczqmkR-O!4+1 zz-|MQMa?DP2*kbUW2behd=nADw1TCM|6gJ>INHu*J#MQ8ZlVGzu{NrJxpwlpiZ3Av zI8GMKbK#jI>b4MF87D!m{qRyv2#<`D(~z_s4;Pq-6&~Q_x2*aud`nQaGP8-q;%6b! zn*V8wXHs9|UhMthmk+P4aPO`La4s|7YWCx<%K(xu^wuN*RCN8v1@B$k z+SJP|3_>Mf0{G3(cJn7Eb81NzVl&!iLNEwAZuT5O(}-F0`8lH8tA1Dc8nOc;^ON7; z0!DSmar-T$mLsGj=o2p(w_Ocj#vGXhb(T!)ENi_9#vQZK0bnoKB1e8ngP;=33z0UQ z9H0si*4@n76vZH_+RHHJeL&i?Qn4F3qS26dFmmoiUV4$@|FiSD)CZB)3D|cs@gFZc zZ*4!e-sN`l@A48rz8UO9d30yjf+rsxf8XDJyRo6(gJ5YY9kRidNXo5{V~-2Cp&8E2 z79B5~Op7N8DtVq%MCC(?)0z<<4VHipBwJ7niv$a(35`I@mv?PW$r_B*tqKGbDQ%8w zh{-~Zv=~$TLK}Ijl)NM`C>)^GfDcL-z_6y|0vsjounh*L%nMEzkh1!MjpI;i>LK3~ z$u^~w>vAPwnq87@qU1&{GNWOjt)&KQpSxk>l0}bI3j96PpF?**O8}92{5^mlRQg7) zyz!~tP(Qg=^XXaL=q?e^?GtCm9suaFxeu7<3~ zTFGow(UN42ZZ=t8%EcO!;wH|Oh4pX>$7d!i(^3tslrkb^*O7>&zuKd~>qV;0iTr#d zHa=N8E|dbYV+Llg9iZKKyx~Xw7><~pTJaNO2pUoOlmTbxwsG{pjpE+w?Yts(S(liS`N!o_my#8hf**{ipLVnZgx=)VK!Y$aq&^Ff& zMK>)tImaLjBa~y0N}u!1pR)B-O0F1?Y+i?=Vk%ZSm?IQO&mn+vs`n^4yU98>0HG8@ ziH*Lh9)AkzI&lupG9VbnC1*5Ga*v_F5ma7hVTiC3QlBc$Rl4e= zVD_XwzWyiYtn0@Y=^X&re{xsf4=$Kp(~rIS2LK;s=2b7T|8`#nkbD8FP_!d%uk<;- z`(Gb@aaeO7YjqyY;9@h$71X@CO)IUMjXoU%jE=m}W`}CWvD?T2u{m#6V35`41KU;+ z8|_1HIhE0uW8HuVkR|JMSeY>-pm#u|gW$ErME>z^jvb?X%yS{j9js4uNPOwVRF%nPuZ%OdY zbOjL`-PR(e05E=JEmkkQX2bl4Zl2JOE%oDMPYw7r;3a@aMaBTQ2t{kLimvbf{Pt}v zV-IWE(Hm!Waq#V-Al+f@ppHoY*nn-=Nv*2u@%V^vYUmJb?OD>CgS=TJd$l1g2_`-8 z;$zB6YEAUSft}fid(hJXc4-Dc){4y%YP=GWLI;@4XGY$+0Ab=3M*#n>hJVkkr)_)eqX_04cUey_9?lX zI3(HflM?9A7z3;fI7@YH7=;oyCLTbFXe2GU;RsQ&1Ho_=k|0DNhqWM?7M(s~O>aLp z|3Uy4z1+>e$CLmf2;ANuau5J~{-dXKwl!^K`6UDvVv>exiHN2f8~G?L109(}-s znW750s$FKKuh`51NF`h~$Rd<)gKi%xAx+seU^T5QI1{<{fNgW=As=LYa$;S-26!Z0 z8M9b>Z40%Vx?N{X0zxn4VVH3ce0pl7;PuRfZms59IzlW;*GYt2rQa7vl4Wwqvvm29 zP7Mc4+0IvAct&SGx6lugJ%qh703<=+hXB4`>EmBqy>isW|MRK#;Y0hFA((6>bOI3_ zCL$#$k@x+f=HMmRM{3f|Ao*+H-`2pWqC?%%`1ElInJt{HT8SBwYaTMVxNFq91Mqak z42U28$LPoJ`|ZY-Aq5@LMNJ;Wf(j|=MlCc?^k8=sk!m?AscI)$!NS|nl9yOZm5Xd8 z*z{V6nFjUy`E;WtqXdDLNjqz1X)$HUGGy?L?BHZ)lmRPnf>N7OWHZPo?()+(qGkkt z0H^nijMX@o!Z2*B(%~8~l4#JL3gkijERC@G{$?T*X09WBt#Ko2u;qn6Y`po}{~Xcbb>+xm97Q{Ij_LsfBRz&v8i~dr!v?{8 zkSIo0vKC^5n4xC0%peAroY9Z8=bT`u1mY54m~`YY6n|G5kqv6BCnaN512HhXwFX1C z-`927|D4s_kNwyM;B(CUlYZ>6J+cHyH|0-~08sID!6(mX-m><|?%JAy>Q_5=V5X=> zovfGPeBjvie)Cops}6xWDdlMr#C*5`%k(f!K60D}tY9`KVEqGS7s03zTM05)$@9E6 zC({9eDRr{VPnJLL%M3sesT3WUTvp*tLUQjZZ+S zw!Vx!Eax=L?=&?Kh8Ldh?&szQfbaBY^Y8H)KoX&b0r)n65BKMJe)Ow{wo}v0`kr26 zFU3Z6Ha16YO&{fmX}a*O6t^>((1H=3UL5fu07{(dq6HP?n5)GYtlJ=yP3 zyhp<(05dS8kua%c+4hV7{n+|`?!`+0e4d#*`?Ur7Gc==U<7948X~F6|)yRf4~M$kXBrlk(Xouq;U-E10@kwu z4h+oIdfC+e1h`gWc32R*_T`Ay0wy#)(>(y2|3(1c?(gQ`le+*m2rLBfEdclS=Xw6& zL&r6)TXt7hTXQ7UceDB;ofD2Xrp@lvW`f_WYQz_0Ty6}($MXLTawSPa?)L-`9~2NN z)*|J>KsyS<`7GEnN&hMQ77YGD7C1F^GfO}g*53in!PpH}iHMStjqJFl6iz{^TPS%D zSs6!>426tlsvQj%_kv^=L#kHL6yF*Q-SI%zPrrUjV?VdUy#T(I>ux&7NA@>0f-KjX!P2u=&*VnO(T}0yT-Vkdb#)HeSwrCljJDMW(cI6I^e<7e2|Eu8;3cLoa-XotNq5T z;&QD97J)R+>PY#9!D%AI#c#=6+LU^C;8&z^>$~RX-NHUlqpKO#- zKynYDEY~<{rR||cuik7q4=hh=Bjx7cds8N4`3ULE2dsPj`%VI{dg6y`uf6!AZT(#S zs{ni>*#o=n+T|c%3E<+B0R9s|Yk!{SwXZvC)dxQLz47a|3?YvB_?bZ-&Ez6S9WLp6 zZ^lkZEO<8z10!ATSaOK?6MDVFm}y8bdVso3C~ALVFQ_ULa3%$YNzFc1?;8=m07tE_ zV+ueZMBJDW_3@Knt!vGx0jh{xI7BNyI?zMv*`WLj$xUdc|F-{>?R@X`|JdG7k`DlE z0`Mhf{=p#ZrM)izByaqm0DK)lzW|jnV<)cr>V>xs+sfl>cl3tL@fW0Jt|Y1)C3hh1 z#RtRd2fR$*qnq}jrQx-B+IgmM8i@8#JQw-@r4`e3)pAm zn%=7~JfpLp^j-ki4&cko{H;OSM|)=gNZ$OH0eo#Bp6eSI{bk#*@$;HCYz`$(La8b zC&fjIG{Zrh{ONLM7y!)b+i8&uMbcrN!h8BG`?Q}*l?g`Vgye$fsE7tDtv?u`vcxnd zptSv@X$o0>zASAF09cgw&V^pIo01miP+%qbvQArc=`M~%_|t3uNnL$^yY3%e?5C2C zyuJqDKbX01koV8t9RNfS__yR|K(258=x^Q4qYiHD*c?=iDO2B_y6KqIJ2;U_tt1S= zFtmdsTBnY@QVx;~wwAjA<=9@>Q$aZoj; z-lKx8nV*mW$ErZ-z(NKe$XR@Wb2s7y=Fht~$$yU@S%V>c3%Y;ypQkns;FA7oa{Bk} zg1xi%mH=Y0_Azss1#BOP=e*$KCpJEI$4}Oe8@7Yx$ZFR9vy$O#04PBo3K23*kisFx zI*OUy>_19*31pgv5R-oF(o;s9bQ2$gwOtNG?X8`!VWcyGlBcQP#M0D5O$OVbk+Yy9 z%tVUHc{8zX`KxR|Dg3C`sIw2w9y5D#;7yA!T|a=Ee|u8%e`Qx}{#Qf^P@+5V<^Hw^ z(`(v3`>p=$SFRnky=GGFmhPaKWThp;5w+y~LQeQ6vJeA0w?V6Br@AVUywl%7|05Vt< z-{r8O1&nWQ@4fz~=dA08X-BNp_w~U-`(M!|K;%Px62KP$3{*XaPk-?zopTO*Yg>Cq zf!L&snWufyIt%h-i6QJe@x}AKcQG|c-c>hNR-~sRStp@Lpz(u4K1fM>?6{AC6}^o2 z^wZB#r109;BQvQ7KXDh}XYUDag9ExvY5f{YDGTXtMy@6#4Nmr*2wwmEjT?XS(@zW= zz$Lp1!2cVJKL4vS03;vm0|34NVD>;g=e~31wtxJB%SUgoomjiMD`?I8h`Oz>_anXj zsA6!$YRUNoXLS#KK+{wzyHNQju_x2dM}FH{_A(+9(m;kfaC)n58$5wym=s>cW6s% z=NJC##>VDR2Q;qfL=?4;s@asN;aPPUY@5*&PWi(5wYFZ&{#@f3DAmm%)6$D|7N7$eBz0LCyRx_SPTuR3u?5t2FX+DV!n3-& zwrm=pa=h075k=XUx)85tomiK*i%$B}UHCwg@KTiPb zF-Xz&UZ%K9(ou+&VyzS2$Wm_2a0?dPE75wh?KXcRvogC>{)EKfke3UVpKqCmC1 zpa1GLTPDstp?T%{0_A#wni8A21j_}lhG$@yb>_4;#u`x>F10~f`{5yP5h6A>AX9fD zHT`G<2qKbYP~fIy^uYsr(t-_w9SQA%oWGP87qy4IZHOxEEf10U-I{vjBW5`5BaJ+=MA> zKJxiXTU$pT)Ua}WaYf5?*thG*4fABRzjEK@Xicq{avagkW8suU?94R1bBzorh#T#BOML^ANt{l)~ ztxaG!0f=Q3FtxNe!R4v0r~XpTzUUs5NZT16Sy%J_k^J1YNJ(T5&Mg-t@DjroRGo~S zSarkOkjUP6qG^^uwC`A`*iIeNAE2!K%9sH(X`y9^{@gKWK1!&$tSr9#t51(0)Ue-L!`|Z zlkiq}0y$w0SO0U#@dB^v!@28jT@7KzgkIj%et*|*e*AY~+qSOOL0(eVq3F_k`(Cj2 zs{tUn5n}*+EcqEf*su4&Pkpyz_PjHPZR&0*bZ!Z%mX0oXW?@;aIRSZZUYyoM&dJA8 zjTKVwxb+b_FKk~v=9$Mkr}c8G-;qz+Ic@+X6*qoARF7XVF)6z*BijlX+p;ArfBMGG zK_KzOu66)F2Jqv-wCJt|fWf^XZw7EafH&=m*E{jFbJ|aO^XEp@4xLi_!dfPGf-B+* z{HC%JWk!OFmF~VDg=IF1J5eGJj6Jpn=`5nIh(^$gNg!{XZU=gtOqZEcP;&)jf)W$< znNZ-`9m{(kzWu^=_y6_E@w;g0`~kpEnEA%NY`s?lK;))O0B~ONGkI6M=Fpbb&i8-f z`-RE-oiKFc)}e(Bn?oi=6`L0TP=Z}Z(FsFuU_#D6P<1G%l(wK}%z2@bNNo-)7|Kp6 zJp=6&rI^%wfprZ^71u_#6)>))E38>|*OnVD`-d=yh`zm60QebzpE2{Qy>P8p1Hevh z&S?NX1mIn}@^xQx?3>z8I`gx`TSm`rSkqZcTe}VVZerF2a}(}clGO^`lj<%A92zLM>MtVQ}<$L4Q=gV ztyyPla&gqN0p^NXGnvuixc)w3+WV?|VFr6jh>7~goAse(#_dcZ1uU~^*u6GrxN z-`3}MJbBOM9e3Sw$++FHEFJ>z3jn`h=B~YbeOCj(%e+ws05~`K*&T}xC%o>Q_Sc;J zq2Vo~_G{?e+CUpN1xF*6b$zhXT~wmo==2LThCqmskc9kKWE?uj9RwLjs_TmPN|YOs z5T%dFH~q+A1&nUl&f7Yl?RosJOE>Joy53%^0bCB?a%O(&6|%0Y0ietq_BsIXOMZ5n zMB20&2ezO3*3UJMpMGRB*N!Z_xB=9?Jw}{ikJbxkTjq$_1@tJd9!)kv9vZFF;=6(! z2!=8r5!9dLJ>_*lLp@>QNN^o@gf+|W@4EX>-|bqyUKSvz<=2eHE_`cRr6Ao_bs~J{Uzp+4@w*}E1h%@|@gKo5J&@&1d zbC3}wbwTONQT6cqzO%a8)b4g=TnhS0Hk{e#~Q+8W$cU;I>;u0YyM zM4#p`<%G;YG$JUqbWU6?%csOHv@(;I5)hu8Gb^xI#^!98D-CNi9Zd$)=`|1@>bT3_aci;1i9-FY2eSLpM zk;41iSHs4yGyqhumv=P*I0wZ(aSyb>Z}n%-`RPf%qjQq)ta=S}22j25dKC2t-wa?% z^>*wL*K!m!`ECSobMR0F{7xSA7u z;It$=m|DFhgL*AXPWfAsI=`!WOR522Pr3F*v1@QDfRh0XtKO0UxjF&dj$$kCF94pc z-jZqn*we2=0lXH#iOEkj7?i*1|Capx6~Lp_TT%@Gdox~e9Drj190Oo_^_E1hB>?UL za5sRvs&#!e0K5{f@c@oYeqICM2mmdw(tEKPz=HrD0C0cu(_UR7)d28ny7mJwFZr39 z{ET{qe%5sW9!q{6Nq(NGE`e$Qs9rilI0(Rj0QN`G@MJcC5qsI^=s;0P_h|qN06dwb z^wkr-8UU(Snb&9lvjEHlFeAYbrlHt!+}&iPlx}K`1YNFIt6|m6B(E$L!Qc{%F007X-EeJqGei;m0N-SRnG$%z}R{+2u z`0oM%-?B*o0R6qSjEuVa7e_Zo*DsDvv`R8Ev`#LLmezI_0N}Ndqv@%WaziY>dSij3 zEj@QylWrFT&@+^y4&ds3$4v%ILvisXd&45pwF!yvvK6&@f~V0Hb0RnLUo}}tMMvtz zXc-8e&@2_#`}@F-j~`|q+IF*d;UnIoI1oI1=A@nPHh_>un5gg^O@f+Y&tN+QOr*Gm zNQ=8O^v4RR7XVHXyuAY4swLo{Dn|eeI8Adh;`gsVhqS0Oe*$QefHivjT?|m71~9<+ zaexpQAO)&5>pr6cUje|*+fSMvD8mAdE|tWQfVt9?B@$rnJ7p;<5C;M>UnwwxC0hX# ztso6{F!T?QUoJ_{i3qI(L3A5<6~K^oB)}tHClN=|1b}2pvkwEbf?z;~n&2M-tqMXu z_eAGfsj*X7lOhO!4yFD}SDxS_Y)Ty?_dGvc+o0R{V^O2Ue3iMBPqwFy^x|}9t50pQU_<~{briN>yuCex;M5PQ zcJH(;)dv=|fiJ6fhJ1@?`FiMMK6f$Rf^bRd+yeChQ7TGw42)wYvx0W+%^2}#zIDg7 zn1Jh-w@-^cr-1V}$;=99VaTJise?zQM*Qv&qBM`g%`U@Je^}sSJnQ(zn;HXlqUbZ7 zs3vv#_x;|@8cDKrgQ*+%`+>Y?G-;1$DV|tBdAJ%>wE?Am$POBC0s_Zi>r8k6k^vVS zvE&#@0It;=Uhf+KNa?&wkYob^|I&*#0ibP<)S%=miAoL;|2P@X?5^eH83znOgS?|QtgP1aILddm=6=}2UoUG zYa!*d=}C==IEiY>4};xXjfBFzksB&#-x)QEzT&^*w~*LI{E^2iota=~py+MP^IpOIA$UNXC_^@)Kz?J#*kA_be|(rd0+`hNG6w>+9EkL`i?~ zQ-xEtQv*_W%RXwkYDr9cmtlPTrG@j$NZbFXyjGq1W+~bf@vrGpDy`Pix0NFro*D`2 zqaTb5JB%NL@6EAl!^7nB!xalZnm6{5#nBP>@mieeNYA)vBOJ2ZX1q7kuf01`@j!Z@ z@Zj=Q(Ufs5vn;nvvdr0W{s+SDt64i0n$LbWLN|gn;>&@+A;D2IV^d*S5l|tp;Iq)N zV0P?sOniK}0CRWBk<4Mwxe~S)zHvuudE4@#C9Gx9ee^(l()`eSAMNVz754t}xWbkF zW#JXc0c-{~P9wnm2K8+snH`Uy`RQ(3h5^o-c*tN`)*<%qJ06 zoBUoR;+Ex(lxF2`RxFlmMNQ4Dc^8X%ih8#?SpR*s{bt!R{(I7GczA$)seG<{@F-qr zI@>nav}3+)5gr%zLoU1bUCi5<{|7z8xVS3tgLDGhN$Xk5Ua& z;#19txQY0=xVaB|*g3Tw7OlVOF6}Ap-v4ApVO8LobHPvYQ#o-6KiwmpMAN=Fy4WGl zXDD@>{G?@~e)6g?t2Jw>V%~mgd04F1|JTEN&Mb;S!)`H{)aB`o&W7{wW=?Td@t=#t zT`nUJBVD71c51b{Z06hPV^Twhe(g&o_m;Cg?a`rK715)6*s`~=bg&_a06=O znu1+q6OA=lCdr*YA?s`2GR}h!zct;Q-EP=t%C~eMtlHzx5=vv6MHX!uTs*AGZR|Ac z%#X5~AWdaWL0%EJa%buIZUl^I$5C57b3I~Fo37wpyKj8iTi-sWxtUjPFMV$&+1Vc% z%Jmf0<=0L06Aa71Pp_5O4xyD+=OR_xE_QfNMQ|RP6{aTF@jdSQhnmKwccRHVIohe$ zg3BWQGWTD?)#Tm#_|Vie*u0a-lA9SW-fPRwtdx(=JI`|nea-%wU8sR&o%Wk;mb>v) zqnaffTME{e_m2Hvij;`IH(LyMt{00$c3~>xg}*f_)v<|HxJuZ(^hx!-niSg=^``h% zEuRkV7%+l~{n`_&)tjp8=9;{8&(`QWeHp4vdsN@h z(a<`#@m@NQ*9e*T@k53!_|u!z(yxO<4waXB&E`a=sh_oAHtEy)+JUc0QjN=<%1bJ5 ztL2+^Ha@8uPy1bY+b=Avyleb>e5iO>bm&liquW{auH8mzdMx}DtAgSzZkxi`{@sdO zfsf5q{J-D-{{BPYH|0OpA8sgLJTG`#cu$S5<9!w3QpN9{#=}!qbeab zmAT}7qXN&gHT+=MZY49CD?#FRqS9!5GkCGGn_zg_=5$GaW46fDs9YgdDW(wM^ti5A zrSEuXaWi!MNwm`K^8KO6IBYWT-Ud4DI(s|IX_)8T4(mIjXmns+rfgzrxw`eZJ|^)* zKT%mS^hxllf_E%D9-!Rg90dM;sMClrPirWxcJ z;u3ObXehAA+s{9bq^uX$788vA4bXn}K6L%HyZX5CpggJrpF734iy7^#^e(+{f&D72 z67FZ{r)eAU7CZY1uNYbMhc&@kR{Ps&GGD~JU~)>fYY&Kp8yRybc`{fcn1pyn zS!V(~^kky6+Rr)Y1tMrSG0%>3{py-*H~5!)JKOT-!xSu`qo8c0dHH7LB#9~GLG(f= zci*YIR9MTg{VJ^s>YPtQ08#h{F0SG^!jUyV2aKnwzxCRlFN5}xJ;R2H&N<(bM2u`mcLVzVo>s^qW9db1;GzKsN zPAMT)Ap@rW|Dn?`m|Nmji1(K4>XT0e1xS<#E{X?dC)WWZV6QpaM@Wd@3SmQQfN*%+ zN(>c1jd1!3q7a-HglY-}!KbMrK!QlnK|mGVGQ4u*Ei;G zUX}<7bqoOg{bI9FUo7B61`$B?ege5>2RVX0S#cTqXO2_d?}-6f zMQF;6eEW=5F%Lo+W9$wjfDC<*ySf?LEGgWnde~xlF7IEK5A zcAw|N#`BbyA^h}1<;QBPQKQy?<(6{-HPMdU=ZAzUnEyd3%Z=5p6ANS&bo*~LnBhhH zam#J0z$ZkB-6OSKkDW}biih-3KabNkZ`Z{LY$|O#*7|{B1^#1Q^0!E8xd)_T)1H{q z33QiNsWtYC4Sz32B^qyjJzxLGxmkKlfBeU~1X}w91jxy@B2z*k2x9^#=zt^0Y4FKO z{P{LY&CYAKbw$kW?^J2UvHkH+lh|1(8brwyUXR&%U75GR{})6iQ=K+e*BFsjp|j$9 z%r7zjl(%}HF#a%D*a3pN%U=Ehp>VGOCb8aFkVYhluurZL&wT15hI!@wWW!`1! z^tM?j8!z&!bT*w<2gAD-WB6#pXyC~~Qq=^n4#t`uFpEEa@!zq4f?g~{BqY!L`sya| zVR3aHz9V4FW7ji)*DGC+*p**P7Wi!s>Wt6a?LEaGpc!X!Ad8PI*{f%_(o}lBxccO? z$Rcqz{z>M>1O%}K3|#X!5fHHRum1^=KwCj=-o^p2{;C$6O)Z+vGTWm$=O5BFC1$&V zl4?jBKiVGS!r@r4hP}*nRv}sSAt`m)A^H7>+81QQ;_vpxTZ`Wmn+Jx&gFfPy4_QTLkHPWet1sg?((O;kM zhMi~2Z3WevvWjCm|M7SZgRifTZjp z%8RrcFVb3pZgI;9R{})BacDXo3nHi;ByQLCD|%lwvLw3dv+4`x3U65k!nlf7V?=ri z#DrLq5-+Swn1AY;roKZ`PGjE}+Z|51c35t)_#(kox{7eyDeE>1L6{q*g7EBg1C_E` zN{zDD!L5dp@9#Jg^vASD`y;*m2~(>$q>FaB2vwGJQ{f*|I0s@mZ`Q&+?EVL3}~Tdt!^&99@L=!}Y?AZI+_#BABq#9c zQ6}|Uq%K=_X<=u~4LqeyUZfC>F2p48*n)N^v-MR44o&@qU4gbX3Y7rWDs%j?~5*P&xkWjhXC z-;t<68Modkk<2PbvQyrTX_$I?kcKp{u!xF=!BnF2Y&7p1^befr&d>fgCq9o%yVnZS zCL|C?@GUc*J=F^ap3qw%+#*75-aOQGo`!Kb!21K?{Yg|*Au1CS47)QmgpittSMA3! zskR(rpU_-xf$A7fvnVLR;!M;J9G_VQ!Y2md=K)>WaRht@6m$kMUV8Mkapi33j|_Qc zHINzN{EA)^^$023!J?H%%`-HcpQJS@Z;jNKVpG-)eNTGqa<9}XY z>zTysHAL-u+2HJy=<{H4F14t`(VPaq+fCR#wOK;lw@He?0W^Bx?Z7shMLs3@>r!9p zqc-}`U1S-aLhgnAOhMEn4EbcAgptP|b=-LIP%y9q0XvOzM-VRInL`@1L#}CgOM;{4 zyPw=dIxov8(~gZ=8~pAEFFdai#GM!*j=1CgFP`$5^F#y413Q`VN!(PnKGhyhX{sHU zpI-{0TjAdXqHK?Xu64^!E>m5IpbV=cSZN`Ag~h<20D2Pxfp6%Se&$TdOa_!jVBL)PgrH}PTd9ny`2({tsl zp_@nDWN-xFmlOFUxCVR+G=%}D)^BP$0$03uD;}<@0{MIf#tM+8=vsRoT8gLAd3IqO zDD}7KU3v%^3U!kOuLp>RaGD3 zj7fiC`zyh!*)exp1=z0ejL)S6vAdN6m;3dK3*7VjxiHlC9Zp%O*?iYguPJ}BuV6+xNzqEsW3~UL=ix)X3SRd(&$Z=vTE&0ltRKJ z`&i-#=gzHO?YwxHC9Sq!^zgkqeFbKKe^#tbU>cjWC_SbC=&-5=>*w4}xJsWEkR(y$L*;q9Uz_GEq>uBunXnTdK%cXJ2Und3Rpc#FNlMZ(y9G^GkcKI^? zJWzrx&fqWep1Xnkhc0}(QpBU6D57{v3iZ;DILxeUle<`fC4kHdU<5tB% z^VV0RG)nnC2Ix?fO?~_aYO|rwaF2by_{aOiR@LV6m@DS{WvR*8JcP>; zm~3uQW^Z3ky^+OI#c#Lh3n*oz_kHY12w9{1n0skG$+NzGZWK3W&}CgocP(KEY-4fIy-FiANea#(;-OzYuim$zWl_GWp{iveCBKOSyJ~XY zeD`bS_`7E(toxr0=!p_Ciel^gT-*4_0p{-WE70u=yjk{y32%SZ6nS6L&f?)@ylaF7 z9VJlKAU)8RZvNw8az;${cXlbR%VVH=p4n7@Sq)WnxGQOfk~aKQ0b+b4+U5`BUNWkZ zeB7c-d=h+26ho~{DaeQ(n7}3QE}!#OsxKJ94k^e%iX}4|{=BA?|GkrAek14swt96R zGisyVd>SKrc^5>O?=kZH!_sdinuu+PfTf0eq{jNkXU$)k{RG$P46?>#g)Iu>!HuH) z+aHb4vqSK_-AUmoOj@41*fRKzZe$WXL{&ZzSIGX*X2*r9Z`s*tEB zWm+67=oBJd_hqElH)0?`Mi^s{+yGM}#LqOaqQOEF(5^Jl61Q3TZTSN+?^sP`4dM=f z7M{1|L7lpFmi9hJHAvkeC^(!`*l7MDoui-u^1yns;sd~q3?qn#BJJ>g>_Tuf!PUt@ zhzG)4h)wo1M3od-eVN*;^ZQh&t=0?gW&ZFJ{$Di~7xG6-&0?u1fnG0JQS>^4yxCEc zQih=Q>z`Dj1bmjmy<}o~>eKp!4xCfUxgcX=EMhZm};NGXF@Uh%zU^hO7LvU)oG)& zsw-P&*Owl|pn(!-t?ojsScjq%oV%1*@kgU6kMl=&T!=Y_5`u(x!k*pgcG3CtIXmS?emA^#-C=a z8wdTVqO6d?!wudyVKStQLmqq$4>1!tIHBfw4}X(;n~u{coE|s?OuEDC`8}H~kDrvd z$b@XzM+6_tvYkhmGDIzWvah|~g%;VuAwE=&0%`G#mQ2Y#g2_4&QhB|n1#+<`ugz`~ zrDa4qMQ~G3ZwV4$&1=~N!sKs)!T|B*;gukSJ`kdzzp+9{oLCGA*S^@^T8Lhba;egB zh2bI2_@hghsA5xP)sS!tb8qNKAO0jhZ7E|>>!s`^G#iTb{9p^;4_`H1j~U%sX{Ycu zo*2T(^d>cO?V@lxL2|s@I^aPiqi9)JCPJ97x(t?C=P0PPve^7mSpS*ZOb1W1FHN0$ z-t$TCsEbM2XkY9sBQq{}iW+=cYUz$gjf+jYxBKk*W^SVOXKU+AFw}%U?G8h()T_dN z`1Q=GpO3${FN9ie+KR7C=cc5(bDaH*UEof$4UZ<3A(SQS>gUjJL7aWQ-o5R<>MYNi zed{}`c2&EEv}^2!#M!h}k@3b`m_hOk*EkK)JC!aznD+A!{u#)KXPlAEK|UJZcML?ArGF?;YJzwg54S?dprmdhKczZ~t}c!W_u^@=^EIFN815%RI-W`$p@pFfmMMav0b zLi8Q(jo}*$G-h|_Ojt1Z)X~lDHvZ`)0gmZpxcgj-JI09M?u3rdFl}Y-7sfmhr5&tn zjr{&wi(*E!gBnE!)V&xGFFBsokPjZ5TErCC)~rqcWNLiu=h@hf=Qd6Fwd zG~x;Y5R$i;-q)nY0Fi`VWPOqBuKIRCv-HjKM~h9n13K=(u`UIIN;trl6HxE^zHJf} z@4d?bT==N?TaG)td;mY-X7RbJUg8nd;4nXRS_#9Y&1$=NFcK-ZMdb9oKym6~a#WsT zB}7+9b7k0=)g_9@Fo1&ayI%E}{7^)j!^cB*Cym{IZF)YJOj7;64?#4QvFreYUHAMQ zOsW5EDB2O&NsB?c@WGx-l6LvAMn3j=yq|he6A9i_kD6`B@vi-lz^m?^BTYf0O35qE zHVYAvptADjS6{!Ke~6`vIg9SJb&#|!-DvetuB*UWe%x)pN${FI1Ycp96zFukwmJ?`e=0O!lDTUPuv4O~CEsxDV zTB|yr?vE8lC0ZCx5I5uJa(Z`(A2)vHz6%>${G>I<-*Z=o+mm|g`}>~Dv5d#)`OkUa zp##G@FJtty+aEcPWv;+r+W@%X5gMx4*U8g%dF6+`+ir7MuHo%5S7(BR;q&Cc?dMq< zxf>Rb?5$TgVJ0O^y7p2!hR!W$x|4)3*HgHgu z#2nZ(i??QMB{HK6Yr6FHI7c(gd5)E_aqbPZnb_^{#ac_=GvO?JuXV1@%2U(9C$QjA zH$J!B_jK{FBY`3?FzyJ9sBrvVz4enB6R{0R)yYB4B;$`Xm2umO$hOa(3{l(W)!x2H zRplq$(e?gdTRQqtX=UnQ^5|A0ukl`)D)^p+1+T0VuBZn zPyyY?@w=Jh@o`xd=B2h*z}|-xx?VMu&Fe!^qkT_jT@IRwDpw`y4WpZwJZ;YaOZa;b zyyPxiO-Qw*q8-7}YbfGuVYagyYc|THl-x>pxu#YR~5 z6@{-2&X0I6I9`pyOiA-fZrx&CP7d3~J%!6{BKEYr?Xoz8d*XJQD*&HNf&|!i>{ff^ z{c8>XtG%!&;xw->9y@Dvk1YY|r=+jplpaErP1^GEQUl=>C`RWb6I@X1jj1#UE3-I(wD(g62CWM4`E%}?7;HwoG2!e1xpb=H{7WnlXEcVi_u*2qR+Ws{V+Qyx^S__J zV>Pcdp3NwA-kdG2^@LFy1TNn=UtrBLqedf|z9~D9UhnkIOkfDb)Pm4qHI+H#5jqiW zU=b%d$lP|+XR&!Xdvm>YY;^a0EP7A{!m-H=yeWU z8RA-B9{7aQ*@-Rju>Twvn@28tpY?Q~y#*@k`o7reiSu-t_53GC;934;MO!I22rcwf zit#%Q6m_0kY%Ub>)n~9uP$}()Sbk_Ct(*OlUe^%YL$#$j64+}bkzNj$;f;AUQ<=5p3kgDFfxFHzsV-sL8v(*eG8LvjPsJ>t@Aox zlf-v0U-Pla_6Jnyq*gWzep-Yj_lJMCz4gy=R3Z&Ruc43DaQ9UOcaIk4?9s}cMdwXe zU}yxaGm{k|$tgqjYyMX|%HH*ot$s+;K&Fm%Gg@wf2s;x%NvGVT@2OpFW=Qka@mCSD z&efGZSXF5I>xgGtE1h=@4)WXj=a3h@qXADCP&scko10v*shNcn>tnv$tfTmYvf2(* z3u1I(`ea192qZNci5lG8&e3zLUr1J^L<3cG}HkJX)MmsE}XZBJ{DgqW&Mdmyg_C2E)&-`sNt$;=LJPTz%;aLGS9| zl-wMj<=E`L+f-wY(!IEDF4`4?(Q=iB099jGT^Tl?s)VuPu|Av0l_>oU0=~Jg5g?#3 z6t6zs>n#O78)EgsbmIcgr}i@fhgk)WN(i`Nr!V}?3Yl>u|BEMO$qn3b7QLA2_HyZZ z)TuW^Lw)qcEu-B_Nq9sm>{sa_g26vJRcZOYQ8y7GPs@n_7@JH+AfYA2gN+s+WRshqV^gdIgz;g+`cc2U+##q zxWLc)t2$v%D1C$&a;q9>C#7dg+lrw${;6f0ot#5wGkVpA!hZtRc6Wx-j0(8{Lr-~j z&uzh!1Fk2h$Ewo`M?Wd{+9hn--iO`ctONozZ!A^OJIYup0UrEK+9q__bu;6}0Dfxk zHEdD8=VP7QKPiv37l&VmNkbajZ}5I|l=UHGyMz-}^68Oy|=#A{{e2aS) z74K(7sl4Q0D}~K-)6Z3N2PZV1*-9|32;0+TNxfg1xi0q)@5{eqJe#PVWlB-s4Nqd6 z{&VyLDW|thd083d;AHR~<7VG|Q+DdpB{APBsi8-_F2%fy{j%BT-UQVeTw$lEV^+-#YHWw`34WgOON*d5gR|dBKQt{1qOT*sRGHN!!r3?~^KvY17PWhGxHyM%2_!`1!^Pfm_+&v0r}>xci2YPDk2cfqMlJo;YN@ zzt`>=$Q(o-ztMd_oX%O*V>N%@^7+fgQ8FXTG*v7}8_bv!(=zGp{o0hY5gJ@wY$f1u zyXkoPuCOm}uDqjmnj_spF7`E9GYkJ z5uxX}_uK&v?tLK7PgQvK`L=Uof1Xz^B^mr+p2%-!Pshu7*A_vPDZ6pI zIi4#m=J8^dxNWx`EL%71K^+|juPSfpzRh_RvWnKEQX~*+ea|SSn~zhlQID9}_!J@t zTKg&Sgx$EDtakm6C*a-4#q&BtUT-SRGuUz@d-rX3DAos+gt2Dr=);o&*9>uU>J{JZ z-LsRxTg(^T|0SC59q%TOix59P$=OK(jlU?tg)SDv%Qg#Q7iE zW6Eo|Jkt`--mLzPxHRXfO_PHG9-5U)#kb+j%{)zfhB2y2yeI$hKP0DDRR(cPF(f;U znZm8lJpFm`%B!aylswNpf{izr1XuLy;8%P$C;5KId}?B$Stp=*XfA_^iR+Blox~5INIT#-^{rW zk|#Z;%J{bo3RIAy4ellDf%RS8@2{kFn>%9N^ zP%O`Ezy{<@87;++D?I1NVAFF8|T`|!qRHyoHXFLW9rh>$0u2EHs zCF@1r03Ef**uv@?2ZMJZ~>l>9cAGi_OpCLs?iAViDK z#;wO#mOMWnry3nd)vBJ&Z8L$t`Mkq?70tGN7mk2l;m?ge3i*-?HN3>n0}{5QRkM!Y zjld(wOLZ^Dyz{DWIK^iI9AMtB_UA`>C&Hu^^+D_bK9J_vA4>!F!{O&1Lk z7Nd8X^hYEHen_0&kBeIl)M45^kXV+0!M2A}Ups1xG3de=fom z9uyM`-Cp)Dzu?32Bgkv2N2a+Q>!-lOZl{)lOx1mQ0>G91p^A+FztXMYat5f#T zfWd{0NtfoW1FnDRpM!&U5#P=~W7D3#N#8Yu7Uz2C75jR|>Ze~YBB!FOb1r&G0Vi9E z929%wSX<3Jd6tJ+du;pPDVYS&8Ox~k8|?a)J>kv9f1Vnyv9klmv$!o5FryY?UZd0) z>YIY?u5uO{}!}Y=_;rv|eda>x!X~kTPzj9Igo*(K< zZ6L#-e&^OF7Et719AjOGpBApBt?yC{nwvfx(rK^Bru!a4l~x~`q9$HZ7u3FfF8V<- z7j=ynu-X;s-pvcFDgJ1qM0iyGNxHQ5aZB`0a7iE;zV0W=78CW8Hk^jk>&y2tLbAkn z>`QJC)FxQ&;@PEU0>9W13$SZ+ikuyAEyupJJ!?uCN<%%y2ClYiOPOD5Pm@#Cj(vDL z(jN841YpVbpi>n)y^_Cl8h0-uzg`JNeq!rK?OIGK; z^HS4xpxzSq-fT8)$2(BN`%A-w8@}a6EjX;I#56h<&Oc`5^WRJh)4b(lw3W~eVLhurUTwG+&zYypP*62uDpLO8l7Gl0Q;a)a-UD3h;lEQfB!b`$h)QciQe%l$;4CXQm2>&uGp)*_*3>CB)) zT6s&AgWli2Hv2CXJ-h6(!OGq(j3w6@EnfKK=%YnPxmJ)>-YrIqo{IX2IVI-G8p4Pp zH<&beImm{^iYiiRRF|T@p1lmU!*cQ(ow#Bzm89~7jEQy}(d6&eAP1in)i=*d=#R&3 zUJ5gS3>#AdOP_w>c_5W2r>5PN;CiZ|hctEtU~d6>K@RGFlMnnbSb zkby@gusYp_E+2(eINxxsN*VZ9?u-55m-|<>ySZ&BT41g~IT< zy>*5yB`Uhk1jVo9cdLH{%Jq!}|+9EXiSSby?c+7-kzv(-Kd7{vZV91W`8uAD`>D znAg@4&Ig%Qy-_Tk%q5)^KaK1}Q#=U6LEL4(50WuFZbDn%J;Hl*q2xUms?7v0ZjwTTleLiHWb0MdAC@|`?ksx1{7q2O@yqw>wdna+J67tgUjy$8^Q$U$Q7=8v zQ*a9&!6p>=*!<_4LF-ttk2wcI^PE@ttzIk?JkVm-YOdzP5spbUuRZ{~z~vHkrFmPS zPqcNuCE#MEQSJO4VMtL_dW(oT4YlzUC}YfulC_Xij>6L}=P*C}EAGL{S;x_AKDHJy zyE2!`hu$PuJ^xb(f&o$)^dat!z*!Y{-snkdqjPE=X6ct6jwFEKMuGxa zA$m`^K)#QtSPzKQy9hao`*|gZ`Os)rdi6TOu|of_tb0`a&|5Fn2cneP1d=GGRjFx z{yfKUBapn~yUO?9{tF%Z5uf|K8lXI#_$SFoMS^n3uBZiK+#HvF4U@MK`LI{#wmBhEaYiEkroK z>>-f0M`ZQ_1uj$C(1j@S>q-4Bix6SgJQe&rGA?+YQCBA-Uv`XQvG>Op%d&+=aSAm8Iz`;73KXTacr=qto?0D19Q%VTuKM)aUwA8_9=<=k5-AVPW*OKY?)+1fhwm5^67RZH8W0sDUbc6jPa}(P0Ugdm5PUuUhk~DZb zS)Q71>_xi$PIu5N6LFstUo-UbP)SfpLpZ8$lsGh7PLZC8A@v(9hD2>{8 z=`6%W7;*uo7&!(;kh%E}8w399VV#%P$}JmJ|i)-pQMHbLgqD_jDFBf|D+P4 z`SbTGbqZVk6|EL(;LQzeNEuU@r3yh19jdF_Y5!l>Y-_kX(K%_Lqmb;=%TJ6OB^}9k zGmx+9p;}OEKe}42idxea)8F{-m%s+4IxmD{A=d80eQ3P+iQDhr^}Vg=wmKX3W%qjZ zpPLI~5m<|l(Mt~AM1}m2M|b%`=AgJ^z+Y05YgJQ^<(eQm-ENe^xqDNv3shhJK&oz_ zC(0^!i%kRNDUBo#XyHd2Id)-+nfg&G4#uVIvDDZdyEz_p|JiQmcYP{y=QWf4L}!&U zrW?dzUY&ihS)q6RIeiE4WCMHw?!mLq!3}?%(BDa4i+S^QY9~qP zN5ZCr5i6mQ9~HnLS8NF)1_d=2;I9E05M~Y4)OkABjHi=ReD(Lx{{L-6X;9sN_g5G^?ny@_&@oJccTP$hI1#=`d{4| zNDPH6zxuYB^T|hpHq5&G*Igw@Y*{X2EU{=3S&E8zt=Wp&G5)L$#eZs?#eAbDgpnsI z>_NSoqvyo&2R3yTVbjIQ8*ZD=rlY(%S+2<0E(}%(Wq1Zh27U2);kp;9?*u+HVoS1D zLzvWBTruevID4224%NT21jB@orPX_7ndF&pMnZMIyU;VGnr^{?M+LegqnI&Li;5Gru$}Qh&8!FFT%vP#qlF0iaWwl^R>#w@Ft|Uy=?vzBgZ7i z<_*~MVN=B4rueKk7n2JFxKnyxvf9uxBh4zs2MLw@{(zYEw@GDWOjTq(M3@9ug zYeKheA2hhgpE~XBD|T{Vk8^$5*lX47*lS-!*Pr{v1GGq{FV=ENbST{5Nn5V{qL(Jt zeBr5FfsAJ&tXSB|kBjte!3u1u>2O`or5BR+Y{OM;M<4))%4KG$(5VNWvK72d9~ykc zTu5m4*lIS1vbj6-AoGMw|Cl+(B&%4cJ{>&go3v$$YdW(;z+>O{VgApPu;h6(lbU&V zi-m({^BA8BCsGVD9oB7FnG*91y_>9tmvu%$^5!GTR&?46Lt-+7t?#;fv&^6mTDe+D zaNl+U41?YmdjKrE&NG{RactZ3=)MnSIDe~`4d3dYj*nzl(l^ga-(d9sZ&vn;ClDJD z4hDiKu=A8_PkW1N%=;VQeXzUfb%oqW4cpd97hAFKEb2)Kh|LE6h{2t)r2KFozI(f! zD9P!S5NZZxJox-18Zm!rB0SSIK`r63*a_d)!?FLb#b}h3g6aVZ>_k<($XGV^B=U{F z*@yJ}45=>t7z+fATd9{mwzjrft}`=R!<$<)b7i4PNXn!zCdz#Z+ z5=*p~mfM*S@AL$kjj4(PwgKiiqX3H~yVB4bLbD3lfO9cWDdkaU?e2AeMLxGX2G?&e2_ z(N{jf8{h6a0W3%jhO;0_oEK=wd-^G0$itp+c5{t)|JtGIckb>+77N=@VD4!y|5Fd0 zXbrYN<9BpzRwNEHkuMMEu-fLn7H##G!1cJi`ainmHTeomRWMZ zx9XQ3l;i*?V^tvd@9JgGW6g>eqAHNnt}S{e$kB?_pdcqP`NqRV=W2C|LGH-;V7*yB zUywyit2UHV;Y9krj2<I zA6L%-%mQ$1)=&NWzyJGT@PJeG9%4_KBC$`1Hd`aaI()+woqW!#2ID@McvmnnB^W*# zadJCmV6gb57tlA80BD1B4FzDBQfoeBeS7>-bgO~pY9b4<>nxGBx-uIFO@Nj(raCy z)sZ7->7Z~n3OJ1BE3hbtS66oICJ6>6E+5&GVhMQND&CQ$0kI%s-*Zs#|@Pcn2t+1>ksVB-Hv11f5r8u}V_fkfOSV12l-RbjiY85O&hN znLT&D$fX5fWb}3=Ywc3KCypFMN}$z@;Aw;9`Ku-kcy>8rlqDXKA zj31Y)8ZacV@tO`G({aX`XRRxiim7+~@E?`1_V0-UWeY3G8g9@4f@n~M^1!}2tr{MR zFx1w-4WynPgaj91^~z;fviQYZia$xm%-KfynRt zkMns>3L~W~%pFhIOy#Luv0J-#a|Ii>R$T1Ba|bx(xTRFWaVMU!E{7AS=>U$*`f30E z@81}f2Jj;f`cD=x*46q4S6y*XSW@y#Bz8C8j0FC+WJfUlIw9z3;MDUP5ng zPik^cy+uA@(m|Lx=P1E?w4#wDE=yTWz9Bemr{oO$Fm7*p;2^AMl5&}ILW5tifK8+jA<2GY!Wh9zmMwib7toh<95VAT3>rLC zL@80YNhE|y9Yh{*ggkkjALQ1)EelNn!y0$U$z5ZT3xxEQ)lD-(u$2^`$foSFXs)AU zC?+2?FMG~k<5<6DaaEkt7*_>K88m_9J&iCA%_j9#T;N?t#6)VW(hGFT*knZYrh8L4 zC4WRp>(7`mvn{6s81HichXELs_0t9o>c}kkSFzQ`A3dl7p4?pkEsBjsx_smXqXI|Z zaT+mV&SwRBN;bh8RxV%czaWEL$Ml(psgfx<`8PQ_bsCgXGFYCl-+zC6{C}p3W0_&= zt~fyHBdCfDk4!=bW*HC%!lY^Q((n2y6m&PNeMNzOVcE#97#z}a<1Rj?7VHtB<(|}` zS@T`UK!A-z3FSk!DXraNv1Lak!S=~}X9&RH&W=1QZxmQx0CxcMvVPK4|M-awwN`(U zQciD~)uK7m&$yuz!Xcm}<(+*sWM_B>Ney>NHX(uVT86rDG7GP#dn14hG)~6>%s9+b zhbKX-iO$zbK0EZV6Ea?a3t(gwUK3YkFI_X`@@i3}pyv|^Ic#!Oc7qx?$0Wj?cjDA} zxiFKYTfd=u2`pLZ{H-E+SrX!)GVE+I-(p^S5X2nO$b-&J{rhs^UifJ3u>%Ddk6?xBefriSP4D{JK6?dpRV(G=(J z)&NjUEP;~qR#f=po+UrqC>9cVT5hccR;^fyRV!b~4fg5dpy`L=;2HDe^>c+?qg9I_ z=F3@)S`#VKj(>`-z)|?l9V|A>DZqMef+lLQsL64h+?Y6a5d2J>HWw47%xP%n=f}o% zOR;I)GVi!FG4NG0A)(8|Bmn5hAzB#)MfWt=@hy9P*7DHMNM#_f2#Y=9^_wg11|>pF z_ht|Qm%Z_wLvuKQLwyclPS#JEGG%IO;$~=)jigex;>O3yJAC%KVr&toSgHmY7)QU2 zyd$6>DY4+)V&t|evp20?^-ALQlNr$_VA}LUqjA(?jCWY&5R-X52sKC*Dq7`a^q0QtwU8N#)XIh=LiF_66=W4CnlRNwGopf z)*vX^G2l==h3&g4cxgqi5MrqbEC>HHsG~g(4lp~g`N#px05BqJ{ofel2gGVLzl7X> zD7tUBSjc#~{s7Nzs13r11<3PFhvsRGAQA~FG0%h;5U^&|vWD_~P4Jj{&>X=%=b8oF zSsBI#6s1dYxevrqdZ_VO3c!lgY#Baa$es8THOmNL)Ua3Hy%)MX84eod_c~P588>OR zAK*^UuM&UUykSLrk8Farq&Q*Y$a=#Y9T-OX;rt6Dnx2Re3gW!q#C;QxZPgkOT({Y( zn?ZHcB4Y}9_y8jUn~xm8Az59>zx>N*2YbWoI$CFy3V9~+a49A>5JW9@Kmtu*WfiiN zAc_f>x*AP{G|sda@`y(PK=+#E`JjGJL&x}uQ!!=QEJ5%H*A7&rB3u$iv&1|IG>NH3 zZnKM3+K6H-8e}7poVCC>6~qwpgn5ZF^fp3zn>+2X6K7)7n5n5eY8qX|%^O$7Wl>|i zQ-ek1sOBYtl?0vkVXJ!slvt=3U}KnbCqFjDe}d?DY%9Xsb@D2Td=4rYEFyW%$aeii;wppQ@$DN7luo!-geOHVDP)%}Be9W3XH;-88bnXB$_x}$YHmq1{(x>m& zy=5Q!j-389iTarrI=@HBy>W<3&S!3z&9dlJI;tXsPZn>MV=yfBj(l9Q*- zaOM{9H*w+<58{Q|jw58@Bfdar3~GT4B!$N8d00M0N2N%@;RHk)@Ox*Kc054QtnA-uY|2ZsO$W9>Gcm5^2XpO6*f$^Ss%G@A4in3ao#E zwfcG;Es?k8?V}(&ks4NnAL=c zxXsnbQXe$cm4x>u&y--k=xqS5Sw;d1g-6L_Akr|aI|wZ6XYkOI<5H*8-}ecXAgE4+ zyJl!;QS+H4+3U|pC2_AlZ-8M#E28QOYqz#wyC54k&LcDv6I+~!ASC)&^0PSA^C3$C zI2WF)bsB}V>a+Vfve8NRQE&_cx;!UFg1aeDbiYL_vA;S5z#S;7W)AX-e)xM!j9}%t zNA0Z!?|auZU5Q9S|_(mgp&pk~yYDTeGBzkmr>`08isu2yOG)&zlM6eSgAwKAn z6L^A!Z~53PC|Ph1!_k5d(d21|Dp~TnxX@knG%%?tygWQ-6|`!U#dC0CGy4cKN+Oxg z*l47haj_)B9IVxKedB4WGV%EUj`k#gL}3*x$X@WwwT$@&>o_gAMpVs@(W7$-gp4l% z7?+s=*wJ1{8=A!Vzke_VUucG_$cR>9w;X6ahGtbiu^yYvIrbDO29wJ!pgeRmW&Ic!#pAJqkQE5_*Zb+y(hL(LXu|||gD3dhjKLAY;W;w(hhyol* zHo}ECh5>U_2BMkC0WytYb#_vvN2nCbsF{&G5{$3Mh@D&ByU1biZQrmo(088^=R|~R z=tPDDVaqzt!KI`_v}D6^q6Wa0?Uh8XLy~aFph4}091dVyDWn8uIf{j1O~dyc6&o)& z0Pe7bAoPM5!<;~-5qY_ZaRTMlxe{!22YKiX;C1KCZHU>Ir)(`l5|ilK>!nqBN@a~Q z88dxF1GL`8u9a#k?0opk3mjmXAR|-=em|)Z@shf1d`=ip6&mAoOG;-Er-$2jQL0&i z{AelVnin!Umjf`yWL5wwmjmlGajjMC&DbarM40I5pL5G^g6^xzqGE^) z@46&s^RdpzF)_{3?W<7I={9sGY`E+0y@XZk%jx9hg721C}+ zXO;AjH~^@HE;TFCH?+T&>{`M4>fglUupqenqmG#JIAE8+V#Y^l`0 zezg|QJp0nDt-&Ko05a7M4?E)U_Ds1X0cGpbVufMq5J?d@;vL?IDLq>4$JdbtC4MPI zBC{>HIKs@6CRo#yk^UBoV3|fW8x#J8{+18i7JK z-6SGFA44#dY2ri-a$05k2{fy@ihZ*Xo0#+GJ?}=a5o&_-$(`>Sj|6A(VME~9kmM@} z5}71!#TpXsxA>Z^qDCkq>A_<2A$Mv~__uAlZRYzqX3V&(oZz7)0GV0|2M-=x$oeoV z*5#!~9?=+AbymwOn>egXDuX#CM&j>@qXu2>>KD8(7+ew)!A;FiZmRJ&02<|fZIgF? zN@?^E-JF#9ONmGcohZ=LkQ^XtDm!-eJ;&{rojm4FG0@ECe=;?+#B14=^xRQHRxc$jX4>|K}*-vUOAYBJ!5` zyq}${cF|wPzfVH`6kn98%vblk_5D*^j|3pK*11?AfGW8LGLqEkC|hSncL9=j{l`L~ zJY9eoJfc&A?YnH|=bu9zXiy12CJJGxR5aM=pk$pWUB2JMkiUu1d+uGIntC3J0b}G4*fihB@fer9W!T1| zi9jUhR=_9MhKLNnm4l-981j?};b>k&^Bqjp0rZuDmQwl~S}K*YI)IJ>fK0;$3WY*4 zLB+`-O*8<+K*~r*)c~u)EY=?_X0CC;(CGW5j+@}LBUJr$OEF<G-}qB~Sf*6P-BPo_xTO4uTn|Rn;t4*y%DD3t0cW@f>0znhVlGB9Iz#F= z6g`|ZXKmb8PW4Q~zw-&*DUY@SfK0%FsR7mcPPAO9-rR7eS`zja(kgv}5GkbO!lMyj zI6agEM?DJlH2MqK%)w8d@-A*cTg*W8sqqrZXh@k$n*Fr%XJz+M-A^-7nJ=Q^ro?Z2 zQ>h|jwQ?#F$B%Sb*+!c@v93Sk9kLQe68_CmeIMdfh9XhN>YCoN-PWD9&9ARe$gB_A zQUZ`oO(b=xh9Uo|s<%MPi9w>gF~6Vum{L|C$&LNt zD;g$31I>@<)BCD@9rkB7emO^vkVAxmYU3W{0pJ{gB+F4H?dz1iFGDQL5B#*idwt5N0f~RES47ZTw5KZS5t>R3_ zTaboSmtK5s#^?4O#5VgbszZH~?rFT5#*Z91f1?dOneVajL@OEd{W^}03!w0|Dv3N4 z5Bvnr^*O;Gj=Z>mEI~sFgotNhVs1gyG08B1p`C^LcoSa>HuGYxlmPT)aR61aj`3jH zDt8Yqx>V#Y!4DQn6gDALwYt?-g;u`24+?Ef=-qBCgszQ5H#Own2S|TYjlaRpMe;^g zDSZgle}3G#Sn}=ikR!iY8Yu_18pUj_rw~O#XHYa5vBfo9mGybcyzj8tL)pF(fF1y; zDTEbkQ7jgc<4UR4ftF&8R!MSqPe-}cd6u#t9UOcyK7ByrVgr=lmeLx3f0y~Pyk~zY z^Ci1Tx05gT=cc?d&NSx8&<$%uRayyvt54w&h-67x8-Cmapk@*n7h4$BRrG-6$=6t^ z*sQm$rvzXRGV}wK%VjDSdA-p{Kun=&#sI}aSPo1U&;Srkn;{PVS_P26ugw;RK(azaN z2?!}N3a3+$tpyh8M2uKIF_>M?;EqCSurK`e?%jK{I)L3J06VidfSo&b+F`@G3jC~y zOwAxK1OlU*z!hr^c}F!z3*RZPNE#@C0u@*8B)EWNQpcdt<3a=tR1k`T*BUW9fc!0? zmODgu_Xkf^93@_UtrkM-K$W2)gB0Pck)bS)931CI3UpNwh`2XKGU6zyB*rxW8KQ1H zMkoL|6Uno=BfUw9#c)MkSw}~t4QN!BBnD6T z^a12>RFVRp`o@Q0xD!sB1XWi#lK_bw0NI)H%btzZHGeKh$}CuMU1 z2`?lGL%!WjlozXif7|O0ODMDW%6ya#*m{+8`}kt|$`79O2%QG3%pf2239o9NI$-dX zkIm0Dq@#A7KX!CRgyQKNdh)Uv-*NS$tSoI5j!j-c83>$+NxK^*I2tW(L;|!N@RMs) zrMhgb4j)=fzm|gkS@hzwdy%cTXIlZl<}422#vA^(*Rc=J$?>qNrDW9bNw)J@cXEoD zyy_Ep61~@~u}4p*Rnp^OgkV`N?V!U>iGcjo4kXNMZw603$Hx%)YsIAKsiF%`_fe30 z#aSyR^ci;KP-i*s;b1AC>xb>Es$4V3ksI9AN6kUt6$GO|NzSn#uXbVH2uC?jBda>8 zZ%vbQ2MihIcHAljoQRZz%~7Mes!lO*JIeV3iFLzEiV9p5m=@5{R=|{cGXJV?rdR+T zxaXF!c^tro#%kf7y1eIMwG@F$#gC>ss=&2SZt);w$%xnpEQup{+C7!`)D;T1%()-d z_-phph}m@!nCR0;;NX{$di|81gp*8xGU}vEzD_>MXY)zXl^!*0zw9oXA|s zQ&kYE)8vB0%7B~^^#qLc4ErTdAjQ36&L*}Exg0>HQbw^@O1*jsK(Q!?JvbFqt;OzD z{88mHqMDOgAOI&5;4kFY1`r))295Ud_venEW=E9KQb6A(j~+dk<0LsOgKCl4>z;EG ze$os}&iEEe+Q8IEvJfMIadv$P@_C*CLG%Uq%7~HnV1&T{g5ME*&(Kbj^5Mtt=_^-q zIe-FywOQY_XU|@nb}>=}1RAIAEtz@M(N}t^tOXPoTU7-ViA;klB!-TJqoSmgb6W7J z>G^(xI6=+B5|cznG=|HGz9PbvtVt7j^a2{8Pg3?V8~zah5C3`chXz?!V@dg6)4_c&q;br$rXc7tL8LLJqePtTZGJ~kkQ z!$WnhrOSvW@iW}TyWW=*zYsQ)=g^kpNtV|cGa|8`@4900E9yPoaEBg?<90d)!7mUHRKmL!s z8Sm5z0INgV;PNc*eEO*;$5NV|UoG~S5F{@_G|!M!01B6>wYt{Irv<4=FKlEuDahBE zDBA?l&O9+H^@COTIwU!cLc|Fv#u;nwYr?4y0hp#3bDo{QUJ9D%90gl2?*5YvOtMEo zR-@R;Qw~)t0O=9;L^FTRg;^Qs%gW+5<^Z(E+7)C(hs#?VKL&JXJ$4 z(ui&lhgoo;hq#hp39hbNifd^!98LXEl#PLxL|i1UufS6$qH5y}XJZ;TfMG1gnQ|mI z$fLrv4|4vLyMNL>=0iR~CJx;R?p#0cdlhU-)?azz{SqP5&x&%kd`)YM!SsnO38Az> zlGM@Gt=sd|0GDzHuq5ldUwH1hy|qGR-!p9~8ML>ue4J!kE-%SRf{!nR3tnYZ!-@Lb zxQWLIu%)i?H#+39p;$P_%hmg=Siq`7lHinFtD=&eQcX@ZCE3dx6|JNs4>h^IpZ1mt zFpiYggrK2Ab$^n4JuxJJJSFJFXJwoF@|xwD7sTIUK+e?f@2N zefQVC_NARkpk%G*(%MpRx~(Mgs+)d{r)MB8p^$Y$Pf|c3#3Wb)qB{9)Kj`*lO)GM} zPUVf!h->0ZK-ObHau>3^i_*yO)}Q;EbRv8i99J`U{-k>ur<-w$ro@vVx=}5gNM`}1QUC^8gP3C-drYgktBmIR zM?#LW_uujkPci~rkv;NU-q+SVU*pwM@TFB?#xJTTwZe1XH;8tb&3FI^u1nl0k zH;*e^7}z|x%XtyNNm)K+#q#C7vu4e1%i`?~fc93Pw-=0mPI6CiB$;@KW+dtlpF|VW zgd@*@M@G^7uj`(P|E{II2!3*iK4&F!&ZVPmWJLznlJeesNAL-9Xpq!6a_O4GPmVO2 ze~NNEkJUsN3DkhhP$%T$Ut17MaS>O+(LgTyzG}On|XL_Ce=btW~Vh zp$=7=HKwpuRIB^hEeFQpoy=+0A}IxrKm(9GhEI;}zIuMvRNw1)U%Y0F*tZE)EXa_j z%hNalP)xPQ2$2e1Zq`pqC7f|&pwo-Mb}ghD638^@(;u0c_pjg-vN_0U@60!t$w-t>+ zo~}W?TZT%lWc&-?$)^!%zL6>;X%ST7QI0ANS&j=tedSO>ot~%!t~0C}A_=ihUc!=- zaFU{{AWDGS>Z+q7jkTag^bv+?mW&e9B(J0!am_)lPZ+g<^R7q59JL-jNPb_qoR^8I zzCxMWb1g3DY~i~dx)7x{{Kh6Vin~ngU z1+X#eC+*(7o4f#2ja<5|#h|^-co~4AHp>uypNx|8KHVeWNI+9u5{!Ty<3tl-Z8zLm zM1O&*?~1$*j9_Fv+l@4 zpSEbxOFc&&byT~^nNr{ZgW3w%v8x>CR*^QmQp|$D#;y)V6=yG;vE{ah#f`53+ z;SJaKv(6OV7lS(f`J0c6RZ7Oh8jQO0O*t^BqHFM-e?B_Xl%7TydX3ij)4b^Ns~(Pl zOcoW0n!bL<yn)9RPTbmtIm}o~seNGl1GceCQ< zM2;nOv;niGw7?7T*H|ybg2A`H@z2|k{SY>;9l#S=KkdGI|1!3(T&`Ke_WiBBwSYk# z1=XoWYFx6^4A5nnNZ#5Lj>X(|{a;e@;Q4owOyr(^7|C7B2;%TO)J!m5&Hae%!qYCt z(KgD~X>N_baYr4eX~ary7RG5m*XavyH4m#O@xT&9_>&g#h(TOAUt#jt7K|TNbdml# zn?-M58INbL|2sDBa{xQCej*nLNi=@X)pWKS2~NQXZFmt*@hLWJESEDc!0^E$9=fs0 zqw}oUtO6dHceND7Y)bRJ8o{<6WL|};Qh0^>&B=N1V?RwIb||@`W!yx&zn*Z!XBLoV z42Jy_mX$wkf}*lgX69-^Q^u7<*)i?W-Muc40LYGd4qy?0$FhFvb-%oJn=$DhR%pn> z1{aw|Kv+Wacwf@gUSdeT5j%dhZCK6|fT$Lv_p-i~nyHhoe>cvW=c+`OSp7SW3;>Uu zm8QAUJ~(%3vhh>>^awl^P!$;>IdFw{R+8KNC|lBl1!lZqjnoJnHrU{ZL)u&=tU8xj zFa|gN;pch6|HlFwPjmnP@MzXg{o=p=%Sg*6lTwYHkM}aSmVm(>#@&s{(+*D zHzJ&*-n;G~6y0C@%rct?ex-9-OuwG7B@HuttL_mWyOl+HtiN;qJS@y~n3NGTY%8ef zr1E#B8e~kub0c?RFti3{>;$GwXu+_-h0Hh3+6w;Pe|~Ocj-}?zO4Y1@IGgwJTqpZS{x+OwQ#Uzt{QT2O6Pl`9ydzvGO>7Epe<1zMjvDfQBpa9{=IP0Ke!~TB^Phg3C;VTU)&X<_crfdyf9jJT z9bs)H7m7Zp!zkvQ)b|4$?4e6|LN-j5W8Cprb-LFm|E`}U=g+$H=kX3=ej+L73b*k` z8o#8edX2x)G$-XugRDq@>c~rI06{dj#}ds~8P z_~E>Co%b^^Ofw4`+JGph4fg}U=1jd&_=nX9cjyj;)&l%fZ(=N~Uoj4Y>^XlfK88mn z+ITd*1ic#ZWMP^6^O*qTp$o>JHMFycqh__Gc2@j;tXZ?RoO79aZ92&T+z()D)^GU! z_rAF`tOgii{04Hanp{Ectp-CnOw89NHKa3)W339)NbmT8z@uu{bPU4EPO?Vw{oJjs zjpX|&jKCpI!KGAl%C#W1u#Q6SxlsQYf4^%iG8YrA2`keft8(`6)iyGINB0P=u41a2$Bn;O1peoz-`<+T__qc&o!S9B3*es24&b}r8r9R=OGyizYAEn_ z4K6ZJjyKJaocAu&Q9T4~%e}mu#TGdX1J#+8b1~)F`BQ>@SwF*hk5yBVL+u2_U|-bd zpn+4SvSe#%yk$AXW<*=m4CB|VKL}w?juFH-lZlK!2AxS!eDylxLqg+~S|}RKnbw-_ z8LQckd-wLybwB&|s2rDk4;cSHjRQa)2LJ#IUwpC0jTgxyWh{ZYt|0{s8(d%wAFfEH zWw|W>H~DJc40W|k50HW;b!ucM$syWF%`k$LLs+7qDJYqmXuu^2;Y+vW)E6CBoAU~|}w>f@$3o#5&#kXnDT-y34WEwNG;!9Saz z*}Fb9X5Vfym@(1i)0Xt8aPNd*-RHkQA^lBopyZHwOk6JEUM9iWNGiHkTH;fF3?l}` zA24H5OWn0a-rj%UBk#K~kND@-z?L&RfF}XmmG#>;Y*^p5W$QMpROh{mLSN^Y;l=7? zRF$Xt$QmwJn;e-ZK&jzE^8rjQBkd2Qzq!2##K1msC;gBfvZCeKAxmU=L;j|bni}&1 zZ(XumhaxF3PSeA^2egIzk@MC4S&0u6?U8 zj&h*)d3M95gufZWei18^Y^`>LK!u@)VXzX(ge)C4>&QETHTUf|NGxYMO=P-s#5yXY zCL)$+YVlApv_>c(8O)s0n(Uxz9EAe#>tFo$mYlcyj+9xI_n3*Qa>&%I-@10=Zfb39 zHCe*v@V>vWv=`fUS*6xPagM5$g0v=`P}q^`G@)vY7y-@1Ljk{Z7UzwFPty%f#42GC z@CiHK5E7!^E>(Quwq>ruW0~fGtCqu?QAnPr20o#+4gn$f;b1BxrrXF?ZKHO^@E!+Z zAJFPWy1b^UG+`A-NN~rm=VD-F4Z!>H^)n&(Zf=%&w#JgeK&WkTKJ=Wot;bGAnHa z(bdRRd4kE6`aGl4v`EnCGtAkj={IZ(jmEj@;h#auWrHscBoU+k2TA-zMlcjT->PT{ ziG18=e4!FFsA~LVS>uv*Ri&W9ei6cR9Rx_KuFK%#j?;J|LnDTW#B0C$X4&(v!u}ej zZ49vBvCx(>AGg*r{xlH)0K5Uf@A7>6#w|T46pM939N*ucd!+~4cG~En!^8d)J3skU zg|+%F(|3y&klTP{`66UHpcM{>1W>7WIIGHW(IVvEYmlgy=gc9E{p zH3IK;@5M6moGC!8nh>QSed9GpwR$*8kAKw@*7Gpd@9?Zot!B01Rf`!18xQ3wP#1Z3BlmKSy z0AkM6Rxc=-2Gn?Y@si%0#(!^MyETteiVxZa;AQ})Wj%xQ&pB!Dl4a{#ksua8HGrN8 zqf6Mbqk_#l0$p{!GZ|jTCNTuW-Tlc)L3mF4Pwzc4Gbob?Of`b^XKH8F!y;uK-0buA zeQQ&$IYnhC)7w+N`N9u96br@}b_?}LZetWaBB|5lmF6RL^y15BTcDnTW){D$*gq5Lk4CUMh zDHWX z^+qI6fAczk@Iy1_BMTQkKYI1*?s8V+5C1u4coC(NQ3E|m$Xp?Dx)4cljOD?W@*98C z!{5~J;d!{p^es)LBR6XJo@br=UgheIDlIL{2|YpdDCSVY)P6kUrStq0E`$`#HgVKIZ;Q+ zTsf_s0^apF9uG^dzjm9fJ78L?6N4uD@w}VPW^C5|Ya|8HN>M`Tm(QZqsUyXJqcZ@6 zv;Kg&2eo4M)Rs&d5n-}X0O2F=zbG&9=MTtGy3Z&`hCk*xqlF8fAH8D5%Dyzu&-eR@ zV@eo2s33<=Qallch@1(mVN;O}5&sY;U>$B*bnlufU7cCT!X)G#{U=!1Z_-^&*!lDA z`aD>NJBFTrqR>Y7a0ObWK4BM;%?>0{b&60G3m`%Gh`8;FY^3G21)+tpTwXP5Z!T-}byj8w`)MC}f(%YC z@4csnPQpkKnDi7XL6f}~^PhV@;GUV5n~69B{vddj#GMh+`V#Tzc`%!nJ3bRtWGTJa{++Hc~npFZa& z766cNc>NJ>X8}0#f_=Ho*PuZarx2AZ-uRIvw6z$S11rj_BZXxZ zxd!qfH)9vfyX)7_`HeeiH@(~FcL9&Q9gKMeP8)S3GQXEyeZ;*2$5#{)iAdo~h^tFo zgNrzNc3bxQ7W|@IF5}G?AJLZc^6m_56aDG{h-fo%QiB2DzI*T8RY-9&e9wARR}rJT ziUN2Mr5x*y=C+1&z2&qZPzqz{C#0WJqk@!owKol%Z02?E`wWDHu|upIQuJrI7!$~O z79?60;!mG^{^U(TnGMqb0OlItu|YLXFULi!oIk4u{6$@%+n=TH5i)Yz>g zYW$o?D|K+r$GiWGDJ?kfgwEXed;5;v^pW?yHZSS_j=(0dPaHtt zX?~UWp?vSV-`wP|gKHT-%f$)?7(c3n))Ft%$T{zl3&7e+Nw$~PG)|M=#Bd- zoU~y4rTMBHx_xo_spp+7}ZsBb>8?y7T$ADynBqPw`N@B&B=X}!G|nCe^Z!! z{h0IbYv@9LhLV-%-ieg54iW$7AWw8i6_~8A!8YuhyJg`B$Dh?n#2>@&Jyz%naozuB>+jg560(zDo@53L} zRm8YaMbW4;dHpYoi* z8E2il?pMG4(^z8)3BA>^7f)LB&n)i6%JpSO;YRSg`9lwA!q6%^S_dx(AFWce0k0qs z)9TZLAb_K8962B^MHRfrs>mlA=mD*LK#7xSf$FsxXi-Y8NQ6L7A=bo?IwuWzwF8aT zSI}C3Y;uk^Y_725sv7BZkJM+!?=flyA8}F+bLbRK)N!=`7!CyW-Z%shZRWfI%Z4kF z433%8hBuxyI9ymX3KXCiloVNS#MD!_-E$;IO006E9uprMH@4oA{u?rR~ z*zHdR;@zBTsN>F@(t=UL3bAyQBX2Fc2`#G=ip6NSldI->R=7z6vV1~}ZbUNvJ)Vdm z`@E-|yv8py3JnPa+BJS9hwjN+xr7-HX?b}R%z2Wh(Zxa$u9WbF9y`vjkNEv2B#WjOBz8QUgYUe;d7cNl{99GZJ$gVvM3pJCwTItN@E!*sS-+J1h22Adn zz~=T32N0eVfM4f*^A(q$zmaT3Kqpx`%*KrOf1jM~e6xv&(#9M;|!n$c7AfqsdQEBmmHoUu! zeJ=rMZ811@c01-B+?s3WuinE7KJ@MjH#T5rziwo+?KcMylp=ltU}c{7Kk@jZWA3`^ z&YcAV)S{5p>WDpfVhbjYDan!zd@}>&&R*U54YeRaCcwhmJOpk z)c|4m;{t7@2sTCzJAqFkOAXKPh5Y2M51(YV`#Gf25ee3L#atc4-UTs35KkDelaj<> zBmYA@%P*Ec51-W$GurUhbBE;G^~0mPySseB=?9e>u-DHM(HHC3->a4agvXBn{3-97 zkD52R)YH>Lbw>!*;F-^!+J@1?OR;peA+b~Ioe7*I6m9c-XD|YMB64fUQAa7_h=R8! z^BI&P&-9KfGp_LiPPZB-HhCu)shy1*k|lBsN|w`@SsJagND5jbCd$IgX|7Bg2?gUg zk*Z=L#+#x+S82$X=F~8L-2f)oeth_g{MPVU&6v`P^F2I&lVL0E>FuEgjsH)9Z8i01 zx&t7hH30q_KzH8H_}9;VYJ=WdsLrm>kIr_3LngIg_~0V*?&N70GO^LJl22%;hUezW zxcEQ{*9oyv=RwCz= zfYgZ5Y}$ZDYGTAlHI3eDCn<7rHBB?BIPi8~!Qdlh{Kh-PM-NV&GPZ;>j_QaT(6Uo0 z09btEE1%xbfLV0|`0v2B_HPFeJd7Iw{2(`)_~Y-7x&QwAb`^|CY|Ty55C|XOsIDRo zn%IJ_Aw?Ai_j45`AYzYqee>#WMp1Z$J$Iac`iJKo~Sm5Ngx; z(g-#AnB>g*C{pnNcK{b$b>G8*Pcc@D4FCzh+Imtg-r*CM?xX?47(3?yLvbNk&Lijc z89netRai)VV>Bnx#*vuSO3}*COc`6k$%l2|kYJ>D&AA9QN`4PKaR08~UHAXSG+iB ziqvA&pc+BV2Narjlu)bJ*G|$f)O~dvQpBtzM{GsZ_-#DtICd}wN@~NoHlL$1dh(O= z8Y6(js!rplcm5&>N6u)&`6qOG!~V3fKLOaeW2Zg!=uwSC*$V-Dn27Gm zU~{j23c#GjT>!q<$Y)&eniID4mHQGOM7^oQAYf2?0mmKMj_DIyP%0Qm8EB<1$RhyD zYWAKliVfX(ka7|ej>W(U(Ww~M5PA8KM<%>)l^9VcGTMk2U;>_koQ@(SunAF}-0-$n z#H>l^+CF^bAMz-#%Di1V!kB6+%51t`Pkt2yEd>uX>yejMK#Lzwxy%Z6IfS zYxd7Na%LN5Piw)Dj)K&DWXNt5ImTDU^QAsAg;Jb<$Z=Za6J;e`q2Qn%@5_(V1qZx4yJt`O=q0Hefp64Q!`hkA6)7SXeRx zz<&aGZQc|8ub=#O`^A^MZYWXxkiVXo$LjTEEMC=%wVNxHH{mLVxg&N&aklLnM< zwPIeY)*Ju>Ph=qTSIcu<8zbg|QCB03j-H({Qbm~*xW@Y;tgML(d8~wCtkBn~8o82E z8D46X5r!o22yH%3s=!HLP>z<2VI$?@6PYo&6(`JX$GqvS4b}O9s=Cjg{`AM~SAXoy zLmRNmKLhv}5xtzl*7iRK5S-X~0KNraPTsq6<1G*GIp&z7J1VwD$X~}hhYxa3uf;Qq zd-2NZUbeVMG@}qG0XTDWT2hPLm6P&-PYwkb4iUvc_`~#?OII0}>|@A}-t$?B(Z3-Z zoV?{c4-O)MQ`Ei zTBLqp*@Fuxfpu!~f=Fm$+L{y~aooOSJuZ zg-N6V>nI>(A=WJ632wjaotNjQ`TXPsz$6{nFazT)%%lL&m>&eO^Aii#WqQI>Btx#I zAy2pXdgJG6d?^-Oun!)r0jSD&oj9)@v!~{7>fwJb7+}qswdD&=pH@O+$Crrca}C

Qu4HXm<5&OkFbkJ;m+{K#KCIqQmdz$SpSK*i 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 AmH+?% literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/Finals2/plock-blu.ico b/src/Ext/Icons_04_CB/Finals2/plock-blu.ico new file mode 100644 index 0000000000000000000000000000000000000000..d213a442f9e0632e13c86d23b362129a1560914e GIT binary patch literal 25214 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 NzAk-F`tN@f{vWKuEcgHb literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/Finals2/plock.ico b/src/Ext/Icons_04_CB/Finals2/plock.ico new file mode 100644 index 0000000000000000000000000000000000000000..8e711cfcecb34751134dc42a104a206beeffee52 GIT binary patch literal 25214 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/Finals2/plockb.ico b/src/Ext/Icons_04_CB/Finals2/plockb.ico new file mode 100644 index 0000000000000000000000000000000000000000..79ff9990bf587e00b6eeed394768907d17b87f12 GIT binary patch literal 23558 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 MUHhK)-w)*e3kIG_a{vGU literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/keyhole-grn.ico b/src/Ext/Icons_04_CB/keyhole-grn.ico new file mode 100644 index 0000000000000000000000000000000000000000..9945a24e55184ee16e056954625d40db00c64449 GIT binary patch literal 25214 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 Og(usl?oofg)b(Et0g6-r literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/lockblue.ico b/src/Ext/Icons_04_CB/lockblue.ico new file mode 100644 index 0000000000000000000000000000000000000000..eee458b1dec88226b27101cfdb7145405eeeba76 GIT binary patch literal 25214 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 Yy}w66{Ssk6jfAkxdZFUAV;}bYU-F5iSpWb4 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/lockgreen.ico b/src/Ext/Icons_04_CB/lockgreen.ico new file mode 100644 index 0000000000000000000000000000000000000000..5bad9dda2268f459bfcd0c2d90f9ebc7d3a3f7e7 GIT binary patch literal 25214 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 WBhY@?@Sn!fr;2i+%c;jUZ2LdzpRr>A literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/lockred.ico b/src/Ext/Icons_04_CB/lockred.ico new file mode 100644 index 0000000000000000000000000000000000000000..fc4033a6e39365e37046ea3ff6e087f85bc84676 GIT binary patch literal 25214 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 QDEd^#FjLoDzm=l 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/plockb.ico b/src/Ext/Icons_04_CB/plockb.ico new file mode 100644 index 0000000000000000000000000000000000000000..13c34fa03bc4d21dff8108e41cc62ca91116b476 GIT binary patch literal 25214 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/plockb2.ico b/src/Ext/Icons_04_CB/plockb2.ico new file mode 100644 index 0000000000000000000000000000000000000000..e181b0186549d7c90cd0970c83e92a05d37aea42 GIT binary patch literal 23558 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/plockg.ico b/src/Ext/Icons_04_CB/plockg.ico new file mode 100644 index 0000000000000000000000000000000000000000..d4335b4190af25236dd3817d466703ff10230155 GIT binary patch literal 25214 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/plocko.ico b/src/Ext/Icons_04_CB/plocko.ico new file mode 100644 index 0000000000000000000000000000000000000000..fbbaca078148cd4a15b4110c1452d2ea11c24a63 GIT binary patch literal 25214 zcmeHv30zgx_WuG@P#jQ9%^?v~91}zV=P}D1a>x{?)Fy{CaYV@ghq!n%P@ECV)HE|2 z)VNnfu|b^hWtI)5sl9r=XM_6Uc^S@L|L@x8T)Y@fzt{Wy|G&@wcWQIaJ!cPV?Y;Ke zYm~@~DpOck0PYoNawVd*L=+Tc{{GgRNa0;Tfcd+H7tuGB3H1r}{b*-(qU!!q-}>!G z^!A-n-~2tfBGLF@cl{vR*^KCDsJlLXquz``?)pJAxdKt0@kA{E1BRdpC<2#UiRMi| zm;IB7k9d=qXx{J_k0^5FcZLZm6I+#guHkZxeu-RP6ByHVSw9V#lI-S}0vc&xkcVAbkymmS>GF&!~0a9&Q zPG^=gD+8Cy72s~s*kzBGR~Z@c84Db@dUDxOJIiU$NRhq{+sp^Ul$PI z<>Ry7>9B?MBwu#K+j~k!U6uq;E%fiqmbs{b8FNI0$94=)*&80=72YyFW1TILX4Y_J zIUIqrqavcR7tD^0iWrlTl5Jb!J2S4>4)`&U*Mh77!T`?fb&h}fQUYGb1$cRRkt2(0 zd66%s!vTzK#rEXv*>c%4(A(@TDUPfcY(%N3pBxw%9v&Vzyk>Y{%|I-L1Mh8iENnmp z>WPhl%ezlTe0=;(-H+W)O}x={m=ARb2(+)yh(rAZz+-d7$3;hH#m~=*kIHgpXE~C+ zX7;c-FhW3}L$0iVnofI4%3;7?1JiG}_w>a}ETxyPBMa1W&6lu>4!bQZK)^!%5UjEt z^MHA?7uy`+LGj7x=S`}c1=>i(y!i+LI^OV#cHm8{cfIWRc$-UhacVK@CpGm)N4Buq zT~h4vHh@VK$A=yEB^VGN0)p&zN0wg4nSK}mHNE2P_E;|;dt6q$x$ZtL*WtsCu(0_K zdu-FX4y=Yt=mZ$s08tis#U}-LM+1#i-8~41Z5W|fP(UpoVCRT))1gnQ4U_stC2y~u zae|{JH|eMbW9Dq(UcG(fwd>Z7v9S%nM@0ctY(8^TY2fE_$q+!$=5oCuZ>%etQ(e-R zEj9I4FS3{MfnA&`uRZrEy23kjQg&ZU9iJ$hEehSvboXuEEg*c#zQr%!o$)za+l_X0F@; z&F%L@d5`UJ`(0lDnOCB8R?axN^1d9nF3EeqeLFsGJl%M^=K)iq=cRO>a;v1`KO=+-p2@VC1-{$5#!8E z07uBqSPwp*anldqZO#b+)Ds-rCj%#euOGOgcL2CkKwu{a8uZZYE_!c7M3mEkO_2bu z=H=C3C0M4@d6Q*(rx-$|?=sJM|LA z$;F&WNd#2xLcejj>&ZRWYJUlRNuScUj3Hymm@;+?f{cX{gyN?2L_C*&C1Sqt1$3=% z_>0HiN$0-4UO=0CqihaoG#~W$!hG_LgWTfGn(2$PI3U0gFy9eaH#|HexrQUqKQ_vF zE!tkEZg`XUr28B=VPl<3dN^Y3c3(%*eEZ_~B@OJ!zQs%G?T>Z@_$D~Qo7j^RX}&8t zJ{1C(Z!~s@9x%cOHy3!|B`i=bcuJ!183eI#}47)kA;x>984u2eg`Csm7#p&HRKRHxfRRJ&^o1$FC9(cSw}-JUU2zfTM` z?mwQI_a8)Ed-tU#_l}^Z_m7~^A!Dieuu0S;CZ5_oGLIrA&!bK=7g6uty=lOMV`%u8 zu{3@9bec0~4*3tyq}mUqQQep{YA`m9YQ|(z;|cgZA(QG)%A~eald1hv$rL#&nR+Z- zO6_Bxqpk~t? z)N+xNdM;W{GoH57%xCNr_|#FV6MK~E&pk?w;_|3rd_FZz$fG+FzNRV(2DM3a(!I8H znw4m$h0ogQ=@dK7UAmeU*;muk%Qw=1H9P6vwQo@Kq@&b&SsvY;l1EJ!=TnQNC#d~% zc@(uWk2qXFCU=z*PiH1hSM6!X?Gdf>GWsrSnlXuxZq(de8nXwreB^uYeF zsMnrr)DP`P?l9=#SJ8gILH(Qt-G9)aA#WKpEZd;5hZH@I=PCFWi!u-2pFWJ=$3CH$ zcm6?xbJ6zXbsF}bqKA$t8hy&3@gFF9^!Qga?SsG4<0lnOKA~v#JBs3uqOXr{(v**{ z(~R>4H0dLQ9{*I))Grjx{qj1^JE!QGFBQ$Wg!*3@6n90@{BP0jJA)FgDO$Q}HOfY^ zZ`er5>tChi8M|rC%e!gq&fT~TdaPAN(QteXIT>IFsVA1PXMUeN}WH}WpiTPH5l z{?q>;#|KyF(7CI${bNP1e4=PKVBhz-K?iYP@|~jPR~2mr{EKfWT3w)M+t-S=|A>0u zD{}r#(O%SX0;gB;Z68XuOVPXMuh6lJS19*_LB}tBOK1LmmEOB-(6O%#%KbsnslO{a zgZ4*%!gG!EdvY7iW}tF>r-`Z5@k z;mKP-4VyA7?Z%B`-k!6R?Q)$-Sfm?REj)n2RAGeCr4V^jeV6M}Qet9-@-82rw!@}O z0S@&oh_K$L3SH}xlFHWiDZScaYU6Gc93|4E;Z3ay3(u`um6YVsy-$VG>OQDHWy;2a zf|hQSPZYYgq^GZ1HEGiL@#Dsg8!}`FuzqULpn(Gi4!|{3=622{830#J3M?u7Bwems z{m+Px?`{6VFm18m)23m7TBwXGrle%&mMs{eVugxUlNs>|W_^JwT+h{lf`U;}8=`;7 zcQ2v-mh^@V8#cgIr$L?AgoKH8?y#<2vV2pgoh|qbm0MGdl9F>Hxx^?R+SNkqc zCnP)`7S^s^ySs5c0209v>kA5MQ0o@d$|!kj>(;GkP!X32(88p|drPqiH)-k_nV}Zd zXrxiHXAc@|eM#!eRiVPdq@>}c^&?CgnRB^d1c4JAHokj(&z^1Dwr=g&vuBSU0IFNJ z=hKs(=-OT`z%)@v1Y=w%$dMIz&$#+J8eoW^Mh$}+HUic_+l@KU?+r4Xj}~VN-j(Tj zPochUVM1g6Erq5+h3-O#^XJd|(1rTmbi^pyw@g5^{Bok;lg6zieFUV0=}3}rM{8|Xko_)kw9Fp#+LLgtEyC} zP&Wybn}{LSxLlY|td~;XX6?(;4g4!sY_bhg^^(~l1z0pqw;Jqnxv*YB530yvHrUss zQpL(I%H(d-E&2eDK0>+DFMbHgmf<}fEoJ136%y7?nC|N=4$NO?2qYMu1S4M`nkeFYd>NWV}Ng* z7{cLrxiT6g>$!TpIo2)&cuR{Nt`c-_9tGYo9B?rdKxq+;`c+?+24m5?ug#pQm%b}0 zZ0z3dfaxIfk75J7;&}5;X)tzoW@x2K6)Q%*E_1u}rN5RGW^3T}pBChGn)&;$zm^u6 z{%BCCa%De1ze>T@RDD!ZlJCh6y{N`d7~yN(;yK*_3*i^MTW0F@J%1}H`KKqpl|gEu zf%--_$h=EN@T(O18qnDH`rabL_-9#uE)8k`B>oXC0M&C3KKS66%&dKmefzSmmKa9< z&(8}8??9TB)xwxf07BU2@@4xv*&(&Ao7b(;}32mXg26AY&LJNie zi+}vF7JaAnG!KGMTKkzH(H7d8!3P_Ds2ade|{*jTbeoG!e3ktM! z7J0_?>+*(Kr*(_!-Z0CSFVFn1-3pTgy)jqj%Hw`XenXeMCU-21`>t&YpqT%R-OAEa zE6AYMCF^aiIoJ_Zu2O{p0|Tjcox0SxF?c|&5UO}b2=vwvs@k|U^wtmx2x>~Tnzx}U zq1~xktM1TSBdAeS7it|AN$omBQW*5r4jnpB<8FPaR+kux>V6OTcAKO1(?eA~T>V8juYC3ovRqH*6YWAB$f&J%Dy+L!RbgFbp>@SJ=>~+7bD*mKh<=!QpW)N4m*jN?NZo&7o8yY~m`16^|P zE`xgQgAV8r9Z*pWo*&AFPIp+*6K@za8D+ZYfzSaLpgfaf(9}~GX;3ce9KT5qLcjCW z0Vj&S2ivoboV<)A)xD$HaPQtN5 zoA>9NdYm(#UWNYl`uq9x#?gG*f8sPb^7AP%PtmgX3|fM5*5nzq=_H<^ziohSwi&wH z`iqLTKp%Y#?+%{3PKR)R9(tG^`qU=qm!hYwxDH+IUy3sR37rnQ+CJ!PZ{dCrdY2P= z)?VmnIncY_y>OjQeRG4}0qpOgZQfrMoq#TP8amzC?{Cm?^l=jP&Rx4fXRk4RDmof| z|ALO@-W~s6-rLj$qw=Y3N(;BofasXDTDEQ5q85&|pH+E|sFCf(y?fu<`_@}8+8Pnz zg~!#L8m8{uyE*oW;loEiwPDMa6%DDm$LEUP{rB!&I~oeb0}l)yJb3u*EnE6~S1hei z(I<8P<|jrD8#c7G#`-NQeB2e9d#CMRJ7(0#kt3`c=wk3wTUL0RLp(>%?q4@<+?d;H z#BS+t0oic>3lIPN`{4C^>k0&IXx081Qy%v7^Y!z+b=4a(_@OP&i(us)n!Rb-)G5AY zE7Sujv-dWV^M85vqIuJ%b?VfiQ$$3!QKLGB$<=-6kfAYqZPNXlyBEa8O+#}GP-onj zYI=~yBZdtfy7@(FQ@eKdwuPwBxpU`EojUa#Kdxg$L`3`W9wUJ4ti82r`?NZ^F@E8~ z1rW1v)fqpbx^5pdYUGF!llQjtp}P-4s9qS~rAwF2U34FvIz@Dd=rv~4sFCCLwIynI zaEXZNW_$SyIQ;yAWxhu5ZA(6_a$b_}P?yjJdN2X$J%0SSF;DJqMT*ZYW@4{3j*E$1mKJ{j5bF&AnGkh3(s$`TJL?;^#j=M%k8~X3-Z> zMW5A&oIB9PeE}Hbk)?|lC+*HoFQrdZ@J>E-=ylW(IF>El{_4Sl$sY6#5Gi!^p+n9+ zJ9oUi^A*RzgXv}Whu%)1_5+6w9m+YBlVuOReSZNB>`(97t=qM0UAw&fsWB~YfB(Pb zcd+CXPg&GMPVos0p$aG>msDxc4Dtv{^Kh!&x&t-n5KUp>?I}F68?}$_Mjg9!qo}Uk zsA7u&)TncBsvq5#?&{W${5!;GJ9^E|F?2_Fkx}|lbdP>?XYUwlbdSg=1F3Vbe$>5h zKWfrHhC&C&P}RP1RP(+#sxv5#8Vrl0@P{W;&wKjOGG&O!ji&q%A+iJP!rgH04}J9*_1p@%;O%R4FV6mfIYo5e0aGqm zcmUsFM->~e$N=LZ4~&FObrjCzG5PrYmlACgp8DZcn*Pa;6#Ma4H23pwXyU1B^f+wB zkDe)@i61I@yMC(ie`APXEoId-F% zPW)6%@8kKjtC)@zmurXBd*Ofo{12RgX3$b9H**6%wZW5d0|(BVR%fby(=2R$zv#%0 z9lFj6lPXgmpWUl_x6blrKp1K?i0|t*ZFZPdhnme8b06%4ty|Wr)i|=}lg%nG9Xbf# z+qc4>ZqW-WS6w`Ac)fb{TA)r)kM6NmsxF>5&fUIuuQ^pKFP}6qJZRkTLH7nl^z9R0 zx!KG`lOC#g&$w}ID)sL_WO_4du;Q^tL++Y5HlX>?K}ih&&y?hZQGWFU0!EK}=5c|z z*_0KDF>UW2`Sh|WCQ4JA&Rns~wqj-j6CbHkxmq;~-#^!H8HCQ^`z)PG{qxWIBODtN zAdN*?g>n$(BFc3XQE#Qlv%HgUQfDlRwDIKp`1#*@)xl`7D92HXP#8rRh?L*+EN!H% z^dWuyw_GVHDGjPuubz&kkN%w2kks@ls;}qpVBv;|0CD8-+t>icI?=Abp8{HjLF{K-l}c;DA(-8D_w6K zzwCPVl2Xv?_?<6rl_PjQa&+5_5Ni;y?0rucP}dz_@y{LSDbmuP)iRR3O-NHIBBT2KQolzk$cfl zxfhhmmFEkF+Pv?StM9-OH>FQ^|1y@0`DY*i3;1x%k?cP`PaQhP&^TKLN0Gp=J_D@IZ8V$R|7R$+kqu5?2o4naW{sH=kt0!1P>+a5optRC~G}b z^(COI#h@z>JldogYSRhBq$$wVzSI9GYSA`A!vHvne=jY`zOm??8wWQlJoL%cqLbe$ zKK?hwh%w-HTMTZs+29tK`{o-BZo0u>jmH{;Vbf#CJ81rN}bLM)0pZ1Jj>KugwsPy*Yp@m7n!Yu>)-xwQqS|DiY^<+;;}BVREXc2I7= z-QY0bara9Gw|Nn3@q)n`j|_vG$$AJLYYh&P^#Dx)4+b8r@sK@kt%u&@SP#!VF6#k2 zgsynj+eYcRA$uA$q~Wq)#Lu#qb@s{Gq$0cYaQ)?~GEQGr>dh~e>i)XHopu{4YL~&j zb%Rxbv<|p?0t`O9;!|ClJ2_Ls;%+31RPA@@(Gax$>|~p)29J zswVcjoFOu#sl0RAk_lMOkymq17k==a;*Ij2ra&`#ME#+179EOJfoi7a~=QQ9HIucktWj>JswLG)?NWSaCADK^FRs2w{ z;(HG$zQ>`s59kqgeGY#vkHePdF=E!ZZE_yBc{Yz*Ez9GUOY%5$@lkG`l*fpLW5l2_ z_PFL%h)-k0$#KK^N4degql~yYt~ci>*PV5g5l6>&%sk47sbj>?{ft*N0WWr*hdc$j z>czKDdCE%yvs@yBiyW)MI!3w9UQ_Dqk4hotiU%H6>i!(1?#l)qPD9<}Ft~EPVC7d@ zLipBtU@bi8s`aWX3VU356(c4PbaZQvnCs!DEB87CtALnHMqJ*{c-8y^h9z5}KgfIn zs|B-L_YhfJJ-vLT>!a&{A2=Z9jfa3|4$f6-;335(9)SN&>@z9Ap>jRI?}3XaUERIr ziUO}v!mAL&sNt_v?jCpJ5v*#B&J^6a`b_7(k&Z`tZTt9FgHXIT}bn$ z!=GGneGIoRV$*m;p5o!}D<1lu;s@SQ3_MuyK-?$8cExx0is5=aV;HfZT(?II*XbU^ zuy5&7yITw+mXSMJJQs114Eq-cbc$iblj>4EDuxkXT3V`hL_bsan><&}Ka1yTxe7d2 zz4r zO;atVrZM73Rr4p(RI|s^xanhQD&)~L75qpVBfe6(c`jl&Rm1UVs=>H4u0J+S-8m*r z!T-mITU980$H+8=I97!?(lYXhC08lPRgBn41%Ht)9y*Y~E;^}tVB~1mC;wzV2OJOs zsm9{W8huLRq2N#B2Q54h)2phKmXKTYbSIuYXeny*6{UIZYdGH)IW3-5mPfhymiyd5 z+$~#jm4aNwmRzMo9zmR`$m?2W?>}s`n}!7TizqyQX-eUzh?V%@hT_LQQvC24#pAGM zu>A=htk(m0_%{eKOZ^b8;#mZKkAgT??y=WkIXe)Ki+wKpyKJdcNAS5-5HtLXa#d5D z=LaEEK=0t`@hKvk3e5}bS~p4Gw#)Td0W)GP)uWjINx%X2NcHdsN?CZQ80_ixv(pq} zja67|nnK($-~CjYYC9uMwVs~F@cF8iLR(YP7;&`~E`B3C4Q_jU%w(YD^0)O&`UGDi8*h^5ka_}&;L5oojWDQP|%K@zx?&DachKABtS1LNg$% zn{t&(J)xB7PU~Jhtuxt8R z{qio?dBFc3_|J66Y)?W4p9-C5^5<9&!2>h}+cw}2R#i(2aA^R!1*NKn-+cDhIJo!u zZF?MNhnyL=&W>AWVDQw<+;OL&V6#`@BIj;}&J0;y%ek8kwFA17z;D}FhJIuZsJLfS z3cqkMfBY|{=3t-0KhM*_N2fu40v;@QAWoYRQ?3T@$WsGf&Qpjn=li$jsr$C%Da4%f zJul>`zL|LnG3eYYBTx0*kf#s>&t2E%sV-~s6k_5zdR3l6e7x$In#UcU&r^t(=Wu(T zYPTHkGQVcTDX7R@h5{ZO@v_E4wZnQuY=h1ZxI_nhYLVW*as~_R!h?87%;>@|3Yi55 z8_us;*e5e_ULcNK@L=GV7g&dnZ>qqSVXC@@KUg96LV;Ha&lO&! zgy(`+$r) Y>XdUq%TYgO4cHXU9dHA#S<~VdQF*@~R%N!E}4mkh4SZQ1JaI(VY;t zFM6OZcQq-s;R)J!Efyu8=FDs^1mD z)f++X3T~m0KfvI*!mEVmGI*8Xp?NO+NNU6}rSy6L59D@e_^V(q2p-7yP{>(O_he}~ zS9q=h9t@wA>H@u^6V?MU`bu=!tiN1w^G<7^Ew!bE&u5?{2V!nWq0zMS?cg2Fo zT+kfw;Mt%l;K8ytkcYxG1b(X^ALJIV!r39b3ONug=eV^V3_P@4g}j+EXJD`GUx<9j zBIovVD(;(QaPR#})0E&b+-Yb%R&?38XSMt$XO~-kE0v$yM@6~5L@eM%l)XPGj>lQB z5IUH~1NIY*2WSd=Lm?+bneYc=9fDPh;S=;82d~m+2Y8hN&s7s}jsp*oN0gl7$Qe=9 zgIa)R$vGaZkSBz_VJO7^m~!qx$m<6TSr5TObSJeEyjyfxDeXG^OnwF`+J>$5m;ER5 zU0)V6e}*-9_D9&)unzH86)zCnu^#iVe*}+Nmy7w%_MNy!;}E?L0l}d>Hs^EUxq=4^ zuL93y;kgqrzQ`lvA&(%3=+^lG9FSvV%DL`64mo!KnXbI z2j62|hWw)bNS^xp+ow(!UMj&p03PX(M-#6phVNA^!dh5(s0G+d$nD|Up{)Ts_AubD z*`%35zLCNnH_s02IXTC{bJgQGdyo$XehWPp=bxP8O@}^;J#PFWuR_j{It{qb{J@O3 zuV2&O$-{oaoqF_eA>PUm9P&X&OK&Jnx~@3E#DfJ7>=mwhiN&LQ9^-qASg(@Ekg13{U>( zhL%Te=T(n`S0PsnI-ux*%z2lt76pZ9JG$7_e$##{@XO_CKfk+uM6rp3Qi8{6?CEtk z^;#&<6eIRgVQ=U?KJCOO3i+JM#NpOj$ePp)3027BWaR9LJaS7uw0PAsIMCj5`v&rJ+)Aeg=v?Z1$9$UgI-OW?n3;Cus39l#m4;$MnEQ-X&A9k6_TlGm;+0Q`oD2V_;DsUpScCLXfKWj#vi3Ou(AuL952 z@(AQAUIw{j559j4olo=*(Vag3mok>DT3b-%Pw*ePaS&Sa^xp|@b>yEelyxxog~_8% z6)S!ndmM2y>RF4fEMBGecp~_CD$c>3Sff1D5jp(})R+5t(Bs}?rwgOImD-q<(EIQ8 zxwv8drMv9u+x@45MvS7O!0CI)3Sjg^TPFlV1tXlJcb# z$RlRK{6kJpgsj^>^1sJ_?TM3|)0V7p1MlTL)aQyk2Ze+b4jnz(6>m!^T=&W@*DD7P z6-!ySbC+u&-VKG0Cv~hg?zVFOkH-&SjN31f`NW3(KPrCXb|mmy^oNEhq6@k0kr(mo zwk?%d&+_h|RY&SJM3J`t*2P#oT`)=yc}9ZDzw__RToP!I@8Z7a%5RT+m_+#vsNHw@ z`G50Dl)*jV$(7$8@LrPN9{Bv*`8)1;w&uMBx(`C>iQ=W7FgF4C@n63r{VN6~1LY*j zcPJQD7kQR<@=fZLmk@{7fBfpxr;kLJWuj62XmUl-K4;b-q@x&R6bh-b*hl|Ch zFW*p4_=eQYwA$kFk6%}>Uac~6vSvq7_POiD@VS)65=rchlw1_Y z+3UrL={t%L3#{8nTj@jk`XdnJ<>fU)9`aeV;mEGNi(Yc%7fDQw_(_oO!pPHMOP(wFopeg7H^ z0;ANcbw?dzdv<=2*aTmK&7}uyp5nW=;t#aXUi?Sp!jWXgOoU=ykTay$Wi#fYR_!_( zhF_WoStFSzfptetei3qiIN_+`wwPzJ6F0{kOALYdPjvhMd?yk+a623|-17lAs$xE5 zT_kQpV359LjPmHgqBTxP%_tOm5OSUv_Fk6Q42fy5?Cv_Y1o>c$cnl4P_;ADzCGiVZ zOpK0Q(6LEY3<+|(G>yh#Erh15u}YW1+9yTP-Fp|o9-?*w-fplHimmhC9be$6f%u8F z#{~vMSu|O6+uoG@tzZi%LcSFvCr#VPV6QCo4Y~b6W;}$%6o`NHR*`rI&w{)|M$Vv) zt&vy`w;)@U)KJqyAdbsDry)MYh{MlZ43H(cVsKu-GSt9zR_((Ir z-^3OvK1K0U!?rEHH-=A_L*aXaKi8a(NAY{^tEL?udjvU}jDKf{;lE|^-_{wWeYcFf zOul`uAiq&!6Isp>;IGfI;bSKhi;r^&=-%z$6gb4@WBP1v^EbiABtA2-rNfuZ)mnDf zbXrQIpc9!3uGmklGA~Z75qLJ~SoB2+bI0<)L8hpSUh2P?Ruegtio6Z@jTfjnDAzAZ=2OXCi6(>P*I8pBV^@Y9NqR?i1~{|x^uw{X)4 zeE#tFGjefRVynbgBk^HEtH^t0IadaaoZz1SlWk#35g!xsLreWju-9rh#IMxsfpOZO z6f$VMwl$00U(@Jqd!_$@LPn0W_8&E$vYN%luW1B+3JnKn6*;ZiS0wR|7X4+&UO*|`9b9}8;^(q_b&T9&?T@I{ye&`oz@>c<+BWIASKbHD+;pnc_m13S*y)vy4Jw5L zw7Lg0j$BvI{ipd)`t}_~7hzLH?rf<&evawiVdN_7@x>=HXiJW^zl$IJ_Pv5UX}w?k z8#ZU;9hZ!$$76#HcWA_l(>r z@y#*vr5QGF-j#d$_Vb6_=WmzZy^F-IdK~u1#bVbMJCOwkaMT zw66;sfF1vKTB%JPx%rG-c1C_X-_a^u(?^Y<=I|pQ)xH_GpG@}3dhDf-5P!5JJ)>Ot zLl(d-e<3r+fc*yZfS3Wy!!qz?v7KpO#Shp|u?ue5VLfcH0k9_{uU^L($ewk_7i3}| zeT?>d-penl{44U8z~GiYYuBlxVYm!?%Sq5A^2bfvF#1XO(O~5AGyc5-Z4<5;+>Ar+ z8OX@FFZCfl34Dl0Rj9x!m%%%!90j*s#RTgB*1e4$GEk z&d1O9$};d!o&xAoO6-q~0$*`t>VX^YV@&(=IZng@Gx+%}{&iYnfGrE5LdS%en#>j4ci;-Je zf_zaGkGK!fS&>7kp5J<)q(hg!#ZpJ=dUhheJ9X}SWYP1RijixokTa`wFVVY1$B>wP z$z?%qs+ym&skl?8&PP1^kUkUAHWedpRm)|Fv6t9-of{xI0isijJ}v!--WZ2Iq>aEJ zI7Rp9Tl~rer4av6R^D{$LLNGh^n<)u)v;^eV)tBadLz38Ik^&ZtL0aT=M*^}dB%*K zW0qJ=!%8P8L@ut9 zb!pcz>Lzk-CH79AO%kJq_%vOR^Q`Y~c#t2hb#BqOk?YHCu)c^PzKMKY9S0!(f6wvD zdlubU^k(D-bDQ>2HwAv=_3D@vIX96*%`y)1m&H%5&uZj9>vzbjX3;$nBg4oeR{m%! zbFj^kU4mRrH{i0}nO%bXXoZ|;5JV*|?zf|VK)Qb^mG@Bg3O69eL_?|Z%XyWjV_M<-|Z?97>GW}aRU@sO(G z@9&L!C7FJU$T|`6^>uweS3yMKnYXv=dvgzwU#bfF3;I`)O*KSnRAYbl_bMVE-ogH^ z@6#)bOl)NJ_mxdeMfTrg^~ZPgn>pC(?<>NyG>8R;3R_$khMhP$VBBqk=>qodO^9m(Y;NKUqI$w*7z zn)pF_n#193jkvAQk(L$}ZBI*0OT&n=H{mTw(TRy$@qhG|bVs49e?%2@Pvi*nPfd?b zbHutpiYZLO<1LtZOGav1M!Msg8Q_`hNb~mg@bD0Ck4oPDmFK59{P6={;}Ac5@~;3$ zJSwI~7n&E@3hjx065`=2-oZ7!rEXe=!_F5aJCYnWTWVC4J#kiaRBD&#=nW1$_RtQ8 z-N!?Ge9}^VfHrkA($XB>lcb7v*zr3iu*ZwH_*RUL-dc#g;Iy{79Y@URI6tkfXI-Dr zwA55btVCcF9FC5&<^%?&CC&;B4XulnJK{VeVhS;@H{KwQH2$rM&B)C46g+o0JSs?S zZ+kp`u30xNEo}n;#fdl^QBhH|qSE-MV_{u(ZozLw)wQEIf0ibxE zj1$Luxs+gE@#TBWbM~(=qPAb}$`w4Y3{S#?{xOAxg~`|mn=Q(Y?XaiWIIl;9O%rpx z>*9~iZuj;{OvGu#-x6_~HWO6DZe*s}ygifb(MgVMPr-BGRDhquk@>abg9@HecoFsi zxWfq|yloDwJI=daT2fjx_pKtIJ7RCChY9SlmFf`(3PJRej0p;J{Q7g^6o0(LmT530 z20s7=2#~`&I0*>j$iX5bs_;dHbp(&&d}}#uNseT5?w%m09qI|9bTIca8RN-OBy-9CjU_(fSNt%{99l_P!xMXA6!P_dPs1 z++#^9xbs!`qj--IDdoMVh&i%`A{d5&zunL9yQjz=-m#<`@3DLiC~v&;@!xsH@?|%f zXAhs>1g%@N^kzJrZNrGfjUnLY8WQfMQm2YYkGVxEW?2ROo(Xt1v|dlk$}F6-gp?Ju6` zAQ5y=GH=1N`5Q2xp~EpMYL+cAGICaGT0Ggc4Kly(DiNRP#A^}(?i2`~m=KuS5i@vt z7J@5yNYpzX;*pq`>ZaH~5?W;IkN0cYfN22u~0! zeg}sQos|}y>#un zxnE?2h1Y5~1_*A3Q-vgtWsrOF0_P*I)Nw#dUR5NJJ>tsF3(un>eZ}3KT_QzB@eZ8J zzD?^`4-I^c0q*uBI%b1X&j6A=KvlL_prF;{PcEw;?|a#{^!p20!v0Z)k~zd`$>%le&tIfi4o zPyT3=(5T;<3;J%^#rL`2S+QazsZ^eZ`@XSIe>_11eWhk? zU#U~iPwL(2CwJEOlll$t`L1U8+*BIe-Bju~>>zjhHWfcVKWWssnKW+FOqw=rihE0G zac^7kZR{`iv}iA_T6d5p&AUtMwwH+&^@j3>Z97hL0E}BS(#vF=NNesBtr8 z_^2mk;*@#v_~Vbuq-pbH_UzfxrrT2S@3B-G1+0{NyRMReUQ4A*U%PbcZJ4Ki{1Gcx6oB$@f7T_R^Mky%j=nPp3s*=W%Vk|k=vT8UnmB7MSMlR@L&lwRRm zrSIr%(tq4G88z)K89V(g8Ts&b88>5xJow}enLc-?JQlrEA{XwG&Lh5**7u(i{~_lj zV8l7;GV;81A9G#?PS_)3o;W2B&ORm&&izUrjy@qXV~)#|xnE1K2^XaAqzf`|>O~nc z{i1|Ec1cD>T#|9KF3F^*%QAJ|WtqO{vMgNks?1%yOXel)mYBpn@9eC2_?jNm{u{(w^NW8P9E#mtNj1n>L}nzFR)rvQxHX?v$$s6w;ly^Qj zARlZyCfj!%mRH{VN?v>S8`-k`xNO_?nY^>*Yk7C;X?cJ9Y1z8_w8XFeS>o5`$kMbN zNqYLKJhSNsNq+9CtbQR^(q74xjMsAI!<|1!=I&qQ?X4H(xi|CV#dq`M)erLJjjj3e z?#=?)x#zI#-1og??)gQw?Yk@=?ztx0{^OeL`t+LY{G<@~LfQM#VL5#Gi0t|3xP126 z7qWN%89Dm-Ir;MBS^4fCKgefaU6ilBJ}-L@T$TSgTqp;Q7s}x;isZe7;1^UoMrb>{7|ib4o#>Q;Lh7W$d8b zhdu$dD}fEw4(LDKKH|WMQV4S{K~7FUY^|Dhu_! zC%LXGD>rNZG+#V2FZum|06gllBQGy6H#h6#v12FBVn9~bwm>}QPd8q8OLO+lJ9Q{2 zA%6b6dGnX1pTK~uZTH-Kib~Js=jZ1hTWepMkdQE+BW$*W17|T}+RY%Ux2qsO@5I_= z%j_JmB!0dbV4HVzOXB0_aSB@kpxS@;bpt%5-mgUk zU#F+8U5oz9pj}`+^a7LEyduq|&~kq7xbG%>ayW4FF888KRbFWo@rm zewUsrDmruE00yLE1`cr8mo6npW)V?QnBigT?KqF-#l?BY4ju4vUsbAjng6P|t^rsC z)^Lye;BekQ6&Ia2bm)-P-OJt4+$vXQ|0UQY5rZ0)q(^Z{?y+OXj+FK1>#Ym@=h^1j z4rb*BS(x!tN%0BvKQ?Ff>{+uSBO@asu&)ajJoZ>v*a%#6x$5|{S=-GD8cE}llH3y~ zFv6>vwSvWKmp|&BqjKeeI6B+BgIQU=VzB+W(vs6B*}vLv{ZrRI>IMn@6L{7Mzzf$F zohvQ+`XmON@b_=y-=;OLmMha!Bk$$a?B1qLhXb83;AHN{=-)?bJ4^FUpE`*V6DCX; zJ9g}t(W6JNTb~{?WXRybg9i2Qe_xovzj+y1+4ZDPfCM{Bb5EZ>_4UaUfX5Bd%8d0h zy{tnR3jD*#IkI!ROF(UT+F6=)76VS5tme9~=+y@@o^bc~sxs6d>=GQoWC165%~=AJ zJ%a(0CQSlJ1nSd+2jWJJ8s!3M0g(gPaWeZABHf$L;@qsWnBr6rt~PD`{ry|}bJh3q zKU|Lho!I|Gb|yFIEoX6db}j~-A^fa!mwVFnyO`T+V*%*b#J zIGgtgw?|~7*2P6;K=u@$>OL=>;#r?K@#XR3ZEy4PT4l&IZEZ$g!E_p+O{9s|&f;PW z$j{#DQ~lQNI0>K=25dq128RwFFf*LY&ui?$XZca9V$M*IpVJT%Y|lD{3o}drI*mDU z=nw|1$Ln{wzyUpCf)dV9koREq>OQ@2bQo~*a7`bt+de!7!akUhajKx8yNez{#6N3Y z>KgD%Js%&R_p{EP#em+`ynNb|P7fVCc(j18cZq^Z5&(Oo1OqU|WK7U_KL(t6sv1t? zy)V)K$dM!2MFlM^atBy103yy%RB*9*Z6BYzU;M}35Fg;ic&z#uPU38F!3G!f{0n{v zh|GZEf_-;jhUx(8R-bA?+$J2|nWEx-fTC=KCoEd6RcR?eD%yzw7*V}?weDZIP9m$g z_}B9Mmg5@HC*vBhuVd}n=w3VIAE!yCrwWRTFG54V;kpALVG6T|*Pngpp$#7cW6z#G zlUGtw^3(6-MFpvZMROJA=<@R^_Oi0_OG-*hp1YYm0%Znp3NuF$kRvazpt!WuS^5)9 z1^oECi^~uGkt4KnI!l~RCvK%b^uXiacILWKoVLlvYaF0W?{gcQ;L**XagB591HsR1 ze(SBxPY2iL(|@85@aHDi`7|orpnkB&@2)-_Yh!)TXI$uY{qO(lx59paZS3K;l)Ind zcWhfW@8$e(u*qSS|K_h#{2pUmR)2%v%5A5X$Cz?Dps}bn7`#TKK!{%MM+_rCzfca%b}y(zM-U(!9gt#^X) zC5He$Cu0F zPd+7&M5al^oD>;2`g!Ry@(mgKz?%{_`30Hy*n9HGtXHJXVAy*@&q>D-=cRKv?LC)0 zH^A6)mt@$ZE_;r)++^EjiCMf-=EbJLp4%j|e;KZ;q@$I zTdjS`Wm`S{TAn-)durp`dGhAg0(pOTf$ZA%t?b%=Sw4UbmHE*%*|DE?6zr#cN96F4 zqq6_VW!ZnUP!4^TEeAd;l%rqKKB8SzZ0w>_KNQQa=X2z8R*wAeOR1c@SSpvUz%I&h z%2n7!*9w&s6&b81X8-T?KX3ZbSgXZNL2Cg4QL|~wmQ8DlRQO$&M@8yRU6#Cp zSNwx@MDU>8eSqSe8#!jr3F$B!Gs4#S5+cfNnnz=7kFW>)YsZ+KKD ztz9yAg4JP|yTgPPBi%sOU6*XLO}zg10RsmvO1honTgdEnG4pLzdC@lV^t{FMmRlMO z8Z>0ZO#CPn{MMx`S~TDM%nqKW!`(0`Y%A(es6LdsBzDoFpw5ATojQh$32WcB4Q!PT zLk15Tw&Fp)e)Zb8*w{tp{Z;QAH>Nt@;CVNpj9n%zYSl_jNmvpa+pSwrP+(xc@#DJs zw{6?DO#qiMcSX%w74Jz;NrF{d)r)VqYvRP)444hMRby5(tthS1latV)XAi!?1w}i5 z|32KR5i42>eotAkBFS!y0@q9U0^cxn2u*G&6xdTRCHKeqw*c` z_Jqf4c-1D9wiT=D@>d|iWXymL;gu`j{$TGKmAxJ#lnJXQx$(oVLSjZb-_Wu$E-$Z9 zOX3zSN?JSHjb8%%OvDs$8a!~jmsg`l>`UVkR;E5#hM(wAVKQukR4l`6)l(^{sgug# zH>22ocm=>%yK2?ib?K>&y4TSMfUF>XGuEIBTnB4r0I{#9FD!%fS?iuwty*8nk_o~%hI!O(;PExaWBlyUhz(?Ljnl*1PZQHh!w*Kv;UAuPT z-!4%6+Xun#-BrBr=qq?DhfaN@Q|CSs)UA(n>yFlAp!mW!-lSES z+}kcp+H?$;_MO9}BmCik-NGfP$4F_|>IrGqK0;arMo5S5kC>k# z^p{c6um30+J@z3PF=mlWpFUmgAC)ZOlh(<+m~`nsdb5m}{JMlb_yKf_59P5rFB`q0 z{jhV=Da@@~jJ+UJ=X`2>#{H*UG(O|O4_}lKGcFmwarjJ^&v;67mduY$mzX7KG6VX> z%=jxZhq}cImu?Z4utx05)=Scg3`t&@A?fMql9BO@q^x^iR;O=~HS4#)|GPytypSnx zytPfvrfH`;ZLrizKYeGCIVvjH{BoAy-yDe^sbMWI%s-W;5FB@X5Y) zPTt;@B`>_4FE78B@AA)P=E~dK+4AL`9WMQ1>)!M7;obt{pWV4X-}q?v9r#r~J$yzE zAOBH4I#ekCam1}xoP@9S`(pX-Oo^QOp#=IwvHWtOR4!a9HhRSc`dgt_WM3_Y&$U?c z3takzg);wp|NnFcT34-Jy=rS~al`6_M^2eCBlPxR=1J?pPY&qSJ*ac{X?@vc*pQh6 z?hEPFy<1SHfql`V>HJBRD_6wjaa-qUw@d3$Gp9AEU%x{;A0NLiy+T`8i;0|p9|QdG zr+d)Msx@M4kiAk8bW-54%*WQKOpc$G5G?(#5Ogzzxxllbpy2V zXh;u`9cZV~a?lWVHjSV8jK8rD`*KWq&X2GEtrrf70eLxqR*a_6Xt1#TmCqc*v3v*L z_1|(K8}F_fHEOKJWLMFygA=mRIdJe;=M%H+3UNOtVty*^nQhwf)F$WSk#^O8&{$`E z^uf6DYvenw@|}D)KL3|o=gyt0GJgE{`FMFA8t2p%DpXKy{5v~s3sMwfgbMbhK6av5 zAN{IWBOa#@vwcyd51}3W9PP6r4O>(ruBZ^-Rjt|tIz8|X>wSDT=iprU{I^}1nVGF` zzy0M~n2^+Y1!rrdq!#Prtr3 zUqRj}*BS~H)}Rg?FVdeLFI0%9s*rx+PQKH6Kj-3{f5!si;^IQF&!j)|{!X2HI^TTn zkUH^QvHI$}VvRVbSp#CJ8ggGfI4?`V&!G{+Rz1dEP+doz*YJU;pivjp@EMo1ZF#oZ z^g%w?pb3qcK?;`jQ^{$R$1Kp^LizgBNw*Nf&kR2^VzFaTj#A(dRYd_PSH( zdEH_7d5u`U?l<|OhQCDbIZ%jm;8~b;=(+RPI;&KzW}QWe8-{;*8SZgrKl~asbs|o# zpx@|kzb{rN{!y%6c|Tu07I#HYm~&Z;ee$vz`NU<7JOPC@sQa-7oPh$2s`o^*2GwoM z1!dL{c3xo(s@>4@8h$FA%XzLtL6<5!ix)Q^Rmdf=&cgYxuEBk7+;`Qgb$fN>^K%OR z9`%p2CHmu|g=+Dd9Q8;{mYTL8OG7VJ6X#x5<7Qpf$Z=4ik6%*ok7?+z3i%IQgARG% zf(jmgLBWrv0j~x9>WxkaJ+*M;?Si-iJp1hk{R0J-PIXnz`hPhAp5T zUYJF?)$m8E@v|?hF_D)w>;?szP{=>ggQi_npb6CnG*L#^qc0e`?g*N|8WdZ_3_rr3PjuQW74x+ag}nNvpaEZYCZTk~!vr`j>o0sLG;4Xnkr4z2-fajk=E&{%_Vt-)6# zw@pN?ql#J%DRn^50;E`!&?3Ts6QEfX6UeyPWY15uNO-V zFQ5!feK}7fPe>tONY}a@@UxjU_-P+=4mgXNznul)zwRsmfBCa;tpV^~cMc6zlTIrw znoy)`(u6(zDr6n>4xB@u`@$_eBCO?gKI(u*pFxh2LVl3``FyE$Iym)M70|J>^I}%1x_G%%9ffS&1R3?>JNb$-_UX-eDjm8^?K-}y7MnQ- zKZ8%#;S$c{Hk<`=;waw~>3ZPUHw|6fO1dbAOE=O)i=b7M*N}DRuak9-^;e<)x%4LL ze1z2vvt@fw7gvePRw=|F6xXnI-!=VuW`QCNfd=&RZ{;cYFZAto{S?<=)^R)FzZoup zE|AZs5WgWW)PpCu;4e?tScgT|poxZtCR%n|byHbK-bMJ?kdtW1G{RgTjkb{CO~_GG zS=mkvp0D5EeNDrcqTkqBpkDsB4YHF60x@&%2o8~w;`-L!R>hObK_|5G=*H%$As2-C<7)$oz&`pwXq zglgnp{wC|7J9RH7>o#ZR8$BHPe1zY?>xP~7oNCm#i8K3ZslJj^YIr91AF(C%&dvh$ z=C%U;+LnC9HH?2SNsXP7q()C#rbbR&rbEXsQ^Ut5D&%(R!J`rt@;udm&_s>AM@3l& zAD2dsrRp)zp^z`CgZkN3=e~B;Da5V=df8RG;H4V5r3yKws%O}4m#mxedszp$qhL$0 z>2fv@VW&;1MvWfl%*l0Xtbz2dcJ9BXu?7XbSW$0yYg>WZyd_^FcUPGPJOVC(9$ffT ztBzke-sGoeEjg(;CuJRSOkFYpbm8K!E*U`{Tb?F5gsi5lqy9&EO&wN2hgGCu$aDpp zNYN%5aQ|3~1_=9UG#$SrQC$W6SvjQ|aXY>DV4>dm$u*7qNWEq6HT~W$tYLeBu6su# zUAJB%tOE`3a}Dlwa4lGat04!~=rS>@ay0T|At%URUCqT`AtQ{OpsXWZ`{|B-R~vaf z40^a*hc$Y32y|HF!$Nl~GIrfe*r$Zq4ZE>TUVLe@6Zw=HzCQIS_8)pC`IbU%r=tF_ z<)do~aZ5dQ#&R{~k>zUA^dvR$p(H(iY8gIh;FAg?K8;(Zk#A~vH}x^(<*NIJCo05< zb;uBh3clZ=5JT48`a4w6eRl1}Cxx6|qr*b~yQvOKT&8WhEP0c)|Af61O(B<7<>f2= z>xELDk&ziV2V?i`{8Krvk9;LeV8mYPlkJLduM=IoBE7EkQuHg#) zXN8!#hA&$A2Zk%sben*1)w)BtYS}(a!&j}E`-iD}+J@<7t-}=Q8Z@my(+c^`di<=* zYINi!Wpr4V{-@kJEcv*ieZ79eHj4)lb~cSXV4YW>^tnr=`m>Wbr>|T#_b11S^uEJ| z#!f%=1bHmw1Y|Xv(K)Dh{2rf>15O=QLx&~4Q-^ig zbA``&c_bB9&>jn1RDtgIoh5T|oD`uC9Sh!0)K5v(P z)V5PSJZGnx3cX`;#11tPdI$2})#yidDCDkdw_T^EKo6hjwoOMt4<8NNj(Z81bmSaE zzr-QJz5`8<89UC2n7=MSqx?edw1%Clp+6ftoqUTr2ze9o#PwbE8{;e*8GL$RTKsjg z?j_2)xAOI~kk{*9&C}~%&ZYiG9ad9^wWsB1)Jc@#6Y3etWSz0=;177nWt*1Sb;zNI zufqk;pdp5T5{C%8kzY-kG;tOdIrX(dry>uct;=(ut^NhZ(YHgN6nsz$x#Oy7vo`8Z z!Vi4v-YZl=)@dW_wiYPreUNqPg}3t*^*^J-zLKlfU=1nHT~)~KhYoA$PJSBo7Dm>= zuG7Y@i@%~Cjm^?-yG}g-nppc{E^$J^U!(7CSmwhc?Bmf4J)b`PgTfjV_^3MLvUwH# z4fK^@?dmho4(OVGDEOR0)t&Vl={o`c-3{+i$hkN28nVvF>&;sVjE~}lck=0DQP5#k z+ADd~VHN5vp#NFAlb=QnMwzTLwyFJ!a@%zZI;^5yhx~lAm&o5Yu)1L;>tJLZXsk@uLI2bADZEJi z4>~MjSUP=Eu12lPb+T@D{AYSGW;K) z4UK@4%`|F2G-Vy-HD%q+bl5SI?bqoXsPECqu&;)CmE8Kb!;4 zppi!XlG+EIgFZpXI@%D1uH7`DP_v>@e`V=^kR44F>SGK|z(=5#KXX+luD`12kBh?^ z7N+DV=v{`Fe0Qc;4ZQyk?MJcfchrxm!-tQm5}ZMCu~L__%^LJC=Svm+DQDmhf-g&b zd!|I8wnaB-dar?>=K#K-P^Uv*Amz1!{->z_QSQ78I8dAAl6OXjZKP4_1-j1F>96D| z@|Ts*=W67SsYLjJ>8~NJqyB~S>36pr`e*jLl=GkH;NV~<;b$v^Jh+rqs)ytu5*Qk|(tZ1z3QQttjvwky;Iwjh5Zn}n? zcqv!Y*Rf*5Rn4=2{MYpTo&K>{ckW_*)1=#*`cH^RZr_mMPpF}CmXs=FI022G%MPANj8ce|i5QlD5@npM8N` zYqJKO3%vqsF#0uoE2If!==!G;g_2Wk-Q{q}k`Z_NHdCml)Z6x50bLiC(Y4#Iqs%aT#`w;Fqo{FHt=s(T{&Uv~ z5Y%+VUJTyx9Nf6Xb0BXeO{mLP3|-ULNSYvBE7Z>^)D~*gC8~J~lNIVOHR=)->H$rB zg8o3zwZU)jCPkY9`jrBIpx#A3p-{UA+%x-5y!n^o7dNcI#E(c1q-o-kg-_tG)VD#~ zrJDZ6-^;q+bXeLQ<#kxM^^+^`bzqD}EhF~) zi0axcxQx#b-~VdN#e(&Z?xgAR@l(pUk&x4FIcIn*bq-5+f(~x@71u+0zXE!pET?@< zK8E~aW%+78+ILtDA2AZ~(@JK40E6K(e->-`BUu0FIeDv__g)vjrp~u=S-@f_w2etgERjN~`&dzfBjFC;8iomiPbi`~l2y z<3*j1I^h3P`5QMb0^g~F*GHo*Wcedc<1_slrS8Vhe6|D4viUg1(%+y%k^3VRAnKS$y^)A+Z55JeIhl%BPKyBUm_5bD-%gM{Z zvxncy!Fz_^%dH37W9oSR?fM;SpSh=KC>j%Av|uz3^9g(7jW7THg(@Q%gO-7I2<;LY zW;KnU`Ha7@5BvTtS4c<*v&)`A%SY3wF;e%o?4VHFqoz)ur=~tUPu)LsBJ|Amsv>@4 zA9vqp++*?eU%xJ1yy%4r+T|E&Vn9LN`YF`ZDAcbQUuRh^5qxOyUzr@D-TN;q)ZQr6 zED;X2V!ng#`d1+MZi2Y4 zgJELk$iFaoFw9$E4h-^-&2!pF^s_U*937M9M7_DbndK%q?L)1O1OYZ|0ORkAe9l!~y1# zFn@uuHRkg$4+gbn%z-icN1T|4vmj2n=PEl2H=PuB>)spoTZ!@0(k- z7W(^W1G#as_y*b}eJj+Qsb4TZZ6@T08~=^*@4J2bCQf8x@XRA{#fRK^5X>Jy+}+h& zxevY?^?@4s@MU<(bJ+OmL5nsyCol4<{9e8L89RZwU-S_(wod}hTcg)tn z;8hL=)Fzr-5`&k+&%w`p)%dF2{DJ(;;;9;SdbHgPebcvyJb2@O7(OmhqxMiEeyRJ9 zNYsoq;oq;(s4;|3-G!5=S=8-=?HaX=x>eVux<%&%joLN(9`poa5zylN?O^Js6ifDFOU;R zFu#$Zw&;Zl_J{F7Gp5A63dUIJ>zp=YxkintW=xWMf%vu#$6ky;EV4Xa;NLRRy@3~u zKcbeEu}6&>RKu$nv$J>=a_LMi?6gPbbABVgQ46aWqhnl!@j2R{jLp$kWX0vIm>go% zuDGrhi!=WE>tk@FQ|?8Z&NEHi&G0J3+$gUYgQLy+&~Ni!nmBQiiBU1Oz?cYgM3|FH zUmfad^`jBXHEL`bqjl}YwBPo^;KdDlVbKWcZyD>*lM!>`yo@)|2hUj3&=F<(f2e)? z4vO{^^K0PG)|9o(8KzukTnV+rCZ+`cl!+%HhGFt1n7=~b8ho7KRg52HY1B2FSY*H9 z%S|2{<3`L?K|Z6&KV!ZQ*N8f23;!}u4W=$#&M`PZxkH~cWiI0?%qu{hG2$tWG-{;v zdpmQCe~B>&@=5wB4X*;fM2)bCvy)CybF5JxY~l@!nGo-o^Fu%Sq2pPKG>`MQ^fir| zV1>F`#+i+8ld%!v1NREG!(}lM)Dr7VZ4u!qHbf2I%Q2?HRT_3 zEht0bw>I$>)FpFn>S>m)n2)+`{391ilMd-Gq2G$~pF9Dz!th78G%%o^+pJ+L{LhTr zBY(p1D%2)x)Q=n7WSkrRX5;s_WGK%azG}0#s3+(A7XQUZqhG2+@Q)J)@?rY+=})GQ zn(-CXjT>KbgS#6;h8!_*Yw{|}Y4R%6ewXnI)OwqoEc%P#w>S9?ga^KQjT&pt&1T6T zvE*;>-XX?6Ph6zWihgbSQi&6&t7hJ*fdRGfde{D}GG2u`ZjCy6F{+x8^kJ$_-vJrjFb$oeCMseWFf-8ugp%AAm&Va@0)h-2h>d9cy964w^?EnrJB*9G51e4066u(*GjFms zbXw}Rf24nMeqNUT&3(wgSs0%pd|1|Az^_aHy}?VvtH4XBvyfL&=cb-#`48#OM$Mj+ z>;5bHw+jN-K5(D#T@xo!w{Q6bwc8(P)@9MhY0wB^BF-BBANC9N{;Ee$gKL`a`m=Rg zb6a=fgBvG}{YC!p^2?i4)|IP0OIQ3`?QgxOVwsx; zzK1{jw?c1#M& zs8cpJ5A$3)b`Eh`dxiR3aRwPmOOnb_^_{ETeAAJOtD`>n=Tz zZyFS?QP-?d-)w9O=AEG~+SE#*&cnzLo^Quafkot{jJ+}rU4H(XeWuPw`mSv4wTV9QNL{FL2a?ocT73H7m+P>PDzJ z2LEpYzQ51tA(S_$!$$s48;yErV>h!72zAkB|9A!=A$^?WpXA}xD^TC9QRj_VbUtE- zSsFFv8ui{rpG3`+S!dU7W#>m3y&kpKh*vmGTnRPL8ujVATaSSn{}!u8ExJY>wXq$M z^8sH%Mj8GPhlq>#w;T5I9n>)>-%&HIQRA&q|E*D5ZRVuhg4{s-`Fi}d-a$A*`t)(4 z#vAdIVnz8#-jBL!h5B!WdiI;r564@Vg_DRGeA5YM%SIf-?>D92Y;eCl@Sn!gr;7Gx Lm(`DBIQIVl%7$JA literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_04_CB/plocky.ico b/src/Ext/Icons_04_CB/plocky.ico new file mode 100644 index 0000000000000000000000000000000000000000..42ead12ffda98c2b298a747feb6bff706d872aa2 GIT binary patch literal 25214 zcmeHv2Y6J~*7hO+5`t*pQdC4k2u-;XBoL}}EGQQhLMWjr1PF;ilteB{5P`v{LldRh zrP#1yC~2Su6;QCD(gIf!!RQdqnK?6)%>3`W=bSJ^uz%nG|Ic#|tl8(B*=6m$)?Rf_ zL~2MKiH(g!SyLw07Fi)8QBi^C(hw0J-bF?Rp4-$AIZ;PYUr;|>He4)nab4CopTk8q zU&i`@=gGB1#zb57qhv!%kq=v2_3?~)X}4PSqhxYTk;Y?0+5iU(A>#nVi&s{lQ1|D4 zWZ_G^$;t{8_{1$BO9~1K@P%Lf7r&o(0Q}=Ceppu+Zo<;7r{5@9Im2elKvAtp20Hco zjd|yEkS>{izdhS)7{)?jTkFcS+w-@1Z8`aVe{hR1zdt|6mY;*m<_{XcZ)6+U*j@_1%lMTqvCq`j-Z;K6yj19@o1{Xzz0bxH@6~o$W zp%N7`#Aa*Wr$%U9AZEu}T*CM9Glox}k?p-bzVq~CER#J;(l7DbZT5_e85uJSTRe&` z`T5y~BP<=WLjUYJ+uK({B_6Z3&kK_|hTU$H*oKh}?6w-srFj^a2{X2%KKj9x?d9jc zxm0`);u-PkY8~G(z9Y!5CSdp5?e@TmM@mhRy4l%AzAaGS9@_Wzu#h3+!a_nr!ciXs z${f}QO4fzxVx>cXCkJQ{hW9`uGE^03YH?n8-#pAP?5GhHpN-}6JHoII26~DMVg2kg zk>PfM_iBSyy!k9MsHd{7%C=^`jw?7mL^4M(iYFq^t@cX%o?QC$m_a!#N z4mxCJqgS9wMA5+2yft3i;u_lQK%aC3-3=fjH88-!&`|Vd1n3@yj{N=^eJ?d^^JFqd zHPCyYBfH%ZIo>uew$B_OALyPP;WEaBgoa6Lc5m?^_a*iN1V^ndej8>T=tiUqF!dYh zEnBwsgLr3mOihdooH8=GQbGHIYZ18k8f#E>p(kGGDWw;xiZWZE*K^G;t19)q+1LV_KfA?Dro9mXt*%U{74ddk0w^WdTWtG7EB$CHumM zkL4VZ3YNV@)aJfQ1kKR!YT)Gfw^whI$G6vsjCp1-8n1p3y#8z=mxWr?JLUm-B-)H&_$TmB70KRrr4`ys+1 zx3RmsR8Ao zt}uzGNSG(8HD2L;21J4N$R>CbsO)!K;`e9O@Pl9HfOmV59Ua)IN71YRR3K!51uc-@ zxU70C3(WRM(HHw<-yDNuaZHX)K92-M0W3bx!u|QLEHXD4J5b;gx4)Cm!@@!_ZLl_I zfkqkN;rt8EoLJT+kLNE8NS;875w z0K;Ta-T*FiS>LlR+psOyDHbpeK>Jo*uy?C2_Gk84vt~`HTeq%6Ty&Att5;9i$d^Pn zm->K4fXe{QqNAl*%a(Fwo7U32IqZy9t)x|J+_z~XE!(!0wuIRB(z-(jiRm0C?XW@r z*(pvs06KN*B-eH6BAvQ-llbeem#*Er%e8%aOZR^LkI#1|=j&pHU-Z0AS$QB)Jjg;1Ph)qh#=yF>)L369Bi5Ns^&}5x5_P_oD%~ zPP|j@m@r=Mn0>#brl!iB)2GY$jG2=9-~)2+z4yxCrH{#NOCOhEfDwQszzxr=lA8g8 z0g2D7mb+{VmV_-EG0^regCK0v~=t0n2# zHIkI`mSnDbLGIc3l1zE;ZAsm>Su(c0C$j((b`{D*z|>tkBn^=I=|?ha*G_p5F#D4a zWhS1}P8^XGpDw9@>6NUc(v_p=2-BOHq-vds0-1393Qpy0Q0lLp8Za^jAFI?SQ)vF1cwO*_4zoQel z$iY{$;D=w__d>rS_2X`xyI{ebTjT2Ssb(*Jp7&zyW;6Gd@+v7UDJk7I^K!gWo&2&v zE4+$ZTUuI%%0~(dkCdou?X`H#uc}|@CF+^7va-_RytmS(O`A4#>ZY8XY_cZm{6o~t zVC|jnY}%BTmWl>wF(oax7%gU=52FSzqWaEv-g;{j8bI=}#gr*irsbl+3-zmGBbOg2 zbCl%1gZgZ+X;W2$DQUp!izeqZs3i>!I2=cEa^6u5-rDpg>Yr_aA-!(mltkb zwbf1S@Y?DcfF__ulu0v-qT8+MM#`qPYFO^73NT-?_66t^iK!b2g7AZk%uU zfHXGPRJBB3l{<=$6dyUV^J?pgc`YYrQcO%V|3yb9f}zmhNa?3QsJk>MFE1-b^&>lP z$2DZgkpBJqzn+`3v|qn|ebjX)IWP?~F0C)!TSpp4-a9Wx5`ImFJ=1*E`2t(;pH zEr3fsh0$3;kO;%c&H6CX<(zVZK;T)CWJKLFqbRb2CXnaubSy?@hSLBDP24!vP)v5n2h+z&f0;Cw3 zm#126E-Bs5v`745G7@fxWInIe#ZbD0YiM*00!nt60fAV2da1FK4OD1$NT1fN2^xm z0BCVby*l-x_Mt&>7PzDSb0#Uu91cje07Cej%?4_SQ&GU^^0@~-yB-be3<_+doh6R) z%&N)|bT#)@HQ3bz7}cqN5t*sup#bqp9FASV^01~fI9b);{l;v7fAu;Z3anJA!|_dn zAbBe=tS<{RAWpkmV^M+o^~bSK@vp4B{F`cO6Sy@9prk0VFyp?N59}camaumDCk@Ub zZ{ET82~66egrkgH?%*A;JXz#ir08vYeQJD$}QXB*&kjd-g?pdCJo z;!p!$o$unX&1QkUt?P$bzoM^EIbaVoh);jmW_$SVcs0vku?INjWtJaQLpd`Kh&P z)sl#a2>Hi9{vnN;G?A;Wx=McOr#6?X;F~tP=4y$7f7-S~thDXiN!oYrEG>KWl(xOD zmss4##l=aN9zCQ}zrNDz#v7I2*?HzY(rxAp<$FT8Nguqw5zu$!2pIxjav1!`5y{Ci z5Owal>n=&n%#^e_56V5WW+5!|pgb^Vj@$%)axi?z1p1Tk9Vgo6D?f3f=_ihVVriA1 zct8BaIZv;Vk=x#t$**mc6!?bs!Y@?59(+9ddi3)if$z3p?HYLuumrGn?OJ(w(`&MH z!#a6l!+Kc>n47mvo`3#%d2Yi7*|1@wJO>|c`JRvD`JxZx<-$UFghr3EAhr*MC>wudF~!LkOzShB4>uBL+e5hKNozj}!^{MU|VN zp$1M)QP*7q;Z@;9(A89$-kzG0JZ8kup$SQoQl<`RB29z7t`*WJHFZ+r(4j+n_Uzfc z`_M5dQ+tP;)t$9MZ%a)XnUIix3aHT?H72DD35_s&Xc}@`+N6;q5)%`Kq6T_kjgcus zLIOkFBz@D8lSYmlnV6W!3PXo>XN9Dc-X@Yw(^AHaQQr?APE&kX4_w{5PnxQn!x$Nt zHfijbF!NHLSMA!D0f(tW1nUseEInn?*s&2|5y3Ss!w_RrnlVvub9(ZmNs|y*Zy(#f z%g7P`yyhBM?eV~3Xv#oA57W~4J(}099d_x+5%t5uYKMhgPBbS?mY9YO)3I>LlR9+h zfG)ZujqKR2UAt@Aq5V)SQ^SU#G3hDzKAGc3gk74Hg!bs*a!zz)O7l=@i}q7fk|CGT z1^WOV?b>z4Vhv45g~8EwI=-Kp4Ec`>U7$6_Z-LcJNK9!Xp)u3bQbAV48qtN-NBeGA z&4e-NzhT4a>2SkSQlcWFfF`c7qb~}(PObNt)P`WDyQjmiPfcwT5qTHzM1@CQfR<$B-pNbltYe)14LB@_v8^`WNnxX?#m{2dG+2pBH?})6^cp}kE zO|$r;U!X#-h=?Ww;~Iw58B8ovQV}R+b7>kfemZNUwFxZJK(2R6>UfjCVC99f0&4Va z6me0Lf2Cl(Q_{y(@ux_=5DcNZ;7n6fQc*R;VqZ0cG*w-2l=SrJ>Ep0r)Y#SsFu8Kj z-Rxxg^l5{xtiHccP3_N^wryh?o^OAue$@W1dG7xHe=F}`+9{STO00wI6w4-Q$k=(y z7>PpMyanu#YhZJ9xb8ZM>w;K#&z{m9&;t;C>&+5BpucoOEWGEy0n&a{qFe{)3<$)- zM@aWsGo{bKfieKl|JGZj@2EgL{AQH@8aYyW|LYdGchL^zcJ6ape<| zhB)-poVR5L;J(6Kd9X0A%Ep*!#*-g}ok1Jp@u!}W$5AeYjqwBk9<#DH=D+@mJhwGR zp54AxUIJ{~zD?c&Y~H?IwgR%h_*6E2R8(bGJOX=yF`9_{B$4g887|H zS0M)~JaPc#VZbri9H+dVs@UimuUB-yX~acUj1>2blUDq-IH}^*|9<>;1%9yt(cuvh z;nCLXxX7-Fw+u??8cEk#B)UW5z~0xkyXM-#?O7%6x`cuK`}O9Vf$dSF$+%lWdDW;< z3a9v*f7Syc;}fq=$9TE_jaYqnv%RZ`}WnT!_Jij~+ex-{@Qe za7=$lNQkdPmv~Rs(j^9Rf5t&yh4-MpvV!oP3E!e5d}9IX6r%0}OP9D~(UyH!{jqP3 z!Le}vw_V8I{1dWc4?0xq4XNV0C1IHR-95XFBftl`(t8;AA;;+D9H2+N$VqyjkKOMA zcH;hXyi;>P3H|Cl;IF7)xoOWQ#?9!9eOmoL%zqfa{ zf!wF}C~&s$NB-2a!RI!zeJ*E)&#B+z)3tO!norlKndKax)49fH7zLwIoEa>M~znDdy6G3sC}j>)l29B})`F0&o`@kO_6 z>B-&yneiXs{2z?RwMUNJjU2naz~|ED0T4&hvA)`Dz%1MYKMixxX5fB0*8gq*;#r)7 zhB;`HaX%^WUSE%SAkVGlL0Y_xv0y7(`@Hgx&cUP`*WGt*$Bq?Wo;vA1;j8q15B$II zRd`@`Iv)qlj{<+38PFC29>)Dcz?XACtc|qLKnraq?(YSjCO?rD+O$etn+p6f2aU9t zh!S&l7LuVp@SB>NsB6e0xc9@k*BaH6fHOhlMa-1r+;ft zQ*N1Z#z%fH+`rF2+|OGI-1B@M<7wc%+Gl7_0iFOX!}DUSJ!ye`t7t)fA}uh7Dq3J| zHS$w{7S3~N0lYyA@{`6nkQV6MP;)SO$=nY<;`VE@)s*i_wm*t}bjt6mI0@K|b$`+4 z)}I4B1Dqj4bkYH5OB5}*4@e7>pLFn(q6PR#&oXIo?%viZpQ`ru`Dj5pd_x%vc<9L| zT;L&vmx&`D&%I3DN8RM>4mtKC*8LRVu&>hdD)5GE)Luf_sCiT+p&=oz(^L60;3h>8S9lbHevF3m?X$pU9E@~e5o^w(2z&+=p=7D?8Ma={EoJ)25 z`vZUK3UdxRwV4Vo0L1V1{g=n$h*dZt6tj4`P zdCNO4MGw@kPK#ikx(Vwa(0RHBokuyVk)Oc3?r%8<0Bt_vYT|799_n2-?8tK9&N)El zIAM2b1;87+R^Nt_w7As7U(LhB-C&yU1^wd zR=XE+%hKDln=Jev1db;D#Q6#UeIX^A4jd~s&VYALLgv68(?0~f4}f0OA^&yILhmzT zxVJZ;7vOq8Pe2bqcR)8lS3noQk{|v}iCpm!40k;4K z0d8KL?Vh}M7wy0*8wz%yX+!Dy3$Sg!1OE_$d?4b!o%kn?8s*lp_M8J`uJbcrg}xU! ze*!?9jI_|ePx@ux9|HO4Qt&_(KjA)jUo1Oz*oiT_O4e+gdO9Syg9iItBQ1~{B`x%O7C-Jz2iy%v1*Cvi&c{

H0q54pNs$`0ulh^sXG7`PfZ8^zz)=^+fcLvX+zORBK}XnpC-;G z?#f2pl9%Uo`TZ3?`Fw8BNyC2EVaIB)%Qg6ZI^wGu_(>l)BGEe#`*Q%GKcF9=FW}eq zHTQN`?9ss9PVmO#zB8Z`Ab4L-eD_TkY$(mN$#vL)8f|jY0=k%T&`m#e9pVBe{=}W& z-wON<;E(lpAN5u0@M(4I6&-?^u$TEC}YO zkx#F3Q|ATSeWU=E~( zens=zH4$E$Q6>L^`-?-c%KsrEMRlh&>>mSN4I^JtUnu*nrI zI0w=KJnW&*z2aQ{;U4fU#QyaFe*^NT1i1ePfcU$11b8E^Kw452+h>n8uYf(d99C=+)rY@za&K66$B`e@ezguCk2+5?{Ub#S+E8d~sMrT+5Op?&N8CpPNDCj%w;P-Tc*ujZ>^kP4!GGi& z$WI#h3ACutu(!3Fh7R@OwenLrp;@-Z0kz!{|J5~Z3XzMiWZ8W;P*Kh`(XTL9^#I`m%L-yZ&mhlJnU!W!n_3N zGB;$Y246aW+aw*)g{>=cljT_6jp$5IJnR;6zKUuVZ{iSH}%JHLm zv(~MuY>#%muCKsvFEsi`^iz=!)S$OD)8AIK04)RY8`x$Ye`!BsDk_Gp{FmK(_865| zf6&2u#^=*P2Oa*5UPTMcfwVa0b?Y7C<14Q;X%N+_Rpr)i4>+kSC}*iFp!2A=6)j8~ zN>9mN<;#i=;M(V)Z6s8NfWHQmoc2J=l5TTe`7#7z&{NBBYwBx$QdRxg^(gOUXXhA!WwAga8L~j)vtMmnN zZ`!g&<+I;>=`{DY@{iuc+FP^$?%YrAQrI;Z&pY_S{-Xr@?|b&{4bXsmgna;=rb8xa zn1lW^@CGe3>uD-gGb08g}Vqz*^{os9s77Z%==mh)&+gh*U zC(Og*r~Bv4b6*AAi9exJj~*2tmwZoMqnkFA;-|&0y=q+1BA_p5e_RQEdtu+F&VYa9 zQT`G4HgHz{Hs(RS<54jv%z-f-@(19&@e{lkGd84T(~2jb#L|P00FbF}JZQ*ya}HX7 z7M0lBKK>W;cGqo&}A) z?<0oESSIoRt@t755FEd4iTEvkujTe(F9YziUpR4rIh?~!+!whYf9z_9Igk#){KUCf zI)ddbBS(05mpiKbBU5iHT|pTI{qBam^D>5W5V7MHfjBzjYQGu3CH}mE$#b5d`^hN`m3=^xRig-&!cZo}9I%OdcMx$floKb*g)HV5S^a6de0?rD>s zDxf3O-Ud%OE%}7KOrwv6LgzN35zm2x^yDQEB_r=(&CcjhG z{OSCWH3#yNna|)_DA|hNQ>uM!@>4)YLC%7&4A8@A(ZbXfw4tc;SUMrI41DjQuMHmb zGG+j|=KT7uB&c(v@LM8XKnb+W&_^3y4y3@S}wuZ$|)YnR902k;C$}11P zq}=76=iI#XEm-1N`KrXf2z}gvzAW9u{yElfxJG^wwkh6LmkdT*-Kqu^DSAr z)F_7SZRtGIexePffc7kb_|w0@?^z8yY~9Xi8x)UKx`|`_T8`yH`2F7Z)YGP|q3k8J zQ+kE-p${|?aj-@3MPG(Ly&W+D!baTN@DAU3SjTLmXvubf|MBw!7^C_{n~yQ<|F6z( zRG$Q%=|5ZnpdUwnj{fvv0OJ}JCh(r`_?_kRU4eVH{YzKiZ=ZmO7^xR1`B(qW%u!;4 z-@9040iT0@50k}bU~QFr{J(i+aqu8~3iup^?@>Mn&BwuK{Emk~@IUqY9c!Jr)_^wX zCJN9SP($5eZ6fjT=PzIzH-dnr-p;$1m7c5yOWMe-tg1T*Bcz@3QslJp0QX zp6cg_tTROT+W{Us>hwTew4?ml^{kbC~BK82e`YUg!A-o~PlNAf6d8 z&!F%ejs7g?0$Y^lnAAFOjPvn>$!mT)){AEw;4>JE6*1n$m>pwXjMp)SjW|5d_wZbd zS_|etxE9sv!L_Ku0X#7ueUl%|v8qU6?i0`T;1~LZhhXnBR>C~ZUmf3Ci#*T~{)N}% zNl&%C$^Fgq1#afI!D~*&2^e=eUp!x(BY>~2&Jdtfxn7j&>;Ou21_EV=d(%BUqeb4t z8Zn0C#d!g)0rw`y*b&bM1m_ika|*u)hmIIOm^Tr>Q91vf z0r^0AX313lv+LJ;PGfw;7oCWUs+=tI$`g=ZV*Zl3ODoUB9MfH|tTz~kW|SBz>eRUulNRy!PWM>6$#Zkey(5P0`3!Q>l+{X?bb#!puY(w@ z!Mq}4tjsCW@3(Tg6ES~lEttzq#r!SaOhSHy`L^2tR_^v@+>gfm%^a0FZ^gAh?98D2 zrVhdUl^#nPH%|F0i0il**J56fxlQ`*DrbZF1m`ii7R-q=p38GbEir%chLyXt)}jaI z&%C8|?u)Vl``E=?-%#i*jIVU)tOp)oT$g7iRUX5Nb25ft)&oMs6cq`-H)pK%Ij5RpUU7a_qebNu} zXWotHuPnJq`NdpY+S&1c9E0^|jt%_hVjQ09z&IU!`1=>z-5G%UkdvJOV2(BoFb(U# z{4DeRBuiza+CXnYk_=@i@J2!+4cYAI`9I0DER0GW6)+^hA|tp z7K2BR_Fe({4oX6N3N*2JljjZ?8)W{4=Wt&2==v2`w^jM0G0PUa$s0T?fm}tE4#A!_ zm@mTlM~nYfb1(c{UQWN1dr-v%nB!tzg=;Zm{=;s@$YR>HtK4lk6>l;J5!k0H&Z^>* zOLp&aS^M>Y?OR-ob2EQsor~jIfTkY&4mf!KQ3m+eZCLLK&X3TqXKaG>cxl^~Ku!TT zJe|AE#TYz!lQ{(Dq?pTr%+@C?nCB*6To%)!@`ayHGH0Oj9I)BK=zW=8PXAzoBw8jFBAF&giYKxu%kFw&4>es&feBP3sH-_i4UM)7x~4t0aH+ zP8{y#nIcPvFy_y^1@^QX=QS&OpDTYceWeS0h>s&rgw7D_V7%sM0Q8}bT$i3QbEbze zGo10Le0Tq6PVy%ADRU~!Ma*8a%CPd)b6CaxJLS zK~rzffK6Ck|B7XQtX{oZ#YGXDX3U3iM3t){J#2_ASTRuiZMcfX>s~Y-T(;ERCbqqb z;a=IYW#uy;zVABAn*kjHnX1kWF1~>MK>}Fz7k(O9i8vH+Q1NjUTjpAj9zRu9=;@i6 z9t(%y7%b!9i(h@&2<{)#}u-T_|wL;i<_1Np(^N#%c0KCEBA!Gph5;88I>$OOnY)Xa`~(Rev*-V{&Z9DHxWB z0$6d1-Zk;?8&_mxWGt#YdC|oeA7~#R?;`M?@67Mc+r#P8r|W>PR`uxL&->!GE#8m3 zhUZOe@z()6asLe7b;Eb8!@9wp@VQ&JZiSDnSG4vkG-?oOZZn zb6S2-u>V6`po2V|i?vp7ZrkdGu5{8~;n_}}`=T8`yN9$>{#$So^7MeUxYO!T{?k2ux;G5uclBN&odJ+BZrZ1mvB6`V@1DLg*B17fYES&} z8)Fac3FeEQ&e`nZI3FWV&0H_fz`l&LeSEj@^S%5%lFr|A;5W<)f3CrnZQFQ;hw@eb z{M1REI%oZ^4_&lFsB0d2b)yjtUHB^WFMVg|edh+OIopy3_?tD%3wfx^sME(JCwp&A zO!R(T;n6=v{tbWYrsB?rvOKgM=zGFn_FRuPCjF?RSFHj6Fy~6W{1x)_9g!363;ojt zx#DgE22|{Dlqs7Gc7d@JbuIn@4r1{y`=DM!p2PX=iSPACSFCV93f;W#=Q7&7N^dPk z9rAiG|5|;pPtIj4*29f8rOgI?;KuK`J@4XOUwp?p)!VYYby+-#oWTM7v3o^d(g@$5 ZcmFyd{R$92&0y7FP6hAKc<4U#hCqbUh+ib62P#7lhydhq{6#W6M`7Cs{l?L!tmlNLTc_t#AfV@YF;*iIXgo4>oM z6G%(`;Msn9eW4$b0_H~KOCi{cYA+)oH~;7z8sND`^udIK-6 zh6PV|#aKZ* zO21CwOB%fg)zj3}q=g6y3bwLyP#+elv*c;S)JfuZG!sfpS=r6#Mp-b2iHM}eu-tHo z@LcSbOH52m5)eRn*zszxufVJs->)^zw4((&eFh|fhZeG`S_xM$o7`XTTtFBmXlrU# zLj(i`-}a@Cnx8SzSgC!;`j3cj@lWz(`kF^GuR-7XSR)&4+^4Okr|$gYp4sO!SvYhz zHqf4Of9y=5g@A%yyJ z*Y+P_y7C?*7GYKLzGq-M30gvqvAL=hr%lLN9mN4b6c8pRnwrOX29-!P7TrD*&5sF; zCO{wR#SB1}>=2;1n_23{NS-`*fg>LgxGv@ohY1~q6vK?+L%IBSg6J(Ck3fN4EQBol zHn?Jzhoq%LRnh8f1;pcjpP?Wi)OT|eLR?gtVlEwya&VYa|75_Kys!Kx<+tf%%anAd zn)XPUW!Y0Q?miEBg7}0OKZW>h@=tmx613P?$Ki-}_3H_mnm0$OezvJ9B4w=NwEtrS zCOTTa&PdnfGoq_m_*9OPoy^{r|7>!}f13Pit2D({M=j5|93J8Zf37QqsgM+rXUPZ; zX#jXQQTE3h%=`C`Bq^gv^{y~8eYg-*VZf3>85|qZN%Bu)* zQ4W?YhTD{1oP_@AB-R_^;ITd%(p>Y4Jw>Ya6t*jD1!270L;COcmlY}{kylB(NIruD zV(wro445zw>=B72VCw|*v3T2l7)77@Ii?g5ZwQw3DZdp|4N>rq4WS1@q!Fb3Fq-7D zl;^tfUF|J3R{cI?Pnb0Rnt*2ZJu7M{o;rwbzpkcG2QP^#$pvfvvmW=({pCQn(2Mjq z+@->O#P}9?OZ5I(DQlo^ z^z?B-cp6vqbKN_*_>j^t#;{26;si0yH}9@r$96(2WEq%Jl1CSe@?s zch>L$m_(lrc;kaFdj+*W8|HM^pzdEKGvA&J=MFFFZ^vnBe$_fFMek3O!D7O5`Y&hq zOwL)cdXV**g1@D484vRd;|SOL?^^xyBz5H2;gBUVPp+8fx|-7A^$7CyyX4zI$S1CW zb%YIjnotr(mvCKE=pxTI)r-jUNErBYqT+>o*_y{-=cMj{qhp+>DcDJ;uIW(xWynU` zWqs$UoNCpXM^I4uJVyq#GQjbF(&nV{xa2`4r8%y~l#=0KJ*|K|Z*>tl1Q;UvuawfW z`xM7+ly8WCYZRM}$V9-xCH}kgb5_K$GvWO5O+5Iesw(o_`XCv*BhOzopx7AAPvO{? zKX?LP#U@T=iD=2T3hy|3V)!(Sd*LqOX5k$~_R0I*kUmIGtLT5f{J>dkn>((?r8^)G z+}AT@1QwwdMsWIfZr|V#PD`_}NaAaYKH?Fg92`$H^rvDpSSi9ZY3UUP;1kH!DwC-F z$wYpG6Nr4=Pi3bj1cg5aveW$9$G2`qtxC`H-!It)A$2s^I|QO+H3ilAP+TY>RMkIX z6zU%!HV_HwZ^3IpruWNF!;?r{z#T*%+=cFeY?78yW)Zp2Bw@jj`?F$*+6As$_Y*fn z8L~Sf0$7OsMS?%|llUW`h1sQt6dxaQOO1&s#iWwjpC_Zp@Pq{+_OArVWj0vK#qU3V ze&giOaW1|0;>8Qy+tre6BAuaOFmV2(nLfcaDGw3oum%AB?!t=poi9s6IfOC%jPI1Sp%XA4hNfBm>< zaiE(-h{X?0Ohl}Y)u(1F`F(a8)RuD{>ngKQ`cv;sm3h_GX8cPjCRp{DDowXWu;Mf- zpPlrtS~riZ_<#6+(LOs|G zzs^NinAtfTt#J_^|Ke%~z8+6ir_gf`S9!Kk$~`ve-JERP&4miKG9yE+%Ct|+CdFe% z3~7xNOt|)SF*D1$ug;Uj^oz6B+Jn-KKKG&62c@QiAMd*u8NG<$?usRFB@wpeU-&&s z;2x>+oYR(bGjW$>csz#apywWKId%}gCE0M(SmH5zKWEu^Q*+PfZbjDdf+@R;S zAFQ<1QS@EcjAr0n9<5}_Zp_jzHLdx0UWSd3!bCVft?~U}3GF{xXRT6VTz;yl^wF=? zp-&c#T!UBkA}`3cliFMHGod2>no-K?FuDKfI)>+i@`a`?PMnkyrqzXmPR0HCAynWF zU2uofNSVs_@88*|Z?wZ_;Wk^6YHGPPF2+^%d(IEaEx(V+mOQL+KA$P)`kSNZo-j)W zIgW3%@UQU;{az*YBlCmAa7916X>QKrI{u~LdS~L3_0bf!$%erK9fQ^3(x4w+cX49) z2u^}>-}J0++b699pPvsH{(OGqIwa%S|{n${aJ`MNfOyZu4wY>ZR?K%4>qsos)i6xoovj# zaqZf*SGNq&<(TpnjO1F#;c;lFX>Hm=eBW7W&{?v&dWsFo%KR~dac${~1 z-$L#3kfc`Oj}~N?wETAU zR*O9WA2Q~sd;e3bssxfO;o1p-3qwr)%yoAPl4G5LY8Dh3-QB7ApaJgK_6dX+{A=opHI{W$Q$pw6-fA5!cr_SkGr{86-1*I#s4kHpgq z;THbdsZ<}YKl}1KLtRgwwc&SAI392trV-Io@UY5$h~GCBMudw|)kJd;2UNne3l~uJ z`f!B~xUu|%H!pX2_YGljvZqdTx?2(v5{WdcOoAkz;o#uVNxxL=-LJ(V{isXp$wnY0 zgU%trMFdY&1?oBB#qGg)m{^*O`xMV&Z|1Mr_Bau7@!#48v3RlO$dG)53J@NMl|rYK z80#4P#Ve=Yb-v(I?-Yneak*V0 zD21K99_7&*dEN2%d&9n`S^&KOAHKNsYWHbN``)8?1J&0(S$}d<)BQ}i`$wL@Ht$0$c#G!k}>{3nP%aUWpyOQ*No!qedW&TAG*gM+MZG zmn9Fq2AC+vByD0OzhBX7Ib3up(#Iz!73te_CT@%^cO=#zI*fPHb5Gl6`EM}Q;rA#egGAfJWOhgGqD)1h$( zQ`ra*0Bg{Rmb4WHv?l*F_R)YD6|_EtAx}8h@aWMa4|IEaa%yT@z*4q>xw-jsvj1p_ z*l8tr{R$K1zl=Wi8->GilwVmOJk~PiVPT!oOdF-;j-6PRYpVLWD zQk0T?dxh$#~8x zHQ`sgA5S$IPP4vk<3sWx^?(xv$(~UFJ?V^^dBO9?F)=Z~GTP($RNn0L!Xd?j4aPTXc$iEPM$+Qx>E=uI|(F5mVxnj6ngE9?B*`@G|fVQa0Zfh{WWm1Zk=N4|KcVVBgC( z&O>4CCFMlyifNYQb}an$;4@lA!U`B(;`6?`}QCYJ=iSt1ExqFj+gr~LLI*ZvItsx#}%)^3>v z=T$eJ0`0^LqN1Wt|7X;;=kRem{>s6Z=WKI=_H)H8juKj8w4xYEX-OI?B2Es`=SS-0 zz0+oD;bEZSu#|r`?gmdFA*0l``X58{xXY3YI^ejshFcSU`Kn(f5UE4MF95@Q8iji_r!&V z2#=V1+2J&Z6)r7*=Yc{Rzo`J>5epa@P&E?|^+_xsVnp(m<&^c5|FK;TY}3g?SfHtt zyo@C6-|a#S$OA+!NqPqpNO;_SmDW!E7_GeeB01yC%>NJ)OV~#FE8l*toB~tblV2My z8@}3xnkV5S&mp}HYB*qbGi4+wN{<|Erchup9lU-Mt@n*B5(Zb|pZ;Hx}Ub~i-m59_c+|NSt;o=E`O<6v}4<~}Qn&~*b3|aqY{9^c$ zqu=Sl$7}|KH5%1S1+tO`HEM-d&4?NV-Cv8F`9`4(QGRx5mqTuLcJ_?)tk-7!5}&@> z@vaE%{|S?7=L2C2%cgw1C5-W36~cwWTVkR>Rzf}%5fT_ibVY^QH55~1J$)iyBid%H zfL~PJ?mAcPIxctWe_&@Ln1(uIPGZhq+l5Z4{l2Dd@`KE+wWaOF$-QHRq`hPXS7K2#1S&rN zFp&0XdY%BOGb8O7QsiXKmYM35rYb`aoqA0sb@Pvy6sfSR0v)!Omtig)N<6y~RnzRV zW{=qAU$Z?wLcrTjeS`*5QSzdyHdcZwtXahBOt=OBy#u1y%i*0;`*(crx>1!{1qNP26~$AJ=)mVoP=4siKe(%_>0D~R?C6%Q!=fD1FazY)e5K6oYejf@pSJ;#5R zronf^^pIB#m^?v<|5&mdi6sknH^l_+m+ZIL2=^H)ciD>LZ{f71X5mfzac$PfSQ(G@ zKXK$}&;9Z_i~Vw9Dsx8}UE}fqeE>g>Oj3LE?Ea*IQLGu+JVfkoSi3iT2PrFHQShEK zSu57$CN2ux z>Bad?>Fn7lOP=R`e`v|0@&Tj9#~~8OzBEa=LlX8&8RhO%vcimKXq(DUGQ&c_*)X_G zuJHxgJkUu{#vmi+=i}cWCFahmEzZK1p9Wa+V{piwhx}q z>>e6VyEU#gX*{K!wMb08L`Te$>{KQ=c9u{}YEzvDVreUx0lxxh>gZ99Cw^4n)dhrR zUa_{}@mP&ZCltTU5yjZsDs{0X#t7GGiOXcigzT3bS;7o=`IUqTzt6tMBn@F|^(&)a zo?a3-%lBe-gP&!N*AD8S4qT?%W`J2Ru3v~RWZqit6SUZUQ`S~gigfhTU%tf2Kr``( zOKZ=$FOLL<-^s1tY*_PD%x?X|c^9W+fy=ZeZ!-(-eB?`D*l~KP~!{%wT zNb;F20cnz1{Q#xw?J)6nn5SxP($#7I*PVoYj{S|v0{8tPcYZ0Zj1PbBnjiVfA0EBu zW7rIuQ*|3(#_P9Qu)4Qy(N6Vb%&N`K5z=?|nvv-7%B?*!4LS{CrSmbD3hOtUMM*@%=7S2=df4C0KE&(Ev(2>pT?D>bB@A;KD~j{odnk+XA*Zv z+m%@73CtNvkn5r_b4i0u0XxXecv1Yh%XqzR)!^y18WefYcFZV%3L_p1$J`GAxB#ez;nMd5JkBJ)bWF}#2A63V zy$x@Bzgh0u4%7Pv^UVE~)k=0iNYn$FzHt5#52TD#6|@^cAgtUW;4P7ch!396EbZ+t zz;JW?oL4t5m|setRnwlGUaLa+x6a9+kA5VQ0Zpk5&%%GZ-)7L&m(soQB$-*>2O)Ls zu%`5+3o(oK_g`383YgtW@&Kvk#+7@FYA6Vbyx~$92vR~H&)ZCM`&Mfk(sQ3_v-Du@PoC z2}MrOSJQJfZPV_iL;UZE2xskpIl&fVWr)n^c_yblLO$V=<{%UYyD{+)+6k+`WYN(< z?n~qDEyF#UdlG&A8mtW8SbY^#989}UxOv<{UB9^{@$zlLWc4yG4pqBrfPr&Px3shgV- z3y9!^Yj3lAU}+{EWT;EY9}S=BgMQTr6h@XRY>*Ec1!uH9MmX3AvMhu&3RQkq|J&P% zrmS@vw1=|2N_NYe8BCJ!7qxDXy?7Pa$MFjYfw8IjfgU_OE>PuQ>>Nhywf3Wa1?e z=ob<`O?b_vg*t!!JQ_j9i0a^WA7~2jZij(nvDe)Y8D4N$bbJ#&a?#Gg63xH9#OH}N zxSv})t7bGiO^UlP&tb|VKkq=WW+~@4XCO1q%Eu&yVW=D@>SzES$N-e>(8jdrz~-@s zG%fe6u2e8#4ChXRQN^<)rLgpH{{%tI(cW4w@JDCl9?R=HI9}zBB_Ngaoc!+7$*Go8G8OnjTRs5Q_K|k>TBY8+W_zXvy8WN4;k$*J16D~F-(BlLw{t6!UC&f>3 zCDfiVioWqFD2+ffopPfZ|4wM|zg+-wD325!wrk~(D_T=An^Yj>(%I8^kZ>ZqfBcw5 zck(*`HzHd#SBxp|BYVT{-?ZP3Yiil13_mF~lNK;)f3UZnD0JPHd7ru{bm`J=V|*;( zBTPIOCKoY1=_8}$=Qg5$+p&oO$B*n65i%lz{}CsG?#Vksa@Tjx*4-7E29tcdAn-pcgMy{R8iVXSj!E7#Bx9}W9$jHtX`g-q4f?!v~ub#!jrQD_2xDs~@ zEi@EOwR=d$v9ptrQGDw3zp{#PU}@4rT{|{n%t?R1h^KYp6R-hH<;!50_fl|&`_`Gx z{f+TzZhROej^uy!x$$!>0+Wt`g|SPR$$0Jh@F@F- z5klbRN{X%b`RhnC$kvDDh2HKT%96%N9fymmH)t~{|H{0&^e)}f1`!rMbQH=)Sn%he z4OUgcsHlojOBbHlH5;KdWRo)a&8&dTFAe*TEIJAYmrlaw3wBsdn35ZJcTvJx%^-_; zJ;Dyb0VYDHh&(-#m!bic3b{^y3I1-;?fekzek?&M76x}RyhE)+d;3%~d#KEr|6P$E zuo-C?H*xL)mf;O1m>nJ7NG*bQQN@$Ix#HCE-leQ<>tJW&YFy<<>^?)k7*pLTlO#75 zk(AGbawgqpbz~S}WS_{>0=w?Ccz(5<(BmUxEcO8|{nwhr!Vo_1+yA7t!ymTSxZajVCkUkKj#iMpu%C)3+{Pj?; zBn&X*dH+uI2+bW_w7J(!iKqp0tp^X}XgPj%uI)J&e{^28p6&>w%)2foB)&`yq2VaD zhHvMV8s5`8*qjVlE3I_`bzVX!PvsdxnjQZvbh)zP=bPvMsU_(rNR6fEvMA{o zsLjSLBY5bq#LL68)76NLN_kVO*}d#XI%fYg0$c&UDf7boLgu=H$! zRym~mHhjFmk9`^Tnky2dB{u!95Sd}O3f?#2k9!w>U7Z$EYFzBidHxD>khw2`Q??YN z`yZ?d)bMeHFV-4?A0xE)%nOC?dl^4KLqV7Sv)`7RTl0$I;;&?0v}OFO``dr65e#S#o5nfl zCW88UQ?8|c^QS_y)r0y4{uRxb{K6|EPOWZ%njgtaye2`7q(y$J9hf@~Us@EZq4L9Cxb7 zAXgvETtVVC6|qBUiI#j~mT>`O!3i)yY5a%Pod+PfDiFq#C|hEmhqdY4W}c-7|Jz~D zXZiE2+qBI+7aZl>$GRG7N@~0xC{XTalQ57#U3ftEHAdTy%%I?$!Nv1u&xR9oMByC& z7vH{Vw!^3okinr~nd2>ru^d<;)lU7|D`Jld6i0B3dqXpOkoPf>R z!;H7m__!YQ!C|RX!hiMwO0D_&;&<|nMsS{DO5hcDM?q}w*c-8I9hS(f8GH}`Bgem$ z)_o6B2}4|TJ*_0q*PpLt+7^=uj`1KuMZ?0!zgB;h{ZH~xG_-$dbKi7bVOdymT1a7L zo`d!t&e-z7gX`MnsxR(~!K?<0=*I#|vheE6Qf37p9n%%U(xRSs+=-FYFHVi-56vLp z58z-D0tRv@#@pS3)AWatMIrYI75_ic3-ygE7aAFlL_Ew2g}A=8bH)+`U_v);e5d30 zWQ)0RL)=uJzx!j41E*{c>5Cd_f&9X|5TTcR6q_SwE|ys~2R7{uo6+&ei+oZobBuuv zR=b~F*nh)x`ua%$KQa8^1br)%BCrS+=b#hqRU&!ZI!Hi8D8D$Nc^s8e}H`TynxIxrl^@v39^ z_p%VxQ_cGlCn*Ejax0; z(QQl*_{|DC;hhdCP{)})9V6h$BaSD|UHZ=;fCmhLhSDs$$YDWo&ho05RW z5YAu8((mE*-~-)GyPox4)M3-uN=XKvx}qYp`cvHzNV3&{0^t={?63t;{Rv_pr!T*m zP$zuaJ!PvB#i8^YbT@*~<;MRaht{-lsb<9DA9UfndtMrrXy`|N!hwoy8E4OzQnTtE zV^0EPv;U0H8Q{jryK}>-WTRq56{q1~KLW_1vW4D z90mJ_8^Tl4>S$<;PIX>rgt(Ws`7cm3SAvG_2Kj^ATZk?=n1Ikim>D)ZLieB-t=31m z0}dt+Kr`qrj%tP<=M@e&a$70>&*6bk2MEp|w>cnDbCWDQujG-ndM!Mba2LN&IR7YW z$vkpoZ6@#-%%m-)wRUO27 z^_&98IiR93l%-thb*f>rU?cDlMlkEi=vR152q^Jo7F*<7Un3><&_Dh%L24cIUxZIJ z2ko>{@xOTW>K&%s2A6pOWMyvUoJAV{4JBg7QZcrkps-`3Q3 zaI831zxLE8OyT+QVvy>I9c;P`-CWr2)~R$IXMa$N(@;uSu!V3y#>3dSqVMgh zCFyF>kzIJ(Ua%b!&PjPN;Vqe@vVSIuDF^D7!c5SL#%3_|}3X?dg!M_^J(I8Dr&3Jh`P@8u^#yK_R;Yeurd%Zwy*8!Q;k4s5LjRwhs5b(A`OEekvF& zBd|k+G6G4e!dMe#e}fIA?r47fS>O>L;Ec}#g5$20N7@my0UcKyzv`3Z+*;S81y}5_ zt=e>@tys}CzvnpOcQqZCtdmATM|kZ8i7vO_PaF0=JN_C6RQdJ1OW;@@B?TWOc9f4-ktpKLT!dbNIoPnb=Y z7HG>eyIUNU+tGIORF}R8x2C)_kK5<%Mee$VEC&ZND*A2QDE<9}$c4?959mvdlOj0{ zoNUu-&lf!Z-RKzv8IY5YKf*JVZP=32zY!V8`Zgpj{mLCByC(+-B}*C%O?s29Dfo_i7>Wq&{Ns3YFN=Xy&5B|S{B?m9ZQ&N#tp#yG2zornP#eD;Vp>J z6G9eJD1Val{1(x_q^g=TVi}YGnt7m(i-|rsS~tV;*6zFmI*&HQxleu$kAw#I)ZS`& z)c(1BeX{BncZ<}$VmJ2e#{I(a*Gqi`y#idat|uSA4}$){$`!}g8*i;A<=bKBZxj5P zYvZ{i#x35{Pk#uZrGsprlxtbH1@~PwkDOSA(^FDf=f9_}j9+ciVM`@WSbF)d z5Z=TPzJ4W5ld$+X61Vu-zu)}9aouh1M(UT7brcT!>%HZHS+|m=B6Rg{+y|I&Q3h74 zZ~rFsi=O#O>A+U)I1^mPo830k7F}JbRHJ}6jVL8raN!jOWQc%HfqZ+9ov++rkzTRO zNLei5lxow6iy^X7e*#S`tHBP|Raf)Qr-!+fsP5i}4UfVtAI4rr)5K);AB%@hI!LKt z>580oz7UNzp#zp8U#zhc<@snt#kX6%9d`KXVe^ZU^12M(@mi;Ie$Fi6C6H_-V(??Z zao1h9m9N*&R+J7oq60gmpteP{nS~o4H;1kXDY+02T%Mc0qW3@?`{uQb>U>;%E^6n? zud#~u2{ZFY`x~7=@ZY<-h@YNO2{*%@bfaMj?F0k0(%CA53p?nS zwTA&~7hLxkDM=N6>38#*<_2E~EYc5va(})H_D+xz3D-ahGkye`0yJD&e>xHxV;pir*rU%ijp%+A#W$47tpOihZy#Q7ZwZQj97jx&jN|xEt;yYwy!5AO(a`yYbbMPIBaXfMbMj?Z zsz8#4gr^`PY8Qfr#k5v|NcP~$d?be@vSFf!2(#-kgWx#g;X`Tj1h| z17Xy-lH0eX9jA!VJjopPT3s#S?GrQ_eNyr8=M-QhJKL~&aky)=-Qrt+ zZ>~S6u^&2U+UxKRzI=TB)OM1y?RnWt(xQ?0h$!jxADK>*WpTtYR$;dI2SFQ~EvLwn}k$~wywP|-qfo$x+yTU>#rvV{Kdah5z zn}eG6&k`1<9}+i{#r9joyKQDTs{CDXaFZs-GC3pWFAc{H{KoMOsWL(I%A39?lUu2! z$7lLJS@Zm=BCQ3*WbW^`kvp6+&S!KI=bg^o|8g}Ar*D@}* z1evyS6K7ptZZ9zg-015z(s4uZf%ZnA`5T$EeB%jC zXH!?ALYI3d7cMW4{?y85=AZ`rIqrSrueZS*67w1E;?FukY^WCPe9%B(m<*Q;f0Qt* z`S9VxpKoL{6M2;`;tkL!xAMqw+xs5T#GO&KJ?v4yxVkBKO!I!ceF;pZ3Ev-^z!S6bBWmi*zmTrGJPRo>1c|($**U8l zNFC99r@+~KbTMx#dklWDSJuS#Q1s;}OxG*2wyGboM3&P6fU6B{09UTvnTU&qLv z0Bnfypa4l8XBb%-3mp_0%( z%4JPUtJA1RqHWL^{0egq59De`H#}MS`srcS2eaC;S@_H7T5*vlX8y-SNDSp-fAFX8 zjOK3HuUw_AK{I_Q^v&*>FKXl~wq4>Qe&XF6e7W}W-RviBoCZxLHjVgxK7tkl&!|q1 z9hr}i`pP~Tob<_%CeUHV4N`WW=P0$b5Opmx!I(OrirwIO5 zfCKhm>-^H^aANVmoy$@RIf661iL1+@~a+k@S9r| z#5@=2%dy=d*1P=`#<#TGuk7lt`BYrAp4~X1KHA!NGPe5_vHUicCsqg^>d{3sk4C&N z;%`-gCa>2e?k?{`uuN@Trstn;8I`pUw556P9s` zD?LW#w5Ln{_I!6F>z?&G=$`{CuX3uLYjiv$>|oOtw0kvMT1O97f7|Fwg9(z|RMX)V z_bGEU^r;ht8+wUY?28d54mQTySd#GJNf+Ry^ohE%Yo5at6L@U#2Qx`xh%VnfNR7Wo zRa~ntpxOgcunJqOT$F{^C9_($Vag@{P^1m=F3|-T$&5j!A)H+8(t2;MSOYG>GfYNk zs8@;WSS?0I??gdr2gG!wlgjPf0W#FpL(^Fo)Hh{~3rv^l=1t>`EIUejz--o6AI+bG zh6?pBAa~{VeMnddo#XhO2gFOqzpUuXo#%ms(m(DK0X8`#1|DwA(g&9&aLL*L{;Hja zK#lRVlS6*~WPmSrFj4C|`K|3>@~1KFlC$kO<_r33W0^`@L5UrD<3vrrI_v*-~^2@xIRv- z_W-qv?2e+LHN5O#GpPeUy)-w3CM@=3mfH_@`@}0%3Jy#>AkRhgyxBORq*5! zpQL&27VGma_GIgHCW5T-d<&YbPNGSbc%D~p$i^yvozr86yQ*2>fxE#DZ6UhDW7Ra6 zQc^oqzgRC?=KWnsvn8U^am`l_o`0VyxUhFQTb}2YImPq0pd0?Mks$<2KVR^H#gl{G zIl}uk6@ngg0DzeDea@mt6+`AYz=KvlGte}Xjef>B4%;`$TVGI_L=$b#Z3K__9XjyM zZ7OwExGeRK^*z@Nn;;9ykUf^TJyhXkH~KI?Lh=%1uuWTLeWCD>dg8DgYj2AT0Td~sA_<&?PM7K zZx;X>4}674wN&ZHO<=jU()e2U=^rY7mfZvH)$b*lKaBY(rv?#rFVb_@5}keb!9?7# z_0#S=mqzk|yFAkTgmwv>*QJ882J)oN(uAMVLE&y;mJ-iTE0PL$)rE1YDqZfM=ngg z#JBh^+*;-Y%DK^GV5R7k#H!uPy6ft69kBkL)hA;sg$|D{yZ1PZA$SH^OlUq05TSH` zkUfJ^$dUC+G+$r_cC!(-E@X)tsOsL%hd<33zmqcxC%`5}$of z@m8`QM!=%+pl#*}ae-<9uM9?oJo4+s8bvI{gU>-s9Vo??qXSifclHEbtsYbExBn;x z!&?RrXBG+}-W7}`Ovs{4x5XIYoI5zGj0>!FdN_M2Vi>JtB{ceNBBQ3wzv|qbYW>*L zEX?%5(8XB7u6^Jz>yP*8@1h@wFt1l*jO2?`sSjPvon;`YJWbH*QCu=-;QwIa5f@w=NqkVs7*#K6@j2N= z#}W}m?^0vU6r+LNf9$aN)6Z$BOpKmOj_97dj{{H`tEEsip8+tUj?YLW2!>!8Z6?Qt zz!FuB+@&v+>fTnLiIMw5hFKW)N))1_#vQ7PLtQ6s>hYtn65F(;b1jF&gnS`ja|?ca z*>CD{>^U6wu#8YU}+b@GK|0ClTFWw*#;10V4suP-M=P=gaYdj5>~WP#FNm` z^}vzLEyupnpq)3|(LPKu${;={@--=+>DfD(@W|yR7(~%$^&1B?_y)0~oQrV9PqYTU z(?;`)ofM%&yv8R9I~NEFb}BenG1L-f6qs33iDj=BOgxHAu{Kt?QQ!P$2Mi4dT0VVU za;10mzM5l!jTm_#iP#m8?sa`1B5i4F!9af!TkW(Qm)?SeIu?eQQ^Cu@h`I^L!KVG< zu3PBneptJx<9biC@Lob@%>rI$I{(HF@zFV$f*L!Pqm;YRaZ+Bj2sHA_vd8N&U#tF9 zhGfcJ{IaKhRluNtnqQGZ0M|siJ90)qLL#A8Emy12cY~EM$}#O3M5H%1WNNAR_+{mY z`Pak^vl>IDl*_!T)w%UD)A@#jU#>U}>w}mnX^e{q$yCqfU$uWGC-zkZPvZQp$WtF4 zemfh-=jN9$Cw_;!i&XW*Al`A4DSwhy2aDstwZAhipNfU$fkFS?iOL8~;Bjql1GSFp zu)5cvPX*YTe;I7a7`LcLf~+ocus#z-RM`OV-a+4l;E1=D8}ipYOBZ#Y69mB{gvCJz ze7Cc=RYT!WZgzPxtS%&*8(>8=Usj4O`yk2sOw-Y7iMj8eJMC)8U?jCeT)kf)GzB&D zZ8l;F{&PbPHFj(%r?A$Cq+eVgc9$QShYfNP{X#C7f8l#(f>WCcE^p-fvAksW`}y=hKEfAzod`L@87L;n7M>1332-d6X#X(IWMV} z3l^I7C@8kyo1aFJs1FMMhTI8j4C5T5^BB5s>^<(P#){wgVSq14LrLO{L*Ss5nd05c z)2+kbQf%{9P*reo5OTb*~C11pK2TJaNQ99vg7{mwd@hxEo3l8JbN$UHde>m3(+~{j(6XaAop%VHZ=?$SxwZTC;X;EFvp<=bJL&mlpUFBjC@)J zaX}=664k?uonEfqMZLBA_t~^=JY?VmFHL#X6Y4Sv3o8ui(E=oA~vD8(+s*YWNn;Ws47&6sfE@J-9<(*UXq;Ng;Y zh6UO=9dNrpJf#)z{SILqEn)h~z78HQ+~WO9`6*lAMDkmam0MT1X0k_eJ35NY%Flj< zqoD7OPsfa{kFw-jmO>8ei`_^wp2Na$xM1!09K@i3^3VPPJ4;F7p>Q|E^o?=mu~;rh z&(8!zyX7=B1qFrj!Nks!t<4El-69n90=Ut0^Pn;Gh%7X8>DOqd0jD9W){VPqk^!k6 zBDzVc=bpi4;5V^nom=-+3|CpHM7nkY7zmZ_#^&bNwpz#nwku)F=&)A?YD%O{r5`_1 zhW$UDzB``k{{8t zKT8AnM4h9-H>xD7v|N~^F&f&+M8&p-IquQIe%G<*!ddVRxDo723UAou&FT%YsYO=G z`ECQ<$S=0dX?(dh{eD|4??_QU{NevXZV`sQS=SE<7QCQ47?{3in4MhT@!p2>L;G&% zG_lH#dCg-jNaW=IfS%@O$=KQRF_ZmaVnh*9$yK zdYY~%@v|y%Nu;#vW6s9Cu4*z6!%X)@Mn^9%H)ZSS=q)AKS>zgXiu|I_EPWY-{pRcYSUM7n~|-K*}8uHtEKo+?#}^I z!$%D}SL?GiU*(d2&ymCh1&6`^Se2q4*S)_Cf>1;Vk3KTeu_^for>e`7z^*-p=l%W}TfLuT4^S64aq6|_VuY1%Rt_&X?e!BDPVXP#^sEz!4GEjgw`Thy@8vk&4 zttPxiLg_HUFs7wFAMVLKR;jG;n_u@$hOoEitCEg`V5AMOuICD=1Pb}-QOf!)!q6}CtMU#5N=fvHhYSom8ik5-F_*JqQ2q@oFVEE-@ z0dtKdwCs!*b5&z>LC1v`hG$xxMFK=oOt%Id6G$F0zar!BAC# z&Ws7H%wze+hO6l;#rRx;o2%3^K00BFTPmv}g6xggpr?MkWGXQYswfhF;9~zj3NXrA zR!eFtePPNFd_I@w)oJhCM>_w$z46et`Zu7>$+lhYl2m-LcUE0c#|=g5 zwAHgqHLy}`dOW?m&d#~MGb%FQU7u$lZr&RXW;`Tm_XSqjix_@KTx6}9kK>R$q0b)# z>uxpG8P4|=#8y5OfHWcqG7@Q1^rf+%X4H}PEtrPc9=9ubcB1#FeQD+9=avCDtqfJW zG4ASO3|VW-45alUd~HF`IXAXjlZiN~1$cUYJTiJpcBRTHFl9Df@cEs-9J|A6`xdA2 zsWv+riT->Voz$0zi;k z7gEl_(3gP3YMjW!C!r9xQELmo##NY~yR5Tm5LBD-!3iTL&q||IaSp9pUqJ;xPj6J7 z-0yvoDysfZ@A(isWAT_;Po{^^^P2(6CR+k03+6ggYaLO06O!BiC`CqLL(M@?JO)B- zNm5a|`9b&T9B5tXC7c$=&USy(#pI_gr#peIdHHLzYNPzzJv^axEF7!Vn%FXnyTydq zvKOKfP(UE~Pq9>b{V*31&Oop3)VEvhxAPYV!XJm3fx$&&N0Aq5V>N#%y6=8B0j~Md zLbSr({n0GE^WO3j-lo6MxaqS0u)cMP&}S};mioovB$fBZvQSk(Xn~gcMJ2MnZ!4Ho zbmJ4b+0=Qq$t214CX4&3x{8PTzg=Hl_gv+bOB^*_L**bY`}j-B(L;rOo^2l-De>82 z0*(??8^@t?_ClAHmi}!2lDnZ8UQD9_Dh_(Q7_F7r;Zs`i-`$`uT%XgnmdL7Od4r7| zwFm3l;L*r!{K`cWx>4|2ttWZ*eIpHW9+JArLEr7Pd*^W2=;yDRtIx&>czMdrOr+ib z(LjQZifm5PLA%-<+#`#_KE+g~cL4!^cAfrdVxXMa5dqtgf59P|3dzl(T3nj|&wf}h zV{v0S#Wvn^%OP5PTL)cFJI$+%mrOJk*U`Cd0nduxk5~n!J5tR33R)3AwkjQRJv6E- z3xxiyhrpr2T*i(rJkw8r6EAbVBYp3{LU;Al)YQs!O1SR3b4l&7(T>Q+WCnEiGKE1)%pH9}=l zah>u+ls1qL%yeQEPK1S9`u*q6Z;|r#560@3y^{Au&1Ic-!rVG(6P)DhMYNBZV)Q?6M&tJ^x;{ZyZbq#2HdE^5y{e{mi9pe$j(#q@-e(8}vzx&C) zzW}inJm+%4=@{2Nh*g&RczbLACiM3f*hr4JUr{)J)r3~QWWc*8@9y+D74+`P`2qqD z^?rKgck-t!%>V%0z9WiN#k%*)%XxucXHCA)t3tEk`OAR~%}ZxK`yc($&1UuImnJEE;^D^7XlQH-+=Qj*;UZeB-h=@izy6HM zL>jVb$wN-?8T!d08_;7$DjIfZtNDhyCbKr-muli=?G;}P;q(plH*QjW1*SyNU;Ggl zCU(#+oA!9Q90?|80n&=I?Y@QEe5x@*C>(JJQ8hqCg=c%A$g=+72F1uwf76sq#eD7e zN>$6&D_x(~4!8UyV#=Gh3X%d`)_hcH-b&ce ztYndPY-$1D^Nj7oe=1%L3}md-HItq+KA!7K(;ogRi!5||ENz{M=o56pd_2RcTe6Iw z(u2_~%3BV5zyVy|M-5JykkM`8fCCoSQGe;Pt}JA>8vig**3OhkI3(e~Ou44kS>TV& z==mHw;;H0M!nT(Lu1@ba61gAqV-erD?N;%|0`{ z(lkDl8F`8#gzS2&k=WGg;ftrSrl}b-BL@!}q?onRFmuTS-#DJumaMxXk~r5=gFLI8 zs#H=iArEDiZxg0WR)>TmkH~*~*iiekS=f3c+bY$tj2HEFdV1r!n%=vm(P|H4*Xw&M z?2i*H*Wfolpg=->t~u* z9n6fDE2A=VgJrUAm75&CzP@1Lv< zMLKlHCnpr9&3*W&_^mgZCwOkQmt`++32PJAxsg$az8gpG@?J~oxEe6^1o;nr`1&D; z95m;q{AdwOwazO?HpaZ0n|k8WOx%a=|3VG=>8r{)%nnlp!N!?JVLx7AKSHBXVl|l9 zNW*}oVl1k{v%P%Oe!h~4RAIw2O8?;r+W6q(vFALMA3oOP7spoxPnB-N#o+fm7P`0C z%z2MGvu#4A-tM&ulzMT~S*(20I5alkJ^JR--grWNTOxgz5YwS>q}R$ASNP_c%@!N8 z(Y;)QFT4COHw>HIv{d4fuWjAB4EjjA4%}lM;d{vhkWOo3RkW_3RlcfmY=6b# z+jzev{&h}T zxQZC?ZJcF`HTJUZog+K=)awH7Zvi+zDq31^l6*^Hd@nQ!ruePRmQxpF6gN3ocxZ== zy2+Cc3{~l!k&RR8MjL;s)WUgd_llPXwZ>G`o`@h7xd>+F)V{ z4K>&Zg7=jf_8o5eB`KDAcUq2I8T9a_&*CsdsuE7Bo5Kq+_tw+#L~6gdlTpxnAWIqd zF8W5r$D?6J`0aV=jLpMCnG#C^LFz>0M_{fz5}!_ zQvP#vaY+le;_tGb=A0J6gKVb#zCx zl@1olU$^Vb58QVLmpXBlT$`KfHRBFV`R9d%8Y_&1mV>vdA~N1NVNSd|TGhHVtnmz( z@$ilgy~SbdEw*RiUf{?!xQ&FKlC@OfimmA*$My9x_u02@bL_=YF>I;vs$c)C@!Tul zi=5gr)onIiJt7yq)H(S&$to;t&iKIU5PeSW=6uA)Os@<78h0V8F~xP3-d)F>`ns|c zY^10*puLxBFKgZ#DM>58E>uc~Fvw&$CCZi350C$(;owtvsu-2ms{8~<`vyr8tE#im z0~7<0URIvo`mUw>y}9=@g;HtK&G7qI#7Yx?O17pXC%=0b?lXeVnDP_6-mev6xP5PZ1#KDpYA4|+}VAqRJqsNoQ z|1(74F)?5-DXNEI@Z(jsXc3cZ3x5iff|1X*xXS4yR8thzZ)e9hdA8nL4(t9L*_BZ% zzf$=l)>HhHIKFM9zKodEP{OYQnIcSOa?=LI;Z^MPBdd|Ldcj7hTpA(%>)Anzmo zXB_K73^I+rmv-~9G0*Eow<09=?JR0_pLhG<9f#+$C zobw*}S&#hvp{L74rkBgeNM}$n^bnV5yZx|oYxZ{W=<|8STE$LMQSdSochi9#Xsm=h zrdXLnv~g12+}8L6r~6;}o;y?G$Ylb}@rLGR&*~*Ha@weQ>(8Gl>fw3<&BeQM{8jeC z*b`h~(;wY$7zL6!F4q5gpPc-72a?v^zuOUxzL;e3z?TXpqaM3z({FI{<36c#_oI9IS-1i?J)21ZoDn! zesDW%pqwmdqZVIR$1+!LBp_mqAqERga<(%EW!JGP(nzg!B~t=<{paue$#)#vLsmN` zQ~e4~a!O`B#wy^QKdwNhyTf*-t>hGz`r~3eu6?cRiwSCyFo1y(9XIr6+U@1$dPHmp zmS0(iQ=JD_Ps0nP+{s%kC(gU$1jtif_$>0MBRsX8~+4$6QII5 ztZb+ujnRtst(vgpUPXuKK>zD3Yy=1zCiE=M^G{g$#^3mM3JNQHaGH4oF7l*;EaeS% zpgU_Acahxwiy^r1QKTuIkbHP7?N^FrZEC=`d5a6Cd{xpW1>_@_L$TrU?ufv&=hI?@V{YAdWpsazY#hdC{0gsKvqz}e~qa>K<10m_lBT3;h3;t(a z8x>#j$Tz&x#&%pCe_#;F_kO;C#&3-e+BMyB>6AbpXK9*LWX)B1_ zVlhMUvwI0A(*C)bT6^mH!8VDVS8C7IH|E8yx>*XdNe7=D)kqMN4W1~xeN`-6%HNuGuX2 zem_UFxY=mI+4k_p0*oS#FO3TmwYir2utw4mMq)uDg&eTebz|5A1?js{(>`j0tXW_| zos*0{-F2Upb*K^lOTlVkr#zN#ZqTCf+#4HE=}-2Ak-H1>Pd~k|>T$*}PBpy0-&?2| zlUR%5t{Az#u5!vc@{cNwlfer23*i{0t&uknbC2H!UI8%+zG}Vd^n#*b$sQA^#R^0L5|J4H2V5`~z_D~1@ zdwn3KV5Ki7ut4Y&o&Hz9{e+Uu7<1pj1-LO(9!!DZbPc3|q(!oCrk2R&uyoD)WUUKN zeiVunx==%prnI8qS-iv=#mBRtbm)_63R^a#H7$@K-K9skd$Mi2uW5_ETx2w*#cgFz4LIyVrkbTh=r@ zTOn@KqF^UWrCI087tHvZR_yo9z(b5m!^Fe{sB{!a;>e!HORU4;hlf~zU*q2!v}wsj z?9Cl39($<}R*$zm?~79E5!~B!xRMzAq`*tY9s90X2GYn5`H6Fika&Yt&``beCE~U< z3HDK$uD<=VBe!w@!v0~ulI5S%@*WO+-I+0Mh59=l_HrPW8n-yW{pl)&XW5f2L1Muf z@)qfyvK-=mPhgylZ@PvQMuvvZH}|sN8b{E(DksI&8QhH)A-#x zS&275B-z*=6TtU&_!Et|dGV{C5ozGpKYyip0(CoohEZBV2otrcZgWh3j?P$}dq*J8 zn7osALkaGewOEy}rYwh)*F}D3o7BDhI(N6@9RF+gr_Yyjf33+PZ~kGIp+=``=-x zN~qFVEZ^MpozJa@@tB|5Nkz_r**SQlar8-satZDWirIqzSTHqPtdeY(RYKK*A$RZ= z3cN^E{nsQA5&e|UkHVGjeSI#=BkWjal;h&4LJAPuE^WZn)6srX24gN+FtbxxXA`^F~2Vy2g6_%>|#s3Std{@u@Oqq}C z2g5Q;Dd!H9xnrZ6ycXno^u2VARR&(nzH}OEyTJR- zr~Hqxa7hg>)h8wA1x4H{#Wg&g`^%UiV&GLXf!A~ckZUlRq0`v-wLds4MPG^r7vFj}SRMsUEtx*ddoiI5}jLtVEu&Hwv> zOSFyzW=<^~0oS4A6SnKPwb5KmbP_wtJWl<(RfiJ1&z=H8C^8L62XV2ip`AUo2wsgd)da1>SP9<6JO)=D~vt zPF*6C-7!gPda(|41NO@p%_JI$!_!kyDFxa|%JDu!n*ebba;#^&>%YU zYlK2nG?d9n^DkPJwhuw^R!5XOgMOLT{lA;FSjV=UbPxi6E+n@rz5h`N$kpIhvjP9v zw@PI)E7iCplqQIbpBu?(E^895Tq2ZG-j(}@5B++3|0Nt)h1v3A%Xrihq4szu0^fl6 z(HNEa8M;OOXpx=Aum``T??!V@Ne9UNRr9CmOmgQhTI{hGlz#qvbL?VvN2&!U+z2N% z-2X=B+A4WW8B-alrI}Yz80ibYYz{Pl9d=7T1*i- z%E#H=Wd}$-*pHmo(n@5y{P^3A<^x7zlx(6KhMM4!C2qzxe#O^G{9VFbP0J!nx~$4| z0r9A3de$G|X@53b%AZxZJ6-jFKIZTXT+niIm@TTe%QoQ^0Z7u{-`#Euo?|Zf_qZ8B zI9jV9)y25mAWlq)A#b=JZ&cl2ZFz6ma)f{(D~y>J?NM`4CVi}#zP;?rX?Z^Lw@ZbA zK;TD)AceF0E~ed%7sOI#w0|}?YqmaH47$L!&zQpim0NadPxf}GES2&gD?l=GFXuo* zRl6P?vto)9kguJz;k~-cXogw3KIRmAB7oC$Wa0 zic&zTe~ceQ%to+ur^V8nTLUR5?+!G@FdzS`h^C@SgwrXy%kcbF&toI}*-9Js=#w0# z(s<8@Y*2+#d0+TAqtE+t@@L~~KirvP z>8(4MF|A+7I3V(6!2GhGN1;ytIWCAZ@xBJBRVAy~8@=AW$muGqN{?l&+|-ADgXrK$baLx+a@?%a6%n4bv5tHRh zqYqKgI7_boW^4RNwCotF`NG+oylbp9 zQLcdfWrExi-n&@{LI5-4Vn>ZmyRVzo3%IJO74)Ak^R7+Nlj%@z5>G9Xa_G_v5ePG> zShj$I=9B1NYH{;>Ul<$46JP&!1qxz~OV!+Sp&5?XlSwlidKZ)GJMwg{H~09;l$G@f z>U)n_WJ=o}MV3hO69&`~-TPZfzv1!7#8Wt6Cyt@2vYR?c{fxg?pSoaL0DWL*&v3g_tTi1l13|vpl5#gV#LTbo z{|7!>`)5tTn<(ToF7YwbZ%(n{I-^{;JV$J0JHFcE(DfSfaoKQTGDoy*ehMGln{IG;$8D|0U5-X#b0$M`sLf!lTETI_C2Pdd%3K`EL^zY&MI&NNm@yI)cV zkX{|$OQ?vv#Btx-3`xr;S#fn%OkpOiJRZW+%_SmI;E*hTDUod}*|ug+l$vN5xi1np zWraQ;45|&J`U^j}UT6ZS)DhWtcj0%F@TZ%~ZC6-=<|j<~TlcE{f#KT0tyAjM?>_w0 zhd1Ir?|^CJ605@!UMkhJfNQ|7o^OfK1B@SNnIx4afK)PDhkWwWea58oZn;jK6_v?r z;CxhG)HQP3clZg?I66MoPoTUvZoH)I9>s;}yDB<-K%B=GzTsdC0|8-d={F&63~Uhh zP5jhD1fs-cYMI;ga~aLebxoi4d{va<;iO6iL84{0>vm&#Q{V^M$kZ=eBo^<5>!`ds z_O+-RJ(1(e539k=eLGI7&_}We0FE2TB z;Ph_rP;HjlL?D3u1lfHV`g$%*o&BHu85p|Lc7?3=;eP>wV>M2SYhvaUH6yc6>SIpM zIa$gyuCiG4Dx3#QA8>I!FDkucH|e_#UUj@GvZN?Pv!et~zVlRb*)eAV+nId`=Kfan zS&!9A*^$rZUd9@*1TjxsNPa(~X2}1a^+-*~WpFIZcar-GIT-*Ps*9AE!7}gZYceb) z;~8cS9r;l^I&D&eRiQi1YGLK=<@A7po&mVB3~i?$p|u1trY;DYugl%92LbcR#8m9=-e zI%72G|GW*9nwXfl(7b(V!@63t>8w9gZ$w%lgy9U`|F>;6Gm&@LU4?b zlTDiZT6WgEQB_Fibj!#?|LXdu~615j88Yo&4fit|w-0uU{mM zDW$2yS{;*>jp24JuHF%m_fJuLGd!1bpc-4Xw^cbcv*+MWYNB}cGOApAsr#uBT-)<2 zt{*=azhp9ezET~hy&E}Q2gcm1e}BI(Wqo(qx*Ev5h_Sin@!)tK@yO?ARD7f{9Wis| z?gydeGbvisj0-M%IazrV_)VGhOG|t&ANj6L*x#LaH!4!RB?E;XsKlER-N0mpRrrM+ z(84YXuxA{!Us7oO@8zRM$iY#<;i=Mv&kN-0MyApGH*-5-lvBB?u-&h7{lXKYLa(=dm)8|UWyF3nF?-|b2>J%f0XdVDBnJl zh=vYn)KZ43}0*Ub+)#NKRY1Z76qP=?;N{s>L^#dH$|J|5!r%qrEtFPU; zSwyoNc{WCnheP!)l;8Dwr8C}TJm3oY@gn+btn!KoTw}oSO=*lCURPY2(g6P6gg;?B z@eb+9HFDDD>*#$6E%7nY`z}o2W}Zuj99DEbMp0Koty$yJV%9sSvYQG%GxDLGTj9nd z*KS0YZ}7Z!*CF*hz`@C?bDEc>kEQ?%Wk@LP6VAhkF)nvuu2{6ta=i=e`jy}>2Hl7< z`;cfCHYT+8F{wk1k}z#wvAvF$510B*pZ^^Tct>uq3uJS1@QZ}+sw?EvD~U&jN~iYK_ULAW4U zE8JD%jC4Ow;&#dOw>UJCvL&gJT6=r#6MT*HYuDwxnny^D(}=A^X+w@rP7$@ zJJ&`!+TVL`9?!sRM905r?y~jz4Sb{~Om@hDhdMHsMBR%Fea9!zklhAy9)l&By(X=C zSYe6zPyQTwU#DyF9OR~f-nhc)D>FnBp*|dio9J_t zYJ(?!@pL=!U&HyUn$ft`=l_12;3-kF{%@qP|z!e-}1M-{!xmt7y{CZvX(+;Z`53ZngH8_ zRGJ4j_U_~&e+}b5e0Z=y@V|&IWHM!iBH`(3e3?^*JSge%jPcwv%<0AqTetuA8KNxx zpCz|`9ca#QvS|>6oIqO3;9;p-k(}2ar(nN(d(c^P?MqUA{d~Z^mZffl@J%?$9;H!Z ztMD%9*opJ1o4OY7Q~4~BE96ic3I#04Hss~K6r`q4`u5Nd^0HpJYnX(UNl; z5&hV_DGQXOEuDh+uHN#U+?)`5;X&IUcjhp=5iR+iW*~3noL7F9zS1Qz3La5>W0|(L zap9-?7u$qC7zesgDavQkawC#DO!&rsFc%e58vvOV7QhC*dr%McFQ(K!gf3u0Vx0c% zf1=scTQ^w!d^C>qoVZx*Ij8|Xv&Y4!-=1eMHynYQu@Ce;e(!IE()~%N(OENpslcoI z)*U{X*D(H5KNKKHwSh_=+Ho3pQPB?B$6iS@jZ*aTbLHZL;v#UAJ;MYG>FxmVn2Bc` ze@6+qpKfURn%P(8pGRDL>pAF5rn@8(XM6kMPJ=D0Z${|E^yreEPVZ`w zr9375^})X&EXp#W7{d%013e`6V6mVyP~G^`=_^;imWIaNO@&+Bi!gwTQd6}*FWp2> zJ4B4$BySn5H30|O#>%up{`<(;rbDn3N}!mfdjjXRI(n60E=*breEv5g{1HsYJ!{`$ z0vmzOn7s(^cdW^GoGsn3i^c0yezvrPi>{WHJBvIXK?AvZAc)i3KJni+u0*}C!?jqM zUJen9BT@|Dge%?`0}A$R#jP%Sy9^rl*+X~|p`gc7-PJNtmlSRa#hRjI|J{fj)V%PC z2C5lC;-d(h8PA!K0Hp&GaE4hW?NJo|i$JQj7H+H`dCBz<7gSyzFljOV zO!e9kd$TlYj30(hLzxyPHT)#+6_a8@+?Tb%%G_mbm;+_hW*E?p?L(uZ!YQ@@Vr!vA+)j8N_7SBp?qH4~fPW`Hce* zF-lc9Gt-o&)3`62J8kWEhi}2@=hA5#8|j z)0oM(Tw24H5t|wqrc}RxCl;_5wOh<4RbsStrA>Hs?tlL&19y;a1YOn#6PTUBe z(yaJJ5_AfPn3Y~J{&3Z9m4rGW;^eqc+;%3xsVXN{@TVXp!eabOCS@D1OX?|yOg;uEeAgm?$FDh>q*^9Uce(fx0cDQe-<*QB0x zeeHSmw}Jt}9Ux_4PzkYMpM`q5VOlPe^?^O~O?{;|&;*q|4}vlCQS0>@5W&cf@g?6S zUODIW*VS+45Tlen-S7)@%r1?gu^w~JFkL7PvDP7N&{AC(N70*FoE4J#8Oo!;hR5#s zx{#Qqh9mD7V;@8~|qX}@}Vh*AF)I9K0d4^41 z^zSYKLw=!$mjbSt6=~xTmFAE4y!L{hrorxrhTkm0D3}Vvet*7ub%w;)(9|?FU&0w@ zdF~GlL{x{Mp)@cMzVzpj4(ff$rDnewN%kP3Wlmfqxml~Gz~l%$wmU``%$C)0f)Q8;hblmZ45Y+O@(`&xQq}a$Ympm$e2|JbI|x%ccL7;G%)pm zZl!C7zdm?tKxd8SGwcU`=gRzFEdVs-%oT;mgIkI|#aY~$s-r6E;xd?)I-2nFSB#%O zfBsf-N(2N>Xa6O%Dyx_o>CKsxY{py>pfH9(!V2DI3{-{pe%)t&f!8i^%4ibn%P3#f zw~>goJHKe%Az^OUlBfAIMOx&0 z05d}=d73vGg})SURIn|v>Qr3bub-ND!*7qguo+g)j3uZus6}A09ZDR(w6xG`;c?-4=(xt`iqQm?~a_lU+O&t*l(co+@5h)G${ zKNA-fS92NiFC{Btk`<5cGJgBkd%lnhV;@^CtFF%2o@Xy^Lv-u^Pw_8^E-3DAZ%h1N zeG4yv*RD!isJ_qNSpqu`fm_xJhQ02@xBE>(YC9niG3jq^wkh8+p7h2#cbKvd;G`9v zcwbZesL7dJtU9)HdIm}NTTNmkvPJ==2S4sp=RH(v`!Gu`;>t$nHS{@br432ioYZd2 z6=i=P7Y`|F!ksK|_YV0>IIqk+v!f~g56QhZ{5ojrRfzP`w{}1dDQPcp$o9v?N=D%F zQ}l^$`tlU39gXN~S??)Y`P~dPm*z>c(jRok(9E7Vxr_zz_5-0PI=|Pc$K?xcto8cB z5NdW!>Tx1XJ@mQGl7LaZe-1;7hfK+%d<=u#))TuF8tc_nWTiDp?fm)R{UpZSPeeu3 zch;#v_E1Y*GNEN6)jvD<-xB)~$01gibL;xS8WR5Au3&m`YQqGEmqxu`2plp{cT7(o zqLJkFa>jPtxsw~?Tcr`PF$~`>3abXc?aI#2{%JY2`RBK&AFaxVnctp4JHP~yWo#d7 zDGUG7{9u7DJogche4{TcI|`t<4M5azSS9NxOVA#bBl;Ud@X_0uuJnjABvv)&54vU~ zA9?CvU@H=X=U_IZ}w`L4`e!}`!;9v$CT&oT9aj)}) z=6G6t-wl!5Vp~YoptfX5Xcyh(xB-k@|9FM0+mIqCS=0-tV*UFAFTA*k{oy@S=@P+9 z^VT7EgAw`>UhM3?2I;YM==i`Eh*JqUdvv&WzP|wF$KedU!ot6wgn~bw*D6O?)qB%! zHZIwR5u_D}EA3(0yEj&8`z{D&-;Qrqb`bea$#XV#p86UmGwmcrnXn@Oh){X{1ow9A5 zE6o+fC;R4iq#wNh(dTRD&*pl22n0SREZR@bduocERIL(>0K!uX+1L#Dm0-5^uzdzC zJ{ExrFN?>xfv3o>y8FZ`WeZ1vSLI|{E*V#}fCW~-oh{TYI`8SR5^8x%*yXfBIU3_0 z0eVnfH|ZvKWug=Iw0_8nI`iMn`X=@_c8$9S21*ON&wT$V+4tO=v~MTEigXf6u~3bW`9& zk`H5kjyH@{z%wn%fqU;{vs+lzp;Z8?&wh*C=xw+Imo=kO)yxt!qGF-H(GoB38Cs1K zbhd#2lAHLypAM#&VkFuFlnS)`KCtk-)P{spQX+dl~L<)0$OK;L}V787V{#x z8nH6<;~pKDD{~hZXIytK2flg_Uv8=14QE^h+tNp>4yBSBiDLS9wn-bI>Et@&EgM8yl;VqYk^MG?&9-HFR}zf1W(~_3?VzroXnNclNJ$ znt_3p`*&i-D*>E)YVfHP`^a2q@JtghUvaZi2YV?xrAVc@jo4*cDz(N}Ls1p!f{b;z-j1NAy1DBw69$jut5VWy3r2K{5V&XsXdi+bVs| z0C^mOFoXG8US$ei$Rf8WBH_*J_MUbs9%0Y3N1-mB>IOjC&ETO za_4;pJ)#xwew`)glHSTC7R(5N{U5$+R$(2E1l{7olum(=o&)pI^j89!f#C+)R`RJ( z6WY=BZIn)+7;3`iDM+4ulIt$;<6vTC>f2Kvp3Fi7x9hyaG*4?0gVS2#X- zcs`P(ucM<$^4Y)hmLj8k{KhXZ0+9|Uly%T+k^%a{KJJ3mcA_if5XVlnNR;G<((749 zc7lsVXCQfp6{fB|=T-89pvV1t-8bhE0zGGjWyKUiBB)AY4ybFnW)V>|L&Naxqo+=3 zhe*C>P(h0|EP`=CbZR2r3*n`(-9i6#Xr#1DjgFqJl8}|cgeFk2F!d0irCu534{$NV zeEGYrKm2U|$wsvZ!ikbjk)hHBBVV#96u;-hfjwx9EDT*gH-nD$jPVJ%(H&9``ML&|HeRZfONSO5=mcZlc+frc}~l$bq>e*p^Li)mfellpye7q0-bGja%zKmIX#< zQTbC>Hld+wxr26kcAOz7w-d4d6(0h*(stcMC30;H2S`|+A1Yy^+ZGp&iqgKlQd#^K zy&qt=`Qe+dC=AMC9-w;81#IN?yp!{OJM7uz@VJ{E&#tED>JMTLxy>3SnRL$}`_SrK zG_h<_uG5{5d=HGdaw7DN3LU>JTB{y{8(guPprAi_((lbb5fh@)6wdF_x4cmTwL_tC z)~haPCe=NPV$F$b-CZ9vp)Fh_9#cvIhS+6DphNwY-a$+ zzMXA$QN*r2_;jAsDufCx0Qj$fPL~hpk%#9drOov5b$Y2wZgh~Wy8KdR-E~#b`Y9VX z#ztds6sFpOrs_5c9QZnGV2yflJtO#(ORfB$g{+2*+i*j0n1*H_-Qio9r>9%mcN zLasmSO_qvi(rEnhm7(giUdm;b$Ebhu~UA2}aeL zIrPIhfKiYZQ(l)g)05oG9|u4vckcu=J9l9kbm)@l+gch#mFz?|H#f8D@hp!n6cWQZ z$ey(ia5Xr)Sv22{dNtRapOY4$-T>z_%BLW$P1hi^Q+|C|?%tzx+f?DUuB$80lG zoz&0WXd(n{WR(ovQIfI`r~WZJ#OxCU8q{&;93?QU^A+~`OUydKxo(c{iV$uVgcKV% zH?74>Z06xO(#<7sGdxiZ5vOxA2bS5IjB?zrKqeG|effpdyYBo}5kP#m8Cx9v@Cow6 z=7uv7_-_JFZd`pbfL`1zj%1*gcD&1~$=y;aHXPiEye@dlk8{7l6n2Sh~V&57> zYat)L0xFAPoIs`p&Kr)$DqIx2RdIWG{i6rQ&>WIl-kEVBJwM` zF>+VAWL-5j{wl$h1z9)1ox8tBC*u6GymzKfLCWD;#}N#w=h9Rc>p`es-`6$+w8x(c z*|k||$Te!R1O-?pKQr@Qj!cglG><`xvC-DZ){c;j9TT+Uyz!t@R<4F1ODOJVf>*#8 zetllypqDg|XGb?~Oe(Wj?|v22%ut0%uKF&j0MnvD2P?0Go2T7M{|3B|zhUZEU08Os z#fns9=&s*OgZA^lZ^6M_ZWxbYIUe#cUf;d?(~i#i?K86i@E=ENFN6Ptd7rHT0f@em zx8`;$HLma&*`5t)8E8ShqjCSZH}KIvRP+3R=<21??%qpo#>q((5DGNUe>| z{Kt7HY0qUds66M!lo$-rTAN=E=Uwn4KcswuA3|?O7)_NzYPkmg9**YAHimO%K%?Ta zLr88+j~gqBRLs0*8@t{}9%}e`nJ$@CXYjk|IlEui;gVh|QMF0hGreA|=uhoraXz6~ zu=*3{r+^lWxa|V6P6ku7V^bugR8?A?!8(;Ac-O&FD@AJS52#&#dP#Hy`@^P3>EDL- zBE>5aI5-M6j9QOQvbv0h%JboRMwV;RZt)ON0b`c~S(`GH&;C!ukzWgpC$$jt!j6Lf*ZJ}l zNWqKhISljFuH|Pk7(dz{0z(*$<+bhoaQzsHLn^GZ^ocM0CZH&|6}XT1EJc( z|M4?~ic%>%qg1GDQOGjxZB?Yb2%}V#7^N&(&Xfw-S|!_5id#g;zRbv0*^)xGu@uTS zlWj2O{GK!Fe(vY{`}}pQJLjDD``Mq@^E~hO1s~PtSu5pm?;~Bb*mQ?1GDO{y=u%{= z#Q6B6)Fy%-^t2x;(;XtM;Y@zS)dQz1i?)`VJiNAnZzB^}5sP+)w+tFegT4}A$|__) zjiRx8tJ3g{+_JCB1kKy782d~-JyR2%T0uJ0foXD`Tj;DbXdvh!@;UZk8#jVa80f-~ z%L&Ap-F+9T%^%A@|7svfETZz(y5_CidJ~VMx^Aj!piGNS{1673|~TU$}_+_v3;K+gtk_K0Yq_vy;jQh#~ks z48t-#nSVvbO~!T5+=q+e3RHF?0lGokP70_U2(~_ZG-GwuC)Yfij>~x;va*{rs#3>? zqu0G!w&vEdH9O!Swp*)&w2^s)W%K@;w`!?@gwDGY!VD#g+80R$BgVXhJ^`J8_(w4# z-pooOsw;^qGi5}0~GjAvoEg1QYBr^+TBN1S|>8Ajc7#fOA9N06W^v*^jdbpyN+OHajzig3+CcMiN8$DVW(&(IMi-t1@c6UCMt@KARrQx85r zxdMR~_LP$t12K;OY%030O5&ucbo(K)@j@TX37x;BBR&U`xLv9&a&jo0;G*vPi-w|?Wa)R9)S z1%$%9=5rZ(&&4wbV=1;2KR9>UJX-fcN009)Ef|H3l%qK_Ejee9Ae2p1;pudSxqJb# zxJ~>VeH0Z%bkG}%-z$ae6_Kp;xDS^l3Q{O7%T#$f_E&ar>&DY;M~Ppzw!UFn7z~lQ zJ+4?ccB-#LF*j?W=_+{fXO2ohSnHV%YY+KVJV(lx>mizcl+dD&Cp+)&l|(uediGzz zzPq?Oe{|#uR#%^@3`}+AmA<8m58cadhvkqFt}<^X5N%kz4wo7k;Pyy!WBV6-HrcYQ z3X$FD^F$OOa!ln0Fn22IX793&$>K?oFf_^*)8sLE?n$#!BTroL56;8(&eRF<+9}V+FFXg@ zr}q#$YhLO6)k720@R|HRq$!w#EU~LK9PyRhaBPV#FH`KynKIOwRCN~E)IW|(iS4K+ z&&T*zc)kF>ARkWMF9^K!vTJlFzQn~s^vJumJ=VYCt0c1bb~)okxDm#KxC(0XgZ)K5!;opY3NViAboYpza#GiW&3jN7*XP!9Y2jlJD z?j0+7FoxZGCh6T3_FQbMVZiScMvxLj& zjSAgmAkD3#?qMo?H$fJ-omE+gxFS(oL4YhL^94O?(ALVYn{YV}LD|e>t>tJPo6;hE znP|t~TLY)=Z$ohzifhbbSzIkmpBcPp7qvp96%~7JNAhv&WPVtO$ql@Y!j)6vE)7>z z?6+}}l1Y2;_feu>;sQvX&n-1OgUo|&s8NmFsFISEqR4hN#OC7r=l83=KW39(o&Nl? zyd0HW#q%3wKDZX4roq#}Wf;t52xbQ4(ge(8vH6+7uVhhZ9shpuhI_5gLm{fc#)T>2 zL;t|>u?4Ng>t>*X=*L-j&d(|4WH(6y-<0QwQ8P397-84kO9n94(eOtgX>~V7@;6j; z^c&g#6DPnB(&fEixGh9RiZ?iMO9!QpTQ|`rE>L!eG#}^n%r#JWsp=TCpzX*k4c`&8 zf}C&Jzld*<_BafNe+Udg)TI!OQ1(BuZo;MrCoqAI?3>4J7^}MolB>6fOv6_rfsG9q z!Sl?9WmMqzjS>>0_XkSr~va@wLG7 zBBAidzyPee4#}>@rp0hs6a}iP8@@c095yNCT}onj_mRzC9LhkJ_z*g;iE5m3a#B6U zE#1J&Ows44Y=aj`{$@5&nrCsGZ}da~RyeoGp*0nRP6RmH6{=I0j<}gWZIxwbc+w4V zCf6+&#I6U;F&VzvdW8Y}#mx+fYl$0$6D%@TYGHV;q#ILLtIS*4SzxV>gd&dHjv~2( z8IN&~@^0Z()N^L?iA(q|NOr?FU<9A($MdAJ(gVbKUN*>&^6&>#;YHS=o8k%dT~ zM2{2_-iBzIa_b}!n^Bq}Sbw^nxXVFR?xZ3ENFpVVB`(5L@IOJNLe6p@GM|7g84{yz zbaP!VMD0(+RLtJ4d1xaGiY#0GIm3x<*?_C^c5kNw?ZX#XmPgS@;6yjQD?28!A_{-c z0=!tz6czhY2xe?VH40ZZy8f_zwH(n18d8n*?zO6p(bI&{R`bJ#UoYqn(N)Ani7mDU z;%n`=hF~s3F#id*N3Qw`B;1OxLW7(%$AMI9AZ--ge(Cz7@sbWXm;S=nb_OXNcp7r8 zg2cGAi7%}&s_c~G<%KVs9SB75V;tbj9V>crFjC`uHlj5z zR;G1-E{Mq7_ci_%RTm>ocvn&ag|`$-?;>T6x@7VB(*@%A`tr_A@YNI(y$=Em1Npu^ zNacDYR`h=Ndc;N=H?&7^fCjpIV0{TOo1A%6Y6jg6gS3$%U2v|{2y#NdiqRa zh{CRi{1vG_MDAbBj8;Qp6YPj!SXN;3~XSJDY!CPoU~>WvzP-R%o)p z*9kY0(7nj#b8I)$HRCc?H!fp3r-xpBNyyf>*zp75qkE9@c!I9L{C|4^+`4W^35TIx zeZth#DNo!atn8*wB9fTPr1~&K0ySpq5ZndaC?mzA3aX3gS`~YhG6kI?Q0PAX%bGB+hFO33X(r>slPmyuI24fB8mhs zUa(gn8e)=QzGtxGXi@_Yk31~o#1Fx$4O?=8FfSIRh3`zsyTJPG`0g{AlPC5#!tdaY zH#$fyvMy{nQoB0C5=lJ!0j$fC4ZN8tXoO^~WX&=KLthe;8ltTW7QxeQqG;w>PQ6fJEi|+&(E-yoSk0RC+sGkI% zppc*r6&#Nx+!h4Zgju}ydY>U(ko4uo1|-F#FBYPieR1!vy~PQF+iJd9!$ZT#oS}(a zu*G-rfb1=JdlHuQ_OhvlLb$kUm5oj)^=LV%!eB#1D%o(wJ-ZH9+=W!bLyNw3kgnMczW16O8*sMeCg zymnR{D2)_m6*0YnZ&>@-6t%}i3#mQx*<=t-^SV=m1|JzFhylFqtdKggx;p)!Jxhq1 z6Ny|8MD@ExadQ!Z-gDqO;(x#%gCA#M=`_M6`IS7;>)4fS+Ib>X9-^Hw{f9_wt$ZhG zW7XBL^sFnb6YZf95klZTi$pd~C?4Kl#f(P(wi#s}De!Ze%pbBOP0bfsJm~V&k-{$2 z`?W8+hdkVx6O(epdH6)*)lvTpIxjR+fQe&&oqmo|B&i_xPGerszLBon+Uk|2J1k5+t|P--oyHNrn1k)u;zVpQ@W&Njldm`hH_&MR)DRTjM&{CIvB8$( z5R;6jSg(NiYNt9oq8M?T_!@V-s$QJC)ep{-<+b`Bs&D24fL5$7`)K1@0TR+Ls9 z68US*40xvKKa`Ltn^2_ZoDkq9otoNnzV7NwfcX&V$>O=|fh>jizMZGU~|{ z$dOm)Mv`yNmVrWk*@U@V{rIB1+&&QjFGYSzKy1fgD?L z+}YCb)%d+;3NF+cZDO~5M@P0E=Ss<8U{)b8xr%Yy2D+ISu5-k}r5Z-4BG+%C)bHz` zZb0Ncg-vCSDIVOj=lQa#$gIX^MxDgR)-@N6O)utvN$93abL#T7c7gVhxqaf;R9;g# z9rS=G3ogcEC|M{3`zpXtdv;d#IKh6+zUXAc?K3@S<@zHj&ulbAz-vEx#9Mqjb^>2c z2si*py**)D>YXIwWIo3e^kHimsoH;m(jfrO*9mU0F4WByFukE{H%7EVf?SKYu5Z9b zucH}Xjge^s(~B*1aTlC@q}(nVZtd_bNnt9ORYCada(h$o@7upsA>ojCSdR&qcCg4* zk0Vd3Uy>hURu@nG=AXDURt(86pMz|s19xjhaX^;D@QFxIuHXi;j6z7napc(2PbnSRv~38>)!zMnR=C@TgyGM(5%W z5V*?U4^=J=12!js$Y??E~;{0)8zFkU1H<0QB4jRDsAc{??o zJB)uF-Nl&%bHI;sE#4TL?J0jtr|@RN!OGYk6Zp8EyY-C^QVsMT_7PFB7P##RoAyC2 z&6Es*Atu-LhNZDvv7bhv+7;3g9y}V|rnK-z(k<}6I^26D9kX$^0w4E)JRZwi_fx?1 z%^u{#_l+TvnqW}@BOj|XzIx4E$;6p z2-x@rJNfnrFJ(sa9f$+1b1!}U1ZhxJ2QMyef@v>;Ydn0}0g{#xImmo!PMPm@9J0;u z12uhHzUSoNqR8#G$g%88R1_jf|Bw6c?E&n!s^OU|N$jSWMT&AB?r-{oi# zVj4&})5Oo_U@yz_#Fl9BeoT(6;>8%$imY`WvQ5BO^>jO168Xv03v#_v`ssPmtFxD2 z{xHkBF+Jw19_;;9wj5Am2X|5qv_M=KfFg9G^Q`O;3{^_12WNo#E~EAryT86EMVs_@)fHaN^m?l$rnM;_E9gv8e99di-`3ADpsJ8OBz!DhtS@(dj zV@JiwfkoYLo&cqT%d^?0P)JSAN`bZqJk&&SF`5^Q!GHy1d$WNVo^RBabDMOuwd({- zwbWxs^hv4xBAT7iuzGJ_CwyURKg*g*bHrVZRCp1SqZzXD(fo9V9o(P&-X|H^C%nVq z+*fGmyW+F-GDje_F`E7e&vfVHPFAtC*QEup5@Bo{z0kQ&5{}MT3o*Vq^88oVZqsFl z&nA@WAXkDhv475l;YJSZ3=@P;`>!76S*#wW*B9?SjT@Mgc9(>x%cFJ$vm~gaTaF?9 zn|LQYKA0!yWm5i2ac_tRpS;*1d)tz`73>PqyVDAZVm>)%L4wYbs+Ix$i(z~N{zt&i zap?)j5^3Jb4;Bca_n`sTm=X0USO%HJ(X|DS{}(s$_&uX|fjyNInCpm`Z)cwFYrX&`|+{hPrW@_=*Ok z?xwf*7#Xy;?>`MSpq2o2OSVSz23i6fTS~g_j7Z^~@<$%j&>=B~cfr|PX zeUL$vze|fE%F4=d1wk1d$>Gy=F{+&b+?j_&XQdJDC zyeqK5nph}#?%>67z#K#h01Kq~PNSgG`^;J!cbzkX{9>a=^$J2i$I=>yh6J z=%&~77#*(K;yw$;6xn(Kh#BlEY?^12c;Lmn5G-#CPLMf65Vd#FZdlDo`Gxqi4hu}_ zz$q=QUD1jAC6TAmt!{-m*pp7W)}X)zf>%k?>6jqkO%nTKwf#eGQ^NAwhl8ML$yYD-85@ zPKEhWX1Uq*=8H$GAqEp$yl6W>X+bZy@7zF`&#plu^B{lu_oqatuD|?}lI5%`!U&=3tFJG;ffs>}=C;DF6nL)|;EIRG2ABuz?TaY^cjeO3p*TIn?mL{@|KiX> zNo;3(KRWj6$|WgtSu0;bWzfLnSj_WnBwr0lo0let6@+?V9S z*xEzTEKE`XeyqzCT)+=i`RZjXU5ZBr+qw5HfG7FL5?A?3)~LRJa20o<=|3Ejt7Fd_ zJS6>(H~D9io7gX?O5O#rKY+|%4qtd?**^yQmLvJEg*Lp7iM>15)r~eres9jd0mPbj z6H6iY^Fw&t%HDXfFm}ltF%{Y3@{{Y4m7TQeG-TeLy{QfTB0OgP&i_$pu$Mb3f`AKp zLAcw=<&3;hcVFg+d|QAS?@apFAeQlcd0Zv-KHQ~)O>(Z{L?X{7ZVHv7%Gh46lmvEU z-oM%s!x<4O%n!zn-4pl{C41=Akr|)bR@>gY-{!^rkAnij2=nf(KF>Xxtdl-I|4aWu zBy00R#1Fo}i`fgsMiAg~zJp$?kKufl;tD=9%jHm-A|;V4U!F=@9B z?iIaV3=XpW61@izP(?mpt3W@QU7G%*KRdWM$C*B0y1&+3g?8mFJ#aGNLgdRZd0RWw zNH~9fSaGS@5MQJ;hCE;GjI|6&KqKTPQ6#Ufy4pOKLwb*XsSn5DbjcRif5~3zP}$?x zy#e6{kO}h>o?W=M&Vt8g5-x4|*I9$6Gab2()$A3padEb*z_Fk-)A=esfCbC^I*;B-_#8idR<4M2co*o_o_V$#)k_Tt^xTil49VTPZqt1?@xS zJ50ypP^JJ_-6mR2FGKP%3;^xqW&I|6&^a4?%S z(Qz?-zd?Q)!Z0KW!Q|QdUd}S=Tt*5^9tE@o_G=jaZYeLoNW8rqogBH$W}a{DYeBS@ za|Pu?MxThNW~AF^R;sC z05n0yk)Tv7gNVqr3n~S2M0OqEgIw?=En*bnYdR#;cXYtu1AHEW@w#YYH-+zk+}3Ll zg4~4}yd40%Eyvu(6p`O}#Et)jN8r3X(rRLK8+>+3m}a#D^+# z8H(egPp-PbLn^fbjFRQeQpb}$Mp{-tT>EJ?dk$gI+|2vY^dDj_VB?h4KBcvVMa@Rqx@tSe2KCl2W#M5^k1|yo2lCDY zVsHe`ua8A~dcGZU#oQPt9|zR2hm-WBr|qQ5r)503DQ$HdhgTEmEA!IxQ(p1k98br| z&cB3ULv|xuwtyq45hjXNsIuNzxklHFfT1 zTGjN&;>B2{%8aG|EXrG`+!F!>9;wRpKCk+te|!4??*hfw2N@JT_dWkn!a8KI?d$OP z7d;%pT6VV-^MQT&01(=4n8Ri>F`8DzC6hgov=Wu#!W~>ab}xGFB1zN4FG4CpTm9J< z9W@{VxuWK|?pc2chI|*P>S^0NH!0IA-$>gIwm1PIX9q>?XuPUFDUVe|*@dnvLt8T~ zL$%e%jq!hcIi$RGf!U|F@kc7$03qt*49^j}GiS~~KxF!2H7@RYP$q`#4;1tS3aI-giS9o^_w$Jy90>u^|B7W9zkqzcG!;wXBJJlrOaS_-4uiNzCmVzW@o@3Op+3(4rWR$6%S+5wU}!hyf0VFl3OD z)1ylPNGK(JcEqbu5Q70i!IW;e@gx~GWqW?+UGN0*&H&nZDG@jhpor9GxeYX`mvrMR zrpsB)?SDj#Hx$bUH}nCV?Pv3=$w3~%j9z6?q+b1EbA~r;0|G<|zI@KD2oEq9Vy7yn z7Md!7h%W6DqpBm{kBK5NIhXRxtUNVa4n+U^1&BBK>x*Dce8tL}(}i%yT^>bPVk??+ zDHFMU8GHKbKD=@6cNFqzoUTtgu^}{GFA~C52x$Ob2=ZCLXjDHQfCtHISHFOt6jg%P zbjUZFkJ}ATzTlV~%4_i-Tt>akPo=#8(TE=qPf$Y&JG$Rj5n%A< zG*Hkd0u^bk7`vj2BiXo21X8h-C)ss!dw@ZV#ISNJf!Au;M~drr6O>dqfu(!!u<190 z`NBrcR#^}lF~_ETv1^d}2V0^$1mOgAm4MZ8w!(Z5sF!F8O(7KYl=;KcptGpE3yB?# zDPt#mSI4z#UhO14wH08U`)eU$p{wS|NlUWX3m+L7D6Qfni`w1THo&BlSPi@ZEB!lA zA`J3azyMrU@9Lu{>%6lKJIeu!+{KeGv}> zDzML=R~u$i!d|IF_3H0IUNS18tgT-i`I^hF0pZwLjqu}y-;W=h-78fI=cfsC^-PAa zcc_hiJb<|GnhSp{%Gi*v@@c@-B~<`f?jmDai+_3dZ@NG|jg*OQ#CuolTZ-N6)Q*9p z8o(mX9U2p&Hre^$m4!p==EUfh*1A6;Kf|18?10k4V?O4F22F?}PJcB*>k4L0{EL zpEdFSONx$s6y*vQ=AW?bT8OYAs)W2yaLt@9E^Q*fC-m0laFPaqV-W;^2koC40!|NQ zoTFqb3PEY?e9N0Vem)a89)9&IUVl^!VEkq?-eg8+j}|`@B_sW7c$0%)%TsL)PYw$0 z%@tuBvEP_2N#}mxD;kTngZf(&(Rvmohi}2XooCwm{N7)y)gZvrI`*aO_wU7+(BQM5 zprriP4{0QJ;5F>hE*ZQGIQd#ouVT#qHec?IW$xjI`RXF9_uS0gskj)zM`vK09O9}! zA>M2K&(ij{fe#zg@XneC2L%35m2Apw)t14zF@zVlc_tnY-R=?mjDMIs*_HtK}xdCAx=@pwzK+ z-t&&ny7^bJE5ahbjUB98&LLl518Mx|Jg#S21iA3>=Pc(;DI7Q7W*}(qrz}L}oIz4X zc<%>cR!?~SpQYl7eY+6e#-ScN>CuD%%DiMq5h;%)uqx!zGErtRE@p1q2+)tfU!mq= z-q4HCADf}w2wGW;M~0RIRF1(RXs=xcdZj6|H=#3Q-l3kKtc~$#R~|e}sr#)x5{1}r zuZ+d!6y=R}{8T|k0h1lqgfLP3Jb*`Ld^QzFh)9@jsfb z9;RN7UgwOEiL}H_ALKeJwO(CC&(k*9b+}&1|4b@3huC1 zsOZhC#-ke2{#GA)FZOOjw5r0;JqCD?y% z>?SSdPI|Urcd#jld#+#Odk7s#gnHD@`;l#d2X1YiTs1v|?By#(bBFNcF z(4z*|$K$?L9VxR$-erWU(7aZGoxcC+`tCJzOPu3Lkv5LHxxDe~@(RB51W$U5W4U6{!u+L+>=52y|tPo4RvU!pgPj5Bzn|If`uQU^Hqtp zd;db@2|(9gS~ybb%<)Wd3FXvD@Zcb7yjVqY=0$KxP&|e1GHPGEl^h&kyjcJ9ZUVB( zM)GXT;A7 z=LxU>BklZ0p+UK?AcCBiYaWd!S)Egkv}Z?>%e``PHUaz{u`1QJVC}L0N=&jO9v|S} z?DMF>?iif5QgZ^k+kmxdAV#9wj!Ie;^s+$`zSht112r?Q;q+YO2Ac(bFKF@q*}eNC zG!mQCE8c3AjJlX6@1uspc9x^@EE;wedSzsZ z7LTMY3a(uCki&Fz8d6a04_}5=vV5R-Q$$?x+Y1#M08QheVryW3e}cv!tdmXrkSlXU z{ne%MpM!v3$NQX74_s^^nStyZE+a2H2^Wr?&?p!*F6pM*A4`bHaN3K-c!?q%e(3CO)j&4 zWllxVa_JX7>$Xn}K66PTDmig@=LWCUEV{Y()61Lj&yBZ;zcQg*F-|n7uakXrY%O@S z%2xmBUmj2ff)GK%S#j;BV~D;#p>ri~7MmvGalRJR+$*LF63%jS#chURy^Q73O=dk4dzI^Yn(|Lry23+b?cyc6h zE9Nl0mJ5-ZYwL_>8m;(g+&DH1_j^e=6NB&M%D8d z;@?IYHcbaw82N~nG>iBtcgoA9PT$Y_##!u6*M=Qj3ZY~06alffIKT7k zS5ZrDgj+@Z>F1~xGIr4`c_^-jMv!b_f`lvv|s8y2g0py(~5XiTC|0;{p zBa}phWgoip=hc}Ju=seVwweXsW_p+XXJg7-iS9Xwt4U{LRL05r_l;N|bd!_(zS;eL z%aZS|3nn{!JU{a3vm=n7v!NaTgBwlOU~D1|$BMw@w2tMA+aNB)&icTS;4I`L>&*nX zLb_@0h4+(8jx;#fwgl~z7e;!9uVL8~%R`AHE9otgaF@7U7>Jt>b`(0OA z9Na;HocjAlDqLWQw=Rp_mk?gZcLH?gzsMObbhzZwM>%ADdf7F$F8tC+a%2ok3>_9j zIy-!Zq2YZzba4{CZp@!A;`k1JH|Q$E$;m14?vvPSmiYcOY~-gHl_qd7T_N3(<`+HG znj-{EWOwl+VmPVe|JJq%Xzg{RJ4~Zq9A@@q9XUIH=#U@^G;SUx-jCrD?ggTZ8HX+B zK=T;0lWaNq)NwpXKCi#h>~SPNgYgNUBPjDhk8gjciJkv&$AsST1otNCI47S{)Jmk* z=blKyVXod-lb&~4&X#%3*8Bzx(r|0ao=HcRi+H!lwyET}F)7>JODpIzDtfoDwJpWYt;xPUqnMt=2^#`m}%6L-z3v;=LYJ!y28OReXnHa zEAnHg*^s(ph*JXcTCrKO^-l7U|`rj3>xv;rHgI1s6^ z3nE2Esd$^&t0N)o)Q40Io-k|TRrgQ;ctqLQD7*> zXBN!`oI+%zK)JD?V9mW8Yb1Alg>vq2xs=!C()EA!kOV7k9=r>N2Afcngz`Hr!sJW% zducY4!VTQ$IxNpy|KPgL(fa|FSaMoQPgoN9sndMMTLIVkMKi zc&PeSybocaUkSRar?EZ{?^~E zjMDjm*FH5BG4Zwkc|#DE$b$GKZxm9myj-K1!|7DWTFY8?HfQ=I2~ihIB8oy26<)fQ zoJ~}OMXoD5hRfhR@!dPy@R*yA(`|?Fp`aEQ8Q8h!@f6QriuM+yg@_I#KwGgsVS<2T z3Zs?3`HfS}p$vt*UOuE}+Jctzm*N~Cj#kXA* z-!l0Cly)~silaFJkW;4b{zuzK_muQN#%pYpH&K6Vq(58Cm0%w(zvWVYR2|`FAa^Xc?FA&c6{=Mc(J#0ICyr4D(m$R9Xya$gSofSoFRS~0k<`rItD0$y^mh@on1n}S? ztedHwtL-P75Q23WIpY`#SY_e}>Q-VEPy&8nnAWy@z}64(N}&l+w=!n66~D$%rk7eB z5uNkgf-pr2R+LYwisf}MS_Zk?c(XPW>~LDyrydJTd_L}DXNGwfQgX(P8HY%s2$ECb zbxP0G_g+@zl)Swvc-f9)X1`w}E`fRM1-McR;u%aE8-AK85&&9r&zX2)CR;rn&iQI> z6<{p5*kGZDZ*QvSe+Bi>c3wH_EmfPvgP>^Z=LU?>65sMMSb)*PXq1i^R?lgZHiFZ2 zgeBJP+#vWL0Ii$u1>+VNn>Q`gqqbh^0shH$&o=1+^}+>S>%@hqvTi#=cXHS?lZqHh z@lsvhz$22~vj0(%Zu(=+NM*A&T=i(h;DzQL}Khhw! zMob(Jw)8w=!?b5*9*6LAU{s3597uOK#v$iFE`xlu6H0ELOz(r$Ilo-I0hwEDMC`d! z+!Nj!6&nj7*LbxYKH*83(g$Ik%QmoFs678L2-x3=ef;(pc;3`wl)fZt7(8wItO{8? z$gDH=#8!iS+7PSC_f~woE$Z!MEm%!m`^0L4LLSKtEVCD;V6JGiWT3rG+Zo1Am0-s5 zGDwpB>$_T8ekb1`WlU*jfo^&yC}vhl^)>bzpQd9Gu!0%&rgGnbUZ@AjSe`7Bz`&}jb>R$@wVN7Yiq7a)r|n=zk#b|}q@q2l z2(qeIdF3Y726CBFuy%$&dqFku?98bH>tPAy_1|Ai!(ruS|HKGDV&;aO)O+JS}2sbMeYL zA?hZ^P3eefXgu`#b|m)!klXxK|YAxPtWgK(U|IO1bhfxqyl+7to(PHxq}ODxXPk? z`3E;dM&ioRQb|0C7Y~X8CJCN_`w;#4ZHfa{oD%V3DI-{b?j11BBmcDG)t4}}L+Vie z-VP4gr`2nQ29?&89vEr)-vne!;lUHB3lS!L^Fq8FxO+7oG=}Gg{isv2;eQ+DRfb>a zA_-|6H*W5|d|#aFXjL(kVCs`bJ1@%9bKwy6zdI&ZuGbaMhoFl5=%L_VC;n&ph+ zGAhmm5aB_w+})3xmnO>rU+w34CQ>#c;hRA-i5p z_4{9+Bl~*`j*?|?;%B_Z3z^!9Xz4|q{6EYBm3bi{*y^j3@ucR#HTU*#w~jSnWWmPk z$B=&r_5KgL;AHskoh7(8!EJy^H0TdyJA==>rI-N&B~^s8ArKx{TOnDue*0DIeSk>r zXd?(vlU-}gQty@kvdM?R_JY7x*CGQis5+eT$L+vQCg0te-&bxJ(H=^|}XpJv+Ne+qj1F^%6-5?ri3b zl7F--pofCSuD?He^l(f5kzdfy662b?rT4gp4$JhN5OtlKUy5U2WDHssZ(IN}TAeCt zZIs3*1q63u^XyjfQM$dYOtfUl53|jfs1WAkG4hS);~F-VT{Q9fNdR<<%Pl<(SNBbI zjkmY=Dh+fo9N!l%GsAP=Id(i9zETF0m$bDk-o5iYDL8k_-?w2hDtgOuAHw70AKM9? z9`=qYj{Ps!(`AJ4HskBw4!HZ{_gdl>2{*v8XaypXaCSLZg09QV(5Z>G+QDVhouWv? zCAQ(s+1jGXw(=^?G;xqbV$P|*eivl%P!}t1ALypLyU@9BpE$8FK+=xQG>AA9Z%-3E zb5a#CEvrH@HuM-C^G*6KgHeYCuP>e8%VOfr*;ITR%O$WPMMFurC!3h>)c z=x>Plj`Zv#aXhMXerTL|SiAEe5;f2D*7*6NsfvL)nWo2=kM6$zX&YB+Ird1<&0+ee z^b*Wg&PZ07Cz#&^B~KTk{4VdhJaBEqPGHAr+_DrOM(3NCA3~@>4+)6xKn%7V==o{& z2{!lcf9Sb)MqCWD5`IY5dS|*O7}~l>xf3)8x~CXxBFfhFptc+D$&w0L+?UZ!_JoYwXBkmn@>xy;dVpL`ystD-#xB#SQxC;q5mf z6j=;S9&n&T-%W~N4-K4%ag}7`T!>5VgOh$KA*APVkWjBkx;frN}Shk$rh;fC5@n z=ky-A@@595FGLy`o3v>q6u*I6V1D3)A-q(}$7Ugc2#{}p^Fk1k=Z}55AQTfn)5`sQ z?1ZYzY~T)P%M1P9giblEtV9spAIw4oFT=}DQuDFJd0{^+D>v}^c*GVJ8HrUeqR))T zt|RWr>rc7r#6q2ZDUqg29;7p$8dK~c8ut`TE4w1>In?rAJhcGqed(aa(<-S*e0pre zZO&0F#oCL36-lkU%!gw4o|)k?%AOv9b7^a%DD{gN0ozrPQ;aX#wD)PVJr5Irkb9&e z)c{r{FUL#piRf$=E*fL@`}$)r4hszKuMSb+gc6dB@8kzGXm*%;hNS3umL@9)cOwK6 z{cmSED@F)lT85(bKd${(s#F-LU4?Er^vKuQ=$4tTfm4D$QMe>*&^q4#XL|F<$Kt5m zwxo(wLcDOtih-|%-L&EljwX}koiIg{abwNq;i#2xVg-cUOR=I-jMeYkF`J2{zH+o_ z{1yCztGsDoY<|8&yJsV7Q?rEhDFegWFz#Wiz;H8>2zPILT}P;Oj_iQzZ?22m=`M$3 z;!?T24^I+>KO47=uJ$`WMnq7_0hqQ`==myTciPu?6`0)74;3<-M`D*^LJaisnS8^5 z>#4DUDdPlDZ+&sAdCt0-kuC8wALD_q7xwPjwdXY6Sv*=_srP9jB`>>g*yxmB0k&l{ zGlQBsc`sD?T5d;#O94y{wNKFUP6aVJADwhL%p3qBxS5U@Se?8mI4(kn_mW7;ZL8dY z3UV4uq*mrf&dyA-+edt3u(|b@N zYj%|sGC^o6^Szli!}I)_;eBv996a&)`3gM3`#*52a#RdJg^0qO;2ez5i4H`DwRwzA zg7dU7qmije2Kw{&YYIk1M|V4uXLf@IODpV-(u=(HU*xYGOON2Uk)h%&l=nk$#8*v9 zi$^FPeWj^mY`g+o*T_Uo>0<5zmcZ*RjhTgB>}By+dQS@n-rV9xACt$%2Muqt$Myu4 zp-bWX3_j;(pq*E*!vpL{IqC>0I|}$m*a}3T1ezjN`j1N;$%Ftmij4`l`D-p74Za&F zgUGmTuXelw%`-OcHHYh=K6U<-ha{B)7dHLr0-S>?(I^m(b_QBX!35#BhDA+&>pi%F zzOR^^x;+HsOw!+n986lt+}66gr>&BP9~O7h;}7or$PU8ZvHtDv^MrW}O(kAmaeq0A zfne-KkHSA8fwH~MIyMTnayD^ZA=Fgo5`H_b$UP@a~c#z`9MLr{E@ zf)5|;?|}@m(g%7RnE==*f`B~i&|3!GmBp9KnFpxfD)J$fvk@5#ol0T)HY_US{+b4z z!0r77FQ8L|*zcn(aFU0!EQ9)<%usj*K50-K?IG3q`Cee7!!HSYk6VW?#L|j0!e>UN zE(~&*i`(o8opF!m6)TKBO8auo_xlK4dJ&HNowedt^4Bs~5uos5oC@$J3-6I0ez-{X zXSyAN7^Qaw`7xB;>=4dcH&so#`Q6L__XV#v_hyndZ?0{qD|%a2RtRnd6OC`xDz7c# zk0SD+-Z}IZx*wSU3)*<~Dq+J%D-+&g9mWNmqa=E?pvVNgHCNhe9lSLYdp~vt_nEs+oniMy4RIZ{IV3-7lE)AKyi%VJPQ7ENV z3Lp$-rT+@8(ZXqBLF)R{XFoSkdIkv^)7* zFQL6m{AcM4Cs{0yek4PloMXW&_s&zicv0=mWI`q*HFz!dYXgzaHlq#X6&}fFi2{1W zS#)#9!yv#uTs%>i?|u*l-C+2*g1#~wdxU+o z|4?VUWw`=xgx+@~-YMEF|=tNnBOrET0sq!K#_yozC~DaI~~wzkXQGZa)MLXzcq6HcbQ$ikchQ84ZPmkv#KJ+AOUSpMGE* zE#^o;*W;?TleDTCP3gZ0or;}zn$zx&*v+~$7IA!G!H`~C>CR91BzJL7jU zRaLKO4YA$Wm!pjrsw|q8cS-t)?uPK$&N07ug3`+p!ZeYE}qzlHPnAQGBN zQhmMv`}ONiKiKf+n!d5tS=QHE2X$6*?>O zNPXX&7Mq;P6&`4!O9OM)J-^-%`2f1L*_JB)Qo!DdGFzBP_AWt%xj#jA0G@o@AS|x} zbCzp#A6>*$f7^cfHr4J(;31@Wp|9aYauV=ms&4i&@WpZJ>BfYu!JH9Ep5b^ebKTsy zVL58aqF*$7G#N+w{NZdhoCdm&f?+bvu7t;iQ|Fg@{fb*pFS)r$bLR~-YWB_huStu8 zFxM_3UrVInc0t~~dAtIeoU&Q8NmyPb=A2esW;7ETxJM{2= z*H@kAWls`1h3#zzkA4~((?zF(Beuh7{<{rMeED>jLy^KRb$c%TGZ~Hs+6W*e;A}KZpPIy7#_*FMOgu;6z zf-4~egP!78mE?U+=k~4pyRjR6@tqULi^=y}2M(@W9M@nfKG6incaZl3T5jpfjd%*p z_R$Qh_3OK7zAhX%o^EcWvH(`ejp!;k%oOH?o0l1%gv{V;Hy(cHu@~USlKDM zJvYNOZ)#_o=SVwHmlq*gaS*VTVC)PF7a2aImgm7h^-LhP=cxF_+OvYNAa><&UvU9y zbHCt6CgVN~-S>ttQdim7(l{LA4yZKLZpr!^H-|g$KnNGRAk3ak(!I?ZAj$%95p?D& zN#jHN8wt+tf9Sq|nHaAma?bqf6r8*;b{0uT=sF=;Vb*!BA4C z_4l2IR2wHQ3I3M<=BcZVZmnkM-PLUH50OOMn$fyc^$)h=5sbCaT~ecR_1x0b zY@9id9z6XAqK*WZwqavWe9AUqaiAUrw_59) z2kPmh@OOH~vr|ZXRML^vU^)qbd{xLoF#k3N8t9-Gr$fxGLtC=!l3sHw1*J8=HG)dO5h`e6t*Cp%eMICm8VdBpzqoY@?hi4 zm{NLlCQHe2SU=3~_+;Klg^O@H^utO6+%%isD-)HXKaUar5XJ##RTuD_u8ZRdxMv9C zhiETM9f|Q=9Hm!rB{^j!bbWV0$7)ZdsJ`a361bkdGLr8z*`T5_eE94E;y9M?q&CbaU1ZE}bl(T}0(W z5@q4R8CNTBdQ1PX1*zw9&FOo)3Gh8tMjnEcg0_<~V2YgGrSI>)a6&BE^hR``^V(s;k@0PC_a%zSm;<3D9h zho|~Z1I@CxU47}__Ge-*R~$2(FMeXdch@8~F1j3su|A$(D^ckQTFgd1cl27}=q-Yo2@58T1bA-1D# z0tPQN5-TjWRslukqa}>7@VVc#d{yp(ra-^WCh*x!jE`y5*x^t0KW;IHRV595*FEhy zQ(1)W(c%RH4)Dn!O1e6OF(w)Px6d2EgfE8+L9_hR&%ee%~0AjCS~4;2}VXDni>)PiwQ17yUr(w7gut6 zuG4ig767pa%(o2F9{w#kGbRToSt*7w`>L5{3vYMh|LhEv*ap4=$;0OA{0sC(#|S7R zf^wBntvUv!qM)x1-&cd~$vnWVj@O4H_i=5}zHPXHK`xUBQj{u6RHOQ?-_l^06=J>n zJ-~!jzjDW)e2tq1FMu3+IVE7A4B85s;@}T=?C!FFKX$ajZt|5l&266 z;eGL`)js;_Z*2FMSR{S}x?W%^`b%_ux%qw>jQJ)WbRTQm@&#ek3aj@E8i~<){hhe7vfs+Y8qhj%fYpUxQ~(z${^f zg1=tlsE|5s?zC@snDwZW z#nLlj-_gbL#l4N;$R}ZE?q-Av-VLSJ9$5L3Dy{4hf}qd;O3Ec&EA2I2)Ycrevy-5d zKKUbM&QH&~-IErY-1}*yEtK;LJpW84FYn;< z8k3H?l~M%dTjYgE^$l^`bTpIJ}V0Pqg)DB5` zs=S2_e_z7&7oTe2$Oh@>d;21rT_czXZ|Z}!qAPp=wbVv55@j57rx*6fmbP6-*4++TyO2#B}NaVQa{{mr@!-Qd2V95EghddbE`j z3Gp7?>~LI^DN-s=*@Po{0^er(}u#W$9lx(mRwLgaP#`gX{L!LxH=2oskqw}yoW z(b4Z_Zzay65V}dCOZO^0z!NBu2tY1v@Fe+S%`z-%M+Y5R=ph*oO}!`OZCDKuUg0z* zBN2s}ls-fW7!9Lc9#)SAHNTdOgWlEHD_@(KK7jq*wF$!%fi*tOg9n=Ni_f5EF5Iyv zQ#b%RrfMg>S5WLi@vxpG-CL&_KZ<;D80acNr4`qw@Be^yaWR zC}zgL2E27bbdjV9O4HGkcq?;Wwrt=)YhH37aYOCTG}A=cFfW?SwRmp?JR5CIfqB#? zw>O+GmQz(Fcz?~xAf-cd!c~m^axR#ML!^;7ZXnGDwZL!S6#VY?=SgJU=ZIR@+8@z@ zjRvS9Q`ildJXsFdPD+aCsE3(D(e6_j+`y|B4{{BZ?GNB0#e(?qGa2A;G!Pre7<{|< zbaNgZ`w)~fUw zo+Bcwu1*AK$Hv|o#`&o;!H9?u$I9-)6Eb$;DHktaV(ED!{carn zfG9a0H_ZJaMOi9wn8dbpJ)8eku51-@Kt@C3Q;QceU9;-_zSZaaZ6k6%T-X<51$L7) zt1iolnJ7luf{Xe_cF|#tZ-_&RpX0vIL!KY^N1#g^ff@q%&U)PGyCl$y4c-Yb$Q|!- zWn&7$gwSv+%d{WE7Ukukf7>$I^tP58d8Hz1mqU(uK;H{lmimn{$RtqOTo&fHuR30% z;n#|f1B_I5z0}|~8){kdXbeXr;{BQr;XQw#t=%~Awf4%2F863P1siDN9<>Qi_|3f* zF_q|!E(|24Q(FnPTA&YA#WI^zA58S`c35-N?X`+%KI7!-#TK}b47K60L=bB4xDF~**J0J9c?4uwzsX&Gd>eI zv~s%g8*xqm62muw9gv4Qi;L)>&f4X@*@?f{iK2uUueJ|&WwuA>1RD{qUHA1;-KlfV zX&9A_KrA>? znO-ESX#zhe;72Mw-Dl^Icc9_S)b72q2?f!R6k2o5XLaFNXs~g^!32Ln#UxjM(K-Gs z3MxKN2SADQ$u`f2n)F=5`2Lw`WaYPCNs9LYV;jVAZDM$XV=m_IL7eS0ala9-KrtK9 z4aJ;vGu>X_;R@An8K}?If&G0$hdnuOSI!V0uW!A=9UVt_(WWg-8nly7g+LKz zBNBHEe!w3T?aD_Y=%yzoC938lZY$kW5)FqYj74pyu3i3AxNXwo)DcP&YV180SVNxS zYDmVeiB;o!GrDp?OaZzMe&~SF$+GROBx5NE(RdmH^NQoNr14uHk*0_|jD9R)LmX#z zlE4}a`W46Vs=V^@7QqdMYi^|MbdZluBJ6klmO4B7RKANpzCz`~h3_ZTrry47L+G~C z$Vp@rpFNr|#8;0M;IyIwh>}xrv@iH+ansb*CZoi&*HLY4+eJ&*WEzltOH+7|&0Rfa74SQ)z z7JLjG;n*S}=FnAym%(k$Bb{(GM2H>F&jF2zHo(MtI|!7Du&cj^2TP)P5N`-_;uw~yc*t74Na5B?=OfwZ2_vW-@LnD9 z-|~!*i>cCE@9WVy7(Qz9s@>s@f>_W2f;i|s2V-zzaVJ3+4?lJrt|Ce7XtBBcxJ3mI znUYI5q`C^^3Wj#O5oQn(u1pT^(~MMdt0jsbP^iDpaB zAspGg?BV&5&Pbah-K#~7f7&{5ao|ud0~11Y;)Xo2^12CTZdE_OW97qiBB94X?l=bm zGK7D2M{^+`%+N|nnM$G27vBK)P3Wndvv2sLV~3ip39&I{HGz|FZXk@3YC?E{tTOKB zS;l2nH}Lhk%_jc3Z7{fa9j}PKDOolNR7LB+OSGe)%jc>!z1##p`%b%`nU_VvARcJL zZ885&WuNfj-oPDF<98~SiPzc2h-X?&M3r1l5Q&1)5#~Q$J>_2u5Z#~IG0I@7S+mOe zbq*E>?8Ub{uGOu8YKOmPY3bHQLDTbrQuR02svLaAY_O>;S2H_9ic;!cabBV>ZrQ!siTNS}APNC;b71;R^2~DlWPnav2?D(+c5J zEmD+Ja<&5{TO{ygVK8|M>7=?*QKRjCVbt}K(zOL%SmvS^TIEzbAf?TL>5{MV<;T1> zCxP=xDdQr|ecYJ*qxZlDj4=ER+&{7b3-(FW>EP&mG}zU5Gk=ymJ}Ede02K)$i!}sz z1oI?R`lWO|Y&wkgg#jJx#qD#Ai?{T?{DrZJz3py{;?_uUGlwwp1GsGU#zVZ{e8WSZCirU{>HMT*g7}F^f9Yb4<#+71>jLkqHNi4T9 zvwr&8#~Ct0Z1B&%3978fYN1{3e7t`7S$wdX_<(NmJs%u9j6FIrQ#TQ;<#~#UuIRSQ zSWVKGb*abk3a#Mc+HK^&{cwMtu-eS`k7sihm>-1n(&C|_ASK!$|4W>rx46E&76gTx zdOyqdI>psHV}|S`bS*ldv->ifG(2p@hzG?qA%0%CmOq$DYxWG(7Ml^gMfwoT8DUK2=2uI=*#@AK%ENml8rbXlyJ{3~Ka?+k<~ zV8%_{C)QgcF%ZtB+T3e5$p{oCWG1Zu+;_MXMPJ z!dQFchFMjDU=A7!$vf1x@sL7d<13m^_w1EKpCZz`JIakyG=L|PzrUc0rjV2h0wOW# zCg#rg+_{g$d8qE`)YKW^IXVe}@Q2y{=b65)eo{Eekv>F-W8-W7(^&pEdWxyp-dexv~V$+RFg7G8sY48?Ury(hl%--Z7wN7G)ey#5v?m@TE91L>$jJjrC zTnZ40BNe`gvAj1!2tom4RZ`>Ia(>Bn)L;=CefIvdYqdG&6b>dPfY9??kX9TPf2feY|s#q2&Fr_Oe`(10woHA2XC0K-59F-A33Pv2Td zbFsido6Tnm(|zT_LMQ%O2C(^Gb*4uI(5m;orp1*7pGJMLyI*0~Ri{zrlxQb}TQ#}( zG=0_BAG4=RTv0CF{&a1?FLn@90%=f*q4kkp?Whf5EqcZSTkoS02Z2 zbs|zLiJB7{Y(xa5#0jzfns=V8Jpk=g7?--OVd+~eA{zErok&omyJ5Si-O%Rm;U;D7 zYN^V8c90sCDIxi7|she4aeJ(2M2NkbpFCjob7u>WuPe2*7g4ePJw=(qsjg}NtP z6WkIFZ>_ivGr9c7egxBTV;Zj7(n`Vl%OPnTmGI1#96B+Rlj5~^^E3Xyc!A23Mr~c( zILjezlLIv?8jrRW7eVfA?dMHYIefnZhKP57w5QOx^|vsZ?DPLb8GsStv}^y;TDrMw zLhpK|3PHacTLwJF@QJ{#AHyfhkCA2Un#J)lP@`&moCHNKSpWIxLD(!~?L{MDs>mFY zJe3bb?b8#D0KiK6{Tj?f-AJJu*tPXglAf4?THLFzlpzBg{GgpKq$B6Y!5@pK0)wh3 zFV1i_*zq7ej3sQyi0^B>4pKl(E$m`=l<6@DvGUe8e7k_>_-m?<-pPmdVw!Mq(~K)b z35wUo`E`1F;!8fA{VI#mp5|zRq~j+#A^iT6Y*uGUcgDt2*ef=eh!qU`2t5PyFyd>) z70vdP*b3}%|LlGVOvrudZx5EU%cRsF+7WFCRCTYL-+E}STnfiX_9!sQ#(V$sd}ns+hJ_YQ2NQA4X?>6 z1=O!;{EuzQ@&<0DEe~`M*y=Gme|yPy60!DPylQs+X~5`&RVveu0gf~LsuZWz174sP zB;SZDDn=&p1$B|srqNil;F4=`4IRdTCZ#Pz1A+hz4+DpupZsdYVlueN!O4ST9PqO= zS(#s+oW>QIG`tdG)w+4-PGR`2bvG&d1A3743KXL;A>I5XnBg+A9VD?Y{6*ROiwNG& zx%0kwN5B6AsPxFmI)#>=pthtanXfiR|zN}aV?=<|Sv+d<;UebRI3PCr6%R}D5tQKqMsB3eP<`4aWqQOv~^1z{Dq=JcweorxcNekyg zUyK~fkamBrNn%#%dVlNhgraZLH5nXf={yJ&pRUObmw7)oL$@u0NEQg7mOQSP0V3)q zH(Ffo`Qf*oK^J&NKMKR15}5h+K{8n^*|6jBV&J&TxeTKu zZR49A9%+PLZ9(XI=!Jj2t~?Tb;Gg$Dwq;-p$VoBq*mQ^<+v27s^O?sOH;{U9tA7L? zpQ;COz$2ph{|jfvzNB7HdamtxiNEmFv(v=>q|UnSU#v>%Q2t$O^5?lX9Z1w=>n>SS zxGU8-^1~*?_8vz>T%qJq`uYnCc?ndU1datE*1dfgjWG%QKQRs87b|Z2IK9RhX1r6t z%BOvTJ@>J0*w9gWijMp78c>MejOHG5UBU;_S%hqS#qzM1HIn2F$WA^cSvFO4SD>#r zu}dU96BWV2)K?r@nE5uO4eDFiQ|>^2sft$fkdwAp#A3Pq!}&BPAN2;W9kO^LgJ&*E zqa8A`G)sa{dD-_C1nO@ujaIDp4r@eVd&$Zje zf!@q`<7yPlI)-4+PNY3%4N?m28XvU0bm>eHa*HLLlIaBA@7pp>v2{}N)OsjU&oZ~WoSTllUnEi^VHDc`IN!AX~<}cidzew~=#gzO+3=K~xVe!In3Cf?+%vpk`rS?o~ zgYCHrZ<259*8RZGt7^t_>n!#sH6c2?mL=wYwqCpwdF@CU0*!LE=y0-gNel$aM%Q`M zwLRYh11M~a``VJwW^nW72eQ@FT1NjnwoeMZDb+U{T#LwZ9gidW@(jGXYh}lC;gsfq!m`4~TYwOl`{9iPOrH2;#3-A8TzWK+k zqpxwhtDg4yZw|op?+Widk{_MVzlk$k?04~>tFPXiuTIAxb&}WXM0N`}kMd9mH*8Ty z#o{}{+CbHUNq)7BPqofTXBeA*W4Z+Hl&k-sahFx=B~nz2YDjs9Rf7EEZ-P+0tLQ@c zsSC$V6%Chn-*5fgJwIBV50-D4A!)EM(uf@S-!#|66jooqLelX%wd*!}ICi2cMAqPZ z+!=A>or;khQfua7O@eKBkfupmN)n~HX1rXggjxCg(0l3k9qdHTgY@<(JJ&&G2rPXC++h~P|nRXm+bFYGG$$+M>S2TwZk|cNT`08(?7DAh`fI`=2Ozf*Xhw!!!7Wq|28)>JcFHJOz*cl%QGS+o{cS zWp!K!rASnae~vT#pknM1^u0qq-yiNbz8?$JBMnrJBaO@nVH5THM{fQ}uVw)%mw14L z@)y&n`Me&EW`s?n+=n#Pce04jKN~kzL@6F0Q&}`|BvIG6!9z2CT*4r0u=*fiXR^Q# zo@3Y1--HlFhPFAagY=Ff1z`ekB_n?E%QAR_nJ6?IC`6^Rfc-Pto-MrO69~9xgthyS zP+s`#SjRam#q{~OOLVXcQp&V%$rNOxQx}1wHl89WAYxB?MH-mQnY{;Z3bvNKF$7f$ z9+p0|Y;dJDHxBnd7oT!VE3ok2);f^%ABI}y;-+^DJG_hQ0{c+ZXeZ*rUy|u@#}nKr?C4;F*?LyFHp;7LQ!=2XjQR6EzRX*wd6B z$8q(~XH;$9hvkxz5RYG@P2K>bd~m!r@%7k?%KJYuy%JrUAj^>XRuyrbkPY-k5?B~y zYC%xf2|G<><>Ymrc)uY9JO5);-V8nb_`Am;Gr6LI120eLis~!iOVZF zF$K}xa{|jJ4ZV@K|B-25G)`FFAyOGNHRHOj^Pl_?_RWDW9Z^v9x-BJYunhj2DRRY6 zOktk`RQl#m`7v?^G?WO%QKfhB}@Q9-Y8vWE<2hKU}|>6)YTuLB_v1!0{lIArp`>@i-mTc|TbEx={AQcz$GI08Dm=o}iFm zpxsfLYQj~T!{h210lw5rDZ=yu>#ZDkqy<(nQBO5({mU_)`ITyjbij$=xt5G@TT}lu z%o7;L0`g3h0uLs9u z)f4$v4759X$NXXYLe-d|5^BsV9md)-jR%~5R|$?0lVEem_gJz-t=ex#Nw+)qJ|o*_ zV8-vQQ3}hhP+MO-=DO(_F;ioG2!1iLdM@P8s*@;@^kbM+vFdwB8(vs&5}vxSv%x(K#viAz#H7aq$Ds?aoK3 zM~P%9G-n;S%jKbtZjApZcgR=w*moPt5s)fAuYFCfro!vif~1fTXfSC)^rAsc$c>Vk zSZv{288|?>dZhR{zjfUNmJOt(wRr22a`|d?sEPxNLeaX71CGbRUGzI~6}#`B3B5f1 zv3|9|0#)HsP0y#u#{X5nEA||20H^Rg;398#)FWMX!tF0 zZMDwae*VWm(WPmIdYZM?mKq{KrY}@les>aA%_JMBpQCIggF6sE=R(%#6skw&%&E0} zfSW#MBmza+w(6lK-D#nHg*?fyva?(~BT7O-bT=mD!20k_VrA|~Yc%iH_)Xybk*-6T ziv7i;`22j;QUA_+YHxR=8BKOd^e$m^koq#TPWBGu4+0TnWzIG6l-xmr;tf&>Y@((# zkdMj}30-V(LZTHOgWfs}M2|G->X&8U(w9V?1G&8*YD{)f;E<}jwBeUBW2HyuY|hA zmQzzay`>6%Elsxh(@!EgX1C0xW)%7h?|cgH4ff-6uW!u&T>D^uA9KdNLbGH?N_u1+ zX>8xKgTgl_%&pM-m9X3>Kyesj6s<0T5i^8~-NW#) zv)4645t-M%*3tuy#?@Ej_q7Gl&0uL z5zdhh1*X)x*1u9m6_Nc6uB7Lnc;#>$d?K%~I_wVWn)>6`k{vcN>`MTV;g-d5ILjqt ztm0Efx+xu!9tac-#t#S({R3p?$YGJ@&m>&7r&Wmm<;jOv&xqxo2G868jkakfHdCFu z(o14LX39WMRpEF%ufm%NR$f#?vJvLX+0vjq_3eeq!KhRAha5VHVfXn?vWS^QC#c%c zyd~-hdDRGFl*-h%=qimaR-=jKO}U!V>tGt&Mop+%fjmPg)^~DF>Dy;Bv(VrB$ptFHZ{v7N? zCBXCIitmTgr)rh9Oi;31;mj90{d>!QC%oP7R7TT`H!ljrT>>gE^8MwoYV|LgC99x@ zwZ25>CguN)r3pbs_qI5oG%-h5)j#+H#_b%AkiQ`Cf7WqAJui#$oJ6)h>EnV=#O2`! z#ZMd)Q?zZuy6zU)z6NeESKOs#;W0AxzVc4gU9>kU(_=}svNk$Ndi<1dE!qCgf&fk) zt#88tve|lx+j^!oRKylYe81g>BuyGRzkX2 z&&Cnv=c5Xx5K>4-lFY=9H_I7Ow7o*B#V~ka3i2Mj$=2^w4hAho_q!dj2WmW5``6rA z-(JPEj%gFfl`}z|#^BCf6OpYaYVqZ*p|G)p=cYo6UM|Ke-DPAFdXZwCrS*m`vG)}6 zEUHkSm_Afj;j~{&|iVIY6b*=WjP=v%~ zGjcCl!W8)Yb+c}4T?;i}aG}L~#xwTS*hh*+&1bLn9CR$0~i@ag*)d4{BFOPSZg9 zD{Xvio?CYI&yk|WR8O}8XT&MeehS{c3`&l9lA@H_p^}^$V|jUb_hw^3smWPqqTv8c zjRG(N$#Km}5dj(xx%HR>ECC6^H%2fDguf(V^{-33m5@ndjlX(c)o!Bl;xYWrn6jHn zw-59-JNcjwxfq6Uq9=%WwJG^4)}YNNd6z?w>0r!h=;&wxx6h`-l5Z_$;>pCQM26kF zR9>D(JH~<{G|Uo2+eW;5JwM+wL0ZpE+)D!rfG@$MP?yt2seoVu9 zfNSq#un)g`dTRz}f*8q-%)h>9xwy;_25y-M`!qy&f09ci#C$OO+BG33U*+>q2m zm2jiR2m1MXEd4xdn%#e}FExo+J#k{ztMi2Y+Cin&!l`2X80qx^4#Gv8^$~C{ZM}gU zuIQMmW*?u*z>|S>-&jq}?VsSSII;g<<{jBJl9sygXE5`cPfZsn`2`BU5w{yYm;0jB zE{hTWcLLtS?sDPE!ZFy1?`l+2p*Dc{!s6o7%kowqTxvxa=L4T(_}(9zcJc1^efh>Y zxA?1m`M`hn2RI-hj@RU#@xA#GVRJ28V0B*!h{Q@TcHHTD?H?KKXj*TyF~my=LJz{W zv$sz^r>5@{{0rpHzN@WNP)KMNW7AwRbh+Ni6y)>p>!1J>;O#x-&T;$=`6GGS|M}AL zxvxVUvJx+PwQ`>K4c}btwT*;SjV+cZ8y1Y$<}X*GcXqu|;9Dexzd3FT0(8R#b3_rI z!aVclZzLI$(%anh!0;u;)ClMXJ_H1jUpy^jI|dA=w`6gWH-LFvvr2Rs$ig3{1@GdN zc_=UMop-+n`5&8dX4rEE{AAwMuWP;^{}flZX~r`u`x!xE%#zCV@CHjt7wpF5Ut1Ij zH~3c3Xi7od{&xQ6I8r>d)|(xFIRXKT8p{BwKviW0N&0Zy6v~zAIZ^ru^6flLaF_>` z)2_8;|H{p$%WY=HUml&(u)y&{Y({_FH7(_PPhc?VVpy=WTN*B4Gr6W zoGhC3HI}?Le{;~ef)aP32_ATd+F{`P#ma3lT!^5^#*tG)2T49d(9e&EKD%aX!0}T! zO(C%d-F^$TP$9J~5v`QFm=v%{6%GNv0%h~*RPC)}G2 z=e}STtCjqn{42@)90($KfvtwJ%F5QkWO>+r91#B{=k3s9XsC1ZC8B4Yiq{7#Akz&r%blaEOdc0oYt>~TwT_XE>y}| z#?(L0Z^kaCZev!b%G`rn%7OYZfNPv?g{$AHi*voB_r+A%-S{#gk6$E?_o;;LgNXu! z;H4H%3Q#yHY8PJf?+ZMCbB`6@JV;O>0L`Fr%_Ea>kQ4vi>S=?Zf$pnQAKul(gbKit zHG7I%pTS>H@rJxB+oYd_M_`KzTr@&LEDbta&HvT2d=%K#wB>uhGp_~WTdlB6ch0p$ zj`~h(1WE1$^Q6eGyhf7x-_E*02#H21PzI*t4*ts{e&`+ns4b&03cxGeH;qjG&gJ&; z_PedoK!LU?|5MU1#rbvnN(J0F1Cm6iAr)r4pIiIX?x_FP!#}gm{TJ^{Tkh)6gh+n4 zosgpgyY00}R?MPc6a!<(2Z<)X@qm-PGAF&~e6W)St%o?7oGJn&|3UVF3Zbj= z<7-9W&beP+HFDA#RAY*OQaeB{gR4j>k*@*Lq_T?3=X^_DS8!8M6ecL_D}&*E{{E&+ z-K*a+D}k76=ehl&F?{zy(f8r&_H|iaBNxon#=ky3f}?WGMqVK!Ibo7Y;FnZEnm`FH z6!&+dy0q%xag2~qPaK}}4u$(M2`%D%7`dL3;BxqMQ>M^BFZrv*j;iLROYbpma$~DA zpX7FZEM$fIji%S$^`nrkSb|g7gkW_Etm_~kvYySSt83pSE95?o=Sl&{0XWn64`Fe& z58$(No3yAV@oeO_Je~wq${%^PJXD->J*I2Gf2d2`gGAZ;sKCA76xob z060fItlJ=8ugt^c954~{K>n7+a?eG>X*0T5O8ifPXYgvcz5*qH z3ggt6=2CK2U{YP@ULLUrFiH=M{iTqn=`&8MpU02Y*;wD6Mv9&K7o282!ax?_<1Ja{ zrUI%MaR_}jJlE|m@W6!U!R-dK%^b$}mwJmv){5rNT>w{Io+uT{6xJ*g-J1CFU8`>8 zX!9L={S)|P4oKN(L2}n6SQc5hMZU^P{6l}bNzLD^d5Mh1~g<*P44Pm&w!8d7umEnOSkKuzDfC$nT3(}ZvcxtQMlC%)4% z#9}eCScI8}2q+3w2ZlS|1y^~s+{+~0pK*aFs>3m2MfDE0$j>gPWi+@A{`LUBsANKG zkXW3I34*)ZV_qcUFnh=2nV$?7^`QJ)|n@cuz>tv&=~tGTau^0)FcwbW?|=hGqJY>Q(}MRT4b4D2rxYc;5@ zWiGm)ol%D}(pQYks&s+0BJXBAZXBAk{Hj|yW|rGVK?`NJL4}3^q_~Ej4!1>>SBCG7 z?2=?8^y)0vLEu+O2MC+0w*kO&01QpbTQjFL{&4!?b?KMs8q7WiRBtKCWoUt6%HbTC zK_P)YWO=9Lz4YUNNwwvtO>-o4|0`5@YVh4Ez?46bn+@>WQv|Np@DwGi{z#MMy*#WL{o|TJ z)o#W9RXsfxd@>7EYh=n|-BRSc?MBI?X`28EyX)?@@NOJPIP*jTfk} ztE_#46F8Zge3Qb5dIL5Gb2}8q$c9GLKByU-@wT(``_n*`{^v=SCJn?A3h{vOMyR`O zl`9V*>U2=_()dME(j#aVBu140LQDE39<9|bv89R{K1*6ixA)O*`g*q+UJtOd(maie z2D#g|ycJQYTnO5tyib-Y6a7;zq^W)M05zSRTgi;)hk=7E&=lWKNPNvzcl_1f<#+^` zRzcJ%sulHyHK}B^Es`0=+zahn$V>WICd7;#h_moqNo%tRp8~|ZnHEM8fpjG5l}My7 zDoPy@cc!eo%elj1NA0`h^fQ1orG{$XSS{K2X^JD9Ket-A$nioxBw6~Q0x_#i?a z#?26CpFOOQp~HO;PzBI&EN|pxC*dl)L6(+#tNaAitqN}?qfwIqg#^vpPee_2;^7uQ z_AQE$Q^Wr+$N>0_?Q>j?VgQjifxm9g+Hc(#&zCm@oeH4CroQ1`G;(UZ9ao?aPtZ&H z)>%2BAH!A<0RfP_OAN`PSKa54zx=tgX(Vi4iA9fsN6-&%K(3aa{Dg$<0&d;)59e`F z4ZmKV;eCj?uR1J_J0QOflRFedjgV`o4ipWi2KK?wg##KY zn{{XZgMR1jmsWo!97n(iNP@r%fLM08-1BE{OpKa^dD+!c`Gw?n7{0&VBndkc!AVi8 zwP~OiiYFqX@+4|VJ?HRNyblf6Pr1=KF-6;D4Vr8yhc;fS$BM-%r3jR^hoN-tDA3-VsO$ z)*Bjn^bub*%-KdQ$~+0X(jkSlKc)CO5p`_59&Ys=-1>{`L|aXP8ep&wb-!Y1aH|aW z376tRC`tCHj$9iM5l~gGaaWAptG5TrCNvkct5MjC=-lxs?6s)|KV=e!2l zpIbM_U!cs?o#M{a<>XePqw`&7Q`!;Du0_rK*_X#*>w5Ip_wP)ni!;$T6%l`CBEbhob!*Zm&QxP5E_1+Pyp-^?a%;c z0>1XwTIc=I@JML>E3|IaFqfwMp=4=p)mx%RMwCL2yx)na$yzMe$i=A?^s^iu$-iCJ zr>nxx);gvR8DZl=p3MlmyWx8fAg{LY}w@>h9%g6kbIVEwm- zFM`iBBk&d6ybsam)%;ft$HtHg0Vm$l-ab^AExzoe@g#b2XK*>$A3S!;xD?&KpHoN` zn7$JPB z3E@*7Wo#7`YoA_~7#%IeBO{}$hQ5zhBPP*=7QM+E_et+PIIe53|C!M|cnq!xxMCYS zs17osYgT3C&P%j7i;!-Z!N-~o4F#aS9hqG@wSxEEN?|+ z#_#S~7qtrK4Zww3IfSA(^tJ^7dU?PXydO-zH&CWZTJYtpV7!29BgH2|>#9uS!3DgF z1Dgj|Fad~yDuNGgH#rq%A6hCKeLiSIlD?HE@YukZzdVn!4-0TxA=QI{=nDyTXZRj! zH0n?Sc<0*gk7CqyK)vSbWjU@g7Z#im5+op(O(`1rx>U8X@r<}R=drKTP>t@uuDpH` znL()bA=&I;17v=rzHwO#o=O%e!7CcqYxj(9-Rg}%#7rUk`6i>@d&14ugPq%V5{&=k ze*BH>?fy-`mz_n!&oyRP2vemFD=hr%zqoJ2xFna=zHL1TUthDjbEgYRgXG0kHcs)z zoAKdwfjp7;-^jW_aL|{BZ=#&k&EnoWI`w>!HMR^Ew!fb8sCkkZFZv7|jX8cGJL7B> z$8+QP+>GD)A=g6HGh9yrZiiZ(Yda}HX4*7o$Z=x$;{F@PFH)&zTexh-D3i|$i+MNm;&3kqnBQx*W&NXf18*2%Rhq4DxF0_SN$J-V!* z52;Zj>?I692%2xh>rZ+Oo;Xc+$$q;e9%Dz^sR+}e~rDz1)A$j?Z}ax-B(L`K=wJM_sRQU zGi>~M98~f^Q6C;6pWYRs#n<0C5|0u>J&3y`1SFzwa4HOfu{#{^#6Gs;h*jM_TUd?P zQ}SCN6by7J$R3J%738VIWNvhw79* zVHYQ+x=7NQc1(JMSDRU@|3q`m4}OXvSW9x|QOktrXqesW^RLrjhOP;;ewbg6 zv@5SgDy!#!KO<+YX`%CtwSNU#xXzv%yrwO2HMW!jTK$SfvQCGi^{N}`bDYTX|ul{^k=+hCpFm+6u1}WY` zkF5Frb2MqP4Zv1^tv=Og$KPegFUB}!Ava~gJon`VTI$INUjJ6g#Y=Uf_Yeypkpv&z z-=5W7#IE)-No*{$Q$XJw01^&h5i<#aE3F?5svb4NsqsgI+}vlG$9s90P;lnwgaQxh z|E?wPlbu&fzgEtUI}Z?k*QNb^FP8faAY&Re!t2LQOw33XFMG|{EJAvD*RBGK11>0dk3=m9@&Ueq+HL;a)llgk3p~*`V0lhfb+U@0*pd51DYN_LlM-{! z76$I$h{OCB(XU-Cc`Y0=H3JBM)w2A*r1r&c_eTRcg3AqB=pbzKB}@O=iw!9|nQ9{ZMdoO8H0z;IocL5uiD%--y?MnF6m;5N(Ls$K z0%>7mu1B>McDyKf*6kE(z$)Yifc-XqNk{fZ+1}e0YHSmq1CA#_mK_Ew3rRnad2nj| z=_@f{?@IPO3H0%$prA)YpC6pTjRY51-xst#Iij-jr~b29tv27|7fD=IyjXqdrES6@ zLVX|inCs4FAT?Q%K%ao^Iz^&K{}B80moLwQGZ4wpc8XA7^WWc^^Pg$a68hHN8)fyU zg8nTzF8d~-mYVZkR=}MVl%R%XpM4XN6iS-bR|#)75YG*aKltZ9K<*N1WpMI8$PswE zHcNNgaN)%oi#g1nzKZf=|Dh%<`DufKLRSFu0l83cp6|Jy7O-IH#v%C6KD1UE4yKvt z9?rD1VV%3KkM+RUL6oP7umVmCfgC2n6#mRrHvo#U#&@wj+e>_Qv$RX#^y!;`g@J|x ztb`7(tr>1ki65VAnd6-WkfqJjY&`Yk=A^IwS;AEWqw-S^EMZ#a-05ha(x#XI=_Oa( zArgX+(js3Tq1b&$0RPvmeK#NkPM3w1zVl=4z6Ekd-U3<6?-%SyyJ2lk$9rD%F5De0 z5%2=!^!%2Q`R@|aDgx;2#;wjaGw*S(GC z&9yKuwQ>mhTp)p~dht$+wt~IC>CkJrU_m#Y=J9A$R&U+4@OlWuL`L}dI(NzB~LrpeK>y?*-no7A6KL4V&hwvL30 zGK!w_`?cJZ&Up`zV1IMe?ZlUW6&Dh^x6&s45HZ_8l?3@{#*r)CT&}+Vps&F%0Hld_)E;{TGg&^qslm9=Y(4NzM7?5 z`S_A;z9DJ?ruzOO!7Ao7rLa~VtKxYwpl~-IizR=?tN4snKkX}vR$MCqe?nwhkUb&` zfy1Gyw>$O?KbCeTvfsbI?)JCD_=G#$oeAA@D8G3Ne<@W+V*3T}mTqpc#hyeQ6G&5e zN)pBW*yi_vi`k(NB0piE#V>r|ZHW9J++_0cKXVJ6%D(%L&{+pYAlxM?q@Yw<6-p2e zl$iNOb;a@^q-mScsS z73Ds1B|>KSMvj;Gh5?{#{MbcNSZ;o6;BE;lAX1~v-eg4|xwfFP= zdOcsq`}28!Uhn-=+}Kee|Cu=RLp0`g=C4a|!X(#8YnExvH!cu|sfX4}12z7I=Kye8 z>qwkhi$&(-htkaT#TN;G5^}VetRT*sEFaPIUoni^SP52`_=u7c-$;|h$1&s!cQzmXTt=0;ruiWMD@9a1-Qswy(9_cHm$%<3onC; z)pshUS5UIxz?$E7MV$V;Nz-~@=G<`TzkznEbX3=4IX>09--`;!2_nC$JoC6&v>Cqi zAq?nqD%ysLwfg;!zmA1EZowen_|0VtlzM(!UNIRs!-Dd;+fY}K>>+$E#ctJ=cZ2>o zzkQdjQk1(_P)5tQ+Q6K4N9ESACH4yuj7~z?cWHjv@eVl=$29xqt;inj&Y zUEjz&Ihl}$IKFG`2$Hv=XQ#c<6e6HVaAL1s_E1R0>NaQZr8QCtQub}h+m_3(ZDc5UsZ1Cuh^Nxv$DKFXAc7ON_NU;tH7$R$~j3XjEg7fNqMjK2Dmj zW%+kq-pV|{jU^1USLHuxZcPi68QXAw2&Vw55tO&UCZ&oQ<)L2U9 zzSJj`NX+X)5q*|CeOQVXwA|s7Jg;$u-jc(@6i3uI5|X{ht<6^ z+fQq@VJ94wRQ9lSSxALb;|`nd;(#JTNIC5!6PWxzs}+cyrg~;?Wi?TjzO{t0$x|bC z>n^VS>XnBJKw^BIVxOX;gzEQ@g3x^5l?MjG2ZgsVqzmXL&k+!q7F<>D?dc-5xmppG-7tpaVCUg;L2g(OX)Me zS{2(N#>{>-P!oLcymUj>N#gR|nX_;FFdeRq_w>&o?1nFOjg9~p_ZfGH#Zm~>Y3!uG zdh@BrRp<2LZ$JFc-sG6O)o(|F%=tk7xZBrXWDTUB+;fml)I{u2_YGJUb|FNH2K5j= z|EHRU*~V;Z#jnlJ&G~H7gC12zQyYHO1`li~dEQHn`_lFP5wr<(G(eiB2Euw?Q)4A2 z)h3>Az2EJi`6fNb)wAWv*WQ|!F@iREl|Ezd&hhMfiP?tj+UQ^W5iQdT(?S^B_N&IVbj|1#utW@KwFv}WHmiD)Y5HIYY zNfa&Yf?AF(-Z#Km7(laH{{1vxr}7=Zmr+0pw`fk|^86D+{i)EZ@)rxDyI@D*PY-{E zZK0#~>JiaABQt7c93|LrgkPVVkJU2Juvx8UH&&Z>0QsAxkZT7pIeb=~t zJ!A7l7oD=9dnEZY7U%&^h3f!6sYNp%i*0_9=-{Xf*24jXv>s!_db zkl~hd=F^ixsgG2*aFwcjvw#4>^7C3B+V4!UixXP73*#30UBf3mI*z-0tQ4VF3S=(~ ze=)A8`*u1oib`tb>X&By4OYPQS3;Y-B}%e6(CGg2wyH&TZvD2_9jYp-PfHpf(3nh_ z(a3eR=lL!tU0iZoxOzx#VqzkC_CiH%`JI(loR_t8rRRayqm`QvdSmtby61i^XMcPJ z8Uf4c3R|H-G^ZCrYX+o5M-|L_;TtM<27mNpX)z{plW zEM1F$P?n|UkG%NPjU+rFniw6`nb z@x_B32W}O_Mmvdc+cGf|ecj4S%gfASOL1Vnk>ZlNy42w!y@jX)Lkk*X3wC3ksUtDN znE3~W!|OeZO-*uSz3;4f79Plbr@JVy7+7~-a>S^xu#fGB&c9HqSVP0q#;t_Y$H@;x zkqBX*zfb8c`(dC^&eBRm@k;2p=e>%?xtSTo?&1=|VKcJQiO|rx5rLm$Fm5WvKb`Mo zTNOx?z+j*>4g1H)?dPy2;lW^OTA6kvq)*_eNU#o)$FAnkCDsX6h{Av#)+&G~9z`R$ z7P_YMq7Hj++L{&4;4rY`S=jOtUxqv-6#RNe#0lNcsGxiXnYAifS%bq^u1TI8k3XY| zA*|!9MdRc!OB&6=kS)c68CUR=w(Q1j#Gp;z0V0(rV%V`Z8KKm1eg&kNbFT&+W4p1A zHQltLX;9UZI<|BrFR$fc5g@C5zKc|Qs66yHFoAYTiq6WWM)eTCtT4+Rh2oN`j}jjO zh~|#6?9(g@#))xWP+GMs!s;KSR2SjuC7#(+@;_UjAmDlNWS%0@3y3#ek?`4&SVOQ$C??!cfm<)UAFLJVLN z3{S>YG==vwbTdC-pdXmJ_RTTF!vXn0k%nCl%IfTazcERxh={-o$JN(hGj$k0=Y_s;HG|1 zX%Uw#C>h;dTvr8eERE-%$AOY;4Hkz{Y5d6&d%j+S6~=NTo_2;<^69MnE;*+_lGTvP z%63D7?ZtH#H)Tn{4}pxKX}<5$q`rP&ap#t$wH6m#l%5igpXU=JnI(A6t$FMi?d(o5?6LcG6hxt3Ra3zB_TqT zRDLpNphX!e+XpC|9cs$Db3~tI0As0w=1KvDvx>pPbrQM@xA~~`vhD{-2$K4tZcA(i z%{QrIUDwQnd~b(xoc?zS9m&SSG0&FX5SY<{0!5i}1(fPusP`rf3&k@OE z_Iq#eNsZ8PV>mU-L3*X0ORF3~;eNi9?3^~TKiffv;(zAx)^M7JlYVs?DTmQ8wLa0R zlu-~*+%xL5t!^wj+7pM|qVdVd|F{d4t|EY1Up3ozq_R89NSjR;Mjt`#=pbVY>j4Fo z0w+!#g4LMZNKhY2bRBPY^Rn+P{tQl5`qg{SO6EWaxDs342tRsCwI5x>z?vU0)`o|P z{naOlhaE(1wfB|Z0<$u_P2xpIbK@}P%6t;e*Pw~<&bvM-o;zHfPtr{|H|{7o1G}pq z{TF$vUTR89j<1E)Bthg8+C@mjC}s~tf68VDJY0%;kQlP`Xy4_+Q}s5~h$cy6DF-oa z)3*B-%A~<-SYAA1_urg-B=BgTBl1(m@#F2+G~MN^{oiF7MFcAq0vz#TvrPLCTt#{I z$e~nHMZ##6zhthQ$}*OcXp9(5zdBPrX;S4ul``MYSJ%qT80P?YHvMdqg1J%JTq5v6 z>v>o=>?QPKlIK#YQK;aGROfIVII(sAj^3r}MhAC2w0O_xTEr>KnJE+eYwTF0h@)S| zZ4=|Gi~?zV4zttJIvvDq(}a_cHdl)ICY1{%C!G?rh!1J59w!MFHYIsa&7>H%{(Rkg zfKntOFAExL$u#lmwds?tx?LR-|9x_!^U$FDiU;0`xweV_U1~uv{c$%D1bnQ_>`b4Z HBqsbHQS_Ki literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_128.png b/src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_128.png new file mode 100644 index 0000000000000000000000000000000000000000..c9f93b4aa266c14fd7e6aaf0a8dbde78be98e0d0 GIT binary patch literal 8753 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_20.png b/src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_20.png new file mode 100644 index 0000000000000000000000000000000000000000..d2567df6fbf436effc804ccd2bb3cbe1d32c1303 GIT binary patch literal 1076 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_48.png b/src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_48.png new file mode 100644 index 0000000000000000000000000000000000000000..6845cd9d2bc8f32c87d0eb72ad1d802b1573dd0a GIT binary patch literal 3261 zcmV;u3_|mXP)p=`wLYq#)@xPzxNBXh7O%G6uGZ3e%WBoTTvhBs z)LTUmbrpnQc)uS(lwJ`C1d_>2GLxC#Z{I)WoRgVkLIM}OXRWi&oHM_D&Uc^Reth@- z9fM1=4Fs+OCIh8F5s(99SpNrrM&KxL5ZDZS44mZuamxW72DSilk$WBRkae$%+Kh{k z83a5A+zX_~|B;oI#i&tbl$4Y(U_c(}J|74KgF#L;oTC2lVGbPFkKfwIq)ms z_~m-z9^i*SOZ;0bD=U{@{9>up)oqnfI4a?GC84mAwy=`6kdoFmCBZf&f!5gG0BY~avgABuvnKN&ZjT<*fB&sD6(b68#4){P@RQxSb zIolkS#-^w=Hbj+eWssU;kY7;9+pj@7l42J-c^s=FBOyKz4R6Bg-dJGO_}tV~Qvx zj!Z_X$?$>{(o+ot;gj_r^Zf<0Xl`z@u{;dCa3KoZ2CM*F`T6<0|Na_Aj~&?Bm-rt7&dJXD7o+RwC@y2U36!fT3=; zn|I%RkE*IFL?9Rv!tGtbZ>ihFqWfl3e|TT7L)w{!<7};6OYz7`vT_O&?%5nvoNdt* zl$DD~u5q-G>Id`nQ% z(kA5hcQbg%a72XKO@9Z-2mHXMWF}My90Gimm6g=iZpJiS-P*j;!s18ouj3Z|E0@T#ZbdprCO_G9F3f8WEo7UEVqy2a8xQ9`ruk04QeZ8c#itA_G<;aEF z0&Lm%b{FtULwi)H+ZRHBipnague&Ke#OK5-FxMt#ix)3;l2mtbUTI<1&MgjzzFGaa zZO)<|!Q1zlcFX-_WcG99j~?3A1$@+!|Ee*{mkm)6SorW_Tf_&7wqFS~yemVCvO3#z)X=O{)wf zD=Uk!$BvrRv`oBdnV2qDkMdugjv#<(x)@PX>eML)@EK4v zfBpjgxctvVwQ%B$>K6Q=gL`ReI*Zm=rev9v#0Z&lu0addIEnpMv7;@gB^G(K<#*n+ zEczFeb*ub6HGN4>Gx+hNck|ZDR{@T=fh>UB+yOCDh;rUH|GVdZN?q-`%Tluzl~r@+ zgKu;@b1iL(^i((5{rWp)xM^2fb^(6gY1bf$#(POO>EZd|aBNJvFVhKt?s!iWYwr%c zQo^{(Yw%@eJEfpV=Utrtbo_a;@d%5rqS>z2WcL2Tr*JpY(zo8?qWyHAeBn7WD zWTd$efwPULZILF^ibB-a*T+(lX&^c|c%>6&@4TDtWQx7=0q7RI#|6Gr0}#GAde|1J zcUvXev;+J15sfNL(?v>(K`1C)z$-0$Yvw&vTsh4NlVXQY+cYdQ8CEhmfgaS%d(Qb! z$C;qE%}xvHS%Z>-S4tS1=K%y2RUG~7kgdQWx7BEU*za#<&+c7}9bZAZ*W{c(nv@>w z-@BP32ew;|*O5`-0FLg5PuFWgamX^-AI5`Az2T!1&_=cqBJ2c;o2<+Xv zoj|~ED^TkOKC))dShsEsW5!j`C&T2}spRzFiz9p3w`)U><}hx`Z3*o!RD8cEZ8Z_|L*iOTmj5p?lAEesjp zAv@DV1m1gRg+2OH;FQe?9|C?0uy)-iOq^83xfad-FT!28$?1mUv<3rCFUO`0F-p(@ zI=xRG9&e^2-+1bnMC zZzr<90M7uvU;oFmy!zTIvNB9EQccdbs042E%CaZexAWsJ(SuG2Cdp~Sg=7;saQIZN zy8TZH;D-)$Q(Wi)f#rXAHohId!cJsZt0&8WN8VrkH@0o5W5UEMDJo2%aerHaDTG2n zLT!P|LM0;YtqI@(YW^ukadvF4W#jra_RtqC%(&y^e+AqtBEH9dw1~AIZYIs^VrYSf zL&w@3Q*e8{qh3e?(dNI7GwNLt&1ch+J0i)(j5p-vb6zmU_z0#gBKB|O-^Ulbs3nZ!Qq3udEl;_ZSczK zT^;J}3e7=l4Ywv34Di;f6^yHx$lxKv>6d9zkn850U*m7pmjwLKfo|qc?@ReGFBq_S z90O*A!y(gZaWiT1Rit@c6cu{N>FXlUs__T(1%uZj z49W9w%TymXO!DDNHHoSye_Xbdpa1JZ!r_qp<`-Ha{-PK8Znf6QG6Bj*kLRgpeoIAV ztb-?jKd7nyvYmgNP<(YJLR-5e1@AUtV6K~C`EJUGdC9WqfgR_UKKVlqAKYy}*Kc(U z-?mX$D$j1$bL12F~M&6(hd17@v=4t~KiE=GXc|dIrO-59c=UY zeS5dFal;3^_s$AFKbqi|t-vpVr9k`T`qUubTFJT3>JmF!Mn)e-l$0{O=n8Uj29V~< zus$^iaOTWOjvcM%=x2xG`FuRL`A-Y{*Y*KO4)CB=5b2Bf&_e^Y)~xpXIzRSEwhgeF v#8p2sUYz~`Mlw`uslKKOqD1|a_faMuWW00000NkvXXu0mjfm)c^-uDWbZw$N)aJsWS5Y=M;Z6tBne6OiYSzWC*vJX^ zhvI>uo-TxV{->a|BnAA0%1{4ZAOyl}c>b3pFcqN*fe1iu>0Z4XHu*O%G~%ws32`pe zbts&i+2+C!>uZN=DVMGkJbh|!RnG;L4!)_B% z<_W88MWjBf#WIOEGDPPTy;-MoA9DB@sVC{-R*rCDsZztX@QrhZwHn^m5q<;F5%zc$ zK!KjUc%@=h?PE;6i4vB(N*!x=`j0|~gM~Rx7{Und1TCQS3o2iAmTOwNG2g>-fh?U= z!b7X_8)r6SoGvrug>Jey{TlS3?B80n96?&%(E($HIkidp!MV?(dnuU=a>-P8iFUe| z0ZKtiirnT*+0;EumKo5%(qY-K!I)NB!59DSA}GeoNs$Vyv%B2Gq@yIW1*KfR>dp~*0I3EdI5hJ*__&Dc8akgG_wpR?ruEfe}A z;dj}OL_XYcMDr_~a~m3k%zv-;-)$&UDRP+*1V(pyQ-#rM7kbtS7g$gDV z{X-{RF}9T4U8YkLsVDn|>E-#V?A8Uj(M`vMY6nMQkM$G2FlZRP5cfNM@c7buA0Z8z z5Q3&VeexRP)&(+Xl0YN*e~XYO&D&qPHS z9{(&FOzKB|)c+=ttp70Z2j%vG)yu{7Sj|f()^v6vt&a-z4W2`ElkafJk~WZBIbVHy zI0Pey$=7N8->tu<(%F&zhRTEIUFx|@kC$M)@Hc&h@fJkji-8)+nj`r`gFsz9e}Dg_ zrKLA1Dc3`c>D4AC9};-7v(&USv!=4tp)Y2?3=G92Bz|oE`<29`wMEKD zv3<4f3OhJn-n0?DgDhKqHTRyzZ1~Y|G2#`k#!$7h-el;Sj)RW_1grMY#VsW#$I#eV zdVPIe5MJqlHG0v-vqBnv`1jq{AdU|ony*Mm6@C4jIy7V!vNhTLoNn_T%7=GzwA^K? zuKdb}B|T*sMjV45N2e_ETo+d^8IV^%eAuxn_V@1HV`U4L=gU(!9Vn(NpZfZ)wDd)V zeRJ}gH)b$j?rvj+dHz0szNFaR9F=OHEt}B_`;Izq+leL@8qcxv`!kcZpB+*3_G3SE zE)5G|RSK?UUq4rN^~)~(Kj9h!2H8TtJL8i|0#}RHrt0};nnO$Ul8P?MIte^JKEBVQ zHaZV)Abr}kHDTWVa=FL4I)J>)vcjqR%@6#+FvH#Ll+@$IJ7Rt^SjZirUO`~cte@;S zx%a0jzNW3Hewk!t9jNz(Jqg;mn#8BIHdV=Q-yGC2@5e*&8cMwLYO2m#!Z2OZb@}D; zXPermBJmviJu+q3Q&n{NYe zn4i;LGzbYfydQT3>&t`ZR<~N7jg+)M5ps-bd@X~r`&k&{c*j(*Y=OSW0$q!a9b!HA zso+1PMLk$u_m|NYj1A5F@(jUBPHG4F5gcSZLMU&gz&We5L0G&GAN0 zjHKNG`Q}(T+oIOpo%^>J?4^v(-+K4LG%~r}WGE4O<3=7QED9ad7aS2=e(zhY>KO&<%Ob7UT z{2*t7IV!Pg{B8Yi`O@gs{aRfjmd{T_z**!xys!{ul{XsG*uUmvcFa5deElvr zWYYb1PLz7NO)YhnE0mZ{N^IKs)f1|)+Hv%Fvv(|$I5?f2zR|#iQ|L4(V82KX9L~d7 zojr_tZET?c<_#9s)90Koq#-tmOGvoPPBWaZ!#$eKO&?LfviJ#N%NyJ!M=1Kz*SNvDz^xxqxyMJMh0szu9~$nSuYAXZ zPSMF&vFq;3(@=2kyxpgL%0o>csF z>~Ld*atZNYkKGRgH4lGAf3~eJZamK4(_zHEX?OrGJSs+o)3`bG%C)HN?8JXL%_^XC z-EASD@iycs+7aW+i}y4f3)ap)5my{8zrBVc`hm6l=(TuaCl3MpkHri)WrKz#n4>;S+Vi zhJjcsM~Ww;4^2qG>y1X-(Th4El2(^gR5CUznqS?ksSp+u>%R1#vJaoby&FBJTNF=G z_^k?5mGfzx^^q+bnvJs~?OfUS#d)3cw*#FUnI|SDerGGimsPesKR5`YK@P}cDkTQe zt{p`?A}hF8$I>Pp>1W^tcIwpRYfbXfQRD`sdQNd4EPEtWdAY=~mcu&3in;WD>gah$ z?DdX!F{Uy|xV}Z{r%y|bL_+K-VQy}`F;MUGX|)^T-cPct;B3J%2`t5ckfp@y^z=@b z4EsJKm6@QQX4*(%@_eNP_LNOq3;UN6Wp)LI3no1v2rT_+?zl!BlQiS2}iVT9N#ez^mgT zsqK03k#r=g+1Scc-U5258ufu3On`fX9U})V#Oei@UD5HvpSx z4mJ6FQrn8A#VGmj0%M_1V{xX~O032;3yX>d&c|^04;!frHX)_LY{l_uP*er>1ifm7 zi=a*#Tl-SUkQr!^_+6Y{E^cY)NUT&)#c$)7!|HsNfSE){C@J|VPo%59Xg)rpN z;08?#eNaN}QwC01#OZc({=4h3&sV-@3*yhz!y>6Gt>$;5``ys8!mp|E9iO6$FYZ&l zdBYlNH7p1P7lQ@hA;uClBXc^AWyqixX$Yw?5kw^ANskd$lV)y`qYk`(hh``jr9n%caT zmF$p9BxXpIOYnfA{);hvlaSYM7X;)4BSJZ7fIds4Y?b|2x9azP_4Id5;t`cdb3|r8 z;=DK#TYMcS^0pTQ2XyshNIu`zZ&bd2zSZju3oe-hVp8RQh))Ab#XPCr@%sz zRas6h8AjMm(%k=D!^*~{q=DnE`Nw9V^fK~~x=+%pF$Mz;oQfVUIyv-RXVG}8m77~k z{wJpc4#R~_{O0^}VdYZ*~8mn~;LIR6#Il45fNu0Mff$4jGs zuJUux#PBM6aVEhCWHV2j50r#(;ZRTPj03NIC3zhMMiA@Ehh-qtwuOXx+^p1b&5j;< zs8^I%XpeEU+8nJ|$u5&#-tTAs{t|USf?~kkPCkHq4?_HN!w{?=Z6+kpZnvHK@I~R6 z_V)I&>F`<(H)<&lEjCBOSRGL67iiBDHynDAqip(Szm9vOaiY~bH34m78a2);2|S6s zLXFy4Lg2df-QO8Bu%hD5!@w;b&g&!-XuI|o;G9Bc1l&2ueZnE-veC+XEPt{0R9zx! zznTf3Mz6$|$CXrlw=(Ji72Z}I&tMg+nsGBEJ7xMdl zspgN=g6H9k+>WK6BzgIqG3#ut^v2(fNTp`I@DRN7t`us^;0; z{>ER>5XjM|c^VP2J>CB018j1}qPAn)$dCTcwb8J6bN{zOzoN(IIeM%WVyvk2@QSk+OcDqdR4=jc znMGzhuHy;gy)SmEU&o)q?`VX0Igc(Y9M5&tt@t>sHg@ZvNp5J zf*R7+w>3>PKjLLVLPBOVs)Bo_%Hq$>FMJ=)YqBDGI4drwv~*;`bfs%E_C49w>vv?yc?F5%8n5PswmW4MTI0^CPf70XZ8bq2A!|L^jJmA7f+Jr;LXncew0qW zc4YQ})*u2^0n~;K`$yXRH-_$97IQqfF{{v6iivgO$)zTJg8?rFVv~1`$FjV1;~I}; zg|(|2YLlc7GRsPK3+x+2*Xa{g=iL?9ua#6k`y~EwDpKRuj$}a2Z z1MSt*6WU7*>L2K3oRiU?<(6mSvaHPxCzj_;D6!$lt);KL z;e(U~llmpu(`4l5_nVt&{rDc2l8v{w{5H2~)u2V0zN`h18u=PVsY79^ZX;DtkK{rL@UPD8ok{uV>BjxF z>BgF^`JKa!yMNYj!6M-CG~Pn*T=3-@n(rOniM0dvwfp>cQ%ePd&(Vt|2K( zLOVwk`SNK{h{f7}nN{73l8E6?dGkgsc=Dd`<;%N2R%z}SO!VG(MSci%r2Ym&L}$Zz2epACa#7#pBQmT$)&u| z+2wKPq{Q*in_L9(*LC%sWwGlo$O)EcxbF=$YV2vml>{n>EBc20tT?@kgxIfH6y;y+ zg1olAEe~afdF#;=f@?jN1Nzh#g_V6Lom4W`Df=iK*x%oRFn;PIe_LyNda&^)K6Ea! z@)q}TCLKIU&vemrEm-s1ZT-YQfWnnKN2T0tzq8hBqU9~GMx9w(bLxzXhS;3_%^Q!! zmX}?^rj-QG>UOE(9zJwU$;xupbX$Itm1gMRz)d|F@;>-JCG}*GfM_KfC7mS=UWl4F zx%x8Dot3RKIe*=2sn(khA5CnHJhkl8+GmYA84OXGcEH@l*k8>dgXj%)qdmtZ>xsKv zNvq2lj+eEx0&?hXG7}79#p}PVngwPAE%D`k6Gx9U`dOo?}Pxj@ND;yKM z7GJ$I>ii)(P!TEmGD-b;pZ%+M4TdH!HI52`uZAPxWb=-vE|#C7`?eNtC5(BI6AM7a z?7x0v6+1Y6w6!v(g%(4{K2@cHa1A}eL<$TV$7HMRU*mhc#AH|T^M`QqGgO!7^gjt+ zB>Wl1(cJ#Wmk;sx@H5wErB|dtWjeUJNOGQ7t|ac*3WVIUD(WXe%>H_`4_- zKIZ}v<4;c+^k})zJIb!LjJyyWkB@@En~u5O5{`;O6ne!mWEh33d1R1aB}N>ler<0O zu;h>_@97ZRha7^s)P$yr(ob?jIIg~1m^o|Q=~+}d0mqvUm(P&l=yN+B5(zP?W3IES zP;EL~>p%-SU)1~?*2F)<5ZfV!^&JTgz|fe#QEaL+5m1`A&y5=!H8;`x?hS7N_|(?J zS8QlbO!(EeWRRvomxm9B;XgSkGI;u{OjGo4^)ljOsfZY&n&Oq;Nkz^%HmxMe2>6{H z)ahj_yC>R8N`FG++wIYe7!}Z)OrS3nl-X0KrlfRm`?hpf-S6YDW;2*dw+1E60WlW!f4V!YF7jcKCPY|2jX@*q8+udx1FFB_gW2HYxY^ z;9;ych98ev*g?&=)Ra_tj?rsm&5Ao+sj`J4(#ygUZV47`nH2y?P|kN&FKB(}M+lao z4+|StqrxYV!Sm+;$ntwW(dzB;zRAi>@1eI_GMzYGiZq`7xRTtif;Wr)s<}`iBgSzm zClqM)`sT?hg)S-K>e=Cx%xzdO)K=N|Yf5+I^JIyF9}cgj)F1=0=_h%f8PMRr#x1d9!KEP*_$VY?6+7PMt+3Pb?~;rbkqj)>VZAA1?c>>Lq8{IE?l#m^RfL8m z$d`OjT^p2p`<|?q9m~)*^VMH#xa5^vdFv1*iY)iW;=Uws^P(?*R1=f~UV098&q`M2(Fy$j zwV}})Wjq;D82%AZ#;Kl-P<^&(oHlkncKG{;^i^3Qy``XB`)^)_#TYp#MnElseFXHKx)ZfWQdwoyyv@{>L+3^0Fs4au0kR3e( zn_@JI9?ypP*D-1z^@c^sEQQB324#i`Qdjd|5RA0;%w-p zCl?bFo1Y1tt2L^J8#%G$KhLx2d5-E@TuFwXC2qRrb;*>aQ{8vg-5je}I8z};51k#X zsa@z@XT^8J_99IF0E)bJ1=gBGI_Y0ip6Ap%9p*`zewu&=m}{KLZtWD#(n!b zgjBAHz*1=c`f4)X2woqG zG0{Fw1(5U&UV=7CZnjba36GrHpQ)#5oZp~%7y?(Y*nIkG+HcA{Xh+E!<7mRmlYMii zXra3|=qA`dEq!}wB&7@6(=V~*q|Q&eNCFQea|s;L8W-q-`}@n$ut!|WQT8sRC!VF8 zF#>t_?flyvAPo)Zq2n+&9V}F#^c>Y-l)} zPZAo{wy5lD*AJ$}uYSx)F<+|_2;LgZ-}F6IA>VpQPWYGGeBG17UgJCef^Iniz7^;_ z`xW_7G||=kK$Jq8vM9i{LOBAV%eOyqzxrrPdW{o4WAC{ zr9Ip(XS`IWBO+1~@J}kqRDOdM3Dcy-jClt|Br@|RIfs%jq==5CK$D2g^=qY<4 zVXt?4kF_N2u$Q&-V}YciSAamDpek)jzJ4=_s$+>Q@;`cM6a&)a?R8VS6=MA5wd+BB=o!q6AT>dzuautxKQZc^6!M^ znhq1B2X6QM3qSi1{O7LlsJ+O*wR!#s)2%_!H43Q=-)NC&5fESo;KjS(9Oz4p(D}2Y zSsgJpqrh%b8yLs6F0bc?Wypad`Fuy5~|^o)|Qf| zS4#n+rBUbYH2=iU!SDaL0HVHwZsb{`ug^ z0K&^LzNXZdZ-m2|TrvY9aNu?YOnT^c121l!m@4lA5-?5G!KZ z->bl$N%#GLtk9YP!h_D?oWkEUV!51)1|4f`$NY`yP?JtLDUI!4W4Ss&@&u<)jLz)DTKc>DL3VP8(_9ShyX<2b3F zzAf6_7XtaU(1*nJW(_3r^l-WLXjW8CPVNczhvWtXE{t9yRJT^IlJpLhWP*il(y|NU3~@sz z;w$wXYwMqdHynrRyr)Xr=T@!mj&Wv`gCIj=FGh&!GSWO-BE6<)S`@sH8sE6~i5Oe# zF2zTnJZmR8du32y@v6rR3@gSDy=^lizRA{k&2k#C>_R(a)AJ1(5H}1+Rv!HBOn5mo zJe&n1I=@oiC!WBTgz_G9134N`qytb{>5F1G}Z_}tUwic;o({N@5vGm zSlw`K6;xOTaTyewebXT(uihc9IPM`O-;N=~sjV0is#gPnpA47Vg-k3%;oRSd&&y;m zc`A;q9&wjG(Ro@`1@CiF(B&r-yPr#c%5+6kMC|KZgg&Te7W(XW!=?vkuQk8`Dp*4X zS^3E5oPk<;#OCxnvs&|bDTOI#cdk?pj)b>56W~qj^0%-;@=6!3Ox30lt{X#)Sa4(N zKBqpgi(>R8#%c;y+pOjF9pKYzp>l%-8(Wp^>gZ7nkQ|x;Z4N;h9=&bs? zR?QN&lQ&k_815uLK=&d``lmHDqz^*iEKd==e0gs^HV|~^fp>xG7`#>`urOQ$9Din_ z`ENY(nrO1fN$_$g?o9j1;YBep#PM;FWcuCb_c|9-MN6QJ2x5+oeYI3;^|oVm|3;5y z69fe{6oI_R{elcdjyz(+>~`_5erGXBpvH@IICgZk;up-PPwQcqnD2c|gGpV|5{m7c zIibRP@)xn%h8}nK1SMw{+@l~C?Csf_kJs^nLPR5bMUFa*T}Tf>24NZ~(z*53I104r zemzq4x|9S1Q*f!H26BEln$F6RajW;LuGC#v)Di4u^WnSTsRu~76#u);s^E;I7O%1P zaLPss~c^KHVmnsx7H^M;=%fV{iPm;bz+yqJ;ULOSGnIL zMqZ*MF88GS9e%C8Yti{Tg4!e(z2docW|{hKZ) zBh?Y7y@ijmyA&}>RFG`;TW4gfdW%cP$Hx)Gvj^1F)RM6%vpe^MY)?i*r$J?_w)LJl z#A{BRjQNKBL?bzVYo3^#W-EZL4BSrDO}yWAIfXIw;Rt9HuX;~>NoMJ!egE0Z>g#Q1 zjRD?qDH5H<0|v}wsbWI$?x?M=ocqwj&3T5q783X-X55%s-=cpYxI4Z<__Bg;wsdUA z)vHsNChKI1jqdABvIYsrpb!TMJVOdKw@mskX$vOfaPOnJ>WhoHl1iSpvNeA!y;4-z zl3=e5)M_rR0wo2*8ovZDw=GKTqdA&BsSA2j5bz zCWpy<>0R-J~RO@2tlxop`|313$@5 z+=Qp`3l{8(+J8@wAcCpVYB&HVIR~T$_4A#W@X;q7|1x&J1)ALGkqmND?QBzGhCI8% z(YZoxdT)QOH9WNKc*XWjN=~|OsT?RUSbZwbZ{!eue9@ z=n~U=9}HEUH?B-?XR}kLwcw#Q`C&0~izdsNv(fa8UPa`@>wV>$l8%RT`F-%b{uR`% z^@?;AJt1wuI1PeQ{$bt|YW(KM@SQ#?R<`fJt1!buV8i3@^I@%~Qx@s|zpUEIU zkT1mKxI|G$v*C@0lbgUa`}wUmWw5ZNhK*ka##ySFwVqM#asqMjCQc)nDXPaKG;0b@ z-w7kbiJqbR^NyQ2SCJK)lE>TT+7YW4*(3M(94ecC;6q}znghm!@{?b`76!KAFzkdK zj61Dos)GWkSC79b12w}`n=5Fc!{F3P28kWhKrcPY4O{w|{5zlMpR$Knp&&Gw-L;em z62VsPg!{A}Q#(ZMirGBf+oQ>hI&``H_C!NoA@I_`_GkyHVkuCi;}Te7U9glwSF}7&s3cDwT>bicK`G$_k{O~{u!w9N zRQ0#CWRK^Nc?WVcdk6m~k05*#u!Nl~*p9t4YVE5lL&8GQ6TiL$&x@ho6zwV+F4Tq} z0N|;0Y;%4%$zk=+>W(THN=CUK8Bk}@B-aLMm(D*BuM4Ap}k7u*7FF*Pcc zz(12T(`*QW4@=<>)n-b_E~h7<`R3x1OzQ#jaIq1v7f6~Cb-p8rF30CUo!sLHScsl4 zZ{_;NKs61ALllkk<=l{h)sGjyp|E>i1i;)nh7zB= z>gf$I8bKvkVoOg1 z6QF4mj3b=ar^%I~Cqv3T-S6kGzQt_ro%tkqk)VJjK$x{He|a{@df;*TE(ZE?>1lJy)uCCRX-W3DEnAE`;U zhHkgt1tDU9F$+KX_b5{r`kKB)lmsEix2Lc8MCh_{ z?)RlG%ZxRN`dLT&mr2-PMgRfK$kd|{r&szT(DL=`uh^+jeR`I_WQk(L?2~a ze8|RhG-`HVF|YY>a_$AdL;lR*da~!z19tM=s{Cg@x!$MDF5X=|T{WLB2Sqap%# z1O0wsAb3sJuEX+#i?cae;lGORvlB@>zb^41ZlUuF{TJY8fH=ve^vev_tVIo4yLR=p zroPXH{Z3tnD}&^k!6z}(XZ;gPwLTJ922uj`&tE=28d&;2JUBA8B<@|Wsftb9w3OYz z?U&{-0+!4pleAaE?~-%YX?tl@mo284>N>kXSv z$wGR2{cvqRr_4u}5v>ukhGVp@= zg0U43sev&-!ydhS!5jKTmhz zO!aC4yXrDS_8uR5mgSoB&=BEA4C{h3B72Uk2{?5b^Dbnmfp^v z@Q)Cck9OoO{>=dM6U~>(WEt*j4a|6}d2+y`9P+GcA9v2?@a)V0*3%i|V7`pXv`i0M3i|zP(UD|#>A8iv>z096^ zo{|%oq5-b5J=HTu47v=HA}G3gi^z$^!11f1L-GOSgjlhCj5D+QoOoXl0L%V8$qd5_ zL^;%Ia=H4mVJp)INMBR5(7w0kT7Sd^Lah9a8#mJ19nS$W62g@*Y#ZwP!57qg(dB?0 zl*45)wHp}UOZYVT^tUfe| zW6_zU?H^?_THJIsYYdtc)=iGpLey-nOh4;S-UF1Kq9c}}o|fPwd2DWgfj7wSjJKst z^uw5Hu>1;9;-N6v9NaTqB&r+qD$?4?IYjlGcS0s{_nNbavnh8|y*U7m_nR+iVRKpO z%1i`qrv!_5mn-XUpm_U|%mB^6=Ws{>a)LAKwWK+qg!s1XQe<`MN>Mf-s>PSs-h!J>8PqqNVQ_xX;-bJ*zD?4==X?QeHsjZk7_>If zE{{76j+p|{(=01=Yr3zjhRBkF<+qauh_DE5C)A-rwc>QYhGzD&_UztI_w9kP984S~-Y6Vpx{JR1AfH*acy(b=-K$yMk z1YHP$+FAOKO3w@~nC&gh=P5rbVl?rq$INA5D@w0j{&at)g;d0M&JY3WXk=jUQsgG- z%`ucCP(pVcK=$^AXiPeDhkeY)k#J4CdR$yLlz62B7G`(t0kg{7vHaum$sf5|Qenio zh8YVeQOHh|%_7ROV*mMeQqEcz&`{%Ux(0|v>(;6q=uZ#^rOo@8%gCnnD9uv9*EHJECe03(L0FKWYc1!_JhMB`j)?m&)}w^n z6)ltkR{3AD44S-Qyc3{FilZaCEw!@9O%K z_zUIH$ZLAL`@uAC!?z#P@~92~ z2iN??S;UOvAB>CKozPVNoK&tfz1rLIYO(XJB(`1*e{^(`s2P(|?8s(bSL?jVl`c)l z2iAvW&`z_&9S5g$0iXU;GACgCHsGe>?*(!6!M3CX6w!mcEnzFIrk16#-OwSA+f*M3 zBPYCTzrMR+Sgo{A9B;ec`1co#2Ja25!QZW~C9y(};iVY&sn=``&p(+m&W!N%^cCCz+rHeV`7}ulgjhSny(TPvU&aLPlWJ#}(1wuOo?lc~i$riwqAs zZ4eEuGYVj1WN24W8I<*ZEqUmbcz55FxbkQ3xUi*P!> z*jKPquq)^6o8NmXV<3ivzi=T$SHO#U;M>KL_r-yW-VERYtb}%0f6E3T^Bz|NQ1mFF z$r{7|Aj?zprAyiMDUA{_EW^e^Po;>G)Qm?BCxkZs2LxkNX1kH?Ss|#QF~tm&+|b&D zhUwx+e?Q)-&1~du{`(1*lJ9s0n{*!#2v%xcPIi0}FE*bZ#;bVK5%oVDd5Z&D(COpo z)v894OXP6G=g&N@cC2Zv?ZyAz=hULB`LTIvQs?tYUsO4mNzVj4-sq?UF}q%^7yTe946 zp49kg8R|Vdo-vi~yEw|)P!n?m%S>z##~47_{8%uq3`UvbB}cXI+haf1e{hx z(pR$vWZjkWE|Tbw_+_V+gD)m}01MTJ3g2#h2o%jrpw2vP-;|q2#L{ZKMP9#2gU_MD zN3U*cIZ3vjB)+2J#{10MN?mUCeg6wTW1wQ7!a=y&+u+Bp)_820^J52LSFBwwKSw5bFqEZ$BTR@#@3wd=i{0(yH^K#3 zTp60OI5*Py_V~iykA3pz#=^17#|jk!YHB|`hF`47>Ijn}9ME?pY!^Tq_BtiS`Ihk-R}wQ$1xnb? z_Gmj>2?YBq^yi3ReOCZ9Kla@m?i(JCe>~w9)~W<90gCLXbzh%h&}w95^`;K@RZlA3 zgmjI|L8=b6=jQ$VKmf3T!tDV!3Yhj~JV`p?Knv__t1)mZ$=jssffw+gVI&#gN#KE3Y;En;r-A0S;~5O8 zW&CBGe*PB2tZ5f{ z@j)U2ooeKe@Sh+j;^#T)fi17Ws-9^_Qr`3C;}{o#tWjIroC1EsAT#bXC}ymLjF33Z zQjP{%(%xn)Vzg-g_n%8BfhL-t;j~tXz<+RaMsUub>Bznm8G?j^F^XGcv}HH z321bmNl3SkDmUH#mjor=M8n}SXkR{H3bKS}=8xvyrKA_@UIjuu~(#W(7oCo&iV0N7 z<(GbDJOUX>XyrFi+f&qo=2rK zReyJ@_-?o;)`hqG##;W2U=AW4PJcHll z!TyV+`k=?_WCC5kAQ;*N5k&fwi6Q&){62ta2C+Dgj+^N>L& zr_Nqq|8`w@Yx>qS_^Z*2 zFx=TM73>292fmstF^2UUDELD~ z?=eAgJuDJ===EB&h?nT#_7~&eWQ1fSs(;mG=WW20`iOE2FF65>FbP8S7L-$yp1~I6 zQTgCJL0G*@Nm8ptlRK8-ZPdos{Z|bEQs1a^dgm!1Y6zF^8bgEUrq~-H^2!fOAj}Im9+DxmNyeg_H1j}08f+Q~P|7}$J{Q3H%Hz`jS}Q-LZU%-9 zPj054YhmC>xWwh1JN?w8H;98kPiJ-(iG7`U+UD~~Pvb<5I_9fJD!ye?G8%U?SIHjt zzhDw_A1+P=dh!du=I;R|`bq!Y_!Lk)m)e|xU-WTz~R&`wR3mlT8Sb{}Rn z_YkfBjb8wUqKiDGs~)<0narAZ7ve-~G#(^iN8U{AeTJ%t?gEjT=@|?$w)&&Opyww$ zccz=_5E zjsW@m3ShSQhkI@6r@R4F4FJ0)#n<~Q>%hwkY%u&6VI>l{$3;_jaiqDj>vwaFOVU>4 z2NNI|-7*9Cw0}`|PrnKq0ixt%5AKdDLT}dkLKrzXWPp#3h1=yyw1fNXKPDqw#x+`O zYU2KNo?U*2<`-12RBU<&}4PW`gL7o?En_+#>*nCIuXlpGXR^ zvTFfya`ffRtx!FsfH)+f=g467l?K(`RzmWm.BV@cFW1efdRK}GL0!)wDMnlJwY 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 CYp)#u literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_64.png b/src/Ext/Icons_15_VA/KeePass_Round/KeePass_Round_64.png new file mode 100644 index 0000000000000000000000000000000000000000..b995c6a0876e378060139508423d0f6e85023070 GIT binary patch literal 4281 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 b$=v?|mjoQOC@7gV00000NkvXXu0mjf8+2Z5 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Round_Keyhole/KeePass_Round_Keyhole_128.png b/src/Ext/Icons_15_VA/KeePass_Round_Keyhole/KeePass_Round_Keyhole_128.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d554d7045fc31a603c014b089ac31f57308b15 GIT binary patch literal 8062 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Round_Keyhole/KeePass_Round_Keyhole_32.png b/src/Ext/Icons_15_VA/KeePass_Round_Keyhole/KeePass_Round_Keyhole_32.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf6861c2d02e9f8e6ab611311ac0060ad3e6620 GIT binary patch literal 1795 zcmV+e2mJVnP)~e00yH;L_t(o!=;yNa8%_P$A9N+E}Lu; zpd^xPAS760s~tmQC=g~V5xF#o2pVcH!_+#AZKpb&(TdWRDGW3~6*{dS%5?l9qgcll zP!M7+#7Im^QNk@~laL#1E||@QY4)q>O0vmn-tmiy9clL8eLu9 z@SYLiAg~)~;wz2>;AOx7#N+YEzI}g^=H^z>bW4JoC4rzNBLPc>M=ZJFx8&lb7TL9D zuPj=;L;wMFU=QH@vhcfr3xE_96i7uyg&3wSnr_RG-;`dTAy<2JY3|hI^EORBYY)nQ z+BNCu(WQUTl>Q-84!!$<kwj=r0wU|3+9f+@m`q!`?(4jd}%efbaUF8w_say8^b=O+_z7f|bRxzY|CIKbMq zkD}?qaKJ_%1B?V8og00(1+p_@$(ZTj*wMrM^5;KcWW;|JSO9cSB)|#OD~ghL@Zdp8 zN;crvgh0R!fo{QvhKBk3o3C-^bPXbqm+xWaBTo_&=ej8*yxyJaAU7+Xvg1eC^yCI? z+x`Ub0098U7y-M0bvt(K;OVD-77^~f=Hc)n z=(!6Di+O(ATesF*+}xL!8&7t+gNIix=EC_;hePJ>RzrI?12LtgrC6dc9GDp1=kxJ# zO$e#p(wW^SW#4piZ`)x{c{oF;r!6% zHE_GL$Z*dAxK9Og+!<~}Kr^OJG9nJ1diE9m{Q7xj-Z7ilI43**`UxdZ?ZK9qN#TYi z^xv?tfw?(f2biYW!sj^$csJ6+yRfOBf7hU3`#?~?3P zvFyp=hACV=_YpGIkU&dg&6IEynCFhAyzFpzTcrvd1^kB({R0%3o*XkN+%)0x`RZ{= z=*s1qN#TYiGE*H0M1&ib&~&k8oPcXrP7??Q zBElVtf@gjrwKe6O`?Mb5O<*{D8}0^-t-pN%MG@wv$3}$rc6Z>r-abx%W$JV`pPmqI zn()2FE)wE|zwF&gs94=Kwjl8V$=7>(mc+!wuzcAA1T>qzA$#1#(%aRF2&8A_F>B7~ zla_fOshN2s&74Q#wCr*4h4(sHnxDY_S9fya=-U8)1m2mbBs-}n%A);$dxPRfO1RLX z(bQo?on$8Z@`d*}SzYMjWaSZ_f940+wp|Al0ov^)nHlP6zF$#(d|K|^-(<!+2l|@EqW}e?cLuir4ediZx`;&c+5r#y&!4M=O=(?@@l@pW#r`fmeWSVVi%I z<}^K2KyD0`QMfa+n3I*m^ckt6A=G!BtDUXk^cqewZ-m18%KzIPheuMVek=m!139;~ l=dHk5;3V*V$e*Sh{{=}5{Uhm)fB^si002ovPDHLkV1fieR3!ia literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Round_Keyhole/KeePass_Round_Keyhole_48.png b/src/Ext/Icons_15_VA/KeePass_Round_Keyhole/KeePass_Round_Keyhole_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9b667d17d7cc89417df2c430d78c8cd51d3861fc GIT binary patch literal 2840 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 bkc0a_=nzoaLdhgI00000NkvXXu0mjfRvVgJ literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Round_Locked/KeePass_Round_Locked_128.png b/src/Ext/Icons_15_VA/KeePass_Round_Locked/KeePass_Round_Locked_128.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7df4786362335d22f7b4c29b4816125c3c73e9 GIT binary patch literal 9123 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 z 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 UZbe0($^ZZW07*qoM6N<$f~}+?W&i*H literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Round_Locked/KeePass_Round_Locked_32.png b/src/Ext/Icons_15_VA/KeePass_Round_Locked/KeePass_Round_Locked_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d2c18ba2428e8fa6a2f3b1f1daa12cb9e22d0587 GIT binary patch literal 2193 zcmV;C2yXX@P)mKH}Br>cka92``%T!^5Fqy0aJl| zUddU`ql7cMkXUtdQvE|>mkpc#E%~Ewju0sYyjQvfV}Na{s-`Yox|FA$T8tqI!EV9dZJ=qO z8G@z@y594y>w;#0t_!*dS0~!>rP#2kuLB^?RKXY7Z)>c z-ggOwg|47U*aE!J)Wq7i{>=WpJE*IzL7d)gH+&A|&jvqTn zl4lUlJpUIaO`T`$y`bsvX~_m&U-<<7t~Rc_ejHD)+=gMQ(Ok(N?qo=YjoH%+IdQza z%i8V>kqE2=#;#qvmh2%z>Gb!4Ylg7x<4wH%=Bofa{^ScxpZon7a9tO?StC$w4vrn# z!Nrz(vWAW!IsMwGkNRevp}sh-y>1xm|5@w++`v}Vs&Ee!6%{dg${hrQ5>2>BwwE9N z41mGO>CB%0qkiBKvQuV0f@e@F0H;4Mjqwo-3rEg`nJ{rOW5-Pd_yLflTGB|EKmT4# z6Z|0~#!%OxrKJe~Z)Ogv>bNYpW(cTGQqpn&Xus6l>%#y|7rv+rqv^tonfG8tV5Vx- zc4p0BV&B6y~P_}PZlO6DQy^v&RM zVOCZW+`JL@;ZhLcb{m}ZCiC=^$7r*=F-0&8Fa-=#FidbJB*!Yo5DY_*KBVnH$B5IP zr^M~q(mR{vLETjbnOV^(6>$IjS8$+|j{E20x!6K_S1U`u+RePURLaXXf>o0vBh@#G z+#BzXf@`{v;8YNS_O^=v?P@$!KG|4F46V)%STF}#Tl&X!d?B6#r|3-X(R=3Uz0Bxr z#NkTB;Y!5mOvGV5c1J=CxNbm#OF=}at~v*B-u{#mf2J5c&L>ZUigQp^0Vj{a+-b0> z1d>x?Nu;Kc^zKHOJ_$rv)LG4*I~HMzSP9v)4K8JTybFDGEiS6WI5k?HnsF1NaBfr2;+GCJ^`^!CNG9a(lj?I^IK~Z({bb z@tY>5X+$5fJ|h+Lu0l8Q4&k*`zs0(&zStu}p&Erj_KLGYz^{_O_<>ff6 zr8hqMK95{;YfQpLz;7AlV(dsKe|>EkUz|DuunIWeBX5Ng07cUj)~~xv=^G#twbdva z-UlFTkLPqo!R5j8T+AwTvvd20ys>&Y)(v?{^inE=7=y`SKp{QDp!9^TpX>l?s(K?~ z6)QSB04Tj-0c&Qw8Ut=qRqmRQz}S&aO15p_*iIj8SZ5Am;{`0!W*lXv*z{RAtE)_-Qz?*zmi0XcsL)? zw0T{+E^FTu@pr`vzx<$>bEfsy2oLhX!d0^5Z!PkNcUt9xogH%I%b*-P(=BV>{zyjV zjgIJjKbG7FY)mAP>rvSXdfAX)0)WX2a!1F-p8#^OOA_axlt?d}FajjPD{3&ZBC$mQYaIv+S+M0?;d5sjA zzgx}e`ET7F%OFN0Jcw{7kPWy68qXOt6zc?5hH!WHZ_g`$Bfu`;BcSU_n$Z6O0;wpk T*!-WF00000NkvXXu0mjf<)j{N literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Round_Locked/KeePass_Round_Locked_48.png b/src/Ext/Icons_15_VA/KeePass_Round_Locked/KeePass_Round_Locked_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e213fd98e932727cb344af6548cec44884243cf GIT binary patch literal 3355 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

6VFJZ{+f&G8_(vXX0O7!THjY+>$pL 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 U;A}U09RL6T07*qoM6N<$f>G|1N&o-= literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_128.png b/src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_128.png new file mode 100644 index 0000000000000000000000000000000000000000..601344916a6c2d0524d8c687720ac2b47ba0f371 GIT binary patch literal 5011 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_16.png b/src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0618cc2d5a669145fa5db197750aad3453c8383a GIT binary patch literal 699 zcmV;s0!00ZP)0)XC00LV{L_t(I%Z-y;NK{c6g}*abFEgPi z=Fpg9SzehSCn_Vt^udRUq8pV2B@q%`$b=puipqy6dMFa1hXPA0i->v&3ZoJWF}e^M zO=%E~m6qkGbIzGLy9dWJbArMRKWrBNTKsGMdrN>FI0bB*k(QawG|umlp&)P-I3fXO zN=m);7n-k-n^%CW3KSKTh(J*%OIG7|B_ik#^wQ+7<@3PX(-IKuc=9USGpEo%?tb1$ zSLZ{b8h960kYBV!7nN1Pz=vKM>&pivhcjKg=^HeV{U;A`v#pur6bAqk;~}co?q+js zW4uol9Nswx3t%AMx_+7V)+Tn;9b?U=eJHBncH23wT{=#dy9D3zt-2im6JYRs?@kM4 zi>p|-#nZHygPg%g>Oc#%O#>D++A+dTxoscByzqM%PF41uQo7jK$tFR@d ziG&aZa|?Y`t*S-S1W^qNyp`CJ(&&ENPE<@{GjqxeAzBhGgu^nS&@VI%q8gZOPLfiy z7!QvjVxqFF{6ioj2)uhqS4X@4Wb+DE5YcSB?z*94CaaU#r5lk|5(Hv_<>vb+ubhZY zAovvM;p6)kc*|=hv8W)^?L&?bUt?(WXRtrei>wMvmSn7U2Ns(HtKErYwj-Hrn60UL z2`LFh6%2jpMG21tCBX0Ylr(JLdy!06p<&O;UnNJ-$=!GNFgn!dmtx=f1W;p7$#6~Q hJImw4L7)XV`Uma0rsSr1F8=@k002ovPDHLkV1i-+G@Jkc literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_24.png b/src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_24.png new file mode 100644 index 0000000000000000000000000000000000000000..17ddfeefe16560e7a7de48193da8105f072d9bc3 GIT binary patch literal 1089 zcmV-H1it%;P)5d#K^foB7zA~(Jv$eR|q8)Z8@oITSLt`iW+X$v8&te=5B6x!M*1> zr$65J{&;t1SiNv~;hgt=o^zh>_dL%9>sb!80V99_=06SrhJk~C55Q%^yMel@sv5R5 zHc?nqj4>`m8$^TFAR0s)v^^&pL{f7~G?U|F{CKj1OBV+K`hkaB_Re44*}R*5uO33Q zi?}i7P`KC8{nV|7^$kN34GPr`;YLE;UR{8A4C}l zlvR>nRGI;g+X3TB)3#?lq2PsKFHpRtvFW<-^XK|`=kRNs={tpp0>I<(QdPU2rXBn6 zmsdOBN}Z9YEk$Pr@rBZ=Qi{6Ph9{6%GcsATMNLs{w@x@_!wt< zyBu&Um5`NlD}cuhAchQhI6TSg`*$&WEyA6Z_wnYt-_ib2FK>O&Lu-2%x7|@kbasaK z+jkS0nR39D7_@N#;0A0LICFly<3lDVLlmy^)6#a7vfFEu>wz^jJl}GZyuuQ$hR68+ z+anIR5`)&H0*KCZ%fQ(l03O-Ao$Q>#3_*P>3V3kC(*O+p+T(yL0j15t08T4joe2Yw zS6Fggx2(+f18^-8cEICm!3ng^^to2n7Y6sDa3x@j8|(Ml0ax|~1n>fgWL~0s>Niqe zQOhj_{zc(R8FKPUxW8dLzU6ric)AAObdeMAXPTMUSu;|dn;9F6Y(m^duk;YM5=A(1WM`tYnU~G8v-p}zY z@p0tvPNpV?9YH)xmL=gCDN5PYO4az~5yIn_FxW-de#Mo>xDAo%F{USifJrPPTGBR| zvT2$IDS_^;+ejobg)s(gtTbr@1}{nsr4{SQEm(t2%p1eazC5Q3Gf$AR;_2>VgvWy! zLT+e$1@F?O4EBG)R@IWit){%K-icE_~xi#x`6V00000NkvXX Hu0mjf=F$la literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_256.png b/src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_256.png new file mode 100644 index 0000000000000000000000000000000000000000..e579fdf6ee165952cdb4809048327c257da8f40a GIT binary patch literal 9953 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 N*SUAA{HAs2{{c`Z@2UU* literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_32.png b/src/Ext/Icons_15_VA/KeePass_Square_Blue/KeePass_Square_Blue_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0b6f0f8421282ef7080c78c8b9b02704a7bc13b1 GIT binary patch literal 1364 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 Hu0mjfKfX%6 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_256.png b/src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_256.png new file mode 100644 index 0000000000000000000000000000000000000000..d920dbded30de41d2ed5e1de941d5bbe3840a5a9 GIT binary patch literal 12765 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�!m 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_32.png b/src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ed907edb9270903a3464e317a236aff2c4b14875 GIT binary patch literal 1704 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 QZ2$lO07*qoM6N<$g8#(C6951J literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_64.png b/src/Ext/Icons_15_VA/KeePass_Square_Blue_Locked/KeePass_Square_Blue_Locked_64.png new file mode 100644 index 0000000000000000000000000000000000000000..817eae2e0db425831bf05916ea4d378f59be4bc3 GIT binary patch literal 3323 zcmVeEJmP=(j;klG00F^<}6TPzm#{j`Zy%Vx88$2xyPxD#09DS%eMJ|NPwWlBmj-g^53 zuIW3_V<5j>c;_{1$G3a?*Zh0>LzG=SBQum8fg+=;;%y+uvqg4?PApsTH61#2{awPV zDl|!LMbE2mV*gL;DK9$ht$S6Axt!);bGyMA2HfqmP^={1P)lV%bX z6JIZQRRyCdf@WzQDLS;Z#<%k_e#t4#8U+5(!96_sz%Vv`y<9iEXR(+o`F_)KUVL%{ z1qXN53*Ox(KB1Y$64sQsxW@H{-?4oQQy#m8!v}UZSa?@du$wnux`zXMzpEF#5D*#N z*sE`ocVwW{3%a*yilQayB<6~bv_fHn@97sw$i>1?D>YZE9TS*UUf&Sfdmi= zys!6WHdph-@{el5Rj-s%Rww>3eHl4D2ZrqAbm=jO$uBM?Ewht0loKkO*M5Z6YSs_$ zs`D!VgnoD-;G++wQ~0x1^_!-&VB%9VNp6;|+rw*`lEJt~-y|Waxu)L}NB6O2*(}}g zs`mc)Xh0p{RRP<#u9vE7ziY?Pu4B(SySJ^|UCxz#M@#!YxOlg=mV|9zU6S?d=DXK1{P}^bo|4Oj z)U2RUT|#mOlVAH@x51OP31kDD57#O>OuC-9z267X>j>yO5IS{*R#^}m3+3fdavFB+ zL~PlJQgX)czsH3uXX-i291eT^9ih>MyGZ~?*l8$J@l#_fpiJ*B4yo8W=)`U@Z!ysAp>ll$PUNH7XD_?7aOI=|mvo5gw9KVpv4ugZH^fu@Hjr^?(YHdJ* z0>fqFkBx)b^B{M%e}k8|6z&_V-zJP0<$Q$tJ{5$6L8kf`!Qd%9-?+js!~|0NbKe9= zY687_Um77iG*Mc8eH{hh4e1A75)2rwG5YCoe^-ZW3E=UHo$B!# zUSewdpzu-ww3c}wZQFw)aZejs2wihD0x$}d?ASz3#--LkdIf3jN1qC+%MVrsn8Koi z!%I9tQ)8JMp3%zxpc_&Me!Rnt3m#*eL*En_Hf|y5+1CbycL!HqHXuUk$Oj2d8pkgH1bA&UXs8m>bZhV{h9ZRf?+7e}>MCh3I0qeyAq!>`mMw99&;3~2-=1BX=2l|_eI8ka z>U&ouM$oPH2uMin7!+QX6*l}RGd9)LuxVZB;txd=?!6ssw%WSVi?C&*Rw~;2m}=r6pde{R#tc>J2OM5OnQonDKhugs^fQG)|D8FD#H&zhcLx`2ze68O^v>)4vBF|HF0IQP}5=LC$a)<#QC{ZiriDKL5{96F#+ z0Il1=HT?oMS%38-mlVG0;t6)HenMt9R~UhdKwF^8Vby612ABe5h3CHq2lF918qzYH z+97kxcKiVEya^B91N;2HHhZAW02bfyFH{Vd2>v)*bML0Q?3nMRKLqBx6+RQ^rm02% z(<9;WP}0pbw8L70ak@-Y++h2=G?Uyb6E5xQ~RB(pTJsm*7wp? zKsNA;=ZwD@=MGB+;MoY676J8GvGr&vk`XMG*&ujQem>r3*#UVsJKWm~8*@jue=(OQ<*MGJG~q zXBZGOA`vCA`k<@h5K9{&t}^~=;11W+&XneUf(Rl57zqq>9k(<=R9_SHH9}7#v@t-E z0*zfSNtFVJ9k54*jSl$A4rPM>XQ={?QM-M9x$9V3{s)p`fmvk`8M6QY002ovPDHLk FV1o7WP7nY9 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_128.png b/src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_128.png new file mode 100644 index 0000000000000000000000000000000000000000..e5b43b87f9665adb629f553c70256f0996b689e4 GIT binary patch literal 4945 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 P00000NkvXXu0mjffFg_| literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_16.png b/src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c30a8abc6b6b96e27fd327b16eafa2cf64713aa9 GIT binary patch literal 747 zcmV0)XC00N6iL_t(I%YBnyNK;`L#((FWwb|yM ztW_ICnmSCQQD{-~LL`F-A|xs(i6SJbi~dnp)lC#q(N!5#kf8=;5rh<7gk2;CW|UTI zkZDw`MBB_YcMhHNb}?NZFZ$r+<9m4C_x;}I8!6QC(RsTj%E1`!wBX=k$r)483Y& zu=ggXj%?>@^JCiXb*6cfT$fWrMZ`99%bgBtt1CFVuMSN$(J(pOuz{LT8MhxipQeie zfC^$0==+aR$^wgQL@{;B1Ad~zaT|sRDqvH)YIQk*BEOwz8I%;vW9`bq43_?ZfZykp z-`}1|;>#1+zh{#uit^uR*uF}JUmTYoU5CWy^@sx@v**ec#q8Zti--kcvMyB0oE#_Z z9X$vpSSA(a3#VxyIHqf$r&5fKC&01*lN`6kg1K4zP9_mc029N|Gb1BY1tx*l{U2$6 z*v-_bUbO_L;}3Tq^<}UekIL5di^0+nz>(7bsa+W?U}8%M#6rZRxBoM*`ae;>IhesJ z%e?7i(?B;&9I<#J8jcM5ON+eBcBy2$XMva?Dk3I`!YoY#Q4oPFXL{uDzzFeiBdP%B zmz6F$e!X!QON+g>^~nrVO?3_rjBv2AhYv&J=aor2p8@K<`5wQ=?X+2VrnM8vKa7s) dQJ@7l{TEpl;1OpVJZJy_002ovPDHLkV1i7vQaJzs literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_256.png b/src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_256.png new file mode 100644 index 0000000000000000000000000000000000000000..b4fedf1435339ce15963614b74e649d73c5cf0a6 GIT binary patch literal 9756 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 YGlE{8AVMF5o4X+T*Nv}LU$u+)9~ihZ=>Px# literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_32.png b/src/Ext/Icons_15_VA/KeePass_Square_Yellow/KeePass_Square_Yellow_32.png new file mode 100644 index 0000000000000000000000000000000000000000..cc367d259e8be3cee3fd79d4ec6afc21a86762e8 GIT binary patch literal 1419 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/LowResIcons/KeePass_LR_R.ico b/src/Ext/Icons_15_VA/LowResIcons/KeePass_LR_R.ico new file mode 100644 index 0000000000000000000000000000000000000000..c150c04804eb08ab6bc945a75df69ea624a1aac7 GIT binary patch literal 44702 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Icons_15_VA/LowResIcons/KeePass_LR_Y.ico b/src/Ext/Icons_15_VA/LowResIcons/KeePass_LR_Y.ico new file mode 100644 index 0000000000000000000000000000000000000000..20e0701dd9c4382e5b8060e02539dd8d60731419 GIT binary patch literal 44702 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 G-v0qEf{J + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/src/Ext/Icons_Nuvola/ReadMe.txt b/src/Ext/Icons_Nuvola/ReadMe.txt new file mode 100644 index 0000000..590166e --- /dev/null +++ b/src/Ext/Icons_Nuvola/ReadMe.txt @@ -0,0 +1,60 @@ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +This copyright and license notice covers the images in this directory. +Note the license notice contains an add-on. +************************************************************************ + +TITLE: NUVOLA ICON THEME for KDE 3.x +AUTHOR: David Vignoni | ICON KING +SITE: http://www.icon-king.com +MAILING LIST: http://mail.icon-king.com/mailman/listinfo/nuvola_icon-king.com + +Copyright (c) 2003-2004 David Vignoni. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation, +version 2.1 of the License. +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. +You should have received a copy of the GNU Lesser General Public +License along with this library (see the the license.txt file); if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +#######**** NOTE THIS ADD-ON ****####### +The GNU Lesser General Public License or LGPL is written for software libraries +in the first place. The LGPL has to be considered valid for this artwork +library too. +Nuvola icon theme for KDE 3.x is a special kind of software library, it is an +artwork library, it's elements can be used in a Graphical User Interface, or +GUI. +Source code, for this library means: + - raster png image* . +The LGPL in some sections obliges you to make the files carry +notices. With images this is in some cases impossible or hardly usefull. +With this library a notice is placed at a prominent place in the directory +containing the elements. You may follow this practice. +The exception in section 6 of the GNU Lesser General Public License covers +the use of elements of this art library in a GUI. +dave [at] icon-king.com + +Date: 15 october 2004 +Version: 1.0 + +DESCRIPTION: + +Icon theme for KDE 3.x. +Icons where designed using Adobe Illustrator, and then exported to PNG format. +Icons shadows and minor corrections were done using Adobe Photoshop. +Kiconedit was used to correct some 16x16 and 22x22 icons. + +LICENSE + +Released under GNU Lesser General Public License (LGPL) +Look at the license.txt file. + +CONTACT + +David Vignoni +e-mail : david [at] icon-king.com +ICQ : 117761009 +http: http://www.icon-king.com diff --git a/src/Ext/Images_App_HighRes/Images/B48x48_FontBold.png b/src/Ext/Images_App_HighRes/Images/B48x48_FontBold.png new file mode 100644 index 0000000000000000000000000000000000000000..8cd5dd0a9bf5c631cc7a52d6939783afcab6fc6a GIT binary patch literal 3011 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 FV1l%Xs=ELH literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Images/B48x48_FontItalic.png b/src/Ext/Images_App_HighRes/Images/B48x48_FontItalic.png new file mode 100644 index 0000000000000000000000000000000000000000..db528769777eb249c6942108fed197ae69ff990b GIT binary patch literal 2944 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 Ef~U7D!~g&Q literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Images/B48x48_Transparent.png b/src/Ext/Images_App_HighRes/Images/B48x48_Transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..63077ca003338a64fbbee2b60b1399de705d3aa9 GIT binary patch literal 2831 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%0Dy!5 z0Qvv`0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000JJOGiWi{{a60|De66lK=n!K}keG zRA}Dq&jASl00;vxwSVW^LJ+nF>m>Er)N=v?0s;a80s;a80s;a80s;a80s;a80s;a8 h0s;a80s;a8cNP(216?&KZ*~9x002ovPDHLkV1mYTM+5)> literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Images/B57x21_3BlackDots.png b/src/Ext/Images_App_HighRes/Images/B57x21_3BlackDots.png new file mode 100644 index 0000000000000000000000000000000000000000..5a7ef33a9bff157fecc591960226bcfae77075b5 GIT binary patch literal 306 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 vpd%6_BpYZ`1fo&%-k#bylLq`vs04vK+OK literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_1UpArrow.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_1UpArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..95fd80d142b97d25201c17508f62ede6d7903e5b GIT binary patch literal 2457 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 Dk|Tbn literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_2UpArrow.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_2UpArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f10cb39b13ba9bcf1e673900739ebe89e38340d5 GIT binary patch literal 3585 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Apply.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Apply.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7a6907ee45022b84092dc6b3ed0a65580fcd9f GIT binary patch literal 2855 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 A@c;k- literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Attach.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Attach.png new file mode 100644 index 0000000000000000000000000000000000000000..449b2472a7d14038f3c30ad7117548827bed46e6 GIT binary patch literal 3906 zcmY*cdpy(o|Nm@bbNMjR$>uK6P0SRFX=4;690{F@xy^~?o{(%yO{qh2+#+=9XBJunqOkG5mHQnU`Zv+AUU7bg!+Al4;}e?y~+W(JO17-I-Qg`YYNTs zFM$*Vfw&+`_hcHeGd|$+2ZDKPiquDUnsHLT|`|XktD&(9iL*VpeAWLy}!8qh;I0CBK zbDipIWFBcx1@8Mn^KMVS*^hl}4xV{S!sUI6qBpLNW1x92LxK71A^lf6U$=B8OxdBJ z+8h{vFK$pcC;Rd`3msT&fZkn9iSMnFNSAx7?hVIzchp9KejZwbKWe!t0`vGYcb%@NSr`+7yr`?}y~b8?0O;c?&}O=vTAu;)oxotxc(YpuUCg3uP~R@?(r zVO7(7nb>nOiCe{oQHA^0(k>g@LOZG@7e2CZJ+_|~VEH-CKfwwkc|ruKIuCm9?e3*M)A?bXnGt&KPZY6g6@QO=UF;VtZ{q1uedcZ>| zJ?`PpvyDwZj&{;F^>iexs-vLK(qWD{Uwc$yP(5}x9e)qi=}Q4D%Z*`no-Nn8QrBR? zJ3;t2k+;C~<1P00bn_T~^;#*6k)k#yALM>Mpim_ouR7h8P;ZJWXHJ8y zMXunGRR!4Kn#W(cDDH0G&);>V#UHRn)eySP!f&Lq%OLKqI4l38bO3oC9gs ziuasnhWxG~dQ+ZnPawNI8k?-kX<8=o)c0M$yW;|HZXq_Wyb$nybw)vjT{SpdNZqi8 zcgD&W8x=J(vI+3$6WrtXqrofR_94ShAGj5J*}}IajP&8r8P3sP&b09dtJ*wrip1~t zp}9ALTJ0;2HY)l{4mbFZuN4eaM29;NnDxQ>oL zh=fd$v+)-Rl9`7=uz~hb4lD?K!S{;cyvNUXPJl0)1qT0Wp`h#8y|}!3+lY~a1(=$2 z%r*wkA}?gMEg@C6Z~kPwP$@HvG}TT8RxBB&T*FEJ>^E4+(Y&b&?AuI#9`CZ6BYr)< zpQ0eUq+Q?y9oXM*xqE|SMY(tbZ}c!(EXjp9&&^mmv01lj;n?IK38d-IdB zNcXjkF$M`_*2bY26DRu} zvyDQ#1RXpu>%^EW{uS39EXJzH7i5f@jW>|44g4U_f z>ao_-tIy^ZpeUie72Qjv9kBOcJ^&fk+0d8fK(?0(sYiT=B5f5VYQ6 z4vKXH!PToEXvjYLlx3K{yAMsVeD1BPQBJU5IkRaGHKb`tE#2&b&Y$~w?j+cr`HFIl2WT%Bl{XV+w3+Q2); z!-#aq8D(O4pWioFS35;!zxUL*lDDr2tKF%dmrfI~mJK`iH3mUO6>Dzrs9DYj)_P9)P(8rNi>*Wn!lnEe%$ zlq+Jm{FNccss`CL)&CZURbD{rCBPnoBCB(*XlOz#x;3D=9v$!OgI=ev$IGGq`Ihq6 zo^*E7NzU;f+nSUWaeiDXhV!u?(rPo9Sl|!JGC}Zf_ABwOHVDSuQpTnW%Ig;PKtUtqT|bcASj8i4*a%@+{U|tV<=jC=n*OyUkMa9&N|d7C1Nl7m${2qBREQi?yeoBpLr&jWqE^? zP)aoEN#swEYT{=4u+)_F*40FYNm-#(+fvJn0y-3@u*~PO=y08f-E_~~HDPq5gL+Wh zN^gR+!vW3h#cV{X=Hf=irrx5I`~JB;Vw8OXBVu>fK4_p2UchLKqXp?Jd#|P6Ei@y} z@0T;{++o}ae50xdj%<{U&q7@Mxb#s$9Hcy2vV|sTT3|PGTZe;|r|N$|S}{2fht5@h(hnrz{VHmFtmcvS3`P!mQ&Ii#3jeiu4xdLWv0(ow7 zQ5w4(*ZgR(YrTf|`t$YLw>zlEOwYoI*k9>lm1osgzF`SkuH^QPxrNS?+@O*YI82i6 zg8w4%s81oQDIL4Ts=MP2ze2pGDa-aE@AoZ!+NIO5Lgfm}RUPxkf~n`UGkGu0RjlnD z0lU64vEYSBWCh~csSvc)`@8iCb8zh4O_^*U+~}LVvX{4yM{h&R369&00scD$ af$J?Ft0I}6{mM@;;N{`te$S15=Klbfdp&Fb literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Binary.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Binary.png new file mode 100644 index 0000000000000000000000000000000000000000..a898930da2cc8f9688ed38ca80ecd84def211642 GIT binary patch literal 2728 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_BlockDevice.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_BlockDevice.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b93ffca0faea6caccf30d919730804151e533b GIT binary patch literal 3365 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Color_Fill.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Color_Fill.png new file mode 100644 index 0000000000000000000000000000000000000000..21458cd15f39955ebcc411ce21d4b7d8a59ee6e8 GIT binary patch literal 3354 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 A%K!iX literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Colorize.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Colorize.png new file mode 100644 index 0000000000000000000000000000000000000000..61a6f6302df3f0848bd1369e53041d54e2ae64b3 GIT binary patch literal 4642 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 F{6B?Idqw~N literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_CompFile.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_CompFile.png new file mode 100644 index 0000000000000000000000000000000000000000..5ea4818e336c3d4b7226da0f2f9ff4f4f127d353 GIT binary patch literal 2195 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 VyZZgZ<{eE8xE%3xy6;F$`8W4553T?J literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Cut.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Cut.png new file mode 100644 index 0000000000000000000000000000000000000000..57c4711c1bd2ae559a9ccecb7a20da5775a2def2 GIT binary patch literal 3406 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 UqIHQW9f$zey&ii?9qE_<2W8_XxBvhE literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Edit.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Edit.png new file mode 100644 index 0000000000000000000000000000000000000000..bee264546b65750c6d0abf65760fb2257bc6aef4 GIT binary patch literal 2011 zcmWkvdt8!f7XASFL`Cu1f|z2dnK^}0jHV+XIv}g2R+F`kA>ySnGuKR8*ALY2MoOmT zrB%?{nyE2uX1a{4Vn|BbdfBbjt~y%VMK?4r1jx6af4uMcz2|*@=l7iFJm}0IVapVR4A1t}h&j><7?aN)cn0#)@JAz^%cru@&!;GbtxLK4)!$F;M==5Gd;(x*Yei>$ zdm#su^gZcT88io#HGnF4g26+DU6njd zrbT(QFt)ai&qx3Ex1;T)r2ev?_$eNdL`v*2c>J9CX8h`Ed!jvH8O1(eWy|yp2yUMG z@Mb8^`MOd*h?U}fBwMc!>#EOL&%hjQgQ&T{P+2Ul^Q=%@n`e2`*P(q!pmuf+X$HA| z+-#<9cwdy0?T6P8j;y9hxy|B=$__v3V1rDYGAI5WjB z9;1Du3o-LXgPS`ck~K8}8~)Ir)_-(66Y!gk`XPR)z@#r$WQ-q@{535zPQ5@WeVuP? zRNRBUQmLQs5o@sS)iuM!&i{srfKB&_YsPtV_Uh~@{6N_f5He8ACUF^O^b*C1XS*fj z(=B}$w(**kdy5d*8dpC0jc;NmKP2hu#DZ1^hGRw}b92i+Pl~@)B^NOl%n>&F1N2Y2 zM(`tv5Pu42#JBd9*N8M>L9UtOkfdwRYyX6NZR7ON-4^_d%X9dOxK?~XO^6E;Jl3_o zM-Q;stCk=bl3Dh+r3Z~USMEIkvwbEyo$99IQ-lIO8sw#nSV|sQ+#nGPO#&)yOgOQt ztyWy_1Z_g$D6PR$$=3!bg9NF7z9H{buKyE?&+I~=YYBwjyq6O$Njj8lIrLpR!y}`QE73*z*L8Z)E36z=6y-XAV0!6r|T6F8a z$O}AR#oNs^8g_X6lH~N_HKePwTED(C+-1Vh7dc=Edc zkQZ4vvL?B>6UKQoL2zu)PU@deI&l$9p+iE<$9%Di&7u<8RAc@0N~!sJm-X2MY<{l+ zU%8098hW`bp7*2?u6E=~%ZMs0fG)$fJnwuW@2{nMM}XbMp_EBuvU0dzXIuworhg?9 zGDB~p&e8+^eZCQZO&4StGMb;A+M5a3Nl~F1@P34r{CFDHaOv>qJY@=naOPg0Z{g9@ zJ9@r^0gbt6m<30Qr}KPKrB>@`6#ra=Tr}XUmNA;T;nRj+B->4@I&l z+V-VDlIvxnvG6FedpLT2L|O{J2Xnd+>pso8Z>D%lzK}} zdXjB*Sl^!Q2@pPG78SINmsc4fFf%h6+=V?-)IdZkj@#ew%dGZ&R#2j7bK89r-FaTo z9o(#-JQYvR9C(4C6ldK=sprm;t4Y5<`i)cw>#!Dq{G|`1bpPRxJ}G?R1IA6XEi>;M zAaejXa+s409*nR9qiyJtyKX(y+B;wIb;f1#D_#ZPOY$RTp%;QJa*TT<*O>=Ehwo2G zPB8D-GTbI;kcHz_02M|Bnc~)4UTS`;C)V|D!IIvAedJS|TrKq`EiuLsR(`3_y7jEs zNCiSc2X$WxE{n$3={LsR5-mJg(A=Ek$tzU~JoxpzR%L-xc2CQ_E{x3$# zvuc_d7))n~-_<-TNDUWtEoVCL3MN zV@7bDWA+i1My-)6+8!zg1~4ZojKx(64nAiQZDt*F+`13KbQKjb|484n&HPeWOK;7k z4B0mpJg*PDY`j(1P#7CW4kn+ zM;iOnuTri+TF+j|VAA^7tD~~C5@%d1seuyyH64-Dz0|FTA-%S0+O%aWSeSIhCcts? zmW{KsT0(c9vxD++E;f%RdvD(t>XEZF&)9BaGX12KmBmA>&to&Tz{?>8) zkK;x7NEr4vs>U9NwK%6Rj~#^v{uLhnpH;VR8V;|&)Kci5@Up9B8ooIihAh=`p( z)rlf=;ONv@$Kll9?Jk-vpDQE2X%mjyr`f}+Ycq!4!-+dE7hSvIkzu2x9hoP@QoVp6 l0-P6*c>?J4!M^|$B{1(OZ+R;*v60^yhzO4kYY*iY{U4mlhsgi{ literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_EditCopy.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_EditCopy.png new file mode 100644 index 0000000000000000000000000000000000000000..a04d2f7fceba17d7ca3f15ba8f3480408df77598 GIT binary patch literal 1989 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_EditPaste.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_EditPaste.png new file mode 100644 index 0000000000000000000000000000000000000000..099c51ff909ec6f4f66152d940fc7966caac6353 GIT binary patch literal 2704 zcmW-jdsI@{7soGLL<|&6N5LGy$1ioNpD2|%S%7bvG%QPN90kRw87nI%%Nha6t0wu* zAT6UkS_p*h&Ia8UWcw9ALdj32oZ)So$9jtMMo)c0jd8qMSQKSWj znc$CeShr4dsWBjtT)tYP)@jRU4YuJ%X)0k<(eO8e_84q&8o?@+&o;dKfWgsR_WT6b z7E9Qs2|V`CdMY`kd4g`4omsUmdgG?U;!2HB}_H05*|Of2c(CJvU{A`tK*&Tfdp)fQ9~u%o-H z*&BDQoSpk=bc@&Xyd|@9)Fum6+m7gcz;7-a2KuyPsF>h3$GS!HDg;xUr~9E^GeG^Z924- z&~iAk2D7CHXf2c2r}fs>*AaxOte{MOwSfEQr`uVUr~lzSLBM_F(Blj^I?h7wA~@l_ z!C!`i&`pzo;_`HU##p>XN9&vh)7}I$og@^kJ&Fe~qz^um)ZR7R7HqCzJRly*uiZ>A z$-kovA&>jUig%zi=fi&|ufDY(=0e0*#R01Z59i~El3)ZARc83Z$UW6;m z7>4dSA~QbwJ(wVK6N%5+=pU#gw=DJvW_%1{<2F}F3DbmrbbVn)X#E!3R}8Gf=7kVf zm4LO0TmoIEK!lgkOnT;Iy-wX@p?+{U6lgVx{pkj(w+=+qz1EtxLoDwU>?)2D&9T7> z`!@S*{2HNf@8p&b%jK*oFk+}5D&rgd?XcY6($mA*K2bdwD0ESA7J+r2j&Ew6#c!8$ z0hr+x3I>@1^liITo(CKR%Nae_78m8eVCt5vu>NP`T`l6-`^5)4m!#X4b-SB1GckJ* zgJO#6(;GA=T_EoNj3Ah35#~3FxJSG46O`qz&7v3w_P)?PpJ3vpLu7dfg&Z+JA+Lz+ zu!t~~B=6{!-F z69oD0J%lg9gHLh&F;?Icz+gfa8!w6p(YLI94C9d9lNPwxOlhK zro8L|Pk&uep%Z{VTKZKaYij=p5$Uf^6&l;*iXh{THC9E!>v73=hSyXloZePHC;<0Z z%2djwrCWS0b7jd7&m6lbD`#mFcUo@_9U-I?cN_v*3+((W=GSJzVc{ON!~E~Lm8A8H zTt-lb4gfUqST0aktf0i-pI4*rPSn6NwmTnsLox7~#-B#`&N?4VhxskaYH^Rer2^ha zkiCC4Y~)PPZReoI96@wvm`AOx+5t8Z&r^tNSL@99onj!Zau6qins&=@IN*uzE3u z!&#oS4B>v;ICk2;rkK)jbD8^Rpu)7Rles`>ThaUzgOz=$i<>2Nnd(xwY*R4ZaG^&& z=5od=MddfWMfavr$LGuB4p4}*#z>I&5%$X(rv8AD?*ILuPF`r4vO)?p?l>CMaNbNb zo)+E}CAq`I^KqlTa(r{VZ7V7FA&Zi@f6N*pyU0k8CUnx85Wy|DTaHv zCNp(KI$U`8ZK|KWn|u!Mh}b$6UH~s5wvM(lhTy9pVz&GU)inKXkk~=gtGR$^Ar?pL z91fG|16fLm$HGza!;fDIlJX2*n))(Bjce=HC^shbGk=?+^q#-D?B3-t7a?X7CMA+d zewUetdY@n8%!)LeAeVh^PFAdL-r7ZrX&KB8@V8HH2zhd9$n#j7Y_Ks6C%ZDtoy2eJ zCoYdkbg8Be&d?(LJcV6y+usaOC?aUo$`wcznh-fjD|q%%u$KrJ=4$5xOfQ)jmsfi zrMHU?eq02;y4-Dm4I-aHOW}R4DVz}i&ZjmyeCK}gx+q4Pq!$AvK*^1RuUOY8b?2JV z)^8TFK^1-C&#BRMP%omO_`rd@eXI3<1^4v5R&9%Yk0cH7tHOoSSyuvKRMPQWKZzh= snbtu}>8aX;rir0;D~fGB2LYNI*yei;qWRegtRp4BiHwW59LCH47dRc%jQ{`u literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_EditShred.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_EditShred.png new file mode 100644 index 0000000000000000000000000000000000000000..c7d5726288eb487b11a44a0560d25c1727c080a9 GIT binary patch literal 1924 zcmXw4X;_n27XGr31PKHMC4oS~fZK>A>=eZ;1Tcz-*edd?xfE5kAfIAq?AHkKm`HkG}J4MEqnK~|Mx$eEHG9+$f{BPDl#Vzv-sCuazR zbl%>?RAHo&h1lvl$_@tv2dqJY_SXjcFB7?0@X)ejUkk`bI35_Dae7|7VaW##Xy-5*N4 zDsLT*=g|fBz#Ic6TZo~1NgU-th%RnDB$gcA6&(>#$v%!z zr(R6IB8~y(ut5gN6joUS)+_1iyPfn^%e0+68jqp}!IsC>1ev!41$dN?!?|X7{8OhR zRywbO+4&L8qiC$X!*KPz;7n=n`s}K~9CsF^)U{FFf13jJ-2fQ+naBkck+fI)5?g86 zJB!>0#9wTtQ!rS2n-*64k>#CeBHP4X*|Gv#65>pkJu@{3MtO)ca@k?FKJ+Sik z!8QCkO0oxL8|%G$!fihjI`R>Eyl!p?Byv4nWSz_=54o$|_DF8{0>q4|5wUpx35t2` zEz^KRiF=cC{uT?|e`6q+TJ9p#6qv)4qjU4fjSKB8c8pwPE}{ZF$FJ^7=cS*?4`&1@ z%LgWsG54BOby9GwXR6h6nlx14;fN$eH4}Wz{8_i`QFxHNR%tp#qv^hhzJHqX`a78Wv;j+i&BqP^gTj z>$C1I;XgExsAuStuBW#;wG8!U>br9IFQ|gM%%-=yRdeb|Ll3^SrixWO{L5T->mK92 zGKH!jY~1r@AVT0jE@JG?+tvPTd-Gi=#>OFbX!MmBOKT?CbPpu7rv@J|`Re4Li)U4x zY&In&^IzevShcx*c_$NH`t;+vK1SNqHr&3zI9B1~Z1fX``s^YD#DaWAa@L%WGY#lM z4%=w@`t>pMWsOg?gc*AeU4RNOiZ-5swGZ7t^xOfbut6@;fZ3oqcboy}4VL zjEYsd7)(G%XBxHra@AvE*^m1Xr^8D2x2;`9ka?KkgrLXW4EQl_zR@;oMgdpo4E^H9 zg?^3aZ7de;O) zYISqvyKnjNz0;6jh(hR2*H@I{3&}_*)O+0G|oOM z-%r#t+4x%iChIz7-5CQZis;-1*9G_!HD_Gm#2J|T2;HD39j7*6leoT^MZS!jVbodw z2_~Fm(7%6{DvCxVX8hnwpy)XkEt$kRJ>bsGyazI>-7w4x$tj~t_#k&=l23r5Tmr$0Z zVvS&G^vS~1l%MheO>^lsAcxp-;&0J*&kGOCePC*4PQaAGU6kc(G2T z9{oxTsr??#uc?u5Wt^2nau+>cJ8L>#DEZ!L@Y$=f<@Z%|AG-ovglv;eIt>y!b+cx9 zVa;Z$(AO}rye>Xk7XL*}s*#H0l literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Error.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Error.png new file mode 100644 index 0000000000000000000000000000000000000000..e1841e408c58b2996747047c5f864c3e171b678b GIT binary patch literal 4477 zcmX|FXIN8Nw7oYs1u#IAmPknu1O!xy0t%P}#R4dxsIew=22cHq+s zyKU>Hoto9@zoCWJ%zF{?Y|VmXLg zOIo{jBlpidPCy@9#I9*jPlrp@J+~47`2d%1Z|TI%-ol?75KX{r811TpyOiAGW1;W5 zY796#i5!``n>XnJgv3$xBjSGZ6}mV%?pCR*whb>N@Gxd(SbZ2~C(iunSKcLVFhknQ zH{GzkCY4Ina@FZloXLfZynAb!RtvmO5I00T{3RWm`AKHSa{Mg9rO4JF8iYO2y7lX~ zQJ$5%Ne1rH8cseF&yVRh9k8_IRi&q67t}C2dGynh^itx6c$B?rYn|;Wxjbv1T7Af> zvuTKN>w1eAX&4TnUn{z52zut^&P3hu+jS!LSwXcd>nF$o!WttJc?CO$$u`&8UJy43 zX&cVG6hCWg6Aw?k6svxkXG~rX#MC zzN$d4sp}S<&~W2Vm$cEbXx!JqP@&t}$nMb4X@{t=3FLA*DazL!B5{PLNW19d+~V@o zy6OH02X_<_T@xYQ;c~Zg)R+-JblrJFbZ5^k!a+`TcUV+eBF?xv{&|;V`=7RtQ7B&) zV&mcS*)9D$c9jk~bk~b`JnYVq5$rM)3OlfA6aGqbGv1L??ZgPxu46=ehhj@1U)-H_ znjjWu?wp&m;u8oLD(YDs!)R*!H**|#?Y+Q(1aea8Igaz6g>g))~k@YHDGLysmF zW9uiCbnM5a2MNiYXXJMbD!xtGT+eN6tQW!RPuA_v2EPE=ou*~G&c+g!U^ z)>Y&Bgv{)zAnO9QUMuxWV*uQ>Zb^7|gj4KueY=${e zu1Uw7g?1~PmG!4DP!0KMz8vn{*x<&M-(c9c(AB9Dv{xaR3Ni=q+2+IEN3-9}A-ta( z@kcKf3=#hPi-2$MAgDn(EJ_21M8pkFO4NRP#X>&!vV?myfpfj92n*1jm6K0c9n zY_Q$nOjy`=O5iHP;bEq5Z%D*R#e`84kug&o7!Vme12plXw!IUtvBAzh#pV1_*EwZ^{~Js3$8(-9g_5*U z_6;-|KC`rxz=F)-W6~(J=e~Vtj2X!o*ZoXA(Jd1T5KSAoe8$ys2F=SIQMi_Dx_I|yTCW!ueKEBL;g#L~r4 z>?~x8v98;v)6-e*9Lr0meyxF|nc7$pw;)2cpl>HPd5S}qY2U;y5eKL+G1H3e7x6cT zM+oZV#I1;3)6Eh#toD}vF!cyz`fr_5{*p%D$9X=w%1^f!RkyqMKl5AS7VRh_$fb<6>lS$@aNW_op(u*EYlJqQO`wL+x) zvPwLs%o*G``SVUBR-#9Y3JTg2<$(@4AyF(4+chM4fe~)N1dVeGYrH~b`tAJ3gM-)r zajyb%6Mx%{PAR|`545`>o{L6X4Yf&OI3pJRL`gFqpYPHX`%kdw zw=~}6%MBmG!Vc{xv;9tapMF6?wVS}4<%=^em^{pB8r2TU;f{Nny1Ue4_Sb4L$A4pd z25pw3JsBM;B+bzUcyp&fM1~xMA>cX-D-tD5AQy2hB3V-$E^%BYHCgRaDLOvcql4xp zZ_(%qBIHpaxKrmT>amJQ0Yc;aI9jaTAQL;z5!+t|d0S!~KdTWAMmCHaQ^a8~ zsDX0Jh+7S$4!7w!A&5ZFy zkV99pc$Pgl|AW2=PYA41EJ*M{?<{MFsN2Sg|Em^%twhde7U$$V;MR^KtLUOlA30ai zWZ{{auI5Z`U#H%ZMKRlt;R?0!>7?XUkoPnSpXVsPGKaxK*H|p9qc{R;@9+I9PS8*z zZdVcUv@irhVBM5B`r;hfA69uLD+kC$P5PV?UAtlGi0;jmNE}7BG?@_?vqk7*t4VhdT}avMCi08AZz{VW4Jz;TZL`n6Gvooyw@$6hLc(ec$v zOquE{rR#8gYU$vFO2Hmgt4>dNSr1bS$hyr56wAVod`OGr)A5_oHa{y%HJ6#ye_X99 zWuo>sYBy_=s%(SY z-rFZ#kUTPA!|AV;te932H_Ph|20-NS^>nueQK|~N+R%7|3K;f33C4xlFmhBVqw)_Q ziumH!cQeYfck9{1sPU-*F>NPMwsVa8`@82`3Rx@F(y_N$BDV8uuYc441z7yfD&u+P zjiRCl#YNr7ry72(HaL$`ZLg2 zW`1nZiyE~O$4<8F)l>{|92doqt91FRS)i+fL+vVx-;gk3PJd^js}fpnPKv^mNlEwV z+-+Lc3mUPxK$-9|6umH+Y5fn^IgsbFcI{zCVAx$JDC4Q8)9gBq@8oF)8GI{HppKxO zd?wRHBq_znun5)PuK?0kTpS5$l# z7t!rzB{dnQ!rmd&dla2h5ZzcpEf*X)WL%5k910QQt@f|ZCg2@vE>#QPzec3`$l$;B zej@VAMKx;0iPg^4fELLn%&g{*OO^9G4{S9M@MT(#JO4h; z#50#$Tc`8+HmC0hachG#CKeekpd2tgKe~63S~dAa=ljX6U|dInh;1$C=FY>qh0Rb&tf~f99^Q2wmie|KSy#b zWZSO{QRQ3{{!bKV`xqHkFCNLgCFaWzj=z7W3{hQN8bK^}*T?emGtwZuLPL*SYdLa(?R6>JM^3>k6KU$jdK$y@!VbLO;)J{rv_#^2vRQ=|2L*}2+r|AjXn-|FJ@1;u+8 zdx#Uex+o7bkh8YG$P8gFbP`O4U?o|JA^n&lVWtCx420HCp=m|2l(yI|O#aIfFN%0X=*UhTK38hC^Yi4h)4cBO%*xgwSl z_YZ6Oa+)X9bY%Qt_g;;FPXofo`tN|HM**gnX>kE2%d2*~l@?Q(%D`5t)T*AJ3z9C- zoNe}j@F-C=)-{k_UM^Cr7H%2P4E!rHczZd^KjM!7n$^tIfG*spJJ16q4 z1@ocGfdbqXtQ&37XDn4`Z9wMR4)5byb}owVszIcD?t*{K#Z5jras6l-tT&lonc>#1 zCMxHTxC)Ja>GG|w1JbO_l}_Pg=oDg2EHxw1c?4WaRy- zq@-XGx2+M)uk=X7>%|T@LH%$GH~6$%GC;mKP`~cDwBMc9TJ!uh0X+RxydXKiRw@=Q zeCxQlLZnt3{ezw#{meZTMRRf63YiF(A=jy=xDa-WC@r;t&mFW2l5Jqdo&`yq?u&0o z`fa~%)CLp{4bLX0$xEK;jB6VU21S=jL)e0*T&$S3{$)!`qIy6?SA4EtcS8Qkq~1Jn zc1N)lCR=2_$p1-0PR^CAJe{U3j2W4(V-odJhfZt~0k zn99S99JA~X$tG*ubdo$Z1TxXhnGwcwN_N&DOfJ-5x(!Z=i-2?ISf~`AdB{64EB9O1 z=e@T&56YG0wR#?P{KTl}g_O{!YJu&lRbh2E+JJz=STiwA205nc0p{!p>DUDWSkhkr-ElOsN#~`Xn(#UJ- zc1xvedVEV#j>bE$N}9@zxs{}c5iwpfzp3B%kG>DxntR;qL(eHEqs>V;@y#O7ccl^0xTs}QGiEeJUfc! z6Biy66&MvBnVQ%hzflnSwI zY%YX1W*6p=R)6HIwCnmVc-k&>QR>XQjj!S%-fH3I6TtVo;J8zg2~L+$AQ{EseR9EE zYwr1SQqXc*#HCiDu3jfiI@*F=sOrG5j&4jw6p*<(G4dIGw1Ja3WLHT}cR$i8`}`=C zSK7LTK2VpCEqy)a&f(s;0~pY-suT}jJ-j+C(2WKLxq&0Aofa57IAA(QzR7ASm zjI$Jri2>*=c@^lNM_i|HyuaysZXP90gx-z-7xA5G3Vi)-%oP_}#>Y)yDK zl*r>KDSLpplZ3+v$^M5K_5^ns^Akk79zoXc6ux}cgV9#y^9ek9+c=VQLqsq=nv-2DK`%j_y<>ldnjS+f- zocWzPlUYROryZU;pvsObrky-r?@n(GC~w3t%M3mt+qG>gBZs>eLUPkVUj5btdS=~q zTUMT^+D824{o_WTV~dvoL0aG1+=ZJTsxGypZFpupr;*jFE4Zzo$Nt0ddpFj=vF27J z;IF0^^dtf}FTah!n#uJ!ylb|Z(PL`$Cx}OYHYmGeFsxyyBb}q{#vtEf=9;$s6jW~1 z`;3a(e;b={h9VFTB<4aZaC;kpWsv;#nh^t_an(~X-MvhdpQWC;Cx!@S3g8R)%yp(k zy9C^QWhEt)uas!S%Hfyo$uuV|s}j_6=`vE}Exf%S{B99*_qfJLo-&L>XLVTHTm6>j z2t+;N&YFjxS?&brGHlfLzl^rn1f?(3!;s+yYlGHI&(n*@R}bBdi>SSGz%ujp)s>kK z&lWRSgG&P{s>)6BO2ExVQm*x`dk{je|L;hnMlzAkU?o@X;XNM82VY z*7Y4?W@xW)k5+_cR1i z8(q*c;K)8$i|r7o$mkvMzCKwP{L?09cX>l>^%a}0z=YA`OkKOPS9Ob;yoN{dkr6mULIO;&sO38n7SMt9E8nH6x(>+Vv=AUtc8i zP-3`zZpN|Jz;g-!ZyU^l$<;1&-Xyxbf2PAXA=Ux+U5W45hbuL%;V9TC3&RxgGm;%8 z9UUbij0A83u)4#w7v^?d2XI-|8Y>*|YZAXDI?m5cqEeEm>s#eD{@ zZb~}vY=w2NegL;!I<_zeufxtwzqo%0yEJhqVeg-oW`;EF4xu|Y&Wu@_yF~CZ9J!q|f`W z!yJz;O}?>kbJic<$>|H|-r2cI+(0lptA7RKpRymh=6-eP$LXrENA6K|P8eG*C`qfa zam`acM7=w|*DSZ?XxhBmRiv4M_f})~9d=JO;_Hh#hfSUC?Y-f7kL5HT~B%UH8ruI@=GJ_mAa&GUu`qny?Lsr3S0|D0}Gb2ezE_ISQ@g z4Lwy0`l8Hif~_jK`Mqm?Bd3?WX~cf9=)ue^y0G?^Hkt5Vp45#l&h(tp5~aMyU%Fx! zUqMexojxahe0CZhT%R6+3>&Z!XjG{+3DmZaYZclkGbY^3T|RPWpAITAN|WM6KeLuP z)Dkaj>8W``SI@oTNYC@NpRYeqiV|4mij;8^a$N&viU5Y0uD%^`Wk6-5d}er!_{E1B z${WXua3m5mo>P#-pYn~&Qh}*U3Y}!`e-R3sbkoY*`+-`K8Y^1hmHme+tu*zXB-{wA!9TwFGRdqRb9_p0OARYIs^9{#sm zO5wj`gHlG0qW<9G&*4n&fy9K2$4X~x{u@}>^!NYpicy41sb9nDyJc@dkv@JB;{+oU zzzC!GkP2XBZatVLe3VJtNVnp9v~^cVTdlp@9=U?Pt@L?PA*nHm7NAt(;iIW*q4t4L z9u>n7{P1aIfGQIYl21uVtNmq3jM0*uu!hW6p0otL(p@;bdWc23#>M`Jho=gq&HoTF zU4w80nj$dF!0Hh4o1Thx3`&A~qXtpdrN54&<^Rb`g;z@X~hEU?*fm8Ck1+<#`YI-%9b%@Q$Jld=?A# z+oT-ZQww$HhMsFt@wLBWASeIzHDRqXeF~ zPwm?pIl_IjcKpU!)1W1Z4txE|Td+loH9Gs^$t+c`X!-PlvS)JIJ}sQbvT5oPV>+GM zhaRRy$>pTbMcr!04J`Lw~>--o9v>YH6#+$_23AZ_3RmW zJ#Hy!fAK_Ol6^hV$+`kOJ$lH3`BaMN;#%5>NJTANut@ke4FAtf4b5-s;m0(pdL6ADb9pxApIE0qC=1EPps?sB)nFa>Y zL%65+2Oq|`%xMoaK-zJWToXrX{*Q9FMw}IzB3VsMCde`GJEAoabh;xVhiq1bEq&P~ zo0u?yRv}5JCS~lQQl~T0Yh^ZK5_6Y&(06ddqCR$1bX4{-AH-h6_ml9Iv6=++IcX$F z<@EQ_2Lw*Xr55y$^D*K0b$fC>)CE)V_|x4j)6~W*zzDQ?uW!>RP6fMB)bt{1OZ&}4 zU^%rA!R|{+zRB+G4J2BW7{N6?OJn4-!*1X-5rS4w)N|yV0^FTeI}FsOpwd;n0B$;;LdVEVth5wGPBl>KHpFM*r3ghj8Zht%zJF*0cV8>KW<6tsJ;8PJN9|(fl0zhPZRinCvl+ zNebUdBZi1~YD|G=^Cw7^lsAfnxg~<+M`T*&K3M+41Fuxz)#iiHVKznNrFYBec}#EM zc0emVWtK1f^5-0^Le_r_kptdj@<>{zP_tNzb>J5Ir*7Zhvyk6N_8teSQq~YGTACR2Z?8F01a`^VM* zUIf+MF;vZBDKiB)?XTB+^}EE^B=+a@Pn2Szbi6fHS3zB_N6IE-EBjG>LVp~ zSb_Hb*RFWpR2-r&edeCikV`ChpA-JCsd=me=HZO;f23AciOTI8>`ImmOYA|r= vJ8S&oC!o?2QWu(yslZ_TO%=cYS3y9>i0#>UfvKVTZvcEYZt?ot6Uq2L4ZoMS literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_FTP.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_FTP.png new file mode 100644 index 0000000000000000000000000000000000000000..5ed1f077b0fc4ae44332f84b4e1f618ec1e256d5 GIT binary patch literal 5699 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_FileSaveAs.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_FileSaveAs.png new file mode 100644 index 0000000000000000000000000000000000000000..2be6df257abeeb2a731f74d496f641b71a94bc3e GIT binary patch literal 3846 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_File_Locked.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_File_Locked.png new file mode 100644 index 0000000000000000000000000000000000000000..9a0e37e931ddc4e07e61163aa8ae3cf9331c8fd7 GIT binary patch literal 2761 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 Mj=kF-_|eb(9}?dAKL7v# literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Folder_Blue_Open.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Folder_Blue_Open.png new file mode 100644 index 0000000000000000000000000000000000000000..f7314b3494168b156959a0fe7f27f124b9f63cb8 GIT binary patch literal 3806 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 sM)5HVxY5rT371t;N0HC~W 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 xQSrvC0Y+qLSw(s3 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Folder_Txt.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Folder_Txt.png new file mode 100644 index 0000000000000000000000000000000000000000..e02294a8db43ef87d9d55ba8cf48d2e657c5e710 GIT binary patch literal 5527 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%0D-2&^LS(iIdqIdwwGLbs<$WP{4h)V9P%+68d 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Help.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Help.png new file mode 100644 index 0000000000000000000000000000000000000000..915f9fd6d45a4345e94f3c9ab3fc4f7932bb23bd GIT binary patch literal 4662 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_History_Clear.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_History_Clear.png new file mode 100644 index 0000000000000000000000000000000000000000..c475c95a18d59a2956c8df454d2212932e43e718 GIT binary patch literal 6408 zcmW-mdpy(a|HnVuXEuiqTPUC9vWA9cAETffvZkcDQ<;Y>EEF|u_$MlVl58fKk4TeS@9vHPL9e5B{3zY@9 z?fkRWW5<<;plD1L&xN3=pyvwer z!$vDD8{V*ljjhZZ<_*kZs|F$IO^dj(woVM~$M4fZE4eFX^xzvD?)BLp-|zwtoA2cO z%2}RN{w)=1^^U>ql-mQ7&Fh8l?u!XZ*PRf6A*dMvQMK4(?mBJGTAzn5q>LA;L*_$U zpy-NWs93ypQs-DJXPf9QRL$WVXp+@4hB`V(KZIc{-16BOJSb@ottLMBrWA`pW=sW6 z{oZ_osB64S&sB~o%o8PQQ2>dXI0dY-ya&fFtn=8{+rJ0D&sRjz#o1lVmD;xr`_NxS zvuE<8lDrZq^;9*B9WlBN$(8#t{o@0!_*8T2!$g$Cra#n%yGi6kmoc)c>LaoU-24)? zK6lB0XqQbF((H96Px|$?jgniK12$VPrEjmc=tXe>lX{RsZ=rg1=2ZGeXA)~2GT^ev z4%iW8I5jxI5#;q3QYvC(7kE9R=dhu!3Up-Bn))6tbLUQ5KIpX)~g;=A3E9-^0 zH{BBe9az#(mvRm2;*{v>^}M^^fH08{OM}=`@jPjZJyuYz=R^K#ADPa`pIFP!uEg*w zE?DxpfCZ>SMS9SW)NnWpNkLQsmngI67hZ>uLrSnmsZ>&;=VS%a&i8K6_SA1d9n={| ze#&(_{)@ZoK|Ink|6&alKAuc@>_!V^kIa=9KnBfw=?TMiKeuoJKUSKS#7a_k>-AVq zD{F_E(WT2fcVUko@)cMV!EhmMwm$6G$4J5UR}ti`G7V~+fJjLM(=mEB4da&L<|gPv zBedH)1j@GdVaevE*79?6%{n|%#FLn-{{74#!ZN8ZLcYRu&yd%MqNXAQ`q@=fL_?J# z@BhKbDfmDXLAK)k+Y=*{J7;+w)Q4J)LhvyeXSXno0}_!>saVM@3fm&UNVd@ zd?Lv+ey->EbDZjchkC zQ2?s0nY09bcPk->=#_7&w^aK0#D5R{nbQ6s_INH&+Wfm5N;&s{qI+vC1%_W!5|f*d zkZ&)Nc*)7>3=a?eBdfW|u6LXmxt?BLiHrjWE-_qO2+QXPc%C2FJJ^(MjTHM-3sz7l zS8Ce4_zX9GfwaE#FX-P^4vXM^l_`@n)OMd*`!Z~#K3LK2M%#o=ezbu;6XP6VO$W%- zM68qg30N^va`93;x$;KGMc!Xq;-qTG`ZuGMuSl{#SSQyPcKotigf>*Oc=AoF7?(m+ zQ&U5*o8Tpls`$i<7Xg1YFGEm+l7=I}SMy^Pa1`KH(SUL~q4_Xs(NDPyTS6z81^IAVA+7f;s_0-~+0<2@ zv?jA1Lc2XcdRcd$kr;VZP(ad$fp4-fyej0{YWtIOwvNTAQf$GZYDG5c?(uOptSVEMAAhV3N@5(~KTVFp~cGLCyZTg5bkahY)|%4K;1 z8*6ge=#T2gj&tJ1-_{>)rnpaVPjDl*?kdQZ%BF)MYo!KN-q-8b)~@TvUXX8=r2iFq ziMQjpV_PMS{u`@GGIt?r)Kx1FgQa`C%8VrCoM9-G_wuJi;tBi3$lzOCGs2zy3|lVo zr70=FiL%DBXNv>YS_dXdBY{m+(_^eVK`Typaibj>j)HvM0|K`oYf44*LY~xIbYoiM zoj=nb_i0zPVw?D@CV@`JbKh?^6@7Sp@S}EM#-|L>qTt{5E<`of_Vw7nAX%Ve@rGIv zGp}_dT!gyk>D5qc0RAC7${Fcl(q_#QXl~jTLy7_)syjPKrYX zSX{H|7BLn~&wik-C%IDj%vrIZh%(C2dw{|as9-jJ)$GbY$zjj!wtFE*VkEU=lYgjK z`x*;Ky2Kp%Yu;)e31iL4u0JMPOIr`^jlXT-ceuQ-ighI z_!s}9NSbi1@Z}@8WgaG5AZ;Ru7f9j@GkBgVx#vxR-&Fp zVlWu^@#DueI|gk;hnggcRNvOBAgJr*QrPx6Of0L44JeD5OR^OGU7<_jau3|dHkY*0 zrn0K+b{EB)!A6b>iEygl(J3v@7PPmpaQN@`Z8Las>Lc%@!8T@ygFjm#*O5F5DycD& z_Vlp2rP6;obc6wzHQtP=`XU;KYxaRA`d7w21poeaz9sBu9t@g_9<-$e_}M-hUG_yu zQ(i`62s+62;D=$Qr7poPWCzs7cU3X6Mj=U-z)MKgx!Z@?ki_A49z19c9XfP{-r4|8 z)L96AwHHxBzC`3mdtXmLT~#rX(MDrh*iPQX_r|m;$u7H`%5J~qu+H-E5QtV(6~G3Y zQw@IHfVR};3nMD9bf6Sab4D$(!m^luD~-JNFT~DXV|Zs~@~-3(UlP);D|t02bwl@w znpdxKYs7TE@2krpJBB}C zs&t~i3-T=aj(SR;f@QpsJ2bl6#QnoHVgEkQl?F3V{KRWm3IACUToog49$V5;te70s zmn7hQ;3|$%tGP_cBg!=RLLq5=H+Oc4S5jqESdp~l1ra*oCL>zKP=Jk-FpP<(@0d>2 zr31VeUg+C$WWT5+!CBEHWmDhZ`8aF^iIvT{-@IT~erOYVjTnBfL zHW3>cxdVIX&}z}Yj6FK;?Rh#K)$G&rD9PJfY;0!vGk7RRK|Xtu(>k^-3Jq%D@ppQ) z7qL@_%bD%4?d088W&S~(=NfisI-HqCBro+7q$k-?Q8=u#bL6dNftuH$PBYg!Qc9`L@UvGgnNwxpfHnw#(NI)(b5kF zXceR(vdA$eKsNEy{wr7=yAUT(a4y_V5()t)`W-z<#&HeegX}DXJptx@xh{51$BU{^ zpKkpTr~EEGzf{t4w-WksIhb3Z@7jFIWGz(^#eDdDZ(0*U^Rdq+ldHVzw-*Vmeh*ep znCI2n?8_dTTZt55k;UX{1B;6|in&&?`dMS-Ia!XIt3!1p9Qc^U`}A0-rD`g2P=F80 z=)_$2M?6ihYw+;r29ilF?sP@G3Mf)f(4ACMgVaa6sPZGvF8kUe2lILBtwqinqe38f z+9tJ#lHb(GOjKFpdG?Gyv!Nw^;Nu4-(`6@1gqt>tHKa9+DU4p7;{xc7TfDqE^K;p} zfVAp)zFM)kN#jHl z0<1N37x*&)^W&ap^aX?m->QMdRO4li{GNYCBiiOFC}X9MkT4f@qyn|~9 z^Now(D)`4MmLSKqC7#S}0cgA7w^vM|Msc&oCm z4EDe3e&GvBT3da%AwJlNd!ED$-^;kbgK3f#nr2w$pjaIClOlQfmnUo`Pvf8obg`dc zO4{$nffYb9)lth4>w1VR2rBVLPt^G^8I5So56V@r=kYpGxS1qd#{#zPYYjqFvIZ?` zCBz)=;-dnnZ%Xs0-#kj+Bud!lLDc0L%|#9nB<7x;SV2)WY9!J4ce&9J2TD2o5nK?VN;B)a#1(2S0gCM~(&1#h6tNDfI zHlmRh?7I2f?r-$1>yrACzLgWJ9vpr-X6zLZj!K6#kh`j1I>|>={u!sWKOn2}1;6R9 zaUZzoj}5}Z`W^dGk-K|;AH_c1l??~*{!V*XO0F9hLwL(Qq?>-Ev4JI^Bx@by>1Gg+ zGv{>4w^O-WKx>X(q-)iV{L6CjSi*|@g6utBo$kwX)N+WiG|o$*)p$0;JqMSc#4rqV zq0HfCfa2{cSn*?dOf5#x_2dZ@Ek0!qi9r28ZEtT#uf5n;cIKx#U$xCrWI2L-#bt$>kv6r}5WtZV7pLY(t> z$?sDFWAVHAt`EAVr%S`nP+cOUs7F3OPT~#r?ZGnKzoR!1mg$h(08q784Qpzeh+`NM z+#C2;f9+z9s^_>_{E z3#3v+CqAXI%4RZn(!LfPv`FxNIgT+D(ep6F{0#b1O&C1Wz!CoB*xM7U4jrb9+1YkC z5}|zY%0P|X-tFAi14f8HSk8vTSVA2rlmlxD=!1rFjF2>Vm4N;l3;)q`GY;}v;afBI z+;6G7hP|Z8K9pYQjXgV0Tg>kW#~$AG8oBO(NqK0Oa?P>4os_UKggPcVjSTxd(_A$L zJDl?O^TS%@igy@)Xahguz8!^%Zry^}S3Sf|cV)mT^IN>zEwh`WU1^MMCKNf z#x)lXU~G^}!3Pdf@;TE`PAk`}adtxd&(G~HiKabxV;JU6iQDyBiCU zLHi5`IkHJ%u-{}4?!~NG!^r;&vouVBmEU zAJ?~`;Z7YVLJRxm=oeya{-%~O8~apVdP26;7^!3O14Y}6!&j)>v;U6DL+hz)5GQ#n ztkK15#jk&U-;8D28+bkS@dYBRNFmJ4z#oh~@(IIx{aeA;he9(7;OSv`{aD}hm-gkWhz%EeN_{JW0Bu0~Ntrtn`KWMgAXByYP(SVN}v-n8rl-J3#( z#eJ;0iS}1H(#Q7$_Df5-6Xqg)%VyH}+(yYEVL_DlfPA58MY~wsT$RovdYwm+|6dv1 zmN)>l&v;4ReJvBC^%d{X5JkHfdZ-=^l^Dmc%GgpOe@T}Gw($NhqBky{I(GcTV!biv zmH1Qx^P&rFeOR!f9y`t(2Zr~c=81SCN`B&Hzcv-~&6_qH*t#0rIf_8x>sQgZJ6F2j zR{76{4zDs_Wl|%Y95s{71kHahRYn$;OfJZ_&yHFUd%5uc@7$-M zon$|Mu7y0`y@&V13i7IOiaUFjNg=ku?kE>fr{P4UwjN$Z=^{Z(t_wyyvJy%{p;yko=+m_rpeyDH=|i%G>oXug4VG(@?v8~SINHq@m!LoV)| z&tmM1%asmyeiNHF>I+1oRbvA+K4Fe@Ha9aN*;jeP8OrYQhlhFb+=?pH4VLpOIzAsf zKfD=vo^;{jzO#5Pf|$oSo55zz&OfajqFD1IO67?7;gAL$VE6%NV!KtqwN3Fw#tQ7W zY9;@Yb4E5p9o7-dU4X*(MML`S-%)+fanSeg8^wwe3VQ&Ij5F$}@{`HCQIhhx!`LY1 zPjfZ(NcWbDMt|I+QC=oTDWw5y&0)3h&Cy~K=D&fq&43^1zlG3YtE)put5i(hT`DSn zv8eMzQ2@p1jNU*Jl}1xMDUazd7w0Xi*b8V&==}1pP}aeRP)M;h^ej}tDvKT@B46bG z-97#)S?kk&^cjoFDszikgyw5%N#KwM_u|gpTj*U%`dnjA0)$`S6D_k!Sl!dAEZgWI zOTIW=AKLO&uKH>*7F%>~h!y-ep>TN0!c7LCRiEKV&TAWV%41_@`@`mkJWIcX<`Na* zBB~2IJ>y9{fnWGQS2B-R!j}!szX==p94sh5*F~*}ozIkhnNNj$JgxkYv!?;K_xxS@ z0eCv~_wB!Ih^G#9Qgf`2z8p(RO7qW8Sqg8DM zDNuV!j9=O584Iwf^%*qmsYOk^cbsH^p9bp2Z9N7c5kw6K7)Gvt7V~5ppaEm&QBed99X!kPgSLdTsi*308_sT?5HC|sr z&6D+UEvmJ18ZAWVjyQ}K;#n`@9 z*n=MCa!?;d;#-po`jSeGf8hxA;}m3liJxs)UV?N$+6uLv;;1~muW$tGW&5W&#&&BS zv7eq{hVoL#p**uuQF%+i1~w@l4(%$XJuL9NkhCM|80MH}J=45z zDtGWV^a{QJU3l_`FRRW#KG#zcaH~X9lW^a8)~;^5(6^+A~yKEG9^#oXjLQL zvj6qaiItCZ&8ks#lDO>F-X@lIE(Imi|7b;8I~Qkmej3H`zV8d*87;p^6E4$a^ec%W zE;bPnp5KGtrtbj3l`-OjbP|bY)b*&8J#@+4azP*!)ulswY1(?4u-;W!@f$LYB$>#W z@uY0mHsZw1FWd~?D6O}ps!s(l02?KuzwlMq=Ze$=glk#x3+^z2JUo4~;UY!N=5IlzhLRZ!wpYVX+bWsizB(hYmJc$mr&|aW_TX1 zAvFPcWd`KglnfHxQ^6oVg!t+tRPoMrN+0Jbu#L zdFay^S)86bLCeZWSFe#>zP}Z#i8%mX(=u*4GY+6J6v9JSo^f>H*;8)amfq~%vV?>N z^)y+wlhxwsNo#h{kTI}<%aL<_ZE4ZOQP84O3zrSq!h*h{I6kSbmPop^=M1TILV<@= zRXRHk^Jz(WBfpNjebz zjGd95wy4h*4k<(kfablpfm<(f#R7Wi00-8;mU^ufwZN6Br&)!@O&Yoe#Y_yH4FNK@|2SDrCIe+m0I1G z6y@Q?0BVj&Ip;h)mjo5(TrwLtew7TN{EJJ3d8F8v)TN=0MC*>r)$a~>m+-OIy9Foz zg|Tss{?_2JdFM`2d$%y(h<-v{COU!lmMP1mY3)fY)U1?He4k+`jQ!e;YiOSFjt$-} zL8(--wPtDUuiYtnLF=+rt4Q$W3^~2miO%pR>D@{ zdQT7SmU4QqVLn6W_ha3BJFxu5-OjBj0C9X=Naq)tn`M#)1pg{MS=;p^&h4~SN1F2^ zj+DY!LTCZjo?$y6*w65CUcGEUfg6Sr2C_%!C|{A&3WvbpY4mgHop%~~FhINOX-Km9 z$dyOEjMt`35hI^&D=s^I>Qn;{GSnE1`lF?M7!sb$3M3F-(tqr~`3Ow4hfG9^#u*a4 z}&M{W?QINl591T+{#+)d6@;UX6f>o3lmtdKted zSqU5#da~zU!}Q_-U0a8=tIMTT=6cg+F^=!;Q{PDIVm$g^SlCHjE1945+i8q=UpAI1gX+V4PKf z3;MhD;F5L6ag7K+)$FT-VD0!~7rG&cLwEw8_+jxX&ZVoIORIIma!uSE+_RUj*Uo>@ z?~~TfSjF-rRU6YQsA zJ$(Jdn_tQVL(Y&}ScBPXvgzn+`OHoveS6gGiMuN`?-X3JQMX#(?1lCXcf zL8+AWkT;{gXstqCz{KKHz!@0l5+eNozdum}k2)=Q0WTUK<>RNCq#vGWFEDol!LR{& z1~N~HMZVs-bg8u98OHnMxpO*quUYaI{X*=2Jb~#w{0v>Cf-G^da3$<`zV?m?f`eLP zkq*LtW`*{!hTLpRG0dz+k)5qX=dUmTJdmK}Cju{$*iTz_0gAESu zPGm6_EIV`G3M7-U8bNUx;Ww*$UEc{1qpw{-fbMN!@$G$P>i^eSuozLAk@9t$3 z+0QSDMP~7P@X1y;=3%<{o5fTdLj;j4OKrZwUjF|4PHfZgjYi%yD5B~kz(bHQ*JE*D zH!k_VaXAh!+GZMt82;qws*%xG~o*T*qB8#angm>0V<&uP@# z#0)eDl3q38*U7Q)A{Pr9vQYYF2MR;!grv&f%ZSj!;f!=R6TCTjQ20C5v+o~Cltl^j zm(a-aT$2c*%=>sJe&1*%%J*3v>o`;f;Z2$|LcoYm)I9OVuuuwZK5Hy;{c6!q^!mzE{FNFkL(dT3w!%o7=xa+G$a5N zfuu0h0PAN4WgG5x_4n^hj57SRctA^gAiVbug0}AWrcu*w!jGv5Z4t?xmkDRx7`YGi zX5+79r@F`i82&Mt^pIw~|IgM9KXP_$Y5t|6&?LQ8Y zj`LCZ^+xHF;rzDZa=@Iv%7uooPMo*0;07+o+9n7R_ZANhOTDHs0|^haPdhCSD39k= z;Zchu+aX-vZO~ebn0nC`L2^V`;UcFj#@(eJw1z!mlu7B{D%9@7B$EAS4(UPX{4>@c zmT88cSYZ_#JEf|Lb+sk*Wqsn2$p471bFKK(P+HRI{{nOP0?yVG>qjW=`W6<=!5 zQpZ9nN`%4BOe0SdHc4zdbCUZFz{dI25`}TfmU_1_Nv_a!;zu=QPAlG_MHiP)BWQQ2 z26O9EPW4!3HYa91tLQhY!B;sTvVqvT=Rb>2Gloa%D@AIYf5J<5@x#$LY+E-JKai<% zke$1(Ay)cv%}dX?VO0;-wX<2Mg0dN$sPy?kP|pe!W19F_@!#@yLIqCZFYEj@`d2up z@9pQ56zq+Zq3XqUA5wyKJ)MGjN0XgIIB_ZMl9wD#ZlJ+QE)9%C>FKgY{Uz-G;_9feD2GjcDlbvR2FW6{TNHEaLh$2Yz`QryR zD9I>W3CJ;TU70mHO)rhNjy9RS20vij)}ZT9!EIKcV;460pC|1q^7xt~6sPXlD&|m* z@G&@U`NxYm;zX+cY4zo<*6NSRVAp49w0a7Z!OGW^5Y#iGO;)+s#>>9P@{1M@3f=M_ zPgEI#b0t$a3HR911*l#$ktSOy_KWS%Yi$Mhii4XpG6qp%FEEqu8U6s3FBg2H2hbUcUDMtjy!mAYv%~SV*>%Kc6 zh7bA>p?nPT7s;g1uFWpE?j+#px=E6xC71uhuRxbZH4&l1aa_EzA9y*WA@P0&TFd!J zhXocD{EYLLO%n0~<-XZik^R2?ZW+1J7-a?m=sC!;?nYvOge3iT8>}0MZN1ZR=DPyB zRwA+65q<24Evn2+!r92TEw2>RT%V~Feur;Q+9;FGTeb5a<_Nn8132x5(?Z4k9&r7m zCTUJ67)y{e>y-`r*(T1833WkLpG8OBFqQ%Kwb+Kiy1dsAJmam=qgf+rBc0==v8~H6 z{{eme@H}=b8BRhb4%}iuIM(5J%X)8iqh^v&Og7nH#RFY|}PCpc`KUP*q@l(~ztMm21Yt&W~Ls8|6;?y*V~O{@8P z#e7dX0<~lyXZ||yO%hu>`{niIFFk~}-Cgeei9pX1HrdAn<}61o+Tm~Q6UNd3zWSAG z^^cC(I$ayKytZY>Y4Wnru^IBVf2>1J!Ei`O=+C!r-yUNIu3%(h4;xSvK`b#DsBD74 z=~*8NFKnXIsvUQU{ciEjTNN7KtZK8S%)Kg>Z=6>;gCo})R%nxg?v%mAh`Oez=?6V4m z3DFEk4@Uq17_l*t+w9E!4``r0eomarw-Y%td`mb0TyGDe92>Rg?1P(<4t|m?I(R5` ze+Ce~D?2R%j@_G@nXxS+b=UXbbYz4806i@>GJL!EX_^Jc`C1_e5L$x!LID>+#B&lr zSUvndmgHGkVeGvZO;TJW!EIfROJ}HyOiH=yr6YPy5`|geoXBuXC)e2&t!&l);-ptB z)qcD>4S(2D(v4P5a`yTA4(x$NuZNLbth4jHaqQsl?2?rNpccz}KReOnmzpa1JTo%_ z{OmJ#RQj+WJQz47l5Oztau4pqJX?V$TG@-FUEjnXKwcCJ#&BsAdLjSan}NfYMsVpo zz>P|S>!}i(Wv}Y`^%mh5?9iH%x)kK*&a={;><9Ku_u*l(kIgdIh3RzUX`Zh{Avv6B zG+UXGzVr6gLJ3g>MVd>;(wqSs><}Klho%X3duu7JjtJwaf$M4~7Ng z-K)*l56<3!;&BP_@cRpTyonFtUx?ZD<(};NT?bjnE8#BzPdbltiMzi=1V7I@_;g8}xHZM)}VEfq7zUad>jFW5MF3Jq^e#z-!ryH-7*jfb8M} z%BqMgSW_+!mGuh)`B8bo&_7(I>GbDm}m1-C~={mrqV)q7%yJ z0kmUri9l!YgJg7v6(6kJl6mgbLe@D+R8Cvyz>w_e zqUdY?`0M)ZvD?}4;#zCvEb3fDi$538Ny+9+yLXPND*T@gY~+2kK0>&C{KV;)ef9nk zSGIB@+H<35*T#N?7cJ|He!4^^44mYHVlP3jCf>3fN*VM*hDI!o(CAhuDB*dk*gW=e zi$Xv-HWmPdG^~V_gJEe#W4Y!~ z(x)JUu`beKj&o}skp}zew$aKH;qL)=x>TOn=9}4Jm~v*SiMeftVf`oQma8+|hTPdI zz4-(OI@3ES3T`mZ(?+Xa4u&>$V~a<0SXWn<;ja;YWZC-#S+6-cR^swR0jni{s42$C zNpc#FLF&L_?^y7W5Aip3eDOHJUgG9=guZRGK1*80NLsySUJI7{t-InTyh3rgYPq8H zCl77Wl?j$^PcXY`;BL3UWcv#3O4-BqJg8|lP0My)x)dq@$t7_0s6az6+f^~t;UG`# zC~~ceGtS*@u9BbGm{rMwWl1Gh!^$r@dYDwhbclvBpWr;t+>0HsHR!xt`4v@rCp(+< z-9AZ&ft2((&^Ff!UvBTsIlAP6zGXxJ{u13Fh{i?2a(Chn0`j`A1BSAHP483;5Z?m@ zXg%ZBGJ=aBiwDGJ;`-5Xe*KNmybGoBb8r0>zhDc%b!&E@{^Q?4y{ibJwXkzP&7#5n z`Lfy2cH@jZLRiwg#l%#s9-*T26W`0L@NU?@2V6bHPi$ShYHM>=%nCg}ZUq&V2{(I- z{m{M#*K|00Uq}WbeqVYtyv!P^sIGz)YS>r%>~jceOih6N?<^0<<9~ZzUWY04%F8h6 zi8JzhHrAD699RId^*BUbB}rA6n`tXAR+h%We&TR(;qLlaV7VElzcvhX+yGpYoAza^4ilh%oO z$Ev6RkrtiqR5qh*nCs1%TFg{9O>jWhWG6HTTVKSeIdf7W*UxsHfc6jUgftt8(39j} z)5So!+2LAAlhxR5cp0=nTeLNW-EX9@lJQfiCFws9udV18dgkYF@3jecsMLO|8;+au z&tmqI{=ST`BC1k$s;}-2&Tb^E$s?mHNBANXPmz5@7gE)Z>BbM1j}ll5pYj02#1xcbw|_mKSI3>3bW-_ zZ4j8K^0D=%u)G@cGzQztAaJc~vZ`T?w$51xJ!-(4I~@A?87{7*W2CS9q`2*6yQ-!e zoYpZOQTJ79HhV|9*`IMAOXmLRP&~9-NgNI0;DPPj8@vY4&(%p(K$V^HQ#`C2fjG|_ z)5Ox*RoWn@Rp{qip9dJ!Qvnv7aPZ9p4k_hT5?oQLpBj-uD|Kq<*dOuH!6ts(73v>> zYM+JA%LPP$aO8BMHxKA+Xp$c}AoprWVOx>hwg2G(x5iGD?}~0r*U50osL;a4 zMUiQN@^s+tQc5e(P8uJ-Cd|i4_uu+2Wx@Vi z2fDC~vNH+lPWnK7M3G&?jqe_Ee>~@g9h|Y6{n6_wO^TDu;9e4=mN&FZ{TS~y%yp%} zwpPQ-k?b5g^Rp6lEssU95XZX=o@{6$~xF+1@6D)e|f;e zKBi19aGUID*puteQtOXrBpr2l$_F#UqQINg^J5~Q0XA{=EbV@o>(4|F>H-oin)I}k|U9wiFB6zaa}QoK@0m>J8E7HgrBQ7UgK zlQ*T38OFX&r8ku@mQcztwqcf^@4vr4?)#kkzjLn7xvz7bbJ@#dx0=ct6#xL#++1C} zS1jRwM+scH4!F(q^+4>`K#5#V=6QhtqQSPu0nng0_oD#B){+0`MqykCB$5R6 zfgmxuENkboB)1uL0$o%xCTj|4C@#QaJt_$Vee{qOB_7p6>r^6XWQggpn%4|4(RLId zU=HBd-J?V(#IOyrB6(dc&y1gyuP+TPZDgHT-z}UIU0|l!_>=74iBbf=haYjs?-E2a zy1eeUl-y@*65&o*7~IQk=L+Z7^2>`4L{B>46H^;k;!GJrz$VQS7)}offw!*8&e8r0 zxx@FHQz~_@e*x9+k1k4YK@S8UR&eoPDv|#W#}?<9_#-%WE~ij1!SjbQ|0IS~zgV{A zecyX13=xDcGFYS618{+mUgZW)zWoXuQJ54fl23+d+lwzQ)mGuSbfU=?5;01Y7zo2M zAZDuH>PS()j3RX*_exEhun+K zL2Nw8OyKv@F9LYFZ&rMGz?scW8aENpmnm+`81ROvI}*MPhDFX*$@KyU{{E{PM8g2Q zKPG3t4CNp!z0F7y;82?g%A^nYPB|hl3?GUb((@wHfuu`x&0>R@}EaQtM zhZj{fX!OyGBa+Mp@Mow(;Kq%h;TbkvpYZz?De1mq#1!Vv1EnNnNWQ=CNFkjXr`ytp z8A1);tyBN0tN|$Db=FtiDc7g$W&{8J9(Y8#fa+YDGr)f6fFMbd270K{&^u&1No#c!ePNHNNN!`sr%a~VO%)uG@z2*TiJ2&u| z>R_3rIcpDqRQiIF;|gWY$jSdsGrKW8_`|6WYX_&ifL_SwKZ7=KEi?<@kXWS z()>cjaBICyyy6R%SeMv-tJR%bgMHsO8D5f(X!)^t#?*_dD``6jGmCPw1)o1pK}LQu z^o^NQ^!Ynr=*^JKXZGh6bj-Ld2%ilRSF`xk8QulhC*idWldPn-o=^RfnvMI3$A^Mn z>Y-=bvDm}-c$R-1qD!GuE-w&_0_)RcY2%8gJ^+<+d4L8j`YP4)Zn5C28+d_bQkEx1 zXi!XuLb==@v|yQTjX8`pbX-0^Jzsvant4 zIxPjb45}v0Ae~xuMa(NUhX$&I*M+f`mjyNU3D#I(Gh9j@jM#}w_1d#1ay0!M6m zRz81Ul|nC!Y;uYx@t+q{PH6a|k-RVi{$br`NMjHycjYFF*(_GmS1lUNnX07v@p2rqc%c%NlFUCLFse|WPj~2x=s9aXJ>hfm;2o28Y!gz`X>n zP1Z(VshgcKXU3kOg2!JSJ<%S+UrXf_pQqC382tqaVnA9 zYvkOfsNuCnyouXMQ2tZ~p=N1)6Ssc$3N=q|kbG}sH@NLfH?-x0KQ`EfLsUwN?uc~7 zN>D=s6#IWwdJ|uFMCtk7Ge8~u#m!oV+~?oYulHhRgYbNg6n~p8*@5?4(#;O>Wz2X` zYBBu%di20c0c$aB%-a+u;=B6)*x7|h>bIQI@%Fkf8d7~uYR41X#Y4JA=_LD$mR;Nq zi*~&E6E5qXSv%fhON(&1+lcvU%8^(TE50uH^yCm!Oa`=m7w1Dr{YY$zJRuO~#G!lt zTW$~fByVXh}F|EUIS=-JsvE<=5ukGM=b*Y%$mLuB#aA51|t7soZ60bq8W4mqQ!lKmn_pgt zj5?ZnCAWx*9M>cgsoP66>=RH4h)yaC!DFW4e7)RO-XHC@qt3>Bw9(-Esq8%zIqI4f^8oQ1YlZD>rzE-qFx)^Z77bLt$YdRzV>atDq>R6YCY`d!~oO>LNVOpMT9EWkB)=BPB1{l*dQ%*6Cnv?In<$ zad%m@{2k*<<5BOT5Q|rM)oxKPc?bQ!D$0|n>ZJkxNnT6a4M88#HA6uOUyUx1%ZDXm zt)4gu4-R?I$>s4{g}**WvII2xtYxXs22?Mq7ie)bgfFcbKm4WGzcwN)IB-e5jdhh( zi7QjfJ5uO-7+0{}mR_PB5l1H}8@HV1uHW1>`r}QH-&MDxOac9O4pYs4PCHSyD84No zAn)4f(WNK%E!f1p<*{YW5_HU~8=;^P?ZB;rCd=qf%b%WHfDS#22R3P*Iin6oq+3P( z{dbZxF6`}H&7O@*=vhEF`Sxw&_Jt|3J%tDw%>f_WCnKQZDRO9RO^6nXld&c_?~xt* z?7|g+9ebi{IRcH!Woz)Y*Fk+bcRGenB3en6_f}}@yyLg3V(L(r!70}7rxdjRqFT@W zvNCmR9X#FZt5XN}1txk#z{|(>*IYz(l~-1JQ!wvB_@54j4vvmCO(Q245YcufAk|Q;IucKlG6c&%A3$q2AA>3~&jeMgP2OYgP9sWWi`u=vfyZ)@ZqEqn z)vnit94m<+C^*YDuCVUcvLo2Ir#7p3Z_2y=KeRB#HbcB89iRZu@jF_eJFHn%mBvS& zMu=%GxKSi(ylrE-;n=ZB#?z0@(ATefpz5Y<%Juy0Y?tgbwmjLPzM-y5IR5oGnE1d3 zdYsyfJ+MEMBvJ7Qj8%>hoxG`IRWm$<)WOOrr;ow`+y++U=|9(QSYY7sDVhvvmuiDMFMScb7#Z5Y zon3y#H41h0M6Sq;AiCax>L|p0?>&2N3I2QfYaa#u3-Kwn?D3Z594!JS3OPZ>8e4aC zltVf?NBAEuYx*4_QunH4*_y-@(utD8-uZ%#Tr+0Xv=k~)rCCKCerRP|ZWdJS*Nd8z z%K~7;`QV1R0xY!2m&AUIx+1`IV=YpS2lmPbvIV)tWZr0Qm=Td=B~ItiP$zjLKtZDt z?Mu0f3~@Yn?jS6-FqxkJ{Y`)8PF&P))jfW!0`c50%zx@T8s5vZZ<789+JZM%z;yc4ReH z=J>Wd%2A@gD_PhG4I~xe&P3V?on}71^<94QsG@}izI=}JA*{p{XK66$YiOtrAIT5! z^3G9wDDa2Te@90na_f!EuJ1D6vv#W%|2`RKNUm)b8jUY@k694ehW<_X^|CbTyiHk6 zs3HgwrhvEOHg67D6(~sqVUogpI<}v(Lp7Qkw`=$-JtS#1H z)Wn=<>=3x3G|;}MWJ_}>ea#LzecubMCpd2(9YWMUiwI|2uW)%;F$u@e#+3y~wN@|r zmn67`d!}D2qCWhPPJO62J}jqH4eppmvo8pX@&&~jyyN8l&3McT7SY5uC66a8=9g}c zFiRp`CVT(7jrdij;QGCoJbD&;CP`E+MaO zSBIt3*@C8PcB~zP7mMu6WL(Tbjcg3{(P^SpkZIDtr}r7TZlC~b zn*r0ZIpvdk=p<5E7V-^3AHYKqIdo#F5V=iLmNZH&QTuBljgjnJAn1SB&b_sK4kQrf z8Mo&r^`{EHU}-f8T>iq(R!={l^ao`6-@zM9>)CsPqHS$*HQ7h!iR;+TTZ^=NPNhH*l3>Qt3eyj+%-{mWe2e1_|0XQ=SEONz zkuOuv5NqPa;GKutZ3`F=R_P_DE9qs0D!%kO%xF#4E;vRh%vLUlks;cp{*bO^e`u^+ zCJloPkAP-Qk*H~_D7FlpwwayVCe%z}96PstJF~Iw=I2uTSFss3H)a%2A(NiX9UW2Vo9PvN#R)o=i~bm|bAB{;+1d zJx7;KS)qQ0Bkrh~eS}K2u`kij-0}xWU4d}yt80QNcQWtaVGb?){PQRRaOIcoSfaG{ zl?a77}%^-q<;mk2r#SQn8;bU+5+&)Suq5av&Pf4lHA zvcF~<^5N+qmN6M+5Ub@IG@$tS5){l)s3en!&skO1da*M4k^9`O%}XM^h}D0&IAx!6 zZh2#-d?pzQ$DRqXy~%Hj3Xo?y;WU|EtW~D$`>_S&clOiwM}mbDiK2Z>q*=5(bfjIo z5NnLpsrkONYO8mGekf+8sFqOtn1l`A9d8L_EoqD4wcYcYzvh8BY^j0nhbb( z?O77|5qqp8h|Z^uojPP~|9b7cY}Rzl)HbH-DY6e>6=oUt8v3Uhr@**wxA!)|uKn%lZd!lLDtoy_L!=iVF?ZftyCaP%n7wFjdVpd5IH0cu#Y+U5jCW%bt%c z70k$Bg+I9tHT2=Zer_!(#Zs-|7XNOZYH3dv^6R*2OrHa+ch*L=r!FTD8k2NyT0?Sm zBi%VyJUiU=%yJDS%`rGFb{D#=Tc>P(J$v;I8`Q~#Rjh9-IU1r^LmI)GmB^Rol|Jko z9zs72xUfA(4+w=S99u5rkc8IK;Yg0Lm+TvE7J@Z8=Hq#c~SLVs53wP)4|``p{zU# zoKX95u`j8-uiHZs9wh1JD?NU@o!^tpHup|b#?zS+cLxd`0i1MA=q$;8*s`+L1Kf6c KxIA-$ll~90JzRtU literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Import.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Import.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1e2384a4ffeeb91f6f210767951c3daf510f18 GIT binary patch literal 4691 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 S$lO#2Shr@=>YJ{D)c*s|5>~YU literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Info.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Info.png new file mode 100644 index 0000000000000000000000000000000000000000..4fa7e01af9641ece43259f9d87d1bb0ea3e2c319 GIT binary patch literal 3352 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 HkR|*-xn{kA literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Key1.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Key1.png new file mode 100644 index 0000000000000000000000000000000000000000..eade0c6d9e071e067b17b26546ace690b0383481 GIT binary patch literal 2339 zcmbtW`Cn3r7Qb*&G%f=!DWoZ;V`Md6!PE@n;*#1kBeSCHC75FNoLsUrH5M&3vb{`g zN^CW)Tw3Ri1x1UQ2CuX%)6{G=AmC(06<29x3M!>V>;-3G+wWlab~nJVBc^XPlDlu8v=_q!Ri4YLDv_nCHMDyn zL4~S!L^5)Rr5r1iatMQ4VraKO|L450=w*@NvBy?*am#v#FQq`Fl%)w-x*ki_w7n-g z7ai;M;*JpID$jZbypg||-!Z>QIck`rxuSOS8v>nvU+2d%F{3*H{;$5^!Jq}O+rnMD z_8$MZqmAO-dXth7ae;DtO(_M3d+!C;0apb${|V2zD)q=lDCK><7c1w-q2966YUt3m zyNP$w#%)#4rl&e}R7!P67}UhH#m3Af0QNdN)v2aumPl`f>a_&jRrJj3aXF5#@n zFXTjwJAmMP&3}s7R7!`ILb)@OO39ijIf(xzW|_H{Cn7Pifhy{j0Ftjtnp8`1Upu?& zXQi?yveium9jIJ^=pCM#y7Caa8W=D8|zUq*xZyR)z2#6EGnP4pDpXJmtEZl*_J^?svgM zhG}HTyot80YAzq3NqC1l-d%A-F3_xmd??q<{ZK5DvtIhI^RFCP@>@s@j*+@^>EcDIgxpUVVmZQ(wxWPQvgYl^1D?*U0B7A2C~gRb;{-bO=+yVn0^;`yuZ^s!6kl#{|BCsMKC+rBO13*V8y&FH_y{8k!G+V4 zI%mx$VSz%-$+hDrnoIX28ZNe7|#%BYhM#8c9dMZzy&GSZxO~ z;aG#cb(}V5$}a!fkC=kS%kI##&TBr3JJaUT)wYrroCPhOq~AOcAFtJYny;z}MJbYb zVs~yjQ)3f#JF=^+w+y@Bi0CvnTVm;YS7cUlc4diCNRC5EKgDww-EWbF&1_jf_DbCe z{HWMREMJTU^(zwqG7~ca*CTVxZRvb5*lv7{Z9wk{;oMAF?>&sKs{9Y=6HEedg10O8TArPbIE*kQ`QrnzZH>_RH`0SqI3Ku!$GwhoWO82G zFmK$#-t@X7;aRO}k<=V@K%kawPy@2Sa?N+kqLqRDnYFs-bqO!06bL&(>1bLoO-?<0 zf$oX2N&TE0jce15oceG&Mm&2*%SXz)Ins;9-!b)id!Ze0LJnDLGWJKkXUc^UWD!=z zFb~EMzTv8VX(T*URu4Q2_Lyf<(bIDai+T>F_}uDgPjCMx~6eDPe7W+gV_g%_RHAa;(4hej3fZ;HxLU2*s9< zIq}vxy;YBn7{mpH%xg@_BX`VjB%faUPf~Fa2?~||RNgQ`$^X*38FCqtL2)mXJiiRb zumO8Y`U%;5TRv?+ zcw`gpE~d(WCv3}H;b7P= zu`UNRYGsDOsU!E_nRcaN_TX?83Y{(PVVE(`m-2Vu$=l~FK29B~e2HAaJ$%3osPi73 z6)HAW-{Ta9YyS;`eju4;KoUV7@|aZ&dBh!s8q>EHL(S&OlDuYd!H5#4wdTb&W-Fc)oTRk5=5dWX z9RnB=AaD%G{tN`n!9y;)`5iG>ot<*99Vgpu0F%1AG1=dIZ1#wNhiZz8ZrJ%&asv=L zX_fb4r0KH_h|?T)J^@(BT}Di2XVy2T{~5x7*ui1RiMf{+n!X$$JR~ysS|C5~FMki{ ATL1t6 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Key2.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Key2.png new file mode 100644 index 0000000000000000000000000000000000000000..01b005466a834d27c049d7c694fa04c5c7e89b09 GIT binary patch literal 4199 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 TBKrBtPXXZJ=IwfS7o7Qj0;g(L literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Key3.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Key3.png new file mode 100644 index 0000000000000000000000000000000000000000..99b3b7fc46a570de0b3091b5544f0cb04edc89d4 GIT binary patch literal 5167 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 Y@oSA6M_sB_KYqZLjb3i|H?ULw2W~np@&Et; literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Sign.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_KGPG_Sign.png new file mode 100644 index 0000000000000000000000000000000000000000..1e76bf689709eb98d1aca170b69d637d6fba161c GIT binary patch literal 4476 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 VaxiKaP5lc2eD?)-HF|_+{1=;G*u($; literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_KOrganizer.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_KOrganizer.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa37ad2594ae421f592e8b99fe25b245eac1fdb GIT binary patch literal 6476 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_MessageBox_Critical.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_MessageBox_Critical.png new file mode 100644 index 0000000000000000000000000000000000000000..3f0a6574e352b01d9eff2eb0e5311879559026cb GIT binary patch literal 3699 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 S*{J5aU``Z1PD-v3RNnDKoTN>0x~FS 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 TKB3Oow*t}OaXW5?@{0chln%~g literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_MessageBox_Warning.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_MessageBox_Warning.png new file mode 100644 index 0000000000000000000000000000000000000000..b11a7b6a4f1825e1e2a22a7719165872d4f7cf48 GIT binary patch literal 3259 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_No.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_No.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e2f90a33f32635f7b96a311ce54b264ede85db GIT binary patch literal 3062 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 DMyz!C literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Package_Settings.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Package_Settings.png new file mode 100644 index 0000000000000000000000000000000000000000..34dc628b47ca925dd534a09ea22ce0be159fd069 GIT binary patch literal 5994 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 U#G`mr_wNDxeS%kCUWJJM5AL+rd;kCd literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Spreadsheet.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Spreadsheet.png new file mode 100644 index 0000000000000000000000000000000000000000..05f4aff691d5fc031210f2df701c04f3c44b16ae GIT binary patch literal 3271 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 RwLcNSf8QaWn_jG}{{pj<(Yycv literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Toggle_Log.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Toggle_Log.png new file mode 100644 index 0000000000000000000000000000000000000000..16f440ddade625eb415d4d289fef9c8698d021b4 GIT binary patch literal 4069 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_Undo.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_Undo.png new file mode 100644 index 0000000000000000000000000000000000000000..5cbf37d0bece72039f3b1d98e4d894f3dd4222bf GIT binary patch literal 2653 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 BlePc= literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_View_Detailed.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_View_Detailed.png new file mode 100644 index 0000000000000000000000000000000000000000..6b682db456b8105953a9548d135255567aa16c8f GIT binary patch literal 2768 zcmYLLYh03N8-EZ4wMW523Pph8aajtOolroHlv!EXoAYf6D45M&TXUvn!6Sr+%)_)& zSM!jSYgXnutgZA>EKiu)Tx-oYwajW+DprCVo|pRaez@=Zx<1_3{rg@2!*v(LY~E;Z zx5N$r0Q;!Oh;5cL@Z++)l(E$m- zOG*<^2TBx=7FH*3j`Sm0i6IFnyYf8&DQCuRp|Yd@t_Q0 zFpcQ!sZm*e031|g!V45RI(!sGpninZWt-h!L9@ICGo!Y8o*ETUSdDaRi@<=(BZGSL z+f8mU-A)sGrvmW6U&hC7z4G( z-*c_Y*TkiJu`Nfu9k8lnbAPf%{@WrzPkyQcI6sp~y;Z-Zk%<4fW5su(cgSUtSaq1a zH`bvYiOfmAD$9@48K^tRfB83$a2f`?#6GP2{!Xim<(fYLRO9(vG9a`$nUQBg)WJ z(Fu^(@Wxu7Q0DF5Oa<*tX)6?Aa=baGw;RBV2>muLLa{i)$uIzGz}rg%p~(ppp*T0sf1PgbEm|SJ7^L9cAvd3Hwbksn4T9n(@IrhmBPZ(vg&x}` zLm(%uMxy~!Q&ab^vZPYo>@zpP0iHDcvkn=|?zVflC~XR6!^#QT_UBu&Rb5L%k7Mt$XLAxPEty15qt4d+esr`lm|jp$+1t36d8IPnD-L0Bq0p*s$hpK-4LK$SXKh*%K~UhEb! z6*5DPfP&cQEx?)mogdjVVZ_GHvEUUwCYCn`26d6 z5Ro&iTVCS__lty#&nDlfPGSQ4G9s!Nh$W5>rkEkPtkoImY^&{c`XdF{9B%tu^3X--RL=5*V%i- zn70AfSOu|mC=7w0_;ysLae4P*&PVln@eVLy_ic%;ucKoI7rWi8SHqhAcHwYLAAF%n zGc!G(z$TqUT`EfE`b}>wCtQ4nn8KIyhs1#8$way1A*Y3$S9WRx-9So0FNUtZb9uBC z>4rP?(D=gSJhl9En(b4AIk@1b=ED-9&Mvk`cM8(aCG7tl#e9oSF}G&Fudcgu zXVH^N!|XGh;?A8F;SveyT1vlFx^ac-^5xwX_s9oK7%ireaq9GGF!lJly5WhLdKWv3 zsxEQh&Y2g~8>lG0@S6o^wE8Bebk)B=%;vNK;k$N$0t&Ep;qRN%gV@IjwYVf={nA6uNw@^q9&`(X_`RxSceZ&qmX2!WGrF|CF_j75B=D9=jeSA=IC6 z!XE4&ETk?Ax3&0_f-JX$%1*0HU4`R!54m^zBHNbSO2b{Mluyd}*AP>p(iJM&bA5{Q zQs)yN4YPAkPx7)6k3%ZQDM#1ZWn{8u?194%%F?|S<#*(xN^?u7tt@hz&Wg><8}S#y zLUZ2ylfdMQ=CcK&VpO|W&p~H5h4-r(+*AoAtqk^Ivtz1bHfXW#y`Y@wzn-P`S;d}M9*21k8T@;{V zuu{~&TCz7|$N0+@z#f@rsMZss1?_t~F%O#hWI?NBW!}8f~-l23*hR5=A5_b#!r;QR+_@cLS>XUNUk zwV^jI1SVU=qHPuoox;}`(w42i1XVqbBKBQ~2oZ%ugVFv2&^bX!w8arrMmB>B*k@TL j)L`kn#n%2G%25DgMMFj3>s@-wmlTNFusPy#m@xN$E5h44 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_WWW.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_WWW.png new file mode 100644 index 0000000000000000000000000000000000000000..cccc91cf3623fed14ca9d229aaf8763f1db6d9be GIT binary patch literal 5594 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 ag#pzleaFSWM*Y;CC*ZRw!0WCDH}n4?#>kBT literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola/B48x48_XMag.png b/src/Ext/Images_App_HighRes/Nuvola/B48x48_XMag.png new file mode 100644 index 0000000000000000000000000000000000000000..538d656bbfe34f2e156b16043f732673204c94e2 GIT binary patch literal 3779 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 F?0*XL>v;eG literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola_Assembled/B48x48_Folder_Inbox.png b/src/Ext/Images_App_HighRes/Nuvola_Assembled/B48x48_Folder_Inbox.png new file mode 100644 index 0000000000000000000000000000000000000000..e26dc7c1da22c595d159e0d8b6fd14d280802dda GIT binary patch literal 1260 zcmVDj3VP?40)j*}oFz(>Z(Acv+1N6{TIP*L9g^9S&p zhzUs1jYY-<&}c#|mJmEAQxBjWDi)F^d4m9o2tl+3T9RLLFIWi=PMgfT9AqeM^T^zZ5k>f4Rv<>t^Oihyr7)Sa#03HSf)F<2d<%r2V2_qVMx;We2PRjQwO~i;9N7f%I{T8$lz*exO ze8&*8L#dzH+j)9&0hHUQwAx!XuNZNH%S4!BMSZFTLajK(QCYC`~4c&?-d4 zA`ZkttW@FOWtNJkKNO`PbPz-rfaQ}5P$~lqL@ZskfDPL!K>!i3YIqG484r`tWTOb9 z1{bP`;9`Pv4x4e5-9L-?vRPz8O{T-gooa!|_TF>`-!wp7_7aaLF1FTpKHZ=6y@yvX z=FZXt8bw@dJgqTWqm)7`m2-w0gs>tw0f$239zlDWptcDzel>=zoC=bY3jlB;ILW%i zv9|h-jaM%9lsx#*BIe90L7d=ejaKSk$6OH^jDUa>hf@N^kZR~9S$!D^!vlDF3ws9I zCqDw$bUZxI`uI=XjXmqn{M}N%YE=dEXP4oWL#e^VDnpMG8G0N}ffz+=Z95%Dt{}Kw z81)igX0o@m3Fftj9gEu75Zj+>ORcG`Yh1K!`8<})EhkhK8Co0HCT~S>3LHYiZ;iAZ zZ3e?Td=c*C&*+xVL?-V#aMbp()_m*tXICDtIbS(kvkWegPWKl6qUoyk5`)X-D z)7eEa&$C;;n+Vqv0|4*`!U=w0HU8<7SDs9VK9!Xfn7Bt%Qx^yKRMXj*Y@mqERPp;n zxt%zGYpUTek8$B*ef!4F-jt_}V&7MXNp_^GNwAqJ&P}hTel)$sdLq6?aW}9Z!;4gr zntrzuV?(S!s6=syDjWsP^oy-eUwdTSg7W%jCnh!R-ru@xcn&tFUC6cHJ`k9{lGJCZXdS4-}T9L(=7KI(K&Zhc5X_HHvZJc1;h5CgH1Ct0y8&-a<%D|mq$Vz z4vd68=+7BXU)Oe{*fttD{!5PStUqE$!OV}q%uS)(oo6&n_AX>^;NGi{LIo9co9iFQ W-*@e!4Yf=F00001z@wPWYeCb(@Faj{}F6CcG+Cl~$Y(NN}q_IHUokgft|v2A>daH(Vk z^g+7^{mH1jw`*sD+ByfMprJKRJZ>}iTjudD*meLuKM%U31oT2@7S1+CWyAg*F%p$F zNCCD0DM&WOs7uC3{hE2eQ>MKe2Kpge5(3_YXS47@TSO%GZgy~7nI~^cuml*WX^7IW zBS9*azH7?UPjtgq12Dd>0$zvXKD_Y|SdTdp83_s70<16=;pJ-*wKh%7ajp$bH;kp# z!EU(x8T`KH0$u~F6W-SFatF`>U|5*E2v=-R6RnW6Hplt%y0__%3I9+R{P+c2T{8i% zLbZaABpi7JXaf{r84wbXp@nkfbLGYW%7ACErQpsxVoXi?vB4Yu;r(#!OZdL%0$zcn zhJiRd*#R`(R8TB!fyf)xzsFWa8@Lx&{HW#mE820pEHcU8R1bloe7Fw2oz;T|f>!;b6I6 zkDw~4(CS2O+}1ioOHGg?RXFPejHOX(90l2)TO__B0Xe8}GnfrU*mYI7ch}>#Zb4MK z;OpS6&l%AIZxpS6nQgyr0(5AbL|Y^EkKTu~Ie~~q0^-`t-zZ|kxIvq_iCHfJ!T=Sm zjkpiC!$ca4S-g=O!Hi_^DFFcr(g4PdLroH#%+igb4yyVFKC81OwO87K24mutg4^n0 zD*Z16xajJU(#SxV1<$Ujb!oW={+?L6K}8H}@On;wweAA4V1BrG1!rqL#`iIpML)o$ zTuVI5eNQ;8Q~x1PJVTXakTqY^HhS)FN6 zM(G@E^}V>uEa~|(--%)pI(?{lmV;7xhZV*r&kl*A9c-;N{__GBtOEyLIyM`hd*`ir zZDtDgJzDE!#f6qw=>EQ^w#~-<=Z7|C1~#sR3eolabNLj{OyyJWO%~iw&l~FnV&&%x zuqlYO%AYuD-`n^Z*tixdTzM8ku~(tOxNM;^%GjXz2N;r*!A?h%)Bpeg07*qoM6N<$ Ef_~u(^Z)<= literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_DeleteEntry.png b/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_DeleteEntry.png new file mode 100644 index 0000000000000000000000000000000000000000..3a18800093216802b4b7eed20f306d6f4a3d17f6 GIT binary patch literal 4247 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 LNkvXXu0mjf^|uzI literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_EditCopyUrl.png b/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_EditCopyUrl.png new file mode 100644 index 0000000000000000000000000000000000000000..c71176bdfe399c4f8c84a685e1c6c3b66e5ebda0 GIT binary patch literal 3598 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 Uhz(k^6951J07*qoM6N<$f{!lvB>(^b literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_FileSave_Disabled.png b/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_FileSave_Disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..d733adef92e524b5d8510ec8965e93c623626e12 GIT binary patch literal 1428 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_File_SaveAll_Disabled.png b/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_File_SaveAll_Disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..3469af95710b4c4ecb8d01fcf646bc9bda30b0de GIT binary patch literal 2852 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 Hu0mjfl)I$M literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_Folder_New_Ex.png b/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_Folder_New_Ex.png new file mode 100644 index 0000000000000000000000000000000000000000..8c0113a60ffab7cbdf68a8acc570644e225e0f9a GIT binary patch literal 4432 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_TextAlignCenter.png b/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_TextAlignCenter.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef88d4f0c3bbd1867550ffb7aab50345c845daa GIT binary patch literal 970 zcmV;*12z1KP)@yDHg`RGX}C(ilqdGDV0dEYyS z5fSclDd3)$;^Ym+80z)<%axUt59{medqm_f5+Gx&z&Y>V-Q9h2%rv+<-Y# z2JG+ezu4W~{d#*9s+~^f9e@S^cRXOY9vmEe zK07<3wBq~zxC$Xi2tl6bk>`0d91h3TbzO2@mj;6Y4F&^p9ETjoA=|dewr#R3i!93` z&N*?;so(EYzu%``uSdOJk4)1fBBJy2bE?BK?^7BzShWn|k$eNQqt0viC70X&Fx;;0S` z!&ry|-`?JiCx|f?U}NElPc&dzVgzF>7S9xgeBWOhji01dlp;#4z;HO6ax57xt2%7b zbJ8mi)o9V+lN`JlXc55`}clTwc(@J!uNb#)C?wqD^gNf|im2Dmlt5 z(ulOZL8=NZ1NdANk};y&?am}U(Bi~d&Tn+(PEmbJ#{u8>l@mIhQknFdv;mVvm)fY7 zMx&7$$d)=6lJSA1&V?pHXAWdK)ke3!NXh7|)JA5k%m-WZkV@G=sT9bfWHb)^=H{kW zwMjEPvk%PcTqtU+T>F7}fKM7LQz{Yc{AD=bZnw3nPMZEJCv&>hC~d2#a?~!B%;|bj zm&f?P`m&dh(%4rO6r zN9x9307Ew>1_owE#L`X`LXA=-ja((zIook;KbAN$iGQ3OJ5EnJotvER-n;w0@4dT} z5fL78DdB;a%IpV>F*KXaqqViQ51X5t2Snr+X&_^)#5o@h27^!6*Vi8vMY#iDdB~Y_ z;PCM9<^KNu*R!*;4Oy1qI8LGovxa23T*l4K&Bpop`CHR8Wkpfm0cZiRrW5+>@$vEJ z%galOE3WHKtK&H2I1bsiO}1^*cs!m~%d*I_EEA+9=Mr5wk7hB7aO3@3fM1d?w zMz^=OGsASd-A?UzY7XRiNQv9!h0X(cN~x&viBk#hDx&wPlew(bDDJ43 zgLnak>jx<#D#zaz8*hGA&kZWoP41Ga7Zf1Ao2HgOB%RY{W2?RKH-x&weFHP`{p z`InQElUElP7my?=^rkM&sZF%6zh9+N0p}d2r>EeY_W&3GZ0~zEJ1AqU4&eRH&d!_N z-Q7n;=SHPciQV4bI_-A*4!{op-vE3kqE46tWdP3ryZ~?j;PFImi%Lz|WNrh%9{@iA z{3aqJ%mEKtbpTHQ)KL6?wa^4MDu6x!lO~4$1D0rO1WD9fO#lD@07*qoM6N<$f@e+2 A!2kdN literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_TextAlignRight.png b/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_TextAlignRight.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f0799f500d2e0148a4062264f1de99d030795f GIT binary patch literal 976 zcmV;>126oEP)w59zn~qmb?VTebH}PnGDTGs6aqnxNDXHjWBYZ%h=6~b&lgNiIvMQa?t6Fd``)`V zjEL}%OAZgb6sB)5#!#=eYL&4{r&LpaHU$U!gbw51FCk(d_Iqhi;I<`qoenhWmPpz`v9N;z#b1cS@-t# zzMh<%P+ajmZ(Lp1CD(PyaU60Shla!9xZ1W&wr$g3FrdL;K$c~ZWm#mJCYh#5hGCFl z7{oaz&N=n_ed_o7)a&)A*Xxn4>qJC!dU{Irdi@`Ow*a2`cxP6iSS-G%R;zc6o1EF{ zt8BZdwv$&Pg0Ab>+S)>?R9XR01MmkxCy>Oh>$0H1qg+O`UC{R^g9ESuKpDWJP!b1q zkk98cA@I%3&3J+sV?H)EIq{JOEJ}=EjD_NvaUsw17DnTz-6}{Cg;roV9L^9+#Fvv2 zHtKi6D-hHuYw%G7FN82XwFD*wALl-aT}T#usZ>(Nflj9rE7gT4T@N!xWcgJSSz3h_ z0lbt7$@;vm>xqdg+P@Hqle&%UHBJB0Dl|{2OsztbWqElylStfZwPN`t%z;HpEgoDh zV@V%u%|j}a>c6y% zCIP>`zOKyw&(F{A^qnXdN_#q?GL4Yl52V?E&r3!_PbFl*UtL|@+wn}|WKOjj#cdUn z9JLE2bE;m{rR7wjWX?3rUc22!tyY8MIFs+Dln1N0iScW>Tt>UyhG7^k02Q7)Hb&1TcRyu7>y@C(2X06&SS6=pylz;ggE0qg*HGLqY@Qd2e>+XQe9;5UH3 yL}Z2;;Ja1@z*7K4WdE-g8o7-QpbNmF5%B-$$8*GwEOOca00005CHjq3cNQ3*h3=6 zzRnl`_{hE6?mFmv$F_uTSbY9Pp)J16;W@sq`$M1Oj`OyiS{o>Qz4F~~-#2TEP0nYpdSV|MHnm9@=_Aw{vwf1q+f|I;o&*el( zy<<(wfS3w^p*9A7|cAE&V<^qIhfVLva6M>TN(u>mNI ztuG2p)pJtjdn!Frh%jCRe)t_2yI{o{i&EHwYHQ3w{DKlCSdQ1W!cChIDeOx;BU>u~ zM8U_jXaHnzV+@@5>}M=o8hRY9^0JkIh=AQP&g^EE5J7LEhfVt)2n^VE2ABxLpGGeIx5AVeY46y@hdd75_2ryuHfQ3E7hHekFB ztOPxCbNMRMB+B$B_#HKA(NPCk#2$wvb-lF zUIZ+h#f>F$Ap@41gHRXo5|Y3y4%9_?8DSH&I*Dh_A%rDUiD1O;7KpEEHth#*2%MF^h|W7y=^1N>lTMML%FXV1!@{;8@@sV?&=X0%fIc=7j`=UeDs> znHfCt%5hjzR`Xm`-1=G4en?iaN8m|?|XX7YYazOWZF zospQx@81BpF>*M6dER>~)`aB?W`u;`6B!{9Oij-fj41+z)jZrWE{s_mgST(PMpCY{ zy&f>QI&^q+&sH3NcRvRG3eHKRqG~S>^Hd>+kb`jUg*fb)u<}kEN-mb@{~69Pwr$yn zcRrcI$A4ZAsf6j)!0c6lH3pj}d+7D5MiyCCQZX^hBW!N4wih?eN`r;!_ibhYaoSfB z5!^AT(4VMq%ovtz_Zt0n`c~Cn6@;O$k7YaLRo+zq) zMOzKqMtqsal&&%*X-$Hi(+sj=Qk9j_qf$p4$dfrgIxgH+5;i5xH{s*kCGNA+k{Rzl z>%@JUTI8O)s96(qsED#0_CE_vL`FEJ5G(|Cni+y~g317cfrT-Y zAY_)%fPgS}d5CXMUJP4;g=fi{Qde)y!%ivsntMRCmXSZ#b9=mCbp9HqFU$e7oCW~& z`xaL=+=Ev?{3CIyc9-=QN46ma%1%?pV;3~26FQY{V2O6vrH0zQTf_jp9UI_grMo6} z3{-vKp{Mu4x#kIpsAqi$p-*VyFQ&g^mtvPI4=##t^EC{t zeth)hcW|7FaZU~(73Vsqk>VUn=RBe{lxHPbUon>3)(DG)4LpHwW`00000NkvXX Hu0mjfq@*I0 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_Window_3Horz.png b/src/Ext/Images_App_HighRes/Nuvola_Derived/B48x48_Window_3Horz.png new file mode 100644 index 0000000000000000000000000000000000000000..c22a2af35499628e5c1663c9be4ee4ed2a6fdf63 GIT binary patch literal 1704 zcmV;Z23PrsP)sNXStL-n~RY{{RtG z@F0PpF_LK1kRaycC3$bn?sk=j{;KYo*$;Ejz#CYmr>Co@s_R$3s_9u05!}s(!CiiA z8}MHrO>7XowGQwxVDcOQ0wDj-1s_}h>=BU@Ulj%beC*+e?mP6t!N=g3z#?GrR+Iv~1t(>{p38|^^`2*12E;S~40Ra*W`YPXYycY}Ve)E- z36pB$s8pOK^l=_*LZ1mn820nBcvKSy5F3EP*mO`ZD$Pj+_cVH>5Meq4zW*JVx)8-0 zi&DjdYHQ3w`~xMfU_D;P3b$iMq>3-`hCI*!APOAQ;Q^4r?J02b)1Pqb+Suc0!C@N% z5dpi^NUM-r^cWEg)&|&p@bO@P?KXgkFdhr`$$7kcWF5m{1Ll6kwl;6$&BG_~=p*;z z{SRMV=%CDC*IiDg8BOv?j7vL zD=+Rv)7Yg9SWZsV+2G65H}T_DhJXO-i2(+MK#?W07y-=yXqts1ea$H0T*^(Svk(Ik z#!C7z3wG`t=6nGPFse%l@&-6wF*hcc(n96u$;G1BD~{q9JrRviEUG*}9zsr5EF!D{ ztU+H{u9YtgQF2~UPGdwkc|;7T!u>wR;k8^`FJjbd?Je;pk+KDfK)3vPkDW>l#_}^ zD}y715{-6cVnYFctE|6xJd$UKMapN0lyW*){p#mfXhDdmk4AGIkX2$J&><2u2t?}P zkwF-FwJSM~b*SW3u@SOyQP&Ow?CLBeJ{W~aRg_#lEWwR4Wma-E=5?YHw#iub+c2}4>xgnn)R|Yhlq(@rD&Nk;y~P|A ziENdsQbI5q6gB9kCaJbu?9T~I_el{;iAp>301Rf_{cfsj zmFT5}WikrOW!CM2L@lRRyi{DOL?)q>FnzC-l-4#(kX*%-71dM(xeSMKLETOV+`wV}Lvz2Da#iOq*%6TuGtY z7=d$~nUOJPUqQ4TwOCS*!$Ev!{_d;}u|qcsbVfiVW7p~XEzTQLrY{m;@M>!^?u z=gSy&8EVV~=LC%bMk5PjC_~81@qmD^aea($PF==eV2k(EDzvs)inS#7KPkorr0iw*XzbCm|=v$-W_mPrT?ASG0+TwC!aq6 z=h|OLL|yBT5c&&E{KdpGb$N?ij~S?sAjIvD8KgdZ#9~ma+R(3XTo_z5w z9OsvG&IFJtP;x|wRNt{`4|K@4=B&nY*E0e$%9RU%UAx$|t@8G*>o<>{{rbE8ZM0+g yt%^GtzgWh=G?!rQdujOgUk$bm*f!wqKK=nHlooO20Jqry0000ezn|R)&A?*ctva+-3O301!Yd z3^>5w-;50G>`26qB@^)?;4<)AUK)Zwh0*Kj9 zL70J!jR}sK8JQRq41cV5N_eNs#sbm|R3`F|flGj!QRP1ypO&2%yQsepqxPr!ikl99 z=K%;HmIKc}f_=dVb^gzvj0}#dzh&5%fuj5j5X{cRz^Bf@;MK3e#lY&s!0_-1!-Xdfr;@i!{-fG8Ln*q!0_YiABOI&e_m|=z*q+K z)M8ka0|XGuzkk5s`^R8v@B41ETl{OGKkxoCaI>%ho&TF*Mc>DN`!D|fu>ZmTU4Iz< zKY7c*unMU8G;*2&2q1=HJ1x^yby6?B+-Cm&?H14-?|A=TnZ^A-LY4g!Cj;9A1_mZ$ z20Q>DfEecF$zJ|)i~0Zen+*SdoniU^dI#VCVke%TK#eg#%)r6Gj8{KE05R;JD*WaD z3kIOg9RIgA^ZYj!~fr92g13>@~K#aOloPEsy{+a&%!}$NsyWd-W{`=d-!~hCcr~)AT&w$$`fB*vk XU$iZYw~u!)00000NkvXXu0mjf`}okY literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C01_Package_Network.png b/src/Ext/Images_Client_16/C01_Package_Network.png new file mode 100644 index 0000000000000000000000000000000000000000..03ef9a57007a727b45b9e6035796ae56819587bf GIT binary patch literal 1154 zcmV-|1bzF7P)2AgBPqel_T~GZf0u7O`*`xu(G#z4?CoIU z6gkGq{*~e9hy4s701!Y7AOjc}nt`~@+`w`D-Fe#|{eScQ$A1L){r}UyU;p>s{PsVf zWZw^V@zg2I9Of|13;+Sd%)np|bOE!ub*Ryf)=9dO)_T7f{`~yP@cZ9ChPPkeF+Bb7 zjN!+RcMP(k-x!Ror5G5Q*nt{9F+6(y5@;X?!{5KW4Bx&pGQ58Gi{bW#a}1wZ zPB5z2MHe$LFiHXh5R0S+PXwztAH%h;HVm8YurX+h0K@XjLxyWtfPusa3|67=FI{ z&9HyRE`}f9-!d>UvN3%B2J*s3hM$aF4D9^!3>>Wg8GinM!N4sfXA2MjK>)u010FO< zfZFVy0^HNC0QL3c01Ol?00j*o01X*000t5!0NCKa0PptX0RIU501Oij053IL03j$c z03H}20N}~V?gEJA@9$s#I7B%ZzB2&*{Bi?>)C(sDb}ktPZb20WK2a5h$1gTBJbm&6 z>>V?UOa^6HYX)wnCkzrC$_(3oeEkOy06_r0{{sE*0r3$Q5d{{SyDTmU8_L;wN) z008^?0092`000gY9RT|Y?Eoh$O#nYKQvm1exB$rCm;mJB+5q+P?dt-FnfjMBg5k(KmXl2 zzG@0U05LK%$XnPaRvhpt(qLENaA0`#g@NHa(B?ltSNvyWU|<6p#?8*az{LWLo&WC{ z%#;Ng&RqD+kl^oi@AJzerT_uN{GZ|9lh^lti0ErMS@<~1GVlWx3b8RT2y-wnh;lJ7 zhy$@GCj)~tKLdk>0w=@Em;V@YGHZT4xw^6lm=I3_1P~C50fyg$S1_g!1$Y)LHd&x!~MhW|E*my{o(hw#~XnP7s3nx2q3rt z48Y|3|L;YRm^dSYP!gx0fE5!Lhw$&;zyAMx|MC^X?4jL0tm$gKm{x;EX--DKE8a69NY{a`1u*$$;mP> zuyZizs;F?Xv$3WEoz3wFq85w+0*HwbNH9We2MQR;ni_>k>KiaHh>I~a^!GEAcXcuR z)zV^+=Hg~hk(KfN!oXk&3=f8%Pz(@2Ot9zxg**orXRf-Z7Z1pG1{oQKhxhL@+`V>< zfyvB_fl)w^!I+PqgNK8?@H@~=us{R|Ab1#n{4TAl878J6&%huo1o8}ns-hx;lB_HP zBPS;VgOwG7%-63BYJvjZ!02;=c>y4RnEpWHla+_3P=Wg&+mF3#8UD)4fn6moF3un= zEe%OnF3t=O1-Ti-8GbTxb8+PXy}|@^2?Ia?F+teJK%^_YC5oP!mo4~;E2IiMFn?4Q4XGYI$vGW=22WRU#+jh&x^JsW5M4?qBcykILMFB!=5 zAJ0*G;|y5cuWC0@>NFJ3VG`T3jS*MDY)-+%rw{QCVDn0~k! z{s5i${=;X6KR``?fSUgN`~`FkBLf%Eu=D@^{Qw9c#yMOZyM!gh9Dz>$`{&m$hQC0+ zf)s*m{`2<_!|%WU8UBL!|3LI#hQEwVz-VU#%Kc@2_WREXfB*vkY-A!yS_)YS00000 LNkvXXu0mjfySbgi literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C03_Server.png b/src/Ext/Images_Client_16/C03_Server.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8a316d29e4c8a597cd7179854ebebb27ee749b GIT binary patch literal 914 zcmV;D18w|?P)@XO3g_kJVYzng`m5*9Up~2a@BW#iM-TOU z`}XxANDn{&F@Ow!VQXt^1|uUw9#2ot{*I2$_t&o7{QvFS&;Q@Q{{rG4|DQg6`@gGe z`hRY2-kC5x00G3pfCRX>xUy|*9P0i20!5XTRls6z-@a$~_U#A5vuE#sE@NU~WMpGt zW@Z+G=>Z5J6a&1yy}NRA^SM5K`p)p?%{zu4KYlTM`t+6I_3MuezkmN_5EBz+U}Iwi zDg6V}0}wz=$Odq8^Dw=B{ej`npI;10N>U6zfBt58{P;Bk3kx%YfB+8z4-Y5M02ZLr z8R2>W0tm$gfB*hvxP18@!}sss7%VJwz_xL7a{#@@$-u|X42Oxk@3}9qr zV&LcJ2D;!k(BD6Sd`6%lAU`vKHL|j@fH6=dTn|71p%}o#!~%>3HHKHO-hplV`0*=L zGb7kmPEK|PK0aQM!EiSK1Q3b=-@k)w2BiTuprZc_|Ni|4y8?uHczD2uJ$P^r7&bqD z!1MqF5Q+i+{xLAVd-nxs$X5mqp#T2>Lmm_k{QQEzXnexZ+uQMP{rVM0zkmPI57Pq> zKqv;hdGq?`?_b~8MMMP|eldPyVE)3y@a^4qhJE{XG0dMo^ux7vZqW&mCE52gno zfEbaJG8Y%Wzqpuax`C0Qk%5h#keZw!>!q`o8D`J!zx4L)YgZ8wkynC(0t_!-z5<5N zN3b4%076LzmX@X)Ma6`?UcPuHv3SbTh}Vyw{Z>(uXJBFHx@%)+|H{+T1DIdz88|pN z;CcW82*nG)%(Q@qmyef`jrW7Z`!f=5>UWs`FflW{_K>$_)sI@n$@-7|!TtMxn3$L* z1C<{E=>Z5J6a#d$4dYeSH5oqsVrP)K{*pmN_5lNfI3GjyH+_){l8%u={HzR$3U?V+ zty;+gO8Fo?00D#&20A)=tN#D{uMP~pUz)$)bNT6hmEh!NVB3F@`Rn0d5-&Je|Nr~@ o=MT$+2lrQf|NgxNqz53t013e$)S`f*tmD+uC8RjL*>HMN;&n>OiuKxf`n<2U6iD+Cr#?@IQRGOV*KBKFjCz=uGILs z^MO;t!JFAgR0Yi-j+zYhccIXz)dC8WdCHg0v1MeC*{c`v+e-hVFY_NTYycDkiUhL| zFF>M;q#jbKwXuXjLrXEO`Y8G-jML}v5+-)q#=<>e&ErDV~qA}V&j>^Y(M!6H_IzZ#gZ1!r+i8Qyez}SG$aRB zb8E*1dPmk^*anNU=F-jw3lb-A7s$jenu%t8w%F|dJfP^+HK@IXg>m%8 zB){g0+`IdVY7?qWm~X&b9ptKEPCXc=QjO}J33Ui60WPiita2wng^VmJbM1DCx!w~r ztTcWEZU|CY$Tde9{Xcs7`=EU;pTC45De27F1a{y9wFqYqYJLc`d*ZI%E4 N002ovPDHLkV1je+R9XN4 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C05_Edu_Languages.png b/src/Ext/Images_Client_16/C05_Edu_Languages.png new file mode 100644 index 0000000000000000000000000000000000000000..8aa2004795cf5f3778659460dfacbe5418de4630 GIT binary patch literal 1068 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C12_IRKickFlash.png b/src/Ext/Images_Client_16/C12_IRKickFlash.png new file mode 100644 index 0000000000000000000000000000000000000000..89e7a97aba28398c467865d0a2f5433fc89dd0f6 GIT binary patch literal 1108 zcmV-a1grarP)kWqkWq4d^XhhTp%}{C)qv6lifKKmdUZhz2_OGOMJd3X_1q2No%*H|*@} z{>%&vOaA=*djY73ft`iL;4cS9Gy@06KA^3_Ks_oz?_K`$`gJrw002P%zW)RP1Ozbx z4i32j3=B2~9Ua962?4M#`yEiT2oS$!=HRer=i*whe9zvOhff|)HJ9PPYV`HX)!oOArLNq+ z|0Nq2*E}Y6b~|7!y#~5Ogn^Ci4L|@fF|o0IWCDgZ3m@M{W-cy{-wX^_FC0HE?7_xd z?$OBgw!}zxTum;Xgn*VA!xTF)@8)VgdS|jqNo+0D-)~$jHXVzyK5g`ip^q znVIni6VtEz-+$e^a_WxsIbbxrU|_h%_W%Dc26lEfMo@YIss&?US^x+jCZIeYP!sdN zKY#dv(e<5$o7>#X+3E9P28PmU3=D7f1MxQ?+rioSGYc@B{xdWG1jYnEP!A{phyVl- z6T`1x!v8*ec=P|u7qMS&-W+3PW0Q5VvSI+b=@~x*!%smV2BxNGW~QbLOpJ_j!00;$ zOao%TsDI7K#3TX`Kukbe&;9-MNd=hF-v0aiS%Ky6-zi+2oD4wCdddt8;xa(Y1!Qw_ zaWOCh<^Fv7qyS9XZ~uPzq6&1ud4K?70*2^PV6^D|e*5+{(0>PiK7Y=zVfAVT9u^i6 z9U&nWIYvencA!(YtXs$M?dekn#()0~{C)TC70^OmkY0cQVgd%l2Vf?d@b~Roh5xT# zpMH4n-v9k4PB3uu^NVUKDKRJk0}5z>=$SKT82-I^^Z(DQSEv5~)dKZQ1nC6`AXsKP z3G~l-=C^N|*Bm(>ly%*=lopqfDd aAiw~~6Ke6ma?NT00000;gOh literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C13_KGPG_Key3.png b/src/Ext/Images_Client_16/C13_KGPG_Key3.png new file mode 100644 index 0000000000000000000000000000000000000000..e68afac8ba0c0410121f3f494e8a1bf4545c3288 GIT binary patch literal 946 zcmV;j15NyiP)L&84k8i)YeQx)yJ@;Y_@9x1 zk>T6t-|xSC|GojF4BNK}PrQzF^SP(O}@^v zvzFo3jaUX_g?kJi9x^bnurn~c0@7Su3=F@&Fueuo1qdLp0lK=H2efpw70#bI&+zr@ zCk9tnONPUT&oI3I@S5S(8QE_uw!g0b@%qPoj=z6I-+yN~!@e^=f8gal7W>KXf`mAK79BHG8Bk^GH`G(vbcNLMTRDXUy*Zl zo%mDRNaBZEAUs9@0tjrt*RMY|U%7H^?S~I<8NPk{&G7W;TZX%LA2M9Lc=gEX(`PR} ze)NDrT2hQH#Lqp?#?0U}BO{{>%m9D@VuI4YA3uJXdgjczBe!nd00!z`U_kOQC@4t( zI&N5O%Jb`~a!@(K>0*D2XJpRAGfB%`?%a?DHKYjYt zrK6)OsHdmtbnDjrm^W`el)ioYk>$;scik*3tS^9G+xg(zXRt1S00O%JCQZ|U%YtT`SP zkM0BpAR7bFZwyRKj0}JN{N4TN(eoX*Zrx^3S67jgk`k){iZKE$09wL~lB@v&2pS9b z7_MJG4-sHu0vg1?@b>NJp!4T1-um)u01ONa40830+0Q~&?03aV9cqk-McLN0r0tO26_WJqn z^Y!%Y>g(&|(dOpn%l-ZQ%I@y%*!lVP{_ybc0MyjU00IbX03#zK2=g+tusZzy`||fc z26h%fZb315c|{2kVSQBrK3?lTf4>4XTzR#1>yEXTE?wvVs(%F13lKnzpfKhcc${=Vve{`_ZbZtgt3bLV#7 zd-txs1qdK;7<~Wnh2i`6&wqLOI3Iui_W$v(KRk?o|8w&&F>`Z#|H=I5#k=2&X3bg> z)7a4PKuSuKAv!wT5@?wlNH0JDfxYnm|38NR|Nb!k{Q2Ei-$*A_RYTiSL{w6kjg^Dp z$Im|u@85s>qo|~Q{r%hLBBxGYXL$eaH89M6vVrsh1Q5i4fB)DxImDW6tRjmX9PL;n zBsm%Q`573Pf$sbDmx1BS7Y3GhA8d4=zxcv%`T7Hf<3}$rh=_{)1?dF{Ag}>{e)1@( z>p7Qt2DmeR`uv~a`i-9q|9`VHumkPjxAMuvZ1cp2Wle!_6)&c0h9y#N6Oc0r`(kL8oBj&pBV{-2>~hw$KyP4(>b4aOTX^Ur(MKF9GQV2p|SfIxv@E z-J4vAc}J%K!5=NH-|JA^gJOG00000NkvXXu0mjf^E0)~ literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C15_Scanner.png b/src/Ext/Images_Client_16/C15_Scanner.png new file mode 100644 index 0000000000000000000000000000000000000000..fa0f83dd7b18eb389b7c12d3a9981c622faaa7a4 GIT binary patch literal 1086 zcmV-E1i|}>P){vE{Q1jp@#3|> zOP5Z{K6r2|1=#?A0AkkGHe+C9WMp7rVP$yt?#+vh8`qr>7M6@wR#s&G@ZlrSW&aqM znVA^m<>i2CIP{JjIdtdGpI=vC1^@&Qv%0z=STj322gA2-pBWxKy8H0@^_#y`Rkd9B z`S}??eE7uh`SUl1uV242C@Cp3y?OKA;mVZ@i-CH-fD8Z#AZ8Db2!`9YFEL!Ybd2G} zi$@IKzkg^&Mz{FyrShKdkQFy|x!1fLK7z`1kK0!=FEY7=Ha?Wcc;-2b;LC zK(Dg4apG%UbM77Ym>J%@c*ns0m6d_}?-vG^pPv~FRaqIL!Xvq_Tsm0`5I`)j(ER!1 z7Xu$RdzOuzX|=evnbet|vJB^*F);jKdC$Pc$;9yC6Enlrd;b|^IawL9EmRp~#s4v| zv2)4*1P}`-ntuQOWv{KRG(peOSf52ok@3mNfyQ}4eA4{jd-2p|?oN#WJ@b_V|P1{$nifC}IKU|`_-%D}+S!NBmA zor&QcGb_Vy1}27hdoG6JAPI)|@82`z=2!h%xpMKu|NsBh00a=j<;xHMgTU{<|Neje z{r~^7Z~y)uc=G%IgfoBs$8Y)nKXB3a|ErI_0;>4?|Hjp;|DBvXJ_3E51oJvT05Qy* zx#H{P%lH3(`uGcM(2s9F{(t-W{r`g(pZ~8q{qg_N+aJN=hYlV8ucc-12&l&mIVl4K z5CaDXmz{xu<+`k_(pSq@Z2Wuu`rZFOzW)Sj`3FQ0LszU=|6f8v_B>F%G6Na_2p}+0 zP|#ptWo6^x=NFAKHML!xnws-!-TG~RA3l8gf5L?6|G2sNHUgCiVbco`KtROEpsK3N zz{A7GASfGok&!SO5S307*qoM6N<$ Eg5NDED*ylh literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C16_Mozilla_Firebird.png b/src/Ext/Images_Client_16/C16_Mozilla_Firebird.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2e6612ba07c657d85f7b92c1c7c969ccf306e2 GIT binary patch literal 1002 zcmVRCwBA z{Qv(y10?_;fLK5TBO@b*1hd0BM>jjUVlQ)X8)*?v{^xJMecp2L(dpgWPt5ppsbmXK z$xk5u2M|CE*jykVcc5Xx(f2=Ief{_U$KU_|fBgCX|KpE;|6c<63y!?|BkQ?nE>M{e z$N>NWgkgYW?7^zp$3FeP@#^pYhwuLX|NQ&k|I1Il|37%+^Z%oFKL5Y`{Kx;vM}Pbm zHLF|zR4xV(KupM*S-rMtsHyTc2=THqh(FoJAa=Nr;mZ#OhUafTGJN~-jp6gx9}Ewl zzGL|P{yu}8jdL6;m$)B50I?t&AS}X`z{JMLdg(I^gX!fssdoQBv0{0U&@-4B+QwGrx2BJOls#_Y7SB&NFb{{=;zP;aY~R zFAW&Je|p96<;ypQKmQmRcmzclczHP)_yly-0Rjlc0LH(6xS!m4#$f(`8v~Ca(09B> z49U7b8Q!s^Fl<{qoq>ssi$Rc2l)=E&ok58655t!Sw>ba;h!GTs|5xjt{`>he_vN?J z@_+t+<&x)l#~}LEj^W=Y5r)6~n;D)A%$`kvuCFbqW1I2n2#)-b#mFkpCpVedYF#P|=@Q)P~%dZ(&?&~nfpSaH;|L6|GXM^tyr&MAY z-u@L~c>U-N!>xm>ZUO`lI2NYucsng=7E9<_<`-B0ep%1(pIefFK~NAFEzCfJ_!xfu z|H1IwN0?!~=RAhvQVSVk<82tU#DD*IadY1ufB*t}0hkh*f#&eAu`o&BoF}?Q?u57| z1EVR!|F54I7@pl_`04kAVT1lU1_lXh1|<;&hI8lNG86|GuK4lk@oInof(7DVApX=B zugN0A`A*>1?mG+|!cQ0&RG1llUi-tqtofBe!2B!2FQ7FGW^eyAuPJ5o?=R1`0`)uq z2q2gXz^44zY3KK8!|{z=XZ|ys_TYVgn}zXpD${qhPg}n;EcLSdR5;<|&Y$nDp8y8Z zU7+$uK>QFOfKZb1uM1i$-%exw-<&9LfrW*!8YmPNo@EJpcg) Y0NMp=WK!}d3IG5A07*qoM6N<$g1*Av0RR91 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C17_CDROM_Unmount.png b/src/Ext/Images_Client_16/C17_CDROM_Unmount.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e3f679af98d0ebececc74daab072bc6c4a0aaf GIT binary patch literal 1078 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 O0000F8l zH8p7~%gZ|%xVU&2zJC48@a@}227mx!;^!9toAmGBe@OuW{>84Ymg_Y&mA3(f^5o^E z;sOKhWMgB!{XTwtT?A71=g%Jon5#jS0t67VgM$|XBO?>gRPH4f7KUMlhAIqla?WZHF`YJrEtjr9|%uEcQKK5Z{Bv*=x3X6-034m?;`STCMqet(7hJ67#lbJz8gqJ~DT9`pdh#Ty5 zAt7Og$B*v@Z``C;S&+z2QYlbgh zz5`wHn?XiKhD}35Une9amO)R?=;`0Tzhkdnz4GP%e@3tiEG_j}rc9X-|KY=jK7asX zK6UEQ>Njs*e$&-8vJ)2<0V@E82ZOS*hU@3gU;au-Nptb@3&vPlTG%NlNHK%F^6lF% zhL0b=GAvrO;3z-0QW0%Pzh8sX- ze}EWnD?k7-o>1U$6*Sk&{m(Bdu~3pn>9Y4PVOC)#hWEceGkn@|hhefpHiM9YEQ8>- zm2W%y*CzMBXV?SO_l;pX0~6y9GwS@h8?ctEdW;#1pwK_aR9^a zy8!+6{{SunJpc(YVgLyh5CGa0JrfYM%!2^Q;nx9h1Pn7P9hTvy@BRV+K>)u00MQw^UZ0o!b%o)}hX)MLnVA^Ayk=nd^!GP|nurkt^J_H*T|GtyPM&XI%_X)I7y|P; zTp1V{zXA<-2M|EaK;oa$X9hkeD^|BRys|(W)fmJXSQ&nDFflN*voieq#?P?g{5*!& zmqZytH0l|CG7B(B>6;2|J$U-{zc+W!0t67q00x1746ii#zNhFp$+2#`CCQ+nAjk0K z;~$1!oJxu^PTW>z@1PCA|kO5m67#GCCp zH;?x*Sn(cVa5Uv$IKS;4CqMwPz>?(Ee+=7?Zh!RBp;%vh`HJ%lKlT1GynTJ2ft%$i zgCh4G1`po53|bOT7&w2vVPJUsh2hHN4-8u#eZLG4K*)K4xlxK~X5A6Hovoxr(YSKzy8bc_$LFyX@CGi$xO-&3_5n2 z%riN-{tI4u^zY^U_Y6vtuz=C%w00000NkvXXu0mjf`+eaS literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C22_ASCII.png b/src/Ext/Images_Client_16/C22_ASCII.png new file mode 100644 index 0000000000000000000000000000000000000000..8e771b7fda5c6ad1035b5b7abad20da5a840e2ba GIT binary patch literal 560 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+AuIM9`bZ?45_%4v}V;RtG5pyCZ0KP z;DbDe#05rWWo54Uy}iASQ>RWXe1C86{phGDE(WHK#N&Ok_WvF;{{Q#)_y6zj;|+lH z_y51YzyJUL+uPg!wZqr_nLd5GJ&S;Yjsxp|2etn{Kesa;VcE&#a`=V;Pw?j2-(_sx z-rf_m4?JQ3ieKfw-oUHSy?OIyV*_L3!&m;Zb0~-~PcYo%?I7{YDLg!!O;uI3Eq;Gp z<5dP00pU%$KMZ`%?ks*T5x1v;v5d8YU%q?* zU%p^$&*36WdP)0chC2zYHKlffSJUkKrFk2xQ4W5T60eX9Ozz z_m7GB$>j}q0Ro7{!Yz`gq0yJ|$D7{_pZ~Hl{9fcVcJApQr% zKt2OAPz_LiX2BCFfB<6o`R)6EhW8&CO@zNOoO<+=;q7->u!>)QAew(e4fqW;0K{iv zWMKI559HXN{{RArB{fCcPKaKJ$^I2@1y6&6OI z-~b39mjA#AXW|lJ_zDvF%fs;ZFIu3%=syUr{DTJKe_$X21Q65DKTHe)OkWuy3|JZD zxIQs_1zcBn}7iD1L{>tzjsOl#$aDPBU8ym zG+*DpU;+prU?Sk`VPIs{0?Pb`=TVF-{vVPRVQdHhX1iaH00ImEi*u%OT4f2D00000 LNkvXXu0mjf&W%(+ literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C24_Connect_Established.png b/src/Ext/Images_Client_16/C24_Connect_Established.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6b9f9f8798f532fcd34123893935eb03a05b3c GIT binary patch literal 1155 zcmV-}1bq96P)SkDz(WS+Pkx3xPSz7kYGF=Rh9`@Y8KfPA7&xRg z7&ydufc640!&inaJ{@NP0suh(zW)PwIR5<0ulz>f%?AVX;Sd1j*98FP-1GqL8ZQ79 z85{rz2nYcB{0{)yuh;*00SExpj3x3|9)rq`Q;PCdm#J2jyD7Mz55K}mS2FHe=vM~c$VS8(qrE_|1+on z1Q6r@^}G)mv;~CUK4Io${>;e4@Zl%J&Zk}s?<8Cq3^X)=QNzXX*xJU2Kw~?{_*ty{_*($6z$6Z_a93D z`1<_-^z!il1oP?u?c?kK64U+w4Ji}=0}2QL=(O1Q?A7mr0suh(zW)OD;`nT|cjjDT zcL27x{eS?Z@n`_W2Q>f}6AJ+C?C=2d?(YEX5*q-nu?6<_*6#cO1_S{1$K(Lng3F2h z`Te{C2p9&84;eZCKRo^A*JCwiCR@jdaNe(<-ZHQNL;B^57Yxj7j0|T^?!Rck`t+5U zo{r1k*WVe=R-Zok>HW_h4q#jW1OPz*zW)UJ{{aB&1qlET4hzD!tgMz92nBK)8XN_? z$ix8j^z!=U`uNHZ$Z-d{{CELT4Ai7buVze_JVgYN*Vt*l^Z=+2YdKm7^=>U{)C z{r~~Q!o={Of#d%lhW|j#Ai&1Px`2@plrNYVezLJMq#oYNVEgBp0jHXi;L)Ztr-7Oy zV46VyAb`+wBN#9OP592j#*lXE0E7O^rwqR&xcOhsz4o2y#LM(W3=9wcA*lrjFaYeq Voj2ODrFQ@T002ovPDHLkV1lC#Dscb+ literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C25_Folder_Mail.png b/src/Ext/Images_Client_16/C25_Folder_Mail.png new file mode 100644 index 0000000000000000000000000000000000000000..90cf4878f9a78b53a7229cc41b1d2cd8c4caacfc GIT binary patch literal 843 zcmV-R1GM~!P)138MK$E2g$*&ptC8 zIPidB@btkOhPxLY zGsuhZF<6>uFkC$Qis8VC*9?6Nwljp5`@_t41qdLB7oY~b{`{BW>CGn$Z|}Wg&{LCU zNC`J&kdHHRiJJb!5eRLu+0A`B2fU;|zQ!$9iu9fsR`KQLIE zsWRxe$ukJ@1LKT|f#Lb{UkrbK|7Q>ds+Sh#Ww16eWVmtR6fj8a!C?vzKujR=&8Pni z2JFv)inti=-+sohWAhD$M-RU+ynXwVVPfZAhP-lD1};tp25w-A$V_))cy-|x1H+Fu zU{?bK5F{GEGccU_z`+ouCBwikz|Fw=?>EEoBaa#W{Q1xD>BCnB0e&WM^l|_VF)-j_ zFjUoHIDP#(*aZLq1UBH)H%5l&T?U3`p?Xu;H%2O&d$IP8KcI)%E|yV zjDg|O#m@}0=N)7?3i1MnDM;%NfB*s!THs_G_vOE||L*^1&wTv<`Sbt(-@ZeV^w%%{ z|L@uR{C{xtg8#xAng1C@;{P*PP68#04L}?T5I`UUfaWup0dXZGBlD!JtoiT${`vp^ z_3JzZfTH)HXsfJVr3u}1Y$m<48{NuK#W+@EYRl+IzX%l#7}_u1`vP7m8Ag!3;>Zu V5Bu*(M;!nF002ovPDHLkV1hdzd4>Q0 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C26_FileSave.png b/src/Ext/Images_Client_16/C26_FileSave.png new file mode 100644 index 0000000000000000000000000000000000000000..fd0048ded9baa040b1c04b84cca92550acad6f64 GIT binary patch literal 898 zcmV-|1AY97P)uMFMs&||L0%d|AW9UApQ!(pZ@&+|Lq@y|Mx!xy!-m`f6?aW|CJIi zgSZR;0Vo`U6o5e(2o6=NC;k67TPnoF(0CnomdWR}+}Y*TYj=gwum!e34a6bEszh3= z!9Qg_5-j;~e*pwG;QznB|Ns7DWME)o1UvLUBgD}l>Nil}H_*V}Ob~(JKmlGpK?W`k zuzm)B0AgW)14af$paG0PMQqGK9!Q=Us_72{I7~pU0)`4Wj6lu@0e}Dk8vxV?mSALJ zf(SB0Y-eDC7z8r(H&F8*sH6WgGBGeRL#zb|Ah-*dfU4M-L8kr%^O=DPIDxwV0X6*r zc?B39|Nnu!_Y-I?Cj%2yA3y*>0ujjj`kRsA*aK#UKmY##Z39LlQ0L#je}VLWhQA;$ z03i$WUxq(F{xf{~!^yw`jbDHO0vo{2@}J?wcLs(tS6LbUeES7<^Pj&!!+?SC_b(&` z`~X_;?h`WuhX6AJJ3lZ+SRe)f1Q6H&W}qLx0b`K!=QoB7%dZUL;!F%*zcDiW`~?XM z77j*++Yf#-Kmb7k5$NBaKxeYD{AG|5`NuGK?Oz55Qziy; zeKv;gK$mfHGBNIfE{W8Kmb9!05tU%&_vdFGjGd1eqWv00a=k1&oZ$Yy|!NK66*5ZHhV+bRpY|MBzx zeXpJ~@NlyNT?C9qXd+?)M%h=O&F_E~aC~8Ako(8TcyI5es|*dw3;+Sd2uqUW0)PMm Y07EoBQ)jr0B>(^b07*qoM6N<$g57L=!vFvP literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C27_NFS_Unmount.png b/src/Ext/Images_Client_16/C27_NFS_Unmount.png new file mode 100644 index 0000000000000000000000000000000000000000..f6a8dd54a437a1b3f085110e743195fe6c995139 GIT binary patch literal 1022 zcmVM z-oE|9@b29^`CYpNlHR?0l?M<&ER2jSO8oo+JRrqCe*9nn0f>!ENH#Np4f*x!7tkOk z1_=oX20=kleV_ph00G3r%F1FOEG*0cvg!Z-|3K~k8UFo);J<(W0r6iT{?G8|&p)66 ze}JxIVvv-SWDpmZQUEFz00!XHZpD z;9_B6*8&J27DYu_RV^(Au-}293U>0JKYzil`Sa%woDFi}-@hRGFEB9K7}V93S$KK* zOaKCiMN(2!^ykkX3_pMVLb8bgOoIRu6DR=LfG%VO+RhGk6(=VLgNBAWgRroeCO`nO z@bGYP0HcNB+qZ8(|FVEJfx-Ytf&&y}D1;9Izz|{p#tTrh5CcCypAbL*v9PhRF>-Nn z0^|2BILbf(WFQX@4}*%TD#JgZm*AR#0r>s*H-?W4ZyA`F*%+9am{|Y! z{a^N8e3EZqX#C{Ehj%O|PoBQc#LWKZ@1I}a|NZ;*1|R?cK>)u00SXEb02&$_08C6t z052~s-!3mS9rgA5{wVFB0~It00`k)80MhV0G{z{FbC)mBLDyZ07*qoM6N<$f(qWwGynhq literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C28_Message.png b/src/Ext/Images_Client_16/C28_Message.png new file mode 100644 index 0000000000000000000000000000000000000000..ae1ce244687f6e89fa02bbe9d23050d632c2a78b GIT binary patch literal 953 zcmV;q14jIbP)jeAKo)8Ik|!%$iSCDT0)xP z(&y6*eE*mk{xE)H@Ro>XVE@a*&~&1VL4tEBgMo$)+yH<8g1g}8%`*(&xIQw7iU}|r zezTWBj75}zjgg5#@s}CH+4uVx6nQim7`Ry&)?VHKRu8inAb^i_}71PRf<465=n41V%44AV9*VL18l48wPzhTngf7(Rdh!EpcGBZhM)ZZO2k zCNS6=m@|C+`4t|B00G1TF@S;L%a6|tLDudJT&&y-Gfzxsc>HTG11l3d!`~ka3@pDm z7$S8-8DbrS8U8T*V)*r&86JoL0R&A*{~3P&{=@L$&j$t@5I`*F&Yk;iVPV1X`}c3Ksjy@Xi)*kK zfrc;wA&d`F3(QOmpFe;81rR`t+}zxWQc_ZBK=rJkjEA0;(X%*642W4?zkdDo{rmTm b00ImEcz3pHt`who00000NkvXXu0mjfg`2ga literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C29_KGPG_Term.png b/src/Ext/Images_Client_16/C29_KGPG_Term.png new file mode 100644 index 0000000000000000000000000000000000000000..e77ff5b0d26234171957415d226ef469d0643c16 GIT binary patch literal 897 zcmV-{1AhF8P)LofA3iX#a0!cixpkiB`L0cOZ8o!UyyxTQWME-o z!N9j}-C_U;ASRFj@-hsr4oM6gQmRahJ6HT$XXv9O7*_A9#mLBH`1jW@hF`yaGyMLI zivRxo3w8lO0D)bgsmWl+05nQik&QLDRLq)7PLhFxQ-MLsK($i&3xgRi7Y73~Gcy>o z05KB~|M>ay7f@>-KmdUa;NoK7WB9|sAfWM`+0pi`3{ZrD;Rg?ceXy%bl3$t&3(J3o z|Ns6m{Qv)t0Z1?i^6@ep+J6|NwGSYGzy>^f#&Dm3kwJ?A=&Jw!7#SFu*ckqQ|Hkl@ ziJ9Rs!%GH+pMQYTK*-3*@DHfy(!JXZ+#DQWF8~A(*npdN8BV{x$e<-E2ekMe0|OiP zeTIkoUoc$x!^^<^={N)9kKYXc85tN@SXmg(oj=bY_*;}ANWm3s06+ji40y_ryLBal zNrDH1HYY0+!@>2B8D^aqW_YIah2hHHeGEX~Gq5vqF#P@apW*5GhYYdqNeoPk;P7Vv z2p}dX@%hX#hJ_!l135sKef!VKpl%z$@aHoZgDR6ggT!w&hL`t$F}!;T3^!g523B@< zNO%ANKmakp62yle44WUEXZQ_b|Nrx!;riWM43v500G1TPf<(^Vx0Uy#{i9FVq|9c4YcgS<68{(zCUO9&%($cBcjOg_s0(g zcAyjac?5xB0x~lrApHL? zI4b}B`^&%sjDd^iuYe5z2p|@iKYsmZcneGle;GKL8Gilv`g?I{#q=*qGT&I3nBa+s znHj`p0VX6ShVMUq{0xsyVgLvrxEGj#3Gv@ApbI}UGTb@(_SVnKkMgho`NqJ`%8Hf; zV0>n zYY9?{I`fZst^i_TWnpFb`0*pd(`Qc^YHMp4X?fe*K!EvZx3gg}ed+;As8$ z^((`Fm@C-X7#NvZfd(*x4FCur7GNkc{QB{W!PM1_!Og}RZ1Ss@FB$m6#29pqjTyRU z&t}+r&6~W-~AV1P}`|6AJ?qJ1fJFw;vdyqM{fcJ$l5@4Gf2` zK>s$)n#J%36bnF?fWeay0AgWgVP=q%kYo^5Q)PJn?i~X+A0LCc zrUnBS&`@TeqCbEBGJN^|mEi->fM38s{`KV>gNmpKFhV$iiS920Kmf6@vvV`FH8(L7 z0ew8O#X@@eT)a|NQ^|A4oAWFfuZNXqGKoc5gX$>|`_>8{0pa9)JL1 z`St5Jl=+|G$B!Qje0;pZMn-x(3|PSN<7Y&GYM6lr{sS2d0ssNT^8f!k24-e%1|}w6 z23A%^2B4*X{{8z0VxZg@uFR*RS_L{x=4I0AhkD`oh4*2BLoh zX^vko7a=r*<8X3`{_q85#cr4Ps*W^#>T(T!M@-QAx5~ynM2E?%Z^mKW~O6Kmf6r zo0~;iSei5Z{`r&P?YFNC4C1m3?>YGye*FH=@ZslwhR?qk8Gii*#?XIepaH)aWWRi1 zc=YuxgNU>=gQ=l;06+k-C@Colu(B{P{P_Hn;mfao3@5${GhDmG#Bk?51HPy&tHE12M8dRcke#^yL$B@(9ghdXW?SVQ25R8 zO^%J>+h1m&Hy|3>fiC1^{ma11^b6>UpA4rid}a9llYs%KmjNJvSQr`qeis)P5qR|I z0mHhrQy2ufSr|At*cn)WLB|8N8WfO!fb5sRRJ-KEcLrboCH#YL3r=8v{($gbApQePrK}7} zN;=>~cIVEO@AvNAS_lw8%!-N%=Yfo~SFhe>u(!9;yN0000)k~+%V@8AFa|NAck!!IBP)BhO3^zXm_8Gii%(m?$49|OZb zW;TZ3pFT3)TA$Yi5I|r9)GZD8MD=wUe*OB-@SlYVtm!XM;m_}X8Gilz%kYPljo}Ye z?Drp_8lb_q?|)#py^Y%rAb`LIJbU{2f2i9pMq#Ee4BtO|W?*6h3Ict`t|Y*~$jZ*Z z_~tQ?|Br!@k%57Um6?G_RGguB{%3|?KmPp%2q3Tl|5;cWM5Ndm{`E~@_%(SN!!H&V zhPOX|GAK-#$ROk4%D}K8kAZ>Z3j@R3??8X?GBDIGV_@Rq1nOk`4-kL@az_CGgkflk z_rIgK)j>om4vIB)c#tW-FgPxRLKP_&a4IHQt;ZR6S4JCr7{msghaCKxf+v8$2K@fV z1m=GE^M~Onhz8;pKrH?DFF2(CKYYW$`1c(H!;`NJ{~3iD{sLp}FGvT_PXGY~HQ+zP zpC1eiqM^|Y43g>$49v_7O2AMPwYF#Y!^Y0Q>|Vt1_t$rz%|HWLxfuQd1NHBZUtq%l z0tjrtUtp-R{$yadqW*>9to%1{w7vQEp20`p9fRg?b%vEn=?u(33%>)^Fao0@{P%YT z);~aZGBPm$1P~+)7?^>Of#KHY(+tP|u3-51Y15Y7&ct^!*F@3=OKUq0=wYDw;%skUH--R^~+zN0!FaYLCN{s@Ba)x zfldYr0S$oU5wO#NrZfHn1|ri>W`F6UWKN1_5c7PNx q1pohKW%zP`EkFPFPMeT#sW0|XEY%%p#R|1$hyVBq@q@uN962ZyqXwzh?ol#~+? zD@p+k6$Qxy4ZXw0=JMhDcd!8<01!Z61OEQ}8N($e=3!uGt0rk_sVQ!0#UsYe&A`28 z4a5Iu&lrB*yvgtd=(_)3zA(tLv8g`%{#}%jf#EesFF*i+4UqBhnC84-0WT}i=}c^F z48MV5e?ER;`2PF_!|!|d7=Hf#&F~B80v4c?Wtf>YI2jo&fOs=VFF*i+UGnYCo2zWV zaQM%{#_;{?PllggelYw38um*@7U;Sk4FCT9WBB{y2gA<~9~i{mzhh?o|6lPvPz(eB z0tjrt>uc9HzC3r1feFa__x~Tm|KERrG|&}Vx(t8bzi0RZ^v1teFByKburLT(*f5BQ zi8}(NIYD{>0tn)QPahA03;;#we`aQef1I2Q|A3zRqYE@ZPJ!W{mmdRT*F*+}RT~+2 zHf&~)cK5ag+Ajvu3lKoyF!=NT|D&fzk3G^%PL})s?mYv;oqG(7XHPLO9NN$Dzp;&h z!N`Px;qw;;#-G0!7@0X3WQ@&(*_JL)1!{c=5I|r9fHuE=ee~$TKV4n19Cv|%cIOVm z-;eJZ{=I$6@b}blhW|SHz(D;742%B^zZsbr#5A-RcmxC;fm-(f1Q6H@z$p3k?!o<| zZ?|t}V0Z}(c_v1NKb%|)e^}WV{v0{N@bC9eU;qQ{0>%O`${EBowHUF!S*<{9|Kh`1tiJ!-Izp7#MkZ z)j@gz0toDdpTIZ<8gTN_t5-L4#Ka7legXXo#2^DcJ$}USZSO9I*HW?!&yE~qczN;s zt#|kC-1zqTzxwdu=Ic+N48MQ-#_$yA=a-*9GrauyQx?{gN zx%Pf~^60_u|Nl?32?;-82D%0W00IbX06QZinDg`3ubq2u-t_zW>(`@?KYwod{{R18 z21dr4U*Eib$t5lOjh$bR;s1ws42+-z19UYA00a;trP&!EzyRKibiCBCt;PTV002ov JPDHLkV1fzi*@FN8 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C34_Configure.png b/src/Ext/Images_Client_16/C34_Configure.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a3834abc93ce96f5847af4f43d36e06da5187a GIT binary patch literal 980 zcmV;_11tQAP)P*KqkyKv!*%&%YHSA$#uatJyG2q0!pPybDkkxACK zZe5qUb?aL0g9mq1)YUcAMMXt`hKMpee*9GY+O8;s6g13;+rW2mlcg5eNGE`WpND`vCg- z`2hL(_yG9$_yG0w_5k+w_5cEi<=wm2-`~D{%ONc-%aEE{==JQ`BQI-fTLu=E{|v0G z%nZMO|6zLn{=G0TsDL*91{&}a=z{+YA3uHss$pUP2q0!oPIhG-9eraN8Cjr{#TX0? z4S=?D0b_-k;nSyY4C?A?Y;WJbGrxNE%4wjVAA8g@+Fx zx~i&biAhUK0-encw3!uX!xsjSVp&-+1`7*ofk%&?`dz<%<f1iR30J(&TiHQLq zfS9GFr9M4>{&d^1V+UpK-McSz<;vB+M~)n2QdL!FR#K7#M-|YO43?JGT)+SgymIC8 zUZ6{!1H%Pu06+jS=&j;__ zdlY14Wyi(9zyb`H&kO4Fi2)B_WMl$*i}}>1O>6wi%JN@)`t%hT zOWZ&iCWd?W9xyzA{^A-y0O2(N1VDiW1V`7cTM?9(m+^{~l?@mkUl<}Hf)5`$v_BLe zfLIua2gf&WUgwpN@N4IX5AQEszI-tnn8BU{1Q-C6K6#RDCBsJm0000d_uo^uZr}XM!zsqIYR?x225BJ% z1_^Ek27aJAR#u?e{|pRYKQn0D{llOpE6>Nkz^KN;%60)DfLIh1)Pa(W4Bx+hef#*) z(`SLcd}^wC0t~mg1sNFR`571l1Q-}NI2agy{{))B$nfmrM+Pe;aW+m4F0KCz|1SUp z5X-}R*Fauj`1>76Y8tW}47YE5Vqg&EWME+X&A{*nX!{2s|IH_c2Y-Gu z2#88E2@4DBJ$d?Q89)FrF$-xkumG`uoEgKHU!3Q^e}2zkZY0LQ@beb~!{_e|j33@H zu)KfE!1x!)7v^Dj{Fj5_$3G4RSt&^^ki`H2#Bxujkb&v%e+D&0QHFEp4j;dM^TA&g zHCbi`zRwH{Ts#c_d6*fvxtST58U8Z-1F{9ad}rX~;bD-MS5iKH`XmcL0I@Lq{mB3{ zoJWlB@1)QyS07F(KIYG#{xN83@h~XM{bDfC;Ah}x_{Jd4%f=wa$H&0M#Ld9`>nFqe zFW-5A4&VU@06_r0{{#X402fb2AjN}TB_k{u2LSB%008m#`~a046#(hv>;MSp$N*tq@jEum@5d}v54+ek$06_r0{{b>} zz4SFQBMVG89{|(G$N<#T*Z}NS(sT3l@bUrxK>)u00}?Gwg21`I0`dnM00|o*0M+5|0Jpcv0R0Ub05w2B04N?8 z08&Oj1~fc43lSF|1Ro)u0 z0Uk(!u3~g~Q6V1%0Ojfc0RH{{00aR003jO(0N&W^01)ld07*L|00RXF0P5=O0Nvf* z|H#S6_PDsV)7jb8hysX_P0T{vF(BelN>RER6B`EuBQVj408{XbM=u#BH`IM#czgS? zgrp?@g9i^DJ$~}&)~i>qF8=%X>i{qYE`hQDKmaiU(<_kuTU<`hda{(RqXP#w9|z;N z7r$>E-*W5e-BVRS$^D@C21OYtoU literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C36_Ark.png b/src/Ext/Images_Client_16/C36_Ark.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b67dcba225336fb6700f8b7db79813f56873eb GIT binary patch literal 1078 zcmV-61j+k}P)Hj^aq&G(NSwfMsO95 zT)uRe;mel~3;+Q*npYfvVHgOatD>TWTMDfugPyar*NxYke(>mNwhxs6NgxR`yCb5x z`_X&5#yG*8;LNutin*&MmexOf1P}{|;ACTF`0*DqZ>k_L4AHGlwO1bJa;o+889?VC6pN3ShF0D)Z~ z!TFgXhVKx=_B(I0R%SS&)@&yj1n?&K^lq{cbWb(K7ICs;m@}#3>Ag}?y=VbW)n;B^BpWmPu{LjD$gbWM- z0R%RHkyDn1fm4TpLGTmMR-i^!A)sL#Kuvr=1Gs^<3j%3&h9AFK{xCB!e*i`tSTo2N zfB*s;@c%yx(EV}@3?e|caqu!QyyXEJ0CYAFkk1ZeGjTKg|MHdL=g+_YczAdOe*OB( z_>TdY1{oO{0RjkYKvU<8b>>H|xR_d+@*5b*vxo?50G<7v;rGv%46p9}Ww>+W1Hon^^KE2jmu2B#`wtA7-;4kO1WrhHc7Y;aKffwq`uo{D*x%P#QkdF(Z32mgjk*)d-4C|$)gXMnb=;ju>NCV0y>)E{~rb>#{bM;zP|hU`02GRfB*jL z0|+3n0e9|P=jP`ZW_a}QF4Oj{%NAN#nA<*k_JZr)y=%Te=_?F)06+jSfV=?IY^B67cxNp$p8QV07*qoM6N<$f*ipH(f|Me literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C37_KPercentage.png b/src/Ext/Images_Client_16/C37_KPercentage.png new file mode 100644 index 0000000000000000000000000000000000000000..2a15a078c6595c91db864e54f7d4762d7ad4a720 GIT binary patch literal 1107 zcmV-Z1g!gsP)H}cyac{r6ZLLkGoC*Wq&doEzD3*mrnlw z?+?SntJkLgy;8IsDEn9(0#lUZE z&LEwqc6D#x=TQf>Ojl|vKt_PSh%F6>k2~TC5#0K>QMjzX1dgi=2X(ojQ>F z>HB|%+U0Nlb8|8=EJ_z*)DmZ6;8!&D*VB^ZuvPxgaQ!7S!}K-RUi`Z^buUokcOd=^ zasfa9F|o3<@G}1Y!|?SdBg4xV@4miz`RUttpcLc3UktKpnt};VBAgtIzZe!C`SJhJ z@r{QWIHW*+e+3E~kO2Sz#Pssbr*EIX{bpeL|BHc)u01nuha%-8AxN*)gR0D4jq z0tN*E00R8?0N(Et06ZP?008~^0L9`K0C`RK0XG{G4FUlG0Oj@;Fn+8Zq`>y#VFCa_ z0KWeN{|hbV-uW9=F(nWMG#&o{9S{Kk#Nq}3%i{h3O(yUF*X|Jj{{aF3JQ(Ky*zODf z-|z%Qpg@ebUv)CVZS-~|e+$n^TJ&;kW!Jp=(6 z3;6(}(h>kJ6!8EQ3jF|xx&{BP%J%IsmxcHif;lSlj47_Z=8Gij?WO)1O(~nOd-+cM`hZ*cOem*WXfB*s+ z07}bWfcPQ9mpey9%%W^#%$XT~|M}0b@Yvtq_wU?&|BsQ4;qUJs3?hQO9HL?pJWT(- zGyM9?#PIR+x1Rt306_r0{{+y`&?N%{0Tv1d004=!_(=s0ATk;P-vHC`A^_gkywo28 z;^WlqGfou})u01g@^G4Ds>t5&QV`0nP(m zNpf5j0QCw30H?(N{}=DA+YJQx@Z0mKN+ksw1r;lT;SQa~&T#6V9myaVFr&}0ir|KdQ*4b=lm&aVIh Z3;_77dC#NkUN8Uv002ovPDHLkV1lp60PFw& literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C38_Samba_Unmount.png b/src/Ext/Images_Client_16/C38_Samba_Unmount.png new file mode 100644 index 0000000000000000000000000000000000000000..3f3b8ff0f97da99ff1352671c7c2e3b1e79b83df GIT binary patch literal 1144 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 Hu0mjfg~JTR literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C41_VectorGfx.png b/src/Ext/Images_Client_16/C41_VectorGfx.png new file mode 100644 index 0000000000000000000000000000000000000000..5b51008bd73f4d9bb9b53809c5ce9ff7034cd207 GIT binary patch literal 875 zcmV-x1C;!UP)8$bgB7iGhucjq$*N1K(R(S_%LHh+)T$9Y6kK z0e^n{`2Xwk=l}nJ?7x5i{{Qpm&;MV)e*ORX^CwvT^5x6_<>loM0R#}sKOg{^3{=1X zW&&*m*>Yve76w*6J_aRwdxqaXet_j*n1_c4tRCcIfB<5F>IX}J9LvPa%<%NwIR;*7 zX$CP96NbOPe>41tszLS!SUnH`1Q6T+kZH{9>46HzdeqX=N@C)Q*K|zN9yu1ty zKrg~Hg8)DPv4Dub@7^(d1uEpXwPj#eS7-PtCdRPs||If|M zz-(;Hzyl0inAZUUh~*#97Dk{3p`aiJ7A`J^@1H&~{J(mYf$_ox1_odN@&Yw;wzV;U zTnfUkfa<=@n8CmR3?q;$00M{w7IloQtPKBw^w00#85n{7X95}o11vD70$srM_ASHL zhYuP4K@9*1Ag2GYzyU?q-@gq1fqwi8Gzc~Q0Rb=!{#jZwymfG3V3m|)U;xGn2mk~S z*Z>&*3lwAn2Gmb|eTLsKjcjZT42p^j-+>A0wv`pb4_8+PZlGa*pauX05DP3s{{m@7 zAZ7tdFolOR+`e{=LHOQ1hQD%h44+k18NL}9Ffi-rFbIl@GW-LE%U_Udf%*Ufh=rM% znUMwPA1+`3g1rMYL|jFM;p@D44BvtN1$l)F=yyS2T3`Zd`U}*|0c3M>a)L4&6F>m5 zoI7{!yM=`X$8TU5fJ}uYYfzE~g*3>(pYPu@e1X~s!asrO2AG)`K7aoF3m||Pxw*L$ zrKF_NfcjX0lK&V807ghQXLequW48L}MvtnRp ze8s>FRQsKQ0U&^w81Mm*dH?>2u*xwU=FpQ-miACnX0>BI%<%WWJi|YT5`X|=W>63W zDgxQg1knHjO#dOS`2UxSN&e4qd3{|i={E`t3QC#`yyn8f?>{~Y`g8ZsT86(2p8x^~ zy8(><85mjqh%?H5Kdx+OplS9&pF!xtXNE6tJ~I4}!1Q4bH zAk6rWk4fU^5p^R2P5Zy*3@rEGGyM7Sl|hV)gW(9nGX{6Q_YA_4|M(xC`X&YtK&WBx zpAm@v^D&5jJH@6XtZB_)!XWkv=$gO38N^ih8ICLcW(XB|#1Q%QF2nsfFW>!t^?x-$ z0HL~o<&Ox1@V8@%>gpQ8e?=J{eZ0>g{g;P9Qig|Nm%uj$1A$`evg?3J^d*YZ*a)7GV6N;+OQik{C)C*;r-uV45E_U z42S-IV@Q>G&tSmzh#{x%|NF1k|AfJ8h5>*8VrJ0exxmXRrvCRcFT?N8?-)dZ0Vysg zz;NLI9|jYiV+@YM_Zh0^{{Qg$>aQqdn_&PTfS4Fweq;Lf?=1rtH!H(iZYG9XoL?CZ z|M|yYCUTy^L;eLr(X>DB9$x+(4ph4XTVe$WASQPH2q1_70zd-<*ccc^ nSu_|#SylsW4q_k@00bBS3bz&Q&W4!-00000NkvXXu0mjfkTI$6 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C43_Trashcan_Full.png b/src/Ext/Images_Client_16/C43_Trashcan_Full.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9d7321f94a42ed44418c86e8a26a585de0ed7c GIT binary patch literal 1115 zcmYL}YfMvT7{}jpTG~nv6l9Zg2BTe^!!WWI8ih>+x?mVvA$-u6qoJ%qucz;-`>+qs^UwdwFVBZx zp2od-*;RgmJ-sm9PC8Jp8Se;%1bLM zOOC04L|HCZ3385#{mgXO>JX{=g+`Dl;;P;Gzzb626Ed%s_3|csnvh(HW zuM=J*_-pF`Jb1JLXy*#>t#1Ik6M#?#1RORSaIjF|a;{zQz&*h+7wAy+QC9dl66*<1FP*Jf;hHTx63-_BqU{~+Nrttgfbp8( z(qqdHzCnPD3UAUulg2b;>D~p;q{GJ-GA4}0 zSWI4*LKf*%DF148unyZpI06IGGEd^)E`CpZLhhGOABdE>opy$qX6uQC#RXzPc@b~9 zHH!~;Lhx61tJJBEPtVxKSGzGQS*u_!KLs>Hm^^SOSv0nGI4QP{?zT`NZWxxvc80Pj9oIipMY#((L~TBt*lIpLBhRST`w7nm=wCbu9m; z*7^9PsIWTlnfAT5k*d?7~QV4j-ze z@0u*`Q`$~qyQ};8va5n6QkNoycsKx9TgCN((9*Kws%!t_#2x*m)d846&z=z9+L|xZuokT)uwT$-@ zqQpFNr`|{u8SAG^!*`gE(Xkzvh7mMm1&zBf9?d5eRgR5a=C6cCyyzBl)VB(;mBcd4 zI0WTx@A582)U>KM6FQTxhzwT@6dKtZEuc&zbUYuXv0wAJ$d`28u!A^Xr&3qBmU-qL zp%fDu4We4;ZPm7&Ch$wOSVsE@r9;24&$L+uL9duQWm9MGpJek2J(ltD+a|75R1Ue~ zuDWewng?G-n6L8Xn6&l|hV`PD#n_iTKlq{E=K3+f$EZl$&^Zkd|^ho#E`AZJfr*5%h_4gUgKas{FQ literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C44_KNotes.png b/src/Ext/Images_Client_16/C44_KNotes.png new file mode 100644 index 0000000000000000000000000000000000000000..1e27e9cae74f033b53b28170417338986d307911 GIT binary patch literal 954 zcmV;r14aCaP)Hq*2@&Et`KLh{;A^!jb*8KqT=m7w4+W!Co06_r0{{%-23|}?~2m=ZT2LNjg3nSeU z9Iym9Klcms;P?XZ)u0 z1Rx$B0t5#J0P_(N0QA_`00aCm0uM`o3kv}F3jhG+6A=LC9RT*>0R8ph0Q&Id0Q>Li z{sQpv{tnpV`wEKWl>&(6$m_Sy!#UVxeq6iG@Z|Sz1|~x-2KIkH7#Ns71AWK_#F7jQ zT!IYDT$&7=qTd-f8NM300G4EUg_t~7m7N`&u$1XFxZfd(;r1LE&c{0)jfF?@aYmf_<^hSvZA#FAnw%Ei+(g+ZK2mVuk~I|CEL zN3a40hF@qJf%Jc%p?^OxFtEI1`26xC!>4ZyZvg^`UyKf^HY|9=JA3e*gYKZZX*Oa24t-ya#?KmGLw zsNy+50I~dMW8wkIplOB$+*gPukmlb&oBsmYj6nL!XNEVge*Xq~^d&$5u`sX$V+QQ! z|415v^#89A4KU3hzkdg^Io^Vmzxd1ua`HQX0AgVhU}OhII*|RB0pgP15SRP~#>Q`u z0YK;f|G@C$-FpU>%g-5Dem`b-aha9j?CsyrL7@&1KrH+s-+(FZE+|_-!vSOfFcGl; z4PXIACmWFd`<8)?`c78 zY|H}O%*?!8Y>eETtPGso%nWRtj0_w+{}}#1`^&Iw+Oxk+``&DR!oZLL)cg{Z8vz1{ z(Ug;c@7#9=Ic5f6I$~hp2VzN9W(HACW(E;X76yKH7G{1P7G~bxe;BwfeEPKw=)PX$ c>i_@W|M}sAhw_srY>W~TKsPfouoxLJNIief_Uq!sAfaEsA{^Y@xOjmE zgETUH_`vZ0)G3BDOP2h+bm&kaKmak@u(Mx&^y$-mrq{2%AP9OrSt~`cWMBe}Df@WdXVtAb^-{fqrKM zhBm{WKbK$p{CV}~>(@b&Z{ISrfec|{VqpC9hvEOnj||^|n$Pav|M&czJ4yfk{hPxK ziXor@00G3p|Me>aP=MhdQ1O2@wh#Zfxc+?xI`hkm7YtzU0Ks3N8c+cLWnuXTwCn>L zPz;1Y=>#Bvm|a;}8UBK7;o$HwmX%#&_3Ev z8Du=HOuX z4|L&Apeyv`#@8bfBxE!U^>5?3)J&j7~IN0z^T7prh^aQ_9m=nqi-_p@gVCMG7_z;K%h5I{^nzkYr61?WsB zppBr|;1UpEcqkN_rJ;^5DgN)q2ZN z|EAt&1z&5w`m%mvX&4t+@c4Ki)zj^n9Qtq}u-Kkgm|S+sG2Fc6RK?X36?YJhP0dA}?VOU?JP&>G6klO2uGz08Gy=gKR?}h(b{K&aenodIzi% z2f@MJp01+RY|(6BJziiDpcm1+C)f4BSg6zCdpJmKRiimi){G4(q} z1^PxxRYp%IvSXi?q6Z{WU1=c||G9fvjNOV8M5eGC9+9=$-Km*DQ5AV*WII_(dnpARZKp%77uh;KZ$z~72R!)*N`!~x=0M8DAMel@xO((;7NkGYln^j z>m@53+D`)q@q?T2z|AfKr0Wq7@&V%3vEWE%IJj2*@I~|AQ1|l-SXw1vg>V7oa|8I- z0PP3HCDVWP3>La6dZtL>>2W$NTXeTeE3}I*#OEs`#HLvXE;&}!k}!JOU8}8G*^*;= zPjSv0_%M5yo+6j0Lw14m9`2dn-mf1NjIPg)Vw7)%a0o9zj^>|q#+Vv13MJSTT;}7h z4Zfq*P7G=k-K=j!InVUNj9wh!)4I~ern6^GUXtfu4!SZ`QB}@5t|WV`n%8=*ErSn) zGjYM$*~Vxc9q@=I`#Q~!`<=w&Se+$ud=Pk1O*Brwau1*M?WFKRth>8iTZJdIQgn~v zCzI($b7!BT>3&ZqyhH4&mz1-ow|8KFVjY;l(ti5lghhYge-hacl;-uimIqemZ0Qjj zBEs2%Kv-FHfq7&Jo><&)%Bjgdi{^SdvbB+` z{s9&)87BY$ literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C47_KPackage.png b/src/Ext/Images_Client_16/C47_KPackage.png new file mode 100644 index 0000000000000000000000000000000000000000..fdb3644c6c1bd314480d915e8d02c90448c5ddfa GIT binary patch literal 983 zcmV;|11S87P)xL z6T@Ago{odB8Giox%>WQUEDS*K&`hmFsXa`D;rCmHo@=*?xx|?N3CA0=yWIJq@#OT2 zbZ<$4^KV{#S^NF#*JVsxtS=c@7#UyyAb=P_E{M_;s-4p9+W6}EZN^u(?=#4&3o!60 zDKZEs$ulqt2s1GJWM%kp_sjoxSDt@-e&fNZ-RB=nY(MmI8^{F!0R%QcSwLCU(!~3M z1jjQjE|!Z7>fDbQ*qHw@2+2t@$mysuNb4vvaLJ1?FmQ4(Fnr=;SXh7iXXe!9LErwp z+XfIoU@!0~do#RXQ2Q?`pTO|)%_D}-UoJ5S{yW3K^71mnsgq|J1ca_KC>UrkaH>Qy z+`p^Ou;S1M=D!RKYCx^q00IbX!0#X58914LGR7w=F#P zewyLMiyI6Vj=M34z6@a4wzK2&`5TjS85sVq1nC6`Ag}=p{}>ql|7T(l5#eNzQQ%}S zHsND<@l1l@@;N1jn`g}!zJ6n15K@$7U}F5m@L}`0$3V>s85ke|2@pUK0~moEV0``i z4+&WoU{uM-vxBjb2?xXK`Ck|~*q9i81KrKc%+3r^1yKwTKulo$OiT<+K+MR1h#nZ= z-~!4q{$cq2`yW^n6T?3gMF0WBgkUl<{QLJ0!vK&)j0{W+3|I^Y0e}Dkdx43O5v=I@ z_a6*De*b6q^9#shWCnZX*Y95t*D*qT%E0&^#Q=Z+0vo`^$-&CO#>I5@&`*YUZ+%@xk-Gb$;HGsvni zGl(ht1cuKqpzAmp{sVo-$_@!DWB?FAU;}>s{QTw4yMvB5?(U3{6fuZXlD0Kem$Bzj zSJq*WlICS#XW?RC;y-_O9%{?5R{%&sNCCl@Cz zVi2mQ7$9$CWXJrO^##M(^Xq@_-9Kx?moKlwz~Kwj3lKnHLPA2Hfty>LfsKs^>{m`s zK?ZIvQBWB0v9a++%19b)6yTRx2h9CmtA<3Rub002ovPDHLk FV1hIwz2g7? literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C48_Folder.png b/src/Ext/Images_Client_16/C48_Folder.png new file mode 100644 index 0000000000000000000000000000000000000000..1972448912befa0792496378737b9f7d61e772c3 GIT binary patch literal 403 zcmV;E0c`$>P)g44Hqk;XY=lG&Vm8@icYZAH zY!Wwu2_9HxhT(j3@7WmzED&o;S+(jW@B}zudVi!?``<*YJ+KR`08#iB0X1ol0PbF< zx&Hb9wXf@cRTcqsdcg!J1AU+F?V1bWEL_5Lkj}~*1^T;E0x3bqLzxZ5CEN2A~p_kD}dC5xsi1* zhtG7>%vuESmIOdgqIC{32YEPs7{=VdAcszWoM{B`9xC|g%b&1L+Q@@BvobH%-C^k- z6vTD{-V4OIaoN_3**F0tWx!W|q5?1Xz=j};Jd6tg+aG{|0ycM27LSh;rs>K$;=3$_uPXRf((ELUIiNB3}l`F;_o1P z00IbXz^g9|3_t!bFmSLy6wW=)z_5GmHe6nYxa!sMB8CesGXVk!tmVZgg#5*45Y2Bk zcrgfb;to1ScZNP7bqyeZzy`ehf{-|Q4?-Wj5A-N7ZhrrR(m=d<_A>^z1Sw>5^Z)_~ z;)Tx;-pv<4Blm4%SkU3c@cuhgBhYI;Wf~J ze;`dj{1a%vzyA>SUm%_`4Q~5!kmCUY2yDPLpv@mHLP8znM34p$2D#!7)OHa4{Wps3 zhk^JHKmdUa0BIIC@nQ%z1-jxJ!T^v)nC&2Z?dt`Y?VxnP4blq`K%k_l1&rIP48($6 z-u*zb7l@yM5)wcFfec^;VnZMXr7$4^+Cjm60Emx*oDUKJ2q0MI0MYDF!|(x6uKfkm l3<3ZF#0biGlmLJL0|2D0;Z$g1fI|QP002ovPDHLkV1l!Y_Fn)1 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C50_Folder_Tar.png b/src/Ext/Images_Client_16/C50_Folder_Tar.png new file mode 100644 index 0000000000000000000000000000000000000000..2effa3950f5be412a036df397bdd0031e0b3f286 GIT binary patch literal 865 zcmV-n1D^beP)xllYz9j3D8iJ|NCFIF@g;N2q3TlFF!#vzi0)j z2YUbQtpg0N&M#tM=VW4FVqs=@`Q#M?r=k~wl0`TJ7dH9_q13%M)+0tjNj zXNYBcm((x_{kp^;r69+kY;4Z(^}`RKA?ys|3cndXJv+~EW9ce}!Us73h-h49x!@0DZ~Mz{D%cz@=ftAfc?vAR)Auq2TB) zU_g0;GzkL)5ZHj%Um$+{&%(;U@E)k?{bL43CPoGpECc}(41fMJgAD)(AQli|$$E<6BfB)i)o)6ZK0JLj>F>Wk3+Pxin4_{BQGN^HV`NaH$f${b87Yq!)e{uUtztPg<{`v)|^*ulUfejFn zm))*vprrHf&+p%0{{fBo&&b5U!Upo;KZd_QfBsW8VPRuoUdEuM`dyMmNqOV_>#uGB zCG`LT2yB3&j;yg}NB{%Fw{PqWf8GN1d`{A46{mj z7;J2$fEF+U4gbTy@aqM`|DU4Z_yhbh(bmNRPZ0h_y=|Y6DJ$k2><~EHsIln4_7$1i75Q} u&GiSN5EuB*07_C1F1>%Q9?ZZ15MTfW=QbM%91s=&0000xf*9;#%d|=?= z;b9OK7G?k%0#^eP1F=Ca1_&S)sD8L+pidYsT)4#W`t@4|PEJmShYue!@bU35=<4bK zozKVsQV#M4NIl3U00G2=Yyb-@E5ofjj~Jf6`oO@&BgpXi+b;$_K@o;`AHOqPzx9BD zm5r0(AJA5iYoG=&00a;VJaCv<7(Tpy&T#kQ5r)4E%na{8Jz>yLRb+Vf@(BaukADmg zu03Ip7U5&y;u8RCgc$%3KrA5BK;Xx>ZwznF&t=dRcm)i476wjs1_qx04;Td59y9#- z`I_Mm=QoCTr%yBdH7#f0Vld;r&Y&oLn}Ojw(8+(482*FQ0WJOiAL0do0D`;VABg$~^v>^3V7}1b`wYgS ztPFxo4;UCYfw98^#NU95fEq!T{`(8D7$AUHKqi5}-@hP59~l^VE(2Y|%AlzAf}ueD zHv=mRGtdADpo*UijGvep{`~$62}H0f{xbjs5YP)i2FM4%kpKSUH^ZCv4;YwO`G9GH zg@Ks`=;wbxgTFEXZD3&d@{Ngs9g^nZfd~*lU@!dr1B^HhMg}IyWQGUNt$}gM3i1zB zApiL9qvt2M8b*W@cta7N9dZIoKGub(|O^wOrtF49o&> zgZ_a7={LjQpTOASUf=R$+^h*=dYg( zz|6$(`Sa&r00G3v&CQ)CB_)*xRLlAw7NSU589j?bG8-ey>({TpzJLFI5Dc>EC2ui literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C53_Apply.png b/src/Ext/Images_Client_16/C53_Apply.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0f6a6174f67879d89b8c970d88734cd6f9f844 GIT binary patch literal 883 zcmV-(1C0EMP)wF51aIxG|t0o~WeTux?(*f!J?S`!vJrWM3^ z)v?u>(g^>@;xO#mkNlu=e*%b!BkO=S9U%&s|{QUTj4;ur+Qxv`b{1=&{q{_{@=tdkKKPJjPv{N-R+ z=H{q0b!wOgrI|?`QkZ(!{_7i9LV-VtRJx`%DQ2F^23wD{DqBhIRk` zF);r5{m+$GoMl&Put7+Jt2=`@4-Z4{!AlI=w!d7({+qd+0V(7F0suh(zW)OTFd63V z^!sFSNlF9<4gMd;*WzU&Dh*+FS2`3*A~OK^{__Bz$W0R(*Uum z?9l=80a*nF0_+3*1ONs71^@>82>=H93IGBCK>)u00}wAF|NZm@`|<(rTQ4UU0WcOM z00aL60Pp?k0KeVV0IsF+;Q#FbO$G-6;062!00#UB00{XE00{OE015OE00M|vNJE=} z^$*A6FQ5Ne@vDAS;$dfD`1Jo3!|5mY7`86`{^s{nmH;M>-&g)K|ATm%5g73x%=8b8 z0Ro7L;}<&v=RdZejL-PCo<9Aa;W^_ShKsN6GwfXY>&vg(Trted45#rWFn|DJV*bm{ z0Ky#q*cZJ%!~O8Y?dJ?fS26$kepw(JsCg%$6bcYP%o1uwz$j&AU}9wa&h(8#?9FW+ ziyzl{>lm2-O#9FFhv6UdZ-)OYzzhWT0wab200G2EX?6w(FaS`kAv2YZ@FM^K002ov JPDHLkV1n^7jC=q9 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C54_Signature.png b/src/Ext/Images_Client_16/C54_Signature.png new file mode 100644 index 0000000000000000000000000000000000000000..8834f3f5923898a7e258d73f69a13a23c9f325ca GIT binary patch literal 790 zcmV+x1L^#UP)!`Q15b@fzyDt0{Q2Vu7Xu%Q3rHtG0I`4wU9l|~cCrHXU4J9Y@QYCv=t6!iLwA#v zKmR@FynAE;0|UPW1H)(O0+2d@00JAJAaEVS01h?=hI{X&7{34J7Sp#gUnDBUFSdJ8 zHvZ4g8u^XZw6+0E!8PHCT7OR*UV=4{r>~dH>x)n zzJ6ybDa1tk`15dZ)H07*qoM6N<$g32FRjsO4v literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C55_Thumbnail.png b/src/Ext/Images_Client_16/C55_Thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..91adff8dee83d7a3a16abace7b8db11802ce0088 GIT binary patch literal 922 zcmV;L17-Y)P)$Kmf6T zl<4SaDMd#|Gd#R|hvDC!zd&h5utpFG20#WQ7y}JqU}BI}P-9rOY_R}H3Lt>M25@k& z{X28!DpU5PBMkiVG7OyTK+VjI41fRpXZZ1rf#Js|28J*17#KdhW@7mF<`Kh!37;4^ zIavRJ^a2DB*Z`2be*XH&z^rP)AZf18AjrnRz|6$J@clOf!}~7`46j}=F#LY-kKz4q zCWeoX&M|!d{uAgZuzm)B00J8T@+%7~6N9|yUj}s{1_n-M1_maelm7zMeB@wY;07AV z0t|ycKofsF|INU{!UPQ;1_potf*ZgHghE^l3=)D23@V)e7Knc*r5W4{a2y6hzML&N2VR-xQ z3&XF!3=9W%?PWM|;xxnmpFbG>{`$r6_dg^td_S>(fra4@Fw%a(0}&vApn>?0fs>Pm zK~YhK;mg-A49v_dzy$S&fr*(J>^%?#QuF8cPX-Q7Sq5HSeumet-+~PQ2q3Tl-@big zP*c-nSi5!uBu0Qv`VY1OVhxB1O3ILA{hvWrR*vEF<;!3>fB<5Fq$5x|XJQZ*76;pe z5Q7=;AIfI{=aIjE8Q|&w0tg-ke}ST3zkY>lLKuM12%`T2Qx^vZ2Rs4+0tjpX3kx$7 z4-YF)k_R3*KrNsY4hR3h9AN$chNyr57XvFR3)lpJ00J9u>(;HuYu2pc|MlzF-+xeD wuxyQRKEwqenvIQ(>CBn4U*qCp82|zd0Hq0RXcpp}ZU6uP07*qoM6N<$f(3bh3jhEB literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C56_KAddressBook.png b/src/Ext/Images_Client_16/C56_KAddressBook.png new file mode 100644 index 0000000000000000000000000000000000000000..7f879f8cb57394345d0574aba61eb00238b4fb26 GIT binary patch literal 954 zcmV;r14aCaP)ijm>z%tVnX#0(2&3X82 zG%}@&7Q<-vUA@i&G){}>qFe*eOt#%ID1 ztB}i}A+D$Usi5J2!i1V!hs-@g??R8 z2>{vN;{fRC;{Xj5902_G`~Vyd3;_5B^Z<&lkO0x3&(;6-{e1!eK>)u01Q`eP&v7Cv z8ee0a000vY0O{`h0PgVk0Py$o01Oco0P^|e0PF1S01y!t00RgC0Ho5U0IZU)_5SGk zasU7T>;j1C>y-}=PfK$#tbhN2;o0YZ44;7hXJq)xz{UEXff49*9)2-~pWi+*{Qmiu z;r!dv3=8JX{r~CMtLZ?^yFp$D2q5MUcYbetDe*U!O>-x&6OT9p8>b$_A7Jz`0i%(f zg_(huo11}!O_1U4hZ_ugPETPtF?HA3|KI*agOUx%0Du5uW@Kmm_U+lv`z!)%LE499 znRUc97+91A7{s{P7}&V}G2H%opW)csEevOF&tNz`clU>HcfTY8_1%L7K0pA$5vQg^ zPtXLT|I0U~|3Clv{{NK^xBgF9o%7$Q)Zm}A1K&q>0jB*xWnSp|00M{+nIj#ba#AN& z)9lyvKMePdUj6p`($ky2p8j1Almg)^*m5I403i@73o!NZN^^_xE@Wb7oD38(MbB*5 c06>5N01LG(j%y#&;{X5v07*qoM6N<$g2{ijT>t<8 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C57_View_Text.png b/src/Ext/Images_Client_16/C57_View_Text.png new file mode 100644 index 0000000000000000000000000000000000000000..c688d5f6f9ae0dc083c5fac2316c819921a6c56a GIT binary patch literal 895 zcmV-_1AzRAP)S#@)vN0mNeCVJPEJ z6w31O8AQV`82*F6KcV>dABfzK-wX_F+zbqiD>sS&1Q5%+Pyhby-}9E?(}y1n%uEan z|A0392igEc5d0s4|3SrAfCMj)^_7{E;p^AG{{aGs<>TkS4Dniw3=Uc%V1!~qtaT@^bU}gXaAeKK2OhCW?V_@duVh|D* zW8mWA1>3{S%)%fjC=B!x$VET{{{IK#U%)_NW#?x2^X)GKNH0JDferZm=MRITk`fp* zK>aNwB*@_6;>dstTsrZQ;XgAY13&<=`~y0Jk%^h%*`xamm#*GokXKM((9~3Cc=zr- z!^Ml282$oX#|R9RzkeaY`t#>626aUVpdJ;VMNA9;0R#*KW^gcl{PdOK>9ZFM0)m2I zr~dfyi{bh6R}6pt`~wFn$SeQ<|6}<6{TG9{AQ!`bR-hozVt@c*`2#fN=da%knua{baa#^fM?v7ytqY91Bc9lit31&T#ksV+JvCaRzyL zIiMFlFx-+z|-@g3+`RT*|uW#S~|NHLQ{}p?l{pWDq{}CX7 zSU7n&nfBjjVz~Y0EjXQnLK~#Uw7;-){~w|W#Qyh>5h-&3@jp zyOMc@G2O zX_+aEIO@~nbS8mGPWvLOg$Z>tGom8G6LWq~iFuZmk!?=7-glajTPKQH89wVVN|Hq) z%dVWd-pN-*s?%!{UYlHdbEzPS^NwXq|DD5VDp!tvtzvzIYM?=q*eoe?9yrCK+vek_ zW4*}r+0b+wLds#3AbVP&%H6{&(q0%hvkz;~tMW3Wj7TWrX!AYp{W%Bj{j|5*r8EqhUAC{n96+vhmipRFgv;S z;YCL{vjXN|qwHN6?CF5M?oKccctel(0WjnAn|)o)KLU&m{r3&bb=PMF2Q(dL0il;X z^sHt!%FQ@|?wJtk8AV9f#-i$F5>yqRh_p}asB-|JmWK!}TDGqp0OMmv3q3RHs}Z?Q z`w28PN(o|(d`m{<-lbHQgc{-8ymVEpE<1;*uj(-MHzAAF{6HN4Y9_8;C%-P3dn+5G z;btY?`$xZ$Pzc^9))2mH=jkTxrR;o4uB_uV-7O6y=O`5tr|tEZ>_Ar?d3$?kiahmP zx^UwermwHqg7d{CQq2RTueUqAs30VvBv_kG5W^`7!#y#-2Fswgy0zm7nN;hP=QsyF z^eYEMka)oqEh3Z!#v3jh@M-!`Xrpp;7&Dzl1G9s+By+dscbu_e& z2o@?P{dxKtuU0pFYpD~@?X^!xNt0~VBq^kq?4&oNH2Ln}_Ecf=Ih(QGIVjWTPfA6K zv4cC}5?LmvfVkC|1Agikvk4Mz$491 z@Oa4wQx^YRXN6i_vB7F+L%#E=K%UnO9>>EI;6eMdI>uk z&%1anuW(b$*@}ISpJt-ERcP|A=R)o{tfWem(OBoUI7Sof(K?;nuh~W90S<=H3$uOO RgIe4;L`80hxbdO<@Za<~95ny{ literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C59_Package_Development.png b/src/Ext/Images_Client_16/C59_Package_Development.png new file mode 100644 index 0000000000000000000000000000000000000000..df1fb742e367040e5a32b1b69a8b13d5780cca83 GIT binary patch literal 985 zcmV;~119{5P)s@cke!f zu&5LR3kx^Hu_H%UegE-2mH`4l7776I4=A4jAb^-fMMbR?6&2U{`T04Di;FS7d-smv z9}_#nhfg0F40vuauzq?WdFI}`H9)l=fcPH}e*@xQFarPrh&d@K^?Z3*rHZVK4C9rn zml>8WUGeAd=eLYjYzG-_tmGJU)m6BU?z?F6?CY<23|Ig_05OY;iziy!I*L4h@q%H_ z>={1~A3B)v{Kn-M_M#t+)l{V!1#~PJg#LY&-G1oScc8UL(G36yAO==e7CmeVWR@|7Yv||GPc^f1b0-d!TwP1_mYuMkM_J0mQ(?#R)Wo zRT{|l0Ae1H7zZ;OP#GVC3J=eW9r;@S{y&`k|MAwE|8_DQXF$@(`T+unfrp2ifrA58 zj1y=8FAF~dD|M~d;8#|}|w^EYY4O0scK+J4xYz+VYffEu$fQgxbmyMf& z6-YBN0h2caqw^TZQ__WT;_wQB%1Q3P+JZxMHeC)uW zVEPX>fSH+z;p<MVvrQ%WKjNmOLO&DSe;I!K_yP1k zF!IpzhFpW!1=$D3dO71a-#b(0AH4`8J06_r0{{zj2*R^8j+p?eN$4_sRkQK>)u01n>X= zuqy)s7YYXoKkNbq0sH>}02coV00%cP03bRi0MyOV01yEA03Q{Uxu%W&lnE=cnXvj zVEF&{FN3uTH-ntCATZLT7_@o5F~o^JVPIn8Vff1cLJSN50mSqNXb>wC6C*31Aj2P4 zP6m;83=FdW_!$_uc^LjPb1*QzyUHNT{)K@-Qjft+`7eW)#BByfF$Hkq0|9^lV)^ys z7sKD5fBt-b^MQd`k%8egFnRp^!wC#aE(SJEafaMr8wNHWK5(Mt*5hRO^ZX*i+gE=W zU^xgNfLM0F{mcN&Ppd8zO>|eZW^qw4U|<(A;03xs4jA`5K+RkXpYPmcxO?s>!;xKk z|DQa0=G)1e5AOg2a68BVfB<4NW&$M=28MG$Hvt32N}8FW+|5SKHLIY2^ZPd@h6CGn z{M&o#{Kt#8A6|LJz_5b>qVXa$3o!r$5Zr*9K<-ay&IIN#JwXnZ?B9R?3BLaQZy!)- hClKGqmYo3t3;>|$G>$y${s;g7002ovPDHLkV1hde(X#*m literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C61_Services.png b/src/Ext/Images_Client_16/C61_Services.png new file mode 100644 index 0000000000000000000000000000000000000000..2a24b7e7f66caf39e3d97dcf4497be1de27acc3d GIT binary patch literal 1030 zcmV+h1o``kP)@_Mh+&7vdm1u z-=Ve}0c~evVuV-(1ONd9H2~y_zYH9_+zbMe;vh*rQ438oW>EWBB*|55vD7zZw2~{l&n_&c(pOz+f+KrzOI`@SA~I zoQJ_uUjgW227M=PUWPAUe=__As{j4t57@N;0mQ;5#&`U;zO?+0Pv3w4{r{JN{r8`L zd`6PO5>CoMcRmJ&#dikRC^J^pS6_DWaB_TNXJBId%gVyY&B4mdz5nH2fB<4#W3Boo zc!7&BgNh;p!#940|3I%WG69|VmksDIpu>TNGBAGt8U&1;e@qOFKw$>tk z*!cn=fS4aVez*Jfu4|44VxNS$)q$G7e*+ry85m-3ff4rv=!@q-8p!|sfq{|bH3P$s zTMXO!_Aq2r9C&j4)wd#m0Ae%;8h8$fgIE}sNVUY)nGPZvV z?_d69nBD#If5+Chd*3rKBmgCz0t66)IZzESkuX>R6VC8=TRQh5nDAr*H00a<|JkVxMAeIIiq$a`_BV{Mg#=xb^z#w7B@bf++ z!{0B!fD|)hU=&hg@U)lU5n^DBVn6}_0mKAy(+_AW<5U%P;WYz>3cobNgY{<_($fxo zZqC{N>C2Ue3=C4*4BFPljGBU60mudb1Q5dxAOXVL85s>9w}kxu|GxMC{$$nvCQJ;s zKtZF%z#tzX#CYb~1n2+%KTP@G>ZSh~7;N$|{Qv>PumDKR1LEZzEQOCtjsH(`5dJI1 zz_1P|BnC{848{zQKn8kh^44^<-z&qk{l`c0v8IYf(ot#1B#TU3o9lqHCtu71sH%P5f%X;U@6oqKk&IG zL7Ffe6sXl39Dv{T^ca9_FAuH)pevUzxkN^9S9 z7{(g_luD(j7aYf-TrNidTmYr+>1RySBmmS8p65}uTBTSl=C!t%?acHx5g`x=0Dn~e zx{omi%d!xSMny|tp;KUvh+vxLKR=8y1}XQ08|zGALI{CUsnnOOwT9<;C>D$D)J}Ew zpGql{f;0W(@gvpGhxeJc?G%y#9(I4?s3FNyQ6G{WeqKDwv6)Y`1 zgRKnI8}0~z!T|w#H$DF0<6h>(h{ZWPpY15M_Gwp3!7y>$&jWrbxbW%RmMtP7c{X%C zodrPqj<~xtUanL(zqoe5kRtlCYHx*uX4!Ey%NOgRZ9^WZ*2>$CqrKq3@JRp}0Qe2# WKRYiv&+%aZ0000rXJD& literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C63_Feather.png b/src/Ext/Images_Client_16/C63_Feather.png new file mode 100644 index 0000000000000000000000000000000000000000..1e58370422bdd5f9786b904201412e49b7ccacc5 GIT binary patch literal 589 zcmV-T0S2?Yhy;viH^2Ejpuq6VB&DAB2nAX1ZO-e4AY33PK1 zw9uhjNhtJ>Q$&ysi69hfX$Van(xiQPdEeKi4V8*Dx8HHc-4R-V)HI@GQUZX~bq|Qf zs0Ff0$z)yV`aJ?P2yq`m7*`iarJShOcL0QpYSmO-t~T`bJz$rT*4EVDcArSYI0I3r zd~#xus3i8eL_^7*`IG)72O@$vAGUH5pT-QiGB zsXU^&xgD8K69Alx@G~0a?STMrdYXd}J^*TAe;+q}KG|-!6F7fL@%Xw-rHEEmBmguc zeCqEf+vcVv-R}36X%6zvP8?*j@DC3+)Q%1XK$zn3ZK-KZax+40agn_Fy!<*b@eG{b zWr~8=ySo?~9ffMMH2?%Dk=O=+KSMevV3y0u+00D8>U2hoT8-~zGIDHc3Q~yA;CzS@ ziLBK13mc=#{5)OT+LEtCf{W;7@wX7O!EU=u0dK@ur8~a+5LV1!1q#V@*tPP z`0T7St5uCO?GB1Xe&wUQa5$vYwDgbVfQO{mi7yA~A b5n9AAPW#KyeSOUO00000NkvXXu0mjfW{nDw literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C64_Apple.png b/src/Ext/Images_Client_16/C64_Apple.png new file mode 100644 index 0000000000000000000000000000000000000000..b35f728bf55a94937f91b73b56d22975a45f70f6 GIT binary patch literal 825 zcmV-91IGM`P)T~-GBPGa66i3J1cMDpcGY>_x&MB@-~Ihs)C~4s2M&kBfe+_=4oRg_BQrBI zAL+VoWwTk65b_75^qXq6`Xhh{0G5`PzP!1)+1=mY{|e6p0gzZ+Tzp(C79SXf0mpHW zNF*>cH1yN@`ubb5v$HQbj#H}F>t9qV6|%d#tL_45sZ^4CdwY-4>GaLW$jJSPi3uK$ z$K#z&=icPxz{6HY(#5oYeENr@$qq-o}QY^%gf(emQ@i#Ael@;2!Y$% z+ZTt2htok2z;PThI5_x5Hkc>-4Qx(H7l#~+fb{nZw zigdeON-3qT>w;1Wr4&rljPm*Xx4N$1*NVj=03esky=xc-;_*01Bod@hC=gB4P%4$6 zX&N$_3@D|blmY;a#bOv37-|s^>=U|LMN(rTuR7!=e>z+~o z@O@u9J3D(iHa7M_6h#K-Tw{zO48wl*KvGH&LU<4azt(EC&nN&in@xFfap72&^}1=A zg)j^?&N;#`L=VIm>xop9QoYe=JiNNPYLaKfzOb^g@-!BUNhzh)yIBYUrBweTwr$sT zc6Q#JpPwiH0Vt)ka=H9oKA->k-~PGRd7gK9a&q!YCX=~6Iyz$d-C-`5Q?_kC0w6P) z%;!?dE8q8@n5OxvVHmIZzW=1%Za-|bT6U||0s#CCbjhPyn|Y^p00000NkvXXu0mjf DjBkXS literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C65_W.png b/src/Ext/Images_Client_16/C65_W.png new file mode 100644 index 0000000000000000000000000000000000000000..69dc825e6c3fbff3a8cf031aa8fbe4a1a51f176b GIT binary patch literal 409 zcmV;K0cQS*P)*O zACRFllFqS$W{5yX?9C8ZM1>ZRtx+1g{A1nDY_#6KXl=1H0*6~J@_1!-xX%!Ud-TkA#oD* zWFATi!;zvE@BAYMEsL7#*o$wnc7C#sWT>=b{ZaS_8OutuzjQ-300000NkvXXu0mjf D4zaQ3 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C66_Money.png b/src/Ext/Images_Client_16/C66_Money.png new file mode 100644 index 0000000000000000000000000000000000000000..e32ed5a480d486ebea7b0e5ea08ab0a7f563bafc GIT binary patch literal 381 zcmV-@0fPRCP)8q&H!LU%oF)X2uNj%^O4h465T2x7!N3ELx<800000NkvXXu0mjfhj^uX literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_16/C67_Certificate.png b/src/Ext/Images_Client_16/C67_Certificate.png new file mode 100644 index 0000000000000000000000000000000000000000..5494fb980c745c79745ab50cc3f6ffb98d67acd1 GIT binary patch literal 540 zcmV+%0^|LOP)&gBeV;vo&_UhP{oCU~6aTrL!;=+89fc8miBrbT@a-G6*SF|?`pA#>A8?B}5dKg*ALtJv72FWy_5)=A0000P)CG#Ng z1{9$|0t$XY6u_3fme-EgKX-;=4GJ5{n_FI;^Xbf)dxgsBbUHnEKN1nl3;y*B1Xx6?&c=@0s-DAQ?9mSz8W;woVO-hG}tdycyif&tE9RLb7H zedAe{u@#U$c*N5euL$daW4H_8xC`Gtf0d8#kGBKHlO@L=MuZT+9S87o*zsgpm0t$r z=YdbBQ!JDP`sUt&d>-lnv!(GRTVfvmIo$z;+3E@aidpy(a|Nd+rHnYt4l0s#O!q!GnB6;)_N;b!-XvGT2W;u0qjL>QMmZw5a zmFL%CTTMk#dQwTUQ0Qc4v0*-+@1F1PkNbYV?mzD9zOUc7nZrRzhHGx@rp$MN3m4FC=8tMyNO)s0C!-!R@*ZagnFDmf1Dj^#$jS^FnN zapFSaqGHnzbi~mB0N3ij-uutAzGy8BGi1Ri0MXV)Z9^~td^!Qp>n>6QOrXg+g-9ZO zjaT|C@pi6J;KFG>u#Y4&HjN6;tE=fO0Ufz1bLm@LFr;r_ZGJev*9HGuIYkbkQyL-e zHl_A@9ckvm;GnyEeX47(uL7DqmjbKhj?6guF*kyBmQJWxLCA;&&h4t%Wu2b=SS~1x2?(5A&L zH5;(|}c@+8B6hN$>I#DNQ+HH8H$(MM4ve#V zkfkbCB+9;3f?J6ZtP1E2tEqH$t@KI8fV6rY^*1!?`%UF#$BPeC#Y}qr;hihT;TlAw zQqvVJ)oDYd?CL^HjKR{Da=>&rG~K)=^hRK39ccg!6_9AnP{Q_P zs?&5-d@}OeXJIE)`@s60VkiLhO>Ed~ zu0tOZuEcsc?#^XRz5PSlKMPj9>FqATJDPMEPMx=13=Wslao@y!xMV-WM=*mC_h~`K zb7{NHGpRKepI~Q?LV43sdFZpmHIHHEMrYSez!IKNW8V(y(q=}WLY($hJh&6zoHa;V z6%~!mjNQ@%m^n|nP}^0`)ccuTQcPeF4$i9T4I~oVgfnHk7GB$EFt(nZ5Fvj!VL^0H z4Q-^>%}y%Ft6Z}`8W}VHR7&Sqg6aPLr&jfK^B0OYPf)J3#Xl^G{gmi;Y}nf<)||~Y z2LFj>R(Tu${zQs?%$&aJA^qnEUM8b=;?CWq(ssdwh$ecD`+B1806A3t{Zre5N57=5 z@S>fggoGc6>bR9SR)F>>r<_Q?Y&4QLf=6bd+=~vm9=R`*?oX$@R;R=8(JFJM zci!IaoM(VBv&SJ<{NjP??sz+DFSaLIQT(MCDcKePzX<5@VM)6-pv=HFN3(J<8N#FS<_nGFo@klErP>?DYRT zKDRWcrG1O>QxKe_P?ykvJJDf6vZmqjlL^)?H{ER+ABI&~aay1)&4o35CGoPpHP= zCge!uR_EpZe#RZj5^0)V{P|i{7Ae(DMqzvJ&#<(VJ!=(k>9cCsutzy@1^m|`#poSB zKj&0J&MR-@XV@`h&2J&AksnnSV*~fl!WUqvOL0bPSX|$5jqdfH}cnjcI|CD2008bVVc7c9*wL5!Zu6Q1P z)k9$zfoA80d5~A)1J^9z_vc_&(1{S7g!FD_x`5hZr~#bK$DYWgCZpqI6bd8ShP0C= zbX#n2cqcT1u$`~oWmOI>4bDDf+n9qqJn=iVCGunY#HdP;m%#}mu2jU$Js5kVs6EHm zqH<~1F!*m+n%@>rs?JlksR>mPXRd@pF5^7R;o78cN<>MNaGw^jYGf_-^OvlvlvbNY z{l74{8CYrzp?Ngd#y}X6D7t{IsSS0q2^usOo@wAxoR1*y_&OzhiR~5SD&N#?VFZEq zO3#XH2%9`#idHz*(Oq<;>`@CN%B~7mbRN7J#l5w;pW*W?BRGk``v9^Z+Ms#FR{QQh zZgdw(uz?#CLjO=?1&@OGn#v`TFL0tXlU2puT^c-y?VjFnwt}=$F{G6YJ-oEjQGA4< z9A)&rvVJPhvpdJo^y?Wj*Jp@ctn-EBPEYU!16+Jy#O2-O3I{PD8+nCbm!gR2{eDv0 z%MJ+t(NeEJ!u32Azjp87G&w|u1U06O*D}&i3B6Gj(;oP& zT=636X93cqRcHebE|!_HtN8rvGVeEIUb6X=^SBR(4jid~wW{kJ2{aI3Jo3+QeC&dV z`N6r{`4T8Hw?>V{6$OoPqo3yLE)x-Y&;6bSm6Z^80?WV3i6!9E*$}B;o?$ z_(%~ryV0;+gFPkWFx^;UR~oJ3QDf2)_$5a{lFj|FwRwewFfPZ0ifQUV z{Dh~_B_{>zLVlbEf8a9Qm2i~+eqEVD;YV~2#>G5P|5VR$1uz4+u?DkQF1ftI*6teT z*d~`TGGJhRo(y=9+dqtrtNdhrQ&v|>ke(3Ot!xkm1?x43-x69Gxr@-_V$RDxRSHt@LF_-jcIyZ;89;iQCg>p3=o))!_ z8r~hb^r=9A;XUE7W42?$99;GyN>3RyqB6A?2NfJPoyQ!LPX|cI$T^f^rC5;q{YxPu zRCGBL)5k{$1;K%CI>_Z=iyFXF$MHhyQ&;997}>jAbJ%JujlJ`vKYlDNioFst2y~)| zU5?DRx9x|`WM|z92PpG%Fsz?&7(D8* zM*Q@m-s5w8>`Y8@F&_e5 zT@rUJd$eC+|KX*@B{(yEe(Gg@21UZ4!z15G2?sQ}7ftN|M9vU`U2HGynnU-`@PW>{ zPHD5xcC%%dfx2)3_wC(oLA52jDfy^caeY+LfV2`IcT7pLYSd1_vjjR_ zm!oB5_Nd0`k(2hM&~hwtUwXnel?f4FC>)5`|5T% z-c)^8vqs>eWP`P^?2)vMH}ysG?pnD)RN+W40(=k`8Z0_NeXv(Me+oM$I7U z^6_u(Ax>WvOi%LXLpn4yU>QOwBAvV_=nfgNx*2Km;9n-E)@9x{)YT<3w@m;93fN@Q W5Qe&ay+K#!0RFx~>u>t7kNy`k_&F&6 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C01_Package_Network.png b/src/Ext/Images_Client_HighRes/C01_Package_Network.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f28c4777f5c7c4a0a06f2f32ad07a64e712ca4 GIT binary patch literal 5597 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C02_MessageBox_Warning.png b/src/Ext/Images_Client_HighRes/C02_MessageBox_Warning.png new file mode 100644 index 0000000000000000000000000000000000000000..b11a7b6a4f1825e1e2a22a7719165872d4f7cf48 GIT binary patch literal 3259 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C04_Klipper.png b/src/Ext/Images_Client_HighRes/C04_Klipper.png new file mode 100644 index 0000000000000000000000000000000000000000..87ff9a139772a125d7379881b60672c68811b261 GIT binary patch literal 3248 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 U*&RZ|M+_AB?T*d&{W!<}4@@tvng9R* literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C06_KCMDF.png b/src/Ext/Images_Client_HighRes/C06_KCMDF.png new file mode 100644 index 0000000000000000000000000000000000000000..ed1c867fe0d8ebd426aca6f6f78640b6c0733342 GIT binary patch literal 3346 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C07_Kate.png b/src/Ext/Images_Client_HighRes/C07_Kate.png new file mode 100644 index 0000000000000000000000000000000000000000..36459cf4319924dddbc7886460ba1f4575c11b3b GIT binary patch literal 4979 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C08_Socket.png b/src/Ext/Images_Client_HighRes/C08_Socket.png new file mode 100644 index 0000000000000000000000000000000000000000..1bacbaae01c1e97831372c493c03103926a883db GIT binary patch literal 5395 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C09_Identity.png b/src/Ext/Images_Client_HighRes/C09_Identity.png new file mode 100644 index 0000000000000000000000000000000000000000..e21451fc736c438b8573aced52a398ed8cd8eb89 GIT binary patch literal 3024 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 b0eIPM+Hbn`U##XM1@QZ2x6i|^jI93!3k_fL literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C11_Camera.png b/src/Ext/Images_Client_HighRes/C11_Camera.png new file mode 100644 index 0000000000000000000000000000000000000000..68046fae4e0e39f3c307dc800b15ba06ad158490 GIT binary patch literal 3094 zcmZ{m`$N*#8^=Ff{DANgG)*B*@shVp30hW$fR(qh$hEY#6fw1{V)-p=Dj<`!v=RD{9bk1|m^M2m1eAdno3(N`( z000(Yp<5$Ok^JvKgQhtOzL0AQ$RuV2698^#{LKnROnYM5w&=7kQxelo$DK$3mE3(if&*&-$mte7u{Udf#1sF@>Q&P1+1t zGQ^4kXb84N?N&|a8Dxf~#qZu4jXW`Ft+_eT4hHKywtF`SCMT~4C3NQ5K%SwUJN7I< zRO%OtpiLg71q4haxx0Vgtl;xmV(zUX1X^|>0@t|7o%G4r9NQe&w;`1?kSXsLb`GvJ4&6qjQei8# z9o%=*`$TryDk|ZJ9`Ym>P0g5}bgVO?q8*34SSl`e5{NG;6_iE+?;DySdRB(;2P_3g z_{VgF9x=N3*W{ufwaYhA)OgwntD8~Y0QR4<&eOt?mc0nQzSkWDr=f{A_d+mU?(E2g z&Pl^k6ltk&;ME^}U0nykhg-VI>ZjR3<-$vs;%0v~gOdCz;=261lMao1h|4R4;>lG1 zxc-5G#0^>c4Z`1kTPGBWK=rMpIYP|6vna@oeRjUBRese~3lwC!%ZCl{Elba1gGE(F z0x?Fp_-Jz4U=I>g*MRPcdqFQRb9Q!Om)T$=07K5Hnt43wn`WMtWiy?`YAuolvzLF zNXi78%T*-Jf1V9c|5B^z`sSGjt(sc_;VyS{zIn5-mrx|z?4KtmjRzC~XlnA18+ z?1^ubOK?aND}Qeba(40oP8=iruqA4seM;Q3cE@>{%uIUBk&{px!5eg&^_uKu$_6(m%kluBz6zq=9XO4c{ zExPm+%2v{|lL0q;CYYU58!i|a`08%};isjP{t{5(@WFkX=hf#7Y1 zHalE-1KPovW_x6JyP_xz;3n%wAMl+1lE)msdZDDHqobsyvooI=6>p|~8-ge5;olO| zW-L_a3kwSq&{%9dJ1Ge@wm3WHF9j1KvjVfg%r#kZp^;MOdSPLpf*kW2b+T( zJu2NYg-+QyIe34&=ns|4q>+~_hy2KIvpM5lioAR9%T9b+PO?s0)l9Hi{*|C|0f|En z)tW;9(h_?o4Bh?ByzV2G{4ooWYf~ozMgHL$VbJ2pr8Y>V$L;{ds{K)LDXORcf10b> z31Sn1I;zf{YiSP)4TZjGb@5o`?!I0gXe;uIeS@I2=URoD?syx;82S9L6t8+eEZF35 zGVQH8*Pn522h?mNQ#Bo7Yrna3!YbPC8tkmzURd}$Lio!M{$18iguu*n%uFkSeUyRz zkqrB)T&dg)&5hFp9DjYMz|&}F?h{a2K|EB42di<+$3w-SCc=y zxK~kKqXeYlH~gp9zHTh9R@PKHyHYO*WK(#B`6nCc9Xhabb)F4Y{&)mW1{(yYXz`5S z%B@bpke27JbkRXyUtg|OUYSzLKdiU!dK?P{{pq5rOG=bd?x4og58cyt^*w(usb7c( zy$%z(Rv542(%l8otbQ(+3%hUJLVJ+6Y`e+8a(Z`=HsVy*gA>7-mbH?3Q!7`U9~d4+ z?AKfOaK9B*I~9k;!e23!8OnYJ@YSK7UfAIc6bjou2Z1KJhkH{bXXF@=reoONym?dj zqw&-5F81x5%Qm7c))jYOUl_FDH>nG}t+NYt=$35l5i0N`zGnf9l?2*6exxA+qn5tD z$%^^hxs;ac+DDHZxch^_eJ>UuZ|@_j8r`afZ4X;o%%6QXYAadUCm0m>U&PSvAdr@3 z5#}tNKo4xXUbBLs&Jl*LU{9)S7;S0qLGUc#%T zc=gzGKVnQE53@7S#bvMyQ)rcp!eXfk@;oG76LaXexJ+yk)d!Bvo^j#X$Qv>DvUS6< zwcY$9FB?xM!?xGpRgXTGGDAY_dNz|04+WH=T>J#z;`gZjj-3$^D;*Ff4^xF2<-z3= zi9^Gw;M1!aK+yqlb~uVfiQ^0c!BbIe>mXp8W3ku5f|=_0Qse0fat31W*1qOUk?t4g z>iM^eQKAc~Uu$b>mI?3Pwe6as{~ZZ;ZJ033j-{~KX!tu`d;`Mtg2_8SO&0)L=B$LZ zwVn;p+dw%BybrId%hY`^C%ZNC$3!OE7Hs##;c(z8*LZN>KGv5*9^bolfHV5#+$X|{ z3hUk!hW3W30)oP5fVTi?cAt>^X0ye$Rk0K_b~{yGnkHZO*TaWx^6S?TI~_?hNi9-A zM}MFTG1*S^EVfM%32!i%EYh&#q3TJ6)f?IWLok5dz2#tuw!VG^WWo^Srg4vFiGG^D zLysO7yd)nx<^m0O zRv^C?|MKy?Lx+T7q(3|1RGjwffkt3P;U=uF$2A0pd_+2Dn6zfo2DDo92sSp|{IDF^ zfTk#uVMyV=*mZW|Jh2zqoU!1eNMCxuK6J=py}gr(Kin@57UVD6#lM(+@#1=N@jUT% z@@x19S2{A+O~agjWY#Wl!2Mi8&q#l$I61tR{kr7=`}jwT)yV*7?p% z_HI5LykdxqSl?Yq`S9W-X3rqv=suV{#I2<; zfaM6A&94f~#HG!AO{&61mxaM-N6ma?j9J*R`DJ@P^9$lx_uw5VCds38Ze)PHjPY+8cR-8;tt^e}`#?y`Ddcvp>lc+V~gqlKk^($X_<*Vm6oCJDa zf9)3awz%#Og#>?+6wNHmm0u^etDhcDF0Qjl{fW6L(Ed zZbC^SL5?fwd&C#EsF8BebEpb2Wkza(Su!+VtgZ7_qFN{T(%k*Rm~{ZJ+S*&b`+bV3 pUN>|njl$rEG}=iI&b+UFb;tO_>Jv(N(o zz#ueaS)}gd{C#1zC zazeMqZb^(xj7`Yi(UiCp09XZ~%lJ`yI^*s+IyPX;DJ`Q;JHx-LUHxzt%53yb5+=0A zCnS)bHKQJU&QoZumJ)KGGN3d_D1&C^J$wB07n(+6NOTzz9TXWk%*u*h#8EfvJrdTh zCtUkmZK>0f-XyWMWq9a)MB&|{A_#SjAlAP{cSUNoGZ*N6y8++f^X3eIWE9K5+`;8b zm~D|ny%&}_SLSb7sLZu`+VGgNdr{XVt@bYFxJ33&T3K)d9d(w?ActqkuFl{~M<;mo zT3df~>m7WNwYg9>Wbq~VkK*h- zDk*%@lp#we|MbS7ZyWsLAbyhO;J|AS6yx6=jFeFCFX)#I_|`1=t&$6U`abzqzrOq1 z5PL@Z;~{WcKZ+BESI4zAXxgkyMRF#W9Fwe;-PX%|3Q{8>@+aZmi`bzf!Bv|cf#Q+A1wI)onJJ zZnjV$uZ64^>h}-Fs024)ACXDpk)pvtI#*4)#6KF`M?=!7Fz>V29J#WW&?6k`F&ps8 z-i5@gWc1ij65uoQSKC!O$D(mQsd*Pv?Jby2%`AXOMsE^hV>3MxiOMmwz@79{ss0ML zYrVbnqS8`Ma35fej2g*1)Ns}G1L`=-#h(kltxNu*6|du%N?$Vf33&ealkA{J-ssmf zSpmxaK2*Eg=or@nB)!s zf{b2Z;8or5n6tlz&P(T@APRVFMk=>C3K;YWH{y*Kzs7Y@pIx$_nfddRnCW-eT1jJd zy2r&S9Iucwx7i9>4EyCvP{uW2z?Yoa6-a#S4t!2itglmXC=E_3V;4vs3>O{)UgfLM zyHG}dj8G(rBa4pO3Q`>e?hMht2?`3Hfiivue0Lj|Gv}f^&j}3?D(BG?P63LUYZMff z<_7eW9~jk%1(=J9nVP`8xJ?LvN?oz+4eL@HZp%8+zVK z@zU5~>t0H6E!!H~>W0~E1HCTWh=Oc2Hq!3aGRYW4^Lj*kVEQMZh_;3Bot(L!T|aCV z<>TRLIt^#{48>#v2Y3x{SFV%f{KKY-Q(+b-ZTCAxX{E;$n2g7-8~P4#(fJ zzvqS+o2~H=LCP58d6t43G{Muc?$(R=DD2I(Ek$xN3A9_q#*dO-DA2D~(1Hc8XI;I9eTzME{|kJj?9=zCmTw zZ4h;KeCSQE)c;0|WIP{!(L%}zf<@!{7!ZdqJhu-woH9sAqnJqui?3QSOk6d_7qR+P zL++~QdXAK$(WS(jdaQR|51ppBi(p%+riNL?q%3Rymh_3Q+oj#;h*EP3t}=+mw`Q(g z%kFZY%dWujuW-LWw9yJa_ZF=92F3SU!IWVC#_QcTV#Jh3nRbfG%?3p!p{fVH5UgRU z)b|bgUn)_?58#U$)Zu1MWMq*_ut@JeETWG3@&vF_Ow?CG53k`zdDzvxK|#BOMw?-$ z3z0;pU-}B{x3ly9x!0tKZMBgyR7KRS&E@}_(Gtrk{t95Y=Jze!_LoS$U%me_gY%4W zz-4|v@ag`HesKa?4bt!Fs~lmsyEnDa$~oyLC3x&?uBjvbwG-BX#w0m;myo&<@p*36 z{#giL*}rbxJfb6981fgeU>@m(swX;D*g?Klu?Qcq!czom&f&Cv?8}DVJ*|AiHiIHl z`8KS)mEJ%ES%(Z-GGWJn8MMz_?X`eyFUeJ9L+w>UQqB39nSb=dzHyX3)05-06A8t| z#@NyAi1dz+Ca_y&(xnt%L|aoyahoszata9I3FVM}93pT>4+S|nc@yRig4DT-LhY!N_vv9CRx&rq@sau5rgk{qjJ4=p*gceqevVDp2xsXlb^#fd4$B6q zf^#)o(pJ@)0GmYsLN(_?Dt$FbM56or0jm2iJ4UI)pY5cyZ{Mu+oR zpW@UCkDSwB=gz|9(5uO)XSO-KbFM&tW7a5hs8rT2H2bSN%;R#2q#1IK z(5_>ilhZoE7}?Q~{^=I#v0c{IGi@lmLSy}pLghFSP$K6(CCj}5E=3>4p+6SNZ^q^B zK}qI+8WTxK2(R(MHQZ1;!$s?EMDaaq`MX!~ef6&Fgf$W)sdLC0-f)e5c zSIvt{J@J&~(Pl%>YqrsCu_Rob=QHT8VG{3fYDcQz7t?-I`T0d9s14@D8iHRO(qY&I z`Cez8F1kyvc!hb*mmQ$Jq>r3pX)rA+v5`EV!xT(070zEMFW2S?cf-VFv6AOG_4l8L zU#I=g1a71?K6LlOThQM#oM_UekSc%c3^UqQsQ@VbMYqD*A)Z9rBPi@_Muh ziQetG6zQF#F$b#llPj_wShYf#_c)3Y(33eJ0z)ifr>I$u4LqW6%&cEJKmC}F4J??- z5ggX55FoRx!jvkHmPTsoTRbNct==M>8y1$))5#Q-P!$<%$jeIqSx@u-LeGA|f7<^) z{JW1)4ART%`E5Z1Q)_3_FR5|l=PX#@W&RyspcRWUpg6Y3LX22v#R9eY$7l6b#)P<% z+hc!#Mkvwy-B5O!w9}pG;*SL!JQ#X+Nt6ec`ZKV_OfuG7z<* z(Ak2wl+@L3F0LMXva|6vColggc)$gAIzJd82%eFw%RqMs9^a!olIGQ5IromUckj&l>=c-LX4u3VYvv06`{w zXIw)VJo!-^L5$!v*0B89Z;VF23ETFw*qzy={t~Uw8<)=JrzXVRL=Mrw4{LP7OtJ_^ z&iFacNDw)?eUCtS>fi@U0qA0?$8UN&Uy;~IZJHo#Sn@U2hL)bO6se?L&Jkt=&=vr!vOwtyI5txY;QoM0(-7wizEPI+52O? zt++2YX&H$Ne~j34Ku%dyUJYa(ns=KQwYDe z6$V3ITM>&sa?YT!yhTWP+2xHt?R~FW<;}Ctrb2-m^C@!?>|*2ugM9(`Wj{To>0jVC zi4MwR9ZInoo;3dlr}W;IHyZa13bN|AO;7mJ^45O9%g1&B*-78eR$s z7`m!^Ja9u0sVmy;mg_tZ^CL6jxgNe0x1;1yKD_Q{&JK;d&Q@^MQuNGM82oOQ;^X7o z&RwS{XZ)`16WIWdkU1eo!Dm@5hKk*5T$OKLv)7#T!b1J#G_$wY%h$Ef3K^*ZR>HF;M(;rJjb|IZ-mnQ?z)5RIDp?cl)fXIeK9<-YdI(uxh=LBR@ zje6rj?@(Bzh=L#JTK)mh$w_E9V@CH1u@xO)$fKtXEQI+{HZid#hL+qn7ixDMevKrJ zg86^s=H`(kL@u!x$X7YdZfS)L69teT#>SzCLdltd;ewbLHA%`bA1HA1q}Q znFu<+fj5UPEivO@(dl8SgEQaWN7yl$Z3)7$A1<12&RTzoI#*|6dggO~JwORsa;Dlg zYgSUy`Yag*n<%hM-Z$>=$a`|1Y!*WAmW|RY9+8uJW6%g~;6-s#f*1K+!DiueaBXU> zVlhh>VK{6!oV;}(aIrM#oC9K3MtpXROr!rSJ#F&3j};F{oyOigrgssQ-tuE$4K>>H zAl?qV@;-jfnjV8CYZqw3vi zcd}W8bIR?xx{f57^obctggp6Kv* zZv11vTpu4Lenq2Iian$q_P(8>=pVf!GCcYOCn^kZ35^U6qii|M z*%!7wj1wAn^hKB>0O;3jadYvF{V#YPMd=bI4gjV0ZBBqLgG)ecZEtK&gGN~tC0>f2 z?We==b~=ej<%yE0LZZDLcQ-&bdFg>Rji8=WKxr2VACnX%}`Q^*)k6i8C)CquT za?pyh2pep42haBh?gR`Qx-|+jc8D3fg95fo{L@{6SlRL)4Mi~FNHr%mW_Y3G?j~zz zUhK^5i>V@VB)IKa(+hFwqJDuEdZ$~^%18tyNHlG4*9Heql?hrfV zOVnB49l32~zG1Ql%uwd8Z=t%2W@^OZnF4{}qQ;FevMiyRL`qKNaAL=W`SLoCT|&zY zGA*K@T)tXg!lRk4j0Hm9uBCidm$J?}{yzt?pc6&o^gpO>QA<=-wCAtQk2tw{${MbG z$WZ8KU1)pfpHZ8}9|vtpv;J`D)x6W&wL&CZ%lK-^UYwxS$Kp&!kJ`CD|JK=1os8}Z zmw1Aq2^gX;e3d`Fv`v*9Ddv1=#+#`TkyjGFhBRMVX?CcE+30&VoV4G5_onqusPjJ#TUL2$I;pu5fyci~@q z0*KhyFrrk7CHn6Ci|Fs~Pa5iolTxTu^*&2l;@o6`{O#>lxV5O7z5l?v7u|A2iW%*z z33RHPCA_h45nPQT>iksvJ^K*slbO~WI*ckeNPf|27M!Jjhos4hsj#6}a+p7DrteBu zb@eyQPOnWm5quyeflod-$s(Bxd9^*TSTF6z^eP?Usfd&CrLUUszyJ2YDJfO(zLr3C zd->tDvezvB^}|iwgM-qM!H-6`y?dQ;NlB}Oc84C@R#i-0yZ*#2&Bg8Kdg%i6wXxc< zWft8o(}YGj(m>nL&tv|gqex>Gjb^dZA89@K)b?ldsSkQ$>2AWYwG5z!b~L4wD2Ytc z67t??G9Vs}TYTlw+*OaV^^}beov0{9MB!5o*Dqe;? zt-aj66fe#)&NIm4Pg@tS2DjQc$4SH!J=T&HF-gLmPC2Ce1+nWBMp5(tNx~X4IDfenFSyjc3bXvU4J?KE)CFV+$?wq-ILU)tsDE&Wm#!VK1+8 zcwk@@W<5^~v5y^blpXbiA0MHI+9$DXT+_#WaCYg#><||n=yr_AuBlkY49|#9Azg8G zsZ?`2w&9DQ$5R}fz2HvKPqn2IVO%17=zUURRUgV*mrDaN>hGY;@bo3Q$K8G1nEjs~ zlVLr*bMTutwu}Sr?0yd(@dvGqZE@;jU`YHCpC)vK3XHf_p~e<-Pjty#}Q z*7^DFSV><0=|{TpX9)3ve|F>EWM3^itOI(pggG&QxpptleHEmw1~Ms9CI;mg#U?&m(rzT)DVX6t_3U~ zJc9`Vlx=xGkbSDEX>AvV&y9ccrqXC07ytdY>fFhbOOWUp;^${`*yyG(;p50ITZBdf zLl_JC7c63L*TXJ1H^c4O<0M*PMUzUUKuGX9d*hy-4Wwk~R1tyfY+Dr@UtrduBuPrj z#I^G#NIJ$NT4W$em%#8VKN}=(4}wUS0p~T4m^F||L=EQrpx;)H(pmy>d z5B}B?gxi^!BY07wy}!kn-8c`vqi1(LN04L%9P{dY&M@&aYkeIB?tA6p@$N1o5$BPC zqwsUDGE^n$oSz=mq9}~6Wh<46R)D&_#%|diZETbUQUcT|`EThKe+c&L;<5x+PS@6o zZZ3mEX|%!4ghl<`Mhx#`$mXq@V9156n%df2Ge<|}E+3!dS(P5@pbEvOi}ERJAv$Q> zy&P75_0N8qMZ!j;s?9FUU+d@Vf|}R9YU&gN0`PX|^S4$O4{s+^f;37aqzgw)(7Ech z(@4hB5N08;5F>)`-@1j>!G?$LWfymZR>X~)m9{SgzG|4VUBoZC2L`0w-@Y9%qfkn< z@-i+d&^bTtj&h)=VQ$h1sSE_C^a~y1TDbi(8}{rs>{yWv_ZSVF)4IXH zdw@@`Rr9x)j=bksA|OUTBTr{KG#&<3+2}l&S)&Z#e%nP)ngE%K&MG?Kb>Yz zIb-5bH!?l?Hi?n+Mby_?U#~+Y?uDR!i&Crj%yU^PNi>B-(ORd|hZ*a?4t{*)ojlLR zF1kwQU;mW_Uf9YuBY3!rqLp8pPq06IS%|EzBUMzi3%>IN!C%m434}AoPVoaRy$xjk z7A;>Q0$uH)3v?27qDSbWz0AA2uE>>&DV2OX;o`H6j6*hTsDhQsLh;GhFE!eY!7rTq zEb+}{78XtHkX{|?{YszU|9f-$q*+}@l8udx6Bxc(wBo)ZJp3zrdV2H^8Kv$mxqQs6XxY-mwrR5 z5~jdBsVQXn#E&uOjB%=gvNv*spB}SP<_tudXY*&sr4R04UT%tFloi(`O>|WYV)$EW z0jfs$Ej5oLS)7Vw1%^qx85PdqI8Q4TbG3&)m;&bkd?~eBJA2ZB;W31v_3dMOA}Qmk z4<7=^`j3KHa>^%0U?5c#qfbLz*Md+VtyKO2%w7;gd5^g@_r-c|75)crW^5f2P^H#$ zTTG1C_S_o9z-wYW?(P!K#XLS6+#`%s-QCBN=nq~vR(lRqsbsrV`Juk>rz z5ac@wxQ;m?=c6#6JW}BA-~ZVy&U@*8_s|*0q)aDsEpS!OL9m62^MBEqJlX@vT3Q)% zC~*E=g7B_iiLJ3c7j7fWfW>Sy<)jbu0QNg?31PF!Mzz!gF;CepS)xB^-}behe%#9H zewnT9_6}p?2r=9UWbe|z?c8Z6yzNbgoJNfE@X>tJ1Z*_CRC02mkw9?|eZm+o>is91 zAHMilRFvs<-wVB%@Uboip#xKn^8z|!bo*=c#r~Cw`I(T?k0pDZ)RvcA=6b8J>P6u5 zD=JpouTuzOCeWo%3eJePyAX&41GjFizk({0!eni2;HAaEVjY_+kf#PJjp^Ko#TWRc4^U)bb%i2dMinA+kE)(s;mS86u1>rRsVH{Av?nHnrR#n_h} z>=Q=~{cY4!7awD`4&iV8%o2NEJpQev7Yz)Y7wZjbmcETLCN`sjS?5#_8naIQr7R@{ zvqi*oKhv2obp+T`>~Q@BCgQ6P``m79#Fx*E6ONmmtW@^IGY#kKvgmNvbIojmX$Q_a z{QAb90+sdL_9S6SEq4_#1ff7o;zl>A;Nsh*?6WJhsrR0%>^tcJ@Z+M@&1Dev9hPtY zVVh9P&`Xr3F$(MZ!+q{XgVDA}lsK^Hn1~!VX$O zSiJ-D{wCgVndnK6T=GfGh|{9JF6@prVgT}HsDl63U$oMKKVhpe(NbHgxV|fd!`Y<) zL9RGm<%rxG*+CDLeelD4O|@iX97Q5JDtdL09g7(m(=`KRgR(Au0cqz>ll_!uYM0!} zg67MSv7Ny0G4SjcFge+by~la6sTPCQ#}9g$A)0K?Ae0E2As?KRlfFoj$G`Z7wf}i+ z1NY~DuI$m+XSh7x?wX`PwqE7YUQFrn_}soqOx{yfL9+xfaFF1XGz$d&&405}HeSLn zI5*Q;n1q?E@8j#B8pR&vm{Z+kv2zWfG=ry@#U1J5a=DiX(@@UO z;35vJ1g^>=`7=;kAaL9d{hV?}n4*18w43}~6{j5` zyNBK9tDzCV&GV@d=*loP2mj`wO1qCSDw^2o2zZ40Rr=FKp%fFcG? Y@oSA6M_sB_KYqZLjb3i|H?ULw2W~np@&Et; literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C14_Laptop_Power.png b/src/Ext/Images_Client_HighRes/C14_Laptop_Power.png new file mode 100644 index 0000000000000000000000000000000000000000..4a37878918a0a6ebb3c85f38233adec70aadae1e GIT binary patch literal 3855 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C16_Mozilla_Firebird.png b/src/Ext/Images_Client_HighRes/C16_Mozilla_Firebird.png new file mode 100644 index 0000000000000000000000000000000000000000..1fae5e7c2cc62e9060782cba2931225ab7e02ee2 GIT binary patch literal 6066 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 M-nr%eFRau52OUXd`2YX_ literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C17_CDROM_Unmount.png b/src/Ext/Images_Client_HighRes/C17_CDROM_Unmount.png new file mode 100644 index 0000000000000000000000000000000000000000..1b0a5033936cbaf4ef611169e7fd6344deee82e8 GIT binary patch literal 4058 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C18_Display.png b/src/Ext/Images_Client_HighRes/C18_Display.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9ab9e1303e9877705376381fd92e4d0d8630ae GIT binary patch literal 3071 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C19_Mail_Generic.png b/src/Ext/Images_Client_HighRes/C19_Mail_Generic.png new file mode 100644 index 0000000000000000000000000000000000000000..79699c828dda5fbdec9fcc470c37ebd59c17a7a1 GIT binary patch literal 4286 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 CR}Q)W literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C20_Misc.png b/src/Ext/Images_Client_HighRes/C20_Misc.png new file mode 100644 index 0000000000000000000000000000000000000000..0c17cd9a592e0fe08f90d755c2dbeb33162fe452 GIT binary patch literal 5083 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C21_KOrganizer.png b/src/Ext/Images_Client_HighRes/C21_KOrganizer.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa37ad2594ae421f592e8b99fe25b245eac1fdb GIT binary patch literal 6476 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C23_Icons.png b/src/Ext/Images_Client_HighRes/C23_Icons.png new file mode 100644 index 0000000000000000000000000000000000000000..5aaece3e8c781435fcd5bbb880b44a5611f6a79b GIT binary patch literal 2461 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C25_Folder_Mail.png b/src/Ext/Images_Client_HighRes/C25_Folder_Mail.png new file mode 100644 index 0000000000000000000000000000000000000000..23365a12a65878b1d595a0941025b97cdf2b2fb6 GIT binary patch literal 4733 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 L;Et!;shR%+fv)5t literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C26_FileSave.png b/src/Ext/Images_Client_HighRes/C26_FileSave.png new file mode 100644 index 0000000000000000000000000000000000000000..0006ad4294a8dd60c25eeea085684aaa46253f39 GIT binary patch literal 2627 zcmYjTYgAKL7QV?1c|ah6poADmAP7{cBtR=Da1(+76cJL?)KUl#9-=O&r51eUCSVdU z%F88C86Fm=v@$kOAGMv5KzIa=LMwH!+5#$y_=*S$a><=AYt5SZan9ant$p^|=iBGo z>nlr4h;g)M*aHCI7#ABYwps4-BI0fPPV9o(W^g%ztpWh}-n8DX{E6-CUbsn8_)&g# z;g{+AvjBlCKO>7Bw=X>>OPrN1EBPu=mA-p;r4`4s{L2zm#BBM{mWkjqD6oJ*)0uCk*l zH{_+FcMO@>xio0HW|_RRQML2ulXeJ-@NoW@oX>2*V2QPayuLr%&)wRib?^O=PLKR$ zX<&SHag#utqEVbEIX>|+t+^bf#vowvBUULTTj6V?1rdZA@D@9g(;5mK=SB4zrmL`c*`uAlsVc~E!6t!P7uN!zh3$>}~w)#-Y>3q6- za){QwPT@6c<)mQO0z~%8lye@Tn_G4>rwXNvtmwGwmPEBLrr?>8S^lgHm1HO}6N1oH z->IrdF0p$JK&IV6_!udPDqViYMtmK8{2ZA^^C9tsnd1;GNs*hKyA?A-q=8Y6 zM5J$$Br1C1uq`s44+<1^>!{5`Kol&2iOv>-?-7=A7Hr zYs&AsYyIjf?JoVEtj(BRY4oW@y#duYCBNxL)hu`*mFI^L2%fo*Fs6! zHjcG1PkDaO&cUN{lh#~W***Djw$CMYjMeW{2kKRfofb&!NGJFCid@4);q}Ya_<21H z2QF-?H>e(HdH#!m9B;~mc~mlkhUpG4@gf2oOW;Ax% zYAxCBUfF}a7qp~q^Lcg0p2{z(8HS3;Tc!&)+2*)Z`Drt+`#5S^ZSB(t=L7;uvq zI8YTl0kxjIA%Cd4ClA=$mP%g??4*YjFRec7izl)h;)o-sj;+YDG`dwT(WdHI`XrCC zniJQ-#1HlcXzX7?9P!W#C~u~(b{WJRmkiZy6<1xdSv6$1ym0kM6a7@5oQK2=8i*fm z9s(I9X7pEvY`hE4G0qL_HT=b)>Fyv+0!h{11boGbiLreAk9Tz0_(%$XqrSN9Ps`K5 z=J}ZuitbOJa)i5GImRKVed^|F1{V}Q9;j#{htaHDroOw+FhDXJ^j1y=GcT}RUH1KQ z=}1J-!>Q688<AUWgr(`Dn2aQ)a-dEye+ zpNGZ7ijQrqy5jl{-10r@ynA+iqGi4A8sB?VvloH%JC@A$iidqRL zN$V1*_=DxgoU7d`gM!<6nm`(eqdIiq|HyCk!L5D77qawn%qJfPpze*~ONL=RcB(!t zfc%>auz2zbagcA|B{*R0)uLoXrhg&UXD0b~NvMn*acSF^j^^jhWOE;BWB~ib^tDz-{j~){WZ#(6Cdac#|oby$owA1z9{Ea*Ftrg@CJD^!(!3 zTy!3jJg>Hstl=qY?2_V$uAttF2i)vU(URNcFwf$UBr!~5e0`BP8~rR!=aHDeV|4a| zTK!SXnO{&8dv``oN6by2$521p@7)UjoBTpDyg6v4lw8okFBhMF*>>(v$oq`T@}$aN zhfTF#ikZF0_ne=Zb2CDs*bz7NQM+9;E9kqLyZ0YZRWx-4QNNnQ%oXd8pxp-hcC)|} zSj{;-*5(O6j=;{5_&~>az$W*qH7k7(x4P)A!wXIqOwHh(*oE=+R5XJ<{2BQ6S(h9o zy#f5Vw9mmULAUd@7H6tt@a^NkaBw`tnGNd>jt{&|dz(6TXtnWtkI^!-;;bV|3n`>% zUE<;dc+pDFf@a-=MS!}N)%a00s#?{2uYx22i571$eG7|yBM>Rzr$)-}N zSyH#f0Rw*Ti99ZvDSaHpxQzSla6CkRlQ7z6xqs)IO+T8kM0R-1VfllF`K$J_?KoF@ z%PSLZnuFjUU53)i>Mt61I$^fTGUoeC*9|7KeZpcuJXM=g)phvIk literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C27_NFS_Unmount.png b/src/Ext/Images_Client_HighRes/C27_NFS_Unmount.png new file mode 100644 index 0000000000000000000000000000000000000000..20cd06b21153ab0f980cfda94bba7cca1af0fde2 GIT binary patch literal 3021 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C28_Message.png b/src/Ext/Images_Client_HighRes/C28_Message.png new file mode 100644 index 0000000000000000000000000000000000000000..746e915c7e6e06e376eaefd0fc22b90ef949912b GIT binary patch literal 3816 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 S9M!63V3XIj4L3cw$^QrX+VgM# literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C30_Konsole.png b/src/Ext/Images_Client_HighRes/C30_Konsole.png new file mode 100644 index 0000000000000000000000000000000000000000..aad1041b65d8e1330c33a4f4894c63931079f3b3 GIT binary patch literal 3180 zcmX9>dpMM7AAa9?=g7;9oJI}CnVK?8A}KS*In_kj*}k^#H5e*#h>|5UMnh7jZIaaH zR91(tCbTO_!?31O4r>b?jN_+BBWqEZZ}$5Bc%I+&{PSG*bzk@4c}{b72I%Rm)&T%O zFDTGAR6FVaEId}be}`Jk)edwFYX=Je?kU|d`5&}rvlKsWN>~Cv<#4td8i(kzS%!7J+7G0 z%tu{$4s_#;aU}|UcWAg}aIh)!#LC$0>u4O&{HkX8+dPrk>3!@U?-S?ZnTil0fM zr#&2SX-uEYZ?E|CV3RBU%dBhOnKLucjb7n`4ijkJ3WOY`g>;0#``^BWAL(D?$HpFtBpDdk zdrD&o@0)&X?;6>=zctK4bpx^`bl(N%TuDPBHi- z3)e9ugBvry>5J!?y9A6akW3o@*0arh(<5 z2B8%$tl({A08f?jjKX~cqnedPg?euCJ7iiD5EkIdg7k7&$Ampzu%dSf+klyNs;khY z3M5`~z&VwfuUT4r4$uy}cmeqa#X~BNRnL7TISPx{2(hd1qN%TQlcrqQ7B>syGZxfB z;i*%Yr{#En#KaQ;cJ^t52s0&>a~ zODctY&B6>s3kastUCPq|s(^lh)B(vk%y~d*aQX6O`2G9$@S9)bBV!L8;;BYQ(d}qj zIJsO1?#yN`mkQ6FoL||hxYSu{wz6ANN{)DnTaN`$_&*^PAAmNNXasEhILJ*#wE?E4 zrm{Ta2$G2jKW+J|8<%3Vj;b~+hM88&*ojyUKo?N-;zQ|Fhs~0QGPzY%P$xRRh8c!} zwSv%1PCXm@hMvtPO#xKkgzt_WXUpsBi<|rV&1mB)l^o&mS`xpE28o|ua9~{Bd{jL2 z?eidPDYRNPEut~?{W~3$=lt8#yr47R`~R+S4AvraBFb0)o75?Hb#aUg3JP-RxXj39 z?cAx~#^J;Xyz0{WUB$obDn;Ek)(;F6xl+=N&&9245G6&>nh;-xDOJF^K(e`RM|kE~ zW{b`TIaTY{u0?IJFiM?#eJ_UFnC1dmdV7o3$SP`G8IgUDv%Ddw`V;!7hccP-0dw%0 z&jLLus#6~9k&-KFJwJwk@D4l8`4Sue=16mjIVJVf_LEq99B1HIYAWXT!;{ON?2r)H zgU>{|zl_1FYHDC-;R9Q`d!>{dH#G%&d!NklK)<5<5>IerTPS)La>vX_Yf5IU&fzfX zENM7Zt8GO3rz!<|^8?e*4hpRTqYoTIl%gI_NcIAaaz4-$g&@&wi6Og=GU`(feV&X= z%lNj*S5IkE|C2!tu6wbo4|sI;gJtkHm?|jd%mRjuhA4=-i?Su%s3V-iLAXs(1d;5z zEkuuJ^@8lxS9i05FeL|B7UAeyFG7NO9+@gY(HeAt9CcC3^fR;dJ>Q$%ugut3i<|-~ ztfPFKP64Pq!oT95<`nJbJ9Fh~U89do71&XSJNAi}7aS-^Gcnq(G!cCP>2;>}_O+>1 z%@8&TNxE|B+RMcB!ENHZcQ;_2I4of8JEom+jZODfMQcvzU)GO^n}3ARq!JwUfkQ9> z)d88_`ymovSQt~EGN!`~3}A~QK1}t)kKE%BSxqf_4vmNA?(DA>H}|yXTGd|9iTK1X8%e~(Q&_2jp z%NBnkeDoi+MU$AtI|%&1qo}@5Ea@a2PPQctHm07jqV(B&)*UeyRpsl5Zk#ueU2%A+ zMj0`vy5%==%ge3UJYO{1ClC)gJJJQJzL^ntnGxd}hZ-kf4;<)SMF^KxyzUE8`B)79 z`Xt10PTOGRt=dGm#D4QCk0hvbAbnb0)|N0m7*mW3*`^vc=Hl`QI@W79lr^}P;R?ao zz$5!9eKT4M^7A^M@npF4*cUHF@1Mzcoj7#JXLY(fbWE?h2X%3dbH-d4B!-GJUS8Y! zoW7>7mn%DHsMy7!3V5hJAFOgclp9970#de>1?3U!PD93ui`pRCw<_C_mz{cqc@8Xk zw=z8qGv2&0`}k$nZ08S+_#@VbQEQG@H8dcP*9a|s#0GEcifX~b{r{2o@TV*M;4Av( zyamiN6*WNg5stfPe5W6*jEIwrl=IXq2FHT=#X(C_8_+eQ@{+d#pWe~wDDyGQ+Gqi= zCmW4&arMyY=x|$JmMnpv+?H|sTrpgt;CXtnqWds1no>BGRy-+bLn>1{B)vk)F6|p4 z`_(7#Rb!JNKp{aYqtMNHr`apr;}(7aMop{)l_$tuK89RkI7LVwIbNZ3PDZgRc7 zy=z?GBU4(Y4!5e4+aMicDCx0D&(Q^-Nm+V0GJta%N65C=pCWxX*x%o~U)knRLxwgI z>5RyYc3R(K9vh+DuB7oUnylAtf$2kp)5UxD2RhnH)~J_Ik*+~Uc<7x4%L~M>E6m{t~8Vo-Ux-^ z8FdG~YAnzH^$*I-x5cMVn+<_~6$3ScV5G{ti@FmjP=m85<;;}a7McefO^}c0y?_>a zyNJGq{=JYlvqfpcT(UG-qqH-sBM00)W!CL^902R-my880GTy>y`?4nCL6^vL1lotW zmvp>ll`_k@7j5w04Y46|1%P_-n`j+-W&8lXTadjGk+!7A1q6OgJ)L!fxR?`r7!zVN zu86cf?*20DR9CenZsN1$gcj#fkHXU|3U^P9Q0y-_>*9aC3hj7|X{ERJzZw~xk%9AE zFePQh@URYB1I=5|3H{bnxN%Wd*LC#oSwo8|Z`tP;sHvtJ5w=bc7YI|+W2l)l<|AL> z4r4Cc@Szh(V$vpR^#-445Vbln(xX0eor0)Vd)hopTgk$MRaPMAroVcvW~N|LUQuH3 zoa|^*wA-BvC!=PsRTX(E<}JOgP5@3t+77lO2x&Ouy=DC*He_C4AP`=)0o>Tdm&=Xq ze!~63_zx}&UD?)I)8e6%nh0`;fH0B9H&N$#dIYunWBP)#t|Erjy6Yoec;IW`#@5UZ z#}itKO2%>I{?CJt6zbu{FfmyASX1~c%Jk?St#!~*^J!& zE@7LnN{@-5Xv4pS2IX&uoc=X2YW9YD?F~Q2bH#*YiN;f-h=PH}mNLTjiKRafY}t@! s*J$e+0l=etyuBAd#VYSz1n_j=ocW^e&DC=#?RNnP^4sZq*9Xb|A4Ww-4*&oF literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C31_FilePrint.png b/src/Ext/Images_Client_HighRes/C31_FilePrint.png new file mode 100644 index 0000000000000000000000000000000000000000..05e15987033da39ae6959432bda693fc23f6dc40 GIT binary patch literal 3369 zcmV+^4c79BP)E|8+|OB^&0K?AfXkTz|R{sVpTO9Qk(iXwe*3KT&S z*G3B%MT6Kb499BgNOkP0k*&p~qJkYfUUiwoZ#82*JJ9|@SGFJg#(Q+HQVNvPo96ATp%4=9ElE-%O>2OqqXnIJwB12*Tq4Wr z3=i)nii&ve+S=&bJcQncz*Z)+-MxMd$o8E5^LnHd2qDR`Ce7w;vaE%avW>;{2n>Rg zSZk=&u4BwNJ9bPXL`QYGC?%0n-2?bLIdg6vN=cNGeFSoIYBtwsG;ZU)Lx>Le9_B5h zP!1TH%{8pe7#o{K>k#K0LV%PSDf>0>X+ZBpszX4dlsKij_YwpJv<}kE1n%UpchW|lPG}uu#w27}nMPxkB&oF{;+^HLHZmb3#$=RAi+ImS z6zx9N^MUOg^zNNlN=?1KK3}a~+bx7&$=~_u;NeqDXrp+~4)CuQi~8GnH0ThxTYKNm zkp-ipLw};Rc*i+E&!)h=y=jsxEUt(ot`Fb2T-<4ASLl{Q?ye$D^%pXloPQ7&c^luC=EF5Qcc8-ye9fV;X zLIE<h605%8A8H|6DP6OqLjoKL$lfB)~%cSE?&Iw z!r8O$ys)_V$zKIQ@E5ex?{+REFvdPLIy(9{-}uI#F+YElEXy#);G82#T6hmZpee7f z(XfhlmK4o*R!Fi0*WTm=o;Y&^NRqk%COJ6k6NGS=FB2XG99U~(noH_G6FTebE-va*wpw`ZX{QRz6<6nC2x!=UvtPOl~ zAkbQ|wq9Xk&pwVF9V1N~&ck-+N+EhQI=H=u%z<$p>wzF*XF)N3Xn|V!B2xNxN|BGf z*<53(zQXa*gQSV!@ZpD`VtPEO*zL#e^&>U|rGa5R$) zCJwV$fi&%3-~6u>d9&V=TBv5w$ULco)a4rJCj%a-1m)pb!qtmJp(IWeq1JqS>zDl4 z{5RE_?0&{Z*SX{jFc$a{4c41~_AB93hk|f(?ngVYv)fD9197{E5`*m(Q zA_rAXVKs(I3iUJx?Er!3(iFWZyOL!)h)hHj2(*?+B^WD?uuwU`(fzZGj1;iW5k&#B zvvVjVk3!FhAD*6`CI|x3H0>r+oi{k=iQ^QfEEN~gkRv1w@Lr&0-gCJLSE`=nCZs-x zDPc>0*lKZNS70a|Li&_23h>UcZ+wb_lY21Ek~xc(3L!kRvvUj$4bOH7L{T(1F)@*= zv%SN1lBhJzXtffYb%dd1-3?LB0tyba5UjM|=WB4a2G)a;pAL5`0*Qd}v`D2=VQ6fI zEX#`&85ShycIqO8U}9pNAP6S91hft&$HvA0(RE($A&%3wMj$GLl*_lN_#GGrjSPOi z3O`$c%+O9s?j3qpBwTHcvRbZjcsjs2yLC4y*tv6*D2hhA1cZ>otyT&+!cb$aquGqH z)}VFHyby(aQmK(p#MI%fE3jB@V}1bK{j%H`W4*CLpahxTn9Sve9<3GidL1ET&_@9O z@yFK@qR5^-V@yttqP0S6g>w$)JV79-HCwF3vz&b&Zk6*@`>enNwBj+Yl?7VmAzO%i zFOV|#!&0fv@^YEw~#?d~|h<+pAS7l_ptc+ecZ^-JP8ic<<9b0>0$E zAq;~}nYj0!dOfCAYY_&D&yU_DoX`Y?A;Lld5d;XSK`JtvlZcHZF`mw5?!8Az!Eopq z4m_cf;2qu?yftKTi?kJEvW(iQ=cB~7b0G-B!Gu{#i7^Sz*;|z`@3Bz!pd;$=L0q?!{4(HDO7hxD~ny>@zeq_7im@$U^`}gzg zv(J-P<9hQ4K|mZgaL%lB2?!w;lcb5(0`CV^7DWL!ZhXS|^Jgg(3Rr7Ndr8n|DnSsS zwI)pyjA?S_%=2g+3}_;XLK=-K#+czA zp%5X2;PmMy`N9`|i!@EU+2m&-Q513R+&O;u!yjOb0l=7;LSd@=f5)+_)iP45kGce; zl$Wa2@=~KwJGgi6494Vnh?JUU)3bN)-uyIHZgBGCDXg^^WAWa1NpwEv-1EThT(8RQ zJ?%c7F|OO+dq=T2%%hJU=luB(2m;CIXptb$6bd26h&CQck|eCJuclh75Bmu;n$6}b zmoEM9pU=-9CXVCo%Iw**hZkS`J=WH$oIn2yo_z9jdv(kJs1Ddcp#8))-s|;s&Y`tt zW@dsjXTC%fg`7BXm^e-`#-Vl8)zXzKAG5x`_O?>`60}n=DJ4p&f4X?_Lf2e6sYG7D zl6?5#Wey$Mht{fnz)?sk5kj_0gL!!{zxG1mF3;*L=6%;B&ueymO9fwZXo9lN1V?rKM%k)KIUts8s6QxN(!$U;h^_T=?MM zq9}T$gS$UwdLhI&-+udzH{W~j?2|ip?pi1ocg_tD5AAU-EFL>{Vr1veB3WkIPA+h+ zXWyGmhyfqykl5%8J)eMjJ!X7-l#?fq@Y-wt8b?vO-fT8+*Xy-wl}hPSqtQ60lzLSN z(b$RrLI@iK;j3wyzPh}8lUuib8G0WE!^6A3{gto0@cWQg(Q?qP?YtYoyY9VCgz9K$ z&}Vv%+$F8tydAzCFNL@K2s2!i%}y~wv^ZB$A@5QG#8Q)w9P zE*v~~@V94Xc4LggIeKY;8#IgltM?9TJ=Qv`bpw5^b$D+#JkMLHR7Y#g$&(Ks(R$a3 zp`pEL5DafwCF#>Ze=HYxUjT-%R+A*H-+BD;V|(%}(4w_$uUcm%22G(CHU~8_*l%N> z!DrTbo_+QS-hA_?e-OvXkEJXE3D6?{eyoSLoyb`sM!sJ~*A4NU2F-00000NkvXXu0mjfK@@T?~ij~SqAb>4aq*hU^Ct(Pn z2tg4;X*H;A=@m7!eyz3C1QG^CChLHTf`EvY3J6Mot&=STLH4mRQ6fv^ei$Tc%e);oS7ZrzCPX>f(>E!)cQZ<}tnwK=3Z zK~sC!id={-(;Ob`M!j11YMIQNN6g)m<|lhKVgNXPMN>e$kGw6~mCI1o~=*@^S$zgPPyK>%9~!2C$&weOQW0 zb)iGo+)5^226d|w?$HyHOwl4@=Tq-$*6ZxluM1C{sFgljsaRHiRQ9yM9wJb;QDhRk z$`XdEn#riH)`jqb0!4|>YJUPe_9WjEmAhb|Z3S`?J_ONJ>eA9n8X}3kWL(}th(pKX zu$dVj{a?AW43)qw@{6S$(G5f@l`6SG5+qeD^gRCALk444qjg$LObnJ@V1=OtMY8H4 z79~{A|I$_c1LJuwzUzyy^GvoZ%hP>*R$%d)zdq}z3Oo|vn=*($JV?QNa+35=RnZrLR z>NSj~ks$t9bX0FUDchTKuU6wZV|Qyx&;aU{kdfF+IuLSQWJs{Z5vX0Fv2HX6mWyZ- zyF)XH#tzxmuE^b*RRW4BUAEe7$yz}6aHe#ERmTDB z7TsRYhUA#b@z-By`k=xPMx-m{0_t&y$hEXIOd^ssbj?|I&vz^cX zri0$O;5{F4O=kV%_9$B2S)00v72%`0IcD?+Jo$y4qE^jtCWdgW2HAiXa7_!-OOt-j zb7`(rIqX)Ni=>&>nwOZz>DB6Zus~!u58RA==kd_c2MeHv!A^X}jhiOZ?aBG!o$(zc zmrs>93LSm)5s7|x{K%62^T?On-ZOhqUL$b$Y&-i1d`W|W{NQDM@@myNGe3+Dib8UM zS^u}iupT}Xzp%hFVtvgca&uk;Su1yc=gjCtF(5VCm(C9eIsi1M#mo}pTy=@~%!IqO zV}K)4GUMET;or|3Hi>kM!Lel z15v(Q?wr^Kj4kbxbk(rXxHOoLKOr%a>z^fSiHn!$7>KcG2wv~658fkAo2>6Zx)l~kW zRuXcds!`P38WX{nF{`IooJPl4$|!YxG3R+K$!Tb?%1RU@kOK-_d@LW|<8IduKOcrWZkWl8PXdDFBr{$cXboM=K-h5Wk!eLCWW zb&@wIl<{DWxYA4Z0*@zh48v$sr%lEVjB>EhhAPN8Nqt=m*D>hBj_HWj{g!S}9v@kYUG0j&bf1_nw-;vXFx-S{oJwtiyO@E2$CrN$EA=xh>?*5;snS!qu zCywSH+wO)WEbB7c_4}KN4;EOv8MIuQOH?Y`#sm;toDlYn_fu`fnMkBK+#_kY|&z z)Vj0#3gy*>%uE|PH7|Uc^&}?X<0|4h{@d#m4(Hk{xs-bx-oqZ}?`IUAGW+YFeK8^H z{a(iVfG`We?sYcbZe~l6=B&Z#6$XuaV`jAT!zkwt(=26+o76~+b)D}S;*T_Wu+zlb zQwIk}5o2MBlSM~a4*q%MVaRLKfq-qr&ojy_1?k9H{@6GMP}SKeX6QP%9&^!GM;3XN z`&wI|e2I9}jDcCA=J>30U)mh;^U)!P%jj63OrPI=I8fryxuq_RmlwSX1LpjdFW?V- zw=p+6x9h>G-R4cQwkUoF{ZIoKWV>#iz_%|5g>G#d*d{=eA z98q0^HhDt0jP}iMVM32`)}mDVLlo$LQw9`p?dWLptKUyreuYr%y11w-5lG&D0Obv` A&;S4c literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C33_Run.png b/src/Ext/Images_Client_HighRes/C33_Run.png new file mode 100644 index 0000000000000000000000000000000000000000..d741485f3757794f1d48586fc8e9d441c0ab71a4 GIT binary patch literal 3171 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 Z_%S!h_VTTDCfY3l2-p_nchd*X{SVuck17BF literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C34_Configure.png b/src/Ext/Images_Client_HighRes/C34_Configure.png new file mode 100644 index 0000000000000000000000000000000000000000..2bf463be3328f1afd8577f0f87b7bc4e2e6bcf7b GIT binary patch literal 2897 zcmYLLdpMM78-L%KF;2r^q#5TNYmIFf5k`ho&ZfxHT4u(fuSJB`NX(4U$RTW04mqr4 zQ>i4i+GJ)JA`{u1D#r{Wqa{M@9C#R=O48qERe>ubclCn~XE1&fod&LfwSH7OJ>=`cxCz|WmdMG>l;<=xRehZwLE* zN5}q|?lOC``Xzu2n9=rqchcYgt;X|4z0|q6i$3fQYTqc2ner>?;o|&g5G`^2zT~g) zfwR$La&k+s)BkeTqMfkR|=cUD=ND9 z9UYMf6!yp|2B6C-AiUWQ(pOeK7p*RRiB2uo;gpnE*}ldsvrD6434np(ig4DRnQZ)J zl((_+l`CG`-Sc8_25SVAy=AJh^f5TH}IgWfAm>=-gtMJgeuK3C*sw}X3edwQtos; z-PKv$Ztsj95DI7NBA`QvW8+j${MDGe1qQrpXgCPh+DMBZZCYJspNCPhW%I3kSa)hJ zT{BB^lt@6`KPOf>1%cWKc?^5uk94LRQx2DgX#2 zOLRcux3z2QP&5j%H`eE^1~EZR7p2v%1n@Vh-TdzT?W<#gdk9J(XdQUs1S0SsGD(2& zbhS_3g!Rko;7aWhWiqy{_}CEEF2u((8rMnD9pf*d)K9J2Ct&>3n)!lXw5oq_hV{1% z-tMrgh9WXNJXZG!B9pDD_+6w@71{|U{uTOK;^oXtz)dfbYwV@%1K35&{7Vp-dyIMs zY(HMBu4TmiUfMgy6b-!>bG_OYwZi}OEIta(7FXx!djA8OT970kWp6FZv%8loexs&57f_%kU48|Xvvtsf=3?UOGS zUzi&V*{)_TE)KQEc+--{%+6VjEIBKg`C#qgsn;ozX3fbLb=h%~kf z4D_tU?wy^SY{e}t%j1TIHXTX_W%1bx>94B4LfJ;Uo9AHS5lz5M<7}ehCA$%b?D*k+xuej)O~7Z zfzG8sYwKNBZf?fN0|z{iW@hK8BV#aI6(7e&rUWbqU|=gNQ`xv;1$AQ0>&mp}-78-g zf8_4-HX=rhG%hLE*2yE<7OVrRl-yCNL5&PHU6BkZuK=n( zCsFasxu{=__K{(cif-I^p`@-Zk1t8SC(S+Ba|91@@bO2XGAlwYs+LMa^48yJ@@gXF zb=L>jL(FZqw_Ww^#f@bv-7U<}0jWOB`1oQS*$WT9kW#Iurpv0H1*?tEa$K)H4&VJ# zu~n2&try$Qh^((s4g!?po9pw;=qsiM!dDa@AEA;~NhP=MLZHF{478P55fAN5ykXl^4>tnhcx4vF8L6^5{ID!RKWJ;HJ%viqGcUYeC zNU{iS3!!GN>R1?UbAn-m4S=P`AeO;sz;46CKfdq^War_kFLicyD$M;=1n(numKVz_ zk>i#D3!^UZ9RH@Z_kEADL*P(2M~J9U{by-a1Fl~?VYuge;R5<*eE}=7$`p0}{3H{i zCNpr@9lHIlG!>^&aC7tYtD?Bz+1~WAMFWca<_3Ibz7Eu2sn0H!4!(UmEm)F@h>$TCZK$;dvH;LsD6?ihV VyZZgZ<{eE8xE%3xy6;F$`8W4553T?J literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C35_KRFB.png b/src/Ext/Images_Client_HighRes/C35_KRFB.png new file mode 100644 index 0000000000000000000000000000000000000000..f83e3dcc0cb131d0cb79e88fab7e427b99f89eda GIT binary patch literal 5622 zcmWlddpy(oAIHDD4_`JFw#X(r6fu-bF5BEv36;dDlaWhx6uL;cY(t|cLQyUor=oJQ z$~mc@Y>be(beGBup@g~Rvf1~y^T+4&d3^r)Jl>Dj`~7)-UhmH(f8Xtz>TA^j0MOjw z?Xg$2QvMrQv}!&8U&>G|$SC@5IsnwP*`qFhSM7;sJcG{ci-|mQF7#9cKo5@ziy-ef z5gHY-HzG9rd|Z2kGXUsh?(m=oB=m(TAc!jRM*}cyX`Vh1O7JSym=0Gbq@E4Bs>VRO zRyX}6J9g1HJ$I4Za$~jA&P8pbbV;n_TxVQ~d)FPEJ)!9GOdh%95`~jcj+T^r1SDE| z+3j~H?QYKgRQN9Wf603nckjH{_wU(~(PNEE>&zrvOIWj8wckIrwQv-w5{b%0Zewdy9E)WE8LsDaLF=`lP`zCaulQ$U8(LLmO9N^b-Pe-vN1Y z%sY`dcA{@H$2RI}1_DKbPe+iIoJmU-5N7mdI-8cEyDV=VPdx8vbM()Sp#b?534~CC z5Cc3#Xxl?xSXr7agb~sh=kc0Nj4m3cc z0G?@vJM_Q!3BkjM$|n*5)25yYsagC|EFI+JS3a~+DCciVA*vTAM37>uP-->{l)xte z`KN?QP_ig(duXoB)3hA6fz~f_b0eg*VY{r1T4_)W8*JO!X06lH)2(H)SX-<{mJIgy z5GE`>`XmBNuE@tz(oZHY&y`6(Kjku9_4M>aFEt+!bvJJl3Y$)L2!+Tk>O~#|)*gt| z92pLOQ_Zl(Lsa9{0VO(O^adRcB<2+$nzQk@U~SOc#YT@=?X;Sy13V0p^@!Yp@VT!L zFrhHfh)S~ceF!1mMWsnABxzU)Q%n!(AxI?CwAxx{%5VuGW%`yaMFy;EL2tRbZVVgG z6MZT&N(v-*HX$3uG|&eEefV?ePJl^2Hg1)R_7WA7KtFDB)Z)yNQyPzlO}l;DM9Zvyav(QE(l*+`;F*`w2@VUtCbDvA0W?KG_ds{)-IuH-z6k18xX~j7?h1x%0^ynpk%*yn2i;*;-?^c8?2vSxma6VoPYwbOB^s$YB z9Q*DRU|mPrNW#&*VHp=L-z45jFM55sT97-8=%Uh0Z4pQEv+|`a4@d*=nmRk%$tEW2 z;q!nQG1)U-j|Ny@^Z&krxk0d3o!bn&Lhvg50s^w>hjouiyK{tNm~90YiK*9IV0Y=~ z;e^3xn*7rzZGr{*&Zl5}QDKJkbw`YF)r1qm%E}%=72vB(RuXd4&EifnT++9y!I1bJhCtv%B{fAM(_Vw%y3)hmy!(O=%1*f$FvGju zq&^FXZ7uMA{6>TJtKZeMcnyUmaPpca7FJApy15R+W~WZ-py_{QT`U^{Rq3sCiq$yESr7x+c2^+27S^p zbBMk)Xv;s9ym*-{ozy^c79`~5x*$UTicWZfT&m%3u0cV21et93rbCZdbD;r+CF|~W zjveiq=RSY_asgVA|24bfWMZs=$geB`^+g@}v{nJy3*mhT81p_%9)X4VGV%t1un!VE z#@!80D5cGZu-LMBr(B%4SR zky%0B(Jz#caz*~tkL#K`3skK$hKt*T-VBH2)nj-qLvJKguIY;gLsHyqHdL=iycd$s zzl8kljBh(cK)8F&DsHUqMSy}JLfH$sX7vJXgSMV3yKXbWsG>9#j{qC`Cn zrJY!3$&>!rDZKltoYZ3?!ftlG_5&6468-UIHa^3a{Qf1x+iE>a_1@iyz5U6NI4MZL zMZ2#6dUukNQh9lqI2U6C62JPMA;4L_q6$}m+S=ccT0z2Eu!%RXW7;A^J-3j8LUo80 ztBwpaV37%oxB6p_c8twpbodjXg*J%aYJmr5ob{|kot0dI63E)??{yuRUEODpn~%^drhGQjwTPQf+e z#q?$m-j!{EMTx334*P(cF0rnQuV8XQY%+JX+ay8L`a$A2%29Jzr;Aem^$097=(k9J zy;Wmsx_Hf>fvL_&aQAP#TLNZ^jbdrKRNCFm9jNb|p2DQHNxH!jF_q}iQbZiSuC%EF zT#QZ4H6{(>;^HV+ELOv99Bvmh1*&ki!1}uOEaR7g6XzvF_GF(p= zvbkATq(fN(FgJ2z)$LFO<_(q6KC@y)xmyI;$l`1e57J}6q>z4VnL;ikTQxWG$Q|9} z&CQ);Bp7SNDBd1KD_~>B{398A!;$}#1fL+Jz{fL5)D-x-ZVhqUn~Jdw+B87Az-qPg zV&I=`G*^#U{=MV*r|;^gkH3nwmBBvG@siN@nf)os&e+kVbDS*af5CXcVe685GBROq%#ptXQVU2tWn^lkvJB~0G(y1#bur%tMvqKfntw0$J#{^@ zCm+aA>v@fz7t`j+o0+T#hbpaQoP~r7JSglmmDn1%oVjTv^2}^(_qZ&zGIruWZCAG( z5kQNLvGaYq8Kh+@!ir>7cLQ~HnZ52DFW5);^0Qy;(X_FJDXKDYd9G!uHHWKAlK<*_ zs-bt4>X7)WXCv=DhP_C^3((IHWEMYB81Xm1q@?X}MUcCFi2Gs2vw8hqZw1Dp&*%^@4m7S53U}hM{VDJ_v=7BO zT-O(g(ClcAA5*DN!Y8U(luXT^;glqnoqmJ+v}x5BQc#fUZh9Hw2csU&#=n2OW@NEN zwxDM$s-%j+_4UzUlTc}a;YW`!*a>s*N2wsGK>^ow@L}NCaJVj(M|h*FXpzwZ3#4B@ z>48(+knn^HkQhpqFL0H=COU$7dE5Onl02Kp7^Pbi53hus{Yjncat2jz)O}3SzYdN; z8}(LJrpxHMy}{CO%neYuKCdue?MpiB;-ZzmlSWaZBw3+uxt4qiq}aKCL*z@CVN_-{J=@uk%L{{H^p7~7my+(mbv#nnb!`gm);Go-~fyV~#+|arU44h(dg)4m}ItNTX{7P9(1>~Y({8Gb9#b+i*q5T z3~+D&mYxZl>KxfQ1Mjjw*&jKevnJ9(elK7ma>wE@$F-LD-A@+tsYT0ZjzkW(JHK|nk>%~VfyW}UheEBgL()*6sB&w*Z`C6wt zJ<#~^t?>8x{NjUniaT>P?8Z(TAuBH`BH}u0t#bfhjGLWw3!rwAwe6JN=2MYXifOHhc)zo(qKP7m0dCbi~&jASrEAO3a3@nDem z9Erct@;;AjWoAZheyJ6GFc!#q3keCyGTCc;VsK0Tl;p)t!Ji**UFmV2(fhA4z)E3s z%hOsgBMvU6hEks}lgjq=f`7p;d#5Eb2vQi zxY6bn!g#zX!r0b{a>>RC!+WglLMe8(07sp#jhV~5dT)bBRLCWEl{w-J zuO+MuZl$Ox06QjY!qCf(kpTuAdjyzoibNaj@I;5k?O==#QAHW{-NYc)jvaxY3+VfA zT%r5yyh%T_*N^~+2Oj+^U}_s@G1{5<#YNkRcRce=QUv+d4;pVj$^YR{JV!l5A z5<4^8|D3}JTAZ}}I zm>h$ri8VDf8Cg+NiDm7Li~GiOC~1%3pUueP<~DJx{KtOAxNcC%&RuX@Gya-oMDz&! zuVt$q_YlEKXu_E(?H*CI@XcjSXPeH(P7#AdXyo0!(=Pk<-I&uI6Jp!@`4&a7q%3C3 zKk74DGf+W^2y+jH1R0Pax==7Mf<=U_L2ub4>TbbWq@ai?DG<`-|5Igb&Se&T~X|V`bHy4ziVLlWckVG+NsThSt>BjCNGB)pXZLwV z{g+m@s--Hi-?#7a5sVkLDiwY<(1E?SHanZJ$ewS^A@u}cPQ(Ed2;C?3G@J~U-x(8o zLAUUFB;{X9=m6qwl|3`X+Q2pTvUJAN742t=;7Ek^>n%Ir;3o;K749x=)#tJRWMb1JNV zL0FZ!xF}b+kqvd3SW)pp2yxAt4Mgz?71P)|20wBCN{7RjqA?&mh_%Q_Svj}cv{=v zdvqh^YM#LxjY{pO8p2}FeL!;7VCsmlwK4FshZ)34YSMAtH_PE^SN~wQer0*KlNcup zwMUU32S~2U$X@;o*1h_hRqSY)&KN~g^DHByY_-iTt;zV*NXKAu{#K@u3m=0kLpWJm z5huSqgU08+uePc=?6M&1D(!fxatT_e9I9N-!ZNvVB>wp6Tf6r9Y&`Sw12*LJYX8-J z9)1QtVYx%0?W3f z_IpL84M2)nG)8Ow@!>CGN!^xaFJQ<@jebZ2ut?E~5yVPAs5l1crCd zq`Q(mJ{td1zNLlk_Q#DZY5TZ9_ws{|hpUkZ2(Y=g_ zgU^^E1QI2RwM_N&sh^R*l7LKoJf}GuonCI^%~MTy4kUqNj4+ z9av@g;zs9qBlq=8Uir>i_c)j;ZkJ84OKLrYY-fakqgh=2A}77##;u~-Jc_-5V9K9w zQ%p^9A+AKQG_Pz)i?NzKoFpG=f0O}|tiB?jV`?pcUh}Xz&2=t|?hoE?Qkkf31VxCx zs_8wKcGsz;d}!`aPxv%x?JeGI89I|o(~GK4zgqVCj0=v&f&m`WQ2LKTr&86&EwIDW K*W;lZBlZ6wsY?F< literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C36_Ark.png b/src/Ext/Images_Client_HighRes/C36_Ark.png new file mode 100644 index 0000000000000000000000000000000000000000..3393d26a3e4232b42f9fe75098219ef634266e3a GIT binary patch literal 3979 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C37_KPercentage.png b/src/Ext/Images_Client_HighRes/C37_KPercentage.png new file mode 100644 index 0000000000000000000000000000000000000000..3ba9bf298260521e661ef4cc56e312e65ff3d94a GIT binary patch literal 6344 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 SWQ1WR1ca`L2)rHu=lvgfcyg-% literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C39_History.png b/src/Ext/Images_Client_HighRes/C39_History.png new file mode 100644 index 0000000000000000000000000000000000000000..7907787f3c4024060bd2827d95393cee3ff8bd39 GIT binary patch literal 5804 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C40_Mail_Find.png b/src/Ext/Images_Client_HighRes/C40_Mail_Find.png new file mode 100644 index 0000000000000000000000000000000000000000..56b68ee3befebfb16f2d9aae64a3d1da75ad934a GIT binary patch literal 4526 zcmWkydpwivAAYunP3;jSY{b?v7v;8LjfMSp)iJeP*yXgj3KOp z0jY0s){(A9V7dOlolH)qYc$K3=FLVMQYmih)_FXOc(os@_(u^?2~VDxAO99S4lCq} zcBaj>JEEF2VATb!s0O|D1qwK!*cJWq0 zDdTJFJXnCwt!fdjI|f!9Rl93YYZSY^G|&Q9R(20((%OaXsgc$(est|a!450Al-68G zT&Us_BV~BQg_K^!s&lqf;6oz_yI~b%75SpvDl50CDL4DeT(?czuxP_MR$zFMYlJ;6*jaq3Xzws zjg3K&f+wzr7aI7N$0AWi+YC{LrUBeu0TvqrYF&GnXD)hiV29}jwnDFjr} zj5Cx5shKR#RK5V-Y(uN~&aHoibf5dpg!Q62VbdF-P^HwriID4YiyHNf@!GyY)2r0#pIuemoN6jdyU`FV8l_xGlEf|zLO{zg?LBq?ZC+hWkv z(tIzHUah%d-PXp^hsDkGzz3~_b#Ir4n5YEnShI7eHQ(i~Xp=tATA0nT{*SnCGv{ zlCAGNuGz|YT!7^8HOXDK2=T$7oz#rDD=G}mm3)7#3sIO+i0g7D&eb&s8yoi$yJEuE zM>9(^z}aQMTe_gdyU9~B(O%73$Ku!*EObp9TVVUlF>K-N#78C^1B*sXS-`q_P)3d4 z1SY**ZD|>D(B<-8R5a*z_@RlO*L!Nh zo4F*)c$Ae@I2Ye*OS-w88RtD3dl3~X zK7-QNH)aIN(A@tKpJ9(>yJDf_L2SX!ORW*JXM3BK81$FsBamu&=nf_#>5Z2_5kEOK zlcCPVV}s{sKj*;RbQK8V1xbLUDK?&y02+cYJeB@7zaX8SCEjsULdqzI9;Ieyh>tP2*-V z@oEy8s0OrLTuVdIOA7t1nZGyKF^a52)fMZYJW~vrmzzKev*D8*5=lfEU@vR$gjw33 zy|`kgg3MZ#QKAWQ@(gV3!paaLa!4e%`m}%~4S!AcsAOD~OiH5rs#LZ>EiNB+w1lSsdbXjW_6Q{E95_`;L12!wWmOb>Ez{x7p zz`a#x;kXq(82{t;n>F^$ndIbWE@ z@amc1t~uS3A7p;Vm#0hHIl{5aklwRaD6jmNH_!TlDWB1Y9t)qzVSCqS#Y3+{1FNFs z5ieAUIyJW%{u@O__ALTjX{iV4cY&eDXv7+**tEu9IyHn5jp+vA=J1hFDQSWvLw~;Q z1eFR0XJX&fAJ@aqK7bA!=93+gU~lQvEJZYicM?t;94j?vpX>JOg-MJ_zBwSef@t)Y zg3~}6Y6?btrw43nVw}k{;&j|tFC0ecimq=vhx_<316zaCN+uHTKl){aGtKY(5H0`u zS=V*lqdlnz7O=aeHhBbxi+N`q^Cu+zPNo+BlBT~@VSv4t+-JI6beJ&GP=SZ=J=LeJ zp9L9m(%EFuqfQS9kL$wuEhvC*7BJS8eOmn*bm#}Xy==R#12 z5cJ2xeSY*|3DSqI-P(j|<(oiEcD9Nd=hfz3wjt2YB!q)0?Ee1S)S0>$%2|1VC|j7} zNSd=Tef_ws)qC0D?>bIGU5PI3+B)SJ`%p6~K)Us*yvVh(?d^2X*Qa+naXc1x<{}M3 zp5Vc2rL##R(7Lz6?#8!ulbrN8b{^O-#24M2DqPl8emX#kHo32O{v0@<)P@ORnL>Tk z)i0jo!`9C7W-l5I`QdD13(^q z?7bI9#mMA1T{F*`9U+58Am7smxQ}8S^NNz z<9v--0(7P%nTSP-i8aU6Ys)a>){PPyinr_RfmK#f(|5M$a*S6Qko0u?9jDHW__3i7) z=!OFNWmSojM5Ia7B}TyQ>rO1|{GxXWXiCe?(OgWd8fC @ zDtcArxdz{V8?kQOdEp;OPcI`a&8PD67*;edo?tyCsF)b$U|D;25oeGjOf3i(8L}3D z)u2)gFYdHB%qEq^hAqfQ;HDWbZn3zB)Xiip)rt$3B73X0KQpLa#$Ev+)v67tsc{X; z`&~EO5%r>@hn7p*lbj%#z^9=%U~2$qQplWcNoXux+L zp7WYR5H>WR0`ngbJ!&HI*&||OlqG#gb-#Jw`y z*Ja!7TRGpiR+M@A@CZ^n2DOx-253@ildswO`^zaylj$~)xBzIk;a^^uH!B$%c{4fs zDU$2n`GhzLN3=~&q3>$6rVKjp_wmxY9Qp~Di&p(=8%TvT4vnjXn#~*Rh)U$7UvMOn zF?P$}6Wxo3`c>ATHK}1Uz!6WLZ1humSH6wm!;QsF$V?5854SY*{rFMOkDS**h0=>z z`dyb|8q}Nul+O8$N>eTT;iKky3p3Up*6n zJN>O0Kh!vnK6#=3d1?j)!Hwie@SLS-QBx~aQn%UKg}D3d&^N0Bl7~(CH5zXL!zr!O z<5WLHi{foUm(O-SX@}2CuedI*AO+|0!=k^nb&a#m+@TF(tIPS&`vmlR0#hbj1OijIO z!C&LSKwfsTune3Qo~93n&kVm~(rw0?XLQX1_VkzMo*1@t1zZ8 z6;*$3#0|yk@tG@U=hQbJEs*SZ*;DsM!`0-}c6DeA{mWufI?dc&d&9^jTewlLXcLlp z%Ks8tY0sP12Mb+!^9y78z2O+klhx6o1CvR*4c7%x;UV8Ef`WQj?rBs!(m(|8HO zxrfJkR?93g_g4^Ds7L6clt@f+Ldl~@_|K`Av)ZmB(J$o+QLm%$al=-go-$lmGy2d4 iK%QxQk`1U4ftG`@e>S@RZ$KHi0FHYP?RmVLe&zqk^@5rJ literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C41_VectorGfx.png b/src/Ext/Images_Client_HighRes/C41_VectorGfx.png new file mode 100644 index 0000000000000000000000000000000000000000..9a35223934f9cb1609d43f8f38cb244b8cd52554 GIT binary patch literal 2717 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C42_KCMMemory.png b/src/Ext/Images_Client_HighRes/C42_KCMMemory.png new file mode 100644 index 0000000000000000000000000000000000000000..ecd8072697df9912753ff7066a98140ac0f68983 GIT binary patch literal 4185 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C43_Trashcan_Full.png b/src/Ext/Images_Client_HighRes/C43_Trashcan_Full.png new file mode 100644 index 0000000000000000000000000000000000000000..37b1486fb0713e4ee081055ceda9ef7e2fd9f7d6 GIT binary patch literal 4997 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C44_KNotes.png b/src/Ext/Images_Client_HighRes/C44_KNotes.png new file mode 100644 index 0000000000000000000000000000000000000000..d0d7cba9132fa0d60f162b74b63471abc48e0fe4 GIT binary patch literal 3267 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 VaxiKaP5lc2eD?)-HF|_+{1=;G*u($; literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C45_Cancel.png b/src/Ext/Images_Client_HighRes/C45_Cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..6b4497d5efbf2f24e1ec4337d09f4d0d08b22529 GIT binary patch literal 3640 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C46_Help.png b/src/Ext/Images_Client_HighRes/C46_Help.png new file mode 100644 index 0000000000000000000000000000000000000000..915f9fd6d45a4345e94f3c9ab3fc4f7932bb23bd GIT binary patch literal 4662 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C48_Folder.png b/src/Ext/Images_Client_HighRes/C48_Folder.png new file mode 100644 index 0000000000000000000000000000000000000000..31c8a7ede1efd153cd0b05663e59b1a23353c16c GIT binary patch literal 4789 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 Mj=kF-_|eb(9}?dAKL7v# literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C49_Folder_Blue_Open.png b/src/Ext/Images_Client_HighRes/C49_Folder_Blue_Open.png new file mode 100644 index 0000000000000000000000000000000000000000..f7314b3494168b156959a0fe7f27f124b9f63cb8 GIT binary patch literal 3806 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 sM)5HVxDhezSP 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 VczG)P5mM~~;UN*hw*&dP{|Ap!eK7z4 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C52_Encrypted.png b/src/Ext/Images_Client_HighRes/C52_Encrypted.png new file mode 100644 index 0000000000000000000000000000000000000000..4d42a7e3dea5c31fd59f70a51c902a0ca10c8b81 GIT binary patch literal 2804 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 A@c;k- literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C54_Signature.png b/src/Ext/Images_Client_HighRes/C54_Signature.png new file mode 100644 index 0000000000000000000000000000000000000000..3df00d2c4c0e6d21c47955cf9364af44a66dfa8a GIT binary patch literal 2367 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C56_KAddressBook.png b/src/Ext/Images_Client_HighRes/C56_KAddressBook.png new file mode 100644 index 0000000000000000000000000000000000000000..16f440ddade625eb415d4d289fef9c8698d021b4 GIT binary patch literal 4069 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 DMyz!C literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C60_KFM_Home.png b/src/Ext/Images_Client_HighRes/C60_KFM_Home.png new file mode 100644 index 0000000000000000000000000000000000000000..74f8aea85af4f556ca3cf4a4581a070340296a14 GIT binary patch literal 5001 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 U#G`mr_wNDxeS%kCUWJJM5AL+rd;kCd literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C62_Tux.png b/src/Ext/Images_Client_HighRes/C62_Tux.png new file mode 100644 index 0000000000000000000000000000000000000000..5a0f74ee05c3b6e052727a35a82b565cd52de77a GIT binary patch literal 2614 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 Y524Uz+Rp_sLjV8(07*qoM6N<$f>+!Es{jB1 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C63_Feather.png b/src/Ext/Images_Client_HighRes/C63_Feather.png new file mode 100644 index 0000000000000000000000000000000000000000..dcdef2e7100cedaf05980239517371cc3395d77a GIT binary patch literal 2155 zcmV-x2$c7UP)rWk9Q-@Fr)@naTH^^E~f)-plt5bYN3OMI8w2nKQxjh7FnmY53h}_rN!9 z1h*Rw9MA!a@bGTr=1x(TwGz|pChZpZ;>8dfi!53c{Jw78udwZ1)YZiyQU@4l+O2j+ zK+T>Fue>6%V1ZJ_#ReBIPNt^jW0W!ht^NS8(X`|3hJczm6JC84dG}pZVPQCa{~xKY z&I1B~Bjlvm*q^^p0;;$e&Yc5~2T4su6%;rz%}i=)ynqGh%}lk>wC}|0jeoHOKKwA~ z@%(%Z(_Bt%tq)K%$}#|VtE+LlTk8sMw6Zo=xy7A=j?2q=;%%=JNquTZ~r9} z4%@Q$S4jyy1`fpOa>2lX5FHK2j~m3tk5b#Wi#mJu`PBiHlmwO~fFdmH6V9HUTrZc9 z_VwPq44XKSFqaD=BEaK;UcD>=fdY;m)nwKzi$}HArUX{6Hb_bmii*myZBMfUb)7FZ zZ)QYdBJRjYuq;ptUV6zUHnvSkJ z77*rkL-+2`qeoEp;o$)yBiG{d{YM%*rL82S^7Fy%)@0s1Tlsva@cV}%()_c+!Z?tb z$@uhi98M?LHq_LB(+Sbh0X&``WcKWrLrraU0?O+JkH;xXmiX10HUGo1x&Y3QW0gX5 zolm@860)+;bv@|$n3$mVBO-#S6AYYAC@HZTdZRWWpoR>ADN~&E@2_*|(mib34}>)b z-nK0E<>WAR)v6#Ek)ZdLdT>-#4QK4w)AZ{XkofqveFG{Z!$IG^QCz!rqrUkH9b-yS zbMGF-`S~QSSp%jCp%mtDERoF24_bO=s}WGCsXB3Sy{W9cgi>}(8SYMbIe*=AAVhgV*(M8o;aF zyIXwrGpA8CXO1vY5w(op`;2R7nY(KhL8Xr&S54)vJY`J!ARt z$IFic|IM*uTrDkS{L-c1_cx;j@IPA8vj+lDet zCeEK9Y|27c;R0E)VyW_aTP)VkOhBz$hfJE((9hRB4*bXK*AwRPFlp}GU~vj%Zg--j zr|(sHc~DmNR8oE-0+or0+`DJQd5bXKOc#UL*?XL!8F4|jWaEaTFc^ab~asJf1PpT$A^+laG~yY zM|1l0&4#Kh%a%QLCVV2%DW&A!F)>G8e&?NWqBq?r2m}ILyM3Flw`?K$jW>96^ypx$ zJi-x8yGNfs-6<C=o&Nugg%%%hqQ z>fPn~tt?-D96;^bg(N4p>iQ!j0d?dEcXscV$mHZG>%@sMb|64_Z0v)U*X3g8)~(cC zzRZk_3_2N2ZsSM9N!PADsjR$p-zlvOzF7&$TW{gnw@>|$p8hw{b!Bwwgu8d|`#Jtk z>(^tJmoq0PhX}(!H0|LuscF|`)heO3wi1!rw%j-fNkA18h$=1Z9M-k#aB(<991bG- z^Z~%1#O?$L0C>F1`x7xK!P|7d$tF5-OChxw+=R=k(QFrIeNr-yw zwSX9g1KS3}U}H`WhQq;}v^138kM5j7GbA&!?s;xkHj&WPVZ$Vln;TJER^~+0 z1jAr+em=Gc3zjZz3|`e|qdf6?qxt-E8^d_6;6oCqEi03&AAQur_WQx*V%z4;m^C#l zT(N?O8aPe6MM{c}Wn};m71gTw{i$O>DTU?tM~ZFxcNG;m?TQK(dcBQ3Zxb0gN)|6Z zp}Kbm!>|D)G4X|L(>Ea?b#+84RdW=KKxrxS)~o^BZs;JBB`t0D{q^eHxwK15fj{hk zz$s7{Jf4#k6DABc>*b^J^4cfpyx^fH!*7Z}y)820A!%*cK)bbMAQ2p+q0b&rlVI83 zMMQ1dMETUIv};QMMhE{5jQBIC8E}w}WFzZ~*?Lf^P)bL%8L;Q~@CyijOzueF6JRjF hTrj4CBy=$6{~wM~C>woig){&F002ovPDHLkV1mx{AKCx_ literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C64_Apple.png b/src/Ext/Images_Client_HighRes/C64_Apple.png new file mode 100644 index 0000000000000000000000000000000000000000..cacbb062dff05348db208ac7017b5080ddf7d931 GIT binary patch literal 3622 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 literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C67_Certificate.png b/src/Ext/Images_Client_HighRes/C67_Certificate.png new file mode 100644 index 0000000000000000000000000000000000000000..54da0f35099897fc26782391530ec2782b1fdc18 GIT binary patch literal 2291 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 N002ovPDHLkV1kj)Z^Zxr literal 0 HcmV?d00001 diff --git a/src/Ext/Images_Client_HighRes/C68_Smartphone.png b/src/Ext/Images_Client_HighRes/C68_Smartphone.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b95b939c6d24b426ca5dcea63696cdb2dc80b4 GIT binary patch literal 1683 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 + + + true + + diff --git a/src/Ext/KeePass.exe.config b/src/Ext/KeePass.exe.config new file mode 100644 index 0000000..1ab98a4 --- /dev/null +++ b/src/Ext/KeePass.exe.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ext/KeePass.iss b/src/Ext/KeePass.iss new file mode 100644 index 0000000..c8ae128 --- /dev/null +++ b/src/Ext/KeePass.iss @@ -0,0 +1,363 @@ +; KeePass Password Safe Installation Script +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! +; Thanks to Hilbrand Edskes for installer improvements. + +#define MyAppNameShort "KeePass" +#define MyAppNameShortEx "KeePass 2" +#define MyAppName "KeePass Password Safe" +#define MyAppNameEx "KeePass Password Safe 2" +#define MyAppPublisher "Dominik Reichl" +#define MyAppURL "https://keepass.info/" +#define MyAppExeName "KeePass.exe" +#define MyAppUrlName "KeePass.url" +#define MyAppHelpName "KeePass.chm" +#define MyAppId "KeePassPasswordSafe2" + +#define KeeVersionStr "2.53" +#define KeeVersionStrWithMinor "2.53" +#define KeeVersionStrWithMinorPath "2.53" +#define KeeVersionWin "2.53.0.0" +#define KeeVersionWinShort "2.53" + +#define KeeDevPeriod "2003-2023" + +[Setup] +AppName={#MyAppName} +AppVersion={#KeeVersionWinShort} +AppVerName={#MyAppName} {#KeeVersionStrWithMinor} +AppId={#MyAppId} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +AppCopyright=Copyright © {#KeeDevPeriod} {#MyAppPublisher} +MinVersion=6.1sp1 + +; When specifying ArchitecturesInstallIn64BitMode=x64, Inno Setup performs +; a side-by-side installation instead of updating a previous installation +; (32-bit installation on a 64-bit system). +; In order to avoid this, we only change DefaultDirName. +; ArchitecturesInstallIn64BitMode=x64 +DefaultDirName={code:MyGetProgramFiles}\{#MyAppNameEx} + +DefaultGroupName={#MyAppNameEx} +AllowNoIcons=yes +LicenseFile=..\Docs\License.txt +OutputDir=..\Build\KeePass_Distrib +OutputBaseFilename={#MyAppNameShort}-{#KeeVersionStrWithMinorPath}-Setup +Compression=lzma2/ultra +SolidCompression=yes +InternalCompressLevel=ultra +UninstallDisplayIcon={app}\{#MyAppExeName} +AppMutex=KeePassAppMutex,Global\KeePassAppMutexEx +SetupMutex=KeePassSetupMutex2 +ChangesAssociations=yes +VersionInfoVersion={#KeeVersionWin} +VersionInfoCompany={#MyAppPublisher} +VersionInfoDescription={#MyAppName} {#KeeVersionStr} Setup +VersionInfoCopyright=Copyright © {#KeeDevPeriod} {#MyAppPublisher} +SetupIconFile=compiler:SetupClassicIcon.ico +; WizardImageFile=compiler:WizClassicImage-IS.bmp +; WizardSmallImageFile=compiler:WizClassicSmallImage-IS.bmp +WizardStyle=classic +DisableDirPage=auto +AlwaysShowDirOnReadyPage=yes +DisableProgramGroupPage=yes +AlwaysShowGroupOnReadyPage=no + +[Languages] +Name: en; MessagesFile: "compiler:Default.isl" +Name: ca; MessagesFile: "compiler:Languages\Catalan.isl" +Name: cs; MessagesFile: "compiler:Languages\Czech.isl" +Name: da; MessagesFile: "compiler:Languages\Danish.isl" +Name: de; MessagesFile: "compiler:Languages\German.isl" +Name: es; MessagesFile: "compiler:Languages\Spanish.isl" +Name: fi; MessagesFile: "compiler:Languages\Finnish.isl" +Name: fr; MessagesFile: "compiler:Languages\French.isl" +; Name: hu; MessagesFile: "compiler:Languages\Hungarian.isl" +Name: it; MessagesFile: "compiler:Languages\Italian.isl" +Name: ja; MessagesFile: "compiler:Languages\Japanese.isl" +Name: nb; MessagesFile: "compiler:Languages\Norwegian.isl" +Name: nl; MessagesFile: "compiler:Languages\Dutch.isl" +Name: pl; MessagesFile: "compiler:Languages\Polish.isl" +Name: ptBR; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" +Name: ptPT; MessagesFile: "compiler:Languages\Portuguese.isl" +Name: ru; MessagesFile: "compiler:Languages\Russian.isl" +; Name: sk; MessagesFile: "compiler:Languages\Slovak.isl" +Name: sl; MessagesFile: "compiler:Languages\Slovenian.isl" + +[CustomMessages] +MyCompCore=KeePass core files +MyCompHelp=User manual +MyCompNtvLib=Native support library +MyCompXSL=XSL stylesheets for KDBX XML files +; "KeePass performance optimization" could falsely be interpreted as +; operating system performance optimization carried out by KeePass +MyCompNGen=Optimize KeePass performance +MyCompPreLoad=Optimize KeePass start-up performance +MyStatusNGen=Optimizing KeePass performance... +MyStatusPreLoad=Optimizing KeePass start-up performance... +MyOptPlgPage=Open the plugins web page + +ca.MyCompCore=Fitxers del nucli del KeePass +ca.MyCompHelp=Manual d'usuari +ca.MyCompNtvLib=Biblioteca de suport nativa +ca.MyCompXSL=Fulls d'estil XSL pels fitxers XML del KeePass +ca.MyCompNGen=Optimitza el rendiment del KeePass +ca.MyCompPreLoad=Optimitza l'inici del KeePass +ca.MyStatusNGen=Optimitzant el rendiment del KeePass... +ca.MyStatusPreLoad=Optimitzant l'inici del KeePass... +ca.MyOptPlgPage=Obre el web dels connectors + +da.MyCompCore=KeePass kernefiler +da.MyCompHelp=Brugermanual +da.MyCompNtvLib=Oprindeligt understøttelsesbibliotek +da.MyCompXSL=XSL-stylesheets til KDBX XML-filer +da.MyCompNGen=Optimer KeePass ydeevne +da.MyCompPreLoad=Optimer KeePass opstarts ydeevne +da.MyStatusNGen=Optimerer KeePass ydeevne... +da.MyStatusPreLoad=Optimerer KeePass opstarts ydeevne... +da.MyOptPlgPage=Åbn websiden med plugins + +de.MyCompCore=KeePass-Hauptdateien +de.MyCompHelp=Benutzerhandbuch +de.MyCompNtvLib=Native Unterstützungsbibliothek +de.MyCompXSL=XSL-Stylesheets für KDBX-XML-Dateien +de.MyCompNGen=KeePass-Leistung optimieren +de.MyCompPreLoad=KeePass-Start-Leistung optimieren +de.MyStatusNGen=Optimiere KeePass-Leistung... +de.MyStatusPreLoad=Optimiere KeePass-Start-Leistung... +de.MyOptPlgPage=Die Plugins-Webseite öffnen + +es.MyCompCore=Archivos de instalación de KeePass +es.MyCompHelp=Manual del usuario +es.MyCompNtvLib=Biblioteca para soporte nativo +es.MyCompXSL=Hojas de estilo XSL para los archivos XML de KDBX +es.MyCompNGen=Optimizar el rendimiento de KeePass +es.MyCompPreLoad=Optimizar el rendimiento de inicio de KeePass +es.MyStatusNGen=Optimizando el rendimiento de KeePass... +es.MyStatusPreLoad=Optimizando el rendimiento de inicio de KeePass... +es.MyOptPlgPage=Abrir la página web de los complementos + +fi.MyCompCore=KeePassin ydintiedostot +fi.MyCompHelp=Käyttäjän opas +fi.MyCompNtvLib=Natiivitukikirjasto +fi.MyCompXSL=XSL-tyylarkit KDBX XML-tiedostoja varten +fi.MyCompNGen=KeePassin suorituksen optimointi +fi.MyCompPreLoad=KeePassin käynnistyksen optimointi +fi.MyStatusNGen=Optimoidaan KeePassin suoritusta... +fi.MyStatusPreLoad=Optimoidaan KeePassin käynnistystä... +fi.MyOptPlgPage=Avaa liitännäiset ja laajennukset sisältävä sivusto + +fr.MyCompCore=Fichiers de base KeePass +fr.MyCompHelp=Manuel de l'utilisateur +fr.MyCompNtvLib=Bibliothèque de support native +fr.MyCompXSL=Feuilles de style XSL pour les fichiers KDBX XML +fr.MyCompNGen=Optimiser les performances de KeePass +fr.MyCompPreLoad=Optimiser les performances de démarrage de KeePass +fr.MyStatusNGen=En cours d'optimisation des performances de KeePass... +fr.MyStatusPreLoad=En cours d'optimisation des performances de démarrage de KeePass... +fr.MyOptPlgPage=Ouvre la page des greffons (plugins) sur la toile + +; hu.MyCompCore=KeePass nélkülözhetetlen fájlok +; hu.MyCompHelp=Használati utasítás +; hu.MyCompNtvLib=Natív támogatási könyvtár +; hu.MyCompXSL=XSL stíluslapok a KDBX XML fájlokhoz +; hu.MyCompNGen=Optimalizálja a KeePass teljesítményét +; hu.MyCompPreLoad=Optimalizálja a KeePass indítási teljesítményét +; hu.MyStatusNGen=A KeePass teljesítményének optimalizálása... +; hu.MyStatusPreLoad=A KeePass indítási teljesítményének optimalizálása... +; hu.MyOptPlgPage=Nyissa meg a bővítmények weboldalát + +it.MyCompCore=File core di KeePass +it.MyCompHelp=Manuale utente +it.MyCompNtvLib=Libreria di supporto nativa +it.MyCompXSL=Fogli di stile XSL per i file KDBX XML +it.MyCompNGen=Ottimizza le prestazioni di KeePass +it.MyCompPreLoad=Ottimizza le prestazioni di avvio di KeePass +it.MyStatusNGen=Ottimizzazione delle prestazioni di KeePass... +it.MyStatusPreLoad=Ottimizzazione delle prestazioni di avvio di KeePass... +it.MyOptPlgPage=Apri la pagina web dei plug-in + +ja.MyCompCore=KeePassのコアファイル +ja.MyCompHelp=ユーザーマニュアル +ja.MyCompNtvLib=ネイティブサポートライブラリ +ja.MyCompXSL=KDBXのXMLファイル用XSLスタイルシート +ja.MyCompNGen=KeePassのパフォーマンスを最適化 +ja.MyCompPreLoad=KeePassの起動パフォーマンスを最適化 +ja.MyStatusNGen=KeePassのパフォーマンスを最適化中... +ja.MyStatusPreLoad=KeePassの起動パフォーマンスを最適化中... +ja.MyOptPlgPage=プラグインのWebページを開きます。 + +nl.MyCompCore=KeePass basisbestanden +nl.MyCompHelp=Handleiding +nl.MyCompNtvLib=Standaard bestandsondersteuning +nl.MyCompXSL=XSL stylesheets voor KDBX XML bestanden +nl.MyCompNGen=Optimaliseer KeePass prestaties +nl.MyCompPreLoad=Optimaliseer KeePass opstartprestaties +nl.MyStatusNGen=KeePass prestaties optimaliseren... +nl.MyStatusPreLoad=KeePass opstartprestaties optimaliseren... +nl.MyOptPlgPage=Open de plugins webpagina + +pl.MyCompCore=Główne pliki KeePassa +pl.MyCompHelp=Przewodnik użytkownika +pl.MyCompNtvLib=Wbudowana obsługa dodatkowych funkcji +pl.MyCompXSL=Arkusze stylów XSL dla plików KDBX XML +pl.MyCompNGen=Optymalizuj wydajność KeePassa +pl.MyCompPreLoad=Optymalizuj czas uruchamiania KeePassa +pl.MyStatusNGen=Optymalizowanie wydajności KeePassa... +pl.MyStatusPreLoad=Optymalizowanie czasu uruchamiania KeePassa... +pl.MyOptPlgPage=Otwórz stronę internetową z wtyczkami + +ptBR.MyCompCore=Arquivos principais do KeePass +ptBR.MyCompHelp=Manual do usuário +ptBR.MyCompNtvLib=Biblioteca de suporte nativo +ptBR.MyCompXSL=Folhas de estilo XSL para arquivos XML KDBX +ptBR.MyCompNGen=Otimizar desempenho do KeePass +ptBR.MyCompPreLoad=Otimizar desempenho da inicialização do KeePass +ptBR.MyStatusNGen=Otimizando desempenho do KeePass... +ptBR.MyStatusPreLoad=Otimizando desempenho da inicialização do KeePass... +ptBR.MyOptPlgPage=Abrir página web dos plugins + +ptPT.MyCompCore=Ficheiros principais do KeePass +ptPT.MyCompHelp=Manual do utilizador +ptPT.MyCompNtvLib=Biblioteca de suporte nativo +ptPT.MyCompXSL=Folhas de estilo XSL para ficheiros XML KDBX +ptPT.MyCompNGen=Otimize o desempenho do KeePass +ptPT.MyCompPreLoad=Otimize o desempenho do arranque do KeePass +ptPT.MyStatusNGen=Otimizando o desempenho do KeePass... +ptPT.MyStatusPreLoad=Otimizando o desempenho do arranque do KeePass... +ptPT.MyOptPlgPage=Abrir a página web dos miniaplicativos + +ru.MyCompCore=Основные файлы KeePass +ru.MyCompHelp=Руководство пользователя +ru.MyCompNtvLib=Встроенная библиотека поддержки +ru.MyCompXSL=Таблицы стилей XSL для XML-файлов KDBX +ru.MyCompNGen=Оптимизировать производительность KeePass +ru.MyCompPreLoad=Оптимизировать скорость запуска KeePass +ru.MyStatusNGen=Оптимизация производительности KeePass... +ru.MyStatusPreLoad=Оптимизация скорости запуска KeePass... +ru.MyOptPlgPage=Открыть веб-страницу плагинов + +[Tasks] +Name: FileAssoc; Description: {cm:AssocFileExtension,{#MyAppNameShort},.kdbx} +Name: DesktopIcon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked +Name: QuickLaunchIcon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked + +[Components] +Name: Core; Description: "{cm:MyCompCore}"; Flags: fixed; Types: full compact custom +Name: UserDoc; Description: "{cm:MyCompHelp}"; Types: full custom +Name: KeePassLibC; Description: "{cm:MyCompNtvLib}"; Types: full custom +; Name: NativeLib; Description: Native Crypto Library (Fast Key Transformations); Types: full custom +Name: XSL; Description: "{cm:MyCompXSL}"; Types: full custom +Name: NGen; Description: "{cm:MyCompNGen}"; Types: full custom; ExtraDiskSpaceRequired: 8388608 +Name: PreLoad; Description: "{cm:MyCompPreLoad}"; Types: full custom; ExtraDiskSpaceRequired: 2048 +; Name: FileAssoc; Description: {cm:AssocFileExtension,{#MyAppNameShort},.kdbx}; Types: full custom + +[Dirs] +Name: "{app}\Languages"; Flags: uninsalwaysuninstall +Name: "{app}\Plugins"; Flags: uninsalwaysuninstall + +[Files] +Source: ..\Build\KeePass_Distrib\KeePass.exe; DestDir: {app}; Flags: ignoreversion; Components: Core +Source: ..\Build\KeePass_Distrib\KeePass.XmlSerializers.dll; DestDir: {app}; Flags: ignoreversion; Components: Core +Source: ..\Build\KeePass_Distrib\KeePass.exe.config; DestDir: {app}; Flags: ignoreversion; Components: Core +Source: ..\Build\KeePass_Distrib\KeePass.config.xml; DestDir: {app}; Flags: ignoreversion; Components: Core +Source: ..\Build\KeePass_Distrib\License.txt; DestDir: {app}; Flags: ignoreversion; Components: Core +Source: ..\Build\KeePass_Distrib\ShInstUtil.exe; DestDir: {app}; Flags: ignoreversion; Components: Core +Source: ..\Build\KeePass_Distrib\KeePass.chm; DestDir: {app}; Flags: ignoreversion; Components: UserDoc +Source: ..\Build\KeePass_Distrib\KeePassLibC32.dll; DestDir: {app}; Flags: ignoreversion; Components: KeePassLibC +Source: ..\Build\KeePass_Distrib\KeePassLibC64.dll; DestDir: {app}; Flags: ignoreversion; Components: KeePassLibC +; Source: ..\Build\KeePass_Distrib\KeePassNtv32.dll; DestDir: {app}; Flags: ignoreversion; Components: NativeLib +; Source: ..\Build\KeePass_Distrib\KeePassNtv64.dll; DestDir: {app}; Flags: ignoreversion; Components: NativeLib +Source: ..\Build\KeePass_Distrib\XSL\KDBX_Common.xsl; DestDir: {app}\XSL; Flags: ignoreversion; Components: XSL +Source: ..\Build\KeePass_Distrib\XSL\KDBX_DetailsFull_HTML.xsl; DestDir: {app}\XSL; Flags: ignoreversion; Components: XSL +Source: ..\Build\KeePass_Distrib\XSL\KDBX_DetailsLight_HTML.xsl; DestDir: {app}\XSL; Flags: ignoreversion; Components: XSL +Source: ..\Build\KeePass_Distrib\XSL\KDBX_PasswordsOnly_TXT.xsl; DestDir: {app}\XSL; Flags: ignoreversion; Components: XSL +Source: ..\Build\KeePass_Distrib\XSL\KDBX_Tabular_HTML.xsl; DestDir: {app}\XSL; Flags: ignoreversion; Components: XSL + +[Registry] +; Always unregister .kdbx association at uninstall +Root: HKCR; Subkey: .kdbx; Flags: uninsdeletekey; Tasks: not FileAssoc +Root: HKCR; Subkey: kdbxfile; Flags: uninsdeletekey; Tasks: not FileAssoc +; Register .kdbx association at install, and unregister at uninstall +Root: HKCR; Subkey: .kdbx; ValueType: string; ValueData: kdbxfile; Flags: uninsdeletekey; Tasks: FileAssoc +Root: HKCR; Subkey: kdbxfile; ValueType: string; ValueData: KeePass Database; Flags: uninsdeletekey; Tasks: FileAssoc +Root: HKCR; Subkey: kdbxfile; ValueType: string; ValueName: AlwaysShowExt; Flags: uninsdeletekey; Tasks: FileAssoc +Root: HKCR; Subkey: kdbxfile\DefaultIcon; ValueType: string; ValueData: """{app}\{#MyAppExeName}"",0"; Flags: uninsdeletekey; Tasks: FileAssoc +Root: HKCR; Subkey: kdbxfile\shell\open; ValueType: string; ValueData: &Open with {#MyAppName}; Flags: uninsdeletekey; Tasks: FileAssoc +Root: HKCR; Subkey: kdbxfile\shell\open\command; ValueType: string; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Flags: uninsdeletekey; Tasks: FileAssoc + +; [INI] +; Filename: {app}\{#MyAppUrlName}; Section: InternetShortcut; Key: URL; String: {#MyAppURL} + +[Icons] +; Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName} +; Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {app}\{#MyAppUrlName} +; Name: {group}\Help; Filename: {app}\{#MyAppHelpName}; Components: UserDoc +; Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe} +Name: {autoprograms}\{#MyAppNameShortEx}; Filename: {app}\{#MyAppExeName} +Name: {userdesktop}\{#MyAppNameShortEx}; Filename: {app}\{#MyAppExeName}; Tasks: DesktopIcon; Check: MyDesktopCheck +Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppNameShortEx}; Filename: {app}\{#MyAppExeName}; Tasks: QuickLaunchIcon; Check: MyAppDataCheck + +[Run] +; Filename: {app}\KeePass.exe; Parameters: -RegisterFileExt; Components: FileAssoc +Filename: {app}\ShInstUtil.exe; Parameters: net_check; WorkingDir: {app}; Flags: skipifdoesntexist skipifsilent +Filename: {app}\ShInstUtil.exe; Parameters: preload_register; WorkingDir: {app}; StatusMsg: "{cm:MyStatusPreLoad}"; Flags: skipifdoesntexist; Components: PreLoad +Filename: {app}\ShInstUtil.exe; Parameters: ngen_install; WorkingDir: {app}; StatusMsg: "{cm:MyStatusNGen}"; Flags: skipifdoesntexist; Components: NGen +Filename: {app}\{#MyAppExeName}; Description: "{cm:LaunchProgram,{#MyAppNameShort}}"; Flags: postinstall nowait skipifsilent +Filename: "https://keepass.info/plugins.html"; Description: "{cm:MyOptPlgPage}"; Flags: postinstall shellexec skipifsilent unchecked + +[UninstallRun] +; Filename: {app}\KeePass.exe; Parameters: -UnregisterFileExt +Filename: {app}\ShInstUtil.exe; Parameters: preload_unregister; WorkingDir: {app}; Flags: skipifdoesntexist; RunOnceId: "PreLoad"; Components: PreLoad +Filename: {app}\ShInstUtil.exe; Parameters: ngen_uninstall; WorkingDir: {app}; Flags: skipifdoesntexist; RunOnceId: "NGen"; Components: NGen + +; Delete old files when upgrading +[InstallDelete] +Name: {app}\{#MyAppUrlName}; Type: files +Name: {app}\XSL\KDBX_DetailsFull.xsl; Type: files +Name: {app}\XSL\KDBX_DetailsLite.xsl; Type: files +Name: {app}\XSL\KDBX_PasswordsOnly.xsl; Type: files +Name: {app}\XSL\KDBX_Styles.css; Type: files +Name: {app}\XSL\KDBX_Tabular.xsl; Type: files +Name: {app}\XSL\TableHeader.gif; Type: files +Name: {group}\{#MyAppName}.lnk; Type: files +Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}.lnk; Type: files +Name: {group}\Help.lnk; Type: files +Name: {group}\{cm:UninstallProgram,{#MyAppName}}.lnk; Type: files +Name: {group}; Type: dirifempty +Name: {userdesktop}\{#MyAppName}.lnk; Type: files; Check: MyDesktopCheck +Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}.lnk; Type: files; Check: MyAppDataCheck + +; [UninstallDelete] +; Type: files; Name: {app}\{#MyAppUrlName} + +[Code] +function MyDesktopCheck(): Boolean; +begin + try + ExpandConstant('{userdesktop}'); + Result := True; + except + Result := False; + end; +end; + +function MyAppDataCheck(): Boolean; +begin + try + ExpandConstant('{userappdata}'); + Result := True; + except + Result := False; + end; +end; + +function MyGetProgramFiles(Param: String): String; +begin + if IsWin64() then + Result := ExpandConstant('{autopf64}') + else + Result := ExpandConstant('{autopf}'); +end; diff --git a/src/Ext/KeePassMsi/KeePassMsi.sln b/src/Ext/KeePassMsi/KeePassMsi.sln new file mode 100644 index 0000000..f20a9e2 --- /dev/null +++ b/src/Ext/KeePassMsi/KeePassMsi.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.16 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "KeePassMsi", "KeePassMsi.vdproj", "{C4135368-4A84-4924-B5CE-82B18FAADFD4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Default = Debug|Default + Release|Default = Release|Default + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C4135368-4A84-4924-B5CE-82B18FAADFD4}.Debug|Default.ActiveCfg = Debug + {C4135368-4A84-4924-B5CE-82B18FAADFD4}.Debug|Default.Build.0 = Debug + {C4135368-4A84-4924-B5CE-82B18FAADFD4}.Release|Default.ActiveCfg = Release + {C4135368-4A84-4924-B5CE-82B18FAADFD4}.Release|Default.Build.0 = Release + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/Ext/KeePassMsi/KeePassMsi.vdproj b/src/Ext/KeePassMsi/KeePassMsi.vdproj new file mode 100644 index 0000000..1be1a38 --- /dev/null +++ b/src/Ext/KeePassMsi/KeePassMsi.vdproj @@ -0,0 +1,1250 @@ +"DeployProject" +{ +"VSVersion" = "3:800" +"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" +"IsWebType" = "8:FALSE" +"ProjectName" = "8:KeePassMsi" +"LanguageId" = "3:1033" +"CodePage" = "3:1252" +"UILanguageId" = "3:1033" +"SccProjectName" = "8:" +"SccLocalPath" = "8:" +"SccAuxPath" = "8:" +"SccProvider" = "8:" + "Hierarchy" + { + "Entry" + { + "MsmKey" = "8:_092CBAA0A0914855A6FDE86CD482FD39" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1FC6DBE255BB4666BC86F87988C881A0" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_22BA2527C1AC43E5B61F88AA217DF2E2" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2A0C1DA9803A47F5842BC63F7CC0FEBC" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_442863E39B69D2D0EE0DFF0823AF5611" + "OwnerKey" = "8:_8C05ADB649434D7892E36709EBDED4CC" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_46CD3E3687454981A64BCF41FB207030" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4F601F0D55964BDF9EF93A6D6B3FFD4F" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_71B4B6B66D7B48478B4C9A237064F77A" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8C05ADB649434D7892E36709EBDED4CC" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_9473A3E101A1441894F0176A3A583551" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_9BCEB0D341714092A0374B47DA8238DD" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A13624F7FFFD46FFA9EA3509BBB398FD" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A2213A2E9D2B46D9ABB41BDE043EB6B1" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_B354F7D87A064AA0BBC71E3926639333" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C34738027450488E935C153E9FD57296" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4F8814F844C43EE8C9F5B662182B11A" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_8C05ADB649434D7892E36709EBDED4CC" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_442863E39B69D2D0EE0DFF0823AF5611" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_C4F8814F844C43EE8C9F5B662182B11A" + "MsmSig" = "8:_UNDEFINED" + } + } + "Configurations" + { + "Debug" + { + "DisplayName" = "8:Debug" + "IsDebugOnly" = "11:TRUE" + "IsReleaseOnly" = "11:FALSE" + "OutputFilename" = "8:..\\..\\Build\\KeePassMsi\\Debug\\KeePass.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:3" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:FALSE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + } + } + } + "Release" + { + "DisplayName" = "8:Release" + "IsDebugOnly" = "11:FALSE" + "IsReleaseOnly" = "11:TRUE" + "OutputFilename" = "8:..\\..\\Build\\KeePassMsi\\Release\\KeePass.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:3" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:FALSE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + } + } + } + } + "Deployable" + { + "CustomAction" + { + } + "DefaultFeature" + { + "Name" = "8:DefaultFeature" + "Title" = "8:" + "Description" = "8:" + } + "ExternalPersistence" + { + "LaunchCondition" + { + "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_B360A87AC4E743ADA53B9FFAAF1F5346" + { + "Name" = "8:.NET Framework" + "Message" = "8:[VSDNETMSG]" + "FrameworkVersion" = "8:ANY" + "AllowLaterVersions" = "11:FALSE" + "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=76617" + } + } + } + "File" + { + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_092CBAA0A0914855A6FDE86CD482FD39" + { + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDBX_Tabular_HTML.xsl" + "TargetName" = "8:KDBX_Tabular_HTML.xsl" + "Tag" = "8:" + "Folder" = "8:_76A04227854C4619BBADCC3E5C2829AE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1FC6DBE255BB4666BC86F87988C881A0" + { + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDBX_DetailsLight_HTML.xsl" + "TargetName" = "8:KDBX_DetailsLight_HTML.xsl" + "Tag" = "8:" + "Folder" = "8:_76A04227854C4619BBADCC3E5C2829AE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_22BA2527C1AC43E5B61F88AA217DF2E2" + { + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\KeePassLibC32.dll" + "TargetName" = "8:KeePassLibC32.dll" + "Tag" = "8:" + "Folder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2A0C1DA9803A47F5842BC63F7CC0FEBC" + { + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\KeePass.chm" + "TargetName" = "8:KeePass.chm" + "Tag" = "8:" + "Folder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_442863E39B69D2D0EE0DFF0823AF5611" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:KeePass, Version=2.53.0.18479, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL" + "ScatterAssemblies" + { + } + "SourcePath" = "8:KeePass.EXE" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_46CD3E3687454981A64BCF41FB207030" + { + "SourcePath" = "8:..\\..\\KeePass\\KeePass.ico" + "TargetName" = "8:KeePassIcon.ico" + "Tag" = "8:" + "Folder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4F601F0D55964BDF9EF93A6D6B3FFD4F" + { + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDBX_DetailsFull_HTML.xsl" + "TargetName" = "8:KDBX_DetailsFull_HTML.xsl" + "Tag" = "8:" + "Folder" = "8:_76A04227854C4619BBADCC3E5C2829AE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_71B4B6B66D7B48478B4C9A237064F77A" + { + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\KeePass.exe.config" + "TargetName" = "8:KeePass.exe.config" + "Tag" = "8:" + "Folder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_8C05ADB649434D7892E36709EBDED4CC" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:KeePass.XmlSerializers, Version=2.53.0.18479, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_8C05ADB649434D7892E36709EBDED4CC" + { + "Name" = "8:KeePass.XmlSerializers.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\KeePass.XmlSerializers.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9473A3E101A1441894F0176A3A583551" + { + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDBX_Common.xsl" + "TargetName" = "8:KDBX_Common.xsl" + "Tag" = "8:" + "Folder" = "8:_76A04227854C4619BBADCC3E5C2829AE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9BCEB0D341714092A0374B47DA8238DD" + { + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\KeePassLibC64.dll" + "TargetName" = "8:KeePassLibC64.dll" + "Tag" = "8:" + "Folder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A13624F7FFFD46FFA9EA3509BBB398FD" + { + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\KeePass.config.xml" + "TargetName" = "8:KeePass.config.xml" + "Tag" = "8:" + "Folder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A2213A2E9D2B46D9ABB41BDE043EB6B1" + { + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\XSL\\KDBX_PasswordsOnly_TXT.xsl" + "TargetName" = "8:KDBX_PasswordsOnly_TXT.xsl" + "Tag" = "8:" + "Folder" = "8:_76A04227854C4619BBADCC3E5C2829AE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B354F7D87A064AA0BBC71E3926639333" + { + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\ShInstUtil.exe" + "TargetName" = "8:ShInstUtil.exe" + "Tag" = "8:" + "Folder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C34738027450488E935C153E9FD57296" + { + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\License.txt" + "TargetName" = "8:License.txt" + "Tag" = "8:" + "Folder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C4F8814F844C43EE8C9F5B662182B11A" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:KeePass, Version=2.53.0.18479, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_C4F8814F844C43EE8C9F5B662182B11A" + { + "Name" = "8:KeePass.exe" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:..\\..\\Build\\KeePass_Distrib\\KeePass.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + } + "FileType" + { + "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_7BABCD00223047B785A71DFBB11D9B48" + { + "Name" = "8:KeePass Database" + "Description" = "8:" + "Extensions" = "8:kdbx" + "MIME" = "8:" + "Icon" = "8:_46CD3E3687454981A64BCF41FB207030" + "IconIndex" = "3:0" + "Command" + { + "Command" = "8:_C4F8814F844C43EE8C9F5B662182B11A" + } + "Verbs" + { + "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_33B042E70FCE442EB6C1AD610694DFD5" + { + "Command" = "8:&Open" + "Verb" = "8:open" + "Arguments" = "8:\"%1\"" + "Order" = "3:0" + } + } + } + } + "Folder" + { + "{3C67513D-01DD-4637-8A68-80971EB9504F}:_02F929C52C1D41D29CB593270C6D1DC6" + { + "DefaultLocation" = "8:[ProgramFilesFolder]KeePass2x" + "Name" = "8:#1925" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:TARGETDIR" + "Folders" + { + "{9EF0B969-E518-4E46-987F-47570745A589}:_650CFBE3ACEC49F281DA5C781D164F2B" + { + "Name" = "8:Languages" + "AlwaysCreate" = "11:TRUE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_A866B7F9250C42C49D83E0C115F4E016" + "Folders" + { + } + } + "{9EF0B969-E518-4E46-987F-47570745A589}:_76A04227854C4619BBADCC3E5C2829AE" + { + "Name" = "8:XSL" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_04DFBD4168EF4BFD8825BA692441B287" + "Folders" + { + } + } + "{9EF0B969-E518-4E46-987F-47570745A589}:_F7FA774F4B0E4A3FB0F1FA4743CF06C8" + { + "Name" = "8:Plugins" + "AlwaysCreate" = "11:TRUE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_83A2FA647E5D4F68A9F210FC7878D245" + "Folders" + { + } + } + } + } + "{1525181F-901A-416C-8A58-119130FE478E}:_8285FAA6D5774714AB190FF7FA5604FB" + { + "Name" = "8:#1919" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:ProgramMenuFolder" + "Folders" + { + "{9EF0B969-E518-4E46-987F-47570745A589}:_C5518630440D4460BD3C92160ACB1712" + { + "Name" = "8:KeePass" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_71CA578B76DC40C6A8B7FBD159CDBC1A" + "Folders" + { + } + } + } + } + "{1525181F-901A-416C-8A58-119130FE478E}:_CD17966DB7404B60877D38C1EE806E5B" + { + "Name" = "8:#1916" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:DesktopFolder" + "Folders" + { + } + } + } + "LaunchCondition" + { + } + "Locator" + { + } + "MsiBootstrapper" + { + "LangId" = "3:1033" + "RequiresElevation" = "11:FALSE" + } + "Product" + { + "Name" = "8:Microsoft Visual Studio" + "ProductName" = "8:KeePass 2.53" + "ProductCode" = "8:{0C1CDCE1-3866-493B-A57F-0183D9BFDD04}" + "PackageCode" = "8:{F3BAC6F8-2A77-49F5-994D-D1CB4E970595}" + "UpgradeCode" = "8:{F2F19898-4F86-4940-9BFA-426574CE03E1}" + "AspNetVersion" = "8:4.0.30319.0" + "RestartWWWService" = "11:FALSE" + "RemovePreviousVersions" = "11:TRUE" + "DetectNewerInstalledVersion" = "11:TRUE" + "InstallAllUsers" = "11:TRUE" + "ProductVersion" = "8:2.53.0" + "Manufacturer" = "8:Dominik Reichl" + "ARPHELPTELEPHONE" = "8:" + "ARPHELPLINK" = "8:https://keepass.info/" + "Title" = "8:KeePass Setup" + "Subject" = "8:KeePass Password Safe" + "ARPCONTACT" = "8:Dominik Reichl" + "Keywords" = "8:" + "ARPCOMMENTS" = "8:" + "ARPURLINFOABOUT" = "8:https://keepass.info/" + "ARPPRODUCTICON" = "8:_46CD3E3687454981A64BCF41FB207030" + "ARPIconIndex" = "3:0" + "SearchPath" = "8:" + "UseSystemSearchPath" = "11:TRUE" + "TargetPlatform" = "3:0" + "PreBuildEvent" = "8:" + "PostBuildEvent" = "8:" + "RunPostBuildEvent" = "3:0" + } + "Registry" + { + "HKLM" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C5EBC4EA7F4A4F02BD195E1047CD2D03" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8408784FC07F4908A396060A977864FA" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCU" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_262C9049A6B143369D448CE3C70D8EE5" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_22DFF8BEC1B745DF969ABE72FF0B968A" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCR" + { + "Keys" + { + } + } + "HKU" + { + "Keys" + { + } + } + "HKPU" + { + "Keys" + { + } + } + } + "Sequences" + { + } + "Shortcut" + { + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_B9061F34EC304CA08E34DD695F741D2D" + { + "Name" = "8:KeePass User Manual" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_2A0C1DA9803A47F5842BC63F7CC0FEBC" + "Folder" = "8:_C5518630440D4460BD3C92160ACB1712" + "WorkingFolder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Icon" = "8:" + "Feature" = "8:" + } + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_D4CD5274BA6C4E25937C7C422285FBCB" + { + "Name" = "8:KeePass" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_C4F8814F844C43EE8C9F5B662182B11A" + "Folder" = "8:_CD17966DB7404B60877D38C1EE806E5B" + "WorkingFolder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Icon" = "8:_46CD3E3687454981A64BCF41FB207030" + "Feature" = "8:" + } + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_E64C38ED6AED4249B632955704092C33" + { + "Name" = "8:KeePass" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_C4F8814F844C43EE8C9F5B662182B11A" + "Folder" = "8:_C5518630440D4460BD3C92160ACB1712" + "WorkingFolder" = "8:_02F929C52C1D41D29CB593270C6D1DC6" + "Icon" = "8:_46CD3E3687454981A64BCF41FB207030" + "Feature" = "8:" + } + } + "UserInterface" + { + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_0AEBAAEF47704E8B9A01C6CB1E62FDBD" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdUserInterface.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_0CDFE41F4D01459286E7AFC52A7A9277" + { + "Name" = "8:#1900" + "Sequence" = "3:1" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_5861FDDB998C4FD1B1873B4342542B84" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "InstallAllUsersVisible" + { + "Name" = "8:InstallAllUsersVisible" + "DisplayName" = "8:#1059" + "Description" = "8:#1159" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7FC84AF39FDF4EC4BC98AB5AA8A2C381" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:KeePass: Copyright 2003-2023 Dominik Reichl. The software is distributed under the terms of the GNU General Public License version 2 or later." + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E3C24FFA9AD74248A8825644371FB17D" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_1F185A5B22D443A8A99D2A777A370EF7" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D035303469A14DEB8F3431B84D01CC88" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "UpdateText" + { + "Name" = "8:UpdateText" + "DisplayName" = "8:#1058" + "Description" = "8:#1158" + "Type" = "3:15" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1258" + "DefaultValue" = "8:#1258" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_5BB2AB842E494718822EA43B48741CFF" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_267559472A6540C0ABEB216DE61BC2ED" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:KeePass: Copyright 2003-2023 Dominik Reichl. The software is distributed under the terms of the GNU General Public License version 2 or later." + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_60D4F895DECE471F8ED4CDF61AA25B54" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_EDDAA1C6104A4A66917AC39A88839596" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_614D264D47264F6DBD8EB6EA348B4547" + { + "Name" = "8:#1901" + "Sequence" = "3:1" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_0F1ACBA89BC94B0C976878701159E964" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_7FB322B6256147D2948431F3FC326234" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_92F56F1C382B496EB552FC1054921EA6" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_8033517407B24C178237C0535336BD6A" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdBasicDialogs.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_867192A49F194B79BD5113B27E970F8F" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_07EF6E21553142618A6718FD92103A1C" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + } + "MergeModule" + { + } + "ProjectOutput" + { + } + } +} diff --git a/src/Ext/KeePass_NoVer.exe.config b/src/Ext/KeePass_NoVer.exe.config new file mode 100644 index 0000000..cc90b1b --- /dev/null +++ b/src/Ext/KeePass_NoVer.exe.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/Ext/PublicKeys/ArcFourCipher.pk b/src/Ext/PublicKeys/ArcFourCipher.pk new file mode 100644 index 0000000000000000000000000000000000000000..179dd73f8b7608a3316496f27045207b4893f463 GIT binary patch literal 160 zcmV;R0AK$ABme*efB*oL000060ssI2Bme+XQ$aBR1ONa50097RrzH8+xr5NjY?XeI zl+%m1hO(^pbJ|7U2-{-{p@B)O0fnjpN*%pzT=mH5R&`Rm*b@ksu)3#{~CcI9UI^nFdhSKjL2wX!5(-bWEFoz+` Oq$-Nvlml2WLm;p=#Y2<; literal 0 HcmV?d00001 diff --git a/src/Ext/PublicKeys/SamplePlugin.pk b/src/Ext/PublicKeys/SamplePlugin.pk new file mode 100644 index 0000000000000000000000000000000000000000..9b30be4addcdab790a069869f295e9c2065cc9da GIT binary patch literal 160 zcmV;R0AK$ABme*efB*oL000060ssI2Bme+XQ$aBR1ONa50096+eAMESbH*+?2{JgK zF3CrwS$0XeR#C_IrsqVI91lPd{FY=6W`I#_Q{=Mk@A6xuMD!C>rptq-x(`=HVkauA z!JXgdXS`v3(|2+W3j`)wICfrMxO+`xH@tdwr!r#W&X=;rV^d$8caaj*!>+0kI<&D$ OcEO>q7Oc3D;Mu(IenI&F literal 0 HcmV?d00001 diff --git a/src/Ext/Resources/LockOverlay16.png b/src/Ext/Resources/LockOverlay16.png new file mode 100644 index 0000000000000000000000000000000000000000..8e6e81b49565e94684a17e75a57cfa142bdf41b8 GIT binary patch literal 804 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 literal 0 HcmV?d00001 diff --git a/src/Ext/TrlUtil.exe.config b/src/Ext/TrlUtil.exe.config new file mode 100644 index 0000000..cc90b1b --- /dev/null +++ b/src/Ext/TrlUtil.exe.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/Ext/XSL/KDBX_Common.xsl b/src/Ext/XSL/KDBX_Common.xsl new file mode 100644 index 0000000..19d87b0 --- /dev/null +++ b/src/Ext/XSL/KDBX_Common.xsl @@ -0,0 +1,111 @@ + + + + + + + + +
+
+ + + ]]> + + ]]> + + + + + ]]> + + + + + + +/* <]]> */ + +]]> + + + + + + + KDBX Common + + +

The KDBX_Common.xsl stylesheet is not supposed to be used directly.

+ + + + + diff --git a/src/Ext/XSL/KDBX_DetailsFull_HTML.xsl b/src/Ext/XSL/KDBX_DetailsFull_HTML.xsl new file mode 100644 index 0000000..f833aaf --- /dev/null +++ b/src/Ext/XSL/KDBX_DetailsFull_HTML.xsl @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + <xsl:if test="DatabaseName != ''"> + <xsl:value-of select="DatabaseName" /> + </xsl:if> + <xsl:if test="DatabaseName = ''"> + <xsl:text>Database</xsl:text> + </xsl:if> + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + User Name: + + + + Password: + + + + + URL: + + + + + + + + + + + Notes: + + + + + + + + + + : + + + + + + + + + +Creation Time: + + +Last Modification Time: + + + +Expires: + + + + + Never expires + + + +
+ + +
+ +
diff --git a/src/Ext/XSL/KDBX_DetailsLight_HTML.xsl b/src/Ext/XSL/KDBX_DetailsLight_HTML.xsl new file mode 100644 index 0000000..937ba3c --- /dev/null +++ b/src/Ext/XSL/KDBX_DetailsLight_HTML.xsl @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + <xsl:if test="DatabaseName != ''"> + <xsl:value-of select="DatabaseName" /> + </xsl:if> + <xsl:if test="DatabaseName = ''"> + <xsl:text>Database</xsl:text> + </xsl:if> + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + User Name: + + + + Password: + + + + + URL: + + + + + + + + + + + Notes: + + + + + + + + + + : + + + + + + + + + +
+ + +
+ +
diff --git a/src/Ext/XSL/KDBX_PasswordsOnly_TXT.xsl b/src/Ext/XSL/KDBX_PasswordsOnly_TXT.xsl new file mode 100644 index 0000000..82ec1d7 --- /dev/null +++ b/src/Ext/XSL/KDBX_PasswordsOnly_TXT.xsl @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ext/XSL/KDBX_Tabular_HTML.xsl b/src/Ext/XSL/KDBX_Tabular_HTML.xsl new file mode 100644 index 0000000..b59c233 --- /dev/null +++ b/src/Ext/XSL/KDBX_Tabular_HTML.xsl @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + <xsl:if test="DatabaseName != ''"> + <xsl:value-of select="DatabaseName" /> + </xsl:if> + <xsl:if test="DatabaseName = ''"> + <xsl:text>Database</xsl:text> + </xsl:if> + + + + + + + + +

+ + + + + + + + + + + + +
TitleUser NamePasswordURLNotes
+ + +  

]]>
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/KeePass.sln b/src/KeePass.sln new file mode 100644 index 0000000..c4c0c52 --- /dev/null +++ b/src/KeePass.sln @@ -0,0 +1,61 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeePassLib", "KeePassLib\KeePassLib.csproj", "{53573E4E-33CB-4FDB-8698-C95F5E40E7F3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeePass", "KeePass\KeePass.csproj", "{10938016-DEE2-4A25-9A5A-8FD3444379CA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrlUtil", "Translation\TrlUtil\TrlUtil.csproj", "{B7E890E7-BF50-4450-9A52-C105BD98651C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {53573E4E-33CB-4FDB-8698-C95F5E40E7F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53573E4E-33CB-4FDB-8698-C95F5E40E7F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53573E4E-33CB-4FDB-8698-C95F5E40E7F3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {53573E4E-33CB-4FDB-8698-C95F5E40E7F3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {53573E4E-33CB-4FDB-8698-C95F5E40E7F3}.Debug|Win32.ActiveCfg = Debug|Any CPU + {53573E4E-33CB-4FDB-8698-C95F5E40E7F3}.Debug|x64.ActiveCfg = Debug|Any CPU + {53573E4E-33CB-4FDB-8698-C95F5E40E7F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53573E4E-33CB-4FDB-8698-C95F5E40E7F3}.Release|Any CPU.Build.0 = Release|Any CPU + {53573E4E-33CB-4FDB-8698-C95F5E40E7F3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {53573E4E-33CB-4FDB-8698-C95F5E40E7F3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {53573E4E-33CB-4FDB-8698-C95F5E40E7F3}.Release|Win32.ActiveCfg = Release|Any CPU + {53573E4E-33CB-4FDB-8698-C95F5E40E7F3}.Release|x64.ActiveCfg = Release|Any CPU + {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Debug|Win32.ActiveCfg = Debug|Any CPU + {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Debug|x64.ActiveCfg = Debug|Any CPU + {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Release|Any CPU.Build.0 = Release|Any CPU + {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Release|Win32.ActiveCfg = Release|Any CPU + {10938016-DEE2-4A25-9A5A-8FD3444379CA}.Release|x64.ActiveCfg = Release|Any CPU + {B7E890E7-BF50-4450-9A52-C105BD98651C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7E890E7-BF50-4450-9A52-C105BD98651C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7E890E7-BF50-4450-9A52-C105BD98651C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {B7E890E7-BF50-4450-9A52-C105BD98651C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {B7E890E7-BF50-4450-9A52-C105BD98651C}.Debug|Win32.ActiveCfg = Debug|Any CPU + {B7E890E7-BF50-4450-9A52-C105BD98651C}.Debug|x64.ActiveCfg = Debug|Any CPU + {B7E890E7-BF50-4450-9A52-C105BD98651C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7E890E7-BF50-4450-9A52-C105BD98651C}.Release|Any CPU.Build.0 = Release|Any CPU + {B7E890E7-BF50-4450-9A52-C105BD98651C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {B7E890E7-BF50-4450-9A52-C105BD98651C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {B7E890E7-BF50-4450-9A52-C105BD98651C}.Release|Win32.ActiveCfg = Release|Any CPU + {B7E890E7-BF50-4450-9A52-C105BD98651C}.Release|x64.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/KeePass/App/AppDefs.cs b/src/KeePass/App/AppDefs.cs new file mode 100644 index 0000000..4386507 --- /dev/null +++ b/src/KeePass/App/AppDefs.cs @@ -0,0 +1,374 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Windows.Forms; + +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Utility; + +namespace KeePass.App +{ + public static class AppDefs + { + public static readonly Color ColorControlNormal = SystemColors.Window; + public static readonly Color ColorControlDisabled = SystemColors.Control; + public static readonly Color ColorEditError = (UIUtil.IsDarkTheme ? + Color.FromArgb(128, 0, 0) : Color.FromArgb(255, 192, 192)); + + public static readonly Color ColorQualityLow = Color.FromArgb(255, 128, 0); + public static readonly Color ColorQualityHigh = Color.FromArgb(0, 255, 0); + public static readonly Color ColorQualityMid = Color.FromArgb(255, 255, 0); + + public static readonly string LanguagesDir = "Languages"; + + public static readonly string PluginsDir = "Plugins"; + public static readonly string PluginProductName = "KeePass Plugin"; + + public static readonly string XslFilesDir = "XSL"; + public static readonly string XslFileHtmlFull = "KDBX_DetailsFull_HTML.xsl"; + public static readonly string XslFileHtmlLight = "KDBX_DetailsLight_HTML.xsl"; + public static readonly string XslFileHtmlTabular = "KDBX_Tabular_HTML.xsl"; + + public static class FileNames + { + public static readonly string Program = "KeePass.exe"; + public static readonly string XmlSerializers = "KeePass.XmlSerializers.dll"; + + public static readonly string NativeLib32 = "KeePassLibC32.dll"; + public static readonly string NativeLib64 = "KeePassLibC64.dll"; + + public static readonly string ShInstUtil = "ShInstUtil.exe"; + } + + // internal const string MruNameValueSplitter = @"/::/"; + + /// + /// Hot key IDs (used in WM_HOTKEY window messages). + /// + public static class GlobalHotKeyId + { + public static readonly int AutoType = 195; + public static readonly int AutoTypePassword = 197; + public static readonly int AutoTypeSelected = 196; + public static readonly int ShowWindow = 226; + public static readonly int EntryMenu = 227; + + internal const int TempRegTest = 225; + } + + public static class HelpTopics + { + internal const string Default = "index"; + + public static readonly string Acknowledgements = "base/credits"; + public static readonly string License = "v2/license"; + + public static readonly string DatabaseSettings = "v2/dbsettings"; + public static readonly string DbSettingsGeneral = "general"; + public static readonly string DbSettingsSecurity = "security"; + // public static readonly string DbSettingsProtection = "protection"; + public static readonly string DbSettingsCompression = "compression"; + + public static readonly string AutoType = "base/autotype"; + public static readonly string AutoTypeObfuscation = "v2/autotype_obfuscation"; + public static readonly string AutoTypeWindowFilters = "autowindows"; + + public static readonly string Entry = "v2/entry"; + public static readonly string EntryGeneral = "gen"; + public static readonly string EntryStrings = "str"; + public static readonly string EntryAutoType = "at"; + public static readonly string EntryHistory = "hst"; + internal const string EntryAdvanced = "adv"; + internal const string EntryProperties = "prp"; + + public static readonly string KeySources = "base/keys"; + public static readonly string KeySourcesKeyFile = "keyfiles"; + public static readonly string KeySourcesUserAccount = "winuser"; + + public static readonly string PwGenerator = "base/pwgenerator"; + public static readonly string Search = "base/search"; + public static readonly string IOConnections = "v2/ioconnect"; + public static readonly string UrlField = "base/autourl"; + public static readonly string CommandLine = "base/cmdline"; + public static readonly string FieldRefs = "base/fieldrefs"; + + internal const string Placeholders = "base/placeholders"; + internal const string PlaceholdersOtp = "otp"; + + public static readonly string ImportExport = "base/importexport"; + public static readonly string ImportExportGenericCsv = "genericcsv"; + public static readonly string ImportExportSteganos = "imp_steganos"; + public static readonly string ImportExportPassKeeper = "imp_passkeeper"; + internal const string ImportExportParents = "exp_parents"; + + public static readonly string Security = "base/security"; + internal const string SecurityOptEx = "secoptex"; + internal const string SecurityOptAdm = "secoptadm"; + + public static readonly string AppPolicy = "v2/policy"; + + public static readonly string Triggers = "v2/triggers"; + public static readonly string TriggersEvents = "events"; + public static readonly string TriggersConditions = "conditions"; + public static readonly string TriggersActions = "actions"; + + public static readonly string TriggerUIStateUpd = "kb/trigger_uistateupd"; + + public static readonly string Setup = "v2/setup"; + public static readonly string SetupMono = "mono"; + + internal const string FaqTech = "base/faq_tech"; + internal const string FaqTechGuiDark = "guidark"; + internal const string FaqTechGuiFont = "guifont"; + + public static readonly string XmlReplace = "v2/xml_replace"; + + public static readonly string KbFaq = "kb/faq"; + public static readonly string KbFaqURtf = "urtf"; + } + + public static class CommandLineOptions + { + public static readonly string Password = "pw"; + public static readonly string KeyFile = "keyfile"; + public static readonly string UserAccount = "useraccount"; + + public static readonly string PasswordEncrypted = "pw-enc"; + public static readonly string PasswordStdIn = "pw-stdin"; + + public static readonly string PreSelect = "preselect"; + + public static readonly string IoCredUserName = "iousername"; + public static readonly string IoCredPassword = "iopassword"; + public static readonly string IoCredFromRecent = "iocredfromrecent"; + public static readonly string IoCredIsComplete = "ioiscomplete"; + + // User-friendly Pascal-case (shown in UAC dialog) + public static readonly string FileExtRegister = "RegisterFileExt"; + public static readonly string FileExtUnregister = "UnregisterFileExt"; + + public static readonly string PreLoad = "preload"; + // public static readonly string PreLoadRegister = "registerpreload"; + // public static readonly string PreLoadUnregister = "unregisterpreload"; + + public static readonly string ExitAll = "exit-all"; + public static readonly string Minimize = "minimize"; + public static readonly string AutoType = "auto-type"; + public static readonly string AutoTypePassword = "auto-type-password"; + public static readonly string AutoTypeSelected = "auto-type-selected"; + public static readonly string OpenEntryUrl = "entry-url-open"; + public static readonly string LockAll = "lock-all"; + public static readonly string UnlockAll = "unlock-all"; + public static readonly string Cancel = "cancel"; + public static readonly string IpcEvent = "e"; + public static readonly string IpcEvent1 = "e1"; + + public static readonly string Uuid = "uuid"; + public static readonly string Scheme = "scheme"; + public static readonly string Value = "value"; + public static readonly string Activate = "activate"; + + public static readonly string Help = "?"; + public static readonly string HelpLong = "help"; + + public static readonly string WorkaroundDisable = "wa-disable"; + public static readonly string WorkaroundEnable = "wa-enable"; + + public static readonly string ConfigPathLocal = "cfg-local"; + + public static readonly string ConfigSetUrlOverride = "set-urloverride"; + public static readonly string ConfigClearUrlOverride = "clear-urloverride"; + public static readonly string ConfigGetUrlOverride = "get-urloverride"; + public static readonly string ConfigAddUrlOverride = "add-urloverride"; + public static readonly string ConfigRemoveUrlOverride = "remove-urloverride"; + + public static readonly string ConfigSetLanguageFile = "set-languagefile"; + + public static readonly string PlgxCreate = "plgx-create"; + public static readonly string PlgxCreateInfo = "plgx-create-info"; + public static readonly string PlgxPrereqKP = "plgx-prereq-kp"; + public static readonly string PlgxPrereqNet = "plgx-prereq-net"; + public static readonly string PlgxPrereqOS = "plgx-prereq-os"; + public static readonly string PlgxPrereqPtr = "plgx-prereq-ptr"; + public static readonly string PlgxBuildPre = "plgx-build-pre"; + public static readonly string PlgxBuildPost = "plgx-build-post"; + + public static readonly string Debug = "debug"; + public static readonly string DebugThrowException = "debug-throwexcp"; + // public static readonly string SavePluginCompileRes = "saveplgxcr"; // Now: Debug + public static readonly string ShowAssemblyInfo = "showasminfo"; + public static readonly string MakeXmlSerializerEx = "makexmlserializerex"; + public static readonly string MakeXspFile = "makexspfile"; + +#if DEBUG + public static readonly string TestGfx = "testgfx"; +#endif + + public static readonly string Version = "version"; // For Unix + + // #if (DEBUG && !KeePassLibSD) + // public static readonly string MakePopularPasswordTable = "makepopularpasswordtable"; + // #endif + } + + public static class FileExtension + { + public static readonly string FileExt = "kdbx"; + public static readonly string FileExtId = "kdbxfile"; + + public static readonly string KeyFile = "keyx"; + internal const string KeyFileAlt = "key"; + } + + public static readonly string AutoRunName = "KeePass Password Safe 2"; + public static readonly string PreLoadName = "KeePass 2 PreLoad"; + + public static readonly string MutexName = "KeePassAppMutex"; + public static readonly string MutexNameGlobal = "KeePassAppMutexEx"; + + // public static readonly string ScriptExtension = "kps"; + + public static readonly int InvalidWindowValue = -16381; + + public static class NamedEntryColor + { + public static readonly Color LightRed = Color.FromArgb(255, 204, 204); + public static readonly Color LightGreen = Color.FromArgb(204, 255, 204); + public static readonly Color LightBlue = Color.FromArgb(153, 204, 255); + public static readonly Color LightYellow = Color.FromArgb(255, 255, 153); + } + + public static class FileDialogContext + { + // Values must not contain '@' + + public static readonly string Database = "Database"; + public static readonly string Sync = "Sync"; + public static readonly string KeyFile = "KeyFile"; + public static readonly string Import = "Import"; + public static readonly string Export = "Export"; + public static readonly string Attachments = "Attachments"; + public static readonly string Xsl = "Xsl"; + } + + public static readonly string DefaultTrlAuthor = "Dominik Reichl"; + public static readonly string DefaultTrlContact = "https://www.dominik-reichl.de/"; + + // public static readonly string LanguageInfoFileName = "LanguageInfo.xml"; + + internal const string Rsa4096PublicKeyXml = + @"9Oa8Bb9if4rSYBxczLVQ3Yyae95dWQrNJ1FlqS7DoF" + + @"RF80tD2hq84vxDE8slVeSHs68KMFnJhPsXFD6nM9oTRBaUlU/alnRTUU+X/cUXbr" + + @"mhYN9DkJhM0OcWk5Vsl9Qxl613sA+hqIwmPc+el/fCM/1vP6JkHo/JTJ2OxQvDKN" + + @"4cC55pHYMZt+HX6AhemsPe7ejTG7l9nN5tHGmD+GrlwuxBTddzFBARmoknFzDPWd" + + @"QHddjuK1mXDs6lWeu73ODlSLSHMc5n0R2xMwGHN4eaiIMGzEbt0lv1aMWz+Iy1H3" + + @"XgFgWGDHX9kx8yefmfcgFIK4Y/xHU5EyGAV68ZHPatv6i4pT4ZuecIb5GSoFzVXq" + + @"8BZjbe+zDI+Wr1u8jLcBH0mySTWkF2gooQLvE1vgZXP1blsA7UFZSVFzYjBt36HQ" + + @"SJLpQ9AjjB5MKpMSlvdb5SnvjzREiFVLoBsY7KH2TMz+IG1Rh3OZTGwjQKXkgRVj" + + @"5XrEMTFRmT1zo2BHWhx8vrY6agVzqsCVqxYRbjeAhgOi6hLDMHSNAVuNg6ZHOKS8" + + @"6x6kmBcBhGJriwY017H3Oxuhfz33ehRFX/C05egCvmR2TAXbqm+CUgrq1bZ96T/y" + + @"s+O5uvKpe7H+EZuWb655Y9WuQSby+q0Vqqny7T6Z2NbEnI8nYHg5ZZP+TijSxeH0" + + @"8=AQAB"; + + public static readonly string ColumnIdnGroup = "Group"; + public static readonly string ColumnIdnCreationTime = "CreationTime"; + public static readonly string ColumnIdnLastModificationTime = "LastModificationTime"; + public static readonly string ColumnIdnLastAccessTime = "LastAccessTime"; + public static readonly string ColumnIdnExpiryTime = "ExpiryTime"; + public static readonly string ColumnIdnUuid = "UUID"; + public static readonly string ColumnIdnAttachment = "Attachment"; + + public static string GetEntryField(PwEntry pe, string strFieldId) + { + if(pe == null) throw new ArgumentNullException("pe"); + if(strFieldId == null) throw new ArgumentNullException("strFieldId"); + + if(strFieldId == AppDefs.ColumnIdnGroup) + return ((pe.ParentGroup != null) ? pe.ParentGroup.Name : string.Empty); + else if(strFieldId == AppDefs.ColumnIdnCreationTime) + return TimeUtil.ToDisplayString(pe.CreationTime); + else if(strFieldId == AppDefs.ColumnIdnLastModificationTime) + return TimeUtil.ToDisplayString(pe.LastModificationTime); + else if(strFieldId == AppDefs.ColumnIdnLastAccessTime) + return TimeUtil.ToDisplayString(pe.LastAccessTime); + else if(strFieldId == AppDefs.ColumnIdnExpiryTime) + { + if(!pe.Expires) return KPRes.NeverExpires; + return TimeUtil.ToDisplayString(pe.ExpiryTime); + } + else if(strFieldId == AppDefs.ColumnIdnUuid) + return pe.Uuid.ToHexString(); + else if(strFieldId == AppDefs.ColumnIdnAttachment) + return pe.Binaries.UCount.ToString(); + + return pe.Strings.ReadSafe(strFieldId); + } + + internal static Color GetQualityColor(float fQ, bool bToControlBack) + { + if(fQ < 0.0f) { Debug.Assert(false); fQ = 0.0f; } + if(fQ > 1.0f) { Debug.Assert(false); fQ = 1.0f; } + + Color clrL = AppDefs.ColorQualityLow; + Color clrH = AppDefs.ColorQualityHigh; + Color clrM = AppDefs.ColorQualityMid; + + int iR, iG, iB; + if(fQ <= 0.5f) + { + fQ *= 2.0f; + iR = clrL.R + (int)(fQ * ((int)clrM.R - (int)clrL.R)); + iG = clrL.G + (int)(fQ * ((int)clrM.G - (int)clrL.G)); + iB = clrL.B + (int)(fQ * ((int)clrM.B - (int)clrL.B)); + } + else + { + fQ = (fQ - 0.5f) * 2.0f; + iR = clrM.R + (int)(fQ * ((int)clrH.R - (int)clrM.R)); + iG = clrM.G + (int)(fQ * ((int)clrH.G - (int)clrM.G)); + iB = clrM.B + (int)(fQ * ((int)clrH.B - (int)clrM.B)); + } + + if(iR < 0) { Debug.Assert(false); iR = 0; } + if(iR > 255) { Debug.Assert(false); iR = 255; } + if(iG < 0) { Debug.Assert(false); iG = 0; } + if(iG > 255) { Debug.Assert(false); iG = 255; } + if(iB < 0) { Debug.Assert(false); iB = 0; } + if(iB > 255) { Debug.Assert(false); iB = 255; } + + Color clrQ = Color.FromArgb(iR, iG, iB); + if(bToControlBack) + return UIUtil.ColorTowards(clrQ, AppDefs.ColorControlNormal, 0.5); + return clrQ; + } + + internal static string GetKeyFileFilter() + { + return UIUtil.CreateFileTypeFilter(AppDefs.FileExtension.KeyFile + + "|" + AppDefs.FileExtension.KeyFileAlt, KPRes.KeyFiles, true); + } + } +} diff --git a/src/KeePass/App/AppHelp.cs b/src/KeePass/App/AppHelp.cs new file mode 100644 index 0000000..ed34a0a --- /dev/null +++ b/src/KeePass/App/AppHelp.cs @@ -0,0 +1,257 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Util; +using KeePass.Util.Spr; + +using KeePassLib; +using KeePassLib.Native; +using KeePassLib.Utility; + +namespace KeePass.App +{ + public enum AppHelpSource + { + Local, + Online + } + + /// + /// Application help provider. Starts an external application that + /// shows help on a specified topic. + /// + public static class AppHelp + { + private static string g_strLocalHelpFile = null; + + /// + /// Get the path of the local help file. + /// + public static string LocalHelpFile + { + get + { + if(g_strLocalHelpFile == null) + g_strLocalHelpFile = UrlUtil.StripExtension( + WinUtil.GetExecutable()) + ".chm"; + + return g_strLocalHelpFile; + } + } + + public static bool LocalHelpAvailable + { + get + { + try + { + string strFile = AppHelp.LocalHelpFile; + if(!string.IsNullOrEmpty(strFile)) + return File.Exists(strFile); + } + catch(Exception) { Debug.Assert(false); } + + return false; + } + } + + public static AppHelpSource PreferredHelpSource + { + get + { + return (Program.Config.Application.HelpUseLocal ? + AppHelpSource.Local : AppHelpSource.Online); + } + + set + { + Program.Config.Application.HelpUseLocal = + (value == AppHelpSource.Local); + } + } + + /// + /// Show a help page. + /// + /// Topic name. May be null. + /// Section name. May be null. Must not start + /// with the '#' character. + public static void ShowHelp(string strTopic, string strSection) + { + AppHelp.ShowHelp(strTopic, strSection, false); + } + + /// + /// Show a help page. + /// + /// Topic name. May be null. + /// Section name. May be null. + /// Must not start with the '#' character. + /// Specify if the local help file should be + /// preferred. If no local help file is available, the online help + /// system will be used, independent of the bPreferLocal flag. + public static void ShowHelp(string strTopic, string strSection, bool bPreferLocal) + { + if(ShowHelpOverride(strTopic, strSection)) return; + + if(AppHelp.LocalHelpAvailable) + { + if(bPreferLocal || (AppHelp.PreferredHelpSource == AppHelpSource.Local)) + ShowHelpLocal(strTopic, strSection); + else + ShowHelpOnline(strTopic, strSection); + } + else ShowHelpOnline(strTopic, strSection); + } + + private static void ShowHelpLocal(string strTopic, string strSection) + { + string strFile = AppHelp.LocalHelpFile; + if(string.IsNullOrEmpty(strFile)) { Debug.Assert(false); return; } + + // Unblock CHM file for proper display of help contents + WinUtil.RemoveZoneIdentifier(strFile); + + string strCmd = "\"ms-its:" + strFile; + if(!string.IsNullOrEmpty(strTopic)) + { + strCmd += "::/help/" + strTopic + ".html"; + + if(!string.IsNullOrEmpty(strSection)) + strCmd += "#" + strSection; + } + strCmd += "\""; + + if(ShowHelpLocalKcv(strCmd)) return; + + string strDisp = strCmd; + try + { + if(NativeLib.IsUnix()) + NativeLib.StartProcess(strCmd.Trim('\"')); + else // Windows + { + strDisp = "HH.exe " + strDisp; + NativeLib.StartProcess(WinUtil.LocateSystemApp( + "hh.exe"), strCmd); + } + } + catch(Exception ex) + { + MessageService.ShowWarning(strDisp, ex); + } + } + + private static bool ShowHelpLocalKcv(string strQuotedMsIts) + { + try + { + if(!NativeLib.IsUnix()) return false; + + string strApp = AppLocator.FindAppUnix("kchmviewer"); + if(string.IsNullOrEmpty(strApp)) return false; + + string strFile = StrUtil.GetStringBetween(strQuotedMsIts, 0, ":", "::"); + if(string.IsNullOrEmpty(strFile)) + strFile = StrUtil.GetStringBetween(strQuotedMsIts, 0, ":", "\""); + if(string.IsNullOrEmpty(strFile)) + { + Debug.Assert(false); + return false; + } + + string strUrl = StrUtil.GetStringBetween(strQuotedMsIts, 0, "::", "\""); + + // https://www.ulduzsoft.com/linux/kchmviewer/kchmviewer-integration-reference/ + string strArgs = "\"" + SprEncoding.EncodeForCommandLine(strFile) + "\""; + if(!string.IsNullOrEmpty(strUrl)) + strArgs = "-showPage \"" + SprEncoding.EncodeForCommandLine( + strUrl) + "\" " + strArgs; + + NativeLib.StartProcess(strApp, strArgs); + return true; + } + catch(Exception) { Debug.Assert(false); } + + return false; + } + + private static void ShowHelpOnline(string strTopic, string strSection) + { + string strUrl = GetOnlineUrl(strTopic, strSection); + WinUtil.OpenUrl(strUrl, null); + } + + private static bool ShowHelpOverride(string strTopic, string strSection) + { + string strUrl = Program.Config.Application.HelpUrl; + if(string.IsNullOrEmpty(strUrl)) return false; + + string strRel = GetRelativeUrl(strTopic, strSection); + + WinUtil.OpenUrl(strUrl, null, true, strRel); + return true; + } + + private static string GetRelativeUrl(string strTopic, string strSection) + { + StringBuilder sb = new StringBuilder(); + + const string strDefault = AppDefs.HelpTopics.Default; + sb.Append(string.IsNullOrEmpty(strTopic) ? strDefault : strTopic); + sb.Append(".html"); + + if(!string.IsNullOrEmpty(strSection)) + { + sb.Append('#'); + sb.Append(strSection); + } + + return sb.ToString(); + } + + internal static string GetOnlineUrl(string strTopic, string strSection) + { + return (PwDefs.HelpUrl + GetRelativeUrl(strTopic, strSection)); + } + + // internal static void SetHelp(Form f, string strTopic, string strSection) + // { + // if(f == null) { Debug.Assert(false); return; } + // Debug.Assert(!f.HelpButton); + // f.HelpButton = true; + // SetHelp((Control)f, strTopic, strSection); + // } + // internal static void SetHelp(Control c, string strTopic, string strSection) + // { + // if(c == null) { Debug.Assert(false); return; } + // c.HelpRequested += delegate(object sender, HelpEventArgs e) + // { + // if(e == null) { Debug.Assert(false); return; } + // e.Handled = true; + // AppHelp.ShowHelp(strTopic, strSection); + // }; + // } + } +} diff --git a/src/KeePass/App/AppIcons.cs b/src/KeePass/App/AppIcons.cs new file mode 100644 index 0000000..5c0bd02 --- /dev/null +++ b/src/KeePass/App/AppIcons.cs @@ -0,0 +1,166 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.Text; + +using KeePass.UI; + +namespace KeePass.App +{ + public enum AppIconType + { + None = 0, + Main, + QuadNormal, + QuadLocked + } + + public static class AppIcons + { + private static Dictionary g_dCache = new Dictionary(); + private static readonly object g_oCacheSync = new object(); + + private const int g_hMain = 225; // Average hue of the main icon in degrees + private static readonly Color g_clrMain = UIUtil.ColorFromHsv(g_hMain, 1, 1); + + private static Color[] g_vColors = null; + internal static Color[] Colors + { + get + { + if(g_vColors == null) + { + List l = new List(); + + for(int h = 0; h < 360; h += 15) + l.Add(UIUtil.ColorFromHsv((h + g_hMain) % 360, 1, 1)); + + g_vColors = l.ToArray(); + +#if DEBUG + Color[] vInvariant = new Color[] { g_clrMain, + Color.Red, Color.Lime, Color.Blue, Color.Yellow }; + foreach(Color clr in vInvariant) + { + Debug.Assert(UIUtil.ColorsEqual(RoundColor(clr), clr)); + } +#endif + } + + return g_vColors; + } + } + + public static Icon Default + { + get { return Get(AppIconType.Main, Size.Empty, Color.Empty); } + } + + public static Icon Get(AppIconType t, Size sz, Color clr) + { + int w = Math.Min(Math.Max(sz.Width, 0), 256); + int h = Math.Min(Math.Max(sz.Height, 0), 256); + if((w == 0) || (h == 0)) + { + Size szDefault = UIUtil.GetIconSize(); + w = szDefault.Width; + h = szDefault.Height; + } + + Color c = clr; + if(!UIUtil.ColorsEqual(c, Color.Empty)) c = RoundColor(c); + + NumberFormatInfo nf = NumberFormatInfo.InvariantInfo; + string strID = ((long)t).ToString(nf) + ":" + w.ToString(nf) + ":" + + h.ToString(nf) + ":" + c.ToArgb().ToString(nf); + + Icon ico = null; + lock(g_oCacheSync) + { + if(g_dCache.TryGetValue(strID, out ico)) return ico; + } + + if(t == AppIconType.Main) + ico = Properties.Resources.KeePass; + else if(t == AppIconType.QuadNormal) + ico = Properties.Resources.QuadNormal; + else if(t == AppIconType.QuadLocked) + { + ico = Properties.Resources.QuadLocked; + + Debug.Assert(UIUtil.ColorsEqual(c, Color.Empty)); + c = Color.Empty; // This icon should not be recolored + } + else { Debug.Assert(false); } + + if((ico != null) && !UIUtil.ColorsEqual(c, Color.Empty)) + ico = IconColorizer.Recolor(ico, c); + + // Select requested resolution + if(ico != null) ico = new Icon(ico, w, h); // Preserves icon data + + Debug.Assert(ico != null); + lock(g_oCacheSync) { g_dCache[strID] = ico; } + return ico; + } + + private static int ColorDist(Color c1, Color c2) + { + int dR = (int)c1.R - (int)c2.R; + int dG = (int)c1.G - (int)c2.G; + int dB = (int)c1.B - (int)c2.B; + return ((dR * dR) + (dG * dG) + (dB * dB)); + } + + /// + /// Round to the nearest supported color. + /// + public static Color RoundColor(Color clr) + { + Debug.Assert(!UIUtil.ColorsEqual(clr, Color.Empty)); + if((clr.R == clr.B) && (clr.G == clr.B)) + return g_clrMain; // Gray => default + + Color[] v = AppIcons.Colors; + + int c = clr.ToArgb(); + for(int i = 0; i < v.Length; ++i) + { + if(v[i].ToArgb() == c) return clr; + } + + int iMin = 0, dMin = int.MaxValue; + for(int i = 0; i < v.Length; ++i) + { + int d = ColorDist(clr, v[i]); + if(d < dMin) + { + iMin = i; + dMin = d; + } + } + return v[iMin]; + } + } +} diff --git a/src/KeePass/App/AppPolicy.cs b/src/KeePass/App/AppPolicy.cs new file mode 100644 index 0000000..2e28c07 --- /dev/null +++ b/src/KeePass/App/AppPolicy.cs @@ -0,0 +1,429 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Text; +using System.Windows.Forms; + +using KeePass.App.Configuration; +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Utility; + +namespace KeePass.App +{ + /// + /// Application policy IDs. + /// + public enum AppPolicyId + { + Plugins = 0, + Export, + ExportNoKey, // Don't require the current key to be repeated + Import, + Print, + PrintNoKey, // Don't require the current key to be repeated + NewFile, + SaveFile, + AutoType, + AutoTypeWithoutContext, + CopyToClipboard, + CopyWholeEntries, + DragDrop, + UnhidePasswords, + ChangeMasterKey, + ChangeMasterKeyNoKey, // Don't require the current key to be repeated + EditTriggers + } + + /// + /// Application policy flags. + /// + public sealed class AppPolicyFlags + { + private bool m_bPlugins = true; + [DefaultValue(true)] + public bool Plugins + { + get { return m_bPlugins; } + set { m_bPlugins = value; } + } + + private bool m_bExport = true; + [DefaultValue(true)] + public bool Export + { + get { return m_bExport; } + set { m_bExport = value; } + } + + private bool m_bExportNoKey = true; + [DefaultValue(true)] + public bool ExportNoKey + { + get { return m_bExportNoKey; } + set { m_bExportNoKey = value; } + } + + private bool m_bImport = true; + [DefaultValue(true)] + public bool Import + { + get { return m_bImport; } + set { m_bImport = value; } + } + + private bool m_bPrint = true; + [DefaultValue(true)] + public bool Print + { + get { return m_bPrint; } + set { m_bPrint = value; } + } + + private bool m_bPrintNoKey = true; + [DefaultValue(true)] + public bool PrintNoKey + { + get { return m_bPrintNoKey; } + set { m_bPrintNoKey = value; } + } + + private bool m_bNewFile = true; + [DefaultValue(true)] + public bool NewFile + { + get { return m_bNewFile; } + set { m_bNewFile = value; } + } + + private bool m_bSave = true; + [DefaultValue(true)] + public bool SaveFile + { + get { return m_bSave; } + set { m_bSave = value; } + } + + private bool m_bAutoType = true; + [DefaultValue(true)] + public bool AutoType + { + get { return m_bAutoType; } + set { m_bAutoType = value; } + } + + private bool m_bAutoTypeWithoutContext = true; + [DefaultValue(true)] + public bool AutoTypeWithoutContext + { + get { return m_bAutoTypeWithoutContext; } + set { m_bAutoTypeWithoutContext = value; } + } + + private bool m_bClipboard = true; + [DefaultValue(true)] + public bool CopyToClipboard + { + get { return m_bClipboard; } + set { m_bClipboard = value; } + } + + private bool m_bCopyWholeEntries = true; + [DefaultValue(true)] + public bool CopyWholeEntries + { + get { return m_bCopyWholeEntries; } + set { m_bCopyWholeEntries = value; } + } + + private bool m_bDragDrop = true; + [DefaultValue(true)] + public bool DragDrop + { + get { return m_bDragDrop; } + set { m_bDragDrop = value; } + } + + private bool m_bUnhidePasswords = true; + [DefaultValue(true)] + public bool UnhidePasswords + { + get { return m_bUnhidePasswords; } + set { m_bUnhidePasswords = value; } + } + + private bool m_bChangeMasterKey = true; + [DefaultValue(true)] + public bool ChangeMasterKey + { + get { return m_bChangeMasterKey; } + set { m_bChangeMasterKey = value; } + } + + private bool m_bChangeMasterKeyNoKey = true; + [DefaultValue(true)] + public bool ChangeMasterKeyNoKey + { + get { return m_bChangeMasterKeyNoKey; } + set { m_bChangeMasterKeyNoKey = value; } + } + + private bool m_bTriggersEdit = true; + [DefaultValue(true)] + public bool EditTriggers + { + get { return m_bTriggersEdit; } + set { m_bTriggersEdit = value; } + } + + public AppPolicyFlags CloneDeep() + { + return (AppPolicyFlags)this.MemberwiseClone(); + } + } + + /// + /// Application policy settings. + /// + public static class AppPolicy + { + private static AppPolicyFlags m_apfCurrent = new AppPolicyFlags(); + // private static AppPolicyFlags m_apfNew = new AppPolicyFlags(); + + public static AppPolicyFlags Current + { + get { return m_apfCurrent; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_apfCurrent = value; + } + } + + /* public static AppPolicyFlags New + { + get { return m_apfNew; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_apfNew = value; + } + } */ + + internal static string GetName(AppPolicyId p) + { + string str; + + switch(p) + { + case AppPolicyId.Plugins: + str = KPRes.Plugins; + break; + case AppPolicyId.Export: + str = KPRes.Export; + break; + case AppPolicyId.ExportNoKey: + str = KPRes.Export + " - " + KPRes.NoKeyRepeat; + break; + case AppPolicyId.Import: + str = KPRes.Import; + break; + case AppPolicyId.Print: + str = KPRes.Print; + break; + case AppPolicyId.PrintNoKey: + str = KPRes.Print + " - " + KPRes.NoKeyRepeat; + break; + case AppPolicyId.NewFile: + str = KPRes.NewDatabase; + break; + case AppPolicyId.SaveFile: + str = KPRes.SaveDatabase; + break; + case AppPolicyId.AutoType: + str = KPRes.AutoType; + break; + case AppPolicyId.AutoTypeWithoutContext: + str = KPRes.AutoType + " - " + KPRes.WithoutContext; + break; + case AppPolicyId.CopyToClipboard: + str = KPRes.Copy; + break; + case AppPolicyId.CopyWholeEntries: + str = KPRes.CopyWholeEntries; + break; + case AppPolicyId.DragDrop: + str = KPRes.DragDrop; + break; + case AppPolicyId.UnhidePasswords: + str = KPRes.UnhidePasswords; + break; + case AppPolicyId.ChangeMasterKey: + str = KPRes.ChangeMasterKey; + break; + case AppPolicyId.ChangeMasterKeyNoKey: + str = KPRes.ChangeMasterKey + " - " + KPRes.NoKeyRepeat; + break; + case AppPolicyId.EditTriggers: + str = KPRes.TriggersEdit; + break; + default: + Debug.Assert(false); + str = KPRes.Unknown; + break; + } + + return str; + } + + internal static string GetDesc(AppPolicyId p) + { + string str; + + switch(p) + { + case AppPolicyId.Plugins: + str = KPRes.PolicyPluginsDesc; + break; + case AppPolicyId.Export: + str = KPRes.PolicyExportDesc2; + break; + case AppPolicyId.ExportNoKey: + str = KPRes.PolicyExportNoKeyDesc; + break; + case AppPolicyId.Import: + str = KPRes.PolicyImportDesc; + break; + case AppPolicyId.Print: + str = KPRes.PolicyPrintDesc; + break; + case AppPolicyId.PrintNoKey: + str = KPRes.PolicyPrintNoKeyDesc; + break; + case AppPolicyId.NewFile: + str = KPRes.PolicyNewDatabaseDesc; + break; + case AppPolicyId.SaveFile: + str = KPRes.PolicySaveDatabaseDesc; + break; + case AppPolicyId.AutoType: + str = KPRes.PolicyAutoTypeDesc; + break; + case AppPolicyId.AutoTypeWithoutContext: + str = KPRes.PolicyAutoTypeWithoutContextDesc; + break; + case AppPolicyId.CopyToClipboard: + str = KPRes.PolicyClipboardDesc; + break; + case AppPolicyId.CopyWholeEntries: + str = KPRes.PolicyCopyWholeEntriesDesc; + break; + case AppPolicyId.DragDrop: + str = KPRes.PolicyDragDropDesc; + break; + case AppPolicyId.UnhidePasswords: + str = KPRes.UnhidePasswordsDesc; + break; + case AppPolicyId.ChangeMasterKey: + str = KPRes.PolicyChangeMasterKey; + break; + case AppPolicyId.ChangeMasterKeyNoKey: + str = KPRes.PolicyChangeMasterKeyNoKeyDesc; + break; + case AppPolicyId.EditTriggers: + str = KPRes.PolicyTriggersEditDesc; + break; + default: + Debug.Assert(false); + str = KPRes.Unknown + "."; + break; + } + + return str; + } + + public static string RequiredPolicyMessage(AppPolicyId p) + { + return (KPRes.PolicyDisallowed + MessageService.NewParagraph + + KPRes.PolicyRequiredFlag + ":" + MessageService.NewLine + + AppPolicy.GetName(p) + "."); + } + + public static bool Try(AppPolicyId p) + { + bool b = true; + + switch(p) + { + case AppPolicyId.Plugins: b = m_apfCurrent.Plugins; break; + case AppPolicyId.Export: b = m_apfCurrent.Export; break; + case AppPolicyId.ExportNoKey: b = m_apfCurrent.ExportNoKey; break; + case AppPolicyId.Import: b = m_apfCurrent.Import; break; + case AppPolicyId.Print: b = m_apfCurrent.Print; break; + case AppPolicyId.PrintNoKey: b = m_apfCurrent.PrintNoKey; break; + case AppPolicyId.NewFile: b = m_apfCurrent.NewFile; break; + case AppPolicyId.SaveFile: b = m_apfCurrent.SaveFile; break; + case AppPolicyId.AutoType: b = m_apfCurrent.AutoType; break; + case AppPolicyId.AutoTypeWithoutContext: b = m_apfCurrent.AutoTypeWithoutContext; break; + case AppPolicyId.CopyToClipboard: b = m_apfCurrent.CopyToClipboard; break; + case AppPolicyId.CopyWholeEntries: b = m_apfCurrent.CopyWholeEntries; break; + case AppPolicyId.DragDrop: b = m_apfCurrent.DragDrop; break; + case AppPolicyId.UnhidePasswords: b = m_apfCurrent.UnhidePasswords; break; + case AppPolicyId.ChangeMasterKey: b = m_apfCurrent.ChangeMasterKey; break; + case AppPolicyId.ChangeMasterKeyNoKey: b = m_apfCurrent.ChangeMasterKeyNoKey; break; + case AppPolicyId.EditTriggers: b = m_apfCurrent.EditTriggers; break; + default: Debug.Assert(false); break; + } + + if(!b) + { + string strMsg = RequiredPolicyMessage(p); + MessageService.ShowWarning(strMsg); + } + + return b; + } + + internal static void ApplyToConfig() + { + try + { + AppConfigEx cfg = Program.Config; + + if(!AppPolicy.Current.UnhidePasswords) + { + List l = cfg.MainWindow.EntryListColumns; + foreach(AceColumn c in l) + { + if(c == null) { Debug.Assert(false); continue; } + + if(c.Type == AceColumnType.Password) + c.HideWithAsterisks = true; + } + } + } + catch(Exception) { Debug.Assert(false); } + } + } +} diff --git a/src/KeePass/App/Configuration/AceApplication.cs b/src/KeePass/App/Configuration/AceApplication.cs new file mode 100644 index 0000000..2dde40a --- /dev/null +++ b/src/KeePass/App/Configuration/AceApplication.cs @@ -0,0 +1,564 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Text; +using System.Xml.Serialization; + +using KeePass.Ecas; +using KeePass.Util; + +using KeePassLib.Serialization; +using KeePassLib.Utility; + +namespace KeePass.App.Configuration +{ + public sealed class AceApplication + { + public AceApplication() + { + } + + private bool m_bConfigSave = true; + [DefaultValue(true)] + public bool ConfigSave + { + get { return m_bConfigSave; } + set { m_bConfigSave = value; } + } + + private string m_strLanguageFile = string.Empty; // = English + [DefaultValue("")] + public string LanguageFile + { + get { return m_strLanguageFile; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strLanguageFile = value; + } + } + + private bool m_bHelpUseLocal = false; + [DefaultValue(false)] + public bool HelpUseLocal + { + get { return m_bHelpUseLocal; } + set { m_bHelpUseLocal = value; } + } + + private string m_strHelpUrl = string.Empty; + [DefaultValue("")] + public string HelpUrl + { + get { return m_strHelpUrl; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strHelpUrl = value; + } + } + + // Serialize DateTime with TimeUtil + private string m_strLastUpdChk = string.Empty; + [DefaultValue("")] + public string LastUpdateCheck + { + get { return m_strLastUpdChk; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strLastUpdChk = value; + } + } + + private IOConnectionInfo m_ioLastDb = null; + public IOConnectionInfo LastUsedFile + { + get + { + if(m_ioLastDb == null) m_ioLastDb = new IOConnectionInfo(); + return m_ioLastDb; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_ioLastDb = value; + } + } + + private AceMru m_mru = null; + public AceMru MostRecentlyUsed + { + get + { + if(m_mru == null) m_mru = new AceMru(); + return m_mru; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_mru = value; + } + } + + private bool m_bRememberWorkDirs = true; + [DefaultValue(true)] + public bool RememberWorkingDirectories + { + get { return m_bRememberWorkDirs; } + set { m_bRememberWorkDirs = value; } + } + + private Dictionary m_dictWorkingDirs = + new Dictionary(); + + /// + /// For serialization only; use the *WorkingDirectory + /// methods instead. + /// + [XmlArray("WorkingDirectories")] + [XmlArrayItem("Item")] + public string[] WorkingDirectoriesSerialized + { + get { return SerializeWorkingDirectories(); } + set + { + if(value == null) throw new ArgumentNullException("value"); + DeserializeWorkingDirectories(value); + } + } + + private AceStartUp m_su = null; + public AceStartUp Start + { + get + { + if(m_su == null) m_su = new AceStartUp(); + return m_su; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_su = value; + } + } + + private AceOpenDb m_fo = null; + public AceOpenDb FileOpening + { + get + { + if(m_fo == null) m_fo = new AceOpenDb(); + return m_fo; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_fo = value; + } + } + + private bool m_bVerifyFile = true; + [DefaultValue(true)] + public bool VerifyWrittenFileAfterSaving + { + get { return m_bVerifyFile; } + set { m_bVerifyFile = value; } + } + + private bool m_bTransactedFileWrites = true; + [DefaultValue(true)] + public bool UseTransactedFileWrites + { + get { return m_bTransactedFileWrites; } + set { m_bTransactedFileWrites = value; } + } + + private bool m_bTransactedConfigWrites = true; + [DefaultValue(true)] + public bool UseTransactedConfigWrites + { + get { return m_bTransactedConfigWrites; } + set { m_bTransactedConfigWrites = value; } + } + + private bool m_bFileTxExtra = false; + [DefaultValue(false)] + public bool FileTxExtra + { + get { return m_bFileTxExtra; } + set { m_bFileTxExtra = value; } + } + + private bool m_bFileLocks = false; + [DefaultValue(false)] + public bool UseFileLocks + { + get { return m_bFileLocks; } + set { m_bFileLocks = value; } + } + + private bool m_bSaveForceSync = false; + [DefaultValue(false)] + public bool SaveForceSync + { + get { return m_bSaveForceSync; } + set { m_bSaveForceSync = value; } + } + + private bool m_bAutoSaveAfterEntryEdit = false; + [DefaultValue(false)] + public bool AutoSaveAfterEntryEdit + { + get { return m_bAutoSaveAfterEntryEdit; } + set { m_bAutoSaveAfterEntryEdit = value; } + } + + private AceCloseDb m_fc = new AceCloseDb(); + public AceCloseDb FileClosing + { + get { return m_fc; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_fc = value; + } + } + + private EcasTriggerSystem m_triggers = new EcasTriggerSystem(); + public EcasTriggerSystem TriggerSystem + { + get { return m_triggers; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_triggers = value; + } + } + + private string m_strPluginCachePath = string.Empty; + [DefaultValue("")] + public string PluginCachePath + { + get { return m_strPluginCachePath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strPluginCachePath = value; + } + } + + private List m_lPluginCompat = new List(); + [XmlArrayItem("Item")] + public List PluginCompatibility + { + get { return m_lPluginCompat; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_lPluginCompat = value; + } + } + + private int m_iExpirySoonDays = 7; + [DefaultValue(7)] + public int ExpirySoonDays + { + get { return m_iExpirySoonDays; } + set { m_iExpirySoonDays = value; } + } + + internal static string GetLanguagesDir(AceDir d, bool bTermSep) + { + string str; + + if(d == AceDir.App) + str = UrlUtil.GetFileDirectory(WinUtil.GetExecutable(), + true, false) + AppDefs.LanguagesDir; + else if(d == AceDir.User) + str = UrlUtil.EnsureTerminatingSeparator( + AppConfigSerializer.AppDataDirectory, false) + + AppDefs.LanguagesDir; + else { Debug.Assert(false); return string.Empty; } + + if(bTermSep) str = UrlUtil.EnsureTerminatingSeparator(str, false); + + return str; + } + + private const string LngPrefixUser = "UL::"; + + internal string GetLanguageFilePath() + { + string str = m_strLanguageFile; + if(str.Length == 0) return string.Empty; + + string strDir, strName; + if(str.StartsWith(LngPrefixUser, StrUtil.CaseIgnoreCmp)) + { + strDir = GetLanguagesDir(AceDir.User, true); + strName = str.Substring(LngPrefixUser.Length); + } + else + { + strDir = GetLanguagesDir(AceDir.App, true); + strName = str; + } + + // File name must not contain a directory separator + // (language files must be directly in the directory, + // not any subdirectory of it or somewhere else) + if(UrlUtil.GetFileName(strName) != strName) + { + Debug.Assert(false); + return string.Empty; + } + + return (strDir + strName); + } + + internal void SetLanguageFilePath(string strPath) + { + m_strLanguageFile = string.Empty; + if(string.IsNullOrEmpty(strPath)) return; + + string str = GetLanguagesDir(AceDir.App, true); + if(strPath.StartsWith(str, StrUtil.CaseIgnoreCmp)) + { + m_strLanguageFile = strPath.Substring(str.Length); + return; + } + + str = GetLanguagesDir(AceDir.User, true); + if(strPath.StartsWith(str, StrUtil.CaseIgnoreCmp)) + { + m_strLanguageFile = LngPrefixUser + strPath.Substring(str.Length); + return; + } + + Debug.Assert(false); + } + + public string GetWorkingDirectory(string strContext) + { + // strContext may be null + + if(!m_bRememberWorkDirs) return null; + + string str; + m_dictWorkingDirs.TryGetValue(strContext ?? string.Empty, out str); + return str; + } + + public void SetWorkingDirectory(string strContext, string strDir) + { + // Both parameters may be null + + // if(!m_bRememberWorkDirs) return; + + if(string.IsNullOrEmpty(strContext)) return; + m_dictWorkingDirs[strContext] = (strDir ?? string.Empty); + } + + internal List GetWorkingDirectoryContexts() + { + if(!m_bRememberWorkDirs) return new List(); + + return new List(m_dictWorkingDirs.Keys); + } + + private string[] SerializeWorkingDirectories() + { + if(!m_bRememberWorkDirs) return MemUtil.EmptyArray(); + + List l = new List(); + foreach(KeyValuePair kvp in m_dictWorkingDirs) + l.Add(kvp.Key + @"@" + kvp.Value); + return l.ToArray(); + } + + private void DeserializeWorkingDirectories(string[] v) + { + // Do not check m_bRememberWorkDirs, because it might not + // have been deserialized yet + + m_dictWorkingDirs.Clear(); + + foreach(string str in v) + { + if(str == null) { Debug.Assert(false); continue; } + + int iSep = str.IndexOf('@'); + if(iSep <= 0) { Debug.Assert(false); continue; } + + m_dictWorkingDirs[str.Substring(0, iSep)] = str.Substring(iSep + 1); + } + } + + internal bool IsPluginCompat(string strHash) + { + if(string.IsNullOrEmpty(strHash)) { Debug.Assert(false); return false; } + + string str = "@" + strHash + "@" + WinUtil.GetAssemblyVersion() + "@1"; + + return m_lPluginCompat.Contains(str); + } + + internal void SetPluginCompat(string strHash) + { + if(string.IsNullOrEmpty(strHash)) { Debug.Assert(false); return; } + + string str = "@" + strHash + "@" + WinUtil.GetAssemblyVersion() + "@1"; + + if(m_lPluginCompat.Contains(str)) { Debug.Assert(false); return; } + m_lPluginCompat.Insert(0, str); // See auto. maintenance + } + } + + internal enum AceDir + { + App = 0, + User + } + + public sealed class AceStartUp + { + public AceStartUp() + { + } + + private bool m_bOpenLastDb = true; + [DefaultValue(true)] + public bool OpenLastFile + { + get { return m_bOpenLastDb; } + set { m_bOpenLastDb = value; } + } + + private bool m_bCheckForUpdate = false; + // [DefaultValue(false)] // Avoid user confusion with 'Configured' setting + public bool CheckForUpdate + { + get { return m_bCheckForUpdate; } + set { m_bCheckForUpdate = value; } + } + + private bool m_bCheckForUpdateCfg = false; + [DefaultValue(false)] + public bool CheckForUpdateConfigured + { + get { return m_bCheckForUpdateCfg; } + set { m_bCheckForUpdateCfg = value; } + } + + private bool m_bMinimizedAndLocked = false; + [DefaultValue(false)] + public bool MinimizedAndLocked + { + get { return m_bMinimizedAndLocked; } + set { m_bMinimizedAndLocked = value; } + } + + private bool m_bPlgDeleteOld = true; + [DefaultValue(true)] + public bool PluginCacheDeleteOld + { + get { return m_bPlgDeleteOld; } + set { m_bPlgDeleteOld = value; } + } + + private bool m_bClearPlgCache = false; + [DefaultValue(false)] + public bool PluginCacheClearOnce + { + get { return m_bClearPlgCache; } + set { m_bClearPlgCache = value; } + } + } + + public sealed class AceOpenDb + { + public AceOpenDb() + { + } + + private bool m_bShowExpiredEntries = false; + [DefaultValue(false)] + public bool ShowExpiredEntries + { + get { return m_bShowExpiredEntries; } + set { m_bShowExpiredEntries = value; } + } + + private bool m_bShowSoonToExpireEntries = false; + [DefaultValue(false)] + public bool ShowSoonToExpireEntries + { + get { return m_bShowSoonToExpireEntries; } + set { m_bShowSoonToExpireEntries = value; } + } + } + + public sealed class AceCloseDb + { + public AceCloseDb() + { + } + + private bool m_bAutoSave = false; + [DefaultValue(false)] + public bool AutoSave + { + get { return m_bAutoSave; } + set { m_bAutoSave = value; } + } + } + + public sealed class AceMru + { + public static readonly uint DefaultMaxItemCount = 12; + + public AceMru() + { + } + + private uint m_uMaxItems = DefaultMaxItemCount; + public uint MaxItemCount + { + get { return m_uMaxItems; } + set { m_uMaxItems = value; } + } + + private List m_lItems = new List(); + [XmlArrayItem("ConnectionInfo")] + public List Items + { + get { return m_lItems; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_lItems = value; + } + } + } +} diff --git a/src/KeePass/App/Configuration/AceCustomConfig.cs b/src/KeePass/App/Configuration/AceCustomConfig.cs new file mode 100644 index 0000000..afa15ca --- /dev/null +++ b/src/KeePass/App/Configuration/AceCustomConfig.cs @@ -0,0 +1,199 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml.Serialization; +using System.Globalization; + +using KeePassLib.Utility; + +namespace KeePass.App.Configuration +{ + public sealed class AceKvp + { + private string m_strKey = null; + public string Key + { + get { return m_strKey; } + set { m_strKey = value; } + } + + private string m_strValue = null; + public string Value + { + get { return m_strValue; } + set { m_strValue = value; } + } + + public AceKvp() + { + } + + public AceKvp(string strKey, string strValue) + { + m_strKey = strKey; + m_strValue = strValue; + } + } + + public sealed class AceCustomConfig + { + private Dictionary m_vItems = new Dictionary(); + + public AceCustomConfig() + { + } + + internal AceKvp[] Serialize() + { + List v = new List(); + + foreach(KeyValuePair kvp in m_vItems) + v.Add(new AceKvp(kvp.Key, kvp.Value)); + + return v.ToArray(); + } + + internal void Deserialize(AceKvp[] v) + { + if(v == null) throw new ArgumentNullException("v"); + + m_vItems.Clear(); + foreach(AceKvp kvp in v) + m_vItems[kvp.Key] = kvp.Value; + } + + /// + /// Set a configuration item's value. + /// + /// ID of the configuration item. This identifier + /// should consist only of English characters (a-z, A-Z, 0-9, '.', + /// ',', '-', '_') and should be unique -- for example (without quotes): + /// "PluginName.YourConfigGroupName.ItemName". Use upper camel + /// case as naming convention. + /// New value of the configuration item. + public void SetString(string strID, string strValue) + { + if(strID == null) throw new ArgumentNullException("strID"); + if(strID.Length == 0) throw new ArgumentException(); + + if(strValue == null) m_vItems.Remove(strID); + else m_vItems[strID] = strValue; + } + + /// + /// Set a configuration item's value. + /// + /// ID of the configuration item. This identifier + /// should consist only of English characters (a-z, A-Z, 0-9, '.', + /// ',', '-', '_') and should be unique -- for example (without quotes): + /// "PluginName.YourConfigGroupName.ItemName". Use upper camel + /// case as naming convention. + /// New value of the configuration item. + public void SetBool(string strID, bool bValue) + { + SetString(strID, StrUtil.BoolToString(bValue)); + } + + /// + /// Set a configuration item's value. + /// + /// ID of the configuration item. This identifier + /// should consist only of English characters (a-z, A-Z, 0-9, '.', + /// ',', '-', '_') and should be unique -- for example (without quotes): + /// "PluginName.YourConfigGroupName.ItemName". Use upper camel + /// case as naming convention. + /// New value of the configuration item. + public void SetLong(string strID, long lValue) + { + SetString(strID, lValue.ToString(NumberFormatInfo.InvariantInfo)); + } + + /// + /// Set a configuration item's value. + /// + /// ID of the configuration item. This identifier + /// should consist only of English characters (a-z, A-Z, 0-9, '.', + /// ',', '-', '_') and should be unique -- for example (without quotes): + /// "PluginName.YourConfigGroupName.ItemName". Use upper camel + /// case as naming convention. + /// New value of the configuration item. + public void SetULong(string strID, ulong uValue) + { + SetString(strID, uValue.ToString(NumberFormatInfo.InvariantInfo)); + } + + public string GetString(string strID) + { + return GetString(strID, null); + } + + /// + /// Get the current value of a custom configuration string. + /// + /// ID of the configuration item. + /// Default value that is returned if + /// the specified configuration does not exist. + /// Value of the configuration item. + public string GetString(string strID, string strDefault) + { + if(strID == null) throw new ArgumentNullException("strID"); + if(strID.Length == 0) throw new ArgumentException(); + + string strValue; + if(m_vItems.TryGetValue(strID, out strValue)) return strValue; + + return strDefault; + } + + public bool GetBool(string strID, bool bDefault) + { + string strValue = GetString(strID, null); + if(string.IsNullOrEmpty(strValue)) return bDefault; + + return StrUtil.StringToBool(strValue); + } + + public long GetLong(string strID, long lDefault) + { + string strValue = GetString(strID, null); + if(string.IsNullOrEmpty(strValue)) return lDefault; + + long lValue; + if(StrUtil.TryParseLongInvariant(strValue, out lValue)) + return lValue; + + return lDefault; + } + + public ulong GetULong(string strID, ulong uDefault) + { + string strValue = GetString(strID, null); + if(string.IsNullOrEmpty(strValue)) return uDefault; + + ulong uValue; + if(StrUtil.TryParseULongInvariant(strValue, out uValue)) + return uValue; + + return uDefault; + } + } +} diff --git a/src/KeePass/App/Configuration/AceDefaults.cs b/src/KeePass/App/Configuration/AceDefaults.cs new file mode 100644 index 0000000..46803cc --- /dev/null +++ b/src/KeePass/App/Configuration/AceDefaults.cs @@ -0,0 +1,335 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; +using System.Xml.Serialization; + +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Keys; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +namespace KeePass.App.Configuration +{ + public sealed class AceKeyAssoc + { + private string m_strDb = string.Empty; + public string DatabasePath + { + get { return m_strDb; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strDb = value; + } + } + + private bool m_bPassword = false; + [DefaultValue(false)] + public bool Password + { + get { return m_bPassword; } + set { m_bPassword = value; } + } + + private string m_strKey = string.Empty; + [DefaultValue("")] + public string KeyFilePath + { + get { return m_strKey; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strKey = value; + } + } + + private string m_strProv = string.Empty; + [DefaultValue("")] + public string KeyProvider + { + get { return m_strProv; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strProv = value; + } + } + + private bool m_bUserAcc = false; + [DefaultValue(false)] + public bool UserAccount + { + get { return m_bUserAcc; } + set { m_bUserAcc = value; } + } + + public AceKeyAssoc() { } + } + + public sealed class AceDefaults + { + public AceDefaults() + { + } + + private int m_nNewEntryExpireDays = -1; + [DefaultValue(-1)] + public int NewEntryExpiresInDays + { + get { return m_nNewEntryExpireDays; } + set { m_nNewEntryExpireDays = value; } + } + + private uint m_uDefaultOptionsTab = 0; + public uint OptionsTabIndex + { + get { return m_uDefaultOptionsTab; } + set { m_uDefaultOptionsTab = value; } + } + + private const string DefaultTanChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"; + private string m_strTanChars = DefaultTanChars; + [DefaultValue(DefaultTanChars)] + public string TanCharacters + { + get { return m_strTanChars; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strTanChars = value; + } + } + + private bool m_bExpireTansOnUse = true; + [DefaultValue(true)] + public bool TanExpiresOnUse + { + get { return m_bExpireTansOnUse; } + set { m_bExpireTansOnUse = value; } + } + + private string m_strDbSaveAsPath = string.Empty; + [DefaultValue("")] + public string FileSaveAsDirectory + { + get { return m_strDbSaveAsPath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strDbSaveAsPath = value; + } + } + + private bool m_bRememberKeySources = true; + [DefaultValue(true)] + public bool RememberKeySources + { + get { return m_bRememberKeySources; } + set { m_bRememberKeySources = value; } + } + + private List m_vKeySources = new List(); + [XmlArrayItem("Association")] + public List KeySources + { + get { return m_vKeySources; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_vKeySources = value; + } + } + + private string m_strCustomColors = string.Empty; + [DefaultValue("")] + public string CustomColors + { + get { return m_strCustomColors; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strCustomColors = value; + } + } + + private bool m_bExportMasterKeySpec = false; + [DefaultValue(false)] + public bool ExportMasterKeySpec + { + get { return m_bExportMasterKeySpec; } + set { m_bExportMasterKeySpec = value; } + } + + private bool m_bExportParentGroups = false; + [DefaultValue(false)] + public bool ExportParentGroups + { + get { return m_bExportParentGroups; } + set { m_bExportParentGroups = value; } + } + + private bool m_bExportPostOpen = false; + [DefaultValue(false)] + public bool ExportPostOpen + { + get { return m_bExportPostOpen; } + set { m_bExportPostOpen = value; } + } + + private bool m_bExportPostShow = false; + [DefaultValue(false)] + public bool ExportPostShow + { + get { return m_bExportPostShow; } + set { m_bExportPostShow = value; } + } + + private string m_strWinFavsBaseName = string.Empty; + [DefaultValue("")] + public string WinFavsBaseFolderName + { + get { return m_strWinFavsBaseName; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strWinFavsBaseName = value; + } + } + + private string m_strWinFavsFilePrefix = string.Empty; + [DefaultValue("")] + public string WinFavsFileNamePrefix + { + get { return m_strWinFavsFilePrefix; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strWinFavsFilePrefix = value; + } + } + + private string m_strWinFavsFileSuffix = string.Empty; + [DefaultValue("")] + public string WinFavsFileNameSuffix + { + get { return m_strWinFavsFileSuffix; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strWinFavsFileSuffix = value; + } + } + + private bool m_bCollapseRecycleBin = false; + [DefaultValue(false)] + public bool RecycleBinCollapse + { + get { return m_bCollapseRecycleBin; } + set { m_bCollapseRecycleBin = value; } + } + + private static string GetKeyAssocID(IOConnectionInfo iocDb) + { + if(iocDb == null) throw new ArgumentNullException("iocDb"); + + string strDb = iocDb.Path; + if((strDb.Length > 0) && iocDb.IsLocalFile() && + !UrlUtil.IsAbsolutePath(strDb)) + strDb = UrlUtil.MakeAbsolutePath(WinUtil.GetExecutable(), strDb); + + return strDb; + } + + private int GetKeyAssocIndex(string strID) + { + for(int i = 0; i < m_vKeySources.Count; ++i) + { + if(strID.Equals(m_vKeySources[i].DatabasePath, StrUtil.CaseIgnoreCmp)) + return i; + } + + return -1; + } + + public void SetKeySources(IOConnectionInfo iocDb, CompositeKey cmpKey) + { + string strID = GetKeyAssocID(iocDb); + int idx = GetKeyAssocIndex(strID); + + if((cmpKey == null) || !m_bRememberKeySources) + { + if(idx >= 0) m_vKeySources.RemoveAt(idx); + return; + } + + AceKeyAssoc a = new AceKeyAssoc(); + a.DatabasePath = strID; + + IUserKey kcpPassword = cmpKey.GetUserKey(typeof(KcpPassword)); + a.Password = (kcpPassword != null); + + IUserKey kcpFile = cmpKey.GetUserKey(typeof(KcpKeyFile)); + if(kcpFile != null) + { + string strKeyFile = ((KcpKeyFile)kcpFile).Path; + if(!string.IsNullOrEmpty(strKeyFile) && !StrUtil.IsDataUri(strKeyFile)) + { + if(!UrlUtil.IsAbsolutePath(strKeyFile)) + strKeyFile = UrlUtil.MakeAbsolutePath(WinUtil.GetExecutable(), + strKeyFile); + + a.KeyFilePath = strKeyFile; + } + } + + IUserKey kcpCustom = cmpKey.GetUserKey(typeof(KcpCustomKey)); + if(kcpCustom != null) + a.KeyProvider = ((KcpCustomKey)kcpCustom).Name; + + IUserKey kcpUser = cmpKey.GetUserKey(typeof(KcpUserAccount)); + a.UserAccount = (kcpUser != null); + + bool bAtLeastOne = (a.Password || (a.KeyFilePath.Length > 0) || + (a.KeyProvider.Length > 0) || a.UserAccount); + if(bAtLeastOne) + { + if(idx >= 0) m_vKeySources[idx] = a; + else m_vKeySources.Add(a); + } + else if(idx >= 0) m_vKeySources.RemoveAt(idx); + } + + public AceKeyAssoc GetKeySources(IOConnectionInfo iocDb) + { + string strID = GetKeyAssocID(iocDb); + int idx = GetKeyAssocIndex(strID); + + if(!m_bRememberKeySources) return null; + + if(idx >= 0) return m_vKeySources[idx]; + return null; + } + } +} diff --git a/src/KeePass/App/Configuration/AceIntegration.cs b/src/KeePass/App/Configuration/AceIntegration.cs new file mode 100644 index 0000000..760ec4b --- /dev/null +++ b/src/KeePass/App/Configuration/AceIntegration.cs @@ -0,0 +1,617 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Text; +using System.Windows.Forms; +using System.Xml.Serialization; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.App.Configuration +{ + public sealed class AceIntegration + { + private long m_hkAutoType = (long)(Keys.Control | Keys.Alt | Keys.A); + [DefaultValue((long)(Keys.Control | Keys.Alt | Keys.A))] + public long HotKeyGlobalAutoType + { + get { return m_hkAutoType; } + set { m_hkAutoType = value; } + } + + private long m_hkAutoTypePw = (long)(Keys.Control | Keys.Alt | Keys.Shift | Keys.A); + [DefaultValue((long)(Keys.Control | Keys.Alt | Keys.Shift | Keys.A))] + public long HotKeyGlobalAutoTypePassword + { + get { return m_hkAutoTypePw; } + set { m_hkAutoTypePw = value; } + } + + private long m_hkAutoTypeSel = (long)Keys.None; + [DefaultValue((long)Keys.None)] + public long HotKeySelectedAutoType + { + get { return m_hkAutoTypeSel; } + set { m_hkAutoTypeSel = value; } + } + + private long m_hkShowWindow = (long)(Keys.Control | Keys.Alt | Keys.K); + [DefaultValue((long)(Keys.Control | Keys.Alt | Keys.K))] + public long HotKeyShowWindow + { + get { return m_hkShowWindow; } + set { m_hkShowWindow = value; } + } + + private long m_hkEntryMenu = (long)Keys.None; + [DefaultValue((long)Keys.None)] + public long HotKeyEntryMenu + { + get { return m_hkEntryMenu; } + set { m_hkEntryMenu = value; } + } + + private bool m_bCheckHotKeys = true; + [DefaultValue(true)] + public bool CheckHotKeys + { + get { return m_bCheckHotKeys; } + set { m_bCheckHotKeys = value; } + } + + private string m_strUrlOverride = string.Empty; + [DefaultValue("")] + public string UrlOverride + { + get { return m_strUrlOverride; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strUrlOverride = value; + } + } + + private AceUrlSchemeOverrides m_vSchemeOverrides = new AceUrlSchemeOverrides(); + public AceUrlSchemeOverrides UrlSchemeOverrides + { + get { return m_vSchemeOverrides; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_vSchemeOverrides = value; + } + } + + private bool m_bSearchKeyFiles = true; + [DefaultValue(true)] + public bool SearchKeyFiles + { + get { return m_bSearchKeyFiles; } + set { m_bSearchKeyFiles = value; } + } + + private bool m_bSearchKeyFilesOnRemovable = false; + [DefaultValue(false)] + public bool SearchKeyFilesOnRemovableMedia + { + get { return m_bSearchKeyFilesOnRemovable; } + set { m_bSearchKeyFilesOnRemovable = value; } + } + + private bool m_bSingleInstance = true; + [DefaultValue(true)] + public bool LimitToSingleInstance + { + get { return m_bSingleInstance; } + set { m_bSingleInstance = value; } + } + + private bool m_bMatchByTitle = true; + [DefaultValue(true)] + public bool AutoTypeMatchByTitle + { + get { return m_bMatchByTitle; } + set { m_bMatchByTitle = value; } + } + + private bool m_bMatchByUrlInTitle = false; + [DefaultValue(false)] + public bool AutoTypeMatchByUrlInTitle + { + get { return m_bMatchByUrlInTitle; } + set { m_bMatchByUrlInTitle = value; } + } + + private bool m_bMatchByUrlHostInTitle = false; + [DefaultValue(false)] + public bool AutoTypeMatchByUrlHostInTitle + { + get { return m_bMatchByUrlHostInTitle; } + set { m_bMatchByUrlHostInTitle = value; } + } + + private bool m_bMatchByTagInTitle = false; + [DefaultValue(false)] + public bool AutoTypeMatchByTagInTitle + { + get { return m_bMatchByTagInTitle; } + set { m_bMatchByTagInTitle = value; } + } + + private bool m_bMatchNormDashes = true; + [DefaultValue(true)] + public bool AutoTypeMatchNormDashes + { + get { return m_bMatchNormDashes; } + set { m_bMatchNormDashes = value; } + } + + private bool m_bExpiredCanMatch = false; + [DefaultValue(false)] + public bool AutoTypeExpiredCanMatch + { + get { return m_bExpiredCanMatch; } + set { m_bExpiredCanMatch = value; } + } + + private bool m_bAutoTypeAlwaysShowSelDlg = false; + [DefaultValue(false)] + public bool AutoTypeAlwaysShowSelDialog + { + get { return m_bAutoTypeAlwaysShowSelDlg; } + set { m_bAutoTypeAlwaysShowSelDlg = value; } + } + + private bool m_bPrependInitSeqIE = true; + [DefaultValue(true)] + public bool AutoTypePrependInitSequenceForIE + { + get { return m_bPrependInitSeqIE; } + set { m_bPrependInitSeqIE = value; } + } + + private bool m_bSpecialReleaseAlt = true; + [DefaultValue(true)] + public bool AutoTypeReleaseAltWithKeyPress + { + get { return m_bSpecialReleaseAlt; } + set { m_bSpecialReleaseAlt = value; } + } + + private bool m_bAdjustKeybLayout = true; + [DefaultValue(true)] + public bool AutoTypeAdjustKeyboardLayout + { + get { return m_bAdjustKeybLayout; } + set { m_bAdjustKeybLayout = value; } + } + + private bool m_bAllowInterleaved = false; + [DefaultValue(false)] + public bool AutoTypeAllowInterleaved + { + get { return m_bAllowInterleaved; } + set { m_bAllowInterleaved = value; } + } + + private bool m_bCancelOnWindowChange = false; + [DefaultValue(false)] + public bool AutoTypeCancelOnWindowChange + { + get { return m_bCancelOnWindowChange; } + set { m_bCancelOnWindowChange = value; } + } + + private bool m_bCancelOnTitleChange = false; + [DefaultValue(false)] + public bool AutoTypeCancelOnTitleChange + { + get { return m_bCancelOnTitleChange; } + set { m_bCancelOnTitleChange = value; } + } + + private int m_iInterKeyDelay = -1; + [DefaultValue(-1)] + public int AutoTypeInterKeyDelay + { + get { return m_iInterKeyDelay; } + set { m_iInterKeyDelay = value; } + } + + private List m_lAbortWindows = new List(); + [XmlArrayItem("Window")] + public List AutoTypeAbortOnWindows + { + get { return m_lAbortWindows; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_lAbortWindows = value; + } + } + + private ProxyServerType m_pstProxyType = ProxyServerType.System; + [DefaultValue(ProxyServerType.System)] + public ProxyServerType ProxyType + { + get { return m_pstProxyType; } + set { m_pstProxyType = value; } + } + + private string m_strProxyAddr = string.Empty; + [DefaultValue("")] + public string ProxyAddress + { + get { return m_strProxyAddr; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strProxyAddr = value; + } + } + + private string m_strProxyPort = string.Empty; + [DefaultValue("")] + public string ProxyPort + { + get { return m_strProxyPort; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strProxyPort = value; + } + } + + private ProxyAuthType m_pstProxyAuthType = ProxyAuthType.Auto; + [DefaultValue(ProxyAuthType.Auto)] + public ProxyAuthType ProxyAuthType + { + get { return m_pstProxyAuthType; } + set { m_pstProxyAuthType = value; } + } + + private string m_strProxyUser = string.Empty; + [DefaultValue("")] + public string ProxyUserName + { + get { return m_strProxyUser; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strProxyUser = value; + } + } + + private string m_strProxyPassword = string.Empty; + [DefaultValue("")] + public string ProxyPassword + { + get { return m_strProxyPassword; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strProxyPassword = value; + } + } + + public AceIntegration() + { + } + } + + public sealed class AceUrlSchemeOverrides : IDeepCloneable + { + private List m_lBuiltInOverrides = + new List(); + [XmlIgnore] + public List BuiltInOverrides + { + get { return m_lBuiltInOverrides; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_lBuiltInOverrides = value; + } + } + + public ulong BuiltInOverridesEnabled + { + get { return GetEnabledBuiltInOverrides(); } + set { SetEnabledBuiltInOverrides(value); } + } + + private List m_lCustomOverrides = + new List(); + [XmlArrayItem("Override")] + public List CustomOverrides + { + get { return m_lCustomOverrides; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_lCustomOverrides = value; + } + } + + public AceUrlSchemeOverrides() + { + MakeBuiltInList(); + } + + private void MakeBuiltInList() + { + m_lBuiltInOverrides.Clear(); + + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(true, "ssh", + "cmd://SSH.exe -l \"{USERNAME}\" {BASE:RMVSCM}", 0x1000000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "ssh", + "cmd://PuTTY.exe -ssh {USERNAME}@{BASE:RMVSCM}", 0x1)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{EDGE} \"{BASE}\"", 0x4000)); // "microsoft-edge:{BASE}" + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{EDGE} \"{BASE}\"", 0x8000)); // "microsoft-edge:{BASE}" + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{EDGE} --inprivate \"{BASE}\"", 0x2000000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{EDGE} --inprivate \"{BASE}\"", 0x4000000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{FIREFOX} \"{BASE}\"", 0x8)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{FIREFOX} \"{BASE}\"", 0x10)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{FIREFOX} -private-window \"{BASE}\"", 0x100000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{FIREFOX} -private-window \"{BASE}\"", 0x200000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "chrome", + "cmd://{FIREFOX} -chrome \"{BASE}\"", 0x20)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{GOOGLECHROME} \"{BASE}\"", 0x100)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{GOOGLECHROME} \"{BASE}\"", 0x200)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{GOOGLECHROME} --incognito \"{BASE}\"", 0x40000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{GOOGLECHROME} --incognito \"{BASE}\"", 0x80000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{INTERNETEXPLORER} \"{BASE}\"", 0x2)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{INTERNETEXPLORER} \"{BASE}\"", 0x4)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{INTERNETEXPLORER} -private \"{BASE}\"", 0x10000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{INTERNETEXPLORER} -private \"{BASE}\"", 0x20000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{OPERA} \"{BASE}\"", 0x40)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{OPERA} \"{BASE}\"", 0x80)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{OPERA} --private \"{BASE}\"", 0x400000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{OPERA} --private \"{BASE}\"", 0x800000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{SAFARI} \"{BASE}\"", 0x400)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{SAFARI} \"{BASE}\"", 0x800)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "kdbx", + "cmd://\"{APPDIR}\\KeePass.exe\" \"{BASE:RMVSCM}\" -pw-enc:\"{PASSWORD_ENC}\"", 0x1000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "kdbx", + "cmd://mono \"{APPDIR}/KeePass.exe\" \"{BASE:RMVSCM}\" -pw-enc:\"{PASSWORD_ENC}\"", 0x2000)); + // Free: 0x8000000 + +#if DEBUG + ulong u = 0; + foreach(AceUrlSchemeOverride o in m_lBuiltInOverrides) + { + Debug.Assert(o.IsBuiltIn); + ulong f = o.BuiltInFlagID; + Debug.Assert((f != 0) && ((f & (f - 1)) == 0)); // Check power of 2 + u += f; + } + Debug.Assert(u == ((1UL << m_lBuiltInOverrides.Count) - 1UL)); +#endif + } + + public string GetOverrideForUrl(string strUrl) + { + if(string.IsNullOrEmpty(strUrl)) return null; + + for(int i = 0; i < 2; ++i) + { + List l = ((i == 0) ? m_lBuiltInOverrides : + m_lCustomOverrides); + + foreach(AceUrlSchemeOverride ovr in l) + { + if(!ovr.Enabled) continue; + + if(strUrl.StartsWith(ovr.Scheme + ":", StrUtil.CaseIgnoreCmp)) + return ovr.UrlOverride; + } + } + + return null; + } + + public AceUrlSchemeOverrides CloneDeep() + { + AceUrlSchemeOverrides ovr = new AceUrlSchemeOverrides(); + CopyTo(ovr); + return ovr; + } + + public void CopyTo(AceUrlSchemeOverrides ovrTarget) + { + ovrTarget.m_lBuiltInOverrides.Clear(); + foreach(AceUrlSchemeOverride shB in m_lBuiltInOverrides) + { + ovrTarget.m_lBuiltInOverrides.Add(shB.CloneDeep()); + } + + ovrTarget.m_lCustomOverrides.Clear(); + foreach(AceUrlSchemeOverride shC in m_lCustomOverrides) + { + ovrTarget.m_lCustomOverrides.Add(shC.CloneDeep()); + } + } + + private ulong GetEnabledBuiltInOverrides() + { + ulong u = 0; + for(int i = 0; i < m_lBuiltInOverrides.Count; ++i) + { + if(m_lBuiltInOverrides[i].Enabled) + u |= m_lBuiltInOverrides[i].BuiltInFlagID; + } + + return u; + } + + private void SetEnabledBuiltInOverrides(ulong uFlags) + { + for(int i = 0; i < m_lBuiltInOverrides.Count; ++i) + m_lBuiltInOverrides[i].Enabled = ((uFlags & + m_lBuiltInOverrides[i].BuiltInFlagID) != 0UL); + } + + internal void AddCustomOverride(string strScheme, string strOverride, + bool bEnable, bool bDisableOthers) + { + if(string.IsNullOrEmpty(strScheme)) return; // No assert + if(strOverride == null) return; // No assert + + if(bDisableOthers) + { + List l = new List(); + l.AddRange(m_lBuiltInOverrides); + l.AddRange(m_lCustomOverrides); + + foreach(AceUrlSchemeOverride o in l) + { + if(o.Scheme.Equals(strScheme, StrUtil.CaseIgnoreCmp)) + o.Enabled = false; + } + } + + m_lCustomOverrides.Add(new AceUrlSchemeOverride(bEnable, + strScheme, strOverride)); + } + + internal void RemoveCustomOverride(string strScheme, string strOverride) + { + if(string.IsNullOrEmpty(strScheme)) return; // No assert + if(strOverride == null) return; // No assert + + for(int i = m_lCustomOverrides.Count - 1; i >= 0; --i) + { + AceUrlSchemeOverride o = m_lCustomOverrides[i]; + if(o.Scheme.Equals(strScheme, StrUtil.CaseIgnoreCmp) && + (o.UrlOverride == strOverride)) + { + m_lCustomOverrides.RemoveAt(i); + return; // Remove one item only + } + } + } + } + + public sealed class AceUrlSchemeOverride : IDeepCloneable + { + private bool m_bEnabled = true; + public bool Enabled + { + get { return m_bEnabled; } + set { m_bEnabled = value; } + } + + private string m_strScheme = string.Empty; + public string Scheme + { + get { return m_strScheme; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strScheme = value; + } + } + + private string m_strOvr = string.Empty; + public string UrlOverride + { + get { return m_strOvr; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strOvr = value; + } + } + + private ulong m_uBuiltInFlagID = 0; + [XmlIgnore] + internal ulong BuiltInFlagID + { + get { return m_uBuiltInFlagID; } + } + + [XmlIgnore] + public bool IsBuiltIn + { + get { return (m_uBuiltInFlagID != 0UL); } + } + + public AceUrlSchemeOverride() + { + } + + public AceUrlSchemeOverride(bool bEnable, string strScheme, + string strUrlOverride) + { + Init(bEnable, strScheme, strUrlOverride, 0); + } + + internal AceUrlSchemeOverride(bool bEnable, string strScheme, + string strUrlOverride, ulong uBuiltInFlagID) + { + Init(bEnable, strScheme, strUrlOverride, uBuiltInFlagID); + } + + private void Init(bool bEnable, string strScheme, string strUrlOverride, + ulong uBuiltInFlagID) + { + if(strScheme == null) throw new ArgumentNullException("strScheme"); + if(strUrlOverride == null) throw new ArgumentNullException("strUrlOverride"); + + m_bEnabled = bEnable; + m_strScheme = strScheme; + m_strOvr = strUrlOverride; + m_uBuiltInFlagID = uBuiltInFlagID; + } + + public AceUrlSchemeOverride CloneDeep() + { + return new AceUrlSchemeOverride(m_bEnabled, m_strScheme, + m_strOvr, m_uBuiltInFlagID); + } + } +} diff --git a/src/KeePass/App/Configuration/AceLogging.cs b/src/KeePass/App/Configuration/AceLogging.cs new file mode 100644 index 0000000..230dbd2 --- /dev/null +++ b/src/KeePass/App/Configuration/AceLogging.cs @@ -0,0 +1,41 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; + +namespace KeePass.App.Configuration +{ + public sealed class AceLogging + { + public AceLogging() + { + } + + private bool m_bEnabled = false; + [DefaultValue(false)] + public bool Enabled + { + get { return m_bEnabled; } + set { m_bEnabled = value; } + } + } +} diff --git a/src/KeePass/App/Configuration/AceMainWindow.cs b/src/KeePass/App/Configuration/AceMainWindow.cs new file mode 100644 index 0000000..c46ab14 --- /dev/null +++ b/src/KeePass/App/Configuration/AceMainWindow.cs @@ -0,0 +1,758 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.Text; +using System.Windows.Forms; +using System.Xml.Serialization; + +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Security; + +namespace KeePass.App.Configuration +{ + public enum AceMainWindowLayout + { + Default = 0, + SideBySide = 1 + } + + [Flags] + public enum AceListGrouping + { + Auto = 0, + On = 1, + Off = 2, + + // Additional flags: use value > Primary + + Primary = 0x0F // Auto/On/Off are primary states + } + + public enum AceEscAction + { + None = 0, + Lock = 1, + Minimize = 2, + MinimizeToTray = 3, + Exit = 4 + } + + public sealed class AceMainWindow + { + public AceMainWindow() + { + } + + private int m_posX = AppDefs.InvalidWindowValue; + public int X + { + get { return m_posX; } + set { m_posX = value; } + } + + private int m_posY = AppDefs.InvalidWindowValue; + public int Y + { + get { return m_posY; } + set { m_posY = value; } + } + + private int m_sizeW = AppDefs.InvalidWindowValue; + public int Width + { + get { return m_sizeW; } + set { m_sizeW = value; } + } + + private int m_sizeH = AppDefs.InvalidWindowValue; + public int Height + { + get { return m_sizeH; } + set { m_sizeH = value; } + } + + private bool m_bMax = false; + [DefaultValue(false)] + public bool Maximized + { + get { return m_bMax; } + set { m_bMax = value; } + } + + private double m_dSplitterHorz = double.Epsilon; + public double SplitterHorizontalFrac + { + get { return m_dSplitterHorz; } + set { m_dSplitterHorz = value; } + } + + private double m_dSplitterVert = double.Epsilon; + public double SplitterVerticalFrac + { + get { return m_dSplitterVert; } + set { m_dSplitterVert = value; } + } + + private AceMainWindowLayout m_layout = AceMainWindowLayout.Default; + [DefaultValue(AceMainWindowLayout.Default)] + public AceMainWindowLayout Layout + { + get { return m_layout; } + set { m_layout = value; } + } + + private bool m_bTop = false; + [DefaultValue(false)] + public bool AlwaysOnTop + { + get { return m_bTop; } + set { m_bTop = value; } + } + + private bool m_bCloseMin = false; + [DefaultValue(false)] + public bool CloseButtonMinimizesWindow + { + get { return m_bCloseMin; } + set { m_bCloseMin = value; } + } + + // For backward compatibility only; use EscAction instead + private bool m_bEscMin = false; + [DefaultValue(false)] + public bool EscMinimizesToTray + { + get { return m_bEscMin; } + set { m_bEscMin = value; } + } + + private AceEscAction m_aEsc = AceEscAction.Lock; + [DefaultValue(AceEscAction.Lock)] + public AceEscAction EscAction + { + get { return m_aEsc; } + set { m_aEsc = value; } + } + + private bool m_bMinToTray = false; + [DefaultValue(false)] + public bool MinimizeToTray + { + get { return m_bMinToTray; } + set { m_bMinToTray = value; } + } + + private bool m_bFullPath = false; + [DefaultValue(false)] + public bool ShowFullPathInTitle + { + get { return m_bFullPath; } + set { m_bFullPath = value; } + } + + // private bool m_bFullPathOnTab = false; + // [DefaultValue(false)] + // public bool ShowFullPathOnTab + // { + // get { return m_bFullPathOnTab; } + // set { m_bFullPathOnTab = value; } + // } + + // private bool m_bDbNameOnTab = false; + // [DefaultValue(false)] + // public bool ShowDatabaseNameOnTab + // { + // get { return m_bDbNameOnTab; } + // set { m_bDbNameOnTab = value; } + // } + + private bool m_bDropToBackAfterCopy = false; + [DefaultValue(false)] + public bool DropToBackAfterClipboardCopy + { + get { return m_bDropToBackAfterCopy; } + set { m_bDropToBackAfterCopy = value; } + } + + private bool m_bMinAfterCopy = false; + [DefaultValue(false)] + public bool MinimizeAfterClipboardCopy + { + get { return m_bMinAfterCopy; } + set { m_bMinAfterCopy = value; } + } + + private bool m_bMinAfterAutoType = false; + [DefaultValue(false)] + public bool MinimizeAfterAutoType + { + get { return m_bMinAfterAutoType; } + set { m_bMinAfterAutoType = value; } + } + + private bool m_bMinAfterLocking = true; + [DefaultValue(true)] + public bool MinimizeAfterLocking + { + get { return m_bMinAfterLocking; } + set { m_bMinAfterLocking = value; } + } + + private bool m_bMinAfterOpeningDb = false; + [DefaultValue(false)] + public bool MinimizeAfterOpeningDatabase + { + get { return m_bMinAfterOpeningDb; } + set { m_bMinAfterOpeningDb = value; } + } + + private bool m_bQuickFindSearchInPasswords = false; + [DefaultValue(false)] + public bool QuickFindSearchInPasswords + { + get { return m_bQuickFindSearchInPasswords; } + set { m_bQuickFindSearchInPasswords = value; } + } + + private bool m_bQuickFindExcludeExpired = false; + [DefaultValue(false)] + public bool QuickFindExcludeExpired + { + get { return m_bQuickFindExcludeExpired; } + set { m_bQuickFindExcludeExpired = value; } + } + + private bool m_bQuickFindDerefData = false; + [DefaultValue(false)] + public bool QuickFindDerefData + { + get { return m_bQuickFindDerefData; } + set { m_bQuickFindDerefData = value; } + } + + private bool m_bFocusResAfterQuickFind = false; + [DefaultValue(false)] + public bool FocusResultsAfterQuickFind + { + get { return m_bFocusResAfterQuickFind; } + set { m_bFocusResAfterQuickFind = value; } + } + + private bool m_bFocusQuickFindOnRestore = false; + /// + /// Focus the quick search box when restoring the main + /// window. Here 'restoring' actually means unminimizing, + /// i.e. restoring or maximizing the window. + /// + [DefaultValue(false)] + public bool FocusQuickFindOnRestore + { + get { return m_bFocusQuickFindOnRestore; } + set { m_bFocusQuickFindOnRestore = value; } + } + + private bool m_bFocusQuickFindOnUntray = false; + [DefaultValue(false)] + public bool FocusQuickFindOnUntray + { + get { return m_bFocusQuickFindOnUntray; } + set { m_bFocusQuickFindOnUntray = value; } + } + + private bool m_bCopyUrls = false; + [DefaultValue(false)] + public bool CopyUrlsInsteadOfOpening + { + get { return m_bCopyUrls; } + set { m_bCopyUrls = value; } + } + + private bool m_bEntrySelGroupSel = true; + [DefaultValue(true)] + public bool EntrySelGroupSel + { + get { return m_bEntrySelGroupSel; } + set { m_bEntrySelGroupSel = value; } + } + + private bool m_bDisableSaveIfNotModified = false; + /// + /// Disable 'Save' button (instead of graying it out) if the database + /// hasn't been modified. + /// + [DefaultValue(false)] + public bool DisableSaveIfNotModified + { + get { return m_bDisableSaveIfNotModified; } + set { m_bDisableSaveIfNotModified = value; } + } + + private bool m_bHideCloseDbTb = true; + [DefaultValue(true)] + public bool HideCloseDatabaseButton + { + get { return m_bHideCloseDbTb; } + set { m_bHideCloseDbTb = value; } + } + + private AceToolBar m_tb = new AceToolBar(); + public AceToolBar ToolBar + { + get { return m_tb; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_tb = value; + } + } + + private AceEntryView m_ev = new AceEntryView(); + public AceEntryView EntryView + { + get { return m_ev; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_ev = value; + } + } + + private AceTanView m_tan = new AceTanView(); + public AceTanView TanView + { + get { return m_tan; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_tan = value; + } + } + + private List m_lColumns = new List(); + [XmlArray("EntryListColumnCollection")] + [XmlArrayItem("Column")] + public List EntryListColumns + { + get { return m_lColumns; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_lColumns = value; + } + } + + private string m_strDisplayIndices = string.Empty; + [DefaultValue("")] + public string EntryListColumnDisplayOrder + { + get { return m_strDisplayIndices; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strDisplayIndices = value; + } + } + + private bool m_bAutoResizeColumns = false; + [DefaultValue(false)] + public bool EntryListAutoResizeColumns + { + get { return m_bAutoResizeColumns; } + set { m_bAutoResizeColumns = value; } + } + + private bool m_bAlternatingBgColor = true; + [DefaultValue(true)] + public bool EntryListAlternatingBgColors + { + get { return m_bAlternatingBgColor; } + set { m_bAlternatingBgColor = value; } + } + + private int m_argbAltBgColor = 0; + [DefaultValue(0)] + public int EntryListAlternatingBgColor + { + get { return m_argbAltBgColor; } + set { m_argbAltBgColor = value; } + } + + private bool m_bResolveFieldRefs = false; + [DefaultValue(false)] + public bool EntryListShowDerefData + { + get { return m_bResolveFieldRefs; } + set { m_bResolveFieldRefs = value; } + } + + private bool m_bResolveFieldRefsAsync = false; + [DefaultValue(false)] + public bool EntryListShowDerefDataAsync + { + get { return m_bResolveFieldRefsAsync; } + set { m_bResolveFieldRefsAsync = value; } + } + + private bool m_bDerefDataWithRefs = true; + [DefaultValue(true)] + public bool EntryListShowDerefDataAndRefs + { + get { return m_bDerefDataWithRefs; } + set { m_bDerefDataWithRefs = value; } + } + + // private bool m_bGridLines = false; + // public bool ShowGridLines + // { + // get { return m_bGridLines; } + // set { m_bGridLines = value; } + // } + + private ListSorter m_pListSorter = null; + public ListSorter ListSorting + { + get + { + if(m_pListSorter == null) m_pListSorter = new ListSorter(); + return m_pListSorter; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_pListSorter = value; + } + } + + private int m_iLgMain = (int)AceListGrouping.Auto; + [DefaultValue((int)AceListGrouping.Auto)] + public int ListGrouping // AceListGrouping + { + get { return m_iLgMain; } + set { m_iLgMain = value; } + } + + private bool m_bShowEntriesOfSubGroups = false; + [DefaultValue(false)] + public bool ShowEntriesOfSubGroups + { + get { return m_bShowEntriesOfSubGroups; } + set { m_bShowEntriesOfSubGroups = value; } + } + + public AceColumn FindColumn(AceColumnType t) + { + foreach(AceColumn c in m_lColumns) + { + if(c.Type == t) return c; + } + + return null; + } + + internal List FindColumns(AceColumnType t) + { + List l = new List(); + + foreach(AceColumn c in m_lColumns) + { + if(c.Type == t) l.Add(c); + } + + return l; + } + + public bool IsColumnHidden(AceColumnType t) + { + return IsColumnHidden(t, (t == AceColumnType.Password)); + } + + public bool IsColumnHidden(AceColumnType t, bool bDefault) + { + foreach(AceColumn c in m_lColumns) + { + if(c.Type == t) return c.HideWithAsterisks; + } + + return bDefault; + } + + public bool ShouldHideCustomString(string strCustomName, + ProtectedString psValue) + { + foreach(AceColumn c in m_lColumns) + { + if((c.Type == AceColumnType.CustomString) && + (c.CustomName == strCustomName)) + return c.HideWithAsterisks; + } + if(psValue != null) return psValue.IsProtected; + return false; + } + } + + public sealed class AceEntryView + { + public AceEntryView() + { + } + + private bool m_bShow = true; + [DefaultValue(true)] + public bool Show + { + get { return m_bShow; } + set { m_bShow = value; } + } + + // private bool m_bHideProtectedCustomStrings = true; + // [DefaultValue(true)] + // public bool HideProtectedCustomStrings + // { + // get { return m_bHideProtectedCustomStrings; } + // set { m_bHideProtectedCustomStrings = value; } + // } + } + + public sealed class AceTanView + { + public AceTanView() + { + } + + private bool m_bSimple = true; + [DefaultValue(true)] + public bool UseSimpleView + { + get { return m_bSimple; } + set { m_bSimple = value; } + } + + private bool m_bIndices = true; + [DefaultValue(true)] + public bool ShowIndices + { + get { return m_bIndices; } + set { m_bIndices = value; } + } + } + + public enum AceColumnType + { + Title = 0, + UserName, + Password, + Url, + Notes, + CreationTime, + LastModificationTime, + LastAccessTime, + ExpiryTime, + Uuid, + Attachment, + + CustomString, + + PluginExt, // Column data provided by a plugin + + OverrideUrl, + Tags, + ExpiryTimeDateOnly, + Size, + HistoryCount, + AttachmentCount, + LastPasswordModTime, + AutoTypeEnabled, + AutoTypeSequences, + + Count // Virtual identifier representing the number of types + } + + public sealed class AceColumn + { + private AceColumnType m_type = AceColumnType.Count; + public AceColumnType Type + { + get { return m_type; } + set + { + if(((int)value >= 0) && ((int)value < (int)AceColumnType.Count)) + m_type = value; + else { Debug.Assert(false); } + } + } + + private string m_strCustomName = string.Empty; + [DefaultValue("")] + public string CustomName + { + get { return m_strCustomName; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strCustomName = value; + } + } + + private int m_nWidth = -1; + public int Width + { + get { return m_nWidth; } + set { m_nWidth = value; } + } + + private bool m_bHide = false; + [DefaultValue(false)] + public bool HideWithAsterisks + { + get { return m_bHide; } + set { m_bHide = value; } + } + + public AceColumn() + { + } + + public AceColumn(AceColumnType t) + { + m_type = t; + } + + public AceColumn(AceColumnType t, string strCustomName, bool bHide, + int nWidth) + { + m_type = t; + m_strCustomName = strCustomName; + m_bHide = bHide; + m_nWidth = nWidth; + } + + public string GetDisplayName() + { + string str = string.Empty; + + switch(m_type) + { + case AceColumnType.Title: str = KPRes.Title; break; + case AceColumnType.UserName: str = KPRes.UserName; break; + case AceColumnType.Password: str = KPRes.Password; break; + case AceColumnType.Url: str = KPRes.Url; break; + case AceColumnType.Notes: str = KPRes.Notes; break; + case AceColumnType.CreationTime: str = KPRes.CreationTime; break; + case AceColumnType.LastModificationTime: str = KPRes.LastModificationTime; break; + case AceColumnType.LastAccessTime: str = KPRes.LastAccessTime; break; + case AceColumnType.ExpiryTime: str = KPRes.ExpiryTime; break; + case AceColumnType.Uuid: str = KPRes.Uuid; break; + case AceColumnType.Attachment: str = KPRes.Attachments; break; + case AceColumnType.CustomString: str = m_strCustomName; break; + case AceColumnType.PluginExt: str = m_strCustomName; break; + case AceColumnType.OverrideUrl: str = KPRes.UrlOverride; break; + case AceColumnType.Tags: str = KPRes.Tags; break; + case AceColumnType.ExpiryTimeDateOnly: str = KPRes.ExpiryTimeDateOnly; break; + case AceColumnType.Size: str = KPRes.Size; break; + case AceColumnType.HistoryCount: + str = KPRes.History + " (" + KPRes.Count + ")"; break; + case AceColumnType.AttachmentCount: + str = KPRes.Attachments + " (" + KPRes.Count + ")"; break; + case AceColumnType.LastPasswordModTime: str = KPRes.LastModTimePwHist; break; + case AceColumnType.AutoTypeEnabled: + str = KPRes.AutoType + " - " + KPRes.Enabled; break; + case AceColumnType.AutoTypeSequences: + str = KPRes.AutoType + " - " + KPRes.Sequences; break; + default: Debug.Assert(false); break; + }; + + return str; + } + + public int SafeGetWidth(int nDefaultWidth) + { + if(m_nWidth >= 0) return m_nWidth; + return nDefaultWidth; + } + + internal string GetTypeNameEx() + { + try + { + string str = m_type.ToString(); + + if(!string.IsNullOrEmpty(m_strCustomName)) + str += " - " + m_strCustomName; + + return str; + } + catch(Exception) { Debug.Assert(false); } + + return ((long)m_type).ToString(NumberFormatInfo.InvariantInfo); + } + +#if DEBUG + public override string ToString() + { + return (GetTypeNameEx() + ", Width: " + m_nWidth.ToString() + + ", Hide: " + m_bHide.ToString()); + } +#endif + + public static bool IsTimeColumn(AceColumnType t) + { + return ((t == AceColumnType.CreationTime) || + (t == AceColumnType.LastModificationTime) || + (t == AceColumnType.LastAccessTime) || + (t == AceColumnType.ExpiryTime) || + (t == AceColumnType.ExpiryTimeDateOnly) || + (t == AceColumnType.LastPasswordModTime)); + + /* bool bTime = false; + switch(t) + { + case AceColumnType.CreationTime: + case AceColumnType.LastModificationTime: + case AceColumnType.LastAccessTime: + case AceColumnType.ExpiryTime: + case AceColumnType.ExpiryTimeDateOnly: + case AceColumnType.LastPasswordModTime: + bTime = true; + break; + default: + break; + } + + return bTime; */ + } + + public static HorizontalAlignment GetTextAlign(AceColumnType t) + { + if((t == AceColumnType.Size) || (t == AceColumnType.HistoryCount) || + (t == AceColumnType.AttachmentCount)) + return HorizontalAlignment.Right; + + return HorizontalAlignment.Left; + } + } +} diff --git a/src/KeePass/App/Configuration/AceNative.cs b/src/KeePass/App/Configuration/AceNative.cs new file mode 100644 index 0000000..c137491 --- /dev/null +++ b/src/KeePass/App/Configuration/AceNative.cs @@ -0,0 +1,41 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; + +namespace KeePass.App.Configuration +{ + public sealed class AceNative + { + public AceNative() + { + } + + private bool m_bNativeKeyTrans = true; + [DefaultValue(true)] + public bool NativeKeyTransformations + { + get { return m_bNativeKeyTrans; } + set { m_bNativeKeyTrans = value; } + } + } +} diff --git a/src/KeePass/App/Configuration/AcePasswordGenerator.cs b/src/KeePass/App/Configuration/AcePasswordGenerator.cs new file mode 100644 index 0000000..70b1b04 --- /dev/null +++ b/src/KeePass/App/Configuration/AcePasswordGenerator.cs @@ -0,0 +1,69 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml.Serialization; + +using KeePassLib.Cryptography.PasswordGenerator; + +namespace KeePass.App.Configuration +{ + public sealed class AcePasswordGenerator + { + public AcePasswordGenerator() + { + } + + private PwProfile m_pwgoAutoProfile = new PwProfile(); + public PwProfile AutoGeneratedPasswordsProfile + { + get { return m_pwgoAutoProfile; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_pwgoAutoProfile = value; + } + } + + private PwProfile m_pwgoLastProfile = new PwProfile(); + public PwProfile LastUsedProfile + { + get { return m_pwgoLastProfile; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_pwgoLastProfile = value; + } + } + + private List m_vUserProfiles = new List(); + [XmlArrayItem("Profile")] + public List UserProfiles + { + get { return m_vUserProfiles; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_vUserProfiles = value; + } + } + } +} diff --git a/src/KeePass/App/Configuration/AceSearch.cs b/src/KeePass/App/Configuration/AceSearch.cs new file mode 100644 index 0000000..d08ecd7 --- /dev/null +++ b/src/KeePass/App/Configuration/AceSearch.cs @@ -0,0 +1,89 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Xml.Serialization; + +using KeePassLib; +using KeePassLib.Utility; + +namespace KeePass.App.Configuration +{ + public sealed class AceSearch + { + public AceSearch() + { + } + + private SearchParameters m_spLast = new SearchParameters(); + public SearchParameters LastUsedProfile + { + get { return m_spLast; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_spLast = value; + } + } + + private List m_lUserProfiles = new List(); + [XmlArrayItem("Profile")] + public List UserProfiles + { + get { return m_lUserProfiles; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_lUserProfiles = value; + } + } + + internal int FindProfileIndex(string strName) + { + for(int i = 0; i < m_lUserProfiles.Count; ++i) + { + if(m_lUserProfiles[i].Name == strName) return i; + } + + return -1; + } + + internal SearchParameters FindProfile(string strName) + { + int i = FindProfileIndex(strName); + return ((i >= 0) ? m_lUserProfiles[i] : null); + } + + internal void SortProfiles() + { + m_lUserProfiles.Sort(AceSearch.CompareProfilesByName); + } + + private static int CompareProfilesByName(SearchParameters spA, SearchParameters spB) + { + if(spA == null) { Debug.Assert(false); return ((spB == null) ? 0 : -1); } + if(spB == null) { Debug.Assert(false); return 1; } + + return StrUtil.CompareNaturally(spA.Name, spB.Name); + } + } +} diff --git a/src/KeePass/App/Configuration/AceSecurity.cs b/src/KeePass/App/Configuration/AceSecurity.cs new file mode 100644 index 0000000..2ebc85b --- /dev/null +++ b/src/KeePass/App/Configuration/AceSecurity.cs @@ -0,0 +1,274 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; + +namespace KeePass.App.Configuration +{ + public sealed class AceSecurity + { + public AceSecurity() + { + } + + private AceWorkspaceLocking m_wsl = new AceWorkspaceLocking(); + public AceWorkspaceLocking WorkspaceLocking + { + get { return m_wsl; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_wsl = value; + } + } + + private AppPolicyFlags m_appPolicy = new AppPolicyFlags(); + public AppPolicyFlags Policy + { + get { return m_appPolicy; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_appPolicy = value; + } + } + + private AceMasterPassword m_mp = new AceMasterPassword(); + public AceMasterPassword MasterPassword + { + get { return m_mp; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_mp = value; + } + } + + private int m_nMasterKeyTries = 3; + [DefaultValue(3)] + public int MasterKeyTries + { + get { return m_nMasterKeyTries; } + set { m_nMasterKeyTries = value; } + } + + private bool m_bSecureDesktop = false; + [DefaultValue(false)] + public bool MasterKeyOnSecureDesktop + { + get { return m_bSecureDesktop; } + set { m_bSecureDesktop = value; } + } + + private string m_strMasterKeyExpiryRec = string.Empty; + [DefaultValue("")] + public string MasterKeyExpiryRec + { + get { return m_strMasterKeyExpiryRec; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strMasterKeyExpiryRec = value; + } + } + + private bool m_bClipClearOnExit = true; + [DefaultValue(true)] + public bool ClipboardClearOnExit + { + get { return m_bClipClearOnExit; } + set { m_bClipClearOnExit = value; } + } + + private int m_nClipClearSeconds = 12; + [DefaultValue(12)] + public int ClipboardClearAfterSeconds + { + get { return m_nClipClearSeconds; } + set { m_nClipClearSeconds = value; } + } + + private bool m_bClipNoPersist = true; + [DefaultValue(true)] + public bool ClipboardNoPersist + { + get { return m_bClipNoPersist; } + set { m_bClipNoPersist = value; } + } + + // The clipboard tools of old Office versions crash when + // storing the 'Clipboard Viewer Ignore' format using the + // OleSetClipboard function. + // Therefore, the default value of the option to use this + // format should be true if and only if KeePass uses the + // SetClipboardData function only (i.e. no OLE). + // Note that the .NET Framework and the UWP seem to use + // OLE internally. + private bool m_bUseClipboardViewerIgnoreFmt = true; + [DefaultValue(true)] + public bool UseClipboardViewerIgnoreFormat + { + get { return m_bUseClipboardViewerIgnoreFmt; } + set { m_bUseClipboardViewerIgnoreFmt = value; } + } + + private bool m_bClearKeyCmdLineOpt = true; + [DefaultValue(true)] + public bool ClearKeyCommandLineParams + { + get { return m_bClearKeyCmdLineOpt; } + set { m_bClearKeyCmdLineOpt = value; } + } + + private bool m_bSslCertsAcceptInvalid = false; + [DefaultValue(false)] + public bool SslCertsAcceptInvalid + { + get { return m_bSslCertsAcceptInvalid; } + set { m_bSslCertsAcceptInvalid = value; } + } + + // https://keepass.info/help/v2_dev/customize.html#opt + private bool m_bPreventScreenCapture = false; + [DefaultValue(false)] + public bool PreventScreenCapture + { + get { return m_bPreventScreenCapture; } + set { m_bPreventScreenCapture = value; } + } + + // https://keepass.info/help/v2_dev/customize.html#opt + private bool m_bProtectProcessWithDacl = false; + [DefaultValue(false)] + public bool ProtectProcessWithDacl + { + get { return m_bProtectProcessWithDacl; } + set { m_bProtectProcessWithDacl = value; } + } + } + + public sealed class AceWorkspaceLocking + { + public AceWorkspaceLocking() + { + } + + private bool m_bOnMinimize = false; + [DefaultValue(false)] + public bool LockOnWindowMinimize + { + get { return m_bOnMinimize; } + set { m_bOnMinimize = value; } + } + + private bool m_bOnMinimizeToTray = false; + [DefaultValue(false)] + public bool LockOnWindowMinimizeToTray + { + get { return m_bOnMinimizeToTray; } + set { m_bOnMinimizeToTray = value; } + } + + private bool m_bOnSessionSwitch = false; + [DefaultValue(false)] + public bool LockOnSessionSwitch + { + get { return m_bOnSessionSwitch; } + set { m_bOnSessionSwitch = value; } + } + + private bool m_bOnSuspend = false; + [DefaultValue(false)] + public bool LockOnSuspend + { + get { return m_bOnSuspend; } + set { m_bOnSuspend = value; } + } + + private bool m_bOnRemoteControlChange = false; + [DefaultValue(false)] + public bool LockOnRemoteControlChange + { + get { return m_bOnRemoteControlChange; } + set { m_bOnRemoteControlChange = value; } + } + + private uint m_uLockAfterTime = 0; + public uint LockAfterTime + { + get { return m_uLockAfterTime; } + set { m_uLockAfterTime = value; } + } + + private uint m_uLockAfterGlobalTime = 0; + public uint LockAfterGlobalTime + { + get { return m_uLockAfterGlobalTime; } + set { m_uLockAfterGlobalTime = value; } + } + + private bool m_bExitInsteadOfLockingAfterTime = false; + [DefaultValue(false)] + public bool ExitInsteadOfLockingAfterTime + { + get { return m_bExitInsteadOfLockingAfterTime; } + set { m_bExitInsteadOfLockingAfterTime = value; } + } + + private bool m_bAlwaysExitInsteadOfLocking = false; + [DefaultValue(false)] + public bool AlwaysExitInsteadOfLocking + { + get { return m_bAlwaysExitInsteadOfLocking; } + set { m_bAlwaysExitInsteadOfLocking = value; } + } + } + + public sealed class AceMasterPassword + { + public AceMasterPassword() + { + } + + private uint m_uMinLength = 0; + public uint MinimumLength + { + get { return m_uMinLength; } + set { m_uMinLength = value; } + } + + private uint m_uMinQuality = 0; + public uint MinimumQuality + { + get { return m_uMinQuality; } + set { m_uMinQuality = value; } + } + + private bool m_bRememberWhileOpen = true; + [DefaultValue(true)] + public bool RememberWhileOpen + { + get { return m_bRememberWhileOpen; } + set { m_bRememberWhileOpen = value; } + } + } +} diff --git a/src/KeePass/App/Configuration/AceToolBar.cs b/src/KeePass/App/Configuration/AceToolBar.cs new file mode 100644 index 0000000..1fe09a6 --- /dev/null +++ b/src/KeePass/App/Configuration/AceToolBar.cs @@ -0,0 +1,41 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; + +namespace KeePass.App.Configuration +{ + public sealed class AceToolBar + { + public AceToolBar() + { + } + + private bool m_bShow = true; + [DefaultValue(true)] + public bool Show + { + get { return m_bShow; } + set { m_bShow = value; } + } + } +} diff --git a/src/KeePass/App/Configuration/AceTrayIcon.cs b/src/KeePass/App/Configuration/AceTrayIcon.cs new file mode 100644 index 0000000..ba1c5c0 --- /dev/null +++ b/src/KeePass/App/Configuration/AceTrayIcon.cs @@ -0,0 +1,70 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; +using System.Xml.Serialization; + +namespace KeePass.App.Configuration +{ + public sealed class AceTrayIcon + { + public AceTrayIcon() + { + } + + [Obsolete] // For backward compatibility with plugins only + [XmlIgnore] + public bool ShowOnlyIfTrayed + { + get { return this.ShowOnlyIfTrayedEx; } + // Old setting should not affect 'ShowOnlyIfTrayedEx'; + // a reset of this option is intended + set { } + } + + // Not available through the options dialog, see documentation; + // 'ShowOnlyIfTrayed' was used by KeePass <= 2.41 + private bool m_bOnlyIfTrayedEx = false; + [DefaultValue(false)] + public bool ShowOnlyIfTrayedEx + { + get { return m_bOnlyIfTrayedEx; } + set { m_bOnlyIfTrayedEx = value; } + } + + private bool m_bGrayIcon = false; + [DefaultValue(false)] + public bool GrayIcon + { + get { return m_bGrayIcon; } + set { m_bGrayIcon = value; } + } + + private bool m_bSingleClickDefault = false; + [DefaultValue(false)] + public bool SingleClickDefault + { + get { return m_bSingleClickDefault; } + set { m_bSingleClickDefault = value; } + } + } +} diff --git a/src/KeePass/App/Configuration/AceUI.cs b/src/KeePass/App/Configuration/AceUI.cs new file mode 100644 index 0000000..8d908bc --- /dev/null +++ b/src/KeePass/App/Configuration/AceUI.cs @@ -0,0 +1,584 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.Text; + +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib.Utility; + +namespace KeePass.App.Configuration +{ + [Flags] + public enum AceKeyUIFlags : ulong + { + None = 0, + EnablePassword = 0x1, + EnableKeyFile = 0x2, + EnableUserAccount = 0x4, + EnableHidePassword = 0x8, + DisablePassword = 0x100, + DisableKeyFile = 0x200, + DisableUserAccount = 0x400, + DisableHidePassword = 0x800, + CheckPassword = 0x10000, + CheckKeyFile = 0x20000, + CheckUserAccount = 0x40000, + CheckHidePassword = 0x80000, + UncheckPassword = 0x1000000, + UncheckKeyFile = 0x2000000, + UncheckUserAccount = 0x4000000, + UncheckHidePassword = 0x8000000 + } + + [Flags] + public enum AceUIFlags : ulong + { + None = 0, + + DisableOptions = 0x1, + DisablePlugins = 0x2, + DisableTriggers = 0x4, + DisableKeyChangeDays = 0x8, + HidePwQuality = 0x10, + DisableUpdateCheck = 0x20, + DisableXmlReplace = 0x40, + DisableDbSettings = 0x80, + + HideBuiltInPwGenPrfInEntryDlg = 0x10000, + ShowLastAccessTime = 0x20000, + HideNewDbInfoDialogs = 0x40000, + HideAutoTypeObfInfo = 0x80000, + NoQuickSearchClear = 0x100000, + SecureDesktopIme = 0x200000 + } + + [Flags] + public enum AceAutoTypeCtxFlags : long + { + None = 0, + + ColTitle = 0x1, + ColUserName = 0x2, + ColPassword = 0x4, + ColUrl = 0x8, + ColNotes = 0x10, + ColSequence = 0x20, + ColSequenceComments = 0x40, + + Default = (ColTitle | ColUserName | ColUrl | ColSequence) + } + + public sealed class AceUI + { + public AceUI() + { + } + + private AceTrayIcon m_tray = new AceTrayIcon(); + public AceTrayIcon TrayIcon + { + get { return m_tray; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_tray = value; + } + } + + private AceHiding m_uiHiding = new AceHiding(); + public AceHiding Hiding + { + get { return m_uiHiding; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_uiHiding = value; + } + } + + private bool m_bRepeatPwOnlyWhenHidden = true; + [DefaultValue(true)] + public bool RepeatPasswordOnlyWhenHidden + { + get { return m_bRepeatPwOnlyWhenHidden; } + set { m_bRepeatPwOnlyWhenHidden = value; } + } + + private AceFont m_font = new AceFont(); + public AceFont StandardFont + { + get { return m_font; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_font = value; + } + } + + private AceFont m_fontPasswords = new AceFont(true); + public AceFont PasswordFont + { + get { return m_fontPasswords; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_fontPasswords = value; + } + } + + private bool m_bForceSysFont = true; + [DefaultValue(true)] + public bool ForceSystemFontUnix + { + get { return m_bForceSysFont; } + set { m_bForceSysFont = value; } + } + + private BannerStyle m_bannerStyle = BannerStyle.WinVistaBlack; + public BannerStyle BannerStyle + { + get { return m_bannerStyle; } + set { m_bannerStyle = value; } + } + + private bool m_bShowImportStatusDlg = false; + [DefaultValue(false)] + public bool ShowImportStatusDialog + { + get { return m_bShowImportStatusDlg; } + set { m_bShowImportStatusDlg = value; } + } + + private bool m_bShowRecycleDlg = true; + [DefaultValue(true)] + public bool ShowRecycleConfirmDialog + { + get { return m_bShowRecycleDlg; } + set { m_bShowRecycleDlg = value; } + } + + private bool m_bShowDbMntncResDlg = true; + [DefaultValue(true)] + public bool ShowDbMntncResultsDialog + { + get { return m_bShowDbMntncResDlg; } + set { m_bShowDbMntncResDlg = value; } + } + + private bool m_bShowEmSheetDlg = true; + [DefaultValue(true)] + public bool ShowEmSheetDialog + { + get { return m_bShowEmSheetDlg; } + set { m_bShowEmSheetDlg = value; } + } + + private bool m_bShowDbOpenUnkVerDlg = true; + [DefaultValue(true)] + public bool ShowDbOpenUnkVerDialog + { + get { return m_bShowDbOpenUnkVerDlg; } + set { m_bShowDbOpenUnkVerDlg = value; } + } + + // private bool m_bUseCustomTsRenderer = true; + // [DefaultValue(true)] + // public bool UseCustomToolStripRenderer + // { + // get { return m_bUseCustomTsRenderer; } + // set { m_bUseCustomTsRenderer = value; } + // } + + private string m_strToolStripRenderer = string.Empty; + [DefaultValue("")] + public string ToolStripRenderer + { + get { return m_strToolStripRenderer; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strToolStripRenderer = value; + } + } + + private bool m_bTreeViewShowLines = false; + [DefaultValue(false)] + public bool TreeViewShowLines + { + get { return m_bTreeViewShowLines; } + set { m_bTreeViewShowLines = value; } + } + + private bool m_bOptScreenReader = false; + [DefaultValue(false)] + public bool OptimizeForScreenReader + { + get { return m_bOptScreenReader; } + set { m_bOptScreenReader = value; } + } + + private string m_strDataViewerRect = string.Empty; + [DefaultValue("")] + public string DataViewerRect + { + get { return m_strDataViewerRect; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strDataViewerRect = value; + } + } + + private string m_strDataEditorRect = string.Empty; + [DefaultValue("")] + public string DataEditorRect + { + get { return m_strDataEditorRect; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strDataEditorRect = value; + } + } + + private AceFont m_deFont = new AceFont(); + public AceFont DataEditorFont + { + get { return m_deFont; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_deFont = value; + } + } + + private bool m_bDeWordWrap = true; + [DefaultValue(true)] + public bool DataEditorWordWrap + { + get { return m_bDeWordWrap; } + set { m_bDeWordWrap = value; } + } + + private string m_strCharPickerRect = string.Empty; + [DefaultValue("")] + public string CharPickerRect + { + get { return m_strCharPickerRect; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strCharPickerRect = value; + } + } + + private string m_strAutoTypeCtxRect = string.Empty; + [DefaultValue("")] + public string AutoTypeCtxRect + { + get { return m_strAutoTypeCtxRect; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strAutoTypeCtxRect = value; + } + } + + private long m_lAutoTypeCtxFlags = (long)AceAutoTypeCtxFlags.Default; + [DefaultValue((long)AceAutoTypeCtxFlags.Default)] + public long AutoTypeCtxFlags + { + get { return m_lAutoTypeCtxFlags; } + set { m_lAutoTypeCtxFlags = value; } + } + + private string m_strAutoTypeCtxColWidths = string.Empty; + [DefaultValue("")] + public string AutoTypeCtxColumnWidths + { + get { return m_strAutoTypeCtxColWidths; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strAutoTypeCtxColWidths = value; + } + } + + private ulong m_uUIFlags = (ulong)AceUIFlags.None; + public ulong UIFlags + { + get { return m_uUIFlags; } + set { m_uUIFlags = value; } + } + + private ulong m_uKeyCreationFlags = (ulong)AceKeyUIFlags.None; + public ulong KeyCreationFlags + { + get { return m_uKeyCreationFlags; } + set { m_uKeyCreationFlags = value; } + } + + private ulong m_uKeyPromptFlags = (ulong)AceKeyUIFlags.None; + public ulong KeyPromptFlags + { + get { return m_uKeyPromptFlags; } + set { m_uKeyPromptFlags = value; } + } + + // private bool m_bEditCancelConfirmation = true; + // public bool EntryEditCancelConfirmation + // { + // get { return m_bEditCancelConfirmation; } + // set { m_bEditCancelConfirmation = value; } + // } + + private bool m_bAdvATCmds = false; + [DefaultValue(false)] + public bool ShowAdvAutoTypeCommands + { + get { return m_bAdvATCmds; } + set { m_bAdvATCmds = value; } + } + + private bool m_bSecDeskSound = true; + [DefaultValue(true)] + public bool SecureDesktopPlaySound + { + get { return m_bSecDeskSound; } + set { m_bSecDeskSound = value; } + } + } + + public sealed class AceHiding + { + public AceHiding() + { + } + + private bool m_bRememberHidePwsMain = true; + [DefaultValue(true)] + public bool RememberHidingPasswordsMain + { + get { return m_bRememberHidePwsMain; } + set { m_bRememberHidePwsMain = value; } + } + + private bool m_bSepHiding = false; + [DefaultValue(false)] + public bool SeparateHidingSettings + { + get { return m_bSepHiding; } + set { m_bSepHiding = value; } + } + + private bool m_bHideInEntryDialog = true; + [DefaultValue(true)] + public bool HideInEntryWindow + { + get { return m_bHideInEntryDialog; } + set { m_bHideInEntryDialog = value; } + } + + private bool m_bUnhideBtnAlsoUnhidesSec = false; + [DefaultValue(false)] + public bool UnhideButtonAlsoUnhidesSource + { + get { return m_bUnhideBtnAlsoUnhidesSec; } + set { m_bUnhideBtnAlsoUnhidesSec = value; } + } + } + + public sealed class AceFont + { + private Font m_fCached = null; + private bool m_bCacheValid = false; + + private string m_strFamily = "Microsoft Sans Serif"; + public string Family + { + get { return m_strFamily; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strFamily = value; + m_bCacheValid = false; + } + } + + private float m_fSize = 8.25f; + public float Size + { + get { return m_fSize; } + set { m_fSize = value; m_bCacheValid = false; } + } + + private GraphicsUnit m_gu = GraphicsUnit.Point; + public GraphicsUnit GraphicsUnit + { + get { return m_gu; } + set { m_gu = value; m_bCacheValid = false; } + } + + private FontStyle m_fs = FontStyle.Regular; + [DefaultValue(FontStyle.Regular)] + public FontStyle Style + { + get { return m_fs; } + set { m_fs = value; m_bCacheValid = false; } + } + + private bool m_bOverrideUIDefault = false; + public bool OverrideUIDefault + { + get { return m_bOverrideUIDefault; } + set { m_bOverrideUIDefault = value; } + } + + public AceFont() + { + } + + public AceFont(Font f) : this(f, false) + { + } + + internal AceFont(Font f, bool bOverrideUIDefault) + { + if(f == null) throw new ArgumentNullException("f"); + + this.Family = f.FontFamily.Name; + m_fSize = f.Size; + m_gu = f.Unit; + m_fs = f.Style; + + m_bOverrideUIDefault = bOverrideUIDefault; + } + + public AceFont(bool bMonospace) + { + if(bMonospace) m_strFamily = "Courier New"; + } + + internal AceFont CloneDeep() + { + return (AceFont)MemberwiseClone(); + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + + if(string.IsNullOrEmpty(m_strFamily)) + { + sb.Append('('); + sb.Append(KPRes.None); + sb.Append(')'); + } + else sb.Append(m_strFamily); + + sb.Append(", "); + sb.Append(Math.Round(m_fSize)); // 8.25, 9, 9.75, 11.25, 12, ... + sb.Append(' '); + sb.Append(GfxUtil.GraphicsUnitToString(m_gu)); + + string strStyle = FontUtil.FontStyleToString(m_fs); + if(!string.IsNullOrEmpty(strStyle)) + { + sb.Append(", "); + sb.Append(strStyle); + } + + return sb.ToString(); + } + + public Font ToFont() + { + if(m_bCacheValid) return m_fCached; + + m_fCached = FontUtil.CreateFont(m_strFamily, m_fSize, m_fs, m_gu); + m_bCacheValid = true; + return m_fCached; + } + + private static void AppendCss(StringBuilder sb, string strIndent, + string strProperty, params string[] vValueParts) + { + sb.Append(strIndent); + sb.Append(strProperty); + sb.Append(": "); + + for(int i = 0; i < vValueParts.Length; ++i) + sb.Append(vValueParts[i]); // Without separator space + + sb.AppendLine(";"); + } + + internal string ToCss(string strIndent, string strFamilyFallback, + bool bWithDefaults) + { + if(strIndent == null) { Debug.Assert(false); strIndent = string.Empty; } + + StringBuilder sb = new StringBuilder(); + NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo; + + string strFamily = string.Empty; + if(!string.IsNullOrEmpty(m_strFamily)) + strFamily = "\"" + StrUtil.CssEscapeString(m_strFamily) + "\""; + else { Debug.Assert(false); } + if(!string.IsNullOrEmpty(strFamilyFallback)) + strFamily += ((strFamily.Length != 0) ? ", " : string.Empty) + + strFamilyFallback; + if(strFamily.Length != 0) + AppendCss(sb, strIndent, "font-family", strFamily); + + AppendCss(sb, strIndent, "font-size", m_fSize.ToString(nfi), + GfxUtil.GraphicsUnitToString(m_gu)); + + if((m_fs & FontStyle.Bold) != FontStyle.Regular) + AppendCss(sb, strIndent, "font-weight", "bold"); + else if(bWithDefaults) + AppendCss(sb, strIndent, "font-weight", "normal"); + + if((m_fs & FontStyle.Italic) != FontStyle.Regular) + AppendCss(sb, strIndent, "font-style", "italic"); + else if(bWithDefaults) + AppendCss(sb, strIndent, "font-style", "normal"); + + const FontStyle fsUS = FontStyle.Underline | FontStyle.Strikeout; + if((m_fs & fsUS) == fsUS) + AppendCss(sb, strIndent, "text-decoration", "underline line-through"); + else if((m_fs & FontStyle.Underline) != FontStyle.Regular) + AppendCss(sb, strIndent, "text-decoration", "underline"); + else if((m_fs & FontStyle.Strikeout) != FontStyle.Regular) + AppendCss(sb, strIndent, "text-decoration", "line-through"); + else if(bWithDefaults) + AppendCss(sb, strIndent, "text-decoration", "none"); + + return sb.ToString(); + } + } +} diff --git a/src/KeePass/App/Configuration/AppConfigEx.cs b/src/KeePass/App/Configuration/AppConfigEx.cs new file mode 100644 index 0000000..85a8ad7 --- /dev/null +++ b/src/KeePass/App/Configuration/AppConfigEx.cs @@ -0,0 +1,797 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Reflection; +using System.Text; +using System.Windows.Forms; +using System.Xml; +using System.Xml.Serialization; + +using KeePass.UI; +using KeePass.Util; +using KeePass.Util.XmlSerialization; + +using KeePassLib; +using KeePassLib.Delegates; +using KeePassLib.Native; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +namespace KeePass.App.Configuration +{ + [XmlType(AppConfigEx.StrXmlTypeName)] + public sealed class AppConfigEx + { + internal const string StrXmlTypeName = "Configuration"; + + private string m_strSearchString = null; + + public AppConfigEx() + { + } + +#if DEBUG + ~AppConfigEx() + { + Debug.Assert(m_strSearchString == null); + } +#endif + + private AceMeta m_meta = null; + public AceMeta Meta + { + get + { + if(m_meta == null) m_meta = new AceMeta(); + return m_meta; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_meta = value; + } + } + + private AceApplication m_aceApp = null; + public AceApplication Application + { + get + { + if(m_aceApp == null) m_aceApp = new AceApplication(); + return m_aceApp; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_aceApp = value; + } + } + + private AceLogging m_aceLogging = null; + public AceLogging Logging + { + get + { + if(m_aceLogging == null) m_aceLogging = new AceLogging(); + return m_aceLogging; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_aceLogging = value; + } + } + + private AceMainWindow m_uiMainWindow = null; + public AceMainWindow MainWindow + { + get + { + if(m_uiMainWindow == null) m_uiMainWindow = new AceMainWindow(); + return m_uiMainWindow; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_uiMainWindow = value; + } + } + + private AceUI m_aceUI = null; + public AceUI UI + { + get + { + if(m_aceUI == null) m_aceUI = new AceUI(); + return m_aceUI; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_aceUI = value; + } + } + + private AceSecurity m_sec = null; + public AceSecurity Security + { + get + { + if(m_sec == null) m_sec = new AceSecurity(); + return m_sec; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_sec = value; + } + } + + private AceNative m_native = null; + public AceNative Native + { + get + { + if(m_native == null) m_native = new AceNative(); + return m_native; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_native = value; + } + } + + private AcePasswordGenerator m_pwGen = null; + public AcePasswordGenerator PasswordGenerator + { + get + { + if(m_pwGen == null) m_pwGen = new AcePasswordGenerator(); + return m_pwGen; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_pwGen = value; + } + } + + private AceSearch m_aceSearch = null; + public AceSearch Search + { + get + { + if(m_aceSearch == null) m_aceSearch = new AceSearch(); + return m_aceSearch; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_aceSearch = value; + } + } + + private AceDefaults m_def = null; + public AceDefaults Defaults + { + get + { + if(m_def == null) m_def = new AceDefaults(); + return m_def; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_def = value; + } + } + + private AceIntegration m_int = null; + public AceIntegration Integration + { + get + { + if(m_int == null) m_int = new AceIntegration(); + return m_int; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_int = value; + } + } + + private AceCustomConfig m_cc = null; + [XmlIgnore] + public AceCustomConfig CustomConfig + { + get + { + if(m_cc == null) m_cc = new AceCustomConfig(); + return m_cc; + } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_cc = value; + } + } + + [XmlArray("Custom")] + [XmlArrayItem("Item")] + public AceKvp[] CustomSerialized + { + get + { + return this.CustomConfig.Serialize(); // m_cc might be null + } + set + { + if(value == null) throw new ArgumentNullException("value"); + this.CustomConfig.Deserialize(value); // m_cc might be null + } + } + + /// + /// Prepare for saving the configuration to disk. None of the + /// modifications in this method need to be rolled back + /// (for rollback, use OnSavePre / OnSavePost). + /// + private void PrepareSave() + { + AceMeta aceMeta = this.Meta; // m_meta might be null + AceApplication aceApp = this.Application; // m_aceApp might be null + AceSearch aceSearch = this.Search; // m_aceSearch might be null + AceDefaults aceDef = this.Defaults; // m_def might be null + + aceMeta.OmitItemsWithDefaultValues = true; + aceMeta.DpiFactorX = DpiUtil.FactorX; // For new (not loaded) cfgs. + aceMeta.DpiFactorY = DpiUtil.FactorY; + + aceApp.LastUsedFile.ClearCredentials(true); + + foreach(IOConnectionInfo iocMru in aceApp.MostRecentlyUsed.Items) + iocMru.ClearCredentials(true); + + if(!aceDef.RememberKeySources) aceDef.KeySources.Clear(); + + aceApp.TriggerSystem = Program.TriggerSystem; + + SearchUtil.PrepareForSerialize(aceSearch.LastUsedProfile); + foreach(SearchParameters sp in aceSearch.UserProfiles) + SearchUtil.PrepareForSerialize(sp); + + const int m = 64; // Maximum number of compatibility items + List l = aceApp.PluginCompatibility; + if(l.Count > m) l.RemoveRange(m, l.Count - m); // See reg. + } + + internal void OnLoad() + { + AceMainWindow aceMW = this.MainWindow; // m_uiMainWindow might be null + AceSearch aceSearch = this.Search; // m_aceSearch might be null + AceDefaults aceDef = this.Defaults; // m_def might be null + + // aceInt.UrlSchemeOverrides.SetDefaultsIfEmpty(); + + ObfuscateCred(false); + ChangePathsRelAbs(true); + + // Remove invalid columns + List lColumns = aceMW.EntryListColumns; + int i = 0; + while(i < lColumns.Count) + { + if(((int)lColumns[i].Type < 0) || ((int)lColumns[i].Type >= + (int)AceColumnType.Count)) + lColumns.RemoveAt(i); + else ++i; + } + + SearchUtil.FinishDeserialize(aceSearch.LastUsedProfile); + foreach(SearchParameters sp in aceSearch.UserProfiles) + SearchUtil.FinishDeserialize(sp); + + DpiScale(); + + if(aceMW.EscMinimizesToTray) // For backward compatibility + { + aceMW.EscMinimizesToTray = false; // Default value + aceMW.EscAction = AceEscAction.MinimizeToTray; + } + + if(NativeLib.IsUnix()) + { + this.Security.MasterKeyOnSecureDesktop = false; + + AceIntegration aceInt = this.Integration; + aceInt.HotKeyGlobalAutoType = (long)Keys.None; + aceInt.HotKeyGlobalAutoTypePassword = (long)Keys.None; + aceInt.HotKeySelectedAutoType = (long)Keys.None; + aceInt.HotKeyShowWindow = (long)Keys.None; + aceInt.HotKeyEntryMenu = (long)Keys.None; + } + + if(MonoWorkarounds.IsRequired(1378)) + { + AceWorkspaceLocking aceWL = this.Security.WorkspaceLocking; + aceWL.LockOnSessionSwitch = false; + aceWL.LockOnSuspend = false; + aceWL.LockOnRemoteControlChange = false; + } + + if(MonoWorkarounds.IsRequired(1418)) + { + aceMW.MinimizeAfterOpeningDatabase = false; + this.Application.Start.MinimizedAndLocked = false; + } + + if(MonoWorkarounds.IsRequired(1976)) + { + aceMW.FocusQuickFindOnRestore = false; + aceMW.FocusQuickFindOnUntray = false; + } + } + + internal void OnSavePre() + { + PrepareSave(); + + ChangePathsRelAbs(false); + ObfuscateCred(true); + RemoveSensitiveInfo(true); + } + + internal void OnSavePost() + { + RemoveSensitiveInfo(false); + ObfuscateCred(false); + ChangePathsRelAbs(true); + } + + private void ChangePathsRelAbs(bool bMakeAbsolute) + { + AceApplication aceApp = this.Application; // m_aceApp might be null + AceDefaults aceDef = this.Defaults; // m_def might be null + + ChangePathRelAbs(aceApp.LastUsedFile, bMakeAbsolute); + + foreach(IOConnectionInfo iocMru in aceApp.MostRecentlyUsed.Items) + ChangePathRelAbs(iocMru, bMakeAbsolute); + + List lWDKeys = aceApp.GetWorkingDirectoryContexts(); + foreach(string strWDKey in lWDKeys) + aceApp.SetWorkingDirectory(strWDKey, ChangePathRelAbsStr( + aceApp.GetWorkingDirectory(strWDKey), bMakeAbsolute)); + + foreach(AceKeyAssoc kfp in aceDef.KeySources) + { + kfp.DatabasePath = ChangePathRelAbsStr(kfp.DatabasePath, bMakeAbsolute); + kfp.KeyFilePath = ChangePathRelAbsStr(kfp.KeyFilePath, bMakeAbsolute); + } + } + + private static void ChangePathRelAbs(IOConnectionInfo ioc, bool bMakeAbsolute) + { + if(ioc == null) { Debug.Assert(false); return; } + + if(!ioc.IsLocalFile()) return; + + // Update path separators for current system + ioc.Path = UrlUtil.ConvertSeparators(ioc.Path); + + string strBase = WinUtil.GetExecutable(); + bool bIsAbs = UrlUtil.IsAbsolutePath(ioc.Path); + + if(bMakeAbsolute && !bIsAbs) + ioc.Path = UrlUtil.MakeAbsolutePath(strBase, ioc.Path); + else if(!bMakeAbsolute && bIsAbs) + ioc.Path = UrlUtil.MakeRelativePath(strBase, ioc.Path); + } + + private static string ChangePathRelAbsStr(string strPath, bool bMakeAbsolute) + { + if(strPath == null) { Debug.Assert(false); return string.Empty; } + if(strPath.Length == 0) return strPath; + + IOConnectionInfo ioc = IOConnectionInfo.FromPath(strPath); + ChangePathRelAbs(ioc, bMakeAbsolute); + return ioc.Path; + } + + private void ObfuscateCred(bool bObf) + { + AceApplication aceApp = this.Application; // m_aceApp might be null + AceIntegration aceInt = this.Integration; // m_int might be null + + if(aceApp.LastUsedFile == null) { Debug.Assert(false); } + else aceApp.LastUsedFile.Obfuscate(bObf); + + foreach(IOConnectionInfo iocMru in aceApp.MostRecentlyUsed.Items) + { + if(iocMru == null) { Debug.Assert(false); } + else iocMru.Obfuscate(bObf); + } + + if(bObf) aceInt.ProxyUserName = StrUtil.Obfuscate(aceInt.ProxyUserName); + else aceInt.ProxyUserName = StrUtil.Deobfuscate(aceInt.ProxyUserName); + + if(bObf) aceInt.ProxyPassword = StrUtil.Obfuscate(aceInt.ProxyPassword); + else aceInt.ProxyPassword = StrUtil.Deobfuscate(aceInt.ProxyPassword); + } + + private void RemoveSensitiveInfo(bool bRemove) + { + SearchParameters sp = this.Search.LastUsedProfile; + + if(bRemove) + { + Debug.Assert(m_strSearchString == null); + m_strSearchString = sp.SearchString; + sp.SearchString = string.Empty; + } + else + { + if(m_strSearchString != null) + { + sp.SearchString = m_strSearchString; + m_strSearchString = null; + } + else { Debug.Assert(false); } + } + } + + private void DpiScale() + { + AceMeta aceMeta = this.Meta; // m_meta might be null + double dCfgX = aceMeta.DpiFactorX, dCfgY = aceMeta.DpiFactorY; + double dScrX = DpiUtil.FactorX, dScrY = DpiUtil.FactorY; + + if((dScrX == dCfgX) && (dScrY == dCfgY)) return; + + // When this method returns, all positions and sizes are in pixels + // for the current screen DPI + aceMeta.DpiFactorX = dScrX; + aceMeta.DpiFactorY = dScrY; + + // Backward compatibility; configuration files created by KeePass + // 2.37 and earlier do not contain DpiFactor* values, they default + // to 0.0 and all positions and sizes are in pixels for the current + // screen DPI; so, do not perform any DPI scaling in this case + if((dCfgX == 0.0) || (dCfgY == 0.0)) return; + + double sX = dScrX / dCfgX, sY = dScrY / dCfgY; + GFunc fX = delegate(int x) + { + return (int)Math.Round((double)x * sX); + }; + GFunc fY = delegate(int y) + { + return (int)Math.Round((double)y * sY); + }; + GFunc fWsr = delegate(string strRect) + { + return UIUtil.ScaleWindowScreenRect(strRect, sX, sY); + }; + GFunc fVX = delegate(string strArray) + { + if(string.IsNullOrEmpty(strArray)) return strArray; + + try + { + int[] v = StrUtil.DeserializeIntArray(strArray); + if(v == null) { Debug.Assert(false); return strArray; } + + for(int i = 0; i < v.Length; ++i) + v[i] = (int)Math.Round((double)v[i] * sX); + + return StrUtil.SerializeIntArray(v); + } + catch(Exception) { Debug.Assert(false); } + + return strArray; + }; + Action fFont = delegate(AceFont f) + { + if(f == null) { Debug.Assert(false); return; } + + if(f.GraphicsUnit == GraphicsUnit.Pixel) + f.Size = (float)(f.Size * sY); + }; + + AceMainWindow mw = this.MainWindow; + AceUI ui = this.UI; + + if(mw.X != AppDefs.InvalidWindowValue) mw.X = fX(mw.X); + if(mw.Y != AppDefs.InvalidWindowValue) mw.Y = fY(mw.Y); + if(mw.Width != AppDefs.InvalidWindowValue) mw.Width = fX(mw.Width); + if(mw.Height != AppDefs.InvalidWindowValue) mw.Height = fY(mw.Height); + + foreach(AceColumn c in mw.EntryListColumns) + { + if(c.Width >= 0) c.Width = fX(c.Width); + } + + ui.DataViewerRect = fWsr(ui.DataViewerRect); + ui.DataEditorRect = fWsr(ui.DataEditorRect); + ui.CharPickerRect = fWsr(ui.CharPickerRect); + ui.AutoTypeCtxRect = fWsr(ui.AutoTypeCtxRect); + ui.AutoTypeCtxColumnWidths = fVX(ui.AutoTypeCtxColumnWidths); + + fFont(ui.StandardFont); + fFont(ui.PasswordFont); + fFont(ui.DataEditorFont); + } + + private static Dictionary m_dictXmlPathCache = + new Dictionary(); + public static bool IsOptionEnforced(object pContainer, PropertyInfo pi) + { + if(pContainer == null) { Debug.Assert(false); return false; } + if(pi == null) { Debug.Assert(false); return false; } + + XmlDocument xdEnforced = AppConfigSerializer.EnforcedConfigXml; + if(xdEnforced == null) return false; + + string strObjPath; + if(!m_dictXmlPathCache.TryGetValue(pContainer, out strObjPath)) + { + strObjPath = XmlUtil.GetObjectXmlPath(Program.Config, pContainer); + if(string.IsNullOrEmpty(strObjPath)) { Debug.Assert(false); return false; } + + m_dictXmlPathCache[pContainer] = strObjPath; + } + + string strProp = XmlSerializerEx.GetXmlName(pi); + if(string.IsNullOrEmpty(strProp)) { Debug.Assert(false); return false; } + + string strPre = strObjPath; + if(!strPre.EndsWith("/")) strPre += "/"; + string strXPath = strPre + strProp; + + XmlNode xn = xdEnforced.SelectSingleNode(strXPath); + if(xn == null) return false; + + XmContext ctx = new XmContext(null, AppConfigEx.GetNodeOptions, + AppConfigEx.GetNodeKey); + return XmlUtil.IsAlwaysEnforced(xn, strXPath, ctx); + } + + public static bool IsOptionEnforced(object pContainer, string strPropertyName) + { + if(pContainer == null) { Debug.Assert(false); return false; } + if(string.IsNullOrEmpty(strPropertyName)) { Debug.Assert(false); return false; } + + // To improve performance (avoid type queries), check here, too + XmlDocument xdEnforced = AppConfigSerializer.EnforcedConfigXml; + if(xdEnforced == null) return false; + + Type tContainer = pContainer.GetType(); + PropertyInfo pi = tContainer.GetProperty(strPropertyName); + return IsOptionEnforced(pContainer, pi); + } + + public static void ClearXmlPathCache() + { + m_dictXmlPathCache.Clear(); + } + + public void Apply(AceApplyFlags f) + { + AceApplication aceApp = this.Application; // m_aceApp might be null + AceSecurity aceSec = this.Security; // m_sec might be null + AceIntegration aceInt = this.Integration; // m_int might be null + + if((f & AceApplyFlags.Proxy) != AceApplyFlags.None) + IOConnection.SetProxy(aceInt.ProxyType, aceInt.ProxyAddress, + aceInt.ProxyPort, aceInt.ProxyAuthType, aceInt.ProxyUserName, + aceInt.ProxyPassword); + + if((f & AceApplyFlags.Ssl) != AceApplyFlags.None) + IOConnection.SslCertsAcceptInvalid = aceSec.SslCertsAcceptInvalid; + + if((f & AceApplyFlags.FileTransactions) != AceApplyFlags.None) + FileTransactionEx.ExtraSafe = aceApp.FileTxExtra; + } + + internal static void GetNodeOptions(XmNodeOptions o, string strXPath) + { + if(o == null) { Debug.Assert(false); return; } + if(string.IsNullOrEmpty(strXPath)) { Debug.Assert(false); return; } + Debug.Assert(strXPath.IndexOf('[') < 0); + + switch(strXPath) + { + // Sync. with documentation + + case "/Configuration/Application/PluginCompatibility": + case "/Configuration/Meta/DpiFactorX": + case "/Configuration/Meta/DpiFactorY": + o.NodeMode = XmNodeMode.None; + break; + + case "/Configuration/Application/TriggerSystem/Triggers/Trigger": + case "/Configuration/Defaults/KeySources/Association": + case "/Configuration/PasswordGenerator/AutoGeneratedPasswordsProfile": + case "/Configuration/PasswordGenerator/LastUsedProfile": + case "/Configuration/PasswordGenerator/UserProfiles/Profile": + case "/Configuration/Search/LastUsedProfile": + case "/Configuration/Search/UserProfiles/Profile": + o.ContentMode = XmContentMode.Replace; + break; + + // Nodes that do not have child elements: + // case "/Configuration/Application/WorkingDirectories/Item": + // case "/Configuration/Integration/AutoTypeAbortOnWindows/Window": + + // Nodes where the mode 'Merge' may be more useful: + // case "/Configuration/Application/MostRecentlyUsed/Items/ConnectionInfo": + // (allow users to save credentials) + // case "/Configuration/Custom/Item": + // (empty Value explicitly only) + // case "/Configuration/Defaults/SearchParameters": + // (admin might only want to turn off case-sensitivity) + // case "/Configuration/Integration/UrlSchemeOverrides/CustomOverrides/Override": + // (allow users to enable/disable the item) + // case "/Configuration/MainWindow/EntryListColumnCollection/Column": + // (allow users to change the width) + + default: break; + } + } + + internal static string GetNodeKey(XmlNode xn, string strXPath) + { + if(xn == null) { Debug.Assert(false); return null; } + if(string.IsNullOrEmpty(strXPath)) { Debug.Assert(false); return null; } + + Debug.Assert(xn is XmlElement); + Debug.Assert((strXPath == xn.Name) || strXPath.EndsWith("/" + xn.Name)); + Debug.Assert(strXPath.IndexOf('[') < 0); + + string strA = null, strB = null; + switch(strXPath) + { + // Sync. with documentation + + case "/Configuration/Application/PluginCompatibility/Item": + case "/Configuration/Application/WorkingDirectories/Item": + case "/Configuration/Integration/AutoTypeAbortOnWindows/Window": + strA = XmlUtil.SafeInnerXml(xn); + break; + + case "/Configuration/Application/MostRecentlyUsed/Items/ConnectionInfo": + strA = XmlUtil.SafeInnerXml(xn, "Path"); + strB = XmlUtil.SafeInnerXml(xn, "UserName"); // Cf. MRU display name + break; + + case "/Configuration/Application/TriggerSystem/Triggers/Trigger": + strA = XmlUtil.SafeInnerXml(xn, "Guid"); + break; + + case "/Configuration/Custom/Item": + strA = XmlUtil.SafeInnerXml(xn, "Key"); + break; + + case "/Configuration/Defaults/KeySources/Association": + strA = XmlUtil.SafeInnerXml(xn, "DatabasePath"); + break; + + case "/Configuration/Integration/UrlSchemeOverrides/CustomOverrides/Override": + strA = XmlUtil.SafeInnerXml(xn, "Scheme"); + strB = XmlUtil.SafeInnerXml(xn, "UrlOverride"); + break; + + case "/Configuration/MainWindow/EntryListColumnCollection/Column": + strA = XmlUtil.SafeInnerXml(xn, "Type"); + strB = XmlUtil.SafeInnerXml(xn, "CustomName"); + break; + + case "/Configuration/PasswordGenerator/UserProfiles/Profile": + case "/Configuration/Search/UserProfiles/Profile": + strA = XmlUtil.SafeInnerXml(xn, "Name"); + break; + + default: break; + } + + Debug.Assert((strA == null) || (strA.IndexOf('<') < 0)); + Debug.Assert((strB == null) || (strB.IndexOf('<') < 0)); + Debug.Assert((strB == null) || (strA != null)); // B => A + Debug.Assert((strA == null) || (strA.Length != 0)); + + if(strB != null) return ((strA ?? string.Empty) + " <> " + strB); + return strA; + } + + internal static string GetEmptyConfigXml() + { + return ("\r\n" + + "<" + StrXmlTypeName + " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n" + + "\t\r\n" + + ""); + } + } + + [Flags] + public enum AceApplyFlags + { + None = 0, + Proxy = 0x1, + Ssl = 0x2, + FileTransactions = 0x4, + + All = 0x7FFF + } + + public sealed class AceMeta + { + public AceMeta() + { + } + + private bool m_bPrefLocalCfg = false; + public bool PreferUserConfiguration + { + get { return m_bPrefLocalCfg; } + set { m_bPrefLocalCfg = value; } + } + + // private bool m_bIsEnforced = false; + // [XmlIgnore] + // public bool IsEnforcedConfiguration + // { + // get { return m_bIsEnforced; } + // set { m_bIsEnforced = value; } + // } + + private bool m_bOmitDefaultValues = true; + // Informational property only (like an XML comment); + // currently doesn't have any effect (the XmlSerializer + // always omits default values, independent of this + // property) + public bool OmitItemsWithDefaultValues + { + get { return m_bOmitDefaultValues; } + set { m_bOmitDefaultValues = value; } + } + + private double m_dDpiFactorX = 0.0; // See AppConfigEx.DpiScale() + [DefaultValue(0.0)] + public double DpiFactorX + { + get { return m_dDpiFactorX; } + set { m_dDpiFactorX = value; } + } + + private double m_dDpiFactorY = 0.0; // See AppConfigEx.DpiScale() + [DefaultValue(0.0)] + public double DpiFactorY + { + get { return m_dDpiFactorY; } + set { m_dDpiFactorY = value; } + } + } +} diff --git a/src/KeePass/App/Configuration/AppConfigSerializer.cs b/src/KeePass/App/Configuration/AppConfigSerializer.cs new file mode 100644 index 0000000..be195cc --- /dev/null +++ b/src/KeePass/App/Configuration/AppConfigSerializer.cs @@ -0,0 +1,415 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util; +using KeePass.Util.XmlSerialization; + +using KeePassLib; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +namespace KeePass.App.Configuration +{ + public static class AppConfigSerializer + { + private static string g_strBaseName = null; // Null allowed + + private static string g_strAppDataDir = null; + private static string g_strAppDataLocalDir = null; + private static string g_strEnforcedConfigFile = null; + private static string g_strGlobalConfigFile = null; + private static string g_strUserConfigFile = null; + + private const string g_strFileSuffix = ".config.xml"; + private const string g_strFileEnfSuffix = ".config.enforced.xml"; + + /// + /// Get our folder in the application data directory. + /// + public static string AppDataDirectory + { + get + { + GetConfigPaths(); + return g_strAppDataDir; + } + } + + /// + /// Get our folder in the local application data directory. + /// + public static string LocalAppDataDirectory + { + get + { + GetConfigPaths(); + return g_strAppDataLocalDir; + } + } + + /// + /// Get/set the base name for the configuration. If this property is + /// null, the class constructs names based on the current + /// assembly and the product name. + /// + public static string BaseName + { + get { return g_strBaseName; } + + set + { + g_strBaseName = value; + + // Invalidate paths + g_strAppDataDir = null; + g_strAppDataLocalDir = null; + g_strEnforcedConfigFile = null; + g_strGlobalConfigFile = null; + g_strUserConfigFile = null; + } + } + + private static XmlDocument g_xdEnforced = null; + public static XmlDocument EnforcedConfigXml + { + get { return g_xdEnforced; } + } + + private static void GetConfigPaths() + { + if(g_strGlobalConfigFile == null) + { + Assembly asm = Assembly.GetExecutingAssembly(); + if(asm == null) { Debug.Assert(false); return; } + +#if !KeePassLibSD + string strFile = null; + + try { strFile = asm.Location; } + catch(Exception) { } + + if(string.IsNullOrEmpty(strFile)) + strFile = UrlUtil.FileUrlToPath(asm.GetName().CodeBase); +#else + string strFile = UrlUtil.FileUrlToPath(asm.GetName().CodeBase); +#endif + if(string.IsNullOrEmpty(strFile)) { Debug.Assert(false); strFile = string.Empty; } + + if(!string.IsNullOrEmpty(g_strBaseName)) + strFile = UrlUtil.GetFileDirectory(strFile, true, false) + g_strBaseName; + else + { + if(strFile.EndsWith(".exe", StrUtil.CaseIgnoreCmp) || + strFile.EndsWith(".dll", StrUtil.CaseIgnoreCmp)) + strFile = strFile.Substring(0, strFile.Length - 4); + } + + g_strGlobalConfigFile = strFile + g_strFileSuffix; + g_strEnforcedConfigFile = strFile + g_strFileEnfSuffix; + } + + if(g_strUserConfigFile == null) + { + string strBaseName = (!string.IsNullOrEmpty(g_strBaseName) ? + g_strBaseName : PwDefs.ShortProductName); + + string strUserDir; + try + { + strUserDir = Environment.GetFolderPath( + Environment.SpecialFolder.ApplicationData); + } + catch(Exception) + { + strUserDir = UrlUtil.GetFileDirectory(UrlUtil.FileUrlToPath( + Assembly.GetExecutingAssembly().GetName().CodeBase), true, false); + } + strUserDir = UrlUtil.EnsureTerminatingSeparator(strUserDir, false); + + string strUserDirLocal; + try + { + strUserDirLocal = Environment.GetFolderPath( + Environment.SpecialFolder.LocalApplicationData); + } + catch(Exception) { strUserDirLocal = strUserDir; } + strUserDirLocal = UrlUtil.EnsureTerminatingSeparator(strUserDirLocal, false); + + g_strAppDataDir = strUserDir + strBaseName; + g_strAppDataLocalDir = strUserDirLocal + strBaseName; + g_strUserConfigFile = UrlUtil.EnsureTerminatingSeparator( + g_strAppDataDir, false) + strBaseName + g_strFileSuffix; + + string strLocalOvr = Program.CommandLineArgs[ + AppDefs.CommandLineOptions.ConfigPathLocal]; + if(!string.IsNullOrEmpty(strLocalOvr)) + { + string strWD = UrlUtil.EnsureTerminatingSeparator( + WinUtil.GetWorkingDirectory(), false); + g_strUserConfigFile = UrlUtil.MakeAbsolutePath(strWD + + "Sentinel.txt", strLocalOvr); + // Do not change g_strAppDataDir, as it's returned from + // the AppDataDirectory property + } + + Debug.Assert(!string.IsNullOrEmpty(g_strAppDataDir)); + } + } + + private static void EnsureDirOfFileExists(string strFile) + { + if(string.IsNullOrEmpty(strFile)) { Debug.Assert(false); return; } + + try + { + string strDir = UrlUtil.GetFileDirectory(strFile, false, true); + if(!Directory.Exists(strDir)) + Directory.CreateDirectory(strDir); + } + catch(Exception) { Debug.Assert(false); } + } + + private static XmlDocument LoadEnforcedConfigFile() + { +#if DEBUG + Stopwatch sw = Stopwatch.StartNew(); +#endif + + g_xdEnforced = null; + try + { + if(!File.Exists(g_strEnforcedConfigFile)) return null; + + XmlDocument xd = XmlUtilEx.CreateXmlDocument(); + xd.Load(g_strEnforcedConfigFile); + + g_xdEnforced = xd; + return xd; + } + catch(Exception ex) + { + FileDialogsEx.ShowConfigError(g_strEnforcedConfigFile, + ex.Message, false, false); + } +#if DEBUG + finally + { + sw.Stop(); + } +#endif + + return null; + } + + private static AppConfigEx LoadConfigFileEx(string strFilePath, + XmlDocument xdEnforced) + { + if(string.IsNullOrEmpty(strFilePath)) { Debug.Assert(false); return null; } + + AppConfigEx tConfig = null; + try + { + if(!File.Exists(strFilePath)) return null; + + XmlSerializerEx xs = new XmlSerializerEx(typeof(AppConfigEx)); + + if(xdEnforced == null) + { + using(FileStream fs = new FileStream(strFilePath, + FileMode.Open, FileAccess.Read, FileShare.Read)) + { + tConfig = (AppConfigEx)xs.Deserialize(fs); + } + } + else // Enforced configuration + { + XmlDocument xd = XmlUtilEx.CreateXmlDocument(); + xd.Load(strFilePath); + + XmContext ctx = new XmContext(xd, AppConfigEx.GetNodeOptions, + AppConfigEx.GetNodeKey); + XmlUtil.MergeElements(xd.DocumentElement, xdEnforced.DocumentElement, + "/" + xd.DocumentElement.Name, null, ctx); + + using(MemoryStream msW = new MemoryStream()) + { + xd.Save(msW); + + using(MemoryStream msR = new MemoryStream(msW.ToArray(), false)) + { + tConfig = (AppConfigEx)xs.Deserialize(msR); + } + } + } + } + catch(Exception ex) + { + FileDialogsEx.ShowConfigError(strFilePath, ex.Message, false, true); + } + + if(tConfig != null) tConfig.OnLoad(); + return tConfig; + } + + public static AppConfigEx Load() + { + GetConfigPaths(); + + // AppConfigEx cfgEnf = LoadConfigFileEx(g_strEnforcedConfigFile); + // if(cfgEnf != null) + // { + // cfgEnf.Meta.IsEnforcedConfiguration = true; + // return cfgEnf; + // } + XmlDocument xdEnforced = LoadEnforcedConfigFile(); + + AppConfigEx cfgGlobal = LoadConfigFileEx(g_strGlobalConfigFile, xdEnforced); + if((cfgGlobal != null) && !cfgGlobal.Meta.PreferUserConfiguration) + return cfgGlobal; // Do not show error for corrupted local configuration + + AppConfigEx cfgUser = LoadConfigFileEx(g_strUserConfigFile, xdEnforced); + + if((cfgGlobal == null) && (cfgUser == null)) + { + if(xdEnforced != null) + { + // Create an empty configuration file and merge it with + // the enforced configuration; this ensures that merge + // behaviors (like the node mode 'Remove') work as intended + try + { + string strFile = Program.TempFilesPool.GetTempFileName("xml"); + File.WriteAllText(strFile, AppConfigEx.GetEmptyConfigXml(), + StrUtil.Utf8); + + AppConfigEx cfg = LoadConfigFileEx(strFile, xdEnforced); + if(cfg != null) return cfg; + Debug.Assert(false); + } + catch(Exception) { Debug.Assert(false); } + } + + AppConfigEx cfgNew = new AppConfigEx(); + cfgNew.OnLoad(); // Create defaults + return cfgNew; + } + if((cfgGlobal != null) && (cfgUser == null)) return cfgGlobal; + if((cfgGlobal == null) && (cfgUser != null)) return cfgUser; + + cfgUser.Meta.PreferUserConfiguration = cfgGlobal.Meta.PreferUserConfiguration; + return (cfgGlobal.Meta.PreferUserConfiguration ? cfgUser : cfgGlobal); + } + + private static bool SaveConfigFileEx(AppConfigEx tConfig, string strFilePath) + { + if(string.IsNullOrEmpty(strFilePath)) { Debug.Assert(false); return false; } + + tConfig.OnSavePre(); + + // Temporarily remove user file preference (restore after saving) + bool bPref = tConfig.Meta.PreferUserConfiguration; + tConfig.Meta.PreferUserConfiguration = false; + + bool bResult = true; + try + { + IOConnectionInfo iocPath = IOConnectionInfo.FromPath(strFilePath); + + using(FileTransactionEx ft = new FileTransactionEx(iocPath, + Program.Config.Application.UseTransactedConfigWrites)) + { + using(Stream s = ft.OpenWrite()) + { + using(XmlWriter xw = XmlUtilEx.CreateXmlWriter(s)) + { + XmlSerializerEx xs = new XmlSerializerEx(typeof(AppConfigEx)); + xs.Serialize(xw, tConfig); + } + } + + ft.CommitWrite(); + } + } + catch(Exception ex) + { + FileDialogsEx.ShowConfigError(strFilePath, ex.Message, true, false); + bResult = false; + } + + tConfig.Meta.PreferUserConfiguration = bPref; + + tConfig.OnSavePost(); + return bResult; + } + + public static bool Save(AppConfigEx tConfig) + { + if(tConfig == null) { Debug.Assert(false); return false; } + if(!tConfig.Application.ConfigSave) return false; + + GetConfigPaths(); + + if(tConfig.Meta.PreferUserConfiguration) + { + EnsureDirOfFileExists(g_strUserConfigFile); + if(SaveConfigFileEx(tConfig, g_strUserConfigFile)) return true; + + if(SaveConfigFileEx(tConfig, g_strGlobalConfigFile)) return true; + } + else // Prefer global + { + if(SaveConfigFileEx(tConfig, g_strGlobalConfigFile)) return true; + + EnsureDirOfFileExists(g_strUserConfigFile); + if(SaveConfigFileEx(tConfig, g_strUserConfigFile)) return true; + } + + return false; + } + + internal static string TryCreateBackup(string strFilePath) + { + if(string.IsNullOrEmpty(strFilePath)) { Debug.Assert(false); return null; } + + try + { + DateTime dt = DateTime.Now; + string strBackupPath = UrlUtil.EnsureTerminatingSeparator( + UrlUtil.GetTempPath(), false) + PwDefs.ShortProductName + + "_" + dt.ToString("yyyyMMddHHmmss") + g_strFileSuffix; + + File.Copy(strFilePath, strBackupPath, true); + return strBackupPath; + } + catch(Exception) { Debug.Assert(false); } + + return null; + } + } +} diff --git a/src/KeePass/DataExchange/CsvStreamReader.cs b/src/KeePass/DataExchange/CsvStreamReader.cs new file mode 100644 index 0000000..cc1d960 --- /dev/null +++ b/src/KeePass/DataExchange/CsvStreamReader.cs @@ -0,0 +1,135 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +using KeePassLib.Utility; + +namespace KeePass.DataExchange +{ + public sealed class CsvStreamReader + { + private CharStream m_sChars; + private readonly bool m_bAllowUnquoted; + + [Obsolete] + public CsvStreamReader(string strData) + { + m_sChars = new CharStream(strData); + m_bAllowUnquoted = false; + } + + public CsvStreamReader(string strData, bool bAllowUnquoted) + { + m_sChars = new CharStream(strData); + m_bAllowUnquoted = bAllowUnquoted; + } + + public string[] ReadLine() + { + return (m_bAllowUnquoted ? ReadLineUnquoted() : ReadLineQuoted()); + } + + private string[] ReadLineQuoted() + { + if(m_sChars.PeekChar() == char.MinValue) return null; + + List v = new List(); + StringBuilder sb = new StringBuilder(); + bool bInField = false; + + while(true) + { + char ch = m_sChars.ReadChar(); + if(ch == char.MinValue) break; + + if((ch == '\"') && !bInField) bInField = true; + else if((ch == '\"') && bInField) + { + if(m_sChars.PeekChar() == '\"') + { + m_sChars.ReadChar(); + sb.Append('\"'); + } + else + { + v.Add(sb.ToString()); + if(sb.Length > 0) sb.Remove(0, sb.Length); + + bInField = false; + } + } + else if(((ch == '\r') || (ch == '\n')) && !bInField) break; + else if(bInField) sb.Append(ch); + } + Debug.Assert(!bInField); + Debug.Assert(sb.Length == 0); + if(sb.Length > 0) v.Add(sb.ToString()); + + return v.ToArray(); + } + + private string[] ReadLineUnquoted() + { + char chFirst = m_sChars.PeekChar(); + if(chFirst == char.MinValue) return null; + if((chFirst == '\r') || (chFirst == '\n')) + { + m_sChars.ReadChar(); // Advance + return MemUtil.EmptyArray(); + } + + List v = new List(); + StringBuilder sb = new StringBuilder(); + bool bInField = false; + + while(true) + { + char ch = m_sChars.ReadChar(); + if(ch == char.MinValue) break; + + if((ch == '\"') && !bInField) bInField = true; + else if((ch == '\"') && bInField) + { + if(m_sChars.PeekChar() == '\"') + { + m_sChars.ReadChar(); + sb.Append('\"'); + } + else bInField = false; + } + else if(((ch == '\r') || (ch == '\n')) && !bInField) break; + else if(bInField) sb.Append(ch); + else if(ch == ',') + { + v.Add(sb.ToString()); + if(sb.Length > 0) sb.Remove(0, sb.Length); + } + else sb.Append(ch); + } + Debug.Assert(!bInField); + v.Add(sb.ToString()); + + return v.ToArray(); + } + } +} diff --git a/src/KeePass/DataExchange/CsvStreamReaderEx.cs b/src/KeePass/DataExchange/CsvStreamReaderEx.cs new file mode 100644 index 0000000..4643302 --- /dev/null +++ b/src/KeePass/DataExchange/CsvStreamReaderEx.cs @@ -0,0 +1,202 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +using KeePassLib.Utility; + +namespace KeePass.DataExchange +{ + public sealed class CsvOptions + { + private char m_chFieldSep = ','; + public char FieldSeparator + { + get { return m_chFieldSep; } + set { m_chFieldSep = value; } + } + + private char m_chRecSep = '\n'; + public char RecordSeparator + { + get { return m_chRecSep; } + set { m_chRecSep = value; } + } + + private char m_chTextQual = '\"'; + public char TextQualifier + { + get { return m_chTextQual; } + set { m_chTextQual = value; } + } + + private bool m_bBackEscape = true; + public bool BackslashIsEscape + { + get { return m_bBackEscape; } + set { m_bBackEscape = value; } + } + + private bool m_bTrimFields = true; + public bool TrimFields + { + get { return m_bTrimFields; } + set { m_bTrimFields = value; } + } + + private string m_strNewLineSeq = "\r\n"; + public string NewLineSequence + { + get { return m_strNewLineSeq; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strNewLineSeq = value; + } + } + } + + public sealed class CsvStreamReaderEx + { + private CharStream m_sChars; + private CsvOptions m_opt; + + public CsvStreamReaderEx(string strData) + { + Init(strData, null); + } + + public CsvStreamReaderEx(string strData, CsvOptions opt) + { + Init(strData, opt); + } + + private void Init(string strData, CsvOptions opt) + { + if(strData == null) throw new ArgumentNullException("strData"); + + m_opt = (opt ?? new CsvOptions()); + + string strInput = strData; + + // Normalize to Unix "\n" right now; the new lines are + // converted back in the AddField method + strInput = StrUtil.NormalizeNewLines(strInput, false); + + strInput = strInput.Trim(new char[] { (char)0 }); + + m_sChars = new CharStream(strInput); + } + + public string[] ReadLine() + { + char chFirst = m_sChars.PeekChar(); + if(chFirst == char.MinValue) return null; + + List v = new List(); + StringBuilder sb = new StringBuilder(); + bool bInText = false; + + char chFS = m_opt.FieldSeparator, chRS = m_opt.RecordSeparator; + char chTQ = m_opt.TextQualifier; + + while(true) + { + char ch = m_sChars.ReadChar(); + if(ch == char.MinValue) break; + + Debug.Assert(ch != '\r'); // Was normalized to Unix "\n" + + if((ch == '\\') && m_opt.BackslashIsEscape) + { + char chEsc = m_sChars.ReadChar(); + if(chEsc == char.MinValue) break; + + if(chEsc == 'n') sb.Append('\n'); + else if(chEsc == 'r') sb.Append('\r'); + else if(chEsc == 't') sb.Append('\t'); + else if(chEsc == 'u') + { + char chNum1 = m_sChars.ReadChar(); + char chNum2 = m_sChars.ReadChar(); + char chNum3 = m_sChars.ReadChar(); + char chNum4 = m_sChars.ReadChar(); + if(chNum4 != char.MinValue) // Implies the others + { + StringBuilder sbNum = new StringBuilder(); + sbNum.Append(chNum3); // Little-endian + sbNum.Append(chNum4); + sbNum.Append(chNum1); + sbNum.Append(chNum2); + + byte[] pbNum = MemUtil.HexStringToByteArray(sbNum.ToString()); + ushort usNum = MemUtil.BytesToUInt16(pbNum); + + sb.Append((char)usNum); + } + } + else sb.Append(chEsc); + } + else if(ch == chTQ) + { + if(!bInText) bInText = true; + else // bInText + { + char chNext = m_sChars.PeekChar(); + if(chNext == chTQ) + { + m_sChars.ReadChar(); + sb.Append(chTQ); + } + else bInText = false; + } + } + else if((ch == chRS) && !bInText) break; + else if(bInText) sb.Append(ch); + else if(ch == chFS) + { + AddField(v, sb.ToString()); + if(sb.Length > 0) sb.Remove(0, sb.Length); + } + else sb.Append(ch); + } + // Debug.Assert(!bInText); + AddField(v, sb.ToString()); + + return v.ToArray(); + } + + private void AddField(List v, string strField) + { + // Escape characters might have been used to insert + // new lines that might not conform to Unix "\n" + strField = StrUtil.NormalizeNewLines(strField, false); + + // Transform to final form of new lines + strField = strField.Replace("\n", m_opt.NewLineSequence); + + if(m_opt.TrimFields) strField = strField.Trim(); + + v.Add(strField); + } + } +} diff --git a/src/KeePass/DataExchange/CsvStreamWriter.cs b/src/KeePass/DataExchange/CsvStreamWriter.cs new file mode 100644 index 0000000..e75234d --- /dev/null +++ b/src/KeePass/DataExchange/CsvStreamWriter.cs @@ -0,0 +1,86 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePassLib.Utility; + +namespace KeePass.DataExchange +{ + // Compatible with RFC 4180 + internal sealed class CsvStreamWriter + { + private readonly StreamWriter m_sw; + + public CsvStreamWriter(StreamWriter sw) + { + if(sw == null) throw new ArgumentNullException("sw"); + + m_sw = sw; + } + + private static readonly char[] g_vQuReq = new char[] { + '\t', '\n', '\r', '\"', ',', ';' }; + private static bool AreQuotesRequired(string str) + { + if(str == null) { Debug.Assert(false); return false; } + + int cc = str.Length; + if(cc == 0) return false; + + if(char.IsWhiteSpace(str[0]) || char.IsWhiteSpace(str[cc - 1])) + return true; + + return (str.IndexOfAny(g_vQuReq) >= 0); + } + + public void WriteLine(string[] vFields) + { + if(vFields == null) { Debug.Assert(false); return; } + + for(int i = 0; i < vFields.Length; ++i) + { + if(i != 0) m_sw.Write(','); + + string str = vFields[i]; + Debug.Assert(str != null); + if(!string.IsNullOrEmpty(str)) + { + if(AreQuotesRequired(str)) + { + m_sw.Write('\"'); + + string strEsc = StrUtil.NormalizeNewLines(str, true); + strEsc = strEsc.Replace("\"", "\"\""); + m_sw.Write(strEsc); + + m_sw.Write('\"'); + } + else m_sw.Write(str); + } + } + + m_sw.Write("\r\n"); // m_sw.WriteLine uses m_sw.NewLine + } + } +} diff --git a/src/KeePass/DataExchange/CsvTableEntryReader.cs b/src/KeePass/DataExchange/CsvTableEntryReader.cs new file mode 100644 index 0000000..f7ab954 --- /dev/null +++ b/src/KeePass/DataExchange/CsvTableEntryReader.cs @@ -0,0 +1,74 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +using KeePassLib; + +namespace KeePass.DataExchange +{ + internal sealed class CsvTableEntryReader : CsvTableObjectReader + { + private readonly PwDatabase m_pd; + + public CsvTableEntryReader(PwDatabase pdContext) : + base(CsvTableEntryReader.EntryNew, CsvTableEntryReader.EntryCommit(pdContext)) + { + m_pd = pdContext; + } + + private static PwEntry EntryNew(string[] vContextRow) + { + return new PwEntry(true, true); + } + + private static CsvTableObjectAction EntryCommit(PwDatabase pdContext) + { + CsvTableObjectAction f = delegate(PwEntry pe, string[] vContextRow) + { + if(pe == null) { Debug.Assert(false); return; } + + if(pe.ParentGroup == null) + { + PwGroup pg = ((pdContext != null) ? pdContext.RootGroup : null); + if(pg != null) pg.AddEntry(pe, true); + else { Debug.Assert(false); } + } + }; + + return f; + } + + public void SetDataAppend(string strColumn, string strStringName) + { + if(string.IsNullOrEmpty(strStringName)) { Debug.Assert(false); return; } + + CsvTableDataHandler f = delegate(string strData, + PwEntry peContext, string[] vContextRow) + { + ImportUtil.AppendToField(peContext, strStringName, strData, m_pd); + }; + + SetDataHandler(strColumn, f); + } + } +} diff --git a/src/KeePass/DataExchange/CsvTableObjectReader.cs b/src/KeePass/DataExchange/CsvTableObjectReader.cs new file mode 100644 index 0000000..b6e51ad --- /dev/null +++ b/src/KeePass/DataExchange/CsvTableObjectReader.cs @@ -0,0 +1,118 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +namespace KeePass.DataExchange +{ + internal delegate T CsvTableObjectFunc(string[] vContextRow); + internal delegate void CsvTableObjectAction(T t, string[] vContextRow); + internal delegate void CsvTableDataHandler(string strData, T tContext, + string[] vContextRow); + + internal abstract class CsvTableObjectReader + { + // For all streams + private readonly CsvTableObjectFunc m_fObjectNew; + private readonly CsvTableObjectAction m_fObjectCommit; + private readonly Dictionary> m_dHandlers = + new Dictionary>(); + + // For the current stream + private readonly Dictionary m_dColumns = + new Dictionary(); + + public CsvTableObjectReader(CsvTableObjectFunc fObjectNew, + CsvTableObjectAction fObjectCommit) + { + m_fObjectNew = fObjectNew; + m_fObjectCommit = fObjectCommit; + } + + public void SetDataHandler(string strColumn, CsvTableDataHandler f) + { + if(strColumn == null) { Debug.Assert(false); return; } + + m_dHandlers[strColumn] = f; + } + + public void Read(CsvStreamReaderEx csr) + { + if(csr == null) { Debug.Assert(false); return; } + + string[] vHeader; + while(true) + { + vHeader = csr.ReadLine(); + if(vHeader == null) return; + if(vHeader.Length == 0) continue; + if((vHeader.Length == 1) && (vHeader[0].Length == 0)) continue; + break; + } + + m_dColumns.Clear(); + + CsvTableDataHandler[] vHandlers = new CsvTableDataHandler[vHeader.Length]; + for(int i = vHeader.Length - 1; i >= 0; --i) + { + string str = vHeader[i]; + + m_dColumns[str] = i; + + CsvTableDataHandler f; + m_dHandlers.TryGetValue(str, out f); + vHandlers[i] = f; + } + + while(true) + { + string[] vRow = csr.ReadLine(); + if(vRow == null) break; + if(vRow.Length == 0) continue; + if((vRow.Length == 1) && (vRow[0].Length == 0)) continue; + + T t = ((m_fObjectNew != null) ? m_fObjectNew(vRow) : default(T)); + + Debug.Assert(vRow.Length == vHandlers.Length); + int m = Math.Min(vRow.Length, vHandlers.Length); + for(int i = 0; i < m; ++i) + { + CsvTableDataHandler f = vHandlers[i]; + if(f != null) f(vRow[i], t, vRow); + } + + if(m_fObjectCommit != null) m_fObjectCommit(t, vRow); + } + } + + public string GetData(string[] vRow, string strColumn, string strDefault) + { + if(vRow == null) { Debug.Assert(false); return strDefault; } + if(strColumn == null) { Debug.Assert(false); return strDefault; } + + int i; + if(!m_dColumns.TryGetValue(strColumn, out i)) return strDefault; + + return ((i < vRow.Length) ? vRow[i] : strDefault); + } + } +} diff --git a/src/KeePass/DataExchange/ExportUtil.cs b/src/KeePass/DataExchange/ExportUtil.cs new file mode 100644 index 0000000..e409312 --- /dev/null +++ b/src/KeePass/DataExchange/ExportUtil.cs @@ -0,0 +1,274 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Windows.Forms; + +using KeePass.App; +using KeePass.Forms; +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Delegates; +using KeePassLib.Interfaces; +using KeePassLib.Keys; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +using NativeLib = KeePassLib.Native.NativeLib; + +namespace KeePass.DataExchange +{ + public static class ExportUtil + { + public static bool Export(PwExportInfo pwExportInfo, IStatusLogger slLogger) + { + if(pwExportInfo == null) throw new ArgumentNullException("pwExportInfo"); + if(pwExportInfo.DataGroup == null) throw new ArgumentException(); + + if(!AppPolicy.Try(AppPolicyId.Export)) return false; + + ExchangeDataForm dlg = new ExchangeDataForm(); + dlg.InitEx(true, pwExportInfo.ContextDatabase, pwExportInfo.DataGroup); + dlg.ExportInfo = pwExportInfo; + + bool bStatusActive = false; + + try + { + if(dlg.ShowDialog() == DialogResult.OK) + { + FileFormatProvider ffp = dlg.ResultFormat; + if(ffp == null) { Debug.Assert(false); return false; } + + IOConnectionInfo ioc = null; + if(ffp.RequiresFile) + { + string[] vFiles = dlg.ResultFiles; + if(vFiles == null) { Debug.Assert(false); return false; } + if(vFiles.Length == 0) { Debug.Assert(false); return false; } + Debug.Assert(vFiles.Length == 1); + + string strFile = vFiles[0]; + if(string.IsNullOrEmpty(strFile)) { Debug.Assert(false); return false; } + + ioc = IOConnectionInfo.FromPath(strFile); + } + + if(slLogger != null) + { + slLogger.StartLogging(KPRes.ExportingStatusMsg, true); + bStatusActive = true; + } + + Application.DoEvents(); // Redraw parent window + return Export(pwExportInfo, ffp, ioc, slLogger); + } + } + catch(Exception ex) { MessageService.ShowWarning(ex); } + finally + { + UIUtil.DestroyForm(dlg); + if(bStatusActive) slLogger.EndLogging(); + } + + return false; + } + + public static bool Export(PwExportInfo pwExportInfo, string strFormatName, + IOConnectionInfo iocOutput) + { + if(strFormatName == null) throw new ArgumentNullException("strFormatName"); + // iocOutput may be null + + FileFormatProvider ffp = Program.FileFormatPool.Find(strFormatName); + if(ffp == null) return false; + + NullStatusLogger slLogger = new NullStatusLogger(); + return Export(pwExportInfo, ffp, iocOutput, slLogger); + } + + public static bool Export(PwExportInfo pwExportInfo, FileFormatProvider fileFormat, + IOConnectionInfo iocOutput, IStatusLogger slLogger) + { + if(pwExportInfo == null) throw new ArgumentNullException("pwExportInfo"); + if(pwExportInfo.DataGroup == null) throw new ArgumentException(); + if(fileFormat == null) throw new ArgumentNullException("fileFormat"); + + bool bFileReq = fileFormat.RequiresFile; + if(bFileReq && (iocOutput == null)) + throw new ArgumentNullException("iocOutput"); + if(bFileReq && (iocOutput.Path.Length == 0)) + throw new ArgumentException(); + + PwDatabase pd = pwExportInfo.ContextDatabase; + Debug.Assert(pd != null); + + if(!AppPolicy.Try(AppPolicyId.Export)) return false; + if(!AppPolicy.Current.ExportNoKey && (pd != null)) + { + if(!KeyUtil.ReAskKey(pd, true)) return false; + } + + if(!fileFormat.SupportsExport) return false; + if(!fileFormat.TryBeginExport()) return false; + + CompositeKey ckOrgMasterKey = null; + DateTime dtOrgMasterKey = PwDefs.DtDefaultNow; + + PwGroup pgOrgData = pwExportInfo.DataGroup; + PwGroup pgOrgRoot = ((pd != null) ? pd.RootGroup : null); + bool bParentGroups = (pwExportInfo.ExportParentGroups && (pd != null) && + (pgOrgData != pgOrgRoot)); + + bool bExistedAlready = true; // No deletion by default + bool bResult = false; + + try + { + if(pwExportInfo.ExportMasterKeySpec && fileFormat.RequiresKey && + (pd != null)) + { + KeyCreationFormResult r; + DialogResult dr = KeyCreationForm.ShowDialog(iocOutput, true, out r); + if((dr != DialogResult.OK) || (r == null)) return false; + + ckOrgMasterKey = pd.MasterKey; + dtOrgMasterKey = pd.MasterKeyChanged; + + pd.MasterKey = r.CompositeKey; + pd.MasterKeyChanged = DateTime.UtcNow; + } + + if(bParentGroups) + { + PwGroup pgNew = WithParentGroups(pgOrgData, pd); + pwExportInfo.DataGroup = pgNew; + pd.RootGroup = pgNew; + } + + if(bFileReq) bExistedAlready = IOConnection.FileExists(iocOutput); + + Stream s = (bFileReq ? IOConnection.OpenWrite(iocOutput) : null); + try { bResult = fileFormat.Export(pwExportInfo, s, slLogger); } + finally { if(s != null) s.Close(); } + + if(bFileReq && bResult) + { + if(pwExportInfo.ExportPostOpen) + NativeLib.StartProcess(iocOutput.Path); + if(pwExportInfo.ExportPostShow) + WinUtil.ShowFileInFileManager(iocOutput.Path, true); + } + } + catch(Exception ex) { MessageService.ShowWarning(ex); } + finally + { + if(ckOrgMasterKey != null) + { + pd.MasterKey = ckOrgMasterKey; + pd.MasterKeyChanged = dtOrgMasterKey; + } + + if(bParentGroups) + { + pwExportInfo.DataGroup = pgOrgData; + pd.RootGroup = pgOrgRoot; + } + } + + if(bFileReq && !bResult && !bExistedAlready) + { + try { IOConnection.DeleteFile(iocOutput); } + catch(Exception) { } + } + + return bResult; + } + + private static PwGroup WithParentGroups(PwGroup pg, PwDatabase pd) + { + if(pg == null) { Debug.Assert(false); return null; } + if(pd == null) { Debug.Assert(false); return pg; } + + Dictionary dUuids = CollectUuids(pg); + + PwGroup pgNew = FilterCloneGroup(pd.RootGroup, dUuids); + Debug.Assert(pgNew.GetEntriesCount(true) == pg.GetEntriesCount(true)); + return pgNew; + } + + private static Dictionary CollectUuids(PwGroup pg) + { + Dictionary d = new Dictionary(); + + Action fAdd = delegate(IStructureItem it) + { + if(it == null) { Debug.Assert(false); return; } + + Debug.Assert(!d.ContainsKey(it.Uuid)); + d[it.Uuid] = true; + + PwGroup pgParent = it.ParentGroup; + while(pgParent != null) + { + d[pgParent.Uuid] = true; + pgParent = pgParent.ParentGroup; + } + }; + + GroupHandler gh = delegate(PwGroup pgCur) { fAdd(pgCur); return true; }; + EntryHandler eh = delegate(PwEntry peCur) { fAdd(peCur); return true; }; + + fAdd(pg); + pg.TraverseTree(TraversalMethod.PreOrder, gh, eh); + + return d; + } + + private static PwGroup FilterCloneGroup(PwGroup pg, Dictionary dUuids) + { + PwGroup pgNew = new PwGroup(); + pgNew.Uuid = pg.Uuid; + pgNew.AssignProperties(pg, false, true); + Debug.Assert(pgNew.EqualsGroup(pg, (PwCompareOptions.IgnoreParentGroup | + PwCompareOptions.PropertiesOnly), MemProtCmpMode.Full)); + + foreach(PwEntry pe in pg.Entries) + { + if(dUuids.ContainsKey(pe.Uuid)) + pgNew.AddEntry(pe.CloneDeep(), true, false); + } + + foreach(PwGroup pgSub in pg.Groups) + { + if(dUuids.ContainsKey(pgSub.Uuid)) + pgNew.AddGroup(FilterCloneGroup(pgSub, dUuids), true, false); + } + + return pgNew; + } + } +} diff --git a/src/KeePass/DataExchange/FileFormatPool.cs b/src/KeePass/DataExchange/FileFormatPool.cs new file mode 100644 index 0000000..e7eaee1 --- /dev/null +++ b/src/KeePass/DataExchange/FileFormatPool.cs @@ -0,0 +1,227 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +using KeePass.DataExchange.Formats; +using KeePass.UI; + +using KeePassLib.Utility; + +namespace KeePass.DataExchange +{ + public sealed class FileFormatPool : IEnumerable + { + private readonly List m_lFormats = new List(); + + public IEnumerable Importers + { + get + { + List l = new List(); + foreach(FileFormatProvider p in m_lFormats) + { + if(p.SupportsImport) l.Add(p); + } + return l; + } + } + + public IEnumerable Exporters + { + get + { + List l = new List(); + foreach(FileFormatProvider p in m_lFormats) + { + if(p.SupportsExport) l.Add(p); + } + return l; + } + } + + public int Count + { + get { return m_lFormats.Count; } + } + + public FileFormatPool() + { + List l = m_lFormats; + + l.Add(new KeePassCsv1x()); + l.Add(new KeePassKdb1x()); + l.Add(new KeePassKdb2x()); + l.Add(new KeePassKdb2xRepair()); + l.Add(new KeePassKdb2x3()); + l.Add(new KeePassXml1x()); + l.Add(new KeePassXml2x()); + + l.Add(new GenericCsv()); + + l.Add(new KeePassHtml2x()); + l.Add(new XslTransform2x()); + l.Add(new WinFavorites10(false)); + l.Add(new WinFavorites10(true)); + + l.Add(new OnePw1Pux8()); + l.Add(new OnePwProCsv599()); + l.Add(new AmpXml250()); + l.Add(new AnyPwCsv144()); + l.Add(new BitwardenJson112()); + l.Add(new CodeWalletTxt605()); + l.Add(new DashlaneCsv2()); + l.Add(new DashlaneJson6()); + l.Add(new DataVaultCsv47()); + l.Add(new DesktopKnoxXml32()); + l.Add(new EnpassTxt5()); + l.Add(new FlexWalletXml17()); + l.Add(new HandySafeTxt512()); + l.Add(new HandySafeProXml12()); + l.Add(new KasperskyPwMgrTxt90()); + l.Add(new KasperskyPwMgrXml50()); + l.Add(new KeePassXXml041()); + l.Add(new KeeperJson16()); + l.Add(new KeyFolderXml1()); + l.Add(new LastPassCsv2()); + l.Add(new MSecureCsv355()); + l.Add(new NetworkPwMgrCsv4()); + l.Add(new NortonIdSafeCsv2013()); + l.Add(new NPasswordNpw102()); + l.Add(new PassKeeper12()); + l.Add(new PpKeeperHtml270()); + l.Add(new PwAgentXml3()); + l.Add(new PwDepotXml26()); + l.Add(new PwKeeperCsv70()); + l.Add(new PwMemory2008Xml104()); + l.Add(new PwPrompterDat12()); + l.Add(new PwSafeXml302()); + l.Add(new PwSaverXml412()); + l.Add(new PwsPlusCsv1007()); + l.Add(new PwTresorXml100()); + l.Add(new PVaultTxt14()); + l.Add(new PinsTxt450()); + l.Add(new RevelationXml04()); + l.Add(new RoboFormHtml69()); + l.Add(new SafeWalletXml3()); + l.Add(new SecurityTxt12()); + l.Add(new SplashIdCsv402()); + l.Add(new SteganosCsv20()); + l.Add(new SteganosUI2007()); + l.Add(new StickyPwXml50()); + l.Add(new TrueKeyCsv4()); + l.Add(new TurboPwsCsv5()); + l.Add(new VisKeeperTxt3()); + l.Add(new Whisper32Csv116()); + l.Add(new ZdnPwProTxt314()); + + l.Add(new ChromeCsv66()); + l.Add(new MozillaBookmarksHtml100()); + l.Add(new MozillaBookmarksJson100()); + l.Add(new PwExporterXml105()); + + l.Add(new Spamex20070328()); + +#if DEBUG + // Ensure name uniqueness + for(int i = 0; i < l.Count; ++i) + { + FileFormatProvider pi = l[i]; + for(int j = i + 1; j < l.Count; ++j) + { + FileFormatProvider pj = l[j]; + Debug.Assert(!string.Equals(pi.FormatName, pj.FormatName, StrUtil.CaseIgnoreCmp)); + Debug.Assert(!string.Equals(pi.FormatName, pj.DisplayName, StrUtil.CaseIgnoreCmp)); + Debug.Assert(!string.Equals(pi.DisplayName, pj.FormatName, StrUtil.CaseIgnoreCmp)); + Debug.Assert(!string.Equals(pi.DisplayName, pj.DisplayName, StrUtil.CaseIgnoreCmp)); + } + } + + foreach(FileFormatProvider p in l) + { + Type t = p.GetType(); + Debug.Assert(t.IsNotPublic); + Debug.Assert(t.IsSealed || l.Exists(px => px.GetType().IsSubclassOf(t))); + + string strExts = p.DefaultExtension; + if(!string.IsNullOrEmpty(strExts)) + { + Debug.Assert(!strExts.StartsWith(".")); + Debug.Assert(strExts.ToLower() == strExts); + + string strExtU = UIUtil.GetPrimaryFileTypeExt(strExts).ToUpper(); + Debug.Assert(p.DisplayName.EndsWith(" " + strExtU) || + p.DisplayName.Contains(" " + strExtU + " ") || + p.DisplayName.Contains(" " + strExtU + "-")); + } + } +#endif + } + + IEnumerator IEnumerable.GetEnumerator() + { + return m_lFormats.GetEnumerator(); + } + + public IEnumerator GetEnumerator() + { + return m_lFormats.GetEnumerator(); + } + + public void Add(FileFormatProvider p) + { + if(p == null) { Debug.Assert(false); throw new ArgumentNullException("p"); } + + m_lFormats.Add(p); + } + + public bool Remove(FileFormatProvider p) + { + if(p == null) { Debug.Assert(false); throw new ArgumentNullException("p"); } + + return m_lFormats.Remove(p); + } + + public FileFormatProvider Find(string strName) + { + if(string.IsNullOrEmpty(strName)) return null; + + // Format and display names may differ (e.g. the Generic + // CSV Importer has different names) + + foreach(FileFormatProvider p in m_lFormats) + { + if(string.Equals(strName, p.DisplayName, StrUtil.CaseIgnoreCmp)) + return p; + } + + foreach(FileFormatProvider p in m_lFormats) + { + if(string.Equals(strName, p.FormatName, StrUtil.CaseIgnoreCmp)) + return p; + } + + return null; + } + } +} diff --git a/src/KeePass/DataExchange/FileFormatProvider.cs b/src/KeePass/DataExchange/FileFormatProvider.cs new file mode 100644 index 0000000..473bb76 --- /dev/null +++ b/src/KeePass/DataExchange/FileFormatProvider.cs @@ -0,0 +1,168 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; + +namespace KeePass.DataExchange +{ + public abstract class FileFormatProvider + { + public abstract bool SupportsImport { get; } + public abstract bool SupportsExport { get; } + + public abstract string FormatName { get; } + + public virtual string DisplayName + { + get { return this.FormatName; } + } + + /// + /// Default file name extension, without leading dot. + /// If there are multiple default/equivalent extensions + /// (like e.g. "html" and "htm"), specify all of them + /// separated by a '|' (e.g. "html|htm"). + /// + public virtual string DefaultExtension + { + get { return string.Empty; } + } + + /// + /// Type of the original application using this format (like + /// password manager / KPRes.PasswordManagers, + /// web site / KPRes.WebSites, + /// browser / KPRes.Browser, etc. + /// + public virtual string ApplicationGroup + { + get { return KPRes.General; } + } + + /// + /// This property indicates whether entries are only appended + /// to the end of the root group. This is true for example if + /// the file format does not support groups (i.e. no hierarchy). + /// + public virtual bool ImportAppendsToRootGroupOnly + { + get { return false; } + } + + public virtual bool RequiresFile + { + get { return true; } + } + + public virtual bool RequiresKey + { + get { return false; } + } + + public virtual bool SupportsUuids + { + get { return false; } + } + + public virtual Image SmallIcon + { + get { return null; } + } + + /// + /// If the importer is implemented as a profile for the generic + /// XML importer, return the profile using this property (in + /// this case the Import method must not be overridden!). + /// + internal virtual GxiProfile XmlProfile + { + get { return null; } + } + + /// + /// Called before the Import method is invoked. + /// + /// Returns true, if the Import method + /// can be invoked. If it returns false, something has + /// failed and the import process should be aborted. + public virtual bool TryBeginImport() + { + return true; + } + + /// + /// Called before the Export method is invoked. + /// + /// Returns true, if the Export method + /// can be invoked. If it returns false, something has + /// failed and the export process should be aborted. + public virtual bool TryBeginExport() + { + return true; + } + + /// + /// Import a stream into a database. Throws an exception if an error + /// occurs. Do not call the base class method when overriding it. + /// + /// Data storage into which the data will be imported. + /// Input stream to read the data from. + /// Status logger. May be null. + public virtual void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + GxiProfile p = this.XmlProfile; + if(p != null) + { + if(pwStorage == null) throw new ArgumentNullException("pwStorage"); + + GxiImporter.Import(pwStorage.RootGroup, sInput, p, pwStorage, slLogger); + return; + } + + throw new NotSupportedException(); + } + + /// + /// Export data into a stream. Throws an exception if an error + /// occurs (like writing to stream fails, etc.). Returns true, + /// if the export was successful. + /// + /// Contains the data source and detailed + /// information about which entries should be exported. + /// Output stream to write the data to. + /// Status logger. May be null. + /// Returns false, if the user has aborted the export + /// process (like clicking Cancel in an additional export settings + /// dialog). + public virtual bool Export(PwExportInfo pwExportInfo, Stream sOutput, + IStatusLogger slLogger) + { + throw new NotSupportedException(); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/AmpXml250.cs b/src/KeePass/DataExchange/Formats/AmpXml250.cs new file mode 100644 index 0000000..b59254f --- /dev/null +++ b/src/KeePass/DataExchange/Formats/AmpXml250.cs @@ -0,0 +1,207 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 2.50-3.21+ + internal sealed class AmpXml250 : FileFormatProvider + { + private const string ElemRoot = "AmP_FILE"; + + private const string ElemInfo = "INFO"; + private const string ElemData = "DATA"; + + private const string ElemCategory = "Kategorie"; + private const string ElemTitle = "Bezeichnung"; + private const string ElemUserName = "Benutzername"; + private const string ElemPassword1 = "Passwort1"; + private const string ElemPassword2 = "Passwort2"; + private const string ElemExpiry = "Ablaufdatum"; + private const string ElemUrl = "URL_Programm"; + private const string ElemNotes = "Kommentar"; + + private const string ElemCustom = "Benutzerdefinierte_Felder"; + private const string ElemCustomName = "name"; + private const string ElemCustomValue = "wert"; + + private const string ValueNoData = "n/a"; + private const string ValueNone = "keins"; + private const string ValueNever = "nie"; + + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Alle meine Passworte XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strDoc = sr.ReadToEnd(); + sr.Close(); + + strDoc = XmlUtil.DecodeHtmlEntities(strDoc); + + ImportFileString(strDoc, pwStorage, slLogger); + } + + private static void ImportFileString(string strXmlDoc, PwDatabase pwStorage, + IStatusLogger slLogger) + { + XmlDocument doc = XmlUtilEx.CreateXmlDocument(); + doc.LoadXml(strXmlDoc); + + XmlElement xmlRoot = doc.DocumentElement; + Debug.Assert(xmlRoot.Name == ElemRoot); + + foreach(XmlNode xmlChild in xmlRoot.ChildNodes) + { + if(xmlChild.Name == ElemData) + LoadDataNode(xmlChild, pwStorage, slLogger); + else if(xmlChild.Name == ElemInfo) { } + else { Debug.Assert(false); } + } + } + + private static void LoadDataNode(XmlNode xmlNode, PwDatabase pwStorage, + IStatusLogger slLogger) + { + uint uCat = 0, uCount = (uint)xmlNode.ChildNodes.Count; + foreach(XmlNode xmlCategory in xmlNode.ChildNodes) + { + LoadCategoryNode(xmlCategory, pwStorage); + ++uCat; + ImportUtil.SetStatus(slLogger, (uCat * 100) / uCount); + } + } + + private static void LoadCategoryNode(XmlNode xmlNode, PwDatabase pwStorage) + { + PwGroup pg = new PwGroup(true, true, xmlNode.Name, PwIcon.Folder); + pwStorage.RootGroup.AddGroup(pg, true); + + PwEntry pe = new PwEntry(true, true); + + foreach(XmlNode xmlChild in xmlNode) + { + string strInner = XmlUtil.SafeInnerText(xmlChild); + if(strInner == ValueNoData) strInner = string.Empty; + + if(xmlChild.Name == ElemCategory) + { + // strInner may contain special characters, thus + // update the group name now + pg.Name = strInner; + } + else if(xmlChild.Name == ElemTitle) + { + AddEntryIfValid(pg, ref pe); + + Debug.Assert(strInner.Length > 0); + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, strInner)); + } + else if(xmlChild.Name == ElemUserName) + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, strInner)); + else if(xmlChild.Name == ElemPassword1) + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, strInner)); + else if(xmlChild.Name == ElemPassword2) + { + if((strInner.Length > 0) && (strInner != ValueNone)) + pe.Strings.Set(PwDefs.PasswordField + @" 2", new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, strInner)); + } + else if(xmlChild.Name == ElemExpiry) + { + if((strInner.Length > 0) && (strInner != ValueNever)) + { + try + { + DateTime dt = DateTime.Parse(strInner); + pe.ExpiryTime = TimeUtil.ToUtc(dt, false); + pe.Expires = true; + } + catch(Exception) { Debug.Assert(false); } + } + } + else if(xmlChild.Name == ElemUrl) + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, strInner)); + else if(xmlChild.Name == ElemNotes) + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, strInner)); + else if(xmlChild.Name == ElemCustom) + LoadCustomFields(xmlChild, pe, pwStorage); + else { Debug.Assert(false); } + } + + AddEntryIfValid(pg, ref pe); + } + + private static void AddEntryIfValid(PwGroup pgContainer, ref PwEntry pe) + { + try + { + if(pe == null) return; + if(pe.Strings.ReadSafe(PwDefs.TitleField).Length == 0) return; + + pgContainer.AddEntry(pe, true); + } + finally { pe = new PwEntry(true, true); } + } + + private static void LoadCustomFields(XmlNode xmlNode, PwEntry pe, + PwDatabase pwStorage) + { + string strKey = string.Empty; + + foreach(XmlNode xn in xmlNode.ChildNodes) + { + if(xn.Name == ElemCustomName) + strKey = XmlUtil.SafeInnerText(xn); + else if(xn.Name == ElemCustomValue) + { + if(strKey.Length == 0) { Debug.Assert(false); continue; } + + ImportUtil.AppendToField(pe, strKey, XmlUtil.SafeInnerText(xn), + pwStorage); + } + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/AnyPwCsv144.cs b/src/KeePass/DataExchange/Formats/AnyPwCsv144.cs new file mode 100644 index 0000000..dc83486 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/AnyPwCsv144.cs @@ -0,0 +1,121 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1.44 & Pro 1.07 + internal sealed class AnyPwCsv144 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Any Password CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strData = sr.ReadToEnd(); + sr.Close(); + + string[] vLines = strData.Split(new char[] { '\r', '\n' }, + StringSplitOptions.RemoveEmptyEntries); + + foreach(string strLine in vLines) + { + if(strLine.Length > 5) ProcessCsvLine(strLine, pwStorage); + } + } + + private static void ProcessCsvLine(string strLine, PwDatabase pwStorage) + { + List list = ImportUtil.SplitCsvLine(strLine, ","); + Debug.Assert((list.Count == 6) || (list.Count == 7)); + if(list.Count < 6) return; + bool bIsPro = (list.Count >= 7); // Std exports 6 fields only + + PwEntry pe = new PwEntry(true, true); + pwStorage.RootGroup.AddEntry(pe, true); + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, + ParseCsvWord(list[0], false))); + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, + ParseCsvWord(list[1], false))); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, + ParseCsvWord(list[2], false))); + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, + ParseCsvWord(list[3], false))); + + int p = 3; + if(bIsPro) + pe.Strings.Set(KPRes.Custom, new ProtectedString(false, + ParseCsvWord(list[++p], false))); + + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, + ParseCsvWord(list[++p], true))); + + DateTime dt; + if(DateTime.TryParse(ParseCsvWord(list[++p], false), out dt)) + pe.CreationTime = pe.LastAccessTime = pe.LastModificationTime = + TimeUtil.ToUtc(dt, false); + else { Debug.Assert(false); } + } + + private static string ParseCsvWord(string strWord, bool bFixCodes) + { + string str = strWord.Trim(); + + if((str.Length >= 2) && str.StartsWith("\"") && str.EndsWith("\"")) + str = str.Substring(1, str.Length - 2); + + str = str.Replace("\"\"", "\""); + + if(bFixCodes) + { + str = str.Replace("<13>", string.Empty); + str = str.Replace("<10>", "\r\n"); + } + + return str; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/BitwardenJson112.cs b/src/KeePass/DataExchange/Formats/BitwardenJson112.cs new file mode 100644 index 0000000..3e8e964 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/BitwardenJson112.cs @@ -0,0 +1,275 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1.12-2022.5.1+ + internal sealed class BitwardenJson112 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Bitwarden JSON"; } } + public override string DefaultExtension { get { return "json"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + using(StreamReader sr = new StreamReader(sInput, StrUtil.Utf8, true)) + { + string str = sr.ReadToEnd(); + if(!string.IsNullOrEmpty(str)) + { + CharStream cs = new CharStream(str); + ImportRoot(new JsonObject(cs), pwStorage); + } + } + } + + private static void ImportRoot(JsonObject jo, PwDatabase pd) + { + if(jo.GetValue("encrypted", false)) + throw new FormatException(KPRes.NoEncNoCompress); + + Dictionary dGroups = new Dictionary(); + JsonObject[] vGroups = jo.GetValueArray("folders"); + if(vGroups != null) ImportGroups(vGroups, dGroups, pd); + dGroups[string.Empty] = pd.RootGroup; // Also when vGroups is null + + Dictionary dCollections = new Dictionary(); + JsonObject[] vCollections = jo.GetValueArray("collections"); + if(vCollections != null) ImportCollections(vCollections, dCollections); + + JsonObject[] vEntries = jo.GetValueArray("items"); + if(vEntries != null) ImportEntries(vEntries, dGroups, dCollections, pd); + } + + private static void ImportGroups(JsonObject[] vGroups, + Dictionary dGroups, PwDatabase pd) + { + char[] vSep = new char[] { '/' }; + + foreach(JsonObject jo in vGroups) + { + if(jo == null) { Debug.Assert(false); continue; } + + string strID = (jo.GetValue("id") ?? string.Empty); + string strName = (jo.GetValue("name") ?? string.Empty); + + dGroups[strID] = pd.RootGroup.FindCreateSubTree(strName, vSep); + } + } + + private static void ImportCollections(JsonObject[] vCollections, + Dictionary dCollections) + { + foreach(JsonObject jo in vCollections) + { + if(jo == null) { Debug.Assert(false); continue; } + + string strID = jo.GetValue("id"); + string strName = jo.GetValue("name"); + + if(!string.IsNullOrEmpty(strID) && !string.IsNullOrEmpty(strName)) + dCollections[strID] = strName.Replace("/", " / "); + else { Debug.Assert(false); } + } + } + + private static void ImportEntries(JsonObject[] vEntries, + Dictionary dGroups, Dictionary dCollections, + PwDatabase pd) + { + foreach(JsonObject jo in vEntries) + { + if(jo == null) { Debug.Assert(false); continue; } + + ImportEntry(jo, dGroups, dCollections, pd); + } + } + + private static void ImportEntry(JsonObject jo, Dictionary dGroups, + Dictionary dCollections, PwDatabase pd) + { + PwEntry pe = new PwEntry(true, true); + + PwGroup pg; + string strGroupID = (jo.GetValue("folderId") ?? string.Empty); + dGroups.TryGetValue(strGroupID, out pg); + if(pg == null) { Debug.Assert(false); pg = dGroups[string.Empty]; } + pg.AddEntry(pe, true); + + foreach(string strID in jo.GetValueArray("collectionIds", true)) + { + if(string.IsNullOrEmpty(strID)) { Debug.Assert(false); continue; } + + string strName; + if(dCollections.TryGetValue(strID, out strName)) + pe.AddTag(strName); + else { Debug.Assert(false); } + } + + ImportString(jo, "name", pe, PwDefs.TitleField, pd); + ImportString(jo, "notes", pe, PwDefs.NotesField, pd); + + bool bFav = jo.GetValue("favorite", false); + if(bFav) pe.AddTag(PwDefs.FavoriteTag); + + JsonObject joSub = jo.GetValue("login"); + if(joSub != null) ImportLogin(joSub, pe, pd); + + joSub = jo.GetValue("card"); + if(joSub != null) ImportCard(joSub, pe, pd); + + JsonObject[] v = jo.GetValueArray("fields"); + if(v != null) ImportFields(v, pe, pd); + + joSub = jo.GetValue("identity"); + if(joSub != null) ImportIdentity(joSub, pe, pd); + } + + private static void ImportLogin(JsonObject jo, PwEntry pe, PwDatabase pd) + { + ImportString(jo, "username", pe, PwDefs.UserNameField, pd); + ImportString(jo, "password", pe, PwDefs.PasswordField, pd); + + // https://bitwarden.com/help/authenticator-keys/ + string strOtp = jo.GetValue("totp"); + if((strOtp != null) && strOtp.StartsWith(EntryUtil.OtpAuthScheme + ":", + StrUtil.CaseIgnoreCmp)) + { + try { EntryUtil.ImportOtpAuth(pe, strOtp, pd); } + catch(Exception) { Debug.Assert(false); } + } + else // Null, Steam URI, ... + { + ImportString(jo, "totp", pe, "TOTP", pd); + pe.Strings.EnableProtection("TOTP", true); + } + + foreach(JsonObject joUri in jo.GetValueArray("uris", true)) + { + if(joUri == null) { Debug.Assert(false); continue; } + + string str = joUri.GetValue("uri"); + ImportUtil.CreateFieldWithIndex(pe.Strings, PwDefs.UrlField, + str, pd, false); + } + } + + private static void ImportCard(JsonObject jo, PwEntry pe, PwDatabase pd) + { + ImportString(jo, "cardholderName", pe, PwDefs.UserNameField, pd); + ImportString(jo, "brand", pe, "Brand", pd); + ImportString(jo, "number", pe, PwDefs.UserNameField, pd); + ImportString(jo, "code", pe, PwDefs.PasswordField, pd); + + int iYear, iMonth; + string strYear = (jo.GetValue("expYear") ?? string.Empty); + int.TryParse(strYear, out iYear); + if((iYear >= 1) && (iYear <= 9999)) + { + string strMonth = (jo.GetValue("expMonth") ?? string.Empty); + int.TryParse(strMonth, out iMonth); + if((iMonth <= 0) || (iMonth >= 13)) { Debug.Assert(false); iMonth = 1; } + + pe.Expires = true; + pe.ExpiryTime = TimeUtil.ToUtc(new DateTime(iYear, iMonth, 1), false); + } + else { Debug.Assert(strYear.Length == 0); } + } + + private static void ImportFields(JsonObject[] vFields, PwEntry pe, PwDatabase pd) + { + foreach(JsonObject jo in vFields) + { + if(jo == null) { Debug.Assert(false); continue; } + + string strName = jo.GetValue("name"); + string strValue = (jo.GetValue("value") ?? string.Empty); + long lType = jo.GetValue("type", 0); + + if(!string.IsNullOrEmpty(strName)) + { + ImportUtil.AppendToField(pe, strName, strValue, pd); + + if((lType == 1) && !PwDefs.IsStandardField(strName)) + pe.Strings.EnableProtection(strName, true); + } + else { Debug.Assert(false); } + } + } + + private static void ImportIdentity(JsonObject jo, PwEntry pe, PwDatabase pd) + { + ImportString(jo, "title", pe, PwDefs.UserNameField, pd, " "); + ImportString(jo, "firstName", pe, PwDefs.UserNameField, pd, " "); + ImportString(jo, "middleName", pe, PwDefs.UserNameField, pd, " "); + ImportString(jo, "lastName", pe, PwDefs.UserNameField, pd, " "); + ImportString(jo, "address1", pe, "Address 1", pd); + ImportString(jo, "address2", pe, "Address 2", pd); + ImportString(jo, "address3", pe, "Address 3", pd); + ImportString(jo, "city", pe, "City", pd); + ImportString(jo, "state", pe, "State / Province", pd); + ImportString(jo, "postalCode", pe, "Zip / Postal Code", pd); + ImportString(jo, "country", pe, "Country", pd); + ImportString(jo, "company", pe, "Company", pd); + + string str = jo.GetValue("email"); + if(!string.IsNullOrEmpty(str)) + ImportUtil.AppendToField(pe, PwDefs.UrlField, "mailto:" + str, pd); + + ImportString(jo, "phone", pe, "Phone", pd); + ImportString(jo, "ssn", pe, "Social Security Number", pd); + ImportString(jo, "username", pe, PwDefs.UserNameField, pd); + ImportString(jo, "passportNumber", pe, "Passport Number", pd); + ImportString(jo, "licenseNumber", pe, "License Number", pd); + } + + private static void ImportString(JsonObject jo, string strJsonKey, PwEntry pe, + string strFieldName, PwDatabase pd) + { + ImportString(jo, strJsonKey, pe, strFieldName, pd, null); + } + + private static void ImportString(JsonObject jo, string strJsonKey, PwEntry pe, + string strFieldName, PwDatabase pd, string strSep) + { + string str = jo.GetValue(strJsonKey); + if(string.IsNullOrEmpty(str)) return; + + ImportUtil.AppendToField(pe, strFieldName, str, pd, strSep, false); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/ChromeCsv66.cs b/src/KeePass/DataExchange/Formats/ChromeCsv66.cs new file mode 100644 index 0000000..40a234b --- /dev/null +++ b/src/KeePass/DataExchange/Formats/ChromeCsv66.cs @@ -0,0 +1,88 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class ChromeCsv66 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Google Chrome Passwords CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.Browser; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, StrUtil.Utf8, true); + string str = sr.ReadToEnd(); + sr.Close(); + + CsvOptions opt = new CsvOptions(); + opt.BackslashIsEscape = false; + + CsvStreamReaderEx csr = new CsvStreamReaderEx(str, opt); + + while(true) + { + string[] vLine = csr.ReadLine(); + if(vLine == null) break; + + AddEntry(vLine, pwStorage); + } + } + + private static void AddEntry(string[] vLine, PwDatabase pd) + { + if(vLine.Length != 4) { Debug.Assert(vLine.Length == 0); return; } + + if(vLine[0].Equals("name", StrUtil.CaseIgnoreCmp) && + vLine[1].Equals("url", StrUtil.CaseIgnoreCmp)) + return; + + PwEntry pe = new PwEntry(true, true); + pd.RootGroup.AddEntry(pe, true); + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pd.MemoryProtection.ProtectTitle, vLine[0])); + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pd.MemoryProtection.ProtectUrl, vLine[1])); + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pd.MemoryProtection.ProtectUserName, vLine[2])); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pd.MemoryProtection.ProtectPassword, vLine[3])); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/CodeWalletTxt605.cs b/src/KeePass/DataExchange/Formats/CodeWalletTxt605.cs new file mode 100644 index 0000000..10fcbba --- /dev/null +++ b/src/KeePass/DataExchange/Formats/CodeWalletTxt605.cs @@ -0,0 +1,114 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 6.05-6.62+ + internal sealed class CodeWalletTxt605 : FileFormatProvider + { + private const string FieldSeparator = "*---------------------------------------------------"; + + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "CodeWallet TXT"; } } + public override string DefaultExtension { get { return "txt"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Unicode); + string strData = sr.ReadToEnd(); + sr.Close(); + + string[] vLines = strData.Split(new char[] { '\r', '\n' }); + + bool bDoImport = false; + PwEntry pe = new PwEntry(true, true); + bool bInnerSep = false; + bool bEmptyEntry = true; + string strLastIndexedItem = string.Empty; + string strLastLine = string.Empty; + + foreach(string strLine in vLines) + { + if(strLine.Length == 0) continue; + + if(strLine == FieldSeparator) + { + bInnerSep = !bInnerSep; + if(bInnerSep && !bEmptyEntry) + { + pwStorage.RootGroup.AddEntry(pe, true); + + pe = new PwEntry(true, true); + bEmptyEntry = true; + } + else if(!bInnerSep) + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, + strLastLine)); + + bDoImport = true; + } + else if(bDoImport) + { + int nIDLen = strLine.IndexOf(": "); + if(nIDLen > 0) + { + string strIndex = strLine.Substring(0, nIDLen); + if(PwDefs.IsStandardField(strIndex)) + strIndex = Guid.NewGuid().ToString(); + + pe.Strings.Set(strIndex, new ProtectedString( + false, strLine.Remove(0, nIDLen + 2))); + + strLastIndexedItem = strIndex; + } + else if(!bEmptyEntry) + { + pe.Strings.Set(strLastIndexedItem, new ProtectedString( + false, pe.Strings.ReadSafe(strLastIndexedItem) + + MessageService.NewParagraph + strLine)); + } + + bEmptyEntry = false; + } + + strLastLine = strLine; + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/DashlaneCsv2.cs b/src/KeePass/DataExchange/Formats/DashlaneCsv2.cs new file mode 100644 index 0000000..1c9c410 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/DashlaneCsv2.cs @@ -0,0 +1,165 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Native; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 2.3.2-5.0.1+, incompatible with 6.2039.0 + internal sealed class DashlaneCsv2 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Dashlane CSV (< 6)"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, StrUtil.Utf8, true); + string str = sr.ReadToEnd(); + sr.Close(); + + // All fields are enclosed in '"', however '"' in data is + // not encoded (broken format) + + str = str.Trim(); + str = StrUtil.NormalizeNewLines(str, false); // To Unix + char chFieldSep = StrUtil.GetUnusedChar(str); + str = str.Replace("\",\"", new string(chFieldSep, 1)); + char chRecSep = StrUtil.GetUnusedChar(str); + str = str.Replace("\"\n\"", new string(chRecSep, 1)); + if(str.StartsWith("\"") && str.EndsWith("\"") && (str.Length >= 2)) + str = str.Substring(1, str.Length - 2); + else { Debug.Assert(false); } + if(!NativeLib.IsUnix()) str = StrUtil.NormalizeNewLines(str, true); + + CsvOptions opt = new CsvOptions(); + opt.BackslashIsEscape = false; + opt.FieldSeparator = chFieldSep; + opt.RecordSeparator = chRecSep; + opt.TextQualifier = char.MinValue; + + CsvStreamReaderEx csr = new CsvStreamReaderEx(str, opt); + + while(true) + { + string[] vLine = csr.ReadLine(); + if(vLine == null) break; + + AddEntry(vLine, pwStorage); + } + } + + private static Regex m_rxIsDate = null; + private static Regex m_rxIsGuid = null; + private static void AddEntry(string[] vLine, PwDatabase pd) + { + int n = vLine.Length; + if(n == 0) return; + + PwEntry pe = new PwEntry(true, true); + pd.RootGroup.AddEntry(pe, true); + + string[] vFields = null; + if(n == 2) + vFields = new string[2] { PwDefs.TitleField, PwDefs.UrlField }; + else if(n == 3) + vFields = new string[3] { PwDefs.TitleField, PwDefs.UrlField, + PwDefs.UserNameField }; + else if(n == 4) + { + if((vLine[2].Length == 0) && (vLine[3].Length == 0)) + vFields = new string[4] { PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.NotesField, PwDefs.NotesField }; + else + vFields = new string[4] { PwDefs.TitleField, PwDefs.NotesField, + PwDefs.UserNameField, PwDefs.NotesField }; + } + else if(n == 5) + vFields = new string[5] { PwDefs.TitleField, PwDefs.UrlField, + PwDefs.UserNameField, PwDefs.PasswordField, PwDefs.NotesField }; + else if(n == 6) + vFields = new string[6] { PwDefs.TitleField, PwDefs.UrlField, + PwDefs.UserNameField, PwDefs.UserNameField, PwDefs.PasswordField, + PwDefs.NotesField }; + else if(n == 7) + vFields = new string[7] { PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.NotesField, PwDefs.NotesField, PwDefs.NotesField, + PwDefs.NotesField, PwDefs.NotesField }; + + if(m_rxIsDate == null) + { + m_rxIsDate = new Regex(@"^\d{4}-\d+-\d+$"); + m_rxIsGuid = new Regex( + @"^\{[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\}$"); + } + + if((vLine[0].Length == 0) && (n >= 2) && m_rxIsDate.IsMatch(vLine[1])) + { + vFields = null; + + vLine[0] = KPRes.Id; + for(int i = 1; i < n; ++i) + { + string strPart = vLine[i]; + if(strPart.Equals("NO_TYPE", StrUtil.CaseIgnoreCmp) || + m_rxIsGuid.IsMatch(strPart)) + vLine[i] = string.Empty; + } + } + + for(int i = 0; i < n; ++i) + { + string str = vLine[i]; + if(str.Length == 0) continue; + if(str.Equals("dashlaneappcredential", StrUtil.CaseIgnoreCmp)) + continue; + + string strField = ((vFields != null) ? vFields[i] : null); + if(strField == null) + { + if(i == 0) strField = PwDefs.TitleField; + else strField = PwDefs.NotesField; + } + + if(strField == PwDefs.UrlField) + str = ImportUtil.FixUrl(str); + + ImportUtil.AppendToField(pe, strField, str, pd); + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/DashlaneJson6.cs b/src/KeePass/DataExchange/Formats/DashlaneJson6.cs new file mode 100644 index 0000000..80a7afd --- /dev/null +++ b/src/KeePass/DataExchange/Formats/DashlaneJson6.cs @@ -0,0 +1,228 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 6.2039.0+ + internal sealed class DashlaneJson6 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Dashlane JSON (\u2265 6)"; } } + public override string DefaultExtension { get { return "json"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + using(StreamReader sr = new StreamReader(sInput, StrUtil.Utf8, true)) + { + string str = sr.ReadToEnd(); + if(!string.IsNullOrEmpty(str)) + { + CharStream cs = new CharStream(str); + ImportRoot(new JsonObject(cs), pwStorage); + } + } + } + + private static void ImportRoot(JsonObject jo, PwDatabase pd) + { + foreach(string strType in jo.Items.Keys) + { + if(strType == null) { Debug.Assert(false); continue; } + string strTypeNorm = strType.Trim().ToLower(); + + JsonObject[] vEntries = jo.GetValueArray(strType); + if(vEntries == null) { Debug.Assert(false); continue; } + + foreach(JsonObject joEntry in vEntries) + { + if(joEntry == null) { Debug.Assert(false); continue; } + ImportEntry(joEntry, pd, strTypeNorm); + } + } + } + + private static void ImportEntry(JsonObject jo, PwDatabase pd, string strTypeNorm) + { + PwEntry pe = new PwEntry(true, true); + pd.RootGroup.AddEntry(pe, true); + + if(strTypeNorm.StartsWith("paymentmean")) + strTypeNorm = "paymentmean"; + + switch(strTypeNorm) + { + case "bankstatement": + case "fiscalstatement": + pe.IconId = PwIcon.Homebanking; + break; + + case "driverlicence": + case "idcard": + case "passport": + case "socialsecuritystatement": + pe.IconId = PwIcon.Identity; + break; + + case "email": + pe.IconId = PwIcon.EMail; + break; + + case "identity": + pe.IconId = PwIcon.UserCommunication; + break; + + case "paymentmean": + pe.IconId = PwIcon.Money; + break; + + default: + Debug.Assert(strTypeNorm == "authentifiant"); + break; + } + + foreach(KeyValuePair kvp in jo.Items) + { + string strValue = (kvp.Value as string); + if(strValue == null) + { + Debug.Assert(false); + if(kvp.Value != null) strValue = kvp.Value.ToString(); + } + if(strValue == null) { Debug.Assert(false); continue; } + + // Ignore GUIDs + if(Regex.IsMatch(strValue, "^\\{\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}\\}$", + RegexOptions.Singleline)) + continue; + + string strKey = kvp.Key; + if(strKey == null) { Debug.Assert(false); continue; } + strKey = strKey.Trim(); + if(string.IsNullOrEmpty(strKey)) { Debug.Assert(false); continue; } + if(strKey.StartsWith("BankAccount", StrUtil.CaseIgnoreCmp) && + (strKey.Length > 11)) + strKey = strKey.Substring(11); + if(strKey.IndexOf("Number", StrUtil.CaseIgnoreCmp) >= 0) + strKey = PwDefs.UserNameField; + strKey = (new string(char.ToUpper(strKey[0]), 1)) + + strKey.Substring(1); + + string strNorm = strKey.ToLower(); + switch(strNorm) + { + case "fullname": + case "name": + case "socialsecurityfullname": + strKey = PwDefs.TitleField; + break; + + case "domain": + strKey = PwDefs.UrlField; + break; + + case "expiredate": + DateTime? odt = ParseDate(strValue); + if(odt.HasValue) + { + pe.Expires = true; + pe.ExpiryTime = odt.Value; + strValue = string.Empty; + } + break; + + case "secondarylogin": + strKey = KPRes.UserName + " 2"; + break; + + default: + if(!strNorm.Contains("date") && !strNorm.Contains("time")) + { + string strStd = ImportUtil.MapNameToStandardField(strKey, true); + if(!string.IsNullOrEmpty(strStd)) strKey = strStd; + } + break; + } + + if(strKey == PwDefs.UrlField) + strValue = ImportUtil.FixUrl(strValue); + else if(strNorm.Contains("time")) + strValue = TryConvertTime(strValue); + + if(!string.IsNullOrEmpty(strValue)) + ImportUtil.AppendToField(pe, strKey, strValue, pd); + } + } + + private static DateTime? ParseDate(string str) + { + if(string.IsNullOrEmpty(str)) { Debug.Assert(false); return null; } + + DateTime dt; + if(DateTime.TryParseExact(str.Trim(), "yyyy'-'M'-'d", + NumberFormatInfo.InvariantInfo, DateTimeStyles.AssumeLocal, out dt)) + return TimeUtil.ToUtc(dt, false); + + Debug.Assert(false); + return null; + } + + private static string TryConvertTime(string str) + { + if(string.IsNullOrEmpty(str)) return string.Empty; + + try + { + if(Regex.IsMatch(str, "^\\d+$", RegexOptions.Singleline)) + { + ulong u; + if(ulong.TryParse(str, out u)) + { + DateTime dt = TimeUtil.ConvertUnixTime(u); + if(dt > TimeUtil.UnixRoot) + return TimeUtil.ToDisplayString(dt); + } + else { Debug.Assert(false); } + } + } + catch(Exception) { Debug.Assert(false); } + + return str; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/DataVaultCsv47.cs b/src/KeePass/DataExchange/Formats/DataVaultCsv47.cs new file mode 100644 index 0000000..7695fd5 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/DataVaultCsv47.cs @@ -0,0 +1,95 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; + +namespace KeePass.DataExchange.Formats +{ + // 4.7.35-6.2.7+ + internal sealed class DataVaultCsv47 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "DataVault CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + string strData; + using(StreamReader sr = new StreamReader(sInput, Encoding.Default)) + { + strData = sr.ReadToEnd(); + } + + // Fix new-line sequences + strData = strData.Replace("\r\r\n", "\r\n"); + + CsvStreamReader csv = new CsvStreamReader(strData, false); + while(true) + { + string[] v = csv.ReadLine(); + if(v == null) break; + if(v.Length == 0) continue; + + PwEntry pe = new PwEntry(true, true); + pwStorage.RootGroup.AddEntry(pe, true); + + ImportUtil.AppendToField(pe, PwDefs.TitleField, v[0], pwStorage); + + int p = 1; + while((p + 1) < v.Length) + { + string strMapped = ImportUtil.MapNameToStandardField(v[p], true); + string strKey = (string.IsNullOrEmpty(strMapped) ? v[p] : strMapped); + string strValue = v[p + 1]; + + p += 2; + + if(strKey.Length == 0) + { + if(strValue.Length == 0) continue; + + Debug.Assert(false); + strKey = PwDefs.NotesField; + } + + ImportUtil.AppendToField(pe, strKey, strValue, pwStorage); + } + + if((p < v.Length) && !string.IsNullOrEmpty(v[p])) + ImportUtil.AppendToField(pe, PwDefs.NotesField, v[p], pwStorage); + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/DesktopKnoxXml32.cs b/src/KeePass/DataExchange/Formats/DesktopKnoxXml32.cs new file mode 100644 index 0000000..937d882 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/DesktopKnoxXml32.cs @@ -0,0 +1,111 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 3.2+ + internal sealed class DesktopKnoxXml32 : FileFormatProvider + { + private const string ElemRoot = "SafeCatalog"; + + private const string ElemEntry = "SafeElement"; + + private const string ElemCategory = "Category"; + private const string ElemTitle = "Title"; + private const string ElemNotes = "Content"; + + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "DesktopKnox XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, StrUtil.Utf8); + string strDoc = sr.ReadToEnd(); + sr.Close(); + + XmlDocument doc = XmlUtilEx.CreateXmlDocument(); + doc.LoadXml(strDoc); + + XmlElement xmlRoot = doc.DocumentElement; + Debug.Assert(xmlRoot.Name == ElemRoot); + + Dictionary dictGroups = new Dictionary(); + dictGroups[string.Empty] = pwStorage.RootGroup; + + foreach(XmlNode xmlChild in xmlRoot.ChildNodes) + { + if(xmlChild.Name == ElemEntry) + ImportEntry(xmlChild, pwStorage, dictGroups); + else { Debug.Assert(false); } + } + } + + private static void ImportEntry(XmlNode xmlNode, PwDatabase pwStorage, + Dictionary dGroups) + { + PwEntry pe = new PwEntry(true, true); + string strGroup = string.Empty; + + foreach(XmlNode xmlChild in xmlNode) + { + string strInner = XmlUtil.SafeInnerText(xmlChild); + + if(xmlChild.Name == ElemCategory) + strGroup = strInner; + else if(xmlChild.Name == ElemTitle) + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, strInner)); + else if(xmlChild.Name == ElemNotes) + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, strInner)); + } + + PwGroup pg; + dGroups.TryGetValue(strGroup, out pg); + if(pg == null) + { + pg = new PwGroup(true, true); + pg.Name = strGroup; + dGroups[string.Empty].AddGroup(pg, true); + dGroups[strGroup] = pg; + } + pg.AddEntry(pe, true); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/EnpassTxt5.cs b/src/KeePass/DataExchange/Formats/EnpassTxt5.cs new file mode 100644 index 0000000..aa30ce4 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/EnpassTxt5.cs @@ -0,0 +1,140 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 5.3.0.1-6.0.4+ + internal sealed class EnpassTxt5 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Enpass TXT"; } } + public override string DefaultExtension { get { return "txt"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, StrUtil.Utf8, true); + string strData = sr.ReadToEnd(); + sr.Close(); + + PwGroup pg = pwStorage.RootGroup; + const string strSep = ": "; // Both ": " and " : " are used + + strData = StrUtil.NormalizeNewLines(strData, false); + + int iSep = strData.IndexOf(strSep); + if(iSep < 0) throw new FormatException(); + string strTitleKey = strData.Substring(0, iSep).Trim(); + if(strTitleKey.Length == 0) throw new FormatException(); + if(strTitleKey.IndexOf('\n') >= 0) throw new FormatException(); + + PwEntry pe = null; + string strName = PwDefs.TitleField; + + string[] vLines = strData.Split('\n'); + foreach(string strLine in vLines) + { + if(strLine == null) { Debug.Assert(false); continue; } + // Do not trim strLine, otherwise strSep might not be detected + + string strValue = strLine; + + iSep = strLine.IndexOf(strSep); + if(iSep >= 0) + { + string strCurName = strLine.Substring(0, iSep).Trim(); + strValue = strLine.Substring(iSep + strSep.Length); + + if(strCurName == strTitleKey) + { + FinishEntry(pe); + + pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + strName = PwDefs.TitleField; + } + else if(strName == PwDefs.NotesField) + strValue = strLine; // Restore + else + { + strName = ImportUtil.MapNameToStandardField(strCurName, true); + if(string.IsNullOrEmpty(strName)) + { + strName = strCurName; + if(string.IsNullOrEmpty(strName)) + { + Debug.Assert(false); + strName = PwDefs.NotesField; + strValue = strLine; // Restore + } + } + } + } + + if(pe != null) + { + strValue = strValue.Trim(); + + if(strValue.Length != 0) + ImportUtil.AppendToField(pe, strName, strValue, pwStorage); + else if(strName == PwDefs.NotesField) + { + ProtectedString ps = pe.Strings.GetSafe(strName); + pe.Strings.Set(strName, ps + MessageService.NewLine); + } + } + else { Debug.Assert(false); } + } + + FinishEntry(pe); + } + + private static void FinishEntry(PwEntry pe) + { + if(pe == null) return; + + List lKeys = pe.Strings.GetKeys(); + foreach(string strKey in lKeys) + { + ProtectedString ps = pe.Strings.GetSafe(strKey); + pe.Strings.Set(strKey, new ProtectedString( + ps.IsProtected, ps.ReadString().Trim())); + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/FlexWalletXml17.cs b/src/KeePass/DataExchange/Formats/FlexWalletXml17.cs new file mode 100644 index 0000000..5b70cdf --- /dev/null +++ b/src/KeePass/DataExchange/Formats/FlexWalletXml17.cs @@ -0,0 +1,186 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1.7 + internal sealed class FlexWalletXml17 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "FlexWallet XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + private const string ElemRoot = "FlexWallet"; + + // In 1.7 the node names are Pascal-cased and in 2006 they are + // lower-cased. Therefore, compare them case-insensitively. + + private const string ElemCategory = "Category"; + private const string ElemEntry = "Card"; + + private const string ElemField = "Field"; + private const string ElemNotes = "Notes"; + + private const string AttribData = "Description"; // 1.7 + private const string AttribName = "name"; // 2006 + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strDoc = sr.ReadToEnd(); + sr.Close(); + + ImportFileString(strDoc, pwStorage); + } + + private static void ImportFileString(string strXmlDoc, PwDatabase pwStorage) + { + XmlDocument doc = XmlUtilEx.CreateXmlDocument(); + doc.LoadXml(strXmlDoc); + + XmlElement xmlRoot = doc.DocumentElement; + Debug.Assert(xmlRoot.Name == ElemRoot); + + foreach(XmlNode xmlChild in xmlRoot.ChildNodes) + { + if(xmlChild.Name.Equals(ElemCategory, StrUtil.CaseIgnoreCmp)) + ImportCategory(xmlChild, pwStorage.RootGroup, pwStorage); + else { Debug.Assert(false); } + } + } + + private static void ImportCategory(XmlNode xmlNode, PwGroup pgContainer, + PwDatabase pwStorage) + { + string strName = ReadNameAttrib(xmlNode); + if(string.IsNullOrEmpty(strName)) strName = KPRes.Group; + + PwGroup pg = new PwGroup(true, true, strName, PwIcon.Folder); + pgContainer.AddGroup(pg, true); + + foreach(XmlNode xmlChild in xmlNode.ChildNodes) + { + if(xmlChild.Name.Equals(ElemEntry, StrUtil.CaseIgnoreCmp)) + ImportEntry(xmlChild, pg, pwStorage); + else if(xmlChild.Name.Equals(ElemCategory, StrUtil.CaseIgnoreCmp)) + ImportCategory(xmlChild, pg, pwStorage); + else { Debug.Assert(false); } + } + } + + private static void ImportEntry(XmlNode xmlNode, PwGroup pg, PwDatabase pwStorage) + { + PwEntry pe = new PwEntry(true, true); + + string strTitle = ReadNameAttrib(xmlNode); + if(!string.IsNullOrEmpty(strTitle)) + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, strTitle)); + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name.Equals(ElemField, StrUtil.CaseIgnoreCmp)) + { + string strName = ReadNameAttrib(xmlChild); + if(string.IsNullOrEmpty(strName)) continue; + + string strValue = XmlUtil.SafeInnerText(xmlChild); + + string strKpName = ImportUtil.MapNameToStandardField(strName, true); + if(string.IsNullOrEmpty(strKpName)) strKpName = strName; + + ImportUtil.AppendToField(pe, strKpName, strValue, pwStorage); + } + else if(xmlChild.Name.Equals(ElemNotes, StrUtil.CaseIgnoreCmp)) + ImportUtil.AppendToField(pe, PwDefs.NotesField, + XmlUtil.SafeInnerText(xmlChild), pwStorage); + else { Debug.Assert(false); } + } + + // RenameFields(pe); + pg.AddEntry(pe, true); + } + + private static string ReadNameAttrib(XmlNode xmlNode) + { + if(xmlNode == null) { Debug.Assert(false); return string.Empty; } + + try + { + if(xmlNode.Attributes.GetNamedItem(AttribData) != null) // 1.7 + return (xmlNode.Attributes[AttribData].Value ?? string.Empty); + if(xmlNode.Attributes.GetNamedItem(AttribName) != null) // 2006 + return (xmlNode.Attributes[AttribName].Value ?? string.Empty); + + Debug.Assert(false); + } + catch(Exception) { Debug.Assert(false); } + + return string.Empty; + } + + /* private static void RenameFields(PwEntry pe) + { + string[] vMap = new string[] { + "Acct #", PwDefs.UserNameField, + "Subject", PwDefs.UserNameField, + "Location", PwDefs.UserNameField, + "Combination", PwDefs.PasswordField, + "Username", PwDefs.UserNameField, + "Website", PwDefs.UrlField, + "Serial #", PwDefs.PasswordField, + "Product ID", PwDefs.UserNameField + }; + + Debug.Assert((vMap.Length % 2) == 0); + for(int i = 0; i < vMap.Length; i += 2) + { + string strFrom = vMap[i], strTo = vMap[i + 1]; + + if(pe.Strings.ReadSafe(strTo).Length > 0) continue; + + string strData = pe.Strings.ReadSafe(strFrom); + if(strData.Length > 0) + { + pe.Strings.Set(strTo, new ProtectedString(false, strData)); + if(!pe.Strings.Remove(strFrom)) { Debug.Assert(false); } + } + } + } */ + } +} diff --git a/src/KeePass/DataExchange/Formats/GenericCsv.cs b/src/KeePass/DataExchange/Formats/GenericCsv.cs new file mode 100644 index 0000000..4245bd9 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/GenericCsv.cs @@ -0,0 +1,62 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Text; + +using KeePass.Forms; +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class GenericCsv : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return KPRes.CsvTextFile; } } + public override string DisplayName { get { return KPRes.GenericCsvImporter; } } + // public override string DefaultExtension { get { return "*"; } } + public override string DefaultExtension { get { return "csv|tsv|tab|txt|asc"; } } + public override string ApplicationGroup { get { return KPRes.General; } } + + public override Image SmallIcon + { + get { return KeePass.Properties.Resources.B16x16_Wizard; } + } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + byte[] pb = MemUtil.Read(sInput); + + CsvImportForm dlg = new CsvImportForm(); + dlg.InitEx(pwStorage, pb); + UIUtil.ShowDialogAndDestroy(dlg); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/HandySafeProXml12.cs b/src/KeePass/DataExchange/Formats/HandySafeProXml12.cs new file mode 100644 index 0000000..3b22e37 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/HandySafeProXml12.cs @@ -0,0 +1,145 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml.Serialization; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + [XmlRoot("HandySafe")] + public sealed class HspFolder + { + [XmlAttribute("name")] + public string Name { get; set; } + + [XmlElement("Folder")] + public HspFolder[] Folders { get; set; } + + [XmlElement("Card")] + public HspCard[] Cards { get; set; } + } + + public sealed class HspCard + { + [XmlAttribute("name")] + public string Name { get; set; } + + [XmlElement("Field")] + public HspField[] Fields { get; set; } + + public string Note { get; set; } + } + + public sealed class HspField + { + [XmlAttribute("name")] + public string Name { get; set; } + + [XmlText] + public string Value { get; set; } + } + + // 1.2-3.01+ + internal sealed class HandySafeProXml12 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Handy Safe Pro XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + HspFolder hspRoot = XmlUtilEx.Deserialize(sInput); + + AddFolder(pwStorage.RootGroup, hspRoot, false); + } + + private static void AddFolder(PwGroup pgParent, HspFolder hspFolder, + bool bNewGroup) + { + if(hspFolder == null) { Debug.Assert(false); return; } + + PwGroup pg; + if(bNewGroup) + { + pg = new PwGroup(true, true); + pgParent.AddGroup(pg, true); + + if(!string.IsNullOrEmpty(hspFolder.Name)) + pg.Name = hspFolder.Name; + } + else pg = pgParent; + + if(hspFolder.Folders != null) + { + foreach(HspFolder fld in hspFolder.Folders) + AddFolder(pg, fld, true); + } + + if(hspFolder.Cards != null) + { + foreach(HspCard crd in hspFolder.Cards) + AddCard(pg, crd); + } + } + + private static void AddCard(PwGroup pgParent, HspCard hspCard) + { + if(hspCard == null) { Debug.Assert(false); return; } + + PwEntry pe = new PwEntry(true, true); + pgParent.AddEntry(pe, true); + + if(!string.IsNullOrEmpty(hspCard.Name)) + pe.Strings.Set(PwDefs.TitleField, new ProtectedString(false, hspCard.Name)); + + if(!string.IsNullOrEmpty(hspCard.Note)) + pe.Strings.Set(PwDefs.NotesField, new ProtectedString(false, hspCard.Note)); + + if(hspCard.Fields == null) return; + foreach(HspField fld in hspCard.Fields) + { + if(fld == null) { Debug.Assert(false); continue; } + if(string.IsNullOrEmpty(fld.Name) || string.IsNullOrEmpty(fld.Value)) continue; + + string strKey = ImportUtil.MapNameToStandardField(fld.Name, true); + if(string.IsNullOrEmpty(strKey)) strKey = fld.Name; + + string strValue = pe.Strings.ReadSafe(strKey); + if(strValue.Length > 0) strValue += ", "; + strValue += fld.Value; + pe.Strings.Set(strKey, new ProtectedString(false, strValue)); + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/HandySafeTxt512.cs b/src/KeePass/DataExchange/Formats/HandySafeTxt512.cs new file mode 100644 index 0000000..e332d49 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/HandySafeTxt512.cs @@ -0,0 +1,139 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 5.12 + internal sealed class HandySafeTxt512 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Handy Safe TXT"; } } + public override string DefaultExtension { get { return "txt"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + private const string StrGroupStart = "[Category: "; + private const string StrGroupEnd = "]"; + private const string StrEntryStart = "[Card, "; + private const string StrEntryEnd = "]"; + private const string StrNotesBegin = "Note:"; + private const string StrFieldSplit = ": "; + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strData = sr.ReadToEnd(); + sr.Close(); + + strData = strData.Replace("\r", string.Empty); + string[] vLines = strData.Split(new char[] { '\n' }); + + PwGroup pg = pwStorage.RootGroup; + Dictionary dItems = new Dictionary(); + bool bInNotes = false; + + foreach(string strLine in vLines) + { + if(strLine.StartsWith(StrGroupStart) && strLine.EndsWith(StrGroupEnd)) + { + AddEntry(pg, dItems, ref bInNotes); + dItems.Clear(); + + pg = new PwGroup(true, true); + pg.Name = strLine.Substring(StrGroupStart.Length, strLine.Length - + StrGroupStart.Length - StrGroupEnd.Length); + + pwStorage.RootGroup.AddGroup(pg, true); + } + else if(strLine.StartsWith(StrEntryStart) && strLine.EndsWith(StrEntryEnd)) + { + AddEntry(pg, dItems, ref bInNotes); + dItems.Clear(); + } + else if(strLine == StrNotesBegin) bInNotes = true; + else if(bInNotes) + { + if(dItems.ContainsKey(PwDefs.NotesField)) + dItems[PwDefs.NotesField] += MessageService.NewLine + strLine; + else dItems[PwDefs.NotesField] = strLine; + } + else + { + int nSplitPos = strLine.IndexOf(StrFieldSplit); + if(nSplitPos < 0) { Debug.Assert(false); } + else + { + AddField(dItems, strLine.Substring(0, nSplitPos), + strLine.Substring(nSplitPos + StrFieldSplit.Length)); + } + } + } + + AddEntry(pg, dItems, ref bInNotes); + } + + private static void AddField(Dictionary dItems, + string strKey, string strValue) + { + string strKeyTrl = ImportUtil.MapNameToStandardField(strKey, true); + if(string.IsNullOrEmpty(strKeyTrl)) strKeyTrl = strKey; + + if(!dItems.ContainsKey(strKeyTrl)) + { + dItems[strKeyTrl] = strValue; + return; + } + + string strPreValue = dItems[strKeyTrl]; + if((strPreValue.Length > 0) && (strValue.Length > 0)) + strPreValue += ", "; + + dItems[strKeyTrl] = strPreValue + strValue; + } + + private static void AddEntry(PwGroup pg, Dictionary dItems, + ref bool bInNotes) + { + if(dItems.Count == 0) return; + + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + foreach(KeyValuePair kvp in dItems) + pe.Strings.Set(kvp.Key, new ProtectedString(false, kvp.Value)); + + bInNotes = false; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/KasperskyPwMgrTxt90.cs b/src/KeePass/DataExchange/Formats/KasperskyPwMgrTxt90.cs new file mode 100644 index 0000000..161bd4f --- /dev/null +++ b/src/KeePass/DataExchange/Formats/KasperskyPwMgrTxt90.cs @@ -0,0 +1,186 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 9.0.2+ + internal sealed class KasperskyPwMgrTxt90 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Kaspersky Password Manager TXT"; } } + public override string DefaultExtension { get { return "txt"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + string strAll; + using(StreamReader sr = new StreamReader(sInput, Encoding.UTF8, true)) + { + strAll = sr.ReadToEnd(); + } + + // Fix new-line sequences and normalize to '\n' + strAll = strAll.Replace("\r\r\n", "\r\n"); + strAll = StrUtil.NormalizeNewLines(strAll, false); + + string[] vBlocks = strAll.Split(new string[] { "\n\n---\n\n" }, + StringSplitOptions.None); + PwGroup pg = pwStorage.RootGroup; + + foreach(string strBlock in vBlocks) + ImportBlock(pwStorage, ref pg, strBlock); + } + + private static void ImportBlock(PwDatabase pd, ref PwGroup pg, string strBlock) + { + if(strBlock == null) { Debug.Assert(false); return; } + strBlock = strBlock.Trim(); + if(strBlock.Length == 0) return; + + string strFirstLine = strBlock; + int iNL = strBlock.IndexOf('\n'); + if(iNL >= 0) strFirstLine = strBlock.Substring(0, iNL).Trim(); + + if(strFirstLine.IndexOf(':') < 0) + { + if(strFirstLine.Length == 0) { Debug.Assert(false); pg = pd.RootGroup; } + else + { + pg = new PwGroup(true, true); + pg.Name = strFirstLine; + + if(strFirstLine.Equals("Websites", StrUtil.CaseIgnoreCmp)) + pg.IconId = PwIcon.World; + else if(strFirstLine.Equals("Applications", StrUtil.CaseIgnoreCmp)) + pg.IconId = PwIcon.Run; + else if(strFirstLine.Equals("Notes", StrUtil.CaseIgnoreCmp)) + pg.IconId = PwIcon.Note; + + pd.RootGroup.AddGroup(pg, true); + } + + if(iNL < 0) return; // Group without entry + strBlock = strBlock.Substring(iNL + 1).Trim(); + } + + if(strBlock.Length != 0) + { + string[] vLines = strBlock.Split('\n'); + ImportEntry(pd, pg, vLines); + } + } + + private static void ImportEntry(PwDatabase pd, PwGroup pg, string[] vLines) + { + PwEntry pe = new PwEntry(true, true); + bool bFoundData = false; + + StringBuilder sbNotes = new StringBuilder(); + bool bInNotes = false; + + foreach(string strLine in vLines) + { + if(bInNotes) { sbNotes.AppendLine(strLine); continue; } + + int iSep = strLine.IndexOf(':'); + if(iSep < 0) + { + Debug.Assert(false); + string str = strLine.Trim(); + if(str.Length != 0) sbNotes.AppendLine(str); + continue; + } + + string strKey = strLine.Substring(0, iSep).Trim(); + if(strKey.Length == 0) + { + Debug.Assert(false); + strKey = PwDefs.NotesField; + } + + string strValue = strLine.Substring(iSep + 1).Trim(); + + bFoundData |= (strValue.Length != 0); + + string strKeyL = strKey.ToLowerInvariant(); + switch(strKeyL) + { + case "website name": + case "login name": // Name of a user/password pair + case "application": + case "name": // Secure note + strKey = PwDefs.TitleField; + break; + + case "login": + strKey = PwDefs.UserNameField; + break; + + case "password": + strKey = PwDefs.PasswordField; + break; + + case "website url": + strKey = PwDefs.UrlField; + break; + + case "comment": + case "text": // Secure note + strKey = PwDefs.NotesField; + break; + + default: + Debug.Assert(false); + string strMapped = ImportUtil.MapNameToStandardField( + strKey, true); + if(!string.IsNullOrEmpty(strMapped)) + strKey = strMapped; + break; + } + + if(strKey == PwDefs.NotesField) + { + sbNotes.AppendLine(strValue); + bInNotes = true; + } + else ImportUtil.AppendToField(pe, strKey, strValue, pd); + } + + string strNotes = sbNotes.ToString().Trim(); + ImportUtil.AppendToField(pe, PwDefs.NotesField, strNotes, pd); + + if(bFoundData) pg.AddEntry(pe, true); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/KasperskyPwMgrXml50.cs b/src/KeePass/DataExchange/Formats/KasperskyPwMgrXml50.cs new file mode 100644 index 0000000..c6c2a02 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/KasperskyPwMgrXml50.cs @@ -0,0 +1,42 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; + +namespace KeePass.DataExchange.Formats +{ + // Sticky Password is basically the same password manager as + // Kaspersky Password Manager, and the exported XML files + // are exactly the same. + + // 5.0.0.148-5.0.0.183+ + internal sealed class KasperskyPwMgrXml50 : StickyPwXml50 + { + public override string FormatName { get { return "Kaspersky Password Manager XML"; } } + } +} diff --git a/src/KeePass/DataExchange/Formats/KeePassCsv1x.cs b/src/KeePass/DataExchange/Formats/KeePassCsv1x.cs new file mode 100644 index 0000000..4df190c --- /dev/null +++ b/src/KeePass/DataExchange/Formats/KeePassCsv1x.cs @@ -0,0 +1,180 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePassLib; +using KeePassLib.Delegates; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class KeePassCsv1x : FileFormatProvider + { + public override bool SupportsImport { get { return false; } } + public override bool SupportsExport { get { return true; } } + + public override string FormatName { get { return "KeePass CSV (1.x)"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return PwDefs.ShortProductName; } } + + /* public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.UTF8); + string strFileContents = sr.ReadToEnd(); + sr.Close(); + + CharStream csSource = new CharStream(strFileContents); + + while(true) + { + if(!ReadEntry(pwStorage, csSource)) break; + } + } + + private static bool ReadEntry(PwDatabase pwStorage, CharStream csSource) + { + PwEntry pe = new PwEntry(true, true); + + string strTitle = ReadCsvField(csSource); + if(strTitle == null) return false; // No entry available + + string strUser = ReadCsvField(csSource); + if(strUser == null) throw new InvalidDataException(); + + string strPassword = ReadCsvField(csSource); + if(strPassword == null) throw new InvalidDataException(); + + string strUrl = ReadCsvField(csSource); + if(strUrl == null) throw new InvalidDataException(); + + string strNotes = ReadCsvField(csSource); + if(strNotes == null) throw new InvalidDataException(); + + if((strTitle == "Account") && (strUser == "Login Name") && + (strPassword == "Password") && (strUrl == "Web Site") && + (strNotes == "Comments")) + { + return true; // Ignore header entry + } + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, strTitle)); + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, strUser)); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, strPassword)); + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, strUrl)); + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, strNotes)); + + pwStorage.RootGroup.AddEntry(pe, true); + return true; + } + + private static string ReadCsvField(CharStream csSource) + { + StringBuilder sb = new StringBuilder(); + bool bInField = false; + + while(true) + { + char ch = csSource.ReadChar(); + if(ch == char.MinValue) + return null; + + if((ch == '\"') && !bInField) + bInField = true; + else if((ch == '\"') && bInField) + break; + else if(ch == '\\') + { + char chSub = csSource.ReadChar(); + if(chSub == char.MinValue) + throw new InvalidDataException(); + + sb.Append(chSub); + } + else if(bInField) + sb.Append(ch); + } + + return sb.ToString(); + } */ + + public override bool Export(PwExportInfo pwExportInfo, Stream sOutput, + IStatusLogger slLogger) + { + PwGroup pg = (pwExportInfo.DataGroup ?? ((pwExportInfo.ContextDatabase != + null) ? pwExportInfo.ContextDatabase.RootGroup : null)); + + StreamWriter sw = new StreamWriter(sOutput, StrUtil.Utf8); + sw.Write("\"Account\",\"Login Name\",\"Password\",\"Web Site\",\"Comments\"\r\n"); + + EntryHandler eh = delegate(PwEntry pe) + { + WriteCsvEntry(sw, pe); + return true; + }; + + if(pg != null) pg.TraverseTree(TraversalMethod.PreOrder, null, eh); + + sw.Close(); + return true; + } + + private static void WriteCsvEntry(StreamWriter sw, PwEntry pe) + { + if(sw == null) { Debug.Assert(false); return; } + if(pe == null) { Debug.Assert(false); return; } + + const string strSep = "\",\""; + + sw.Write("\""); + WriteCsvString(sw, pe.Strings.ReadSafe(PwDefs.TitleField), strSep); + WriteCsvString(sw, pe.Strings.ReadSafe(PwDefs.UserNameField), strSep); + WriteCsvString(sw, pe.Strings.ReadSafe(PwDefs.PasswordField), strSep); + WriteCsvString(sw, pe.Strings.ReadSafe(PwDefs.UrlField), strSep); + WriteCsvString(sw, pe.Strings.ReadSafe(PwDefs.NotesField), "\"\r\n"); + } + + private static void WriteCsvString(StreamWriter sw, string strText, + string strAppend) + { + string str = strText; + if(!string.IsNullOrEmpty(str)) + { + str = str.Replace("\\", "\\\\"); + str = str.Replace("\"", "\\\""); + + sw.Write(str); + } + + if(!string.IsNullOrEmpty(strAppend)) sw.Write(strAppend); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/KeePassHtml2x.cs b/src/KeePass/DataExchange/Formats/KeePassHtml2x.cs new file mode 100644 index 0000000..a3168b0 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/KeePassHtml2x.cs @@ -0,0 +1,121 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Windows.Forms; + +using KeePass.Forms; +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class KeePassHtml2x : FileFormatProvider + { + public override bool SupportsImport { get { return false; } } + public override bool SupportsExport { get { return true; } } + + public override string FormatName { get { return KPRes.CustomizableHtml; } } + public override string DefaultExtension { get { return "html|htm"; } } + public override string ApplicationGroup { get { return KPRes.General; } } + + public override bool Export(PwExportInfo pwExportInfo, Stream sOutput, + IStatusLogger slLogger) + { + ImageList il = null; + MainForm mf = Program.MainForm; + if((mf != null) && (mf.ActiveDatabase == pwExportInfo.ContextDatabase)) + il = mf.ClientIcons; + + PrintForm dlg = new PrintForm(); + dlg.InitEx(pwExportInfo.DataGroup, pwExportInfo.ContextDatabase, il, + false, -1); + + bool bResult = false; + try + { + if(dlg.ShowDialog() == DialogResult.OK) + { + byte[] pb = StrUtil.Utf8.GetBytes(dlg.GeneratedHtml); + sOutput.Write(pb, 0, pb.Length); + sOutput.Close(); + + bResult = true; + } + } + finally { UIUtil.DestroyForm(dlg); } + + return bResult; + } + + internal static StringBuilder HtmlPart1ToHead(bool bRtl, string strTitle) + { + StringBuilder sb = new StringBuilder(); + sb.AppendLine(""); + + sb.Append(""); + + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + + sb.Append(""); + sb.Append(StrUtil.StringToHtml(strTitle)); + sb.AppendLine(""); + + return sb; + } + + internal static void HtmlPart2ToStyle(StringBuilder sb) + { + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + } + + internal static void HtmlPart4ToEnd(StringBuilder sb) + { + sb.AppendLine(""); + sb.AppendLine(""); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/KeePassKdb1x.cs b/src/KeePass/DataExchange/Formats/KeePassKdb1x.cs new file mode 100644 index 0000000..3a2df42 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/KeePassKdb1x.cs @@ -0,0 +1,123 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Native; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class KeePassKdb1x : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return true; } } + + public override string FormatName { get { return "KeePass KDB (1.x)"; } } + public override string DefaultExtension { get { return KeePassKdb1x.FileExt1; } } + public override string ApplicationGroup { get { return PwDefs.ShortProductName; } } + + public override bool RequiresKey { get { return true; } } + public override bool SupportsUuids { get { return true; } } + + public override Image SmallIcon + { + get { return KeePass.Properties.Resources.B16x16_KeePass; } + } + + internal const string FileExt1 = "kdb"; + internal const string FileExt2 = "pwd"; + + public override bool TryBeginImport() + { + if(NativeLib.IsUnix()) + { + MessageService.ShowWarning(KPRes.KeePassLibCNotWindows, + KPRes.KeePassLibCNotWindowsHint); + return false; + } + + Exception exLib; + if(!KdbFile.IsLibraryInstalled(out exLib)) + { + MessageService.ShowWarning(KPRes.KeePassLibCNotFound, + KPRes.KdbKeePassLibC, exLib); + return false; + } + + return true; + } + + public override bool TryBeginExport() + { + return TryBeginImport(); + } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + string strTempFile = Program.TempFilesPool.GetTempFileName(); + + BinaryReader br = new BinaryReader(sInput); + byte[] pb = br.ReadBytes((int)sInput.Length); + br.Close(); + File.WriteAllBytes(strTempFile, pb); + + KdbFile kdb = new KdbFile(pwStorage, slLogger); + kdb.Load(strTempFile); + + Program.TempFilesPool.Delete(strTempFile); + } + + public override bool Export(PwExportInfo pwExportInfo, Stream sOutput, + IStatusLogger slLogger) + { + PwDatabase pd = (pwExportInfo.ContextDatabase ?? new PwDatabase()); + + string strTempFile = Program.TempFilesPool.GetTempFileName(false); + + try + { + KdbFile kdb = new KdbFile(pd, slLogger); + kdb.Save(strTempFile, pwExportInfo.DataGroup); + + byte[] pbKdb = File.ReadAllBytes(strTempFile); + sOutput.Write(pbKdb, 0, pbKdb.Length); + MemUtil.ZeroByteArray(pbKdb); + } + catch(Exception exKdb) + { + if(slLogger != null) slLogger.SetText(exKdb.Message, LogStatusType.Error); + + return false; + } + finally { Program.TempFilesPool.Delete(strTempFile); } + + return true; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/KeePassKdb2x.cs b/src/KeePass/DataExchange/Formats/KeePassKdb2x.cs new file mode 100644 index 0000000..6663f8f --- /dev/null +++ b/src/KeePass/DataExchange/Formats/KeePassKdb2x.cs @@ -0,0 +1,159 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Text; + +using KeePass.App; +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Collections; +using KeePassLib.Cryptography.Cipher; +using KeePassLib.Cryptography.KeyDerivation; +using KeePassLib.Delegates; +using KeePassLib.Interfaces; +using KeePassLib.Serialization; + +namespace KeePass.DataExchange.Formats +{ + internal class KeePassKdb2x : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return true; } } + + public override string FormatName { get { return "KeePass KDBX (2.x)"; } } + public override string DefaultExtension { get { return AppDefs.FileExtension.FileExt; } } + public override string ApplicationGroup { get { return PwDefs.ShortProductName; } } + + public override bool RequiresKey { get { return true; } } + public override bool SupportsUuids { get { return true; } } + + public override Image SmallIcon + { + get { return KeePass.Properties.Resources.B16x16_KeePass; } + } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + KdbxFile kdbx = new KdbxFile(pwStorage); + kdbx.Load(sInput, KdbxFormat.Default, slLogger); + } + + public override bool Export(PwExportInfo pwExportInfo, Stream sOutput, + IStatusLogger slLogger) + { + KdbxFile kdbx = new KdbxFile(pwExportInfo.ContextDatabase); + kdbx.Save(sOutput, pwExportInfo.DataGroup, KdbxFormat.Default, slLogger); + return true; + } + } + + // KDBX 3.1 export module + internal sealed class KeePassKdb2x3 : KeePassKdb2x + { + // Only list base class as import module + public override bool SupportsImport { get { return false; } } + + public override string FormatName + { + get { return ("KeePass KDBX (2.34, " + KPRes.OldFormat + ")"); } + } + + public override bool Export(PwExportInfo pwExportInfo, Stream sOutput, + IStatusLogger slLogger) + { + PwDatabase pd = pwExportInfo.ContextDatabase; + PwGroup pgRoot = pwExportInfo.DataGroup; + + // Remove everything that requires KDBX 4 or higher; + // see also KdbxFile.GetMinKdbxVersion + + PwUuid puCipher = pd.DataCipherUuid; + if(puCipher.Equals(ChaCha20Engine.ChaCha20Uuid)) + pd.DataCipherUuid = StandardAesEngine.AesUuid; + + KdfParameters pKdf = pd.KdfParameters; + AesKdf kdfAes = new AesKdf(); + if(!pKdf.KdfUuid.Equals(kdfAes.Uuid)) + pd.KdfParameters = kdfAes.GetDefaultParameters(); + + VariantDictionary vdPublic = pd.PublicCustomData; + pd.PublicCustomData = new VariantDictionary(); + + List lCustomGK = new List(); + List lCustomGV = new List(); + List lCustomEK = new List(); + List lCustomEV = new List(); + + GroupHandler gh = delegate(PwGroup pg) + { + if(pg == null) { Debug.Assert(false); return true; } + if(pg.CustomData.Count > 0) + { + lCustomGK.Add(pg); + lCustomGV.Add(pg.CustomData); + pg.CustomData = new StringDictionaryEx(); + } + return true; + }; + EntryHandler eh = delegate(PwEntry pe) + { + if(pe == null) { Debug.Assert(false); return true; } + if(pe.CustomData.Count > 0) + { + lCustomEK.Add(pe); + lCustomEV.Add(pe.CustomData); + pe.CustomData = new StringDictionaryEx(); + } + return true; + }; + + gh(pgRoot); + pgRoot.TraverseTree(TraversalMethod.PreOrder, gh, eh); + + try + { + KdbxFile kdbx = new KdbxFile(pd); + kdbx.ForceVersion = KdbxFile.FileVersion32_3_1; + kdbx.Save(sOutput, pgRoot, KdbxFormat.Default, slLogger); + } + finally + { + // Restore + + pd.DataCipherUuid = puCipher; + pd.KdfParameters = pKdf; + pd.PublicCustomData = vdPublic; + + for(int i = 0; i < lCustomGK.Count; ++i) + lCustomGK[i].CustomData = lCustomGV[i]; + for(int i = 0; i < lCustomEK.Count; ++i) + lCustomEK[i].CustomData = lCustomEV[i]; + } + + return true; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/KeePassKdb2xRepair.cs b/src/KeePass/DataExchange/Formats/KeePassKdb2xRepair.cs new file mode 100644 index 0000000..b5671ef --- /dev/null +++ b/src/KeePass/DataExchange/Formats/KeePassKdb2xRepair.cs @@ -0,0 +1,139 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Text; +using System.Windows.Forms; + +using KeePass.App; +using KeePass.Native; +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class KeePassKdb2xRepair : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName + { + get { return "KeePass KDBX (2.x) (" + KPRes.RepairMode + ")"; } + } + public override string DefaultExtension { get { return AppDefs.FileExtension.FileExt; } } + public override string ApplicationGroup { get { return PwDefs.ShortProductName; } } + + public override bool RequiresKey { get { return true; } } + public override bool SupportsUuids { get { return true; } } + + public override Image SmallIcon + { + get { return KeePass.Properties.Resources.B16x16_KeePass; } + } + + public override bool TryBeginImport() + { + string strTitle = KPRes.Warning + "!"; + string strMsg = KPRes.RepairModeInt + MessageService.NewParagraph + + KPRes.RepairModeUse + MessageService.NewParagraph + + KPRes.RepairModeQ; + + int iYes = (int)DialogResult.Yes; + int iNo = (int)DialogResult.No; + int r = VistaTaskDialog.ShowMessageBoxEx(strMsg, strTitle, + PwDefs.ShortProductName, VtdIcon.Warning, null, + KPRes.YesCmd, iYes, KPRes.NoCmd, iNo); + if(r < 0) + r = (MessageService.AskYesNo(strTitle + MessageService.NewParagraph + + strMsg, PwDefs.ShortProductName, false, MessageBoxIcon.Warning) ? + iYes : iNo); + + return ((r == iYes) || (r == (int)DialogResult.OK)); + } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + KdbxFile kdbx = new KdbxFile(pwStorage); + // CappedByteStream s = new CappedByteStream(sInput, 64); + + kdbx.RepairMode = true; + + try { kdbx.Load(sInput, KdbxFormat.Default, slLogger); } + catch(Exception) { } + } + + /* private sealed class CappedByteStream : Stream + { + private Stream m_sBase; + private int m_nMaxRead; + + public override bool CanRead { get { return m_sBase.CanRead; } } + public override bool CanSeek { get { return m_sBase.CanSeek; } } + public override bool CanWrite { get { return m_sBase.CanWrite; } } + public override long Length { get { return m_sBase.Length; } } + public override long Position + { + get { return m_sBase.Position; } + set { m_sBase.Position = value; } + } + + public CappedByteStream(Stream sBase, int nMaxRead) + { + if(sBase == null) throw new ArgumentNullException("sBase"); + if(nMaxRead <= 0) throw new ArgumentException(); + + m_sBase = sBase; + m_nMaxRead = nMaxRead; + } + + public override void Flush() { m_sBase.Flush(); } + + public override int Read(byte[] buffer, int offset, int count) + { + if(count > m_nMaxRead) count = m_nMaxRead; + return m_sBase.Read(buffer, offset, count); + } + + public override long Seek(long offset, SeekOrigin origin) + { + return m_sBase.Seek(offset, origin); + } + + public override void SetLength(long value) + { + m_sBase.SetLength(value); + } + + public override void Write(byte[] buffer, int offset, int count) + { + m_sBase.Write(buffer, offset, count); + } + } */ + } +} diff --git a/src/KeePass/DataExchange/Formats/KeePassXXml041.cs b/src/KeePass/DataExchange/Formats/KeePassXXml041.cs new file mode 100644 index 0000000..d23a840 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/KeePassXXml041.cs @@ -0,0 +1,219 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Serialization; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Collections; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 0.4.1 + internal sealed class KeePassXXml041 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "KeePassX XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool SupportsUuids { get { return false; } } + + private const string ElemRoot = "database"; + + private const string ElemGroup = "group"; + private const string ElemTitle = "title"; + private const string ElemIcon = "icon"; + + private const string ElemEntry = "entry"; + private const string ElemUserName = "username"; + private const string ElemUrl = "url"; + private const string ElemPassword = "password"; + private const string ElemNotes = "comment"; + private const string ElemCreationTime = "creation"; + private const string ElemLastModTime = "lastmod"; + private const string ElemLastAccessTime = "lastaccess"; + private const string ElemExpiryTime = "expire"; + private const string ElemAttachDesc = "bindesc"; + private const string ElemAttachment = "bin"; + + private const string ValueNever = "Never"; + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + XmlDocument xmlDoc = XmlUtilEx.CreateXmlDocument(); + xmlDoc.Load(sInput); + + XmlNode xmlRoot = xmlDoc.DocumentElement; + Debug.Assert(xmlRoot.Name == ElemRoot); + + Stack vGroups = new Stack(); + vGroups.Push(pwStorage.RootGroup); + + int nNodeCount = xmlRoot.ChildNodes.Count; + for(int i = 0; i < nNodeCount; ++i) + { + XmlNode xmlChild = xmlRoot.ChildNodes[i]; + + if(xmlChild.Name == ElemGroup) + ReadGroup(xmlChild, vGroups, pwStorage); + else { Debug.Assert(false); } + + if(slLogger != null) + slLogger.SetProgress((uint)(((i + 1) * 100) / nNodeCount)); + } + } + + private static PwIcon ReadIcon(XmlNode xmlChild, PwIcon pwDefault) + { + int nIcon; + if(StrUtil.TryParseInt(XmlUtil.SafeInnerText(xmlChild), out nIcon)) + { + if((nIcon >= 0) && (nIcon < (int)PwIcon.Count)) return (PwIcon)nIcon; + } + else { Debug.Assert(false); } + + return pwDefault; + } + + private static void ReadGroup(XmlNode xmlNode, Stack vGroups, + PwDatabase pwStorage) + { + if(vGroups.Count == 0) { Debug.Assert(false); return; } + PwGroup pgParent = vGroups.Peek(); + + PwGroup pg = new PwGroup(true, true); + pgParent.AddGroup(pg, true); + vGroups.Push(pg); + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == ElemTitle) + pg.Name = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == ElemIcon) + pg.IconId = ReadIcon(xmlChild, pg.IconId); + else if(xmlChild.Name == ElemGroup) + ReadGroup(xmlChild, vGroups, pwStorage); + else if(xmlChild.Name == ElemEntry) + ReadEntry(xmlChild, pg, pwStorage); + else { Debug.Assert(false); } + } + + vGroups.Pop(); + } + + private static void ReadEntry(XmlNode xmlNode, PwGroup pgParent, + PwDatabase pwStorage) + { + PwEntry pe = new PwEntry(true, true); + pgParent.AddEntry(pe, true); + + string strAttachDesc = null, strAttachment = null; + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == ElemTitle) + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemUserName) + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemUrl) + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemPassword) + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemNotes) + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, + FilterSpecial(XmlUtil.SafeInnerXml(xmlChild)))); + else if(xmlChild.Name == ElemIcon) + pe.IconId = ReadIcon(xmlChild, pe.IconId); + else if(xmlChild.Name == ElemCreationTime) + pe.CreationTime = ParseTime(XmlUtil.SafeInnerText(xmlChild)); + else if(xmlChild.Name == ElemLastModTime) + pe.LastModificationTime = ParseTime(XmlUtil.SafeInnerText(xmlChild)); + else if(xmlChild.Name == ElemLastAccessTime) + pe.LastAccessTime = ParseTime(XmlUtil.SafeInnerText(xmlChild)); + else if(xmlChild.Name == ElemExpiryTime) + { + string strDate = XmlUtil.SafeInnerText(xmlChild); + pe.Expires = (strDate != ValueNever); + if(pe.Expires) pe.ExpiryTime = ParseTime(strDate); + } + else if(xmlChild.Name == ElemAttachDesc) + strAttachDesc = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == ElemAttachment) + strAttachment = XmlUtil.SafeInnerText(xmlChild); + else { Debug.Assert(false); } + } + + if(!string.IsNullOrEmpty(strAttachDesc) && (strAttachment != null)) + { + byte[] pbData = Convert.FromBase64String(strAttachment); + ProtectedBinary pb = new ProtectedBinary(false, pbData); + pe.Binaries.Set(strAttachDesc, pb); + } + } + + private static DateTime ParseTime(string str) + { + if(string.IsNullOrEmpty(str)) { Debug.Assert(false); return DateTime.UtcNow; } + if(str == "0000-00-00T00:00:00") return DateTime.UtcNow; + + DateTime dt; + if(DateTime.TryParse(str, out dt)) + return TimeUtil.ToUtc(dt, false); + + Debug.Assert(false); + return DateTime.UtcNow; + } + + private static string FilterSpecial(string strData) + { + string str = strData; + + str = str.Replace(@"
", MessageService.NewLine); + str = str.Replace(@"
", MessageService.NewLine); + + str = StrUtil.XmlToString(str); + return str; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/KeePassXml1x.cs b/src/KeePass/DataExchange/Formats/KeePassXml1x.cs new file mode 100644 index 0000000..fb432ba --- /dev/null +++ b/src/KeePass/DataExchange/Formats/KeePassXml1x.cs @@ -0,0 +1,204 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Serialization; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Collections; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class KeePassXml1x : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "KeePass XML (1.x)"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return PwDefs.ShortProductName; } } + + public override bool SupportsUuids { get { return true; } } + + private const string ElemRoot = "pwlist"; + private const string ElemEntry = "pwentry"; + private const string ElemGroup = "group"; + private const string ElemTitle = "title"; + private const string ElemUserName = "username"; + private const string ElemUrl = "url"; + private const string ElemPassword = "password"; + private const string ElemNotes = "notes"; + private const string ElemUuid = "uuid"; + private const string ElemImage = "image"; + private const string ElemCreationTime = "creationtime"; + private const string ElemLastModTime = "lastmodtime"; + private const string ElemLastAccessTime = "lastaccesstime"; + private const string ElemExpiryTime = "expiretime"; + private const string ElemAttachDesc = "attachdesc"; + private const string ElemAttachment = "attachment"; + + private const string AttribGroupTree = "tree"; + private const string AttribExpires = "expires"; + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + XmlDocument xmlDoc = XmlUtilEx.CreateXmlDocument(); + xmlDoc.Load(sInput); + + XmlNode xmlRoot = xmlDoc.DocumentElement; + Debug.Assert(xmlRoot.Name == ElemRoot); + + int nNodeCount = xmlRoot.ChildNodes.Count; + for(int i = 0; i < nNodeCount; ++i) + { + XmlNode xmlChild = xmlRoot.ChildNodes[i]; + + if(xmlChild.Name == ElemEntry) + ReadEntry(xmlChild, pwStorage); + else { Debug.Assert(false); } + + if(slLogger != null) + slLogger.SetProgress((uint)(((i + 1) * 100) / nNodeCount)); + } + } + + private static void ReadEntry(XmlNode xmlNode, PwDatabase pwStorage) + { + PwEntry pe = new PwEntry(true, true); + PwGroup pg = pwStorage.RootGroup; + + string strAttachDesc = null, strAttachment = null; + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == ElemGroup) + { + string strPreTree = null; + try + { + XmlNode xmlTree = xmlChild.Attributes.GetNamedItem(AttribGroupTree); + strPreTree = xmlTree.Value; + } + catch(Exception) { } + + string strLast = XmlUtil.SafeInnerText(xmlChild); + string strGroup = ((!string.IsNullOrEmpty(strPreTree)) ? + strPreTree + "\\" + strLast : strLast); + + pg = pwStorage.RootGroup.FindCreateSubTree(strGroup, + new string[1] { "\\" }, true); + } + else if(xmlChild.Name == ElemTitle) + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemUserName) + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemUrl) + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemPassword) + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemNotes) + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemUuid) + pe.SetUuid(new PwUuid(MemUtil.HexStringToByteArray( + XmlUtil.SafeInnerText(xmlChild))), false); + else if(xmlChild.Name == ElemImage) + { + int nImage; + if(int.TryParse(XmlUtil.SafeInnerText(xmlChild), out nImage)) + { + if((nImage >= 0) && (nImage < (int)PwIcon.Count)) + pe.IconId = (PwIcon)nImage; + else { Debug.Assert(false); } + } + else { Debug.Assert(false); } + } + else if(xmlChild.Name == ElemCreationTime) + pe.CreationTime = ParseTime(XmlUtil.SafeInnerText(xmlChild)); + else if(xmlChild.Name == ElemLastModTime) + pe.LastModificationTime = ParseTime(XmlUtil.SafeInnerText(xmlChild)); + else if(xmlChild.Name == ElemLastAccessTime) + pe.LastAccessTime = ParseTime(XmlUtil.SafeInnerText(xmlChild)); + else if(xmlChild.Name == ElemExpiryTime) + { + try + { + XmlNode xmlExpires = xmlChild.Attributes.GetNamedItem(AttribExpires); + if(StrUtil.StringToBool(xmlExpires.Value)) + { + pe.Expires = true; + pe.ExpiryTime = ParseTime(XmlUtil.SafeInnerText(xmlChild)); + } + else { Debug.Assert(ParseTime(XmlUtil.SafeInnerText(xmlChild)).Year == 2999); } + } + catch(Exception) { Debug.Assert(false); } + } + else if(xmlChild.Name == ElemAttachDesc) + strAttachDesc = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == ElemAttachment) + strAttachment = XmlUtil.SafeInnerText(xmlChild); + else { Debug.Assert(false); } + } + + if(!string.IsNullOrEmpty(strAttachDesc) && (strAttachment != null)) + { + byte[] pbData = Convert.FromBase64String(strAttachment); + ProtectedBinary pb = new ProtectedBinary(false, pbData); + pe.Binaries.Set(strAttachDesc, pb); + } + + pg.AddEntry(pe, true); + } + + private static DateTime ParseTime(string str) + { + if(string.IsNullOrEmpty(str)) { Debug.Assert(false); return DateTime.UtcNow; } + if(str == "0000-00-00T00:00:00") return DateTime.UtcNow; + + DateTime dt; + if(DateTime.TryParse(str, out dt)) + return TimeUtil.ToUtc(dt, false); + + Debug.Assert(false); + return DateTime.UtcNow; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/KeePassXml2x.cs b/src/KeePass/DataExchange/Formats/KeePassXml2x.cs new file mode 100644 index 0000000..d1b6f4b --- /dev/null +++ b/src/KeePass/DataExchange/Formats/KeePassXml2x.cs @@ -0,0 +1,73 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Collections; +using KeePassLib.Interfaces; +using KeePassLib.Serialization; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class KeePassXml2x : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return true; } } + + public override string FormatName { get { return "KeePass XML (2.x)"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return PwDefs.ShortProductName; } } + + public override bool SupportsUuids { get { return true; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + KdbxFile kdbx = new KdbxFile(pwStorage); + kdbx.Load(sInput, KdbxFormat.PlainXml, slLogger); + } + + public override bool Export(PwExportInfo pwExportInfo, Stream sOutput, + IStatusLogger slLogger) + { + PwDatabase pd = (pwExportInfo.ContextDatabase ?? new PwDatabase()); + + PwObjectList vDel = null; + if(!pwExportInfo.ExportDeletedObjects) + { + vDel = pd.DeletedObjects.CloneShallow(); + pd.DeletedObjects.Clear(); + } + + KdbxFile kdb = new KdbxFile(pd); + kdb.Save(sOutput, pwExportInfo.DataGroup, KdbxFormat.PlainXml, slLogger); + + // Restore deleted objects list + if(vDel != null) pd.DeletedObjects.Add(vDel); + + return true; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/KeeperJson16.cs b/src/KeePass/DataExchange/Formats/KeeperJson16.cs new file mode 100644 index 0000000..00d3afd --- /dev/null +++ b/src/KeePass/DataExchange/Formats/KeeperJson16.cs @@ -0,0 +1,134 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 16.0.0+ + internal sealed class KeeperJson16 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Keeper JSON"; } } + public override string DefaultExtension { get { return "json"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + using(StreamReader sr = new StreamReader(sInput, StrUtil.Utf8, true)) + { + string str = sr.ReadToEnd(); + if(string.IsNullOrEmpty(str)) { Debug.Assert(false); return; } + + CharStream cs = new CharStream(str); + JsonObject joRoot = new JsonObject(cs); + + JsonObject[] v = joRoot.GetValueArray("records"); + ImportRecords(v, pwStorage); + } + } + + private static void ImportRecords(JsonObject[] v, PwDatabase pd) + { + if(v == null) { Debug.Assert(false); return; } + + Dictionary dGroups = new Dictionary(); + string strGroupSep = MemUtil.ByteArrayToHexString(Guid.NewGuid().ToByteArray()); + string strBackspCode = MemUtil.ByteArrayToHexString(Guid.NewGuid().ToByteArray()); + + foreach(JsonObject jo in v) + { + if(jo == null) { Debug.Assert(false); continue; } + + PwEntry pe = new PwEntry(true, true); + + ImportUtil.AppendToField(pe, PwDefs.TitleField, + jo.GetValue("title"), pd); + ImportUtil.AppendToField(pe, PwDefs.UserNameField, + jo.GetValue("login"), pd); + ImportUtil.AppendToField(pe, PwDefs.PasswordField, + jo.GetValue("password"), pd); + ImportUtil.AppendToField(pe, PwDefs.UrlField, + jo.GetValue("login_url"), pd); + ImportUtil.AppendToField(pe, PwDefs.NotesField, + jo.GetValue("notes"), pd); + + JsonObject joCustom = jo.GetValue("custom_fields"); + if(joCustom != null) + { + foreach(KeyValuePair kvp in joCustom.Items) + { + string strValue = (kvp.Value as string); + if(strValue == null) { Debug.Assert(false); continue; } + + if(kvp.Key == "TFC:Keeper") + { + try { EntryUtil.ImportOtpAuth(pe, strValue, pd); } + catch(Exception) { Debug.Assert(false); } + } + else ImportUtil.AppendToField(pe, kvp.Key, strValue, pd); + } + } + + PwGroup pg = null; + JsonObject[] vFolders = jo.GetValueArray("folders"); + if((vFolders != null) && (vFolders.Length >= 1)) + { + JsonObject joFolder = vFolders[0]; + if(joFolder != null) + { + string strGroup = joFolder.GetValue("folder"); + if(!string.IsNullOrEmpty(strGroup)) + { + strGroup = strGroup.Replace("\\\\", strBackspCode); + strGroup = strGroup.Replace("\\", strGroupSep); + strGroup = strGroup.Replace(strBackspCode, "\\"); + + if(!dGroups.TryGetValue(strGroup, out pg)) + { + pg = pd.RootGroup.FindCreateSubTree(strGroup, + new string[] { strGroupSep }, true); + dGroups[strGroup] = pg; + } + } + else { Debug.Assert(false); } + } + else { Debug.Assert(false); } + } + if(pg == null) pg = pd.RootGroup; + + pg.AddEntry(pe, true); + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/KeyFolderXml1.cs b/src/KeePass/DataExchange/Formats/KeyFolderXml1.cs new file mode 100644 index 0000000..f1c962d --- /dev/null +++ b/src/KeePass/DataExchange/Formats/KeyFolderXml1.cs @@ -0,0 +1,186 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1.22+ + internal sealed class KeyFolderXml1 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Key Folder XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + using(StreamReader sr = new StreamReader(sInput, Encoding.UTF8, true)) + { + XmlDocument d = XmlUtilEx.CreateXmlDocument(); + d.LoadXml(sr.ReadToEnd()); + + ImportGroup(d.DocumentElement, pwStorage.RootGroup, pwStorage); + } + } + + private static void ImportGroup(XmlNode xnFolder, PwGroup pg, PwDatabase pd) + { + foreach(XmlNode xn in xnFolder.ChildNodes) + { + switch(xn.Name) + { + case "name": + pg.Name = XmlUtil.SafeInnerText(xn); + break; + + case "folder": + PwGroup pgSub = new PwGroup(true, true); + pg.AddGroup(pgSub, true); + ImportGroup(xn, pgSub, pd); + break; + + case "item": + ImportEntry(xn, pg, pd); + break; + + default: + Debug.Assert(false); // Unknown node + break; + } + } + } + + private static void ImportEntry(XmlNode xnItem, PwGroup pg, PwDatabase pd) + { + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + bool bFirstUrl = true; + DateTime? odt; + + foreach(XmlNode xn in xnItem.ChildNodes) + { + switch(xn.Name) + { + case "name": + ImportUtil.AppendToField(pe, PwDefs.TitleField, + XmlUtil.SafeInnerText(xn), pd); + break; + + case "username": + ImportUtil.AppendToField(pe, PwDefs.UserNameField, + XmlUtil.SafeInnerText(xn), pd); + break; + + case "password": + ImportUtil.AppendToField(pe, PwDefs.PasswordField, + XmlUtil.SafeInnerText(xn), pd); + break; + + case "link": + string strType = GetChildValue(xn, "type"); + string strName = GetChildValue(xn, "name"); + string strUrl = GetChildValue(xn, "url"); + if(string.IsNullOrEmpty(strUrl)) continue; + + if(bFirstUrl) + { + strName = PwDefs.UrlField; + bFirstUrl = false; + } + + if(strType == "mail") strUrl = "mailto:" + strUrl; + + ImportUtil.CreateFieldWithIndex(pe.Strings, strName, + strUrl, pd, false); + break; + + case "note": + ImportUtil.AppendToField(pe, PwDefs.NotesField, + XmlUtil.SafeInnerText(xn), pd); + break; + + case "created": + odt = TryParseDate(xn); + if(odt.HasValue) pe.CreationTime = odt.Value; + break; + + case "changed": + odt = TryParseDate(xn); + if(odt.HasValue) pe.LastModificationTime = odt.Value; + break; + + case "expire": + odt = TryParseDate(xn); + if(odt.HasValue) + { + pe.Expires = true; + pe.ExpiryTime = odt.Value; + } + break; + + default: + Debug.Assert(false); // Unknown node + break; + } + } + } + + private static string GetChildValue(XmlNode xn, string strChildName) + { + XmlNode xnChild = XmlUtil.FindMultiChild(xn.ChildNodes, strChildName, 0); + if(xnChild == null) { Debug.Assert(false); return string.Empty; } + return XmlUtil.SafeInnerText(xnChild); + } + + private static DateTime? TryParseDate(XmlNode xn) + { + string str = XmlUtil.SafeInnerText(xn); + if(string.IsNullOrEmpty(str)) { Debug.Assert(false); return null; } + + DateTime dt; + if(!DateTime.TryParseExact(str, @"dd'.'MM'.'yyyy", + CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out dt)) + { + Debug.Assert(false); + if(!StrUtil.TryParseDateTime(str, out dt)) + return null; + } + + return TimeUtil.ToUtc(dt, false); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/LastPassCsv2.cs b/src/KeePass/DataExchange/Formats/LastPassCsv2.cs new file mode 100644 index 0000000..ba5bf09 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/LastPassCsv2.cs @@ -0,0 +1,154 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 2.0.2-4.65.0.5+ + internal sealed class LastPassCsv2 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "LastPass CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return false; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, StrUtil.Utf8, true); + string strData = sr.ReadToEnd(); + sr.Close(); + + // The Chrome extension of LastPass 4.1.35 encodes some + // special characters as XML entities; the web version and + // the Firefox extension do not do this + strData = strData.Replace(@"<", @"<"); + strData = strData.Replace(@">", @">"); + strData = strData.Replace(@"&", @"&"); + + CsvOptions opt = new CsvOptions(); + opt.BackslashIsEscape = false; + + CsvStreamReaderEx csr = new CsvStreamReaderEx(strData, opt); + ImportCsv(csr, pwStorage); + } + + private static void ImportCsv(CsvStreamReaderEx csr, PwDatabase pd) + { + CsvTableEntryReader ctr = new CsvTableEntryReader(pd); + + const string strColUrl = "url"; + + Predicate fIsSecNote = delegate(string[] vRow) + { + string str = ctr.GetData(vRow, strColUrl, string.Empty); + return str.Equals("http://sn", StrUtil.CaseIgnoreCmp); + }; + + ctr.SetDataAppend("name", PwDefs.TitleField); + ctr.SetDataAppend("username", PwDefs.UserNameField); + ctr.SetDataAppend("password", PwDefs.PasswordField); + + ctr.SetDataHandler(strColUrl, delegate(string str, PwEntry pe, + string[] vContextRow) + { + if(!fIsSecNote(vContextRow)) + ImportUtil.AppendToField(pe, PwDefs.UrlField, str, pd); + }); + + ctr.SetDataHandler("extra", delegate(string str, PwEntry pe, + string[] vContextRow) + { + if(fIsSecNote(vContextRow) && str.StartsWith("NoteType:", + StrUtil.CaseIgnoreCmp)) + { + AddNoteFields(pe, str, pd); + return; + } + + ImportUtil.AppendToField(pe, PwDefs.NotesField, str, pd); + }); + + ctr.SetDataHandler("grouping", delegate(string str, PwEntry pe, + string[] vContextRow) + { + if(str.Length == 0) return; + + PwGroup pg = pd.RootGroup.FindCreateSubTree(str, + new string[1] { "\\" }, true); + pg.AddEntry(pe, true); + }); + + ctr.SetDataHandler("fav", delegate(string str, PwEntry pe, + string[] vContextRow) + { + if(StrUtil.StringToBool(str)) pe.AddTag(PwDefs.FavoriteTag); + }); + + ctr.Read(csr); + } + + private static void AddNoteFields(PwEntry pe, string strNotes, + PwDatabase pd) + { + string strData = StrUtil.NormalizeNewLines(strNotes, false); + string[] vLines = strData.Split('\n'); + + string strFieldName = PwDefs.NotesField; + bool bNotesFound = false; + foreach(string strLine in vLines) + { + int iFieldLen = strLine.IndexOf(':'); + int iDataOffset = 0; + if((iFieldLen > 0) && !bNotesFound) + { + string strRaw = strLine.Substring(0, iFieldLen).Trim(); + string strField = ImportUtil.MapNameToStandardField(strRaw, false); + if(string.IsNullOrEmpty(strField)) strField = strRaw; + + if(strField.Length != 0) + { + strFieldName = strField; + iDataOffset = iFieldLen + 1; + + bNotesFound |= (strRaw == "Notes"); // Not PwDefs.NotesField + } + } + + ImportUtil.AppendToField(pe, strFieldName, strLine.Substring( + iDataOffset), pd); + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/MSecureCsv355.cs b/src/KeePass/DataExchange/Formats/MSecureCsv355.cs new file mode 100644 index 0000000..535e339 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/MSecureCsv355.cs @@ -0,0 +1,318 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 3.5.5+ + internal sealed class MSecureCsv355 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "mSecure CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return false; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default, true); + string str = sr.ReadToEnd(); + sr.Close(); + + CsvOptions opt = new CsvOptions(); + + // Backslashes are not escaped, even though "\\n" is used + // to encode new-line characters + opt.BackslashIsEscape = false; + opt.FieldSeparator = ';'; + + CsvStreamReaderEx csr = new CsvStreamReaderEx(str, opt); + Dictionary dGroups = new Dictionary(); + + while(true) + { + string[] vLine = csr.ReadLine(); + if(vLine == null) break; + + AddEntry(vLine, pwStorage, dGroups); + } + } + + private static void AddEntry(string[] vLine, PwDatabase pd, + Dictionary dGroups) + { + if(vLine.Length < 2) return; + + string strGroup = vLine[0]; + PwGroup pg; + if(string.IsNullOrEmpty(strGroup)) + pg = pd.RootGroup; + else + { + if(!dGroups.TryGetValue(strGroup, out pg)) + { + pg = new PwGroup(true, true); + pg.Name = strGroup; + + pd.RootGroup.AddGroup(pg, true); + dGroups[strGroup] = pg; + } + } + + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + MsAppend(pe, PwDefs.TitleField, vLine, 2, pd); + MsAppend(pe, PwDefs.NotesField, vLine, 3, pd); + + string strType = vLine[1]; + int i = 3; + DateTime dt; + + switch(strType) + { + case "Bank Accounts": + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + MsAppend(pe, PwDefs.PasswordField, vLine, ++i, pd); + MsAppend(pe, "Name", vLine, ++i, pd); + MsAppend(pe, "Branch", vLine, ++i, pd); + MsAppend(pe, "Phone No.", vLine, ++i, pd); + + pe.IconId = PwIcon.Money; + break; + + case "Birthdays": + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + + pe.IconId = PwIcon.UserCommunication; + break; + + case "Calling Cards": + case "Social Security": + case "Voice Mail": + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + MsAppend(pe, PwDefs.PasswordField, vLine, ++i, pd); + + pe.IconId = PwIcon.UserKey; + break; + + case "Clothes Size": + MsAppend(pe, "Shirt Size", vLine, ++i, pd); + MsAppend(pe, "Pant Size", vLine, ++i, pd); + MsAppend(pe, "Shoe Size", vLine, ++i, pd); + MsAppend(pe, "Dress Size", vLine, ++i, pd); + break; + + case "Combinations": + MsAppend(pe, PwDefs.PasswordField, vLine, ++i, pd); + break; + + case "Credit Cards": + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + + ++i; + if((vLine.Length > i) && StrUtil.TryParseDateTime( + vLine[i], out dt)) + { + pe.Expires = true; + pe.ExpiryTime = TimeUtil.ToUtc(dt, false); + } + else MsAppend(pe, "Expiration", vLine, i, pd); + + MsAppend(pe, "Name", vLine, ++i, pd); + MsAppend(pe, PwDefs.PasswordField, vLine, ++i, pd); + MsAppend(pe, "Bank", vLine, ++i, pd); + MsAppend(pe, "Security Code", vLine, ++i, pd); + + pe.IconId = PwIcon.Money; + break; + + case "Email Accounts": + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + MsAppend(pe, PwDefs.PasswordField, vLine, ++i, pd); + MsAppend(pe, "POP3 Host", vLine, ++i, pd); + MsAppend(pe, "SMTP Host", vLine, ++i, pd); + + pe.IconId = PwIcon.EMail; + break; + + case "Frequent Flyer": + MsAppend(pe, "Number", vLine, ++i, pd); + MsAppend(pe, PwDefs.UrlField, vLine, ++i, pd); + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + MsAppend(pe, PwDefs.PasswordField, vLine, ++i, pd); + MsAppend(pe, "Mileage", vLine, ++i, pd); + break; + + case "Identity": + ++i; + MsAppend(pe, PwDefs.UserNameField, vLine, i + 1, pd); // Last name + MsAppend(pe, PwDefs.UserNameField, vLine, i, pd); // First name + ++i; + + MsAppend(pe, "Nick Name", vLine, ++i, pd); + MsAppend(pe, "Company", vLine, ++i, pd); + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + MsAppend(pe, "Address", vLine, ++i, pd); + MsAppend(pe, "Address 2", vLine, ++i, pd); + MsAppend(pe, "City", vLine, ++i, pd); + MsAppend(pe, "State", vLine, ++i, pd); + MsAppend(pe, "Country", vLine, ++i, pd); + MsAppend(pe, "Zip", vLine, ++i, pd); + MsAppend(pe, "Home Phone", vLine, ++i, pd); + MsAppend(pe, "Office Phone", vLine, ++i, pd); + MsAppend(pe, "Mobile Phone", vLine, ++i, pd); + MsAppend(pe, "E-Mail", vLine, ++i, pd); + MsAppend(pe, "E-Mail 2", vLine, ++i, pd); + MsAppend(pe, "Skype", vLine, ++i, pd); + MsAppend(pe, PwDefs.UrlField, vLine, ++i, pd); + + pe.IconId = PwIcon.UserCommunication; + break; + + case "Insurance": + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + MsAppend(pe, "Group No.", vLine, ++i, pd); + MsAppend(pe, "Insured", vLine, ++i, pd); + MsAppend(pe, "Date", vLine, ++i, pd); + MsAppend(pe, "Phone No.", vLine, ++i, pd); + + pe.IconId = PwIcon.Certificate; + break; + + case "Memberships": + MsAppend(pe, PwDefs.PasswordField, vLine, ++i, pd); + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + MsAppend(pe, "Date", vLine, ++i, pd); + + pe.IconId = PwIcon.UserKey; + break; + + case "Note": + pe.IconId = PwIcon.Notepad; + break; + + case "Passport": + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + MsAppend(pe, PwDefs.PasswordField, vLine, ++i, pd); + MsAppend(pe, "Type", vLine, ++i, pd); + MsAppend(pe, "Issuing Country", vLine, ++i, pd); + MsAppend(pe, "Issuing Authority", vLine, ++i, pd); + MsAppend(pe, "Nationality", vLine, ++i, pd); + + ++i; + if((vLine.Length > i) && StrUtil.TryParseDateTime( + vLine[i], out dt)) + { + pe.Expires = true; + pe.ExpiryTime = TimeUtil.ToUtc(dt, false); + } + else MsAppend(pe, "Expiration", vLine, i, pd); + + MsAppend(pe, "Place of Birth", vLine, ++i, pd); + + pe.IconId = PwIcon.Certificate; + break; + + case "Prescriptions": + MsAppend(pe, "RX Number", vLine, ++i, pd); + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + MsAppend(pe, "Doctor", vLine, ++i, pd); + MsAppend(pe, "Pharmacy", vLine, ++i, pd); + MsAppend(pe, "Phone No.", vLine, ++i, pd); + break; + + case "Registration Codes": + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + MsAppend(pe, "Date", vLine, ++i, pd); + + pe.IconId = PwIcon.UserKey; + break; + + case "Unassigned": + MsAppend(pe, "Field 1", vLine, ++i, pd); + MsAppend(pe, "Field 2", vLine, ++i, pd); + MsAppend(pe, "Field 3", vLine, ++i, pd); + MsAppend(pe, "Field 4", vLine, ++i, pd); + MsAppend(pe, "Field 5", vLine, ++i, pd); + MsAppend(pe, "Field 6", vLine, ++i, pd); + break; + + case "Vehicle Info": + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + MsAppend(pe, PwDefs.PasswordField, vLine, ++i, pd); + MsAppend(pe, "Date Purchased", vLine, ++i, pd); + MsAppend(pe, "Tire Size", vLine, ++i, pd); + break; + + case "Web Logins": + MsAppend(pe, PwDefs.UrlField, vLine, ++i, pd); + MsAppend(pe, PwDefs.UserNameField, vLine, ++i, pd); + MsAppend(pe, PwDefs.PasswordField, vLine, ++i, pd); + break; + + default: + Debug.Assert(false); + break; + } + Debug.Assert((i + 1) == vLine.Length); + } + + private static void MsAppend(PwEntry pe, string strFieldName, + string[] vLine, int iIndex, PwDatabase pdContext) + { + if(iIndex >= vLine.Length) { Debug.Assert(false); return; } + + string strValue = vLine[iIndex]; + if(string.IsNullOrEmpty(strValue)) return; + + strValue = strValue.Replace("\\r\\n", "\\n"); + strValue = strValue.Replace("\\r", "\\n"); + + if(PwDefs.IsStandardField(strFieldName) && + (strFieldName != PwDefs.NotesField)) + { + while(strValue.EndsWith("\\n")) + { + strValue = strValue.Substring(0, strValue.Length - 2); + } + + strValue = strValue.Replace("\\n", ", "); + } + else strValue = strValue.Replace("\\n", MessageService.NewLine); + + ImportUtil.AppendToField(pe, strFieldName, strValue, pdContext); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/MozillaBookmarksHtml100.cs b/src/KeePass/DataExchange/Formats/MozillaBookmarksHtml100.cs new file mode 100644 index 0000000..e5ff6c5 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/MozillaBookmarksHtml100.cs @@ -0,0 +1,413 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.Globalization; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Cryptography; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1.00 + internal sealed class MozillaBookmarksHtml100 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return true; } } + + public override string FormatName { get { return "Mozilla Bookmarks HTML"; } } + public override string DefaultExtension { get { return "html|htm"; } } + public override string ApplicationGroup { get { return KPRes.Browser; } } + + // ////////////////////////////////////////////////////////////////// + // Import + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.UTF8); + string strContent = sr.ReadToEnd(); + sr.Close(); + + if(strContent.IndexOf(@"") < 0) + throw new FormatException("Invalid DOCTYPE!"); + + strContent = strContent.Replace(@"", string.Empty); + strContent = strContent.Replace(@"
", string.Empty); + strContent = strContent.Replace(@"

", string.Empty); + // strContent = strContent.Replace(@"

", string.Empty); + // strContent = strContent.Replace(@"
", string.Empty); + // strContent = strContent.Replace(@"
", string.Empty); + strContent = strContent.Replace(@"
", string.Empty); + + // int nOffset = strContent.IndexOf('&'); + // while(nOffset >= 0) + // { + // string str4 = strContent.Substring(nOffset, 4); + // string str5 = strContent.Substring(nOffset, 5); + // string str6 = strContent.Substring(nOffset, 6); + // if((str6 != @" ") && (str5 != @"&") && (str4 != @"<") && + // (str4 != @">") && (str5 != @"'") && (str6 != @""")) + // { + // strContent = strContent.Remove(nOffset, 1); + // strContent = strContent.Insert(nOffset, @"&"); + // } + // else nOffset = strContent.IndexOf('&', nOffset + 1); + // } + + string[] vPreserve = new string[] { @" ", @"&", @"<", + @">", @"'", @""" }; + Dictionary dPreserve = new Dictionary(); + CryptoRandom cr = CryptoRandom.Instance; + foreach(string strPreserve in vPreserve) + { + string strCode = Convert.ToBase64String(cr.GetRandomBytes(16)); + Debug.Assert(strCode.IndexOf('&') < 0); + dPreserve[strPreserve] = strCode; + + strContent = strContent.Replace(strPreserve, strCode); + } + strContent = strContent.Replace(@"&", @"&"); + foreach(KeyValuePair kvpPreserve in dPreserve) + { + strContent = strContent.Replace(kvpPreserve.Value, kvpPreserve.Key); + } + + // Terminate
s + int iDD = -1; + while(true) + { + iDD = strContent.IndexOf(@"
", iDD + 1); + if(iDD < 0) break; + + int iNextTag = strContent.IndexOf('<', iDD + 1); + if(iNextTag <= 0) { Debug.Assert(false); break; } + + strContent = strContent.Insert(iNextTag, @"
"); + } + + strContent = "" + strContent + ""; + + byte[] pbFixedData = StrUtil.Utf8.GetBytes(strContent); + MemoryStream msFixed = new MemoryStream(pbFixedData, false); + + XmlDocument xmlDoc = XmlUtilEx.CreateXmlDocument(); + xmlDoc.Load(msFixed); + msFixed.Close(); + + XmlNode xmlRoot = xmlDoc.DocumentElement; + foreach(XmlNode xmlChild in xmlRoot) + { + if(xmlChild.Name == "META") + ImportMeta(xmlChild, pwStorage); + } + } + + private static void ImportMeta(XmlNode xmlNode, PwDatabase pwStorage) + { + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == "DL") + ImportGroup(xmlChild, pwStorage, pwStorage.RootGroup); + else if(xmlChild.Name == "TITLE") { } + else if(xmlChild.Name == "H1") { } + else { Debug.Assert(false); } + } + } + + private static void ImportGroup(XmlNode xmlNode, PwDatabase pwStorage, + PwGroup pg) + { + PwGroup pgSub = pg; + PwEntry pe = null; + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == "A") + { + pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, + XmlUtil.SafeInnerText(xmlChild))); + + XmlNode xnUrl = xmlChild.Attributes.GetNamedItem("HREF"); + if((xnUrl != null) && (xnUrl.Value != null)) + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, xnUrl.Value)); + else { Debug.Assert(false); } + + // pe.Strings.Set("RDF_ID", new ProtectedString( + // false, xmlChild.Attributes.GetNamedItem("ID").Value)); + + ImportIcon(xmlChild, pe, pwStorage); + + XmlNode xnTags = xmlChild.Attributes.GetNamedItem("TAGS"); + if((xnTags != null) && (xnTags.Value != null)) + StrUtil.AddTags(pe.Tags, xnTags.Value.Split(',')); + } + else if(xmlChild.Name == "DD") + { + if(pe != null) + ImportUtil.AppendToField(pe, PwDefs.NotesField, + XmlUtil.SafeInnerText(xmlChild).Trim(), pwStorage); + else { Debug.Assert(false); } + } + else if(xmlChild.Name == "H3") + { + string strGroup = XmlUtil.SafeInnerText(xmlChild); + if(strGroup.Length == 0) { Debug.Assert(false); pgSub = pg; } + else + { + pgSub = new PwGroup(true, true, strGroup, PwIcon.Folder); + pg.AddGroup(pgSub, true); + } + } + else if(xmlChild.Name == "DL") + ImportGroup(xmlChild, pwStorage, pgSub); + else { Debug.Assert(false); } + } + } + + private static void ImportIcon(XmlNode xn, PwEntry pe, PwDatabase pd) + { + XmlNode xnIcon = xn.Attributes.GetNamedItem("ICON"); + if(xnIcon == null) return; + + string strIcon = xnIcon.Value; + if(!StrUtil.IsDataUri(strIcon)) { Debug.Assert(false); return; } + + try + { + byte[] pbImage = StrUtil.DataUriToData(strIcon); + if((pbImage == null) || (pbImage.Length == 0)) { Debug.Assert(false); return; } + + Image img = GfxUtil.LoadImage(pbImage); + if(img == null) { Debug.Assert(false); return; } + + byte[] pbPng; + int wMax = PwCustomIcon.MaxWidth; + int hMax = PwCustomIcon.MaxHeight; + if((img.Width <= wMax) && (img.Height <= hMax)) + { + using(MemoryStream msPng = new MemoryStream()) + { + img.Save(msPng, ImageFormat.Png); + pbPng = msPng.ToArray(); + } + } + else + { + using(Image imgSc = GfxUtil.ScaleImage(img, wMax, hMax)) + { + using(MemoryStream msPng = new MemoryStream()) + { + imgSc.Save(msPng, ImageFormat.Png); + pbPng = msPng.ToArray(); + } + } + } + img.Dispose(); + + PwUuid pwUuid = null; + int iEx = pd.GetCustomIconIndex(pbPng); + if(iEx >= 0) pwUuid = pd.CustomIcons[iEx].Uuid; + else + { + pwUuid = new PwUuid(true); + pd.CustomIcons.Add(new PwCustomIcon(pwUuid, pbPng)); + pd.UINeedsIconUpdate = true; + pd.Modified = true; + } + pe.CustomIconUuid = pwUuid; + } + catch(Exception) { Debug.Assert(false); } + } + + // ////////////////////////////////////////////////////////////////// + // Export + + public override bool Export(PwExportInfo pwExportInfo, Stream sOutput, + IStatusLogger slLogger) + { + StringBuilder sb = new StringBuilder(); + + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine("Bookmarks"); + sb.AppendLine("

Bookmarks

"); + sb.AppendLine(); + sb.AppendLine("

"); + + ExportGroup(sb, pwExportInfo.DataGroup, 1, pwExportInfo.ContextDatabase); + + sb.AppendLine("

"); + + string strData = sb.ToString(); + strData = StrUtil.NormalizeNewLines(strData, false); + + byte[] pbData = StrUtil.Utf8.GetBytes(strData); + sOutput.Write(pbData, 0, pbData.Length); + sOutput.Close(); + return true; + } + + private static void ExportGroup(StringBuilder sb, PwGroup pg, uint uIndent, + PwDatabase pd) + { + ExportData(sb, uIndent, "
", pg.Name, true, "
", true); + ExportData(sb, uIndent, "

", null, false, null, true); + + foreach(PwGroup pgSub in pg.Groups) + { + ExportGroup(sb, pgSub, uIndent + 1, pd); + } + +#if DEBUG + List l = new List(); + l.Add("Tag 1"); + l.Add("Tag 2"); + Debug.Assert(StrUtil.TagsToString(l, false) == "Tag 1;Tag 2"); +#endif + + foreach(PwEntry pe in pg.Entries) + { + string strUrl = pe.Strings.ReadSafe(PwDefs.UrlField); + if(strUrl.Length == 0) continue; + + // Encode only when really required; '&' does not need + // to be encoded + bool bEncUrl = (strUrl.IndexOfAny(new char[] { + '\"', '<', '>' }) >= 0); + + ExportData(sb, uIndent + 1, "

0) + { + string strTags = StrUtil.TagsToString(pe.Tags, false); + strTags = strTags.Replace(';', ','); // Without space + + ExportData(sb, 0, " TAGS=\"", strTags, true, "\"", false); + } + + string strTitle = pe.Strings.ReadSafe(PwDefs.TitleField); + if(strTitle.Length == 0) strTitle = strUrl; + + ExportData(sb, 0, ">", strTitle, true, "", true); + + string strNotes = pe.Strings.ReadSafe(PwDefs.NotesField); + if(strNotes.Length > 0) + ExportData(sb, uIndent + 1, "
", strNotes, true, null, true); + } + + ExportData(sb, uIndent, "

", null, false, null, true); + } + + private static void ExportData(StringBuilder sb, uint uIndent, + string strRawPrefix, string strData, bool bEncodeData, + string strRawSuffix, bool bNewLine) + { + if(uIndent > 0) sb.Append(new string(' ', 4 * (int)uIndent)); + if(strRawPrefix != null) sb.Append(strRawPrefix); + + if(strData != null) + { + if(bEncodeData) + { + // Apply HTML encodings except '\n' -> "
" + const string strNewLine = "899A13DDD6BA4B24BA2CA6C756E7B936"; + string str = StrUtil.NormalizeNewLines(strData, false); + str = str.Replace("\n", strNewLine); + str = StrUtil.StringToHtml(str); + str = str.Replace(strNewLine, "\n"); + + sb.Append(str); + } + else sb.Append(strData); + } + + if(strRawSuffix != null) sb.Append(strRawSuffix); + + if(bNewLine) sb.AppendLine(); + } + + private static void ExportTimes(StringBuilder sb, ITimeLogger tl) + { + if(tl == null) { Debug.Assert(false); return; } + + try + { + long t = (long)TimeUtil.SerializeUnix(tl.CreationTime); + ExportData(sb, 0, " ADD_DATE=\"", t.ToString( + NumberFormatInfo.InvariantInfo), false, "\"", false); + + t = (long)TimeUtil.SerializeUnix(tl.LastModificationTime); + ExportData(sb, 0, " LAST_MODIFIED=\"", t.ToString( + NumberFormatInfo.InvariantInfo), false, "\"", false); + } + catch(Exception) { Debug.Assert(false); } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/MozillaBookmarksJson100.cs b/src/KeePass/DataExchange/Formats/MozillaBookmarksJson100.cs new file mode 100644 index 0000000..c3ba62b --- /dev/null +++ b/src/KeePass/DataExchange/Formats/MozillaBookmarksJson100.cs @@ -0,0 +1,199 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1.00 + internal sealed class MozillaBookmarksJson100 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Mozilla Bookmarks JSON"; } } + public override string DefaultExtension { get { return "json"; } } + public override string ApplicationGroup { get { return KPRes.Browser; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + JsonObject jo; + using(StreamReader sr = new StreamReader(sInput, StrUtil.Utf8, true)) + { + string strJson = sr.ReadToEnd(); + if(string.IsNullOrEmpty(strJson)) return; + + jo = new JsonObject(new CharStream(strJson)); + } + + Dictionary> dTags = + new Dictionary>(); + List lCreatedEntries = new List(); + + AddObject(pwStorage.RootGroup, jo, pwStorage, false, dTags, + lCreatedEntries); + + // Tags support (old versions) + foreach(PwEntry pe in lCreatedEntries) + { + string strUri = pe.Strings.ReadSafe(PwDefs.UrlField); + if(strUri.Length == 0) continue; + + foreach(KeyValuePair> kvp in dTags) + { + foreach(string strTagUri in kvp.Value) + { + if(strUri.Equals(strTagUri, StrUtil.CaseIgnoreCmp)) + pe.AddTag(kvp.Key); + } + } + } + } + + private static void AddObject(PwGroup pgStorage, JsonObject jo, + PwDatabase pwContext, bool bCreateSubGroups, + Dictionary> dTags, List lCreatedEntries) + { + string strRoot = jo.GetValue("root"); + if(string.Equals(strRoot, "tagsFolder", StrUtil.CaseIgnoreCmp)) + { + ImportTags(jo, dTags); + return; + } + + JsonObject[] v = jo.GetValueArray("children"); + if(v != null) + { + PwGroup pgNew; + if(bCreateSubGroups) + { + pgNew = new PwGroup(true, true); + pgNew.Name = (jo.GetValue("title") ?? string.Empty); + + pgStorage.AddGroup(pgNew, true); + } + else pgNew = pgStorage; + + foreach(JsonObject joSub in v) + { + if(joSub == null) { Debug.Assert(false); continue; } + + AddObject(pgNew, joSub, pwContext, true, dTags, lCreatedEntries); + } + + return; + } + + PwEntry pe = new PwEntry(true, true); + + // SetString(pe, "Index", false, jo, "index"); + SetString(pe, PwDefs.TitleField, pwContext.MemoryProtection.ProtectTitle, + jo, "title"); + // SetString(pe, "ID", false, jo, "id"); + SetString(pe, PwDefs.UrlField, pwContext.MemoryProtection.ProtectUrl, + jo, "uri"); + // SetString(pe, "CharSet", false, jo, "charset"); + + foreach(JsonObject joAnno in jo.GetValueArray("annos", true)) + { + if(joAnno == null) { Debug.Assert(false); continue; } + + string strName = joAnno.GetValue("name"); + string strValue = joAnno.GetValue("value"); + + if((strName == "bookmarkProperties/description") && + !string.IsNullOrEmpty(strValue)) + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwContext.MemoryProtection.ProtectNotes, strValue)); + } + + // Tags support (new versions) + string strTags = jo.GetValue("tags"); + if(!string.IsNullOrEmpty(strTags)) + StrUtil.AddTags(pe.Tags, strTags.Split(',')); + + string strKeyword = jo.GetValue("keyword"); + if(!string.IsNullOrEmpty(strKeyword)) + ImportUtil.AppendToField(pe, "Keyword", strKeyword, pwContext); + + if((pe.Strings.ReadSafe(PwDefs.TitleField).Length != 0) || + (pe.Strings.ReadSafe(PwDefs.UrlField).Length != 0)) + { + pgStorage.AddEntry(pe, true); + lCreatedEntries.Add(pe); + } + } + + private static void SetString(PwEntry pe, string strEntryKey, bool bProtect, + JsonObject jo, string strObjectKey) + { + string str = jo.GetValue(strObjectKey); + if(string.IsNullOrEmpty(str)) return; + + pe.Strings.Set(strEntryKey, new ProtectedString(bProtect, str)); + } + + // Tags support (old versions) + private static void ImportTags(JsonObject joTagsRoot, + Dictionary> dTags) + { + JsonObject[] v = joTagsRoot.GetValueArray("children"); + if(v == null) { Debug.Assert(false); return; } + + foreach(JsonObject joTag in v) + { + if(joTag == null) { Debug.Assert(false); continue; } + + string strName = joTag.GetValue("title"); + if(string.IsNullOrEmpty(strName)) { Debug.Assert(false); continue; } + + List lUris; + dTags.TryGetValue(strName, out lUris); + if(lUris == null) + { + lUris = new List(); + dTags[strName] = lUris; + } + + JsonObject[] vUris = joTag.GetValueArray("children"); + if(vUris == null) { Debug.Assert(false); continue; } + + foreach(JsonObject joUri in vUris) + { + if(joUri == null) { Debug.Assert(false); continue; } + + string strUri = joUri.GetValue("uri"); + if(!string.IsNullOrEmpty(strUri)) lUris.Add(strUri); + } + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/NPasswordNpw102.cs b/src/KeePass/DataExchange/Formats/NPasswordNpw102.cs new file mode 100644 index 0000000..f218b98 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/NPasswordNpw102.cs @@ -0,0 +1,242 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1.0.2.41-1.0.2.44+ + internal sealed class NPasswordNpw102 : FileFormatProvider + { + private const string ElemGroup = "folder"; + + private const string ElemEntry = "record"; + private const string ElemEntryUser = "login"; + private const string ElemEntryPassword = "pass"; + private const string ElemEntryPassword2 = "additional"; + private const string ElemEntryUrl = "link"; + private const string ElemEntryNotes = "comments"; + private const string ElemEntryExpires = "expires"; + private const string ElemEntryExpiryTime = "expire_date"; + + private const string ElemEntryUnsupp0 = "data"; + private const string ElemEntryUnsupp1 = "script"; + + private const string ElemAutoType = "macro"; + private const string ElemAutoTypePlh = "item"; + + private const string ElemTags = "keywords"; + + private const string ElemUnsupp0 = "settings"; + + private static readonly string Password2Key = PwDefs.PasswordField + " 2"; + + private static Dictionary m_dAutoTypeConv = null; + + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "nPassword NPW"; } } + public override string DefaultExtension { get { return "npw"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + if(m_dAutoTypeConv == null) + { + Dictionary d = new Dictionary(); + + d[@"{login}"] = @"{USERNAME}"; + d[@"{password}"] = @"{PASSWORD}"; + d[@"{additional key}"] = @"{S:" + Password2Key + @"}"; + d[@"{url}"] = @"{URL}"; + d[@"{memo}"] = @"{NOTES}"; + d[@"[tab]"] = @"{TAB}"; + d[@"[enter]"] = @"{ENTER}"; + + m_dAutoTypeConv = d; + } + + byte[] pbData = MemUtil.Read(sInput); + + // nPassword has options for encrypting/compressing exports, + // which are unsupported; the file must start with " 0) + { + if(pg.Name.Length > 0) pg.Name += " "; + pg.Name += strValue; + } + } + else if(xmlChild.Name == ElemGroup) + ReadGroup(xmlChild, pg, pwStorage); + else if(xmlChild.Name == ElemEntry) + ReadEntry(xmlChild, pg, pwStorage); + else if(xmlChild.Name == ElemTags) + AddTags(pg.Tags, XmlUtil.SafeInnerText(xmlChild)); + else { Debug.Assert(false); } + } + } + + private static void ReadEntry(XmlNode xmlNode, PwGroup pgParent, PwDatabase pwStorage) + { + PwEntry pe = new PwEntry(true, true); + pgParent.AddEntry(pe, true); + + DateTime? odtExpiry = null; + + foreach(XmlNode xmlChild in xmlNode) + { + string strValue = XmlUtil.SafeInnerText(xmlChild); + + if(xmlChild.NodeType == XmlNodeType.Text) + ImportUtil.AppendToField(pe, PwDefs.TitleField, (xmlChild.Value ?? + string.Empty).Trim(), pwStorage, " ", false); + else if(xmlChild.Name == ElemEntryUser) + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, strValue)); + else if(xmlChild.Name == ElemEntryPassword) + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, strValue)); + else if(xmlChild.Name == ElemEntryPassword2) + { + if(strValue.Length > 0) // Prevent empty item + pe.Strings.Set(Password2Key, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, strValue)); + } + else if(xmlChild.Name == ElemEntryUrl) + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, strValue)); + else if(xmlChild.Name == ElemEntryNotes) + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, strValue)); + else if(xmlChild.Name == ElemTags) + AddTags(pe.Tags, strValue); + else if(xmlChild.Name == ElemEntryExpires) + pe.Expires = StrUtil.StringToBool(strValue); + else if(xmlChild.Name == ElemEntryExpiryTime) + { + DateTime dt; + if(TimeUtil.FromDisplayStringEx(strValue, out dt)) + odtExpiry = TimeUtil.ToUtc(dt, false); + else { Debug.Assert(false); } + } + else if(xmlChild.Name == ElemAutoType) + ReadAutoType(xmlChild, pe); + else if(xmlChild.Name == ElemEntryUnsupp0) { } + else if(xmlChild.Name == ElemEntryUnsupp1) { } + else { Debug.Assert(false); } + } + + if(odtExpiry.HasValue) pe.ExpiryTime = odtExpiry.Value; + else pe.Expires = false; + } + + private static void ReadAutoType(XmlNode xmlNode, PwEntry pe) + { + string strSeq = string.Empty; + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == ElemAutoTypePlh) + { + string strValue = XmlUtil.SafeInnerText(xmlChild); + + string strConv = null; + foreach(KeyValuePair kvp in m_dAutoTypeConv) + { + if(kvp.Key.Equals(strValue, StrUtil.CaseIgnoreCmp)) + { + strConv = kvp.Value; + break; + } + } + + if(strConv != null) strSeq += strConv; + else { Debug.Assert(false); strSeq += strValue; } + } + else { Debug.Assert(false); } + } + + pe.AutoType.DefaultSequence = strSeq; + } + + private static void AddTags(List lTags, string strNewTags) + { + if(string.IsNullOrEmpty(strNewTags)) return; + + StrUtil.AddTags(lTags, StrUtil.StringToTags( + strNewTags.Replace(' ', ';'))); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/NetworkPwMgrCsv4.cs b/src/KeePass/DataExchange/Formats/NetworkPwMgrCsv4.cs new file mode 100644 index 0000000..c613b3b --- /dev/null +++ b/src/KeePass/DataExchange/Formats/NetworkPwMgrCsv4.cs @@ -0,0 +1,124 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; + +namespace KeePass.DataExchange.Formats +{ + // 4.0+ + internal sealed class NetworkPwMgrCsv4 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Network Password Manager CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strData = sr.ReadToEnd(); + sr.Close(); + + CsvOptions opt = new CsvOptions(); + opt.BackslashIsEscape = false; + opt.TextQualifier = char.MaxValue; // No text qualifier + + CsvStreamReaderEx csv = new CsvStreamReaderEx(strData, opt); + PwGroup pg = pwStorage.RootGroup; + char[] vGroupSplit = new char[] { '\\' }; + + while(true) + { + string[] v = csv.ReadLine(); + if(v == null) break; + if(v.Length < 1) continue; + + for(int i = 0; i < v.Length; ++i) + v[i] = ParseString(v[i]); + + if(v[0].StartsWith("\\")) // Group + { + string strGroup = v[0].Trim(vGroupSplit); // Also from end + if(strGroup.Length > 0) + { + pg = pwStorage.RootGroup.FindCreateSubTree(strGroup, + vGroupSplit); + + if(v.Length >= 6) pg.Notes = v[5].Trim(); + if((v.Length >= 5) && (v[4].Trim().Length > 0)) + { + if(pg.Notes.Length > 0) + pg.Notes += Environment.NewLine + Environment.NewLine; + + pg.Notes += v[4].Trim(); + } + } + } + else // Entry + { + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + List l = new List(v); + while(l.Count < 8) + { + Debug.Assert(false); + l.Add(string.Empty); + } + + ImportUtil.AppendToField(pe, PwDefs.TitleField, l[0], pwStorage); + ImportUtil.AppendToField(pe, PwDefs.UserNameField, l[1], pwStorage); + ImportUtil.AppendToField(pe, PwDefs.PasswordField, l[2], pwStorage); + ImportUtil.AppendToField(pe, PwDefs.UrlField, l[3], pwStorage); + ImportUtil.AppendToField(pe, PwDefs.NotesField, l[4], pwStorage); + + if(l[5].Length > 0) + ImportUtil.AppendToField(pe, "Custom 1", l[5], pwStorage); + if(l[6].Length > 0) + ImportUtil.AppendToField(pe, "Custom 2", l[6], pwStorage); + if(l[7].Length > 0) + ImportUtil.AppendToField(pe, "Custom 3", l[7], pwStorage); + } + } + } + + private static string ParseString(string str) + { + if(str == null) { Debug.Assert(false); return string.Empty; } + + str = str.Replace(@"#44", ","); + str = str.Replace(@"#13", Environment.NewLine); + + return str; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/NortonIdSafeCsv2013.cs b/src/KeePass/DataExchange/Formats/NortonIdSafeCsv2013.cs new file mode 100644 index 0000000..96cc090 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/NortonIdSafeCsv2013.cs @@ -0,0 +1,84 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 2013.4.0.10 + internal sealed class NortonIdSafeCsv2013 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Norton Identity Safe CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Unicode, true); + string strData = sr.ReadToEnd(); + sr.Close(); + + CsvOptions opt = new CsvOptions(); + opt.BackslashIsEscape = false; + + CsvStreamReaderEx csv = new CsvStreamReaderEx(strData, opt); + + while(true) + { + string[] v = csv.ReadLine(); + if(v == null) break; + if(v.Length < 5) continue; + + if(v[0].Equals("url", StrUtil.CaseIgnoreCmp) && + v[1].Equals("username", StrUtil.CaseIgnoreCmp) && + v[2].Equals("password", StrUtil.CaseIgnoreCmp)) + continue; // Header + + PwGroup pg = pwStorage.RootGroup; + string strGroup = v[4]; + if(!string.IsNullOrEmpty(strGroup)) + pg = pg.FindCreateGroup(strGroup, true); + + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + ImportUtil.AppendToField(pe, PwDefs.UrlField, v[0], pwStorage); + ImportUtil.AppendToField(pe, PwDefs.UserNameField, v[1], pwStorage); + ImportUtil.AppendToField(pe, PwDefs.PasswordField, v[2], pwStorage); + ImportUtil.AppendToField(pe, PwDefs.TitleField, v[3], pwStorage); + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/OnePw1Pux8.cs b/src/KeePass/DataExchange/Formats/OnePw1Pux8.cs new file mode 100644 index 0000000..9ef0ebf --- /dev/null +++ b/src/KeePass/DataExchange/Formats/OnePw1Pux8.cs @@ -0,0 +1,318 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util; +using KeePass.Util.Archive; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 8.7.0 (1PUX version 3) + internal sealed class OnePw1Pux8 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "1Password 1PUX"; } } + public override string DefaultExtension { get { return "1pux"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + using(ZipArchiveEx za = new ZipArchiveEx(sInput)) + { + string str; + using(Stream s = za.OpenEntry("export.data")) + { + if(s == null) throw new FormatException(); + + using(StreamReader sr = new StreamReader(s, StrUtil.Utf8, true)) + { + str = sr.ReadToEnd(); + } + } + + CharStream cs = new CharStream(str); + JsonObject jo = new JsonObject(cs); + ImportRoot(jo, za, pwStorage); + } + } + + private static void ImportRoot(JsonObject jo, ZipArchiveEx za, PwDatabase pd) + { + foreach(JsonObject joAcc in jo.GetValueArray("accounts", true)) + { + foreach(JsonObject joVault in joAcc.GetValueArray("vaults", true)) + { + PwGroup pg = pd.RootGroup; + + JsonObject joAttrs = joVault.GetValue("attrs"); + if(joAttrs != null) + { + string strGroup = joAttrs.GetValue("name"); + if(!string.IsNullOrEmpty(strGroup)) + { + pg = new PwGroup(true, true); + pg.Name = strGroup; + pd.RootGroup.AddGroup(pg, true, false); + + string strNotes = joAttrs.GetValue("desc"); + if(!string.IsNullOrEmpty(strNotes)) + pg.Notes = strNotes; + } + else { Debug.Assert(false); } + } + else { Debug.Assert(false); } + + foreach(JsonObject joItem in joVault.GetValueArray("items", true)) + ImportItem(joItem, za, pg, pd); + } + } + } + + private static void ImportItem(JsonObject jo, ZipArchiveEx za, PwGroup pg, + PwDatabase pd) + { + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true, false); + + if(jo.GetValue("favIndex", 0) != 0) + pe.AddTag(PwDefs.FavoriteTag); + + ulong u = jo.GetValue("createdAt", 0); + if(u != 0) pe.CreationTime = TimeUtil.ConvertUnixTime(u); + else { Debug.Assert(false); } + + u = jo.GetValue("updatedAt", 0); + if(u != 0) pe.LastModificationTime = TimeUtil.ConvertUnixTime(u); + else { Debug.Assert(false); } + + JsonObject joOverview = jo.GetValue("overview"); + if(joOverview != null) + { + ImportUtil.AppendToField(pe, PwDefs.TitleField, + joOverview.GetValue("title"), pd); + + string strUrl = joOverview.GetValue("url"); + ImportUtil.AppendToField(pe, PwDefs.UrlField, strUrl, pd); + + foreach(JsonObject joUrl in joOverview.GetValueArray("urls", true)) + { + string str = joUrl.GetValue("url"); + if(str != strUrl) + ImportUtil.CreateFieldWithIndex(pe.Strings, PwDefs.UrlField, + str, pd, false); + } + + foreach(string strTag in joOverview.GetValueArray("tags", true)) + pe.AddTag(strTag); + } + else { Debug.Assert(false); } + + JsonObject joDetails = jo.GetValue("details"); + if(joDetails != null) + { + string str = joDetails.GetValue("notesPlain"); + if(!string.IsNullOrEmpty(str)) + ImportUtil.AppendToField(pe, PwDefs.NotesField, str, pd); + + JsonObject joFile = joDetails.GetValue("documentAttributes"); + if(joFile != null) ImportAttachment(joFile, za, pe); + + foreach(JsonObject joLF in joDetails.GetValueArray("loginFields", true)) + ImportLoginField(joLF, za, pe, pd); + + foreach(JsonObject joSection in joDetails.GetValueArray("sections", true)) + { + string strSection = joSection.GetValue("title"); + + foreach(JsonObject joField in joSection.GetValueArray("fields", true)) + ImportSectionField(joField, za, strSection, pe, pd); + } + } + else { Debug.Assert(false); } + } + + private static void ImportLoginField(JsonObject jo, ZipArchiveEx za, + PwEntry pe, PwDatabase pd) + { + string strName; + string strDsg = jo.GetValue("designation"); + if(strDsg == "username") + strName = PwDefs.UserNameField; + else if(strDsg == "password") + strName = PwDefs.PasswordField; + else + { + strName = jo.GetValue("name"); + if(string.IsNullOrEmpty(strName)) + { + Debug.Assert(false); + strName = PwDefs.NotesField; + } + else + { + string strM = ImportUtil.MapNameToStandardField(strName, true); + if(!string.IsNullOrEmpty(strM)) strName = strM; + } + } + + string strValue = jo.GetValue("value"); + ImportUtil.AppendToField(pe, strName, strValue, pd); + } + + private static void ImportSectionField(JsonObject jo, ZipArchiveEx za, + string strSection, PwEntry pe, PwDatabase pd) + { + JsonObject joValue = jo.GetValue("value"); + if(joValue == null) { Debug.Assert(false); return; } + + if(joValue.GetValue("reference") != null) return; + + JsonObject joFile = joValue.GetValue("file"); + if(joFile != null) + { + ImportAttachment(joFile, za, pe); + return; + } + + string strName = (jo.GetValue("title") ?? string.Empty); + if(!string.IsNullOrEmpty(strSection)) + { + if(strName.Length == 0) strName = strSection; + else strName = strSection + " - " + strName; + } + else if(strName.Length == 0) { Debug.Assert(false); return; } + else + { + string strM = ImportUtil.MapNameToStandardField(strName, false); + if(!string.IsNullOrEmpty(strM)) strName = strM; + } + + JsonObject joAddr = joValue.GetValue("address"); + if(joAddr != null) + { + StringBuilder sb = new StringBuilder(); + Action fAppend = delegate(string strN) + { + string strV = joAddr.GetValue(strN); + if(!string.IsNullOrEmpty(strV)) sb.AppendLine(strV); + }; + + fAppend("street"); + fAppend("zip"); + fAppend("city"); + fAppend("state"); + fAppend("country"); + + ImportUtil.AppendToField(pe, strName, sb.ToString(), pd); + return; + } + + string str = joValue.GetValue("concealed"); + if(str != null) + { + ImportUtil.AppendToField(pe, strName, str, pd); + pe.Strings.EnableProtection(strName, true); + return; + } + + ulong u = joValue.GetValue("date", 0); + if(u != 0) + { + DateTime dt = TimeUtil.ConvertUnixTime(u); + str = TimeUtil.ToDisplayString(dt); + ImportUtil.AppendToField(pe, strName, str, pd); + return; + } + + JsonObject joEMail = joValue.GetValue("email"); + if(joEMail != null) + { + ImportUtil.AppendToField(pe, strName, joEMail.GetValue( + "email_address"), pd); + return; + } + + u = joValue.GetValue("monthYear", 0); + if(u != 0) + { + str = (u / 100).ToString() + "-" + + (u % 100).ToString().PadLeft(2, '0'); + ImportUtil.AppendToField(pe, strName, str, pd); + return; + } + + str = joValue.GetValue("totp"); + if(str != null) + { + try { EntryUtil.ImportOtpAuth(pe, str, pd); } + catch(Exception) + { + Debug.Assert(false); + ImportUtil.AppendToField(pe, strName, str, pd); + } + return; + } + + foreach(KeyValuePair kvp in joValue.Items) + { + if(kvp.Value == null) continue; // E.g. null 'date' + if(kvp.Value is JsonObject) { Debug.Assert(false); continue; } + ImportUtil.AppendToField(pe, strName, kvp.Value.ToString(), pd); + } + } + + private static void ImportAttachment(JsonObject jo, ZipArchiveEx za, + PwEntry pe) + { + string strFileName = jo.GetValue("fileName"); + if(string.IsNullOrEmpty(strFileName)) { Debug.Assert(false); return; } + + string strDocId = jo.GetValue("documentId"); + if(string.IsNullOrEmpty(strDocId)) { Debug.Assert(false); return; } + + byte[] pbData; + using(Stream s = za.OpenEntry("files/" + strDocId + "__" + strFileName)) + { + if(s == null) throw new FormatException(); + pbData = MemUtil.Read(s); + } + + Debug.Assert(pbData.LongLength == jo.GetValue("decryptedSize", -1)); + + if(FileDialogsEx.CheckAttachmentSize(pbData.LongLength, + KPRes.AttachFailed + MessageService.NewLine + strFileName)) + pe.Binaries.Set(strFileName, new ProtectedBinary(false, pbData)); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/OnePwProCsv599.cs b/src/KeePass/DataExchange/Formats/OnePwProCsv599.cs new file mode 100644 index 0000000..0b3fcb3 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/OnePwProCsv599.cs @@ -0,0 +1,200 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1PW 6.15-7.05+ and its predecessor 1Password Pro 5.99, + // not 1Password (which is an entirely different product) + internal sealed class OnePwProCsv599 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "1PW & 1Password Pro CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return false; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default, true); + string strData = sr.ReadToEnd(); + sr.Close(); + + string[] vLines = strData.Split(new char[] { '\r', '\n' }, + StringSplitOptions.RemoveEmptyEntries); + + Dictionary dictGroups = new Dictionary(); + foreach(string strLine in vLines) + { + ProcessCsvLine(strLine, pwStorage, dictGroups); + } + } + + private static void ProcessCsvLine(string strLine, PwDatabase pwStorage, + Dictionary dictGroups) + { + if(strLine == "\"Bezeichnung\"\t\"User/ID\"\t\"1.Passwort\"\t\"Url/Programm\"\t\"Geändert am\"\t\"Bemerkung\"\t\"2.Passwort\"\t\"Läuft ab\"\t\"Kategorie\"\t\"Eigene Felder\"") + return; + + string str = strLine; + if(str.StartsWith("\"") && str.EndsWith("\"")) + str = str.Substring(1, str.Length - 2); + else { Debug.Assert(false); } + + string[] list = str.Split(new string[] { "\"\t\"" }, StringSplitOptions.None); + + int iOffset; + if(list.Length == 11) iOffset = 0; // 1Password Pro 5.99 + else if(list.Length == 10) iOffset = -1; // 1PW 6.15 + else if(list.Length > 11) iOffset = 0; // Unknown extension + else return; + + string strGroup = list[9 + iOffset]; + PwGroup pg; + if(dictGroups.ContainsKey(strGroup)) pg = dictGroups[strGroup]; + else + { + pg = new PwGroup(true, true, strGroup, PwIcon.Folder); + pwStorage.RootGroup.AddGroup(pg, true); + dictGroups[strGroup] = pg; + } + + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, + ParseCsvWord(list[1 + iOffset]))); + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, + ParseCsvWord(list[2 + iOffset]))); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, + ParseCsvWord(list[3 + iOffset]))); + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, + ParseCsvWord(list[4 + iOffset]))); + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, + ParseCsvWord(list[6 + iOffset]))); + pe.Strings.Set(PwDefs.PasswordField + " 2", new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, + ParseCsvWord(list[7 + iOffset]))); + + // 1Password Pro only: + // Debug.Assert(list[9] == list[0]); // Very mysterious format... + + DateTime dt; + if(ParseDateTime(list[5 + iOffset], out dt)) + { + pe.CreationTime = pe.LastAccessTime = pe.LastModificationTime = dt; + } + else { Debug.Assert(false); } + + if(ParseDateTime(list[8 + iOffset], out dt)) + { + pe.Expires = true; + pe.ExpiryTime = dt; + } + + AddCustomFields(pe, list[10 + iOffset]); + } + + private static string ParseCsvWord(string strWord) + { + string str = strWord; + + str = str.Replace("\\r", string.Empty); + str = str.Replace("\\n", "\r\n"); + + return str; + } + + private static bool ParseDateTime(string str, out DateTime dt) + { + dt = DateTime.MinValue; + if(string.IsNullOrEmpty(str)) return false; + if(str.Trim().Equals("nie", StrUtil.CaseIgnoreCmp)) return false; + if(str.Trim().Equals("never", StrUtil.CaseIgnoreCmp)) return false; + if(str.Trim().Equals("morgen", StrUtil.CaseIgnoreCmp)) + { + dt = DateTime.UtcNow.AddDays(1.0); + return true; + } + + string[] list = str.Split(new char[] { '.', '\r', '\n', ' ', '\t', + '-', ':' }, StringSplitOptions.RemoveEmptyEntries); + + try + { + if(list.Length == 6) + dt = (new DateTime(int.Parse(list[2]), int.Parse(list[1]), + int.Parse(list[0]), int.Parse(list[3]), int.Parse(list[4]), + int.Parse(list[5]), DateTimeKind.Local)).ToUniversalTime(); + else if(list.Length == 3) + dt = (new DateTime(int.Parse(list[2]), int.Parse(list[1]), + int.Parse(list[0]), 0, 0, 0, DateTimeKind.Local)).ToUniversalTime(); + else { Debug.Assert(false); return false; } + } + catch(Exception) { Debug.Assert(false); return false; } + + return true; + } + + private static void AddCustomFields(PwEntry pe, string strCustom) + { + string[] vItems = strCustom.Split(new string[] { @"|~#~|" }, + StringSplitOptions.RemoveEmptyEntries); + + foreach(string strItem in vItems) + { + string[] vData = strItem.Split(new char[] { '|' }, + StringSplitOptions.None); + + if(vData.Length >= 3) + { + string strValue = vData[2]; + for(int i = 3; i < vData.Length; ++i) + strValue += @"|" + vData[i]; + + pe.Strings.Set(vData[1], new ProtectedString(false, + strValue)); + } + else { Debug.Assert(false); } + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PVaultTxt14.cs b/src/KeePass/DataExchange/Formats/PVaultTxt14.cs new file mode 100644 index 0000000..2d34694 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PVaultTxt14.cs @@ -0,0 +1,117 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; + +namespace KeePass.DataExchange.Formats +{ + // 1.4 + internal sealed class PVaultTxt14 : FileFormatProvider + { + private const string InitGroup = "************"; + private const string InitNewEntry = "----------------------"; + + private const string InitTitle = "Account: "; + private const string InitUser = "User Name: "; + private const string InitPassword = "Password: "; + private const string InitURL = "Hyperlink: "; + private const string InitEMail = "Email: "; + + private const string InitNotes = "Comments: "; + private const string ContinueNotes = " "; + + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Personal Vault TXT"; } } + public override string DefaultExtension { get { return "txt"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strData = sr.ReadToEnd(); + sr.Close(); + + string[] vLines = strData.Split(new char[] { '\r', '\n' }); + + PwGroup pg = pwStorage.RootGroup; + PwEntry pe = new PwEntry(true, true); + + foreach(string strLine in vLines) + { + if(strLine.StartsWith(InitGroup)) + { + string strGroup = strLine.Remove(0, InitGroup.Length); + if(strGroup.Length > InitGroup.Length) + strGroup = strGroup.Substring(0, strGroup.Length - InitGroup.Length); + + pg = pwStorage.RootGroup.FindCreateGroup(strGroup, true); + + pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + } + else if(strLine.StartsWith(InitNewEntry)) + { + pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + } + else if(strLine.StartsWith(InitTitle)) + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, + strLine.Remove(0, InitTitle.Length))); + else if(strLine.StartsWith(InitUser)) + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, + strLine.Remove(0, InitUser.Length))); + else if(strLine.StartsWith(InitPassword)) + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, + strLine.Remove(0, InitPassword.Length))); + else if(strLine.StartsWith(InitURL)) + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, + strLine.Remove(0, InitURL.Length))); + else if(strLine.StartsWith(InitEMail)) + pe.Strings.Set("E-Mail", new ProtectedString( + false, + strLine.Remove(0, InitEMail.Length))); + else if(strLine.StartsWith(InitNotes)) + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, + strLine.Remove(0, InitNotes.Length))); + else if(strLine.StartsWith(ContinueNotes)) + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, + pe.Strings.ReadSafe(PwDefs.NotesField) + "\r\n" + + strLine.Remove(0, ContinueNotes.Length))); + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PassKeeper12.cs b/src/KeePass/DataExchange/Formats/PassKeeper12.cs new file mode 100644 index 0000000..faff85f --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PassKeeper12.cs @@ -0,0 +1,127 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +using KeePass.App; +using KeePass.Native; +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1.2 + internal sealed class PassKeeper12 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "PassKeeper"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + public override bool RequiresFile { get { return false; } } + + public override Image SmallIcon + { + get { return KeePass.Properties.Resources.B16x16_View_Detailed; } + } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + if(!MessageService.AskYesNo(KPRes.ImportMustRead + MessageService.NewParagraph + + KPRes.ImportMustReadQuestion)) + { + AppHelp.ShowHelp(AppDefs.HelpTopics.ImportExport, + AppDefs.HelpTopics.ImportExportPassKeeper); + return; + } + + PwEntry pePrev = new PwEntry(true, true); + + for(int i = 0; i < 20; ++i) + { + Thread.Sleep(500); + Application.DoEvents(); + } + + try + { + while(true) + { + PwEntry pe = ImportEntry(pwStorage); + + if(ImportUtil.EntryEquals(pe, pePrev)) + { + if(pe.ParentGroup != null) // Remove duplicate + pe.ParentGroup.Entries.Remove(pe); + break; + } + + ImportUtil.GuiSendKeysPrc(@"{DOWN}"); + pePrev = pe; + } + + MessageService.ShowInfo(KPRes.ImportFinished); + } + catch(Exception exImp) { MessageService.ShowWarning(exImp); } + } + + private static PwEntry ImportEntry(PwDatabase pwDb) + { + ImportUtil.GuiSendWaitWindowChange(@"{ENTER}"); + Thread.Sleep(250); + ImportUtil.GuiSendKeysPrc(string.Empty); // Process messages + + string strTitle = ImportUtil.GuiSendRetrieve(string.Empty); + string strUserName = ImportUtil.GuiSendRetrieve(@"{TAB}"); + string strPassword = ImportUtil.GuiSendRetrieve(@"{TAB}"); + string strNotes = ImportUtil.GuiSendRetrieve(@"{TAB}"); + + ImportUtil.GuiSendWaitWindowChange(@"{ESC}"); + + PwGroup pg = pwDb.RootGroup; + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwDb.MemoryProtection.ProtectTitle, strTitle)); + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwDb.MemoryProtection.ProtectUserName, strUserName)); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwDb.MemoryProtection.ProtectPassword, strPassword)); + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwDb.MemoryProtection.ProtectNotes, strNotes)); + + return pe; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PinsTxt450.cs b/src/KeePass/DataExchange/Formats/PinsTxt450.cs new file mode 100644 index 0000000..ea1f2aa --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PinsTxt450.cs @@ -0,0 +1,117 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 4.50 + internal sealed class PinsTxt450 : FileFormatProvider + { + private const string FirstLine = "\"Category\"\t\"System\"\t\"User\"\t" + + "\"Password\"\t\"URL/Comments\"\t\"Custom\"\t\"Start date\"\t\"Expires\"\t" + + "\"More info\""; + private const string FieldSeparator = "\"\t\""; + + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "PINs TXT"; } } + public override string DefaultExtension { get { return "txt"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strData = sr.ReadToEnd(); + sr.Close(); + + string[] vLines = strData.Split(new char[] { '\r', '\n' }); + + bool bFirst = true; + foreach(string strLine in vLines) + { + if(bFirst) + { + if(strLine != FirstLine) + throw new FormatException("Format error. First line is invalid. Read the documentation."); + + bFirst = false; + } + else if(strLine.Length > 5) ImportLine(strLine, pwStorage); + } + } + + private static void ImportLine(string strLine, PwDatabase pwStorage) + { + string[] vParts = strLine.Split(new string[] { FieldSeparator }, + StringSplitOptions.None); + Debug.Assert(vParts.Length == 9); + if(vParts.Length != 9) + throw new FormatException("Line:\r\n" + strLine); + + vParts[0] = vParts[0].Remove(0, 1); + vParts[8] = vParts[8].Substring(0, vParts[8].Length - 1); + + vParts[8] = vParts[8].Replace("||", "\r\n"); + + PwGroup pg = pwStorage.RootGroup.FindCreateGroup(vParts[0], true); + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, vParts[1])); + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, vParts[2])); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, vParts[3])); + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, vParts[4])); + + if(vParts[5].Length > 0) + pe.Strings.Set("Custom", new ProtectedString(false, vParts[5])); + + DateTime dt; + if((vParts[6].Length > 0) && DateTime.TryParse(vParts[6], out dt)) + pe.CreationTime = pe.LastModificationTime = pe.LastAccessTime = + TimeUtil.ToUtc(dt, false); + + if((vParts[7].Length > 0) && DateTime.TryParse(vParts[7], out dt)) + { + pe.ExpiryTime = TimeUtil.ToUtc(dt, false); + pe.Expires = true; + } + + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, vParts[8])); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PpKeeperHtml270.cs b/src/KeePass/DataExchange/Formats/PpKeeperHtml270.cs new file mode 100644 index 0000000..90c22bb --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PpKeeperHtml270.cs @@ -0,0 +1,191 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 2.50, 2.60 and 2.70 + internal sealed class PpKeeperHtml270 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Passphrase Keeper HTML"; } } + public override string DefaultExtension { get { return "html|htm"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + private const string m_strStartTd = ""; + private const string m_strEndTd = ""; + + private const string m_strModifiedField = @"{0530D298-F983-454C-B5A3-BFB0775844D1}"; + + private const string m_strModifiedHdrStart = "Modified"; + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strData = sr.ReadToEnd(); + sr.Close(); + + // Normalize 2.70 files + strData = strData.Replace("", m_strStartTd); + strData = strData.Replace("", m_strStartTd); + strData = strData.Replace("", m_strStartTd); + strData = strData.Replace("", m_strStartTd); + strData = strData.Replace("", m_strStartTd); + strData = strData.Replace("", m_strStartTd); + + // Additionally support old versions + string[] vRepl = new string[5] { + // 2.60 + "", + + // 2.50 and 2.60 + "", + "", + "", + "" + }; + foreach(string strRepl in vRepl) + { + strData = Regex.Replace(strData, strRepl, m_strStartTd); + } + strData = strData.Replace("\r\n", m_strEndTd + "\r\n"); + + int nOffset = 0; + + PwEntry peHeader; + if(!ReadEntry(out peHeader, strData, ref nOffset, pwStorage)) + { + Debug.Assert(false); + return; + } + + while((nOffset >= 0) && (nOffset < strData.Length)) + { + PwEntry pe; + if(!ReadEntry(out pe, strData, ref nOffset, pwStorage)) + { + Debug.Assert(false); + break; + } + if(pe == null) break; + + pwStorage.RootGroup.AddEntry(pe, true); + } + } + + private static bool ReadEntry(out PwEntry pe, string strData, + ref int nOffset, PwDatabase pd) + { + pe = new PwEntry(true, true); + + if(!ReadString(strData, ref nOffset, m_strStartTd, m_strEndTd, pe, null, false)) + { + pe = null; + return true; + } + if(!ReadString(strData, ref nOffset, m_strStartTd, m_strEndTd, pe, + PwDefs.TitleField, pd.MemoryProtection.ProtectTitle)) + return false; + if(!ReadString(strData, ref nOffset, m_strStartTd, m_strEndTd, pe, + PwDefs.UserNameField, pd.MemoryProtection.ProtectUserName)) + return false; + if(!ReadString(strData, ref nOffset, m_strStartTd, m_strEndTd, pe, + PwDefs.PasswordField, pd.MemoryProtection.ProtectPassword)) + return false; + if(!ReadString(strData, ref nOffset, m_strStartTd, m_strEndTd, pe, + PwDefs.UrlField, pd.MemoryProtection.ProtectUrl)) + return false; + if(!ReadString(strData, ref nOffset, m_strStartTd, m_strEndTd, pe, + PwDefs.NotesField, pd.MemoryProtection.ProtectNotes)) + return false; + if(!ReadString(strData, ref nOffset, m_strStartTd, m_strEndTd, pe, + m_strModifiedField, false)) + return false; + + return true; + } + + private static bool ReadString(string strData, ref int nOffset, + string strStart, string strEnd, PwEntry pe, string strFieldName, + bool bProtect) + { + nOffset = strData.IndexOf(strStart, nOffset); + if(nOffset < 0) return false; + + string strRawValue = StrUtil.GetStringBetween(strData, nOffset, + strStart, strEnd); + + string strValue = strRawValue.Trim(); + if(strValue == @"
") strValue = string.Empty; + strValue = strValue.Replace("\r", string.Empty); + strValue = strValue.Replace("\n", string.Empty); + strValue = strValue.Replace(@"
", MessageService.NewLine); + + if((strFieldName != null) && (strFieldName == m_strModifiedField)) + { + DateTime dt = ReadModified(strValue); + pe.CreationTime = dt; + pe.LastModificationTime = dt; + } + else if(strFieldName != null) + pe.Strings.Set(strFieldName, new ProtectedString(bProtect, strValue)); + + nOffset += strStart.Length + strRawValue.Length + strEnd.Length; + return true; + } + + private static DateTime ReadModified(string strValue) + { + if(strValue == null) { Debug.Assert(false); return DateTime.UtcNow; } + if(strValue.StartsWith(m_strModifiedHdrStart)) return DateTime.UtcNow; + + string[] vParts = strValue.Split(new char[] { ' ', ':', '/' }, + StringSplitOptions.RemoveEmptyEntries); + if(vParts.Length != 6) { Debug.Assert(false); return DateTime.UtcNow; } + + try + { + return (new DateTime(int.Parse(vParts[2]), int.Parse(vParts[0]), + int.Parse(vParts[1]), int.Parse(vParts[3]), int.Parse(vParts[4]), + int.Parse(vParts[5]), DateTimeKind.Local)).ToUniversalTime(); + } + catch(Exception) { Debug.Assert(false); } + + return DateTime.UtcNow; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PwAgentXml2.cs b/src/KeePass/DataExchange/Formats/PwAgentXml2.cs new file mode 100644 index 0000000..1fd51fc --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PwAgentXml2.cs @@ -0,0 +1,155 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 2.3.4-2.6.2+ + internal static class PwAgentXml2 + { + private const string ElemGroup = "group"; + private const string ElemGroupName = "name"; + + private const string ElemEntry = "entry"; + private const string ElemEntryName = "name"; + private const string ElemEntryType = "type"; + private const string ElemEntryUser = "account"; + private const string ElemEntryPassword = "password"; + private const string ElemEntryURL = "link"; + private const string ElemEntryNotes = "note"; + private const string ElemEntryCreationTime = "date_added"; + private const string ElemEntryLastModTime = "date_modified"; + private const string ElemEntryExpireTime = "date_expire"; + + internal static void Import(PwDatabase pwStorage, XmlDocument d) + { + XmlNode xmlRoot = d.DocumentElement; + Debug.Assert(xmlRoot.Name == "data"); + + foreach(XmlNode xmlChild in xmlRoot.ChildNodes) + { + if(xmlChild.Name == ElemGroup) + ReadGroup(xmlChild, pwStorage.RootGroup, pwStorage); + else { Debug.Assert(false); } + } + } + + private static void ReadGroup(XmlNode xmlNode, PwGroup pgParent, PwDatabase pwStorage) + { + PwGroup pg = new PwGroup(true, true); + pgParent.AddGroup(pg, true); + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == ElemGroupName) + pg.Name = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == ElemGroup) + ReadGroup(xmlChild, pg, pwStorage); + else if(xmlChild.Name == ElemEntry) + ReadEntry(xmlChild, pg, pwStorage); + else { Debug.Assert(false); } + } + } + + private static void ReadEntry(XmlNode xmlNode, PwGroup pgParent, PwDatabase pwStorage) + { + PwEntry pe = new PwEntry(true, true); + pgParent.AddEntry(pe, true); + + DateTime dt; + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == ElemEntryName) + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemEntryType) + pe.IconId = ((XmlUtil.SafeInnerText(xmlChild) != "1") ? + PwIcon.Key : PwIcon.PaperNew); + else if(xmlChild.Name == ElemEntryUser) + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemEntryPassword) + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemEntryURL) + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemEntryNotes) + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemEntryCreationTime) + { + if(ParseDate(xmlChild, out dt)) + pe.CreationTime = dt; + } + else if(xmlChild.Name == ElemEntryLastModTime) + { + if(ParseDate(xmlChild, out dt)) + pe.LastModificationTime = dt; + } + else if(xmlChild.Name == ElemEntryExpireTime) + { + if(ParseDate(xmlChild, out dt)) + { + pe.ExpiryTime = dt; + pe.Expires = true; + } + } + else { Debug.Assert(false); } + } + } + + private static bool ParseDate(XmlNode xn, out DateTime dtOut) + { + string strDate = XmlUtil.SafeInnerText(xn); + if(strDate.Length == 0) + { + dtOut = DateTime.UtcNow; + return false; + } + + if(DateTime.TryParse(strDate, out dtOut)) + { + dtOut = TimeUtil.ToUtc(dtOut, false); + return true; + } + + Debug.Assert(false); + dtOut = DateTime.UtcNow; + return false; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PwAgentXml3.cs b/src/KeePass/DataExchange/Formats/PwAgentXml3.cs new file mode 100644 index 0000000..ce98ac7 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PwAgentXml3.cs @@ -0,0 +1,200 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 19.6.28+ + internal sealed class PwAgentXml3 : FileFormatProvider + { + private const string ElemGroup = "group"; + private const string ElemEntry = "item"; + + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Password Agent XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + byte[] pb = MemUtil.Read(sInput); + + if(ImportOld(pwStorage, pb)) return; + + XmlDocument d = XmlUtilEx.CreateXmlDocument(); + using(MemoryStream ms = new MemoryStream(pb, false)) + { + using(StreamReader sr = new StreamReader(ms, StrUtil.Utf8, true)) + { + d.Load(sr); + } + } + + XmlNode xmlRoot = d.DocumentElement; + Debug.Assert(xmlRoot.Name == "data"); + + foreach(XmlNode xmlChild in xmlRoot.ChildNodes) + { + if(xmlChild.Name == ElemGroup) + ReadGroup(xmlChild, pwStorage.RootGroup, pwStorage); + else if(xmlChild.Name == ElemEntry) + ReadEntry(xmlChild, pwStorage.RootGroup, pwStorage); + else { Debug.Assert(false); } + } + } + + internal static bool ImportOld(PwDatabase pwStorage, byte[] pb) + { + // Version 2 uses ANSI encoding, version 3 uses UTF-8 + // encoding (with BOM) + XmlDocument dAnsi = XmlUtilEx.CreateXmlDocument(); + try + { + using(MemoryStream ms = new MemoryStream(pb, false)) + { + using(StreamReader sr = new StreamReader(ms, Encoding.Default, true)) + { + dAnsi.Load(sr); + + XmlElement xmlRoot = dAnsi.DocumentElement; + + // Version 2 has three "ver_*" attributes, + // version 3 has a "version" attribute + if(xmlRoot.Attributes["ver_major"] == null) + return false; + } + } + } + catch(Exception) { Debug.Assert(false); return false; } + + PwAgentXml2.Import(pwStorage, dAnsi); + return true; + } + + private static void ReadGroup(XmlNode xmlNode, PwGroup pgParent, PwDatabase pwStorage) + { + PwGroup pg = new PwGroup(true, true); + pgParent.AddGroup(pg, true); + + ReadDate(pg, xmlNode.Attributes["dateModified"], true, true, false); + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == "title") + pg.Name = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == ElemGroup) + ReadGroup(xmlChild, pg, pwStorage); + else if(xmlChild.Name == ElemEntry) + ReadEntry(xmlChild, pg, pwStorage); + else { Debug.Assert(false); } + } + } + + private static void ReadEntry(XmlNode xmlNode, PwGroup pgParent, PwDatabase pwStorage) + { + PwEntry pe = new PwEntry(true, true); + pgParent.AddEntry(pe, true); + + ReadDate(pe, xmlNode.Attributes["dateModified"], true, true, false); + + foreach(XmlNode xmlChild in xmlNode) + { + string str = XmlUtil.SafeInnerText(xmlChild); + + if(xmlChild.Name == "title") + ImportUtil.AppendToField(pe, PwDefs.TitleField, str, pwStorage); + else if(xmlChild.Name == "userId") + ImportUtil.AppendToField(pe, PwDefs.UserNameField, str, pwStorage); + else if(xmlChild.Name == "password") + ImportUtil.AppendToField(pe, PwDefs.PasswordField, str, pwStorage); + else if(xmlChild.Name == "note") + ImportUtil.AppendToField(pe, PwDefs.NotesField, str, pwStorage); + else if(xmlChild.Name == "link") + ImportUtil.AppendToField(pe, PwDefs.UrlField, str, pwStorage); + else if(xmlChild.Name == "dateAdded") + ReadDate(pe, xmlChild, true, false, false); + else if(xmlChild.Name == "dateModified") + ReadDate(pe, xmlChild, false, true, false); + else if(xmlChild.Name == "dateExpires") + ReadDate(pe, xmlChild, false, false, true); + else if(xmlChild.Name == "attachment") + ReadAttachment(xmlChild, pe); + else { Debug.Assert(false); } + } + } + + private static void ReadAttachment(XmlNode xmlNode, PwEntry pe) + { + XmlNode xnName = xmlNode.SelectSingleNode("fileName"); + XmlNode xnValue = xmlNode.SelectSingleNode("fileBytes"); + + string strName = XmlUtil.SafeInnerText(xnName); + if(strName.Length == 0) { Debug.Assert(false); strName = Guid.NewGuid().ToString(); } + + string strValue = XmlUtil.SafeInnerText(xnValue); + if(strValue.Length == 0) { Debug.Assert(false); return; } + + pe.Binaries.Set(strName, new ProtectedBinary(false, + Convert.FromBase64String(strValue))); + } + + private static void ReadDate(ITimeLogger tl, XmlNode xn, + bool bSetCreation, bool bSetLastMod, bool bSetExpiry) + { + if(tl == null) { Debug.Assert(false); return; } + if(xn == null) { Debug.Assert(false); return; } + + try + { + XmlAttribute xa = (xn as XmlAttribute); + string str = ((xa != null) ? xa.Value : xn.InnerText); + if(string.IsNullOrEmpty(str)) return; // No assert + + DateTime dt = TimeUtil.ToUtc(XmlConvert.ToDateTime( + str, XmlDateTimeSerializationMode.Utc), true); + + if(bSetCreation) tl.CreationTime = dt; + if(bSetLastMod) tl.LastModificationTime = dt; + if(bSetExpiry) + { + tl.Expires = true; + tl.ExpiryTime = dt; + } + } + catch(Exception) { Debug.Assert(false); } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PwDepotXml26.cs b/src/KeePass/DataExchange/Formats/PwDepotXml26.cs new file mode 100644 index 0000000..b11825e --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PwDepotXml26.cs @@ -0,0 +1,458 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 2.6-16.0.7+ + internal sealed class PwDepotXml26 : FileFormatProvider + { + // Old versions used upper-case node names, whereas + // newer versions use lower-case node names + private const string ElemGroup = "group"; + + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Password Depot XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, StrUtil.Utf8, true); + string strData = sr.ReadToEnd(); + sr.Close(); + + // Remove vertical tabulators + strData = strData.Replace("\u000B", string.Empty); + + XmlDocument xd = XmlUtilEx.CreateXmlDocument(); + xd.LoadXml(strData); + + PwGroup pgRoot = pwStorage.RootGroup; + Dictionary dItems = new Dictionary(); + string strFavs = null; + + foreach(XmlNode xn in xd.DocumentElement.ChildNodes) + { + string strName = xn.Name.ToLowerInvariant(); + + if(strName == "passwords") + ReadContainer(xn, pgRoot, pwStorage, dItems); + else if(strName == "recyclebin") + { + PwGroup pg = new PwGroup(true, true, KPRes.RecycleBin + + " (Password Depot)", PwIcon.TrashBin); + pgRoot.AddGroup(pg, true); + ReadContainer(xn, pg, pwStorage, dItems); + } + else if(strName == "favorites") + strFavs = XmlUtil.SafeInnerText(xn).Trim(); + else + { + Debug.Assert((strName == "header") || (strName == "sitestoignore") || + (strName == "categories")); + } + } + + if(!string.IsNullOrEmpty(strFavs)) + { + try + { + byte[] pbList = Convert.FromBase64String(strFavs); + string strList = StrUtil.Utf8.GetString(pbList); + string[] v = strList.Split(new char[] { '\r', '\n' }, + StringSplitOptions.RemoveEmptyEntries); + foreach(string str in v) + { + IStructureItem si; + if(!dItems.TryGetValue(str, out si)) { Debug.Assert(false); continue; } + + PwGroup pg = (si as PwGroup); + if(pg != null) pg.Tags.Add(PwDefs.FavoriteTag); + + PwEntry pe = (si as PwEntry); + if(pe != null) pe.AddTag(PwDefs.FavoriteTag); + } + } + catch(Exception) { Debug.Assert(false); } + } + } + + private static void ReadContainer(XmlNode xnContainer, PwGroup pgParent, + PwDatabase pd, Dictionary dItems) + { + foreach(XmlNode xn in xnContainer.ChildNodes) + { + string strName = xn.Name.ToLowerInvariant(); + + if(strName == ElemGroup) + ReadGroup(xn, pgParent, pd, dItems); + else { Debug.Assert(false); } + } + } + + private static void ReadGroup(XmlNode xnGroup, PwGroup pgParent, PwDatabase pd, + Dictionary dItems) + { + PwGroup pg = new PwGroup(true, true); + pgParent.AddGroup(pg, true); + + string str = GetAttribute(xnGroup, "name"); + if(string.IsNullOrEmpty(str)) { Debug.Assert(false); str = KPRes.Group; } + pg.Name = str; + + str = GetAttribute(xnGroup, "fingerprint"); + if(string.IsNullOrEmpty(str)) { Debug.Assert(false); } + else if(dItems == null) { Debug.Assert(false); } + else if(dItems.ContainsKey(str)) { } // Recycle bin UUID = primary group UUID + else dItems[str] = pg; + + str = GetAttribute(xnGroup, "imageindex"); + if(!string.IsNullOrEmpty(str)) pg.IconId = MapIcon(str, false); + + foreach(XmlNode xn in xnGroup.ChildNodes) + { + string strName = xn.Name.ToLowerInvariant(); + + if(strName == ElemGroup) + ReadGroup(xn, pg, pd, dItems); + else if(strName == "item") + ReadEntry(xn, pg, pd, dItems); + else { Debug.Assert(false); } + } + } + + private static void ReadEntry(XmlNode xnEntry, PwGroup pg, PwDatabase pd, + Dictionary dItems) + { + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + foreach(XmlNode xn in xnEntry.ChildNodes) + { + string strName = xn.Name.ToLowerInvariant(); + + if(strName == "description") + ImportUtil.AppendToField(pe, PwDefs.TitleField, + XmlUtil.SafeInnerText(xn), pd); + else if(strName == "username") + ImportUtil.AppendToField(pe, PwDefs.UserNameField, + XmlUtil.SafeInnerText(xn), pd); + else if(strName == "password") + ImportUtil.AppendToField(pe, PwDefs.PasswordField, + XmlUtil.SafeInnerText(xn), pd); + else if(strName == "url") + ImportUtil.CreateFieldWithIndex(pe.Strings, PwDefs.UrlField, + XmlUtil.SafeInnerText(xn), pd, false); + else if(strName == "comment") + ImportUtil.AppendToField(pe, PwDefs.NotesField, + XmlUtil.SafeInnerText(xn), pd); + else if(strName == "expirydate") + { + DateTime? odt = ReadTime(xn); + if(odt.HasValue) + { + pe.ExpiryTime = odt.Value; + pe.Expires = true; + } + } + else if(strName == "created") + { + DateTime? odt = ReadTime(xn); + if(odt.HasValue) pe.CreationTime = odt.Value; + } + else if(strName == "lastmodified") + { + DateTime? odt = ReadTime(xn); + if(odt.HasValue) pe.LastModificationTime = odt.Value; + } + else if(strName == "lastaccessed") + { + DateTime? odt = ReadTime(xn); + if(odt.HasValue) pe.LastAccessTime = odt.Value; + } + else if(strName == "usagecount") + { + ulong u; + if(ulong.TryParse(XmlUtil.SafeInnerText(xn), out u)) + pe.UsageCount = u; + } + else if(strName == "tags") + { + List l = StrUtil.StringToTags(XmlUtil.SafeInnerText(xn)); + StrUtil.AddTags(pe.Tags, l); + } + else if(strName == "fingerprint") + { + string str = XmlUtil.SafeInnerText(xn); + if(str.Length == 0) { Debug.Assert(false); } + else if(dItems == null) { } // History, ... + else if(dItems.ContainsKey(str)) { Debug.Assert(false); } + else dItems[str] = pe; + } + else if(strName == "template") + pe.AutoType.DefaultSequence = MapAutoType(XmlUtil.SafeInnerText(xn)); + else if(strName == "imageindex") + pe.IconId = MapIcon(XmlUtil.SafeInnerText(xn), true); + else if(strName == "urls") + ReadUrls(xn, pe, pd); + else if(strName == "customfields") + ReadCustomFields(xn, pe, pd); + else if(strName == "hitems") + ReadHistory(xn, pe, pd); + } + } + + private static void ReadUrls(XmlNode xnUrls, PwEntry pe, PwDatabase pd) + { + foreach(XmlNode xn in xnUrls.ChildNodes) + { + string strName = xn.Name.ToLowerInvariant(); + + if(strName == "url") + ImportUtil.CreateFieldWithIndex(pe.Strings, PwDefs.UrlField, + XmlUtil.SafeInnerText(xn), pd, false); + else { Debug.Assert(false); } + } + } + + private static void ReadCustomFields(XmlNode xnFields, PwEntry pe, PwDatabase pd) + { + foreach(XmlNode xn in xnFields.ChildNodes) + { + string strName = xn.Name.ToLowerInvariant(); + + if(strName == "field") + ReadCustomField(xn, pe, pd); + else { Debug.Assert(false); } + } + } + + private static void ReadCustomField(XmlNode xnField, PwEntry pe, PwDatabase pd) + { + string strKey = string.Empty, strValue = string.Empty; + + foreach(XmlNode xn in xnField.ChildNodes) + { + string strName = xn.Name.ToLowerInvariant(); + + if(strName == "name") + strKey = XmlUtil.SafeInnerText(xn); + else if(strName == "value") + strValue = XmlUtil.SafeInnerText(xn); + else { Debug.Assert(strName == "visible"); } + } + + if(strKey == "IDS_InformationText") + strKey = PwDefs.NotesField; + else if(strKey.Length == 0) + { + Debug.Assert(false); + strKey = Guid.NewGuid().ToString(); + } + + ImportUtil.AppendToField(pe, strKey, strValue, pd); + } + + private static void ReadHistory(XmlNode xnHistory, PwEntry pe, PwDatabase pd) + { + PwGroup pgH = new PwGroup(true, true); + + foreach(XmlNode xn in xnHistory.ChildNodes) + { + string strName = xn.Name.ToLowerInvariant(); + + if(strName == "hitem") + ReadEntry(xn, pgH, pd, null); + else { Debug.Assert(false); } + } + + foreach(PwEntry peH in pgH.Entries) + { + if(peH.History.UCount != 0) { Debug.Assert(false); peH.History.Clear(); } + + peH.ParentGroup = null; + peH.SetUuid(pe.Uuid, false); + + pe.History.Add(peH); + } + + pe.History.Sort(EntryUtil.CompareLastMod); + } + + private static PwIcon MapIcon(string strIconId, bool bEntryIcon) + { + PwIcon ico = (bEntryIcon ? PwIcon.Key : PwIcon.Folder); + + int idIcon; + if(!int.TryParse(strIconId, out idIcon)) { Debug.Assert(false); return ico; } + + ++idIcon; // In the icon picker dialog, all indices are + 1 + switch(idIcon) + { + // case 1: ico = PwIcon.Key; break; // 1, 2, 3 + case 4: ico = PwIcon.FolderOpen; break; + case 5: + case 6: ico = PwIcon.LockOpen; break; + case 15: + case 16: ico = PwIcon.EMail; break; + case 17: + case 18: ico = PwIcon.ProgramIcons; break; + case 21: + case 22: ico = PwIcon.World; break; + case 23: + case 24: ico = PwIcon.UserCommunication; break; + case 25: + case 26: ico = PwIcon.Money; break; + case 27: + case 28: ico = PwIcon.Star; break; + case 39: ico = PwIcon.Disk; break; + case 40: ico = PwIcon.Clock; break; + case 41: ico = PwIcon.Money; break; + case 42: ico = PwIcon.Star; break; + case 47: ico = PwIcon.Folder; break; + case 48: + case 49: ico = PwIcon.TrashBin; break; + case 53: ico = PwIcon.Identity; break; + case 54: ico = PwIcon.Info; break; + case 62: + case 64: ico = PwIcon.PaperLocked; break; + case 66: ico = PwIcon.Book; break; + case 67: ico = PwIcon.Expired; break; + case 68: ico = PwIcon.Warning; break; + case 69: ico = PwIcon.MultiKeys; break; + case 73: ico = PwIcon.PaperNew; break; + case 75: ico = PwIcon.Home; break; + case 77: ico = PwIcon.Archive; break; + case 81: ico = PwIcon.Money; break; + case 83: ico = PwIcon.Clock; break; + case 85: ico = PwIcon.Star; break; + case 86: ico = PwIcon.LockOpen; break; + case 87: ico = PwIcon.Certificate; break; + case 91: ico = PwIcon.World; break; + case 92: + case 93: + case 94: + case 95: ico = PwIcon.Note; break; + case 97: ico = PwIcon.Drive; break; + case 100: ico = PwIcon.UserCommunication; break; + case 101: ico = PwIcon.Monitor; break; + case 111: + case 112: ico = PwIcon.Identity; break; + case 113: ico = PwIcon.EMail; break; + default: break; + }; + + return ico; + } + + private static string MapAutoType(string str) + { + str = str.Replace('<', '{'); + str = str.Replace('>', '}'); + + str = StrUtil.ReplaceCaseInsensitive(str, @"{USER}", + @"{" + PwDefs.UserNameField.ToUpperInvariant() + @"}"); + str = StrUtil.ReplaceCaseInsensitive(str, @"{PASS}", + @"{" + PwDefs.PasswordField.ToUpperInvariant() + @"}"); + str = StrUtil.ReplaceCaseInsensitive(str, @"{CLEAR}", @"{CLEARFIELD}"); + str = StrUtil.ReplaceCaseInsensitive(str, @"{ARROW_LEFT}", @"{LEFT}"); + str = StrUtil.ReplaceCaseInsensitive(str, @"{ARROW_UP}", @"{UP}"); + str = StrUtil.ReplaceCaseInsensitive(str, @"{ARROW_RIGHT}", @"{RIGHT}"); + str = StrUtil.ReplaceCaseInsensitive(str, @"{ARROW_DOWN}", @"{DOWN}"); + str = StrUtil.ReplaceCaseInsensitive(str, @"{DELAY=", @"{DELAY "); + + if(str.Equals(PwDefs.DefaultAutoTypeSequence, StrUtil.CaseIgnoreCmp)) + return string.Empty; + return str; + } + + private static DateTime? ReadTime(XmlNode xn) + { + DateTime? odt = ReadTimeRaw(xn); + if(!odt.HasValue) return null; + + if(odt.Value.Year < 1950) return null; + + return odt.Value; + } + + private static DateTime? ReadTimeRaw(XmlNode xn) + { + string strFormat = GetAttribute(xn, "fmt"); + string strTime = XmlUtil.SafeInnerText(xn); + + if(strTime == "00.00.0000") return null; // Parsing fails + // Another dummy value is 30.12.1899 (handled by ReadTime) + + DateTime dt; + if(!string.IsNullOrEmpty(strFormat)) + { + strFormat = strFormat.Replace("mm.", "MM."); + strFormat = strFormat.Replace('h', 'H'); + + if(DateTime.TryParseExact(strTime, strFormat, null, + DateTimeStyles.AssumeLocal, out dt)) + return TimeUtil.ToUtc(dt, false); + } + Debug.Assert(false); + + if(DateTime.TryParse(strTime, out dt)) + return TimeUtil.ToUtc(dt, false); + + return null; + } + + private static string GetAttribute(XmlNode xn, string strAttrib) + { + Debug.Assert(strAttrib == strAttrib.ToLowerInvariant()); + + try + { + XmlAttributeCollection xac = xn.Attributes; + + XmlNode xnAttrib = xac.GetNamedItem(strAttrib); + if(xnAttrib != null) return xnAttrib.Value; + + xnAttrib = xac.GetNamedItem(strAttrib.ToUpperInvariant()); + if(xnAttrib != null) return xnAttrib.Value; + } + catch(Exception) { Debug.Assert(false); } + + return null; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PwExporterXml105.cs b/src/KeePass/DataExchange/Formats/PwExporterXml105.cs new file mode 100644 index 0000000..f14dd31 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PwExporterXml105.cs @@ -0,0 +1,178 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Serialization; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1.0.5-1.3.4+ + internal sealed class PwExporterXml105 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Password Exporter XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.Browser; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + private const string ElemRoot = "xml"; + private const string ElemEntries = "entries"; + private const string ElemEntry = "entry"; + + private const string AttrUser = "user"; + private const string AttrPassword = "password"; + private const string AttrURL = "host"; + private const string AttrUserFieldName = "userFieldName"; + private const string AttrPasswordFieldName = "passFieldName"; + + private const string DbUserFieldName = "FieldID_UserName"; + private const string DbPasswordFieldName = "FieldID_Password"; + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strDoc = sr.ReadToEnd(); + sr.Close(); + + // Fix '<' characters, for version 1.0.5 + int nIndex = strDoc.IndexOf('<'); + while(nIndex >= 0) + { + int nAttrib = strDoc.LastIndexOf("=\"", nIndex); + int nElem = strDoc.LastIndexOf('>', nIndex); + + if(nAttrib > nElem) + { + strDoc = strDoc.Remove(nIndex, 1); + strDoc = strDoc.Insert(nIndex, @"<"); + } + nIndex = strDoc.IndexOf('<', nIndex + 1); + } + + // Fix '>' characters, for version 1.0.5 + nIndex = strDoc.IndexOf('>'); + while(nIndex >= 0) + { + char chPrev = strDoc[nIndex - 1]; + string strPrev4 = strDoc.Substring(nIndex - 3, 4); + + if((chPrev != '/') && (chPrev != '\"') && (strPrev4 != @"xml>") && + (strPrev4 != @"ies>")) + { + strDoc = strDoc.Remove(nIndex, 1); + strDoc = strDoc.Insert(nIndex, @">"); + } + nIndex = strDoc.IndexOf('>', nIndex + 1); + } + + MemoryStream ms = new MemoryStream(StrUtil.Utf8.GetBytes(strDoc), false); + XmlDocument xmlDoc = XmlUtilEx.CreateXmlDocument(); + xmlDoc.Load(ms); + ms.Close(); + + XmlNode xmlRoot = xmlDoc.DocumentElement; + if(xmlRoot.Name != ElemRoot) + throw new FormatException("Invalid root element!"); + + foreach(XmlNode xmlChild in xmlRoot.ChildNodes) + { + if(xmlChild.Name == ElemEntries) + ImportEntries(xmlChild, pwStorage); + else { Debug.Assert(false); } + } + } + + private static void ImportEntries(XmlNode xmlNode, PwDatabase pwStorage) + { + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == ElemEntry) + ImportEntry(xmlChild, pwStorage); + else { Debug.Assert(false); } + } + } + + private static void ImportEntry(XmlNode xmlNode, PwDatabase pwStorage) + { + PwEntry pe = new PwEntry(true, true); + pwStorage.RootGroup.AddEntry(pe, true); + + XmlAttributeCollection col = xmlNode.Attributes; + if(col == null) return; + + XmlNode xmlAttrib; + xmlAttrib = col.GetNamedItem(AttrUser); + if(xmlAttrib != null) pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, PctDecode(xmlAttrib.Value))); + else { Debug.Assert(false); } + + xmlAttrib = col.GetNamedItem(AttrPassword); + if(xmlAttrib != null) pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, PctDecode(xmlAttrib.Value))); + else { Debug.Assert(false); } + + xmlAttrib = col.GetNamedItem(AttrURL); + if(xmlAttrib != null) pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, PctDecode(xmlAttrib.Value))); + else { Debug.Assert(false); } + + xmlAttrib = col.GetNamedItem(AttrUserFieldName); + if(xmlAttrib != null) pe.Strings.Set(DbUserFieldName, new ProtectedString( + false, PctDecode(xmlAttrib.Value))); + else { Debug.Assert(false); } + + xmlAttrib = col.GetNamedItem(AttrPasswordFieldName); + if(xmlAttrib != null) pe.Strings.Set(DbPasswordFieldName, new ProtectedString( + false, PctDecode(xmlAttrib.Value))); + else { Debug.Assert(false); } + } + + // For version 1.3.4 + private static string PctDecode(string strText) + { + if(string.IsNullOrEmpty(strText)) return string.Empty; + + string str = strText; + + str = str.Replace("%3C", "<"); + str = str.Replace("%3E", ">"); + str = str.Replace("%22", "\""); + str = str.Replace("%26", "&"); + str = str.Replace("%25", "%"); // Must be last + + return str; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PwKeeperCsv70.cs b/src/KeePass/DataExchange/Formats/PwKeeperCsv70.cs new file mode 100644 index 0000000..d2e76ce --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PwKeeperCsv70.cs @@ -0,0 +1,102 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; + +namespace KeePass.DataExchange.Formats +{ + // 7.0 + internal sealed class PwKeeperCsv70 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Password Keeper CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strData = sr.ReadToEnd(); + sr.Close(); + + string[] vLines = strData.Split(new char[] { '\r', '\n' }); + + foreach(string strLine in vLines) + { + if(strLine.Length > 5) ProcessCsvLine(strLine, pwStorage); + } + } + + private static void ProcessCsvLine(string strLine, PwDatabase pwStorage) + { + List list = ImportUtil.SplitCsvLine(strLine, ","); + Debug.Assert(list.Count == 5); + + PwEntry pe = new PwEntry(true, true); + pwStorage.RootGroup.AddEntry(pe, true); + + if(list.Count == 5) + { + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, + ProcessCsvWord(list[0]))); + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, + ProcessCsvWord(list[1]))); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, + ProcessCsvWord(list[2]))); + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, + ProcessCsvWord(list[3]))); + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, + ProcessCsvWord(list[4]))); + } + else throw new FormatException("Invalid field count!"); + } + + private static string ProcessCsvWord(string strWord) + { + if(strWord == null) return string.Empty; + if(strWord.Length < 2) return strWord; + + if(strWord.StartsWith("\"") && strWord.EndsWith("\"")) + return strWord.Substring(1, strWord.Length - 2); + + return strWord; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PwMemory2008Xml104.cs b/src/KeePass/DataExchange/Formats/PwMemory2008Xml104.cs new file mode 100644 index 0000000..fe1341d --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PwMemory2008Xml104.cs @@ -0,0 +1,129 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Serialization; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1.0.4 + internal sealed class PwMemory2008Xml104 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Password Memory 2008 XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + string str = Preprocess(sInput); + + PwMemory2008XmlFile_Priv f = null; + using(MemoryStream ms = new MemoryStream(StrUtil.Utf8.GetBytes(str), false)) + { + f = XmlUtilEx.Deserialize(ms); + } + if((f == null) || (f.Cells == null)) return; + + Dictionary vGroups = new Dictionary(); + + for(int iLine = 2; iLine < f.Cells.Length; ++iLine) + { + string[] vCells = f.Cells[iLine]; + if((vCells == null) || (vCells.Length != 6)) continue; + if((vCells[1] == null) || (vCells[2] == null) || + (vCells[3] == null) || (vCells[4] == null)) continue; + + string strGroup = vCells[4]; + PwGroup pg; + if(strGroup == ".") pg = pwStorage.RootGroup; + else if(vGroups.ContainsKey(strGroup)) pg = vGroups[strGroup]; + else + { + pg = new PwGroup(true, true); + pg.Name = strGroup; + pwStorage.RootGroup.AddGroup(pg, true); + + vGroups[strGroup] = pg; + } + + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + if(vCells[1] != ".") + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, vCells[1])); + if(vCells[2] != ".") + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, vCells[2])); + if(vCells[3] != ".") + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, vCells[3])); + } + } + + private static string Preprocess(Stream sInput) + { + StreamReader sr = new StreamReader(sInput, Encoding.UTF8); + string str = sr.ReadToEnd(); + sr.Close(); + + const string strStartTag = " + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Windows.Forms; + +using KeePass.Forms; +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Resources; +using KeePassLib.Security; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class PwPrompterDat12 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Password Prompter DAT"; } } + public override string DefaultExtension { get { return "dat"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + SingleLineEditForm dlg = new SingleLineEditForm(); + dlg.InitEx(KPRes.Password, KPRes.Import + ": " + this.FormatName, + KPRes.PasswordPrompt, Properties.Resources.B48x48_KGPG_Key2, + string.Empty, null); + if(UIUtil.ShowDialogNotValue(dlg, DialogResult.OK)) return; + string strPassword = dlg.ResultString; + UIUtil.DestroyForm(dlg); + + byte[] pbPassword = Encoding.Default.GetBytes(strPassword); + + BinaryReader br = new BinaryReader(sInput, Encoding.Default); + + ushort usFileVersion = br.ReadUInt16(); + if(usFileVersion != 0x0100) + throw new Exception(KLRes.FileVersionUnsupported); + + uint uEntries = br.ReadUInt32(); + uint uKeySize = br.ReadUInt32(); + Debug.Assert(uKeySize == 50); // It's a constant + + byte btKeyArrayLen = br.ReadByte(); + byte[] pbKey = br.ReadBytes(btKeyArrayLen); + + byte btValidArrayLen = br.ReadByte(); + byte[] pbValid = br.ReadBytes(btValidArrayLen); + + if(pbPassword.Length > 0) + { + MangleSetKey(pbPassword); + MangleDecode(pbKey); + } + + MangleSetKey(pbKey); + MangleDecode(pbValid); + string strValid = Encoding.Default.GetString(pbValid); + if(strValid != "aacaaaadaaeabaacyuioqaqqaaaaaertaaajkadaadaaxywqea") + throw new Exception(KLRes.InvalidCompositeKey); + + for(uint uEntry = 0; uEntry < uEntries; ++uEntry) + { + PwEntry pe = new PwEntry(true, true); + pwStorage.RootGroup.AddEntry(pe, true); + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, ReadString(br))); + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, ReadString(br))); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, ReadString(br))); + pe.Strings.Set("Hint", new ProtectedString(false, ReadString(br))); + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, ReadString(br))); + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, ReadString(br))); + } + + br.Close(); + sInput.Close(); + } + + private string ReadString(BinaryReader br) + { + byte btLen = br.ReadByte(); + byte[] pbData = br.ReadBytes(btLen); + + MangleDecode(pbData); + + return Encoding.Default.GetString(pbData); + } + + byte[] m_pbMangleKey = null; + private void MangleSetKey(byte[] pbKey) + { + if(pbKey == null) { Debug.Assert(false); return; } + + m_pbMangleKey = new byte[pbKey.Length]; + Array.Copy(pbKey, m_pbMangleKey, pbKey.Length); + } + + private void MangleDecode(byte[] pbData) + { + if(m_pbMangleKey == null) { Debug.Assert(false); return; } + + int nKeyIndex = 0, nIndex = 0, nRemLen = pbData.Length; + bool bUp = true; + + while(nRemLen > 0) + { + if(nKeyIndex > (m_pbMangleKey.Length - 1)) + { + nKeyIndex = m_pbMangleKey.Length - 1; + bUp = false; + } + else if(nKeyIndex < 0) + { + nKeyIndex = 0; + bUp = true; + } + + pbData[nIndex] ^= m_pbMangleKey[nKeyIndex]; + + nKeyIndex += (bUp ? 1 : -1); + + ++nIndex; + --nRemLen; + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PwSafeXml302.cs b/src/KeePass/DataExchange/Formats/PwSafeXml302.cs new file mode 100644 index 0000000..756bf3b --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PwSafeXml302.cs @@ -0,0 +1,351 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 3.02-3.30+ + internal sealed class PwSafeXml302 : FileFormatProvider + { + private const string AttribLineBreak = "delimiter"; + + private const string ElemEntry = "entry"; + private const string ElemGroup = "group"; + private const string ElemTitle = "title"; + private const string ElemUserName = "username"; + private const string ElemPassword = "password"; + private const string ElemURL = "url"; + private const string ElemNotes = "notes"; + private const string ElemEMail = "email"; + + private const string ElemAutoType = "autotype"; + private const string ElemRunCommand = "runcommand"; + + private const string ElemCreationTime = "ctime"; + private const string ElemLastAccessTime = "atime"; + private const string ElemExpireTime = "ltime"; + private const string ElemLastModTime = "pmtime"; + private const string ElemRecordModTime = "rmtime"; + private const string ElemCreationTimeX = "ctimex"; + private const string ElemLastAccessTimeX = "atimex"; + private const string ElemExpireTimeX = "xtimex"; // Yes, inconsistent + private const string ElemLastModTimeX = "pmtimex"; + private const string ElemRecordModTimeX = "rmtimex"; + + private const string ElemEntryHistory = "pwhistory"; + private const string ElemEntryHistoryContainer = "history_entries"; + private const string ElemEntryHistoryItem = "history_entry"; + private const string ElemEntryHistoryItemTime = "changed"; + private const string ElemEntryHistoryItemTimeX = "changedx"; + private const string ElemEntryHistoryItemPassword = "oldpassword"; + + private const string ElemTimePartDate = "date"; + private const string ElemTimePartTime = "time"; + + private const string XPathUseDefaultUser = "Preferences/UseDefaultUser"; + private const string XPathDefaultUser = "Preferences/DefaultUsername"; + + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Password Safe XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + private sealed class DatePasswordPair + { + public DateTime Time = DateTime.UtcNow; + public string Password = string.Empty; + } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + byte[] pbData = MemUtil.Read(sInput); + + try + { + string strData = StrUtil.Utf8.GetString(pbData); + if(strData.StartsWith("", + StrUtil.CaseIgnoreCmp) && (strData.IndexOf( + "WhatSaved=\"Password Safe V3.29\"", StrUtil.CaseIgnoreCmp) >= 0)) + { + // Fix broken XML exported by Password Safe 3.29; + // this has been fixed in 3.30 + strData = strData.Replace(" listHistory = null; + + foreach(XmlNode xmlChild in xmlNode.ChildNodes) + { + if(xmlChild.Name == ElemGroup) + strGroupName = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == ElemTitle) + pe.Strings.Set(PwDefs.TitleField, + new ProtectedString(pwStorage.MemoryProtection.ProtectTitle, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemUserName) + pe.Strings.Set(PwDefs.UserNameField, + new ProtectedString(pwStorage.MemoryProtection.ProtectUserName, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemPassword) + pe.Strings.Set(PwDefs.PasswordField, + new ProtectedString(pwStorage.MemoryProtection.ProtectPassword, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemURL) + pe.Strings.Set(PwDefs.UrlField, + new ProtectedString(pwStorage.MemoryProtection.ProtectUrl, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemNotes) + pe.Strings.Set(PwDefs.NotesField, + new ProtectedString(pwStorage.MemoryProtection.ProtectNotes, + XmlUtil.SafeInnerText(xmlChild, strLineBreak))); + else if(xmlChild.Name == ElemEMail) + pe.Strings.Set("E-Mail", new ProtectedString(false, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemCreationTime) + pe.CreationTime = ReadDateTime(xmlChild); + else if(xmlChild.Name == ElemLastAccessTime) + pe.LastAccessTime = ReadDateTime(xmlChild); + else if(xmlChild.Name == ElemExpireTime) + { + pe.ExpiryTime = ReadDateTime(xmlChild); + pe.Expires = true; + } + else if(xmlChild.Name == ElemLastModTime) // = last mod + pe.LastModificationTime = ReadDateTime(xmlChild); + else if(xmlChild.Name == ElemRecordModTime) // = last mod + pe.LastModificationTime = ReadDateTime(xmlChild); + else if(xmlChild.Name == ElemCreationTimeX) + pe.CreationTime = ReadDateTimeX(xmlChild); + else if(xmlChild.Name == ElemLastAccessTimeX) + pe.LastAccessTime = ReadDateTimeX(xmlChild); + else if(xmlChild.Name == ElemExpireTimeX) + { + pe.ExpiryTime = ReadDateTimeX(xmlChild); + pe.Expires = true; + } + else if(xmlChild.Name == ElemLastModTimeX) // = last mod + pe.LastModificationTime = ReadDateTimeX(xmlChild); + else if(xmlChild.Name == ElemRecordModTimeX) // = last mod + pe.LastModificationTime = ReadDateTimeX(xmlChild); + else if(xmlChild.Name == ElemAutoType) + pe.AutoType.DefaultSequence = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == ElemRunCommand) + pe.OverrideUrl = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == ElemEntryHistory) + listHistory = ReadEntryHistory(xmlChild); + } + + if(listHistory != null) + { + string strPassword = pe.Strings.ReadSafe(PwDefs.PasswordField); + DateTime dtLastMod = pe.LastModificationTime; + + foreach(DatePasswordPair dpp in listHistory) + { + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, + dpp.Password)); + pe.LastModificationTime = dpp.Time; + + pe.CreateBackup(null); + } + // Maintain backups manually now (backups from the imported file + // might have been out of order) + pe.MaintainBackups(pwStorage); + + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, + strPassword)); + pe.LastModificationTime = dtLastMod; + } + + PwGroup pgContainer = pwStorage.RootGroup; + if(strGroupName.Length != 0) + pgContainer = pwStorage.RootGroup.FindCreateSubTree(strGroupName, + new string[1] { "." }, true); + pgContainer.AddEntry(pe, true); + pgContainer.IsExpanded = true; + } + + private static DateTime ReadDateTime(XmlNode xmlNode) + { + Debug.Assert(xmlNode != null); if(xmlNode == null) return DateTime.UtcNow; + + int[] vTimeParts = new int[6]; + DateTime dtTemp; + foreach(XmlNode xmlChild in xmlNode.ChildNodes) + { + if(xmlChild.Name == ElemTimePartDate) + { + if(DateTime.TryParse(XmlUtil.SafeInnerText(xmlChild), out dtTemp)) + { + vTimeParts[0] = dtTemp.Year; + vTimeParts[1] = dtTemp.Month; + vTimeParts[2] = dtTemp.Day; + } + } + else if(xmlChild.Name == ElemTimePartTime) + { + if(DateTime.TryParse(XmlUtil.SafeInnerText(xmlChild), out dtTemp)) + { + vTimeParts[3] = dtTemp.Hour; + vTimeParts[4] = dtTemp.Minute; + vTimeParts[5] = dtTemp.Second; + } + } + else { Debug.Assert(false); } + } + + return (new DateTime(vTimeParts[0], vTimeParts[1], vTimeParts[2], + vTimeParts[3], vTimeParts[4], vTimeParts[5], + DateTimeKind.Local)).ToUniversalTime(); + } + + private static DateTime ReadDateTimeX(XmlNode xmlNode) + { + string strDate = XmlUtil.SafeInnerText(xmlNode); + + DateTime dt; + if(StrUtil.TryParseDateTime(strDate, out dt)) + return TimeUtil.ToUtc(dt, false); + + Debug.Assert(false); + return DateTime.UtcNow; + } + + private static List ReadEntryHistory(XmlNode xmlNode) + { + List list = null; + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == ElemEntryHistoryContainer) + list = ReadEntryHistoryContainer(xmlChild); + } + + return list; + } + + private static List ReadEntryHistoryContainer(XmlNode xmlNode) + { + List list = new List(); + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == ElemEntryHistoryItem) + list.Add(ReadEntryHistoryItem(xmlChild)); + } + + return list; + } + + private static DatePasswordPair ReadEntryHistoryItem(XmlNode xmlNode) + { + DatePasswordPair dpp = new DatePasswordPair(); + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == ElemEntryHistoryItemTime) + dpp.Time = ReadDateTime(xmlChild); + else if(xmlChild.Name == ElemEntryHistoryItemTimeX) + dpp.Time = ReadDateTimeX(xmlChild); + else if(xmlChild.Name == ElemEntryHistoryItemPassword) + dpp.Password = XmlUtil.SafeInnerText(xmlChild); + } + + return dpp; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PwSaverXml412.cs b/src/KeePass/DataExchange/Formats/PwSaverXml412.cs new file mode 100644 index 0000000..d48bd74 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PwSaverXml412.cs @@ -0,0 +1,209 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 4.1.2+ + internal sealed class PwSaverXml412 : FileFormatProvider + { + private const string ElemRoot = "ROOT"; + + private const string ElemGroup = "FOLDER"; + private const string ElemRecycleBin = "GARBAGE"; + private const string ElemEntry = "RECORD"; + + private const string ElemName = "NAME"; + private const string ElemIcon = "ICON"; + + private const string ElemFields = "FIELDS"; + private const string ElemField = "FIELD"; + private const string ElemID = "ID"; + private const string ElemType = "TYPE"; + private const string ElemValue = "VALUE"; + + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Password Saver XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, StrUtil.Utf8); + string strDoc = sr.ReadToEnd(); + sr.Close(); + + XmlDocument doc = XmlUtilEx.CreateXmlDocument(); + doc.LoadXml(strDoc); + + XmlElement xmlRoot = doc.DocumentElement; + Debug.Assert(xmlRoot.Name == ElemRoot); + + PwGroup pgRoot = pwStorage.RootGroup; + + foreach(XmlNode xmlChild in xmlRoot.ChildNodes) + { + if(xmlChild.Name == ElemGroup) + ImportGroup(xmlChild, pgRoot, pwStorage, false); + else if(xmlChild.Name == ElemRecycleBin) + ImportGroup(xmlChild, pgRoot, pwStorage, true); + else if(xmlChild.Name == ElemEntry) + ImportEntry(xmlChild, pgRoot, pwStorage); + else { Debug.Assert(false); } + } + } + + private static void ImportGroup(XmlNode xn, PwGroup pgParent, PwDatabase pd, + bool bIsRecycleBin) + { + PwGroup pg; + if(!bIsRecycleBin) + { + pg = new PwGroup(true, true); + pgParent.AddGroup(pg, true); + } + else + { + pg = pd.RootGroup.FindGroup(pd.RecycleBinUuid, true); + + if(pg == null) + { + pg = new PwGroup(true, true, KPRes.RecycleBin, PwIcon.TrashBin); + pgParent.AddGroup(pg, true); + + pd.RecycleBinUuid = pg.Uuid; + pd.RecycleBinChanged = DateTime.UtcNow; + } + } + + foreach(XmlNode xmlChild in xn.ChildNodes) + { + if(xmlChild.Name == ElemName) + pg.Name = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == ElemIcon) + pg.IconId = GetIcon(XmlUtil.SafeInnerText(xmlChild)); + else if(xmlChild.Name == ElemGroup) + ImportGroup(xmlChild, pg, pd, false); + else if(xmlChild.Name == ElemEntry) + ImportEntry(xmlChild, pg, pd); + else { Debug.Assert(false); } + } + } + + private static void ImportEntry(XmlNode xn, PwGroup pgParent, PwDatabase pd) + { + PwEntry pe = new PwEntry(true, true); + pgParent.AddEntry(pe, true); + + foreach(XmlNode xmlChild in xn.ChildNodes) + { + if(xmlChild.Name == ElemName) + ImportUtil.AppendToField(pe, PwDefs.TitleField, + XmlUtil.SafeInnerText(xmlChild), pd); + else if(xmlChild.Name == ElemIcon) + pe.IconId = GetIcon(XmlUtil.SafeInnerText(xmlChild)); + else if(xmlChild.Name == ElemFields) + ImportFields(xmlChild, pe, pd); + else { Debug.Assert(false); } + } + } + + private static void ImportFields(XmlNode xn, PwEntry pe, PwDatabase pd) + { + foreach(XmlNode xmlChild in xn.ChildNodes) + { + if(xmlChild.Name == ElemField) + ImportField(xmlChild, pe, pd); + else { Debug.Assert(false); } + } + } + + private static void ImportField(XmlNode xn, PwEntry pe, PwDatabase pd) + { + string strName = null; + string strValue = null; + + foreach(XmlNode xmlChild in xn.ChildNodes) + { + if(xmlChild.Name == ElemID) { } + else if(xmlChild.Name == ElemName) + strName = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == ElemType) { } + else if(xmlChild.Name == ElemValue) + strValue = XmlUtil.SafeInnerText(xmlChild); + else { Debug.Assert(false); } + } + + if(!string.IsNullOrEmpty(strName) && !string.IsNullOrEmpty(strValue)) + { + string strF = ImportUtil.MapNameToStandardField(strName, true); + if((strName == "Control Panel") || (strName == "Webmail Interface")) + strF = PwDefs.UrlField; + else if(strName == "FTP Address") + strF = strName; + else if(strName == "FTP Username") + strF = "FTP User Name"; + else if(strName == "FTP Password") + strF = strName; + + if(string.IsNullOrEmpty(strF)) strF = strName; + + ImportUtil.AppendToField(pe, strF, strValue, pd, null, true); + } + } + + private static PwIcon GetIcon(string strName) + { + if(string.IsNullOrEmpty(strName)) { Debug.Assert(false); return PwIcon.Key; } + + string str = strName.ToUpperInvariant(); + + if(str == "FOLDER") return PwIcon.Folder; + if(str == "RECORD") return PwIcon.Key; + if(str == "WEBSITE.ICO") return PwIcon.Home; + if(str == "HOSTING.ICO") return PwIcon.NetworkServer; + if(str == "DIALUP.ICO") return PwIcon.WorldSocket; + if(str == "SHOPING.ICO") return PwIcon.ClipboardReady; // Sic + if(str == "AUCTION.ICO") return PwIcon.Tool; + if(str == "MESSENGER.ICO") return PwIcon.UserCommunication; + if(str == "SOFTWARE_SERIALS.ICO") return PwIcon.CDRom; + if(str == "CREDITCARD.ICO") return PwIcon.Identity; + if(str == "MAILBOX.ICO") return PwIcon.EMailBox; + + Debug.Assert(false); + return PwIcon.Key; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PwTresorXml100.cs b/src/KeePass/DataExchange/Formats/PwTresorXml100.cs new file mode 100644 index 0000000..e5e63e9 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PwTresorXml100.cs @@ -0,0 +1,123 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1.0.2001.157 + internal sealed class PwTresorXml100 : FileFormatProvider + { + private const string ElemGroup = "Group"; + private const string ElemGroupName = "groupname"; + + private const string ElemEntry = "PassItem"; + private const string ElemEntryName = "itemname"; + private const string ElemEntryUser = "username"; + private const string ElemEntryPassword = "password"; + private const string ElemEntryURL = "url"; + private const string ElemEntryNotes = "description"; + + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Passwort.Tresor XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + + XmlDocument xmlDoc = XmlUtilEx.CreateXmlDocument(); + xmlDoc.Load(sr); + + XmlNode xmlRoot = xmlDoc.DocumentElement; + + foreach(XmlNode xmlChild in xmlRoot.ChildNodes) + { + if(xmlChild.Name == ElemGroup) + ReadGroup(xmlChild, pwStorage.RootGroup, pwStorage); + else { Debug.Assert(false); } + } + } + + private static void ReadGroup(XmlNode xmlNode, PwGroup pgParent, PwDatabase pwStorage) + { + PwGroup pg = new PwGroup(true, true); + pgParent.AddGroup(pg, true); + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == ElemGroupName) + pg.Name = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == ElemGroup) + ReadGroup(xmlChild, pg, pwStorage); + else if(xmlChild.Name == ElemEntry) + ReadEntry(xmlChild, pg, pwStorage); + else { Debug.Assert(false); } + } + } + + private static void ReadEntry(XmlNode xmlNode, PwGroup pgParent, PwDatabase pwStorage) + { + PwEntry pe = new PwEntry(true, true); + pgParent.AddEntry(pe, true); + + foreach(XmlNode xmlChild in xmlNode) + { + if(xmlChild.Name == ElemEntryName) + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemEntryUser) + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemEntryPassword) + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemEntryURL) + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, + XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == ElemEntryNotes) + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, + XmlUtil.SafeInnerText(xmlChild))); + else { Debug.Assert(false); } + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/PwsPlusCsv1007.cs b/src/KeePass/DataExchange/Formats/PwsPlusCsv1007.cs new file mode 100644 index 0000000..6754ad3 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/PwsPlusCsv1007.cs @@ -0,0 +1,113 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class PwsPlusCsv1007 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Passwords Plus CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strData = sr.ReadToEnd(); + sr.Close(); + + CsvStreamReader csv = new CsvStreamReader(strData, true); + Dictionary dictGroups = new Dictionary(); + + while(true) + { + string[] vLine = csv.ReadLine(); + if(vLine == null) break; + if(vLine.Length == 0) continue; // Skip empty line + if(vLine.Length == 5) continue; // Skip header line + if(vLine.Length != 34) { Debug.Assert(false); continue; } + + string strType = vLine[0].Trim(); + if(strType.Equals("Is Template", StrUtil.CaseIgnoreCmp)) continue; + if(strType.Equals("1")) continue; // Skip template + + string strGroup = vLine[2].Trim(); + PwGroup pg; + if(strGroup.Length == 0) pg = pwStorage.RootGroup; + else + { + if(dictGroups.ContainsKey(strGroup)) pg = dictGroups[strGroup]; + else + { + pg = new PwGroup(true, true, strGroup, PwIcon.Folder); + pwStorage.RootGroup.AddGroup(pg, true); + dictGroups[strGroup] = pg; + } + } + + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + string strTitle = vLine[1].Trim(); + if(strTitle.Length > 0) + ImportUtil.AppendToField(pe, PwDefs.TitleField, strTitle, pwStorage); + + for(int i = 0; i < 10; ++i) + { + string strKey = vLine[(i * 3) + 3].Trim(); + string strValue = vLine[(i * 3) + 4].Trim(); + if((strKey.Length == 0) || (strValue.Length == 0)) continue; + + string strMapped = ImportUtil.MapNameToStandardField(strKey, true); + if(string.IsNullOrEmpty(strMapped)) strMapped = strKey; + ImportUtil.AppendToField(pe, strMapped, strValue, pwStorage); + } + + string strNotesPre = pe.Strings.ReadSafe(PwDefs.NotesField); + string strNotes = vLine[33].Trim(); + if(strNotes.Length > 0) + { + if(strNotesPre.Length == 0) + ImportUtil.AppendToField(pe, PwDefs.NotesField, strNotes, pwStorage); + else + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + ((pwStorage == null) ? false : + pwStorage.MemoryProtection.ProtectNotes), strNotesPre + + Environment.NewLine + Environment.NewLine + strNotes)); + } + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/RevelationXml04.cs b/src/KeePass/DataExchange/Formats/RevelationXml04.cs new file mode 100644 index 0000000..2bad255 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/RevelationXml04.cs @@ -0,0 +1,184 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; +using KeePassLib.Security; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class RevelationXml04 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Revelation XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.UTF8); + string strDoc = sr.ReadToEnd(); + sr.Close(); + + XmlDocument doc = XmlUtilEx.CreateXmlDocument(); + doc.LoadXml(strDoc); + + ProcessEntries(pwStorage, pwStorage.RootGroup, + doc.DocumentElement.ChildNodes); + } + + private static void ProcessEntries(PwDatabase pd, PwGroup pgParent, + XmlNodeList xlNodes) + { + foreach(XmlNode xmlChild in xlNodes) + { + if(xmlChild.Name == "entry") + { + XmlNode xnType = xmlChild.Attributes.GetNamedItem("type"); + if(xnType == null) { Debug.Assert(false); } + else + { + if(xnType.Value == "folder") + ImportGroup(pd, pgParent, xmlChild); + else ImportEntry(pd, pgParent, xmlChild); + } + } + } + } + + private static void ImportGroup(PwDatabase pd, PwGroup pgParent, XmlNode xmlNode) + { + PwGroup pg = new PwGroup(true, true); + pgParent.AddGroup(pg, true); + + foreach(XmlNode xmlChild in xmlNode.ChildNodes) + { + if(xmlChild.Name == "name") + pg.Name = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == "description") + pg.Notes = XmlUtil.SafeInnerText(xmlChild); + else if(xmlChild.Name == "entry") { } + else if(xmlChild.Name == "updated") + pg.LastModificationTime = ImportTime(xmlChild); + else { Debug.Assert(false); } + } + + ProcessEntries(pd, pg, xmlNode.ChildNodes); + } + + private static void ImportEntry(PwDatabase pd, PwGroup pgParent, XmlNode xmlNode) + { + PwEntry pe = new PwEntry(true, true); + pgParent.AddEntry(pe, true); + + foreach(XmlNode xmlChild in xmlNode.ChildNodes) + { + if(xmlChild.Name == "name") + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pd.MemoryProtection.ProtectTitle, XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == "description") + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pd.MemoryProtection.ProtectNotes, XmlUtil.SafeInnerText(xmlChild))); + else if(xmlChild.Name == "updated") + pe.LastModificationTime = ImportTime(xmlChild); + else if(xmlChild.Name == "field") + { + XmlNode xnName = xmlChild.Attributes.GetNamedItem("id"); + if(xnName == null) { Debug.Assert(false); } + else + { + KeyValuePair kvp = MapFieldName(xnName.Value, pd); + pe.Strings.Set(kvp.Key, new ProtectedString(kvp.Value, + XmlUtil.SafeInnerText(xmlChild))); + } + } + else { Debug.Assert(false); } + } + } + + private static KeyValuePair MapFieldName(string strFieldName, + PwDatabase pdContext) + { + switch(strFieldName) + { + case "creditcard-cardnumber": + case "generic-username": + case "generic-location": + case "phone-phonenumber": + return new KeyValuePair(PwDefs.UserNameField, + pdContext.MemoryProtection.ProtectUserName); + case "generic-code": + case "generic-password": + case "generic-pin": + return new KeyValuePair(PwDefs.PasswordField, + pdContext.MemoryProtection.ProtectPassword); + case "generic-hostname": + case "generic-url": + return new KeyValuePair(PwDefs.UrlField, + pdContext.MemoryProtection.ProtectUrl); + case "creditcard-cardtype": + return new KeyValuePair("Card Type", false); + case "creditcard-expirydate": + return new KeyValuePair(KPRes.ExpiryTime, false); + case "creditcard-ccv": + return new KeyValuePair("CCV Number", false); + case "generic-certificate": + return new KeyValuePair("Certificate", false); + case "generic-keyfile": + return new KeyValuePair("Key File", false); + case "generic-database": + return new KeyValuePair(KPRes.Database, false); + case "generic-email": + return new KeyValuePair(KPRes.EMail, false); + case "generic-port": + return new KeyValuePair("Port", false); + case "generic-domain": + return new KeyValuePair("Domain", false); + default: Debug.Assert(false); break; + } + + return new KeyValuePair(strFieldName, false); + } + + private static DateTime ImportTime(XmlNode xn) + { + string str = XmlUtil.SafeInnerText(xn); + + double dtUnix; + if(!double.TryParse(str, out dtUnix)) { Debug.Assert(false); } + else return TimeUtil.ConvertUnixTime(dtUnix); + + return DateTime.UtcNow; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/RoboFormHtml69.cs b/src/KeePass/DataExchange/Formats/RoboFormHtml69.cs new file mode 100644 index 0000000..5f4fb6d --- /dev/null +++ b/src/KeePass/DataExchange/Formats/RoboFormHtml69.cs @@ -0,0 +1,209 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Windows.Forms; + +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 6.9.82-8.4.3.4+ + internal sealed class RoboFormHtml69 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "RoboForm HTML (Logins/PassCards)"; } } + public override string DefaultExtension { get { return "html|htm"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Unicode, true); + string strData = sr.ReadToEnd(); + sr.Close(); + + strData = strData.Replace(@"", string.Empty); + strData = strData.Replace(@"­", string.Empty); + + using(WebBrowser wb = new WebBrowser()) + { + wb.Visible = false; + wb.ScriptErrorsSuppressed = true; + + UIUtil.SetWebBrowserDocument(wb, strData); + ImportPriv(pwStorage, wb.Document.Body); + } + } + + private static string ParseTitle(string strTitle, PwDatabase pd, + out PwGroup pg) + { + pg = pd.RootGroup; + + // In 7.9.5.9 '/' is used; in earlier versions '\\' + char[] vSeps = new char[] { '/', '\\' }; + + int iLastSep = strTitle.LastIndexOfAny(vSeps); + if(iLastSep >= 0) + { + string strTree = strTitle.Substring(0, iLastSep); + pg = pd.RootGroup.FindCreateSubTree(strTree, vSeps, true); + + return strTitle.Substring(iLastSep + 1); + } + + return strTitle; + } + + private static string MapKey(string strKey) + { + string s = ImportUtil.MapNameToStandardField(strKey, true); + if(string.IsNullOrEmpty(s)) return strKey; + + if((s == PwDefs.TitleField) || (s == PwDefs.UrlField)) + return strKey; + + return s; + } + + private static List GetElements(HtmlElement hRoot, + string strTagName, string strAttribName, string strAttribValue) + { + List l = new List(); + if(hRoot == null) { Debug.Assert(false); return l; } + if(string.IsNullOrEmpty(strTagName)) { Debug.Assert(false); return l; } + + foreach(HtmlElement hEl in hRoot.GetElementsByTagName(strTagName)) + { + if(!string.IsNullOrEmpty(strAttribName) && (strAttribValue != null)) + { + string strValue = XmlUtil.SafeAttribute(hEl, strAttribName); + if(!strValue.Equals(strAttribValue, StrUtil.CaseIgnoreCmp)) + continue; + } + + l.Add(hEl); + } + + return l; + } + + private static void ImportPriv(PwDatabase pd, HtmlElement hBody) + { +#if DEBUG + bool bHasSpanCaptions = (GetElements(hBody, "SPAN", "class", + "caption").Count > 0); +#endif + + foreach(HtmlElement hTable in hBody.GetElementsByTagName("TABLE")) + { + Debug.Assert(XmlUtil.SafeAttribute(hTable, "width") == "100%"); + string strRules = XmlUtil.SafeAttribute(hTable, "rules"); + string strFrame = XmlUtil.SafeAttribute(hTable, "frame"); + if(strRules.Equals("cols", StrUtil.CaseIgnoreCmp) && + strFrame.Equals("void", StrUtil.CaseIgnoreCmp)) + continue; + + PwEntry pe = new PwEntry(true, true); + PwGroup pg = null; + bool bNotesHeaderFound = false; + + foreach(HtmlElement hTr in hTable.GetElementsByTagName("TR")) + { + // 7.9.1.1+ + List lCaption = GetElements(hTr, "SPAN", + "class", "caption"); + if(lCaption.Count == 0) + lCaption = GetElements(hTr, "DIV", "class", "caption"); + if(lCaption.Count > 0) + { + string strTitle = ParseTitle(XmlUtil.SafeInnerText( + lCaption[0]), pd, out pg); + ImportUtil.AppendToField(pe, PwDefs.TitleField, strTitle, pd); + continue; // Data is in next TR + } + + // 7.9.1.1+ + if(hTr.GetElementsByTagName("TABLE").Count > 0) continue; + + HtmlElementCollection lTd = hTr.GetElementsByTagName("TD"); + if(lTd.Count == 1) + { + HtmlElement e = lTd[0]; + string strText = XmlUtil.SafeInnerText(e); + string strClass = XmlUtil.SafeAttribute(e, "class"); + + if(strClass.Equals("caption", StrUtil.CaseIgnoreCmp)) + { + Debug.Assert(pg == null); + strText = ParseTitle(strText, pd, out pg); + ImportUtil.AppendToField(pe, PwDefs.TitleField, strText, pd); + } + else if(strClass.Equals("subcaption", StrUtil.CaseIgnoreCmp)) + ImportUtil.AppendToField(pe, PwDefs.UrlField, + ImportUtil.FixUrl(strText), pd); + else if(strClass.Equals("field", StrUtil.CaseIgnoreCmp)) + { + // 7.9.2.5+ + if(strText.EndsWith(":") && !bNotesHeaderFound) + bNotesHeaderFound = true; + else + ImportUtil.AppendToField(pe, PwDefs.NotesField, + strText.Trim(), pd); + } + else { Debug.Assert(false); } + } + else if((lTd.Count == 2) || (lTd.Count == 3)) + { + string strKey = XmlUtil.SafeInnerText(lTd[0]); + string strValue = XmlUtil.SafeInnerText(lTd[lTd.Count - 1]); + if(lTd.Count == 3) { Debug.Assert(string.IsNullOrEmpty(lTd[1].InnerText)); } + + if(strKey.EndsWith(":")) // 7.9.1.1+ + strKey = strKey.Substring(0, strKey.Length - 1); + + if(strKey.Length > 0) + ImportUtil.AppendToField(pe, MapKey(strKey), strValue, pd); + else { Debug.Assert(false); } + } + else { Debug.Assert(false); } + } + + if(pg != null) pg.AddEntry(pe, true); +#if DEBUG + else { Debug.Assert(bHasSpanCaptions); } +#endif + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/SafeWalletXml3.cs b/src/KeePass/DataExchange/Formats/SafeWalletXml3.cs new file mode 100644 index 0000000..30ef9e7 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/SafeWalletXml3.cs @@ -0,0 +1,183 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 2.4.1.2-3.0.7.2022+ + internal sealed class SafeWalletXml3 : FileFormatProvider + { + private static readonly string[] ElemsVault = new string[] { + "T37" // 3.0.5 + }; + private static readonly string[] ElemsGroup = new string[] { + "Folder", // 2.4.1.2 + "T3", // 3.0.5 + "T21" // 3.0.7, special group for web entries + }; + private static readonly string[] ElemsEntry = new string[] { + "Card", // 3.0.4 + "T4" // 3.0.5 + }; + private static readonly string[] ElemsProps = new string[] { + "Property", // 3.0.4 + "T257", "T258", "T259", "T263", "T264", "T265", // 3.0.5 + "T266", "T267" // 3.0.5 + }; + private static readonly string[] ElemsWebEntry = new string[] { + "T22" // 3.0.7 + }; + + private const string AttribCaption = "Caption"; + + private const string AttribWebUrl = "URL"; + private const string AttribWebUserName = "Username"; + private const string AttribWebPassword = "Password"; + + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "SafeWallet XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return false; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Unicode); + string strDoc = sr.ReadToEnd(); + sr.Close(); + + XmlDocument xd = XmlUtilEx.CreateXmlDocument(); + xd.LoadXml(strDoc); + + XmlNode xnRoot = xd.DocumentElement; + Debug.Assert(xnRoot.Name == "SafeWallet"); + foreach(XmlNode xn in xnRoot.ChildNodes) + { + if(Array.IndexOf(ElemsGroup, xn.Name) >= 0) + AddGroup(xn, pwStorage.RootGroup, pwStorage); // 2.4.1.2 + else if(Array.IndexOf(ElemsEntry, xn.Name) >= 0) + AddEntry(xn, pwStorage.RootGroup, pwStorage); // 3.0.4 + else if(Array.IndexOf(ElemsVault, xn.Name) >= 0) + ImportVault(xn, pwStorage); // 3.0.5 + } + } + + private static void AddEntry(XmlNode xnEntry, PwGroup pg, PwDatabase pd) + { + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + XmlNode xnTitle = xnEntry.Attributes.GetNamedItem(AttribCaption); + string strTitle = ((xnTitle != null) ? xnTitle.Value : string.Empty); + ImportUtil.AppendToField(pe, PwDefs.TitleField, strTitle ?? string.Empty, pd); + + foreach(XmlNode xn in xnEntry.ChildNodes) + { + if(Array.IndexOf(ElemsProps, xn.Name) >= 0) + { + XmlNode xnField = xn.Attributes.GetNamedItem(AttribCaption); + string strField = ((xnField != null) ? xnField.Value : null); + if(string.IsNullOrEmpty(strField)) { Debug.Assert(false); } + else + { + string strMap = ImportUtil.MapNameToStandardField(strField, false); + if(string.IsNullOrEmpty(strMap)) strMap = strField; + + ImportUtil.AppendToField(pe, strMap, + XmlUtil.SafeInnerText(xn), pd); + } + } + else { Debug.Assert(false); } // Unknown node + } + } + + private static void AddWebEntry(XmlNode xnEntry, PwGroup pg, PwDatabase pd) + { + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + XmlNode xn = xnEntry.Attributes.GetNamedItem(AttribCaption); + string str = ((xn != null) ? xn.Value : string.Empty); + ImportUtil.AppendToField(pe, PwDefs.TitleField, str ?? string.Empty, pd); + + xn = xnEntry.Attributes.GetNamedItem(AttribWebUrl); + str = ((xn != null) ? xn.Value : string.Empty); + ImportUtil.AppendToField(pe, PwDefs.UrlField, str ?? string.Empty, pd); + + xn = xnEntry.Attributes.GetNamedItem(AttribWebUserName); + str = ((xn != null) ? xn.Value : string.Empty); + ImportUtil.AppendToField(pe, PwDefs.UserNameField, str ?? string.Empty, pd); + + xn = xnEntry.Attributes.GetNamedItem(AttribWebPassword); + str = ((xn != null) ? xn.Value : string.Empty); + ImportUtil.AppendToField(pe, PwDefs.PasswordField, str ?? string.Empty, pd); + } + + private static void ImportVault(XmlNode xnVault, PwDatabase pd) + { + foreach(XmlNode xn in xnVault.ChildNodes) + { + if(Array.IndexOf(ElemsGroup, xn.Name) >= 0) + AddGroup(xn, pd.RootGroup, pd); + else if(Array.IndexOf(ElemsEntry, xn.Name) >= 0) + AddEntry(xn, pd.RootGroup, pd); + else { Debug.Assert(false); } // Unknown node + } + } + + private static void AddGroup(XmlNode xnGrp, PwGroup pgParent, PwDatabase pd) + { + PwGroup pg = new PwGroup(true, true); + pgParent.AddGroup(pg, true); + + XmlNode xnName = xnGrp.Attributes.GetNamedItem(AttribCaption); + string strName = ((xnName != null) ? xnName.Value : null); + if(string.IsNullOrEmpty(strName)) { Debug.Assert(false); strName = KPRes.Group; } + pg.Name = strName; + + foreach(XmlNode xn in xnGrp) + { + if(Array.IndexOf(ElemsGroup, xn.Name) >= 0) + AddGroup(xn, pg, pd); + else if(Array.IndexOf(ElemsEntry, xn.Name) >= 0) + AddEntry(xn, pg, pd); + else if(Array.IndexOf(ElemsWebEntry, xn.Name) >= 0) + AddWebEntry(xn, pg, pd); + else { Debug.Assert(false); } // Unknown node + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/SecurityTxt12.cs b/src/KeePass/DataExchange/Formats/SecurityTxt12.cs new file mode 100644 index 0000000..9ad8632 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/SecurityTxt12.cs @@ -0,0 +1,135 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; + +namespace KeePass.DataExchange.Formats +{ + // 1.2 + internal sealed class SecurityTxt12 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Security TXT"; } } + public override string DefaultExtension { get { return "txt"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + private sealed class SecLine + { + public string Text = string.Empty; + public List SubLines = new List(); + } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + + Stack vGroups = new Stack(); + SecLine secRoot = new SecLine(); + vGroups.Push(secRoot); + + char[] vTrim = new char[] { '\t', '\n', '\r', ' ' }; + + while(true) + { + string str = sr.ReadLine(); + if(str == null) break; + if(str.Length == 0) continue; + + SecLine line = new SecLine(); + line.Text = str.Trim(vTrim); + + int nTabs = CountTabs(str); + + if(nTabs == vGroups.Count) + { + vGroups.Peek().SubLines.Add(line); + vGroups.Push(line); + } + else + { + while(nTabs < (vGroups.Count - 1)) + vGroups.Pop(); + + vGroups.Peek().SubLines.Add(line); + vGroups.Push(line); + } + } + + AddSecLine(pwStorage.RootGroup, secRoot, true, pwStorage); + + sr.Close(); + } + + private static int CountTabs(string str) + { + Debug.Assert(str != null); if(str == null) return 0; + + int nTabs = 0; + + for(int i = 0; i < str.Length; ++i) + { + if(str[i] != '\t') break; + ++nTabs; + } + + return nTabs; + } + + private void AddSecLine(PwGroup pgContainer, SecLine line, bool bIsContainer, + PwDatabase pwParent) + { + if(!bIsContainer) + { + if(line.SubLines.Count > 0) + { + PwGroup pg = new PwGroup(true, true); + pg.Name = line.Text; + + pgContainer.AddGroup(pg, true); + + pgContainer = pg; + } + else + { + PwEntry pe = new PwEntry(true, true); + pgContainer.AddEntry(pe, true); + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwParent.MemoryProtection.ProtectTitle, line.Text)); + } + } + + foreach(SecLine subLine in line.SubLines) + AddSecLine(pgContainer, subLine, false, pwParent); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/Spamex20070328.cs b/src/KeePass/DataExchange/Formats/Spamex20070328.cs new file mode 100644 index 0000000..071894a --- /dev/null +++ b/src/KeePass/DataExchange/Formats/Spamex20070328.cs @@ -0,0 +1,245 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Windows.Forms; + +using KeePass.Forms; +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Resources; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // Originally written on 2007-03-28, updated on 2012-04-15 + internal sealed class Spamex20070328 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Spamex.com"; } } + public override string ApplicationGroup { get { return KPRes.WebSites; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + public override bool RequiresFile { get { return false; } } + + public override Image SmallIcon + { + get { return KeePass.Properties.Resources.B16x16_WWW; } + } + + private const string UrlDomain = "www.spamex.com"; + private const string UrlBase = "https://www.spamex.com"; + + private const string UrlLoginPage = "https://www.spamex.com/tool/"; + private const string UrlIndexPage = "https://www.spamex.com/tool/listaliases.cfm"; + + private const string UrlIndexAliasLink = ""; + private const string StrTabLinkUrl = "/tool/listaliases.cfm"; + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + slLogger.SetText("> Spamex.com...", LogStatusType.Info); + + SingleLineEditForm dlgUser = new SingleLineEditForm(); + dlgUser.InitEx("Spamex.com", KPRes.WebSiteLogin + " - " + KPRes.UserName, + KPRes.UserNamePrompt, KeePass.Properties.Resources.B48x48_WWW, + string.Empty, null); + if(UIUtil.ShowDialogNotValue(dlgUser, DialogResult.OK)) return; + string strUser = dlgUser.ResultString; + UIUtil.DestroyForm(dlgUser); + + SingleLineEditForm dlgPassword = new SingleLineEditForm(); + dlgPassword.InitEx("Spamex.com", KPRes.WebSiteLogin + " - " + KPRes.Password, + KPRes.PasswordPrompt, KeePass.Properties.Resources.B48x48_WWW, + string.Empty, null); + if(UIUtil.ShowDialogNotValue(dlgPassword, DialogResult.OK)) return; + string strPassword = dlgPassword.ResultString; + UIUtil.DestroyForm(dlgPassword); + + RemoteCertificateValidationCallback pPrevCertCb = + ServicePointManager.ServerCertificateValidationCallback; + ServicePointManager.ServerCertificateValidationCallback = + delegate(object sender, X509Certificate certificate, X509Chain chain, + SslPolicyErrors sslPolicyErrors) + { + return true; + }; + + try + { + slLogger.SetText(KPRes.ImportingStatusMsg, LogStatusType.Info); + + string strPostData = @"toollogin=&MetaDomain=&LoginEmail=" + + strUser + @"&LoginPassword=" + strPassword + @"&Remember=1"; + + List> vCookies; + string strMain = NetUtil.WebPageLogin(new Uri(UrlLoginPage), + strPostData, out vCookies); + + if(strMain.IndexOf("Welcome " + strUser + "") < 0) + { + MessageService.ShowWarning(KPRes.InvalidUserPassword); + return; + } + + string strIndexPage = NetUtil.WebPageGetWithCookies(new Uri(UrlIndexPage), + vCookies, UrlDomain); + + ImportIndex(pwStorage, strIndexPage, vCookies, slLogger); + + int nOffset = 0; + List vSubPages = new List(); + while(true) + { + string strLink = StrUtil.GetStringBetween(strIndexPage, nOffset, + StrTabLinksStart, StrTabLinksEnd, out nOffset); + ++nOffset; + + if(strLink.Length == 0) break; + + if(!strLink.StartsWith(StrTabLinkUrl)) continue; + if(vSubPages.IndexOf(strLink) >= 0) continue; + + vSubPages.Add(strLink); + + string strSubPage = NetUtil.WebPageGetWithCookies(new Uri( + UrlBase + strLink), vCookies, UrlDomain); + + ImportIndex(pwStorage, strSubPage, vCookies, slLogger); + } + } + finally + { + ServicePointManager.ServerCertificateValidationCallback = pPrevCertCb; + } + } + + private static void ImportIndex(PwDatabase pwStorage, string strIndexPage, + List> vCookies, IStatusLogger slf) + { + int nOffset = 0; + while(true) + { + int nStart = strIndexPage.IndexOf(UrlIndexAliasLink, nOffset); + if(nStart < 0) break; + + nStart += UrlIndexAliasLink.Length; + + StringBuilder sbCode = new StringBuilder(); + while(true) + { + if(strIndexPage[nStart] == '\"') break; + sbCode.Append(strIndexPage[nStart]); + ++nStart; + } + + ImportAccount(pwStorage, sbCode.ToString(), vCookies, slf); + + nOffset = nStart + 1; + } + } + + private static void ImportAccount(PwDatabase pwStorage, string strID, + List> vCookies, IStatusLogger slf) + { + string strPage = NetUtil.WebPageGetWithCookies(new Uri( + UrlAccountPage + strID), vCookies, UrlDomain); + + PwEntry pe = new PwEntry(true, true); + pwStorage.RootGroup.AddEntry(pe, true); + + string str; + + string strTitle = StrUtil.GetStringBetween(strPage, 0, "Subject : ", ""); + if(strTitle.StartsWith("")) strTitle = strTitle.Substring(3, strTitle.Length - 3); + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, strTitle)); + + string strUser = StrUtil.GetStringBetween(strPage, 0, "Site Username : ", ""); + if(strUser.StartsWith("")) strUser = strUser.Substring(3, strUser.Length - 3); + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, strUser)); + + str = StrUtil.GetStringBetween(strPage, 0, "Site Password : ", ""); + if(str.StartsWith("")) str = str.Substring(3, str.Length - 3); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, str)); + + str = StrUtil.GetStringBetween(strPage, 0, "Site Domain : ", ""); + if(str.StartsWith("")) str = str.Substring(3, str.Length - 3); + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUrl, str)); + + str = StrUtil.GetStringBetween(strPage, 0, "Notes : ", ""); + if(str.StartsWith("")) str = str.Substring(3, str.Length - 3); + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, str)); + + str = StrUtil.GetStringBetween(strPage, 0, "Address: ", ""); + if(str.StartsWith("")) str = str.Substring(3, str.Length - 3); + pe.Strings.Set("Address", new ProtectedString(false, str)); + + str = StrUtil.GetStringBetween(strPage, 0, "Forwards to: ", ""); + if(str.StartsWith("")) str = str.Substring(3, str.Length - 3); + pe.Strings.Set("Forward To", new ProtectedString(false, str)); + + str = StrUtil.GetStringBetween(strPage, 0, "Reply-To Messages: ", ""); + if(str.StartsWith("")) str = str.Substring(3, str.Length - 3); + pe.Strings.Set("Reply-To Messages", new ProtectedString(false, str)); + + str = StrUtil.GetStringBetween(strPage, 0, "Allow Reply From: ", ""); + if(str.StartsWith("")) str = str.Substring(3, str.Length - 3); + pe.Strings.Set("Allow Reply From", new ProtectedString(false, str)); + + str = StrUtil.GetStringBetween(strPage, 0, "Filter Mode: ", ""); + if(str.StartsWith("")) str = str.Substring(3, str.Length - 3); + pe.Strings.Set("Filter Mode", new ProtectedString(false, str)); + + str = StrUtil.GetStringBetween(strPage, 0, "Created: ", ""); + if(str.StartsWith("")) str = str.Substring(3, str.Length - 3); + pe.Strings.Set("Created", new ProtectedString(false, str)); + + slf.SetText(strTitle + " - " + strUser + " (" + strID + ")", + LogStatusType.Info); + + if(!slf.ContinueWork()) + throw new InvalidOperationException(string.Empty); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/SplashIdCsv402.cs b/src/KeePass/DataExchange/Formats/SplashIdCsv402.cs new file mode 100644 index 0000000..6fcec3b --- /dev/null +++ b/src/KeePass/DataExchange/Formats/SplashIdCsv402.cs @@ -0,0 +1,296 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 3.4-5.3+, 8.3.1 confirmed by user, types from web 2020-09 (version 8.3) + internal sealed class SplashIdCsv402 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "SplashID CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return false; } } + + private const string StrHeader = "SplashID Export File"; + + private static SplashIdMapping[] m_vMappings = null; + private static SplashIdMapping[] SplashIdMappings + { + get + { + if(m_vMappings != null) return m_vMappings; + + m_vMappings = new SplashIdMapping[] { + new SplashIdMapping("Addresses", PwIcon.UserCommunication, + new string[] { PwDefs.TitleField, // Name + PwDefs.NotesField, // Address + PwDefs.NotesField, // Address 2 + PwDefs.NotesField, // City + PwDefs.NotesField, // State + PwDefs.NotesField, // Zip Code + PwDefs.NotesField, // Country + PwDefs.UserNameField, // Email + PwDefs.NotesField }), // Phone + new SplashIdMapping("Bank Accounts", PwIcon.Homebanking, + new string[] { PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField, "Name", "Branch", "Phone #" }), + new SplashIdMapping("Bank Accts", PwIcon.Homebanking, + new string[] { PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField, "Name", "Branch", "Phone #" }), + new SplashIdMapping("Birthdays", PwIcon.UserCommunication, + new string[] { PwDefs.TitleField, PwDefs.UserNameField }), + new SplashIdMapping("Calling Cards", PwIcon.UserKey, + new string[] { PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField }), + new SplashIdMapping("Clothes Size", PwIcon.UserCommunication, + new string[] { PwDefs.TitleField, "Shirt Size", "Pant Size", + "Shoe Size", "Dress Size", "Ring Size" }), + new SplashIdMapping("Combinations", PwIcon.Key, + new string[] { PwDefs.TitleField, PwDefs.PasswordField }), + new SplashIdMapping("Credit Cards", PwIcon.Money, + new string[] { PwDefs.TitleField, PwDefs.UserNameField, + "Expiry Date", "Name", PwDefs.PasswordField, "Bank" }), + new SplashIdMapping("Email Accounts", PwIcon.EMail, + new string[] { PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField, "POP3 Host", "SMTP Host" }), + new SplashIdMapping("Email Accts", PwIcon.EMail, + new string[] { PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField, "POP3 Host", "SMTP Host" }), + new SplashIdMapping("Emergency Info", PwIcon.UserCommunication, + new string[] { PwDefs.TitleField, PwDefs.UserNameField }), + new SplashIdMapping("Files", PwIcon.PaperNew, + new string[] { PwDefs.TitleField, PwDefs.NotesField, + PwDefs.UserNameField, "Date" }), + new SplashIdMapping("Frequent Flyer", PwIcon.PaperQ, + new string[] { PwDefs.TitleField, PwDefs.UserNameField, + "Name", "Date" }), + new SplashIdMapping("Identification", PwIcon.UserKey, + new string[] { PwDefs.TitleField, PwDefs.PasswordField, + PwDefs.UserNameField, "Date" }), + new SplashIdMapping("Insurance", PwIcon.ClipboardReady, + new string[] { PwDefs.TitleField, PwDefs.PasswordField, + PwDefs.UserNameField, "Insured", "Date", "Phone #" }), + new SplashIdMapping("Memberships", PwIcon.UserKey, + new string[] { PwDefs.TitleField, PwDefs.PasswordField, + PwDefs.UserNameField, "Date" }), + new SplashIdMapping("Phone Numbers", PwIcon.UserCommunication, + new string[] { PwDefs.TitleField, PwDefs.UserNameField }), + new SplashIdMapping("Prescriptions", PwIcon.ClipboardReady, + new string[] { PwDefs.TitleField, PwDefs.PasswordField, + PwDefs.UserNameField, "Doctor", "Pharmacy", "Phone #" }), + new SplashIdMapping("Serial Numbers", PwIcon.Key, + new string[] { PwDefs.TitleField, PwDefs.PasswordField, + "Date", "Reseller" }), + new SplashIdMapping("Servers", PwIcon.NetworkServer, + new string[] { PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField, PwDefs.UrlField }), + new SplashIdMapping("Vehicle Info", PwIcon.PaperReady, + new string[] { PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField, "Insurance", "Year" }), + new SplashIdMapping("Vehicles", PwIcon.PaperReady, + new string[] { PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField, "Insurance", "Year" }), + new SplashIdMapping("Voice Mail", PwIcon.IRCommunication, + new string[] { PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField }), + new SplashIdMapping("Web Logins", PwIcon.Key, + new string[] { PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField, PwDefs.UrlField }) + }; + return m_vMappings; + } + } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default, true); + string strData = sr.ReadToEnd(); + sr.Close(); + + CsvOptions o = new CsvOptions(); + o.BackslashIsEscape = false; + + CsvStreamReaderEx csv = new CsvStreamReaderEx(strData, o); + + SortedDictionary dictGroups = + new SortedDictionary(); + while(true) + { + string[] vLine = csv.ReadLine(); + if(vLine == null) break; + if(vLine.Length == 0) continue; + + if(vLine.Length == 1) + { + Debug.Assert(vLine[0] == StrHeader); + continue; + } + + // Support old version 3.4 + if(vLine.Length == 9) + { + string[] v = new string[13]; + for(int i = 0; i < 7; ++i) v[i] = vLine[i]; + for(int i = 7; i < 11; ++i) v[i] = string.Empty; + v[11] = vLine[7]; + v[12] = vLine[8]; + + vLine = v; + } + + if(vLine.Length == 13) + ProcessCsvLine(vLine, pwStorage, dictGroups); + else { Debug.Assert(false); } + } + } + + private static void ProcessCsvLine(string[] vLine, PwDatabase pwStorage, + SortedDictionary dictGroups) + { + string strType = ParseCsvWord(vLine[0]); + + string strGroupName = ParseCsvWord(vLine[12]); // + " - " + strType; + if(strGroupName.Length == 0) strGroupName = strType; + + SplashIdMapping mp = null; + foreach(SplashIdMapping mpFind in SplashIdCsv402.SplashIdMappings) + { + if(mpFind.TypeName == strType) + { + mp = mpFind; + break; + } + } + + PwIcon pwIcon = ((mp != null) ? mp.Icon : PwIcon.Key); + + PwGroup pg = null; + if(dictGroups.ContainsKey(strGroupName)) + pg = dictGroups[strGroupName]; + else + { + // PwIcon pwGroupIcon = ((pwIcon == PwIcon.Key) ? + // PwIcon.FolderOpen : pwIcon); + // pg = new PwGroup(true, true, strGroupName, pwGroupIcon); + + pg = new PwGroup(true, true); + pg.Name = strGroupName; + + pwStorage.RootGroup.AddGroup(pg, true); + dictGroups[strGroupName] = pg; + } + + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + pe.IconId = pwIcon; + + StrUtil.AddTags(pe.Tags, StrUtil.StringToTags(strType)); + + for(int iField = 0; iField < 9; ++iField) + { + string strData = ParseCsvWord(vLine[iField + 1]); + if(strData.Length == 0) continue; + + string strLookup = ((mp != null) ? mp.FieldNames[iField] : + null); + string strField = (strLookup ?? ("Field " + (iField + 1).ToString())); + + ImportUtil.AppendToField(pe, strField, strData, pwStorage); + } + + ImportUtil.AppendToField(pe, PwDefs.NotesField, ParseCsvWord(vLine[11]), + pwStorage); + + DateTime? odt = TimeUtil.ParseUSTextDate(ParseCsvWord(vLine[10]), + DateTimeKind.Local); + if(odt.HasValue) + { + DateTime dt = TimeUtil.ToUtc(odt.Value, false); + pe.LastAccessTime = dt; + pe.LastModificationTime = dt; + } + } + + private static string ParseCsvWord(string strWord) + { + if(strWord == null) { Debug.Assert(false); return string.Empty; } + + string str = strWord; + str = str.Replace('\u000B', '\n'); // 0x0B = new line + str = StrUtil.NormalizeNewLines(str, true); + return str; + } + + private sealed class SplashIdMapping + { + private readonly string m_strTypeName; + public string TypeName + { + get { return m_strTypeName; } + } + + private readonly PwIcon m_pwIcon; + public PwIcon Icon + { + get { return m_pwIcon; } + } + + private string[] m_vFieldNames = new string[9]; + public string[] FieldNames + { + get { return m_vFieldNames; } + } + + public SplashIdMapping(string strTypeName, PwIcon pwIcon, string[] vFieldNames) + { + Debug.Assert(strTypeName != null); + if(strTypeName == null) throw new ArgumentNullException("strTypeName"); + + Debug.Assert(vFieldNames != null); + if(vFieldNames == null) throw new ArgumentNullException("vFieldNames"); + + m_strTypeName = strTypeName; + m_pwIcon = pwIcon; + + int nMin = Math.Min(m_vFieldNames.Length, vFieldNames.Length); + for(int i = 0; i < nMin; ++i) + m_vFieldNames[i] = vFieldNames[i]; + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/SteganosCsv20.cs b/src/KeePass/DataExchange/Formats/SteganosCsv20.cs new file mode 100644 index 0000000..3702a71 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/SteganosCsv20.cs @@ -0,0 +1,182 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 20.0.7-22.3.1+ + internal sealed class SteganosCsv20 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Steganos Password Manager CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, StrUtil.Utf8, true); + string strData = sr.ReadToEnd(); + sr.Close(); + + CsvOptions opt = new CsvOptions(); + opt.BackslashIsEscape = false; + // opt.TextQualifier = char.MinValue; // For 20.0.7, not 22.3.1 + opt.TrimFields = true; + + CsvStreamReaderEx csv = new CsvStreamReaderEx(strData, opt); + + string strMapIgnore = Guid.NewGuid().ToString(); + string strMapGroup = Guid.NewGuid().ToString(); + string strMapTags = Guid.NewGuid().ToString(); + string strMapLastMod = Guid.NewGuid().ToString(); + string strMapEMail = Guid.NewGuid().ToString(); + + Dictionary dMaps = new Dictionary( + StrUtil.CaseIgnoreComparer); + dMaps["title"] = PwDefs.TitleField; + dMaps["type"] = strMapIgnore; + dMaps["username_field"] = strMapIgnore; + dMaps["username"] = PwDefs.UserNameField; + dMaps["password_field"] = strMapIgnore; + dMaps["password"] = PwDefs.PasswordField; + dMaps["url"] = PwDefs.UrlField; + dMaps["category"] = strMapGroup; + dMaps["note"] = PwDefs.NotesField; + dMaps["autofill"] = strMapIgnore; + dMaps["autofillenabled"] = strMapIgnore; + dMaps["last_password_change"] = strMapIgnore; + dMaps["lastmodified"] = strMapLastMod; + dMaps["iban"] = PwDefs.UserNameField; + dMaps["bic"] = "BIC"; + dMaps["banking_pin"] = PwDefs.PasswordField; + dMaps["card_number"] = PwDefs.UserNameField; + dMaps["card_holder"] = "Card Holder"; + dMaps["card_pin"] = PwDefs.PasswordField; + dMaps["card_verification_code"] = "Verification Code"; + dMaps["valid_from"] = "Valid From"; + dMaps["valid_thru"] = "Valid To"; + dMaps["name"] = PwDefs.UserNameField; + dMaps["firstname"] = PwDefs.UserNameField; + dMaps["street"] = PwDefs.NotesField; + dMaps["houseno"] = PwDefs.NotesField; + dMaps["zip"] = PwDefs.NotesField; + dMaps["city"] = PwDefs.NotesField; + dMaps["mobile_phone"] = PwDefs.NotesField; + dMaps["phone"] = PwDefs.NotesField; + dMaps["email"] = strMapEMail; + dMaps["birthday"] = "Birthday"; + dMaps["tags"] = strMapTags; + dMaps["keyword"] = strMapTags; + + string[] vNames = csv.ReadLine(); + if((vNames == null) || (vNames.Length == 0)) { Debug.Assert(false); return; } + + for(int i = 0; i < vNames.Length; ++i) + { + string str = vNames[i]; + + if(string.IsNullOrEmpty(str)) { Debug.Assert(false); str = strMapIgnore; } + else + { + string strMapped = null; + dMaps.TryGetValue(str, out strMapped); + + if(string.IsNullOrEmpty(strMapped)) + { + Debug.Assert(false); + strMapped = ImportUtil.MapNameToStandardField(str, true); + if(string.IsNullOrEmpty(strMapped)) strMapped = PwDefs.NotesField; + } + + str = strMapped; + } + + vNames[i] = str; + } + + Dictionary dGroups = new Dictionary(); + + while(true) + { + string[] v = csv.ReadLine(); + if(v == null) break; + if(v.Length == 0) continue; + + PwEntry pe = new PwEntry(true, true); + PwGroup pg = pwStorage.RootGroup; + + for(int i = 0; i < v.Length; ++i) + { + string strValue = v[i]; + if(string.IsNullOrEmpty(strValue)) continue; + + strValue = strValue.Replace(@"", ","); + strValue = strValue.Replace(@"<-N/L-/>", "\n"); + + strValue = StrUtil.NormalizeNewLines(strValue, true); + + string strName = ((i < vNames.Length) ? vNames[i] : PwDefs.NotesField); + + if(strName == strMapIgnore) { } + else if(strName == strMapGroup) + { + dGroups.TryGetValue(strValue, out pg); + if(pg == null) + { + pg = new PwGroup(true, true); + pg.Name = strValue; + + pwStorage.RootGroup.AddGroup(pg, true); + dGroups[strValue] = pg; + } + } + else if(strName == strMapTags) + StrUtil.AddTags(pe.Tags, StrUtil.StringToTags(strValue)); + else if(strName == strMapLastMod) + { + double dUnix; + if(double.TryParse(strValue, out dUnix)) + pe.LastModificationTime = TimeUtil.ConvertUnixTime(dUnix); + else { Debug.Assert(false); } + } + else if(strName == strMapEMail) + ImportUtil.AppendToField(pe, PwDefs.UrlField, + "mailto:" + strValue, pwStorage); + else ImportUtil.AppendToField(pe, strName, strValue, pwStorage); + } + + pg.AddEntry(pe, true); + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/SteganosUI2007.cs b/src/KeePass/DataExchange/Formats/SteganosUI2007.cs new file mode 100644 index 0000000..f2a6209 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/SteganosUI2007.cs @@ -0,0 +1,142 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +using KeePass.App; +using KeePass.Native; +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class SteganosUI2007 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Steganos Password Manager 2007"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool RequiresFile { get { return false; } } + + public override Image SmallIcon + { + get { return KeePass.Properties.Resources.B16x16_View_Detailed; } + } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + if(!MessageService.AskYesNo(KPRes.ImportMustRead + MessageService.NewParagraph + + KPRes.ImportMustReadQuestion)) + { + AppHelp.ShowHelp(AppDefs.HelpTopics.ImportExport, + AppDefs.HelpTopics.ImportExportSteganos); + return; + } + + PwEntry pePrev = new PwEntry(true, true); + + for(int i = 0; i < 20; ++i) + { + Thread.Sleep(500); + Application.DoEvents(); + } + + try + { + while(true) + { + PwEntry pe = ImportEntry(pwStorage); + + if(ImportUtil.EntryEquals(pe, pePrev)) + { + if(pe.ParentGroup != null) // Remove duplicate + pe.ParentGroup.Entries.Remove(pe); + break; + } + + ImportUtil.GuiSendKeysPrc(@"{DOWN}"); + pePrev = pe; + } + + MessageService.ShowInfo(KPRes.ImportFinished); + } + catch(Exception exImp) { MessageService.ShowWarning(exImp); } + } + + private static PwEntry ImportEntry(PwDatabase pwDb) + { + ImportUtil.GuiSendWaitWindowChange(@"{ENTER}"); + Thread.Sleep(1000); + ImportUtil.GuiSendKeysPrc(string.Empty); // Process messages + + string strTitle = ImportUtil.GuiSendRetrieve(string.Empty); + string strGroup = ImportUtil.GuiSendRetrieve(@"{TAB}"); + string strUserName = ImportUtil.GuiSendRetrieve(@"{TAB}"); + ImportUtil.GuiSendKeysPrc(@"{TAB}{TAB}"); + ImportUtil.GuiSendKeysPrc(@" "); + ImportUtil.GuiSendKeysPrc(@"+({TAB})"); + string strPassword = ImportUtil.GuiSendRetrieve(string.Empty); + ImportUtil.GuiSendKeysPrc(@"{TAB} "); + string strNotes = ImportUtil.GuiSendRetrieve(@"{TAB}{TAB}"); + + string strUrl = ImportUtil.GuiSendRetrieve(@"{TAB}"); + string strUrl2 = ImportUtil.GuiSendRetrieve(@"{TAB}"); + + ImportUtil.GuiSendWaitWindowChange(@"{ESC}"); + + if(strGroup.Length == 0) strGroup = "Steganos"; + + PwGroup pg = pwDb.RootGroup.FindCreateGroup(strGroup, true); + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwDb.MemoryProtection.ProtectTitle, strTitle)); + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwDb.MemoryProtection.ProtectUserName, strUserName)); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwDb.MemoryProtection.ProtectPassword, strPassword)); + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwDb.MemoryProtection.ProtectNotes, strNotes)); + + if(strUrl.Length > 0) + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwDb.MemoryProtection.ProtectUrl, strUrl)); + else + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pwDb.MemoryProtection.ProtectUrl, strUrl2)); + + return pe; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/StickyPwXml50.cs b/src/KeePass/DataExchange/Formats/StickyPwXml50.cs new file mode 100644 index 0000000..95acd02 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/StickyPwXml50.cs @@ -0,0 +1,253 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.XPath; + +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // KasperskyPwMgrXml50 derives from this + + // 5.0.4.232-8.4.4+ + internal class StickyPwXml50 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Sticky Password XML"; } } + public override string DefaultExtension { get { return "xml"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + using(XmlReader xr = XmlUtilEx.CreateXmlReader(sInput)) + { + XPathDocument xpDoc = new XPathDocument(xr); + XPathNavigator xpNav = xpDoc.CreateNavigator(); + + Dictionary dGroups = ImportGroups(xpNav, pwStorage); + + ImportLogins(xpNav, dGroups, pwStorage); + ImportMemos(xpNav, dGroups, pwStorage); + } + } + + private static Dictionary ImportGroups(XPathNavigator xpNav, + PwDatabase pd) + { + List l = new List(); // Original order + Dictionary d = new Dictionary(); + Dictionary dParents = new Dictionary(); + + XPathNodeIterator it = xpNav.Select( + "/root/Database/Groups/Group | /root/Database/SecureMemoGroups/Group"); + while(it.MoveNext()) + { + XPathNavigator xpGroup = it.Current; + PwGroup pg = new PwGroup(true, true); + + string strName = xpGroup.GetAttribute("Name", string.Empty); + if(string.IsNullOrEmpty(strName)) { Debug.Assert(false); strName = KPRes.Group; } + pg.Name = strName; + + string strID = xpGroup.GetAttribute("ID", string.Empty); + if(string.IsNullOrEmpty(strID)) { Debug.Assert(false); continue; } + Debug.Assert(!d.ContainsKey(strID)); + + string strParentID = xpGroup.GetAttribute("ParentID", string.Empty); + + l.Add(pg); + d[strID] = pg; + if(!string.IsNullOrEmpty(strParentID)) dParents[pg] = strParentID; + else { Debug.Assert(false); } + } + + foreach(PwGroup pg in l) + { + string strParentID; + if(dParents.TryGetValue(pg, out strParentID)) + { + PwGroup pgParent; + if(d.TryGetValue(strParentID, out pgParent)) + { + if((pgParent != pg) && !pgParent.IsContainedIn(pg)) + { + pgParent.AddGroup(pg, true); + continue; + } + else { Debug.Assert(false); } + } + // else { Debug.Assert(false); } // May be negative ID + } + else { Debug.Assert(false); } + + pd.RootGroup.AddGroup(pg, true); + } + + d[string.Empty] = pd.RootGroup; + return d; + } + + private static void ImportLogins(XPathNavigator xpNav, + Dictionary dGroups, PwDatabase pd) + { + XPathNodeIterator it = xpNav.Select("/root/Database/Logins/Login"); + while(it.MoveNext()) + { + XPathNavigator xpLogin = it.Current; + PwEntry pe = new PwEntry(true, true); + + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pd.MemoryProtection.ProtectUserName, + xpLogin.GetAttribute("Name", string.Empty))); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pd.MemoryProtection.ProtectPassword, + xpLogin.GetAttribute("Password", string.Empty))); + + ImportTimes(xpLogin, pe); + + string strID = xpLogin.GetAttribute("ID", string.Empty); + + XPathNavigator xpAccLogin = (!string.IsNullOrEmpty(strID) ? + xpNav.SelectSingleNode( + "/root/Database/Accounts/Account/LoginLinks/Login[@SourceLoginID='" + + strID + "']/../..") : null); + if(xpAccLogin == null) { Debug.Assert(false); } + else + { + Debug.Assert(xpAccLogin.Name == "Account"); + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pd.MemoryProtection.ProtectTitle, + xpAccLogin.GetAttribute("Name", string.Empty))); + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + pd.MemoryProtection.ProtectUrl, + xpAccLogin.GetAttribute("Link", string.Empty))); + + string strNotes = xpAccLogin.GetAttribute("Comments", string.Empty); + strNotes = strNotes.Replace("/n", Environment.NewLine); + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pd.MemoryProtection.ProtectNotes, strNotes)); + } + + AddToParent(xpAccLogin, pe, dGroups); + } + } + + private static void ImportMemos(XPathNavigator xpNav, + Dictionary dGroups, PwDatabase pd) + { + XPathNodeIterator it = xpNav.Select("/root/Database/SecureMemos/SecureMemo"); + while(it.MoveNext()) + { + XPathNavigator xpMemo = it.Current; + PwEntry pe = new PwEntry(true, true); + + pe.IconId = PwIcon.PaperNew; + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pd.MemoryProtection.ProtectTitle, + xpMemo.GetAttribute("Name", string.Empty))); + + ImportTimes(xpMemo, pe); + + try + { + string strMemoHex = xpMemo.Value; + byte[] pbMemo = MemUtil.HexStringToByteArray(strMemoHex); + string strMemoRtf = Encoding.Unicode.GetString(pbMemo); + + pe.Binaries.Set(KPRes.Notes + ".rtf", new ProtectedBinary( + false, StrUtil.Utf8.GetBytes(strMemoRtf))); + } + catch(Exception) { Debug.Assert(false); } + + AddToParent(xpMemo, pe, dGroups); + } + } + + private static void AddToParent(XPathNavigator xpNav, PwEntry pe, + Dictionary dGroups) + { + if(xpNav != null) + { + string strParentID = xpNav.GetAttribute("ParentID", string.Empty); + if(!string.IsNullOrEmpty(strParentID)) + { + PwGroup pgParent; + if(dGroups.TryGetValue(strParentID, out pgParent)) + { + pgParent.AddEntry(pe, true); + return; + } + } + else { Debug.Assert(false); } + } + + dGroups[string.Empty].AddEntry(pe, true); + } + + private static DateTime? GetTime(XPathNavigator xpNav, string strAttrib) + { + try + { + string str = xpNav.GetAttribute(strAttrib, string.Empty); + if(!string.IsNullOrEmpty(str)) + return TimeUtil.ToUtc(XmlConvert.ToDateTime(str, + XmlDateTimeSerializationMode.Local), false); + } + catch(Exception) { Debug.Assert(false); } + + return null; + } + + private static void ImportTimes(XPathNavigator xpNav, PwEntry pe) + { + DateTime? odt = GetTime(xpNav, "CreatedDate"); + if(odt.HasValue) pe.CreationTime = odt.Value; + else { Debug.Assert(false); } + + odt = GetTime(xpNav, "ModifiedDate"); + if(odt.HasValue) pe.LastModificationTime = odt.Value; + else { Debug.Assert(false); } + + odt = GetTime(xpNav, "ExpirationDate"); + if(odt.HasValue) + { + pe.Expires = true; + pe.ExpiryTime = odt.Value; + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/TrueKeyCsv4.cs b/src/KeePass/DataExchange/Formats/TrueKeyCsv4.cs new file mode 100644 index 0000000..3f35862 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/TrueKeyCsv4.cs @@ -0,0 +1,259 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Text; + +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class TrueKeyCsv4 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "True Key CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, StrUtil.Utf8, true); + string strData = sr.ReadToEnd(); + sr.Close(); + + CsvOptions opt = new CsvOptions(); + opt.BackslashIsEscape = false; + opt.TrimFields = true; + + CsvStreamReaderEx csv = new CsvStreamReaderEx(strData, opt); + + string[] vNames = csv.ReadLine(); + if((vNames == null) || (vNames.Length == 0)) { Debug.Assert(false); return; } + + for(int i = 0; i < vNames.Length; ++i) + vNames[i] = (vNames[i] ?? string.Empty).ToLowerInvariant(); + + while(true) + { + string[] v = csv.ReadLine(); + if(v == null) break; + if(v.Length == 0) continue; + + PwEntry pe = new PwEntry(true, true); + pwStorage.RootGroup.AddEntry(pe, true); + + Debug.Assert(v.Length == vNames.Length); + int m = Math.Min(v.Length, vNames.Length); + + for(int i = 0; i < m; ++i) + { + string strValue = v[i]; + if(string.IsNullOrEmpty(strValue)) continue; + + string strName = vNames[i]; + string strTo = null; + DateTime? odt; + + switch(strName) + { + case "autologin": + case "protectedwithpassword": + case "subdomainonly": + case "type": + case "tk_export_version": + break; // Ignore + + case "kind": + if(strValue.Equals("note", StrUtil.CaseIgnoreCmp)) + pe.IconId = PwIcon.Note; + else if(strValue.Equals("identity", StrUtil.CaseIgnoreCmp) || + strValue.Equals("drivers", StrUtil.CaseIgnoreCmp) || + strValue.Equals("passport", StrUtil.CaseIgnoreCmp) || + strValue.Equals("ssn", StrUtil.CaseIgnoreCmp)) + pe.IconId = PwIcon.Identity; + else if(strValue.Equals("cc", StrUtil.CaseIgnoreCmp)) + pe.IconId = PwIcon.Money; + else if(strValue.Equals("membership", StrUtil.CaseIgnoreCmp)) + pe.IconId = PwIcon.UserKey; + break; + + case "name": + case "title": + strTo = PwDefs.TitleField; + break; + + case "cardholder": + case "email": + case "login": + strTo = PwDefs.UserNameField; + break; + + case "password": + strTo = PwDefs.PasswordField; + break; + + case "url": + case "website": + strTo = PwDefs.UrlField; + break; + + case "document_content": + case "memo": + case "note": + strTo = PwDefs.NotesField; + break; + + case "city": + case "company": + case "country": + case "number": + case "state": + case "street": + case "telephone": + strTo = (new string(char.ToUpperInvariant(strName[0]), 1)) + + strName.Substring(1); + break; + + case "deliveryplace": + strTo = "Delivery Place"; + break; + case "firstname": + strTo = "First Name"; + break; + case "lastname": + strTo = "Last Name"; + break; + case "memberid": + strTo = "Member ID"; + break; + case "phonenumber": + strTo = "Phone Number"; + break; + case "streetnumber": + strTo = "Street Number"; + break; + case "zipcode": + strTo = "ZIP Code"; + break; + + case "dateofbirth": + strTo = "Date of Birth"; + strValue = DateToString(strValue); + break; + + case "expirationdate": + case "expirydate": + odt = ParseTime(strValue); + if(odt.HasValue) + { + pe.Expires = true; + pe.ExpiryTime = odt.Value; + } + break; + + case "favorite": + if(StrUtil.StringToBoolEx(strValue).GetValueOrDefault(false)) + pe.AddTag(PwDefs.FavoriteTag); + break; + + case "gender": + if((strValue == "0") || (strValue == "1")) + { + strTo = "Gender"; + strValue = ((strValue == "0") ? "Male" : "Female"); + } + else { Debug.Assert(false); } + break; + + case "hexcolor": + if((strValue.Length == 6) && StrUtil.IsHexString(strValue, true)) + { + Color c = Color.FromArgb(unchecked((int)(0xFF000000U | + Convert.ToUInt32(strValue, 16)))); + + Color cG = UIUtil.ColorToGrayscale(c); + if(cG.B < 128) c = UIUtil.LightenColor(c, 0.5); + + pe.BackgroundColor = c; + } + else { Debug.Assert(false); } + break; + + case "issuedate": + case "issueddate": + strTo = "Issue Date"; + strValue = DateToString(strValue); + break; + + case "membersince": + strTo = "Member Since"; + strValue = DateToString(strValue); + break; + + default: + Debug.Assert(false); // Unknown field + break; + } + + if(!string.IsNullOrEmpty(strTo)) + ImportUtil.AppendToField(pe, strTo, strValue, pwStorage); + } + } + } + + private static DateTime? ParseTime(string strTime) + { + if(string.IsNullOrEmpty(strTime)) return null; + + DateTime dt; + if(TimeUtil.TryDeserializeUtc(strTime, out dt)) return dt; + + Debug.Assert(false); + return null; + } + + private static string DateToString(string strTime) + { + if(string.IsNullOrEmpty(strTime)) return string.Empty; + + DateTime? odt = ParseTime(strTime); + if(odt.HasValue) + { + DateTime dt = TimeUtil.ToLocal(odt.Value, false); + return TimeUtil.ToDisplayStringDateOnly(dt); + } + + return strTime; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/TurboPwsCsv5.cs b/src/KeePass/DataExchange/Formats/TurboPwsCsv5.cs new file mode 100644 index 0000000..ed5be24 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/TurboPwsCsv5.cs @@ -0,0 +1,117 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; + +namespace KeePass.DataExchange.Formats +{ + // 5.0.1+ + internal sealed class TurboPwsCsv5 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "TurboPasswords CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strData = sr.ReadToEnd(); + sr.Close(); + sInput.Close(); + + Dictionary dGroups = new Dictionary(); + dGroups[string.Empty] = pwStorage.RootGroup; + + CsvOptions opt = new CsvOptions(); + opt.BackslashIsEscape = false; + + CsvStreamReaderEx csv = new CsvStreamReaderEx(strData, opt); + + while(true) + { + string[] v = csv.ReadLine(); + if(v == null) break; + if(v.Length == 0) continue; + if(v[0].StartsWith("TurboPasswords CSV Export File")) continue; + if(v.Length < 24) { Debug.Assert(false); continue; } + if((v[0] == "Category") && (v[1] == "Type")) continue; + + PwEntry pe = new PwEntry(true, true); + + PwGroup pg; + string strGroup = v[0]; + if(!dGroups.TryGetValue(strGroup, out pg)) + { + pg = new PwGroup(true, true, strGroup, PwIcon.Folder); + dGroups[string.Empty].AddGroup(pg, true); + dGroups[strGroup] = pg; + } + pg.AddEntry(pe, true); + + string strType = v[1]; + + for(int f = 0; f < 6; ++f) + { + string strKey = v[2 + (2 * f)]; + string strValue = v[2 + (2 * f) + 1]; + if(strKey.Length == 0) strKey = PwDefs.NotesField; + if(strValue.Length == 0) continue; + + if(strKey == "Description") + strKey = PwDefs.TitleField; + else if(((strType == "Contact") || (strType == "Personal Info")) && + (strKey == "Name")) + strKey = PwDefs.TitleField; + else if(((strType == "Membership") || (strType == "Insurance")) && + (strKey == "Company")) + strKey = PwDefs.TitleField; + else if(strKey == "SSN") + strKey = PwDefs.UserNameField; + else + { + string strMapped = ImportUtil.MapNameToStandardField(strKey, false); + if(!string.IsNullOrEmpty(strMapped)) strKey = strMapped; + } + + ImportUtil.AppendToField(pe, strKey, strValue, pwStorage); + } + + ImportUtil.AppendToField(pe, PwDefs.NotesField, v[20], pwStorage, + "\r\n\r\n", false); + if(v[21].Length > 0) + ImportUtil.AppendToField(pe, "Login URL", v[21], pwStorage, null, true); + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/VisKeeperTxt3.cs b/src/KeePass/DataExchange/Formats/VisKeeperTxt3.cs new file mode 100644 index 0000000..65f077c --- /dev/null +++ b/src/KeePass/DataExchange/Formats/VisKeeperTxt3.cs @@ -0,0 +1,133 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; +using KeePassLib.Security; + +namespace KeePass.DataExchange.Formats +{ + // 3.3.0+ + internal sealed class VisKeeperTxt3 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "VisKeeper TXT"; } } + public override string DefaultExtension { get { return "txt"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default, true); + string strData = sr.ReadToEnd(); + sr.Close(); + + strData = StrUtil.NormalizeNewLines(strData, false); + + const string strInitGroup = "\n\nOrdner:"; + const string strInitTemplate = "\n\nVorlage:"; + const string strInitEntry = "\n\nEintrag:"; + const string strInitNote = "\n\nNotiz:"; + string[] vSeps = new string[] { strInitGroup, strInitTemplate, + strInitEntry, strInitNote }; + + List lData = StrUtil.SplitWithSep(strData, vSeps, true); + Debug.Assert((lData.Count & 1) == 1); + + PwGroup pgRoot = pwStorage.RootGroup; + + PwGroup pgTemplates = new PwGroup(true, true, "Vorlagen", + PwIcon.MarkedDirectory); + pgRoot.AddGroup(pgTemplates, true); + + for(int i = 1; (i + 1) < lData.Count; i += 2) + { + string strInit = lData[i]; + string strPart = lData[i + 1]; + + if(strInit == strInitGroup) { } + else if(strInit == strInitTemplate) + ImportEntry(strPart, pgTemplates, pwStorage, false); + else if(strInit == strInitEntry) + ImportEntry(strPart, pgRoot, pwStorage, false); + else if(strInit == strInitNote) + ImportEntry(strPart, pgRoot, pwStorage, true); + else { Debug.Assert(false); } + } + } + + private static void ImportEntry(string strData, PwGroup pg, PwDatabase pd, + bool bForceNotes) + { + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + string[] v = strData.Split('\n'); + + if(v.Length == 0) { Debug.Assert(false); return; } + ImportUtil.AppendToField(pe, PwDefs.TitleField, v[0].Trim(), pd); + + int n = v.Length; + for(int j = n - 1; j >= 0; --j) + { + if(v[j].Length > 0) break; + --n; + } + + bool bInNotes = bForceNotes; + for(int i = 1; i < n; ++i) + { + string str = v[i]; + + int iSep = str.IndexOf(':'); + if(iSep <= 0) bInNotes = true; + + if(bInNotes) + { + if(str.Length == 0) + ImportUtil.AppendToField(pe, PwDefs.NotesField, + MessageService.NewLine, pd, string.Empty, false); + else + ImportUtil.AppendToField(pe, PwDefs.NotesField, str, pd); + } + else + { + string strRawKey = str.Substring(0, iSep); + string strValue = str.Substring(iSep + 1).Trim(); + + string strKey = ImportUtil.MapNameToStandardField(strRawKey, false); + if(string.IsNullOrEmpty(strKey)) strKey = strRawKey; + + ImportUtil.AppendToField(pe, strKey, strValue, pd); + } + } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/Whisper32Csv116.cs b/src/KeePass/DataExchange/Formats/Whisper32Csv116.cs new file mode 100644 index 0000000..861c429 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/Whisper32Csv116.cs @@ -0,0 +1,158 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 1.16 + internal sealed class Whisper32Csv116 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "Whisper 32 CSV"; } } + public override string DefaultExtension { get { return "csv"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strDocument = sr.ReadToEnd(); + sr.Close(); + + PwGroup pg = pwStorage.RootGroup; + + CharStream cs = new CharStream(strDocument); + string[] vFields = new string[7]; + char[] vDateFieldSplitter = new char[] { '/' }; + char[] vDateZeroTrim = new char[] { '0' }; + + bool bFirst = true; + while(true) + { + bool bSubZero = false; + for(int iField = 0; iField < vFields.Length; ++iField) + { + vFields[iField] = ReadCsvField(cs); + + if((iField > 0) && (vFields[iField] == null)) + bSubZero = true; + } + if(vFields[0] == null) break; // Import successful + else if(bSubZero) throw new FormatException(); + + if(bFirst) + { + bFirst = false; // Check first line once only + + if((vFields[0] != "ServiceName") || (vFields[1] != "UserName") || + (vFields[2] != "Password") || (vFields[3] != "Memo") || + (vFields[4] != "Expire") || (vFields[5] != "StartDate") || + (vFields[6] != "DaysToLive")) + { + Debug.Assert(false); + throw new FormatException(); + } + else continue; + } + + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + pwStorage.MemoryProtection.ProtectTitle, vFields[0])); + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pwStorage.MemoryProtection.ProtectUserName, vFields[1])); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pwStorage.MemoryProtection.ProtectPassword, vFields[2])); + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + pwStorage.MemoryProtection.ProtectNotes, vFields[3])); + + pe.Expires = (vFields[4] == "true"); + + try + { + string[] vDateParts = vFields[5].Split(vDateFieldSplitter); + DateTime dt = (new DateTime( + int.Parse(vDateParts[2].TrimStart(vDateZeroTrim)), + int.Parse(vDateParts[0].TrimStart(vDateZeroTrim)), + int.Parse(vDateParts[1].TrimStart(vDateZeroTrim)), + 0, 0, 0, DateTimeKind.Local)).ToUniversalTime(); + pe.LastModificationTime = dt; + pe.LastAccessTime = dt; + pe.ExpiryTime = dt.AddDays(double.Parse(vFields[6])); + } + catch(Exception) { Debug.Assert(false); } + + pe.Strings.Set("Days To Live", new ProtectedString(false, + vFields[6])); + } + } + + private static string ReadCsvField(CharStream cs) + { + StringBuilder sbValue = new StringBuilder(); + char ch; + + while(true) + { + ch = cs.ReadChar(); + if(ch == char.MinValue) return null; + else if(ch == '\"') break; + } + + while(true) + { + ch = cs.ReadChar(); + + if(ch == char.MinValue) + return null; + else if(ch == '\r') + continue; + else if(ch == '\"') + { + char chSucc = cs.ReadChar(); + + if(chSucc == '\"') sbValue.Append('\"'); + else break; + } + else if(ch == '\n') + sbValue.Append(MessageService.NewLine); + else sbValue.Append(ch); + } + + return sbValue.ToString(); + } + } +} diff --git a/src/KeePass/DataExchange/Formats/WinFavorites10.cs b/src/KeePass/DataExchange/Formats/WinFavorites10.cs new file mode 100644 index 0000000..b217689 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/WinFavorites10.cs @@ -0,0 +1,331 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Text; +using System.Threading; + +using KeePass.Native; +using KeePass.Resources; +using KeePass.Util; +using KeePass.Util.Spr; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +using NativeLib = KeePassLib.Native.NativeLib; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class WinFavorites10 : FileFormatProvider + { + private readonly bool m_bInRoot; + + private const string IniTypeKey = "Type"; + private const string IniTypeValue = "WinFav-Export 1.0"; + + private static readonly string LnkDescSuffix = " [" + + PwDefs.ShortProductName + "]"; + + public override bool SupportsImport { get { return false; } } + public override bool SupportsExport { get { return true; } } + + public override string FormatName + { + get + { + return (KPRes.WindowsFavorites + " (" + (m_bInRoot ? + KPRes.RootDirectory : (KPRes.Folder + " '" + + GetFolderName(true, null, null) + "'")) + ")"); + } + } + public override string ApplicationGroup { get { return KPRes.General; } } + + public override bool RequiresFile { get { return false; } } + + public override Image SmallIcon + { + get { return KeePass.Properties.Resources.B16x16_Services; } + } + + public WinFavorites10(bool bInRoot) : base() + { + m_bInRoot = bInRoot; + } + + private static string GetFolderName(bool bForceRoot, PwExportInfo pwExportInfo, + PwGroup pg) + { + string strBaseName = UrlUtil.FilterFileName(string.IsNullOrEmpty( + Program.Config.Defaults.WinFavsBaseFolderName) ? PwDefs.ShortProductName : + Program.Config.Defaults.WinFavsBaseFolderName); + if(bForceRoot || (pwExportInfo == null) || (pg == null)) + return strBaseName; + + string strGroup = UrlUtil.FilterFileName(pg.Name); + string strRootName = strBaseName; + if(strGroup.Length > 0) strRootName += (" - " + strGroup); + + if(pwExportInfo.ContextDatabase != null) + { + if(pg == pwExportInfo.ContextDatabase.RootGroup) + strRootName = strBaseName; + } + + return strRootName; + } + + public override bool Export(PwExportInfo pwExportInfo, Stream sOutput, + IStatusLogger slLogger) + { + PwGroup pg = pwExportInfo.DataGroup; + if(pg == null) { Debug.Assert(false); return true; } + + string strFavsRoot = Environment.GetFolderPath( + Environment.SpecialFolder.Favorites); + if(string.IsNullOrEmpty(strFavsRoot)) return false; + + uint uTotalGroups, uTotalEntries, uEntriesProcessed = 0; + pwExportInfo.DataGroup.GetCounts(true, out uTotalGroups, out uTotalEntries); + + if(!m_bInRoot) // In folder + { + string strRootName = GetFolderName(false, pwExportInfo, pg); + + string strFavsSub = UrlUtil.EnsureTerminatingSeparator( + strFavsRoot, false) + strRootName; + if(Directory.Exists(strFavsSub)) + { + Directory.Delete(strFavsSub, true); + WaitForDirCommit(strFavsSub, false); + } + + ExportGroup(pwExportInfo.DataGroup, strFavsSub, slLogger, + uTotalEntries, ref uEntriesProcessed, pwExportInfo); + } + else // In root + { + DeletePreviousExport(strFavsRoot, slLogger); + ExportGroup(pwExportInfo.DataGroup, strFavsRoot, slLogger, + uTotalEntries, ref uEntriesProcessed, pwExportInfo); + } + + Debug.Assert(uEntriesProcessed == uTotalEntries); + return true; + } + + private static void ExportGroup(PwGroup pg, string strDir, IStatusLogger slLogger, + uint uTotalEntries, ref uint uEntriesProcessed, PwExportInfo pxi) + { + foreach(PwEntry pe in pg.Entries) + { + ExportEntry(pe, strDir, pxi); + + ++uEntriesProcessed; + if(slLogger != null) + slLogger.SetProgress(((uEntriesProcessed * 50U) / + uTotalEntries) + 50U); + } + + foreach(PwGroup pgSub in pg.Groups) + { + string strGroup = UrlUtil.FilterFileName(pgSub.Name); + string strSub = (UrlUtil.EnsureTerminatingSeparator(strDir, false) + + (!string.IsNullOrEmpty(strGroup) ? strGroup : KPRes.Group)); + + ExportGroup(pgSub, strSub, slLogger, uTotalEntries, + ref uEntriesProcessed, pxi); + } + } + + private static void ExportEntry(PwEntry pe, string strDir, PwExportInfo pxi) + { + PwDatabase pd = ((pxi != null) ? pxi.ContextDatabase : null); + SprContext ctxUrl = new SprContext(pe, pd, SprCompileFlags.NonActive, false, true); + SprContext ctx = ctxUrl.WithoutContentTransformations(); + + KeyValuePair? okvpCmd = null; + string strUrl = SprEngine.Compile(pe.Strings.ReadSafe(PwDefs.UrlField), ctxUrl); + if(WinUtil.IsCommandLineUrl(strUrl)) + { + strUrl = WinUtil.GetCommandLineFromUrl(strUrl); + + if(!NativeLib.IsUnix()) // LNKs only supported on Windows + { + string strApp, strArgs; + StrUtil.SplitCommandLine(strUrl, out strApp, out strArgs); + + if(!string.IsNullOrEmpty(strApp)) + okvpCmd = new KeyValuePair(strApp, strArgs); + } + } + if(string.IsNullOrEmpty(strUrl)) return; + bool bLnk = okvpCmd.HasValue; + + string strTitleCmp = SprEngine.Compile(pe.Strings.ReadSafe(PwDefs.TitleField), ctx); + if(string.IsNullOrEmpty(strTitleCmp)) strTitleCmp = KPRes.Entry; + string strTitle = Program.Config.Defaults.WinFavsFileNamePrefix + strTitleCmp; + + string strSuffix = Program.Config.Defaults.WinFavsFileNameSuffix + + (bLnk ? ".lnk" : ".url"); + strSuffix = UrlUtil.FilterFileName(strSuffix); + + string strFileBase = (UrlUtil.EnsureTerminatingSeparator(strDir, + false) + UrlUtil.FilterFileName(strTitle)); + string strFile = strFileBase + strSuffix; + int iFind = 2; + while(File.Exists(strFile)) + { + strFile = strFileBase + " (" + iFind.ToString() + ")" + strSuffix; + ++iFind; + } + + if(!Directory.Exists(strDir)) + { + try { Directory.CreateDirectory(strDir); } + catch(Exception exDir) + { + throw new Exception(strDir + MessageService.NewParagraph + exDir.Message); + } + + WaitForDirCommit(strDir, true); + } + + try + { + if(bLnk) + { + int ccMaxDesc = NativeMethods.INFOTIPSIZE - 1 - LnkDescSuffix.Length; + string strDesc = StrUtil.CompactString3Dots(strUrl, ccMaxDesc) + + LnkDescSuffix; + + ShellLinkEx sl = new ShellLinkEx(okvpCmd.Value.Key, + okvpCmd.Value.Value, strDesc); + sl.Save(strFile); + } + else + { + StringBuilder sb = new StringBuilder(); + sb.AppendLine(@"[InternetShortcut]"); + sb.AppendLine(@"URL=" + strUrl); // No additional line break + sb.AppendLine(@"[" + PwDefs.ShortProductName + @"]"); + sb.AppendLine(IniTypeKey + @"=" + IniTypeValue); + // Terminating line break is important + + File.WriteAllText(strFile, sb.ToString(), Encoding.Default); + } + } + catch(Exception exWrite) + { + throw new Exception(strFile + MessageService.NewParagraph + exWrite.Message); + } + } + + private static void WaitForDirCommit(string strDir, bool bRequireExists) + { + for(int i = 0; i < 20; ++i) + { + bool bExists = Directory.Exists(strDir); + if(bExists && bRequireExists) return; + if(!bExists && !bRequireExists) return; + + Thread.Sleep(50); + } + } + + private static void DeletePreviousExport(string strDir, IStatusLogger slLogger) + { + List vDirsToDelete = new List(); + + try + { + List lUrlFiles = UrlUtil.GetFilePaths(strDir, "*.url", + SearchOption.AllDirectories); + List lLnkFiles = UrlUtil.GetFilePaths(strDir, "*.lnk", + SearchOption.AllDirectories); + + List lFiles = new List(); + lFiles.AddRange(lUrlFiles); + lFiles.AddRange(lLnkFiles); + + for(int iFile = 0; iFile < lFiles.Count; ++iFile) + { + string strFile = lFiles[iFile]; + try + { + bool bDelete = false; + + if(strFile.EndsWith(".url", StrUtil.CaseIgnoreCmp)) + { + IniFile ini = IniFile.Read(strFile, Encoding.Default); + string strType = ini.Get(PwDefs.ShortProductName, IniTypeKey); + bDelete = ((strType != null) && (strType == IniTypeValue)); + } + else if(strFile.EndsWith(".lnk", StrUtil.CaseIgnoreCmp)) + { + ShellLinkEx sl = ShellLinkEx.Load(strFile); + if(sl != null) + bDelete = ((sl.Description != null) && + sl.Description.EndsWith(LnkDescSuffix)); + } + else { Debug.Assert(false); } + + if(bDelete) + { + File.Delete(strFile); + + string strCont = UrlUtil.GetFileDirectory(strFile, false, true); + if(vDirsToDelete.IndexOf(strCont) < 0) + vDirsToDelete.Add(strCont); + } + } + catch(Exception) { Debug.Assert(false); } + + if(slLogger != null) + slLogger.SetProgress(((uint)iFile * 50U) / (uint)lFiles.Count); + } + + bool bDeleted = true; + while(bDeleted) + { + bDeleted = false; + + for(int i = (vDirsToDelete.Count - 1); i >= 0; --i) + { + try + { + Directory.Delete(vDirsToDelete[i], false); + WaitForDirCommit(vDirsToDelete[i], false); + + vDirsToDelete.RemoveAt(i); + bDeleted = true; + } + catch(Exception) { } // E.g. not empty + } + } + } + catch(Exception) { Debug.Assert(false); } + } + } +} diff --git a/src/KeePass/DataExchange/Formats/XslTransform2x.cs b/src/KeePass/DataExchange/Formats/XslTransform2x.cs new file mode 100644 index 0000000..4485fc0 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/XslTransform2x.cs @@ -0,0 +1,136 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Text; +using System.Windows.Forms; +using System.Xml; +using System.Xml.Xsl; + +using KeePass.App; +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + internal sealed class XslTransform2x : FileFormatProvider + { + private const string ParamXslFile = "XslFile"; + + public override bool SupportsImport { get { return false; } } + public override bool SupportsExport { get { return true; } } + + public override string FormatName { get { return KPRes.XslExporter; } } + public override string ApplicationGroup { get { return KPRes.General; } } + + public override Image SmallIcon + { + get { return FileIcons.GetImageForExtension("xsl", null); } + } + + public override bool Export(PwExportInfo pwExportInfo, Stream sOutput, + IStatusLogger slLogger) + { + string strXslFile; + pwExportInfo.Parameters.TryGetValue(ParamXslFile, out strXslFile); + + if(string.IsNullOrEmpty(strXslFile)) + { + strXslFile = UIGetXslFile(); + + if(string.IsNullOrEmpty(strXslFile)) + return false; + } + + return ExportEx(pwExportInfo, sOutput, slLogger, strXslFile); + } + + private static string UIGetXslFile() + { + string strFilter = UIUtil.CreateFileTypeFilter("xsl", KPRes.XslFileType, true); + OpenFileDialogEx dlgXsl = UIUtil.CreateOpenFileDialog(KPRes.XslSelectFile, + strFilter, 1, "xsl", false, AppDefs.FileDialogContext.Xsl); + + if(dlgXsl.ShowDialog() != DialogResult.OK) return null; + + return dlgXsl.FileName; + } + + private bool ExportEx(PwExportInfo pwExportInfo, Stream sOutput, + IStatusLogger slLogger, string strXslFile) + { + XslCompiledTransform xsl = new XslCompiledTransform(); + try { xsl.Load(strXslFile); } + catch(Exception exXsl) + { + throw new NotSupportedException(strXslFile + MessageService.NewParagraph + + KPRes.NoXslFile + MessageService.NewParagraph + exXsl.Message); + } + + byte[] pbData; + using(MemoryStream ms = new MemoryStream()) + { + PwDatabase pd = (pwExportInfo.ContextDatabase ?? new PwDatabase()); + KdbxFile f = new KdbxFile(pd); + f.Save(ms, pwExportInfo.DataGroup, KdbxFormat.PlainXml, slLogger); + + pbData = ms.ToArray(); + } + if(pbData == null) throw new OutOfMemoryException(); + + XmlWriterSettings xws = xsl.OutputSettings; + if(xws == null) + { + xws = new XmlWriterSettings(); + + xws.CheckCharacters = false; + xws.ConformanceLevel = ConformanceLevel.Auto; + xws.Encoding = StrUtil.Utf8; + // xws.Indent = false; + xws.IndentChars = "\t"; + xws.NewLineChars = MessageService.NewLine; + xws.NewLineHandling = NewLineHandling.None; + xws.OmitXmlDeclaration = true; + } + + using(MemoryStream msIn = new MemoryStream(pbData, false)) + { + using(XmlReader xrIn = XmlUtilEx.CreateXmlReader(msIn)) + { + using(XmlWriter xwOut = XmlWriter.Create(sOutput, xws)) + { + xsl.Transform(xrIn, xwOut); + } + } + } + + MemUtil.ZeroByteArray(pbData); + return true; + } + } +} diff --git a/src/KeePass/DataExchange/Formats/ZdnPwProTxt314.cs b/src/KeePass/DataExchange/Formats/ZdnPwProTxt314.cs new file mode 100644 index 0000000..25c01e5 --- /dev/null +++ b/src/KeePass/DataExchange/Formats/ZdnPwProTxt314.cs @@ -0,0 +1,172 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange.Formats +{ + // 3.1.4 + internal sealed class ZdnPwProTxt314 : FileFormatProvider + { + public override bool SupportsImport { get { return true; } } + public override bool SupportsExport { get { return false; } } + + public override string FormatName { get { return "ZDNet's Password Pro TXT"; } } + public override string DefaultExtension { get { return "txt"; } } + public override string ApplicationGroup { get { return KPRes.PasswordManagers; } } + + public override bool ImportAppendsToRootGroupOnly { get { return true; } } + + private const string StrFieldUser = "User Name: "; + private const string StrFieldPw = "Password: "; + private const string StrFieldUrl = "Shortcut: "; + private const string StrFieldExpires = "Expires: "; + private const string StrFieldType = "Type: "; + private const string StrFieldNotes = "Comments: "; + + public override void Import(PwDatabase pwStorage, Stream sInput, + IStatusLogger slLogger) + { + StreamReader sr = new StreamReader(sInput, Encoding.Default); + string strData = sr.ReadToEnd(); + sr.Close(); + + strData = strData.Replace("\r", string.Empty); + string[] vLines = strData.Split(new char[] { '\n' }); + + if(vLines.Length >= 1) + { + Debug.Assert(vLines[0].StartsWith("Contents of: ")); + vLines[0] = string.Empty; // Trigger 'new entry' below + } + + Dictionary dItems = new Dictionary(); + bool bInNotes = false; + DateTime? dtExpire = null; + + for(int i = 0; i < vLines.Length; ++i) + { + string strLine = vLines[i]; + + if((i + 2) < vLines.Length) + { + string strSep = new string('-', vLines[i + 1].Length); + + if((strLine.Length == 0) && (vLines[i + 2] == strSep) && + (strSep.Length > 0)) + { + AddEntry(pwStorage.RootGroup, dItems, ref bInNotes, ref dtExpire); + dItems.Clear(); + + dItems[PwDefs.TitleField] = vLines[i + 1]; + + i += 2; + continue; + } + } + + if(bInNotes) + { + if(dItems.ContainsKey(PwDefs.NotesField)) + dItems[PwDefs.NotesField] += MessageService.NewLine + strLine; + else dItems[PwDefs.NotesField] = strLine; + } + else if(strLine.StartsWith(StrFieldUser)) + AddField(dItems, PwDefs.UserNameField, strLine.Substring( + StrFieldUser.Length)); + else if(strLine.StartsWith(StrFieldPw)) + AddField(dItems, PwDefs.PasswordField, strLine.Substring( + StrFieldPw.Length)); + else if(strLine.StartsWith(StrFieldUrl)) + AddField(dItems, PwDefs.UrlField, strLine.Substring( + StrFieldUrl.Length)); + else if(strLine.StartsWith(StrFieldType)) + AddField(dItems, "Type", strLine.Substring(StrFieldType.Length)); + else if(strLine.StartsWith(StrFieldExpires)) + { + string strExp = strLine.Substring(StrFieldExpires.Length); + + DateTime dtExp; + if(DateTime.TryParse(strExp, out dtExp)) + dtExpire = TimeUtil.ToUtc(dtExp, false); + else { Debug.Assert(false); } + } + else if(strLine.StartsWith(StrFieldNotes)) + { + AddField(dItems, PwDefs.NotesField, strLine.Substring( + StrFieldNotes.Length)); + bInNotes = true; + } + else { Debug.Assert(false); } + } + + AddEntry(pwStorage.RootGroup, dItems, ref bInNotes, ref dtExpire); + Debug.Assert(!dtExpire.HasValue); + } + + private static void AddField(Dictionary dItems, + string strKey, string strValue) + { + if(!dItems.ContainsKey(strKey)) + { + dItems[strKey] = strValue; + return; + } + + string strPreValue = dItems[strKey]; + if((strPreValue.Length > 0) && (strValue.Length > 0)) + strPreValue += ", "; + + dItems[strKey] = strPreValue + strValue; + } + + private static void AddEntry(PwGroup pg, Dictionary dItems, + ref bool bInNotes, ref DateTime? dtExpire) + { + if(dItems.Count > 0) + { + PwEntry pe = new PwEntry(true, true); + pg.AddEntry(pe, true); + + foreach(KeyValuePair kvp in dItems) + pe.Strings.Set(kvp.Key, new ProtectedString(false, kvp.Value)); + + if(dtExpire.HasValue) + { + pe.Expires = true; + pe.ExpiryTime = dtExpire.Value; + } + } + + bInNotes = false; + dtExpire = null; + } + } +} diff --git a/src/KeePass/DataExchange/GxiImporter.cs b/src/KeePass/DataExchange/GxiImporter.cs new file mode 100644 index 0000000..b17553a --- /dev/null +++ b/src/KeePass/DataExchange/GxiImporter.cs @@ -0,0 +1,383 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.XPath; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange +{ + public static class GxiImporter + { + private sealed class GxiContext // Immutable + { + private PwDatabase m_pd; + public PwDatabase Database { get { return m_pd; } } + + private PwGroup m_pg; + public PwGroup Group { get { return m_pg; } } + + private PwEntry m_pe; + public PwEntry Entry { get { return m_pe; } } + + private Dictionary m_dStringKeyRepl; + public Dictionary StringKeyRepl { get { return m_dStringKeyRepl; } } + private Dictionary m_dStringValueRepl; + public Dictionary StringValueRepl { get { return m_dStringValueRepl; } } + private Dictionary m_dStringKeyRepl2; + public Dictionary StringKeyRepl2 { get { return m_dStringKeyRepl2; } } + private Dictionary m_dStringValueRepl2; + public Dictionary StringValueRepl2 { get { return m_dStringValueRepl2; } } + private Dictionary m_dBinaryKeyRepl; + public Dictionary BinaryKeyRepl { get { return m_dBinaryKeyRepl; } } + + public GxiContext(GxiProfile p, PwDatabase pd, PwGroup pg, PwEntry pe) + { + m_pd = pd; + m_pg = pg; + m_pe = pe; + + m_dStringKeyRepl = GxiImporter.ParseRepl(p.StringKeyRepl); + m_dStringValueRepl = GxiImporter.ParseRepl(p.StringValueRepl); + m_dStringKeyRepl2 = GxiImporter.ParseRepl(p.StringKeyRepl2); + m_dStringValueRepl2 = GxiImporter.ParseRepl(p.StringValueRepl2); + m_dBinaryKeyRepl = GxiImporter.ParseRepl(p.BinaryKeyRepl); + } + + public GxiContext ModifyWith(PwGroup pg) + { + GxiContext c = (GxiContext)MemberwiseClone(); + Debug.Assert(object.ReferenceEquals(c.m_dStringKeyRepl, m_dStringKeyRepl)); + + c.m_pg = pg; + return c; + } + + public GxiContext ModifyWith(PwEntry pe) + { + GxiContext c = (GxiContext)MemberwiseClone(); + Debug.Assert(object.ReferenceEquals(c.m_dStringKeyRepl, m_dStringKeyRepl)); + + c.m_pe = pe; + return c; + } + } + + private delegate void ImportObjectDelegate(XPathNavigator xpRoot, + GxiProfile p, GxiContext c); + + public static void Import(PwGroup pgStorage, Stream s, GxiProfile p, + PwDatabase pdContext, IStatusLogger sl) + { + if(pgStorage == null) throw new ArgumentNullException("pgStorage"); + if(s == null) throw new ArgumentNullException("s"); + if(p == null) throw new ArgumentNullException("p"); + if(pdContext == null) throw new ArgumentNullException("pdContext"); + // sl may be null + + // Import into virtual group first, in order to realize + // an all-or-nothing import + PwGroup pgVirt = new PwGroup(true, true); + + try { ImportPriv(pgVirt, s, p, pdContext, sl); } + finally { s.Close(); } + + foreach(PwGroup pg in pgVirt.Groups) + pgStorage.AddGroup(pg, true); + foreach(PwEntry pe in pgVirt.Entries) + pgStorage.AddEntry(pe, true); + } + + private static void ImportPriv(PwGroup pgStorage, Stream s, GxiProfile p, + PwDatabase pdContext, IStatusLogger sl) + { + StrEncodingInfo sei = StrUtil.GetEncoding(p.Encoding); + StreamReader srRaw; + if((sei != null) && (sei.Encoding != null)) + srRaw = new StreamReader(s, sei.Encoding, true); + else srRaw = new StreamReader(s, true); + string strDoc = srRaw.ReadToEnd(); + srRaw.Close(); + + strDoc = Preprocess(strDoc, p); + + using(StringReader srDoc = new StringReader(strDoc)) + { + using(XmlReader xr = XmlReader.Create(srDoc, + XmlUtilEx.CreateXmlReaderSettings())) + { + XPathDocument xd = new XPathDocument(xr); + + GxiContext c = new GxiContext(p, pdContext, pgStorage, null); + + XPathNavigator xpDoc = xd.CreateNavigator(); + ImportObject(xpDoc, p, p.RootXPath, "/*", GxiImporter.ImportRoot, c); + } + } + } + + private static string Preprocess(string strDoc, GxiProfile p) + { + string str = strDoc; + if(str == null) { Debug.Assert(false); return string.Empty; } + + if(p.RemoveInvalidChars) str = StrUtil.SafeXmlString(str); + if(p.DecodeHtmlEntities) str = XmlUtil.DecodeHtmlEntities(str); + + return str; + } + + private static XPathNodeIterator QueryNodes(XPathNavigator xpBase, + string strXPath, string strAltXPath) + { + if(xpBase == null) { Debug.Assert(false); return null; } + + string strX = (string.IsNullOrEmpty(strXPath) ? strAltXPath : strXPath); + if(string.IsNullOrEmpty(strX)) return null; + + return xpBase.Select(strX); + } + + private static string QueryValue(XPathNavigator xpBase, string strXPath, + bool bQueryName) + { + if(xpBase == null) { Debug.Assert(false); return null; } + if(string.IsNullOrEmpty(strXPath)) return null; + + XPathNavigator xp = xpBase.SelectSingleNode(strXPath); + if(xp == null) return null; + + return (bQueryName ? xp.Name : xp.Value); + } + + private static string QueryValueSafe(XPathNavigator xpBase, string strXPath) + { + return (QueryValue(xpBase, strXPath, false) ?? string.Empty); + } + + // private static string QueryValueSafe(XPathNavigator xpBase, string strXPath, + // bool bQueryName) + // { + // return (QueryValue(xpBase, strXPath, bQueryName) ?? string.Empty); + // } + + private static void ImportObject(XPathNavigator xpBase, GxiProfile p, + string strXPath, string strAltXPath, ImportObjectDelegate f, + GxiContext c) + { + if(f == null) { Debug.Assert(false); return; } + + XPathNodeIterator xi = QueryNodes(xpBase, strXPath, strAltXPath); + if(xi == null) return; // No assert + foreach(XPathNavigator xp in xi) { f(xp, p, c); } + } + + private static void ImportRoot(XPathNavigator xpBase, GxiProfile p, + GxiContext c) + { + ImportObject(xpBase, p, p.GroupXPath, null, GxiImporter.ImportGroup, c); + + if(p.EntriesInRoot) + ImportObject(xpBase, p, p.EntryXPath, null, GxiImporter.ImportEntry, c); + } + + private static void ImportGroup(XPathNavigator xpBase, GxiProfile p, + GxiContext c) + { + PwGroup pg = new PwGroup(true, true); + c.Group.AddGroup(pg, true); + + GxiContext cSub = c.ModifyWith(pg); + + pg.Name = QueryValueSafe(xpBase, p.GroupNameXPath); + if(pg.Name.Length == 0) pg.Name = KPRes.Group; + + if(p.GroupsInGroup) + ImportObject(xpBase, p, p.GroupXPath, null, GxiImporter.ImportGroup, cSub); + if(p.EntriesInGroup) + ImportObject(xpBase, p, p.EntryXPath, null, GxiImporter.ImportEntry, cSub); + } + + private static void ImportEntry(XPathNavigator xpBase, GxiProfile p, + GxiContext c) + { + PwEntry pe = new PwEntry(true, true); + + PwGroup pg = c.Group; // Not the database root group + string strGroupPath = QueryValueSafe(xpBase, p.EntryGroupXPath); + string strGroupPath2 = QueryValueSafe(xpBase, p.EntryGroupXPath2); + if((strGroupPath.Length > 0) && (strGroupPath2.Length > 0)) + { + Debug.Assert(p.EntryGroupSep.Length > 0); + strGroupPath = strGroupPath + p.EntryGroupSep + strGroupPath2; + } + if(strGroupPath.Length > 0) + { + if(p.EntryGroupSep.Length == 0) + pg = pg.FindCreateGroup(strGroupPath, true); + else + pg = pg.FindCreateSubTree(strGroupPath, new string[1]{ + p.EntryGroupSep }, true); + } + pg.AddEntry(pe, true); + + GxiContext cSub = c.ModifyWith(pe); + + ImportObject(xpBase, p, p.StringKvpXPath, null, + GxiImporter.ImportStringKvp, cSub); + ImportObject(xpBase, p, p.StringKvpXPath2, null, + GxiImporter.ImportStringKvp2, cSub); + ImportObject(xpBase, p, p.BinaryKvpXPath, null, + GxiImporter.ImportBinaryKvp, cSub); + } + + private static void ImportStringKvp(XPathNavigator xpBase, GxiProfile p, + GxiContext c) + { + ImportStringKvpEx(xpBase, p, c, true); + } + + private static void ImportStringKvp2(XPathNavigator xpBase, GxiProfile p, + GxiContext c) + { + ImportStringKvpEx(xpBase, p, c, false); + } + + private static void ImportStringKvpEx(XPathNavigator xpBase, GxiProfile p, + GxiContext c, bool bFirst) + { + string strKey = QueryValue(xpBase, (bFirst ? p.StringKeyXPath : + p.StringKeyXPath2), (bFirst ? p.StringKeyUseName : + p.StringKeyUseName2)); + if(string.IsNullOrEmpty(strKey)) return; + + strKey = ApplyRepl(strKey, (bFirst ? c.StringKeyRepl : c.StringKeyRepl2)); + if(strKey.Length == 0) return; + + if(p.StringKeyToStd) + { + string strMapped = ImportUtil.MapNameToStandardField(strKey, + p.StringKeyToStdFuzzy); + if(!string.IsNullOrEmpty(strMapped)) strKey = strMapped; + } + + string strValue = QueryValueSafe(xpBase, (bFirst ? p.StringValueXPath : + p.StringValueXPath2)); + strValue = ApplyRepl(strValue, (bFirst ? c.StringValueRepl : + c.StringValueRepl2)); + + ImportUtil.AppendToField(c.Entry, strKey, strValue, c.Database); + } + + private static void ImportBinaryKvp(XPathNavigator xpBase, GxiProfile p, + GxiContext c) + { + string strKey = QueryValue(xpBase, p.BinaryKeyXPath, p.BinaryKeyUseName); + if(string.IsNullOrEmpty(strKey)) return; + + strKey = ApplyRepl(strKey, c.BinaryKeyRepl); + if(strKey.Length == 0) return; + + string strValue = QueryValueSafe(xpBase, p.BinaryValueXPath); + + byte[] pbValue = null; + if(p.BinaryValueEncoding == GxiBinaryEncoding.Base64) + pbValue = Convert.FromBase64String(strValue); + else if(p.BinaryValueEncoding == GxiBinaryEncoding.Hex) + pbValue = MemUtil.HexStringToByteArray(strValue); + else { Debug.Assert(false); } + + if(pbValue == null) return; + + c.Entry.Binaries.Set(strKey, new ProtectedBinary(false, pbValue)); + } + + internal static Dictionary ParseRepl(string str) + { + Dictionary d = new Dictionary(); + if(str == null) { Debug.Assert(false); return d; } + + CharStream cs = new CharStream(str + ",,"); + StringBuilder sb = new StringBuilder(); + string strKey = string.Empty; + bool bValue = false; + + while(true) + { + char ch = cs.ReadChar(); + if(ch == char.MinValue) break; + + if(ch == ',') + { + if(!bValue) + { + strKey = sb.ToString(); + sb.Remove(0, sb.Length); + } + + if(strKey.Length > 0) d[strKey] = sb.ToString(); + + sb.Remove(0, sb.Length); + bValue = false; + } + else if(ch == '>') + { + strKey = sb.ToString(); + + sb.Remove(0, sb.Length); + bValue = true; + } + else if(ch == '\\') + { + char chSub = cs.ReadChar(); + + if(chSub == 'n') sb.Append('\n'); + else if(chSub == 'r') sb.Append('\r'); + else if(chSub == 't') sb.Append('\t'); + else sb.Append(chSub); + } + else sb.Append(ch); + } + + return d; + } + + private static string ApplyRepl(string str, Dictionary dRepl) + { + if(str == null) { Debug.Assert(false); return string.Empty; } + if(dRepl == null) { Debug.Assert(false); return str; } + + string strOut; + if(dRepl.TryGetValue(str, out strOut)) return strOut; + return str; + } + } +} diff --git a/src/KeePass/DataExchange/GxiProfile.cs b/src/KeePass/DataExchange/GxiProfile.cs new file mode 100644 index 0000000..ffd020f --- /dev/null +++ b/src/KeePass/DataExchange/GxiProfile.cs @@ -0,0 +1,387 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml.Serialization; +using System.ComponentModel; +using System.Diagnostics; + +using KeePassLib.Utility; + +namespace KeePass.DataExchange +{ + public enum GxiBinaryEncoding + { + Base64 = 0, + Hex, + + Count // Virtual + } + + public sealed class GxiProfile + { + private StrEncodingType m_tEnc = StrEncodingType.Unknown; + public StrEncodingType Encoding + { + get { return m_tEnc; } + set { m_tEnc = value; } + } + + private bool m_bRemoveInvChars = true; + [DefaultValue(true)] + public bool RemoveInvalidChars + { + get { return m_bRemoveInvChars; } + set { m_bRemoveInvChars = value; } + } + + private bool m_bDecodeHtmlEnt = true; + [DefaultValue(true)] + public bool DecodeHtmlEntities + { + get { return m_bDecodeHtmlEnt; } + set { m_bDecodeHtmlEnt = value; } + } + + private string m_strRootXPath = string.Empty; + [DefaultValue("")] + public string RootXPath + { + get { return m_strRootXPath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strRootXPath = value; + } + } + + private string m_strGroupXPath = string.Empty; + [DefaultValue("")] + public string GroupXPath + { + get { return m_strGroupXPath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strGroupXPath = value; + } + } + + private string m_strGroupNameXPath = string.Empty; + [DefaultValue("")] + public string GroupNameXPath + { + get { return m_strGroupNameXPath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strGroupNameXPath = value; + } + } + + private string m_strEntryXPath = string.Empty; + [DefaultValue("")] + public string EntryXPath + { + get { return m_strEntryXPath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strEntryXPath = value; + } + } + + private string m_strStringKvpXPath = string.Empty; + [DefaultValue("")] + public string StringKvpXPath + { + get { return m_strStringKvpXPath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strStringKvpXPath = value; + } + } + + private string m_strStringKeyXPath = string.Empty; + [DefaultValue("")] + public string StringKeyXPath + { + get { return m_strStringKeyXPath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strStringKeyXPath = value; + } + } + + private bool m_bStringKeyUseName = false; + [DefaultValue(false)] + public bool StringKeyUseName + { + get { return m_bStringKeyUseName; } + set { m_bStringKeyUseName = value; } + } + + private string m_strStringKeyRepl = string.Empty; + [DefaultValue("")] + public string StringKeyRepl + { + get { return m_strStringKeyRepl; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strStringKeyRepl = value; + } + } + + private string m_strStringValueXPath = string.Empty; + [DefaultValue("")] + public string StringValueXPath + { + get { return m_strStringValueXPath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strStringValueXPath = value; + } + } + + private string m_strStringValueRepl = string.Empty; + [DefaultValue("")] + public string StringValueRepl + { + get { return m_strStringValueRepl; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strStringValueRepl = value; + } + } + + private string m_strStringKvpXPath2 = string.Empty; + [DefaultValue("")] + public string StringKvpXPath2 + { + get { return m_strStringKvpXPath2; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strStringKvpXPath2 = value; + } + } + + private string m_strStringKeyXPath2 = string.Empty; + [DefaultValue("")] + public string StringKeyXPath2 + { + get { return m_strStringKeyXPath2; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strStringKeyXPath2 = value; + } + } + + private bool m_bStringKeyUseName2 = false; + [DefaultValue(false)] + public bool StringKeyUseName2 + { + get { return m_bStringKeyUseName2; } + set { m_bStringKeyUseName2 = value; } + } + + private string m_strStringKeyRepl2 = string.Empty; + [DefaultValue("")] + public string StringKeyRepl2 + { + get { return m_strStringKeyRepl2; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strStringKeyRepl2 = value; + } + } + + private string m_strStringValueXPath2 = string.Empty; + [DefaultValue("")] + public string StringValueXPath2 + { + get { return m_strStringValueXPath2; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strStringValueXPath2 = value; + } + } + + private string m_strStringValueRepl2 = string.Empty; + [DefaultValue("")] + public string StringValueRepl2 + { + get { return m_strStringValueRepl2; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strStringValueRepl2 = value; + } + } + + private string m_strBinaryKvpXPath = string.Empty; + [DefaultValue("")] + public string BinaryKvpXPath + { + get { return m_strBinaryKvpXPath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strBinaryKvpXPath = value; + } + } + + private string m_strBinaryKeyXPath = string.Empty; + [DefaultValue("")] + public string BinaryKeyXPath + { + get { return m_strBinaryKeyXPath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strBinaryKeyXPath = value; + } + } + + private bool m_bBinaryKeyUseName = false; + [DefaultValue(false)] + public bool BinaryKeyUseName + { + get { return m_bBinaryKeyUseName; } + set { m_bBinaryKeyUseName = value; } + } + + private string m_strBinaryKeyRepl = string.Empty; + [DefaultValue("")] + public string BinaryKeyRepl + { + get { return m_strBinaryKeyRepl; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strBinaryKeyRepl = value; + } + } + + private string m_strBinaryValueXPath = string.Empty; + [DefaultValue("")] + public string BinaryValueXPath + { + get { return m_strBinaryValueXPath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strBinaryValueXPath = value; + } + } + + private GxiBinaryEncoding m_beBinValue = GxiBinaryEncoding.Base64; + public GxiBinaryEncoding BinaryValueEncoding + { + get { return m_beBinValue; } + set { m_beBinValue = value; } + } + + private string m_strEntryGroupXPath = string.Empty; + [DefaultValue("")] + public string EntryGroupXPath + { + get { return m_strEntryGroupXPath; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strEntryGroupXPath = value; + } + } + + private string m_strEntryGroupXPath2 = string.Empty; + [DefaultValue("")] + public string EntryGroupXPath2 + { + get { return m_strEntryGroupXPath2; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strEntryGroupXPath2 = value; + } + } + + private string m_strEntryGroupSep = string.Empty; + [DefaultValue("")] + public string EntryGroupSep + { + get { return m_strEntryGroupSep; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strEntryGroupSep = value; + } + } + + private bool m_bEntriesInRoot = true; + [DefaultValue(true)] + public bool EntriesInRoot + { + get { return m_bEntriesInRoot; } + set { m_bEntriesInRoot = value; } + } + + private bool m_bEntriesInGroup = true; + [DefaultValue(true)] + public bool EntriesInGroup + { + get { return m_bEntriesInGroup; } + set { m_bEntriesInGroup = value; } + } + + private bool m_bGroupsInGroup = true; + [DefaultValue(true)] + public bool GroupsInGroup + { + get { return m_bGroupsInGroup; } + set { m_bGroupsInGroup = value; } + } + + private bool m_bStringKeyToStd = true; + [DefaultValue(true)] + public bool StringKeyToStd + { + get { return m_bStringKeyToStd; } + set { m_bStringKeyToStd = value; } + } + + private bool m_bStringKeyToStdFuzzy = false; + [DefaultValue(false)] + public bool StringKeyToStdFuzzy + { + get { return m_bStringKeyToStdFuzzy; } + set { m_bStringKeyToStdFuzzy = value; } + } + } +} diff --git a/src/KeePass/DataExchange/ImportUtil.cs b/src/KeePass/DataExchange/ImportUtil.cs new file mode 100644 index 0000000..dbed424 --- /dev/null +++ b/src/KeePass/DataExchange/ImportUtil.cs @@ -0,0 +1,732 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +using KeePass.App; +using KeePass.DataExchange.Formats; +using KeePass.Ecas; +using KeePass.Forms; +using KeePass.Native; +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Collections; +using KeePassLib.Interfaces; +using KeePassLib.Keys; +using KeePassLib.Resources; +using KeePassLib.Security; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +namespace KeePass.DataExchange +{ + public static class ImportUtil + { + public static bool? Import(PwDatabase pwStorage, out bool bAppendedToRootOnly, + Form fParent) + { + bAppendedToRootOnly = false; + + if(pwStorage == null) throw new ArgumentNullException("pwStorage"); + if(!pwStorage.IsOpen) { Debug.Assert(false); return null; } + if(!AppPolicy.Try(AppPolicyId.Import)) return null; + + ExchangeDataForm dlg = new ExchangeDataForm(); + dlg.InitEx(false, pwStorage, pwStorage.RootGroup); + + if(UIUtil.ShowDialogNotValue(dlg, DialogResult.OK)) return null; + + FileFormatProvider ffp = dlg.ResultFormat; + if(ffp == null) + { + Debug.Assert(false); + MessageService.ShowWarning(KPRes.ImportFailed); + UIUtil.DestroyForm(dlg); + return null; + } + + bAppendedToRootOnly = ffp.ImportAppendsToRootGroupOnly; + + List lConnections = new List(); + foreach(string strFile in dlg.ResultFiles) + lConnections.Add(IOConnectionInfo.FromPath(strFile)); + + UIUtil.DestroyForm(dlg); + return Import(pwStorage, ffp, lConnections.ToArray(), false, null, + false, fParent); + } + + public static bool? Import(PwDatabase pwDatabase, FileFormatProvider fmtImp, + IOConnectionInfo[] vConnections, bool bSynchronize, IUIOperations uiOps, + bool bForceSave, Form fParent) + { + if(pwDatabase == null) throw new ArgumentNullException("pwDatabase"); + if(!pwDatabase.IsOpen) { Debug.Assert(false); return null; } + if(fmtImp == null) throw new ArgumentNullException("fmtImp"); + if(vConnections == null) throw new ArgumentNullException("vConnections"); + + if(!AppPolicy.Try(AppPolicyId.Import)) return null; + if(!fmtImp.TryBeginImport()) return null; + + MainForm mf = Program.MainForm; // Null for KPScript + bool bUseTempDb = (fmtImp.SupportsUuids || fmtImp.RequiresKey); + bool bAllSuccess = true; + + IStatusLogger dlgStatus; + if(Program.Config.UI.ShowImportStatusDialog || + ((mf != null) && !mf.HasFormLoaded)) + dlgStatus = new OnDemandStatusDialog(false, fParent); + else dlgStatus = new UIBlockerStatusLogger(fParent); + + dlgStatus.StartLogging(PwDefs.ShortProductName + " - " + (bSynchronize ? + KPRes.Synchronizing : KPRes.ImportingStatusMsg), false); + dlgStatus.SetText(bSynchronize ? KPRes.Synchronizing : + KPRes.ImportingStatusMsg, LogStatusType.Info); + + if(vConnections.Length == 0) + { + try + { + pwDatabase.Modified = true; + fmtImp.Import(pwDatabase, null, dlgStatus); + } + catch(Exception ex) + { + MessageService.ShowWarning(ex); + bAllSuccess = false; + } + + dlgStatus.EndLogging(); + return bAllSuccess; + } + + foreach(IOConnectionInfo iocIn in vConnections) + { + Stream s = null; + try { s = IOConnection.OpenRead(iocIn); } + catch(Exception ex) + { + MessageService.ShowWarning(iocIn.GetDisplayName(), ex); + bAllSuccess = false; + continue; + } + if(s == null) { Debug.Assert(false); bAllSuccess = false; continue; } + + PwDatabase pwImp; + if(bUseTempDb) + { + pwImp = new PwDatabase(); + pwImp.New(new IOConnectionInfo(), pwDatabase.MasterKey); + pwImp.MemoryProtection = pwDatabase.MemoryProtection.CloneDeep(); + } + else pwImp = pwDatabase; + + if(fmtImp.RequiresKey && !bSynchronize) + { + KeyPromptFormResult r; + DialogResult dr = KeyPromptForm.ShowDialog(iocIn, false, null, out r); + if((dr != DialogResult.OK) || (r == null)) + { + s.Close(); + bAllSuccess = false; + continue; + } + + pwImp.MasterKey = r.CompositeKey; + } + else if(bSynchronize) pwImp.MasterKey = pwDatabase.MasterKey; + + dlgStatus.SetText((bSynchronize ? KPRes.Synchronizing : + KPRes.ImportingStatusMsg) + " (" + iocIn.GetDisplayName() + + ")", LogStatusType.Info); + + try + { + pwImp.Modified = true; + fmtImp.Import(pwImp, s, dlgStatus); + } + catch(Exception ex) + { + string strMsg = ex.Message; + if(bSynchronize && (ex is InvalidCompositeKeyException)) + strMsg = KLRes.InvalidCompositeKey + MessageService.NewParagraph + + KPRes.SynchronizingHint; + MessageService.ShowWarning(iocIn.GetDisplayName(), + KPRes.FileImportFailed, strMsg); + + bAllSuccess = false; + continue; + } + finally { s.Close(); } + + if(bUseTempDb) + { + PwMergeMethod mm; + if(!fmtImp.SupportsUuids) mm = PwMergeMethod.CreateNewUuids; + else if(bSynchronize) mm = PwMergeMethod.Synchronize; + else + { + ImportMethodForm imf = new ImportMethodForm(); + if(UIUtil.ShowDialogNotValue(imf, DialogResult.OK)) + { + bAllSuccess = false; + continue; + } + mm = imf.MergeMethod; + UIUtil.DestroyForm(imf); + } + + try + { + pwDatabase.Modified = true; + pwDatabase.MergeIn(pwImp, mm, dlgStatus); + } + catch(Exception ex) + { + MessageService.ShowWarning(iocIn.GetDisplayName(), + KPRes.ImportFailed, ex); + bAllSuccess = false; + continue; + } + } + } + + if(bSynchronize && bAllSuccess) + { + if(uiOps == null) { Debug.Assert(false); throw new ArgumentNullException("uiOps"); } + + dlgStatus.SetText(KPRes.Synchronizing + " (" + + KPRes.SavingDatabase + ")", LogStatusType.Info); + + if(mf != null) + { + try { mf.DocumentManager.ActiveDatabase = pwDatabase; } + catch(Exception) { Debug.Assert(false); } + } + + if(uiOps.UIFileSave(bForceSave)) + { + foreach(IOConnectionInfo ioc in vConnections) + { + try + { + // dlgStatus.SetText(KPRes.Synchronizing + " (" + + // KPRes.SavingDatabase + " " + ioc.GetDisplayName() + + // ")", LogStatusType.Info); + + string strSource = pwDatabase.IOConnectionInfo.Path; + if(!string.Equals(ioc.Path, strSource, StrUtil.CaseIgnoreCmp)) + { + bool bSaveAs = true; + + if(pwDatabase.IOConnectionInfo.IsLocalFile() && + ioc.IsLocalFile()) + { + // Do not try to copy an encrypted file; + // https://sourceforge.net/p/keepass/discussion/329220/thread/9c9eb989/ + // https://msdn.microsoft.com/en-us/library/windows/desktop/aa363851.aspx + if((long)(File.GetAttributes(strSource) & + FileAttributes.Encrypted) == 0) + { + File.Copy(strSource, ioc.Path, true); + bSaveAs = false; + } + } + + if(bSaveAs) pwDatabase.SaveAs(ioc, false, null); + } + // else { } // No assert (sync on save) + + if(mf != null) + mf.FileMruList.AddItem(ioc.GetDisplayName(), + ioc.CloneDeep()); + } + catch(Exception ex) + { + MessageService.ShowWarning( + pwDatabase.IOConnectionInfo.GetDisplayName() + + MessageService.NewLine + ioc.GetDisplayName(), + KPRes.SyncFailed, ex); + bAllSuccess = false; + continue; + } + } + } + else + { + MessageService.ShowWarning( + pwDatabase.IOConnectionInfo.GetDisplayName(), KPRes.SyncFailed); + bAllSuccess = false; + } + } + + dlgStatus.EndLogging(); + return bAllSuccess; + } + + public static bool? Import(PwDatabase pd, FileFormatProvider fmtImp, + IOConnectionInfo iocImp, PwMergeMethod mm, CompositeKey cmpKey) + { + if(pd == null) throw new ArgumentNullException("pd"); + if(fmtImp == null) throw new ArgumentNullException("fmtImp"); + if(iocImp == null) throw new ArgumentNullException("iocImp"); + if(cmpKey == null) cmpKey = new CompositeKey(); + + if(!AppPolicy.Try(AppPolicyId.Import)) return null; + if(!fmtImp.TryBeginImport()) return null; + + PwDatabase pdImp = new PwDatabase(); + pdImp.New(new IOConnectionInfo(), cmpKey); + pdImp.MemoryProtection = pd.MemoryProtection.CloneDeep(); + + Stream s = IOConnection.OpenRead(iocImp); + if(s == null) + throw new FileNotFoundException(iocImp.GetDisplayName() + + MessageService.NewParagraph + KPRes.FileNotFoundError); + + try { fmtImp.Import(pdImp, s, null); } + finally { s.Close(); } + + pd.Modified = true; + pd.MergeIn(pdImp, mm); + return true; + } + + public static bool? Synchronize(PwDatabase pwStorage, IUIOperations uiOps, + bool bOpenFromUrl, Form fParent) + { + if(pwStorage == null) throw new ArgumentNullException("pwStorage"); + if(!pwStorage.IsOpen) { Debug.Assert(false); return null; } + if(!AppPolicy.Try(AppPolicyId.Import)) return null; + + List lConnections = new List(); + if(!bOpenFromUrl) + { + OpenFileDialogEx ofd = UIUtil.CreateOpenFileDialog(KPRes.Synchronize, + UIUtil.CreateFileTypeFilter(AppDefs.FileExtension.FileExt, + KPRes.KdbxFiles, true), 1, null, true, + AppDefs.FileDialogContext.Sync); + + if(ofd.ShowDialog() != DialogResult.OK) return null; + + foreach(string strSelFile in ofd.FileNames) + lConnections.Add(IOConnectionInfo.FromPath(strSelFile)); + } + else // Open URL + { + IOConnectionForm iocf = new IOConnectionForm(); + iocf.InitEx(false, null, true, true); + + if(UIUtil.ShowDialogNotValue(iocf, DialogResult.OK)) return null; + + lConnections.Add(iocf.IOConnectionInfo); + UIUtil.DestroyForm(iocf); + } + + return Import(pwStorage, new KeePassKdb2x(), lConnections.ToArray(), + true, uiOps, false, fParent); + } + + public static bool? Synchronize(PwDatabase pwStorage, IUIOperations uiOps, + IOConnectionInfo iocSyncWith, bool bForceSave, Form fParent) + { + if(pwStorage == null) throw new ArgumentNullException("pwStorage"); + if(!pwStorage.IsOpen) { Debug.Assert(false); return null; } + if(iocSyncWith == null) throw new ArgumentNullException("iocSyncWith"); + if(!AppPolicy.Try(AppPolicyId.Import)) return null; + + Program.TriggerSystem.RaiseEvent(EcasEventIDs.SynchronizingDatabaseFile, + EcasProperty.Database, pwStorage); + + IOConnectionInfo[] vConnections = new IOConnectionInfo[1] { iocSyncWith }; + + bool? ob = Import(pwStorage, new KeePassKdb2x(), vConnections, + true, uiOps, bForceSave, fParent); + + // Always raise the post event, such that the event pair can + // for instance be used to turn off/on other triggers + Program.TriggerSystem.RaiseEvent(EcasEventIDs.SynchronizedDatabaseFile, + EcasProperty.Database, pwStorage); + + return ob; + } + + public static int CountQuotes(string str, int posMax) + { + int i = 0, n = 0; + + while(true) + { + i = str.IndexOf('\"', i); + if(i < 0) return n; + + ++i; + if(i > posMax) return n; + + ++n; + } + } + + public static List SplitCsvLine(string strLine, string strDelimiter) + { + List list = new List(); + + int nOffset = 0; + while(true) + { + int i = strLine.IndexOf(strDelimiter, nOffset); + if(i < 0) break; + + int nQuotes = CountQuotes(strLine, i); + if((nQuotes & 1) == 0) + { + list.Add(strLine.Substring(0, i)); + strLine = strLine.Remove(0, i + strDelimiter.Length); + nOffset = 0; + } + else + { + nOffset = i + strDelimiter.Length; + if(nOffset >= strLine.Length) break; + } + } + + list.Add(strLine); + return list; + } + + public static bool SetStatus(IStatusLogger slLogger, uint uPercent) + { + if(slLogger != null) return slLogger.SetProgress(uPercent); + return true; + } + + private static readonly string[] m_vTitles = { + "title", "system", "account", "entry", + "item", "itemname", "item name", "subject", + "service", "servicename", "service name", + "head", "heading", "card", "product", "provider", "bank", + "type", + + // Non-English names + "seite" + }; + + private static readonly string[] m_vTitlesSubstr = { + "title", "system", "account", "entry", + "item", "subject", "service", "head" + }; + + private static readonly string[] m_vUserNames = { + "user", "name", "username", "user name", "login name", + "login", "form_loginname", "wpname", "mail", + "email", "e-mail", "id", "userid", "user id", + "loginid", "login id", "log", "uin", + "first name", "last name", "card#", "account #", + "member", "member #", "owner", + + // Non-English names + "nom", "benutzername" + }; + + private static readonly string[] m_vUserNamesSubstr = { + "user", "name", "login", "mail", "owner" + }; + + private static readonly string[] m_vPasswords = { + "password", "pass word", "passphrase", "pass phrase", + "pass", "code", "code word", "codeword", + "secret", "secret word", + "key", "keyword", "key word", "keyphrase", "key phrase", + "form_pw", "wppassword", "pin", "pwd", "pw", "pword", + "p", "serial", "serial#", "license key", "reg #", + + // Non-English names + "passwort", "kennwort" + }; + + private static readonly string[] m_vPasswordsSubstr = { + "pass", "code", "secret", "key", "pw", "pin" + }; + + private static readonly string[] m_vUrls = { + "url", "hyper link", "hyperlink", "link", + "host", "hostname", "host name", "server", "address", + "hyper ref", "href", "web", "website", "web site", "site", + "web-site", + + // Non-English names + "ort", "adresse", "webseite" + }; + + private static readonly string[] m_vUrlsSubstr = { + "url", "link", "host", "address", "hyper ref", "href", + "web", "site" + }; + + private static readonly string[] m_vNotes = { + "note", "notes", "comment", "comments", "memo", + "description", "free form", "freeform", + "free text", "freetext", "free", + + // Non-English names + "kommentar", "hinweis" + }; + + private static readonly string[] m_vNotesSubstr = { + "note", "comment", "memo", "description", "free" + }; + + public static string MapNameToStandardField(string strName, bool bAllowFuzzy) + { + if(strName == null) { Debug.Assert(false); return string.Empty; } + + string strFind = strName.Trim().ToLower(); + + if(Array.IndexOf(m_vTitles, strFind) >= 0) + return PwDefs.TitleField; + if(Array.IndexOf(m_vUserNames, strFind) >= 0) + return PwDefs.UserNameField; + if(Array.IndexOf(m_vPasswords, strFind) >= 0) + return PwDefs.PasswordField; + if(Array.IndexOf(m_vUrls, strFind) >= 0) + return PwDefs.UrlField; + if(Array.IndexOf(m_vNotes, strFind) >= 0) + return PwDefs.NotesField; + + if(strFind.Equals(KPRes.Title, StrUtil.CaseIgnoreCmp)) + return PwDefs.TitleField; + if(strFind.Equals(KPRes.UserName, StrUtil.CaseIgnoreCmp)) + return PwDefs.UserNameField; + if(strFind.Equals(KPRes.Password, StrUtil.CaseIgnoreCmp)) + return PwDefs.PasswordField; + if(strFind.Equals(KPRes.Url, StrUtil.CaseIgnoreCmp)) + return PwDefs.UrlField; + if(strFind.Equals(KPRes.Notes, StrUtil.CaseIgnoreCmp)) + return PwDefs.NotesField; + + if(!bAllowFuzzy) return string.Empty; + + // Check for passwords first, then user names ("vb_login_password") + foreach(string strSub in m_vPasswordsSubstr) + { + if(strFind.Contains(strSub)) return PwDefs.PasswordField; + } + foreach(string strSub in m_vUserNamesSubstr) + { + if(strFind.Contains(strSub)) return PwDefs.UserNameField; + } + foreach(string strSub in m_vUrlsSubstr) + { + if(strFind.Contains(strSub)) return PwDefs.UrlField; + } + foreach(string strSub in m_vNotesSubstr) + { + if(strFind.Contains(strSub)) return PwDefs.NotesField; + } + foreach(string strSub in m_vTitlesSubstr) + { + if(strFind.Contains(strSub)) return PwDefs.TitleField; + } + + return string.Empty; + } + + public static void AppendToField(PwEntry pe, string strName, string strValue, + PwDatabase pdContext) + { + AppendToField(pe, strName, strValue, pdContext, null, false); + } + + public static void AppendToField(PwEntry pe, string strName, string strValue, + PwDatabase pdContext, string strSeparator, bool bOnlyIfNotDup) + { + if(pe == null) { Debug.Assert(false); return; } + if(string.IsNullOrEmpty(strName)) { Debug.Assert(false); return; } + + if(strValue == null) { Debug.Assert(false); strValue = string.Empty; } + + if(strSeparator == null) + { + if(PwDefs.IsStandardField(strName) && (strName != PwDefs.NotesField)) + strSeparator = ", "; + else strSeparator = MessageService.NewLine; + } + + ProtectedString psPrev = pe.Strings.Get(strName); + if((psPrev == null) || psPrev.IsEmpty) + { + MemoryProtectionConfig mpc = ((pdContext != null) ? + pdContext.MemoryProtection : new MemoryProtectionConfig()); + bool bProtect = mpc.GetProtection(strName); + + pe.Strings.Set(strName, new ProtectedString(bProtect, strValue)); + } + else if(strValue.Length != 0) + { + bool bAppend = true; + if(bOnlyIfNotDup) + { + ProtectedString psValue = new ProtectedString(false, strValue); + bAppend = !psPrev.Equals(psValue, false); + } + + if(bAppend) + pe.Strings.Set(strName, psPrev + (strSeparator + strValue)); + } + } + + internal static void CreateFieldWithIndex(ProtectedStringDictionary d, + string strName, string strValue, PwDatabase pdContext, bool bAllowEmptyValue) + { + if(string.IsNullOrEmpty(strName)) { Debug.Assert(false); return; } + + MemoryProtectionConfig mpc = ((pdContext != null) ? + pdContext.MemoryProtection : new MemoryProtectionConfig()); + bool bProtect = mpc.GetProtection(strName); + + CreateFieldWithIndex(d, strName, strValue, bProtect, bAllowEmptyValue); + } + + internal static void CreateFieldWithIndex(ProtectedStringDictionary d, + string strName, string strValue, bool bProtect, bool bAllowEmptyValue) + { + if(d == null) { Debug.Assert(false); return; } + if(string.IsNullOrEmpty(strName)) { Debug.Assert(false); return; } + if(strValue == null) { Debug.Assert(false); return; } + if((strValue.Length == 0) && !bAllowEmptyValue) return; + + ProtectedString psValue = new ProtectedString(bProtect, strValue); + + ProtectedString psEx = d.Get(strName); + if((psEx == null) || (PwDefs.IsStandardField(strName) && psEx.IsEmpty)) + { + d.Set(strName, psValue); + return; + } + + NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo; + for(int i = 2; i < int.MaxValue; ++i) + { + string strNameI = strName + " (" + i.ToString(nfi) + ")"; + if(!d.Exists(strNameI)) + { + d.Set(strNameI, psValue); + break; + } + } + } + + public static bool EntryEquals(PwEntry pe1, PwEntry pe2) + { + if(pe1.ParentGroup == null) return false; + if(pe2.ParentGroup == null) return false; + if(pe1.ParentGroup.Name != pe2.ParentGroup.Name) + return false; + + return pe1.Strings.EqualsDictionary(pe2.Strings, + PwCompareOptions.NullEmptyEquivStd, MemProtCmpMode.None); + } + + internal static string GuiSendRetrieve(string strSendPrefix) + { + if(strSendPrefix.Length > 0) + GuiSendKeysPrc(strSendPrefix); + + return GuiRetrieveDataField(); + } + + private static string GuiRetrieveDataField() + { + ClipboardUtil.Clear(); + Application.DoEvents(); + + GuiSendKeysPrc(@"^c"); + + try + { + if(ClipboardUtil.ContainsText()) + return (ClipboardUtil.GetText() ?? string.Empty); + } + catch(Exception) { Debug.Assert(false); } // Opened by other process + + return string.Empty; + } + + internal static void GuiSendKeysPrc(string strSend) + { + if(strSend.Length > 0) + SendInputEx.SendKeysWait(strSend, false); + + Application.DoEvents(); + Thread.Sleep(100); + Application.DoEvents(); + } + + internal static void GuiSendWaitWindowChange(string strSend) + { + IntPtr ptrCur = NativeMethods.GetForegroundWindowHandle(); + + ImportUtil.GuiSendKeysPrc(strSend); + + int nRound = 0; + while(true) + { + Application.DoEvents(); + + IntPtr ptr = NativeMethods.GetForegroundWindowHandle(); + if(ptr != ptrCur) break; + + ++nRound; + if(nRound > 1000) + throw new InvalidOperationException(); + + Thread.Sleep(50); + } + + Thread.Sleep(100); + Application.DoEvents(); + } + + internal static string FixUrl(string strUrl) + { + strUrl = (strUrl ?? string.Empty).Trim(); + + if((strUrl.Length > 0) && (strUrl.IndexOf('.') >= 0) && + (strUrl.IndexOf(':') < 0) && (strUrl.IndexOf('@') < 0)) + { + string strNew = ("https://" + strUrl.ToLower()); + if(strUrl.IndexOf('/') < 0) strNew += "/"; + return strNew; + } + + return strUrl; + } + } +} diff --git a/src/KeePass/DataExchange/JsonObject.cs b/src/KeePass/DataExchange/JsonObject.cs new file mode 100644 index 0000000..4b537ef --- /dev/null +++ b/src/KeePass/DataExchange/JsonObject.cs @@ -0,0 +1,397 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.Text; + +using KeePass.Resources; + +using KeePassLib.Resources; +using KeePassLib.Utility; + +namespace KeePass.DataExchange +{ + public sealed class JsonObject + { + private const int MaxTreeHeight = 50000; + + private Dictionary m_dItems = new Dictionary(); + public IDictionary Items + { + get { return m_dItems; } + } + + private JsonObject() + { + } + + public JsonObject(CharStream csJsonData) + { + if(csJsonData == null) throw new ArgumentNullException("csJsonData"); + + Load(csJsonData); + } + + private static void ThrowDataException() + { + Debug.Assert(false); + throw new FormatException(KLRes.InvalidDataWhileDecoding); + } + + private static void ThrowImplException() + { + Debug.Assert(false); + throw new InvalidOperationException(KLRes.UnknownError); + } + + private void Load(CharStream cs) + { + char chInit = cs.ReadChar(true); + if(chInit != '{') ThrowDataException(); + + Stack sCtx = new Stack(); + sCtx.Push(this); + + while(sCtx.Count != 0) + { + if(sCtx.Count > MaxTreeHeight) + { + Debug.Assert(false); + throw new InvalidOperationException(KLRes.StructsTooDeep); + } + + object oCtx = sCtx.Peek(); + + JsonObject joCtx = (oCtx as JsonObject); + if(joCtx != null) { ReadObjectPart(cs, joCtx, sCtx); continue; } + + List lCtx = (oCtx as List); + if(lCtx != null) { ReadArrayPart(cs, lCtx, sCtx); continue; } + + ThrowImplException(); // Unknown context object + } + } + + private static void ReadObjectPart(CharStream cs, JsonObject joCtx, + Stack sCtx) + { + char ch = cs.PeekChar(true); + + if(ch == '}') EndContainer(cs, joCtx, sCtx); + else if(ch == '\"') + { + string strName = ReadString(cs); + + char chSep = cs.ReadChar(true); + if(chSep != ':') ThrowDataException(); + + object oSub = TryBeginContainer(cs, sCtx); + if(oSub != null) + joCtx.m_dItems[strName] = oSub; + else + { + joCtx.m_dItems[strName] = ReadAtomicValue(cs); + if(cs.PeekChar(true) == ',') cs.ReadChar(true); + } + } + else ThrowDataException(); + } + + private static void ReadArrayPart(CharStream cs, List lCtx, + Stack sCtx) + { + char ch = cs.PeekChar(true); + + if(ch == ']') { EndContainer(cs, lCtx, sCtx); return; } + + object oSub = TryBeginContainer(cs, sCtx); + if(oSub != null) + lCtx.Add(oSub); + else + { + lCtx.Add(ReadAtomicValue(cs)); + if(cs.PeekChar(true) == ',') cs.ReadChar(true); + } + } + + private static object TryBeginContainer(CharStream cs, Stack sCtx) + { + char ch = cs.PeekChar(true); + object oNew = null; + + if(ch == '{') oNew = new JsonObject(); + else if(ch == '[') oNew = new List(); + + if(oNew != null) + { + cs.ReadChar(true); + sCtx.Push(oNew); + } + return oNew; + } + + private static void EndContainer(CharStream cs, object oCtx, + Stack sCtx) + { + Debug.Assert(object.ReferenceEquals(oCtx, sCtx.Peek())); // For Pop() + + char chTerm = cs.ReadChar(true); + if(chTerm == '}') + { + if(!(oCtx is JsonObject)) ThrowImplException(); + } + else if(chTerm == ']') + { + if(!(oCtx is List)) ThrowImplException(); + } + else ThrowImplException(); // Unknown terminator + + sCtx.Pop(); + if(sCtx.Count == 0) return; + + object oParent = sCtx.Peek(); + if((oParent is JsonObject) || (oParent is List)) + { + if(cs.PeekChar(true) == ',') cs.ReadChar(true); + } + else ThrowImplException(); // Unknown context object + } + + private static object ReadAtomicValue(CharStream cs) + { + char chInit = cs.PeekChar(true); + + if(chInit == '\"') return ReadString(cs); + if(chInit == 't') + { + cs.ReadChar(true); + if(cs.ReadChar() != 'r') ThrowDataException(); + if(cs.ReadChar() != 'u') ThrowDataException(); + if(cs.ReadChar() != 'e') ThrowDataException(); + return true; + } + if(chInit == 'f') + { + cs.ReadChar(true); + if(cs.ReadChar() != 'a') ThrowDataException(); + if(cs.ReadChar() != 'l') ThrowDataException(); + if(cs.ReadChar() != 's') ThrowDataException(); + if(cs.ReadChar() != 'e') ThrowDataException(); + return false; + } + if(chInit == 'n') + { + cs.ReadChar(true); + if(cs.ReadChar() != 'u') ThrowDataException(); + if(cs.ReadChar() != 'l') ThrowDataException(); + if(cs.ReadChar() != 'l') ThrowDataException(); + return null; + } + + return ReadNumber(cs); + } + + private static string ReadString(CharStream cs) + { + char chInit = cs.ReadChar(true); + if(chInit != '\"') ThrowImplException(); // Caller should ensure '\"' + + StringBuilder sb = new StringBuilder(); + + while(true) + { + char ch = cs.ReadChar(); + if(ch == char.MinValue) ThrowDataException(); // End of JSON data + if(ch == '\"') break; // End of string + + if(ch == '\\') + { + char chNext = cs.ReadChar(); + switch(chNext) + { + case '\"': + case '\'': // C + case '/': + case '\\': + case '?': // C + sb.Append(chNext); + break; + + case 'a': sb.Append('\a'); break; // C + case 'b': sb.Append('\b'); break; + case 'f': sb.Append('\f'); break; + case 'n': sb.Append('\n'); break; + case 'r': sb.Append('\r'); break; + case 't': sb.Append('\t'); break; + case 'v': sb.Append('\v'); break; // C + + case 'u': + case 'x': // C, only special case supported + sb.Append(ReadHex4Char(cs)); + break; + + default: ThrowDataException(); break; + } + } + else sb.Append(ch); + } + + return sb.ToString(); + } + + private static char ReadHex4Char(CharStream cs) + { + char ch1 = cs.ReadChar(); + char ch2 = cs.ReadChar(); + char ch3 = cs.ReadChar(); + char ch4 = cs.ReadChar(); + + char[] vHex = new char[4] { ch1, ch2, ch3, ch4 }; + if(Array.IndexOf(vHex, char.MinValue) >= 0) ThrowDataException(); + + string strHex = new string(vHex); + if(!StrUtil.IsHexString(strHex, true)) ThrowDataException(); + + return (char)Convert.ToUInt16(strHex, 16); + } + + private static object ReadNumber(CharStream cs) + { + StringBuilder sb = new StringBuilder(); + bool bFloat = false, bNeg = false; + + while(true) + { + char ch = cs.PeekChar(true); + + if(((ch >= '0') && (ch <= '9')) || (ch == '+')) { } + else if(ch == '-') bNeg = true; + else if(ch == '.') bFloat = true; + else if((ch == 'e') || (ch == 'E')) bFloat = true; + else break; + + cs.ReadChar(true); + sb.Append(ch); + } + if(sb.Length == 0) ThrowDataException(); + + string str = sb.ToString(); + NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo; + + if(bFloat) + { + double d; + if(!double.TryParse(str, NumberStyles.Float, nfi, out d)) + ThrowDataException(); + return d; + } + + if(bNeg) + { + long i; + if(!long.TryParse(str, NumberStyles.Integer, nfi, out i)) + ThrowDataException(); + return i; + } + + ulong u; + if(!ulong.TryParse(str, NumberStyles.Integer, nfi, out u)) + ThrowDataException(); + return u; + } + + private static T ConvertOrDefault(object o, T tDefault) + where T : struct // Use 'as' for class + { + if(o == null) return tDefault; + + try + { + if(o is T) return (T)o; + return (T)Convert.ChangeType(o, typeof(T)); + } + catch(Exception) { Debug.Assert(false); } + + try { return (T)o; } + catch(Exception) { Debug.Assert(false); } + + return tDefault; + } + + public T GetValue(string strKey) + where T : class + { + if(strKey == null) throw new ArgumentNullException("strKey"); + + object o; + m_dItems.TryGetValue(strKey, out o); + return (o as T); + } + + public T GetValue(string strKey, T tDefault) + where T : struct + { + if(strKey == null) throw new ArgumentNullException("strKey"); + + object o; + m_dItems.TryGetValue(strKey, out o); + return ConvertOrDefault(o, tDefault); + } + + public T[] GetValueArray(string strKey) + where T : class + { + return GetValueArray(strKey, false); + } + + internal T[] GetValueArray(string strKey, bool bEmptyIfNotExists) + where T : class + { + List lO = GetValue>(strKey); + if(lO == null) return (bEmptyIfNotExists ? MemUtil.EmptyArray() : null); + + T[] vT = new T[lO.Count]; + for(int i = 0; i < lO.Count; ++i) vT[i] = (lO[i] as T); + + return vT; + } + + public T[] GetValueArray(string strKey, T tDefault) + where T : struct + { + return GetValueArray(strKey, tDefault, false); + } + + internal T[] GetValueArray(string strKey, T tDefault, bool bEmptyIfNotExists) + where T : struct + { + List lO = GetValue>(strKey); + if(lO == null) return (bEmptyIfNotExists ? MemUtil.EmptyArray() : null); + + T[] vT = new T[lO.Count]; + for(int i = 0; i < lO.Count; ++i) + vT[i] = ConvertOrDefault(lO[i], tDefault); + + return vT; + } + } +} diff --git a/src/KeePass/DataExchange/KdbFile.cs b/src/KeePass/DataExchange/KdbFile.cs new file mode 100644 index 0000000..c8ddb09 --- /dev/null +++ b/src/KeePass/DataExchange/KdbFile.cs @@ -0,0 +1,818 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.Runtime.InteropServices; +using System.Text; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Collections; +using KeePassLib.Cryptography.KeyDerivation; +using KeePassLib.Delegates; +using KeePassLib.Interfaces; +using KeePassLib.Keys; +using KeePassLib.Resources; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.DataExchange +{ + /// + /// Serialization to KeePass KDB files. + /// + public sealed class KdbFile + { + private PwDatabase m_pwDatabase; + private IStatusLogger m_slLogger; + + private const string KdbPrefix = "KDB: "; + + private const string AutoTypePrefix = "Auto-Type"; + private const string AutoTypeWindowPrefix = "Auto-Type-Window"; + + private const string UrlOverridePrefix = "Url-Override:"; + + public static bool IsLibraryInstalled() + { + Exception ex; + return IsLibraryInstalled(out ex); + } + + public static bool IsLibraryInstalled(out Exception ex) + { + try + { + KdbManager mgr = new KdbManager(); + mgr.Dispose(); + } + catch(Exception exMgr) + { + ex = exMgr; + return false; + } + + ex = null; + return true; + } + + /// + /// Default constructor. + /// + /// The PwDatabase instance that the class + /// will load file data into or use to create a KDB file. Must not be null. + /// Thrown if the database + /// reference is null. + public KdbFile(PwDatabase pwDataStore, IStatusLogger slLogger) + { + Debug.Assert(pwDataStore != null); + if(pwDataStore == null) throw new ArgumentNullException("pwDataStore"); + m_pwDatabase = pwDataStore; + + m_slLogger = slLogger; + } + + private static KdbErrorCode SetDatabaseKey(KdbManager mgr, CompositeKey pwKey) + { + string strPassword = null; + if(pwKey.ContainsType(typeof(KcpPassword))) + { + KcpPassword p = (pwKey.GetUserKey(typeof(KcpPassword)) as KcpPassword); + ProtectedString ps = ((p != null) ? p.Password : null); + if(ps == null) + throw new Exception(KPRes.OptionReqOn + @" '" + + KPRes.MasterPasswordRmbWhileOpen + @"'."); + strPassword = ps.ReadString(); + } + + string strKeyFile = null; + if(pwKey.ContainsType(typeof(KcpKeyFile))) + strKeyFile = (pwKey.GetUserKey(typeof(KcpKeyFile)) as KcpKeyFile).Path; + + KdbErrorCode e; + if(!string.IsNullOrEmpty(strKeyFile)) + e = mgr.SetMasterKey(strKeyFile, true, strPassword, IntPtr.Zero, false); + else if(strPassword != null) + e = mgr.SetMasterKey(strPassword, false, null, IntPtr.Zero, false); + else if(pwKey.ContainsType(typeof(KcpUserAccount))) + throw new Exception(KPRes.KdbWUA); + else throw new Exception(KLRes.InvalidCompositeKey); + + return e; + } + + /// + /// Loads a KDB file and stores all loaded entries in the current + /// PwDatabase instance. + /// + /// Relative or absolute path to the file to open. + public void Load(string strFilePath) + { + Debug.Assert(strFilePath != null); + if(strFilePath == null) throw new ArgumentNullException("strFilePath"); + + using(KdbManager mgr = new KdbManager()) + { + KdbErrorCode e; + + e = KdbFile.SetDatabaseKey(mgr, m_pwDatabase.MasterKey); + if(e != KdbErrorCode.Success) + throw new Exception(KLRes.InvalidCompositeKey); + + e = mgr.OpenDatabase(strFilePath, IntPtr.Zero); + if(e != KdbErrorCode.Success) + throw new Exception(KLRes.FileLoadFailed); + + // Copy properties + m_pwDatabase.KdfParameters = (new AesKdf()).GetDefaultParameters(); + m_pwDatabase.KdfParameters.SetUInt64(AesKdf.ParamRounds, + mgr.KeyTransformationRounds); + + // Read groups and entries + Dictionary dictGroups = ReadGroups(mgr); + ReadEntries(mgr, dictGroups); + } + } + + private Dictionary ReadGroups(KdbManager mgr) + { + uint uGroupCount = mgr.GroupCount; + Dictionary dictGroups = new Dictionary(); + + Stack vGroupStack = new Stack(); + vGroupStack.Push(m_pwDatabase.RootGroup); + + DateTime dtNeverExpire = KdbManager.GetNeverExpireTime(); + + for(uint uGroup = 0; uGroup < uGroupCount; ++uGroup) + { + KdbGroup g = mgr.GetGroup(uGroup); + + PwGroup pg = new PwGroup(true, false); + + pg.Name = g.Name; + pg.IconId = (g.ImageId < (uint)PwIcon.Count) ? (PwIcon)g.ImageId : PwIcon.Folder; + + pg.CreationTime = g.CreationTime.ToDateTime(); + pg.LastModificationTime = g.LastModificationTime.ToDateTime(); + pg.LastAccessTime = g.LastAccessTime.ToDateTime(); + pg.ExpiryTime = g.ExpirationTime.ToDateTime(); + + pg.Expires = (pg.ExpiryTime != dtNeverExpire); + + pg.IsExpanded = ((g.Flags & (uint)KdbGroupFlags.Expanded) != 0); + + while(g.Level < (vGroupStack.Count - 1)) + vGroupStack.Pop(); + + vGroupStack.Peek().AddGroup(pg, true); + + dictGroups[g.GroupId] = pg; + + if(g.Level == (uint)(vGroupStack.Count - 1)) + vGroupStack.Push(pg); + } + + return dictGroups; + } + + private void ReadEntries(KdbManager mgr, Dictionary dictGroups) + { + DateTime dtNeverExpire = KdbManager.GetNeverExpireTime(); + uint uEntryCount = mgr.EntryCount; + + for(uint uEntry = 0; uEntry < uEntryCount; ++uEntry) + { + KdbEntry e = mgr.GetEntry(uEntry); + + PwGroup pgContainer; + if(!dictGroups.TryGetValue(e.GroupId, out pgContainer)) + { + Debug.Assert(false); + continue; + } + + PwEntry pe = new PwEntry(false, false); + pe.SetUuid(new PwUuid(e.Uuid.ToByteArray()), false); + + pgContainer.AddEntry(pe, true, true); + + pe.IconId = (e.ImageId < (uint)PwIcon.Count) ? (PwIcon)e.ImageId : PwIcon.Key; + + pe.Strings.Set(PwDefs.TitleField, new ProtectedString( + m_pwDatabase.MemoryProtection.ProtectTitle, e.Title)); + pe.Strings.Set(PwDefs.UserNameField, new ProtectedString( + m_pwDatabase.MemoryProtection.ProtectUserName, e.UserName)); + pe.Strings.Set(PwDefs.PasswordField, new ProtectedString( + m_pwDatabase.MemoryProtection.ProtectPassword, e.Password)); + pe.Strings.Set(PwDefs.UrlField, new ProtectedString( + m_pwDatabase.MemoryProtection.ProtectUrl, e.Url)); + + string strNotes = e.Additional; + ImportAutoType(ref strNotes, pe); + ImportUrlOverride(ref strNotes, pe); + pe.Strings.Set(PwDefs.NotesField, new ProtectedString( + m_pwDatabase.MemoryProtection.ProtectNotes, strNotes)); + + pe.CreationTime = e.CreationTime.ToDateTime(); + pe.LastModificationTime = e.LastModificationTime.ToDateTime(); + pe.LastAccessTime = e.LastAccessTime.ToDateTime(); + pe.ExpiryTime = e.ExpirationTime.ToDateTime(); + + pe.Expires = (pe.ExpiryTime != dtNeverExpire); + + if((e.BinaryDataLength > 0) && (e.BinaryData != IntPtr.Zero)) + { + byte[] pbData = KdbManager.ReadBinary(e.BinaryData, e.BinaryDataLength); + Debug.Assert(pbData.Length == e.BinaryDataLength); + + string strDesc = e.BinaryDescription; + if(string.IsNullOrEmpty(strDesc)) strDesc = "Attachment"; + + pe.Binaries.Set(strDesc, new ProtectedBinary(false, pbData)); + } + + if(m_slLogger != null) + { + if(!m_slLogger.SetProgress((100 * uEntry) / uEntryCount)) + throw new Exception(KPRes.Cancel); + } + } + } + + /// + /// Save the contents of the current PwDatabase to a KDB file. + /// + /// Location to save the KDB file to. + public void Save(string strSaveToFile, PwGroup pgDataSource) + { + Debug.Assert(strSaveToFile != null); + if(strSaveToFile == null) throw new ArgumentNullException("strSaveToFile"); + + using(KdbManager mgr = new KdbManager()) + { + KdbErrorCode e = KdbFile.SetDatabaseKey(mgr, m_pwDatabase.MasterKey); + if(e != KdbErrorCode.Success) + { + Debug.Assert(false); + throw new Exception(KLRes.InvalidCompositeKey); + } + + if(m_slLogger != null) + { + if(m_pwDatabase.MasterKey.ContainsType(typeof(KcpUserAccount))) + m_slLogger.SetText(KPRes.KdbWUA, LogStatusType.Warning); + + if(m_pwDatabase.Name.Length != 0) + m_slLogger.SetText(KdbPrefix + KPRes.FormatNoDatabaseName, LogStatusType.Warning); + if(m_pwDatabase.Description.Length != 0) + m_slLogger.SetText(KdbPrefix + KPRes.FormatNoDatabaseDesc, LogStatusType.Warning); + } + + // Set properties + AesKdf kdf = new AesKdf(); + if(!kdf.Uuid.Equals(m_pwDatabase.KdfParameters.KdfUuid)) + mgr.KeyTransformationRounds = (uint)PwDefs.DefaultKeyEncryptionRounds; + else + { + ulong uRounds = m_pwDatabase.KdfParameters.GetUInt64( + AesKdf.ParamRounds, PwDefs.DefaultKeyEncryptionRounds); + uRounds = Math.Min(uRounds, 0xFFFFFFFEUL); + + mgr.KeyTransformationRounds = (uint)uRounds; + } + + PwGroup pgRoot = (pgDataSource ?? m_pwDatabase.RootGroup); + + // Write groups and entries + Dictionary dictGroups = WriteGroups(mgr, pgRoot); + WriteEntries(mgr, dictGroups, pgRoot); + + e = mgr.SaveDatabase(strSaveToFile); + if(e != KdbErrorCode.Success) + throw new Exception(KLRes.FileSaveFailed); + } + } + + private static Dictionary WriteGroups(KdbManager mgr, + PwGroup pgRoot) + { + Dictionary dictGroups = new Dictionary(); + + uint uGroupIndex = 1; + DateTime dtNeverExpire = KdbManager.GetNeverExpireTime(); + + GroupHandler gh = delegate(PwGroup pg) + { + WriteGroup(pg, pgRoot, ref uGroupIndex, dictGroups, dtNeverExpire, + mgr, false); + return true; + }; + + pgRoot.TraverseTree(TraversalMethod.PreOrder, gh, null); + Debug.Assert(dictGroups.Count == (int)(uGroupIndex - 1)); + + EnsureParentGroupsExported(pgRoot, ref uGroupIndex, dictGroups, + dtNeverExpire, mgr); + return dictGroups; + } + + private static void WriteGroup(PwGroup pg, PwGroup pgRoot, ref uint uGroupIndex, + Dictionary dictGroups, DateTime dtNeverExpire, + KdbManager mgr, bool bForceLevel0) + { + if(pg == pgRoot) return; + + KdbGroup grp = new KdbGroup(); + + grp.GroupId = uGroupIndex; + dictGroups[pg] = grp.GroupId; + + grp.ImageId = (uint)pg.IconId; + grp.Name = pg.Name; + grp.CreationTime.Set(pg.CreationTime); + grp.LastModificationTime.Set(pg.LastModificationTime); + grp.LastAccessTime.Set(pg.LastAccessTime); + + if(pg.Expires) + grp.ExpirationTime.Set(pg.ExpiryTime); + else grp.ExpirationTime.Set(dtNeverExpire); + + grp.Level = (bForceLevel0 ? (ushort)0 : (ushort)(pg.GetDepth() - 1)); + + if(pg.IsExpanded) grp.Flags |= (uint)KdbGroupFlags.Expanded; + + if(!mgr.AddGroup(ref grp)) + { + Debug.Assert(false); + throw new InvalidOperationException(); + } + + ++uGroupIndex; + } + + private static void EnsureParentGroupsExported(PwGroup pgRoot, ref uint uGroupIndex, + Dictionary dictGroups, DateTime dtNeverExpires, + KdbManager mgr) + { + bool bHasAtLeastOneGroup = (dictGroups.Count > 0); + uint uLocalIndex = uGroupIndex; // Local copy, can't use ref in delegate + + EntryHandler eh = delegate(PwEntry pe) + { + PwGroup pg = pe.ParentGroup; + if(pg == null) { Debug.Assert(false); return true; } + if(bHasAtLeastOneGroup && (pg == pgRoot)) return true; + + if(dictGroups.ContainsKey(pg)) return true; + + WriteGroup(pg, pgRoot, ref uLocalIndex, dictGroups, dtNeverExpires, + mgr, true); + return true; + }; + + pgRoot.TraverseTree(TraversalMethod.PreOrder, null, eh); + uGroupIndex = uLocalIndex; + } + + private void WriteEntries(KdbManager mgr, Dictionary dictGroups, + PwGroup pgRoot) + { + bool bWarnedOnce = false; + uint uGroupCount, uEntryCount, uEntriesSaved = 0; + pgRoot.GetCounts(true, out uGroupCount, out uEntryCount); + + DateTime dtNeverExpire = KdbManager.GetNeverExpireTime(); + + EntryHandler eh = delegate(PwEntry pe) + { + KdbEntry e = new KdbEntry(); + + e.Uuid.Set(pe.Uuid.UuidBytes); + + if(pe.ParentGroup != pgRoot) + e.GroupId = dictGroups[pe.ParentGroup]; + else + { + e.GroupId = 1; + if((m_slLogger != null) && !bWarnedOnce) + { + m_slLogger.SetText(KdbPrefix + + KPRes.FormatNoRootEntries, LogStatusType.Warning); + bWarnedOnce = true; + } + + if(dictGroups.Count == 0) + throw new Exception(KPRes.FormatNoSubGroupsInRoot); + } + + e.ImageId = (uint)pe.IconId; + + e.Title = pe.Strings.ReadSafe(PwDefs.TitleField); + e.UserName = pe.Strings.ReadSafe(PwDefs.UserNameField); + e.Password = pe.Strings.ReadSafe(PwDefs.PasswordField); + e.Url = pe.Strings.ReadSafe(PwDefs.UrlField); + + string strNotes = pe.Strings.ReadSafe(PwDefs.NotesField); + ExportCustomStrings(pe, ref strNotes); + ExportAutoType(pe, ref strNotes); + ExportUrlOverride(pe, ref strNotes); + e.Additional = strNotes; + + e.PasswordLength = (uint)e.Password.Length; + + Debug.Assert(TimeUtil.PwTimeLength == 7); + e.CreationTime.Set(pe.CreationTime); + e.LastModificationTime.Set(pe.LastModificationTime); + e.LastAccessTime.Set(pe.LastAccessTime); + + if(pe.Expires) e.ExpirationTime.Set(pe.ExpiryTime); + else e.ExpirationTime.Set(dtNeverExpire); + + IntPtr hBinaryData = IntPtr.Zero; + if(pe.Binaries.UCount >= 1) + { + foreach(KeyValuePair kvp in pe.Binaries) + { + e.BinaryDescription = kvp.Key; + + byte[] pbAttached = kvp.Value.ReadData(); + e.BinaryDataLength = (uint)pbAttached.Length; + + if(e.BinaryDataLength > 0) + { + hBinaryData = Marshal.AllocHGlobal((int)e.BinaryDataLength); + Marshal.Copy(pbAttached, 0, hBinaryData, (int)e.BinaryDataLength); + + e.BinaryData = hBinaryData; + } + + break; + } + + if((pe.Binaries.UCount > 1) && (m_slLogger != null)) + m_slLogger.SetText(KdbPrefix + KPRes.FormatOnlyOneAttachment + "\r\n\r\n" + + KPRes.Entry + ":\r\n" + KPRes.Title + ": " + e.Title + "\r\n" + + KPRes.UserName + ": " + e.UserName, LogStatusType.Warning); + } + + bool bResult = mgr.AddEntry(ref e); + + Marshal.FreeHGlobal(hBinaryData); + hBinaryData = IntPtr.Zero; + + if(!bResult) + { + Debug.Assert(false); + throw new InvalidOperationException(); + } + + ++uEntriesSaved; + if(m_slLogger != null) + if(!m_slLogger.SetProgress((100 * uEntriesSaved) / uEntryCount)) + return false; + + return true; + }; + + if(!pgRoot.TraverseTree(TraversalMethod.PreOrder, null, eh)) + throw new InvalidOperationException(); + } + + /* private static void ImportAutoType(ref string strNotes, PwEntry peStorage) + { + string str = strNotes; + char[] vTrim = new char[] { '\r', '\n', '\t', ' ' }; + + int nFirstAutoType = str.IndexOf(AutoTypePrefix, StringComparison.OrdinalIgnoreCase); + if(nFirstAutoType < 0) nFirstAutoType = int.MaxValue; + int nFirstAutoTypeWindow = str.IndexOf(AutoTypeWindowPrefix, StringComparison.OrdinalIgnoreCase); + if((nFirstAutoTypeWindow >= 0) && (nFirstAutoTypeWindow < nFirstAutoType)) + { + int nWindowEnd = str.IndexOf('\n', nFirstAutoTypeWindow); + if(nWindowEnd < 0) nWindowEnd = str.Length - 1; + + string strWindow = str.Substring(nFirstAutoTypeWindow + AutoTypeWindowPrefix.Length, + nWindowEnd - nFirstAutoTypeWindow - AutoTypeWindowPrefix.Length + 1); + strWindow = strWindow.Trim(vTrim); + + str = str.Remove(nFirstAutoTypeWindow, nWindowEnd - nFirstAutoTypeWindow + 1); + peStorage.AutoType.Set(strWindow, string.Empty); + } + + while(true) + { + int nAutoTypeStart = str.IndexOf(AutoTypePrefix, 0, + StringComparison.OrdinalIgnoreCase); + if(nAutoTypeStart < 0) break; + + int nAutoTypeEnd = str.IndexOf('\n', nAutoTypeStart); + if(nAutoTypeEnd < 0) nAutoTypeEnd = str.Length - 1; + + string strAutoType = str.Substring(nAutoTypeStart + AutoTypePrefix.Length, + nAutoTypeEnd - nAutoTypeStart - AutoTypePrefix.Length + 1); + strAutoType = strAutoType.Trim(vTrim); + + str = str.Remove(nAutoTypeStart, nAutoTypeEnd - nAutoTypeStart + 1); + + int nWindowStart = str.IndexOf(AutoTypeWindowPrefix, 0, + StringComparison.OrdinalIgnoreCase); + + if((nWindowStart < 0) || (nWindowStart >= nAutoTypeStart)) + { + peStorage.AutoType.DefaultSequence = strAutoType; + continue; + } + + int nWindowEnd = str.IndexOf('\n', nWindowStart); + if(nWindowEnd < 0) nWindowEnd = str.Length - 1; + + string strWindow = str.Substring(nWindowStart + AutoTypeWindowPrefix.Length, + nWindowEnd - nWindowStart - AutoTypeWindowPrefix.Length + 1); + strWindow = strWindow.Trim(vTrim); + + str = str.Remove(nWindowStart, nWindowEnd - nWindowStart + 1); + peStorage.AutoType.Set(strWindow, strAutoType); + } + + strNotes = str; + } */ + + private static void ImportAutoType(ref string strNotes, PwEntry peStorage) + { + if(string.IsNullOrEmpty(strNotes)) return; + + string str = strNotes.Replace("\r", string.Empty); + string[] vLines = str.Split('\n'); + + string strOvr = FindPrefixedLine(vLines, AutoTypePrefix + ":"); + if((strOvr != null) && (strOvr.Length > (AutoTypePrefix.Length + 1))) + { + strOvr = strOvr.Substring(AutoTypePrefix.Length + 1).Trim(); + peStorage.AutoType.DefaultSequence = ConvertAutoTypeSequence( + strOvr, true); + } + + StringBuilder sb = new StringBuilder(); + foreach(string strLine in vLines) + { + bool bProcessed = false; + for(int iIdx = 0; iIdx < 32; ++iIdx) + { + string s = ((iIdx == 0) ? string.Empty : ("-" + + iIdx.ToString(NumberFormatInfo.InvariantInfo))); + string strWndPrefix = (AutoTypeWindowPrefix + s + ":"); + string strSeqPrefix = (AutoTypePrefix + s + ":"); + + if(strLine.StartsWith(strWndPrefix, StrUtil.CaseIgnoreCmp) && + (strLine.Length > strWndPrefix.Length)) + { + string strWindow = strLine.Substring(strWndPrefix.Length).Trim(); + string strSeq = FindPrefixedLine(vLines, strSeqPrefix); + if((strSeq != null) && (strSeq.Length > strSeqPrefix.Length)) + peStorage.AutoType.Add(new AutoTypeAssociation( + strWindow, ConvertAutoTypeSequence(strSeq.Substring( + strSeqPrefix.Length), true))); + else // Window, but no sequence + peStorage.AutoType.Add(new AutoTypeAssociation( + strWindow, string.Empty)); + + bProcessed = true; + break; + } + else if(strLine.StartsWith(strSeqPrefix, StrUtil.CaseIgnoreCmp)) + { + bProcessed = true; + break; + } + } + + if(!bProcessed) + { + sb.Append(strLine); + sb.Append(MessageService.NewLine); + } + } + + strNotes = sb.ToString(); + // peStorage.AutoType.Sort(); + } + + private static string FindPrefixedLine(string[] vLines, string strPrefix) + { + foreach(string str in vLines) + { + if(str.StartsWith(strPrefix, StrUtil.CaseIgnoreCmp)) + return str; + } + + return null; + } + + private static Dictionary m_dSeq1xTo2x = null; + private static Dictionary m_dSeq1xTo2xBiDir = null; + private static string ConvertAutoTypeSequence(string strSeq, bool b1xTo2x) + { + if(string.IsNullOrEmpty(strSeq)) return string.Empty; + + if(m_dSeq1xTo2x == null) + { + m_dSeq1xTo2x = new Dictionary(); + m_dSeq1xTo2xBiDir = new Dictionary(); + + // m_dSeq1xTo2x[@"{SPACE}"] = " "; + // m_dSeq1xTo2x[@"{CLEARFIELD}"] = @"{HOME}+({END}){DEL}"; + + m_dSeq1xTo2xBiDir[@"{AT}"] = @"@"; + m_dSeq1xTo2xBiDir[@"{PLUS}"] = @"{+}"; + m_dSeq1xTo2xBiDir[@"{PERCENT}"] = @"{%}"; + m_dSeq1xTo2xBiDir[@"{CARET}"] = @"{^}"; + m_dSeq1xTo2xBiDir[@"{TILDE}"] = @"{~}"; + m_dSeq1xTo2xBiDir[@"{LEFTBRACE}"] = @"{{}"; + m_dSeq1xTo2xBiDir[@"{RIGHTBRACE}"] = @"{}}"; + m_dSeq1xTo2xBiDir[@"{LEFTPAREN}"] = @"{(}"; + m_dSeq1xTo2xBiDir[@"{RIGHTPAREN}"] = @"{)}"; + m_dSeq1xTo2xBiDir[@"(+{END})"] = @"+({END})"; + } + + string str = strSeq.Trim(); + + if(b1xTo2x) + { + foreach(KeyValuePair kvp in m_dSeq1xTo2x) + str = StrUtil.ReplaceCaseInsensitive(str, kvp.Key, kvp.Value); + } + + foreach(KeyValuePair kvp in m_dSeq1xTo2xBiDir) + { + if(b1xTo2x) str = StrUtil.ReplaceCaseInsensitive(str, kvp.Key, kvp.Value); + else str = StrUtil.ReplaceCaseInsensitive(str, kvp.Value, kvp.Key); + } + + if(!b1xTo2x) str = CapitalizePlaceholders(str); + + return str; + } + + private static string CapitalizePlaceholders(string strSeq) + { + string str = strSeq; + + int iOffset = 0; + while(true) + { + int iStart = str.IndexOf('{', iOffset); + if(iStart < 0) break; + + int iEnd = str.IndexOf('}', iStart); + if(iEnd < 0) break; // No assert (user data) + + string strPlaceholder = str.Substring(iStart, iEnd - iStart + 1); + + if(!strPlaceholder.StartsWith("{S:", StrUtil.CaseIgnoreCmp)) + str = str.Replace(strPlaceholder, strPlaceholder.ToUpper()); + + iOffset = iStart + 1; + } + + return str; + } + + private static void ExportCustomStrings(PwEntry peSource, ref string strNotes) + { + bool bSep = false; + foreach(KeyValuePair kvp in peSource.Strings) + { + if(PwDefs.IsStandardField(kvp.Key)) continue; + + if(!bSep) + { + if(strNotes.Length > 0) strNotes += MessageService.NewParagraph; + bSep = true; + } + + strNotes += kvp.Key + ": " + kvp.Value.ReadString() + + MessageService.NewLine; + } + } + + private static void ExportAutoType(PwEntry peSource, ref string strNotes) + { + StringBuilder sbAppend = new StringBuilder(); + bool bSeparator = false; + uint uIndex = 0; + + if((peSource.AutoType.DefaultSequence.Length > 0) && + (peSource.AutoType.AssociationsCount == 0)) // Avoid broken indices + { + if(strNotes.Length > 0) + sbAppend.Append(MessageService.NewParagraph); + + sbAppend.Append(AutoTypePrefix); + sbAppend.Append(@": "); + sbAppend.Append(ConvertAutoTypeSeqExp(peSource.AutoType.DefaultSequence, + peSource)); + sbAppend.Append(MessageService.NewLine); + + bSeparator = true; + ++uIndex; + } + + foreach(AutoTypeAssociation a in peSource.AutoType.Associations) + { + if(!bSeparator) + { + if(strNotes.Length > 0) + sbAppend.Append(MessageService.NewParagraph); + + bSeparator = true; + } + + string strSuffix = ((uIndex > 0) ? ("-" + uIndex.ToString( + NumberFormatInfo.InvariantInfo)) : string.Empty); + + sbAppend.Append(AutoTypePrefix + strSuffix); + sbAppend.Append(@": "); + sbAppend.Append(ConvertAutoTypeSeqExp(a.Sequence, peSource)); + sbAppend.Append(MessageService.NewLine); + sbAppend.Append(AutoTypeWindowPrefix + strSuffix); + sbAppend.Append(@": "); + sbAppend.Append(a.WindowName); + sbAppend.Append(MessageService.NewLine); + + ++uIndex; + } + + strNotes = strNotes.TrimEnd(new char[] { '\r', '\n', '\t', ' ' }); + strNotes += sbAppend.ToString(); + } + + private static string ConvertAutoTypeSeqExp(string strSeq, PwEntry pe) + { + string strExp = strSeq; + if(string.IsNullOrEmpty(strExp)) strExp = pe.GetAutoTypeSequence(); + + return ConvertAutoTypeSequence(strExp, false); + } + + private static void ImportUrlOverride(ref string strNotes, PwEntry peStorage) + { + string str = strNotes; + char[] vTrim = new char[] { '\r', '\n', '\t', ' ' }; + + int nUrlStart = str.IndexOf(UrlOverridePrefix, 0, + StringComparison.OrdinalIgnoreCase); + if(nUrlStart < 0) return; + + int nUrlEnd = str.IndexOf('\n', nUrlStart); + if(nUrlEnd < 0) nUrlEnd = str.Length - 1; + + string strUrl = str.Substring(nUrlStart + UrlOverridePrefix.Length, + nUrlEnd - nUrlStart - UrlOverridePrefix.Length + 1); + strUrl = strUrl.Trim(vTrim); + + peStorage.OverrideUrl = strUrl; + + str = str.Remove(nUrlStart, nUrlEnd - nUrlStart + 1); + + strNotes = str; + } + + private static void ExportUrlOverride(PwEntry peSource, ref string strNotes) + { + if(peSource.OverrideUrl.Length > 0) + { + StringBuilder sbAppend = new StringBuilder(); + + sbAppend.Append(MessageService.NewParagraph); + sbAppend.Append(UrlOverridePrefix); + sbAppend.Append(@" "); + sbAppend.Append(peSource.OverrideUrl); + sbAppend.Append(MessageService.NewLine); + + strNotes = strNotes.TrimEnd(new char[] { '\r', '\n', '\t', ' ' }); + strNotes += sbAppend.ToString(); + } + } + } +} diff --git a/src/KeePass/DataExchange/KdbManager.cs b/src/KeePass/DataExchange/KdbManager.cs new file mode 100644 index 0000000..068e9de --- /dev/null +++ b/src/KeePass/DataExchange/KdbManager.cs @@ -0,0 +1,1163 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#if PocketPC || Smartphone || WindowsCE +#undef KDB_ANSI +#else +// If compiling for the ANSI version of KeePassLibC, define KDB_ANSI. +// If compiling for the Unicode version of KeePassLibC, do not define KDB_ANSI. +#define KDB_ANSI +#endif + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; + +using KeePassLib.Utility; + +namespace KeePass.DataExchange +{ + /// + /// Structure containing information about a password group. This structure + /// doesn't contain any information about the entries stored in this group. + /// +#if PocketPC || Smartphone || WindowsCE + [StructLayout(LayoutKind.Sequential)] +#else + [StructLayout(LayoutKind.Sequential, Pack = 1)] +#endif + public struct KdbGroup + { + /// + /// The GroupID of the group. + /// + [MarshalAs(UnmanagedType.U4)] + public UInt32 GroupId; + + /// + /// The ImageID of the group. + /// + [MarshalAs(UnmanagedType.U4)] + public UInt32 ImageId; + + /// + /// The Name of the group. + /// +#if KDB_ANSI + [MarshalAs(UnmanagedType.LPStr)] + public string Name; +#else + [MarshalAs(UnmanagedType.LPWStr)] + public string Name; +#endif + + /// + /// The creation time of the group. + /// + public KdbTime CreationTime; + + /// + /// The last modification time of the group. + /// + public KdbTime LastModificationTime; + + /// + /// The last access time of the group. + /// + public KdbTime LastAccessTime; + + /// + /// The expiry time of the group. + /// + public KdbTime ExpirationTime; + + /// + /// Indentation level of the group. + /// + [MarshalAs(UnmanagedType.U2)] + public UInt16 Level; + +#if VPF_ALIGN + /// + /// Dummy entry for alignment purposes. + /// + [MarshalAs(UnmanagedType.U2)] + public UInt16 Dummy; +#endif + + /// + /// Flags of the group (see KdbGroupFlags). + /// + [MarshalAs(UnmanagedType.U4)] + public UInt32 Flags; + } + + /// + /// Password group flags. + /// + [Flags] + public enum KdbGroupFlags + { + /// + /// No special flags. + /// + None = 0, + + /// + /// The group is expanded. + /// + Expanded = 1 + } + + /// + /// Structure containing information about a password entry. + /// +#if PocketPC || Smartphone || WindowsCE + [StructLayout(LayoutKind.Sequential)] +#else + [StructLayout(LayoutKind.Sequential, Pack = 1)] +#endif + public struct KdbEntry + { + /// + /// The UUID of the entry. + /// + public KdbUuid Uuid; + + /// + /// The group ID of the enty. + /// + [MarshalAs(UnmanagedType.U4)] + public UInt32 GroupId; + + /// + /// The image ID of the entry. + /// + [MarshalAs(UnmanagedType.U4)] + public UInt32 ImageId; + +#if KDB_ANSI + /// + /// The title of the entry. + /// + [MarshalAs(UnmanagedType.LPStr)] + public string Title; + + /// + /// The URL of the entry. + /// + [MarshalAs(UnmanagedType.LPStr)] + public string Url; + + /// + /// The user name of the entry. + /// + [MarshalAs(UnmanagedType.LPStr)] + public string UserName; + + /// + /// The password length of the entry. + /// + [MarshalAs(UnmanagedType.U4)] + public UInt32 PasswordLength; + + /// + /// The password of the entry. + /// + [MarshalAs(UnmanagedType.LPStr)] + public string Password; + + /// + /// The notes field of the entry. + /// + [MarshalAs(UnmanagedType.LPStr)] + public string Additional; +#else + /// + /// The title of the entry. + /// + [MarshalAs(UnmanagedType.LPWStr)] + public string Title; + + /// + /// The URL of the entry. + /// + [MarshalAs(UnmanagedType.LPWStr)] + public string Url; + + /// + /// The user name of the entry. + /// + [MarshalAs(UnmanagedType.LPWStr)] + public string UserName; + + /// + /// The password length of the entry. + /// + [MarshalAs(UnmanagedType.U4)] + public UInt32 PasswordLength; + + /// + /// The password of the entry. + /// + [MarshalAs(UnmanagedType.LPWStr)] + public string Password; + + /// + /// The notes field of the entry. + /// + [MarshalAs(UnmanagedType.LPWStr)] + public string Additional; +#endif + + /// + /// The creation time of the entry. + /// + public KdbTime CreationTime; + + /// + /// The last modification time of the entry. + /// + public KdbTime LastModificationTime; + + /// + /// The last access time of the entry. + /// + public KdbTime LastAccessTime; + + /// + /// The expiration time of the entry. + /// + public KdbTime ExpirationTime; + + /// + /// The description of the binary attachment. + /// +#if KDB_ANSI + [MarshalAs(UnmanagedType.LPStr)] + public string BinaryDescription; +#else + [MarshalAs(UnmanagedType.LPWStr)] + public string BinaryDescription; +#endif + + /// + /// The attachment of the entry. + /// + public IntPtr BinaryData; + + /// + /// The length of the attachment. + /// + [MarshalAs(UnmanagedType.U4)] + public UInt32 BinaryDataLength; + } + + /// + /// Structure containing UUID bytes (16 bytes). + /// +#if PocketPC || Smartphone || WindowsCE + [StructLayout(LayoutKind.Sequential)] +#else + [StructLayout(LayoutKind.Sequential, Pack = 1)] +#endif + public struct KdbUuid + { + public Byte V0; public Byte V1; public Byte V2; public Byte V3; + public Byte V4; public Byte V5; public Byte V6; public Byte V7; + public Byte V8; public Byte V9; public Byte VA; public Byte VB; + public Byte VC; public Byte VD; public Byte VE; public Byte VF; + + /// + /// Convert UUID to a byte array of length 16. + /// + /// Byte array (16 bytes). + public byte[] ToByteArray() + { + return new byte[] { this.V0, this.V1, this.V2, this.V3, this.V4, + this.V5, this.V6, this.V7, this.V8, this.V9, this.VA, + this.VB, this.VC, this.VD, this.VE, this.VF }; + } + + /// + /// Set the UUID using an array of 16 bytes. + /// + /// Bytes to set the UUID to. + public void Set(byte[] pb) + { + Debug.Assert((pb != null) && (pb.Length == 16)); + if(pb == null) throw new ArgumentNullException("pb"); + if(pb.Length != 16) throw new ArgumentException(); + + this.V0 = pb[0]; this.V1 = pb[1]; this.V2 = pb[2]; this.V3 = pb[3]; + this.V4 = pb[4]; this.V5 = pb[5]; this.V6 = pb[6]; this.V7 = pb[7]; + this.V8 = pb[8]; this.V9 = pb[9]; this.VA = pb[10]; this.VB = pb[11]; + this.VC = pb[12]; this.VD = pb[13]; this.VE = pb[14]; this.VF = pb[15]; + } + } + + /// + /// Structure containing time information in a compact, but still easily + /// accessible form. + /// +#if PocketPC || Smartphone || WindowsCE + [StructLayout(LayoutKind.Sequential)] +#else + [StructLayout(LayoutKind.Sequential, Pack = 1)] +#endif + public struct KdbTime + { + [MarshalAs(UnmanagedType.U2)] + public UInt16 Year; + [MarshalAs(UnmanagedType.U1)] + public Byte Month; + [MarshalAs(UnmanagedType.U1)] + public Byte Day; + [MarshalAs(UnmanagedType.U1)] + public Byte Hour; + [MarshalAs(UnmanagedType.U1)] + public Byte Minute; + [MarshalAs(UnmanagedType.U1)] + public Byte Second; + +#if VPF_ALIGN + /// + /// Dummy entry for alignment purposes. + /// + [MarshalAs(UnmanagedType.U1)] + public Byte Dummy; +#endif + + /// + /// Construct a KdbTime with initial values. + /// + /// Year. + /// Month. + /// Day. + /// Hour. + /// Minute. + /// Second. + public KdbTime(UInt16 uYear, Byte uMonth, Byte uDay, Byte uHour, + Byte uMinute, Byte uSecond) + { + this.Year = uYear; + this.Month = uMonth; + this.Day = uDay; + this.Hour = uHour; + this.Minute = uMinute; + this.Second = uSecond; + +#if VPF_ALIGN + this.Dummy = 0; +#endif + } + + /// + /// Convert the current KdbTime object to a DateTime object. + /// + public DateTime ToDateTime() + { + if((this.Year == 0) || (this.Month == 0) || (this.Day == 0)) + return DateTime.UtcNow; + + // https://sourceforge.net/p/keepass/discussion/329221/thread/07599afd/ + try + { + int dy = (int)this.Year; + if(dy > 2999) { Debug.Assert(false); dy = 2999; } + + int dm = (int)this.Month; + if(dm > 12) { Debug.Assert(false); dm = 12; } + + int dd = (int)this.Day; + if(dd > 31) { Debug.Assert(false); dd = 28; } + // Day might not exist in month + + int th = (int)this.Hour; + if(th > 23) { Debug.Assert(false); th = 23; } + + int tm = (int)this.Minute; + if(tm > 59) { Debug.Assert(false); tm = 59; } + + int ts = (int)this.Second; + if(ts > 59) { Debug.Assert(false); ts = 59; } + + return (new DateTime(dy, dm, dd, th, tm, ts, + DateTimeKind.Local)).ToUniversalTime(); + } + catch(Exception) { Debug.Assert(false); } + + return DateTime.UtcNow; + } + + /// + /// Copy data from a DateTime object to the current KdbTime object. + /// + /// Data source. + public void Set(DateTime dt) + { + DateTime dtLocal = TimeUtil.ToLocal(dt, true); + + this.Year = (UInt16)dtLocal.Year; + this.Month = (Byte)dtLocal.Month; + this.Day = (Byte)dtLocal.Day; + this.Hour = (Byte)dtLocal.Hour; + this.Minute = (Byte)dtLocal.Minute; + this.Second = (Byte)dtLocal.Second; + } + + /// + /// A KdbTime element that is used to indicate the never expire time. + /// + public static readonly KdbTime NeverExpireTime = + new KdbTime(2999, 12, 28, 23, 59, 59); + } + + /// + /// Error codes for various functions (OpenDatabase, etc.). + /// + public enum KdbErrorCode + { + /// + /// Unknown error occurred. + /// + Unknown = 0, + + /// + /// Successful function call. + /// + Success, + + /// + /// Invalid parameters were given. + /// + InvalidParam, + + /// + /// Not enough memory to perform requested operation. + /// + NotEnoughMemory, + + /// + /// Invalid key was supplied. + /// + InvalidKey, + + /// + /// The file could not be read. + /// + NoFileAccessRead, + + /// + /// The file could not be written. + /// + NoFileAccessWrite, + + /// + /// A file read error occurred. + /// + FileErrorRead, + + /// + /// A file write error occurred. + /// + FileErrorWrite, + + /// + /// Invalid random source was given. + /// + InvalidRandomSource, + + /// + /// Invalid file structure was detected. + /// + InvalidFileStructure, + + /// + /// Cryptographic error occurred. + /// + CryptoError, + + /// + /// Invalid file size was given/detected. + /// + InvalidFileSize, + + /// + /// Invalid file signature was detected. + /// + InvalidFileSignature, + + /// + /// Invalid file header was detected. + /// + InvalidFileHeader, + + /// + /// The keyfile could not be read. + /// + NoFileAccessReadKey + } + + /// + /// Manager class for KDB files. It can load/save databases, add/change/delete + /// groups and entries, check for KeePassLibC library existence and version, etc. + /// + public sealed class KdbManager : IDisposable + { + internal const string DllFile32 = "KeePassLibC32.dll"; + internal const string DllFile64 = "KeePassLibC64.dll"; + + private static readonly bool m_bX64 = (IntPtr.Size == 8); + +#if KDB_ANSI + private const CharSet DllCharSet = CharSet.Ansi; +#else + private const CharSet DllCharSet = CharSet.Unicode; +#endif + + private static bool m_bFirstInstance = true; + private IntPtr m_pManager = IntPtr.Zero; + + [DllImport(DllFile32, EntryPoint = "GetKeePassVersion")] + private static extern UInt32 GetKeePassVersion32(); + [DllImport(DllFile64, EntryPoint = "GetKeePassVersion")] + private static extern UInt32 GetKeePassVersion64(); + /// + /// Get the KeePass version, which the KeePassLibC library supports. + /// + public static UInt32 KeePassVersion + { + get + { + if(m_bX64) return GetKeePassVersion64(); + else return GetKeePassVersion32(); + } + } + + [DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "GetKeePassVersionString")] + private static extern IntPtr GetKeePassVersionString32(); + [DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "GetKeePassVersionString")] + private static extern IntPtr GetKeePassVersionString64(); + /// + /// Get the KeePass version, which the KeePassLibC library supports + /// (the version is returned as a displayable string, if you need to + /// compare versions: use the KeePassVersion property). + /// + public static string KeePassVersionString + { +#if KDB_ANSI + get + { + if(m_bX64) return Marshal.PtrToStringAnsi(GetKeePassVersionString64()); + else return Marshal.PtrToStringAnsi(GetKeePassVersionString32()); + } +#else + get + { + if(m_bX64) return Marshal.PtrToStringUni(GetKeePassVersionString64()); + else return Marshal.PtrToStringUni(GetKeePassVersionString32()); + } +#endif + } + + [DllImport(DllFile32, EntryPoint = "GetLibraryBuild")] + private static extern UInt32 GetLibraryBuild32(); + [DllImport(DllFile64, EntryPoint = "GetLibraryBuild")] + private static extern UInt32 GetLibraryBuild64(); + /// + /// Get the library build version. This version has nothing to do with + /// the supported KeePass version (see KeePassVersion property). + /// + public static UInt32 LibraryBuild + { + get + { + if(m_bX64) return GetLibraryBuild64(); + else return GetLibraryBuild32(); + } + } + + [DllImport(DllFile32, EntryPoint = "GetNumberOfEntries")] + private static extern UInt32 GetNumberOfEntries32(IntPtr pMgr); + [DllImport(DllFile64, EntryPoint = "GetNumberOfEntries")] + private static extern UInt32 GetNumberOfEntries64(IntPtr pMgr); + /// + /// Get the number of entries in this manager instance. + /// + public UInt32 EntryCount + { + get + { + if(m_bX64) return GetNumberOfEntries64(m_pManager); + else return GetNumberOfEntries32(m_pManager); + } + } + + [DllImport(DllFile32, EntryPoint = "GetNumberOfGroups")] + private static extern UInt32 GetNumberOfGroups32(IntPtr pMgr); + [DllImport(DllFile64, EntryPoint = "GetNumberOfGroups")] + private static extern UInt32 GetNumberOfGroups64(IntPtr pMgr); + /// + /// Get the number of groups in this manager instance. + /// + public UInt32 GroupCount + { + get + { + if(m_bX64) return GetNumberOfGroups64(m_pManager); + else return GetNumberOfGroups32(m_pManager); + } + } + + [DllImport(DllFile32, EntryPoint = "GetKeyEncRounds")] + private static extern UInt32 GetKeyEncRounds32(IntPtr pMgr); + [DllImport(DllFile64, EntryPoint = "GetKeyEncRounds")] + private static extern UInt32 GetKeyEncRounds64(IntPtr pMgr); + [DllImport(DllFile32, EntryPoint = "SetKeyEncRounds")] + private static extern void SetKeyEncRounds32(IntPtr pMgr, UInt32 dwRounds); + [DllImport(DllFile64, EntryPoint = "SetKeyEncRounds")] + private static extern void SetKeyEncRounds64(IntPtr pMgr, UInt32 dwRounds); + /// + /// Get or set the number of key transformation rounds (in order to + /// make key-searching attacks harder). + /// + public UInt32 KeyTransformationRounds + { + get + { + if(m_bX64) return GetKeyEncRounds64(m_pManager); + else return GetKeyEncRounds32(m_pManager); + } + set + { + if(m_bX64) SetKeyEncRounds64(m_pManager, value); + else SetKeyEncRounds32(m_pManager, value); + } + } + + [DllImport(DllFile32, EntryPoint = "InitManager")] + private static extern void InitManager32(out IntPtr ppMgr, + [MarshalAs(UnmanagedType.Bool)] bool bFirstInstance); + [DllImport(DllFile64, EntryPoint = "InitManager")] + private static extern void InitManager64(out IntPtr ppMgr, + [MarshalAs(UnmanagedType.Bool)] bool bFirstInstance); + + [DllImport(DllFile32, EntryPoint = "NewDatabase")] + private static extern void NewDatabase32(IntPtr pMgr); + [DllImport(DllFile64, EntryPoint = "NewDatabase")] + private static extern void NewDatabase64(IntPtr pMgr); + /// + /// Construct a new KDB manager instance. + /// + public KdbManager() + { + if(!m_bX64) // Only check 32-bit structures + { +#if VPF_ALIGN + bool bAligned = true; +#else + bool bAligned = false; +#endif + + // Static structure layout assertions + int nExpectedSize = (bAligned ? 52 : 46); + KdbGroup g = new KdbGroup(); + Debug.Assert(Marshal.SizeOf(g) == nExpectedSize); + if(Marshal.SizeOf(g) != nExpectedSize) + throw new FormatException("SizeOf(KdbGroup) invalid!"); + + nExpectedSize = (bAligned ? 92 : 88); + KdbEntry e = new KdbEntry(); + Debug.Assert(Marshal.SizeOf(e) == nExpectedSize); + if(Marshal.SizeOf(e) != nExpectedSize) + throw new FormatException("SizeOf(KdbEntry) invalid!"); + + KdbUuid u = new KdbUuid(); + Debug.Assert(Marshal.SizeOf(u) == 16); + if(Marshal.SizeOf(u) != 16) + throw new FormatException("SizeOf(KdbUuid) invalid!"); + + nExpectedSize = (bAligned ? 8 : 7); + KdbTime t = new KdbTime(); + Debug.Assert(Marshal.SizeOf(t) == nExpectedSize); + if(Marshal.SizeOf(t) != nExpectedSize) + throw new FormatException("SizeOf(KdbTime) invalid!"); + } + + if(m_bX64) KdbManager.InitManager64(out m_pManager, m_bFirstInstance); + else KdbManager.InitManager32(out m_pManager, m_bFirstInstance); + + m_bFirstInstance = false; + + if(m_pManager == IntPtr.Zero) + throw new InvalidOperationException("Failed to initialize manager! DLL installed?"); + + if(m_bX64) KdbManager.NewDatabase64(m_pManager); + else KdbManager.NewDatabase32(m_pManager); + } + + ~KdbManager() + { + Dispose(false); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + [DllImport(DllFile32, EntryPoint = "DeleteManager")] + private static extern void DeleteManager32(IntPtr pMgr); + [DllImport(DllFile64, EntryPoint = "DeleteManager")] + private static extern void DeleteManager64(IntPtr pMgr); + private void Dispose(bool bDisposing) + { + if(m_pManager != IntPtr.Zero) + { + try + { + if(m_bX64) KdbManager.DeleteManager64(m_pManager); + else KdbManager.DeleteManager32(m_pManager); + } + catch(Exception) { Debug.Assert(false); } + + m_pManager = IntPtr.Zero; + } + } + + [Obsolete] + public void Unload() + { + Dispose(true); + } + + [DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "SetMasterKey")] + private static extern Int32 SetMasterKey32(IntPtr pMgr, string pszMasterKey, + [MarshalAs(UnmanagedType.Bool)] bool bDiskDrive, string pszSecondKey, + IntPtr pARI, [MarshalAs(UnmanagedType.Bool)] bool bOverwrite); + [DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "SetMasterKey")] + private static extern Int32 SetMasterKey64(IntPtr pMgr, string pszMasterKey, + [MarshalAs(UnmanagedType.Bool)] bool bDiskDrive, string pszSecondKey, + IntPtr pARI, [MarshalAs(UnmanagedType.Bool)] bool bOverwrite); + /// + /// Set the master key, which will be used when you call the + /// OpenDatabase or SaveDatabase functions. + /// + /// Master password or path to key file. Must not be null. + /// Indicates if a key file is used. + /// Path to the key file when both master password + /// and key file are used. + /// Random source interface. Set this to IntPtr.Zero + /// if you want to open a KDB file normally. If you want to create a key file, + /// pARI must point to a CNewRandomInterface (see KeePass 1.x + /// source code). + /// Indicates if the target file should be overwritten when + /// creating a new key file. + /// Error code (see KdbErrorCode). + public KdbErrorCode SetMasterKey(string strMasterKey, bool bDiskDrive, + string strSecondKey, IntPtr pARI, bool bOverwrite) + { + Debug.Assert(strMasterKey != null); + if(strMasterKey == null) throw new ArgumentNullException("strMasterKey"); + + if(m_bX64) + return (KdbErrorCode)KdbManager.SetMasterKey64(m_pManager, + strMasterKey, bDiskDrive, strSecondKey, pARI, bOverwrite); + else + return (KdbErrorCode)KdbManager.SetMasterKey32(m_pManager, + strMasterKey, bDiskDrive, strSecondKey, pARI, bOverwrite); + } + + [DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "GetNumberOfItemsInGroup")] + private static extern UInt32 GetNumberOfItemsInGroup32(IntPtr pMgr, string pszGroup); + [DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "GetNumberOfItemsInGroup")] + private static extern UInt32 GetNumberOfItemsInGroup64(IntPtr pMgr, string pszGroup); + /// + /// Get the number of entries in a group. + /// + /// Group name, which identifies the group. Note + /// that multiple groups can have the same name, in this case you'll need to + /// use the other counting function which uses group IDs. + /// Number of entries in the specified group. + public UInt32 GetNumberOfEntriesInGroup(string strGroupName) + { + Debug.Assert(strGroupName != null); + if(strGroupName == null) throw new ArgumentNullException("strGroupName"); + + if(m_bX64) return KdbManager.GetNumberOfItemsInGroup64(m_pManager, strGroupName); + else return KdbManager.GetNumberOfItemsInGroup32(m_pManager, strGroupName); + } + + [DllImport(DllFile32, EntryPoint = "GetNumberOfItemsInGroupN")] + private static extern UInt32 GetNumberOfItemsInGroupN32(IntPtr pMgr, UInt32 idGroup); + [DllImport(DllFile64, EntryPoint = "GetNumberOfItemsInGroupN")] + private static extern UInt32 GetNumberOfItemsInGroupN64(IntPtr pMgr, UInt32 idGroup); + /// + /// Get the number of entries in a group. + /// + /// Group ID. + /// Number of entries in the specified group. + public UInt32 GetNumberOfEntriesInGroup(UInt32 uGroupId) + { + Debug.Assert((uGroupId != 0) && (uGroupId != UInt32.MaxValue)); + if((uGroupId == 0) || (uGroupId == UInt32.MaxValue)) + throw new ArgumentException("Invalid group ID!"); + + if(m_bX64) return KdbManager.GetNumberOfItemsInGroupN64(m_pManager, uGroupId); + else return KdbManager.GetNumberOfItemsInGroupN32(m_pManager, uGroupId); + } + + [DllImport(DllFile32, EntryPoint = "LockEntryPassword")] + private static extern IntPtr LockEntryPassword32(IntPtr pMgr, IntPtr pEntry); + [DllImport(DllFile64, EntryPoint = "LockEntryPassword")] + private static extern IntPtr LockEntryPassword64(IntPtr pMgr, IntPtr pEntry); + [DllImport(DllFile32, EntryPoint = "UnlockEntryPassword")] + private static extern IntPtr UnlockEntryPassword32(IntPtr pMgr, IntPtr pEntry); + [DllImport(DllFile64, EntryPoint = "UnlockEntryPassword")] + private static extern IntPtr UnlockEntryPassword64(IntPtr pMgr, IntPtr pEntry); + + [DllImport(DllFile32, EntryPoint = "GetEntry")] + private static extern IntPtr GetEntry32(IntPtr pMgr, UInt32 dwIndex); + [DllImport(DllFile64, EntryPoint = "GetEntry")] + private static extern IntPtr GetEntry64(IntPtr pMgr, UInt32 dwIndex); + /// + /// Get an entry. + /// + /// Index of the entry. This index must be valid, otherwise + /// an ArgumentOutOfRangeException is thrown. + /// The requested entry. Note that any modifications to this + /// structure won't affect the internal data structures of the manager. + public KdbEntry GetEntry(uint uIndex) + { + Debug.Assert(uIndex < this.EntryCount); + + IntPtr p; + if(m_bX64) p = KdbManager.GetEntry64(m_pManager, uIndex); + else p = KdbManager.GetEntry32(m_pManager, uIndex); + + if(p == IntPtr.Zero) throw new ArgumentOutOfRangeException("uIndex"); + + if(m_bX64) KdbManager.UnlockEntryPassword64(m_pManager, p); + else KdbManager.UnlockEntryPassword32(m_pManager, p); + + KdbEntry kdbEntry = (KdbEntry)Marshal.PtrToStructure(p, typeof(KdbEntry)); + + if(m_bX64) KdbManager.LockEntryPassword64(m_pManager, p); + else KdbManager.LockEntryPassword32(m_pManager, p); + + return kdbEntry; + } + + [DllImport(DllFile32, EntryPoint = "GetEntryByGroup")] + private static extern IntPtr GetEntryByGroup32(IntPtr pMgr, UInt32 idGroup, UInt32 dwIndex); + [DllImport(DllFile64, EntryPoint = "GetEntryByGroup")] + private static extern IntPtr GetEntryByGroup64(IntPtr pMgr, UInt32 idGroup, UInt32 dwIndex); + /// + /// Get an entry in a specific group. + /// + /// Index of the entry in the group. This index must + /// be valid, otherwise an ArgumentOutOfRangeException is thrown. + /// ID of the group containing the entry. + /// The requested entry. Note that any modifications to this + /// structure won't affect the internal data structures of the manager. + public KdbEntry GetEntryByGroup(UInt32 uGroupId, UInt32 uIndex) + { + Debug.Assert((uGroupId != 0) && (uGroupId != UInt32.MaxValue)); + if((uGroupId == 0) || (uGroupId == UInt32.MaxValue)) + throw new ArgumentException("Invalid group ID!"); + + Debug.Assert(uIndex < this.EntryCount); + + IntPtr p; + if(m_bX64) p = GetEntryByGroup64(m_pManager, uGroupId, uIndex); + else p = GetEntryByGroup32(m_pManager, uGroupId, uIndex); + + if(p == IntPtr.Zero) throw new ArgumentOutOfRangeException(); + + if(m_bX64) KdbManager.UnlockEntryPassword64(m_pManager, p); + else KdbManager.UnlockEntryPassword32(m_pManager, p); + + KdbEntry kdbEntry = (KdbEntry)Marshal.PtrToStructure(p, typeof(KdbEntry)); + + if(m_bX64) KdbManager.LockEntryPassword64(m_pManager, p); + else KdbManager.LockEntryPassword32(m_pManager, p); + + return kdbEntry; + } + + [DllImport(DllFile32, EntryPoint = "GetGroup")] + private static extern IntPtr GetGroup32(IntPtr pMgr, UInt32 dwIndex); + [DllImport(DllFile64, EntryPoint = "GetGroup")] + private static extern IntPtr GetGroup64(IntPtr pMgr, UInt32 dwIndex); + /// + /// Get a group. + /// + /// Index of the group. Must be valid, otherwise an + /// ArgumentOutOfRangeException is thrown. + /// Group structure. + public KdbGroup GetGroup(UInt32 uIndex) + { + Debug.Assert(uIndex < this.GroupCount); + + IntPtr p; + if(m_bX64) p = KdbManager.GetGroup64(m_pManager, uIndex); + else p = KdbManager.GetGroup32(m_pManager, uIndex); + + if(p == IntPtr.Zero) throw new ArgumentOutOfRangeException("uIndex"); + + return (KdbGroup)Marshal.PtrToStructure(p, typeof(KdbGroup)); + } + + [DllImport(DllFile32, EntryPoint = "GetGroupById")] + private static extern IntPtr GetGroupById32(IntPtr pMgr, UInt32 idGroup); + [DllImport(DllFile64, EntryPoint = "GetGroupById")] + private static extern IntPtr GetGroupById64(IntPtr pMgr, UInt32 idGroup); + /// + /// Get a group via the GroupID. + /// + /// ID of the group. + /// Group structure. + public KdbGroup GetGroupById(UInt32 uGroupId) + { + Debug.Assert((uGroupId != 0) && (uGroupId != UInt32.MaxValue)); + if((uGroupId == 0) || (uGroupId == UInt32.MaxValue)) + throw new ArgumentException("Invalid group ID!"); + + IntPtr p; + if(m_bX64) p = KdbManager.GetGroupById64(m_pManager, uGroupId); + else p = KdbManager.GetGroupById32(m_pManager, uGroupId); + + if(p == IntPtr.Zero) throw new ArgumentOutOfRangeException("uGroupId"); + + return (KdbGroup)Marshal.PtrToStructure(p, typeof(KdbGroup)); + } + + [DllImport(DllFile32, EntryPoint = "GetGroupByIdN")] + private static extern UInt32 GetGroupByIdN32(IntPtr pMgr, UInt32 idGroup); + [DllImport(DllFile64, EntryPoint = "GetGroupByIdN")] + private static extern UInt32 GetGroupByIdN64(IntPtr pMgr, UInt32 idGroup); + /// + /// Get the group index via the GroupID. + /// + /// ID of the group. + /// Group index. + public UInt32 GetGroupByIdN(UInt32 uGroupId) + { + Debug.Assert((uGroupId != 0) && (uGroupId != UInt32.MaxValue)); + if((uGroupId == 0) || (uGroupId == UInt32.MaxValue)) + throw new ArgumentException("Invalid group ID!"); + + if(m_bX64) return KdbManager.GetGroupByIdN64(m_pManager, uGroupId); + else return KdbManager.GetGroupByIdN32(m_pManager, uGroupId); + } + + [DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "OpenDatabase")] + private static extern Int32 OpenDatabase32(IntPtr pMgr, string pszFile, IntPtr pRepair); + [DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "OpenDatabase")] + private static extern Int32 OpenDatabase64(IntPtr pMgr, string pszFile, IntPtr pRepair); + /// + /// Open a KDB database. + /// + /// File path of the database. + /// Pointer to a repair information structure. If + /// you want to open a Kdb file normally, set this parameter to + /// IntPtr.Zero. + /// Error code (see KdbErrorCode). + public KdbErrorCode OpenDatabase(string strFile, IntPtr pRepairInfo) + { + Debug.Assert(strFile != null); + if(strFile == null) throw new ArgumentNullException("strFile"); + + if(m_bX64) return (KdbErrorCode)KdbManager.OpenDatabase64(m_pManager, strFile, pRepairInfo); + else return (KdbErrorCode)KdbManager.OpenDatabase32(m_pManager, strFile, pRepairInfo); + } + + [DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "SaveDatabase")] + private static extern Int32 SaveDatabase32(IntPtr pMgr, string pszFile); + [DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "SaveDatabase")] + private static extern Int32 SaveDatabase64(IntPtr pMgr, string pszFile); + /// + /// Save the current contents of the manager to a KDB file on disk. + /// + /// File to create. + /// Error code (see KdbErrorCode). + public KdbErrorCode SaveDatabase(string strFile) + { + Debug.Assert(strFile != null); + if(strFile == null) throw new ArgumentNullException("strFile"); + + if(m_bX64) return (KdbErrorCode)KdbManager.SaveDatabase64(m_pManager, strFile); + else return (KdbErrorCode)KdbManager.SaveDatabase32(m_pManager, strFile); + } + + /// + /// Close current database and create a new and empty one. + /// + public void NewDatabase() + { + if(m_bX64) KdbManager.NewDatabase64(m_pManager); + else KdbManager.NewDatabase32(m_pManager); + } + + /// + /// Get the date/time object representing the 'Never Expires' status. + /// + /// DateTime object. + public static DateTime GetNeverExpireTime() + { + return KdbTime.NeverExpireTime.ToDateTime(); + } + + [DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "AddGroup")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool AddGroup32(IntPtr pMgr, ref KdbGroup pTemplate); + [DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "AddGroup")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool AddGroup64(IntPtr pMgr, ref KdbGroup pTemplate); + /// + /// Add a new password group. + /// + /// Template containing new group information. + /// Returns true if the group was created successfully. + public bool AddGroup(ref KdbGroup pNewGroup) + { + if(m_bX64) return KdbManager.AddGroup64(m_pManager, ref pNewGroup); + else return KdbManager.AddGroup32(m_pManager, ref pNewGroup); + } + + [DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "SetGroup")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool SetGroup32(IntPtr pMgr, UInt32 dwIndex, ref KdbGroup pTemplate); + [DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "SetGroup")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool SetGroup64(IntPtr pMgr, UInt32 dwIndex, ref KdbGroup pTemplate); + /// + /// Set/change a password group. + /// + /// Index of the group to be changed. + /// Template containing new group information. + /// Returns true if the group was created successfully. + public bool SetGroup(UInt32 uIndex, ref KdbGroup pNewGroup) + { + Debug.Assert(uIndex < this.GroupCount); + + if(m_bX64) return KdbManager.SetGroup64(m_pManager, uIndex, ref pNewGroup); + else return KdbManager.SetGroup32(m_pManager, uIndex, ref pNewGroup); + } + + [DllImport(DllFile32, EntryPoint = "DeleteGroupById")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool DeleteGroupById32(IntPtr pMgr, UInt32 uGroupId); + [DllImport(DllFile64, EntryPoint = "DeleteGroupById")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool DeleteGroupById64(IntPtr pMgr, UInt32 uGroupId); + /// + /// Delete a password group. + /// + /// ID of the group to be deleted. + /// If the group has been deleted, the return value is true. + public bool DeleteGroupByID(UInt32 uGroupID) + { + Debug.Assert((uGroupID != 0) && (uGroupID != UInt32.MaxValue)); + if((uGroupID == 0) || (uGroupID == UInt32.MaxValue)) + throw new ArgumentException("Invalid group ID!"); + + if(m_bX64) return KdbManager.DeleteGroupById64(m_pManager, uGroupID); + else return KdbManager.DeleteGroupById32(m_pManager, uGroupID); + } + + [DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "AddEntry")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool AddEntry32(IntPtr pMgr, ref KdbEntry pTemplate); + [DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "AddEntry")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool AddEntry64(IntPtr pMgr, ref KdbEntry pTemplate); + /// + /// Add a new password entry. + /// + /// Template containing new entry information. + /// Returns true if the entry was created successfully. + public bool AddEntry(ref KdbEntry peNew) + { + if(m_bX64) return KdbManager.AddEntry64(m_pManager, ref peNew); + else return KdbManager.AddEntry32(m_pManager, ref peNew); + } + + [DllImport(DllFile32, CharSet = DllCharSet, EntryPoint = "SetEntry")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool SetEntry32(IntPtr pMgr, UInt32 dwIndex, ref KdbEntry pTemplate); + [DllImport(DllFile64, CharSet = DllCharSet, EntryPoint = "SetEntry")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool SetEntry64(IntPtr pMgr, UInt32 dwIndex, ref KdbEntry pTemplate); + /// + /// Set/change a password entry. + /// + /// Index of the entry to be changed. + /// Template containing new entry information. + /// Returns true if the entry was created successfully. + public bool SetEntry(UInt32 uIndex, ref KdbEntry peNew) + { + Debug.Assert(uIndex < this.EntryCount); + + if(m_bX64) return KdbManager.SetEntry64(m_pManager, uIndex, ref peNew); + else return KdbManager.SetEntry32(m_pManager, uIndex, ref peNew); + } + + [DllImport(DllFile32, EntryPoint = "DeleteEntry")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool DeleteEntry32(IntPtr pMgr, UInt32 dwIndex); + [DllImport(DllFile64, EntryPoint = "DeleteEntry")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool DeleteEntry64(IntPtr pMgr, UInt32 dwIndex); + /// + /// Delete a password entry. + /// + /// Index of the entry. + /// If the entry has been deleted, the return value is true. + public bool DeleteEntry(UInt32 uIndex) + { + Debug.Assert(uIndex < this.EntryCount); + + if(m_bX64) return KdbManager.DeleteEntry64(m_pManager, uIndex); + else return KdbManager.DeleteEntry32(m_pManager, uIndex); + } + + /// + /// Helper function to extract file attachments. + /// + /// Native memory pointer (as stored in the + /// BinaryData member of KdbEntry. + /// Size in bytes of the memory block. + /// Managed byte array. + public static byte[] ReadBinary(IntPtr pMemory, uint uSize) + { + Debug.Assert(pMemory != IntPtr.Zero); + if(pMemory == IntPtr.Zero) throw new ArgumentNullException("pMemory"); + + byte[] pb = new byte[uSize]; + if(uSize == 0) return pb; + + Marshal.Copy(pMemory, pb, 0, (int)uSize); + return pb; + } + } +} diff --git a/src/KeePass/DataExchange/PwExportInfo.cs b/src/KeePass/DataExchange/PwExportInfo.cs new file mode 100644 index 0000000..9659957 --- /dev/null +++ b/src/KeePass/DataExchange/PwExportInfo.cs @@ -0,0 +1,118 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; + +using KeePassLib; + +namespace KeePass.DataExchange +{ + public sealed class PwExportInfo + { + private PwGroup m_pg; + /// + /// This group contains all entries and subgroups that should + /// be exported. Is never null. + /// + public PwGroup DataGroup + { + get { return m_pg; } + internal set { m_pg = value; } + } + + private PwDatabase m_pd; + /// + /// Optional context database reference. May be null. + /// + public PwDatabase ContextDatabase + { + get { return m_pd; } + } + + private bool m_bExpDel = true; + /// + /// Indicates whether deleted objects should be exported, if + /// the data format supports it. + /// + public bool ExportDeletedObjects + { + get { return m_bExpDel; } + } + + private bool m_bExportMasterKeySpec = false; + internal bool ExportMasterKeySpec + { + get { return m_bExportMasterKeySpec; } + set { m_bExportMasterKeySpec = value; } + } + + private bool m_bExportParentGroups = false; + internal bool ExportParentGroups + { + get { return m_bExportParentGroups; } + set { m_bExportParentGroups = value; } + } + + private bool m_bExportPostOpen = false; + internal bool ExportPostOpen + { + get { return m_bExportPostOpen; } + set { m_bExportPostOpen = value; } + } + + private bool m_bExportPostShow = false; + internal bool ExportPostShow + { + get { return m_bExportPostShow; } + set { m_bExportPostShow = value; } + } + + private Dictionary m_dictParams = + new Dictionary(); + public Dictionary Parameters + { + get { return m_dictParams; } + } + + public PwExportInfo(PwGroup pgDataSource, PwDatabase pwContextInfo) + { + ConstructEx(pgDataSource, pwContextInfo, null); + } + + public PwExportInfo(PwGroup pgDataSource, PwDatabase pwContextInfo, + bool bExportDeleted) + { + ConstructEx(pgDataSource, pwContextInfo, bExportDeleted); + } + + private void ConstructEx(PwGroup pgDataSource, PwDatabase pwContextInfo, + bool? bExportDeleted) + { + if(pgDataSource == null) throw new ArgumentNullException("pgDataSource"); + // pwContextInfo may be null + + m_pg = pgDataSource; + m_pd = pwContextInfo; + + if(bExportDeleted.HasValue) m_bExpDel = bExportDeleted.Value; + } + } +} diff --git a/src/KeePass/Ecas/EcasAction.cs b/src/KeePass/Ecas/EcasAction.cs new file mode 100644 index 0000000..65547dd --- /dev/null +++ b/src/KeePass/Ecas/EcasAction.cs @@ -0,0 +1,79 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml.Serialization; + +using KeePassLib; +using KeePassLib.Interfaces; + +namespace KeePass.Ecas +{ + public sealed class EcasAction : IDeepCloneable, IEcasObject + { + private PwUuid m_type = PwUuid.Zero; + [XmlIgnore] + public PwUuid Type + { + get { return m_type; } + set { m_type = value; } + } + + [XmlElement("TypeGuid")] + public string TypeString + { + get { return Convert.ToBase64String(m_type.UuidBytes, Base64FormattingOptions.None); } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_type = new PwUuid(Convert.FromBase64String(value)); + } + } + + private List m_params = new List(); + [XmlArrayItem("Parameter")] + public List Parameters + { + get { return m_params; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_params = value; + } + } + + public EcasAction() + { + } + + public EcasAction CloneDeep() + { + EcasAction e = new EcasAction(); + + e.m_type = m_type; // PwUuid is immutable + + for(int i = 0; i < m_params.Count; ++i) + e.m_params.Add(m_params[i]); + + return e; + } + } +} diff --git a/src/KeePass/Ecas/EcasActionProvider.cs b/src/KeePass/Ecas/EcasActionProvider.cs new file mode 100644 index 0000000..96b781e --- /dev/null +++ b/src/KeePass/Ecas/EcasActionProvider.cs @@ -0,0 +1,90 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; + +using KeePassLib; + +namespace KeePass.Ecas +{ + public abstract class EcasActionProvider + { + protected List m_actions = new List(); + + internal List Actions + { + get { return m_actions; } + } + + public bool IsSupported(PwUuid uuidType) + { + if(uuidType == null) throw new ArgumentNullException("uuidType"); + + foreach(EcasActionType t in m_actions) + { + if(t.Type.Equals(uuidType)) + return true; + } + + return false; + } + + public EcasActionType Find(string strActionName) + { + if(strActionName == null) throw new ArgumentNullException("strActionName"); + + foreach(EcasActionType t in m_actions) + { + if(t.Name == strActionName) return t; + } + + return null; + } + + public EcasActionType Find(PwUuid uuid) + { + if(uuid == null) throw new ArgumentNullException("uuid"); + + foreach(EcasActionType t in m_actions) + { + if(t.Type.Equals(uuid)) return t; + } + + return null; + } + + public void Execute(EcasAction a, EcasContext ctx) + { + if(a == null) throw new ArgumentNullException("a"); + + foreach(EcasActionType t in m_actions) + { + if(t.Type.Equals(a.Type)) + { + t.ExecuteMethod(a, ctx); + return; + } + } + + throw new NotSupportedException(); + } + } +} diff --git a/src/KeePass/Ecas/EcasActionType.cs b/src/KeePass/Ecas/EcasActionType.cs new file mode 100644 index 0000000..7a1ea9c --- /dev/null +++ b/src/KeePass/Ecas/EcasActionType.cs @@ -0,0 +1,82 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; + +using KeePassLib; + +namespace KeePass.Ecas +{ + public delegate void EcasActionExecute(EcasAction a, EcasContext ctx); + + public sealed class EcasActionType : IEcasParameterized + { + private PwUuid m_type; + public PwUuid Type + { + get { return m_type; } + } + + private string m_strName; + public string Name + { + get { return m_strName; } + } + + private PwIcon m_pwIcon; + public PwIcon Icon + { + get { return m_pwIcon; } + } + + private EcasParameter[] m_vParams; + public EcasParameter[] Parameters + { + get { return m_vParams; } + } + + private EcasActionExecute m_fn; + public EcasActionExecute ExecuteMethod + { + get { return m_fn; } + } + + private static void EcasActionExecuteNull(EcasAction a, EcasContext ctx) + { + } + + public EcasActionType(PwUuid uuidType, string strName, PwIcon pwIcon, + EcasParameter[] vParams, EcasActionExecute f) + { + if((uuidType == null) || PwUuid.Zero.Equals(uuidType)) + throw new ArgumentNullException("uuidType"); + if(strName == null) throw new ArgumentNullException("strName"); + // if(vParams == null) throw new ArgumentNullException("vParams"); + // if(f == null) throw new ArgumentNullException("f"); + + m_type = uuidType; + m_strName = strName; + m_pwIcon = pwIcon; + m_vParams = (vParams ?? EcasParameter.EmptyArray); + m_fn = (f ?? EcasActionExecuteNull); + } + } +} diff --git a/src/KeePass/Ecas/EcasCondition.cs b/src/KeePass/Ecas/EcasCondition.cs new file mode 100644 index 0000000..bf3ef7a --- /dev/null +++ b/src/KeePass/Ecas/EcasCondition.cs @@ -0,0 +1,87 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml.Serialization; + +using KeePassLib; +using KeePassLib.Interfaces; + +namespace KeePass.Ecas +{ + public sealed class EcasCondition : IDeepCloneable, IEcasObject + { + private PwUuid m_type = PwUuid.Zero; + [XmlIgnore] + public PwUuid Type + { + get { return m_type; } + set { m_type = value; } + } + + [XmlElement("TypeGuid")] + public string TypeString + { + get { return Convert.ToBase64String(m_type.UuidBytes, Base64FormattingOptions.None); } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_type = new PwUuid(Convert.FromBase64String(value)); + } + } + + private List m_params = new List(); + [XmlArrayItem("Parameter")] + public List Parameters + { + get { return m_params; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_params = value; + } + } + + private bool m_bNegate = false; + public bool Negate + { + get { return m_bNegate; } + set { m_bNegate = value; } + } + + public EcasCondition() + { + } + + public EcasCondition CloneDeep() + { + EcasCondition e = new EcasCondition(); + + e.m_type = m_type; // PwUuid is immutable + + for(int i = 0; i < m_params.Count; ++i) + e.m_params.Add(m_params[i]); + + e.Negate = m_bNegate; + return e; + } + } +} diff --git a/src/KeePass/Ecas/EcasConditionProvider.cs b/src/KeePass/Ecas/EcasConditionProvider.cs new file mode 100644 index 0000000..f26e800 --- /dev/null +++ b/src/KeePass/Ecas/EcasConditionProvider.cs @@ -0,0 +1,87 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; + +using KeePassLib; + +namespace KeePass.Ecas +{ + public abstract class EcasConditionProvider + { + protected List m_conditions = new List(); + + internal List Conditions + { + get { return m_conditions; } + } + + public bool IsSupported(PwUuid uuidType) + { + if(uuidType == null) throw new ArgumentNullException("uuidType"); + + foreach(EcasConditionType t in m_conditions) + { + if(t.Type.Equals(uuidType)) + return true; + } + + return false; + } + + public EcasConditionType Find(string strConditionName) + { + if(strConditionName == null) throw new ArgumentNullException("strConditionName"); + + foreach(EcasConditionType t in m_conditions) + { + if(t.Name == strConditionName) return t; + } + + return null; + } + + public EcasConditionType Find(PwUuid uuid) + { + if(uuid == null) throw new ArgumentNullException("uuid"); + + foreach(EcasConditionType t in m_conditions) + { + if(t.Type.Equals(uuid)) return t; + } + + return null; + } + + public bool Evaluate(EcasCondition c, EcasContext ctx) + { + if(c == null) throw new ArgumentNullException("c"); + + foreach(EcasConditionType t in m_conditions) + { + if(t.Type.Equals(c.Type)) + return t.EvaluateMethod(c, ctx); + } + + throw new NotSupportedException(); + } + } +} diff --git a/src/KeePass/Ecas/EcasConditionType.cs b/src/KeePass/Ecas/EcasConditionType.cs new file mode 100644 index 0000000..098ca94 --- /dev/null +++ b/src/KeePass/Ecas/EcasConditionType.cs @@ -0,0 +1,83 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; + +using KeePassLib; + +namespace KeePass.Ecas +{ + public delegate bool EcasConditionEvaluate(EcasCondition c, EcasContext ctx); + + public sealed class EcasConditionType : IEcasParameterized + { + private PwUuid m_type; + public PwUuid Type + { + get { return m_type; } + } + + private string m_strName; + public string Name + { + get { return m_strName; } + } + + private PwIcon m_pwIcon; + public PwIcon Icon + { + get { return m_pwIcon; } + } + + private EcasParameter[] m_vParams; + public EcasParameter[] Parameters + { + get { return m_vParams; } + } + + private EcasConditionEvaluate m_fn; + public EcasConditionEvaluate EvaluateMethod + { + get { return m_fn; } + } + + private static bool EcasConditionEvaluateTrue(EcasCondition c, EcasContext ctx) + { + return true; + } + + public EcasConditionType(PwUuid uuidType, string strName, PwIcon pwIcon, + EcasParameter[] vParams, EcasConditionEvaluate f) + { + if((uuidType == null) || PwUuid.Zero.Equals(uuidType)) + throw new ArgumentNullException("uuidType"); + if(strName == null) throw new ArgumentNullException("strName"); + // if(vParams == null) throw new ArgumentNullException("vParams"); + // if(f == null) throw new ArgumentNullException("f"); + + m_type = uuidType; + m_strName = strName; + m_pwIcon = pwIcon; + m_vParams = (vParams ?? EcasParameter.EmptyArray); + m_fn = (f ?? EcasConditionEvaluateTrue); + } + } +} diff --git a/src/KeePass/Ecas/EcasContext.cs b/src/KeePass/Ecas/EcasContext.cs new file mode 100644 index 0000000..dbdc78f --- /dev/null +++ b/src/KeePass/Ecas/EcasContext.cs @@ -0,0 +1,73 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; + +namespace KeePass.Ecas +{ + public sealed class EcasContext + { + private EcasTriggerSystem m_coll; + public EcasTriggerSystem TriggerSystem + { + get { return m_coll; } + } + + private EcasTrigger m_trigger; + public EcasTrigger Trigger + { + get { return m_trigger; } + } + + private EcasEvent m_eOccured; + public EcasEvent Event + { + get { return m_eOccured; } + } + + private EcasPropertyDictionary m_props; + public EcasPropertyDictionary Properties + { + get { return m_props; } + } + + private bool m_bCancel = false; + public bool Cancel + { + get { return m_bCancel; } + set { m_bCancel = value; } + } + + public EcasContext(EcasTriggerSystem coll, EcasTrigger trigger, + EcasEvent e, EcasPropertyDictionary props) + { + if(coll == null) throw new ArgumentNullException("coll"); + if(trigger == null) throw new ArgumentNullException("trigger"); + if(e == null) throw new ArgumentNullException("e"); + if(props == null) throw new ArgumentNullException("props"); + + m_coll = coll; + m_trigger = trigger; + m_eOccured = e; + m_props = props; + } + } +} diff --git a/src/KeePass/Ecas/EcasDefaultActionProvider.cs b/src/KeePass/Ecas/EcasDefaultActionProvider.cs new file mode 100644 index 0000000..88dcc6f --- /dev/null +++ b/src/KeePass/Ecas/EcasDefaultActionProvider.cs @@ -0,0 +1,738 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +using KeePass.App; +using KeePass.DataExchange; +using KeePass.Forms; +using KeePass.Native; +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Collections; +using KeePassLib.Delegates; +using KeePassLib.Keys; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +using NativeLib = KeePassLib.Native.NativeLib; + +namespace KeePass.Ecas +{ + internal sealed class EcasDefaultActionProvider : EcasActionProvider + { + private const uint IdWindowNormal = 0; + private const uint IdWindowHidden = 1; + private const uint IdWindowMin = 2; + private const uint IdWindowMax = 3; + + private const uint IdTriggerOff = 0; + private const uint IdTriggerOn = 1; + private const uint IdTriggerToggle = 2; + + private const uint IdMbcY = 0; + private const uint IdMbcN = 1; + + private const uint IdMbaNone = 0; + private const uint IdMbaAbort = 1; + private const uint IdMbaCmd = 2; + + public EcasDefaultActionProvider() + { + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0xDA, 0xE5, 0xF8, 0x3B, 0x07, 0x30, 0x4C, 0x13, + 0x9E, 0xEF, 0x2E, 0xBA, 0xCB, 0x6E, 0xE4, 0xC7 }), + KPRes.ExecuteCmdLineUrl, PwIcon.Console, new EcasParameter[] { + new EcasParameter(KPRes.FileOrUrl, EcasValueType.String, null), + new EcasParameter(KPRes.Arguments, EcasValueType.String, null), + new EcasParameter(KPRes.WaitForExit, EcasValueType.Bool, null), + new EcasParameter(KPRes.WindowStyle, EcasValueType.EnumStrings, + new EcasEnum(new EcasEnumItem[] { + new EcasEnumItem(IdWindowNormal, KPRes.Normal), + new EcasEnumItem(IdWindowHidden, KPRes.Hidden), + new EcasEnumItem(IdWindowMin, KPRes.Minimized), + new EcasEnumItem(IdWindowMax, KPRes.Maximized) })), + new EcasParameter(KPRes.Verb, EcasValueType.String, null) }, + ExecuteShellCmd)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0xB6, 0x46, 0xA6, 0x9F, 0xDE, 0x94, 0x4B, 0xB9, + 0x9B, 0xAE, 0x3C, 0xA4, 0x7E, 0xCC, 0x10, 0xEA }), + KPRes.TriggerStateChange, PwIcon.Run, new EcasParameter[] { + new EcasParameter(KPRes.TriggerName, EcasValueType.String, null), + new EcasParameter(KPRes.NewState, EcasValueType.EnumStrings, + new EcasEnum(new EcasEnumItem[] { + new EcasEnumItem(IdTriggerOn, KPRes.On), + new EcasEnumItem(IdTriggerOff, KPRes.Off), + new EcasEnumItem(IdTriggerToggle, KPRes.Toggle) })) }, + ChangeTriggerOnOff)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0xFD, 0x41, 0x55, 0xD5, 0x79, 0x8F, 0x44, 0xFA, + 0xAB, 0x89, 0xF2, 0xF8, 0x70, 0xEF, 0x94, 0xB8 }), + KPRes.OpenDatabaseFileStc, PwIcon.FolderOpen, new EcasParameter[] { + new EcasParameter(KPRes.FileOrUrl, EcasValueType.String, null), + new EcasParameter(KPRes.IOConnection + " - " + KPRes.UserName, + EcasValueType.String, null), + new EcasParameter(KPRes.IOConnection + " - " + KPRes.Password, + EcasValueType.String, null), + new EcasParameter(KPRes.Password, EcasValueType.String, null), + new EcasParameter(KPRes.KeyFile, EcasValueType.String, null), + new EcasParameter(KPRes.WindowsUserAccount, EcasValueType.Bool, null) }, + OpenDatabaseFile)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0xF5, 0x57, 0x61, 0x4B, 0xF8, 0x4C, 0x41, 0x5D, + 0xA9, 0x13, 0x7A, 0x39, 0xCD, 0x10, 0xF0, 0xBD }), + KPRes.SaveDatabaseStc, PwIcon.Disk, null, + SaveDatabaseFile)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0x22, 0xAD, 0x77, 0xE4, 0x17, 0x78, 0x4E, 0xED, + 0x99, 0xB4, 0x57, 0x1D, 0x02, 0xB3, 0xAD, 0x4D }), + KPRes.SynchronizeStc, PwIcon.PaperReady, new EcasParameter[] { + new EcasParameter(KPRes.FileOrUrl, EcasValueType.String, null), + new EcasParameter(KPRes.IOConnection + " - " + KPRes.UserName, + EcasValueType.String, null), + new EcasParameter(KPRes.IOConnection + " - " + KPRes.Password, + EcasValueType.String, null) }, + SyncDatabaseFile)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0x80, 0xE6, 0x7F, 0x4E, 0x72, 0xF1, 0x40, 0x45, + 0x91, 0x76, 0x1F, 0x2C, 0x23, 0xD8, 0xEC, 0xBE }), + KPRes.ImportStc, PwIcon.PaperReady, new EcasParameter[] { + new EcasParameter(KPRes.FileOrUrl, EcasValueType.String, null), + new EcasParameter(KPRes.FileFormatStc, EcasValueType.String, null), + new EcasParameter(KPRes.Method, EcasValueType.EnumStrings, + new EcasEnum(new EcasEnumItem[] { + new EcasEnumItem((uint)PwMergeMethod.None, KPRes.Default), + new EcasEnumItem((uint)PwMergeMethod.CreateNewUuids, + StrUtil.RemoveAccelerator(KPRes.CreateNewIDs)), + new EcasEnumItem((uint)PwMergeMethod.KeepExisting, + StrUtil.RemoveAccelerator(KPRes.KeepExisting)), + new EcasEnumItem((uint)PwMergeMethod.OverwriteExisting, + StrUtil.RemoveAccelerator(KPRes.OverwriteExisting)), + new EcasEnumItem((uint)PwMergeMethod.OverwriteIfNewer, + StrUtil.RemoveAccelerator(KPRes.OverwriteIfNewer)), + new EcasEnumItem((uint)PwMergeMethod.Synchronize, + StrUtil.RemoveAccelerator(KPRes.OverwriteIfNewerAndApplyDel)) })), + new EcasParameter(KPRes.Password, EcasValueType.String, null), + new EcasParameter(KPRes.KeyFile, EcasValueType.String, null), + new EcasParameter(KPRes.WindowsUserAccount, EcasValueType.Bool, null) }, + ImportIntoCurrentDatabase)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0x0F, 0x9A, 0x6B, 0x5B, 0xCE, 0xD5, 0x46, 0xBE, + 0xB9, 0x34, 0xED, 0xB1, 0x3F, 0x94, 0x48, 0x22 }), + KPRes.ExportStc, PwIcon.Disk, new EcasParameter[] { + new EcasParameter(KPRes.FileOrUrl, EcasValueType.String, null), + new EcasParameter(KPRes.FileFormatStc, EcasValueType.String, null), + new EcasParameter(KPRes.Filter + " - " + KPRes.Group, EcasValueType.String, null), + new EcasParameter(KPRes.Filter + " - " + KPRes.Tag, EcasValueType.String, null) }, + ExportDatabaseFile)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0x5B, 0xBF, 0x45, 0x9D, 0x54, 0xBF, 0x49, 0xBD, + 0x97, 0xFB, 0x2C, 0xEE, 0x5F, 0x99, 0x0A, 0x67 }), + KPRes.CloseActiveDatabase, PwIcon.PaperReady, null, + CloseDatabaseFile)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0x3F, 0xB8, 0x33, 0x2D, 0xD6, 0x16, 0x4E, 0x87, + 0x99, 0x05, 0x64, 0xDB, 0x16, 0x4C, 0xD6, 0x26 }), + KPRes.ActivateDatabaseTab, PwIcon.List, new EcasParameter[] { + new EcasParameter(KPRes.FileOrUrl, EcasValueType.String, null), + new EcasParameter(KPRes.Filter, EcasValueType.EnumStrings, + new EcasEnum(new EcasEnumItem[] { + new EcasEnumItem(0, KPRes.All), + new EcasEnumItem(1, KPRes.Triggering) })) }, + ActivateDatabaseTab)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0x3B, 0x3D, 0x3E, 0x31, 0xE4, 0xB3, 0x42, 0xA6, + 0xBA, 0xCC, 0xD5, 0xC0, 0x3B, 0xAC, 0xA9, 0x69 }), + KPRes.Wait, PwIcon.Clock, new EcasParameter[] { + new EcasParameter(KPRes.TimeSpan + @" [ms]", EcasValueType.UInt64, null) }, + ExecuteSleep)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0x09, 0xF7, 0x8F, 0x73, 0x24, 0xEC, 0x4F, 0xEC, + 0x88, 0xB6, 0x25, 0xD5, 0x30, 0xF4, 0x34, 0x6E }), + KPRes.ShowMessageBox, PwIcon.UserCommunication, new EcasParameter[] { + new EcasParameter(KPRes.MainInstruction, EcasValueType.String, null), + new EcasParameter(KPRes.Text, EcasValueType.String, null), + new EcasParameter(KPRes.Icon, EcasValueType.EnumStrings, + new EcasEnum(new EcasEnumItem[] { + new EcasEnumItem((uint)MessageBoxIcon.None, KPRes.None), + new EcasEnumItem((uint)MessageBoxIcon.Information, "i"), + new EcasEnumItem((uint)MessageBoxIcon.Question, "?"), + new EcasEnumItem((uint)MessageBoxIcon.Warning, KPRes.Warning), + new EcasEnumItem((uint)MessageBoxIcon.Error, KPRes.Error) })), + new EcasParameter(KPRes.Buttons, EcasValueType.EnumStrings, + new EcasEnum(new EcasEnumItem[] { + new EcasEnumItem((uint)MessageBoxButtons.OK, + KPRes.Ok), + new EcasEnumItem((uint)MessageBoxButtons.OKCancel, + KPRes.Ok + "/" + KPRes.Cancel), + new EcasEnumItem((uint)MessageBoxButtons.YesNo, + KPRes.Yes + "/" + KPRes.No) })), + new EcasParameter(KPRes.ButtonDefault, EcasValueType.EnumStrings, + new EcasEnum(new EcasEnumItem[] { + new EcasEnumItem(0, KPRes.Button + " 1"), + new EcasEnumItem(1, KPRes.Button + " 2") })), + new EcasParameter(KPRes.Action + " - " + KPRes.Condition, EcasValueType.EnumStrings, + new EcasEnum(new EcasEnumItem[] { + new EcasEnumItem(IdMbcY, KPRes.Button + " " + + KPRes.Ok + "/" + KPRes.Yes), + new EcasEnumItem(IdMbcN, KPRes.Button + " " + + KPRes.Cancel + "/" + KPRes.No) })), + new EcasParameter(KPRes.Action, EcasValueType.EnumStrings, + new EcasEnum(new EcasEnumItem[] { + new EcasEnumItem(IdMbaNone, KPRes.None), + new EcasEnumItem(IdMbaAbort, KPRes.AbortTrigger), + new EcasEnumItem(IdMbaCmd, KPRes.ExecuteCmdLineUrl) })), + new EcasParameter(KPRes.Action + " - " + KPRes.Parameters, + EcasValueType.String, null) }, + ShowMessageBox)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0x40, 0x69, 0xA5, 0x36, 0x57, 0x1B, 0x47, 0x92, + 0xA9, 0xB3, 0x73, 0x65, 0x30, 0xE0, 0xCF, 0xC3 }), + KPRes.PerformGlobalAutoType, PwIcon.Run, null, ExecuteGlobalAutoType)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0x31, 0x70, 0x8F, 0xAD, 0x64, 0x93, 0x43, 0xF5, + 0x94, 0xEE, 0xC8, 0x1A, 0x23, 0x6E, 0x32, 0x4D }), + KPRes.PerformSelectedAutoType, PwIcon.Run, new EcasParameter[] { + new EcasParameter(KPRes.Sequence, EcasValueType.String, null) }, + ExecuteSelectedAutoType)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0x42, 0xE8, 0x37, 0x81, 0x73, 0xD3, 0x4E, 0xEC, + 0x81, 0x48, 0x9E, 0x3B, 0x36, 0xAC, 0x83, 0x84 }), + KPRes.ShowEntriesByTag, PwIcon.List, new EcasParameter[] { + new EcasParameter(KPRes.Tag, EcasValueType.String, null) }, + ShowEntriesByTag)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0x95, 0x81, 0x8F, 0x45, 0x99, 0x66, 0x49, 0x88, + 0xAB, 0x3E, 0x86, 0xE8, 0x1A, 0x96, 0x68, 0x36 }), + KPRes.CustomTbButtonAdd, PwIcon.Screen, new EcasParameter[] { + new EcasParameter(KPRes.Id, EcasValueType.String, null), + new EcasParameter(KPRes.Name, EcasValueType.String, null), + new EcasParameter(KPRes.Description, EcasValueType.String, null) }, + AddToolBarButton)); + + m_actions.Add(new EcasActionType(new PwUuid(new byte[] { + 0xD6, 0x6D, 0x41, 0xA2, 0x6C, 0xB2, 0x44, 0xBA, + 0xA4, 0x48, 0x0A, 0x41, 0xFA, 0x09, 0x48, 0x79 }), + KPRes.CustomTbButtonRemove, PwIcon.Screen, new EcasParameter[] { + new EcasParameter(KPRes.Id, EcasValueType.String, null) }, + RemoveToolBarButton)); + } + + private static void ExecuteShellCmd(EcasAction a, EcasContext ctx) + { + string strCmd = EcasUtil.GetParamString(a.Parameters, 0); + string strArgs = EcasUtil.GetParamString(a.Parameters, 1, true, true); + bool bWait = EcasUtil.GetParamBool(a.Parameters, 2); + uint uWindowStyle = EcasUtil.GetParamUInt(a.Parameters, 3); + string strVerb = EcasUtil.GetParamString(a.Parameters, 4, true); + + if(string.IsNullOrEmpty(strCmd)) return; + + Process p = null; + try + { + PwEntry pe = null; + try { pe = Program.MainForm.GetSelectedEntry(false); } + catch(Exception) { Debug.Assert(false); } + + strCmd = WinUtil.CompileUrl(strCmd, pe, true, null, false); + if(string.IsNullOrEmpty(strCmd)) return; // Might be placeholder only + + ProcessStartInfo psi = new ProcessStartInfo(); + psi.FileName = strCmd; + if(!string.IsNullOrEmpty(strArgs)) psi.Arguments = strArgs; + + bool bShEx = true; + if(!string.IsNullOrEmpty(strVerb)) { } // Need ShellExecute + else if((uWindowStyle == IdWindowMin) || + (uWindowStyle == IdWindowMax)) { } // Need ShellExecute + else + { + string strCmdFlt = strCmd.TrimEnd(new char[] { '\"', '\'', + ' ', '\t', '\r', '\n' }); + if(strCmdFlt.EndsWith(".exe", StrUtil.CaseIgnoreCmp) || + strCmdFlt.EndsWith(".com", StrUtil.CaseIgnoreCmp)) + bShEx = false; + } + psi.UseShellExecute = bShEx; + + if(uWindowStyle == IdWindowHidden) + { + psi.CreateNoWindow = true; + psi.WindowStyle = ProcessWindowStyle.Hidden; + } + else if(uWindowStyle == IdWindowMin) + psi.WindowStyle = ProcessWindowStyle.Minimized; + else if(uWindowStyle == IdWindowMax) + psi.WindowStyle = ProcessWindowStyle.Maximized; + + if(!string.IsNullOrEmpty(strVerb)) + psi.Verb = strVerb; + + p = NativeLib.StartProcessEx(psi); + + if((p != null) && bWait) + { + Program.MainForm.UIBlockInteraction(true); + MessageService.ExternalIncrementMessageCount(); + + try { p.WaitForExit(); } + catch(Exception) { Debug.Assert(false); } + + MessageService.ExternalDecrementMessageCount(); + Program.MainForm.UIBlockInteraction(false); + } + } + catch(Exception ex) + { + throw new Exception(strCmd + MessageService.NewParagraph + ex.Message); + } + finally + { + try { if(p != null) p.Dispose(); } + catch(Exception) { Debug.Assert(false); } + } + } + + private static void ChangeTriggerOnOff(EcasAction a, EcasContext ctx) + { + string strName = EcasUtil.GetParamString(a.Parameters, 0, true); + uint uState = EcasUtil.GetParamUInt(a.Parameters, 1); + + EcasTrigger t = null; + if(strName.Length == 0) t = ctx.Trigger; + else + { + foreach(EcasTrigger trg in ctx.TriggerSystem.TriggerCollection) + { + if(trg.Name == strName) { t = trg; break; } + } + } + + if(t == null) throw new Exception(KPRes.ObjectNotFound + + MessageService.NewParagraph + KPRes.TriggerName + ": " + strName + "."); + + if(uState == IdTriggerOn) t.On = true; + else if(uState == IdTriggerOff) t.On = false; + else if(uState == IdTriggerToggle) t.On = !t.On; + else { Debug.Assert(false); } + } + + private static void OpenDatabaseFile(EcasAction a, EcasContext ctx) + { + string strPath = EcasUtil.GetParamString(a.Parameters, 0, true); + if(string.IsNullOrEmpty(strPath)) return; + + string strIOUserName = EcasUtil.GetParamString(a.Parameters, 1, true); + string strIOPassword = EcasUtil.GetParamString(a.Parameters, 2, true); + + IOConnectionInfo ioc = IOFromParameters(strPath, strIOUserName, strIOPassword); + if(ioc == null) return; + + CompositeKey ck = KeyFromParams(a, 3, 4, 5, ioc); + + Program.MainForm.OpenDatabase(ioc, ck, ioc.IsLocalFile()); + } + + private static CompositeKey KeyFromParams(EcasAction a, int iPassword, + int iKeyFile, int iUserAccount, IOConnectionInfo ioc) + { + string strPassword = EcasUtil.GetParamString(a.Parameters, iPassword, true); + string strKeyFile = EcasUtil.GetParamString(a.Parameters, iKeyFile, true); + bool bUserAccount = EcasUtil.GetParamBool(a.Parameters, iUserAccount); + + byte[] pbPasswordUtf8 = null; + if(!string.IsNullOrEmpty(strPassword)) + pbPasswordUtf8 = StrUtil.Utf8.GetBytes(strPassword); + + return KeyUtil.CreateKey(pbPasswordUtf8, strKeyFile, bUserAccount, + ioc, false, false); + } + + private static void SaveDatabaseFile(EcasAction a, EcasContext ctx) + { + Program.MainForm.UIFileSave(false); + } + + private static void SyncDatabaseFile(EcasAction a, EcasContext ctx) + { + string strPath = EcasUtil.GetParamString(a.Parameters, 0, true); + if(string.IsNullOrEmpty(strPath)) return; + + string strIOUserName = EcasUtil.GetParamString(a.Parameters, 1, true); + string strIOPassword = EcasUtil.GetParamString(a.Parameters, 2, true); + + IOConnectionInfo ioc = IOFromParameters(strPath, strIOUserName, strIOPassword); + if(ioc == null) return; + + MainForm mf = Program.MainForm; + PwDatabase pd = mf.ActiveDatabase; + if((pd == null) || !pd.IsOpen) return; + + bool? ob = ImportUtil.Synchronize(pd, mf, ioc, false, mf); + mf.UpdateUISyncPost(ob); + } + + private static IOConnectionInfo IOFromParameters(string strPath, + string strUser, string strPassword) + { + IOConnectionInfo ioc = IOConnectionInfo.FromPath(strPath); + + // Set the user name, which acts as a filter for the MRU items + if(!string.IsNullOrEmpty(strUser)) ioc.UserName = strUser; + + // Try to complete it using the MRU list; this will especially + // retrieve the CredSaveMode of the MRU item (if one exists) + ioc = Program.MainForm.CompleteConnectionInfoUsingMru(ioc); + + // Override the password using the trigger value; do not change + // the CredSaveMode anymore (otherwise e.g. values retrieved + // using field references would be stored in the MRU list) + if(!string.IsNullOrEmpty(strPassword)) ioc.Password = strPassword; + + if(ioc.Password.Length > 0) ioc.IsComplete = true; + + return MainForm.CompleteConnectionInfo(ioc, false, true, true, false); + } + + private static void ImportIntoCurrentDatabase(EcasAction a, EcasContext ctx) + { + PwDatabase pd = Program.MainForm.ActiveDatabase; + if((pd == null) || !pd.IsOpen) return; + + string strPath = EcasUtil.GetParamString(a.Parameters, 0, true); + if(string.IsNullOrEmpty(strPath)) return; + IOConnectionInfo ioc = IOConnectionInfo.FromPath(strPath); + + string strFormat = EcasUtil.GetParamString(a.Parameters, 1, true); + if(string.IsNullOrEmpty(strFormat)) return; + FileFormatProvider ff = Program.FileFormatPool.Find(strFormat); + if(ff == null) + throw new Exception(KPRes.Unknown + ": " + strFormat); + + uint uMethod = EcasUtil.GetParamUInt(a.Parameters, 2); + Type tMM = Enum.GetUnderlyingType(typeof(PwMergeMethod)); + object oMethod = Convert.ChangeType(uMethod, tMM); + PwMergeMethod mm = PwMergeMethod.None; + if(Enum.IsDefined(typeof(PwMergeMethod), oMethod)) + mm = (PwMergeMethod)oMethod; + else { Debug.Assert(false); } + if(mm == PwMergeMethod.None) mm = PwMergeMethod.CreateNewUuids; + + CompositeKey ck = KeyFromParams(a, 3, 4, 5, ioc); + if((ck == null) && ff.RequiresKey) + { + KeyPromptFormResult r; + DialogResult dr = KeyPromptForm.ShowDialog(ioc, false, null, out r); + if((dr != DialogResult.OK) || (r == null)) return; + + ck = r.CompositeKey; + } + + bool? ob = false; // Exception => UI update + try { ob = ImportUtil.Import(pd, ff, ioc, mm, ck); } + finally + { + if(ob.HasValue) + Program.MainForm.UpdateUI(false, null, true, null, true, null, false); + } + } + + private static void ExportDatabaseFile(EcasAction a, EcasContext ctx) + { + string strPath = EcasUtil.GetParamString(a.Parameters, 0, true); + // if(string.IsNullOrEmpty(strPath)) return; // Allow no-file exports + string strFormat = EcasUtil.GetParamString(a.Parameters, 1, true); + if(string.IsNullOrEmpty(strFormat)) return; + string strGroup = EcasUtil.GetParamString(a.Parameters, 2, true); + string strTag = EcasUtil.GetParamString(a.Parameters, 3, true); + + PwDatabase pd = Program.MainForm.ActiveDatabase; + if((pd == null) || !pd.IsOpen) return; + + PwGroup pg = pd.RootGroup; + if(!string.IsNullOrEmpty(strGroup)) + { + char chSep = strGroup[0]; + PwGroup pgSub = pg.FindCreateSubTree(strGroup.Substring(1), + new char[] { chSep }, false); + pg = (pgSub ?? (new PwGroup(true, true, KPRes.Group, PwIcon.Folder))); + } + + strTag = StrUtil.NormalizeTag(strTag); + if(!string.IsNullOrEmpty(strTag)) + { + pg = pg.CloneDeep(); + + GroupHandler gh = delegate(PwGroup pgSub) + { + PwObjectList l = pgSub.Entries; + long n = (long)l.UCount; + for(long i = n - 1; i >= 0; --i) + { + List lTags = l.GetAt((uint)i).GetTagsInherited(); + if(!lTags.Contains(strTag)) + l.RemoveAt((uint)i); + } + + return true; + }; + + gh(pg); + pg.TraverseTree(TraversalMethod.PreOrder, gh, null); + } + + PwExportInfo pei = new PwExportInfo(pg, pd, true); + IOConnectionInfo ioc = (!string.IsNullOrEmpty(strPath) ? + IOConnectionInfo.FromPath(strPath) : null); + ExportUtil.Export(pei, strFormat, ioc); + } + + private static void CloseDatabaseFile(EcasAction a, EcasContext ctx) + { + Program.MainForm.CloseDocument(null, false, false, true, true); + } + + private static void ActivateDatabaseTab(EcasAction a, EcasContext ctx) + { + string strName = EcasUtil.GetParamString(a.Parameters, 0, true); + bool bEmptyName = string.IsNullOrEmpty(strName); + + uint uSel = EcasUtil.GetParamUInt(a.Parameters, 1, 0); + PwDatabase pdSel = ctx.Properties.Get(EcasProperty.Database); + + DocumentManagerEx dm = Program.MainForm.DocumentManager; + foreach(PwDocument doc in dm.Documents) + { + if(doc.Database == null) { Debug.Assert(false); continue; } + + if(uSel == 0) // Select from all + { + if(bEmptyName) continue; // Name required in this case + } + else if(uSel == 1) // Triggering only + { + if(!object.ReferenceEquals(doc.Database, pdSel)) continue; + } + else { Debug.Assert(false); continue; } + + IOConnectionInfo ioc = null; + if((doc.LockedIoc != null) && !string.IsNullOrEmpty(doc.LockedIoc.Path)) + ioc = doc.LockedIoc; + else if((doc.Database.IOConnectionInfo != null) && + !string.IsNullOrEmpty(doc.Database.IOConnectionInfo.Path)) + ioc = doc.Database.IOConnectionInfo; + + if(bEmptyName || ((ioc != null) && (ioc.Path.IndexOf(strName, + StrUtil.CaseIgnoreCmp) >= 0))) + { + Program.MainForm.MakeDocumentActive(doc); + break; + } + } + } + + private static void ExecuteSleep(EcasAction a, EcasContext ctx) + { + uint uTimeSpan = EcasUtil.GetParamUInt(a.Parameters, 0); + + if((uTimeSpan != 0) && (uTimeSpan <= (uint)int.MaxValue)) + Thread.Sleep((int)uTimeSpan); + } + + private static void ExecuteGlobalAutoType(EcasAction a, EcasContext ctx) + { + Program.MainForm.ExecuteGlobalAutoType(); + } + + private static void ExecuteSelectedAutoType(EcasAction a, EcasContext ctx) + { + try + { + // Do not Spr-compile the sequence here; it'll be compiled by + // the auto-type engine (and this expects an auto-type sequence + // as input, not a data string; compiling it here would e.g. + // result in broken '%' characters in passwords) + string strSeq = EcasUtil.GetParamString(a.Parameters, 0, false); + if(string.IsNullOrEmpty(strSeq)) strSeq = null; + + PwEntry pe = Program.MainForm.GetSelectedEntry(true); + if(pe == null) return; + PwDatabase pd = Program.MainForm.DocumentManager.SafeFindContainerOf(pe); + + IntPtr hFg = NativeMethods.GetForegroundWindowHandle(); + if(GlobalWindowManager.HasWindowMW(hFg)) + AutoType.PerformIntoPreviousWindow(Program.MainForm, pe, + pd, strSeq); + else AutoType.PerformIntoCurrentWindow(pe, pd, strSeq); + } + catch(Exception) { Debug.Assert(false); } + } + + private static void ShowEntriesByTag(EcasAction a, EcasContext ctx) + { + string strTag = EcasUtil.GetParamString(a.Parameters, 0, true); + Program.MainForm.ShowEntriesByTag(strTag, false); + } + + private static void AddToolBarButton(EcasAction a, EcasContext ctx) + { + string strID = EcasUtil.GetParamString(a.Parameters, 0, true); + string strName = EcasUtil.GetParamString(a.Parameters, 1, true); + string strDesc = EcasUtil.GetParamString(a.Parameters, 2, true); + + Program.MainForm.AddCustomToolBarButton(strID, strName, strDesc); + } + + private static void RemoveToolBarButton(EcasAction a, EcasContext ctx) + { + string strID = EcasUtil.GetParamString(a.Parameters, 0, true); + Program.MainForm.RemoveCustomToolBarButton(strID); + } + + private static void ShowMessageBox(EcasAction a, EcasContext ctx) + { + VistaTaskDialog vtd = new VistaTaskDialog(); + + string strMain = EcasUtil.GetParamString(a.Parameters, 0, true); + if(!string.IsNullOrEmpty(strMain)) vtd.MainInstruction = strMain; + + string strText = EcasUtil.GetParamString(a.Parameters, 1, true); + if(!string.IsNullOrEmpty(strText)) vtd.Content = strText; + + uint uIcon = EcasUtil.GetParamUInt(a.Parameters, 2, 0); + if(uIcon == (uint)MessageBoxIcon.Information) + vtd.SetIcon(VtdIcon.Information); + else if(uIcon == (uint)MessageBoxIcon.Question) + vtd.SetIcon(VtdCustomIcon.Question); + else if(uIcon == (uint)MessageBoxIcon.Warning) + vtd.SetIcon(VtdIcon.Warning); + else if(uIcon == (uint)MessageBoxIcon.Error) + vtd.SetIcon(VtdIcon.Error); + else { Debug.Assert(uIcon == (uint)MessageBoxIcon.None); } + + vtd.CommandLinks = false; + + uint uBtns = EcasUtil.GetParamUInt(a.Parameters, 3, 0); + bool bCanCancel = false; + if(uBtns == (uint)MessageBoxButtons.OKCancel) + { + vtd.AddButton((int)DialogResult.OK, KPRes.Ok, null); + vtd.AddButton((int)DialogResult.Cancel, KPRes.Cancel, null); + bCanCancel = true; + } + else if(uBtns == (uint)MessageBoxButtons.YesNo) + { + vtd.AddButton((int)DialogResult.OK, KPRes.YesCmd, null); + vtd.AddButton((int)DialogResult.Cancel, KPRes.NoCmd, null); + bCanCancel = true; + } + else vtd.AddButton((int)DialogResult.OK, KPRes.Ok, null); + + uint uDef = EcasUtil.GetParamUInt(a.Parameters, 4, 0); + ReadOnlyCollection lButtons = vtd.Buttons; + if(uDef < (uint)lButtons.Count) + vtd.DefaultButtonID = lButtons[(int)uDef].ID; + + vtd.WindowTitle = PwDefs.ShortProductName; + + string strTrg = ctx.Trigger.Name; + if(!string.IsNullOrEmpty(strTrg)) + { + vtd.FooterText = KPRes.Trigger + @": '" + strTrg + @"'."; + vtd.SetFooterIcon(VtdIcon.Information); + } + + int dr; + if(vtd.ShowDialog()) dr = vtd.Result; + else + { + string str = (strMain ?? string.Empty); + if(!string.IsNullOrEmpty(strText)) + { + if(str.Length > 0) str += MessageService.NewParagraph; + str += strText; + } + + MessageBoxDefaultButton mbdb = MessageBoxDefaultButton.Button1; + if(uDef == 1) mbdb = MessageBoxDefaultButton.Button2; + else if(uDef == 2) mbdb = MessageBoxDefaultButton.Button3; + + MessageService.ExternalIncrementMessageCount(); + try + { + dr = (int)MessageService.SafeShowMessageBox(str, + PwDefs.ShortProductName, (MessageBoxButtons)uBtns, + (MessageBoxIcon)uIcon, mbdb); + } + finally { MessageService.ExternalDecrementMessageCount(); } + } + + uint uActCondID = EcasUtil.GetParamUInt(a.Parameters, 5, 0); + + bool bDrY = ((dr == (int)DialogResult.OK) || + (dr == (int)DialogResult.Yes)); + bool bDrN = ((dr == (int)DialogResult.Cancel) || + (dr == (int)DialogResult.No)); + + bool bPerformAction = (((uActCondID == IdMbcY) && bDrY) || + ((uActCondID == IdMbcN) && bDrN)); + if(!bPerformAction) return; + + uint uActID = EcasUtil.GetParamUInt(a.Parameters, 6, 0); + string strActionParam = EcasUtil.GetParamString(a.Parameters, 7, true); + + if(uActID == IdMbaNone) { } + else if(uActID == IdMbaAbort) + { + if(bCanCancel) ctx.Cancel = true; + } + else if(uActID == IdMbaCmd) + { + if(!string.IsNullOrEmpty(strActionParam)) + WinUtil.OpenUrl(strActionParam, null); + } + else { Debug.Assert(false); } + } + } +} diff --git a/src/KeePass/Ecas/EcasDefaultConditionProvider.cs b/src/KeePass/Ecas/EcasDefaultConditionProvider.cs new file mode 100644 index 0000000..e47de29 --- /dev/null +++ b/src/KeePass/Ecas/EcasDefaultConditionProvider.cs @@ -0,0 +1,179 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Net.NetworkInformation; +using System.Windows.Forms; +using System.Diagnostics; + +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +namespace KeePass.Ecas +{ + internal sealed class EcasDefaultConditionProvider : EcasConditionProvider + { + public EcasDefaultConditionProvider() + { + m_conditions.Add(new EcasConditionType(new PwUuid(new byte[] { + 0x9F, 0x11, 0xD0, 0xBD, 0xEC, 0xE9, 0x45, 0x3B, + 0xA5, 0x45, 0x26, 0x1F, 0xF7, 0xA4, 0xFF, 0x1F }), + KPRes.EnvironmentVariable, PwIcon.Console, new EcasParameter[] { + new EcasParameter(KPRes.Name, EcasValueType.String, null), + new EcasParameter(KPRes.Value + " - " + KPRes.Comparison, + EcasValueType.EnumStrings, EcasUtil.StdStringCompare), + new EcasParameter(KPRes.Value, EcasValueType.String, null) }, + IsMatchEnvironmentVar)); + + m_conditions.Add(new EcasConditionType(new PwUuid(new byte[] { + 0xB9, 0x0F, 0xF8, 0x07, 0x73, 0x38, 0x4F, 0xEA, + 0xBB, 0x2E, 0xBC, 0x0B, 0xEA, 0x3B, 0x98, 0xC3 }), + KPRes.String, PwIcon.Configuration, new EcasParameter[] { + new EcasParameter(KPRes.String, EcasValueType.String, null), + new EcasParameter(KPRes.Value + " - " + KPRes.Comparison, + EcasValueType.EnumStrings, EcasUtil.StdStringCompare), + new EcasParameter(KPRes.Value, EcasValueType.String, null) }, + IsMatchString)); + + m_conditions.Add(new EcasConditionType(new PwUuid(new byte[] { + 0xCB, 0x4A, 0x9E, 0x34, 0x56, 0x8C, 0x4C, 0x95, + 0xAD, 0x67, 0x4D, 0x1C, 0xA1, 0x04, 0x19, 0xBC }), + KPRes.FileExists, PwIcon.PaperReady, new EcasParameter[] { + new EcasParameter(KPRes.FileOrUrl, EcasValueType.String, null) }, + IsMatchFileExists)); + + m_conditions.Add(new EcasConditionType(new PwUuid(new byte[] { + 0x2A, 0x22, 0x83, 0xA8, 0x9D, 0x13, 0x41, 0xE8, + 0x99, 0x87, 0x8B, 0xAC, 0x21, 0x8D, 0x81, 0xF4 }), + KPRes.RemoteHostReachable, PwIcon.NetworkServer, new EcasParameter[] { + new EcasParameter(KPRes.Host, EcasValueType.String, null) }, + IsHostReachable)); + + m_conditions.Add(new EcasConditionType(new PwUuid(new byte[] { + 0xD3, 0xCA, 0xFA, 0xEF, 0x28, 0x2A, 0x46, 0x4A, + 0x99, 0x90, 0xD8, 0x65, 0xFC, 0xE0, 0x16, 0xED }), + KPRes.DatabaseHasUnsavedChanges, PwIcon.PaperFlag, new EcasParameter[] { + new EcasParameter(KPRes.Database, EcasValueType.EnumStrings, + new EcasEnum(new EcasEnumItem[] { + new EcasEnumItem(0, KPRes.Active), + new EcasEnumItem(1, KPRes.Triggering) })) }, + IsDatabaseModified)); + } + + private static bool IsMatchEnvironmentVar(EcasCondition c, EcasContext ctx) + { + string strName = EcasUtil.GetParamString(c.Parameters, 0, true); + uint uCompareType = EcasUtil.GetParamEnum(c.Parameters, 1, + EcasUtil.StdStringCompareEquals, EcasUtil.StdStringCompare); + string strValue = EcasUtil.GetParamString(c.Parameters, 2, true); + + if(string.IsNullOrEmpty(strName) || (strValue == null)) + return false; + + try + { + string strVar = Environment.GetEnvironmentVariable(strName); + if(strVar == null) return false; + + return EcasUtil.CompareStrings(strVar, strValue, uCompareType); + } + catch(Exception) { Debug.Assert(false); } + + return false; + } + + private static bool IsMatchString(EcasCondition c, EcasContext ctx) + { + string str = EcasUtil.GetParamString(c.Parameters, 0, true); + uint uCompareType = EcasUtil.GetParamEnum(c.Parameters, 1, + EcasUtil.StdStringCompareEquals, EcasUtil.StdStringCompare); + string strValue = EcasUtil.GetParamString(c.Parameters, 2, true); + + if((str == null) || (strValue == null)) return false; + + return EcasUtil.CompareStrings(str, strValue, uCompareType); + } + + private static bool IsMatchFileExists(EcasCondition c, EcasContext ctx) + { + string strFile = EcasUtil.GetParamString(c.Parameters, 0, true); + if(string.IsNullOrEmpty(strFile)) return true; + + try + { + // return File.Exists(strFile); + + IOConnectionInfo ioc = IOConnectionInfo.FromPath(strFile); + return IOConnection.FileExists(ioc); + } + catch(Exception) { } + + return false; + } + + private static bool IsHostReachable(EcasCondition c, EcasContext ctx) + { + string strHost = EcasUtil.GetParamString(c.Parameters, 0, true); + if(string.IsNullOrEmpty(strHost)) return true; + + int[] vTimeOuts = { 250, 1250 }; + const string strBuffer = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + byte[] pbBuffer = Encoding.ASCII.GetBytes(strBuffer); + + try + { + Ping ping = new Ping(); // We have sufficient privileges? + PingOptions options = new PingOptions(64, true); + + foreach(int nTimeOut in vTimeOuts) + { + PingReply reply = ping.Send(strHost, nTimeOut, pbBuffer, options); + if(reply.Status == IPStatus.Success) return true; + } + + return false; + } + catch(Exception) { } + + return false; + } + + private static bool IsDatabaseModified(EcasCondition c, EcasContext ctx) + { + PwDatabase pd = null; + + uint uSel = EcasUtil.GetParamUInt(c.Parameters, 0, 0); + if(uSel == 0) + pd = Program.MainForm.ActiveDatabase; + else if(uSel == 1) + pd = ctx.Properties.Get(EcasProperty.Database); + else { Debug.Assert(false); } + + if((pd == null) || !pd.IsOpen) return false; + return pd.Modified; + } + } +} diff --git a/src/KeePass/Ecas/EcasDefaultEventProvider.cs b/src/KeePass/Ecas/EcasDefaultEventProvider.cs new file mode 100644 index 0000000..c522012 --- /dev/null +++ b/src/KeePass/Ecas/EcasDefaultEventProvider.cs @@ -0,0 +1,224 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Diagnostics; + +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Utility; +using KeePassLib.Serialization; + +namespace KeePass.Ecas +{ + internal static class EcasEventIDs + { + public static readonly PwUuid OpenedDatabaseFile = new PwUuid(new byte[] { + 0xE5, 0xFF, 0x13, 0x06, 0x85, 0xB8, 0x41, 0x89, + 0xB9, 0x06, 0xF6, 0x9E, 0x2B, 0x3B, 0x40, 0xA7 + }); + public static readonly PwUuid SavingDatabaseFile = new PwUuid(new byte[] { + 0x95, 0xC1, 0xA6, 0xFD, 0x72, 0x7C, 0x40, 0xC7, + 0xA2, 0xF9, 0x5B, 0x0F, 0xA0, 0x99, 0x63, 0x1C + }); + public static readonly PwUuid SavedDatabaseFile = new PwUuid(new byte[] { + 0xB3, 0xA8, 0xFD, 0xFE, 0x78, 0x13, 0x4A, 0x6A, + 0x9C, 0x5D, 0xD5, 0xBA, 0x84, 0x3A, 0x9B, 0x8E + }); + public static readonly PwUuid SynchronizingDatabaseFile = new PwUuid(new byte[] { + 0x06, 0x7E, 0x27, 0xA7, 0x20, 0xB0, 0x47, 0x71, + 0x8F, 0x14, 0x68, 0xD5, 0x01, 0x5C, 0x76, 0x6A + }); + public static readonly PwUuid SynchronizedDatabaseFile = new PwUuid(new byte[] { + 0xB5, 0xA1, 0xE0, 0xD5, 0xA2, 0xF6, 0x44, 0xB3, + 0x8A, 0xA1, 0x84, 0xC6, 0x86, 0xC2, 0xA9, 0x60 + }); + public static readonly PwUuid ClosingDatabaseFilePre = new PwUuid(new byte[] { + 0x8C, 0xEA, 0xDE, 0x9A, 0xA8, 0x17, 0x49, 0x19, + 0xA3, 0x2F, 0xF4, 0x1E, 0x3B, 0x1D, 0xEC, 0x49 + }); + public static readonly PwUuid ClosingDatabaseFilePost = new PwUuid(new byte[] { + 0x94, 0xFA, 0x70, 0xE5, 0xB1, 0x3F, 0x41, 0x26, + 0xA6, 0x4E, 0x06, 0x4F, 0xD8, 0xC3, 0x6C, 0x95 + }); + public static readonly PwUuid CopiedEntryInfo = new PwUuid(new byte[] { + 0x3F, 0x7E, 0x5E, 0xC6, 0x2A, 0x54, 0x4C, 0x58, + 0x95, 0x44, 0x85, 0xFB, 0xF2, 0x6F, 0x56, 0xDC + }); + public static readonly PwUuid AppInitPost = new PwUuid(new byte[] { + 0xD4, 0xCE, 0xCD, 0xB5, 0x4B, 0x98, 0x4F, 0xF2, + 0xA6, 0xA9, 0xE2, 0x55, 0x26, 0x1E, 0xC8, 0xE8 + }); + public static readonly PwUuid AppLoadPost = new PwUuid(new byte[] { + 0xD8, 0xF3, 0x1E, 0xE9, 0xCC, 0x69, 0x48, 0x1B, + 0x89, 0xC5, 0xFC, 0xE2, 0xEA, 0x4B, 0x6A, 0x97 + }); + public static readonly PwUuid AppExit = new PwUuid(new byte[] { + 0x82, 0x8A, 0xB7, 0xAB, 0xB1, 0x1C, 0x4E, 0xBF, + 0x80, 0x39, 0x36, 0x3F, 0x91, 0x71, 0x97, 0x78 + }); + public static readonly PwUuid CustomTbButtonClicked = new PwUuid(new byte[] { + 0x47, 0x47, 0x59, 0x92, 0x97, 0xA7, 0x43, 0xA2, + 0xB9, 0x68, 0x1F, 0x1F, 0xC2, 0xF7, 0x9B, 0x92 + }); + public static readonly PwUuid TimePeriodic = new PwUuid(new byte[] { + 0x6C, 0x44, 0xBB, 0x5D, 0xF1, 0x8B, 0x4C, 0x0D, + 0x88, 0xCE, 0x65, 0xE6, 0xE9, 0xAD, 0x29, 0x8A + }); + + // Obsolete + internal static readonly PwUuid UpdatedUIState = new PwUuid(new byte[] { + 0x8D, 0x12, 0xD4, 0x9A, 0xF2, 0xCB, 0x4F, 0xF7, + 0xA8, 0xEF, 0xCF, 0xDA, 0xAC, 0x62, 0x68, 0x99 + }); + } + + internal sealed class EcasDefaultEventProvider : EcasEventProvider + { + public EcasDefaultEventProvider() + { + EcasParameter[] epFileFilter = new EcasParameter[] { + new EcasParameter(KPRes.FileOrUrl + " - " + KPRes.Comparison, + EcasValueType.EnumStrings, EcasUtil.StdStringCompare), + new EcasParameter(KPRes.FileOrUrl + " - " + KPRes.Filter, + EcasValueType.String, null) }; + EcasParameter[] epValueFilter = new EcasParameter[] { + new EcasParameter(KPRes.Value + " - " + KPRes.Comparison, + EcasValueType.EnumStrings, EcasUtil.StdStringCompare), + new EcasParameter(KPRes.Value + " - " + KPRes.Filter, + EcasValueType.String, null) }; + + m_events.Add(new EcasEventType(EcasEventIDs.AppInitPost, + KPRes.ApplicationInitialized, PwIcon.ProgramIcons, null, null)); + m_events.Add(new EcasEventType(EcasEventIDs.AppLoadPost, + KPRes.ApplicationStarted, PwIcon.ProgramIcons, null, null)); + m_events.Add(new EcasEventType(EcasEventIDs.AppExit, + KPRes.ApplicationExit, PwIcon.ProgramIcons, null, null)); + m_events.Add(new EcasEventType(EcasEventIDs.OpenedDatabaseFile, + KPRes.OpenedDatabaseFile, PwIcon.FolderOpen, epFileFilter, + IsMatchIocDbEvent)); + m_events.Add(new EcasEventType(EcasEventIDs.SavingDatabaseFile, + KPRes.SavingDatabaseFile, PwIcon.Disk, epFileFilter, + IsMatchIocDbEvent)); + m_events.Add(new EcasEventType(EcasEventIDs.SavedDatabaseFile, + KPRes.SavedDatabaseFile, PwIcon.Disk, epFileFilter, + IsMatchIocDbEvent)); + m_events.Add(new EcasEventType(EcasEventIDs.SynchronizingDatabaseFile, + KPRes.SynchronizingDatabaseFile, PwIcon.Disk, epFileFilter, + IsMatchIocDbEvent)); + m_events.Add(new EcasEventType(EcasEventIDs.SynchronizedDatabaseFile, + KPRes.SynchronizedDatabaseFile, PwIcon.Disk, epFileFilter, + IsMatchIocDbEvent)); + m_events.Add(new EcasEventType(EcasEventIDs.ClosingDatabaseFilePre, + KPRes.ClosingDatabaseFile + " (" + KPRes.SavingPre + ")", + PwIcon.PaperQ, epFileFilter, IsMatchIocDbEvent)); + m_events.Add(new EcasEventType(EcasEventIDs.ClosingDatabaseFilePost, + KPRes.ClosingDatabaseFile + " (" + KPRes.SavingPost + ")", + PwIcon.PaperQ, epFileFilter, IsMatchIocDbEvent)); + m_events.Add(new EcasEventType(EcasEventIDs.CopiedEntryInfo, + KPRes.CopiedEntryData, PwIcon.ClipboardReady, epValueFilter, + IsMatchTextEvent)); + // m_events.Add(new EcasEventType(EcasEventIDs.UpdatedUIState, + // KPRes.UpdatedUIState, PwIcon.PaperReady, null, null)); + m_events.Add(new EcasEventType(EcasEventIDs.TimePeriodic, + KPRes.Time + " - " + KPRes.Periodic, PwIcon.Clock, new EcasParameter[] { + new EcasParameter(KPRes.Interval + " [s]", EcasValueType.UInt64, null), + new EcasParameter(KPRes.TimerRestartOnActivity, EcasValueType.Bool, null) }, + IsMatchTimePeriodicEvent)); + m_events.Add(new EcasEventType(EcasEventIDs.CustomTbButtonClicked, + KPRes.CustomTbButtonClicked, PwIcon.Star, new EcasParameter[] { + new EcasParameter(KPRes.Id, EcasValueType.String, null) }, + IsMatchIdEvent)); + } + + private static bool IsMatchIocDbEvent(EcasEvent e, EcasContext ctx) + { + uint uCompareType = EcasUtil.GetParamEnum(e.Parameters, 0, + EcasUtil.StdStringCompareEquals, EcasUtil.StdStringCompare); + + string strFilter = EcasUtil.GetParamString(e.Parameters, 1, true); + if(string.IsNullOrEmpty(strFilter)) return true; + + // Must prefer IOC (e.g. for SavingDatabaseFile) + IOConnectionInfo ioc = ctx.Properties.Get( + EcasProperty.IOConnectionInfo); + if(ioc == null) + { + PwDatabase pd = ctx.Properties.Get(EcasProperty.Database); + if(pd == null) { Debug.Assert(false); return false; } + + ioc = pd.IOConnectionInfo; + } + if(ioc == null) { Debug.Assert(false); return false; } + string strCurFile = ioc.Path; + if(string.IsNullOrEmpty(strCurFile)) return false; + + return EcasUtil.CompareStrings(strCurFile, strFilter, uCompareType); + } + + private static bool IsMatchTextEvent(EcasEvent e, EcasContext ctx) + { + uint uCompareType = EcasUtil.GetParamEnum(e.Parameters, 0, + EcasUtil.StdStringCompareEquals, EcasUtil.StdStringCompare); + + string strFilter = EcasUtil.GetParamString(e.Parameters, 1, true); + if(string.IsNullOrEmpty(strFilter)) return true; + + string str = ctx.Properties.Get(EcasProperty.Text); + if(str == null) { Debug.Assert(false); return false; } + + return EcasUtil.CompareStrings(str, strFilter, uCompareType); + } + + private static bool IsMatchIdEvent(EcasEvent e, EcasContext ctx) + { + string strIdRef = EcasUtil.GetParamString(e.Parameters, 0, true); + if(string.IsNullOrEmpty(strIdRef)) return true; + + string strIdCur = ctx.Properties.Get(EcasProperty.CommandID); + if(string.IsNullOrEmpty(strIdCur)) return false; + + return strIdRef.Equals(strIdCur, StrUtil.CaseIgnoreCmp); + } + + private static bool IsMatchTimePeriodicEvent(EcasEvent e, EcasContext ctx) + { + long lRun = e.RunAtTicks; + bool bRestart = true, bRun = false; + + if(lRun >= 0) + { + DateTime dtNow = DateTime.UtcNow; + + if(dtNow.Ticks >= lRun) bRun = true; + else bRestart = false; + } + + if(bRestart) + { + if(!e.RestartTimer()) return false; + } + + return bRun; + } + } +} diff --git a/src/KeePass/Ecas/EcasEnum.cs b/src/KeePass/Ecas/EcasEnum.cs new file mode 100644 index 0000000..d582424 --- /dev/null +++ b/src/KeePass/Ecas/EcasEnum.cs @@ -0,0 +1,101 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; + +using KeePass.Resources; + +using KeePassLib.Utility; + +namespace KeePass.Ecas +{ + public sealed class EcasEnum + { + private EcasEnumItem[] m_vItems; + public EcasEnumItem[] Items + { + get { return m_vItems; } + } + + public int ItemCount + { + get { return m_vItems.Length; } + } + + public EcasEnum(EcasEnumItem[] vItems) + { + if(vItems == null) throw new ArgumentNullException("vItems"); + + m_vItems = vItems; + } + + public uint GetItemID(string strName, uint uDefaultIfNotFound) + { + if(strName == null) throw new ArgumentNullException("strName"); + + foreach(EcasEnumItem e in m_vItems) + { + if(e.Name == strName) return e.ID; + } + + return uDefaultIfNotFound; + } + + /// + /// Get the localized descriptive text of an enumeration item. + /// + /// ID of the enumeration item. + /// Default value, may be null. + /// Localized enumeration item text or the default value. + public string GetItemString(uint uID, string strDefaultIfNotFound) + { + foreach(EcasEnumItem e in m_vItems) + { + if(e.ID == uID) return e.Name; + } + + return strDefaultIfNotFound; + } + } + + public sealed class EcasEnumItem + { + private uint m_id; + public uint ID + { + get { return m_id; } + } + + private string m_name; + public string Name + { + get { return m_name; } + } + + public EcasEnumItem(uint uID, string strName) + { + if(strName == null) throw new ArgumentNullException("strName"); + + m_id = uID; + m_name = strName; + } + } +} diff --git a/src/KeePass/Ecas/EcasEvent.cs b/src/KeePass/Ecas/EcasEvent.cs new file mode 100644 index 0000000..4809077 --- /dev/null +++ b/src/KeePass/Ecas/EcasEvent.cs @@ -0,0 +1,112 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Xml.Serialization; + +using KeePassLib; +using KeePassLib.Interfaces; + +namespace KeePass.Ecas +{ + public sealed class EcasEvent : IDeepCloneable, IEcasObject + { + private PwUuid m_type = PwUuid.Zero; + [XmlIgnore] + public PwUuid Type + { + get { return m_type; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_type = value; + } + } + + [XmlElement("TypeGuid")] + public string TypeString + { + get { return Convert.ToBase64String(m_type.UuidBytes, Base64FormattingOptions.None); } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_type = new PwUuid(Convert.FromBase64String(value)); + } + } + + private List m_params = new List(); + [XmlArrayItem("Parameter")] + public List Parameters + { + get { return m_params; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_params = value; + } + } + + private long m_lRunAtTicks = -1; + [XmlIgnore] + internal long RunAtTicks + { + get { return m_lRunAtTicks; } + set { m_lRunAtTicks = value; } + } + + public EcasEvent() + { + } + + public EcasEvent CloneDeep() + { + EcasEvent e = new EcasEvent(); + + e.m_type = m_type; // PwUuid is immutable + + for(int i = 0; i < m_params.Count; ++i) + e.m_params.Add(m_params[i]); + + return e; + } + + internal bool RestartTimer() + { + if(!m_type.Equals(EcasEventIDs.TimePeriodic)) { Debug.Assert(false); return false; } + + uint s = EcasUtil.GetParamUInt(m_params, 0); + if(s == 0) return false; + +#if DEBUG + // StackTrace st = new StackTrace(false); + // Trace.WriteLine("[" + (Environment.TickCount / 1000).ToString() + + // "] Restarting timer... (" + st.GetFrame(3).GetMethod().Name + + // " -> " + st.GetFrame(2).GetMethod().Name + + // " -> " + st.GetFrame(1).GetMethod().Name + ")."); +#endif + + DateTime dtNow = DateTime.UtcNow; + m_lRunAtTicks = dtNow.AddSeconds((double)s - 0.45).Ticks; + return true; + } + } +} diff --git a/src/KeePass/Ecas/EcasEventProvider.cs b/src/KeePass/Ecas/EcasEventProvider.cs new file mode 100644 index 0000000..ac90069 --- /dev/null +++ b/src/KeePass/Ecas/EcasEventProvider.cs @@ -0,0 +1,91 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Diagnostics; + +using KeePassLib; + +namespace KeePass.Ecas +{ + public abstract class EcasEventProvider + { + protected List m_events = new List(); + + internal List Events + { + get { return m_events; } + } + + public bool IsSupported(PwUuid uuidType) + { + if(uuidType == null) throw new ArgumentNullException("uuidType"); + + foreach(EcasEventType t in m_events) + { + if(t.Type.Equals(uuidType)) + return true; + } + + return false; + } + + public EcasEventType Find(string strEventName) + { + if(strEventName == null) throw new ArgumentNullException("strEventName"); + + foreach(EcasEventType t in m_events) + { + if(t.Name == strEventName) return t; + } + + return null; + } + + public EcasEventType Find(PwUuid uuid) + { + if(uuid == null) throw new ArgumentNullException("uuid"); + + foreach(EcasEventType t in m_events) + { + if(t.Type.Equals(uuid)) return t; + } + + return null; + } + + public bool Compare(EcasEvent e, EcasContext ctx) + { + if(e == null) throw new ArgumentNullException("e"); + if(ctx == null) throw new ArgumentNullException("ctx"); + + Debug.Assert(e.Type.Equals(ctx.Event.Type)); + + foreach(EcasEventType t in m_events) + { + if(t.Type.Equals(e.Type)) + return t.CompareMethod(e, ctx); + } + + throw new NotSupportedException(); + } + } +} diff --git a/src/KeePass/Ecas/EcasEventType.cs b/src/KeePass/Ecas/EcasEventType.cs new file mode 100644 index 0000000..4e51375 --- /dev/null +++ b/src/KeePass/Ecas/EcasEventType.cs @@ -0,0 +1,83 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; + +using KeePassLib; + +namespace KeePass.Ecas +{ + public delegate bool EcasEventCompare(EcasEvent e, EcasContext ctx); + + public sealed class EcasEventType : IEcasParameterized + { + private PwUuid m_type; + public PwUuid Type + { + get { return m_type; } + } + + private string m_strName; + public string Name + { + get { return m_strName; } + } + + private PwIcon m_pwIcon; + public PwIcon Icon + { + get { return m_pwIcon; } + } + + private EcasParameter[] m_vParams; + public EcasParameter[] Parameters + { + get { return m_vParams; } + } + + private EcasEventCompare m_fn; + public EcasEventCompare CompareMethod + { + get { return m_fn; } + } + + private static bool EcasEventCompareTrue(EcasEvent e, EcasContext ctx) + { + return true; + } + + public EcasEventType(PwUuid uuidType, string strName, PwIcon pwIcon, + EcasParameter[] vParams, EcasEventCompare f) + { + if((uuidType == null) || PwUuid.Zero.Equals(uuidType)) + throw new ArgumentNullException("uuidType"); + if(strName == null) throw new ArgumentNullException("strName"); + // if(vParams == null) throw new ArgumentNullException("vParams"); + // if(f == null) throw new ArgumentNullException("f"); + + m_type = uuidType; + m_strName = strName; + m_pwIcon = pwIcon; + m_vParams = (vParams ?? EcasParameter.EmptyArray); + m_fn = (f ?? EcasEventCompareTrue); + } + } +} diff --git a/src/KeePass/Ecas/EcasParameter.cs b/src/KeePass/Ecas/EcasParameter.cs new file mode 100644 index 0000000..0fa3fe1 --- /dev/null +++ b/src/KeePass/Ecas/EcasParameter.cs @@ -0,0 +1,69 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; + +using KeePassLib.Utility; + +namespace KeePass.Ecas +{ + public sealed class EcasParameter + { + public static EcasParameter[] EmptyArray + { + get { return MemUtil.EmptyArray(); } + } + + private string m_strName; + public string Name + { + get { return m_strName; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strName = value; + } + } + + private EcasValueType m_type; + public EcasValueType Type + { + get { return m_type; } + set { m_type = value; } + } + + private EcasEnum m_vEnumValues; + public EcasEnum EnumValues + { + get { return m_vEnumValues; } + set { m_vEnumValues = value; } // May be null + } + + public EcasParameter(string strName, EcasValueType t, EcasEnum eEnumValues) + { + if(strName == null) throw new ArgumentNullException("strName"); + + m_strName = strName; + m_type = t; + m_vEnumValues = eEnumValues; + } + } +} diff --git a/src/KeePass/Ecas/EcasPool.cs b/src/KeePass/Ecas/EcasPool.cs new file mode 100644 index 0000000..1ce8af1 --- /dev/null +++ b/src/KeePass/Ecas/EcasPool.cs @@ -0,0 +1,235 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; + +using KeePass.Resources; +using KeePassLib; +using KeePassLib.Utility; + +namespace KeePass.Ecas +{ + public sealed class EcasPool + { + private List m_vEventProviders = + new List(); + private List m_vConditionProviders = + new List(); + private List m_vActionProviders = + new List(); + + internal List EventProviders + { + get { return m_vEventProviders; } + } + + internal List ConditionProviders + { + get { return m_vConditionProviders; } + } + + internal List ActionProviders + { + get { return m_vActionProviders; } + } + + public EcasPool() + { + } + + public EcasPool(bool bAddDefaultProviders) + { + if(bAddDefaultProviders) AddDefaultProviders(); + } + + private void AddDefaultProviders() + { + m_vEventProviders.Add(new EcasDefaultEventProvider()); + m_vConditionProviders.Add(new EcasDefaultConditionProvider()); + m_vActionProviders.Add(new EcasDefaultActionProvider()); + } + + public void AddEventProvider(EcasEventProvider p) + { + if(p == null) throw new ArgumentNullException("p"); + m_vEventProviders.Add(p); + } + + public bool RemoveEventProvider(EcasEventProvider p) + { + if(p == null) throw new ArgumentNullException("p"); + return m_vEventProviders.Remove(p); + } + + public EcasEventType FindEvent(string strEventName) + { + if(strEventName == null) throw new ArgumentNullException("strEventName"); + + foreach(EcasEventProvider p in m_vEventProviders) + { + EcasEventType t = p.Find(strEventName); + if(t != null) return t; + } + + return null; + } + + public EcasEventType FindEvent(PwUuid uuid) + { + if(uuid == null) throw new ArgumentNullException("uuid"); + + foreach(EcasEventProvider p in m_vEventProviders) + { + EcasEventType t = p.Find(uuid); + if(t != null) return t; + } + + return null; + } + + public void AddConditionProvider(EcasConditionProvider p) + { + if(p == null) throw new ArgumentNullException("p"); + m_vConditionProviders.Add(p); + } + + public bool RemoveConditionProvider(EcasConditionProvider p) + { + if(p == null) throw new ArgumentNullException("p"); + return m_vConditionProviders.Remove(p); + } + + public EcasConditionType FindCondition(string strConditionName) + { + if(strConditionName == null) throw new ArgumentNullException("strConditionName"); + + foreach(EcasConditionProvider p in m_vConditionProviders) + { + EcasConditionType t = p.Find(strConditionName); + if(t != null) return t; + } + + return null; + } + + public EcasConditionType FindCondition(PwUuid uuid) + { + if(uuid == null) throw new ArgumentNullException("uuid"); + + foreach(EcasConditionProvider p in m_vConditionProviders) + { + EcasConditionType t = p.Find(uuid); + if(t != null) return t; + } + + return null; + } + + public void AddActionProvider(EcasActionProvider p) + { + if(p == null) throw new ArgumentNullException("p"); + m_vActionProviders.Add(p); + } + + public bool RemoveActionProvider(EcasActionProvider p) + { + if(p == null) throw new ArgumentNullException("p"); + return m_vActionProviders.Remove(p); + } + + public EcasActionType FindAction(string strActionName) + { + if(strActionName == null) throw new ArgumentNullException("strActionName"); + + foreach(EcasActionProvider p in m_vActionProviders) + { + EcasActionType t = p.Find(strActionName); + if(t != null) return t; + } + + return null; + } + + public EcasActionType FindAction(PwUuid uuid) + { + if(uuid == null) throw new ArgumentNullException("uuid"); + + foreach(EcasActionProvider p in m_vActionProviders) + { + EcasActionType t = p.Find(uuid); + if(t != null) return t; + } + + return null; + } + + public bool CompareEvents(EcasEvent e, EcasContext ctx) + { + if(e == null) throw new ArgumentNullException("e"); + if(ctx == null) throw new ArgumentNullException("ctx"); + + if(!e.Type.Equals(ctx.Event.Type)) return false; + + foreach(EcasEventProvider p in m_vEventProviders) + { + if(p.IsSupported(e.Type)) + return p.Compare(e, ctx); + } + + throw new Exception(KPRes.TriggerEventTypeUnknown + " " + + KPRes.TypeUnknownHint + MessageService.NewParagraph + e.TypeString); + } + + public bool EvaluateCondition(EcasCondition c, EcasContext ctx) + { + if(c == null) throw new ArgumentNullException("c"); + + foreach(EcasConditionProvider p in m_vConditionProviders) + { + if(p.IsSupported(c.Type)) + { + bool bResult = p.Evaluate(c, ctx); + return (c.Negate ? !bResult : bResult); + } + } + + throw new Exception(KPRes.TriggerConditionTypeUnknown + " " + + KPRes.TypeUnknownHint + MessageService.NewParagraph + c.TypeString); + } + + public void ExecuteAction(EcasAction a, EcasContext ctx) + { + if(a == null) throw new ArgumentNullException("a"); + + foreach(EcasActionProvider p in m_vActionProviders) + { + if(p.IsSupported(a.Type)) + { + p.Execute(a, ctx); + return; + } + } + + throw new Exception(KPRes.TriggerActionTypeUnknown + " " + + KPRes.TypeUnknownHint + MessageService.NewParagraph + a.TypeString); + } + } +} diff --git a/src/KeePass/Ecas/EcasPropertyDictionary.cs b/src/KeePass/Ecas/EcasPropertyDictionary.cs new file mode 100644 index 0000000..83691ef --- /dev/null +++ b/src/KeePass/Ecas/EcasPropertyDictionary.cs @@ -0,0 +1,69 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +namespace KeePass.Ecas +{ + public static class EcasProperty + { + // Triggering objects + public static readonly string Database = "Database"; // PwDatabase + public static readonly string IOConnectionInfo = "IOConnectionInfo"; // IOConnectionInfo + public static readonly string Text = "Text"; // String + public static readonly string CommandID = "CommandID"; // String + } + + public sealed class EcasPropertyDictionary + { + private Dictionary m_dict = new Dictionary(); + + public EcasPropertyDictionary() + { + } + + public void Set(string strKey, object oValue) + { + if(string.IsNullOrEmpty(strKey)) { Debug.Assert(false); return; } + + m_dict[strKey] = oValue; + } + + public T Get(string strKey) + where T : class + { + if(string.IsNullOrEmpty(strKey)) { Debug.Assert(false); return null; } + + object o; + if(m_dict.TryGetValue(strKey, out o)) + { + if(o == null) return null; + + T p = (o as T); + Debug.Assert(p != null); + return p; + } + + return null; + } + } +} diff --git a/src/KeePass/Ecas/EcasSystemEvents.cs b/src/KeePass/Ecas/EcasSystemEvents.cs new file mode 100644 index 0000000..108f5ec --- /dev/null +++ b/src/KeePass/Ecas/EcasSystemEvents.cs @@ -0,0 +1,46 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; + +using KeePass.Util; + +namespace KeePass.Ecas +{ + public sealed class EcasRaisingEventArgs : CancellableOperationEventArgs + { + private EcasEvent m_evt; + public EcasEvent Event + { + get { return m_evt; } + } + + private EcasPropertyDictionary m_props; + public EcasPropertyDictionary Properties + { + get { return m_props; } + } + + public EcasRaisingEventArgs(EcasEvent evt, EcasPropertyDictionary props) + { + m_evt = evt; + m_props = props; + } + } +} diff --git a/src/KeePass/Ecas/EcasTrigger.cs b/src/KeePass/Ecas/EcasTrigger.cs new file mode 100644 index 0000000..ebb3483 --- /dev/null +++ b/src/KeePass/Ecas/EcasTrigger.cs @@ -0,0 +1,248 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml.Serialization; +using System.ComponentModel; +using System.Diagnostics; + +using KeePassLib; +using KeePassLib.Collections; +using KeePassLib.Interfaces; + +namespace KeePass.Ecas +{ + [DebuggerDisplay("Name = {m_strName}")] + public sealed class EcasTrigger : IDeepCloneable + { + private PwUuid m_uuid = PwUuid.Zero; + [XmlIgnore] + public PwUuid Uuid + { + get { return m_uuid; } + set + { + if(value == null) throw new ArgumentNullException("value"); + + m_uuid = value; + } + } + + [XmlElement("Guid")] + public string UuidString + { + get { return Convert.ToBase64String(m_uuid.UuidBytes, Base64FormattingOptions.None); } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_uuid = new PwUuid(Convert.FromBase64String(value)); + } + } + + private string m_strName = string.Empty; + [DefaultValue("")] + public string Name + { + get { return m_strName; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strName = value; + } + } + + private string m_strComments = string.Empty; + [DefaultValue("")] + public string Comments + { + get { return m_strComments; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strComments = value; + } + } + + private bool m_bEnabled = true; + [DefaultValue(true)] + public bool Enabled + { + get { return m_bEnabled; } + set { m_bEnabled = value; } + } + + private bool m_bInitiallyOn = true; + [DefaultValue(true)] + public bool InitiallyOn + { + get { return m_bInitiallyOn; } + set { m_bInitiallyOn = value; } + } + + private bool m_bOn = true; + [XmlIgnore] + public bool On + { + get { return m_bOn; } + set { m_bOn = value; } + } + + private bool m_bTurnOffAfterAction = false; + [DefaultValue(false)] + public bool TurnOffAfterAction + { + get { return m_bTurnOffAfterAction; } + set { m_bTurnOffAfterAction = value; } + } + + private PwObjectList m_events = new PwObjectList(); + [XmlIgnore] + public PwObjectList EventCollection + { + get { return m_events; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_events = value; + } + } + + [XmlArray("Events")] + [XmlArrayItem("Event")] + public EcasEvent[] EventArrayForSerialization + { + get { return m_events.CloneShallowToList().ToArray(); } + set { m_events = PwObjectList.FromArray(value); } + } + + private PwObjectList m_conds = new PwObjectList(); + [XmlIgnore] + public PwObjectList ConditionCollection + { + get { return m_conds; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_conds = value; + } + } + + [XmlArray("Conditions")] + [XmlArrayItem("Condition")] + public EcasCondition[] ConditionsArrayForSerialization + { + get { return m_conds.CloneShallowToList().ToArray(); } + set { m_conds = PwObjectList.FromArray(value); } + } + + private PwObjectList m_acts = new PwObjectList(); + [XmlIgnore] + public PwObjectList ActionCollection + { + get { return m_acts; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_acts = value; + } + } + + [XmlArray("Actions")] + [XmlArrayItem("Action")] + public EcasAction[] ActionArrayForSerialization + { + get { return m_acts.CloneShallowToList().ToArray(); } + set { m_acts = PwObjectList.FromArray(value); } + } + + public EcasTrigger() + { + } + + public EcasTrigger(bool bCreateNewUuid) + { + if(bCreateNewUuid) m_uuid = new PwUuid(true); + } + + public EcasTrigger CloneDeep() + { + EcasTrigger e = new EcasTrigger(false); + + e.m_uuid = m_uuid; // PwUuid is immutable + e.m_strName = m_strName; + e.m_strComments = m_strComments; + e.m_bEnabled = m_bEnabled; + e.m_bInitiallyOn = m_bInitiallyOn; + e.m_bOn = m_bOn; + e.m_bTurnOffAfterAction = m_bTurnOffAfterAction; + + for(uint i = 0; i < m_events.UCount; ++i) + e.m_events.Add(m_events.GetAt(i).CloneDeep()); + + for(uint j = 0; j < m_conds.UCount; ++j) + e.m_conds.Add(m_conds.GetAt(j).CloneDeep()); + + for(uint k = 0; k < m_acts.UCount; ++k) + e.m_acts.Add(m_acts.GetAt(k).CloneDeep()); + + return e; + } + + internal void SetToInitialState() + { + m_bOn = m_bInitiallyOn; + } + + public void RunIfMatching(EcasEvent ctxOccured, EcasPropertyDictionary props) + { + if(!m_bEnabled || !m_bOn) return; + + EcasContext ctx = new EcasContext(Program.TriggerSystem, this, + ctxOccured, props); + + bool bEventMatches = false; + foreach(EcasEvent e in m_events) + { + if(Program.EcasPool.CompareEvents(e, ctx)) + { + bEventMatches = true; + break; + } + } + if(!bEventMatches) return; + + foreach(EcasCondition c in m_conds) + { + if(!Program.EcasPool.EvaluateCondition(c, ctx)) + return; + } + + foreach(EcasAction a in m_acts) + { + if(ctx.Cancel) break; + + Program.EcasPool.ExecuteAction(a, ctx); + } + + if(m_bTurnOffAfterAction) m_bOn = false; + } + } +} diff --git a/src/KeePass/Ecas/EcasTriggerSystem.cs b/src/KeePass/Ecas/EcasTriggerSystem.cs new file mode 100644 index 0000000..6aa95aa --- /dev/null +++ b/src/KeePass/Ecas/EcasTriggerSystem.cs @@ -0,0 +1,242 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; +using System.Windows.Forms; +using System.Xml.Serialization; + +using KeePass.App; +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Collections; +using KeePassLib.Interfaces; +using KeePassLib.Utility; + +namespace KeePass.Ecas +{ + public sealed class EcasTriggerSystem : IDeepCloneable + { + private bool m_bEnabled = true; + [DefaultValue(true)] + public bool Enabled + { + get { return m_bEnabled; } + set { m_bEnabled = value; } + } + + private PwObjectList m_vTriggers = new PwObjectList(); + [XmlIgnore] + public PwObjectList TriggerCollection + { + get { return m_vTriggers; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_vTriggers = value; + } + } + + [XmlArray("Triggers")] + [XmlArrayItem("Trigger")] + public EcasTrigger[] TriggerArrayForSerialization + { + get { return m_vTriggers.CloneShallowToList().ToArray(); } + set { m_vTriggers = PwObjectList.FromArray(value); } + } + + public event EventHandler RaisingEvent; + + public EcasTriggerSystem() + { + } + + public EcasTriggerSystem CloneDeep() + { + EcasTriggerSystem c = new EcasTriggerSystem(); + + c.m_bEnabled = m_bEnabled; + + for(uint i = 0; i < m_vTriggers.UCount; ++i) + c.m_vTriggers.Add(m_vTriggers.GetAt(i).CloneDeep()); + + return c; + } + + internal void SetToInitialState() + { + for(uint i = 0; i < m_vTriggers.UCount; ++i) + m_vTriggers.GetAt(i).SetToInitialState(); + } + + public object FindObjectByUuid(PwUuid pwUuid) + { + if(pwUuid == null) throw new ArgumentNullException("pwUuid"); + + foreach(EcasTrigger t in m_vTriggers) + { + if(t.Uuid.Equals(pwUuid)) return t; + + foreach(EcasEvent e in t.EventCollection) + { + if(e.Type.Equals(pwUuid)) return e; + } + + foreach(EcasCondition c in t.ConditionCollection) + { + if(c.Type.Equals(pwUuid)) return c; + } + + foreach(EcasAction a in t.ActionCollection) + { + if(a.Type.Equals(pwUuid)) return a; + } + } + + return null; + } + + public void RaiseEvent(PwUuid eventType) + { + RaiseEvent(eventType, null); + } + + internal void RaiseEvent(PwUuid eventType, string strPropKey, + object oPropValue) + { + EcasPropertyDictionary d = new EcasPropertyDictionary(); + d.Set(strPropKey, oPropValue); + + RaiseEvent(eventType, d); + } + + public void RaiseEvent(PwUuid eventType, EcasPropertyDictionary props) + { + if(eventType == null) throw new ArgumentNullException("eventType"); + // if(props == null) throw new ArgumentNullException("props"); + + if(!m_bEnabled) return; + + EcasEvent e = new EcasEvent(); + e.Type = eventType; + + RaiseEventObj(e, (props ?? new EcasPropertyDictionary())); + } + + private void RaiseEventObj(EcasEvent e, EcasPropertyDictionary props) + { + // if(e == null) throw new ArgumentNullException("e"); + // if(!m_bEnabled) return; + + if(this.RaisingEvent != null) + { + EcasRaisingEventArgs args = new EcasRaisingEventArgs(e, props); + this.RaisingEvent(this, args); + if(args.Cancel) return; + } + + try + { + foreach(EcasTrigger t in m_vTriggers) + t.RunIfMatching(e, props); + } + catch(Exception ex) + { + if(!VistaTaskDialog.ShowMessageBox(ex.Message, KPRes.TriggerExecutionFailed, + PwDefs.ShortProductName, VtdIcon.Warning, null)) + { + MessageService.ShowWarning(KPRes.TriggerExecutionFailed + ".", ex); + } + } + } + + internal void NotifyUserActivity() + { + // if(!m_bEnabled) return; + + foreach(EcasTrigger t in m_vTriggers) + { + foreach(EcasEvent e in t.EventCollection) + { + if(!e.Type.Equals(EcasEventIDs.TimePeriodic)) continue; + + if(EcasUtil.GetParamBool(e.Parameters, 1)) + e.RestartTimer(); + } + } + } + + internal void CheckTriggers() + { + bool bUIStateUpd = false; + + foreach(EcasTrigger t in m_vTriggers) + { + foreach(EcasEvent e in t.EventCollection) + { + if(e.Type.Equals(EcasEventIDs.UpdatedUIState)) bUIStateUpd = true; + } + } + + if(bUIStateUpd) + { + string str = KPRes.Event + ": '" + KPRes.UpdatedUIState + "'." + + MessageService.NewParagraph + KPRes.TriggerEventTypeUnknown + + MessageService.NewParagraph + KPRes.MoreInfo + ":" + + MessageService.NewLine; + string strUrl = AppHelp.GetOnlineUrl(AppDefs.HelpTopics.TriggerUIStateUpd, null); + + string strVtd = str + VistaTaskDialog.CreateLink(strUrl, strUrl); + + VistaTaskDialog vtd = new VistaTaskDialog(); + vtd.AddButton((int)DialogResult.Cancel, KPRes.Ok, null); + vtd.Content = strVtd; + vtd.DefaultButtonID = (int)DialogResult.Cancel; + vtd.EnableHyperlinks = true; + vtd.SetIcon(VtdIcon.Warning); + vtd.WindowTitle = PwDefs.ShortProductName; + + if(!vtd.ShowDialog()) + MessageService.ShowWarning(str + strUrl); + } + } + } + + [XmlRoot("TriggerCollection")] + public sealed class EcasTriggerContainer + { + private List m_vTriggers = new List(); + [XmlArrayItem("Trigger")] + public List Triggers + { + get { return m_vTriggers; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_vTriggers = value; + } + } + + public EcasTriggerContainer() { } + } +} diff --git a/src/KeePass/Ecas/EcasUtil.cs b/src/KeePass/Ecas/EcasUtil.cs new file mode 100644 index 0000000..17ee5e7 --- /dev/null +++ b/src/KeePass/Ecas/EcasUtil.cs @@ -0,0 +1,527 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +using KeePass.Ecas; +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util.Spr; + +using KeePassLib; +using KeePassLib.Utility; + +namespace KeePass.Ecas +{ + public enum EcasTypeDxMode // Type data exchange modes + { + None = 0, + Selection, // DX with the type UI control (combobox) + ParamsTag // Get type from the parameters control + } + + public static class EcasUtil + { + public static readonly uint StdCompareEqual = 0; + public static readonly uint StdCompareNotEqual = 1; + public static readonly uint StdCompareLesser = 2; + public static readonly uint StdCompareLesserEqual = 3; + public static readonly uint StdCompareGreater = 4; + public static readonly uint StdCompareGreaterEqual = 5; + + private static EcasEnum m_enumCompare = null; + public static EcasEnum StdCompare + { + get + { + if(m_enumCompare == null) + m_enumCompare = new EcasEnum(new EcasEnumItem[] { + new EcasEnumItem(StdCompareEqual, "="), + new EcasEnumItem(StdCompareNotEqual, "<>"), + new EcasEnumItem(StdCompareLesser, "<"), + new EcasEnumItem(StdCompareLesserEqual, "<="), + new EcasEnumItem(StdCompareGreater, ">"), + new EcasEnumItem(StdCompareGreaterEqual, ">=") }); + + return m_enumCompare; + } + } + + public static readonly uint StdStringCompareEquals = 0; + public static readonly uint StdStringCompareContains = 1; + public static readonly uint StdStringCompareStartsWith = 2; + public static readonly uint StdStringCompareEndsWith = 3; + public static readonly uint StdStringCompareRegEx = 4; + + private static EcasEnum m_enumStringCompare = null; + public static EcasEnum StdStringCompare + { + get + { + if(m_enumStringCompare == null) + m_enumStringCompare = new EcasEnum(new EcasEnumItem[] { + new EcasEnumItem(StdStringCompareEquals, KPRes.EqualsOp), + new EcasEnumItem(StdStringCompareContains, KPRes.ContainsOp), + new EcasEnumItem(StdStringCompareStartsWith, KPRes.StartsWith), + new EcasEnumItem(StdStringCompareEndsWith, KPRes.EndsWith), + new EcasEnumItem(StdStringCompareRegEx, KPRes.MatchesRegEx) }); + + return m_enumStringCompare; + } + } + + public static string GetParamString(List vParams, int iIndex) + { + return GetParamString(vParams, iIndex, string.Empty); + } + + public static string GetParamString(List vParams, int iIndex, + bool bSprCompile) + { + return GetParamString(vParams, iIndex, bSprCompile, false); + } + + public static string GetParamString(List vParams, int iIndex, + bool bSprCompile, bool bSprForCommandLine) + { + string str = GetParamString(vParams, iIndex, string.Empty); + + if(bSprCompile && !string.IsNullOrEmpty(str)) + { + PwEntry pe = null; + try { pe = Program.MainForm.GetSelectedEntry(false); } + catch(Exception) { Debug.Assert(false); } + + PwDatabase pd = Program.MainForm.DocumentManager.SafeFindContainerOf(pe); + + // The trigger system does not update the UI itself, + // thus ignore state-changing placeholders + str = SprEngine.Compile(str, new SprContext(pe, pd, + (SprCompileFlags.All & ~SprCompileFlags.StateChanging), + false, bSprForCommandLine)); + } + + return str; + } + + public static string GetParamString(List vParams, int iIndex, + string strDefault) + { + if(vParams == null) { Debug.Assert(false); return strDefault; } + if(iIndex < 0) { Debug.Assert(false); return strDefault; } + if(iIndex >= vParams.Count) return strDefault; // No assert + + return vParams[iIndex]; + } + + public static bool GetParamBool(List vParams, int iIndex) + { + string str = GetParamString(vParams, iIndex, string.Empty); + return StrUtil.StringToBool(str); + } + + public static uint GetParamUInt(List vParams, int iIndex) + { + return GetParamUInt(vParams, iIndex, 0); + } + + public static uint GetParamUInt(List vParams, int iIndex, + uint uDefault) + { + string str = GetParamString(vParams, iIndex, string.Empty); + uint u; + if(uint.TryParse(str, out u)) return u; + return uDefault; + } + + public static uint GetParamEnum(List vParams, int iIndex, + uint uDefault, EcasEnum enumItems) + { + if(enumItems == null) { Debug.Assert(false); return uDefault; } + + string str = GetParamString(vParams, iIndex, null); + if(string.IsNullOrEmpty(str)) { Debug.Assert(false); return uDefault; } + + uint uID; + if(!uint.TryParse(str, out uID)) { Debug.Assert(false); return uDefault; } + + // Make sure the enumeration contains the value + if(enumItems.GetItemString(uID, null) == null) { Debug.Assert(false); return uDefault; } + + return uID; + } + + public static void ParametersToDataGridView(DataGridView dg, + IEcasParameterized p, IEcasObject objDefaults) + { + if(dg == null) throw new ArgumentNullException("dg"); + if(p == null) throw new ArgumentNullException("p"); + if(p.Parameters == null) throw new ArgumentException(); + if(objDefaults == null) throw new ArgumentNullException("objDefaults"); + if(objDefaults.Parameters == null) throw new ArgumentException(); + + dg.Rows.Clear(); + dg.Columns.Clear(); + + Color clrFG = dg.DefaultCellStyle.ForeColor; + Color clrBG = dg.DefaultCellStyle.BackColor; + + // https://sourceforge.net/p/keepass/bugs/1808/ + if(UIUtil.IsDarkColor(clrFG) == UIUtil.IsDarkColor(clrBG)) + clrFG = (UIUtil.IsDarkColor(clrBG) ? Color.White : Color.Black); + + Color clrValueBG = clrBG; + if(UIUtil.IsDarkColor(clrBG)) + clrValueBG = UIUtil.LightenColor(clrValueBG, 0.075); + else clrValueBG = UIUtil.DarkenColor(clrValueBG, 0.075); + + dg.ColumnHeadersVisible = false; + dg.RowHeadersVisible = false; + dg.GridColor = clrBG; + dg.BackgroundColor = clrBG; + dg.DefaultCellStyle.ForeColor = clrFG; + dg.DefaultCellStyle.BackColor = clrBG; + dg.DefaultCellStyle.SelectionForeColor = clrFG; + dg.DefaultCellStyle.SelectionBackColor = clrBG; + dg.AllowDrop = false; + dg.AllowUserToAddRows = false; + dg.AllowUserToDeleteRows = false; + dg.AllowUserToOrderColumns = false; + dg.AllowUserToResizeColumns = false; + dg.AllowUserToResizeRows = false; + // dg.EditMode: see below + dg.Tag = p; + + int nWidth = (dg.ClientSize.Width - UIUtil.GetVScrollBarWidth()); + dg.Columns.Add("Name", KPRes.FieldName); + dg.Columns.Add("Value", KPRes.FieldValue); + dg.Columns[0].Width = (nWidth / 2); + dg.Columns[1].Width = (nWidth / 2); + + bool bUseDefaults = true; + if(objDefaults.Type == null) { Debug.Assert(false); } // Optimistic + else if(p.Type == null) { Debug.Assert(false); } // Optimistic + else if(!objDefaults.Type.Equals(p.Type)) bUseDefaults = false; + + for(int i = 0; i < p.Parameters.Length; ++i) + { + EcasParameter ep = p.Parameters[i]; + + dg.Rows.Add(); + DataGridViewRow row = dg.Rows[dg.Rows.Count - 1]; + DataGridViewCellCollection cc = row.Cells; + + Debug.Assert(cc.Count == 2); + cc[0].Value = ep.Name; + cc[0].ReadOnly = true; + + string strParam = (bUseDefaults ? EcasUtil.GetParamString( + objDefaults.Parameters, i) : string.Empty); + + DataGridViewCell c = null; + switch(ep.Type) + { + case EcasValueType.String: + c = new DataGridViewTextBoxCell(); + c.Value = strParam; + break; + + case EcasValueType.Bool: + c = new DataGridViewCheckBoxCell(false); + c.Value = StrUtil.StringToBool(strParam); + break; + + case EcasValueType.EnumStrings: + DataGridViewComboBoxCell cmb = new DataGridViewComboBoxCell(); + cmb.Sorted = false; + cmb.DisplayStyle = DataGridViewComboBoxDisplayStyle.DropDownButton; + int iFound = -1; + for(int e = 0; e < ep.EnumValues.ItemCount; ++e) + { + EcasEnumItem eei = ep.EnumValues.Items[e]; + cmb.Items.Add(eei.Name); + if(eei.ID.ToString() == strParam) iFound = e; + } + if(iFound >= 0) cmb.Value = ep.EnumValues.Items[iFound].Name; + else if(ep.EnumValues.ItemCount > 0) cmb.Value = ep.EnumValues.Items[0].Name; + else { Debug.Assert(false); } + c = cmb; + break; + + case EcasValueType.Int64: + c = new DataGridViewTextBoxCell(); + c.Value = FilterTypeI64(strParam); + break; + + case EcasValueType.UInt64: + c = new DataGridViewTextBoxCell(); + c.Value = FilterTypeU64(strParam); + break; + + default: + Debug.Assert(false); + break; + } + + if(c != null) + { + cc[1] = c; + cc[1].ReadOnly = false; + } + else cc[1].ReadOnly = true; + + cc[1].Style.ForeColor = clrFG; + cc[1].Style.BackColor = clrValueBG; + cc[1].Style.SelectionForeColor = clrFG; + cc[1].Style.SelectionBackColor = clrValueBG; + } + + // Perform postponed setting of EditMode (cannot set it earlier + // due to a Mono bug on FreeBSD); + // https://sourceforge.net/p/keepass/discussion/329220/thread/cb8270e2/ + dg.EditMode = DataGridViewEditMode.EditOnEnter; + } + + public static void DataGridViewToParameters(DataGridView dg, IEcasObject objOut, + IEcasParameterized eTypeInfo) + { + if(dg == null) throw new ArgumentNullException("dg"); + if(objOut == null) throw new ArgumentNullException("objOut"); + // if(vParamDesc == null) throw new ArgumentNullException("vParamDesc"); + // if(dg.Rows.Count != vParamDesc.Length) { Debug.Assert(false); return; } + + objOut.Parameters.Clear(); + + bool bTypeInfoValid = ((eTypeInfo != null) && (eTypeInfo.Parameters.Length == + dg.Rows.Count)); + + for(int i = 0; i < dg.RowCount; ++i) + { + DataGridViewCell c = dg.Rows[i].Cells[1]; + object oValue = c.Value; + string strValue = ((oValue != null) ? oValue.ToString() : string.Empty); + + if(bTypeInfoValid && (eTypeInfo.Parameters[i].EnumValues != null) && + (c is DataGridViewComboBoxCell)) + { + objOut.Parameters.Add(eTypeInfo.Parameters[i].EnumValues.GetItemID( + strValue, 0).ToString()); + } + else objOut.Parameters.Add(strValue); + } + } + + public static bool UpdateDialog(EcasObjectType objType, ComboBox cmbTypes, + DataGridView dgvParams, IEcasObject o, bool bGuiToInternal, + EcasTypeDxMode dxType) + { + bool bResult = true; + + try + { + if(bGuiToInternal) + { + IEcasParameterized eTypeInfo = null; + + if(dxType == EcasTypeDxMode.Selection) + { + string strSel = (cmbTypes.SelectedItem as string); + if(!string.IsNullOrEmpty(strSel)) + { + if(objType == EcasObjectType.Event) + { + eTypeInfo = Program.EcasPool.FindEvent(strSel); + o.Type = eTypeInfo.Type; + } + else if(objType == EcasObjectType.Condition) + { + eTypeInfo = Program.EcasPool.FindCondition(strSel); + o.Type = eTypeInfo.Type; + } + else if(objType == EcasObjectType.Action) + { + eTypeInfo = Program.EcasPool.FindAction(strSel); + o.Type = eTypeInfo.Type; + } + else { Debug.Assert(false); } + } + } + else if(dxType == EcasTypeDxMode.ParamsTag) + { + IEcasParameterized p = (dgvParams.Tag as IEcasParameterized); + if((p != null) && (p.Type != null)) + { + eTypeInfo = p; + o.Type = eTypeInfo.Type; + } + else { Debug.Assert(false); } + } + + EcasUtil.DataGridViewToParameters(dgvParams, o, eTypeInfo); + } + else // Internal to GUI + { + if(dxType == EcasTypeDxMode.Selection) + { + if(o.Type.Equals(PwUuid.Zero)) + cmbTypes.SelectedIndex = 0; + else + { + int i = -1; + if(objType == EcasObjectType.Event) + i = cmbTypes.FindString(Program.EcasPool.FindEvent(o.Type).Name); + else if(objType == EcasObjectType.Condition) + i = cmbTypes.FindString(Program.EcasPool.FindCondition(o.Type).Name); + else if(objType == EcasObjectType.Action) + i = cmbTypes.FindString(Program.EcasPool.FindAction(o.Type).Name); + else { Debug.Assert(false); } + + if(i >= 0) cmbTypes.SelectedIndex = i; + else { Debug.Assert(false); } + } + } + else { Debug.Assert(dxType != EcasTypeDxMode.ParamsTag); } + + IEcasParameterized t = null; + if(objType == EcasObjectType.Event) + t = Program.EcasPool.FindEvent(cmbTypes.SelectedItem as string); + else if(objType == EcasObjectType.Condition) + t = Program.EcasPool.FindCondition(cmbTypes.SelectedItem as string); + else if(objType == EcasObjectType.Action) + t = Program.EcasPool.FindAction(cmbTypes.SelectedItem as string); + else { Debug.Assert(false); } + + if(t != null) EcasUtil.ParametersToDataGridView(dgvParams, t, o); + } + } + catch(Exception e) { MessageService.ShowWarning(e); bResult = false; } + + return bResult; + } + + public static string ParametersToString(IEcasObject ecasObj, + EcasParameter[] vParamInfo) + { + if(ecasObj == null) throw new ArgumentNullException("ecasObj"); + if(ecasObj.Parameters == null) throw new ArgumentException(); + + bool bParamInfoValid = true; + if((vParamInfo == null) || (ecasObj.Parameters.Count > vParamInfo.Length)) + { + Debug.Assert(false); + bParamInfoValid = false; + } + + StringBuilder sb = new StringBuilder(); + + EcasCondition eCond = (ecasObj as EcasCondition); + if(eCond != null) + { + if(eCond.Negate) sb.Append(KPRes.Not); + } + + for(int i = 0; i < ecasObj.Parameters.Count; ++i) + { + string strParam = ecasObj.Parameters[i]; + string strAppend; + + if(bParamInfoValid) + { + EcasValueType t = vParamInfo[i].Type; + if(t == EcasValueType.String) + strAppend = strParam; + else if(t == EcasValueType.Bool) + strAppend = (StrUtil.StringToBool(strParam) ? KPRes.Yes : KPRes.No); + else if(t == EcasValueType.EnumStrings) + { + uint uEnumID; + if(!uint.TryParse(strParam, out uEnumID)) { Debug.Assert(false); } + EcasEnum ee = vParamInfo[i].EnumValues; + if(ee != null) strAppend = ee.GetItemString(uEnumID, string.Empty); + else { Debug.Assert(false); strAppend = strParam; } + } + else if(t == EcasValueType.Int64) + strAppend = FilterTypeI64(strParam); + else if(t == EcasValueType.UInt64) + strAppend = FilterTypeU64(strParam); + else { Debug.Assert(false); strAppend = strParam; } + } + else strAppend = strParam; + + if(string.IsNullOrEmpty(strAppend)) continue; + string strAppTrimmed = strAppend.Trim(); + if(strAppTrimmed.Length == 0) continue; + if(sb.Length > 0) sb.Append(", "); + sb.Append(strAppTrimmed); + } + + return sb.ToString(); + } + + public static bool CompareStrings(string x, string y, uint uCompareType) + { + if(x == null) { Debug.Assert(false); return false; } + if(y == null) { Debug.Assert(false); return false; } + + if(uCompareType == EcasUtil.StdStringCompareEquals) + return x.Equals(y, StrUtil.CaseIgnoreCmp); + if(uCompareType == EcasUtil.StdStringCompareContains) + return (x.IndexOf(y, StrUtil.CaseIgnoreCmp) >= 0); + if(uCompareType == EcasUtil.StdStringCompareStartsWith) + return x.StartsWith(y, StrUtil.CaseIgnoreCmp); + if(uCompareType == EcasUtil.StdStringCompareEndsWith) + return x.EndsWith(y, StrUtil.CaseIgnoreCmp); + if(uCompareType == EcasUtil.StdStringCompareRegEx) + { + try { return Regex.IsMatch(x, y, RegexOptions.IgnoreCase); } + catch(Exception) { Debug.Assert(false); } + return false; + } + + Debug.Assert(false); // Unknown compare type + return false; + } + + private static string FilterTypeI64(string str) + { + if(string.IsNullOrEmpty(str)) return string.Empty; + + long i64; + if(long.TryParse(str, out i64)) return i64.ToString(); + + return string.Empty; + } + + private static string FilterTypeU64(string str) + { + if(string.IsNullOrEmpty(str)) return string.Empty; + + ulong u64; + if(ulong.TryParse(str, out u64)) return u64.ToString(); + + return string.Empty; + } + } +} diff --git a/src/KeePass/Ecas/EcasValueType.cs b/src/KeePass/Ecas/EcasValueType.cs new file mode 100644 index 0000000..2e876bd --- /dev/null +++ b/src/KeePass/Ecas/EcasValueType.cs @@ -0,0 +1,33 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; + +namespace KeePass.Ecas +{ + public enum EcasValueType + { + None = 0, + String = 1, + Bool = 2, + EnumStrings = 3, + Int64 = 4, + UInt64 = 5 + } +} diff --git a/src/KeePass/Ecas/IEcasObject.cs b/src/KeePass/Ecas/IEcasObject.cs new file mode 100644 index 0000000..491f0af --- /dev/null +++ b/src/KeePass/Ecas/IEcasObject.cs @@ -0,0 +1,43 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; + +using KeePassLib; + +namespace KeePass.Ecas +{ + public enum EcasObjectType + { + None = 0, + Event = 1, + Condition = 2, + Action = 3 + } + + public interface IEcasObject + { + PwUuid Type { get; set; } + string TypeString { get; set; } + + List Parameters { get; set; } + } +} diff --git a/src/KeePass/Ecas/IEcasParameterized.cs b/src/KeePass/Ecas/IEcasParameterized.cs new file mode 100644 index 0000000..eb1c30e --- /dev/null +++ b/src/KeePass/Ecas/IEcasParameterized.cs @@ -0,0 +1,34 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.Text; + +using KeePassLib; + +namespace KeePass.Ecas +{ + public interface IEcasParameterized + { + PwUuid Type { get; } + + EcasParameter[] Parameters { get; } + } +} diff --git a/src/KeePass/Forms/AboutForm.Designer.cs b/src/KeePass/Forms/AboutForm.Designer.cs new file mode 100644 index 0000000..4f89253 --- /dev/null +++ b/src/KeePass/Forms/AboutForm.Designer.cs @@ -0,0 +1,206 @@ +namespace KeePass.Forms +{ + partial class AboutForm + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if(disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Windows Form-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.m_bannerImage = new System.Windows.Forms.PictureBox(); + this.m_lblCopyright = new System.Windows.Forms.Label(); + this.m_lblOsi = new System.Windows.Forms.Label(); + this.m_lblGpl = new System.Windows.Forms.Label(); + this.m_linkHomepage = new System.Windows.Forms.LinkLabel(); + this.m_linkHelp = new System.Windows.Forms.LinkLabel(); + this.m_linkLicense = new System.Windows.Forms.LinkLabel(); + this.m_linkAcknowledgements = new System.Windows.Forms.LinkLabel(); + this.m_linkDonate = new System.Windows.Forms.LinkLabel(); + this.m_btnOK = new System.Windows.Forms.Button(); + this.m_lvComponents = new KeePass.UI.CustomListViewEx(); + ((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).BeginInit(); + this.SuspendLayout(); + // + // m_bannerImage + // + this.m_bannerImage.Dock = System.Windows.Forms.DockStyle.Top; + this.m_bannerImage.Location = new System.Drawing.Point(0, 0); + this.m_bannerImage.Name = "m_bannerImage"; + this.m_bannerImage.Size = new System.Drawing.Size(424, 60); + this.m_bannerImage.TabIndex = 0; + this.m_bannerImage.TabStop = false; + // + // m_lblCopyright + // + this.m_lblCopyright.Location = new System.Drawing.Point(10, 72); + this.m_lblCopyright.Name = "m_lblCopyright"; + this.m_lblCopyright.Size = new System.Drawing.Size(402, 15); + this.m_lblCopyright.TabIndex = 0; + this.m_lblCopyright.Text = "<>"; + // + // m_lblOsi + // + this.m_lblOsi.Location = new System.Drawing.Point(10, 95); + this.m_lblOsi.Name = "m_lblOsi"; + this.m_lblOsi.Size = new System.Drawing.Size(402, 15); + this.m_lblOsi.TabIndex = 1; + this.m_lblOsi.Text = "KeePass is OSI Certified Open Source Software."; + // + // m_lblGpl + // + this.m_lblGpl.Location = new System.Drawing.Point(10, 118); + this.m_lblGpl.Name = "m_lblGpl"; + this.m_lblGpl.Size = new System.Drawing.Size(402, 27); + this.m_lblGpl.TabIndex = 2; + this.m_lblGpl.Text = "The program is distributed under the terms of the GNU General Public License v2 o" + + "r later."; + // + // m_linkHomepage + // + this.m_linkHomepage.AutoSize = true; + this.m_linkHomepage.Location = new System.Drawing.Point(10, 154); + this.m_linkHomepage.Name = "m_linkHomepage"; + this.m_linkHomepage.Size = new System.Drawing.Size(91, 13); + this.m_linkHomepage.TabIndex = 3; + this.m_linkHomepage.TabStop = true; + this.m_linkHomepage.Text = "KeePass Website"; + this.m_linkHomepage.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkHomepage); + // + // m_linkHelp + // + this.m_linkHelp.AutoSize = true; + this.m_linkHelp.Location = new System.Drawing.Point(213, 154); + this.m_linkHelp.Name = "m_linkHelp"; + this.m_linkHelp.Size = new System.Drawing.Size(29, 13); + this.m_linkHelp.TabIndex = 5; + this.m_linkHelp.TabStop = true; + this.m_linkHelp.Text = "Help"; + this.m_linkHelp.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkHelpFile); + // + // m_linkLicense + // + this.m_linkLicense.AutoSize = true; + this.m_linkLicense.Location = new System.Drawing.Point(10, 176); + this.m_linkLicense.Name = "m_linkLicense"; + this.m_linkLicense.Size = new System.Drawing.Size(44, 13); + this.m_linkLicense.TabIndex = 6; + this.m_linkLicense.TabStop = true; + this.m_linkLicense.Text = "License"; + this.m_linkLicense.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkLicenseFile); + // + // m_linkAcknowledgements + // + this.m_linkAcknowledgements.AutoSize = true; + this.m_linkAcknowledgements.Location = new System.Drawing.Point(107, 154); + this.m_linkAcknowledgements.Name = "m_linkAcknowledgements"; + this.m_linkAcknowledgements.Size = new System.Drawing.Size(100, 13); + this.m_linkAcknowledgements.TabIndex = 4; + this.m_linkAcknowledgements.TabStop = true; + this.m_linkAcknowledgements.Text = "Acknowledgements"; + this.m_linkAcknowledgements.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkAcknowledgements); + // + // m_linkDonate + // + this.m_linkDonate.AutoSize = true; + this.m_linkDonate.Location = new System.Drawing.Point(107, 176); + this.m_linkDonate.Name = "m_linkDonate"; + this.m_linkDonate.Size = new System.Drawing.Size(42, 13); + this.m_linkDonate.TabIndex = 7; + this.m_linkDonate.TabStop = true; + this.m_linkDonate.Text = "Donate"; + this.m_linkDonate.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkDonate); + // + // m_btnOK + // + this.m_btnOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.m_btnOK.Location = new System.Drawing.Point(337, 315); + this.m_btnOK.Name = "m_btnOK"; + this.m_btnOK.Size = new System.Drawing.Size(75, 23); + this.m_btnOK.TabIndex = 9; + this.m_btnOK.Text = "OK"; + this.m_btnOK.UseVisualStyleBackColor = true; + // + // m_lvComponents + // + this.m_lvComponents.FullRowSelect = true; + this.m_lvComponents.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.m_lvComponents.Location = new System.Drawing.Point(13, 202); + this.m_lvComponents.MultiSelect = false; + this.m_lvComponents.Name = "m_lvComponents"; + this.m_lvComponents.ShowItemToolTips = true; + this.m_lvComponents.Size = new System.Drawing.Size(398, 102); + this.m_lvComponents.TabIndex = 8; + this.m_lvComponents.UseCompatibleStateImageBehavior = false; + this.m_lvComponents.View = System.Windows.Forms.View.Details; + this.m_lvComponents.ItemActivate += new System.EventHandler(this.OnComponentShow); + // + // AboutForm + // + this.AcceptButton = this.m_btnOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.m_btnOK; + this.ClientSize = new System.Drawing.Size(424, 350); + this.Controls.Add(this.m_lvComponents); + this.Controls.Add(this.m_btnOK); + this.Controls.Add(this.m_linkDonate); + this.Controls.Add(this.m_linkAcknowledgements); + this.Controls.Add(this.m_linkLicense); + this.Controls.Add(this.m_linkHelp); + this.Controls.Add(this.m_linkHomepage); + this.Controls.Add(this.m_lblGpl); + this.Controls.Add(this.m_lblOsi); + this.Controls.Add(this.m_lblCopyright); + this.Controls.Add(this.m_bannerImage); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AboutForm"; + this.ShowInTaskbar = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "About KeePass"; + this.Load += new System.EventHandler(this.OnFormLoad); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.OnFormClosed); + ((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox m_bannerImage; + private System.Windows.Forms.Label m_lblCopyright; + private System.Windows.Forms.Label m_lblOsi; + private System.Windows.Forms.Label m_lblGpl; + private System.Windows.Forms.LinkLabel m_linkHomepage; + private System.Windows.Forms.LinkLabel m_linkHelp; + private System.Windows.Forms.LinkLabel m_linkLicense; + private System.Windows.Forms.LinkLabel m_linkAcknowledgements; + private System.Windows.Forms.LinkLabel m_linkDonate; + private System.Windows.Forms.Button m_btnOK; + private KeePass.UI.CustomListViewEx m_lvComponents; + } +} \ No newline at end of file diff --git a/src/KeePass/Forms/AboutForm.cs b/src/KeePass/Forms/AboutForm.cs new file mode 100644 index 0000000..ae8cd71 --- /dev/null +++ b/src/KeePass/Forms/AboutForm.cs @@ -0,0 +1,286 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +using KeePass.App; +using KeePass.DataExchange; +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Utility; + +namespace KeePass.Forms +{ + public partial class AboutForm : Form, IGwmWindow + { + private CustomContextMenuStripEx m_ctxComponents = null; + + public bool CanCloseWithoutDataLoss { get { return true; } } + + public AboutForm() + { + InitializeComponent(); + GlobalWindowManager.InitializeForm(this); + } + + private void OnFormLoad(object sender, EventArgs e) + { + GlobalWindowManager.AddWindow(this, this); + + string strVersion = GetMainVersion(); + + string strTitle = PwDefs.ProductName; + string strDesc = KPRes.Version + " " + strVersion; + + Icon icoSc = AppIcons.Get(AppIconType.Main, new Size( + DpiUtil.ScaleIntX(48), DpiUtil.ScaleIntY(48)), Color.Empty); + BannerFactory.CreateBannerEx(this, m_bannerImage, icoSc.ToBitmap(), + strTitle, strDesc); + this.Icon = AppIcons.Default; + + Debug.Assert(!m_lblCopyright.AutoSize); // For RTL support + m_lblCopyright.Text = PwDefs.Copyright + "."; + + try { BuildComponentsList(strVersion); } + catch(Exception) { Debug.Assert(false); } + + UIUtil.SetExplorerTheme(m_lvComponents, false); + UIUtil.ResizeColumns(m_lvComponents, true); + BuildComponentsContextMenu(); + + UIUtil.SetFocus(m_btnOK, this); + } + + private void OnFormClosed(object sender, FormClosedEventArgs e) + { + m_lvComponents.ContextMenuStrip = null; + if(m_ctxComponents != null) + { + m_ctxComponents.Dispose(); + m_ctxComponents = null; + } + + GlobalWindowManager.RemoveWindow(this); + } + + private static string GetMainVersion() + { + StringBuilder sb = new StringBuilder(); + sb.Append(PwDefs.VersionString); + + if(Program.IsDevelopmentSnapshot()) + { + sb.Append(" - Dev."); + + try + { + FileInfo fi = new FileInfo(WinUtil.GetExecutable()); + string strDate = fi.LastWriteTimeUtc.ToString("yyMMdd"); + + sb.Append(' '); + sb.Append(strDate); + } + catch(Exception) { Debug.Assert(false); } + } + + const string strParamPlh = @"{PARAM}"; + string strBits = KPRes.BitsA; + if(strBits.IndexOf(strParamPlh) >= 0) + { + sb.Append(" ("); + sb.Append(strBits.Replace(strParamPlh, (IntPtr.Size * 8).ToString())); + sb.Append(')'); + } + else { Debug.Assert(false); } + + return sb.ToString(); + } + + private void BuildComponentsList(string strMainVersion) + { + string strValueColumn = KPRes.Version + "/" + KPRes.Status; + if(Regex.IsMatch(strValueColumn, "\\s")) + strValueColumn = KPRes.Version + " / " + KPRes.Status; + + m_lvComponents.Columns.Add(KPRes.Component, 100); + m_lvComponents.Columns.Add(strValueColumn, 100); + + string strExe = WinUtil.GetExecutable(); + string strDir = UrlUtil.GetFileDirectory(strExe, true, false); + + AddComponentItem(PwDefs.ShortProductName, strMainVersion, strExe); + + string strXsl = UrlUtil.EnsureTerminatingSeparator(strDir + + AppDefs.XslFilesDir, false); + bool b = File.Exists(strXsl + AppDefs.XslFileHtmlFull); + b &= File.Exists(strXsl + AppDefs.XslFileHtmlLight); + b &= File.Exists(strXsl + AppDefs.XslFileHtmlTabular); + AddComponentItem(KPRes.XslStylesheetsKdbx, (b ? KPRes.Installed : + KPRes.NotInstalled), (b ? strXsl : null)); + + b = KdbFile.IsLibraryInstalled(); + string strVer = (b ? (KdbManager.KeePassVersionString + " - 0x" + + KdbManager.LibraryBuild.ToString("X4")) : KPRes.NotInstalled); + string strPath = null; + if(b) + { + string str = strDir + ((IntPtr.Size == 4) ? KdbManager.DllFile32 : + KdbManager.DllFile64); + if(File.Exists(str)) strPath = str; + else { Debug.Assert(false); } // Somewhere else? + } + AddComponentItem(KPRes.KeePassLibCLong, strVer, strPath); + } + + private void AddComponentItem(string strName, string strVersion, string strPath) + { + if(string.IsNullOrEmpty(strName)) { Debug.Assert(false); return; } + if(strVersion == null) { Debug.Assert(false); strVersion = string.Empty; } + + ListViewItem lvi = new ListViewItem(strName); + lvi.SubItems.Add(strVersion); + + if(!string.IsNullOrEmpty(strPath)) + { + lvi.ToolTipText = strName + MessageService.NewLine + strPath; + lvi.Tag = strPath; + } + + m_lvComponents.Items.Add(lvi); + } + + private void BuildComponentsContextMenu() + { + m_ctxComponents = new CustomContextMenuStripEx(); + m_ctxComponents.SuspendLayout(); + + ToolStripMenuItem tsmiShow = new ToolStripMenuItem(KPRes.ShowWithFileManager, + Properties.Resources.B16x16_Folder_Yellow_Open); + tsmiShow.Click += this.OnComponentShow; + m_ctxComponents.Items.Add(tsmiShow); + + m_ctxComponents.Items.Add(new ToolStripSeparator()); + + ToolStripMenuItem tsmiCopyVersion = new ToolStripMenuItem( + KPRes.CopyObject.Replace(@"{PARAM}", m_lvComponents.Columns[1].Text), + Properties.Resources.B16x16_EditCopy); + tsmiCopyVersion.Click += this.OnComponentCopyVersion; + m_ctxComponents.Items.Add(tsmiCopyVersion); + + ToolStripMenuItem tsmiCopyPath = new ToolStripMenuItem( + KPRes.CopyObject.Replace(@"{PARAM}", KPRes.Path), + Properties.Resources.B16x16_EditCopyLink); + tsmiCopyPath.Click += this.OnComponentCopyTag; + m_ctxComponents.Items.Add(tsmiCopyPath); + + m_ctxComponents.Opening += delegate(object sender, CancelEventArgs e) + { + ListViewItem lviSel = GetSelectedComponent(); + bool bSel = (lviSel != null); + bool bTag = (bSel && (lviSel.Tag != null)); + + tsmiShow.Enabled = bTag; + tsmiCopyVersion.Enabled = bSel; + tsmiCopyPath.Enabled = bTag; + }; + + m_ctxComponents.ResumeLayout(true); + m_lvComponents.ContextMenuStrip = m_ctxComponents; + } + + private void OnLinkHomepage(object sender, LinkLabelLinkClickedEventArgs e) + { + WinUtil.OpenUrl(PwDefs.HomepageUrl, null); + Close(); + } + + private void OnLinkHelpFile(object sender, LinkLabelLinkClickedEventArgs e) + { + AppHelp.ShowHelp(null, null); + Close(); + } + + private void OnLinkLicenseFile(object sender, LinkLabelLinkClickedEventArgs e) + { + AppHelp.ShowHelp(AppDefs.HelpTopics.License, null, true); + Close(); + } + + private void OnLinkAcknowledgements(object sender, LinkLabelLinkClickedEventArgs e) + { + AppHelp.ShowHelp(AppDefs.HelpTopics.Acknowledgements, null, true); + Close(); + } + + private void OnLinkDonate(object sender, LinkLabelLinkClickedEventArgs e) + { + WinUtil.OpenUrl(PwDefs.DonationsUrl, null); + Close(); + } + + private ListViewItem GetSelectedComponent() + { + ListView.SelectedListViewItemCollection lvsic = m_lvComponents.SelectedItems; + if((lvsic == null) || (lvsic.Count != 1)) return null; + return lvsic[0]; + } + + private void OnComponentShow(object sender, EventArgs e) + { + ListViewItem lvi = GetSelectedComponent(); + if(lvi == null) { Debug.Assert(false); return; } + + string strPath = (lvi.Tag as string); + if(string.IsNullOrEmpty(strPath)) return; + + if(File.Exists(strPath)) + WinUtil.ShowFileInFileManager(strPath, true); + else WinUtil.OpenUrlDirectly(strPath); + } + + private void OnComponentCopyVersion(object sender, EventArgs e) + { + ListViewItem lvi = GetSelectedComponent(); + if(lvi == null) { Debug.Assert(false); return; } + + string str = (lvi.SubItems[1].Text ?? string.Empty); + ClipboardUtil.Copy(str, false, false, null, null, this.Handle); + } + + private void OnComponentCopyTag(object sender, EventArgs e) + { + ListViewItem lvi = GetSelectedComponent(); + if(lvi == null) { Debug.Assert(false); return; } + + string str = ((lvi.Tag as string) ?? string.Empty); + ClipboardUtil.Copy(str, false, false, null, null, this.Handle); + } + } +} diff --git a/src/KeePass/Forms/AboutForm.resx b/src/KeePass/Forms/AboutForm.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/src/KeePass/Forms/AboutForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/KeePass/Forms/AutoTypeCtxForm.Designer.cs b/src/KeePass/Forms/AutoTypeCtxForm.Designer.cs new file mode 100644 index 0000000..f79cb9c --- /dev/null +++ b/src/KeePass/Forms/AutoTypeCtxForm.Designer.cs @@ -0,0 +1,173 @@ +namespace KeePass.Forms +{ + partial class AutoTypeCtxForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if(disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.m_bannerImage = new System.Windows.Forms.PictureBox(); + this.m_lblText = new System.Windows.Forms.Label(); + this.m_btnCancel = new System.Windows.Forms.Button(); + this.m_lvItems = new KeePass.UI.CustomListViewEx(); + this.m_pnlTop = new System.Windows.Forms.Panel(); + this.m_pnlBottom = new System.Windows.Forms.Panel(); + this.m_btnTools = new System.Windows.Forms.Button(); + this.m_pnlMiddle = new System.Windows.Forms.Panel(); + ((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).BeginInit(); + this.m_pnlTop.SuspendLayout(); + this.m_pnlBottom.SuspendLayout(); + this.m_pnlMiddle.SuspendLayout(); + this.SuspendLayout(); + // + // m_bannerImage + // + this.m_bannerImage.Dock = System.Windows.Forms.DockStyle.Top; + this.m_bannerImage.Location = new System.Drawing.Point(0, 0); + this.m_bannerImage.Name = "m_bannerImage"; + this.m_bannerImage.Size = new System.Drawing.Size(579, 60); + this.m_bannerImage.TabIndex = 0; + this.m_bannerImage.TabStop = false; + // + // m_lblText + // + this.m_lblText.Dock = System.Windows.Forms.DockStyle.Fill; + this.m_lblText.Location = new System.Drawing.Point(9, 11); + this.m_lblText.Name = "m_lblText"; + this.m_lblText.Size = new System.Drawing.Size(561, 30); + this.m_lblText.TabIndex = 0; + this.m_lblText.Text = "<>"; + // + // m_btnCancel + // + this.m_btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.m_btnCancel.Dock = System.Windows.Forms.DockStyle.Right; + this.m_btnCancel.Location = new System.Drawing.Point(492, 6); + this.m_btnCancel.Name = "m_btnCancel"; + this.m_btnCancel.Size = new System.Drawing.Size(75, 23); + this.m_btnCancel.TabIndex = 1; + this.m_btnCancel.Text = "Cancel"; + this.m_btnCancel.UseVisualStyleBackColor = true; + // + // m_lvItems + // + this.m_lvItems.Activation = System.Windows.Forms.ItemActivation.OneClick; + this.m_lvItems.Dock = System.Windows.Forms.DockStyle.Fill; + this.m_lvItems.FullRowSelect = true; + this.m_lvItems.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.m_lvItems.HideSelection = false; + this.m_lvItems.HotTracking = true; + this.m_lvItems.HoverSelection = true; + this.m_lvItems.Location = new System.Drawing.Point(12, 0); + this.m_lvItems.MultiSelect = false; + this.m_lvItems.Name = "m_lvItems"; + this.m_lvItems.ShowItemToolTips = true; + this.m_lvItems.Size = new System.Drawing.Size(555, 219); + this.m_lvItems.TabIndex = 0; + this.m_lvItems.UseCompatibleStateImageBehavior = false; + this.m_lvItems.View = System.Windows.Forms.View.Details; + this.m_lvItems.ItemActivate += new System.EventHandler(this.OnListItemActivate); + this.m_lvItems.Click += new System.EventHandler(this.OnListClick); + // + // m_pnlTop + // + this.m_pnlTop.Controls.Add(this.m_lblText); + this.m_pnlTop.Dock = System.Windows.Forms.DockStyle.Top; + this.m_pnlTop.Location = new System.Drawing.Point(0, 60); + this.m_pnlTop.Name = "m_pnlTop"; + this.m_pnlTop.Padding = new System.Windows.Forms.Padding(9, 11, 9, 3); + this.m_pnlTop.Size = new System.Drawing.Size(579, 44); + this.m_pnlTop.TabIndex = 2; + // + // m_pnlBottom + // + this.m_pnlBottom.Controls.Add(this.m_btnTools); + this.m_pnlBottom.Controls.Add(this.m_btnCancel); + this.m_pnlBottom.Dock = System.Windows.Forms.DockStyle.Bottom; + this.m_pnlBottom.Location = new System.Drawing.Point(0, 323); + this.m_pnlBottom.Name = "m_pnlBottom"; + this.m_pnlBottom.Padding = new System.Windows.Forms.Padding(12, 6, 12, 12); + this.m_pnlBottom.Size = new System.Drawing.Size(579, 41); + this.m_pnlBottom.TabIndex = 1; + // + // m_btnTools + // + this.m_btnTools.Dock = System.Windows.Forms.DockStyle.Left; + this.m_btnTools.Location = new System.Drawing.Point(12, 6); + this.m_btnTools.Name = "m_btnTools"; + this.m_btnTools.Size = new System.Drawing.Size(75, 23); + this.m_btnTools.TabIndex = 0; + this.m_btnTools.Text = "&Options"; + this.m_btnTools.UseVisualStyleBackColor = true; + this.m_btnTools.Click += new System.EventHandler(this.OnBtnTools); + // + // m_pnlMiddle + // + this.m_pnlMiddle.Controls.Add(this.m_lvItems); + this.m_pnlMiddle.Dock = System.Windows.Forms.DockStyle.Fill; + this.m_pnlMiddle.Location = new System.Drawing.Point(0, 104); + this.m_pnlMiddle.Name = "m_pnlMiddle"; + this.m_pnlMiddle.Padding = new System.Windows.Forms.Padding(12, 0, 12, 0); + this.m_pnlMiddle.Size = new System.Drawing.Size(579, 219); + this.m_pnlMiddle.TabIndex = 0; + // + // AutoTypeCtxForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.m_btnCancel; + this.ClientSize = new System.Drawing.Size(579, 364); + this.Controls.Add(this.m_pnlMiddle); + this.Controls.Add(this.m_pnlBottom); + this.Controls.Add(this.m_pnlTop); + this.Controls.Add(this.m_bannerImage); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AutoTypeCtxForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "<>"; + this.Load += new System.EventHandler(this.OnFormLoad); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.OnFormClosed); + this.Resize += new System.EventHandler(this.OnFormResize); + ((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).EndInit(); + this.m_pnlTop.ResumeLayout(false); + this.m_pnlBottom.ResumeLayout(false); + this.m_pnlMiddle.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PictureBox m_bannerImage; + private System.Windows.Forms.Label m_lblText; + private KeePass.UI.CustomListViewEx m_lvItems; + private System.Windows.Forms.Button m_btnCancel; + private System.Windows.Forms.Panel m_pnlTop; + private System.Windows.Forms.Panel m_pnlBottom; + private System.Windows.Forms.Panel m_pnlMiddle; + private System.Windows.Forms.Button m_btnTools; + } +} \ No newline at end of file diff --git a/src/KeePass/Forms/AutoTypeCtxForm.cs b/src/KeePass/Forms/AutoTypeCtxForm.cs new file mode 100644 index 0000000..2c60136 --- /dev/null +++ b/src/KeePass/Forms/AutoTypeCtxForm.cs @@ -0,0 +1,282 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using KeePass.App; +using KeePass.App.Configuration; +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util; + +using KeePassLib; + +namespace KeePass.Forms +{ + public partial class AutoTypeCtxForm : Form + { + private List m_lCtxs = null; + private ImageList m_ilIcons = null; + + private string m_strInitialFormRect = string.Empty; + private string m_strInitialColWidths = string.Empty; + private int m_nBannerWidth = -1; + private bool m_bCanShowPasswords = true; + + private CustomContextMenuStripEx m_ctxTools = null; + private ToolStripMenuItem m_tsmiColumns = null; + + private AutoTypeCtx m_atcSel = null; + public AutoTypeCtx SelectedCtx + { + get { return m_atcSel; } + } + + public void InitEx(List lCtxs, ImageList ilIcons) + { + m_lCtxs = lCtxs; + m_ilIcons = UIUtil.CloneImageList(ilIcons, true); + } + + public AutoTypeCtxForm() + { + InitializeComponent(); + GlobalWindowManager.InitializeForm(this); + } + + private void OnFormLoad(object sender, EventArgs e) + { + Size sz = this.ClientSize; + this.MinimumSize = new Size((int)(0.949f * (float)sz.Width), + (int)(0.824f * (float)sz.Height)); + + GlobalWindowManager.AddWindow(this); + + Debug.Assert(!m_lblText.AutoSize); // For RTL support + m_lblText.Text = KPRes.AutoTypeEntrySelectionDescLong2; + + this.Text = KPRes.AutoTypeEntrySelection; + this.Icon = AppIcons.Default; + + m_strInitialFormRect = UIUtil.SetWindowScreenRectEx(this, + Program.Config.UI.AutoTypeCtxRect); + + UIUtil.SetExplorerTheme(m_lvItems, true); + + if(m_ilIcons != null) m_lvItems.SmallImageList = m_ilIcons; + else { Debug.Assert(false); m_ilIcons = new ImageList(); } + + m_bCanShowPasswords = AppPolicy.Current.UnhidePasswords; + + RecreateEntryList(); + + string strColWidths = Program.Config.UI.AutoTypeCtxColumnWidths; + if(strColWidths.Length > 0) UIUtil.SetColumnWidths(m_lvItems, strColWidths); + m_strInitialColWidths = UIUtil.GetColumnWidths(m_lvItems); + + ProcessResize(); + BringToFront(); + Activate(); + UIUtil.SetFocus(m_lvItems, this, true); + } + + private void OnFormClosed(object sender, FormClosedEventArgs e) + { + string strColWidths = UIUtil.GetColumnWidths(m_lvItems); + if(strColWidths != m_strInitialColWidths) + Program.Config.UI.AutoTypeCtxColumnWidths = strColWidths; + + string strRect = UIUtil.GetWindowScreenRect(this); + if(strRect != m_strInitialFormRect) // Don't overwrite "" + Program.Config.UI.AutoTypeCtxRect = strRect; + + DestroyToolsContextMenu(); + + if(m_ilIcons != null) + { + m_lvItems.SmallImageList = null; // Detach event handlers + m_ilIcons.Dispose(); + m_ilIcons = null; + } + + GlobalWindowManager.RemoveWindow(this); + } + + private void RecreateEntryList() + { + long lFlags = Program.Config.UI.AutoTypeCtxFlags; + + if(!m_bCanShowPasswords) + lFlags &= ~(long)AceAutoTypeCtxFlags.ColPassword; + + UIUtil.CreateEntryList(m_lvItems, m_lCtxs, (AceAutoTypeCtxFlags)lFlags, + m_ilIcons); + } + + private void ProcessResize() + { + if(m_lCtxs == null) return; // TrlUtil or design mode + + string strSub = KPRes.AutoTypeEntrySelectionDescShort; + int n = m_lCtxs.Count; + if(n == 1) strSub = KPRes.SearchEntriesFound1 + "."; + else if(n <= 0) + { + strSub = KPRes.SearchEntriesFound + "."; + strSub = strSub.Replace(@"{PARAM}", "0"); + } + + BannerFactory.UpdateBanner(this, m_bannerImage, + Properties.Resources.B48x48_KGPG_Key2, KPRes.AutoTypeEntrySelection, + strSub, ref m_nBannerWidth); + } + + private bool GetSelectedEntry() + { + ListView.SelectedListViewItemCollection slvic = m_lvItems.SelectedItems; + if(slvic.Count == 1) + { + m_atcSel = (slvic[0].Tag as AutoTypeCtx); + return (m_atcSel != null); + } + + return false; + } + + private void ProcessItemSelection() + { + if(this.DialogResult == DialogResult.OK) return; // Already closing + + if(GetSelectedEntry()) this.DialogResult = DialogResult.OK; + } + + private void OnListItemActivate(object sender, EventArgs e) + { + ProcessItemSelection(); + } + + // The item activation handler has a slight delay when clicking an + // item, thus as a performance optimization we additionally handle + // item clicks + private void OnListClick(object sender, EventArgs e) + { + ProcessItemSelection(); + } + + private void OnFormResize(object sender, EventArgs e) + { + ProcessResize(); + } + + private void DestroyToolsContextMenu() + { + if(m_ctxTools == null) return; + + foreach(ToolStripItem tsi in m_tsmiColumns.DropDownItems) + tsi.Click -= this.OnToggleColumn; + + m_tsmiColumns = null; + m_ctxTools.Dispose(); + m_ctxTools = null; + } + + private void RecreateToolsContextMenu() + { + DestroyToolsContextMenu(); + + m_ctxTools = new CustomContextMenuStripEx(); + m_tsmiColumns = new ToolStripMenuItem(KPRes.Columns); + m_ctxTools.Items.Add(m_tsmiColumns); + + long lFlags = Program.Config.UI.AutoTypeCtxFlags; + + ToolStripMenuItem tsmi = new ToolStripMenuItem(KPRes.Title); + UIUtil.SetChecked(tsmi, true); + tsmi.Tag = AceAutoTypeCtxFlags.ColTitle; + tsmi.Click += this.OnToggleColumn; + tsmi.Enabled = false; + m_tsmiColumns.DropDownItems.Add(tsmi); + + tsmi = new ToolStripMenuItem(KPRes.UserName); + UIUtil.SetChecked(tsmi, ((lFlags & (long)AceAutoTypeCtxFlags.ColUserName) != 0)); + tsmi.Tag = AceAutoTypeCtxFlags.ColUserName; + tsmi.Click += this.OnToggleColumn; + m_tsmiColumns.DropDownItems.Add(tsmi); + + tsmi = new ToolStripMenuItem(KPRes.Password); + UIUtil.SetChecked(tsmi, (((lFlags & (long)AceAutoTypeCtxFlags.ColPassword) != 0) && + m_bCanShowPasswords)); + tsmi.Tag = AceAutoTypeCtxFlags.ColPassword; + tsmi.Click += this.OnToggleColumn; + if(!m_bCanShowPasswords) tsmi.Enabled = false; + m_tsmiColumns.DropDownItems.Add(tsmi); + + tsmi = new ToolStripMenuItem(KPRes.Url); + UIUtil.SetChecked(tsmi, ((lFlags & (long)AceAutoTypeCtxFlags.ColUrl) != 0)); + tsmi.Tag = AceAutoTypeCtxFlags.ColUrl; + tsmi.Click += this.OnToggleColumn; + m_tsmiColumns.DropDownItems.Add(tsmi); + + tsmi = new ToolStripMenuItem(KPRes.Notes); + UIUtil.SetChecked(tsmi, ((lFlags & (long)AceAutoTypeCtxFlags.ColNotes) != 0)); + tsmi.Tag = AceAutoTypeCtxFlags.ColNotes; + tsmi.Click += this.OnToggleColumn; + m_tsmiColumns.DropDownItems.Add(tsmi); + + tsmi = new ToolStripMenuItem(KPRes.Sequence + " - " + KPRes.Comments); + UIUtil.SetChecked(tsmi, ((lFlags & (long)AceAutoTypeCtxFlags.ColSequenceComments) != 0)); + tsmi.Tag = AceAutoTypeCtxFlags.ColSequenceComments; + tsmi.Click += this.OnToggleColumn; + m_tsmiColumns.DropDownItems.Add(tsmi); + + tsmi = new ToolStripMenuItem(KPRes.Sequence); + UIUtil.SetChecked(tsmi, ((lFlags & (long)AceAutoTypeCtxFlags.ColSequence) != 0)); + tsmi.Tag = AceAutoTypeCtxFlags.ColSequence; + tsmi.Click += this.OnToggleColumn; + m_tsmiColumns.DropDownItems.Add(tsmi); + } + + private void OnToggleColumn(object sender, EventArgs e) + { + ToolStripMenuItem tsmi = (sender as ToolStripMenuItem); + if(tsmi == null) { Debug.Assert(false); return; } + + AceAutoTypeCtxFlags f = (AceAutoTypeCtxFlags)tsmi.Tag; + long lFlags = Program.Config.UI.AutoTypeCtxFlags; + + lFlags ^= (long)f; + lFlags |= (long)AceAutoTypeCtxFlags.ColTitle; // Enforce title + + Program.Config.UI.AutoTypeCtxFlags = lFlags; + RecreateEntryList(); + } + + private void OnBtnTools(object sender, EventArgs e) + { + RecreateToolsContextMenu(); + m_ctxTools.ShowEx(m_btnTools); + } + } +} diff --git a/src/KeePass/Forms/AutoTypeCtxForm.resx b/src/KeePass/Forms/AutoTypeCtxForm.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/src/KeePass/Forms/AutoTypeCtxForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/KeePass/Forms/CharPickerForm.Designer.cs b/src/KeePass/Forms/CharPickerForm.Designer.cs new file mode 100644 index 0000000..cef35d5 --- /dev/null +++ b/src/KeePass/Forms/CharPickerForm.Designer.cs @@ -0,0 +1,269 @@ +namespace KeePass.Forms +{ + partial class CharPickerForm + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if(disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Windows Form-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.m_btnOK = new System.Windows.Forms.Button(); + this.m_btnCancel = new System.Windows.Forms.Button(); + this.m_bannerImage = new System.Windows.Forms.PictureBox(); + this.m_lblChars = new System.Windows.Forms.Label(); + this.m_lblIndex = new System.Windows.Forms.Label(); + this.m_lblSelChars = new System.Windows.Forms.Label(); + this.m_tbSelected = new KeePass.UI.SecureTextBoxEx(); + this.m_cbHideChars = new System.Windows.Forms.CheckBox(); + this.m_pnlSelect = new System.Windows.Forms.Panel(); + this.m_pnlBottom = new System.Windows.Forms.Panel(); + this.m_pnlBottomRight = new System.Windows.Forms.Panel(); + this.m_pnlTop = new System.Windows.Forms.Panel(); + this.m_pnlTopLeft = new System.Windows.Forms.Panel(); + this.m_pnlLeft = new System.Windows.Forms.Panel(); + this.m_pnlRight = new System.Windows.Forms.Panel(); + this.m_pnlMiddleTopSpacer = new System.Windows.Forms.Panel(); + ((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).BeginInit(); + this.m_pnlBottom.SuspendLayout(); + this.m_pnlBottomRight.SuspendLayout(); + this.m_pnlTop.SuspendLayout(); + this.m_pnlTopLeft.SuspendLayout(); + this.m_pnlLeft.SuspendLayout(); + this.m_pnlRight.SuspendLayout(); + this.m_pnlMiddleTopSpacer.SuspendLayout(); + this.SuspendLayout(); + // + // m_btnOK + // + this.m_btnOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.m_btnOK.Location = new System.Drawing.Point(8, 5); + this.m_btnOK.Name = "m_btnOK"; + this.m_btnOK.Size = new System.Drawing.Size(75, 23); + this.m_btnOK.TabIndex = 0; + this.m_btnOK.Text = "OK"; + this.m_btnOK.UseVisualStyleBackColor = true; + this.m_btnOK.Click += new System.EventHandler(this.OnBtnOK); + // + // m_btnCancel + // + this.m_btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.m_btnCancel.Location = new System.Drawing.Point(89, 5); + this.m_btnCancel.Name = "m_btnCancel"; + this.m_btnCancel.Size = new System.Drawing.Size(75, 23); + this.m_btnCancel.TabIndex = 1; + this.m_btnCancel.Text = "Cancel"; + this.m_btnCancel.UseVisualStyleBackColor = true; + this.m_btnCancel.Click += new System.EventHandler(this.OnBtnCancel); + // + // m_bannerImage + // + this.m_bannerImage.Dock = System.Windows.Forms.DockStyle.Top; + this.m_bannerImage.Location = new System.Drawing.Point(0, 0); + this.m_bannerImage.Name = "m_bannerImage"; + this.m_bannerImage.Size = new System.Drawing.Size(628, 60); + this.m_bannerImage.TabIndex = 3; + this.m_bannerImage.TabStop = false; + // + // m_lblChars + // + this.m_lblChars.AutoSize = true; + this.m_lblChars.Location = new System.Drawing.Point(0, 6); + this.m_lblChars.Name = "m_lblChars"; + this.m_lblChars.Size = new System.Drawing.Size(56, 13); + this.m_lblChars.TabIndex = 0; + this.m_lblChars.Text = "Character:"; + // + // m_lblIndex + // + this.m_lblIndex.AutoSize = true; + this.m_lblIndex.Location = new System.Drawing.Point(0, 30); + this.m_lblIndex.Name = "m_lblIndex"; + this.m_lblIndex.Size = new System.Drawing.Size(47, 13); + this.m_lblIndex.TabIndex = 1; + this.m_lblIndex.Text = "Position:"; + // + // m_lblSelChars + // + this.m_lblSelChars.AutoSize = true; + this.m_lblSelChars.Location = new System.Drawing.Point(12, 15); + this.m_lblSelChars.Name = "m_lblSelChars"; + this.m_lblSelChars.Size = new System.Drawing.Size(36, 13); + this.m_lblSelChars.TabIndex = 0; + this.m_lblSelChars.Text = "Word:"; + // + // m_tbSelected + // + this.m_tbSelected.Dock = System.Windows.Forms.DockStyle.Top; + this.m_tbSelected.Location = new System.Drawing.Point(0, 12); + this.m_tbSelected.Name = "m_tbSelected"; + this.m_tbSelected.Size = new System.Drawing.Size(508, 20); + this.m_tbSelected.TabIndex = 0; + // + // m_cbHideChars + // + this.m_cbHideChars.Appearance = System.Windows.Forms.Appearance.Button; + this.m_cbHideChars.Location = new System.Drawing.Point(5, 10); + this.m_cbHideChars.Name = "m_cbHideChars"; + this.m_cbHideChars.Size = new System.Drawing.Size(32, 23); + this.m_cbHideChars.TabIndex = 0; + this.m_cbHideChars.Text = "***"; + this.m_cbHideChars.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.m_cbHideChars.UseVisualStyleBackColor = true; + this.m_cbHideChars.CheckedChanged += new System.EventHandler(this.OnHideCharsCheckedChanged); + // + // m_pnlSelect + // + this.m_pnlSelect.Dock = System.Windows.Forms.DockStyle.Fill; + this.m_pnlSelect.Location = new System.Drawing.Point(71, 8); + this.m_pnlSelect.Name = "m_pnlSelect"; + this.m_pnlSelect.Size = new System.Drawing.Size(545, 52); + this.m_pnlSelect.TabIndex = 1; + // + // m_pnlBottom + // + this.m_pnlBottom.Controls.Add(this.m_pnlBottomRight); + this.m_pnlBottom.Dock = System.Windows.Forms.DockStyle.Bottom; + this.m_pnlBottom.Location = new System.Drawing.Point(0, 175); + this.m_pnlBottom.Name = "m_pnlBottom"; + this.m_pnlBottom.Size = new System.Drawing.Size(628, 40); + this.m_pnlBottom.TabIndex = 0; + // + // m_pnlBottomRight + // + this.m_pnlBottomRight.Controls.Add(this.m_btnCancel); + this.m_pnlBottomRight.Controls.Add(this.m_btnOK); + this.m_pnlBottomRight.Dock = System.Windows.Forms.DockStyle.Right; + this.m_pnlBottomRight.Location = new System.Drawing.Point(452, 0); + this.m_pnlBottomRight.Name = "m_pnlBottomRight"; + this.m_pnlBottomRight.Size = new System.Drawing.Size(176, 40); + this.m_pnlBottomRight.TabIndex = 0; + // + // m_pnlTop + // + this.m_pnlTop.Controls.Add(this.m_pnlSelect); + this.m_pnlTop.Controls.Add(this.m_pnlTopLeft); + this.m_pnlTop.Dock = System.Windows.Forms.DockStyle.Top; + this.m_pnlTop.Location = new System.Drawing.Point(0, 60); + this.m_pnlTop.Name = "m_pnlTop"; + this.m_pnlTop.Padding = new System.Windows.Forms.Padding(12, 8, 12, 8); + this.m_pnlTop.Size = new System.Drawing.Size(628, 68); + this.m_pnlTop.TabIndex = 1; + // + // m_pnlTopLeft + // + this.m_pnlTopLeft.Controls.Add(this.m_lblChars); + this.m_pnlTopLeft.Controls.Add(this.m_lblIndex); + this.m_pnlTopLeft.Dock = System.Windows.Forms.DockStyle.Left; + this.m_pnlTopLeft.Location = new System.Drawing.Point(12, 8); + this.m_pnlTopLeft.Name = "m_pnlTopLeft"; + this.m_pnlTopLeft.Size = new System.Drawing.Size(59, 52); + this.m_pnlTopLeft.TabIndex = 0; + // + // m_pnlLeft + // + this.m_pnlLeft.Controls.Add(this.m_lblSelChars); + this.m_pnlLeft.Dock = System.Windows.Forms.DockStyle.Left; + this.m_pnlLeft.Location = new System.Drawing.Point(0, 128); + this.m_pnlLeft.Name = "m_pnlLeft"; + this.m_pnlLeft.Size = new System.Drawing.Size(71, 47); + this.m_pnlLeft.TabIndex = 2; + // + // m_pnlRight + // + this.m_pnlRight.Controls.Add(this.m_cbHideChars); + this.m_pnlRight.Dock = System.Windows.Forms.DockStyle.Right; + this.m_pnlRight.Location = new System.Drawing.Point(579, 128); + this.m_pnlRight.Name = "m_pnlRight"; + this.m_pnlRight.Size = new System.Drawing.Size(49, 47); + this.m_pnlRight.TabIndex = 4; + // + // m_pnlMiddleTopSpacer + // + this.m_pnlMiddleTopSpacer.Controls.Add(this.m_tbSelected); + this.m_pnlMiddleTopSpacer.Dock = System.Windows.Forms.DockStyle.Top; + this.m_pnlMiddleTopSpacer.Location = new System.Drawing.Point(71, 128); + this.m_pnlMiddleTopSpacer.Name = "m_pnlMiddleTopSpacer"; + this.m_pnlMiddleTopSpacer.Padding = new System.Windows.Forms.Padding(0, 12, 0, 0); + this.m_pnlMiddleTopSpacer.Size = new System.Drawing.Size(508, 41); + this.m_pnlMiddleTopSpacer.TabIndex = 3; + // + // CharPickerForm + // + this.AcceptButton = this.m_btnOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.m_btnCancel; + this.ClientSize = new System.Drawing.Size(628, 215); + this.Controls.Add(this.m_pnlMiddleTopSpacer); + this.Controls.Add(this.m_pnlRight); + this.Controls.Add(this.m_pnlLeft); + this.Controls.Add(this.m_pnlTop); + this.Controls.Add(this.m_pnlBottom); + this.Controls.Add(this.m_bannerImage); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "CharPickerForm"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "<>"; + this.Load += new System.EventHandler(this.OnFormLoad); + this.SizeChanged += new System.EventHandler(this.OnFormSizeChanged); + this.Shown += new System.EventHandler(this.OnFormShown); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.OnFormClosed); + this.Resize += new System.EventHandler(this.OnFormResize); + ((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).EndInit(); + this.m_pnlBottom.ResumeLayout(false); + this.m_pnlBottomRight.ResumeLayout(false); + this.m_pnlTop.ResumeLayout(false); + this.m_pnlTopLeft.ResumeLayout(false); + this.m_pnlTopLeft.PerformLayout(); + this.m_pnlLeft.ResumeLayout(false); + this.m_pnlLeft.PerformLayout(); + this.m_pnlRight.ResumeLayout(false); + this.m_pnlMiddleTopSpacer.ResumeLayout(false); + this.m_pnlMiddleTopSpacer.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button m_btnOK; + private System.Windows.Forms.Button m_btnCancel; + private System.Windows.Forms.PictureBox m_bannerImage; + private System.Windows.Forms.Label m_lblChars; + private System.Windows.Forms.Label m_lblIndex; + private System.Windows.Forms.Label m_lblSelChars; + private KeePass.UI.SecureTextBoxEx m_tbSelected; + private System.Windows.Forms.CheckBox m_cbHideChars; + private System.Windows.Forms.Panel m_pnlSelect; + private System.Windows.Forms.Panel m_pnlBottom; + private System.Windows.Forms.Panel m_pnlBottomRight; + private System.Windows.Forms.Panel m_pnlTop; + private System.Windows.Forms.Panel m_pnlTopLeft; + private System.Windows.Forms.Panel m_pnlLeft; + private System.Windows.Forms.Panel m_pnlRight; + private System.Windows.Forms.Panel m_pnlMiddleTopSpacer; + } +} \ No newline at end of file diff --git a/src/KeePass/Forms/CharPickerForm.cs b/src/KeePass/Forms/CharPickerForm.cs new file mode 100644 index 0000000..e7fb155 --- /dev/null +++ b/src/KeePass/Forms/CharPickerForm.cs @@ -0,0 +1,351 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2023 Dominik Reichl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using KeePass.App; +using KeePass.App.Configuration; +using KeePass.Native; +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Security; +using KeePassLib.Utility; + +using NativeLib = KeePassLib.Native.NativeLib; + +namespace KeePass.Forms +{ + public partial class CharPickerForm : Form + { + private ProtectedString m_psWord = null; + private ProtectedString m_psSelected = ProtectedString.Empty; + + private List

Redirecting to +help start page...