diff -Nru keepass2-2.16+dfsg/Build/KeePassLib_Distrib/KeePassLib.xml keepass2-2.18+dfsg/Build/KeePassLib_Distrib/KeePassLib.xml --- keepass2-2.16+dfsg/Build/KeePassLib_Distrib/KeePassLib.xml 2011-07-12 08:01:04.000000000 +0000 +++ keepass2-2.18+dfsg/Build/KeePassLib_Distrib/KeePassLib.xml 2012-01-05 09:30:12.000000000 +0000 @@ -134,11 +134,6 @@ Interface to a user key, like a password, key file data, etc. - - - Clear the key and securely erase all security-critical information. - - Get key data. Querying this property is fast (it returns a @@ -202,11 +197,6 @@ Construct a user account key. - - - Clear the key and securely erase all security-critical information. - - Get key data. Querying this property is fast (it returns a @@ -296,6 +286,13 @@ 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. + + Class containing self-test methods. @@ -353,17 +350,6 @@ Construct a new, empty key object. - - - Deconstructor, clears up the key. - - - - - Clears the key. This function also erases all previously stored - user key data objects. - - Add a user key. @@ -450,24 +436,15 @@ Represents an in-memory encrypted string. + ProtectedString objects are immutable and thread-safe. Construct a new protected string object. Protection is - disabled by default! You need to call the - EnableProtection member function in order to - enable the protection, if you wish the string to be protected. + disabled. - - - Construct a new in-memory encrypted string object. - - 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. - Construct a new protected string. The string is initialized @@ -488,17 +465,8 @@ 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. - - - - Construct a new protected string. The string is initialized - to the value passed in the pbTemplate protected string. - - The initial string value. This - parameter won't be modified. Must not be null. - Thrown if the input - parameter is null. + UTF-8 byte array. This parameter won't be modified; the caller + is responsible for clearing it. @@ -512,38 +480,11 @@ Thrown if the input parameter is null. - - - Clear the string. Doesn't change the protection level. - - - - - Change the protection level (protect or don't protect). Note: you - only need to call this function if you really want to change the - protection. If you specified the protection flag in the constructor, - and don't want to change it, you don't need to call this function. - - If true, the string will be protected - (encrypted in-memory). Otherwise the string will be stored in - plain-text in the process memory. - - - - Assign a new string value to the object. - - New string. The string must not contain - a null terminator. - Thrown if the input - parameter is null. - Thrown if the new string - contains a null terminator. - Convert the protected string to a normal string object. Be careful with this function, the returned string object - isn't protected any more and stored in plain-text in the + isn't protected anymore and stored in plain-text in the process memory. Plain-text string. Is never null. @@ -559,12 +500,7 @@ Read the protected string and return it protected with a sequence - of bytes generated by a random stream. The object's data will be - invisible in process memory only if the object has been initialized - using a XorredBuffer. If no XorredBuffer has been used - or the string has been read once already (in plain-text), the - operation won't be secure and the protected string will be visible - in process memory. + of bytes generated by a random stream. Random number source. Protected string. @@ -573,62 +509,34 @@ - A flag specifying whether the ProtectedString object has turned on - in-memory protection or not. - - - - - A value specifying whether the ProtectedString object is currently - in-memory protected or not. This flag can be different than - IsProtected: if a XorredBuffer is used, the IsProtected - flag represents the memory protection flag, but not the actual protection. - In this case use IsViewable, which returns true if a - XorredBuffer is currently in use. + A flag specifying whether the ProtectedString object + has turned on in-memory protection or not. Represents a protected binary, i.e. a byte array that is encrypted - in-memory. + in memory. A ProtectedBinary object is immutable and + thread-safe. Construct a new, empty protected binary data object. Protection - is disabled by default! You need to call the - EnableProtection member function to enable the protection - manually, if you wish the data to be protected. - - - - - Construct a new, empty protected binary data object. + is disabled. - If this parameter is true, - the data will be encrypted in-memory. If it is false, the - data is stored in plain-text in the process memory. Construct a new protected binary data object. If this paremeter is true, - the data will be encrypted in-memory. If it is false, the + the data will be encrypted in memory. If it is false, the data is stored in plain-text in the process memory. - Initial value of the protected - object. The input parameter is not modified. - - - - Construct a new protected binary data object. Copy the data from - an existing object. - - Existing ProtectedBinary object, - which is used to initialize the new object. This parameter must - not be null. - Thrown if the input - parameter is null. + 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. @@ -641,40 +549,12 @@ Thrown if the input parameter is null. - - - Clear the protected data object. Doesn't change the protection level. - - - - - Change the protection level (protect or don't protect). Note: you - only need to call this function if you really want to change the - protection. If you specified the protection flag in the constructor, - and don't want to change it, you don't need to call this function. - - If true, the data will be protected - (encrypted in-memory). Otherwise the data will be stored in - plain-text in the process memory. - - - - Set protected data. This function also clears the internal - XorredBuffer object. - - Data to store in the protected object. The input - byte array will not be modified, the data is copied to an internal - buffer of the protected object. This parameter must not be null; - if you want to clear the object, call the Clear member - function. - Thrown if the input - parameter is null. - - Get 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 - applications. Make sure that your clear it properly after usage. + 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. @@ -682,12 +562,7 @@ Read the protected data and return it protected with a sequence - of bytes generated by a random stream. The object's data will be - invisible in process memory only if the object has been initialized - using a XorredBuffer. If no XorredBuffer has been used - or the binary has been read once already (in plain-text), the - operation won't be secure and the protected string will be visible - in process memory. + of bytes generated by a random stream. Random number source. Protected data. @@ -696,18 +571,8 @@ - A flag specifying whether the ProtectedBinary object has turned on - in-memory protection or not. - - - - - A value specifying whether the ProtectedString object is currently - in-memory protected or not. This flag can be different than - IsProtected: if a XorredBuffer is used, the IsProtected - flag represents the memory protection flag, but not the actual protection. - In this case use IsViewable, which returns true if a - XorredBuffer is currently in use. + A flag specifying whether the ProtectedBinary object has + turned on in-memory protection or not. @@ -816,6 +681,12 @@ '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 @@ -906,6 +777,12 @@ 'The selected file appears to be an old format'. + + + Look up a localized string similar to + 'Please try it again in a few seconds.'. + + Look up a localized string similar to @@ -1035,11 +912,11 @@ 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. + 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 + Thrown if is null. @@ -1276,11 +1153,19 @@ Returns true, if the operation completed successfully, otherwise false. - + - Search this group and all groups in the current one for entries. + Search this group and all subgroups for entries. - Specifies the search method. + Specifies the search method. + Entry list in which the search results will + be stored. + + + + Search this group and all subgroups for entries. + + Specifies the search method. Entry list in which the search results will be stored. @@ -1520,8 +1405,8 @@ Represents an object that is encrypted using a XOR pad until - it is read. The key XOR pad can be changed without revealing the - protected data in process memory. + it is read. XorredBuffer objects are immutable and + thread-safe. @@ -1530,10 +1415,12 @@ and a XOR pad that decrypts the protected data. The byte array must have the same size as the byte array. + The XorredBuffer object takes ownership of the two byte + arrays, i.e. the caller must not use or modify them afterwards. Protected data (XOR pad applied). - XOR pad that is used to decrypt the - parameter. + XOR pad that can be used to decrypt the + parameter. Thrown if one of the input parameters is null. Thrown if the byte arrays are @@ -1541,40 +1428,11 @@ - Decrypt the buffer. The XorredBuffer protection is useless - after you used this method. The object cannot be re-encrypted. + Get a copy of the plain-text. The caller is responsible + for clearing the byte array safely after using it. Unprotected plain-text byte array. - - - Change the protection key for this XorredBuffer object. - The data will first be decrypted using the old key and then - re-encrypted using the new key. This operation doesn't reveal - the plain-text in the process memory. - - New protection pad. Must contain exactly - the same number of bytes as the length of the currently protected data. - Use the Length property of the XorredBuffer to query - the data length and pass a correct number of bytes to ChangeKey. - New protected data (encrypted using the new XOR pad). - Thrown if the input - parameter is null. - Thrown if the input - byte array doesn't have the correct size. - - - - XOR all bytes in a data buffer with a pad. Both byte arrays must - be of the same size. - - Data to be protected. - XOR pad. - Thrown if one of the - parameters is null. - Thrown if the length of - the data array and the pad aren't equal. - Length of the protected data in bytes. @@ -1731,6 +1589,35 @@ Virtual identifier -- represents the number of icons. + + + 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. + + A class representing a password entry. A password entry consists of several @@ -1953,11 +1840,6 @@ Master password / passphrase as provided by the user. - - - Clear the key and securely erase all security-critical information. - - Get the password as protected string. @@ -2240,11 +2122,6 @@ Key files as provided by the user. - - - Clear the key and securely erase all security-critical information. - - Create a new, random key-file. @@ -2335,6 +2212,18 @@ default system directory separator character is used. Path having a directory separator as last character. + + + Get the host component of an 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. + + Generate HMAC-based one-time passwords as specified in RFC 4226. @@ -2354,7 +2243,7 @@ Encrypt a stream. - Stream to read the plain text from. + Stream to read the plain-text from. Key to use. Initialization vector. Stream, from which the encrypted data can be read. @@ -2445,6 +2334,19 @@ 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 Mac OS. + + 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. @@ -2455,6 +2357,28 @@ 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 '%'). + + The Kdb4File class supports saving the data to various @@ -2849,8 +2773,8 @@ - URL to an XML file that contains information about the latest KeePass - available on the website. + URL to a TXT file (eventually compressed) that contains information + about the latest KeePass version available on the website. @@ -2963,6 +2887,11 @@ text matches a group/entry string. + + + Only for serialization. + + Memory protection configuration structure (for default fields). @@ -3036,6 +2965,11 @@ 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". + + Do not remember user name or password. @@ -3053,66 +2987,25 @@ - A dictionary of auto-type window/keystroke sequence pairs. + A list of auto-type associations. - Construct a new auto-type dictionary. + Construct a new auto-type associations list. - Remove all window/keystroke sequence associations. + Remove all associations. - Clone the auto-type dictionary. + Clone the auto-type associations list. New, cloned object. - - - Set a window/keystroke sequence pair. - - Name of the window. Must not be null. - Keystroke sequence for the specified - window. Must not be null. - Thrown if one of the input - parameters is null. - - - - Get a keystroke sequence associated with the specified window. - Returns null, if no sequence can be found. - - Window identifier. - Keystroke sequence associated with the specified window. - The return value is null, if no keystroke sequence has been - defined for this window yet. - Thrown if the input - parameter is null. - - - - Get a keystroke sequence associated with the specified window. - Returns an empty string (""), if no sequence can be found. - - Window identifier. - Keystroke sequence associated with the specified window. - The return value is an empty string (""), if no keystroke - sequence has been defined for this window yet. - Thrown if the input - parameter is null. - - - - Remove an auto-type entry. - - Window identifier. Must not be null. - Returns true if the entry has been removed. - Specify whether auto-type is enabled or not. @@ -3126,11 +3019,11 @@ The default keystroke sequence that is auto-typed if - no matching window is found in the Items + no matching window is found in the Associations container. - + Get all auto-type window/keystroke sequence pairs. diff -Nru keepass2-2.16+dfsg/debian/changelog keepass2-2.18+dfsg/debian/changelog --- keepass2-2.16+dfsg/debian/changelog 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/changelog 2012-01-06 07:14:04.000000000 +0000 @@ -1,3 +1,17 @@ +keepass2 (2.18+dfsg-1) unstable; urgency=low + + * New upstream release + - refresh patches + - drop upstream applied patches: + explicitly-PUT-for-webdav-writes.patch + prefer-4.0-framework-if-available.patch + * add patch to improve autotype when dealing with multiple keyboard layouts + - Thanks to amiryal for the patch + * disable initial autoupdate popup via patch + * update years in debian/copyright + + -- Julian Taylor Fri, 30 Dec 2011 15:45:59 +0100 + keepass2 (2.16+dfsg-2) unstable; urgency=medium * debian/copyright: fix dep-5 syntax errors and wrong license tags diff -Nru keepass2-2.16+dfsg/debian/copyright keepass2-2.18+dfsg/debian/copyright --- keepass2-2.16+dfsg/debian/copyright 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/copyright 2012-01-06 07:14:04.000000000 +0000 @@ -4,18 +4,18 @@ Source: http://keepass.info/ repackaged to remove icon files obtained from other password managers with non dfsg free licenses, listing in debian/README.source Files: * -Copyright: 2003-2011 Dominik Reichl +Copyright: 2003-2012 Dominik Reichl License: GPL-2+ Files: KeePassLibSD/* Copyright: 1999, 2000, 2001, Free Software Foundation, Inc 2001, Mike Krueger 2004, 2005 2006, John Reilly - 2003-2011, Dominik Reichl + 2003-2012, Dominik Reichl License: GPL-2+ Files: debian/* -Copyright: 2011, Julian Taylor +Copyright: 2011, 2012, Julian Taylor License: GPL-2+ Files: KeePass/Resources/Nuvola/* KeePass/Resources/Nuvola_Client/* KeePass/Resources/Nuvola_IL/* Translation/TrlUtil/Resources/* diff -Nru keepass2-2.16+dfsg/debian/patches/disable-autoupdate-dialog.patch keepass2-2.18+dfsg/debian/patches/disable-autoupdate-dialog.patch --- keepass2-2.16+dfsg/debian/patches/disable-autoupdate-dialog.patch 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/debian/patches/disable-autoupdate-dialog.patch 2012-01-06 07:14:04.000000000 +0000 @@ -0,0 +1,26 @@ +From: Julian Taylor +Date: Fri, 30 Dec 2011 16:32:12 +0100 +Subject: disable autoupdate dialog + +does makes not much sense for the package +Forwarded: not-needed +--- + KeePass/App/Configuration/AceApplication.cs | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/KeePass/App/Configuration/AceApplication.cs b/KeePass/App/Configuration/AceApplication.cs +index 922c750..e61c025 100644 +--- a/KeePass/App/Configuration/AceApplication.cs ++++ b/KeePass/App/Configuration/AceApplication.cs +@@ -193,8 +193,8 @@ namespace KeePass.App.Configuration + set { m_bCheckForUpdate = value; } + } + +- private bool m_bCheckForUpdateCfg = false; +- [DefaultValue(false)] ++ private bool m_bCheckForUpdateCfg = true; ++ [DefaultValue(true)] + public bool CheckForUpdateConfigured + { + get { return m_bCheckForUpdateCfg; } +-- diff -Nru keepass2-2.16+dfsg/debian/patches/do-not-use-the-non-free-icons.patch keepass2-2.18+dfsg/debian/patches/do-not-use-the-non-free-icons.patch --- keepass2-2.16+dfsg/debian/patches/do-not-use-the-non-free-icons.patch 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/patches/do-not-use-the-non-free-icons.patch 2012-01-06 07:14:04.000000000 +0000 @@ -8,7 +8,7 @@ 1 files changed, 28 insertions(+), 28 deletions(-) diff --git a/KeePass/Properties/Resources.resx b/KeePass/Properties/Resources.resx -index e13ee0f..cd9967b 100644 +index 165f24f..ec8b31b 100644 --- a/KeePass/Properties/Resources.resx +++ b/KeePass/Properties/Resources.resx @@ -416,43 +416,43 @@ @@ -142,7 +142,7 @@ ..\Resources\Images\B16x16_MenuRadio.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a -@@ -563,12 +563,12 @@ +@@ -563,13 +563,13 @@ ..\Resources\Nuvola\B16x16_KaboodleLoop.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -157,6 +157,6 @@ - ..\Resources\Images\B16x16_Imp_KasperskyPwMgr.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\Nuvola\B16x16_KGPG_Import.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - -\ No newline at end of file + + ..\Resources\Nuvola_Derived\B16x16_EditCopyLink.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a -- diff -Nru keepass2-2.16+dfsg/debian/patches/enable-local-help.patch keepass2-2.18+dfsg/debian/patches/enable-local-help.patch --- keepass2-2.16+dfsg/debian/patches/enable-local-help.patch 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/patches/enable-local-help.patch 2012-01-06 07:14:04.000000000 +0000 @@ -6,14 +6,14 @@ located as html files in "/usr/share/doc/keepass2/Chm/help/" Forwarded: not-needed --- - KeePass/App/AppHelp.cs | 12 +++++++----- - 1 files changed, 7 insertions(+), 5 deletions(-) + KeePass/App/AppHelp.cs | 19 ++++++++----------- + 1 files changed, 8 insertions(+), 11 deletions(-) diff --git a/KeePass/App/AppHelp.cs b/KeePass/App/AppHelp.cs -index 3172a33..67d6419 100644 +index e6c2d61..0400844 100644 --- a/KeePass/App/AppHelp.cs +++ b/KeePass/App/AppHelp.cs -@@ -56,7 +56,7 @@ namespace KeePass.App +@@ -58,7 +58,7 @@ namespace KeePass.App { if(m_strLocalHelpFile == null) return false; @@ -22,11 +22,16 @@ catch(Exception) { } return false; } -@@ -113,10 +113,12 @@ namespace KeePass.App +@@ -114,14 +114,13 @@ namespace KeePass.App + private static void ShowHelpLocal(string strTopic, string strSection) { Debug.Assert(m_strLocalHelpFile != null); - -- string strCmd = @"ms-its:" + m_strLocalHelpFile; +- +- // Unblock CHM file for proper display of help contents +- WinUtil.RemoveZoneIdentifier(m_strLocalHelpFile); +- +- string strCmd = "\"ms-its:" + m_strLocalHelpFile; ++ + string strCmd = @"/usr/share/doc/keepass2/Chm/help/"; if(strTopic != null) @@ -37,11 +42,13 @@ if(strSection != null) { -@@ -124,10 +126,10 @@ namespace KeePass.App +@@ -129,12 +128,10 @@ namespace KeePass.App strCmd += @"#" + strSection; } -- try { Process.Start("hh.exe", strCmd); } +- strCmd += "\""; +- +- try { Process.Start(WinUtil.LocateSystemApp("hh.exe"), strCmd); } + try { Process.Start("x-www-browser", strCmd); } catch(Exception exStart) { diff -Nru keepass2-2.16+dfsg/debian/patches/explicitly-PUT-for-webdav-writes.patch keepass2-2.18+dfsg/debian/patches/explicitly-PUT-for-webdav-writes.patch --- keepass2-2.16+dfsg/debian/patches/explicitly-PUT-for-webdav-writes.patch 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/patches/explicitly-PUT-for-webdav-writes.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -From: Julian Taylor -Date: Thu, 6 Oct 2011 21:59:57 +0200 -Subject: explicitly PUT for webdav writes - -mono does not set HttpRequets.Method to POST for writes so the changing -to from POST to PUT is not done ConfigureWebRequest leading to failed -saving and deletion of the database on the webdav storage when -transactions are enabled -Applied-Upstream: 2.17 -Bug: https://bugzilla.novell.com/show_bug.cgi?id=722581 ---- - KeePassLib/Serialization/IOConnection.cs | 11 ++++++++++- - 1 files changed, 10 insertions(+), 1 deletions(-) - -diff --git a/KeePassLib/Serialization/IOConnection.cs b/KeePassLib/Serialization/IOConnection.cs -index 5a93b76..a9b9cc9 100644 ---- a/KeePassLib/Serialization/IOConnection.cs -+++ b/KeePassLib/Serialization/IOConnection.cs -@@ -243,7 +243,16 @@ namespace KeePassLib.Serialization - - if(ioc.IsLocalFile()) return OpenWriteLocal(ioc); - -- return CreateWebClient(ioc).OpenWrite(new Uri(ioc.Path)); -+ Uri uri = new Uri(ioc.Path); -+ -+ // Mono does not set HttpWebRequest.Method to POST for writes, -+ // so one needs to set the method to PUT explicitly -+ if(NativeLib.IsUnix() && (uri.Scheme.Equals(Uri.UriSchemeHttp, -+ StrUtil.CaseIgnoreCmp) || uri.Scheme.Equals(Uri.UriSchemeHttps, -+ StrUtil.CaseIgnoreCmp))) -+ return CreateWebClient(ioc).OpenWrite(uri, WebRequestMethods.Http.Put); -+ -+ return CreateWebClient(ioc).OpenWrite(uri); - } - #else - public static Stream OpenWrite(IOConnectionInfo ioc) --- diff -Nru keepass2-2.16+dfsg/debian/patches/fix-XSL-search-path.patch keepass2-2.18+dfsg/debian/patches/fix-XSL-search-path.patch --- keepass2-2.16+dfsg/debian/patches/fix-XSL-search-path.patch 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/patches/fix-XSL-search-path.patch 2012-01-06 07:14:04.000000000 +0000 @@ -11,7 +11,7 @@ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/KeePass/App/AppDefs.cs b/KeePass/App/AppDefs.cs -index af4fae3..9f66f18 100644 +index 8d3a12b..6de99da 100644 --- a/KeePass/App/AppDefs.cs +++ b/KeePass/App/AppDefs.cs @@ -36,6 +36,8 @@ namespace KeePass.App @@ -24,7 +24,7 @@ public const string XslFileHtmlLite = "KDB4_DetailsLite.xsl"; public const string XslFileHtmlFull = "KDB4_DetailsFull.xsl"; diff --git a/KeePass/Forms/AboutForm.cs b/KeePass/Forms/AboutForm.cs -index 56d8d76..2aa25ee 100644 +index 63a72e2..2e7ff32 100644 --- a/KeePass/Forms/AboutForm.cs +++ b/KeePass/Forms/AboutForm.cs @@ -92,8 +92,7 @@ namespace KeePass.Forms diff -Nru keepass2-2.16+dfsg/debian/patches/prefer-4.0-framework-if-available.patch keepass2-2.18+dfsg/debian/patches/prefer-4.0-framework-if-available.patch --- keepass2-2.16+dfsg/debian/patches/prefer-4.0-framework-if-available.patch 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/patches/prefer-4.0-framework-if-available.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -From: Julian Taylor -Date: Mon, 20 Jun 2011 15:20:47 +0200 -Subject: prefer 4.0 framework if available - -when compiled for 4.0 it will not run with 2.0 -Forwarded: not-needed ---- - Ext/KeePass.exe.config | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/Ext/KeePass.exe.config b/Ext/KeePass.exe.config -index ecfec22..59ed454 100644 ---- a/Ext/KeePass.exe.config -+++ b/Ext/KeePass.exe.config -@@ -1,7 +1,7 @@ - - -- - -+ - - - --- diff -Nru keepass2-2.16+dfsg/debian/patches/remove-ToolsVersion-3.5.patch keepass2-2.18+dfsg/debian/patches/remove-ToolsVersion-3.5.patch --- keepass2-2.16+dfsg/debian/patches/remove-ToolsVersion-3.5.patch 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/patches/remove-ToolsVersion-3.5.patch 2012-01-06 07:14:04.000000000 +0000 @@ -9,7 +9,7 @@ 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/KeePass/KeePass.csproj b/KeePass/KeePass.csproj -index 5ad0023..b32ac7e 100644 +index 3bcc038..73891d6 100644 --- a/KeePass/KeePass.csproj +++ b/KeePass/KeePass.csproj @@ -1,4 +1,4 @@ diff -Nru keepass2-2.16+dfsg/debian/patches/series keepass2-2.18+dfsg/debian/patches/series --- keepass2-2.16+dfsg/debian/patches/series 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/patches/series 2012-01-06 07:14:04.000000000 +0000 @@ -4,6 +4,6 @@ skip-sgen-run-during-build.patch fix-XSL-search-path.patch remove-ToolsVersion-3.5.patch -prefer-4.0-framework-if-available.patch enable-local-help.patch -explicitly-PUT-for-webdav-writes.patch +work-around-issues-with-autotype-and-keyboard-layout.patch +disable-autoupdate-dialog.patch diff -Nru keepass2-2.16+dfsg/debian/patches/skip-sgen-run-during-build.patch keepass2-2.18+dfsg/debian/patches/skip-sgen-run-during-build.patch --- keepass2-2.16+dfsg/debian/patches/skip-sgen-run-during-build.patch 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/patches/skip-sgen-run-during-build.patch 2012-01-06 07:14:04.000000000 +0000 @@ -4,21 +4,20 @@ Forwarded: not-needed --- - KeePass/KeePass.csproj | 5 +---- - 1 files changed, 1 insertions(+), 4 deletions(-) + KeePass/KeePass.csproj | 3 --- + 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/KeePass/KeePass.csproj b/KeePass/KeePass.csproj -index 68c0f5a..5ad0023 100644 +index 7ee2266..3bcc038 100644 --- a/KeePass/KeePass.csproj +++ b/KeePass/KeePass.csproj -@@ -1202,7 +1202,4 @@ +@@ -1241,7 +1241,4 @@ --> - -- "$(FrameworkSDKDir)bin\sgen.exe" /assembly:"$(TargetPath)" /force /nologo /compiler:/keycontainer:VS_KEY_E6D8E2B3F89DA59B /compiler:/delaysign- +- "$(FrameworkSDKDir)bin\sgen.exe" /assembly:"$(TargetPath)" /force /nologo /compiler:/keycontainer:VS_KEY_33430356D8D7D1B8 /compiler:/delaysign- - -- + \ No newline at end of file -+ -- diff -Nru keepass2-2.16+dfsg/debian/patches/use-installed-ico-files.patch keepass2-2.18+dfsg/debian/patches/use-installed-ico-files.patch --- keepass2-2.16+dfsg/debian/patches/use-installed-ico-files.patch 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/patches/use-installed-ico-files.patch 2012-01-06 07:14:04.000000000 +0000 @@ -9,12 +9,14 @@ Forwarded: not-needed --- KeePass/Forms/AboutForm.cs | 4 ++-- + KeePass/Forms/AutoTypeCtxForm.cs | 2 +- KeePass/Forms/CharPickerForm.cs | 2 +- KeePass/Forms/ColumnsForm.cs | 2 +- KeePass/Forms/DataEditorForm.cs | 2 +- KeePass/Forms/DataViewerForm.cs | 2 +- KeePass/Forms/DatabaseOperationsForm.cs | 2 +- KeePass/Forms/DatabaseSettingsForm.cs | 2 +- + KeePass/Forms/DuplicationForm.cs | 2 +- KeePass/Forms/EcasTriggerForm.cs | 2 +- KeePass/Forms/EcasTriggersForm.cs | 2 +- KeePass/Forms/EditAutoTypeItemForm.cs | 2 +- @@ -47,15 +49,14 @@ KeePass/Forms/SingleLineEditForm.cs | 2 +- KeePass/Forms/StatusLoggerForm.cs | 2 +- KeePass/Forms/TanWizardForm.cs | 2 +- + KeePass/Forms/UpdateCheckForm.cs | 2 +- KeePass/Forms/UrlSchemeForm.cs | 2 +- KeePass/Forms/UrlSchemesForm.cs | 2 +- - 41 files changed, 47 insertions(+), 47 deletions(-) + 44 files changed, 50 insertions(+), 50 deletions(-) -diff --git a/KeePass/Forms/AboutForm.cs b/KeePass/Forms/AboutForm.cs -index cb405c7..56d8d76 100644 --- a/KeePass/Forms/AboutForm.cs +++ b/KeePass/Forms/AboutForm.cs -@@ -56,11 +56,11 @@ namespace KeePass.Forms +@@ -56,11 +56,11 @@ string strTitle = PwDefs.ProductName; string strDesc = KPRes.Version + " " + PwDefs.VersionString; @@ -67,13 +68,22 @@ - this.Icon = Properties.Resources.KeePass; + this.Icon = new Icon("/usr/share/keepass2/KeePass.ico"); - m_lvComponents.Columns.Add(KPRes.Components, 100, HorizontalAlignment.Left); + m_lvComponents.Columns.Add(KPRes.Component, 100, HorizontalAlignment.Left); m_lvComponents.Columns.Add(KPRes.Version, 100, HorizontalAlignment.Left); -diff --git a/KeePass/Forms/CharPickerForm.cs b/KeePass/Forms/CharPickerForm.cs -index 02386c1..202e84d 100644 +--- a/KeePass/Forms/AutoTypeCtxForm.cs ++++ b/KeePass/Forms/AutoTypeCtxForm.cs +@@ -70,7 +70,7 @@ + + m_lblText.Text = KPRes.AutoTypeEntrySelectionDescLong; + this.Text = KPRes.AutoTypeEntrySelection; +- this.Icon = Properties.Resources.KeePass; ++ this.Icon = new Icon("/usr/share/keepass2/KeePass.ico"); + + string strRect = Program.Config.UI.AutoTypeCtxRect; + if(strRect.Length > 0) UIUtil.SetWindowScreenRect(this, strRect); --- a/KeePass/Forms/CharPickerForm.cs +++ b/KeePass/Forms/CharPickerForm.cs -@@ -105,7 +105,7 @@ namespace KeePass.Forms +@@ -106,7 +106,7 @@ m_fontChars = FontUtil.CreateFont("Tahoma", 8.25f, FontStyle.Bold); @@ -82,11 +92,9 @@ this.Text = KPRes.PickCharacters + " - " + PwDefs.ShortProductName; m_secWord.Attach(m_tbSelected, OnSelectedTextChangedEx, true); -diff --git a/KeePass/Forms/ColumnsForm.cs b/KeePass/Forms/ColumnsForm.cs -index e7ae02f..0fba326 100644 --- a/KeePass/Forms/ColumnsForm.cs +++ b/KeePass/Forms/ColumnsForm.cs -@@ -55,7 +55,7 @@ namespace KeePass.Forms +@@ -57,7 +57,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_View_Detailed, KPRes.ConfigureColumns, KPRes.ConfigureColumnsDesc); @@ -95,11 +103,9 @@ this.Text = KPRes.ConfigureColumns; int nWidth = (m_lvColumns.ClientRectangle.Width - -diff --git a/KeePass/Forms/DataEditorForm.cs b/KeePass/Forms/DataEditorForm.cs -index 7a4656c..224faeb 100644 --- a/KeePass/Forms/DataEditorForm.cs +++ b/KeePass/Forms/DataEditorForm.cs -@@ -92,7 +92,7 @@ namespace KeePass.Forms +@@ -92,7 +92,7 @@ GlobalWindowManager.AddWindow(this); @@ -108,11 +114,9 @@ this.DoubleBuffered = true; string strRect = Program.Config.UI.DataEditorRect; -diff --git a/KeePass/Forms/DataViewerForm.cs b/KeePass/Forms/DataViewerForm.cs -index 35995c6..6431f1c 100644 --- a/KeePass/Forms/DataViewerForm.cs +++ b/KeePass/Forms/DataViewerForm.cs -@@ -71,7 +71,7 @@ namespace KeePass.Forms +@@ -71,7 +71,7 @@ GlobalWindowManager.AddWindow(this); @@ -121,11 +125,9 @@ m_tslViewer.Text = KPRes.ShowIn + ":"; m_tslEncoding.Text = KPRes.Encoding + ":"; -diff --git a/KeePass/Forms/DatabaseOperationsForm.cs b/KeePass/Forms/DatabaseOperationsForm.cs -index 6353158..96dfcf1 100644 --- a/KeePass/Forms/DatabaseOperationsForm.cs +++ b/KeePass/Forms/DatabaseOperationsForm.cs -@@ -61,7 +61,7 @@ namespace KeePass.Forms +@@ -61,7 +61,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_Package_Settings, KPRes.DatabaseMaintenance, KPRes.DatabaseMaintenanceDesc); @@ -134,11 +136,9 @@ this.Text = KPRes.DatabaseMaintenance; m_numHistoryDays.Value = m_pwDatabase.MaintenanceHistoryDays; -diff --git a/KeePass/Forms/DatabaseSettingsForm.cs b/KeePass/Forms/DatabaseSettingsForm.cs -index c386771..bc1ef23 100644 --- a/KeePass/Forms/DatabaseSettingsForm.cs +++ b/KeePass/Forms/DatabaseSettingsForm.cs -@@ -77,7 +77,7 @@ namespace KeePass.Forms +@@ -78,7 +78,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_Ark, KPRes.DatabaseSettings, KPRes.DatabaseSettingsDesc); @@ -147,11 +147,20 @@ m_bInitializing = true; -diff --git a/KeePass/Forms/EcasTriggerForm.cs b/KeePass/Forms/EcasTriggerForm.cs -index d8bc8c4..8b76f82 100644 +--- a/KeePass/Forms/DuplicationForm.cs ++++ b/KeePass/Forms/DuplicationForm.cs +@@ -54,7 +54,7 @@ + { + GlobalWindowManager.AddWindow(this); + +- this.Icon = Properties.Resources.KeePass; ++ this.Icon = new Icon("/usr/share/keepass2/KeePass.ico"); + + FontUtil.AssignDefaultBold(m_cbAppendCopy); + FontUtil.AssignDefaultBold(m_cbFieldRefs); --- a/KeePass/Forms/EcasTriggerForm.cs +++ b/KeePass/Forms/EcasTriggerForm.cs -@@ -67,7 +67,7 @@ namespace KeePass.Forms +@@ -67,7 +67,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_Run, strTitle, strDesc); this.Text = strTitle; @@ -160,11 +169,9 @@ m_lvEvents.SmallImageList = m_ilIcons; m_lvConditions.SmallImageList = m_ilIcons; -diff --git a/KeePass/Forms/EcasTriggersForm.cs b/KeePass/Forms/EcasTriggersForm.cs -index a5222b7..e0f3b36 100644 --- a/KeePass/Forms/EcasTriggersForm.cs +++ b/KeePass/Forms/EcasTriggersForm.cs -@@ -82,7 +82,7 @@ namespace KeePass.Forms +@@ -82,7 +82,7 @@ Properties.Resources.B48x48_Make_KDevelop, KPRes.Triggers, KPRes.TriggersDesc); this.Text = KPRes.Triggers; @@ -173,11 +180,9 @@ int nWidth = (m_lvTriggers.ClientSize.Width - UIUtil.GetVScrollBarWidth() - 1); m_lvTriggers.Columns.Add(KPRes.Triggers, nWidth); -diff --git a/KeePass/Forms/EditAutoTypeItemForm.cs b/KeePass/Forms/EditAutoTypeItemForm.cs -index f6f65b0..9683773 100644 --- a/KeePass/Forms/EditAutoTypeItemForm.cs +++ b/KeePass/Forms/EditAutoTypeItemForm.cs -@@ -118,7 +118,7 @@ namespace KeePass.Forms +@@ -121,7 +121,7 @@ KPRes.ConfigureKeystrokeSeqDesc); } @@ -186,24 +191,20 @@ UIUtil.EnableAutoCompletion(m_cmbWindow, false); -diff --git a/KeePass/Forms/EditStringForm.cs b/KeePass/Forms/EditStringForm.cs -index e8acc06..e76a0fa 100644 --- a/KeePass/Forms/EditStringForm.cs +++ b/KeePass/Forms/EditStringForm.cs -@@ -94,7 +94,7 @@ namespace KeePass.Forms +@@ -93,7 +93,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_Font, strTitle, strDesc); - this.Icon = Properties.Resources.KeePass; + this.Icon = new Icon("/usr/share/keepass2/KeePass.ico"); - m_clrNormalBackground = m_cmbStringName.BackColor; - -diff --git a/KeePass/Forms/EntropyForm.cs b/KeePass/Forms/EntropyForm.cs -index aa53f6b..33b808e 100644 + UIUtil.EnableAutoCompletion(m_cmbStringName, true); + UIUtil.PrepareStandardMultilineControl(m_richStringValue, true, true); --- a/KeePass/Forms/EntropyForm.cs +++ b/KeePass/Forms/EntropyForm.cs -@@ -71,7 +71,7 @@ namespace KeePass.Forms +@@ -71,7 +71,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_Binary, KPRes.EntropyTitle, KPRes.EntropyDesc); @@ -212,11 +213,9 @@ this.Text = KPRes.EntropyTitle; UpdateUIState(); -diff --git a/KeePass/Forms/EntryListForm.cs b/KeePass/Forms/EntryListForm.cs -index c260656..2eed07e 100644 --- a/KeePass/Forms/EntryListForm.cs +++ b/KeePass/Forms/EntryListForm.cs -@@ -87,7 +87,7 @@ namespace KeePass.Forms +@@ -87,7 +87,7 @@ m_imgIcon, m_strTitle, m_strDescShort); m_lblText.Text = m_strDescLong; this.Text = m_strTitle; @@ -225,11 +224,9 @@ if(m_ilIcons != null) m_lvEntries.SmallImageList = m_ilIcons; else m_ilIcons = new ImageList(); -diff --git a/KeePass/Forms/EntryReportForm.cs b/KeePass/Forms/EntryReportForm.cs -index 469b413..c805245 100644 --- a/KeePass/Forms/EntryReportForm.cs +++ b/KeePass/Forms/EntryReportForm.cs -@@ -51,7 +51,7 @@ namespace KeePass.Forms +@@ -51,7 +51,7 @@ private void OnFormLoad(object sender, EventArgs e) { @@ -238,11 +235,9 @@ if(!string.IsNullOrEmpty(m_strTitle)) this.Text = m_strTitle; else m_strTitle = PwDefs.ShortProductName; -diff --git a/KeePass/Forms/ExchangeDataForm.cs b/KeePass/Forms/ExchangeDataForm.cs -index 869abc5..dfaf4bb 100644 --- a/KeePass/Forms/ExchangeDataForm.cs +++ b/KeePass/Forms/ExchangeDataForm.cs -@@ -98,7 +98,7 @@ namespace KeePass.Forms +@@ -98,7 +98,7 @@ Properties.Resources.B48x48_Folder_Download); BannerFactory.CreateBannerEx(this, m_bannerImage, bmpBanner, strWndTitle, strWndDesc); @@ -251,11 +246,9 @@ this.Text = strWndTitle; -diff --git a/KeePass/Forms/FieldRefForm.cs b/KeePass/Forms/FieldRefForm.cs -index 2ce5e06..a2842fc 100644 --- a/KeePass/Forms/FieldRefForm.cs +++ b/KeePass/Forms/FieldRefForm.cs -@@ -68,7 +68,7 @@ namespace KeePass.Forms +@@ -68,7 +68,7 @@ GlobalWindowManager.AddWindow(this); @@ -263,12 +256,10 @@ + this.Icon = new Icon("/usr/share/keepass2/KeePass.ico"); UIUtil.SetExplorerTheme(m_lvEntries.Handle); - -diff --git a/KeePass/Forms/FileBrowserForm.cs b/KeePass/Forms/FileBrowserForm.cs -index a75cf76..9b0d31c 100644 + if(UISystemFonts.ListFont != null) --- a/KeePass/Forms/FileBrowserForm.cs +++ b/KeePass/Forms/FileBrowserForm.cs -@@ -93,7 +93,7 @@ namespace KeePass.Forms +@@ -93,7 +93,7 @@ { GlobalWindowManager.AddWindow(this); @@ -277,11 +268,9 @@ this.Text = m_strTitle; m_nIconDim = m_tvFolders.ItemHeight; -diff --git a/KeePass/Forms/GroupForm.cs b/KeePass/Forms/GroupForm.cs -index 969c788..1c0716a 100644 --- a/KeePass/Forms/GroupForm.cs +++ b/KeePass/Forms/GroupForm.cs -@@ -66,7 +66,7 @@ namespace KeePass.Forms +@@ -66,7 +66,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_Folder_Txt, KPRes.EditGroup, KPRes.EditGroupDesc); @@ -290,11 +279,9 @@ UIUtil.SetButtonImage(m_btnAutoTypeEdit, Properties.Resources.B16x16_Wizard, true); -diff --git a/KeePass/Forms/HelpSourceForm.cs b/KeePass/Forms/HelpSourceForm.cs -index 85265b4..2e5411e 100644 --- a/KeePass/Forms/HelpSourceForm.cs +++ b/KeePass/Forms/HelpSourceForm.cs -@@ -47,7 +47,7 @@ namespace KeePass.Forms +@@ -47,7 +47,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_Folder_Download, KPRes.HelpSourceSelection, KPRes.HelpSourceSelectionDesc); @@ -303,11 +290,9 @@ this.Text = KPRes.HelpSourceSelection; FontUtil.AssignDefaultBold(m_radioLocal); -diff --git a/KeePass/Forms/IOConnectionForm.cs b/KeePass/Forms/IOConnectionForm.cs -index 2668a19..65d530a 100644 --- a/KeePass/Forms/IOConnectionForm.cs +++ b/KeePass/Forms/IOConnectionForm.cs -@@ -75,7 +75,7 @@ namespace KeePass.Forms +@@ -75,7 +75,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, KeePass.Properties.Resources.B48x48_WWW, strTitle, strDesc); @@ -316,11 +301,9 @@ this.Text = strTitle; FontUtil.AssignDefaultBold(m_lblUrl); -diff --git a/KeePass/Forms/IconPickerForm.cs b/KeePass/Forms/IconPickerForm.cs -index 70bdafc..ec3596d 100644 --- a/KeePass/Forms/IconPickerForm.cs +++ b/KeePass/Forms/IconPickerForm.cs -@@ -79,7 +79,7 @@ namespace KeePass.Forms +@@ -79,7 +79,7 @@ GlobalWindowManager.AddWindow(this); @@ -329,11 +312,9 @@ FontUtil.AssignDefaultBold(m_radioStandard); FontUtil.AssignDefaultBold(m_radioCustom); -diff --git a/KeePass/Forms/ImportCsvForm.cs b/KeePass/Forms/ImportCsvForm.cs -index 766c60f..51e8aa9 100644 --- a/KeePass/Forms/ImportCsvForm.cs +++ b/KeePass/Forms/ImportCsvForm.cs -@@ -69,7 +69,7 @@ namespace KeePass.Forms +@@ -69,7 +69,7 @@ GlobalWindowManager.AddWindow(this); @@ -342,11 +323,9 @@ m_bBlockChangedEvent = true; -diff --git a/KeePass/Forms/ImportMethodForm.cs b/KeePass/Forms/ImportMethodForm.cs -index 67c266a..d9916b6 100644 --- a/KeePass/Forms/ImportMethodForm.cs +++ b/KeePass/Forms/ImportMethodForm.cs -@@ -56,7 +56,7 @@ namespace KeePass.Forms +@@ -56,7 +56,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_Folder_Download, KPRes.ImportBehavior, KPRes.ImportBehaviorDesc); @@ -355,11 +334,9 @@ this.Text = KPRes.ImportBehavior; -diff --git a/KeePass/Forms/InternalBrowserForm.cs b/KeePass/Forms/InternalBrowserForm.cs -index f8fc293..428a4cb 100644 --- a/KeePass/Forms/InternalBrowserForm.cs +++ b/KeePass/Forms/InternalBrowserForm.cs -@@ -53,7 +53,7 @@ namespace KeePass.Forms +@@ -53,7 +53,7 @@ { GlobalWindowManager.AddWindow(this); @@ -368,11 +345,9 @@ if(m_strInitialUrl.Length > 0) m_webBrowser.Navigate(m_strInitialUrl); -diff --git a/KeePass/Forms/KeyCreationForm.cs b/KeePass/Forms/KeyCreationForm.cs -index d963bf1..05948b7 100644 --- a/KeePass/Forms/KeyCreationForm.cs +++ b/KeePass/Forms/KeyCreationForm.cs -@@ -79,7 +79,7 @@ namespace KeePass.Forms +@@ -78,7 +78,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_KGPG_Sign, KPRes.CreateMasterKey, m_ioInfo.GetDisplayName()); @@ -381,11 +356,9 @@ this.Text = KPRes.CreateMasterKey; FontUtil.AssignDefaultBold(m_cbPassword); -diff --git a/KeePass/Forms/KeyPromptForm.cs b/KeePass/Forms/KeyPromptForm.cs -index f261e5d..e3a89a4 100644 --- a/KeePass/Forms/KeyPromptForm.cs +++ b/KeePass/Forms/KeyPromptForm.cs -@@ -115,7 +115,7 @@ namespace KeePass.Forms +@@ -115,7 +115,7 @@ string strBannerDesc = WinUtil.CompactPath(m_ioInfo.Path, 45); BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_KGPG_Key2, strBannerTitle, strBannerDesc); @@ -394,11 +367,9 @@ FontUtil.AssignDefaultBold(m_cbPassword); FontUtil.AssignDefaultBold(m_cbKeyFile); -diff --git a/KeePass/Forms/LanguageForm.cs b/KeePass/Forms/LanguageForm.cs -index 4cf052f..1d9d009 100644 --- a/KeePass/Forms/LanguageForm.cs +++ b/KeePass/Forms/LanguageForm.cs -@@ -54,7 +54,7 @@ namespace KeePass.Forms +@@ -54,7 +54,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_Keyboard_Layout, KPRes.SelectLanguage, KPRes.SelectLanguageDesc); @@ -407,11 +378,9 @@ this.Text = KPRes.SelectLanguage; int nWidth = m_lvLanguages.ClientRectangle.Width / 4; -diff --git a/KeePass/Forms/MainForm.cs b/KeePass/Forms/MainForm.cs -index c4cc042..3192dac 100644 --- a/KeePass/Forms/MainForm.cs +++ b/KeePass/Forms/MainForm.cs -@@ -126,7 +126,7 @@ namespace KeePass.Forms +@@ -140,7 +140,7 @@ m_strNeverExpiresText = KPRes.NeverExpires; this.Text = PwDefs.ProductName; @@ -420,11 +389,9 @@ m_imgFileSaveEnabled = Properties.Resources.B16x16_FileSave; m_imgFileSaveDisabled = Properties.Resources.B16x16_FileSave_Disabled; // m_imgFileSaveAllEnabled = Properties.Resources.B16x16_File_SaveAll; -diff --git a/KeePass/Forms/MainForm_Functions.cs b/KeePass/Forms/MainForm_Functions.cs -index 8756d22..813724b 100644 --- a/KeePass/Forms/MainForm_Functions.cs +++ b/KeePass/Forms/MainForm_Functions.cs -@@ -382,12 +382,12 @@ namespace KeePass.Forms +@@ -402,12 +402,12 @@ strNtfPre.Length); Icon icoDisposable, icoAssignable; @@ -439,7 +406,7 @@ KPRes.Locked); NativeMethods.EnableWindowPeekPreview(this.Handle, false); } -@@ -397,7 +397,7 @@ namespace KeePass.Forms +@@ -417,7 +417,7 @@ strNtfText = strWindowText; Icon icoDisposable, icoAssignable; @@ -448,7 +415,7 @@ ref m_kvpIcoTrayNormal, out icoAssignable, out icoDisposable); m_ntfTray.Icon = icoAssignable; if(icoDisposable != null) icoDisposable.Dispose(); -@@ -427,7 +427,7 @@ namespace KeePass.Forms +@@ -447,7 +447,7 @@ m_docMgr.ActiveDatabase.IOConnectionInfo.Path, 63 - strNtfPre.Length); Icon icoDisposable, icoAssignable; @@ -457,7 +424,7 @@ ref m_kvpIcoTrayNormal, out icoAssignable, out icoDisposable); m_ntfTray.Icon = icoAssignable; if(icoDisposable != null) icoDisposable.Dispose(); -@@ -442,7 +442,7 @@ namespace KeePass.Forms +@@ -462,7 +462,7 @@ m_ntfTray.Text = StrUtil.CompactString3Dots(strNtfText, 63); Icon icoToDispose, icoToAssign; @@ -466,21 +433,19 @@ ref m_kvpIcoMain, out icoToAssign, out icoToDispose)) this.Icon = icoToAssign; if(icoToDispose != null) icoToDispose.Dispose(); -@@ -3377,7 +3377,7 @@ namespace KeePass.Forms +@@ -3503,7 +3503,7 @@ // wasn't fully constructed at that time yet) - if(IsFileLocked(null)) - TaskbarList.SetOverlayIcon(this, -- Properties.Resources.LockOverlay, KPRes.Locked); -+ new Icon("/usr/share/keepass2/LockOverlay.ico"), KPRes.Locked); + // if(IsFileLocked(null)) + // TaskbarList.SetOverlayIcon(this, +- // Properties.Resources.LockOverlay, KPRes.Locked); ++ // new Icon("/usr/share/keepass2/LockOverlay.ico"), KPRes.Locked); } if(Program.Config.MainWindow.MinimizeToTray) MinimizeToTray(true); -diff --git a/KeePass/Forms/OptionsForm.cs b/KeePass/Forms/OptionsForm.cs -index c0ba1d2..ed67e7d 100644 --- a/KeePass/Forms/OptionsForm.cs +++ b/KeePass/Forms/OptionsForm.cs -@@ -104,7 +104,7 @@ namespace KeePass.Forms - { +@@ -107,7 +107,7 @@ + GlobalWindowManager.AddWindow(this); - this.Icon = Properties.Resources.KeePass; @@ -488,11 +453,9 @@ Debug.Assert(m_ilIcons != null); if(m_ilIcons != null) -diff --git a/KeePass/Forms/PluginsForm.cs b/KeePass/Forms/PluginsForm.cs -index 9aa6461..6d87c22 100644 --- a/KeePass/Forms/PluginsForm.cs +++ b/KeePass/Forms/PluginsForm.cs -@@ -64,7 +64,7 @@ namespace KeePass.Forms +@@ -64,7 +64,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_BlockDevice, KPRes.Plugins, KPRes.PluginsDesc); @@ -501,11 +464,9 @@ m_cbCacheDeleteOld.Checked = Program.Config.Application.Start.PluginCacheDeleteOld; -diff --git a/KeePass/Forms/PrintForm.cs b/KeePass/Forms/PrintForm.cs -index 9f323ea..c9864bd 100644 --- a/KeePass/Forms/PrintForm.cs +++ b/KeePass/Forms/PrintForm.cs -@@ -94,7 +94,7 @@ namespace KeePass.Forms +@@ -95,7 +95,7 @@ GlobalWindowManager.AddWindow(this); @@ -514,11 +475,9 @@ CreateDialogBanner(); UIUtil.SetButtonImage(m_btnConfigPrinter, -diff --git a/KeePass/Forms/ProxyForm.cs b/KeePass/Forms/ProxyForm.cs -index 7c65533..286d830 100644 --- a/KeePass/Forms/ProxyForm.cs +++ b/KeePass/Forms/ProxyForm.cs -@@ -44,7 +44,7 @@ namespace KeePass.Forms +@@ -44,7 +44,7 @@ { GlobalWindowManager.AddWindow(this); @@ -527,11 +486,9 @@ ProxyServerType pst = Program.Config.Integration.ProxyType; if(pst == ProxyServerType.None) m_rbNoProxy.Checked = true; -diff --git a/KeePass/Forms/PwEntryForm.cs b/KeePass/Forms/PwEntryForm.cs -index b79f7a2..42e282a 100644 --- a/KeePass/Forms/PwEntryForm.cs +++ b/KeePass/Forms/PwEntryForm.cs -@@ -550,7 +550,7 @@ namespace KeePass.Forms +@@ -550,7 +550,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, KeePass.Properties.Resources.B48x48_KGPG_Sign, strTitle, strDesc); @@ -540,11 +497,9 @@ this.Text = strTitle; UIUtil.SetButtonImage(m_btnTools, -diff --git a/KeePass/Forms/PwGeneratorForm.cs b/KeePass/Forms/PwGeneratorForm.cs -index 22f0c8c..2e9043b 100644 --- a/KeePass/Forms/PwGeneratorForm.cs +++ b/KeePass/Forms/PwGeneratorForm.cs -@@ -90,7 +90,7 @@ namespace KeePass.Forms +@@ -90,7 +90,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_KGPG_Gen, KPRes.PasswordOptions, KPRes.PasswordOptionsDesc); @@ -553,24 +508,20 @@ UIUtil.SetButtonImage(m_btnProfileAdd, Properties.Resources.B16x16_FileSaveAs, false); -diff --git a/KeePass/Forms/SearchForm.cs b/KeePass/Forms/SearchForm.cs -index 9082a87..80130ca 100644 --- a/KeePass/Forms/SearchForm.cs +++ b/KeePass/Forms/SearchForm.cs -@@ -89,7 +89,7 @@ namespace KeePass.Forms +@@ -92,7 +92,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, Properties.Resources.B48x48_XMag, strTitle, KPRes.SearchDesc); - this.Icon = Properties.Resources.KeePass; + this.Icon = new Icon("/usr/share/keepass2/KeePass.ico"); - SearchParameters sp = Program.Config.Defaults.SearchParameters; - m_cbTitle.Checked = sp.SearchInTitles; -diff --git a/KeePass/Forms/SingleLineEditForm.cs b/KeePass/Forms/SingleLineEditForm.cs -index 58b7802..68fc9a6 100644 + m_cbDerefData.Text = m_cbDerefData.Text + " (" + KPRes.Slow + ")"; + --- a/KeePass/Forms/SingleLineEditForm.cs +++ b/KeePass/Forms/SingleLineEditForm.cs -@@ -73,7 +73,7 @@ namespace KeePass.Forms +@@ -73,7 +73,7 @@ BannerFactory.CreateBannerEx(this, m_bannerImage, m_imgIcon, m_strTitle, m_strDesc); @@ -579,11 +530,9 @@ this.Text = m_strTitle; m_lblLongDesc.Text = m_strLongDesc; -diff --git a/KeePass/Forms/StatusLoggerForm.cs b/KeePass/Forms/StatusLoggerForm.cs -index 86e9e95..ebb9cc7 100644 --- a/KeePass/Forms/StatusLoggerForm.cs +++ b/KeePass/Forms/StatusLoggerForm.cs -@@ -124,7 +124,7 @@ namespace KeePass.Forms +@@ -124,7 +124,7 @@ { GlobalWindowManager.AddWindow(this); @@ -592,11 +541,9 @@ this.Text = PwDefs.ShortProductName; m_pbProgress.Minimum = 0; -diff --git a/KeePass/Forms/TanWizardForm.cs b/KeePass/Forms/TanWizardForm.cs -index 5e5f8ab..7dc89c4 100644 --- a/KeePass/Forms/TanWizardForm.cs +++ b/KeePass/Forms/TanWizardForm.cs -@@ -61,7 +61,7 @@ namespace KeePass.Forms +@@ -61,7 +61,7 @@ KeePass.Properties.Resources.B48x48_Wizard, KPRes.TanWizard, KPRes.TanWizardDesc); @@ -605,11 +552,20 @@ this.Text = KPRes.TanWizard; if((m_pgStorage.Name != null) && (m_pgStorage.Name.Length > 0)) -diff --git a/KeePass/Forms/UrlSchemeForm.cs b/KeePass/Forms/UrlSchemeForm.cs -index 4ff62a8..6b88f6d 100644 +--- a/KeePass/Forms/UpdateCheckForm.cs ++++ b/KeePass/Forms/UpdateCheckForm.cs +@@ -64,7 +64,7 @@ + BannerFactory.CreateBannerEx(this, m_bannerImage, + Properties.Resources.B48x48_WWW, KPRes.UpdateCheck, + KPRes.UpdateCheckResults); +- this.Icon = Properties.Resources.KeePass; ++ this.Icon = new Icon("/usr/share/keepass2/KeePass.ico"); + this.Text = KPRes.UpdateCheck + " - " + PwDefs.ShortProductName; + + // UIUtil.SetExplorerTheme(m_lvInfo.Handle); --- a/KeePass/Forms/UrlSchemeForm.cs +++ b/KeePass/Forms/UrlSchemeForm.cs -@@ -51,7 +51,7 @@ namespace KeePass.Forms +@@ -51,7 +51,7 @@ GlobalWindowManager.AddWindow(this); @@ -618,11 +574,9 @@ this.Text = KPRes.UrlSchemeOverride; m_tbScheme.Text = m_ovr.Scheme; -diff --git a/KeePass/Forms/UrlSchemesForm.cs b/KeePass/Forms/UrlSchemesForm.cs -index eadc777..c605501 100644 --- a/KeePass/Forms/UrlSchemesForm.cs +++ b/KeePass/Forms/UrlSchemesForm.cs -@@ -54,7 +54,7 @@ namespace KeePass.Forms +@@ -54,7 +54,7 @@ GlobalWindowManager.AddWindow(this); @@ -630,5 +584,4 @@ + this.Icon = new Icon("/usr/share/keepass2/KeePass.ico"); this.Text = KPRes.UrlSchemeOverrides; - int nWidth = (m_lvOverrides.ClientSize.Width - UIUtil.GetVScrollBarWidth()) / 4; --- + UIUtil.SetExplorerTheme(m_lvOverrides.Handle); diff -Nru keepass2-2.16+dfsg/debian/patches/use-the-mono-signing-key.patch keepass2-2.18+dfsg/debian/patches/use-the-mono-signing-key.patch --- keepass2-2.16+dfsg/debian/patches/use-the-mono-signing-key.patch 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/patches/use-the-mono-signing-key.patch 2012-01-06 07:14:04.000000000 +0000 @@ -9,7 +9,7 @@ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/KeePass/KeePass.csproj b/KeePass/KeePass.csproj -index cddd7d2..68c0f5a 100644 +index 9cd0069..7ee2266 100644 --- a/KeePass/KeePass.csproj +++ b/KeePass/KeePass.csproj @@ -11,7 +11,7 @@ @@ -22,7 +22,7 @@ 2.0 diff --git a/KeePassLib/KeePassLib.csproj b/KeePassLib/KeePassLib.csproj -index a127a30..0a9c332 100644 +index 016e0c1..caeae4d 100644 --- a/KeePassLib/KeePassLib.csproj +++ b/KeePassLib/KeePassLib.csproj @@ -10,7 +10,7 @@ diff -Nru keepass2-2.16+dfsg/debian/patches/work-around-issues-with-autotype-and-keyboard-layout.patch keepass2-2.18+dfsg/debian/patches/work-around-issues-with-autotype-and-keyboard-layout.patch --- keepass2-2.16+dfsg/debian/patches/work-around-issues-with-autotype-and-keyboard-layout.patch 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/debian/patches/work-around-issues-with-autotype-and-keyboard-layout.patch 2012-01-06 07:14:04.000000000 +0000 @@ -0,0 +1,28 @@ +From: Julian Taylor +Date: Tue, 25 Oct 2011 21:08:14 +0200 +Subject: work around issues with autotype and keyboard layouts + +for some reason unicode codes works better +--- + KeePass/Util/SendInputEx.Unix.cs | 6 ++++-- + 1 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/KeePass/Util/SendInputEx.Unix.cs b/KeePass/Util/SendInputEx.Unix.cs +index e30599f..c9ee4a3 100644 +--- a/KeePass/Util/SendInputEx.Unix.cs ++++ b/KeePass/Util/SendInputEx.Unix.cs +@@ -181,9 +181,11 @@ namespace KeePass.Util + if(strString.Length == 0) return; + + if(kMod != Keys.None) +- NativeMethods.RunXDoTool(@"type '" + strString + @"'"); ++ foreach(char c in strString) ++ NativeMethods.RunXDoTool(@"key U" + ((int)c).ToString("x4")); + else +- NativeMethods.RunXDoTool(@"type --clearmodifiers '" + strString + @"'"); ++ foreach(char c in strString) ++ NativeMethods.RunXDoTool(@"key --clearmodifiers U" + ((int)c).ToString("x4")); + + ClearModifiers(ref kMod); + } +-- diff -Nru keepass2-2.16+dfsg/debian/README.Debian keepass2-2.18+dfsg/debian/README.Debian --- keepass2-2.16+dfsg/debian/README.Debian 2011-10-08 18:46:57.000000000 +0000 +++ keepass2-2.18+dfsg/debian/README.Debian 2012-01-06 07:14:04.000000000 +0000 @@ -20,5 +20,5 @@ To execute KeePass plugin like KPScript one must currently set the MONO_PATH environment variable to /usr/lib/keepass2. E.g. in Bash: - MONO_PATH="/usr/lib/keepass2${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" + MONO_PATH="/usr/lib/keepass2${MONO_PATH:+:$MONO_PATH}" export MONO_PATH diff -Nru keepass2-2.16+dfsg/Docs/Chm/default.css keepass2-2.18+dfsg/Docs/Chm/default.css --- keepass2-2.16+dfsg/Docs/Chm/default.css 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/default.css 2012-01-05 09:37:16.000000000 +0000 @@ -1,5 +1,5 @@ /* - Design Copyright (c) 2003-2011 Dominik Reichl + Design Copyright (c) 2003-2012 Dominik Reichl */ body, p, div, h1, h2, h3, h4, h5, h6, ol, ul, li, td, th, dd, dt, a { diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/autotype.html keepass2-2.18+dfsg/Docs/Chm/help/base/autotype.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/autotype.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/autotype.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Auto-Type - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/autourl.html keepass2-2.18+dfsg/Docs/Chm/help/base/autourl.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/autourl.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/autourl.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + URL Field Capabilities - KeePass @@ -142,6 +142,7 @@ cmd://{FIREFOX} "http://www.yoursite.com"
cmd://{OPERA} "http://www.yoursite.com"
cmd://{GOOGLECHROME} "http://www.yoursite.com"
+cmd://{SAFARI} "http://www.yoursite.com"
The browser placeholder will be replaced by the browser's executable path (if the browser is installed).

diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/cmdline.html keepass2-2.18+dfsg/Docs/Chm/help/base/cmdline.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/cmdline.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/cmdline.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Command Line Options - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/configuration.html keepass2-2.18+dfsg/Docs/Chm/help/base/configuration.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/configuration.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/configuration.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Configuration - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/credits.html keepass2-2.18+dfsg/Docs/Chm/help/base/credits.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/credits.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/credits.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Acknowledgements - KeePass @@ -131,7 +131,8 @@ target="_blank">CSendKeys). Bouncy Castle Developers @@ -174,11 +175,11 @@ Info  Tools Acknowledgements -

Thanks to the UPX Team for the writing the Ultimate Packer for +

Thanks to Jordan Russell for creating Inno Setup. This diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/credits_icons_license.html keepass2-2.18+dfsg/Docs/Chm/help/base/credits_icons_license.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/credits_icons_license.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/credits_icons_license.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Acknowledgements - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/disclaimer.html keepass2-2.18+dfsg/Docs/Chm/help/base/disclaimer.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/disclaimer.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/disclaimer.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Disclaimer diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/faq.html keepass2-2.18+dfsg/Docs/Chm/help/base/faq.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/faq.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/faq.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Administrative FAQ - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/faq_tech.html keepass2-2.18+dfsg/Docs/Chm/help/base/faq_tech.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/faq_tech.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/faq_tech.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Technical FAQ - KeePass @@ -81,7 +81,7 @@

  • Could you add the ... encryption algorithm to KeePass?
  • Why doesn't KeePass lock when Windows locks and a KeePass sub-dialog is open?
  • Printing creates a temporary file. Will it be erased securely?
  • -
  • Why KeePass 2.x resets in-memory protection options?
  • +
  • Why the estimated quality of a password suddenly drops?
  • @@ -154,7 +154,7 @@

    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 got administrative rights and want to do +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) @@ -513,7 +513,7 @@
    - +

    diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/fieldrefs.html keepass2-2.18+dfsg/Docs/Chm/help/base/fieldrefs.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/fieldrefs.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/fieldrefs.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Field References - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/firststeps.html keepass2-2.18+dfsg/Docs/Chm/help/base/firststeps.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/firststeps.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/firststeps.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + First Steps Tutorial - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/importexport.html keepass2-2.18+dfsg/Docs/Chm/help/base/importexport.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/importexport.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/importexport.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + File Formats - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/index.html keepass2-2.18+dfsg/Docs/Chm/help/base/index.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/index.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/index.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Help Center - KeePass @@ -56,7 +56,7 @@ -

    KeePass: Copyright © 2003-2011 Dominik Reichl. The program is OSI Certified +

    KeePass: Copyright © 2003-2012 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 diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/integration.html keepass2-2.18+dfsg/Docs/Chm/help/base/integration.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/integration.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/integration.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Integration - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/keys.html keepass2-2.18+dfsg/Docs/Chm/help/base/keys.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/keys.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/keys.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Composite Master Key - KeePass @@ -171,20 +171,18 @@ 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 +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.
    +that you don't enable this option. +Instructions on how to restore a backed up account can be found in a +Microsoft TechNet article: +How to recover a Vault corrupted by lost DPAPI keys.

    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).

    -Triggers allow you to automatically export the database when you save. Saving in -XML format provides a useful backup, but the export is in plain text, not -encrypted. See the -Trigger Examples -for more details.
    -
    Protection using user accounts is unsupported on Windows 98 / ME. diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/license_lgpl.html keepass2-2.18+dfsg/Docs/Chm/help/base/license_lgpl.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/license_lgpl.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/license_lgpl.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + LGPL License - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/multiuser.html keepass2-2.18+dfsg/Docs/Chm/help/base/multiuser.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/multiuser.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/multiuser.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Multi-User - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/placeholders.html keepass2-2.18+dfsg/Docs/Chm/help/base/placeholders.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/placeholders.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/placeholders.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Placeholders - KeePass @@ -127,6 +127,7 @@ {FIREFOX}Path of Mozilla Firefox, if installed. {OPERA}Path of Opera, if installed. {GOOGLECHROME}Path of Google Chrome, if installed. +{SAFARI}Path of Safari, if installed.
    @@ -199,6 +200,7 @@ See below. {HMACOTP}Generates a one-time password. See below. +{C:Comment}Comment; is removed. @@ -259,8 +261,8 @@
    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, '2', 'c' and 'C' -are converted to 3 down arrow keypresses.
    +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. @@ -281,8 +283,10 @@ Usage examples:

    {USERNAME}{TAB}{PICKCHARS:Password:C=5}{ENTER}
    -Types the user name, presses Tab, allows the user to pick exactly 5 characters -from the entry password, types these 5 characters, and presses 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.


    -This first types the contents of a custom entry string named "Memorable", -and presses Tab. Then the character picking dialog allows to pick exactly -one character from the password, and this character is converted to -down arrow keypresses (with one additional keypress, e.g. a '1' is converted -to two down arrow keypresses), and the focus is switched to the next control -by pressing Tab. This is repeated two more times -(the IDs are different, thus the dialog is shown two more times).
    +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}, @@ -354,7 +362,20 @@ The shared secret is the UTF-8 representation of the value of the 'HmacOtp-Secret' custom entry string field (case-sensitive), and -the counter is stored in decimal form in the 'HmacOtp-Counter' field. +the counter is stored in decimal form in the 'HmacOtp-Counter' field.
    +
    +Usage example. +Create a new entry, set its password to the {HMACOTP} +placeholder, switch to the 'Advanced' tab, add a string named +HmacOtp-Secret with value 12345678901234567890, +and add a string named HmacOtp-Counter with value 0. +When you now double-click onto the password cell of the entry in the +entry list of the main window, an OTP is copied to the +clipboard. When auto-typing, an OTP is sent as password. +Each time you perform such an action, KeePass updates the counter value. +With the secret key and counter values above, the following OTPs +are generated: 755224, 287082, 359152, 969429, 338314, ... +(more generated OTPs can be found in the example in RFC 4226). diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/pwgenerator.html keepass2-2.18+dfsg/Docs/Chm/help/base/pwgenerator.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/pwgenerator.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/pwgenerator.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Password Generator - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/repair.html keepass2-2.18+dfsg/Docs/Chm/help/base/repair.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/repair.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/repair.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Repairing Databases - KeePass @@ -62,7 +62,7 @@ -In order to use the repair functionality in KeePass ≥ 2.10, first +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. diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/secedits.html keepass2-2.18+dfsg/Docs/Chm/help/base/secedits.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/secedits.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/secedits.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Secure Edit Controls - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/security.html keepass2-2.18+dfsg/Docs/Chm/help/base/security.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/security.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/security.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Security - KeePass @@ -240,12 +240,10 @@

    This means that even if you would dump the KeePass process memory to disk, you couldn't find the passwords.

    - -By default, entry passwords are in-memory protected, the other fields not +

    For example, when you are copying a password to the clipboard, KeePass first decrypts the password field, copies it to the clipboard diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/tans.html keepass2-2.18+dfsg/Docs/Chm/help/base/tans.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/tans.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/tans.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + TAN Support - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/base/usingpws.html keepass2-2.18+dfsg/Docs/Chm/help/base/usingpws.html --- keepass2-2.16+dfsg/Docs/Chm/help/base/usingpws.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/base/usingpws.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Using Stored Passwords - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/autotype_obfuscation.html keepass2-2.18+dfsg/Docs/Chm/help/v2/autotype_obfuscation.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/autotype_obfuscation.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/autotype_obfuscation.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Two-Channel Auto-Type Obfuscation - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/dbsettings.html keepass2-2.18+dfsg/Docs/Chm/help/v2/dbsettings.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/dbsettings.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/dbsettings.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Database Settings - KeePass @@ -50,7 +50,7 @@

    @@ -93,7 +93,7 @@
    - +

    diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/entry.html keepass2-2.18+dfsg/Docs/Chm/help/v2/entry.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/entry.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/entry.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Entry Dialog - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/guioptions.html keepass2-2.18+dfsg/Docs/Chm/help/v2/guioptions.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/guioptions.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/guioptions.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + GUI Options - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/ioconnect.html keepass2-2.18+dfsg/Docs/Chm/help/v2/ioconnect.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/ioconnect.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/ioconnect.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Loading/Saving From/To URL - KeePass @@ -45,9 +45,14 @@

    In this dialog you can specify an URL, from/to which data is read/written.

    -

    By default, KeePass supports FTP and HTTP, but additional protocols might +

    By default, KeePass supports FTP, HTTP and WebDAV, +but additional protocols might be available on your system (if specific providers are installed).

    +

    The IOProtocolExt plugin adds support for +SCP, SFTP and FTPS.

    +
    diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/license.html keepass2-2.18+dfsg/Docs/Chm/help/v2/license.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/license.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/license.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + License - KeePass @@ -45,7 +45,7 @@ License terms of KeePass 2.x. -

    KeePass: Copyright © 2003-2011 Dominik Reichl.

    +

    KeePass: Copyright © 2003-2012 Dominik Reichl.

    The program is distributed under the terms of the GNU General Public License version 2 or later. The complete diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/plugins.html keepass2-2.18+dfsg/Docs/Chm/help/v2/plugins.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/plugins.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/plugins.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Plugins - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/policy.html keepass2-2.18+dfsg/Docs/Chm/help/v2/policy.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/policy.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/policy.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Application Policy - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/setup.html keepass2-2.18+dfsg/Docs/Chm/help/v2/setup.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/setup.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/setup.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Setup - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/sync.html keepass2-2.18+dfsg/Docs/Chm/help/v2/sync.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/sync.html 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/sync.html 2012-01-05 09:37:16.000000000 +0000 @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Synchronization - KeePass + + + + + + + + + +
    +Synchronization +

    Synchronization


    +Merge changes made in multiple copies of a database. +
    + +

    + +
    + + +

    +Help  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/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 an online +storage (like e.g. Amazon's S3, DigitalBucket, ...), you need the +KeePassSync +plugin. Note that you do not need KeePassSync in the other cases above +(files on a local hard disk or network share, FTP, HTTP/WebDAV, SCP, SFTP, +FTPS, ...).
    • +
    + +
    + + +

    +Synchronization  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 an 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 an 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 +Multi-User 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.
    • +
    + +
    + + +

    +Synchronization  Technical +Details

    + +

    The synchronization algorithm is rather complex and it would take +many pages to describe in detail how it's 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 version of E (see tab 'History' in +the entry dialog), i.e. the changes made in B aren't lost.
    • +
    + + + diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/translation.html keepass2-2.18+dfsg/Docs/Chm/help/v2/translation.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/translation.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/translation.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Translations - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/triggers.html keepass2-2.18+dfsg/Docs/Chm/help/v2/triggers.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/triggers.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/triggers.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Triggers - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2/version.html keepass2-2.18+dfsg/Docs/Chm/help/v2/version.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2/version.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2/version.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Compatibility - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2_dev/customize.html keepass2-2.18+dfsg/Docs/Chm/help/v2_dev/customize.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2_dev/customize.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2_dev/customize.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Customize - KeePass @@ -96,6 +96,8 @@ 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.

    For example, if you want to disable the 'Options' and 'Plugins' items in diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2_dev/plg_index.html keepass2-2.18+dfsg/Docs/Chm/help/v2_dev/plg_index.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2_dev/plg_index.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2_dev/plg_index.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Plugin Development - KeePass @@ -53,6 +53,7 @@

  • Step-by-Step Tutorial
  • Common Operations
  • Plugin Conventions
  • +
  • Update Checking
  • Can KeePass 2.x Plugins be written in Unmanaged C++?
  • PLGX Files
  • @@ -289,6 +290,80 @@
    + +

    +Exchange  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 http:// URL, but an ftp:// URL +is also acceptable.
    • +
    + +

    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 +byte order marks (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.

    + +
    +

    Info  Can diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2_dev/scr_index.html keepass2-2.18+dfsg/Docs/Chm/help/v2_dev/scr_index.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2_dev/scr_index.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2_dev/scr_index.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Scripting Introduction - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2_dev/scr_kps_index.html keepass2-2.18+dfsg/Docs/Chm/help/v2_dev/scr_kps_index.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2_dev/scr_kps_index.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2_dev/scr_kps_index.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + KPS Script Files - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/help/v2_dev/scr_sc_index.html keepass2-2.18+dfsg/Docs/Chm/help/v2_dev/scr_sc_index.html --- keepass2-2.16+dfsg/Docs/Chm/help/v2_dev/scr_sc_index.html 2011-07-12 08:05:14.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/help/v2_dev/scr_sc_index.html 2012-01-05 09:37:16.000000000 +0000 @@ -25,7 +25,7 @@ - + Single Command Operations - KeePass diff -Nru keepass2-2.16+dfsg/Docs/Chm/KeePassContents.hhc keepass2-2.18+dfsg/Docs/Chm/KeePassContents.hhc --- keepass2-2.16+dfsg/Docs/Chm/KeePassContents.hhc 2011-06-16 12:49:28.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/KeePassContents.hhc 2011-10-09 09:31:38.000000000 +0000 @@ -115,6 +115,10 @@
  • + + + +
  • diff -Nru keepass2-2.16+dfsg/Docs/Chm/KeePass.hhp keepass2-2.18+dfsg/Docs/Chm/KeePass.hhp --- keepass2-2.16+dfsg/Docs/Chm/KeePass.hhp 2011-06-16 12:48:54.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/Chm/KeePass.hhp 2011-10-09 09:31:54.000000000 +0000 @@ -44,6 +44,7 @@ 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 diff -Nru keepass2-2.16+dfsg/Docs/History.txt keepass2-2.18+dfsg/Docs/History.txt --- keepass2-2.16+dfsg/Docs/History.txt 2011-07-11 15:28:04.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/History.txt 2012-01-04 18:49:46.000000000 +0000 @@ -1,3 +1,213 @@ +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 IO 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 diff -Nru keepass2-2.16+dfsg/Docs/License_Install.txt keepass2-2.18+dfsg/Docs/License_Install.txt --- keepass2-2.16+dfsg/Docs/License_Install.txt 2011-01-01 11:43:12.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/License_Install.txt 2012-01-01 12:14:10.000000000 +0000 @@ -1,4 +1,4 @@ -KeePass: Copyright (c) 2003-2011 Dominik Reichl . +KeePass: Copyright (c) 2003-2012 Dominik Reichl . The software is distributed under the terms of the GNU General Public License version 2 or later. diff -Nru keepass2-2.16+dfsg/Docs/License.txt keepass2-2.18+dfsg/Docs/License.txt --- keepass2-2.16+dfsg/Docs/License.txt 2011-01-01 11:43:24.000000000 +0000 +++ keepass2-2.18+dfsg/Docs/License.txt 2012-01-01 12:13:52.000000000 +0000 @@ -1,4 +1,4 @@ -KeePass: Copyright (c) 2003-2011 Dominik Reichl . +KeePass: Copyright (c) 2003-2012 Dominik Reichl . The software is distributed under the terms of the GNU General Public License version 2 or later. diff -Nru keepass2-2.16+dfsg/Ext/DeprecatedSources/MainForm_110830.txt keepass2-2.18+dfsg/Ext/DeprecatedSources/MainForm_110830.txt --- keepass2-2.16+dfsg/Ext/DeprecatedSources/MainForm_110830.txt 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/Ext/DeprecatedSources/MainForm_110830.txt 2011-08-30 08:27:48.000000000 +0000 @@ -0,0 +1,66 @@ + /* public void RefreshEntriesList() + { + int nItemCount = m_lvEntries.Items.Count; + if(nItemCount <= 0) return; + + PwEntry peTop = GetTopEntry(); + PwEntry peFocused = GetSelectedEntry(false); + int iScrollY = NativeMethods.GetScrollPosY(m_lvEntries.Handle); + + UpdateImageLists(); // Important + + PwEntry[] vSelected = GetSelectedEntries(); + if(vSelected == null) vSelected = new PwEntry[0]; + + PwEntry[] vList = new PwEntry[nItemCount]; + for(int iEnum = 0; iEnum < nItemCount; ++iEnum) + vList[iEnum] = (PwEntry)m_lvEntries.Items[iEnum].Tag; + + m_lvEntries.BeginUpdate(); + m_lvEntries.Items.Clear(); + m_lvEntries.Groups.Clear(); + m_lvgLastEntryGroup = null; + + int nTopIndex = -1; + ListViewItem lviFocused = null; + + m_dtCachedNow = DateTime.Now; + ListViewStateEx lvseCachedState = new ListViewStateEx(m_lvEntries); + + for(int iAdd = 0; iAdd < nItemCount; ++iAdd) + { + PwEntry pe = vList[iAdd]; + + ListViewItem lvi = SetListEntry(pe, null); + + if(pe == peTop) nTopIndex = iAdd; + if(pe == peFocused) lviFocused = lvi; + + if(Array.IndexOf(vSelected, pe) >= 0) lvi.Selected = true; + } + + Debug.Assert(lvseCachedState.CompareTo(m_lvEntries)); + + UIUtil.SetAlternatingBgColors(m_lvEntries, m_clrAlternateItemBgColor, + Program.Config.MainWindow.EntryListAlternatingBgColors); + + Debug.Assert(m_bEntryGrouping == m_lvEntries.ShowGroups); + if(m_lvEntries.ShowGroups) + { + // Test nTopIndex to ensure we're not scrolling an unrelated list + if((nTopIndex >= 0) && (iScrollY > 0)) + NativeMethods.Scroll(m_lvEntries, 0, iScrollY); + } + else + { + if(nTopIndex >= 0) + { + m_lvEntries.EnsureVisible(m_lvEntries.Items.Count - 1); + m_lvEntries.EnsureVisible(nTopIndex); + } + } + + if(lviFocused != null) m_lvEntries.FocusedItem = lviFocused; + + m_lvEntries.EndUpdate(); + } */ diff -Nru keepass2-2.16+dfsg/Ext/DeprecatedSources/ProtectedString_111029.cs keepass2-2.18+dfsg/Ext/DeprecatedSources/ProtectedString_111029.cs --- keepass2-2.16+dfsg/Ext/DeprecatedSources/ProtectedString_111029.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/Ext/DeprecatedSources/ProtectedString_111029.cs 2011-10-25 08:24:48.000000000 +0000 @@ -0,0 +1,436 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2011 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.Security; +using System.Text; +using System.Diagnostics; +using System.Runtime.InteropServices; + +using KeePassLib.Cryptography; +using KeePassLib.Utility; + +#if KeePassLibSD +using KeePassLibSD; +#endif + +namespace KeePassLib.Security +{ + /// + /// Represents an in-memory encrypted string. + /// +#if (DEBUG && !KeePassLibSD) + [DebuggerDisplay(@"{ReadString()}")] +#endif + public sealed class ProtectedString + { + // SecureString objects are supported only on Windows 2000 SP3 and + // higher. On all other systems (98 / ME) we use a standard string + // object instead of the secure one. This of course decreases the + // security of the class, but at least allows the application + // to run on older systems, too. + private SecureString m_secString = null; // Created in constructor + private string m_strAlternativeSecString = string.Empty; + + private string m_strPlainText = string.Empty; // Never null + private bool m_bIsProtected = false; // See default constructor + + private XorredBuffer m_xbEncrypted = null; // UTF-8 representation + + /// + /// A flag specifying whether the ProtectedString object has turned on + /// in-memory protection or not. + /// + public bool IsProtected + { + get { return m_bIsProtected; } + } + + /// + /// A value specifying whether the ProtectedString object is currently + /// in-memory protected or not. This flag can be different than + /// IsProtected: if a XorredBuffer is used, the IsProtected + /// flag represents the memory protection flag, but not the actual protection. + /// In this case use IsViewable, which returns true if a + /// XorredBuffer is currently in use. + /// + public bool IsViewable + { + get { return (!m_bIsProtected && (m_xbEncrypted == null)); } + } + + public bool IsEmpty + { + get + { + if(m_xbEncrypted != null) return (m_xbEncrypted.Length == 0); + + if(m_bIsProtected) + { + if(m_secString != null) return (m_secString.Length == 0); + else return (m_strAlternativeSecString.Length == 0); + } + + return (m_strPlainText.Length == 0); + } + } + + public int Length + { + get + { + if(m_xbEncrypted != null) + { + byte[] pb = m_xbEncrypted.ReadPlainText(); + + string str = StrUtil.Utf8.GetString(pb, 0, pb.Length); + SetString(str); // Clear the XorredBuffer object + + // No need to erase the pb buffer, the plain text is + // now readable in memory anyway (in str). + + return ((str != null) ? str.Length : 0); + } + + if(m_bIsProtected) + { + if(m_secString != null) return m_secString.Length; + else return m_strAlternativeSecString.Length; + } + + return m_strPlainText.Length; // Unprotected string + } + } + + /// + /// Construct a new protected string object. Protection is + /// disabled by default! You need to call the + /// EnableProtection member function in order to + /// enable the protection, if you wish the string to be protected. + /// + public ProtectedString() + { + try { m_secString = new SecureString(); } + catch(NotSupportedException) { } // Windows 98 / ME + } + + /// + /// Construct a new in-memory encrypted string object. + /// + /// 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. + public ProtectedString(bool bEnableProtection) + { + try { m_secString = new SecureString(); } + catch(NotSupportedException) { } // Windows 98 / ME + + m_bIsProtected = bEnableProtection; + } + + /// + /// 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. This + /// parameter won't be modified. + public ProtectedString(bool bEnableProtection, string strValue) + { + try { m_secString = new SecureString(); } + catch(NotSupportedException) { } // Windows 98 / ME + + m_bIsProtected = bEnableProtection; + SetString(strValue); + } + + /// + /// 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. + public ProtectedString(bool bEnableProtection, byte[] vUtf8Value) + { + if(vUtf8Value == null) throw new ArgumentNullException("vUtf8Value"); + + try { m_secString = new SecureString(); } + catch(NotSupportedException) { } // Windows 98 / ME + + m_bIsProtected = bEnableProtection; + SetString(StrUtil.Utf8.GetString(vUtf8Value, 0, vUtf8Value.Length)); + } + + /// + /// Construct a new protected string. The string is initialized + /// to the value passed in the pbTemplate protected string. + /// + /// The initial string value. This + /// parameter won't be modified. Must not be null. + /// Thrown if the input + /// parameter is null. + public ProtectedString(ProtectedString psTemplate) + { + Debug.Assert(psTemplate != null); + if(psTemplate == null) throw new ArgumentNullException("psTemplate"); + + try { m_secString = new SecureString(); } + catch(NotSupportedException) { } // Windows 98 / ME + + m_bIsProtected = psTemplate.m_bIsProtected; + SetString(psTemplate.ReadString()); + } + + /// + /// 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. + /// Thrown if the input + /// parameter is null. + public ProtectedString(bool bEnableProtection, XorredBuffer xbProtected) + { + Debug.Assert(xbProtected != null); + if(xbProtected == null) throw new ArgumentNullException("xbProtected"); + + try { m_secString = new SecureString(); } + catch(NotSupportedException) { } // Windows 98 / ME + + m_bIsProtected = bEnableProtection; + m_xbEncrypted = xbProtected; + } + + /// + /// Clear the string. Doesn't change the protection level. + /// + public void Clear() + { + if(m_secString != null) m_secString.Clear(); + else m_strAlternativeSecString = string.Empty; + + m_strPlainText = string.Empty; + + m_xbEncrypted = null; + } + + /// + /// Change the protection level (protect or don't protect). Note: you + /// only need to call this function if you really want to change the + /// protection. If you specified the protection flag in the constructor, + /// and don't want to change it, you don't need to call this function. + /// + /// If true, the string will be protected + /// (encrypted in-memory). Otherwise the string will be stored in + /// plain-text in the process memory. + public void EnableProtection(bool bProtect) + { + if(m_xbEncrypted != null) + { + m_bIsProtected = bProtect; + return; + } + + if(m_bIsProtected && !bProtect) // Unprotect + { + string strPlainText = ReadString(); + + Clear(); + + m_strPlainText = strPlainText; + m_bIsProtected = false; + } + else if(!m_bIsProtected && bProtect) // Protect + { + m_bIsProtected = true; + + SetString(m_strPlainText); + } + } + + /// + /// Assign a new string value to the object. + /// + /// New string. The string must not contain + /// a null terminator. + /// Thrown if the input + /// parameter is null. + /// Thrown if the new string + /// contains a null terminator. + public void SetString(string strNewValue) + { + Clear(); + + Debug.Assert(strNewValue != null); if(strNewValue == null) throw new ArgumentNullException("strNewValue"); + + // String must not contain any null character + Debug.Assert(strNewValue.IndexOf((char)0) < 0); + + if(m_bIsProtected) + { + if(m_secString != null) + { + char ch; + for(int i = 0; i < strNewValue.Length; ++i) + { + ch = strNewValue[i]; + if(ch == 0) throw new ArgumentException(); + + m_secString.AppendChar(ch); + } + } + else m_strAlternativeSecString = strNewValue; + } + else // Currently not protected + { + m_strPlainText = strNewValue; + } + } + + /// + /// Convert the protected string to a normal string object. + /// Be careful with this function, the returned string object + /// isn't protected any more and stored in plain-text in the + /// process memory. + /// + /// Plain-text string. Is never null. + public string ReadString() + { + if(m_xbEncrypted != null) + { + byte[] pb = m_xbEncrypted.ReadPlainText(); + + string str = StrUtil.Utf8.GetString(pb, 0, pb.Length); + SetString(str); // Clear the XorredBuffer object + + // No need to erase the pb buffer, the plain text is + // now readable in memory anyway (in str). + + return (str ?? string.Empty); + } + + if(m_bIsProtected) + { + if(m_secString != null) + { +#if !KeePassLibSD + IntPtr p = Marshal.SecureStringToGlobalAllocUnicode(m_secString); + string str = Marshal.PtrToStringUni(p); + Marshal.ZeroFreeGlobalAllocUnicode(p); +#else + string str = m_secString.ReadAsString(); +#endif + return (str ?? string.Empty); + } + else return m_strAlternativeSecString; + } + + return m_strPlainText; // Unprotected string + } + + /// + /// Read out the string and return a byte array that contains the + /// string encoded using UTF-8. The returned string is not protected + /// anymore! + /// + /// Plain-text UTF-8 byte array. + public byte[] ReadUtf8() + { + if(m_xbEncrypted != null) + { + byte[] pb = m_xbEncrypted.ReadPlainText(); + + // Clear XorredBuffer + SetString(StrUtil.Utf8.GetString(pb, 0, pb.Length)); + + return pb; + } + + if(m_bIsProtected) + { + if(m_secString != null) + { +#if !KeePassLibSD + Debug.Assert(sizeof(char) == 2); + char[] vChars = new char[m_secString.Length]; + + IntPtr p = Marshal.SecureStringToGlobalAllocUnicode(m_secString); + for(int i = 0; i < vChars.Length; ++i) + vChars[i] = (char)Marshal.ReadInt16(p, i * 2); + Marshal.ZeroFreeGlobalAllocUnicode(p); + + byte[] pb = StrUtil.Utf8.GetBytes(vChars, 0, vChars.Length); + Array.Clear(vChars, 0, vChars.Length); +#else + byte[] pb = StrUtil.Utf8.GetBytes(m_secString.ReadAsString()); +#endif + return pb; + } + else return StrUtil.Utf8.GetBytes(m_strAlternativeSecString); + } + + return StrUtil.Utf8.GetBytes(m_strPlainText); // Unprotected string + } + + /// + /// Read the protected string and return it protected with a sequence + /// of bytes generated by a random stream. The object's data will be + /// invisible in process memory only if the object has been initialized + /// using a XorredBuffer. If no XorredBuffer has been used + /// or the string has been read once already (in plain-text), the + /// operation won't be secure and the protected string will be visible + /// in process memory. + /// + /// Random number source. + /// Protected string. + /// Thrown if the input + /// parameter is null. + public byte[] ReadXorredString(CryptoRandomStream crsRandomSource) + { + Debug.Assert(crsRandomSource != null); if(crsRandomSource == null) throw new ArgumentNullException("crsRandomSource"); + + if(m_xbEncrypted != null) + { + uint uLen = m_xbEncrypted.Length; + byte[] randomPad = crsRandomSource.GetRandomBytes(uLen); + return m_xbEncrypted.ChangeKey(randomPad); + } + else // Not using XorredBuffer + { + byte[] pbData = ReadUtf8(); + uint uLen = (uint)pbData.Length; + + byte[] randomPad = crsRandomSource.GetRandomBytes(uLen); + Debug.Assert(randomPad.Length == uLen); + + for(uint i = 0; i < uLen; ++i) + pbData[i] ^= randomPad[i]; + + return pbData; + } + } + } +} diff -Nru keepass2-2.16+dfsg/Ext/DeprecatedSources/UpdateCheck_111216.cs keepass2-2.18+dfsg/Ext/DeprecatedSources/UpdateCheck_111216.cs --- keepass2-2.16+dfsg/Ext/DeprecatedSources/UpdateCheck_111216.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/Ext/DeprecatedSources/UpdateCheck_111216.cs 2011-12-16 18:22:56.000000000 +0000 @@ -0,0 +1,205 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2011 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.Net; +using System.Net.Cache; +using System.Windows.Forms; +using System.Xml; +using System.Diagnostics; +using System.Threading; + +// using KeePass.Native; +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Resources; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +namespace KeePass.Util +{ + /* public static class UpdateCheck + { + private const string ElemRoot = "KeePass"; + + private const string ElemVersionU = "Version32"; + private const string ElemVersionStr = "VersionDisplayString"; + + private static volatile string m_strVersionURL = string.Empty; + private static volatile ToolStripStatusLabel m_tsResultsViewer = null; + + public static void StartAsync(string strVersionUrl, ToolStripStatusLabel tsResultsViewer) + { + m_strVersionURL = strVersionUrl; + m_tsResultsViewer = tsResultsViewer; + + // Local, but thread will continue to run anyway + Thread th = new Thread(new ThreadStart(UpdateCheck.OnStartCheck)); + th.Start(); + } + + private static void OnStartCheck() + { + // NativeProgressDialog dlg = null; + // if(m_tsResultsViewer == null) + // { + // dlg = new NativeProgressDialog(); + // dlg.StartLogging(KPRes.Wait + "...", false); + // } + + try + { + IOWebClient webClient = new IOWebClient(); + IOConnection.ConfigureWebClient(webClient); + + Uri uri = new Uri(m_strVersionURL); + + webClient.DownloadDataCompleted += + new DownloadDataCompletedEventHandler(OnDownloadCompleted); + + webClient.DownloadDataAsync(uri); + } + // catch(NotImplementedException) + // { + // ReportStatusEx(KLRes.FrameworkNotImplExcp, true); + // } + catch(Exception) { } + + // if(dlg != null) dlg.EndLogging(); + } + + private static void OnDownloadCompleted(object sender, DownloadDataCompletedEventArgs e) + { + string strXmlFile = NetUtil.GZipUtf8ResultToString(e); + + if(strXmlFile == null) + { + if(e.Error != null) + { + if(m_tsResultsViewer == null) + MessageService.ShowWarning(KPRes.UpdateCheckingFailed, e.Error); + else if(e.Error.Message != null) + UpdateCheck.SetTsStatus(KPRes.UpdateCheckingFailed + " " + + e.Error.Message); + } + else ReportStatusEx(KPRes.UpdateCheckingFailed, true); + + return; + } + + XmlDocument xmlDoc = new XmlDocument(); + + try { xmlDoc.LoadXml(strXmlFile); } + catch(Exception) + { + StructureFail(); + return; + } + + XmlElement xmlRoot = xmlDoc.DocumentElement; + if(xmlRoot == null) { StructureFail(); return; } + if(xmlRoot.Name != ElemRoot) { StructureFail(); return; } + + uint uVersion = 0; + + foreach(XmlNode xmlChild in xmlRoot.ChildNodes) + { + if(xmlChild.Name == ElemVersionU) + uint.TryParse(xmlChild.InnerText, out uVersion); + else if(xmlChild.Name == ElemVersionStr) + { + // strVersion = xmlChild.InnerText; + } + } + + if(uVersion > PwDefs.Version32) + { + if(m_tsResultsViewer == null) + { + if(MessageService.AskYesNo(KPRes.ChkForUpdNewVersion + + MessageService.NewParagraph + KPRes.WebsiteVisitQuestion)) + { + WinUtil.OpenUrl(PwDefs.HomepageUrl, null); + } + } + else UpdateCheck.SetTsStatus(KPRes.ChkForUpdNewVersion); + } + else if(uVersion == PwDefs.Version32) + ReportStatusEx(KPRes.ChkForUpdGotLatest, false); + else + ReportStatusEx(KPRes.UnknownFileVersion, true); + } + + private static void ReportStatusEx(string strText, bool bIsWarning) + { + ReportStatusEx(strText, strText, bIsWarning); + } + + private static void ReportStatusEx(string strLongText, string strShortText, + bool bIsWarning) + { + if(m_tsResultsViewer == null) + { + if(bIsWarning) MessageService.ShowWarning(strLongText); + else MessageService.ShowInfo(strLongText); + } + else UpdateCheck.SetTsStatus(strShortText); + } + + private static void StructureFail() + { + Debug.Assert(false); + + if(m_tsResultsViewer == null) + MessageService.ShowWarning(KPRes.InvalidFileStructure); + else + UpdateCheck.SetTsStatus(KPRes.ChkForUpdGotLatest + " " + + KPRes.InvalidFileStructure); + } + + private static void SetTsStatus(string strText) + { + if(strText == null) { Debug.Assert(false); return; } + if(m_tsResultsViewer == null) { Debug.Assert(false); return; } + + try + { + ToolStrip pParent = m_tsResultsViewer.Owner; + if((pParent != null) && pParent.InvokeRequired) + { + pParent.Invoke(new Priv_CfuSsd(UpdateCheck.SetTsStatusDirect), + new object[] { strText }); + } + else UpdateCheck.SetTsStatusDirect(strText); + } + catch(Exception) { Debug.Assert(false); } + } + + public delegate void Priv_CfuSsd(string strText); + + private static void SetTsStatusDirect(string strText) + { + try { m_tsResultsViewer.Text = strText; } + catch(Exception) { Debug.Assert(false); } + } + } */ +} diff -Nru keepass2-2.16+dfsg/Ext/DeprecatedSources/XorredBuffer_111029.cs keepass2-2.18+dfsg/Ext/DeprecatedSources/XorredBuffer_111029.cs --- keepass2-2.16+dfsg/Ext/DeprecatedSources/XorredBuffer_111029.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/Ext/DeprecatedSources/XorredBuffer_111029.cs 2011-01-07 14:06:48.000000000 +0000 @@ -0,0 +1,196 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2011 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; + +namespace KeePassLib.Security +{ + /// + /// Represents an object that is encrypted using a XOR pad until + /// it is read. The key XOR pad can be changed without revealing the + /// protected data in process memory. + /// + public sealed class XorredBuffer + { + private byte[] m_pbData = new byte[0]; // Never null + private byte[] m_pbXorPad = new byte[0]; // Never null + + /// + /// Length of the protected data in bytes. + /// + public uint Length + { + get { return (uint)m_pbData.Length; } + } + + /// + /// Construct a new XOR-protected object using a protected byte array + /// and a XOR pad that decrypts the protected data. The + /// byte array must have the same size + /// as the byte array. + /// + /// Protected data (XOR pad applied). + /// XOR pad that is used to decrypt the + /// parameter. + /// Thrown if one of the input + /// parameters is null. + /// Thrown if the byte arrays are + /// of different size. + public XorredBuffer(byte[] pbProtectedData, byte[] pbXorPad) + { + Debug.Assert(pbProtectedData != null); if(pbProtectedData == null) throw new ArgumentNullException("pbProtectedData"); + Debug.Assert(pbXorPad != null); if(pbXorPad == null) throw new ArgumentNullException("pbXorPad"); + + Debug.Assert(pbProtectedData.Length == pbXorPad.Length); + if(pbProtectedData.Length != pbXorPad.Length) throw new ArgumentException(); + + m_pbData = pbProtectedData; + m_pbXorPad = pbXorPad; + } + + private void Decrypt() + { + Debug.Assert((m_pbData.Length == m_pbXorPad.Length) || (m_pbXorPad.Length == 0)); + + if(m_pbData.Length == m_pbXorPad.Length) + { + for(int i = 0; i < m_pbData.Length; ++i) + m_pbData[i] ^= m_pbXorPad[i]; + + m_pbXorPad = new byte[0]; + } + } + + /// + /// Decrypt the buffer. The XorredBuffer protection is useless + /// after you used this method. The object cannot be re-encrypted. + /// + /// Unprotected plain-text byte array. + public byte[] ReadPlainText() + { + Decrypt(); + return m_pbData; + } + + /// + /// Change the protection key for this XorredBuffer object. + /// The data will first be decrypted using the old key and then + /// re-encrypted using the new key. This operation doesn't reveal + /// the plain-text in the process memory. + /// + /// New protection pad. Must contain exactly + /// the same number of bytes as the length of the currently protected data. + /// Use the Length property of the XorredBuffer to query + /// the data length and pass a correct number of bytes to ChangeKey. + /// New protected data (encrypted using the new XOR pad). + /// Thrown if the input + /// parameter is null. + /// Thrown if the input + /// byte array doesn't have the correct size. + public byte[] ChangeKey(byte[] pbNewXorPad) + { + Debug.Assert(pbNewXorPad != null); if(pbNewXorPad == null) throw new ArgumentNullException("pbNewXorPad"); + + Debug.Assert(pbNewXorPad.Length == m_pbData.Length); + if(pbNewXorPad.Length != m_pbData.Length) throw new ArgumentException(); + + if(m_pbXorPad.Length == m_pbData.Length) // Data is protected + { + for(int i = 0; i < m_pbData.Length; ++i) + m_pbData[i] ^= (byte)(m_pbXorPad[i] ^ pbNewXorPad[i]); + } + else // Data is unprotected + { + for(int i = 0; i < m_pbData.Length; ++i) + m_pbData[i] ^= pbNewXorPad[i]; + } + + m_pbXorPad = pbNewXorPad; + return m_pbData; + } + + public bool EqualsValue(XorredBuffer xb) + { + if(xb == null) { Debug.Assert(false); throw new ArgumentNullException("xb"); } + + if(xb.m_pbData.Length != m_pbData.Length) return false; + + bool bDecThis = (m_pbData.Length == m_pbXorPad.Length); + bool bDecOther = (xb.m_pbData.Length == xb.m_pbXorPad.Length); + for(int i = 0; i < m_pbData.Length; ++i) + { + byte bt1 = m_pbData[i]; + if(bDecThis) bt1 ^= m_pbXorPad[i]; + + byte bt2 = xb.m_pbData[i]; + if(bDecOther) bt2 ^= xb.m_pbXorPad[i]; + + if(bt1 != bt2) return false; + } + + return true; + } + + public bool EqualsValue(byte[] pb) + { + if(pb == null) { Debug.Assert(false); throw new ArgumentNullException("pb"); } + + if(pb.Length != m_pbData.Length) return false; + + if(m_pbData.Length == m_pbXorPad.Length) + { + for(int i = 0; i < m_pbData.Length; ++i) + { + if((byte)(m_pbData[i] ^ m_pbXorPad[i]) != pb[i]) return false; + } + return true; + } + + for(int i = 0; i < m_pbData.Length; ++i) + { + if(m_pbData[i] != pb[i]) return false; + } + return true; + } + + /// + /// XOR all bytes in a data buffer with a pad. Both byte arrays must + /// be of the same size. + /// + /// Data to be protected. + /// XOR pad. + /// Thrown if one of the + /// parameters is null. + /// Thrown if the length of + /// the data array and the pad aren't equal. + [Obsolete("Use MemUtil.XorArray instead.")] + public static void XorArrays(byte[] pbData, byte[] pbPad) + { + Debug.Assert(pbData != null); if(pbData == null) throw new ArgumentNullException("pbData"); + Debug.Assert(pbPad != null); if(pbPad == null) throw new ArgumentNullException("pbPad"); + + Debug.Assert(pbData.Length == pbPad.Length); + if(pbData.Length != pbPad.Length) throw new ArgumentException(); + + for(int i = 0; i < pbData.Length; ++i) + pbData[i] ^= pbPad[i]; + } + } +} diff -Nru keepass2-2.16+dfsg/Ext/KeePass.exe.config keepass2-2.18+dfsg/Ext/KeePass.exe.config --- keepass2-2.16+dfsg/Ext/KeePass.exe.config 2011-07-12 08:10:50.000000000 +0000 +++ keepass2-2.18+dfsg/Ext/KeePass.exe.config 2012-01-05 09:41:12.000000000 +0000 @@ -1,7 +1,7 @@ - + @@ -9,8 +9,8 @@ - + diff -Nru keepass2-2.16+dfsg/Ext/KeePass.iss keepass2-2.18+dfsg/Ext/KeePass.iss --- keepass2-2.16+dfsg/Ext/KeePass.iss 2011-07-05 12:47:06.000000000 +0000 +++ keepass2-2.18+dfsg/Ext/KeePass.iss 2012-01-01 12:15:32.000000000 +0000 @@ -8,16 +8,16 @@ #define MyAppNameEx "KeePass Password Safe 2" #define MyAppPublisher "Dominik Reichl" -#define KeeVersionStr "2.16" -#define KeeVersionStrWithMinor "2.16" -#define KeeVersionStrWithMinorPath "2.16" -#define KeeVersionWin "2.1.6.0" +#define KeeVersionStr "2.18" +#define KeeVersionStrWithMinor "2.18" +#define KeeVersionStrWithMinorPath "2.18" +#define KeeVersionWin "2.1.8.0" #define MyAppURL "http://keepass.info/" #define MyAppExeName "KeePass.exe" #define MyAppUrlName "KeePass.url" #define MyAppHelpName "KeePass.chm" -#define KeeDevPeriod "2003-2011" +#define KeeDevPeriod "2003-2012" #define MyAppId "KeePassPasswordSafe2" [Setup] diff -Nru keepass2-2.16+dfsg/Ext/KeePassMsi/KeePassMsi.vdproj keepass2-2.18+dfsg/Ext/KeePassMsi/KeePassMsi.vdproj --- keepass2-2.16+dfsg/Ext/KeePassMsi/KeePassMsi.vdproj 2011-07-12 08:17:04.000000000 +0000 +++ keepass2-2.18+dfsg/Ext/KeePassMsi/KeePassMsi.vdproj 2012-01-05 09:48:56.000000000 +0000 @@ -118,7 +118,7 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_8C05ADB649434D7892E36709EBDED4CC" + "OwnerKey" = "8:_838987B3C51D42C3C7B9BDA1339A5500" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -130,7 +130,7 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_838987B3C51D42C3C7B9BDA1339A5500" + "OwnerKey" = "8:_8C05ADB649434D7892E36709EBDED4CC" "MsmSig" = "8:_UNDEFINED" } } @@ -382,7 +382,7 @@ { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:KeePass, Version=2.1.6.16253, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:KeePass, Version=2.1.8.18961, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL" "ScatterAssemblies" { "_838987B3C51D42C3C7B9BDA1339A5500" @@ -413,7 +413,7 @@ { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:KeePass.XmlSerializers, Version=2.1.6.16253, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:KeePass.XmlSerializers, Version=2.1.8.18961, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL" "ScatterAssemblies" { "_8C05ADB649434D7892E36709EBDED4CC" @@ -564,7 +564,7 @@ { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:KeePass, Version=2.1.6.16253, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL" + "AssemblyAsmDisplayName" = "8:KeePass, Version=2.1.8.18961, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL" "ScatterAssemblies" { "_C4F8814F844C43EE8C9F5B662182B11A" @@ -712,14 +712,14 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:KeePass" - "ProductCode" = "8:{9C2F4D9C-D48F-4EA3-9F31-0AEF34859C8F}" - "PackageCode" = "8:{18865715-AF41-43D8-9087-2B6A8BFADCB5}" + "ProductCode" = "8:{3560D137-75F3-4E06-BE84-FB80CABF40AC}" + "PackageCode" = "8:{38E032C9-1409-4F5F-BF01-43B99210854B}" "UpgradeCode" = "8:{F2F19898-4F86-4940-9BFA-426574CE03E1}" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:2.1.6" + "ProductVersion" = "8:2.1.8" "Manufacturer" = "8:Dominik Reichl" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:http://keepass.info/" @@ -954,7 +954,7 @@ "ContextData" = "8:" "Attributes" = "3:0" "Setting" = "3:2" - "Value" = "8:KeePass: Copyright (c) 2003-2011 Dominik Reichl. The software is distributed under the terms of the GNU General Public License version 2 or later." + "Value" = "8:KeePass: Copyright (c) 2003-2012 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" } @@ -1077,7 +1077,7 @@ "ContextData" = "8:" "Attributes" = "3:0" "Setting" = "3:2" - "Value" = "8:KeePass: Copyright (c) 2003-2011 Dominik Reichl. The software is distributed under the terms of the GNU General Public License version 2 or later." + "Value" = "8:KeePass: Copyright (c) 2003-2012 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" } diff -Nru keepass2-2.16+dfsg/KeePass/App/AppDefs.cs keepass2-2.18+dfsg/KeePass/App/AppDefs.cs --- keepass2-2.16+dfsg/KeePass/App/AppDefs.cs 2011-06-02 10:45:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/AppDefs.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -41,6 +41,8 @@ public const string XslFileHtmlFull = "KDB4_DetailsFull.xsl"; public const string XslFileHtmlTabular = "KDB4_Tabular.xsl"; + public const string ShInstUtil = "ShInstUtil.exe"; + public const string PluginProductName = "KeePass Plugin"; // public const string MruNameValueSplitter = @"/::/"; @@ -64,7 +66,7 @@ public const string DatabaseSettings = "v2/dbsettings"; public const string DbSettingsGeneral = "general"; public const string DbSettingsSecurity = "security"; - public const string DbSettingsProtection = "protection"; + // public const string DbSettingsProtection = "protection"; public const string DbSettingsCompression = "compression"; public const string AutoType = "base/autotype"; @@ -98,8 +100,8 @@ public const string Setup = "v2/setup"; public const string SetupMono = "mono"; - public const string FaqTech = "base/faq_tech"; - public const string FaqTechMemProt = "memprot"; + // public const string FaqTech = "base/faq_tech"; + // public const string FaqTechMemProt = "memprot"; } public static class CommandLineOptions diff -Nru keepass2-2.16+dfsg/KeePass/App/AppHelp.cs keepass2-2.18+dfsg/KeePass/App/AppHelp.cs --- keepass2-2.16+dfsg/KeePass/App/AppHelp.cs 2011-01-08 16:28:52.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/AppHelp.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -22,6 +22,8 @@ using System.Diagnostics; using System.Threading; +using KeePass.Util; + using KeePassLib; using KeePassLib.Utility; @@ -113,7 +115,10 @@ { Debug.Assert(m_strLocalHelpFile != null); - string strCmd = @"ms-its:" + m_strLocalHelpFile; + // Unblock CHM file for proper display of help contents + WinUtil.RemoveZoneIdentifier(m_strLocalHelpFile); + + string strCmd = "\"ms-its:" + m_strLocalHelpFile; if(strTopic != null) strCmd += @"::/help/" + strTopic + ".html"; @@ -124,7 +129,9 @@ strCmd += @"#" + strSection; } - try { Process.Start("hh.exe", strCmd); } + strCmd += "\""; + + try { Process.Start(WinUtil.LocateSystemApp("hh.exe"), strCmd); } catch(Exception exStart) { MessageService.ShowWarning(@"hh.exe " + strCmd, exStart); diff -Nru keepass2-2.16+dfsg/KeePass/App/AppPolicy.cs keepass2-2.18+dfsg/KeePass/App/AppPolicy.cs --- keepass2-2.16+dfsg/KeePass/App/AppPolicy.cs 2011-03-05 12:09:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/AppPolicy.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -19,8 +19,9 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Windows.Forms; +using System.ComponentModel; +using System.Diagnostics; using KeePass.Resources; @@ -39,6 +40,7 @@ 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, @@ -58,6 +60,7 @@ public sealed class AppPolicyFlags { private bool m_bPlugins = true; + [DefaultValue(true)] public bool Plugins { get { return m_bPlugins; } @@ -65,6 +68,7 @@ } private bool m_bExport = true; + [DefaultValue(true)] public bool Export { get { return m_bExport;} @@ -72,6 +76,7 @@ } private bool m_bExportNoKey = true; + [DefaultValue(true)] public bool ExportNoKey { get { return m_bExportNoKey; } @@ -79,6 +84,7 @@ } private bool m_bImport = true; + [DefaultValue(true)] public bool Import { get { return m_bImport; } @@ -86,13 +92,23 @@ } 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; } @@ -100,6 +116,7 @@ } private bool m_bSave = true; + [DefaultValue(true)] public bool SaveFile { get { return m_bSave; } @@ -107,6 +124,7 @@ } private bool m_bAutoType = true; + [DefaultValue(true)] public bool AutoType { get { return m_bAutoType; } @@ -114,6 +132,7 @@ } private bool m_bAutoTypeWithoutContext = true; + [DefaultValue(true)] public bool AutoTypeWithoutContext { get { return m_bAutoTypeWithoutContext; } @@ -121,6 +140,7 @@ } private bool m_bClipboard = true; + [DefaultValue(true)] public bool CopyToClipboard { get { return m_bClipboard; } @@ -128,6 +148,7 @@ } private bool m_bCopyWholeEntries = true; + [DefaultValue(true)] public bool CopyWholeEntries { get { return m_bCopyWholeEntries; } @@ -135,6 +156,7 @@ } private bool m_bDragDrop = true; + [DefaultValue(true)] public bool DragDrop { get { return m_bDragDrop; } @@ -142,6 +164,7 @@ } private bool m_bUnhidePasswords = true; + [DefaultValue(true)] public bool UnhidePasswords { get { return m_bUnhidePasswords; } @@ -149,6 +172,7 @@ } private bool m_bChangeMasterKey = true; + [DefaultValue(true)] public bool ChangeMasterKey { get { return m_bChangeMasterKey; } @@ -156,6 +180,7 @@ } private bool m_bChangeMasterKeyNoKey = true; + [DefaultValue(true)] public bool ChangeMasterKeyNoKey { get { return m_bChangeMasterKeyNoKey; } @@ -163,6 +188,7 @@ } private bool m_bTriggersEdit = true; + [DefaultValue(true)] public bool EditTriggers { get { return m_bTriggersEdit; } @@ -225,6 +251,9 @@ case AppPolicyId.Print: str += KPRes.Print; break; + case AppPolicyId.PrintNoKey: + str += KPRes.Print + " - " + KPRes.NoKeyRepeat; + break; case AppPolicyId.NewFile: str += KPRes.NewDatabase; break; @@ -285,6 +314,9 @@ case AppPolicyId.Print: str += KPRes.PolicyPrintDesc; break; + case AppPolicyId.PrintNoKey: + str += KPRes.PolicyPrintNoKeyDesc; + break; case AppPolicyId.NewFile: str += KPRes.PolicyNewDatabaseDesc; break; @@ -347,6 +379,7 @@ case AppPolicyId.ExportNoKey: bAllowed = m_apfCurrent.ExportNoKey; break; case AppPolicyId.Import: bAllowed = m_apfCurrent.Import; break; case AppPolicyId.Print: bAllowed = m_apfCurrent.Print; break; + case AppPolicyId.PrintNoKey: bAllowed = m_apfCurrent.PrintNoKey; break; case AppPolicyId.NewFile: bAllowed = m_apfCurrent.NewFile; break; case AppPolicyId.SaveFile: bAllowed = m_apfCurrent.SaveFile; break; case AppPolicyId.AutoType: bAllowed = m_apfCurrent.AutoType; break; diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AceApplication.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AceApplication.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AceApplication.cs 2011-01-01 11:13:08.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AceApplication.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Text; using System.Xml.Serialization; +using System.ComponentModel; using KeePass.Ecas; @@ -35,6 +36,7 @@ } private string m_strLanguageFile = string.Empty; // = English + [DefaultValue("")] public string LanguageFile { get { return m_strLanguageFile; } @@ -46,12 +48,26 @@ } private bool m_bHelpUseLocal = false; + [DefaultValue(false)] public bool HelpUseLocal { get { return m_bHelpUseLocal; } set { m_bHelpUseLocal = 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 = new IOConnectionInfo(); public IOConnectionInfo LastUsedFile { @@ -97,6 +113,7 @@ } private bool m_bVerifyFile = true; + [DefaultValue(true)] public bool VerifyWrittenFileAfterSaving { get { return m_bVerifyFile; } @@ -104,12 +121,21 @@ } private bool m_bTransactedWrites = true; + [DefaultValue(true)] public bool UseTransactedFileWrites { get { return m_bTransactedWrites; } set { m_bTransactedWrites = value; } } + private bool m_bFileLocks = false; + [DefaultValue(false)] + public bool UseFileLocks + { + get { return m_bFileLocks; } + set { m_bFileLocks = value; } + } + private AceCloseDb m_fc = new AceCloseDb(); public AceCloseDb FileClosing { @@ -133,6 +159,7 @@ } private string m_strPluginCachePath = string.Empty; + [DefaultValue("")] public string PluginCachePath { get { return m_strPluginCachePath; } @@ -151,6 +178,7 @@ } private bool m_bOpenLastDb = true; + [DefaultValue(true)] public bool OpenLastFile { get { return m_bOpenLastDb; } @@ -158,13 +186,23 @@ } 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; } @@ -172,6 +210,7 @@ } private bool m_bPlgDeleteOld = true; + [DefaultValue(true)] public bool PluginCacheDeleteOld { get { return m_bPlgDeleteOld; } @@ -179,6 +218,7 @@ } private bool m_bClearPlgCache = false; + [DefaultValue(false)] public bool PluginCacheClearOnce { get { return m_bClearPlgCache; } @@ -193,6 +233,7 @@ } private bool m_bShowExpiredEntries = false; + [DefaultValue(false)] public bool ShowExpiredEntries { get { return m_bShowExpiredEntries; } @@ -200,6 +241,7 @@ } private bool m_bShowSoonToExpireEntries = false; + [DefaultValue(false)] public bool ShowSoonToExpireEntries { get { return m_bShowSoonToExpireEntries; } @@ -214,6 +256,7 @@ } private bool m_bAutoSave = false; + [DefaultValue(false)] public bool AutoSave { get { return m_bAutoSave; } diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AceCustomConfig.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AceCustomConfig.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AceCustomConfig.cs 2011-01-01 11:13:08.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AceCustomConfig.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AceDefaults.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AceDefaults.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AceDefaults.cs 2011-05-04 17:20:10.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AceDefaults.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Text; using System.Xml.Serialization; +using System.ComponentModel; using KeePass.Util; @@ -44,6 +45,7 @@ } private string m_strKey = string.Empty; + [DefaultValue("")] public string KeyFilePath { get { return m_strKey; } @@ -55,6 +57,7 @@ } private string m_strProv = string.Empty; + [DefaultValue("")] public string KeyProvider { get { return m_strProv; } @@ -75,6 +78,7 @@ } private int m_nNewEntryExpireDays = -1; + [DefaultValue(-1)] public int NewEntryExpiresInDays { get { return m_nNewEntryExpireDays; } @@ -88,7 +92,9 @@ set { m_uDefaultOptionsTab = value; } } - private string m_strTanChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"; + private const string DefaultTanChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"; + private string m_strTanChars = DefaultTanChars; + [DefaultValue(DefaultTanChars)] public string TanCharacters { get { return m_strTanChars; } @@ -100,6 +106,7 @@ } private bool m_bExpireTansOnUse = true; + [DefaultValue(true)] public bool TanExpiresOnUse { get { return m_bExpireTansOnUse; } @@ -118,6 +125,7 @@ } private string m_strDbSaveAsPath = string.Empty; + [DefaultValue("")] public string FileSaveAsDirectory { get { return m_strDbSaveAsPath; } @@ -129,6 +137,7 @@ } private bool m_bRememberKeySources = true; + [DefaultValue(true)] public bool RememberKeySources { get { return m_bRememberKeySources; } @@ -148,6 +157,7 @@ } private string m_strCustomColors = string.Empty; + [DefaultValue("")] public string CustomColors { get { return m_strCustomColors; } @@ -159,6 +169,7 @@ } private string m_strWinFavsBaseName = string.Empty; + [DefaultValue("")] public string WinFavsBaseFolderName { get { return m_strWinFavsBaseName; } @@ -170,6 +181,7 @@ } private string m_strWinFavsFilePrefix = string.Empty; + [DefaultValue("")] public string WinFavsFileNamePrefix { get { return m_strWinFavsFilePrefix; } @@ -181,6 +193,7 @@ } private string m_strWinFavsFileSuffix = string.Empty; + [DefaultValue("")] public string WinFavsFileNameSuffix { get { return m_strWinFavsFileSuffix; } @@ -192,6 +205,7 @@ } private bool m_bCollapseRecycleBin = false; + [DefaultValue(false)] public bool RecycleBinCollapse { get { return m_bCollapseRecycleBin; } @@ -209,9 +223,13 @@ strDb = UrlUtil.MakeAbsolutePath(WinUtil.GetExecutable(), strDb); string strKey = strKeySource; - if(bIsKeyFile && !string.IsNullOrEmpty(strKey) && - !UrlUtil.IsAbsolutePath(strKey)) - strKey = UrlUtil.MakeAbsolutePath(WinUtil.GetExecutable(), strKey); + if(bIsKeyFile && !string.IsNullOrEmpty(strKey)) + { + if(StrUtil.IsDataUri(strKey)) + strKey = null; // Don't remember data URIs + else if(!UrlUtil.IsAbsolutePath(strKey)) + strKey = UrlUtil.MakeAbsolutePath(WinUtil.GetExecutable(), strKey); + } if(!m_bRememberKeySources) strKey = null; diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AceIntegration.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AceIntegration.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AceIntegration.cs 2011-06-15 14:49:56.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AceIntegration.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -22,6 +22,8 @@ using System.Text; using System.Windows.Forms; using System.Xml.Serialization; +using System.ComponentModel; +using System.Diagnostics; using KeePassLib; using KeePassLib.Interfaces; @@ -60,6 +62,7 @@ } private string m_strUrlOverride = string.Empty; + [DefaultValue("")] public string UrlOverride { get { return m_strUrlOverride; } @@ -82,6 +85,7 @@ } private bool m_bSearchKeyFiles = true; + [DefaultValue(true)] public bool SearchKeyFiles { get { return m_bSearchKeyFiles; } @@ -89,6 +93,7 @@ } private bool m_bSearchKeyFilesOnRemovable = false; + [DefaultValue(false)] public bool SearchKeyFilesOnRemovableMedia { get { return m_bSearchKeyFilesOnRemovable; } @@ -96,6 +101,7 @@ } private bool m_bSingleInstance = true; + [DefaultValue(true)] public bool LimitToSingleInstance { get { return m_bSingleInstance; } @@ -103,13 +109,31 @@ } 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_bPrependInitSeqIE = true; + [DefaultValue(true)] public bool AutoTypePrependInitSequenceForIE { get { return m_bPrependInitSeqIE; } @@ -117,13 +141,23 @@ } 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_bCancelOnWindowChange = false; + [DefaultValue(false)] public bool AutoTypeCancelOnWindowChange { get { return m_bCancelOnWindowChange; } @@ -138,6 +172,7 @@ } private string m_strProxyAddr = string.Empty; + [DefaultValue("")] public string ProxyAddress { get { return m_strProxyAddr; } @@ -149,6 +184,7 @@ } private string m_strProxyPort = string.Empty; + [DefaultValue("")] public string ProxyPort { get { return m_strProxyPort; } @@ -160,6 +196,7 @@ } private string m_strProxyUser = string.Empty; + [DefaultValue("")] public string ProxyUserName { get { return m_strProxyUser; } @@ -171,6 +208,7 @@ } private string m_strProxyPassword = string.Empty; + [DefaultValue("")] public string ProxyPassword { get { return m_strProxyPassword; } @@ -188,73 +226,103 @@ public sealed class AceUrlSchemeOverrides : IDeepCloneable { - private bool m_bSetToDefaults = true; - public bool SetToDefaults + 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 m_bSetToDefaults; } - set { m_bSetToDefaults = value; } + get { return GetEnabledBuiltInOverrides(); } + set { SetEnabledBuiltInOverrides(value); } } - private List m_vOverrides = + private List m_lCustomOverrides = new List(); [XmlArrayItem("Override")] - public List Overrides + public List CustomOverrides { - get { return m_vOverrides; } + get { return m_lCustomOverrides; } set { if(value == null) throw new ArgumentNullException("value"); - m_vOverrides = value; + m_lCustomOverrides = value; } } public AceUrlSchemeOverrides() { + MakeBuiltInList(); } - public void SetDefaultsIfEmpty() + private void MakeBuiltInList() { - if(m_bSetToDefaults == false) return; - - m_bSetToDefaults = false; // Set only once - m_vOverrides.Clear(); // Avoid duplication of defaults + m_lBuiltInOverrides.Clear(); - m_vOverrides.Add(new AceUrlSchemeOverride(true, "ssh", - @"cmd://PuTTY.exe -ssh {USERNAME}@{URL:RMVSCM}")); - m_vOverrides.Add(new AceUrlSchemeOverride(false, "http", - "cmd://{INTERNETEXPLORER} \"{URL}\"")); - m_vOverrides.Add(new AceUrlSchemeOverride(false, "https", - "cmd://{INTERNETEXPLORER} \"{URL}\"")); - m_vOverrides.Add(new AceUrlSchemeOverride(false, "http", - "cmd://{FIREFOX} \"{URL}\"")); - m_vOverrides.Add(new AceUrlSchemeOverride(false, "https", - "cmd://{FIREFOX} \"{URL}\"")); - m_vOverrides.Add(new AceUrlSchemeOverride(false, "chrome", - "cmd://{FIREFOX} -chrome \"{URL}\"")); - m_vOverrides.Add(new AceUrlSchemeOverride(false, "http", - "cmd://{OPERA} \"{URL}\"")); - m_vOverrides.Add(new AceUrlSchemeOverride(false, "https", - "cmd://{OPERA} \"{URL}\"")); - m_vOverrides.Add(new AceUrlSchemeOverride(false, "http", - "cmd://{GOOGLECHROME} \"{URL}\"")); - m_vOverrides.Add(new AceUrlSchemeOverride(false, "https", - "cmd://{GOOGLECHROME} \"{URL}\"")); - m_vOverrides.Add(new AceUrlSchemeOverride(false, "kdbx", - "cmd://\"{APPDIR}\\KeePass.exe\" \"{URL:RMVSCM}\" -pw-enc:\"{PASSWORD_ENC}\"")); - m_vOverrides.Add(new AceUrlSchemeOverride(false, "kdbx", - "cmd://mono \"{APPDIR}/KeePass.exe\" \"{URL:RMVSCM}\" -pw-enc:\"{PASSWORD_ENC}\"")); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(true, "ssh", + @"cmd://PuTTY.exe -ssh {USERNAME}@{URL:RMVSCM}", 0x1)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{INTERNETEXPLORER} \"{URL}\"", 0x2)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{INTERNETEXPLORER} \"{URL}\"", 0x4)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{FIREFOX} \"{URL}\"", 0x8)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{FIREFOX} \"{URL}\"", 0x10)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "chrome", + "cmd://{FIREFOX} -chrome \"{URL}\"", 0x20)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{OPERA} \"{URL}\"", 0x40)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{OPERA} \"{URL}\"", 0x80)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{GOOGLECHROME} \"{URL}\"", 0x100)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{GOOGLECHROME} \"{URL}\"", 0x200)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "http", + "cmd://{SAFARI} \"{URL}\"", 0x400)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "https", + "cmd://{SAFARI} \"{URL}\"", 0x800)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "kdbx", + "cmd://\"{APPDIR}\\KeePass.exe\" \"{URL:RMVSCM}\" -pw-enc:\"{PASSWORD_ENC}\"", 0x1000)); + m_lBuiltInOverrides.Add(new AceUrlSchemeOverride(false, "kdbx", + "cmd://mono \"{APPDIR}/KeePass.exe\" \"{URL:RMVSCM}\" -pw-enc:\"{PASSWORD_ENC}\"", 0x2000)); + +#if DEBUG + ulong u = 0; + for(int i = 0; i < m_lBuiltInOverrides.Count; ++i) + { + Debug.Assert(m_lBuiltInOverrides[i].IsBuiltIn); + u += m_lBuiltInOverrides[i].BuiltInFlagID; + } + Debug.Assert(u == ((1UL << m_lBuiltInOverrides.Count) - 1UL)); +#endif } public string GetOverrideForUrl(string strUrl) { if(string.IsNullOrEmpty(strUrl)) return null; - foreach(AceUrlSchemeOverride ovr in m_vOverrides) + for(int i = 0; i < 2; ++i) { - if(!ovr.Enabled) continue; + List l = ((i == 0) ? m_lBuiltInOverrides : + m_lCustomOverrides); - if(strUrl.StartsWith(ovr.Scheme + ":", StrUtil.CaseIgnoreCmp)) - return ovr.UrlOverride; + foreach(AceUrlSchemeOverride ovr in l) + { + if(!ovr.Enabled) continue; + + if(strUrl.StartsWith(ovr.Scheme + ":", StrUtil.CaseIgnoreCmp)) + return ovr.UrlOverride; + } } return null; @@ -263,14 +331,42 @@ public AceUrlSchemeOverrides CloneDeep() { AceUrlSchemeOverrides ovr = new AceUrlSchemeOverrides(); + CopyTo(ovr); + return ovr; + } - ovr.m_bSetToDefaults = m_bSetToDefaults; - foreach(AceUrlSchemeOverride sh in m_vOverrides) + public void CopyTo(AceUrlSchemeOverrides ovrTarget) + { + ovrTarget.m_lBuiltInOverrides.Clear(); + foreach(AceUrlSchemeOverride shB in m_lBuiltInOverrides) { - ovr.m_vOverrides.Add(sh.CloneDeep()); + ovrTarget.m_lBuiltInOverrides.Add(shB.CloneDeep()); } - return ovr; + ovrTarget.m_lCustomOverrides.Clear(); + foreach(AceUrlSchemeOverride shC in m_lCustomOverrides) + { + ovrTarget.m_lCustomOverrides.Add(shC.CloneDeep()); + } + } + + public 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; + } + + public void SetEnabledBuiltInOverrides(ulong uFlags) + { + for(int i = 0; i < m_lBuiltInOverrides.Count; ++i) + m_lBuiltInOverrides[i].Enabled = ((uFlags & + m_lBuiltInOverrides[i].BuiltInFlagID) != 0UL); } } @@ -305,6 +401,19 @@ } } + private ulong m_uBuiltInFlagID = 0; + [XmlIgnore] + internal ulong BuiltInFlagID + { + get { return m_uBuiltInFlagID; } + } + + [XmlIgnore] + public bool IsBuiltIn + { + get { return (m_uBuiltInFlagID != 0UL); } + } + public AceUrlSchemeOverride() { } @@ -312,17 +421,31 @@ 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); + return new AceUrlSchemeOverride(m_bEnabled, m_strScheme, + m_strOvr, m_uBuiltInFlagID); } } } diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AceLogging.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AceLogging.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AceLogging.cs 2011-01-01 11:13:06.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AceLogging.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using System.Text; +using System.ComponentModel; namespace KeePass.App.Configuration { @@ -30,6 +31,7 @@ } private bool m_bEnabled = false; + [DefaultValue(false)] public bool Enabled { get { return m_bEnabled; } diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AceMainWindow.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AceMainWindow.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AceMainWindow.cs 2011-01-01 11:13:06.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AceMainWindow.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -23,13 +23,15 @@ using System.Drawing; using System.Windows.Forms; using System.Xml.Serialization; +using System.ComponentModel; using System.Diagnostics; -using KeePassLib; - using KeePass.Resources; using KeePass.UI; +using KeePassLib; +using KeePassLib.Security; + namespace KeePass.App.Configuration { public enum AceMainWindowLayout @@ -73,6 +75,7 @@ } private bool m_bMax = false; + [DefaultValue(false)] public bool Maximized { get { return m_bMax; } @@ -101,6 +104,7 @@ } private bool m_bTop = false; + [DefaultValue(false)] public bool AlwaysOnTop { get { return m_bTop; } @@ -108,6 +112,7 @@ } private bool m_bCloseMin = false; + [DefaultValue(false)] public bool CloseButtonMinimizesWindow { get { return m_bCloseMin; } @@ -115,6 +120,7 @@ } private bool m_bMinToTray = false; + [DefaultValue(false)] public bool MinimizeToTray { get { return m_bMinToTray; } @@ -122,6 +128,7 @@ } private bool m_bFullPath = false; + [DefaultValue(false)] public bool ShowFullPathInTitle { get { return m_bFullPath; } @@ -129,6 +136,7 @@ } private bool m_bDropToBackAfterCopy = false; + [DefaultValue(false)] public bool DropToBackAfterClipboardCopy { get { return m_bDropToBackAfterCopy; } @@ -136,13 +144,15 @@ } private bool m_bMinAfterCopy = false; + [DefaultValue(false)] public bool MinimizeAfterClipboardCopy { get { return m_bMinAfterCopy; } set { m_bMinAfterCopy = value; } } - private bool m_bMinAfterLocking = false; + private bool m_bMinAfterLocking = true; + [DefaultValue(true)] public bool MinimizeAfterLocking { get { return m_bMinAfterLocking; } @@ -150,6 +160,7 @@ } private bool m_bMinAfterOpeningDb = false; + [DefaultValue(false)] public bool MinimizeAfterOpeningDatabase { get { return m_bMinAfterOpeningDb; } @@ -157,6 +168,7 @@ } private bool m_bQuickFindSearchInPasswords = false; + [DefaultValue(false)] public bool QuickFindSearchInPasswords { get { return m_bQuickFindSearchInPasswords; } @@ -164,20 +176,44 @@ } 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; } @@ -185,6 +221,7 @@ } private bool m_bCopyUrls = false; + [DefaultValue(false)] public bool CopyUrlsInsteadOfOpening { get { return m_bCopyUrls; } @@ -196,6 +233,7 @@ /// Disable 'Save' button (instead of graying it out) if the database /// hasn't been modified. ///
  • + [DefaultValue(false)] public bool DisableSaveIfNotModified { get { return m_bDisableSaveIfNotModified; } @@ -248,6 +286,7 @@ } private string m_strDisplayIndices = string.Empty; + [DefaultValue("")] public string EntryListColumnDisplayOrder { get { return m_strDisplayIndices; } @@ -259,6 +298,7 @@ } private bool m_bAutoResizeColumns = false; + [DefaultValue(false)] public bool EntryListAutoResizeColumns { get { return m_bAutoResizeColumns; } @@ -266,12 +306,29 @@ } private bool m_bAlternatingBgColor = true; + [DefaultValue(true)] public bool EntryListAlternatingBgColors { get { return m_bAlternatingBgColor; } set { m_bAlternatingBgColor = 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_bGridLines = false; // public bool ShowGridLines // { @@ -291,6 +348,7 @@ } private bool m_bShowEntriesOfSubGroups = false; + [DefaultValue(false)] public bool ShowEntriesOfSubGroups { get { return m_bShowEntriesOfSubGroups; } @@ -306,6 +364,34 @@ return null; } + + public bool IsColumnHidden(AceColumnType t) + { + return IsColumnHidden(t, (t == AceColumnType.Password)); + } + + public bool IsColumnHidden(AceColumnType t, bool bDefault) + { + foreach(AceColumn c in m_aceColumns) + { + if(c.Type == t) return c.HideWithAsterisks; + } + + return bDefault; + } + + public bool ShouldHideCustomString(string strCustomName, + ProtectedString psValue) + { + foreach(AceColumn c in m_aceColumns) + { + if((c.Type == AceColumnType.CustomString) && + (c.CustomName == strCustomName)) + return c.HideWithAsterisks; + } + if(psValue != null) return psValue.IsProtected; + return false; + } } public sealed class AceEntryView @@ -315,18 +401,20 @@ } private bool m_bShow = true; + [DefaultValue(true)] public bool Show { get { return m_bShow; } set { m_bShow = value; } } - private bool m_bHideProtectedCustomStrings = true; - public bool HideProtectedCustomStrings - { - get { return m_bHideProtectedCustomStrings; } - set { m_bHideProtectedCustomStrings = value; } - } + // private bool m_bHideProtectedCustomStrings = true; + // [DefaultValue(true)] + // public bool HideProtectedCustomStrings + // { + // get { return m_bHideProtectedCustomStrings; } + // set { m_bHideProtectedCustomStrings = value; } + // } } public sealed class AceTanView @@ -336,6 +424,7 @@ } private bool m_bSimple = true; + [DefaultValue(true)] public bool UseSimpleView { get { return m_bSimple; } @@ -343,6 +432,7 @@ } private bool m_bIndices = true; + [DefaultValue(true)] public bool ShowIndices { get { return m_bIndices; } @@ -393,6 +483,7 @@ } private string m_strCustomName = string.Empty; + [DefaultValue("")] public string CustomName { get { return m_strCustomName; } @@ -411,6 +502,7 @@ } private bool m_bHide = false; + [DefaultValue(false)] public bool HideWithAsterisks { get { return m_bHide; } diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AceNative.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AceNative.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AceNative.cs 2011-01-01 11:13:06.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AceNative.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using System.Text; +using System.ComponentModel; namespace KeePass.App.Configuration { @@ -30,6 +31,7 @@ } private bool m_bNativeKeyTrans = true; + [DefaultValue(true)] public bool NativeKeyTransformations { get { return m_bNativeKeyTrans; } diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AcePasswordGenerator.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AcePasswordGenerator.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AcePasswordGenerator.cs 2011-01-01 11:13:06.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AcePasswordGenerator.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AceSecurity.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AceSecurity.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AceSecurity.cs 2011-05-27 16:07:22.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AceSecurity.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using System.Text; +using System.ComponentModel; namespace KeePass.App.Configuration { @@ -63,6 +64,7 @@ } private bool m_bSecureDesktop = false; + [DefaultValue(false)] public bool MasterKeyOnSecureDesktop { get { return m_bSecureDesktop; } @@ -70,6 +72,7 @@ } private bool m_bClipClearOnExit = true; + [DefaultValue(true)] public bool ClipboardClearOnExit { get { return m_bClipClearOnExit; } @@ -77,6 +80,7 @@ } private int m_nClipClearSeconds = 12; + [DefaultValue(12)] public int ClipboardClearAfterSeconds { get { return m_nClipClearSeconds; } @@ -87,6 +91,7 @@ // crash with the Clipboard Viewer Ignore format // (when it is set using OleSetClipboard) private bool m_bUseClipboardViewerIgnoreFmt = false; + [DefaultValue(false)] public bool UseClipboardViewerIgnoreFormat { get { return m_bUseClipboardViewerIgnoreFmt; } @@ -94,6 +99,7 @@ } private bool m_bClearKeyCmdLineOpt = true; + [DefaultValue(true)] public bool ClearKeyCommandLineParams { get { return m_bClearKeyCmdLineOpt; } @@ -108,6 +114,7 @@ } private bool m_bOnMinimize = false; + [DefaultValue(false)] public bool LockOnWindowMinimize { get { return m_bOnMinimize; } @@ -115,6 +122,7 @@ } private bool m_bOnSessionSwitch = false; + [DefaultValue(false)] public bool LockOnSessionSwitch { get { return m_bOnSessionSwitch; } @@ -122,6 +130,7 @@ } private bool m_bOnSuspend = false; + [DefaultValue(false)] public bool LockOnSuspend { get { return m_bOnSuspend; } @@ -129,6 +138,7 @@ } private bool m_bOnRemoteControlChange = false; + [DefaultValue(false)] public bool LockOnRemoteControlChange { get { return m_bOnRemoteControlChange; } @@ -150,6 +160,7 @@ } private bool m_bExitInsteadOfLockingAfterTime = false; + [DefaultValue(false)] public bool ExitInsteadOfLockingAfterTime { get { return m_bExitInsteadOfLockingAfterTime; } @@ -157,6 +168,7 @@ } private bool m_bAlwaysExitInsteadOfLocking = false; + [DefaultValue(false)] public bool AlwaysExitInsteadOfLocking { get { return m_bAlwaysExitInsteadOfLocking; } diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AceToolBar.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AceToolBar.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AceToolBar.cs 2011-01-01 11:13:06.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AceToolBar.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using System.Text; +using System.ComponentModel; namespace KeePass.App.Configuration { @@ -30,6 +31,7 @@ } private bool m_bShow = true; + [DefaultValue(true)] public bool Show { get { return m_bShow; } diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AceTrayIcon.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AceTrayIcon.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AceTrayIcon.cs 2011-01-01 11:13:06.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AceTrayIcon.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using System.Text; +using System.ComponentModel; namespace KeePass.App.Configuration { @@ -30,6 +31,7 @@ } private bool m_bOnlyIfTrayed = false; + [DefaultValue(false)] public bool ShowOnlyIfTrayed { get { return m_bOnlyIfTrayed; } @@ -37,6 +39,7 @@ } private bool m_bSingleClickDefault = false; + [DefaultValue(false)] public bool SingleClickDefault { get { return m_bSingleClickDefault; } diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AceUI.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AceUI.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AceUI.cs 2011-07-09 15:16:58.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AceUI.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Text; using System.Drawing; +using System.ComponentModel; using System.Diagnostics; using KeePass.UI; @@ -55,7 +56,23 @@ None = 0, DisableOptions = 0x1, DisablePlugins = 0x2, - DisableTriggers = 0x4 + DisableTriggers = 0x4, + DisableKeyChangeDays = 0x8 + } + + [Flags] + public enum AceAutoTypeCtxFlags : long + { + None = 0, + + ColTitle = 0x1, + ColUserName = 0x2, + ColPassword = 0x4, + ColUrl = 0x8, + ColNotes = 0x10, + ColSequence = 0x20, + + Default = (ColTitle | ColUserName | ColUrl | ColSequence) } public sealed class AceUI @@ -109,6 +126,7 @@ } private bool m_bForceSysFont = true; + [DefaultValue(true)] public bool ForceSystemFontUnix { get { return m_bForceSysFont; } @@ -123,6 +141,7 @@ } private bool m_bShowImportStatusDlg = true; + [DefaultValue(true)] public bool ShowImportStatusDialog { get { return m_bShowImportStatusDlg; } @@ -130,6 +149,7 @@ } private bool m_bShowDbMntncResDlg = true; + [DefaultValue(true)] public bool ShowDbMntncResultsDialog { get { return m_bShowDbMntncResDlg; } @@ -137,6 +157,7 @@ } private bool m_bUseCustomTsRenderer = true; + [DefaultValue(true)] public bool UseCustomToolStripRenderer { get { return m_bUseCustomTsRenderer; } @@ -144,6 +165,7 @@ } private bool m_bOptScreenReader = false; + [DefaultValue(false)] public bool OptimizeForScreenReader { get { return m_bOptScreenReader; } @@ -151,6 +173,7 @@ } private string m_strDataEditorRect = string.Empty; + [DefaultValue("")] public string DataEditorRect { get { return m_strDataEditorRect; } @@ -173,6 +196,7 @@ } private bool m_bDeWordWrap = true; + [DefaultValue(true)] public bool DataEditorWordWrap { get { return m_bDeWordWrap; } @@ -180,6 +204,7 @@ } private string m_strCharPickerRect = string.Empty; + [DefaultValue("")] public string CharPickerRect { get { return m_strCharPickerRect; } @@ -190,6 +215,38 @@ } } + 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 { @@ -219,6 +276,7 @@ // } private bool m_bSecDeskSound = true; + [DefaultValue(true)] public bool SecureDesktopPlaySound { get { return m_bSecDeskSound; } @@ -233,6 +291,7 @@ } private bool m_bSepHiding = false; + [DefaultValue(false)] public bool SeparateHidingSettings { get { return m_bSepHiding; } @@ -240,6 +299,7 @@ } private bool m_bHideInEntryDialog = true; + [DefaultValue(true)] public bool HideInEntryWindow { get { return m_bHideInEntryDialog; } @@ -247,6 +307,7 @@ } private bool m_bUnhideBtnAlsoUnhidesSec = false; + [DefaultValue(false)] public bool UnhideButtonAlsoUnhidesSource { get { return m_bUnhideBtnAlsoUnhidesSec; } diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AppConfigEx.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AppConfigEx.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AppConfigEx.cs 2011-06-02 10:50:46.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AppConfigEx.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -178,6 +178,8 @@ ///
    private void PrepareSave() { + m_meta.OmitItemsWithDefaultValues = true; + m_aceApp.LastUsedFile.ClearCredentials(true); foreach(IOConnectionInfo iocMru in m_aceApp.MostRecentlyUsed.Items) @@ -187,11 +189,13 @@ m_def.KeySources.Clear(); m_aceApp.TriggerSystem = Program.TriggerSystem; + + SearchUtil.PrepareForSerialize(m_def.SearchParameters); } internal void OnLoad() { - m_int.UrlSchemeOverrides.SetDefaultsIfEmpty(); + // m_int.UrlSchemeOverrides.SetDefaultsIfEmpty(); ObfuscateCred(false); ChangePathsRelAbs(true); @@ -206,6 +210,8 @@ vColumns.RemoveAt(i); else ++i; } + + SearchUtil.FinishDeserialize(m_def.SearchParameters); } internal void OnSavePre() @@ -243,7 +249,11 @@ { if(ioc == null) { Debug.Assert(false); return; } - if(ioc.IsLocalFile() == false) return; + if(!ioc.IsLocalFile()) return; + + // Update path separators for current system + if(!UrlUtil.IsUncPath(ioc.Path)) + ioc.Path = UrlUtil.ConvertSeparators(ioc.Path); string strBase = WinUtil.GetExecutable(); bool bIsAbs = UrlUtil.IsAbsolutePath(ioc.Path); @@ -302,5 +312,16 @@ // 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; } + } } } diff -Nru keepass2-2.16+dfsg/KeePass/App/Configuration/AppConfigSerializer.cs keepass2-2.18+dfsg/KeePass/App/Configuration/AppConfigSerializer.cs --- keepass2-2.16+dfsg/KeePass/App/Configuration/AppConfigSerializer.cs 2011-04-17 14:10:20.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/App/Configuration/AppConfigSerializer.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -217,6 +217,9 @@ MemoryStream msRead = new MemoryStream(msAsm.ToArray(), false); tConfig = (AppConfigEx)xmlSerial.Deserialize(msRead); + + msRead.Close(); + msAsm.Close(); } catch(FileNotFoundException) { } catch(Exception) { Debug.Assert(false); } @@ -252,9 +255,12 @@ MemoryStream msEnf = new MemoryStream(); xdEnforced.Save(msEnf); MemoryStream msRead = new MemoryStream(msEnf.ToArray(), false); - + AppConfigEx cfgEnf = (AppConfigEx)xmlSerial.Deserialize(msRead); cfgEnf.OnLoad(); + + msRead.Close(); + msEnf.Close(); return cfgEnf; } catch(Exception) { Debug.Assert(false); } diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/CsvStreamReader.cs keepass2-2.18+dfsg/KeePass/DataExchange/CsvStreamReader.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/CsvStreamReader.cs 2011-04-08 11:06:36.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/CsvStreamReader.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/ExportUtil.cs keepass2-2.18+dfsg/KeePass/DataExchange/ExportUtil.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/ExportUtil.cs 2011-05-04 16:03:16.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/ExportUtil.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/FileFormatPool.cs keepass2-2.18+dfsg/KeePass/DataExchange/FileFormatPool.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/FileFormatPool.cs 2011-06-15 12:08:48.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/FileFormatPool.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/FileFormatProvider.cs keepass2-2.18+dfsg/KeePass/DataExchange/FileFormatProvider.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/FileFormatProvider.cs 2011-01-01 11:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/FileFormatProvider.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/AmpXml250.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/AmpXml250.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/AmpXml250.cs 2011-01-01 11:15:30.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/AmpXml250.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/AnyPwCsv144.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/AnyPwCsv144.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/AnyPwCsv144.cs 2011-01-01 11:15:30.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/AnyPwCsv144.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/CodeWalletTxt605.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/CodeWalletTxt605.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/CodeWalletTxt605.cs 2011-01-01 11:15:30.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/CodeWalletTxt605.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/DataVaultCsv47.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/DataVaultCsv47.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/DataVaultCsv47.cs 2011-04-08 10:52:42.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/DataVaultCsv47.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/FlexWalletXml17.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/FlexWalletXml17.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/FlexWalletXml17.cs 2011-02-12 10:36:52.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/FlexWalletXml17.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/GenericCsv.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/GenericCsv.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/GenericCsv.cs 2011-02-21 16:46:56.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/GenericCsv.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/HandySafeProXml12.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/HandySafeProXml12.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/HandySafeProXml12.cs 2011-01-01 11:15:30.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/HandySafeProXml12.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/HandySafeTxt512.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/HandySafeTxt512.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/HandySafeTxt512.cs 2011-01-01 11:15:30.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/HandySafeTxt512.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KasperskyPwMgrXml50.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KasperskyPwMgrXml50.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KasperskyPwMgrXml50.cs 2011-06-15 12:17:24.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KasperskyPwMgrXml50.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassCsv1x.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassCsv1x.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassCsv1x.cs 2011-01-01 11:15:30.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassCsv1x.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassHtml2x.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassHtml2x.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassHtml2x.cs 2011-03-19 14:50:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassHtml2x.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassKdb1x.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassKdb1x.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassKdb1x.cs 2011-01-01 11:15:30.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassKdb1x.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassKdb2x.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassKdb2x.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassKdb2x.cs 2011-01-01 11:15:30.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassKdb2x.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassKdb2xRepair.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassKdb2xRepair.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassKdb2xRepair.cs 2011-01-01 11:15:30.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassKdb2xRepair.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassXml1x.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassXml1x.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassXml1x.cs 2011-06-20 13:00:58.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassXml1x.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassXml2x.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassXml2x.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassXml2x.cs 2011-01-01 11:15:30.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassXml2x.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassXXml041.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassXXml041.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/KeePassXXml041.cs 2011-03-02 10:38:56.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/KeePassXXml041.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/MozillaBookmarksHtml100.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/MozillaBookmarksHtml100.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/MozillaBookmarksHtml100.cs 2011-03-19 14:50:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/MozillaBookmarksHtml100.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/MozillaBookmarksJson100.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/MozillaBookmarksJson100.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/MozillaBookmarksJson100.cs 2011-01-01 11:15:30.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/MozillaBookmarksJson100.cs 2012-01-01 11:55:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/OnePwProCsv599.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/OnePwProCsv599.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/OnePwProCsv599.cs 2011-03-09 12:35:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/OnePwProCsv599.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PassKeeper12.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PassKeeper12.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PassKeeper12.cs 2011-01-01 11:15:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PassKeeper12.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PinsTxt450.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PinsTxt450.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PinsTxt450.cs 2011-01-01 11:15:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PinsTxt450.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PpKeeperHtml270.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PpKeeperHtml270.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PpKeeperHtml270.cs 2011-01-01 11:15:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PpKeeperHtml270.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -20,9 +20,10 @@ using System; using System.Collections.Generic; using System.Text; +using System.Text.RegularExpressions; using System.Drawing; -using System.Diagnostics; using System.IO; +using System.Diagnostics; using KeePass.Resources; @@ -33,7 +34,7 @@ namespace KeePass.DataExchange.Formats { - // 2.70 + // 2.50 and 2.70 internal sealed class PpKeeperHtml270 : FileFormatProvider { public override bool SupportsImport { get { return true; } } @@ -47,15 +48,17 @@ public override Image SmallIcon { + // Passphrase Keeper uses the same standard XP keys icon + // as Whisper 32 get { return KeePass.Properties.Resources.B16x16_Imp_Whisper32; } } private const string m_strStartTd = ""; private const string m_strEndTd = @""; - private const string m_strModifiedField = @"{0530D298-F983-454c-B5A3-BFB0775844D1}"; + private const string m_strModifiedField = @"{0530D298-F983-454C-B5A3-BFB0775844D1}"; - private const string m_strModifiedHeader = "Modified"; + private const string m_strModifiedHdrStart = "Modified"; public override void Import(PwDatabase pwStorage, Stream sInput, IStatusLogger slLogger) @@ -64,18 +67,34 @@ string strData = sr.ReadToEnd(); sr.Close(); - const string strNormalized = ""; - strData = strData.Replace("", strNormalized); - strData = strData.Replace("", strNormalized); - strData = strData.Replace("", strNormalized); - strData = strData.Replace("", strNormalized); - strData = strData.Replace("", strNormalized); - strData = strData.Replace("", strNormalized); + // 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 the old version 2.50 + string[] vRepl = new string[4]{ + @"", + @"", + @"", + @"" + }; + MatchCollection mc = Regex.Matches(strData, vRepl[2]); + if((mc != null) && (mc.Count > 0)) + { + 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) == false) + if(!ReadEntry(out peHeader, strData, ref nOffset, pwStorage)) { Debug.Assert(false); return; @@ -84,7 +103,7 @@ while((nOffset >= 0) && (nOffset < strData.Length)) { PwEntry pe; - if(ReadEntry(out pe, strData, ref nOffset, pwStorage) == false) + if(!ReadEntry(out pe, strData, ref nOffset, pwStorage)) { Debug.Assert(false); break; @@ -95,8 +114,8 @@ } } - private static bool ReadEntry(out PwEntry pe, string strData, ref int nOffset, - PwDatabase pd) + private static bool ReadEntry(out PwEntry pe, string strData, + ref int nOffset, PwDatabase pd) { pe = new PwEntry(true, true); @@ -159,7 +178,7 @@ private static DateTime ReadModified(string strValue) { if(strValue == null) { Debug.Assert(false); return DateTime.Now; } - if(strValue == m_strModifiedHeader) return DateTime.Now; + if(strValue.StartsWith(m_strModifiedHdrStart)) return DateTime.Now; string[] vParts = strValue.Split(new char[]{ ' ', ':', '/' }, StringSplitOptions.RemoveEmptyEntries); diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PVaultTxt14.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PVaultTxt14.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PVaultTxt14.cs 2011-01-01 11:15:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PVaultTxt14.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwAgentXml234.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwAgentXml234.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwAgentXml234.cs 2011-01-01 11:15:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwAgentXml234.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -31,10 +31,11 @@ using KeePassLib; using KeePassLib.Interfaces; using KeePassLib.Security; +using KeePassLib.Utility; namespace KeePass.DataExchange.Formats { - // 2.3.4 + // 2.3.4-2.6.2+ internal sealed class PwAgentXml234 : FileFormatProvider { private const string ElemGroup = "group"; @@ -66,8 +67,11 @@ public override void Import(PwDatabase pwStorage, Stream sInput, IStatusLogger slLogger) { + StreamReader sr = new StreamReader(sInput, Encoding.Default); XmlDocument xmlDoc = new XmlDocument(); - xmlDoc.Load(sInput); + xmlDoc.Load(sr); + sr.Close(); + sInput.Close(); XmlNode xmlRoot = xmlDoc.DocumentElement; @@ -109,8 +113,8 @@ pwStorage.MemoryProtection.ProtectTitle, XmlUtil.SafeInnerText(xmlChild))); else if(xmlChild.Name == ElemEntryType) - pe.IconId = (XmlUtil.SafeInnerText(xmlChild) != "1") ? - PwIcon.Key : PwIcon.PaperNew; + 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, @@ -129,21 +133,40 @@ XmlUtil.SafeInnerText(xmlChild))); else if(xmlChild.Name == ElemEntryCreationTime) { - if(DateTime.TryParse(XmlUtil.SafeInnerText(xmlChild), out dt)) + if(ParseDate(xmlChild, out dt)) pe.CreationTime = dt; } else if(xmlChild.Name == ElemEntryLastModTime) { - if(DateTime.TryParse(XmlUtil.SafeInnerText(xmlChild), out dt)) + if(ParseDate(xmlChild, out dt)) pe.LastModificationTime = dt; } else if(xmlChild.Name == ElemEntryExpireTime) { - if(DateTime.TryParse(XmlUtil.SafeInnerText(xmlChild), out dt)) + 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.Now; + return false; + } + + if(DateTime.TryParse(strDate, out dtOut)) return true; + + Debug.Assert(false); + dtOut = DateTime.Now; + return false; + } } } diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwDepotXml26.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwDepotXml26.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwDepotXml26.cs 2011-06-04 08:50:12.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwDepotXml26.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwExporterXml105.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwExporterXml105.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwExporterXml105.cs 2011-03-19 14:51:16.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwExporterXml105.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -105,7 +105,6 @@ } MemoryStream msXml = new MemoryStream(StrUtil.Utf8.GetBytes(strDoc), false); - XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(msXml); msXml.Close(); diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwGorillaCsv142.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwGorillaCsv142.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwGorillaCsv142.cs 2011-01-01 11:15:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwGorillaCsv142.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwKeeperCsv70.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwKeeperCsv70.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwKeeperCsv70.cs 2011-01-01 11:15:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwKeeperCsv70.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwMemory2008Xml104.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwMemory2008Xml104.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwMemory2008Xml104.cs 2011-03-19 14:51:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwMemory2008Xml104.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -57,6 +57,7 @@ XmlSerializer xs = new XmlSerializer(typeof(Priv_PwMem2008XmlFile)); Priv_PwMem2008XmlFile f = (Priv_PwMem2008XmlFile)xs.Deserialize(ms); + ms.Close(); if((f == null) || (f.Cells == null)) return; diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwPrompterDat12.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwPrompterDat12.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwPrompterDat12.cs 2011-02-21 18:11:58.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwPrompterDat12.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwSafeXml302.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwSafeXml302.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwSafeXml302.cs 2011-01-08 16:06:16.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwSafeXml302.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwsPlusCsv1007.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwsPlusCsv1007.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwsPlusCsv1007.cs 2011-04-08 11:10:58.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwsPlusCsv1007.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwTresorXml100.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwTresorXml100.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/PwTresorXml100.cs 2011-01-01 11:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/PwTresorXml100.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/RevelationXml04.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/RevelationXml04.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/RevelationXml04.cs 2011-01-01 11:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/RevelationXml04.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/RoboFormHtml69.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/RoboFormHtml69.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/RoboFormHtml69.cs 2011-04-02 21:26:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/RoboFormHtml69.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/SecurityTxt12.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/SecurityTxt12.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/SecurityTxt12.cs 2011-01-01 11:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/SecurityTxt12.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/Spamex20070328.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/Spamex20070328.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/Spamex20070328.cs 2011-02-21 17:21:10.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/Spamex20070328.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -94,7 +94,6 @@ RemoteCertificateValidationCallback pPrevCertCb = ServicePointManager.ServerCertificateValidationCallback; - ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) @@ -145,13 +144,10 @@ ImportIndex(pwStorage, strSubPage, vCookies, slLogger); } } - catch + finally { ServicePointManager.ServerCertificateValidationCallback = pPrevCertCb; - throw; } - - ServicePointManager.ServerCertificateValidationCallback = pPrevCertCb; } private static void ImportIndex(PwDatabase pwStorage, string strIndexPage, diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/SplashIdCsv402.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/SplashIdCsv402.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/SplashIdCsv402.cs 2011-01-01 11:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/SplashIdCsv402.cs 2012-01-03 12:36:48.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -29,10 +29,11 @@ using KeePassLib; using KeePassLib.Interfaces; using KeePassLib.Security; +using KeePassLib.Utility; namespace KeePass.DataExchange.Formats { - // 4.02 + // 4.02-5.3+ internal sealed class SplashIdCsv402 : FileFormatProvider { public override bool SupportsImport { get { return true; } } @@ -51,58 +52,68 @@ private const string StrHeader = "SplashID Export File"; - private static readonly SplashIdMapping[] SplashIdMappings = { - new SplashIdMapping("Bank Accts", PwIcon.Homebanking, - new string[]{ PwDefs.TitleField, "Account #", PwDefs.PasswordField, - PwDefs.UserNameField, "Branch", "Phone #" }), - new SplashIdMapping("Birthdays", PwIcon.UserCommunication, - new string[]{ PwDefs.TitleField, "Date" }), - new SplashIdMapping("Calling Cards", PwIcon.EMail, - 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" }), - new SplashIdMapping("Combinations", PwIcon.Key, - new string[]{ PwDefs.TitleField, PwDefs.PasswordField }), - new SplashIdMapping("Credit Cards", PwIcon.UserKey, - new string[]{ PwDefs.TitleField, "Card #", "Expiration Date", - PwDefs.UserNameField, PwDefs.PasswordField, "Bank" }), - 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("Frequent Flyer", PwIcon.PaperQ, - new string[]{ PwDefs.TitleField, "Number", - PwDefs.UserNameField, "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" }), - 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, - "Purchase Date", "Reseller" }), - new SplashIdMapping("Vehicle Info", PwIcon.PaperReady, - new string[]{ PwDefs.TitleField, PwDefs.UserNameField, - PwDefs.PasswordField }), - new SplashIdMapping("Voice Mail", PwIcon.IRCommunication, - new string[]{ PwDefs.TitleField, PwDefs.UserNameField, - PwDefs.PasswordField }), - new SplashIdMapping("Web Logins", PwIcon.UserKey, - new string[]{ PwDefs.TitleField, PwDefs.UserNameField, - PwDefs.PasswordField, PwDefs.UrlField }) - }; + private static SplashIdMapping[] m_vMappings = null; + private static SplashIdMapping[] SplashIdMappings + { + get + { + if(m_vMappings != null) return m_vMappings; + + m_vMappings = new SplashIdMapping[]{ + new SplashIdMapping("Bank Accts", PwIcon.Homebanking, + new string[]{ PwDefs.TitleField, "Account #", PwDefs.PasswordField, + PwDefs.UserNameField, "Branch", "Phone #" }), + new SplashIdMapping("Birthdays", PwIcon.UserCommunication, + new string[]{ PwDefs.TitleField, "Date" }), + new SplashIdMapping("Calling Cards", PwIcon.EMail, + 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" }), + new SplashIdMapping("Combinations", PwIcon.Key, + new string[]{ PwDefs.TitleField, PwDefs.PasswordField }), + new SplashIdMapping("Credit Cards", PwIcon.UserKey, + new string[]{ PwDefs.TitleField, "Card #", "Expiration Date", + PwDefs.UserNameField, PwDefs.PasswordField, "Bank" }), + 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("Frequent Flyer", PwIcon.PaperQ, + new string[]{ PwDefs.TitleField, "Number", + PwDefs.UserNameField, "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" }), + 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, + "Purchase Date", "Reseller" }), + new SplashIdMapping("Vehicle Info", PwIcon.PaperReady, + new string[]{ PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField }), + new SplashIdMapping("Voice Mail", PwIcon.IRCommunication, + new string[]{ PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField }), + new SplashIdMapping("Web Logins", PwIcon.UserKey, + new string[]{ PwDefs.TitleField, PwDefs.UserNameField, + PwDefs.PasswordField, PwDefs.UrlField }) + }; + return m_vMappings; + } + } public override void Import(PwDatabase pwStorage, Stream sInput, IStatusLogger slLogger) @@ -135,7 +146,7 @@ string strGroupName = ParseCsvWord(list[12]) + " - " + strType; SplashIdMapping mp = null; - foreach(SplashIdMapping mpFind in SplashIdMappings) + foreach(SplashIdMapping mpFind in SplashIdCsv402.SplashIdMappings) { if(mpFind.TypeName == strType) { @@ -180,6 +191,13 @@ pe.Strings.Set(PwDefs.NotesField, new ProtectedString( pwStorage.MemoryProtection.ProtectNotes, ParseCsvWord(list[11]))); + + DateTime? dt = TimeUtil.ParseUSTextDate(ParseCsvWord(list[10])); + if(dt.HasValue) + { + pe.LastAccessTime = dt.Value; + pe.LastModificationTime = dt.Value; + } } private static string ParseCsvWord(string strWord) diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/SteganosPwManager2007.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/SteganosPwManager2007.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/SteganosPwManager2007.cs 2011-01-01 11:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/SteganosPwManager2007.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/StickyPwXml50.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/StickyPwXml50.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/StickyPwXml50.cs 2011-06-15 12:17:24.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/StickyPwXml50.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/Whisper32Csv116.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/Whisper32Csv116.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/Whisper32Csv116.cs 2011-01-01 11:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/Whisper32Csv116.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/WinFavorites10.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/WinFavorites10.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/WinFavorites10.cs 2011-05-04 17:20:10.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/WinFavorites10.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/XslTransform2x.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/XslTransform2x.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/XslTransform2x.cs 2011-02-21 17:21:10.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/XslTransform2x.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -76,6 +76,7 @@ kdb.Save(msDataXml, pwExportInfo.DataGroup, Kdb4Format.PlainXml, slLogger); byte[] pbData = msDataXml.ToArray(); + msDataXml.Close(); MemoryStream msDataRead = new MemoryStream(pbData, false); XmlReader xmlDataReader = XmlReader.Create(msDataRead); @@ -90,6 +91,8 @@ XmlWriter xmlWriter = XmlWriter.Create(sOutput, xws); xsl.Transform(xmlDataReader, xmlWriter); xmlWriter.Close(); + xmlDataReader.Close(); + msDataRead.Close(); Array.Clear(pbData, 0, pbData.Length); return true; diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Formats/ZdnPwProTxt314.cs keepass2-2.18+dfsg/KeePass/DataExchange/Formats/ZdnPwProTxt314.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Formats/ZdnPwProTxt314.cs 2011-01-01 11:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Formats/ZdnPwProTxt314.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/ImportUtil.cs keepass2-2.18+dfsg/KeePass/DataExchange/ImportUtil.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/ImportUtil.cs 2011-03-19 16:09:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/ImportUtil.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -482,10 +482,14 @@ bool bProtect = ((pdContext == null) ? false : pdContext.MemoryProtection.GetProtection(strName)); - string strPrev = pe.Strings.ReadSafe(strName); + ProtectedString ps = pe.Strings.Get(strName); + string strPrev = ((ps != null) ? ps.ReadString() : null); + if(ps != null) bProtect = ps.IsProtected; + + strValue = (strValue ?? string.Empty); if(string.IsNullOrEmpty(strPrev)) pe.Strings.Set(strName, new ProtectedString(bProtect, strValue)); - else if(!string.IsNullOrEmpty(strValue)) + else if(strValue.Length > 0) pe.Strings.Set(strName, new ProtectedString(bProtect, strPrev + @", " + strValue)); } diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Json.cs keepass2-2.18+dfsg/KeePass/DataExchange/Json.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Json.cs 2011-01-01 11:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Json.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Kdb3File.cs keepass2-2.18+dfsg/KeePass/DataExchange/Kdb3File.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Kdb3File.cs 2011-06-21 15:50:06.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Kdb3File.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -27,6 +27,7 @@ using KeePassLib; using KeePassLib.Security; +using KeePassLib.Collections; using KeePassLib.Delegates; using KeePassLib.Interfaces; using KeePassLib.Keys; @@ -244,8 +245,10 @@ } if(m_slLogger != null) + { if(!m_slLogger.SetProgress((100 * uEntry) / uEntryCount)) throw new Exception(KPRes.Cancel); + } } } @@ -567,10 +570,12 @@ string strWindow = strLine.Substring(strWndPrefix.Length).Trim(); string strSeq = FindPrefixedLine(vLines, strSeqPrefix); if((strSeq != null) && (strSeq.Length > strSeqPrefix.Length)) - peStorage.AutoType.Set(strWindow, ConvertAutoTypeSequence( - strSeq.Substring(strSeqPrefix.Length), true)); + peStorage.AutoType.Add(new AutoTypeAssociation( + strWindow, ConvertAutoTypeSequence(strSeq.Substring( + strSeqPrefix.Length), true))); else // Window, but no sequence - peStorage.AutoType.Set(strWindow, string.Empty); + peStorage.AutoType.Add(new AutoTypeAssociation( + strWindow, string.Empty)); bProcessed = true; break; @@ -712,7 +717,7 @@ ++uIndex; } - foreach(KeyValuePair kvp in peSource.AutoType.WindowSequencePairs) + foreach(AutoTypeAssociation a in peSource.AutoType.Associations) { if(bSeparator == false) { @@ -726,11 +731,11 @@ sbAppend.Append(AutoTypePrefix + strSuffix); sbAppend.Append(@": "); - sbAppend.Append(ConvertAutoTypeSeqExp(kvp.Value, peSource)); + sbAppend.Append(ConvertAutoTypeSeqExp(a.Sequence, peSource)); sbAppend.Append(MessageService.NewLine); sbAppend.Append(AutoTypeWindowPrefix + strSuffix); sbAppend.Append(@": "); - sbAppend.Append(kvp.Key); + sbAppend.Append(a.WindowName); sbAppend.Append(MessageService.NewLine); ++uIndex; diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/Kdb3Manager.cs keepass2-2.18+dfsg/KeePass/DataExchange/Kdb3Manager.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/Kdb3Manager.cs 2011-01-01 11:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/Kdb3Manager.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/DataExchange/PwExportInfo.cs keepass2-2.18+dfsg/KeePass/DataExchange/PwExportInfo.cs --- keepass2-2.16+dfsg/KeePass/DataExchange/PwExportInfo.cs 2011-01-01 11:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/DataExchange/PwExportInfo.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasAction.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasAction.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasAction.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasAction.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasActionProvider.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasActionProvider.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasActionProvider.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasActionProvider.cs 2012-01-01 11:57:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasActionType.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasActionType.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasActionType.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasActionType.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasCondition.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasCondition.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasCondition.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasCondition.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasConditionProvider.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasConditionProvider.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasConditionProvider.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasConditionProvider.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasConditionType.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasConditionType.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasConditionType.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasConditionType.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasContext.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasContext.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasContext.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasContext.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasDefaultActionProvider.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasDefaultActionProvider.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasDefaultActionProvider.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasDefaultActionProvider.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -255,22 +255,7 @@ if(!string.IsNullOrEmpty(iocBase.Password)) iocBase.CredSaveMode = IOCredSaveMode.SaveCred; - if(string.IsNullOrEmpty(iocBase.UserName) && string.IsNullOrEmpty(iocBase.Password)) - { - MruList mru = Program.MainForm.FileMruList; - for(uint u = 0; u < mru.ItemCount; ++u) - { - IOConnectionInfo iocMru = (mru.GetItem(u).Value as IOConnectionInfo); - if(iocMru == null) { Debug.Assert(false); continue; } - - if(iocMru.Path == iocBase.Path) - { - iocBase = iocMru.CloneDeep(); - break; - } - } - } - + iocBase = Program.MainForm.CompleteConnectionInfoUsingMru(iocBase); return MainForm.CompleteConnectionInfo(iocBase, false, true, true, false); } diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasDefaultConditionProvider.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasDefaultConditionProvider.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasDefaultConditionProvider.cs 2011-03-13 13:02:50.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasDefaultConditionProvider.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -128,11 +128,12 @@ int[] vTimeOuts = { 250, 1250 }; const string strBuffer = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; byte[] pbBuffer = Encoding.ASCII.GetBytes(strBuffer); - Ping ping = new Ping(); - PingOptions options = new PingOptions(64, true); 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); diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasDefaultEventProvider.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasDefaultEventProvider.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasDefaultEventProvider.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasDefaultEventProvider.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasEnum.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasEnum.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasEnum.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasEnum.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasEvent.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasEvent.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasEvent.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasEvent.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasEventProvider.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasEventProvider.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasEventProvider.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasEventProvider.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasEventType.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasEventType.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasEventType.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasEventType.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasParameter.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasParameter.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasParameter.cs 2011-01-01 11:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasParameter.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasPool.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasPool.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasPool.cs 2011-01-01 11:19:38.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasPool.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasSystemEvents.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasSystemEvents.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasSystemEvents.cs 2011-01-01 11:19:38.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasSystemEvents.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasTrigger.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasTrigger.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasTrigger.cs 2011-01-01 11:19:38.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasTrigger.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Text; using System.Xml.Serialization; +using System.ComponentModel; using System.Diagnostics; using KeePassLib; @@ -57,6 +58,7 @@ } private string m_strName = string.Empty; + [DefaultValue("")] public string Name { get { return m_strName; } @@ -68,6 +70,7 @@ } private string m_strComments = string.Empty; + [DefaultValue("")] public string Comments { get { return m_strComments; } @@ -79,6 +82,7 @@ } private bool m_bEnabled = true; + [DefaultValue(true)] public bool Enabled { get { return m_bEnabled; } @@ -86,6 +90,7 @@ } private bool m_bInitiallyOn = true; + [DefaultValue(true)] public bool InitiallyOn { get { return m_bInitiallyOn; } @@ -101,6 +106,7 @@ } private bool m_bTurnOffAfterAction = false; + [DefaultValue(false)] public bool TurnOffAfterAction { get { return m_bTurnOffAfterAction; } diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasTriggerSystem.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasTriggerSystem.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasTriggerSystem.cs 2011-01-01 11:19:38.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasTriggerSystem.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Text; using System.Xml.Serialization; +using System.ComponentModel; using KeePass.Resources; using KeePass.UI; @@ -35,6 +36,7 @@ public sealed class EcasTriggerSystem : IDeepCloneable { private bool m_bEnabled = true; + [DefaultValue(true)] public bool Enabled { get { return m_bEnabled; } diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasUtil.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasUtil.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasUtil.cs 2011-01-01 11:19:38.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasUtil.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -100,15 +100,14 @@ if(bSprCompile && !string.IsNullOrEmpty(str)) { - PwDatabase pd = null; - try { pd = Program.MainForm.ActiveDatabase; } - catch(Exception) { Debug.Assert(false); } - PwEntry pe = null; try { pe = Program.MainForm.GetSelectedEntry(false); } catch(Exception) { Debug.Assert(false); } - str = SprEngine.Compile(str, false, pe, pd, false, bSprForCommandLine); + PwDatabase pd = Program.MainForm.DocumentManager.SafeFindContainerOf(pe); + + str = SprEngine.Compile(str, new SprContext(pe, pd, + SprCompileFlags.All, false, bSprForCommandLine)); } return str; diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/EcasValueType.cs keepass2-2.18+dfsg/KeePass/Ecas/EcasValueType.cs --- keepass2-2.16+dfsg/KeePass/Ecas/EcasValueType.cs 2011-01-01 11:19:38.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/EcasValueType.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/IEcasObject.cs keepass2-2.18+dfsg/KeePass/Ecas/IEcasObject.cs --- keepass2-2.16+dfsg/KeePass/Ecas/IEcasObject.cs 2011-01-01 11:19:38.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/IEcasObject.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Ecas/IEcasParameterized.cs keepass2-2.18+dfsg/KeePass/Ecas/IEcasParameterized.cs --- keepass2-2.16+dfsg/KeePass/Ecas/IEcasParameterized.cs 2011-01-01 11:19:38.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Ecas/IEcasParameterized.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/AboutForm.cs keepass2-2.18+dfsg/KeePass/Forms/AboutForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/AboutForm.cs 2011-07-02 18:55:26.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/AboutForm.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -62,7 +62,7 @@ strTitle, strDesc); this.Icon = Properties.Resources.KeePass; - m_lvComponents.Columns.Add(KPRes.Components, 100, HorizontalAlignment.Left); + m_lvComponents.Columns.Add(KPRes.Component, 100, HorizontalAlignment.Left); m_lvComponents.Columns.Add(KPRes.Version, 100, HorizontalAlignment.Left); try { GetAppComponents(); } diff -Nru keepass2-2.16+dfsg/KeePass/Forms/AutoTypeCtxForm.cs keepass2-2.18+dfsg/KeePass/Forms/AutoTypeCtxForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/AutoTypeCtxForm.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/AutoTypeCtxForm.cs 2012-01-01 11:59:22.000000000 +0000 @@ -0,0 +1,254 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2012 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.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Diagnostics; + +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 ContextMenuStrip 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(); + Program.Translation.ApplyTo(this); + } + + private void OnFormLoad(object sender, EventArgs e) + { + GlobalWindowManager.AddWindow(this); + + m_lblText.Text = KPRes.AutoTypeEntrySelectionDescLong; + this.Text = KPRes.AutoTypeEntrySelection; + this.Icon = Properties.Resources.KeePass; + + string strRect = Program.Config.UI.AutoTypeCtxRect; + if(strRect.Length > 0) UIUtil.SetWindowScreenRect(this, strRect); + m_strInitialFormRect = UIUtil.GetWindowScreenRect(this); + + this.MinimumSize = new Size(550, 300); + + UIUtil.SetExplorerTheme(m_lvItems.Handle); + if(UISystemFonts.ListFont != null) + m_lvItems.Font = UISystemFonts.ListFont; + + if(m_ilIcons != null) m_lvItems.SmallImageList = m_ilIcons; + else { Debug.Assert(false); m_ilIcons = new ImageList(); } + + RecreateEntryList(); + + string strColWidths = Program.Config.UI.AutoTypeCtxColumnWidths; + if(strColWidths.Length > 0) UIUtil.SetColumnWidths(m_lvItems, strColWidths); + m_strInitialColWidths = UIUtil.GetColumnWidths(m_lvItems); + + ProcessResize(); + this.BringToFront(); + this.Activate(); + UIUtil.SetFocus(m_lvItems, this); + } + + private void RecreateEntryList() + { + long lFlags = Program.Config.UI.AutoTypeCtxFlags; + UIUtil.CreateEntryList(m_lvItems, m_lCtxs, (AceAutoTypeCtxFlags)lFlags, + m_ilIcons); + } + + private void OnFormClosed(object sender, FormClosedEventArgs e) + { + CleanUpEx(); + GlobalWindowManager.RemoveWindow(this); + } + + private void CleanUpEx() + { + string strColWidths = UIUtil.GetColumnWidths(m_lvItems); + if(strColWidths != m_strInitialColWidths) + Program.Config.UI.AutoTypeCtxColumnWidths = strColWidths; + + string strRect = UIUtil.GetWindowScreenRect(this); + if(strRect != m_strInitialFormRect) + Program.Config.UI.AutoTypeCtxRect = strRect; + + DestroyToolsContextMenu(); + + if(m_ilIcons != null) + { + m_ilIcons.Dispose(); + m_ilIcons = null; + } + } + + private void ProcessResize() + { + BannerFactory.UpdateBanner(this, m_bannerImage, + Properties.Resources.B48x48_KGPG_Key2, KPRes.AutoTypeEntrySelection, + KPRes.AutoTypeEntrySelectionDescShort, 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(); + } + + 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 ContextMenuStrip(); + m_tsmiColumns = new ToolStripMenuItem(KPRes.Columns); + m_ctxTools.Items.Add(m_tsmiColumns); + + long lFlags = Program.Config.UI.AutoTypeCtxFlags; + + ToolStripMenuItem tsmi = new ToolStripMenuItem(KPRes.Title); + tsmi.Checked = true; + tsmi.Tag = AceAutoTypeCtxFlags.ColTitle; + tsmi.Click += this.OnToggleColumn; + tsmi.Enabled = false; + m_tsmiColumns.DropDownItems.Add(tsmi); + + tsmi = new ToolStripMenuItem(KPRes.UserName); + tsmi.Checked = ((lFlags & (long)AceAutoTypeCtxFlags.ColUserName) != 0); + tsmi.Tag = AceAutoTypeCtxFlags.ColUserName; + tsmi.Click += this.OnToggleColumn; + m_tsmiColumns.DropDownItems.Add(tsmi); + + tsmi = new ToolStripMenuItem(KPRes.Password); + tsmi.Checked = ((lFlags & (long)AceAutoTypeCtxFlags.ColPassword) != 0); + tsmi.Tag = AceAutoTypeCtxFlags.ColPassword; + tsmi.Click += this.OnToggleColumn; + m_tsmiColumns.DropDownItems.Add(tsmi); + + tsmi = new ToolStripMenuItem(KPRes.Url); + tsmi.Checked = ((lFlags & (long)AceAutoTypeCtxFlags.ColUrl) != 0); + tsmi.Tag = AceAutoTypeCtxFlags.ColUrl; + tsmi.Click += this.OnToggleColumn; + m_tsmiColumns.DropDownItems.Add(tsmi); + + tsmi = new ToolStripMenuItem(KPRes.Notes); + tsmi.Checked = ((lFlags & (long)AceAutoTypeCtxFlags.ColNotes) != 0); + tsmi.Tag = AceAutoTypeCtxFlags.ColNotes; + tsmi.Click += this.OnToggleColumn; + m_tsmiColumns.DropDownItems.Add(tsmi); + + tsmi = new ToolStripMenuItem(KPRes.Sequence); + tsmi.Checked = ((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.Show(m_btnTools, 0, m_btnTools.Height); + } + } +} diff -Nru keepass2-2.16+dfsg/KeePass/Forms/AutoTypeCtxForm.Designer.cs keepass2-2.18+dfsg/KeePass/Forms/AutoTypeCtxForm.Designer.cs --- keepass2-2.16+dfsg/KeePass/Forms/AutoTypeCtxForm.Designer.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/AutoTypeCtxForm.Designer.cs 2011-11-11 15:44:44.000000000 +0000 @@ -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_pnlMiddle = new System.Windows.Forms.Panel(); + this.m_btnTools = new System.Windows.Forms.Button(); + ((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 = 0; + 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 = 1; + // + // 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 = 2; + // + // 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; + // + // 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 = 1; + this.m_btnTools.Text = "&Options"; + this.m_btnTools.UseVisualStyleBackColor = true; + this.m_btnTools.Click += new System.EventHandler(this.OnBtnTools); + // + // 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 -Nru keepass2-2.16+dfsg/KeePass/Forms/AutoTypeCtxForm.resx keepass2-2.18+dfsg/KeePass/Forms/AutoTypeCtxForm.resx --- keepass2-2.16+dfsg/KeePass/Forms/AutoTypeCtxForm.resx 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/AutoTypeCtxForm.resx 2011-11-11 15:44:44.000000000 +0000 @@ -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 -Nru keepass2-2.16+dfsg/KeePass/Forms/CharPickerForm.cs keepass2-2.18+dfsg/KeePass/Forms/CharPickerForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/CharPickerForm.cs 2011-07-09 15:16:58.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/CharPickerForm.cs 2012-01-01 15:18:28.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -39,7 +39,7 @@ public partial class CharPickerForm : Form { private ProtectedString m_psWord = null; - private ProtectedString m_psSelected = new ProtectedString(false); + private ProtectedString m_psSelected = ProtectedString.Empty; private SecureEdit m_secWord = new SecureEdit(); private List
    /// String container. Must not be null. /// Initial name of the string. May be null. - /// Initial value. May be null. + /// Initial value. May be null. public void InitEx(ProtectedStringDictionary vStringDict, string strStringName, - ProtectedString psStringValue, PwDatabase pwContext) + ProtectedString psStringInitialValue, PwDatabase pwContext) { Debug.Assert(vStringDict != null); if(vStringDict == null) throw new ArgumentNullException("vStringDict"); m_vStringDict = vStringDict; m_strStringName = strStringName; - m_psStringValue = psStringValue; + m_psStringInitialValue = psStringInitialValue; m_pwContext = pwContext; } @@ -78,7 +77,7 @@ GlobalWindowManager.AddWindow(this); - m_ctxValue.Attach(m_richStringValue); + m_ctxValue.Attach(m_richStringValue, this); string strTitle, strDesc; if(m_strStringName == null) @@ -96,16 +95,14 @@ Properties.Resources.B48x48_Font, strTitle, strDesc); this.Icon = Properties.Resources.KeePass; - m_clrNormalBackground = m_cmbStringName.BackColor; - UIUtil.EnableAutoCompletion(m_cmbStringName, true); UIUtil.PrepareStandardMultilineControl(m_richStringValue, true, true); if(m_strStringName != null) m_cmbStringName.Text = m_strStringName; - if(m_psStringValue != null) + if(m_psStringInitialValue != null) { - m_richStringValue.Text = m_psStringValue.ReadString(); - m_cbProtect.Checked = m_psStringValue.IsProtected; + m_richStringValue.Text = m_psStringInitialValue.ReadString(); + m_cbProtect.Checked = m_psStringInitialValue.IsProtected; } ValidateStringName(); @@ -147,7 +144,7 @@ else if(str.Length <= 0) { m_lblValidationInfo.Text = KPRes.FieldNamePrompt; - m_cmbStringName.BackColor = m_clrNormalBackground; + m_cmbStringName.ResetBackColor(); m_btnOK.Enabled = false; return false; @@ -169,7 +166,7 @@ else { m_lblValidationInfo.Text = string.Empty; - m_cmbStringName.BackColor = m_clrNormalBackground; + m_cmbStringName.ResetBackColor(); m_btnOK.Enabled = true; } // See ValidateStringNameEx @@ -196,26 +193,12 @@ } else // Edit string field { - if(m_strStringName.Equals(strName)) - { - if(m_psStringValue != null) - { - m_psStringValue.SetString(m_richStringValue.Text); - m_psStringValue.EnableProtection(m_cbProtect.Checked); - } - else - { - ProtectedString ps = new ProtectedString(m_cbProtect.Checked, m_richStringValue.Text); - m_vStringDict.Set(strName, ps); - } - } - else - { + if(!m_strStringName.Equals(strName)) m_vStringDict.Remove(m_strStringName); - ProtectedString ps = new ProtectedString(m_cbProtect.Checked, m_richStringValue.Text); - m_vStringDict.Set(strName, ps); - } + ProtectedString ps = new ProtectedString(m_cbProtect.Checked, + m_richStringValue.Text); + m_vStringDict.Set(strName, ps); } } diff -Nru keepass2-2.16+dfsg/KeePass/Forms/EntropyForm.cs keepass2-2.18+dfsg/KeePass/Forms/EntropyForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/EntropyForm.cs 2011-07-02 19:07:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/EntropyForm.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -48,7 +48,7 @@ public static byte[] CollectEntropyIfEnabled(PwProfile pp) { - if(pp.CollectUserEntropy == false) return null; + if(!pp.CollectUserEntropy) return null; EntropyForm ef = new EntropyForm(); if(UIUtil.ShowDialogNotValue(ef, DialogResult.OK)) return null; diff -Nru keepass2-2.16+dfsg/KeePass/Forms/EntryListForm.cs keepass2-2.18+dfsg/KeePass/Forms/EntryListForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/EntryListForm.cs 2011-07-02 19:07:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/EntryListForm.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -130,7 +130,7 @@ ListView.SelectedListViewItemCollection slvic = m_lvEntries.SelectedItems; if(slvic.Count == 1) { - m_peSelected = slvic[0].Tag as PwEntry; + m_peSelected = (slvic[0].Tag as PwEntry); if(bSetDialogResult) this.DialogResult = DialogResult.OK; return true; diff -Nru keepass2-2.16+dfsg/KeePass/Forms/EntryReportForm.cs keepass2-2.18+dfsg/KeePass/Forms/EntryReportForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/EntryReportForm.cs 2011-01-01 11:28:52.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/EntryReportForm.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/ExchangeDataForm.cs keepass2-2.18+dfsg/KeePass/Forms/ExchangeDataForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/ExchangeDataForm.cs 2011-07-02 19:07:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/ExchangeDataForm.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/FieldRefForm.cs keepass2-2.18+dfsg/KeePass/Forms/FieldRefForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/FieldRefForm.cs 2011-06-04 16:26:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/FieldRefForm.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -71,7 +71,6 @@ this.Icon = Properties.Resources.KeePass; UIUtil.SetExplorerTheme(m_lvEntries.Handle); - if(UISystemFonts.ListFont != null) m_lvEntries.Font = UISystemFonts.ListFont; @@ -157,6 +156,7 @@ SearchParameters sp = SearchParameters.None; sp.SearchString = strSearch; + sp.RespectEntrySearchingDisabled = false; if(tchField == 'T') sp.SearchInTitles = true; else if(tchField == 'U') sp.SearchInUserNames = true; @@ -167,7 +167,7 @@ else { Debug.Assert(false); return true; } PwObjectList l = new PwObjectList(); - m_pgEntrySource.SearchEntries(sp, l, false); + m_pgEntrySource.SearchEntries(sp, l); if(l.UCount == 0) { Debug.Assert(false); return false; } else if(l.UCount == 1) return false; @@ -177,7 +177,7 @@ private void OnBtnOK(object sender, EventArgs e) { - if(!this.CreateResultRef()) this.DialogResult = DialogResult.None; + if(!CreateResultRef()) this.DialogResult = DialogResult.None; } private void OnBtnCancel(object sender, EventArgs e) @@ -218,7 +218,7 @@ sp.SearchInPasswords = true; PwObjectList lResults = new PwObjectList(); - m_pgEntrySource.SearchEntries(sp, lResults, true); + m_pgEntrySource.SearchEntries(sp, lResults); UIUtil.CreateEntryList(m_lvEntries, lResults, m_vColumns, m_ilIcons); } diff -Nru keepass2-2.16+dfsg/KeePass/Forms/FileBrowserForm.cs keepass2-2.18+dfsg/KeePass/Forms/FileBrowserForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/FileBrowserForm.cs 2011-03-12 15:44:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/FileBrowserForm.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -105,7 +105,6 @@ UIUtil.SetExplorerTheme(m_tvFolders.Handle); UIUtil.SetExplorerTheme(m_lvFiles.Handle); } - if(UISystemFonts.ListFont != null) { m_tvFolders.Font = UISystemFonts.ListFont; diff -Nru keepass2-2.16+dfsg/KeePass/Forms/GroupForm.cs keepass2-2.18+dfsg/KeePass/Forms/GroupForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/GroupForm.cs 2011-07-02 19:07:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/GroupForm.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -111,6 +111,7 @@ CustomizeForScreenReader(); EnableControlsEx(); + UIUtil.SetFocus(m_tbName, this); } private void CustomizeForScreenReader() @@ -187,14 +188,13 @@ private void OnBtnAutoTypeEdit(object sender, EventArgs e) { - string strName = @"(" + KPRes.AutoType + @")"; + // string strName = @"(" + KPRes.AutoType + @")"; AutoTypeConfig atConfig = new AutoTypeConfig(); atConfig.DefaultSequence = m_tbDefaultAutoTypeSeq.Text; EditAutoTypeItemForm dlg = new EditAutoTypeItemForm(); - dlg.InitEx(atConfig, new ProtectedStringDictionary(), - strName, true); + dlg.InitEx(atConfig, new ProtectedStringDictionary(), -1, true); if(dlg.ShowDialog() == DialogResult.OK) m_tbDefaultAutoTypeSeq.Text = atConfig.DefaultSequence; diff -Nru keepass2-2.16+dfsg/KeePass/Forms/HelpSourceForm.cs keepass2-2.18+dfsg/KeePass/Forms/HelpSourceForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/HelpSourceForm.cs 2011-07-02 19:10:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/HelpSourceForm.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/IconPickerForm.cs keepass2-2.18+dfsg/KeePass/Forms/IconPickerForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/IconPickerForm.cs 2011-03-30 09:09:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/IconPickerForm.cs 2012-01-01 11:59:22.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -265,6 +265,8 @@ ms.ToArray()); m_pwDatabase.CustomIcons.Add(pwci); + ms.Close(); + m_pwDatabase.UINeedsIconUpdate = true; bSelectLastIcon = true; } diff -Nru keepass2-2.16+dfsg/KeePass/Forms/ImportCsvForm.cs keepass2-2.18+dfsg/KeePass/Forms/ImportCsvForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/ImportCsvForm.cs 2011-01-01 11:28:52.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/ImportCsvForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/ImportMethodForm.cs keepass2-2.18+dfsg/KeePass/Forms/ImportMethodForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/ImportMethodForm.cs 2011-07-02 19:10:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/ImportMethodForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/InternalBrowserForm.cs keepass2-2.18+dfsg/KeePass/Forms/InternalBrowserForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/InternalBrowserForm.cs 2011-03-12 16:54:36.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/InternalBrowserForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/IOConnectionForm.cs keepass2-2.18+dfsg/KeePass/Forms/IOConnectionForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/IOConnectionForm.cs 2011-07-02 19:10:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/IOConnectionForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -115,10 +115,11 @@ private void OnBtnOK(object sender, EventArgs e) { string strUrl = m_tbUrl.Text; - - if(strUrl.IndexOf(@"://") < 0) + if(strUrl.IndexOf("://") < 0) { - m_ttInvalidUrl.Show(KPRes.InvalidUrl, m_tbUrl); + // m_ttInvalidUrl.Show(KPRes.InvalidUrl, m_tbUrl); + MessageService.ShowWarning(strUrl, KPRes.InvalidUrl); + this.DialogResult = DialogResult.None; return; } @@ -135,7 +136,7 @@ if(m_bTestConnection && !m_bSave) { - if(this.TestConnectionEx() == false) + if(!TestConnectionEx()) this.DialogResult = DialogResult.None; } } diff -Nru keepass2-2.16+dfsg/KeePass/Forms/IOConnectionForm.Designer.cs keepass2-2.18+dfsg/KeePass/Forms/IOConnectionForm.Designer.cs --- keepass2-2.16+dfsg/KeePass/Forms/IOConnectionForm.Designer.cs 2010-01-27 14:22:54.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/IOConnectionForm.Designer.cs 2011-12-28 18:11:32.000000000 +0000 @@ -28,7 +28,6 @@ ///
    private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); this.m_bannerImage = new System.Windows.Forms.PictureBox(); this.m_btnOK = new System.Windows.Forms.Button(); this.m_btnCancel = new System.Windows.Forms.Button(); @@ -41,7 +40,6 @@ this.m_lblSeparator = new System.Windows.Forms.Label(); this.m_lblCredNote = new System.Windows.Forms.Label(); this.m_btnHelp = new System.Windows.Forms.Button(); - this.m_ttInvalidUrl = new System.Windows.Forms.ToolTip(this.components); this.m_cmbCredSaveMode = new System.Windows.Forms.ComboBox(); this.m_lblRemember = new System.Windows.Forms.Label(); this.m_lblUrlExamples = new System.Windows.Forms.Label(); @@ -64,7 +62,7 @@ this.m_btnOK.Location = new System.Drawing.Point(253, 281); this.m_btnOK.Name = "m_btnOK"; this.m_btnOK.Size = new System.Drawing.Size(75, 23); - this.m_btnOK.TabIndex = 9; + this.m_btnOK.TabIndex = 11; this.m_btnOK.Text = "&OK"; this.m_btnOK.UseVisualStyleBackColor = true; this.m_btnOK.Click += new System.EventHandler(this.OnBtnOK); @@ -75,7 +73,7 @@ this.m_btnCancel.Location = new System.Drawing.Point(334, 281); this.m_btnCancel.Name = "m_btnCancel"; this.m_btnCancel.Size = new System.Drawing.Size(75, 23); - this.m_btnCancel.TabIndex = 10; + this.m_btnCancel.TabIndex = 12; this.m_btnCancel.Text = "&Cancel"; this.m_btnCancel.UseVisualStyleBackColor = true; this.m_btnCancel.Click += new System.EventHandler(this.OnBtnCancel); @@ -102,7 +100,7 @@ this.m_lblUserName.Location = new System.Drawing.Point(12, 161); this.m_lblUserName.Name = "m_lblUserName"; this.m_lblUserName.Size = new System.Drawing.Size(61, 13); - this.m_lblUserName.TabIndex = 2; + this.m_lblUserName.TabIndex = 4; this.m_lblUserName.Text = "User name:"; // // m_tbUserName @@ -110,7 +108,7 @@ this.m_tbUserName.Location = new System.Drawing.Point(89, 158); this.m_tbUserName.Name = "m_tbUserName"; this.m_tbUserName.Size = new System.Drawing.Size(121, 20); - this.m_tbUserName.TabIndex = 3; + this.m_tbUserName.TabIndex = 5; // // m_lblPassword // @@ -118,7 +116,7 @@ this.m_lblPassword.Location = new System.Drawing.Point(216, 161); this.m_lblPassword.Name = "m_lblPassword"; this.m_lblPassword.Size = new System.Drawing.Size(56, 13); - this.m_lblPassword.TabIndex = 4; + this.m_lblPassword.TabIndex = 6; this.m_lblPassword.Text = "Password:"; // // m_tbPassword @@ -126,7 +124,7 @@ this.m_tbPassword.Location = new System.Drawing.Point(287, 158); this.m_tbPassword.Name = "m_tbPassword"; this.m_tbPassword.Size = new System.Drawing.Size(122, 20); - this.m_tbPassword.TabIndex = 5; + this.m_tbPassword.TabIndex = 7; this.m_tbPassword.UseSystemPasswordChar = true; // // m_lblSeparator @@ -135,14 +133,14 @@ this.m_lblSeparator.Location = new System.Drawing.Point(0, 270); this.m_lblSeparator.Name = "m_lblSeparator"; this.m_lblSeparator.Size = new System.Drawing.Size(421, 2); - this.m_lblSeparator.TabIndex = 12; + this.m_lblSeparator.TabIndex = 13; // // m_lblCredNote // this.m_lblCredNote.Location = new System.Drawing.Point(12, 190); this.m_lblCredNote.Name = "m_lblCredNote"; this.m_lblCredNote.Size = new System.Drawing.Size(397, 26); - this.m_lblCredNote.TabIndex = 6; + this.m_lblCredNote.TabIndex = 8; this.m_lblCredNote.Text = "The credentials you enter here are used to authenticate you against the server. D" + "o not enter your KeePass database master password."; // @@ -151,18 +149,11 @@ this.m_btnHelp.Location = new System.Drawing.Point(12, 281); this.m_btnHelp.Name = "m_btnHelp"; this.m_btnHelp.Size = new System.Drawing.Size(75, 23); - this.m_btnHelp.TabIndex = 11; + this.m_btnHelp.TabIndex = 14; this.m_btnHelp.Text = "&Help"; this.m_btnHelp.UseVisualStyleBackColor = true; this.m_btnHelp.Click += new System.EventHandler(this.OnBtnHelp); // - // m_ttInvalidUrl - // - this.m_ttInvalidUrl.AutoPopDelay = 32000; - this.m_ttInvalidUrl.InitialDelay = 250; - this.m_ttInvalidUrl.IsBalloon = true; - this.m_ttInvalidUrl.ReshowDelay = 100; - // // m_cmbCredSaveMode // this.m_cmbCredSaveMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; @@ -170,7 +161,7 @@ this.m_cmbCredSaveMode.Location = new System.Drawing.Point(91, 228); this.m_cmbCredSaveMode.Name = "m_cmbCredSaveMode"; this.m_cmbCredSaveMode.Size = new System.Drawing.Size(318, 21); - this.m_cmbCredSaveMode.TabIndex = 8; + this.m_cmbCredSaveMode.TabIndex = 10; // // m_lblRemember // @@ -178,7 +169,7 @@ this.m_lblRemember.Location = new System.Drawing.Point(12, 231); this.m_lblRemember.Name = "m_lblRemember"; this.m_lblRemember.Size = new System.Drawing.Size(61, 13); - this.m_lblRemember.TabIndex = 7; + this.m_lblRemember.TabIndex = 9; this.m_lblRemember.Text = "Remember:"; // // m_lblUrlExamples @@ -187,7 +178,7 @@ this.m_lblUrlExamples.Location = new System.Drawing.Point(86, 131); this.m_lblUrlExamples.Name = "m_lblUrlExamples"; this.m_lblUrlExamples.Size = new System.Drawing.Size(284, 13); - this.m_lblUrlExamples.TabIndex = 13; + this.m_lblUrlExamples.TabIndex = 3; this.m_lblUrlExamples.Text = "Example: ftp://ftp.someserver.com/pub/MyDatabase.kdbx"; // // m_lblUrlHints @@ -195,7 +186,7 @@ this.m_lblUrlHints.Location = new System.Drawing.Point(86, 102); this.m_lblUrlHints.Name = "m_lblUrlHints"; this.m_lblUrlHints.Size = new System.Drawing.Size(321, 29); - this.m_lblUrlHints.TabIndex = 14; + this.m_lblUrlHints.TabIndex = 2; this.m_lblUrlHints.Text = "The complete URL must be specified, including protocol, server and full path to t" + "he file."; // @@ -252,7 +243,6 @@ private System.Windows.Forms.Label m_lblSeparator; private System.Windows.Forms.Label m_lblCredNote; private System.Windows.Forms.Button m_btnHelp; - private System.Windows.Forms.ToolTip m_ttInvalidUrl; private System.Windows.Forms.ComboBox m_cmbCredSaveMode; private System.Windows.Forms.Label m_lblRemember; private System.Windows.Forms.Label m_lblUrlExamples; diff -Nru keepass2-2.16+dfsg/KeePass/Forms/IOConnectionForm.resx keepass2-2.18+dfsg/KeePass/Forms/IOConnectionForm.resx --- keepass2-2.16+dfsg/KeePass/Forms/IOConnectionForm.resx 2010-01-27 14:22:54.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/IOConnectionForm.resx 2011-12-28 18:11:32.000000000 +0000 @@ -117,7 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 17, 17 - \ No newline at end of file diff -Nru keepass2-2.16+dfsg/KeePass/Forms/KeyCreationForm.cs keepass2-2.18+dfsg/KeePass/Forms/KeyCreationForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/KeyCreationForm.cs 2011-07-02 19:10:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/KeyCreationForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -47,8 +47,7 @@ private bool m_bCreatingNew = false; private IOConnectionInfo m_ioInfo = new IOConnectionInfo(); - private SecureEdit m_secPassword = new SecureEdit(); - private SecureEdit m_secRepeat = new SecureEdit(); + private PwInputControlGroup m_icgPassword = new PwInputControlGroup(); public CompositeKey CompositeKey { @@ -89,16 +88,14 @@ m_ttRect.SetToolTip(m_cbHidePassword, KPRes.TogglePasswordAsterisks); m_ttRect.SetToolTip(m_btnSaveKeyFile, KPRes.KeyFileCreate); m_ttRect.SetToolTip(m_btnOpenKeyFile, KPRes.KeyFileUseExisting); + m_ttRect.SetToolTip(m_tbRepeatPassword, KPRes.PasswordRepeatHint); if(!m_bCreatingNew) m_lblIntro.Text = KPRes.ChangeMasterKeyIntroShort; - m_secPassword.Attach(m_tbPassword, ProcessTextChangedPassword, true); - m_secRepeat.Attach(m_tbRepeatPassword, null, true); - m_cbHidePassword.Checked = true; - - m_cbPassword.Checked = true; - ProcessTextChangedPassword(sender, e); // Update quality estimation + m_icgPassword.Attach(m_tbPassword, m_cbHidePassword, m_lblRepeatPassword, + m_tbRepeatPassword, m_lblEstimatedQuality, m_pbPasswordQuality, + m_lblQualityBits, this, true, false); m_cmbKeyFile.Items.Add(KPRes.NoKeyFileSpecifiedMeta); foreach(KeyProvider prov in Program.KeyProviderPool) @@ -106,6 +103,7 @@ m_cmbKeyFile.SelectedIndex = 0; + m_cbPassword.Checked = true; UIUtil.ApplyKeyUIFlags(Program.Config.UI.KeyCreationFlags, m_cbPassword, m_cbKeyFile, m_cbUserAccount, m_cbHidePassword); @@ -130,8 +128,7 @@ private void CleanUpEx() { - m_secPassword.Detach(); - m_secRepeat.Detach(); + m_icgPassword.Release(); } private bool CreateCompositeKey() @@ -140,13 +137,10 @@ if(m_cbPassword.Checked) // Use a password { - if(m_secPassword.ContentsEqualTo(m_secRepeat) == false) - { - MessageService.ShowWarning(KPRes.PasswordRepeatFailed); - return false; - } + if(!m_icgPassword.ValidateData(true)) return false; - if(m_secPassword.TextLength == 0) + uint uPwLen = m_icgPassword.PasswordLength; + if(uPwLen == 0) { if(!MessageService.AskYesNo(KPRes.EmptyMasterPw + MessageService.NewParagraph + KPRes.EmptyMasterPwHint + @@ -158,7 +152,7 @@ } uint uMinLen = Program.Config.Security.MasterPassword.MinimumLength; - if(m_secPassword.TextLength < uMinLen) + if(uPwLen < uMinLen) { string strML = KPRes.MasterPasswordMinLengthFailed; strML = strML.Replace(@"{PARAM}", uMinLen.ToString()); @@ -166,7 +160,7 @@ return false; } - byte[] pb = m_secPassword.ToUtf8(); + byte[] pb = m_icgPassword.GetPasswordUtf8(); uint uMinQual = Program.Config.Security.MasterPassword.MinimumQuality; if(QualityEstimation.EstimatePasswordBits(pb) < uMinQual) @@ -207,7 +201,8 @@ else if(m_cbKeyFile.Checked && (!strKeyFile.Equals(KPRes.NoKeyFileSpecifiedMeta)) && (bIsKeyProv == true)) { - KeyProviderQueryContext ctxKP = new KeyProviderQueryContext(m_ioInfo, true); + KeyProviderQueryContext ctxKP = new KeyProviderQueryContext( + m_ioInfo, true, false); bool bPerformHash; byte[] pbCustomKey = Program.KeyProviderPool.GetKey(strKeyFile, ctxKP, @@ -241,12 +236,7 @@ private void EnableUserControls() { - m_tbPassword.Enabled = m_tbRepeatPassword.Enabled = - m_lblRepeatPassword.Enabled = m_lblQualityBits.Enabled = - m_lblEstimatedQuality.Enabled = m_cbPassword.Checked; - if((Program.Config.UI.KeyCreationFlags & - (ulong)AceKeyUIFlags.DisableHidePassword) == 0) - m_cbHidePassword.Enabled = m_cbPassword.Checked; + m_icgPassword.Enabled = m_cbPassword.Checked; m_btnOpenKeyFile.Enabled = m_btnSaveKeyFile.Enabled = m_cmbKeyFile.Enabled = m_cbKeyFile.Checked; @@ -259,19 +249,9 @@ m_btnCreate.Enabled = false; else m_btnCreate.Enabled = true; - SetHidePassword(m_cbHidePassword.Checked, false); - m_ttRect.SetToolTip(m_cmbKeyFile, strKeyFile); } - private void SetHidePassword(bool bHide, bool bUpdateCheckBox) - { - if(bUpdateCheckBox) m_cbHidePassword.Checked = bHide; - - m_secPassword.EnableProtection(bHide); - m_secRepeat.EnableProtection(bHide); - } - private void OnCheckedPassword(object sender, EventArgs e) { EnableUserControls(); @@ -284,19 +264,6 @@ EnableUserControls(); } - private void OnCheckedHidePassword(object sender, EventArgs e) - { - bool bHide = m_cbHidePassword.Checked; - if(!bHide && !AppPolicy.Try(AppPolicyId.UnhidePasswords)) - { - m_cbHidePassword.Checked = true; - return; - } - - SetHidePassword(bHide, false); - UIUtil.SetFocus(m_tbPassword, this); - } - private void OnBtnOK(object sender, EventArgs e) { if(!CreateCompositeKey()) this.DialogResult = DialogResult.None; @@ -307,18 +274,6 @@ m_pKey = null; } - private void ProcessTextChangedPassword(object sender, EventArgs e) - { - byte[] pbUTF8 = m_secPassword.ToUtf8(); - uint uBits = QualityEstimation.EstimatePasswordBits(pbUTF8); - MemUtil.ZeroByteArray(pbUTF8); - - m_lblQualityBits.Text = uBits.ToString() + " " + KPRes.Bits; - int iPos = (int)((100 * uBits) / (256 / 2)); - if(iPos < 0) iPos = 0; else if(iPos > 100) iPos = 100; - m_pbPasswordQuality.Value = iPos; - } - private void OnClickKeyFileCreate(object sender, EventArgs e) { SaveFileDialog sfd = UIUtil.CreateSaveFileDialog(KPRes.KeyFileCreate, diff -Nru keepass2-2.16+dfsg/KeePass/Forms/KeyCreationForm.Designer.cs keepass2-2.18+dfsg/KeePass/Forms/KeyCreationForm.Designer.cs --- keepass2-2.16+dfsg/KeePass/Forms/KeyCreationForm.Designer.cs 2010-08-20 11:06:50.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/KeyCreationForm.Designer.cs 2011-12-28 11:59:08.000000000 +0000 @@ -189,7 +189,6 @@ this.m_cbHidePassword.Size = new System.Drawing.Size(32, 23); this.m_cbHidePassword.TabIndex = 1; this.m_cbHidePassword.UseVisualStyleBackColor = true; - this.m_cbHidePassword.CheckedChanged += new System.EventHandler(this.OnCheckedHidePassword); // // m_btnSaveKeyFile // diff -Nru keepass2-2.16+dfsg/KeePass/Forms/KeyPromptForm.cs keepass2-2.18+dfsg/KeePass/Forms/KeyPromptForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/KeyPromptForm.cs 2011-07-11 11:56:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/KeyPromptForm.cs 2012-01-04 17:25:54.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -253,15 +253,16 @@ KeyProvider kp = Program.KeyProviderPool.Get(strKeyFile); if((kp != null) && m_bSecureDesktop) { - if(kp.GetKeyMightShowGui) + if(!kp.SecureDesktopCompatible) { - MessageService.ShowWarning(KPRes.KeyProvWithGuiOnSD, - KPRes.KeyProvWithGuiOnSDHint); + MessageService.ShowWarning(KPRes.KeyProvIncmpWithSD, + KPRes.KeyProvIncmpWithSDHint); return false; } } - KeyProviderQueryContext ctxKP = new KeyProviderQueryContext(m_ioInfo, false); + KeyProviderQueryContext ctxKP = new KeyProviderQueryContext( + m_ioInfo, false, m_bSecureDesktop); bool bPerformHash; byte[] pbProvKey = Program.KeyProviderPool.GetKey(strKeyFile, ctxKP, @@ -385,6 +386,8 @@ } m_secPassword.EnableProtection(bHide); + + if(!m_bInitializing) UIUtil.SetFocus(m_tbPassword, this); } private void OnBtnOK(object sender, EventArgs e) diff -Nru keepass2-2.16+dfsg/KeePass/Forms/LanguageForm.cs keepass2-2.18+dfsg/KeePass/Forms/LanguageForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/LanguageForm.cs 2011-07-02 19:22:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/LanguageForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/MainForm.cs keepass2-2.18+dfsg/KeePass/Forms/MainForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/MainForm.cs 2011-07-11 15:20:54.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/MainForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -67,7 +67,6 @@ private bool m_bRestart = false; private ListSorter m_pListSorter = new ListSorter(); private ListViewSortMenu m_lvsmMenu = null; - private bool m_bBlockQuickFind = false; private bool m_bDraggingEntries = false; @@ -81,6 +80,18 @@ ///
    public MainForm() { + try + { + m_nTaskbarButtonMessage = NativeMethods.RegisterWindowMessage( + "TaskbarButtonCreated"); + m_bTaskbarButtonMessage = (m_nTaskbarButtonMessage != 0); + } + catch(Exception) + { + m_nTaskbarButtonMessage = 0x1E8F46A7; // Unlikely to occur + m_bTaskbarButtonMessage = false; + } + string strIso6391 = Program.Translation.Properties.Iso6391Code; if(strIso6391.Length > 0) { @@ -104,6 +115,8 @@ Program.Translation.ApplyTo("KeePass.Forms.MainForm.m_ctxGroupList", m_ctxGroupList.Items); Program.Translation.ApplyTo("KeePass.Forms.MainForm.m_ctxTray", m_ctxTray.Items); + m_asyncListUpdate = new AsyncPwListUpdate(m_lvEntries); + m_splitHorizontal.InitEx(this.Controls, m_menuMain); m_splitVertical.InitEx(this.Controls, m_menuMain); @@ -113,7 +126,8 @@ { // Workaround for tab bar height bug in Mono // https://sourceforge.net/projects/keepass/forums/forum/329221/topic/4519750 - m_tabMain.Height += 3; + // https://bugs.launchpad.net/ubuntu/+source/keepass2/+bug/891029 + m_tabMain.Height += 5; } } @@ -133,18 +147,22 @@ // m_imgFileSaveAllDisabled = Properties.Resources.B16x16_File_SaveAll_Disabled; m_ilCurrentIcons = m_ilClientIcons; + m_ctxEntryOpenUrl.Text = KPRes.OpenCmd; + m_ntfTray = new NotifyIconEx(this.components); m_ntfTray.ContextMenuStrip = m_ctxTray; m_ntfTray.Visible = true; m_ntfTray.SetHandlers(OnSystemTrayClick, OnSystemTrayDoubleClick, OnSystemTrayMouseDown); + m_ctxTrayTray.Font = FontUtil.CreateFont(m_ctxTrayTray.Font, FontStyle.Bold); + m_nLockTimerMax = (int)Program.Config.Security.WorkspaceLocking.LockAfterTime; m_nClipClearMax = Program.Config.Security.ClipboardClearAfterSeconds; NativeLib.AllowNative = Program.Config.Native.NativeKeyTransformations; - m_ctxEntryPreviewContextMenu.Attach(m_richEntryView); + m_ctxEntryPreviewContextMenu.Attach(m_richEntryView, this); m_dynCustomStrings = new DynamicMenu(m_ctxEntryCopyCustomString.DropDownItems); m_dynCustomStrings.MenuClick += this.OnCopyCustomString; @@ -164,6 +182,8 @@ m_dynRemoveTag = new DynamicMenu(m_ctxEntrySelectedRemoveTag.DropDownItems); m_dynRemoveTag.MenuClick += this.OnRemoveEntryTag; + m_dynOpenUrl = new OpenWithMenu(m_ctxEntryUrl); + EntryTemplates.Init(m_tbAddEntry); m_menuEdit.DropDownItems.Insert(0, new ToolStripSeparator()); @@ -172,29 +192,33 @@ InsertToolStripItem(m_menuEdit, m_ctxEntryDelete, new EventHandler(OnEntryDelete), true); InsertToolStripItem(m_menuEdit, m_ctxEntryDuplicate, new EventHandler(OnEntryDuplicate), true); InsertToolStripItem(m_menuEdit, m_ctxEntryEdit, new EventHandler(OnEntryEdit), true); - InsertToolStripItem(m_menuEdit, m_ctxEntryAdd, new EventHandler(OnEntryAdd), true); + ToolStripMenuItem tsmiAddEntry = InsertToolStripItem(m_menuEdit, + m_ctxEntryAdd, new EventHandler(OnEntryAdd), true); m_menuEdit.DropDownItems.Insert(0, new ToolStripSeparator()); InsertToolStripItem(m_menuEdit, m_ctxGroupDelete, new EventHandler(OnGroupsDelete), true); InsertToolStripItem(m_menuEdit, m_ctxGroupEdit, new EventHandler(OnGroupsEdit), true); InsertToolStripItem(m_menuEdit, m_ctxGroupAdd, new EventHandler(OnGroupsAdd), true); - UIUtil.ConfigureTbButton(m_tbNewDatabase, KPRes.ToolBarNew, null); - UIUtil.ConfigureTbButton(m_tbOpenDatabase, KPRes.ToolBarOpen, null); - UIUtil.ConfigureTbButton(m_tbSaveDatabase, KPRes.Save, null); - UIUtil.ConfigureTbButton(m_tbSaveAll, KPRes.ToolBarSaveAll, null); - UIUtil.ConfigureTbButton(m_tbAddEntry, KPRes.AddEntry, null); - UIUtil.ConfigureTbButton(m_tbAddEntryDefault, KPRes.AddEntryBtn, null); - UIUtil.ConfigureTbButton(m_tbCopyUserName, KPRes.CopyUserFull, null); - UIUtil.ConfigureTbButton(m_tbCopyPassword, KPRes.CopyPasswordFull, null); - UIUtil.ConfigureTbButton(m_tbFind, KPRes.Find + "...", null); - UIUtil.ConfigureTbButton(m_tbEntryViewsDropDown, null, KPRes.ShowEntries); - UIUtil.ConfigureTbButton(m_tbViewsShowAll, KPRes.ShowAllEntries, null); - UIUtil.ConfigureTbButton(m_tbViewsShowExpired, KPRes.ShowExpiredEntries, null); - UIUtil.ConfigureTbButton(m_tbLockWorkspace, KPRes.LockMenuLock, null); + UIUtil.AssignShortcut(tsmiAddEntry, Keys.Control | Keys.I); + + UIUtil.ConfigureTbButton(m_tbNewDatabase, KPRes.ToolBarNew, null, m_menuFileNew); + UIUtil.ConfigureTbButton(m_tbOpenDatabase, KPRes.ToolBarOpen, null, m_menuFileOpenLocal); + UIUtil.ConfigureTbButton(m_tbSaveDatabase, KPRes.Save, null, m_menuFileSave); + UIUtil.ConfigureTbButton(m_tbSaveAll, KPRes.ToolBarSaveAll, null, null); + UIUtil.ConfigureTbButton(m_tbAddEntry, KPRes.AddEntry, null, null); + UIUtil.ConfigureTbButton(m_tbCopyUserName, KPRes.CopyUserFull, null, m_ctxEntryCopyUserName); + UIUtil.ConfigureTbButton(m_tbCopyPassword, KPRes.CopyPasswordFull, null, m_ctxEntryCopyPassword); + UIUtil.ConfigureTbButton(m_tbFind, KPRes.Find + "...", null, m_menuEditFind); + UIUtil.ConfigureTbButton(m_tbEntryViewsDropDown, null, KPRes.ShowEntries, null); + UIUtil.ConfigureTbButton(m_tbLockWorkspace, KPRes.LockMenuLock, null, m_menuFileLock); UIUtil.ConfigureTbButton(m_tbQuickFind, null, KPRes.SearchQuickPrompt + - " (" + KPRes.KeyboardKeyCtrl + "+E)"); + " (" + KPRes.KeyboardKeyCtrl + "+E)", null); UIUtil.ConfigureTbButton(m_tbCloseTab, StrUtil.RemoveAccelerator( - KPRes.CloseButton), null); + KPRes.CloseButton), null, m_menuFileClose); + + CopyMenuItemText(m_tbAddEntryDefault, m_ctxEntryAdd); + CopyMenuItemText(m_tbViewsShowAll, m_menuEditShowAllEntries); + CopyMenuItemText(m_tbViewsShowExpired, m_menuEditShowExpired); UIUtil.EnableAutoCompletion(m_tbQuickFind, false); @@ -283,6 +307,8 @@ UIUtil.SetExplorerTheme(m_lvEntries.Handle); } + // m_tvGroups.QueryToolTip = UIUtil.GetPwGroupToolTipTN; + m_clrAlternateItemBgColor = UIUtil.GetAlternateColor(m_lvEntries.BackColor); m_statusPartProgress.Visible = false; @@ -290,7 +316,7 @@ if(bMaximizedSetting) { if((this.WindowState == FormWindowState.Normal) && !IsTrayed()) - this.WindowState = FormWindowState.Maximized; + UIUtil.SetWindowState(this, FormWindowState.Maximized); } try @@ -331,6 +357,8 @@ m_pluginManager.LoadAllPlugins(UrlUtil.GetFileDirectory( WinUtil.GetExecutable(), false, true)); + // Delete old files *after* loading plugins (when timestamps + // of loaded plugins have been updated already) if(Program.Config.Application.Start.PluginCacheDeleteOld) PlgxCache.DeleteOldFilesAsync(); @@ -358,6 +386,8 @@ UpdateUIState(false); ApplyUICustomizations(); + ThreadPool.QueueUserWorkItem(new WaitCallback(OnFormLoadParallelAsync)); + Program.TriggerSystem.RaiseEvent(EcasEventIDs.AppInitPost); if(Program.CommandLineArgs.FileName != null) @@ -370,8 +400,10 @@ OpenDatabase(ioLastFile, null, false); } + UpdateCheckEx.EnsureConfigured(this); if(Program.Config.Application.Start.CheckForUpdate) - CheckForUpdate.StartAsync(PwDefs.VersionUrl, m_statusPartInfo); + UpdateCheckEx.Run(false, null); + // UpdateCheck.StartAsync(PwDefs.VersionUrl, m_statusPartInfo); ResetDefaultFocus(null); @@ -472,7 +504,8 @@ KPRes.Password)); pe.Strings.Set(PwDefs.NotesField, new ProtectedString(pd.MemoryProtection.ProtectNotes, KPRes.Notes)); - pe.AutoType.Set(KPRes.TargetWindow, @"{USERNAME}{TAB}{PASSWORD}{TAB}{ENTER}"); + pe.AutoType.Add(new AutoTypeAssociation(KPRes.TargetWindow, + @"{USERNAME}{TAB}{PASSWORD}{TAB}{ENTER}")); pd.RootGroup.AddEntry(pe, true); pe = new PwEntry(true, true); @@ -484,7 +517,7 @@ @"http://keepass.info/help/kb/kb090406_testform.html")); pe.Strings.Set(PwDefs.PasswordField, new ProtectedString(pd.MemoryProtection.ProtectPassword, "12345")); - pe.AutoType.Set("Test Form - KeePass*", string.Empty); + pe.AutoType.Add(new AutoTypeAssociation("Test Form - KeePass*", string.Empty)); pd.RootGroup.AddEntry(pe, true); #if DEBUG @@ -661,6 +694,7 @@ private void OnFileExit(object sender, EventArgs e) { NotifyUserActivity(); + if(UIIsInteractionBlocked()) { Debug.Assert(false); return; } if(GlobalWindowManager.CanCloseAllWindows) GlobalWindowManager.CloseAllWindows(); @@ -686,7 +720,8 @@ private void OnHelpCheckForUpdate(object sender, EventArgs e) { - CheckForUpdate.StartAsync(PwDefs.VersionUrl, null); + // UpdateCheck.StartAsync(PwDefs.VersionUrl, null); + UpdateCheckEx.Run(true, this); } private void OnHelpAbout(object sender, EventArgs e) @@ -701,7 +736,7 @@ Debug.Assert(pe != null); if(pe == null) return; if(ClipboardUtil.CopyAndMinimize(pe.Strings.GetSafe(PwDefs.UserNameField), - true, this, pe, m_docMgr.ActiveDatabase)) + true, this, pe, m_docMgr.SafeFindContainerOf(pe))) StartClipboardCountdown(); } @@ -717,7 +752,7 @@ } if(ClipboardUtil.CopyAndMinimize(pe.Strings.GetSafe(PwDefs.PasswordField), - true, this, pe, m_docMgr.ActiveDatabase)) + true, this, pe, m_docMgr.SafeFindContainerOf(pe))) StartClipboardCountdown(); } @@ -745,11 +780,12 @@ PwEntry pe = GetSelectedEntry(false); if(pe != null) { - try { AutoType.PerformIntoPreviousWindow(this, pe); } - catch(Exception ex) + try { - MessageService.ShowWarning(ex); + AutoType.PerformIntoPreviousWindow(this, pe, + m_docMgr.SafeFindContainerOf(pe)); } + catch(Exception ex) { MessageService.ShowWarning(ex); } } } @@ -768,13 +804,12 @@ PwDatabase pwDb = m_docMgr.ActiveDatabase; PwEntry pwe = new PwEntry(true, true); pwe.Strings.Set(PwDefs.UserNameField, new ProtectedString( - pwDb.MemoryProtection.ProtectUserName, - pwDb.DefaultUserName)); + pwDb.MemoryProtection.ProtectUserName, pwDb.DefaultUserName)); - ProtectedString psAutoGen = new ProtectedString( - pwDb.MemoryProtection.ProtectPassword); - PwGenerator.Generate(psAutoGen, Program.Config.PasswordGenerator.AutoGeneratedPasswordsProfile, + ProtectedString psAutoGen; + PwGenerator.Generate(out psAutoGen, Program.Config.PasswordGenerator.AutoGeneratedPasswordsProfile, null, Program.PwGeneratorPool); + psAutoGen = psAutoGen.WithProtection(pwDb.MemoryProtection.ProtectPassword); pwe.Strings.Set(PwDefs.PasswordField, psAutoGen); int nExpireDays = Program.Config.Defaults.NewEntryExpiresInDays; @@ -806,9 +841,7 @@ PwObjectList vSelect = new PwObjectList(); vSelect.Add(pwe); - SelectEntries(vSelect, true); - ListViewItem lviFocus = GuiFindEntry(pwe.Uuid); - if(lviFocus != null) m_lvEntries.FocusedItem = lviFocus; + SelectEntries(vSelect, true, true); EnsureVisibleEntry(pwe.Uuid); } @@ -823,27 +856,43 @@ private void OnEntryDuplicate(object sender, EventArgs e) { + PwDatabase pd = m_docMgr.ActiveDatabase; PwGroup pgSelected = GetSelectedGroup(); PwEntry[] vSelected = GetSelectedEntries(); if((vSelected == null) || (vSelected.Length == 0)) return; + DuplicationForm dlg = new DuplicationForm(); + if(UIUtil.ShowDialogAndDestroy(dlg) != DialogResult.OK) return; + PwObjectList vNewEntries = new PwObjectList(); foreach(PwEntry pe in vSelected) { PwEntry peNew = pe.CloneDeep(); peNew.SetUuid(new PwUuid(true), true); // Create new UUID - ProtectedString psTitle = peNew.Strings.Get(PwDefs.TitleField); - if(psTitle != null) + if(dlg.AppendCopyToTitles && (pd != null)) + { + string strTitle = peNew.Strings.ReadSafe(PwDefs.TitleField); peNew.Strings.Set(PwDefs.TitleField, new ProtectedString( - psTitle.IsProtected, psTitle.ReadString() + " - " + + pd.MemoryProtection.ProtectTitle, strTitle + " - " + KPRes.CopyOfItem)); + } + + if(dlg.ReplaceDataByFieldRefs && (pd != null)) + { + string strUser = @"{REF:U@I:" + pe.Uuid.ToHexString() + @"}"; + peNew.Strings.Set(PwDefs.UserNameField, new ProtectedString( + pd.MemoryProtection.ProtectUserName, strUser)); + + string strPw = @"{REF:P@I:" + pe.Uuid.ToHexString() + @"}"; + peNew.Strings.Set(PwDefs.PasswordField, new ProtectedString( + pd.MemoryProtection.ProtectPassword, strPw)); + } Debug.Assert(pe.ParentGroup == peNew.ParentGroup); PwGroup pg = (pe.ParentGroup ?? pgSelected); - if((pg == null) && (m_docMgr.ActiveDocument != null)) - pg = m_docMgr.ActiveDatabase.RootGroup; + if((pg == null) && (pd != null)) pg = pd.RootGroup; if(pg == null) continue; pg.AddEntry(peNew, true, true); @@ -851,9 +900,9 @@ } AddEntriesToList(vNewEntries); - SelectEntries(vNewEntries, true); + SelectEntries(vNewEntries, true, false); - if((m_lvEntries.ShowGroups == false) && (m_lvEntries.Items.Count >= 1)) + if(!m_lvEntries.ShowGroups && (m_lvEntries.Items.Count >= 1)) m_lvEntries.EnsureVisible(m_lvEntries.Items.Count - 1); else EnsureVisibleSelected(true); @@ -892,7 +941,7 @@ SaveWindowPositionAndSize(); e.Cancel = true; - this.WindowState = FormWindowState.Minimized; + UIUtil.SetWindowState(this, FormWindowState.Minimized); return; } } @@ -905,6 +954,8 @@ return; } + GlobalWindowManager.CloseAllWindows(); + CleanUpEx(); // Saves configuration and cleans up all resources if(m_bRestart) WinUtil.Restart(); @@ -1019,14 +1070,21 @@ { if(lvs == lvHit.SubItem) { - PerformDefaultAction(sender, e, lvi.Tag as PwEntry, i); + PwListItem pli = (lvi.Tag as PwListItem); + if(pli != null) PerformDefaultAction(sender, e, pli.Entry, i); + else { Debug.Assert(false); } break; } ++i; } } - else PerformDefaultAction(sender, e, lvi.Tag as PwEntry, 0); + else + { + PwListItem pli = (lvi.Tag as PwListItem); + if(pli != null) PerformDefaultAction(sender, e, pli.Entry, 0); + else { Debug.Assert(false); } + } } private void OnQuickFindSelectedIndexChanged(object sender, EventArgs e) @@ -1035,15 +1093,30 @@ m_bBlockQuickFind = true; string strSearch = m_tbQuickFind.Text; // Text, not selected index! + + lock(m_objQuickFindSync) + { + int iNow = Environment.TickCount; + if(((iNow - m_iLastQuickFindTicks) <= 1000) && + (strSearch == m_strLastQuickSearch)) + { + m_bBlockQuickFind = false; + return; + } + + m_iLastQuickFindTicks = iNow; + m_strLastQuickSearch = strSearch; + } + string strGroupName = KPRes.SearchGroupName + " (\"" + strSearch + "\" "; strGroupName += KPRes.SearchResultsInSeparator + " "; strGroupName += m_docMgr.ActiveDatabase.RootGroup.Name + ")"; - PerformQuickFind(strSearch, strGroupName, false); + // PerformQuickFind(strSearch, strGroupName, false); // Lookup in combobox for the current search int nExistsAlready = -1; - for(int i = 0; i < m_tbQuickFind.Items.Count; i++) + for(int i = 0; i < m_tbQuickFind.Items.Count; ++i) { string strItemText = (string)m_tbQuickFind.Items[i]; if(strItemText.Equals(strSearch, StringComparison.InvariantCultureIgnoreCase)) @@ -1065,6 +1138,11 @@ m_tbQuickFind.SelectedIndex = 0; m_tbQuickFind.Select(0, strSearch.Length); + // Asynchronous invokation allows to cleanly process + // an Enter keypress before blocking the UI + BeginInvoke(new PerformQuickFindDelegate(PerformQuickFind), + strSearch, strGroupName, false); + m_bBlockQuickFind = false; } @@ -1131,8 +1209,9 @@ private void OnPwListItemDrag(object sender, ItemDragEventArgs e) { if(e.Item == null) return; - PwEntry pe = (((ListViewItem)e.Item).Tag as PwEntry); - if(pe == null) { Debug.Assert(false); return; } + PwListItem pli = (((ListViewItem)e.Item).Tag as PwListItem); + if(pli == null) { Debug.Assert(false); return; } + PwEntry pe = pli.Entry; ListViewHitTestInfo lvHit = m_lvEntries.HitTest(m_ptLastEntriesMouseClick); ListViewItem lvi = lvHit.Item; @@ -1149,7 +1228,8 @@ { if(lvs == lvHit.SubItem) { - strText = GetEntryFieldEx(pe, i, false); + bool bDummy; + strText = GetEntryFieldEx(pe, i, false, out bDummy); break; } @@ -1159,8 +1239,9 @@ m_pgActiveAtDragStart = GetSelectedGroup(); - PwDatabase pd = ((m_docMgr.ActiveDocument != null) ? m_docMgr.ActiveDatabase : null); - string strToTransfer = SprEngine.Compile(strText, false, pe, pd, false, false); + PwDatabase pd = m_docMgr.SafeFindContainerOf(pe); + string strToTransfer = SprEngine.Compile(strText, new SprContext( + pe, pd, SprCompileFlags.All)); m_bDraggingEntries = true; this.DoDragDrop(strToTransfer, DragDropEffects.Copy | DragDropEffects.Move); @@ -1315,7 +1396,7 @@ TreeNode tn = m_tvGroups.SelectedNode; PwGroup pgParent; - if(tn != null) pgParent = tn.Tag as PwGroup; + if(tn != null) pgParent = (tn.Tag as PwGroup); else pgParent = m_docMgr.ActiveDatabase.RootGroup; if(pgParent == null) { Debug.Assert(false); return; } @@ -1419,6 +1500,10 @@ if((m_fwsLast == FormWindowState.Minimized) && IsFileLocked(null) && !UIIsAutoUnlockBlocked()) OnFileLock(sender, e); // Unlock + + if((m_fwsLast == FormWindowState.Minimized) && !IsFileLocked(null) && + Program.Config.MainWindow.FocusQuickFindOnRestore) + ResetDefaultFocus(null); } m_fwsLast = ws; @@ -1426,10 +1511,13 @@ private void OnTrayTray(object sender, EventArgs e) { + if(!IsCommandTypeInvokable(null, AppCommandType.Window)) return; + if((this.WindowState == FormWindowState.Minimized) && !IsTrayed()) { - if(Program.Config.MainWindow.Maximized) this.WindowState = FormWindowState.Maximized; - else this.WindowState = FormWindowState.Normal; + if(Program.Config.MainWindow.Maximized) + UIUtil.SetWindowState(this, FormWindowState.Maximized); + else UIUtil.SetWindowState(this, FormWindowState.Normal); return; } @@ -1514,7 +1602,8 @@ PwEntry[] v = GetSelectedEntries(); Debug.Assert(v != null); if(v == null) return; - if(ClipboardUtil.CopyAndMinimize(UrlsToString(v), true, this, null, null)) + if(ClipboardUtil.CopyAndMinimize(UrlsToString(v, true), true, + this, null, null)) StartClipboardCountdown(); } @@ -1586,7 +1675,11 @@ case Keys.C: OnEntryCopyPassword(sender, e); break; case Keys.B: OnEntryCopyUserName(sender, e); break; // case Keys.E: OnEntryEdit(sender, e); break; - case Keys.U: PerformDefaultUrlAction(null, false); break; + case Keys.U: + // PerformDefaultUrlAction(null, false); + if(e.Shift) OnEntryCopyURL(sender, e); + else OnEntryOpenUrl(sender, e); + break; case Keys.V: OnEntryPerformAutoType(sender, e); break; default: bUnhandled = true; break; } @@ -1702,9 +1795,10 @@ byte[] pbAdditionalEntropy = EntropyForm.CollectEntropyIfEnabled( pgf.SelectedProfile); - ProtectedString psNew = new ProtectedString(pwDb.MemoryProtection.ProtectPassword); - PwGenerator.Generate(psNew, pgf.SelectedProfile, pbAdditionalEntropy, - Program.PwGeneratorPool); + ProtectedString psNew; + PwGenerator.Generate(out psNew, pgf.SelectedProfile, + pbAdditionalEntropy, Program.PwGeneratorPool); + psNew = psNew.WithProtection(pwDb.MemoryProtection.ProtectPassword); pe.Strings.Set(PwDefs.PasswordField, psNew); UpdateUI(false, null, false, null, true, null, true); @@ -1723,7 +1817,7 @@ private void OnToolsShowExpired(object sender, EventArgs e) { - ShowExpiredEntries(false, 0); + ShowExpiredEntries(false, true, false); } private void OnToolsTanWizard(object sender, EventArgs e) @@ -1757,21 +1851,52 @@ private void OnEntryViewLinkClicked(object sender, LinkClickedEventArgs e) { + string strLink = e.LinkText; + if(string.IsNullOrEmpty(strLink)) { Debug.Assert(false); return; } + PwEntry pe = GetSelectedEntry(false); - ProtectedBinary pb = ((pe != null) ? pe.Binaries.Get(e.LinkText) : null); + ProtectedBinary pb = ((pe != null) ? pe.Binaries.Get(strLink) : null); + + string strEntryUrl = string.Empty; + if(pe != null) + strEntryUrl = SprEngine.Compile(pe.Strings.ReadSafe(PwDefs.UrlField), + GetEntryListSprContext(pe, m_docMgr.SafeFindContainerOf(pe))); if((pe != null) && (pe.ParentGroup != null) && - (pe.ParentGroup.Name == e.LinkText)) + (pe.ParentGroup.Name == strLink)) { UpdateUI(false, null, true, pe.ParentGroup, true, null, false); EnsureVisibleSelected(false); ResetDefaultFocus(m_lvEntries); } - else if((pe != null) && (pe.Strings.ReadSafe(PwDefs.UrlField) == e.LinkText)) + else if(strEntryUrl == strLink) PerformDefaultUrlAction(null, false); else if(pb != null) - ExecuteBinaryEditView(e.LinkText, pb); - else WinUtil.OpenUrl(e.LinkText, pe); + ExecuteBinaryEditView(strLink, pb); + else if(strLink.StartsWith(SprEngine.StrRefStart, StrUtil.CaseIgnoreCmp) && + strLink.EndsWith(SprEngine.StrRefEnd, StrUtil.CaseIgnoreCmp)) + { + // If multiple references are amalgamated, only use first one + string strFirstRef = strLink; + int iEnd = strLink.IndexOf(SprEngine.StrRefEnd, StrUtil.CaseIgnoreCmp); + if(iEnd != (strLink.Length - SprEngine.StrRefEnd.Length)) + strFirstRef = strLink.Substring(0, iEnd + 1); + + char chScan, chWanted; + PwEntry peRef = SprEngine.FindRefTarget(strFirstRef, GetEntryListSprContext( + pe, m_docMgr.SafeFindContainerOf(pe)), out chScan, out chWanted); + if(peRef != null) + { + UpdateUI(false, null, true, peRef.ParentGroup, true, null, + false, m_lvEntries); + PwObjectList lSel = new PwObjectList(); + lSel.Add(peRef); + SelectEntries(lSel, true, true); + EnsureVisibleSelected(false); + ShowEntryDetails(peRef); + } + } + else WinUtil.OpenUrl(strLink, pe); } private void OnEntryClipCopy(object sender, EventArgs e) @@ -1961,9 +2086,10 @@ PwEntry pe = new PwEntry(true, true); pg.AddEntry(pe, true); - ProtectedString psNew = new ProtectedString(pwDb.MemoryProtection.ProtectPassword); - PwGenerator.Generate(psNew, pgf.SelectedProfile, + ProtectedString psNew; + PwGenerator.Generate(out psNew, pgf.SelectedProfile, pbAdditionalEntropy, Program.PwGeneratorPool); + psNew = psNew.WithProtection(pwDb.MemoryProtection.ProtectPassword); pe.Strings.Set(PwDefs.PasswordField, psNew); } @@ -2158,11 +2284,12 @@ private void OnCtxTrayOpening(object sender, CancelEventArgs e) { - UpdateUIState(false); + UpdateTrayState(); } private void OnTrayLock(object sender, EventArgs e) { + if(!IsCommandTypeInvokable(null, AppCommandType.Lock)) return; OnFileLock(sender, e); } @@ -2316,16 +2443,17 @@ PwDatabase pd = m_docMgr.ActiveDatabase; if((pd == null) || !pd.IsOpen) { Debug.Assert(false); return; } - StatusProgressForm dlg = new StatusProgressForm(); - dlg.InitEx(null, true, false, this); - dlg.Show(); - dlg.StartLogging(KPRes.Delete + "...", false); - - uint uDeleted = pd.DeleteDuplicateEntries(dlg); - - dlg.EndLogging(); - dlg.Close(); - UIUtil.DestroyForm(dlg); + Form fOptDialog; + IStatusLogger sl = StatusUtil.CreateStatusDialog(this, out fOptDialog, + null, KPRes.Delete + "...", true, false); + if(fOptDialog != null) RedirectActivationPush(fOptDialog); + UIBlockInteraction(true); + + uint uDeleted = pd.DeleteDuplicateEntries(sl); + + if(fOptDialog != null) RedirectActivationPop(); + UIBlockInteraction(false); + sl.EndLogging(); UpdateUI(false, null, false, null, (uDeleted > 0), null, (uDeleted > 0)); SetObjectsDeletedStatus(uDeleted, true); @@ -2347,8 +2475,22 @@ if((pd == null) || !pd.IsOpen) { Debug.Assert(false); return; } uint uDeleted = pd.DeleteUnusedCustomIcons(); - UpdateUIState(uDeleted > 0); + UpdateUI(false, null, (uDeleted > 0), null, (uDeleted > 0), + null, (uDeleted > 0)); SetObjectsDeletedStatus(uDeleted, true); } + + private void OnTrayExit(object sender, EventArgs e) + { + if(!IsCommandTypeInvokable(null, AppCommandType.Window)) return; + OnFileExit(sender, e); + } + + private void OnTrayOptions(object sender, EventArgs e) + { + if(!IsCommandTypeInvokable(null, AppCommandType.Window)) return; + EnsureVisibleForegroundWindow(false, false); // Parent is main window, not tray + OnToolsOptions(sender, e); + } } } diff -Nru keepass2-2.16+dfsg/KeePass/Forms/MainForm.Designer.cs keepass2-2.18+dfsg/KeePass/Forms/MainForm.Designer.cs --- keepass2-2.16+dfsg/KeePass/Forms/MainForm.Designer.cs 2011-07-09 10:45:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/MainForm.Designer.cs 2011-08-27 10:00:04.000000000 +0000 @@ -217,6 +217,7 @@ this.m_tvGroups = new KeePass.UI.CustomTreeViewEx(); this.m_lvEntries = new KeePass.UI.CustomListViewEx(); this.m_richEntryView = new KeePass.UI.CustomRichTextBoxEx(); + this.m_ctxTrayOptions = new System.Windows.Forms.ToolStripMenuItem(); this.m_ctxGroupList.SuspendLayout(); this.m_ctxPwList.SuspendLayout(); this.m_menuMain.SuspendLayout(); @@ -247,27 +248,27 @@ this.m_ctxGroupSep3, this.m_ctxGroupRearrange}); this.m_ctxGroupList.Name = "m_ctxGroupList"; - this.m_ctxGroupList.Size = new System.Drawing.Size(166, 226); + this.m_ctxGroupList.Size = new System.Drawing.Size(166, 204); this.m_ctxGroupList.Opening += new System.ComponentModel.CancelEventHandler(this.OnCtxGroupListOpening); // // m_ctxGroupAdd // this.m_ctxGroupAdd.Image = global::KeePass.Properties.Resources.B16x16_Folder_Sent_Mail; this.m_ctxGroupAdd.Name = "m_ctxGroupAdd"; - this.m_ctxGroupAdd.Size = new System.Drawing.Size(226, 22); + this.m_ctxGroupAdd.Size = new System.Drawing.Size(165, 22); this.m_ctxGroupAdd.Text = "Add &Group"; this.m_ctxGroupAdd.Click += new System.EventHandler(this.OnGroupsAdd); // // m_ctxGroupSep0 // this.m_ctxGroupSep0.Name = "m_ctxGroupSep0"; - this.m_ctxGroupSep0.Size = new System.Drawing.Size(223, 6); + this.m_ctxGroupSep0.Size = new System.Drawing.Size(162, 6); // // m_ctxGroupEdit // this.m_ctxGroupEdit.Image = global::KeePass.Properties.Resources.B16x16_Folder_Txt; this.m_ctxGroupEdit.Name = "m_ctxGroupEdit"; - this.m_ctxGroupEdit.Size = new System.Drawing.Size(226, 22); + this.m_ctxGroupEdit.Size = new System.Drawing.Size(165, 22); this.m_ctxGroupEdit.Text = "Ed&it Group"; this.m_ctxGroupEdit.Click += new System.EventHandler(this.OnGroupsEdit); // @@ -275,7 +276,7 @@ // this.m_ctxGroupDelete.Image = global::KeePass.Properties.Resources.B16x16_Folder_Locked; this.m_ctxGroupDelete.Name = "m_ctxGroupDelete"; - this.m_ctxGroupDelete.Size = new System.Drawing.Size(226, 22); + this.m_ctxGroupDelete.Size = new System.Drawing.Size(165, 22); this.m_ctxGroupDelete.Text = "Dele&te Group"; this.m_ctxGroupDelete.Click += new System.EventHandler(this.OnGroupsDelete); // @@ -283,14 +284,14 @@ // this.m_ctxGroupEmpty.Image = global::KeePass.Properties.Resources.B16x16_Trashcan_Full; this.m_ctxGroupEmpty.Name = "m_ctxGroupEmpty"; - this.m_ctxGroupEmpty.Size = new System.Drawing.Size(226, 22); + this.m_ctxGroupEmpty.Size = new System.Drawing.Size(165, 22); this.m_ctxGroupEmpty.Text = "&Empty Recycle Bin"; this.m_ctxGroupEmpty.Click += new System.EventHandler(this.OnGroupsEmpty); // // m_ctxGroupSep1 // this.m_ctxGroupSep1.Name = "m_ctxGroupSep1"; - this.m_ctxGroupSep1.Size = new System.Drawing.Size(223, 6); + this.m_ctxGroupSep1.Size = new System.Drawing.Size(162, 6); // // m_ctxGroupFind // @@ -303,13 +304,13 @@ // m_ctxGroupSep2 // this.m_ctxGroupSep2.Name = "m_ctxGroupSep2"; - this.m_ctxGroupSep2.Size = new System.Drawing.Size(223, 6); + this.m_ctxGroupSep2.Size = new System.Drawing.Size(162, 6); // // m_ctxGroupPrint // this.m_ctxGroupPrint.Image = global::KeePass.Properties.Resources.B16x16_FilePrint; this.m_ctxGroupPrint.Name = "m_ctxGroupPrint"; - this.m_ctxGroupPrint.Size = new System.Drawing.Size(226, 22); + this.m_ctxGroupPrint.Size = new System.Drawing.Size(165, 22); this.m_ctxGroupPrint.Text = "&Print Group..."; this.m_ctxGroupPrint.Click += new System.EventHandler(this.OnGroupsPrint); // @@ -317,14 +318,14 @@ // this.m_ctxGroupExport.Image = global::KeePass.Properties.Resources.B16x16_Folder_Outbox; this.m_ctxGroupExport.Name = "m_ctxGroupExport"; - this.m_ctxGroupExport.Size = new System.Drawing.Size(226, 22); + this.m_ctxGroupExport.Size = new System.Drawing.Size(165, 22); this.m_ctxGroupExport.Text = "E&xport..."; this.m_ctxGroupExport.Click += new System.EventHandler(this.OnGroupsExport); // // m_ctxGroupSep3 // this.m_ctxGroupSep3.Name = "m_ctxGroupSep3"; - this.m_ctxGroupSep3.Size = new System.Drawing.Size(223, 6); + this.m_ctxGroupSep3.Size = new System.Drawing.Size(162, 6); // // m_ctxGroupRearrange // @@ -337,14 +338,14 @@ this.m_ctxGroupSort, this.m_ctxGroupSortRec}); this.m_ctxGroupRearrange.Name = "m_ctxGroupRearrange"; - this.m_ctxGroupRearrange.Size = new System.Drawing.Size(226, 22); + this.m_ctxGroupRearrange.Size = new System.Drawing.Size(165, 22); this.m_ctxGroupRearrange.Text = "&Rearrange"; // // m_ctxGroupMoveToTop // this.m_ctxGroupMoveToTop.Image = global::KeePass.Properties.Resources.B16x16_2UpArrow; this.m_ctxGroupMoveToTop.Name = "m_ctxGroupMoveToTop"; - this.m_ctxGroupMoveToTop.Size = new System.Drawing.Size(240, 22); + this.m_ctxGroupMoveToTop.Size = new System.Drawing.Size(187, 22); this.m_ctxGroupMoveToTop.Text = "Move Group to &Top"; this.m_ctxGroupMoveToTop.Click += new System.EventHandler(this.OnGroupsMoveToTop); // @@ -352,7 +353,7 @@ // this.m_ctxGroupMoveOneUp.Image = global::KeePass.Properties.Resources.B16x16_1UpArrow; this.m_ctxGroupMoveOneUp.Name = "m_ctxGroupMoveOneUp"; - this.m_ctxGroupMoveOneUp.Size = new System.Drawing.Size(240, 22); + this.m_ctxGroupMoveOneUp.Size = new System.Drawing.Size(187, 22); this.m_ctxGroupMoveOneUp.Text = "Move Group &One Up"; this.m_ctxGroupMoveOneUp.Click += new System.EventHandler(this.OnGroupsMoveOneUp); // @@ -360,7 +361,7 @@ // this.m_ctxGroupMoveOneDown.Image = global::KeePass.Properties.Resources.B16x16_1DownArrow; this.m_ctxGroupMoveOneDown.Name = "m_ctxGroupMoveOneDown"; - this.m_ctxGroupMoveOneDown.Size = new System.Drawing.Size(225, 22); + this.m_ctxGroupMoveOneDown.Size = new System.Drawing.Size(187, 22); this.m_ctxGroupMoveOneDown.Text = "Mo&ve Group One Down"; this.m_ctxGroupMoveOneDown.Click += new System.EventHandler(this.OnGroupsMoveOneDown); // @@ -375,13 +376,13 @@ // m_ctxGroupRearrSep0 // this.m_ctxGroupRearrSep0.Name = "m_ctxGroupRearrSep0"; - this.m_ctxGroupRearrSep0.Size = new System.Drawing.Size(237, 6); + this.m_ctxGroupRearrSep0.Size = new System.Drawing.Size(184, 6); // // m_ctxGroupSort // this.m_ctxGroupSort.Image = global::KeePass.Properties.Resources.B16x16_KaboodleLoop; this.m_ctxGroupSort.Name = "m_ctxGroupSort"; - this.m_ctxGroupSort.Size = new System.Drawing.Size(240, 22); + this.m_ctxGroupSort.Size = new System.Drawing.Size(187, 22); this.m_ctxGroupSort.Text = "&Sort Direct Subgroups"; this.m_ctxGroupSort.Click += new System.EventHandler(this.OnGroupsSort); // @@ -389,7 +390,7 @@ // this.m_ctxGroupSortRec.Image = global::KeePass.Properties.Resources.B16x16_KaboodleLoop; this.m_ctxGroupSortRec.Name = "m_ctxGroupSortRec"; - this.m_ctxGroupSortRec.Size = new System.Drawing.Size(240, 22); + this.m_ctxGroupSortRec.Size = new System.Drawing.Size(187, 22); this.m_ctxGroupSortRec.Text = "So&rt Subgroup Tree"; this.m_ctxGroupSortRec.Click += new System.EventHandler(this.OnGroupsSortRec); // @@ -524,7 +525,7 @@ this.m_ctxEntryOpenUrl.Image = global::KeePass.Properties.Resources.B16x16_FTP; this.m_ctxEntryOpenUrl.Name = "m_ctxEntryOpenUrl"; this.m_ctxEntryOpenUrl.Size = new System.Drawing.Size(190, 22); - this.m_ctxEntryOpenUrl.Text = "&Open in Browser"; + this.m_ctxEntryOpenUrl.Text = "<>"; this.m_ctxEntryOpenUrl.Click += new System.EventHandler(this.OnEntryOpenUrl); // // m_ctxEntryCopyUrl @@ -813,7 +814,7 @@ // this.m_ctxEntryMoveToTop.Image = global::KeePass.Properties.Resources.B16x16_2UpArrow; this.m_ctxEntryMoveToTop.Name = "m_ctxEntryMoveToTop"; - this.m_ctxEntryMoveToTop.Size = new System.Drawing.Size(235, 22); + this.m_ctxEntryMoveToTop.Size = new System.Drawing.Size(182, 22); this.m_ctxEntryMoveToTop.Text = "Move Entry to &Top"; this.m_ctxEntryMoveToTop.Click += new System.EventHandler(this.OnEntryMoveToTop); // @@ -821,7 +822,7 @@ // this.m_ctxEntryMoveOneUp.Image = global::KeePass.Properties.Resources.B16x16_1UpArrow; this.m_ctxEntryMoveOneUp.Name = "m_ctxEntryMoveOneUp"; - this.m_ctxEntryMoveOneUp.Size = new System.Drawing.Size(235, 22); + this.m_ctxEntryMoveOneUp.Size = new System.Drawing.Size(182, 22); this.m_ctxEntryMoveOneUp.Text = "Move Entry &One Up"; this.m_ctxEntryMoveOneUp.Click += new System.EventHandler(this.OnEntryMoveOneUp); // @@ -829,7 +830,7 @@ // this.m_ctxEntryMoveOneDown.Image = global::KeePass.Properties.Resources.B16x16_1DownArrow; this.m_ctxEntryMoveOneDown.Name = "m_ctxEntryMoveOneDown"; - this.m_ctxEntryMoveOneDown.Size = new System.Drawing.Size(220, 22); + this.m_ctxEntryMoveOneDown.Size = new System.Drawing.Size(182, 22); this.m_ctxEntryMoveOneDown.Text = "Mo&ve Entry One Down"; this.m_ctxEntryMoveOneDown.Click += new System.EventHandler(this.OnEntryMoveOneDown); // @@ -1730,46 +1731,47 @@ this.m_ctxTray.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.m_ctxTrayTray, this.m_ctxTraySep0, - this.m_ctxTrayLock, + this.m_ctxTrayOptions, this.m_ctxTraySep1, + this.m_ctxTrayLock, this.m_ctxTrayFileExit}); this.m_ctxTray.Name = "m_ctxTray"; - this.m_ctxTray.Size = new System.Drawing.Size(138, 82); + this.m_ctxTray.Size = new System.Drawing.Size(153, 126); this.m_ctxTray.Opening += new System.ComponentModel.CancelEventHandler(this.OnCtxTrayOpening); // // m_ctxTrayTray // this.m_ctxTrayTray.Image = global::KeePass.Properties.Resources.B16x16_View_Detailed; this.m_ctxTrayTray.Name = "m_ctxTrayTray"; - this.m_ctxTrayTray.Size = new System.Drawing.Size(137, 22); + this.m_ctxTrayTray.Size = new System.Drawing.Size(152, 22); this.m_ctxTrayTray.Text = "&Tray / Untray"; this.m_ctxTrayTray.Click += new System.EventHandler(this.OnTrayTray); // // m_ctxTraySep0 // this.m_ctxTraySep0.Name = "m_ctxTraySep0"; - this.m_ctxTraySep0.Size = new System.Drawing.Size(134, 6); + this.m_ctxTraySep0.Size = new System.Drawing.Size(149, 6); // // m_ctxTrayLock // this.m_ctxTrayLock.Image = global::KeePass.Properties.Resources.B16x16_LockWorkspace; this.m_ctxTrayLock.Name = "m_ctxTrayLock"; - this.m_ctxTrayLock.Size = new System.Drawing.Size(137, 22); + this.m_ctxTrayLock.Size = new System.Drawing.Size(152, 22); this.m_ctxTrayLock.Text = "<>"; this.m_ctxTrayLock.Click += new System.EventHandler(this.OnTrayLock); // // m_ctxTraySep1 // this.m_ctxTraySep1.Name = "m_ctxTraySep1"; - this.m_ctxTraySep1.Size = new System.Drawing.Size(134, 6); + this.m_ctxTraySep1.Size = new System.Drawing.Size(149, 6); // // m_ctxTrayFileExit // this.m_ctxTrayFileExit.Image = global::KeePass.Properties.Resources.B16x16_Exit; this.m_ctxTrayFileExit.Name = "m_ctxTrayFileExit"; - this.m_ctxTrayFileExit.Size = new System.Drawing.Size(137, 22); + this.m_ctxTrayFileExit.Size = new System.Drawing.Size(152, 22); this.m_ctxTrayFileExit.Text = "E&xit"; - this.m_ctxTrayFileExit.Click += new System.EventHandler(this.OnFileExit); + this.m_ctxTrayFileExit.Click += new System.EventHandler(this.OnTrayExit); // // m_timerMain // @@ -1888,6 +1890,14 @@ this.m_richEntryView.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.OnEntryViewLinkClicked); this.m_richEntryView.KeyUp += new System.Windows.Forms.KeyEventHandler(this.OnEntryViewKeyUp); // + // m_ctxTrayOptions + // + this.m_ctxTrayOptions.Image = global::KeePass.Properties.Resources.B16x16_Misc; + this.m_ctxTrayOptions.Name = "m_ctxTrayOptions"; + this.m_ctxTrayOptions.Size = new System.Drawing.Size(152, 22); + this.m_ctxTrayOptions.Text = "&Options..."; + this.m_ctxTrayOptions.Click += new System.EventHandler(this.OnTrayOptions); + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -2116,6 +2126,7 @@ private System.Windows.Forms.ToolStripSeparator m_menuToolsDbSep0; private System.Windows.Forms.ToolStripMenuItem m_menuToolsDbDelEmptyGroups; private System.Windows.Forms.ToolStripMenuItem m_menuToolsDbDelUnusedIcons; + private System.Windows.Forms.ToolStripMenuItem m_ctxTrayOptions; } } diff -Nru keepass2-2.16+dfsg/KeePass/Forms/MainForm_Events.cs keepass2-2.18+dfsg/KeePass/Forms/MainForm_Events.cs --- keepass2-2.16+dfsg/KeePass/Forms/MainForm_Events.cs 2011-01-01 11:28:52.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/MainForm_Events.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/MainForm_Functions.cs keepass2-2.18+dfsg/KeePass/Forms/MainForm_Functions.cs --- keepass2-2.16+dfsg/KeePass/Forms/MainForm_Functions.cs 2011-07-11 12:21:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/MainForm_Functions.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -70,6 +70,9 @@ private DynamicMenu m_dynShowEntriesByTagsToolBar; private DynamicMenu m_dynAddTag; private DynamicMenu m_dynRemoveTag; + private OpenWithMenu m_dynOpenUrl; + + private AsyncPwListUpdate m_asyncListUpdate = null; private MruList m_mruList = new MruList(); @@ -85,6 +88,11 @@ private uint m_uLastInputTime = uint.MaxValue; private long m_lLockAtGlobalTicks = long.MaxValue; + private bool m_bBlockQuickFind = false; + private object m_objQuickFindSync = new object(); + private int m_iLastQuickFindTicks = Environment.TickCount - 1500; + private string m_strLastQuickSearch = string.Empty; + private ToolStripSeparator m_tsSepCustomToolBar = null; private List m_vCustomToolBarButtons = new List(); @@ -122,7 +130,9 @@ private bool m_bUpdateUIStateOnce = false; private int m_nLastSelChUpdateUIStateTicks = 0; - private int m_nAppMessage = Program.ApplicationMessage; + private readonly int m_nAppMessage = Program.ApplicationMessage; + private readonly int m_nTaskbarButtonMessage; + private bool m_bTaskbarButtonMessage; private List> m_vLinkedToolStripItems = new List>(); @@ -194,6 +204,12 @@ public string LockUnlock; } + private enum AppCommandType + { + Window = 0, + Lock = 1 + } + /// /// Check if the main window is trayed (i.e. only the tray icon is visible). /// @@ -222,6 +238,8 @@ private void CleanUpEx() { + m_asyncListUpdate.CancelPendingUpdatesAsync(); + Program.TriggerSystem.RaiseEvent(EcasEventIDs.AppExit); m_nClipClearCur = -1; @@ -248,6 +266,7 @@ m_dynShowEntriesByTagsToolBar.MenuClick -= this.OnShowEntriesByTag; m_dynAddTag.MenuClick -= this.OnAddEntryTag; m_dynRemoveTag.MenuClick -= this.OnRemoveEntryTag; + m_dynOpenUrl.Destroy(); m_ctxEntryPreviewContextMenu.Detach(); @@ -264,6 +283,7 @@ if(m_fontBoldTree != null) { m_fontBoldTree.Dispose(); m_fontBoldTree = null; } if(m_fontItalicTree != null) { m_fontItalicTree.Dispose(); m_fontItalicTree = null; } + m_asyncListUpdate.WaitAll(); m_bCleanedUp = true; } @@ -449,16 +469,13 @@ // Main menu m_menuFileSaveAs.Enabled = m_menuFileSaveAsLocal.Enabled = - m_menuFileSaveAsUrl.Enabled = m_menuFileDbSettings.Enabled = - m_menuFileChangeMasterKey.Enabled = m_menuFilePrint.Enabled = - s.DatabaseOpened; + m_menuFileSaveAsUrl.Enabled = m_menuFileSaveAsCopy.Enabled = + m_menuFileDbSettings.Enabled = m_menuFileChangeMasterKey.Enabled = + m_menuFilePrint.Enabled = s.DatabaseOpened; m_menuFileClose.Enabled = (s.DatabaseOpened || s.FileLocked); m_menuFileLock.Enabled = m_tbLockWorkspace.Enabled = s.EnableLockCmd; - m_ctxTrayTray.Enabled = s.NoWindowShown; - m_ctxTrayLock.Enabled = (s.EnableLockCmd && s.NoWindowShown); - m_ctxTrayFileExit.Enabled = s.NoWindowShown; m_menuEditFind.Enabled = m_menuToolsGeneratePwList.Enabled = m_menuToolsTanWizard.Enabled = @@ -503,8 +520,10 @@ m_tbCopyPassword.Enabled = s.CanCopyPassword; m_menuFileLock.Text = s.LockUnlock; - m_tbLockWorkspace.Text = m_tbLockWorkspace.ToolTipText = - m_ctxTrayLock.Text = StrUtil.RemoveAccelerator(s.LockUnlock); + string strLockText = StrUtil.RemoveAccelerator(s.LockUnlock); + m_tbLockWorkspace.Text = m_ctxTrayLock.Text = strLockText; + m_tbLockWorkspace.ToolTipText = strLockText + " (" + + m_menuFileLock.ShortcutKeyDisplayString + ")"; m_tabMain.Visible = m_tbSaveAll.Visible = m_tbCloseTab.Visible = (m_docMgr.DocumentCount > 1); @@ -732,14 +751,14 @@ if(!bRequireSelected) { ListViewItem lviFocused = m_lvEntries.FocusedItem; - if(lviFocused != null) return (PwEntry)lviFocused.Tag; + if(lviFocused != null) return ((PwListItem)lviFocused.Tag).Entry; } ListView.SelectedListViewItemCollection coll = m_lvEntries.SelectedItems; if(coll.Count > 0) { ListViewItem lvi = coll[bGetLastSelectedEntry ? (coll.Count - 1) : 0]; - if(lvi != null) return (PwEntry)lvi.Tag; + if(lvi != null) return ((PwListItem)lvi.Tag).Entry; } return null; @@ -758,7 +777,7 @@ PwEntry[] vSelected = new PwEntry[coll.Count]; for(int i = 0; i < coll.Count; ++i) - vSelected[i] = (PwEntry)coll[i].Tag; + vSelected[i] = ((PwListItem)coll[i].Tag).Entry; return vSelected; } @@ -820,7 +839,16 @@ if(pe == null) { Debug.Assert(false); return null; } ListViewItem lvi = (lviTarget ?? new ListViewItem()); - lvi.Tag = pe; + + PwListItem pli = new PwListItem(pe); + if(lviTarget == null) lvi.Tag = pli; // Lock below (when adding it) + else + { + lock(m_asyncListUpdate.ListEditSyncObject) { lvi.Tag = pli; } + } + + int iIndexHint = ((lviTarget != null) ? lviTarget.Index : + m_lvEntries.Items.Count); if(pe.Expires && (pe.ExpiryTime <= m_dtCachedNow)) { @@ -875,6 +903,8 @@ else if(lviTarget != null) lvi.BackColor = m_lvEntries.BackColor; else { Debug.Assert(UIUtil.ColorsEqual(lvi.BackColor, m_lvEntries.BackColor)); } + bool bAsync; + // m_bOnlyTans &= PwDefs.IsTanEntry(pe); if(m_bShowTanIndices && m_bOnlyTans) { @@ -883,28 +913,52 @@ if(strIndex.Length > 0) lvi.Text = strIndex; else lvi.Text = PwDefs.TanTitle; } - else lvi.Text = GetEntryFieldEx(pe, 0, true); + else + { + string strMain = GetEntryFieldEx(pe, 0, true, out bAsync); + lvi.Text = strMain; + if(bAsync) + m_asyncListUpdate.Queue(strMain, pli, iIndexHint, 0, + AsyncPwListUpdate.SprCompileFn); + } int nColumns = m_lvEntries.Columns.Count; if(lviTarget == null) { for(int iColumn = 1; iColumn < nColumns; ++iColumn) - lvi.SubItems.Add(GetEntryFieldEx(pe, iColumn, true)); + { + string strSub = GetEntryFieldEx(pe, iColumn, true, out bAsync); + lvi.SubItems.Add(strSub); + if(bAsync) + m_asyncListUpdate.Queue(strSub, pli, iIndexHint, iColumn, + AsyncPwListUpdate.SprCompileFn); + } } else { int nSubItems = lvi.SubItems.Count; for(int iColumn = 1; iColumn < nColumns; ++iColumn) { - string strSub = GetEntryFieldEx(pe, iColumn, true); + string strSub = GetEntryFieldEx(pe, iColumn, true, out bAsync); + if(iColumn < nSubItems) lvi.SubItems[iColumn].Text = strSub; else lvi.SubItems.Add(strSub); + + if(bAsync) + m_asyncListUpdate.Queue(strSub, pli, iIndexHint, iColumn, + AsyncPwListUpdate.SprCompileFn); } Debug.Assert(lvi.SubItems.Count == nColumns); } - if(lviTarget == null) m_lvEntries.Items.Add(lvi); + if(lviTarget == null) + { + lock(m_asyncListUpdate.ListEditSyncObject) + { + m_lvEntries.Items.Add(lvi); + } + } return lvi; } @@ -925,7 +979,7 @@ foreach(ListViewGroup lvg in m_lvEntries.Groups) { - PwGroup pgList = lvg.Tag as PwGroup; + PwGroup pgList = (lvg.Tag as PwGroup); Debug.Assert(pgList != null); if((pgList != null) && (pg == pgList)) { @@ -993,7 +1047,22 @@ m_tvGroups.EndUpdate(); - if(tnSelected != null) m_tvGroups.SelectedNode = tnSelected; + if(tnSelected != null) + { + // Ensure all parent tree nodes are expanded + List lParents = new List(); + TreeNode tnUp = tnSelected; + while(true) + { + tnUp = tnUp.Parent; + if(tnUp == null) break; + lParents.Add(tnUp); + } + for(int i = (lParents.Count - 1); i >= 0; --i) + lParents[i].Expand(); + + m_tvGroups.SelectedNode = tnSelected; + } else if(m_tvGroups.Nodes.Count > 0) m_tvGroups.SelectedNode = m_tvGroups.Nodes[0]; } @@ -1036,8 +1105,13 @@ m_bOnlyTans = ListContainsOnlyTans(pwlSource); + m_asyncListUpdate.CancelPendingUpdatesAsync(); + m_lvEntries.BeginUpdate(); - m_lvEntries.Items.Clear(); + lock(m_asyncListUpdate.ListEditSyncObject) + { + m_lvEntries.Items.Clear(); + } m_lvEntries.Groups.Clear(); m_lvgLastEntryGroup = null; @@ -1152,7 +1226,7 @@ foreach(ListViewItem lvi in m_lvEntries.Items) { - SetListEntry(lvi.Tag as PwEntry, lvi); + SetListEntry(((PwListItem)lvi.Tag).Entry, lvi); } UIUtil.SetAlternatingBgColors(m_lvEntries, m_clrAlternateItemBgColor, @@ -1160,73 +1234,6 @@ m_lvEntries.EndUpdate(); } - /* public void RefreshEntriesList() - { - int nItemCount = m_lvEntries.Items.Count; - if(nItemCount <= 0) return; - - PwEntry peTop = GetTopEntry(); - PwEntry peFocused = GetSelectedEntry(false); - int iScrollY = NativeMethods.GetScrollPosY(m_lvEntries.Handle); - - UpdateImageLists(); // Important - - PwEntry[] vSelected = GetSelectedEntries(); - if(vSelected == null) vSelected = new PwEntry[0]; - - PwEntry[] vList = new PwEntry[nItemCount]; - for(int iEnum = 0; iEnum < nItemCount; ++iEnum) - vList[iEnum] = (PwEntry)m_lvEntries.Items[iEnum].Tag; - - m_lvEntries.BeginUpdate(); - m_lvEntries.Items.Clear(); - m_lvEntries.Groups.Clear(); - m_lvgLastEntryGroup = null; - - int nTopIndex = -1; - ListViewItem lviFocused = null; - - m_dtCachedNow = DateTime.Now; - ListViewStateEx lvseCachedState = new ListViewStateEx(m_lvEntries); - - for(int iAdd = 0; iAdd < nItemCount; ++iAdd) - { - PwEntry pe = vList[iAdd]; - - ListViewItem lvi = SetListEntry(pe, null); - - if(pe == peTop) nTopIndex = iAdd; - if(pe == peFocused) lviFocused = lvi; - - if(Array.IndexOf(vSelected, pe) >= 0) lvi.Selected = true; - } - - Debug.Assert(lvseCachedState.CompareTo(m_lvEntries)); - - UIUtil.SetAlternatingBgColors(m_lvEntries, m_clrAlternateItemBgColor, - Program.Config.MainWindow.EntryListAlternatingBgColors); - - Debug.Assert(m_bEntryGrouping == m_lvEntries.ShowGroups); - if(m_lvEntries.ShowGroups) - { - // Test nTopIndex to ensure we're not scrolling an unrelated list - if((nTopIndex >= 0) && (iScrollY > 0)) - NativeMethods.Scroll(m_lvEntries, 0, iScrollY); - } - else - { - if(nTopIndex >= 0) - { - m_lvEntries.EnsureVisible(m_lvEntries.Items.Count - 1); - m_lvEntries.EnsureVisible(nTopIndex); - } - } - - if(lviFocused != null) m_lvEntries.FocusedItem = lviFocused; - - m_lvEntries.EndUpdate(); - } */ - private PwEntry GetTopEntry() { if(m_lvEntries.Items.Count == 0) return null; @@ -1235,7 +1242,7 @@ try { ListViewItem lviTop = m_lvEntries.TopItem; - if(lviTop != null) peTop = (lviTop.Tag as PwEntry); + if(lviTop != null) peTop = ((PwListItem)lviTop.Tag).Entry; } catch(Exception) { } @@ -1317,6 +1324,11 @@ m_pListSorter = new ListSorter(nColumn, sortOrder, bSortNaturally, bSortTimes); m_lvEntries.ListViewItemSorter = m_pListSorter; + + // Workaround for XP bug + if(bUpdateEntryList && !KeePassLib.Native.NativeLib.IsUnix() && + WinUtil.IsWindowsXP) + UpdateEntryList(null, true); // Only required on XP } else { @@ -1423,39 +1435,39 @@ PwGroup pg = pe.ParentGroup; if(pg != null) rb.Append(pg.Name); + AceMainWindow mw = Program.Config.MainWindow; EvAppendEntryField(rb, strItemSeparator, KPRes.Title, - IsColumnHidden(AceColumnType.Title) ? PwDefs.HiddenPassword : - pe.Strings.ReadSafe(PwDefs.TitleField)); + mw.IsColumnHidden(AceColumnType.Title) ? PwDefs.HiddenPassword : + pe.Strings.ReadSafe(PwDefs.TitleField), pe); EvAppendEntryField(rb, strItemSeparator, KPRes.UserName, - IsColumnHidden(AceColumnType.UserName) ? PwDefs.HiddenPassword : - pe.Strings.ReadSafe(PwDefs.UserNameField)); + mw.IsColumnHidden(AceColumnType.UserName) ? PwDefs.HiddenPassword : + pe.Strings.ReadSafe(PwDefs.UserNameField), pe); EvAppendEntryField(rb, strItemSeparator, KPRes.Password, - IsColumnHidden(AceColumnType.Password) ? PwDefs.HiddenPassword : - pe.Strings.ReadSafe(PwDefs.PasswordField)); + mw.IsColumnHidden(AceColumnType.Password) ? PwDefs.HiddenPassword : + pe.Strings.ReadSafe(PwDefs.PasswordField), pe); EvAppendEntryField(rb, strItemSeparator, KPRes.Url, - IsColumnHidden(AceColumnType.Url) ? PwDefs.HiddenPassword : - pe.Strings.ReadSafe(PwDefs.UrlField)); + mw.IsColumnHidden(AceColumnType.Url) ? PwDefs.HiddenPassword : + pe.Strings.ReadSafe(PwDefs.UrlField), pe); - bool bHideCustom = Program.Config.MainWindow.EntryView.HideProtectedCustomStrings; foreach(KeyValuePair kvp in pe.Strings) { if(PwDefs.IsStandardField(kvp.Key)) continue; - string strCustomValue = (bHideCustom ? pe.Strings.ReadSafeEx(kvp.Key) : - pe.Strings.ReadSafe(kvp.Key)); - EvAppendEntryField(rb, strItemSeparator, kvp.Key, strCustomValue); + string strCustomValue = (mw.ShouldHideCustomString(kvp.Key, + kvp.Value) ? PwDefs.HiddenPassword : kvp.Value.ReadString()); + EvAppendEntryField(rb, strItemSeparator, kvp.Key, strCustomValue, pe); } EvAppendEntryField(rb, strItemSeparator, KPRes.CreationTime, - TimeUtil.ToDisplayString(pe.CreationTime)); + TimeUtil.ToDisplayString(pe.CreationTime), null); EvAppendEntryField(rb, strItemSeparator, KPRes.LastAccessTime, - TimeUtil.ToDisplayString(pe.LastAccessTime)); + TimeUtil.ToDisplayString(pe.LastAccessTime), null); EvAppendEntryField(rb, strItemSeparator, KPRes.LastModificationTime, - TimeUtil.ToDisplayString(pe.LastModificationTime)); + TimeUtil.ToDisplayString(pe.LastModificationTime), null); if(pe.Expires) EvAppendEntryField(rb, strItemSeparator, KPRes.ExpiryTime, - TimeUtil.ToDisplayString(pe.ExpiryTime)); + TimeUtil.ToDisplayString(pe.ExpiryTime), null); if(pe.Binaries.UCount > 0) { @@ -1468,14 +1480,15 @@ } EvAppendEntryField(rb, strItemSeparator, KPRes.Attachments, - sbBinaries.ToString()); + sbBinaries.ToString(), null); } - EvAppendEntryField(rb, strItemSeparator, KPRes.UrlOverride, pe.OverrideUrl); + EvAppendEntryField(rb, strItemSeparator, KPRes.UrlOverride, + pe.OverrideUrl, pe); EvAppendEntryField(rb, strItemSeparator, KPRes.Tags, - StrUtil.TagsToString(pe.Tags, true)); + StrUtil.TagsToString(pe.Tags, true), null); - string strNotes = (IsColumnHidden(AceColumnType.Notes) ? + string strNotes = (mw.IsColumnHidden(AceColumnType.Notes) ? PwDefs.HiddenPassword : pe.Strings.ReadSafe(PwDefs.NotesField)); if(strNotes.Length != 0) { @@ -1503,6 +1516,8 @@ // m_richEntryView.Rtf = sb.ToString(); rb.Build(m_richEntryView); + UIUtil.RtfLinkifyReferences(m_richEntryView, false); + Debug.Assert(m_richEntryView.HideSelection); // Flicker otherwise if(pg != null) { @@ -1511,8 +1526,10 @@ } // Linkify the URL - string strUrl = pe.Strings.ReadSafe(PwDefs.UrlField); // Not Ex - UIUtil.RtfLinkifyText(m_richEntryView, strUrl, false); + string strUrl = SprEngine.Compile(pe.Strings.ReadSafe(PwDefs.UrlField), + GetEntryListSprContext(pe, m_docMgr.SafeFindContainerOf(pe))); + if(strUrl != PwDefs.HiddenPassword) + UIUtil.RtfLinkifyText(m_richEntryView, strUrl, false); // Linkify the attachments foreach(KeyValuePair kvpBin in pe.Binaries) @@ -1521,13 +1538,28 @@ m_richEntryView.Select(0, 0); } - private static void EvAppendEntryField(RichTextBuilder rb, - string strItemSeparator, string strName, string strValue) + private void EvAppendEntryField(RichTextBuilder rb, + string strItemSeparator, string strName, string strValue, + PwEntry peSprCompile) { if(string.IsNullOrEmpty(strValue)) return; rb.Append(strName, FontStyle.Bold, strItemSeparator, null, ":", " "); - rb.Append(strValue); + + if((peSprCompile == null) || !SprEngine.MightDeref(strValue)) + rb.Append(strValue); + else + { + string strCmp = SprEngine.Compile(strValue, + GetEntryListSprContext(peSprCompile, + m_docMgr.SafeFindContainerOf(peSprCompile))); + if(strCmp == strValue) rb.Append(strValue); + else + { + rb.Append(strCmp + " - "); + rb.Append(strValue, FontStyle.Italic); + } + } } private void PerformDefaultAction(object sender, EventArgs e, PwEntry pe, @@ -1648,7 +1680,7 @@ // bool bMinimize = Program.Config.MainWindow.MinimizeAfterClipboardCopy; // Form frmMin = (bMinimize ? this : null); - if(ClipboardUtil.CopyAndMinimize(UrlsToString(v), true, this, null, null)) + if(ClipboardUtil.CopyAndMinimize(UrlsToString(v, true), true, this, null, null)) StartClipboardCountdown(); } else // Open @@ -1681,7 +1713,7 @@ OnEntryBinaryView(null, args); } - private string UrlsToString(PwEntry[] vEntries) + private string UrlsToString(PwEntry[] vEntries, bool bActive) { if((vEntries == null) || (vEntries.Length == 0)) return string.Empty; @@ -1690,9 +1722,11 @@ { if(sb.Length > 0) sb.Append(MessageService.NewLine); + PwDatabase pd = m_docMgr.SafeFindContainerOf(pe); + string strUrl = pe.Strings.ReadSafe(PwDefs.UrlField); - strUrl = SprEngine.Compile(strUrl, false, pe, m_docMgr.ActiveDatabase, - false, false); + strUrl = SprEngine.Compile(strUrl, new SprContext(pe, pd, + (bActive ? SprCompileFlags.All : SprCompileFlags.NonActive))); sb.Append(strUrl); } @@ -1701,6 +1735,9 @@ return sb.ToString(); } + private delegate void PerformQuickFindDelegate(string strSearch, + string strGroupName, bool bForceShowExpired); + /// /// Do a quick find. All entries of the currently opened database are searched /// for a string and the results are automatically displayed in the main window. @@ -1724,11 +1761,30 @@ sp.SearchInUuids = sp.SearchInGroupNames = sp.SearchInTags = true; sp.SearchInPasswords = Program.Config.MainWindow.QuickFindSearchInPasswords; - if(bForceShowExpired == false) + if(!bForceShowExpired) sp.ExcludeExpired = Program.Config.MainWindow.QuickFindExcludeExpired; + SearchUtil.SetTransformation(sp, (Program.Config.MainWindow.QuickFindDerefData ? + SearchUtil.StrTrfDeref : string.Empty)); + + StatusBarLogger sl = null; + bool bBlock = (strSearch.Length > 0); // Showing all is fast + if(bBlock) + { + Application.DoEvents(); // Finalize UI messages before blocking + UIBlockInteraction(true); + sl = CreateStatusBarLogger(); + sl.StartLogging(KPRes.SearchingOp + "...", false); + } + AutoAdjustMemProtSettings(m_docMgr.ActiveDatabase, sp); - m_docMgr.ActiveDatabase.RootGroup.SearchEntries(sp, pg.Entries, true); + m_docMgr.ActiveDatabase.RootGroup.SearchEntries(sp, pg.Entries, sl); + + if(bBlock) + { + sl.EndLogging(); + UIBlockInteraction(false); + } UpdateEntryList(pg, false); SelectFirstEntryIfNoneSelected(); @@ -1743,39 +1799,39 @@ } } - private void ShowExpiredEntries(bool bOnlyIfExists, uint uSkipDays) + private void ShowExpiredEntries(bool bOnlyIfExists, bool bShowExpired, + bool bShowSoonToExpire) { - PwGroup pg = new PwGroup(true, true, KPRes.ExpiredEntries, PwIcon.Expired); + if(!bShowExpired && !bShowSoonToExpire) return; + + PwGroup pg = new PwGroup(true, true, string.Empty, PwIcon.Expired); pg.IsVirtual = true; - DateTime dtLimit = DateTime.Now; - if(uSkipDays != 0) - dtLimit = dtLimit.Add(new TimeSpan((int)uSkipDays, 0, 0, 0)); + const int iSkipDays = 7; + DateTime dtNow = DateTime.Now; + DateTime dtLimit = dtNow.Add(new TimeSpan(iSkipDays, 0, 0, 0)); EntryHandler eh = delegate(PwEntry pe) { + if(!pe.Expires) return true; if(PwDefs.IsTanEntry(pe)) return true; // Exclude TANs - if(pe.Expires && (pe.ExpiryTime <= dtLimit)) + + if((bShowExpired && (pe.ExpiryTime <= dtNow)) || + (bShowSoonToExpire && (pe.ExpiryTime <= dtLimit) && + (pe.ExpiryTime > dtNow))) pg.AddEntry(pe, false); return true; }; - m_docMgr.ActiveDatabase.RootGroup.TraverseTree(TraversalMethod.PreOrder, null, eh); - - if(uSkipDays != 0) pg.Name = KPRes.SoonToExpireEntries; + m_docMgr.ActiveDatabase.RootGroup.TraverseTree( + TraversalMethod.PreOrder, null, eh); if((pg.Entries.UCount > 0) || !bOnlyIfExists) { UpdateEntryList(pg, false); UpdateUIState(false); + ShowSearchResultsStatusMessage(); } - else - { - UpdateEntryList(null, false); - UpdateUIState(false); - } - - ShowSearchResultsStatusMessage(); } public void PerformExport(PwGroup pgDataSource, bool bExportDeleted) @@ -1786,7 +1842,6 @@ PwDatabase pd = m_docMgr.ActiveDatabase; if((pd == null) || !pd.IsOpen) return; - if(!AppPolicy.Current.ExportNoKey) { if(!KeyUtil.ReAskKey(pd, true)) return; @@ -1823,6 +1878,28 @@ return iocResult; } + internal IOConnectionInfo CompleteConnectionInfoUsingMru(IOConnectionInfo ioc) + { + if(ioc == null) { Debug.Assert(false); return null; } + + if(string.IsNullOrEmpty(ioc.UserName) && string.IsNullOrEmpty(ioc.Password)) + { + for(uint u = 0; u < m_mruList.ItemCount; ++u) + { + IOConnectionInfo iocMru = (m_mruList.GetItem(u).Value as IOConnectionInfo); + if(iocMru == null) { Debug.Assert(false); continue; } + + if(iocMru.Path.Equals(ioc.Path, StrUtil.CaseIgnoreCmp)) + { + ioc = iocMru.CloneDeep(); + break; + } + } + } + + return ioc; + } + private sealed class OdKpfConstructParams { public IOConnectionInfo IOConnectionInfo = null; @@ -1974,7 +2051,11 @@ pwOpenedDb = OpenDatabaseInternal(ioc, cmpKey); } - if((pwOpenedDb == null) || !pwOpenedDb.IsOpen) return; + if((pwOpenedDb == null) || !pwOpenedDb.IsOpen) + { + UpdateUIState(false); // Reset status bar text + return; + } string strName = pwOpenedDb.IOConnectionInfo.GetDisplayName(); m_mruList.AddItem(strName, pwOpenedDb.IOConnectionInfo.CloneDeep(), true); @@ -2043,25 +2124,18 @@ Program.TriggerSystem.RaiseEvent(EcasEventIDs.OpenedDatabaseFile, pwOpenedDb.IOConnectionInfo.Path); - if(bCorrectDbActive && pwOpenedDb.IsOpen && - Program.Config.Application.FileOpening.ShowSoonToExpireEntries) - { - ShowExpiredEntries(true, 7); - - // Avoid view being destroyed by the unlocking routine - pwOpenedDb.LastSelectedGroup = PwUuid.Zero; - } - else if(bCorrectDbActive && pwOpenedDb.IsOpen && - Program.Config.Application.FileOpening.ShowExpiredEntries) + if(bCorrectDbActive && pwOpenedDb.IsOpen) { - ShowExpiredEntries(true, 0); + ShowExpiredEntries(true, + Program.Config.Application.FileOpening.ShowExpiredEntries, + Program.Config.Application.FileOpening.ShowSoonToExpireEntries); // Avoid view being destroyed by the unlocking routine pwOpenedDb.LastSelectedGroup = PwUuid.Zero; } if(Program.Config.MainWindow.MinimizeAfterOpeningDatabase) - this.WindowState = FormWindowState.Minimized; + UIUtil.SetWindowState(this, FormWindowState.Minimized); ResetDefaultFocus(null); } @@ -2131,24 +2205,23 @@ return false; } - // private static void AutoEnableVisualHiding() // Remove static when implementing + // private void AutoEnableVisualHiding() // { - // KPF 1802197 - - // Turn on visual hiding if option is selected - // if(m_docMgr.ActiveDatabase.MemoryProtection.AutoEnableVisualHiding) - // { - // if(m_docMgr.ActiveDatabase.MemoryProtection.ProtectTitle && !m_viewHideFields.ProtectTitle) - // m_menuViewHideTitles.Checked = m_viewHideFields.ProtectTitle = true; - // if(m_docMgr.ActiveDatabase.MemoryProtection.ProtectUserName && !m_viewHideFields.ProtectUserName) - // m_menuViewHideUserNames.Checked = m_viewHideFields.ProtectUserName = true; - // if(m_docMgr.ActiveDatabase.MemoryProtection.ProtectPassword && !m_viewHideFields.ProtectPassword) - // m_menuViewHidePasswords.Checked = m_viewHideFields.ProtectPassword = true; - // if(m_docMgr.ActiveDatabase.MemoryProtection.ProtectUrl && !m_viewHideFields.ProtectUrl) - // m_menuViewHideURLs.Checked = m_viewHideFields.ProtectUrl = true; - // if(m_docMgr.ActiveDatabase.MemoryProtection.ProtectNotes && !m_viewHideFields.ProtectNotes) - // m_menuViewHideNotes.Checked = m_viewHideFields.ProtectNotes = true; - // } + // // KPF 1802197 + // // Turn on visual hiding if option is selected + // if(m_docMgr.ActiveDatabase.MemoryProtection.AutoEnableVisualHiding) + // { + // if(m_docMgr.ActiveDatabase.MemoryProtection.ProtectTitle && !m_viewHideFields.ProtectTitle) + // m_menuViewHideTitles.Checked = m_viewHideFields.ProtectTitle = true; + // if(m_docMgr.ActiveDatabase.MemoryProtection.ProtectUserName && !m_viewHideFields.ProtectUserName) + // m_menuViewHideUserNames.Checked = m_viewHideFields.ProtectUserName = true; + // if(m_docMgr.ActiveDatabase.MemoryProtection.ProtectPassword && !m_viewHideFields.ProtectPassword) + // m_menuViewHidePasswords.Checked = m_viewHideFields.ProtectPassword = true; + // if(m_docMgr.ActiveDatabase.MemoryProtection.ProtectUrl && !m_viewHideFields.ProtectUrl) + // m_menuViewHideURLs.Checked = m_viewHideFields.ProtectUrl = true; + // if(m_docMgr.ActiveDatabase.MemoryProtection.ProtectNotes && !m_viewHideFields.ProtectNotes) + // m_menuViewHideNotes.Checked = m_viewHideFields.ProtectNotes = true; + // } // } private TreeNode GuiFindGroup(PwUuid puSearch, TreeNode tnContainer) @@ -2183,7 +2256,7 @@ foreach(ListViewItem lvi in m_lvEntries.Items) { - if(((PwEntry)lvi.Tag).Uuid.EqualsValue(puSearch)) + if(((PwListItem)lvi.Tag).Entry.Uuid.EqualsValue(puSearch)) return lvi; } @@ -2195,13 +2268,20 @@ Debug.Assert(pg != null); if(pg == null) return; if(!AppPolicy.Try(AppPolicyId.Print)) return; + PwDatabase pd = m_docMgr.ActiveDatabase; + if((pd == null) || !pd.IsOpen) return; + if(!AppPolicy.Current.PrintNoKey) + { + if(!KeyUtil.ReAskKey(pd, true)) return; + } + PrintForm pf = new PrintForm(); pf.InitEx(pg, true, m_pListSorter.Column); UIUtil.ShowDialogAndDestroy(pf); } - private void InsertToolStripItem(ToolStripMenuItem tsContainer, ToolStripMenuItem tsTemplate, EventHandler ev, - bool bPermanentlyLinkToTemplate) + private ToolStripMenuItem InsertToolStripItem(ToolStripMenuItem tsContainer, + ToolStripMenuItem tsTemplate, EventHandler ev, bool bPermanentlyLinkToTemplate) { ToolStripMenuItem tsmi = new ToolStripMenuItem(tsTemplate.Text, tsTemplate.Image); tsmi.Click += ev; @@ -2219,6 +2299,7 @@ tsTemplate, tsmi)); tsContainer.DropDownItems.Insert(0, tsmi); + return tsmi; } /// @@ -2373,6 +2454,13 @@ UpdateUIState(true); } + public StatusBarLogger CreateStatusBarLogger() + { + StatusBarLogger sl = new StatusBarLogger(); + sl.SetControls(m_statusPartInfo, m_statusPartProgress); + return sl; + } + /// /// Create a new warnings logger object that logs directly into /// the main status bar until the first warning is shown (in that @@ -2381,9 +2469,7 @@ /// Reference to the new logger object. public ShowWarningsLogger CreateShowWarningsLogger() { - StatusBarLogger sl = new StatusBarLogger(); - sl.SetControls(m_statusPartInfo, m_statusPartProgress); - + StatusBarLogger sl = CreateStatusBarLogger(); return new ShowWarningsLogger(sl, this); } @@ -2440,6 +2526,12 @@ { OnSessionLock(null, new SessionLockEventArgs(SessionLockReason.Suspend)); } + else if((m.Msg == m_nTaskbarButtonMessage) && m_bTaskbarButtonMessage) + { + m_bTaskbarButtonMessage = false; + UpdateUIState(false, null); // Set overlay icon + m_bTaskbarButtonMessage = true; + } base.WndProc(ref m); } @@ -2518,7 +2610,9 @@ catch(Exception) { Debug.Assert(false); return; } PwEntry peSel = GetSelectedEntry(true); - if(peSel != null) AutoType.PerformIntoCurrentWindow(peSel); + if(peSel != null) + AutoType.PerformIntoCurrentWindow(peSel, + m_docMgr.SafeFindContainerOf(peSel)); else { EnsureVisibleForegroundWindow(true, true); @@ -2532,12 +2626,15 @@ if(bUntray && IsTrayed()) MinimizeToTray(false); if(bRestoreWindow && (this.WindowState == FormWindowState.Minimized)) - this.WindowState = FormWindowState.Normal; + UIUtil.SetWindowState(this, FormWindowState.Normal); try { - this.BringToFront(); - this.Activate(); + if(this.Visible) // && (this.WindowState != FormWindowState.Minimized) + { + this.BringToFront(); + this.Activate(); + } } catch(Exception) { Debug.Assert(false); } } @@ -2616,45 +2713,68 @@ private void AssignMenuShortcuts() { - m_menuFileNew.ShortcutKeys = (Keys.Control | Keys.N); - m_menuFileOpenLocal.ShortcutKeys = (Keys.Control | Keys.O); - m_menuFileClose.ShortcutKeys = (Keys.Control | Keys.W); - m_menuFileSave.ShortcutKeys = (Keys.Control | Keys.S); - m_menuFilePrint.ShortcutKeys = (Keys.Control | Keys.P); - m_menuFileLock.ShortcutKeys = (Keys.Control | Keys.L); - - m_menuEditFind.ShortcutKeys = (Keys.Control | Keys.F); - // m_ctxEntryAdd.ShortcutKeys = Keys.Control | Keys.N; - - // m_menuViewHidePasswords.ShortcutKeys = (Keys.Control | Keys.H); - // m_menuViewHideUserNames.ShortcutKeys = (Keys.Control | Keys.J); - - m_menuHelpContents.ShortcutKeys = Keys.F1; - - m_ctxGroupFind.ShortcutKeys = (Keys.Control | Keys.Shift | Keys.F); - - string strCtrl = KPRes.KeyboardKeyCtrl, strAlt = KPRes.KeyboardKeyAlt; - - m_ctxEntryCopyUserName.ShortcutKeyDisplayString = strCtrl + "+B"; - m_ctxEntryCopyPassword.ShortcutKeyDisplayString = strCtrl + "+C"; - m_ctxEntryPerformAutoType.ShortcutKeyDisplayString = strCtrl + "+V"; - m_ctxEntryAdd.ShortcutKeyDisplayString = "Ins"; - m_ctxEntryEdit.ShortcutKeyDisplayString = "Return"; - m_ctxEntryDelete.ShortcutKeyDisplayString = "Del"; - m_ctxEntrySelectAll.ShortcutKeyDisplayString = strCtrl + "+A"; - m_ctxEntryOpenUrl.ShortcutKeyDisplayString = strCtrl + "+U"; - - m_ctxEntryMoveToTop.ShortcutKeyDisplayString = strAlt + "+Home"; - m_ctxEntryMoveOneUp.ShortcutKeyDisplayString = strAlt + "+Up"; - m_ctxEntryMoveOneDown.ShortcutKeyDisplayString = strAlt + "+Down"; - m_ctxEntryMoveToBottom.ShortcutKeyDisplayString = strAlt + "+End"; - - m_ctxGroupDelete.ShortcutKeyDisplayString = "Del"; - - m_ctxGroupMoveToTop.ShortcutKeyDisplayString = strAlt + "+Home"; - m_ctxGroupMoveOneUp.ShortcutKeyDisplayString = strAlt + "+Up"; - m_ctxGroupMoveOneDown.ShortcutKeyDisplayString = strAlt + "+Down"; - m_ctxGroupMoveToBottom.ShortcutKeyDisplayString = strAlt + "+End"; + UIUtil.AssignShortcut(m_menuFileNew, Keys.Control | Keys.N); + UIUtil.AssignShortcut(m_menuFileOpenLocal, Keys.Control | Keys.O); + UIUtil.AssignShortcut(m_menuFileOpenUrl, Keys.Control | Keys.Shift | Keys.O); + UIUtil.AssignShortcut(m_menuFileClose, Keys.Control | Keys.W); + UIUtil.AssignShortcut(m_menuFileSave, Keys.Control | Keys.S); + UIUtil.AssignShortcut(m_menuFilePrint, Keys.Control | Keys.P); + UIUtil.AssignShortcut(m_menuFileSyncFile, Keys.Control | Keys.R); + UIUtil.AssignShortcut(m_menuFileSyncUrl, Keys.Control | Keys.Shift | Keys.R); + UIUtil.AssignShortcut(m_menuFileLock, Keys.Control | Keys.L); + + UIUtil.AssignShortcut(m_menuEditFind, Keys.Control | Keys.F); + + // UIUtil.AssignShortcut(m_menuViewHidePasswords, Keys.Control | Keys.H); + // UIUtil.AssignShortcut(m_menuViewHideUserNames, Keys.Control | Keys.J); + + UIUtil.AssignShortcut(m_menuHelpContents, Keys.F1); + + UIUtil.AssignShortcut(m_ctxGroupFind, Keys.Control | Keys.Shift | Keys.F); + + string strCtrl = KPRes.KeyboardKeyCtrl + "+", strAlt = KPRes.KeyboardKeyAlt + "+", + strShift = KPRes.KeyboardKeyShift + "+"; + string strCtrlShift = strCtrl + strShift; + + m_ctxEntryCopyUserName.ShortcutKeyDisplayString = strCtrl + "B"; + m_ctxEntryCopyPassword.ShortcutKeyDisplayString = strCtrl + "C"; + m_ctxEntryOpenUrl.ShortcutKeyDisplayString = strCtrl + "U"; + m_ctxEntryCopyUrl.ShortcutKeyDisplayString = strCtrlShift + "U"; + m_ctxEntryPerformAutoType.ShortcutKeyDisplayString = strCtrl + "V"; + m_ctxEntryAdd.ShortcutKeyDisplayString = strCtrl + "I"; + m_ctxEntryEdit.ShortcutKeyDisplayString = KPRes.KeyboardKeyReturn; + m_ctxEntryDelete.ShortcutKeyDisplayString = UIUtil.GetKeysName(Keys.Delete); // "Del" + m_ctxEntrySelectAll.ShortcutKeyDisplayString = strCtrl + "A"; + + m_ctxEntryMoveToTop.ShortcutKeyDisplayString = strAlt + + UIUtil.GetKeysName(Keys.Home); // "Home" + m_ctxEntryMoveOneUp.ShortcutKeyDisplayString = strAlt + + UIUtil.GetKeysName(Keys.Up); // "Up" + m_ctxEntryMoveOneDown.ShortcutKeyDisplayString = strAlt + + UIUtil.GetKeysName(Keys.Down); // "Down" + m_ctxEntryMoveToBottom.ShortcutKeyDisplayString = strAlt + + UIUtil.GetKeysName(Keys.End); // "End" + + m_ctxGroupDelete.ShortcutKeyDisplayString = UIUtil.GetKeysName(Keys.Delete); // "Del" + + m_ctxGroupMoveToTop.ShortcutKeyDisplayString = strAlt + + UIUtil.GetKeysName(Keys.Home); // "Home" + m_ctxGroupMoveOneUp.ShortcutKeyDisplayString = strAlt + + UIUtil.GetKeysName(Keys.Up); // "Up" + m_ctxGroupMoveOneDown.ShortcutKeyDisplayString = strAlt + + UIUtil.GetKeysName(Keys.Down); // "Down" + m_ctxGroupMoveToBottom.ShortcutKeyDisplayString = strAlt + + UIUtil.GetKeysName(Keys.End); // "End" + } + + private static void CopyMenuItemText(ToolStripMenuItem tsmiTarget, + ToolStripMenuItem tsmiCopyFrom) + { + tsmiTarget.Text = tsmiCopyFrom.Text; + + string strSh = tsmiCopyFrom.ShortcutKeyDisplayString; + if(!string.IsNullOrEmpty(strSh)) + tsmiTarget.ShortcutKeyDisplayString = strSh; } private void SaveDatabaseAs(bool bOnline, object sender, bool bCopy) @@ -2746,19 +2866,20 @@ PerformSelfTest(); pwDatabase.UseFileTransactions = Program.Config.Application.UseTransactedFileWrites; + pwDatabase.UseFileLocks = Program.Config.Application.UseFileLocks; - AceColumn col = Program.Config.MainWindow.FindColumn(AceColumnType.Title); - if((col != null) && !col.HideWithAsterisks) - pwDatabase.MemoryProtection.ProtectTitle = false; - col = Program.Config.MainWindow.FindColumn(AceColumnType.UserName); - if((col != null) && !col.HideWithAsterisks) - pwDatabase.MemoryProtection.ProtectUserName = false; - col = Program.Config.MainWindow.FindColumn(AceColumnType.Url); - if((col != null) && !col.HideWithAsterisks) - pwDatabase.MemoryProtection.ProtectUrl = false; - col = Program.Config.MainWindow.FindColumn(AceColumnType.Notes); - if((col != null) && !col.HideWithAsterisks) - pwDatabase.MemoryProtection.ProtectNotes = false; + // AceColumn col = Program.Config.MainWindow.FindColumn(AceColumnType.Title); + // if((col != null) && !col.HideWithAsterisks) + // pwDatabase.MemoryProtection.ProtectTitle = false; + // col = Program.Config.MainWindow.FindColumn(AceColumnType.UserName); + // if((col != null) && !col.HideWithAsterisks) + // pwDatabase.MemoryProtection.ProtectUserName = false; + // col = Program.Config.MainWindow.FindColumn(AceColumnType.Url); + // if((col != null) && !col.HideWithAsterisks) + // pwDatabase.MemoryProtection.ProtectUrl = false; + // col = Program.Config.MainWindow.FindColumn(AceColumnType.Notes); + // if((col != null) && !col.HideWithAsterisks) + // pwDatabase.MemoryProtection.ProtectNotes = false; if(pwDatabase == m_docMgr.ActiveDatabase) SaveWindowState(); } @@ -2849,8 +2970,10 @@ if(c == null) { + // QuickFind must be the first choice (see e.g. + // the option FocusQuickFindOnUntray) if(m_tbQuickFind.Visible && m_tbQuickFind.Enabled) - c = m_tbQuickFind.Control; // Must be the first choice + c = m_tbQuickFind.Control; else if(m_lvEntries.Visible && m_lvEntries.Enabled) c = m_lvEntries; else if(m_tvGroups.Visible && m_tvGroups.Enabled) @@ -2980,8 +3103,8 @@ if(def.EditedBinaryData != null) // User changed the data { - pe.Binaries.Set(eba.Name, new ProtectedBinary(false, - def.EditedBinaryData)); + pe.Binaries.Set(eba.Name, new ProtectedBinary( + pbData.IsProtected, def.EditedBinaryData)); pe.Touch(true, false); RefreshEntriesList(); @@ -3137,7 +3260,7 @@ if(Program.Config.MainWindow.MinimizeAfterLocking && !IsAtLeastOneFileOpen()) - this.WindowState = FormWindowState.Minimized; + UIUtil.SetWindowState(this, FormWindowState.Minimized); } private void SaveAllDocuments() @@ -3351,8 +3474,8 @@ // EnsureVisibleForegroundWindow(false, false); // Don't! if(this.WindowState == FormWindowState.Minimized) - this.WindowState = (Program.Config.MainWindow.Maximized ? - FormWindowState.Maximized : FormWindowState.Normal); + UIUtil.SetWindowState(this, (Program.Config.MainWindow.Maximized ? + FormWindowState.Maximized : FormWindowState.Normal)); else if(IsFileLocked(null) && !UIIsAutoUnlockBlocked()) OnFileLock(null, EventArgs.Empty); // Unlock @@ -3369,19 +3492,23 @@ (Program.CommandLineArgs[AppDefs.CommandLineOptions.Minimize] != null)) { if(bFormLoading) + UIUtil.SetWindowState(this, FormWindowState.Minimized); + else { - this.WindowState = FormWindowState.Minimized; + // The following isn't required anymore, because the + // TaskbarButtonCreated message is handled // Set the lock overlay icon again (the first time // Windows ignores the call, maybe because the window // wasn't fully constructed at that time yet) - if(IsFileLocked(null)) - TaskbarList.SetOverlayIcon(this, - Properties.Resources.LockOverlay, KPRes.Locked); + // if(IsFileLocked(null)) + // TaskbarList.SetOverlayIcon(this, + // Properties.Resources.LockOverlay, KPRes.Locked); } if(Program.Config.MainWindow.MinimizeToTray) MinimizeToTray(true); - else if(!bFormLoading) this.WindowState = FormWindowState.Minimized; + else if(!bFormLoading) + UIUtil.SetWindowState(this, FormWindowState.Minimized); } // Remove taskbar item @@ -3403,13 +3530,15 @@ } } - private void SelectEntries(PwObjectList lEntries, bool bDeselectOthers) + private void SelectEntries(PwObjectList lEntries, + bool bDeselectOthers, bool bFocusFirst) { m_bBlockEntrySelectionEvent = true; + bool bFirst = true; for(int i = 0; i < m_lvEntries.Items.Count; ++i) { - PwEntry pe = (m_lvEntries.Items[i].Tag as PwEntry); + PwEntry pe = ((PwListItem)m_lvEntries.Items[i].Tag).Entry; if(pe == null) { Debug.Assert(false); continue; } bool bFound = false; @@ -3418,6 +3547,13 @@ if(pe == peFocus) { m_lvEntries.Items[i].Selected = true; + + if(bFirst && bFocusFirst) + { + m_lvEntries.Items[i].Focused = true; + bFirst = false; + } + bFound = true; break; } @@ -3438,13 +3574,13 @@ if(m_lvEntries.ShowGroups == false) { foreach(ListViewItem lvi in m_lvEntries.Items) - pg.AddEntry(lvi.Tag as PwEntry, false); + pg.AddEntry(((PwListItem)lvi.Tag).Entry, false); } else // Groups { foreach(ListViewGroup lvg in m_lvEntries.Groups) foreach(ListViewItem lvi in lvg.Items) - pg.AddEntry(lvi.Tag as PwEntry, false); + pg.AddEntry(((PwListItem)lvi.Tag).Entry, false); } return pg; @@ -3482,13 +3618,16 @@ if(bLockUIUpdate) m_lvEntries.BeginUpdate(); - for(int i = m_lvEntries.Items.Count - 1; i >= 0; --i) + lock(m_asyncListUpdate.ListEditSyncObject) { - PwEntry pe = (m_lvEntries.Items[i].Tag as PwEntry); - Debug.Assert(pe != null); + for(int i = m_lvEntries.Items.Count - 1; i >= 0; --i) + { + PwEntry pe = ((PwListItem)m_lvEntries.Items[i].Tag).Entry; + Debug.Assert(pe != null); - if(Array.IndexOf(vEntries, pe) >= 0) - m_lvEntries.Items.RemoveAt(i); + if(Array.IndexOf(vEntries, pe) >= 0) + m_lvEntries.Items.RemoveAt(i); + } } // Refresh alternating item background colors @@ -3540,7 +3679,7 @@ dlg.MainInstruction = KPRes.OverwriteExistingFileQuestion; dlg.AddButton((int)DialogResult.Yes, KPRes.Synchronize, KPRes.FileChangedSync); dlg.AddButton((int)DialogResult.No, KPRes.Overwrite, KPRes.FileChangedOverwrite); - dlg.AddButton((int)DialogResult.Cancel, KPRes.Cancel, KPRes.FileSaveQOpCancel); + dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, KPRes.FileSaveQOpCancel); DialogResult dr; if(dlg.ShowDialog()) dr = (DialogResult)dlg.Result; @@ -3704,7 +3843,7 @@ dlg.SetIcon(VtdCustomIcon.Question); dlg.WindowTitle = PwDefs.ShortProductName; dlg.AddButton((int)DialogResult.OK, KPRes.DeleteCmd, null); - dlg.AddButton((int)DialogResult.Cancel, KPRes.DontDeleteCmd, null); + dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, null); if(dlg.ShowDialog()) { @@ -3782,7 +3921,7 @@ dlg.SetIcon(VtdCustomIcon.Question); dlg.WindowTitle = PwDefs.ShortProductName; dlg.AddButton((int)DialogResult.OK, KPRes.DeleteCmd, null); - dlg.AddButton((int)DialogResult.Cancel, KPRes.DontDeleteCmd, null); + dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, null); if(dlg.ShowDialog()) { @@ -3832,7 +3971,7 @@ dlg.SetIcon(VtdCustomIcon.Question); dlg.WindowTitle = PwDefs.ShortProductName; dlg.AddButton((int)DialogResult.OK, KPRes.DeleteCmd, null); - dlg.AddButton((int)DialogResult.Cancel, KPRes.DontDeleteCmd, null); + dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, null); if(dlg.ShowDialog()) { @@ -3946,23 +4085,7 @@ Directory.GetCurrentDirectory(), false) + "Sentinel", ioc.Path); if(args[AppDefs.CommandLineOptions.IoCredFromRecent] != null) - { - for(uint u = 0; u < m_mruList.ItemCount; ++u) - { - KeyValuePair kvp = m_mruList.GetItem(u); - if(kvp.Value == null) { Debug.Assert(false); continue; } - IOConnectionInfo iocMru = (kvp.Value as IOConnectionInfo); - if(iocMru == null) { Debug.Assert(false); continue; } - - if(iocMru.Path.Equals(ioc.Path, StrUtil.CaseIgnoreCmp)) - { - ioc.UserName = iocMru.UserName; - ioc.Password = iocMru.Password; - ioc.CredSaveMode = iocMru.CredSaveMode; - break; - } - } - } + ioc = CompleteConnectionInfoUsingMru(ioc); string strUserName = args[AppDefs.CommandLineOptions.IoCredUserName]; if(strUserName != null) ioc.UserName = strUserName; @@ -4080,8 +4203,13 @@ if(!bGuiToInternal) // Internal to GUI { + m_asyncListUpdate.CancelPendingUpdatesAsync(); + m_lvEntries.BeginUpdate(); - m_lvEntries.Items.Clear(); + lock(m_asyncListUpdate.ListEditSyncObject) + { + m_lvEntries.Items.Clear(); + } m_lvEntries.Columns.Clear(); if(Program.Config.MainWindow.EntryListColumns.Count == 0) @@ -4150,13 +4278,23 @@ Program.Config.MainWindow.EntryListColumns.Add(c); } - private string GetEntryFieldEx(PwEntry pe, int iColumnID, bool bFormatForDisplay) + private string GetEntryFieldEx(PwEntry pe, int iColumnID, + bool bFormatForDisplay, out bool bRequestAsync) { List l = Program.Config.MainWindow.EntryListColumns; - if((iColumnID < 0) || (iColumnID >= l.Count)) { Debug.Assert(false); return string.Empty; } + if((iColumnID < 0) || (iColumnID >= l.Count)) + { + Debug.Assert(false); + bRequestAsync = false; + return string.Empty; + } AceColumn col = l[iColumnID]; - if(bFormatForDisplay && col.HideWithAsterisks) return PwDefs.HiddenPassword; + if(bFormatForDisplay && col.HideWithAsterisks) + { + bRequestAsync = false; + return PwDefs.HiddenPassword; + } string str; switch(col.Type) @@ -4203,6 +4341,31 @@ default: Debug.Assert(false); str = string.Empty; break; } + if(Program.Config.MainWindow.EntryListShowDerefData) + { + switch(col.Type) + { + case AceColumnType.Title: + case AceColumnType.UserName: + case AceColumnType.Password: + case AceColumnType.Url: + case AceColumnType.Notes: + case AceColumnType.CustomString: + bRequestAsync = SprEngine.MightDeref(str); + break; + default: bRequestAsync = false; break; + } + + if(!Program.Config.MainWindow.EntryListShowDerefDataAsync && + bRequestAsync) + { + PwListItem pli = new PwListItem(pe); + str = AsyncPwListUpdate.SprCompileFn(str, pli); + bRequestAsync = false; + } + } + else bRequestAsync = false; + return str; } @@ -4214,19 +4377,6 @@ return v[nColID]; } - private static bool IsColumnHidden(AceColumnType t) - { - List l = Program.Config.MainWindow.EntryListColumns; - bool bHidden = (t == AceColumnType.Password); - - foreach(AceColumn c in l) - { - if(c.Type == t) { bHidden = c.HideWithAsterisks; break; } - } - - return bHidden; - } - private void ToggleFieldAsterisks(AceColumnType colType) { List l = Program.Config.MainWindow.EntryListColumns; @@ -4431,14 +4581,14 @@ { if(pd == null) { Debug.Assert(false); return; } - if(sp != null) - { - if(sp.SearchInTitles) pd.MemoryProtection.ProtectTitle = false; - if(sp.SearchInUserNames) pd.MemoryProtection.ProtectUserName = false; - // if(sp.SearchInPasswords) pd.MemoryProtection.ProtectPassword = false; - if(sp.SearchInUrls) pd.MemoryProtection.ProtectUrl = false; - if(sp.SearchInNotes) pd.MemoryProtection.ProtectNotes = false; - } + // if(sp != null) + // { + // if(sp.SearchInTitles) pd.MemoryProtection.ProtectTitle = false; + // if(sp.SearchInUserNames) pd.MemoryProtection.ProtectUserName = false; + // // if(sp.SearchInPasswords) pd.MemoryProtection.ProtectPassword = false; + // if(sp.SearchInUrls) pd.MemoryProtection.ProtectUrl = false; + // if(sp.SearchInNotes) pd.MemoryProtection.ProtectNotes = false; + // } } private static bool? m_bCachedSelfTestResult = null; @@ -4535,5 +4685,57 @@ if((u & (ulong)AceUIFlags.DisableTriggers) != 0) m_menuToolsTriggers.Enabled = false; } + + private static void OnFormLoadParallelAsync(object stateInfo) + { + try + { + string strShInstUtil = UrlUtil.GetFileDirectory( + WinUtil.GetExecutable(), true, false) + AppDefs.ShInstUtil; + + // Unblock the application such that the user isn't + // prompted next time anymore + WinUtil.RemoveZoneIdentifier(WinUtil.GetExecutable()); + WinUtil.RemoveZoneIdentifier(AppHelp.LocalHelpFile); + WinUtil.RemoveZoneIdentifier(strShInstUtil); + } + catch(Exception) { Debug.Assert(false); } + } + + private bool IsCommandTypeInvokable(MainAppState? sContext, AppCommandType t) + { + MainAppState s = (sContext.HasValue ? sContext.Value : GetMainAppState()); + + if(t == AppCommandType.Window) + return (s.NoWindowShown && !UIIsInteractionBlocked()); + if(t == AppCommandType.Lock) + return (s.NoWindowShown && !UIIsInteractionBlocked() && s.EnableLockCmd); + + return false; + } + + private void UpdateTrayState() + { + UpdateUIState(false); // Update tray lock text + + ulong u = Program.Config.UI.UIFlags; + bool bOptions = ((u & (ulong)AceUIFlags.DisableOptions) == 0); + + MainAppState s = GetMainAppState(); + + m_ctxTrayTray.Enabled = IsCommandTypeInvokable(s, AppCommandType.Window); + m_ctxTrayOptions.Enabled = (IsCommandTypeInvokable(s, + AppCommandType.Window) && bOptions); + m_ctxTrayLock.Enabled = IsCommandTypeInvokable(s, AppCommandType.Lock); + m_ctxTrayFileExit.Enabled = IsCommandTypeInvokable(s, AppCommandType.Window); + } + + internal static SprContext GetEntryListSprContext(PwEntry pe, + PwDatabase pd) + { + SprContext ctx = new SprContext(pe, pd, SprCompileFlags.Deref); + ctx.ForcePlainTextPasswords = false; + return ctx; + } } } diff -Nru keepass2-2.16+dfsg/KeePass/Forms/MainForm.resx keepass2-2.18+dfsg/KeePass/Forms/MainForm.resx --- keepass2-2.16+dfsg/KeePass/Forms/MainForm.resx 2011-07-09 10:45:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/MainForm.resx 2011-08-27 10:00:04.000000000 +0000 @@ -127,1454 +127,1445 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAC - UwEAAk1TRnQBSQFMAgEBRQEAAUwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABIAEBAgABAQEAASAGAAEgAQEhAAGFAVkBTQH/AUwBGQEIAf8BTAEZAQgB/wFMARkBCAH/AUwBGQEI - Af8BTAEZAQgB/wGFAVkBTQH/4AABlgFxAWcB/wFmAUYBOwH/AWcBUgFMAf8BaQFYAVMB/wOHAf8BcgFk - AV8B/wFyAWEBWwH/AWgBRwE9Af8BnAF3AW0B/9wAAXIBTwFEAf8BSgEuASYB/wFIAScBHQH/AUgBJwEd - Af8BUwE2ASwB/wFTATYBLAH/AVMBNgEsAf8BUwE2ASwB/wFyAU8BRAH/3AABcgFPAUQB/wFjAUQBOgH/ - AWkBSgFAAf8BaQFKAUAB/wFpAUwBQgH/AWkBTAFCAf8BaQFMAUIB/wFpAUsBQgH/AXIBTwFEAf/cAAFy - AU8BRAH/AWMBRAE7Af8BaQFKAUAB/wFtAU0BRAH/AY4BZQFbAf8BbQFPAUUB/wFpAUwBQgH/AWkBTAFC - Af8BcgFPAUQB/9wAAXIBTwFEAf8BTgFKAR0B/wFsAZEBSgH/AXUBVAFBAf8B6wH1AfgB/wGBAkwB/wFU - ATYBkAH/AUoBJAFPAf8BcgFPAUQB/9wAAXIBTwFEAf8CawFMAf8BmQGyAZQB/wHGAb0BugH/AcgBtgGx - Af8BxgG9AboB/wGZAZQBxgH/AWsBUwF1Af8BcgFPAUQB/9wAAXIBTwFEAf8BMwEZARQB/wErAhsB/wE8 - ASEBOwH/AUICNgH/AU0CQQH/AS8CHwH/ATMBGQEUAf8BcgFPAUQB/9wAAXIBTwFEAf8BxwG8AbgB/wHw - AeEB3QH/AfgB+QH6Af8B8AHiAd8B/wP4Af8B8AHkAeEB/wG+AbMBrwH/AXIBTwFEAf/cAAFyAU8BRAH/ - AccBuQG1Af8B2AG2Aa0B/wH1AvMB/wHZAbsBswH/AfIB7gHtAf8B4AHBAbgB/wG5Aa4BqgH/AXIBTwFE - Af/cAAFyAU8BRAH/AcABtAG5Af8BZAFVAdwB/wHsAfsC/wGBAd0C/wHjAfIB3wH/AYABuwFqAf8BuQGu - AaoB/wFyAU8BRAH/3AABcgFPAUQB/wG/AboBuwH/AW0BwAL/AfUC8wH/AdkBuwGzAf8B+AHvAe0B/wHg - AcEBuQH/AbkBrgGqAf8BcgFPAUQB/9wAAXIBTwFEAf8BxAG8AbsB/wG5AeIC/wHzAfgB+gH/AewB4QHf - Af8B9QH3AfgB/wHuAeMB4QH/Ab8BswGvAf8BcgFPAUQB/9wAAXIBTwFEAf8BMwEZARQB/wEqAhkB/wFC - AjUB/wFMAkAB/wFHAjoB/wEqAhkB/wEzARkBFAH/AXIBTwFEAf/cAAGEAVkBTgH/AU4BHQEMAf8BgAFX - AU0B/wG2Aa0BqgH/A8wB/wG2Aa0BqgH/AYABVwFNAf8BTgEdAQwB/wGKAWABVAH/3AAB0gHFAcEB/wFM - ARkBCAH/AUwBGQEIAf8BTAEZAQgB/wFMARkBCAH/AUwBGQEIAf8BQQEfAWIB/wFJARgBEAH/AdIBxQHB - Af/kAAPHAf8DTAH/A2UB/wOwAf8DcwH/A0YB/wOJAf9sAAGFAb4BhQH/ATQBlwE0Af9sAAOuAf8DUQH/ - A1EB/wNQAf8DUAH/A1AB/wNQAf8DUAH/A1UB/2gAAYUBvgGFAf8BNAGXATQB/2wAA10B/wNfAf8DXQH/ - A1oB/wNVAf8DUQH/A1AB/wNQAf8DUAH/A2IB/xwAA+8B/wPhAf8MAAPXAf8D/AH/HAABvwHdAb8B/wFs - AbUBbAH/ATQBlwE0Af8BHQGLAR0B/wEdAYsBHQH/AQABcAEAAf8BHQGLAR0B/wE0AZcBNAH/AbEB1QGx - Af9cAAN2Af8DagH/A2oB/wNpAf8DZQH/A2AB/wNaAf8DUwH/A1AB/wNQAf8DUAH/A8oB/xgAA1UB/wMK - Af8D8gH/BAADwQH/AwAB/wOvAf8cAAE0AZcBNAH/AQABcAEAAf8BhQG+AYUB/wHmAfEB5gH/AYUBvgGF - Af8BNAGXATQB/wG/Ad0BvwH/AR0BiwEdAf8BAAFwAQAB/wGUAcYBlAH/DAABxQHrAcUB/wG2AecBtgH/ + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD0 + UAEAAk1TRnQBSQFMAgEBRQEAAUwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + AwABIAEBAgABAQEAASAGAAEgAQEhAAGFAVYBSgH/AUkBFgEFAf8BSQEWAQUB/wFJARYBBQH/AUkBFgEF + Af8BSQEWAQUB/wGFAVYBSgH/4AABlgFuAWQB/wFjAUMBOAH/AWQBTwFJAf8BZgFVAVAB/wOHAf8BbwFh + AVwB/wFvAV4BWAH/AWUBRAE6Af8BnAF0AWoB/9wAAW8BTAFBAf8BRwErASMB/wFFASQBGgH/AUUBJAEa + Af8BUAEzASkB/wFQATMBKQH/AVABMwEpAf8BUAEzASkB/wFvAUwBQQH/3AABbwFMAUEB/wFgAUEBNwH/ + AWYBRwE9Af8BZgFHAT0B/wFmAUkBPwH/AWYBSQE/Af8BZgFJAT8B/wFmAUgBPwH/AW8BTAFBAf/cAAFv + AUwBQQH/AWABQQE4Af8BZgFHAT0B/wFqAUoBQQH/AY4BYgFYAf8BagFMAUIB/wFmAUkBPwH/AWYBSQE/ + Af8BbwFMAUEB/9wAAW8BTAFBAf8BSwFHARoB/wFpAZEBRwH/AXIBUQE+Af8B6wH1AfgB/wGBAkkB/wFR + ATMBkAH/AUcBIQFMAf8BbwFMAUEB/9wAAW8BTAFBAf8CaAFJAf8BmQGyAZQB/wHGAb0BugH/AcgBtgGx + Af8BxgG9AboB/wGZAZQBxgH/AWgBUAFyAf8BbwFMAUEB/9wAAW8BTAFBAf8BMAEWAREB/wEoAhgB/wE5 + AR4BOAH/AT8CMwH/AUoCPgH/ASwCHAH/ATABFgERAf8BbwFMAUEB/9wAAW8BTAFBAf8BxwG8AbgB/wHw + AeEB3QH/AfgB+QH6Af8B8AHiAd8B/wP4Af8B8AHkAeEB/wG+AbMBrwH/AW8BTAFBAf/cAAFvAUwBQQH/ + AccBuQG1Af8B2AG2Aa0B/wH1AvMB/wHZAbsBswH/AfIB7gHtAf8B4AHBAbgB/wG5Aa4BqgH/AW8BTAFB + Af/cAAFvAUwBQQH/AcABtAG5Af8BYQFSAdwB/wHsAfsC/wGBAd0C/wHjAfIB3wH/AYABuwFnAf8BuQGu + AaoB/wFvAUwBQQH/3AABbwFMAUEB/wG/AboBuwH/AWoBwAL/AfUC8wH/AdkBuwGzAf8B+AHvAe0B/wHg + AcEBuQH/AbkBrgGqAf8BbwFMAUEB/9wAAW8BTAFBAf8BxAG8AbsB/wG5AeIC/wHzAfgB+gH/AewB4QHf + Af8B9QH3AfgB/wHuAeMB4QH/Ab8BswGvAf8BbwFMAUEB/9wAAW8BTAFBAf8BMAEWAREB/wEnAhYB/wE/ + AjIB/wFJAj0B/wFEAjcB/wEnAhYB/wEwARYBEQH/AW8BTAFBAf/cAAGEAVYBSwH/AUsBGgEJAf8BgAFU + AUoB/wG2Aa0BqgH/A8wB/wG2Aa0BqgH/AYABVAFKAf8BSwEaAQkB/wGKAV0BUQH/3AAB0gHFAcEB/wFJ + ARYBBQH/AUkBFgEFAf8BSQEWAQUB/wFJARYBBQH/AUkBFgEFAf8BPgEcAV8B/wFGARUBDQH/AdIBxQHB + Af/kAAPHAf8DSQH/A2IB/wOwAf8DcAH/A0MB/wOJAf9sAAGFAb4BhQH/ATEBlwExAf9sAAOuAf8DTgH/ + A04B/wNNAf8DTQH/A00B/wNNAf8DTQH/A1IB/2gAAYUBvgGFAf8BMQGXATEB/2wAA1oB/wNcAf8DWgH/ + A1cB/wNSAf8DTgH/A00B/wNNAf8DTQH/A18B/xwAA+8B/wPhAf8MAAPXAf8D/AH/HAABvwHdAb8B/wFp + AbUBaQH/ATEBlwExAf8BGgGLARoB/wEaAYsBGgH/AQABbQEAAf8BGgGLARoB/wExAZcBMQH/AbEB1QGx + Af9cAANzAf8DZwH/A2cB/wNmAf8DYgH/A10B/wNXAf8DUAH/A00B/wNNAf8DTQH/A8oB/xgAA1IB/wMH + Af8D8gH/BAADwQH/AwAB/wOvAf8cAAExAZcBMQH/AQABbQEAAf8BhQG+AYUB/wHmAfEB5gH/AYUBvgGF + Af8BMQGXATEB/wG/Ad0BvwH/ARoBiwEaAf8BAAFtAQAB/wGUAcYBlAH/DAABxQHrAcUB/wG2AecBtgH/ AbQB5gG0Af8BtAHlAbQB/wG1AeYBswH/AbMB5QGyAf8BsQHlAbIB/wGxAeUBsgH/AbAB5AGvAf8BrwHj - Aa4B/wGxAeQBrgH/AawB4gGqAf8BqgHiAacB/wGpAeEBpgH/AacB4AGmAf8B2AHuAdcB/wwAA3QB/wOA - Af8DgAH/A3QB/wNxAf8DagH/A2QB/wNbAf8DUwH/A1AB/wNQAf8DUQH/FAAD3wH/AwAB/wMAAf8DiAH/ - BAADPgH/AwAB/wNDAf8cAAE0AZcBNAH/AUkBogFJAf8IAAGFAb4BhQH/ATQBlwE0Af8EAAGFAb4BhQH/ - AQABcAEAAf8BHQGLAR0B/wwAAZoB4QGbAf8BogHkAaYB/wG4AesBvAH/AboB6wG9Af8BuQHsAbwB/wG7 + Aa4B/wGxAeQBrgH/AawB4gGqAf8BqgHiAacB/wGpAeEBpgH/AacB4AGmAf8B2AHuAdcB/wwAA3EB/wOA + Af8DgAH/A3EB/wNuAf8DZwH/A2EB/wNYAf8DUAH/A00B/wNNAf8DTgH/FAAD3wH/AwAB/wMAAf8DiAH/ + BAADOwH/AwAB/wNAAf8cAAExAZcBMQH/AUYBogFGAf8IAAGFAb4BhQH/ATEBlwExAf8EAAGFAb4BhQH/ + AQABbQEAAf8BGgGLARoB/wwAAZoB4QGbAf8BogHkAaYB/wG4AesBvAH/AboB6wG9Af8BuQHsAbwB/wG7 AewBwAH/AboB6wG/Af8BugHrAb0B/wG7AesBvgH/AbkB6gG8Af8BuQHqAbwB/wG4AeoBvAH/AbcB6gG5 - Af8BtAHpAbcB/wF0AdsBggH/AcUB5gHEAf8IAAO1Af8DiQH/A4sB/wOLAf8DiAH/A4MB/wN0Af8DbAH/ - A2QB/wNaAf8DUQH/A1AB/wNQAf8UAANkAf8DAAH/AzwB/wMsAf8DvAH/AwAB/wMAAf8DLQH/A+EB/xgA - AZQBxgGUAf8BvwHdAb8B/wgAAYUBvgGFAf8BNAGXATQB/wQAAUkBogFJAf8BAAFwAQAB/wEAAXABAAH/ + Af8BtAHpAbcB/wFxAdsBggH/AcUB5gHEAf8IAAO1Af8DiQH/A4sB/wOLAf8DiAH/A4MB/wNxAf8DaQH/ + A2EB/wNXAf8DTgH/A00B/wNNAf8UAANhAf8DAAH/AzkB/wMpAf8DvAH/AwAB/wMAAf8DKgH/A+EB/xgA + AZQBxgGUAf8BvwHdAb8B/wgAAYUBvgGFAf8BMQGXATEB/wQAAUYBogFGAf8BAAFtAQAB/wEAAW0BAAH/ AdkB6gHZAf8IAAGYAeABmwH/AcoB7wHRAf8B+gL+Af8B+gL+Af8B+gL+Af8B/QH/Af4F/wHLAc4B7gH/ - AXEBhAHQAf8BvQHCAd4B/wF2AYoB1wH/AagBrAHXAf8B+AH+AfwB/wH1Af4B+gH/AY8B3wGVAf8BwwHl - AcMB/wgAA4YB/wOTAf8DmAH/A5gB/wOTAf8DjQH/A4UB/wNzAf8DaQH/A18B/wNVAf8DUAH/A1AB/wOn - Af8MAAPoAf8DAQH/AwAB/wPFAf8DkQH/AwkB/wMAAf8DVwH/A6wB/wN3Af8oAAFsAbUBbAH/AR0BiwEd - Af8BNAGXATQB/wEAAXABAAH/AQABcAEAAf8BHQGLAR0B/wwAAZwB4gGfAf8BxwHvAdAB/wHxAf4B/AH/ - AfEB/gH8Af8B8QH+AfwB/wH6Af8B/gX/AeoB7QH8Af8BBAE8AfgB/wGbAasB3QH/ARQBSwH4Af8BawGL + AW4BhAHQAf8BvQHCAd4B/wFzAYoB1wH/AagBrAHXAf8B+AH+AfwB/wH1Af4B+gH/AY8B3wGVAf8BwwHl + AcMB/wgAA4YB/wOTAf8DmAH/A5gB/wOTAf8DjQH/A4UB/wNwAf8DZgH/A1wB/wNSAf8DTQH/A00B/wOn + Af8MAAPoAf8DAAH/AwAB/wPFAf8DkQH/AwYB/wMAAf8DVAH/A6wB/wN0Af8oAAFpAbUBaQH/ARoBiwEa + Af8BMQGXATEB/wEAAW0BAAH/AQABbQEAAf8BGgGLARoB/wwAAZwB4gGfAf8BxwHvAdAB/wHxAf4B/AH/ + AfEB/gH8Af8B8QH+AfwB/wH6Af8B/gX/AeoB7QH8Af8BAQE5AfgB/wGbAasB3QH/AREBSAH4Af8BaAGL AeMB/wHrAf0B9wH/AecB/QH0Af8BjgHfAZcB/wHBAeYBwgH/CAADlQH/A58B/wOkAf8DpAH/A50B/wOV - Af8DiwH/A4EB/wNuAf8DZAH/A1gB/wNQAf8DUAH/A2kB/wwAA24B/wMAAf8DNQH/BAADywH/AwAB/wMA - Af8D2AH/BAADLQH/A/wB/xgAAeYB8QHmAf8BWwGsAVsB/wEdAYsBHQH/AQABcAEAAf8BAAFwAQAB/wEA - AXABAAH/AQABcAEAAf8BAAFwAQAB/wFJAaIBSQH/DAABnAHiAZ8B/wHFAe4BzgH/Ae0B+wH4Af8B7QH7 - AfkB/wHsAfsB+QH/AfUB/gH9Af8B9wH+Af0B/wH8Av4B/wFaAXYB9AH/AREBMQHXAf8BBwEmAdEB/wHh + Af8DiwH/A4EB/wNrAf8DYQH/A1UB/wNNAf8DTQH/A2YB/wwAA2sB/wMAAf8DMgH/BAADywH/AwAB/wMA + Af8D2AH/BAADKgH/A/wB/xgAAeYB8QHmAf8BWAGsAVgB/wEaAYsBGgH/AQABbQEAAf8BAAFtAQAB/wEA + AW0BAAH/AQABbQEAAf8BAAFtAQAB/wFGAaIBRgH/DAABnAHiAZ8B/wHFAe4BzgH/Ae0B+wH4Af8B7QH7 + AfkB/wHsAfsB+QH/AfUB/gH9Af8B9wH+Af0B/wH8Av4B/wFXAXMB9AH/AQ4BLgHXAf8BBAEjAdEB/wHh AeMB7QH/Af0C/gH/AfwB/gH9Af8BjwHgAZgB/wG/AeUBwAH/CAADmgH/A6YB/wOuAf8DrgH/A6QB/wOa - Af8DjgH/A4MB/wNvAf8DZQH/A1oB/wNQAf8DUAH/A1gB/wgAA/AB/wMIAf8DAAH/A7YB/wQAA1UB/wMA - Af8DTAH/CAADbQH/A7IB/xQAAdkB6gHZAf8BHQGLAR0B/wEAAXABAAH/AQABcAEAAf8BAAFwAQAB/wEA - AXABAAH/AQABcAEAAf8BAAFwAQAB/wFJAaIBSQH/EAABnAHiAaAB/wG1Ad8BvgH/AdAB2wHZAf8BzgHa - AdgB/wHKAdYB1AH/Ad4B6wHoAf8B8QH+AfwB/wH7Av4B/wErAVgB8wH/AQABHwHGAf8BAAEaAc0B/wG3 - AbkB3QX/A/4B/wGTAeABnAH/AbwB4wG9Af8IAAOVAf8DpAH/A6wB/wOsAf8DogH/A40B/wN0Af8DgAH/ - A28B/wNkAf8DWgH/A1AB/wNQAf8DhQH/CAADhQH/AwAB/wMqAf8EAAPiAf8DAAH/AwAB/wMlAf8D+wH/ - BAAD1gH/A0gB/xQAAVsBrAFbAf8BAAFwAQAB/wEAAXABAAH/AQABcAEAAf8BHQGLAR0B/wEdAYsBHQH/ + Af8DjgH/A4MB/wNsAf8DYgH/A1cB/wNNAf8DTQH/A1UB/wgAA/AB/wMFAf8DAAH/A7YB/wQAA1IB/wMA + Af8DSQH/CAADagH/A7IB/xQAAdkB6gHZAf8BGgGLARoB/wEAAW0BAAH/AQABbQEAAf8BAAFtAQAB/wEA + AW0BAAH/AQABbQEAAf8BAAFtAQAB/wFGAaIBRgH/EAABnAHiAaAB/wG1Ad8BvgH/AdAB2wHZAf8BzgHa + AdgB/wHKAdYB1AH/Ad4B6wHoAf8B8QH+AfwB/wH7Av4B/wEoAVUB8wH/AQABHAHGAf8BAAEXAc0B/wG3 + AbkB3QX/A/4B/wGTAeABnAH/AbwB4wG9Af8IAAOVAf8DpAH/A6wB/wOsAf8DogH/A40B/wNxAf8DgAH/ + A2wB/wNhAf8DVwH/A00B/wNNAf8DhQH/CAADhQH/AwAB/wMnAf8EAAPiAf8DAAH/AwAB/wMiAf8D+wH/ + BAAD1gH/A0UB/xQAAVgBrAFYAf8BAAFtAQAB/wEAAW0BAAH/AQABbQEAAf8BGgGLARoB/wEaAYsBGgH/ AYUBvgGFAf8B2QHqAdkB/xQAAZ8B4wGiAf8BswHeAb0B/wHNAdoB1wH/AcwB2QHXAf8ByQHUAdMB/wHS - Ad4B3QH/AfEB/gH8Af8B+QL+Af8BhAGsAfoB/wEYAUgB4AH/AToBVgHjAf8B+AH7AfoB/wH7Af4B/QH/ - AfoB/gH8Af8BkwHhAZwB/wG7AeQBvAH/CAADsQH/A5wB/wOhAf8DkwH/A4gB/wOYAf8DWwH/A4gB/wNl - Af8DWwH/A1YB/wNQAf8DTgH/CAAD9AH/Aw0B/wMAAf8DqAH/BAADZwH/AwAB/wM9Af8DgQH/A5sB/wgA - AzkB/wPlAf8QAAE0AZcBNAH/AQABcAEAAf8BAAFwAQAB/wGUAcYBlAH/AWwBtQFsAf8BNAGXATQB/wgA + Ad4B3QH/AfEB/gH8Af8B+QL+Af8BhAGsAfoB/wEVAUUB4AH/ATcBUwHjAf8B+AH7AfoB/wH7Af4B/QH/ + AfoB/gH8Af8BkwHhAZwB/wG7AeQBvAH/CAADsQH/A5wB/wOhAf8DkwH/A4gB/wOYAf8DWAH/A4gB/wNi + Af8DWAH/A1MB/wNNAf8DSwH/CAAD9AH/AwoB/wMAAf8DqAH/BAADZAH/AwAB/wM6Af8DgQH/A5sB/wgA + AzYB/wPlAf8QAAExAZcBMQH/AQABbQEAAf8BAAFtAQAB/wGUAcYBlAH/AWkBtQFpAf8BMQGXATEB/wgA AdkB6gHZAf8QAAGfAeMBowH/AcAB7gHKAf8B4wHyAe8B/wHSAeAB3QH/Ac8B3gHbAf8B0wHhAd0B/wHV AeEB3gH/AdQB4AHdAf8B0AHdAdoB/wHRAd4B2wH/Ac4B3AHYAf8BzQHcAdQB/wHLAd8B1QH/AdkB9AHn - Af8BjwHgAZgB/wG8AeQBvQH/DAADygH/A5gB/wOGAf8DjgH/A4EB/wNHAf8DcwH/A2kB/wNdAf8DUwH/ - A1oB/wwAA5AB/wMAAf8DEQH/BAAD6AH/AwIB/wMAAf8DuAH/A+4B/wMkAf8D8wH/BAADiwH/A2wB/xAA - AUkBogFJAf8BAAFwAQAB/wE0AZcBNAH/BAABhQG+AYUB/wE0AZcBNAH/CAABNAGXATQB/wGFAb4BhQH/ + Af8BjwHgAZgB/wG8AeQBvQH/DAADygH/A5gB/wOGAf8DjgH/A4EB/wNEAf8DcAH/A2YB/wNaAf8DUAH/ + A1cB/wwAA5AB/wMAAf8DDgH/BAAD6AH/AwAB/wMAAf8DuAH/A+4B/wMhAf8D8wH/BAADiwH/A2kB/xAA + AUYBogFGAf8BAAFtAQAB/wExAZcBMQH/BAABhQG+AYUB/wExAZcBMQH/CAABMQGXATEB/wGFAb4BhQH/ DAABnQHhAaEB/wG+Ae0ByAH/AeoB/AH4Af8B1wHnAeIB/wHJAdkB0wH/AcgB2AHTAf8ByQHYAdMB/wHT AeIB3QH/AckB2AHUAf8BwAHTAcwB/wHEAdQBzgH/AcIB1AHKAf8B3AH1AekB/wHgAfwB7wH/AYsB3gGX - Af8BugHiAbsB/xgAA5MB/wNiAf8DTgH/A9MB/wPJAf8D2QH/EAADZgH/AwMB/wMAAf8DBQH/A8UB/wMk - Af8DAAH/AwAB/wNBAf8DTAH/AwQB/wMmAf8DxAH/AxcB/wMAAf8DWwH/DAABvwHdAb8B/wEAAXABAAH/ - AR0BiwEdAf8BzAHkAcwB/wGFAb4BhQH/ATQBlwE0Af8EAAGUAcYBlAH/AQABcAEAAf8BhQG+AYUB/wwA + Af8BugHiAbsB/xgAA5MB/wNfAf8DSwH/A9MB/wPJAf8D2QH/EAADYwH/AwAB/wMAAf8DAgH/A8UB/wMh + Af8DAAH/AwAB/wM+Af8DSQH/AwEB/wMjAf8DxAH/AxQB/wMAAf8DWAH/DAABvwHdAb8B/wEAAW0BAAH/ + ARoBiwEaAf8BzAHkAcwB/wGFAb4BhQH/ATEBlwExAf8EAAGUAcYBlAH/AQABbQEAAf8BhQG+AYUB/wwA AaAB4wGjAf8BnQHkAaIB/wG0AesBuwH/AaUB3QGrAf8BnwHWAaQB/wGeAdUBogH/AaIB2wGnAf8BowHa - AagB/wGgAdoBpQH/AZsB1wGiAf8BnAHaAaEB/wGcAdoBoQH/AaIB5AGpAf8BnQHjAaQB/wFsAdcBdAH/ - AbcB4QG4Af8IAAPAAf8DjgH/A6IB/wOQAf8DkAH/A9EB/wPZAf9sAAGxAdUBsQH/ATQBlwE0Af8BHQGL - AR0B/wEdAYsBHQH/AR0BiwEdAf8BHQGLAR0B/wEdAYsBHQH/AUkBogFJAf8BvwHdAb8B/wwAAcgB6wHI + AagB/wGgAdoBpQH/AZsB1wGiAf8BnAHaAaEB/wGcAdoBoQH/AaIB5AGpAf8BnQHjAaQB/wFpAdcBcQH/ + AbcB4QG4Af8IAAPAAf8DjgH/A6IB/wOQAf8DkAH/A9EB/wPZAf9sAAGxAdUBsQH/ATEBlwExAf8BGgGL + ARoB/wEaAYsBGgH/ARoBiwEaAf8BGgGLARoB/wEaAYsBGgH/AUYBogFGAf8BvwHdAb8B/wwAAcgB6wHI Af8BtAHmAbMB/wG1AeYBtAH/AbYB5wG2Af8BtQHnAbYB/wG1AeYBtAH/AbcB5wG4Af8BtwHmAbUB/wG1 AeUBtAH/AbYB5QG1Af8BtwHmAbYB/wG1AeMBtAH/AbIB4wGyAf8BtAHjAbQB/wGyAeEBsQH/AdkB7gHZ - Af8EAANlAf8DYgH/A3QB/wNxAf8DjgH/DAAD2QH/cAAB5gHxAeYB/wFsAbUBbAH/ATQBlwE0Af8B2QHq - AdkB/2AAA+UB/wPqAf8UAAPwAf90AAGFAb4BhQH/ATQBlwE0Af9wAAMgAS4DTgGZA1MBqgM8AWgDGAEh - IAADGAEhA1QBqwNFAX8YAAM5AV8DVgG2AykBPxQAAY8BygHkAf8BZwG5AdkB/wFhAbYB2AH/AWkBuQHZ - Af8BlgHNAeUB/wGYAdAB6AH/AWkBugHZAf8BYQG2AdgB/wFnAbkB2QH/AY0BxwHgAf8MAALsAfMB/0gA - AycBOgNVAbEBNQFIAWIB9gGWAa8B1QH/AZgBpQHMAf8BSQFQAYwB/QFIAUoBVAHuA1cBwgNEAXoDIQEx - AwEBAhAAA0ABcQErAW0B4wH/ARsBQAGWAf0DVAGuAxABFgwAA0wBkwEnAV8BmgH7ASIBTgGpAf8DPAFn - EAABxwHqAfoB/wE0AbUB6QH/ATIBtgHsAf8BMgG2AewB/wEyAbYB7AH/AS8BrQHhAf8BLgGrAd4B/wEy - AbYB7AH/ATIBtgHsAf8BMgG2AewB/wEzAbMB5wH/AcUB6QH4Af8IAALpAfMB/wKNAccB/zwAAxEBFwNV - AbQBKAFVAVwB+AEAAXUBLAH/AV0BrQFzAf8B8wf/AfwD/wHVAdsB8gH/AZoBqQHPAf8BVwFjAYQB/gE+ - AUABVQH0AlcBWwHQAy8BSgwAAiEBIgExAVQBdgHEAfsBjQHvAv8BHQFbAb8B/wJXAVsB2gMnAToDFgEf - A1kBzAE7AZAB1gH/AZQB8AL/AUYBTAFwAfMDFgEfFAABEAEhASkB/wESAUkBYQH/ASsBbQGSAf8BMAFk - AYMB/wEeASoBMAH/AR4BKgEvAf8BMAFkAYMB/wEpAWsBkAH/ARIBSQFhAf8BDgEgAScB/xAAAtMB7AH/ - AlcByAH/AtQB/gH/NAADPwFtAXwBkQHJAf4BRwHVAYkB/wEAAakBDAH/AVABmwFhAf8B1QH0Av8B8gH9 - Af4B/wHdAfMB+QH/AesD/wHvA/8B0QH7Av8BogHiAfsB/wE+AWQBtwH/A0wBkxAAAVkBWgFfAdMBjwHp - Af4B/wGIAfEC/wEwAZEB3wH/ATcBQAFZAfIBPQFMAW4B8QFHAbUB8wH/AZcB/QL/AW0BvQHuAf8DWQHD - EAADcgH/A4IB/wMAAf8DhwH/A/4R/wP9Af8DcgH/AwAB/wNtAf8DggH/CAAC+AH+Af8CMgHXAf8CTgHY - Af8CmgL/AuUC/ywAA0ABcQF/AaUB0gH+AUcB0AGGAf8BAAGfASEB/wFHAY8BaAH/AcsB7wL/AdsB8QH4 - Af8BoQGgAYwB/wHAAdIBxgH/AcgB9gL/AZgBzQH0Af8BiQHSAf4B/wFCAYIBygH/A0wBkxAAAksBTAGP - AVABswHxAf8BZQHiAv8BYwHiAv8BOgG0AfgB/wFFAcUB/AH/AWYB4QL/AWQB4wL/AUIBfwG0Af4DQQFz - EwAB/wMAAf8DCgH/A/wZ/wP3Af8DAQH/AwAB/wMAAf8MAAKPAfoB/wJXAeMB/wJPAdoB/wKCAv8CwQL/ - KAADQAFwAXsBlwHNAf4BPgHLAYoB/wEAAbEBDQH/ATgBkQFLAf8BvwHkAv8B0wHuAfkB/wHMAbIBiwH/ - AcwBywGpAf8BmgHdAv8BmwGqAa4B/wGuAboBtAH/ASIBZAHJAf8DTAGTEAADIwEzAUEBagGwAfkBOAHY - Av8BMgHKAv8BOQHVAv8BNwHRAv8BMAHLAv8BPgHRAf4B/wFHAU0BaQHyAxIBGRAAAxcB/wMAAf8DLiH/ - Ax8B/wMAAf8DLwH/DAACzgH8Af8CVgH0Af8CXAHmAf8CSAHUAf8CgAL/AqcC/yQAA0ACcAGTAdEB/gFB - AbwBgAH/ARIBkAEYAf8BUwGZAZIB/wGvAeIC/wHWAfEB+gH/AcEBjgFIAf8BuwGwAYsB/wGAAdMC/wGl - AZ4BgwH/AcoBpQFOAf8BFgFeAccB/wNNAZYQAANAAXEBIwFfAakB+wESAdEC/wEIAcQC/wEKAcQC/wEK - AcQC/wEFAccC/wEcAccB/QH/ASIBPAFtAfoDSAGEAwEBAgwAA1UB/wMAAf8DLSH/Ax4B/wMAAf8DbgH/ - EAAChQHzAf8CgAL/AmUB7gH/AkIB0AH/AncB/gH/ApYC/wLuAv8cAAM8AWcBYAGOAdUB/gFuAcYB6wH/ - AW8BvAHmAf8BgwHIAfwB/wGUAdYC/wGLAdkB/AH/AVQBpgHQAf8BTQGmAeAB/wFOAbkC/wFQAY4BwAH/ - AVwBiAGhAf8BEQFbAcUB/wNOAZQDAQECCAACUAFSAaQBJAFkAbkB/QEkAdAB+QH/ASUB1AL/AScB0QL/ - ASgB0QL/ASgB0QL/AScB0QL/ASUB1wL/ASIBwAHuAf8BEwFLAX8B/gNWAbsDFAEbCAADtAH/AwAB/wMN - Hf8D+wH/AwIB/wMAAf8DzQH/FAACmQL/AoAC/wJsAfUB/wJCAdIB/wJ2Af0B/wKKAv8C4QL/FAADMgFQ - A1cBvwFOAZYB2gH/AWgBxAL/AWYBvQL/AXIByQL/AVwBnwH4Af8BHgE8AdwB/wEkAVMB5AH/ARkBUQHj - Af8BFwFWAeMB/wERAWEB8gH/AQYBZgH8Af8BCAFGAcgB/wI/AU4B7wNUAa8CIQEiATEBVgFXAV4B2QE0 - AakB6gH/AV8B9gL/AWwB6wL/AW4B5gL/AWwB5QL/AWkB5AL/AWkB5AL/AW0B5QL/AW0B5wL/AWkB8AL/ - AVYB7AL/ASQBgwG1Af8CUQFYAeMDNQFXCAADHgH/AwAB/wPNGf8DvwH/AwAB/wM1Af8cAAKUAv8CgAL/ - AnEB+QH/AkQB1wH/AnQB/AH/AoQC/wLXAv8QAAJKAWcB6wIAAaEB/wE9AYYB6AH/AVcBuwL/AVoBtwL/ - AV8BuwH+Af8BMgFLAe0B/wEXARkB1gH/ARwBIQHTAf8BGwEfAdIB/wEbAR8B0gH/ASEBJwHVAf8BJQEu - AdkB/wElATIB2QH/ASgBLQHOAf8CVgFbAdwBTwFVAXkB7AFhAdsC/wGKA/8BmQH1Av8BlgHzAf4B/wGT - AfUC/wGZAfIC/wGnAfAC/wGkAe8C/wGUAfIC/wGVAfQC/wGXAfIB/gH/AZcB+AL/AYMD/wFRAbIB3QH/ - AVABUQFYAecIAAO6Af8DAAH/A0EB/wH7AvwB/wHPAe0B+gH/AaQB3QH2Af8BqAHfAfcB/wHbAfIB+wH/ - A/kB/wM1Af8DBAH/A84B/yAAApUC/wKAAv8CdQH8Af8CSAHbAf8CcwH7Af8CggL/AtYC/wwAA04BlAEJ - AQMBvQH/ASYBXQHoAf8BSwG4Av8BTgG2Av8BPgGAAfYB/wEeAScB4gH/AR4BMQHdAf8BHQEvAd4B/wEd - ATAB3wH/ARsBLgHeAf8BGwEsAd4B/wEaASsB3gH/ARwBKgHnAf8BJQEmAYQB+QMrAUMBWAFZAVwBxwFY - AWEBeAHmAlsBcQHhAVoBWwFuAeECVwFpAd8BSwFZAY4B8gGTAdsB9AH/AdIB/QL/AckB/gL/AWsBsgHa - Af8BTQFUAXMB7gFaAV0BawHgAVoBWwFpAeEBWAFdAWgB4gFZAV4BcwHlA1EBogwAA3YB/wMAAf8BMgGL - Aa8B/wEoAaUB2AH/ASYBoQHTAf8BJgGiAdQB/wEqAagB2wH/ATABbgGRAf8DAAH/A7kB/ygAApoC/wKA - Av8CdwH+Af8CTQHhAf8CcgH7Af8ChwL/AuUC/wgAAwQBBgJWAWEB3AEOARsBuQH/ATUBmQH1Af8BPAGj - Av8BJgE5AeIB/wEfASwB2AH/AR8BLwHaAf8BHgEuAdsB/wEdASwB2gH/AR0BLAHbAf8BHAEsAdkB/wEe - AS4B5AH/ARUBHgG8Af8DTgGZGAACMAExAU0BcAGKAc0B/gHvA/8B2gH8Av8BRQFOAX4B+gMkATUgAAPO - Af8DAAH/ASYBcQGZAf8BKgGRAbsB/wEzAbQB6QH/ATEBrgHhAf8BMwGaAcMB/wEWAVABaQH/AwAB/wPz - Af8sAAKpAv8CgAL/AoAC/wJUAeUB/wKFAfoB/wKuAv8C+AL/CAADLQFGASEBGwGBAfsBEAE9Ab0B/wEr - AWIB8AH/ASQBKQHWAf8BIgEuAdMB/wEiAS4B1QH/ASABLgHZAf8BIAErAdQB/wEfASsB1AH/AR8BLAHY - Af8BHwEpAdwB/wFUAVYBXwHgAwcBChgAAwoBDgFVAVwBeQHqAfQD/wHOAeUB/AH/AlcBXAHcAwQBBicA - Af8DOQH/Ay8B/wNRAf8CWQFaAf8DUQH/Aw4B/wMoAf80AALGAv8ChQL/AoAC/wJcAesB/wKDAfoB/wK+ - Av8MAAJSAVQBpgIUAaAB/wEvATwB5gH/AScBNwHkAf8BJAEzAeAB/wEkATYB6AH/ASEBNAHoAf8BIQEw - AeEB/wEfATAB4wH/ASEBMgHsAf8BHQEhAXwB/AMtAUUgAAJVAVYBtAHcAeoB/AH/AakBuwHiAf8DUAGd - KAADMgH/AwEB/wOkAf8DGgH/AzUB/wOSAf8DAAH/A5AB/zgAAu8C/wKsAv8CgQL/Am4B9wH/ApEC/wLk - Av8IAAMMARACVAFnAeUBKQEtAZ8B/gElASsBkAH8ASQBKwGMAfwBIQEjAZQB+wEhASMBlAH7ASIBKAGK - AfoCIQGUAfsBIQEjAYcB+gNOAZckAAM6AWIBrAGyAe4B/wF1AXsBoQH+Ay8BSigAA8sB/wMFAf8DAAH/ - AwAB/wMAAf8DAAH/AzMB/wP5Af9AAALqAv8CsAL/AoQC/wKiAv9YAAMMARACWgFtAeECWgFeAc4DBAEG - LAAD2wH/A2AB/wMcAf8DKgH/A4IB/wP1Af9MAAL1Av8C1gL/DAADFAEbA1EBoQNMAZMDJAE1AwMBBGgA - AxABFgFXAVkBWwHQA1gBxgMJAQwEAAMZASMDKAE8Ay0BRgMtAUYDKQE+Ax8BLAMGAQg0AAMPARQDUQGi - A1YBvgMxAU8QAANZAckBRQGtAT8B/wFBAYQBOQH/ATUBSgE3AfUBWQFaAVkBzgNFAX0DHwEsGAABZQFY - AVQB3QGiAVwBIQH7AaIBTQEfAfoBowFNAR8B+gGjAU0BHgH6AaMBTQEdAfoBowFNAR0B+gGjAU0BHAH6 - AaMBTQEaAfoBpAFNARgB+gGkAU0BGAH6AaQBTQEYAfoBpAFNARgB+gGkAUwBGAH6AaIBSAEQAfsBaQFb - AVIB4QQAAxIBGQFYAVkBXAHUAQIBpAHiAf8BDwFbAZgB/wNZAcMDVwHCAWcBSQFDAfEBewE+ATIB+AGB - AU0BJwH6AYABTQEoAfoBegE+ATIB+AFfAUEBOQHzAVgCVQHZAzwBZzAAA1YBuQERAUQBlgH/ARUBQgGS - Af8BQQFFAVEB8QM2AVkIAANKAYwBKgGQAUoB/wFfAbEBpwH/Ad8B8wHPAf8BtQHhAakB/wFkAasBWAH/ - ATABdQEyAf4BQAFTAUMB8QNXAb8DLwFKEAABjgFfAUMB8wHuAaMBYwH/AewBsAGHAf8B7AGtAYEB/wHr - AaoBdgH/AeoBqQFzAf8B6gGnAXEB/wHqAaQBbgH/AekBogFrAf8B6QGgAWgB/wHpAZ4BZAH/AegBnAFh - Af8B5wGaAV8B/wHkAZsBYwH/Ae0BiwE/Af8BkQFMATIB8wQAAisBLAFDAQgBXAGuAf0BAAH3Av8BFwHB - AeoB/wFvATwBQgH/AfIBkQE7Av8BtQFcAv8BvgFkAf8B7QGtAWwB/wH0AbQBZQL/Ab0BYwL/AbMBWwH/ - AegBiAFAAf8BaQEpASMB+QM5AV8oAAM/AW0BNgFSAaEB/QFGAZgB3wH/AQ0BZQHeAf8BDQFOAb4B/wNW - Ab4EAAMzAVIBLQF4AUIB+gGLAXEBuwH/Ae0BywH7Av8B+wHtAv8B+QH2Af8B+AH3AecB/wHaAeIBsgH/ - AZ4BxgFtAf8BRwGcAT8B/wE/AUsBPwHvAykBPgwAAYYBWAFFAfEB7AHEAawN/wH2AfkC/wH3AfsC/wH9 - A/8B+wH+Av8B9wH6Av8B9AH2Af0B/wHwAfIB+QH/Ae8B7QH1Af8B5gHuAf0B/wHmAbwBqAH/AYsBUwE8 - AfEEAAMBAQIBSAFUAWgB6QEAAdsB/gH/ARgBxAHnAf8BngGFAXIC/wHMAXAC/wHNAYMB/wHbAbABlgH/ - ASMBIAHWAf8BQwE1AasB/wHzAcIBhgL/AcgBhgL/AdIBhAH/Ad0BdgFBAf8DVgG7JAADDQESAVMBVwFl - AeUBVAGiAeMB/wG2Ad8B/QH/Ab4B3wL/AUsBcwGqAf4DRQF/Aw8BFAFWAWEBUgHmATAByQFhAf8BsQHp - AecC/wHvAeQB/wHxAeUB2AH/AfMB4wHUAf8B9gHhAc0C/wHjAcgB/wH7AdEBrQH/AdEBvAGBAf8BWQGT - AUIB/wNYAcsDBAEGCAABhgFYAUUB8QH1Ac0BsgH/AccByAHMAf8BhgGAAYEB/wG7ArcF/wHfAt0B/wGS - AowB/wGPAYcBiAH/AZEBiQGKAf8BjwKIAf8BjgGGAYcB/wGGAnYB/wKvAbYB/wHvAcIBpgH/AYYBUwE8 - AfEEAAM2AVkBEAFfAZYB+wEAAeMC/wEXAb8B4gH/AZUBhAGGAv8B1AGXAv8B2QGiAf8B2AG8AbAB/wEk - ASgB6AH/ATsBNwHUAf8B8AHSAagB/wH4AckBigL/AcUBhgH/AfEBpwFqAf8BWwFaAVkByCQAA0YBgQEx - AW4BvQH/AZcB0AH9Af8B3QH8Av8BtAG+Ac8B/wNUAasEAANYAcYBVgGeAV8B/wHQAdoBqgH/Af0B8QHh - Af8B8QHkAdYB/wHwAeQB1QH/AfEB4AHMAf8B9AHXAbgB/wHyAc8BqQH/AdUBswGKAf8B9wHHAZwB/wHJ - AdUBmwH/ATYBagErAf4DSgGLCAABhgFYAUcB8QHyAcoBrwH/AeYB6QHsAf8ByQHIAckB/wHgAt8B/wP+ - Af8B7wLtAf8BzgLMAf8BzALJAf8BzALHAf8BygLFAf8ByQLDAf8BxAK9Af8B0gHTAdoB/wHuAb8BowH/ - AYYBUwE8AfEEAAM0AVQBCAFeAakB/QEAAeUC/wEWAb8B4QH/AZMBhAGPAv8B4QG1Av8B6gHHAf8B5gHW - AcwB/wJDAeAB/wFmAV4B1QH/AfwB7AHFAf8B3gHUAZ8B/wH9AdUBpQH/Ae8BqAGCAf8DVgG2IAADEgEZ - AU0BVgFkAewBcgG+AfcB/wHHAfMC/wGVAbkB2AH/A1YBuwgAAVYBZQFWAeUBTAGDAZwB/wHwAesB+wL/ - Af4B+wH/AfsB7AHkAf8B8wHkAdQB/wHyAdsBwgH/AfcB2AG3Af8B3AHAAZ0B/wHkAb0BkQH/AfoBzgGh - Af8B/gHoAcwB/wGZAcwBiwH/ATkBRAExAfQDLQFFBAABhQFXAUcB8QHvAcgBrQ3/AfwC+h3/AfgB+QL/ - AesBvgGiAf8BhgFTATwB8QQAAy0BRQEIAVsBkgH8AQAB4QL/ARYBwAHhAf8BmAGPAaIC/wHpAcwC/wH7 - AewB/wLyAe0B/wFJAUcB2QH/AWwBaAHVA/8B8AL/AfcB7QL/AesB0wH/AcMBfwFtAf4DPAFoIAADVgG+ - AUoBmAHbAf8BrQHnAv8BagGoAdcB/wNZAcMDAQECCAADEAEWATwBPQE8AWgBWQFfAVkBzwGBAZ8BggH7 - AdEB6QHRAf8B9gH0AeYC/wHpAdIB/wHiAccBqwH/AdsBvQGZAf8B9wHRAaYB/wHzAdIBrQH/Af0B4AHJ - Af8B8wH6AecB/wFfAakBWgH/AVcBWQFXAdMDDwEUAYMBWAFJAfEB9AHOAbQB/wLTAdYB/wGgApwB/wHJ - AscB/wP+Af8B6ALlAf8BqgKlAf8BqAKhAf8BqAKiAf8BpwKgAf8BpQKfAf8BnwKWAf8BwQHDAckB/wH0 - AcgBrAH/AYYBUwE9AfEEAANRAaABAAGTAdMB/wEAAesC/wEWAb0B4AH/AY0BYAFyAv8B3wHKAv8B8QHe - Af8B4QHNAbwB/wEpAS0BuwH/AUwBSQGwAf8B+gHYAa8C/wHqAdkC/wHVAckB/wFdAlkB0gMGAQgEAAMU - ARsDLgFIAwkBDAwAA04BmAEqAW8BqQH+AZsB4QL/AXQBtQHjAf8DWQHMAwYBCBgAAxgBIQNLAY4BXgFf - AVoB2AF+AZ4BcgH6AdgBygGoAf8B+AHUAbEB/wHyAdMBsQH/AfMB3AHCAf8B8QHeAcgC/wH0Ae8B/wHX - AfQB2AH/ATcBeAExAf4DTgGXAYMBVwFMAfEB8wHOAbQB/wHeAeEB5QH/AbgBtgG3Af8B2ALWBf8B7gLt - Af8BwAK+Af8BvgK7Af8BvwK8Af8BvgK5Af8BvQK5Af8BtwKyAf8BzwHTAdkB/wHzAckBrQH/AYUBUwE9 - AfEDEgEZAUIBTgFlAe0BAAHJAf0B/wEAAeIB/QH/AR0ByQHqAf8BOwEnAUEB+QGmAU8BPAH8AbMCogH/ - AVwBnQHAAf8BQwGWAcYB/wE1AYwBvgH/AVMBiAGfAf8BwwGOAXUB/wFuAV0BWAHlAxsBJgQAAyABLgNY - AeMCQAE/AfwDTwGcCAADTgGXASQBZgGgAf4BdgHNAv8BnwHbAf4B/wFIAU8BYgHvAx0BKigAASsBLAEr - AUMBagF8AWMB8AH+AfAB2AH/AfUB2wHEAf8B8gHhAdAB/wHzAeYB2AL/AfAB7QH/Aa0B2gGtAf8BLQGk - ATIB/wNRAacBggFWAU0B8QHwAcwBsw7/Av4h/wHwAccBrAH/AYMBUwE9AfEDUgGoAQABZAHCAf8BAAHi - Av8BAAHZAfUB/wEhAd0B9wH/ASEBlwHHAf8BNQFIAXcB/gFjAZ4BxwH/AYgB1wH9Af8BjQHUAfUB/wF2 - AcsB7gH/AUsBsQHiAf8BLQFnAZ8B/wNSAagIAANZAdcB1gHPAc0B/wG4AbQBsgH/Az4B+AM6AWEDTgGX - AR8BZwGlAf4BYgHCAv8BqAHmAv8BTQF8AZ0B/gNCAXYwAAM6AWIBpAG9AZoB/AH/AfgB8AH/AfIB4wHU - Av8B7wHrAf8BywHiAccB/wE4AboBSAH/AVMBWAFTAeMDFQEdAYABVgFPAfEB9AHQAbgB/wLdAd4B/wG2 - ArIB/wHWAtMF/wHuAu0B/wG+ArsB/wG9ArkB/wG/AroB/wG+ArkB/wG9ArgB/wG5ArIB/wHUAdYB2gH/ - AfYBzAGwAf8BgwFTAT0B8QFMAVQBZAHkAQABvQL/AQAB5QL/AQAB6wH4Af8BNAH7Af0B/wGGA/8BUgGb - AcwB/wGEAbkB4gH/AaUB4wL/AZwB2gH+Af8BlgHXAfoB/wGOAdIB8wH/AVQBtwHpAf8BSgFVAWAB6wMU - ARsEAAFmAmQB7AHXAdIB0wH/AcsByQHKAf8BjgGPAY4B/wFEAUEBOAH7AW4BbwF1Af4BSwGVAckB/wGA - AdMC/wFuAbIB4AH/A1kBxDgAAVUBVgFVAbEB5AH0AeUC/wH0AfEB/wHpAegB2wH/AV4B1gFyAf8BOwF3 - AT8B+QMwAU0EAAGAAVYBUQHxAfYB0wG8Af8B0wHXAdsB/wGgAZ8BoAH/A8kF/wPqAf8BqwKqAf8BqQGn - AagB/wGrAakBqgH/AaoCqQH/AasCqAH/AaMBoQGiAf8ByQHPAdUB/wH5AdEBtAH/AYMBUwFAAfEBMgFM - AYAB8wEAAcUC/wEAAeIC/wEAAf0C/wE0A/8BlAP/AW4BsAHQAf8BhQGmAc4B/wHCAe0C/wG3AeUC/wGm - Ad4C/wGYAdgB+gH/AYUB0wH9Af8BMwFaAXUB9gMdASoEAAMnAToDWAHLA4gB/QKsAasB/wGqAakBpwH/ - Ab4BtwGxAf8BtgGwAaoB/wFqAZ0BvQH/AU0BVAFeAeoDGAEhOAADDwEUAWQBdAFkAecB8wH6AfUB/wGQ - AeUBnwH/ATgBtAFGAf8DSAGHCAABgAFVAVMB8QHtAccBrgH/AfgB8QHuAf8B+AHwAe0B/wH3AfEB7gH/ - AfcB8gHvAf8B+AHxAe8B/wH4AfEB7gH/AfgB8QHuAf8B+AHxAe8B/wH4AfEB7wH/AfgB8QHvAf8B9wHx - Ae8B/wH3AfMB8QH/AfEBxgGqAf8BggFSAUAB8QEQAVEBlwH7AQABxwL/AQAB4gL/AQcB+wL/ATUD/wGP - A/8BbgGzAdQB/wGeAbEB0AH/AecB+wL/AdYB7wL/AboB5AL/AaIB4AL/AYwB2QL/AVYBWwFhAeEDBgEI - DAADUwGtAaQBowGgAf8BzAHKAccB/wHFAcEBvwH/Ac0BxgHDAf8BcgFqAWgB/wNQAaMIAAMDAQQDDwEU - AwkBDCwAAzUBVwFtAb0BiAH9AVsB5gGCAf8DWAHGDAABgAFhAVMB8QHsAZ0BWAH/AeQBjQFKAf8B5AGP - AU0B/wHkAY0BSwH/AeQBjAFKAf8B5AGMAUkB/wHkAYwBSAH/AeQBiwFHAf8B5AGKAUYB/wHkAYkBRAH/ - AeQBiQFDAf8B5AGIAUMB/wHjAYgBRAH/AewBiwE5Af8BgwFTAUMB8QFCAVIBcgHtAQABygL/AQABxQHw - Af8BIgFLAWUB+wEwAYkBrwH+AXcD/wFFAYYBtwH/AaABsQHOBf8B8QP/AcwB9AL/Aa4B7gL/AVsBiQG0 - Af4DQAFwEAADHQEqA2QB8QHRAc8BzQH/AeYB4wHhAf8BswGxAbAB/wFnAWYBZAH/AkUBRAH5A1QB5ANa - AdsDVwHoA1gB5QMuAUgwAAFSAVMBUgGoAVcBXQFXAd8DGAEhDAABhAFkAV8B8wH/AeEBoQL/AccBggL/ - AcQBdgL/AcEBcAL/Ab4BagL/AboBZAL/AbYBXgL/AbIBWAL/Aa4BUQL/AaoBSgL/AaYBRQL/AaMBPwL/ - AZ4BNwL/AakBPQH/AYQBWQFHAfICWQFcAckBAAHBAf0B/wEAAc8B9gH/AQgBPQFYAf0BDAGJAbUB/wFl - A/8BPQFHAWoB+QNWAcEBiAGQAagB+QG9AdUB4QH/AZ8ByQHdAf8BTgFwAYUB9gNLAY8YAAMtAUYDXAHn - AcIBwAG9Af8B1gHTAdEB/wGsAqkB/wGoAacBpgH/Aa8BrQGsAf8BuwG5AbgB/wKKAYkB/gNWAbgDCQEM - SAABXgJZAdcBkQFcAVMB+wGDAU4BTQH6AYMCTQH6AYMCTQH6AYMBTQFKAfoBgwFNAUcB+gGDAU0BQwH6 - AYMBTQE/AfoBgwFNATwB+gGDAU0BMQH6AYMBTQEuAfoBgwFMASsB+gGDAUsBKQH6AZEBRAElAfsBYAFV - AVQB3gJGAUcBgQEZAU0BlQH6ARkBaAGeAfoBHQFlAZAB+QEkAV0BlQH4ATcBZAGLAfcDVAGvBAADKQE/ - AkgBSQGHAkUBRgF/ASECIgExIAADEgEZA04BmANlAeUBigKJAfkBiAGEAYMB/AF3AnUB9gNeAdkDQAFx - EAADOgFhA1gBxwNZAcwDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBzgNZ - AcMDNAFVRAADVwHCA0QBezgAA2MB4gOCAfEDeQHuA3kB7gN5Ae4DdwHuA3YB7gN2Ae4DdgHuA3YB7gN2 - Ae4DdgHuA3kB8ANlAeUEAANlAe4D4gH/A90B/wPaAf8C2wHaAf8D2QH/A9gB/wPYAf8D1wH/A9YB/wPV - Af8D1AH/A9MB/wPgAf8DmQH/A1cBvQwAA0gBhgFQAVUBMgH6A0MBdywAAVgCWQHUAQ4BKgE/Af8DSQGJ - AxMBGjAAAaICowX/AfYC8AH/AfYC7wH/AfYC7wH/AfQC7wH/AfQC7QH/AfQC7QH/AfQC7QH/AfIC6wH/ - AfMC6wH/AfIC6AL/AvsB/wGiAqEB/wQAA40B9wT/AvQB8wH/Af0B+AH1Av8B9gHzAf8B/QH0AfEB/wH8 - AfMB8AH/AfsB8AHtAf8B+QHwAe0B/wH4Ae8B7AH/AfcB7QHqAf8B8gHtAeoB/wHnAeYB5wH/A/UB/wPG - Af8DWQHDCAADDgETAl8BWgHgATcBxAFSAf8BSAFqAUEB+QM4AV4oAAMpAT8BOwFSAWkB9wFoAZoBrgH/ - AVkCWwHQA0IBdQMGAQgoAAOfAf0B+gLzAf8B6gLiAf8B6QLhAf8B6QLhAf8B6ALfAf8B5wLeAf8B5gLe - Af8B5gLdAf8B5ALbAf8B5ALaAf8B4gLXAf8B9QLrAf8BngKcAf0EAAOFAfYB/AL7Af8B7gHsAeoB/wG7 - AcwB2gH/AZMBswHLAf8BmAG1AcsB/wGWAbUBywH/AZUBtAHKAf8BlQGzAckB/wGUAbMByQH/AY4BrgHH - Af8BqQG6AcgB/wHeAtwB/wHuAu0B/wO9Af8DVgHBCAADQAFxAUIBmgE9Af8BUAHpAZIB/wFEAdIBbAH/ - AUwBagFEAfMDLgFHKAADUQGiAXUBxAHfAf8BmwHkAfIB/wEpAYoBrQH/A0wBkQMCAQMkAAGfAp4C/QL2 - Af8B9QLtAf8B8wLsAf8B8wLsAf8B8gLqAf8B8QLpAf8B8QLpAf8B8ALoAf8B7wLmAf8B7wLlAf8B7QLj - Af8B+ALuAf8DnAH9BAADhQH2Av8B/gH/Ae0B5AHnAf8BUAGzAdgB/wEIAcsB6wH/ARYB0AHtAf8BGQHR - Ae4B/wEZAdQB8QH/ARoB0gHuAf8BHAHSAe4B/wETAc8B7gH/AT0BpAHMAf8B1QHPAdMB/wH2AfIB8AH/ - A8AB/wNWAcEEAAMFAQcBVgFYAVYBvAFTAc8BcgH/AXQB6AGrAf8BZQHoAaMB/wFJAc4BbAH/AVgBZgFR - AesDJAE1JAADMQFOARUBdQGlAf8BlwHmAfkB/wGGAegB9QH/AT8BYwGPAf0DIgEyJAADoAH9AfsC9wH/ - Ad4C2gH/Ad4C2QH/Ad8C2gH/Ad4C2QH/Ad0C2QH/Ad0C2QH/Ad0C2AH/AdwC1gH/AdsC1gH/AdoC1AH/ - AfgC8QH/AZ4CnQH9BAABhwKIAfYE/wHqAeQB5gH/AVUBuwHhAf8BKAHcAv8BLQHdAv8BFQHTAf0B/wEQ - AdAB9wH/ARMB1AH8Af8BEwHdAv8BDAHdAv8BOwGuAdgB/wHVAc8B0wH/AfcB8wHxAf8DwQH/A1YBwQQA - Ay4BSAFDAYUBPAH+AYkB7gG1Af8BlgHzAcUB/wGKAesBuAH/AXEB7AGvAf8BSAHMAWoB/wFXAV4BVAHf - AxoBJCAAAwgBCwNTAa0BJgGhAcwB/wGdAdMB3QH/AaoB4gHwAf8DVAGrJAADqAH9AdIC0QH/ASYCJQH/ - AhoBGQH/AR4BHQEcAf8BGgEZARoB/wEdAhwB/wEfAhwB/wMfAf8BHQIeAf8BFgEZARoB/wMiAf8BywLK - Af8DqAH9BAADiQH2BP8B6QHnAekB/wFkAbcB4QH/AWMB0AH+Af8BYwHVAv8BQgGpAdwB/wFHAWUBhwH/ - ARoBnwHaAf8BAAHBAv8BAAG8Av8BOAGlAdcB/wHYAdQB1gH/AfgB9AHyAf8CwgHDAf8DVgHBAwIBAwNQ - AZoBZAHOAYIB/wGhAfoB0QH/AVQBzQFuAf8BcAHmAaUB/wGVAfMByAH/AXQB8gG4Af8BRwHIAWUB/wFb - AV4BWQHQAxQBHCAAAxIBGANWAbMBaAHGAeEB/wHwA/8BjgGaAaIB/wMzAVIDDwEUHAADqAH9AcYCyAH/ - AQICBAH/AwAB/wMAAf8CBgEAAf8DAAH/AwAB/wMAAf8DAAH/AQUCAAH/AwAB/wG8Ar0B/wOoAf0EAAOJ - AfYE/wHpAegB6wH/AWcBuQHhAf8BcQHVAf4B/wFzAd0C/wFpAawBygH/AWMBUAFMAf8BOgGdAckB/wEA - AbgC/wEAAa8C/wE5AaIB1wH/AdoB1QHWAf8B+gH2AfQB/wHEAsUB/wNWAcEDHAEnAU4BhQE8AfcBmAH8 - AckB/wFeAbgBcwH+AVQBYQFQAeQBQgF8AUIB9QFkAeMBmAH/AZEB+QHMAf8BdAH3AcEB/wFDAcMBXAH/ - AVUBVwFVAbcDCgENIAADCgEOA08BpQGNAb4BzwH/AZgBxwHgAf8BNwFoAYMB9QFYAVwBXwHRAxoBJRgA - A6gB/QHKAc8B0AH/AQ4BFgEXAf8DAAH/ATsBPgE3Af8BvQG2AZYB/wEZASsBJwH/ASIBKAEfAf8BKQEl - ARoB/wIAAQEB/wFlATMBEgH/AQABAQECAf8BwgK/Af8DqAH9BAADiQH2BP8B5gHnAesB/wFtAbsB4gH/ - AZcB5AL/AZYB6AL/AZABxwHdAf8BiwGSAZMB/wFkAbwB3gH/AR8BxQL/ARcBwAL/AT8BpgHYAf8B1wHU - AdcB/wH7AfcB9QH/A8YB/wNWAcEDRwGCAVIB0AFyAf8BVwHVAXcB/wFYAVoBWAHAAwABAQMtAUUBVgFk - AVMB4gFJAcsBZQH/AYEB+QHGAf8BcgH+AcoB/wE8AcABVQH/A1IBqQMEAQUgAAMKAQ4DVwHFAUoBlAG7 - Af8BSAGYAbsB/wEpAS4BMwH/A1ABnwMAAQEUAAOoAf0B0QLMAf8BuAGYAWIB/wFoAWkBUwH/AbYCuAX/ - AVECWwH/AWEBWgE/Af8BZwFmAU4B/wE6AS4BGQH/Ac4BagEpAf8BRgEeAQoB/wHJAb4BvQH/A6gB/QQA - A4sB9gT/AfEB8AHxAf8BgwG5AdoB/wFlAbcB3gH/AWkBuAHeAf8BaQG/AecB/wF3AcsB8wH/AVoBuwHo - Af8BRQGuAeAB/wE7AaoB3AH/AWIBqgHRAf8B4QHfAeAB/wH6AfcB9gH/A8gB/wNWAcEBUQFsAVEB6QE8 - AdABWgH/AVkBWwFZAcQDDQESCAADHAEoAVQBVgFUAasBMgG0AT4B/wFmAfIBswH/AWoB/wHQAf8BNwG7 - AUsB/wNLAY4kAAI+AT8BbAGAAXcBdAH/AZMBIAEWAf8BGwIAAf8BKgEIAQAB/wNAAXAUAAGmAqgB/QHR - AcwBygH/AdcBrwFwAf8B/AHhAa4B/wH2AvcB/wH7Af4C/wHkAdcBxQH/AcsBrwF0Af8BjwFyAVAB/wHM - AZIBRAL/AZEBNgH/AckBRAEMAf8BygG9AbsB/wGlAqgB/QQAA40B9gT/AfsB+gH5Af8B5gHqAe4B/wGf - AacBsQH/AaIBpwGuAf8BnwGnAa8B/wHAAcwB1wH/AbABtQG9Af8BrgGtAbMB/wGfAaEBqAH/Ad4B3wHj - Af8B7gLtAf8D9QH/A8kB/wNWAcEBNQF7ATIB9gFZAV8BWQHPAxQBGxAAAwQBBQE9AT4BPQFqATUBfQEz - AfYBUQHoAZYB/wFhAf8B0gH/ATABuAFBAf8BRQFGAUUBfiAAAwEBAgNHAYIBvgFeAUQB/wFwARcBEwH/ - ARYCAAH/AUcBJAEcAfkBLAIrAUMQAAGnAqgB/QHQAcoByQH/Ac0BoQFiAv8B3AGdAf8B/QHlAcEB/wH2 - AeMBzQH/Af4B4AGuAv8B2gGaAf8B+QHAAW4B/wH8AacBSwL/AYABKwH/AdABQQEHAf8ByQG8AboB/wGk - AqgB/QQAA40B9gT/A/cD/wH+Af8B2wHWAdQB/wG7AbUBsgH/AckBwgHAAf8BuwG1AbIB/wHMAccBxAH/ - AbsBtQGyAf8B0AHLAcgB/wH3AfUB9AH/AuoB6QH/A/YB/wPLAf8DVgHBAxgBIQMRARccAAMkATYBWQFh - AVkB1QE6AdQBZgH/AV0B/AG+Af8BLAG3AT4B/wM8AWYgAAMCAQMDUwGqAcYBbQFTAf8BTAEMAQkB/wEd - AQEBAAH/AV0BWQFWAdcDGAEhDAABpwKoAf0BzwHKAcgB/wHNAZcBUAL/AcsBhQL/Ac4BjgL/Ac8BkAL/ - Ac0BjQL/AcQBdgL/AbYBWwH/AfwBlgE+Af8B+gFnAR8B/wHIATIBAAH/AcgBugG5Af8BpQKoAf0EAAON - AfYE/wP5Af8D+gH/AfkC+gH/A8sB/wG4ArYB/wHBAr8B/wG4ArYB/wPEAf8B8ALxAf8B7gLvAf8D6wH/ - A/kB/wPNAf8DVgHBKAADEAEVAU8BUAFPAZsBJwG+AT8B/wFTAfUBpAH/ATMBqwFAAf0DMQFOIAADEAEW - AVwCWQHMAbkBYAFCAf8BLQECAQAB/wExAQoBAAH/AVECUAGfDAABpwKoAf0BzQHFAcQB/wHQAYIBMQL/ - AbkBVgL/Ab8BZwL/AcEBagL/AbwBYQL/AbABUAL/AZgBOgH/Af0BcAEjAv8BSwEHAf8BzQEdAQAB/wHG - AbYBtQH/AaUCqAH9BAADkAH2BP8D+wH/A/kB/wP6Af8B+gL7Af8D5QH/A9UB/wPhAf8D9AH/A/EB/wPt - Af8D6wH/A/cB/wPPAf8DVwHCMAABOQE6ATkBYAFTAWkBVgHjATwB3QFhAf8BSAF6AUoB7SQAAx0BKgFy - AVgBUgHpAZ8BSwEpAf8BGAIAAf8BTQELAQAB/wM3AVsIAAOoAf0B1ALLAf8BmAFVAS4B/wG0AXQBPQH/ - AbMBgwFGAf8BtAGGAUcB/wGzAYIBRAH/AbMBcAE8Af8BswFiATQB/wGzAVABKAH/AbUBOwEYAf8BlwEn - ARYB/wHLAb8BvgH/AacCqAH9BAADmQH4IP8D/QH/A/wB/wP6Af8D+QX/A9MB/wNXAcI0AAMdASkBVwFa - AVcBxQE/AXoBPwHvKAADKgFAAZABTgFIAfYBgAE4ARsB/wEVAQIBAAH/AWEBSwFIAesIAAGjAqQF/wHb - AdwB4AH/AtgB3gH/AtkB3QH/AdgB2QHdAf8B2AHZAd4B/wHYAdkB3gH/AdgB2gHeAf8B2AHbAd8B/wHX - AdwB4AH/AdkB3AHfAv8C/AH/A6IB/wQAA1sBywOzAf4DuAH9A7gB/QO4Af0DuAH9A7gB/QO4Af0DuAH9 - A7gB/QO4Af0DuAH9A7kB/QO7Af4DdAH1AzsBZWwAAzsBZAGJAUgBNQH2AVkBMAEtAfUBUgJRAacIAANh - Ad0DdgHvAXUCdwHtA3UB7QN1Ae0DdQHtA3UB7QF0AnUB7QN0Ae0DdAHtAXICdAHtAXMCcgHuA3IB7wNf - AeCTAAEBAwQBBQMQARYDKQE/Az4BbANGAYADRAF7AzgBXAMgAS4DCgENAwEBAgwAAVoBXQFfAdMBTAGG - AZoB8wFOAXsBiQHvAU4BegGJAe8BTgF6AYkB7wFOAXoBiQHvAU4BegGJAe8BTgF6AYkB7wFOAXoBiQHv - AU4BegGJAe8BTgF6AYkB7wFOAXoBiQHvAU0BhQGWAfIBWAFeAWMB2QsAAQEDBgEIAwoBDQMKAQ0DCgEN - AwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMHAQoDAwEECwABAQMGAQgDCgENAwoBDQMKAQ0DCgEN - AwoBDQMKAQ0DCgENAwoBDQMHAQoDAwEEEwABAQMHAQkDFQEdAzkBXwNTAbACWAFmAeYBYAGTAZ8B+wFf - AagBuAH9AUwBXQFpAfADWQHSA1IBqQNGAYADJAE2AwQBBggAATYBoAHSAf8BLAH7Av8BIgHxAv8BJQHw - Av8BJgHwAv8BJgHxAv8BJgHxAv8BJgHxAv8BJgHxAv8BJgHwAv8BJgHwAv8BJAHwAv8BKgH7Av8BOgGs - AdgB/wQAAwQBBQMkATYDRAF5A0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNH - AYIDMwFSAwsBDwMEAQUDJAE2A0QBeQNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0UBfwMp - AT8DAwEECAADBAEFAyQBNgNEAXoBWgFcAWEB2gFgAX0BmAH8Aa8B1QHjAf8BxAHyAf0B/wG3AfAC/wGq - Af4C/wGfAf0B/gH/AYgB2gHlAf8BWgGNAakB/gE+AVIBZQH0A1YBuQM1AVcDCwEPBAABMwGDAbkB/AEc - AeIC/wETAdkC/wEVAdgC/wEUAdcC/wEWAd8C/wEXAeUC/wEXAeUC/wEXAeAC/wEVAdkC/wEWAdkC/wET - AdkC/wEaAeMC/wE1AYwBvQH8BAADHQEqAbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+ - AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/ - AbUBPgEAAf8DUgGpAzUBWAMdASoBtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/ - AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/A0sBjgMUARsDAAEB - BAADHQEqAbUBPgEAAf8B8wFWAQAB/wGVAb8B0wH/Ae8D/wHUAfsC/wGpAeYC/wGSAdkC/wGOAesC/wGN - AfMC/wGdAf0C/wGrA/8BbAHEAdcB/wFiASEBAAH/A1MBrQM1AVgEAAE1AYMBuQH8ATYB4AL/ASkB1QL/ - AR0B0wL/ARIB0AL/AQQBngH2Af8BAwGJAeYB/wEEAYoB5QH/AQUBmgHzAf8BDAHJAv8BDQHMAv8BCgHJ - Av8BEAHUAv8BMwGJAb0B/AQAAbUBPgEAAv8BbAEKAf8BtQE+AQAC/wGoAVYC/wGnAVUC/wGmAVMC/wGk - AVAC/wGiAUwC/wGgAUgC/wGdAUMC/wGbAT8C/wGbAT8B/wHlAUUBGwL/AZsBPwH/AbUBPgEAAf8DSAGI - AbUBPgEAAf8BtQE+AQAC/wFyAQ8C/wGvAWIC/wGlAVEC/wGkAU8C/wGjAU0C/wGgAUkC/wGfAUcC/wGd - AUMC/wGbAT8B/wG1AT4BAAH/A1QBrwM2AVkDGwEmBAABtQE+AQAC/wFsAQoB/wH7AXABDwH/AZgBwwHY - Af8B2QP/AasB5gL/AYYB0wL/AWwBygL/AXEB3QL/AW4B4gL/AYEB6AL/AZEB9wL/AWQBwgHbAf8BbQE/ - ARkB/wHpAVIBAAH/A0gBiAQAATUBgQG6AfwBSAHgAv8BOwHWAv8BLAHUAv8BHgHbAv8BAwGAAeMB/wIA - AXAB/wIAAWoB/wEAAWYB3AH/AQIBxwL/AQIBvgL/AQABuwL/AQUBxgL/ATABhwG9AfwEAAG1AT4BAAL/ - AXYBGAH/AbUBPgEAAv8BsgFpAv8BsQFoAv8BsQFnAv8BrwFjAv8BqwFdAv8BqAFXAv8BpwFUAv8BpAFP - Av8BogFLAf8B5QFIASAC/wGiAUsB/wG1AT4BAAH/A0sBkAG1AT4BAAL/AW0BCAH/AbUBPgEAAf8BtQE+ - AQAC/wGvAWIC/wGuAWAC/wGtAV4C/wGqAVkC/wGoAVUC/wGlAVEC/wGjAU0B/wHlAUkBIgH/AbUBPgEA - Af8DTAGRAxQBGwQAAbUBPgEAAv8BdgEYAf8B+wFwAQ8B/wGJAb8B2wH/AbkB8AL/AYwB1gL/AV4BxAL/ - AU8BvAL/AVsBzwL/AVgB0wL/AWMB2gL/AXIB5wL/AVMBuAHdAf8BbQFCAR4B/wHpAVIBAAH/A0sBkAQA - ATUBfwG6AfwBUwHfAv8BSwHYAv8BOgHTAv8BLgHcAv8BDwGvAfMB/wEAAQoBWQH/AQABBQFOAf8BAAGV - AeoB/wEAAbsC/wEAAbAC/wEAAa4C/wEAAbkC/wEuAYQBvQH8BAABtQE+AQAC/wGIASoB/wG1AT4BAAL/ - Ab4BhwL/Ab4BhgL/AbwBgwL/AboBdgL/AbcBcQL/AbMBagL/AbABZAL/Aa0BXwL/AaoBWgH/AeUBTAEn - Av8BqQFXAf8BtQE+AQAB/wNLAZABtQE+AQAC/wGSATIC/wF3ARUB/wG1AT4BAAL/AboBdgL/AbgBcQL/ - AbYBbwL/AbQBawL/AbABZAL/Aa8BYgL/Aa0BXgH/AeUBTgErAf8BtQE+AQAB/wNUAa8DNQFYAwMBBAG1 - AT4BAAL/AYgBKgH/AfsBcAEPAf8BbAG3Ad4B/wGXAd8C/wFhAcUC/wE2AbAC/wE3Aa8C/wFOAcQC/wE6 - AcAC/wFKAcoC/wFaAdcC/wFDAbAB4AH/AW0BRgEkAf8B6QFSAQAB/wNLAZAEAAE3AYEBugH8AWcB4wL/ - AV8B3AL/AU4B2QL/AT0B4AL/AQcBbgG3Af8CAAEXAf8CAAETAf8BAAFbAaoB/wEFAb0C/wEGAbMC/wED - AbAC/wEJAbsC/wEyAYUBvQH8BAABtQE+AQAC/wGVAT4B/wG1AT4BAAL/AcgBmgL/AcgBmAL/AcYBlgL/ - AcQBkAL/AcABiwL/Ab0BhAL/AbkBdQL/AbYBbgL/AbIBaQH/AeUBUAEuAv8BsAFkAf8BtQE+AQAB/wNL - AZABtQE+AQAC/wGfAUcC/wGfAUcC/wFuAQkB/wG1AT4BAAL/AcMBjgL/AcABiQL/Ab4BhAL/AboBdgL/ - AbgBcQL/AbUBbQH/AeUBUAEuAv8BsAFkAf8BtQE+AQAB/wNMAZEDEwEaAbUBPgEAAv8BlQE+Af8B/AFx - AQ8B/wFVAa4B4AH/AWwBzQL/AU8BvAL/AVABvgL/AV4ByAL/AXIB1QL/AV4BywL/AUcBwgL/AUIBxgL/ - AS0BpgHiAf8BcwFNASwB/wHrAVMBAAH/A0sBkAQAATsBgwG7AfwBigHqAv8BgAHiAv8BZgHeAv8BWAHl - Av8BGgGZAc8B/wEAARIBJwH/AQABDQEhAf8BBAGJAcMB/wEeAcUC/wEfAbsC/wEbAbkC/wEiAcMC/wE4 - AYkBvgH8BAABtQE+AQAC/wGhAVMB/wG1AT4BAAL/AdMBrAL/AdMBrQL/AdEBqQL/Ac4BpAL/AcsBngL/ - AccBlQL/AcQBkAL/AcABigL/Ab0BhAH/AeUBVQE2Av8BugF2Af8BtQE+AQAB/wNLAY8BtQE+AQAC/wGr - AVsC/wGrAVsC/wGTATQB/wG1AT4BAAL/Ac4BoAL/AcwBnAL/AckBlwL/AcUBkgL/AcIBiwL/Ab8BhwH/ - AeUBVwE7Av8BugF2Af8BtQE+AQAB/wNUAa8DNQFYAbUBPgEAAv8BoQFTAf8B/gFyAQ8B/wFQAaoB4QH/ - AZQB3gL/AZkB4wL/AZAB4gH+Af8BZwHJAfsB/wFuAdAB+wH/AYsB3QH9Af8BmgHiAv8BjQHdAv8BQgGo - AeIB/wGmAXEBSgH/AfEBVQEAAf8DSwGPBAABRgGgAdIB/wGjAfgC/wGZAe4C/wGGAeoC/wFxAegC/wFe - AecC/wE3AcYB7gH/ASsBwgHsAf8BOAHdAv8BQQHQAv8BOgHIAv8BOgHJAv8BSgHYAv8BQwGnAdgB/wQA - AbUBPgEAAv8BrgFpAf8BtQE+AQAC/wHcAb4C/wHcAb4C/wHaAbkC/wHYAbUC/wHVAa8C/wHRAakC/wHO - AaIC/wHKAZoC/wHIAZcB/wHlAVoBQQL/AcMBjgH/AbUBPgEAAf8DRAF8AbUBPgEAAv8BuAFxAv8BuAFx - Av8BuAFxAv8BiAEiAf8BtQE+AQAC/wHVAa0C/wHSAagC/wHQAaMC/wHNAZ4C/wHKAZkB/wHlAV0BRAL/ - AcUBkgL/AcUBkgH/AbUBPgEAAf8DQgF1AbUBPgEAAv8BrgFpAv8BcgEPAf8BcwGjAbwB/wFFAZ0BzgH/ - AWMBvQHoAf8BlwHaAfgB/wGPAcoB7QH/AZYB0wH0Af8BkQHUAfUB/wFgAboB5wH/ATsBlgHKAf8BRQFg - AY0B/wHsAbQBgwH/AfUBVwEAAf8DRAF8BAABWQFcAV4BzAFbAZEBrAH4AU8BgAGVAfMBTAGAAZUB8wFM - AYABlQHzAU0BgAGVAfMBTwGCAZYB8wFNAYIBlgHzAVMBfgGQAfEBUQGHAaQB9wFZAaoB1AH/AVgBlgHD - Af4BUAGQAawB+AFZAV0BXwHSBAABtQE+AQAC/wG7AYgB/wG1AT4BAC3/AbUBPgEAAf8DJQE3AbUBPgEA - Av8BxAGQAv8BxAGQAv8BxAGQAv8BqgFZAf8BtQE+AQAC/wH2Aewd/wG1AT4BAAH/Ay4BRwG1AT4BAAL/ - AbsBiAL/AXIBDwX/A/4B/wG+AdgB6wH/AVgBpwHVAf8BWgGwAdwB/wFdAbQB3gH/AUcBmAHHAf8BmQG5 - AdAB/wHwAfEB8gH/A/wB/wP+Af8B9gFXAQAB/wMlATcEAAMQARUDHAEoAxoBJAMZASMDGgElAxsBJgMb - ASYDGwEmAxIBGANIAYUBuwGnAagB/wFqAmUB5QMuAUcDDQERBAABtQE+AQAC/wHJAZ8C/wGyAW4B/wG1 - AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEA - Af8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8DKgFAAwQBBQG1AT4BAAL/AdIBqAL/Ac4BoAL/AdIBqAL/ - AdIBqAL/AZkBPQH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/ - AbUBPgEAAf8BtQE+AQAB/wNAAXEDBwEKAbUBPgEAAv8ByQGfAv8BsgFuAv8BcgEPAv8BcgEPAv8BcgEP - Af8B/gFyAQ8B/wH+AXIBDwH/AfwBcQEPAf8B/QFxAQ8B/wH+AXIBDwL/AXIBDwL/AXIBDwL/AXIBDwH/ - AyoBQAMEAQUoAANIAYQB0wHAAb0B/wFiAmEB2gMVAR0IAAG1AT4BAAL/AdUBtQL/AdUBtQL/AdUBtAL/ - AdYBtQL/AdUBswL/AdUBsxX/AbUBPgEAAf8DKgFAAwQBBQQAAbUBPgEAAv8B3gG+Av8B3gG+Av8B3QG7 - Av8B3gG+Av8B3QG7Av8B3QG7Ef8BtQE+AQAB/wMrAUIDBwEKAwABAQQAAbUBPgEAAv8B1QG1Av8B1QG1 - Av8B1QG0Av8B1gG1Av8B1QGzAv8B1QGzFf8BtQE+AQAB/wMqAUADBAEFEAADQAFuA1gBvANOAZgDEwEa - CAADCAELA1oBxQHfAc8B0AH/A1gBvAwAAbUBPgEAAv8B4AHHAv8B4AHHAv8B4AHHAv8B4AHHAv8B4AHH - Bf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/Ax0BKgMEAQUDAgEDBAABtQE+ - AQAC/wHmAc0C/wHmAc0C/wHmAc0C/wHmAc0C/wHmAc0F/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1 - AT4BAAH/Ax0BKgMEAQUMAAG1AT4BAAL/AeABxwL/AeABxwL/AeABxwL/AeABxwL/AeABxwX/AbUBPgEA - Af8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wMdASoDBAEFAwIBAxAAAzYBWAGUAowB+wG4 - AqQB/wNWAbYDIAEvAx0BKgNSAacBzgG+Ab8B/wGnApgB/AM3AVoMAAG1AT4BABX/AbUBPgEAAf8DKwFC - AwcBCgMDAQQDAwEEAwIBAwMAAQEMAAG1AT4BABX/AbUBPgEAAf8DKwFCAwcBCgMDAQQDAgEDAwABARAA - AbUBPgEAFf8BtQE+AQAB/wMrAUIDBwEKAwMBBAMDAQQDAgEDAwABARwAA0YBfwGyAqUB/wHHArYB/wGV - AoUB/gGkApYB/QHUAsQB/wHDArkB/wNMAY8QAAMBAQIBtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+ - AQAB/wG1AT4BAAH/Ax0BKgMEAQUDAgEDHAADAQECAbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEA - Af8BtQE+AQAB/wMdASoDBAEFIAADAQECAbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+ - AQAB/wMdASoDBAEFAwIBAy8AAQEDNwFaA1sBywGDAn4B8QGFAoAB8gNeAdADOwFlAwEBAhAAAwoBDgMf - ASwDJQE3Ay0BRgM5AV8DQgF0A0gBiANOAZcDUgGmA1YBswNXAb0DQQFzFAADHQEpAlkBXAHNAjcBpAH5 - Az0BaRgAAzcBWwI+AZcB9QJaAWgB2gMlATcQAAMIAQsDNwFaAVwCWQHJAYEBQQE0AfQBnAFBASAB+gGb - AT4BIAH6AYMBPQEuAfUBXQJXAdMBPwI+AWwDDQESKAADCgEOAzYBWQNVAbEDVAGuAzQBVQMMARAMAAFY - AVkBXQHSATABYgGAAfYBMQFzAZMB+AEiAYABmwH7ASQBhAG3Af4BIgGdAdMB/wEnAaYB3gH/ASoBsQHn - Af8BKwG6Ae0B/wEpAcYB9QH/ASYBrAH0Af8BHAE5AYMB/ANUAa8DEQEXCAADHgErAlkBXgHMAiYB8QH/ - AhIB+wH/AiUBrQH7Az4BaxAAAzcBWwI1AZcB9gJHAfcB/wJZAfUB/wJZAWMB1wMmATgIAAMZASMDVgGz - Ab0BRQEYAf8B0AFaARgB/wHLAUsBBAH/AcEBPQEAAf8BvgFCAQAB/wHCAUkBBQH/AcEBRQEGAf8BsgEw - AQQB/wFcAVoBWQHIAyABLxwAAx0BKgNIAYgDWAHdAY8BPAFVAfwB5AFxAY8B/wHMAXYBggH/AXMCTQH6 - A1MBqgwAATwBoQHLAfkBoQP/AaUD/wGeA/8BmQP/AYwD/wFzA/8BYQP/AU4B/AL/ATgB+QL/AS4B3wH9 - Af8BHwGrAv8BAAFLAc4B/wJWAVoB2AMqAUEEAAJbAWAB1AIuAfMB/wIAAfoB/wIAAewB/wIIAfEB/wIh - Aa8B+wM+AWsIAAM2AVkCMwGXAfYCMgHvAf8CMwHsAf8CRAH2Af8CaQH3Af8CVwFpAd8EAAMYASIBYAFY - AVcB1gHXAWQBJwH/AdgBXQESAf8BwAE/AQAB/wHIAVsBIQH/AdgBkAFcAf8BugFJARAB/wGnATABAAH/ - AaoBNwEAAf8BuAFCAQEB/wHCAUMBBgH/AWoBVAFQAeUDIwEzDAADBgEIAzsBZANXAcIBawFKAUwB8wG4 - AUkBYAH/AeQBbAGPAf8B7QGPAakB/wH3AYkBoQL/AaABpgH/AfcBpAGoAf8BWgJWAd4MAAFPAXkBjwHu - AcQD/wHEA/8BswP/AakD/wGcA/8BigH7Av8BbwH2Av8BXQHxAv8BSwHwAv8BOAHbAfcB/wEdAa4B+wH/ - AQABqQL/AQUBdAHnAf8BVwFZAVoB0wMJAQwCSwGFAfICKAL/AgAB+AH/AgAB6wH/AgAB5wH/AgIB6wH/ - AigBoQH4AjkBOgFgAzIBUQI1AZIB9AIhAekB/wInAeYB/wI0AeoB/wI+AfQB/wJvAv8CUQGhAfcDBwEK - AVUCUwGtAdwBawEtAf8B2gFdAQ4B/wHEAT4BAAH/AcQBPwEAAf8B6wHLAbMB/wH4Af8B/gH/AeMBrQGM - Af8BrgErAQAB/wGsATUBAAH/AaUBMQEAAf8BrwE6AQAB/wHBAUIBBgH/AVwCWAHNAw8BFAQAAwkBDANZ - AccBjwFGAVYB/gHNAVoBbgH/AeQBgwGYAf8B5wGnAbUB/wHgAccBywH/AdoByQHMAf8B6gGFAZoC/wGT - AZoB/wH3AZwBoAH/AVoCVwHZDAABVQFtAYAB5wHCA/8BxwP/AbcD/wGuA/8BpAP/AZkB/gL/AYgB+wL/ - AW0B9gL/AVsB8QL/AUkB7QL/ATYB5AL/ASMB7AL/ASMB3AL/AUoBVAFlAewDFgEfAzEBTgJLAYgB8gId - AfoB/wIAAfEB/wIAAeUB/wIAAd8B/wIAAeMB/wISAbkB/QIbAaIB+wIOAeMB/wIZAd8B/wImAeQB/wI0 - Ae4B/wJYAfkB/wJRAZQB9AM4AV4DLQFFAcQBVQEkAf8B6AFtAR4B/wHPAUcBAAH/AcsBRwEAAf8BxgFA - AQAB/wHfAZ8BcAH/Ae8B3wHQAf8B1QGFAU4B/wG0ATMBAAH/AbEBOQEAAf8BrAE2AQAB/wGlATEBAAH/ - AbcBQQEAAf8BsgEwAQQB/wE+Aj0BagQAAx0BKgGIAVEBUgH3AeYBlQGkAf8B5QG/AcUB/wHlAdoB2wH/ - AeQB4wHhAf8B5QHkAeEB/wHhAdIB1QH/AesBhQGZAv8BlQGbAf8B9QGXAZwB/wFZAlcB2QwAAVgBZAFt - Ad4ByAP/AdID/wHBA/8BuAP/Aa4D/wGlA/8BmQP/AYgB+wL/AW0B9gL/AVsB8QL/AUoB7gL/ATcB7wL/ - ASoB4gL/AToBTAF3AfMDIQExBAADLwFKAk8BhgHxAhYB9QH/AgAB6gH/AgAB3wH/AgAB1wH/AgAB2wH/ - AgAB3AH/AgsB1wH/AhoB3gH/AicB5wH/AkYB9AH/AkgBlwH2AzYBWQQAA1QBrwHmAXUBMgH/AeIBWAED - Af8B1QFMAQAB/wHSAU0BAAH/AcgBPAEAAf8BzgFeASEB/wHlAbABiQH/Ab4BOgEAAf8BuQE8AQAB/wG1 - ATwBAAH/AbIBOQEAAf8BrAE1AQAB/wGqATYBAAH/AcABRAEHAf8BXQFZAVgB0gQAAxoBJQF8AUcBVgH1 + Af8EAANiAf8DXwH/A3EB/wNuAf8DjgH/DAAD2QH/cAAB5gHxAeYB/wFpAbUBaQH/ATEBlwExAf8B2QHq + AdkB/2AAA+UB/wPqAf8UAAPwAf90AAGFAb4BhQH/ATEBlwExAf9wAAMgAS4DTgGZA1MBqgM8AWgDGAEh + IAADGAEhA1QBqwNFAX8YAAM5AV8DVgG2AykBPxQAAY8BygHkAf8BZAG5AdkB/wFeAbYB2AH/AWYBuQHZ + Af8BlgHNAeUB/wGYAdAB6AH/AWYBugHZAf8BXgG2AdgB/wFkAbkB2QH/AY0BxwHgAf8MAALsAfMB/0gA + AycBOgNVAbEBOAFIAWIB9gGWAa8B1QH/AZgBpQHMAf8BRgFNAYwB/QFPAVEBVAHuA1cBwgNEAXoDIQEx + AwEBAhAAA0ABcQEoAWoB4wH/AR4BQAGWAf0DVAGuAxABFgwAA0wBkwEnAV8BlQH7AR8BSwGpAf8DPAFn + EAABxwHqAfoB/wExAbUB6QH/AS8BtgHsAf8BLwG2AewB/wEvAbYB7AH/ASwBrQHhAf8BKwGrAd4B/wEv + AbYB7AH/AS8BtgHsAf8BLwG2AewB/wEwAbMB5wH/AcUB6QH4Af8IAALpAfMB/wKNAccB/zwAAxEBFwNV + AbQBMQFYAVwB+AEAAXIBKQH/AVoBrQFwAf8B8wf/AfwD/wHVAdsB8gH/AZoBqQHPAf8BVwFjAX8B/gFB + AUMBUgH0A1sB0AMvAUoMAAIhASIBMQFUAW0BugH7AY0B7wL/ARoBWAG/Af8CWwFeAdoDJwE6AxYBHwNZ + AcwBOAGQAdYB/wGUAfAC/wJMAW0B8wMWAR8UAAENAR4BJgH/AQ8BRgFeAf8BKAFqAZIB/wEtAWEBgwH/ + ARsBJwEtAf8BGwEnASwB/wEtAWEBgwH/ASYBaAGQAf8BDwFGAV4B/wELAR0BJAH/EAAC0wHsAf8CVAHI + Af8C1AH+Af80AAM/AW0BfAGLAcMB/gFEAdUBiQH/AQABqQEJAf8BTQGbAV4B/wHVAfQC/wHyAf0B/gH/ + Ad0B8wH5Af8B6wP/Ae8D/wHRAfsC/wGiAeIB+wH/ATsBYQG3Af8DTAGTEAACWgFdAdMBjwHpAf4B/wGI + AfEC/wEtAZEB3wH/AUEBSAFZAfIBRQFTAWkB8QFEAbUB8wH/AZcB/QL/AWoBvQHuAf8DWQHDEAADbwH/ + A4IB/wMAAf8DhwH/A/4R/wP9Af8DbwH/AwAB/wNqAf8DggH/CAAC+AH+Af8CLwHXAf8CSwHYAf8CmgL/ + AuUC/ywAA0ABcQF/AZ8BzAH+AUQB0AGGAf8BAAGfAR4B/wFEAY8BZQH/AcsB7wL/AdsB8QH4Af8BoQGg + AYwB/wHAAdIBxgH/AcgB9gL/AZgBzQH0Af8BiQHSAf4B/wE/AYIBygH/A0wBkxAAAksBTAGPAU0BswHx + Af8BYgHiAv8BYAHiAv8BNwG0AfgB/wFCAcUB/AH/AWMB4QL/AWEB4wL/AUIBfwGuAf4DQQFzEwAB/wMA + Af8DBwH/A/wZ/wP3Af8DAAH/AwAB/wMAAf8MAAKPAfoB/wJUAeMB/wJMAdoB/wKCAv8CwQL/KAADQAFw + AXsBkQHHAf4BOwHLAYoB/wEAAbEBCgH/ATUBkQFIAf8BvwHkAv8B0wHuAfkB/wHMAbIBiwH/AcwBywGp + Af8BmgHdAv8BmwGqAa4B/wGuAboBtAH/AR8BYQHJAf8DTAGTEAADIwEzAUEBagGmAfkBNQHYAv8BLwHK + Av8BNgHVAv8BNAHRAv8BLQHLAv8BOwHRAf4B/wFKAVEBZwHyAxIBGRAAAxQB/wMAAf8DKyH/AxwB/wMA + Af8DLAH/DAACzgH8Af8CUwH0Af8CWQHmAf8CRQHUAf8CgAL/AqcC/yQAA0ACcAGNAcsB/gE+AbwBgAH/ + AQ8BkAEVAf8BUAGZAZIB/wGvAeIC/wHWAfEB+gH/AcEBjgFFAf8BuwGwAYsB/wGAAdMC/wGlAZ4BgwH/ + AcoBpQFLAf8BEwFbAccB/wNNAZYQAANAAXEBIwFfAZ0B+wEPAdEC/wEFAcQC/wEHAcQC/wEHAcQC/wEC + AccC/wEZAccB/QH/ASUBPwFqAfoDSAGEAwEBAgwAA1IB/wMAAf8DKiH/AxsB/wMAAf8DawH/EAAChQHz + Af8CgAL/AmIB7gH/Aj8B0AH/AnQB/gH/ApYC/wLuAv8cAAM8AWcBYAGIAc8B/gFrAcYB6wH/AWwBvAHm + Af8BgwHIAfwB/wGUAdYC/wGLAdkB/AH/AVEBpgHQAf8BSgGmAeAB/wFLAbkC/wFNAY4BwAH/AVkBiAGh + Af8BDgFYAcUB/wNOAZQDAQECCAACUAFSAaQBJwFeAbYB/QEhAdAB+QH/ASIB1AL/ASQB0QL/ASUB0QL/ + ASUB0QL/ASQB0QL/ASIB1wL/AR8BwAHuAf8BEwFLAX8B/gNWAbsDFAEbCAADtAH/AwAB/wMKHf8D+wH/ + AwAB/wMAAf8DzQH/FAACmQL/AoAC/wJpAfUB/wI/AdIB/wJzAf0B/wKKAv8C4QL/FAADMgFQA1cBvwFL + AZYB2gH/AWUBxAL/AWMBvQL/AW8ByQL/AVkBnwH4Af8BGwE5AdwB/wEhAVAB5AH/ARYBTgHjAf8BFAFT + AeMB/wEOAV4B8gH/AQMBYwH8Af8BBQFDAcgB/wJJAVIB7wNUAa8CIQEiATEBWQFaAV4B2QExAakB6gH/ + AVwB9gL/AWkB6wL/AWsB5gL/AWkB5QL/AWYB5AL/AWYB5AL/AWoB5QL/AWoB5wL/AWYB8AL/AVMB7AL/ + ASEBgwG1Af8DWAHjAzUBVwgAAxsB/wMAAf8DzRn/A78B/wMAAf8DMgH/HAAClAL/AoAC/wJuAfkB/wJB + AdcB/wJxAfwB/wKEAv8C1wL/EAACUwFjAesCAAGhAf8BOgGGAegB/wFUAbsC/wFXAbcC/wFcAbsB/gH/ + AS8BSAHtAf8BFAEWAdYB/wEZAR4B0wH/ARgBHAHSAf8BGAEcAdIB/wEeASQB1QH/ASIBKwHZAf8BIgEv + AdkB/wElASoBzgH/AloBXAHcAVUBWQFwAewBXgHbAv8BigP/AZkB9QL/AZYB8wH+Af8BkwH1Av8BmQHy + Av8BpwHwAv8BpAHvAv8BlAHyAv8BlQH0Av8BlwHyAf4B/wGXAfgC/wGDA/8BTgGyAd0B/wJVAVwB5wgA + A7oB/wMAAf8DPgH/AfsC/AH/Ac8B7QH6Af8BpAHdAfYB/wGoAd8B9wH/AdsB8gH7Af8D+QH/AzIB/wMB + Af8DzgH/IAAClQL/AoAC/wJyAfwB/wJFAdsB/wJwAfsB/wKCAv8C1gL/DAADTgGUAQYBAAG9Af8BIwFa + AegB/wFIAbgC/wFLAbYC/wE7AYAB9gH/ARsBJAHiAf8BGwEuAd0B/wEaASwB3gH/ARoBLQHfAf8BGAEr + Ad4B/wEYASkB3gH/ARcBKAHeAf8BGQEnAecB/wEoASkBgQH5AysBQwNZAccBWAFhAWwB5gJbAWcB4QJb + AWYB4QJXAWIB3wFOAVkBgwHyAZMB2wH0Af8B0gH9Av8ByQH+Av8BaAGyAdoB/wFTAVQBawHuAV0BXwFl + AeACWwFjAeEBXAFdAWMB4gJeAWoB5QNRAaIMAANzAf8DAAH/AS8BiwGvAf8BJQGlAdgB/wEjAaEB0wH/ + ASMBogHUAf8BJwGoAdsB/wEtAWsBkQH/AwAB/wO5Af8oAAKaAv8CgAL/AnQB/gH/AkoB4QH/Am8B+wH/ + AocC/wLlAv8IAAMEAQYCWgFhAdwBCwEYAbkB/wEyAZkB9QH/ATkBowL/ASMBNgHiAf8BHAEpAdgB/wEc + ASwB2gH/ARsBKwHbAf8BGgEpAdoB/wEaASkB2wH/ARkBKQHZAf8BGwErAeQB/wESARsBvAH/A04BmRgA + AjABMQFNAXABhAHHAf4B7wP/AdoB/AL/AUgBTQF7AfoDJAE1IAADzgH/AwAB/wEjAW4BmQH/AScBkQG7 + Af8BMAG0AekB/wEuAa4B4QH/ATABmgHDAf8BEwFNAWYB/wMAAf8D8wH/LAACqQL/AoAC/wKAAv8CUQHl + Af8ChQH6Af8CrgL/AvgC/wgAAy0BRgIhAXwB+wENAToBvQH/ASgBXwHwAf8BIQEmAdYB/wEfASsB0wH/ + AR8BKwHVAf8BHQErAdkB/wEdASgB1AH/ARwBKAHUAf8BHAEpAdgB/wEcASYB3AH/AVoBWwFfAeADBwEK + GAADCgEOAVUBXAFtAeoB9AP/Ac4B5QH8Af8CWwFcAdwDBAEGJwAB/wM2Af8DLAH/A04B/wJWAVcB/wNO + Af8DCwH/AyUB/zQAAsYC/wKFAv8CgAL/AlkB6wH/AoMB+gH/Ar4C/wwAAlIBVAGmAhEBoAH/ASwBOQHm + Af8BJAE0AeQB/wEhATAB4AH/ASEBMwHoAf8BHgExAegB/wEeAS0B4QH/ARwBLQHjAf8BHgEvAewB/wEg + ASQBeQH8Ay0BRSAAAlUBVgG0AdwB6gH8Af8BqQG7AeIB/wNQAZ0oAAMvAf8DAAH/A6QB/wMXAf8DMgH/ + A5IB/wMAAf8DkAH/OAAC7wL/AqwC/wKBAv8CawH3Af8CkQL/AuQC/wgAAwwBEAJYAWUB5QEpAS0BmQH+ + ASgBKwGHAfwBJwErAYMB/AEhASMBkQH7ASEBIwGRAfsBJQEpAYEB+gIhAZEB+wEkASYBfgH6A04BlyQA + AzoBYgGsAbIB7gH/AXUBewGbAf4DLwFKKAADywH/AwIB/wMAAf8DAAH/AwAB/wMAAf8DMAH/A/kB/0AA + AuoC/wKwAv8ChAL/AqIC/1gAAwwBEAJbAWUB4QJcAV4BzgMEAQYsAAPbAf8DXQH/AxkB/wMnAf8DggH/ + A/UB/0wAAvUC/wLWAv8MAAMUARsDUQGhA0wBkwMkATUDAwEEaAADEAEWA1sB0ANYAcYDCQEMBAADGQEj + AygBPAMtAUYDLQFGAykBPgMfASwDBgEINAADDwEUA1EBogNWAb4DMQFPEAADWQHJAUIBrQE8Af8BPgGE + ATYB/wE+AUoBQAH1A1wBzgNFAX0DHwEsGAABYgJYAd0BmgFcASEB+wGcAU0BIgH6AZ0BTQEiAfoBnQFN + ASEB+gGdAU0BIAH6AZ0BTQEgAfoBnQFNAR8B+gGdAU0BHgH6AZ4BTQEdAfoBngFNAR0B+gGeAU0BHQH6 + AZ4BTQEdAfoBngFNAR0B+gGaAUgBFgH7AWMBWwFYAeEEAAMSARkDXAHUAQABpAHiAf8BDAFYAZgB/wNZ + AcMDVwHCAWQBUQFJAfEBeAE+ATkB+AF8AU0BKQH6AXwBTQEpAfoBdwE+ATkB+AFfAUoBPwHzAVsCWAHZ + AzwBZzAAA1YBuQEOAUEBlgH/ARIBPwGSAf8BRwFMAVMB8QM2AVkIAANKAYwBJwGQAUcB/wFcAbEBpwH/ + Ad8B8wHPAf8BtQHhAakB/wFhAasBVQH/ATABdQEyAf4BRwFTAUkB8QNXAb8DLwFKEAABgwFfAUsB8wHu + AaMBYAH/AewBsAGHAf8B7AGtAYEB/wHrAaoBcwH/AeoBqQFwAf8B6gGnAW4B/wHqAaQBawH/AekBogFo + Af8B6QGgAWUB/wHpAZ4BYQH/AegBnAFeAf8B5wGaAVwB/wHkAZsBYAH/Ae0BiwE8Af8BhAFMATsB8wQA + AisBLAFDAQsBVgGrAf0BAAH3Av8BFAHBAeoB/wFsATkBPwH/AfIBkQE4Av8BtQFZAv8BvgFhAf8B7QGt + AWkB/wH0AbQBYgL/Ab0BYAL/AbMBWAH/AegBiAE9Af8BaQEtASYB+QM5AV8oAAM/AW0BOQFPAaEB/QFD + AZgB3wH/AQoBYgHeAf8BCgFLAb4B/wNWAb4EAAMzAVIBLQF1AUUB+gGLAW4BuwH/Ae0BywH7Av8B+wHt + Av8B+QH2Af8B+AH3AecB/wHaAeIBsgH/AZ4BxgFqAf8BRAGcATwB/wFJAU4BSQHvAykBPgwAAX4BWAFM + AfEB7AHEAawN/wH2AfkC/wH3AfsC/wH9A/8B+wH+Av8B9wH6Av8B9AH2Af0B/wHwAfIB+QH/Ae8B7QH1 + Af8B5gHuAf0B/wHmAbwBqAH/AYABUwFFAfEEAAMBAQIBUQFYAWIB6QEAAdsB/gH/ARUBxAHnAf8BngGF + AW8C/wHMAW0C/wHNAYMB/wHbAbABlgH/ASABHQHWAf8BQAEyAasB/wHzAcIBhgL/AcgBhgL/AdIBhAH/ + Ad0BcwE+Af8DVgG7JAADDQESAVgBWwFlAeUBUQGiAeMB/wG2Ad8B/QH/Ab4B3wL/AUsBcwGkAf4DRQF/ + Aw8BFAFYAWEBWAHmAS0ByQFeAf8BsQHpAecC/wHvAeQB/wHxAeUB2AH/AfMB4wHUAf8B9gHhAc0C/wHj + AcgB/wH7AdEBrQH/AdEBvAGBAf8BVgGTAT8B/wNYAcsDBAEGCAABfgFYAUwB8QH1Ac0BsgH/AccByAHM + Af8BhgGAAYEB/wG7ArcF/wHfAt0B/wGSAowB/wGPAYcBiAH/AZEBiQGKAf8BjwKIAf8BjgGGAYcB/wGG + AnMB/wKvAbYB/wHvAcIBpgH/AX4BUwFFAfEEAAM2AVkBFgFfAZMB+wEAAeMC/wEUAb8B4gH/AZUBhAGG + Av8B1AGXAv8B2QGiAf8B2AG8AbAB/wEhASUB6AH/ATgBNAHUAf8B8AHSAagB/wH4AckBigL/AcUBhgH/ + AfEBpwFnAf8DWwHIJAADRgGBAS4BawG9Af8BlwHQAf0B/wHdAfwC/wG0Ab4BzwH/A1QBqwQAA1gBxgFT + AZ4BXAH/AdAB2gGqAf8B/QHxAeEB/wHxAeQB1gH/AfAB5AHVAf8B8QHgAcwB/wH0AdcBuAH/AfIBzwGp + Af8B1QGzAYoB/wH3AccBnAH/AckB1QGbAf8BNgFqASsB/gNKAYsIAAF+AVgBTwHxAfIBygGvAf8B5gHp + AewB/wHJAcgByQH/AeAC3wH/A/4B/wHvAu0B/wHOAswB/wHMAskB/wHMAscB/wHKAsUB/wHJAsMB/wHE + Ar0B/wHSAdMB2gH/Ae4BvwGjAf8BfgFTAUUB8QQAAzQBVAELAVgBqAH9AQAB5QL/ARMBvwHhAf8BkwGE + AY8C/wHhAbUC/wHqAccB/wHmAdYBzAH/AkAB4AH/AWMBWwHVAf8B/AHsAcUB/wHeAdQBnwH/Af0B1QGl + Af8B7wGoAYIB/wNWAbYgAAMSARkBUwFZAWQB7AFvAb4B9wH/AccB8wL/AZUBuQHYAf8DVgG7CAABWQFl + AVkB5QFJAYMBnAH/AfAB6wH7Av8B/gH7Af8B+wHsAeQB/wHzAeQB1AH/AfIB2wHCAf8B9wHYAbcB/wHc + AcABnQH/AeQBvQGRAf8B+gHOAaEB/wH+AegBzAH/AZkBzAGLAf8BPwFIAT0B9AMtAUUEAAF+AVcBTwHx + Ae8ByAGtDf8B/AL6Hf8B+AH5Av8B6wG+AaIB/wF+AVMBRQHxBAADLQFFAQsBWAGJAfwBAAHhAv8BEwHA + AeEB/wGYAY8BogL/AekBzAL/AfsB7AH/AvIB7QH/AUYBRAHZAf8BaQFlAdUD/wHwAv8B9wHtAv8B6wHT + Af8BvQF/AW0B/gM8AWggAANWAb4BRwGYAdsB/wGtAecC/wFnAagB1wH/A1kBwwMBAQIIAAMQARYBPAE9 + ATwBaAFZAVwBWQHPAXwBmQF/AfsB0QHpAdEB/wH2AfQB5gL/AekB0gH/AeIBxwGrAf8B2wG9AZkB/wH3 + AdEBpgH/AfMB0gGtAf8B/QHgAckB/wHzAfoB5wH/AVwBqQFXAf8DWgHTAw8BFAF7AVgBUQHxAfQBzgG0 + Af8C0wHWAf8BoAKcAf8ByQLHAf8D/gH/AegC5QH/AaoCpQH/AagCoQH/AagCogH/AacCoAH/AaUCnwH/ + AZ8ClgH/AcEBwwHJAf8B9AHIAawB/wF+AVMBRQHxBAADUQGgAQABkwHTAf8BAAHrAv8BEwG9AeAB/wGN + AV0BbwL/Ad8BygL/AfEB3gH/AeEBzQG8Af8BJgEqAbsB/wFJAUYBsAH/AfoB2AGvAv8B6gHZAv8B1QHJ + Af8BXQJZAdIDBgEIBAADFAEbAy4BSAMJAQwMAANOAZgBKgFvAaMB/gGbAeEC/wFxAbUB4wH/A1kBzAMG + AQgYAAMYASEDSwGOAl4BWgHYAXsBmAFvAfoB2AHKAagB/wH4AdQBsQH/AfIB0wGxAf8B8wHcAcIB/wHx + Ad4ByAL/AfQB7wH/AdcB9AHYAf8BNwF4ATEB/gNOAZcBewFXAVMB8QHzAc4BtAH/Ad4B4QHlAf8BuAG2 + AbcB/wHYAtYF/wHuAu0B/wHAAr4B/wG+ArsB/wG/ArwB/wG+ArkB/wG9ArkB/wG3ArIB/wHPAdMB2QH/ + AfMByQGtAf8BfgFTAUUB8QMSARkBSwFSAWIB7QEAAckB/QH/AQAB4gH9Af8BGgHJAeoB/wFBASoBQQH5 + AZ0BSQE5AfwBswKiAf8BWQGdAcAB/wFAAZYBxgH/ATIBjAG+Af8BUAGIAZ8B/wHDAY4BcgH/AWcBXgFd + AeUDGwEmBAADIAEuA1gB4wI9ATwB/ANPAZwIAANOAZcBJAFmAZoB/gFzAc0C/wGfAdsB/gH/AUwBVAFi + Ae8DHQEqKAABKwEsASsBQwFnAXIBXQHwAf4B8AHYAf8B9QHbAcQB/wHyAeEB0AH/AfMB5gHYAv8B8AHt + Af8BrQHaAa0B/wEqAaQBLwH/A1EBpwF7AVYBUwHxAfABzAGzDv8C/iH/AfABxwGsAf8BewFTAUUB8QNS + AagBAAFhAcIB/wEAAeIC/wEAAdkB9QH/AR4B3QH3Af8BHgGXAccB/wE1AUgBdwH+AWABngHHAf8BiAHX + Af0B/wGNAdQB9QH/AXMBywHuAf8BSAGxAeIB/wEqAWQBnwH/A1IBqAgAA1kB1wHWAc8BzQH/AbgBtAGy + Af8DPgH4AzoBYQNOAZcBHwFnAZ8B/gFfAcIC/wGoAeYC/wFNAXwBlwH+A0IBdjAAAzoBYgGbAbcBkQH8 + Af8B+AHwAf8B8gHjAdQC/wHvAesB/wHLAeIBxwH/ATUBugFFAf8DWAHjAxUBHQF3AVYBUwHxAfQB0AG4 + Af8C3QHeAf8BtgKyAf8B1gLTBf8B7gLtAf8BvgK7Af8BvQK5Af8BvwK6Af8BvgK5Af8BvQK4Af8BuQKy + Af8B1AHWAdoB/wH2AcwBsAH/AXsBUwFFAfEBVAFYAWEB5AEAAb0C/wEAAeUC/wEAAesB+AH/ATEB+wH9 + Af8BhgP/AU8BmwHMAf8BhAG5AeIB/wGlAeMC/wGcAdoB/gH/AZYB1wH6Af8BjgHSAfMB/wFRAbcB6QH/ + AVMBWAFgAesDFAEbBAADZAHsAdcB0gHTAf8BywHJAcoB/wGOAY8BjgH/AUQBQQE1AfsBbgFvAXUB/gFI + AZUByQH/AYAB0wL/AWsBsgHgAf8DWQHEOAABVQFWAVUBsQHkAfQB5QL/AfQB8QH/AekB6AHbAf8BWwHW + AW8B/wFBAW4BQQH5AzABTQQAAXcBVgFTAfEB9gHTAbwB/wHTAdcB2wH/AaABnwGgAf8DyQX/A+oB/wGr + AqoB/wGpAacBqAH/AasBqQGqAf8BqgKpAf8BqwKoAf8BowGhAaIB/wHJAc8B1QH/AfkB0QG0Af8BewFT + AUcB8QE7AUwBdwHzAQABxQL/AQAB4gL/AQAB/QL/ATED/wGUA/8BawGwAdAB/wGFAaYBzgH/AcIB7QL/ + AbcB5QL/AaYB3gL/AZgB2AH6Af8BhQHTAf0B/wE2AVoBbgH2Ax0BKgQAAycBOgNYAcsDiAH9AqwBqwH/ + AaoBqQGnAf8BvgG3AbEB/wG2AbABqgH/AWcBnQG9Af8BUgFVAVwB6gMYASE4AAMPARQBZAFrAWQB5wHz + AfoB9QH/AZAB5QGfAf8BNQG0AUMB/wNIAYcIAAF3AVUBUwHxAe0BxwGuAf8B+AHxAe4B/wH4AfAB7QH/ + AfcB8QHuAf8B9wHyAe8B/wH4AfEB7wH/AfgB8QHuAf8B+AHxAe4B/wH4AfEB7wH/AfgB8QHvAf8B+AHx + Ae8B/wH3AfEB7wH/AfcB8wHxAf8B8QHGAaoB/wF7AVMBRwHxARYBUQGUAfsBAAHHAv8BAAHiAv8BBAH7 + Av8BMgP/AY8D/wFrAbMB1AH/AZ4BsQHQAf8B5wH7Av8B1gHvAv8BugHkAv8BogHgAv8BjAHZAv8CWwFh + AeEDBgEIDAADUwGtAaQBowGgAf8BzAHKAccB/wHFAcEBvwH/Ac0BxgHDAf8BbwFnAWUB/wNQAaMIAAMD + AQQDDwEUAwkBDCwAAzUBVwFnAboBiAH9AVgB5gGCAf8DWAHGDAABdwFhAVMB8QHsAZ0BVQH/AeQBjQFH + Af8B5AGPAUoB/wHkAY0BSAH/AeQBjAFHAf8B5AGMAUYB/wHkAYwBRQH/AeQBiwFEAf8B5AGKAUMB/wHk + AYkBQQH/AeQBiQFAAf8B5AGIAUAB/wHjAYgBQQH/AewBiwE2Af8BewFTAUkB8QFLAVUBagHtAQABygL/ + AQABxQHwAf8BIgFLAV8B+wEwAYMBqQH+AXQD/wFCAYYBtwH/AaABsQHOBf8B8QP/AcwB9AL/Aa4B7gL/ + AVsBgwGuAf4DQAFwEAADHQEqA2QB8QHRAc8BzQH/AeYB4wHhAf8BswGxAbAB/wFkAWMBYQH/AkUBRAH5 + A1gB5ANaAdsDVwHoA10B5QMuAUgwAAFSAVMBUgGoAVcBXAFXAd8DGAEhDAABfgJfAfMB/wHhAaEC/wHH + AYIC/wHEAXMC/wHBAW0C/wG+AWcC/wG6AWEC/wG2AVsC/wGyAVUC/wGuAU4C/wGqAUcC/wGmAUIC/wGj + ATwC/wGeATQC/wGpAToB/wF7AVkBSgHyAlkBXAHJAQABwQH9Af8BAAHPAfYB/wELAUABUwH9AQkBiQG1 + Af8BYgP/AUEBRwFqAfkDVgHBAYUBjAGcAfkBvQHVAeEB/wGfAckB3QH/AUsBZwF7AfYDSwGPGAADLQFG + A1wB5wHCAcABvQH/AdYB0wHRAf8BrAKpAf8BqAGnAaYB/wGvAa0BrAH/AbsBuQG4Af8ChAGDAf4DVgG4 + AwkBDEgAAV0CWQHXAY4BXAFTAfsBfQJNAfoBfQJNAfoBfQJNAfoBfQJNAfoBfQFNAUoB+gF9AU0BRgH6 + AX0BTQFCAfoBfQFNAT8B+gF9AU0BMQH6AX0BTQEuAfoBfQFNASsB+gF9AU0BKQH6AY4BRAElAfsBYAFa + AVgB3gJGAUcBgQEeAU0BjAH6AR4BZAGYAfoBIwFlAYwB+QEsAVwBjgH4AToBZAGHAfcDVAGvBAADKQE/ + AkgBSQGHAkUBRgF/ASECIgExIAADEgEZA04BmANlAeUBhwKGAfkBfwJ9AfwBcQJuAfYDXgHZA0ABcRAA + AzoBYQNZAccDWQHMA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNcAc4DWQHD + AzQBVUQAA1cBwgNEAXs4AANhAeIDewHxA24B7gNuAe4DbgHuA20B7gNsAe4DbAHuA2wB7gNsAe4DbAHu + A2wB7gNuAfADZQHlBAADYQHuA+IB/wPdAf8D2gH/AtsB2gH/A9kB/wPYAf8D2AH/A9cB/wPWAf8D1QH/ + A9QB/wPTAf8D4AH/A5kB/wNXAb0MAANIAYYBTQFRATIB+gNDAXcsAANcAdQBCwEnATwB/wNJAYkDEwEa + MAABogKjBf8B9gLwAf8B9gLvAf8B9gLvAf8B9ALvAf8B9ALtAf8B9ALtAf8B9ALtAf8B8gLrAf8B8wLr + Af8B8gLoAv8C+wH/AaICoQH/BAADiAH3BP8C9AHzAf8B/QH4AfUC/wH2AfMB/wH9AfQB8QH/AfwB8wHw + Af8B+wHwAe0B/wH5AfAB7QH/AfgB7wHsAf8B9wHtAeoB/wHyAe0B6gH/AecB5gHnAf8D9QH/A8YB/wNZ + AcMIAAMOARMCXwFdAeABNAHEAU8B/wFHAWoBQQH5AzgBXigAAykBPwE+AVIBaQH3AWUBmgGuAf8DWwHQ + A0IBdQMGAQgoAAOfAf0B+gLzAf8B6gLiAf8B6QLhAf8B6QLhAf8B6ALfAf8B5wLeAf8B5gLeAf8B5gLd + Af8B5ALbAf8B5ALaAf8B4gLXAf8B9QLrAf8BngKcAf0EAAN7AfYB/AL7Af8B7gHsAeoB/wG7AcwB2gH/ + AZMBswHLAf8BmAG1AcsB/wGWAbUBywH/AZUBtAHKAf8BlQGzAckB/wGUAbMByQH/AY4BrgHHAf8BqQG6 + AcgB/wHeAtwB/wHuAu0B/wO9Af8DVgHBCAADQAFxAT8BmgE6Af8BTQHpAZIB/wFBAdIBaQH/AUwBZAFM + AfMDLgFHKAADUQGiAXIBxAHfAf8BmwHkAfIB/wEmAYoBrQH/A0wBkQMCAQMkAAGfAp4C/QL2Af8B9QLt + Af8B8wLsAf8B8wLsAf8B8gLqAf8B8QLpAf8B8QLpAf8B8ALoAf8B7wLmAf8B7wLlAf8B7QLjAf8B+ALu + Af8DnAH9BAADewH2Av8B/gH/Ae0B5AHnAf8BTQGzAdgB/wEFAcsB6wH/ARMB0AHtAf8BFgHRAe4B/wEW + AdQB8QH/ARcB0gHuAf8BGQHSAe4B/wEQAc8B7gH/AToBpAHMAf8B1QHPAdMB/wH2AfIB8AH/A8AB/wNW + AcEEAAMFAQcBVgFYAVYBvAFQAc8BbwH/AXEB6AGrAf8BYgHoAaMB/wFGAc4BaQH/AVkBYgFWAesDJAE1 + JAADMQFOARIBcgGlAf8BlwHmAfkB/wGGAegB9QH/AUABXQGPAf0DIgEyJAADoAH9AfsC9wH/Ad4C2gH/ + Ad4C2QH/Ad8C2gH/Ad4C2QH/Ad0C2QH/Ad0C2QH/Ad0C2AH/AdwC1gH/AdsC1gH/AdoC1AH/AfgC8QH/ + AZ4CnQH9BAADfQH2BP8B6gHkAeYB/wFSAbsB4QH/ASUB3AL/ASoB3QL/ARIB0wH9Af8BDQHQAfcB/wEQ + AdQB/AH/ARAB3QL/AQkB3QL/ATgBrgHYAf8B1QHPAdMB/wH3AfMB8QH/A8EB/wNWAcEEAAMuAUgBQwF/ + ATwB/gGJAe4BtQH/AZYB8wHFAf8BigHrAbgB/wFuAewBrwH/AUUBzAFnAf8BVwFcAVcB3wMaASQgAAMI + AQsDUwGtASMBoQHMAf8BnQHTAd0B/wGqAeIB8AH/A1QBqyQAA6gB/QHSAtEB/wEjAiIB/wIXARYB/wEb + ARoBGQH/ARcBFgEXAf8BGgIZAf8BHAIZAf8DHAH/ARoCGwH/ARMBFgEXAf8DHwH/AcsCygH/A6gB/QQA + A30B9gT/AekB5wHpAf8BYQG3AeEB/wFgAdAB/gH/AWAB1QL/AT8BqQHcAf8BRAFiAYcB/wEXAZ8B2gH/ + AQABwQL/AQABvAL/ATUBpQHXAf8B2AHUAdYB/wH4AfQB8gH/AsIBwwH/A1YBwQMCAQMDUAGaAWEBzgGC + Af8BoQH6AdEB/wFRAc0BawH/AW0B5gGlAf8BlQHzAcgB/wFxAfIBuAH/AUQByAFiAf8BWwFeAVsB0AMU + ARwgAAMSARgDVgGzAWUBxgHhAf8B8AP/AY4BmgGiAf8DMwFSAw8BFBwAA6gB/QHGAsgB/wEAAgEB/wMA + Af8DAAH/AgMBAAH/AwAB/wMAAf8DAAH/AwAB/wECAgAB/wMAAf8BvAK9Af8DqAH9BAADfQH2BP8B6QHo + AesB/wFkAbkB4QH/AW4B1QH+Af8BcAHdAv8BZgGsAcoB/wFgAU0BSQH/ATcBnQHJAf8BAAG4Av8BAAGv + Av8BNgGiAdcB/wHaAdUB1gH/AfoB9gH0Af8BxALFAf8DVgHBAxwBJwFRAYIBPwH3AZgB/AHJAf8BXgGy + AXMB/gFYAWEBVQHkAUIBcAFCAfUBYQHjAZgB/wGRAfkBzAH/AXEB9wHBAf8BQAHDAVkB/wFVAVcBVQG3 + AwoBDSAAAwoBDgNPAaUBjQG+Ac8B/wGYAccB4AH/AUABZAF8AfUBWAJcAdEDGgElGAADqAH9AcoBzwHQ + Af8BCwETARQB/wMAAf8BOAE7ATQB/wG9AbYBlgH/ARYBKAEkAf8BHwElARwB/wEmASIBFwH/AwAB/wFi + ATABDwH/AwAB/wHCAr8B/wOoAf0EAAN9AfYE/wHmAecB6wH/AWoBuwHiAf8BlwHkAv8BlgHoAv8BkAHH + Ad0B/wGLAZIBkwH/AWEBvAHeAf8BHAHFAv8BFAHAAv8BPAGmAdgB/wHXAdQB1wH/AfsB9wH1Af8DxgH/ + A1YBwQNHAYIBTwHQAW8B/wFUAdUBdAH/AVgBWgFYAcADAAEBAy0BRQFaAWEBWAHiAUYBywFiAf8BgQH5 + AcYB/wFvAf4BygH/ATkBwAFSAf8DUgGpAwQBBSAAAwoBDgNXAcUBRwGUAbsB/wFFAZgBuwH/ASYBKwEw + Af8DUAGfAwABARQAA6gB/QHRAswB/wG4AZgBXwH/AWUBZgFQAf8BtgK4Bf8BTgJYAf8BXgFXATwB/wFk + AWMBSwH/ATcBKwEWAf8BzgFnASYB/wFDARsBBwH/AckBvgG9Af8DqAH9BAADfwH2BP8B8QHwAfEB/wGD + AbkB2gH/AWIBtwHeAf8BZgG4Ad4B/wFmAb8B5wH/AXQBywHzAf8BVwG7AegB/wFCAa4B4AH/ATgBqgHc + Af8BXwGqAdEB/wHhAd8B4AH/AfoB9wH2Af8DyAH/A1YBwQFWAWUBVgHpATkB0AFXAf8BWQFbAVkBxAMN + ARIIAAMcASgBVAFWAVQBqwEvAbQBOwH/AWMB8gGzAf8BZwH/AdAB/wE0AbsBSAH/A0sBjiQAAj4BPwFs + AYABdAFxAf8BkwEdARMB/wEYAgAB/wEnAQUBAAH/A0ABcBQAAaYCqAH9AdEBzAHKAf8B1wGvAW0B/wH8 + AeEBrgH/AfYC9wH/AfsB/gL/AeQB1wHFAf8BywGvAXEB/wGPAW8BTQH/AcwBkgFBAv8BkQEzAf8ByQFB + AQkB/wHKAb0BuwH/AaUCqAH9BAADgQH2BP8B+wH6AfkB/wHmAeoB7gH/AZ8BpwGxAf8BogGnAa4B/wGf + AacBrwH/AcABzAHXAf8BsAG1Ab0B/wGuAa0BswH/AZ8BoQGoAf8B3gHfAeMB/wHuAu0B/wP1Af8DyQH/ + A1YBwQE4AXUBNQH2AVkBXAFZAc8DFAEbEAADBAEFAT0BPgE9AWoBOAF3ATYB9gFOAegBlgH/AV4B/wHS + Af8BLQG4AT4B/wFFAUYBRQF+IAADAQECA0cBggG+AVsBQQH/AW0BFAEQAf8BEwIAAf8BRwEnASIB+QEs + AisBQxAAAacCqAH9AdABygHJAf8BzQGhAV8C/wHcAZ0B/wH9AeUBwQH/AfYB4wHNAf8B/gHgAa4C/wHa + AZoB/wH5AcABawH/AfwBpwFIAv8BgAEoAf8B0AE+AQQB/wHJAbwBugH/AaQCqAH9BAADgQH2BP8D9wP/ + Af4B/wHbAdYB1AH/AbsBtQGyAf8ByQHCAcAB/wG7AbUBsgH/AcwBxwHEAf8BuwG1AbIB/wHQAcsByAH/ + AfcB9QH0Af8C6gHpAf8D9gH/A8sB/wNWAcEDGAEhAxEBFxwAAyQBNgFaAV4BWgHVATcB1AFjAf8BWgH8 + Ab4B/wEpAbcBOwH/AzwBZiAAAwIBAwNTAaoBxgFqAVAB/wFJAQkBBgH/ARoCAAH/AV0CWQHXAxgBIQwA + AacCqAH9Ac8BygHIAf8BzQGXAU0C/wHLAYUC/wHOAY4C/wHPAZAC/wHNAY0C/wHEAXMC/wG2AVgB/wH8 + AZYBOwH/AfoBZAEcAf8ByAEvAQAB/wHIAboBuQH/AaUCqAH9BAADgQH2BP8D+QH/A/oB/wH5AvoB/wPL + Af8BuAK2Af8BwQK/Af8BuAK2Af8DxAH/AfAC8QH/Ae4C7wH/A+sB/wP5Af8DzQH/A1YBwSgAAxABFQFP + AVABTwGbASQBvgE8Af8BUAH1AaQB/wE2AagBQAH9AzEBTiAAAxABFgFcAlkBzAG5AV0BPwH/ASoCAAH/ + AS4BBwEAAf8BUQJQAZ8MAAGnAqgB/QHNAcUBxAH/AdABggEuAv8BuQFTAv8BvwFkAv8BwQFnAv8BvAFe + Av8BsAFNAv8BmAE3Af8B/QFtASAC/wFIAQQB/wHNARoBAAH/AcYBtgG1Af8BpQKoAf0EAAOFAfYE/wP7 + Af8D+QH/A/oB/wH6AvsB/wPlAf8D1QH/A+EB/wP0Af8D8QH/A+0B/wPrAf8D9wH/A88B/wNXAcIwAAE5 + AToBOQFgAVgBZAFYAeMBOQHdAV4B/wFQAXABUQHtJAADHQEqAWoCWAHpAZ8BSAEmAf8BFQIAAf8BSgEI + AQAB/wM3AVsIAAOoAf0B1ALLAf8BmAFSASsB/wG0AXEBOgH/AbMBgwFDAf8BtAGGAUQB/wGzAYIBQQH/ + AbMBbQE5Af8BswFfATEB/wGzAU0BJQH/AbUBOAEVAf8BlwEkARMB/wHLAb8BvgH/AacCqAH9BAADkwH4 + IP8D/QH/A/wB/wP6Af8D+QX/A9MB/wNXAcI0AAMdASkBVwFaAVcBxQFJAXABSQHvKAADKgFAAYUBSwFI + AfYBgAE1ARgB/wESAgAB/wFgAVQBUQHrCAABowKkBf8B2wHcAeAB/wLYAd4B/wLZAd0B/wHYAdkB3QH/ + AdgB2QHeAf8B2AHZAd4B/wHYAdoB3gH/AdgB2wHfAf8B1wHcAeAB/wHZAdwB3wL/AvwB/wOiAf8EAANb + AcsDrQH+A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9A7UB/QO2Af0DtQH+A24B9QM7 + AWVsAAM7AWQBfQFIATgB9gFZATcBMwH1AVICUQGnCAADXgHdA24B7wFtAm4B7QNtAe0DbQHtA20B7QNt + Ae0BawJtAe0DawHtA2sB7QFqAmsB7QFrAmoB7gNrAe8DXwHgkwABAQMEAQUDEAEWAykBPwM+AWwDRgGA + A0QBewM4AVwDIAEuAwoBDQMBAQIMAAFaAl0B0wFMAX8BjAHzAVIBcAF7Ae8BUgFwAXsB7wFSAXABewHv + AVIBcAF7Ae8BUgFwAXsB7wFSAXABewHvAVIBcAF7Ae8BUgFwAXsB7wFSAXABewHvAVIBcAF7Ae8BUQF7 + AYkB8gFbAl4B2QsAAQEDBgEIAwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMH + AQoDAwEECwABAQMGAQgDCgENAwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMHAQoDAwEEEwABAQMH + AQkDFQEdAzkBXwNTAbACWAFhAeYBXwGQAZkB+wFZAagBtQH9AU4BXQFmAfADWQHSA1IBqQNGAYADJAE2 + AwQBBggAATMBoAHSAf8BKQH7Av8BHwHxAv8BIgHwAv8BIwHwAv8BIwHxAv8BIwHxAv8BIwHxAv8BIwHx + Av8BIwHwAv8BIwHwAv8BIQHwAv8BJwH7Av8BNwGsAdgB/wQAAwQBBQMkATYDRAF5A0oBiwNKAYsDSgGL + A0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNHAYIDMwFSAwsBDwMEAQUDJAE2A0QBeQNKAYsDSgGL + A0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0UBfwMpAT8DAwEECAADBAEFAyQBNgNEAXoBXQFeAWEB2gFd + AXoBjwH8Aa8B1QHjAf8BxAHyAf0B/wG3AfAC/wGqAf4C/wGfAf0B/gH/AYgB2gHlAf8BWgGHAaMB/gFB + AVIBZQH0A1YBuQM1AVcDCwEPBAABMAF9AbMB/AEZAeIC/wEQAdkC/wESAdgC/wERAdcC/wETAd8C/wEU + AeUC/wEUAeUC/wEUAeAC/wESAdkC/wETAdkC/wEQAdkC/wEXAeMC/wEyAYMBtwH8BAADHQEqAbUBOwEA + Af8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1 + ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DUgGpAzUBWAMdASoBtQE7AQAB/wG1 + ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEA + Af8BtQE7AQAB/wG1ATsBAAH/A0sBjgMUARsDAAEBBAADHQEqAbUBOwEAAf8B8wFTAQAB/wGVAb8B0wH/ + Ae8D/wHUAfsC/wGpAeYC/wGSAdkC/wGOAesC/wGNAfMC/wGdAf0C/wGrA/8BaQHEAdcB/wFfAR4BAAH/ + A1MBrQM1AVgEAAEyAX0BswH8ATMB4AL/ASYB1QL/ARoB0wL/AQ8B0AL/AQEBngH2Af8BAAGJAeYB/wEB + AYoB5QH/AQIBmgHzAf8BCQHJAv8BCgHMAv8BBwHJAv8BDQHUAv8BMAGAAbcB/AQAAbUBOwEAAv8BaQEH + Af8BtQE7AQAC/wGoAVMC/wGnAVIC/wGmAVAC/wGkAU0C/wGiAUkC/wGgAUUC/wGdAUAC/wGbATwC/wGb + ATwB/wHlAUIBGAL/AZsBPAH/AbUBOwEAAf8DSAGIAbUBOwEAAf8BtQE7AQAC/wFvAQwC/wGvAV8C/wGl + AU4C/wGkAUwC/wGjAUoC/wGgAUYC/wGfAUQC/wGdAUAC/wGbATwB/wG1ATsBAAH/A1QBrwM2AVkDGwEm + BAABtQE7AQAC/wFpAQcB/wH7AW0BDAH/AZgBwwHYAf8B2QP/AasB5gL/AYYB0wL/AWkBygL/AW4B3QL/ + AWsB4gL/AYEB6AL/AZEB9wL/AWEBwgHbAf8BagE8ARYB/wHpAU8BAAH/A0gBiAQAATIBfAG0AfwBRQHg + Av8BOAHWAv8BKQHUAv8BGwHbAv8BAAGAAeMB/wIAAW0B/wIAAWcB/wEAAWMB3AH/AQABxwL/AQABvgL/ + AQABuwL/AQIBxgL/AS0BfgG3AfwEAAG1ATsBAAL/AXMBFQH/AbUBOwEAAv8BsgFmAv8BsQFlAv8BsQFk + Av8BrwFgAv8BqwFaAv8BqAFUAv8BpwFRAv8BpAFMAv8BogFIAf8B5QFFAR0C/wGiAUgB/wG1ATsBAAH/ + A0sBkAG1ATsBAAL/AWoBBQH/AbUBOwEAAf8BtQE7AQAC/wGvAV8C/wGuAV0C/wGtAVsC/wGqAVYC/wGo + AVIC/wGlAU4C/wGjAUoB/wHlAUYBHwH/AbUBOwEAAf8DTAGRAxQBGwQAAbUBOwEAAv8BcwEVAf8B+wFt + AQwB/wGJAb8B2wH/AbkB8AL/AYwB1gL/AVsBxAL/AUwBvAL/AVgBzwL/AVUB0wL/AWAB2gL/AW8B5wL/ + AVABuAHdAf8BagE/ARsB/wHpAU8BAAH/A0sBkAQAATIBfAG0AfwBUAHfAv8BSAHYAv8BNwHTAv8BKwHc + Av8BDAGvAfMB/wEAAQcBVgH/AQABAgFLAf8BAAGVAeoB/wEAAbsC/wEAAbAC/wEAAa4C/wEAAbkC/wEr + AX0BtwH8BAABtQE7AQAC/wGIAScB/wG1ATsBAAL/Ab4BhwL/Ab4BhgL/AbwBgwL/AboBcwL/AbcBbgL/ + AbMBZwL/AbABYQL/Aa0BXAL/AaoBVwH/AeUBSQEkAv8BqQFUAf8BtQE7AQAB/wNLAZABtQE7AQAC/wGS + AS8C/wF0ARIB/wG1ATsBAAL/AboBcwL/AbgBbgL/AbYBbAL/AbQBaAL/AbABYQL/Aa8BXwL/Aa0BWwH/ + AeUBSwEoAf8BtQE7AQAB/wNUAa8DNQFYAwMBBAG1ATsBAAL/AYgBJwH/AfsBbQEMAf8BaQG3Ad4B/wGX + Ad8C/wFeAcUC/wEzAbAC/wE0Aa8C/wFLAcQC/wE3AcAC/wFHAcoC/wFXAdcC/wFAAbAB4AH/AWoBQwEh + Af8B6QFPAQAB/wNLAZAEAAE0AXwBtAH8AWQB4wL/AVwB3AL/AUsB2QL/AToB4AL/AQQBawG3Af8CAAEU + Af8CAAEQAf8BAAFYAaoB/wECAb0C/wEDAbMC/wEAAbAC/wEGAbsC/wEvAX4BtwH8BAABtQE7AQAC/wGV + ATsB/wG1ATsBAAL/AcgBmgL/AcgBmAL/AcYBlgL/AcQBkAL/AcABiwL/Ab0BhAL/AbkBcgL/AbYBawL/ + AbIBZgH/AeUBTQErAv8BsAFhAf8BtQE7AQAB/wNLAZABtQE7AQAC/wGfAUQC/wGfAUQC/wFrAQYB/wG1 + ATsBAAL/AcMBjgL/AcABiQL/Ab4BhAL/AboBcwL/AbgBbgL/AbUBagH/AeUBTQErAv8BsAFhAf8BtQE7 + AQAB/wNMAZEDEwEaAbUBOwEAAv8BlQE7Af8B/AFuAQwB/wFSAa4B4AH/AWkBzQL/AUwBvAL/AU0BvgL/ + AVsByAL/AW8B1QL/AVsBywL/AUQBwgL/AT8BxgL/ASoBpgHiAf8BcAFKASkB/wHrAVABAAH/A0sBkAQA + ATgBfQG1AfwBigHqAv8BgAHiAv8BYwHeAv8BVQHlAv8BFwGZAc8B/wEAAQ8BJAH/AQABCgEeAf8BAQGJ + AcMB/wEbAcUC/wEcAbsC/wEYAbkC/wEfAcMC/wE1AYABuAH8BAABtQE7AQAC/wGhAVAB/wG1ATsBAAL/ + AdMBrAL/AdMBrQL/AdEBqQL/Ac4BpAL/AcsBngL/AccBlQL/AcQBkAL/AcABigL/Ab0BhAH/AeUBUgEz + Av8BugFzAf8BtQE7AQAB/wNLAY8BtQE7AQAC/wGrAVgC/wGrAVgC/wGTATEB/wG1ATsBAAL/Ac4BoAL/ + AcwBnAL/AckBlwL/AcUBkgL/AcIBiwL/Ab8BhwH/AeUBVAE4Av8BugFzAf8BtQE7AQAB/wNUAa8DNQFY + AbUBOwEAAv8BoQFQAf8B/gFvAQwB/wFNAaoB4QH/AZQB3gL/AZkB4wL/AZAB4gH+Af8BZAHJAfsB/wFr + AdAB+wH/AYsB3QH9Af8BmgHiAv8BjQHdAv8BPwGoAeIB/wGmAW4BRwH/AfEBUgEAAf8DSwGPBAABQwGg + AdIB/wGjAfgC/wGZAe4C/wGGAeoC/wFuAegC/wFbAecC/wE0AcYB7gH/ASgBwgHsAf8BNQHdAv8BPgHQ + Av8BNwHIAv8BNwHJAv8BRwHYAv8BQAGnAdgB/wQAAbUBOwEAAv8BrgFmAf8BtQE7AQAC/wHcAb4C/wHc + Ab4C/wHaAbkC/wHYAbUC/wHVAa8C/wHRAakC/wHOAaIC/wHKAZoC/wHIAZcB/wHlAVcBPgL/AcMBjgH/ + AbUBOwEAAf8DRAF8AbUBOwEAAv8BuAFuAv8BuAFuAv8BuAFuAv8BiAEfAf8BtQE7AQAC/wHVAa0C/wHS + AagC/wHQAaMC/wHNAZ4C/wHKAZkB/wHlAVoBQQL/AcUBkgL/AcUBkgH/AbUBOwEAAf8DQgF1AbUBOwEA + Av8BrgFmAv8BbwEMAf8BcAGjAbwB/wFCAZ0BzgH/AWABvQHoAf8BlwHaAfgB/wGPAcoB7QH/AZYB0wH0 + Af8BkQHUAfUB/wFdAboB5wH/ATgBlgHKAf8BQgFdAY0B/wHsAbQBgwH/AfUBVAEAAf8DRAF8BAABWQJc + AcwBXAGIAZ8B+AFPAXcBhwHzAUwBdwGHAfMBTAF3AYcB8wFNAXcBhwHzAU8BewGIAfMBTQF7AYgB8wFT + AXQBgwHxAVEBhAGaAfcBVgGqAdQB/wFYAZABvQH+AVMBhwGfAfgBWQJdAdIEAAG1ATsBAAL/AbsBiAH/ + AbUBOwEALf8BtQE7AQAB/wMlATcBtQE7AQAC/wHEAZAC/wHEAZAC/wHEAZAC/wGqAVYB/wG1ATsBAAL/ + AfYB7B3/AbUBOwEAAf8DLgFHAbUBOwEAAv8BuwGIAv8BbwEMBf8D/gH/Ab4B2AHrAf8BVQGnAdUB/wFX + AbAB3AH/AVoBtAHeAf8BRAGYAccB/wGZAbkB0AH/AfAB8QHyAf8D/AH/A/4B/wH2AVQBAAH/AyUBNwQA + AxABFQMcASgDGgEkAxkBIwMaASUDGwEmAxsBJgMbASYDEgEYA0gBhQG7AacBqAH/A2UB5QMuAUcDDQER + BAABtQE7AQAC/wHJAZ8C/wGyAWsB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEA + Af8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DKgFAAwQBBQG1 + ATsBAAL/AdIBqAL/Ac4BoAL/AdIBqAL/AdIBqAL/AZkBOgH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/ + AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wNAAXEDBwEKAbUBOwEAAv8ByQGf + Av8BsgFrAv8BbwEMAv8BbwEMAv8BbwEMAf8B/gFvAQwB/wH+AW8BDAH/AfwBbgEMAf8B/QFuAQwB/wH+ + AW8BDAL/AW8BDAL/AW8BDAL/AW8BDAH/AyoBQAMEAQUoAANIAYQB0wHAAb0B/wNhAdoDFQEdCAABtQE7 + AQAC/wHVAbUC/wHVAbUC/wHVAbQC/wHWAbUC/wHVAbMC/wHVAbMV/wG1ATsBAAH/AyoBQAMEAQUEAAG1 + ATsBAAL/Ad4BvgL/Ad4BvgL/Ad0BuwL/Ad4BvgL/Ad0BuwL/Ad0BuxH/AbUBOwEAAf8DKwFCAwcBCgMA + AQEEAAG1ATsBAAL/AdUBtQL/AdUBtQL/AdUBtAL/AdYBtQL/AdUBswL/AdUBsxX/AbUBOwEAAf8DKgFA + AwQBBRAAA0ABbgNYAbwDTgGYAxMBGggAAwgBCwNaAcUB3wHPAdAB/wNYAbwMAAG1ATsBAAL/AeABxwL/ + AeABxwL/AeABxwL/AeABxwL/AeABxwX/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7 + AQAB/wMdASoDBAEFAwIBAwQAAbUBOwEAAv8B5gHNAv8B5gHNAv8B5gHNAv8B5gHNAv8B5gHNBf8BtQE7 + AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wMdASoDBAEFDAABtQE7AQAC/wHgAccC/wHgAccC/wHg + AccC/wHgAccC/wHgAccF/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DHQEq + AwQBBQMCAQMQAAM2AVgBkQKJAfsBuAKkAf8DVgG2AyABLwMdASoDUgGnAc4BvgG/Af8BngKPAfwDNwFa + DAABtQE7AQAV/wG1ATsBAAH/AysBQgMHAQoDAwEEAwMBBAMCAQMDAAEBDAABtQE7AQAV/wG1ATsBAAH/ + AysBQgMHAQoDAwEEAwIBAwMAAQEQAAG1ATsBABX/AbUBOwEAAf8DKwFCAwcBCgMDAQQDAwEEAwIBAwMA + AQEcAANGAX8BsgKlAf8BxwK2Af8BjwJ/Af4BpAKWAf0B1ALEAf8BwwK5Af8DTAGPEAADAQECAbUBOwEA + Af8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wMdASoDBAEFAwIBAxwAAwEBAgG1ATsBAAH/ + AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DHQEqAwQBBSAAAwEBAgG1ATsBAAH/AbUBOwEA + Af8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DHQEqAwQBBQMCAQMvAAEBAzcBWgNbAcsBewJ0AfEBewJ5 + AfIDXgHQAzsBZQMBAQIQAAMKAQ4DHwEsAyUBNwMtAUYDOQFfA0IBdANIAYgDTgGXA1IBpgNWAbMDVwG9 + A0EBcxQAAx0BKQJaAVwBzQI9AZgB+QM9AWkYAAM3AVsCQgGJAfUCXQFiAdoDJQE3EAADCAELAzcBWgFc + AlkByQF5AUQBPQH0AZUBRAEjAfoBkwFBASMB+gF8AUIBNAH1AV0CWgHTAT8CPgFsAw0BEigAAwoBDgM2 + AVkDVQGxA1QBrgM0AVUDDAEQDAACWQFdAdIBMwFiAXkB9gE5AXABiwH4ASIBeQGWAfsBJAF/AbEB/gEf + AZ0B0wH/ASQBpgHeAf8BJwGxAecB/wEoAboB7QH/ASYBxgH1Af8BIwGsAfQB/wEfATYBfQH8A1QBrwMR + ARcIAAMeASsCWQFcAcwCIwHxAf8CDwH7Af8CJQGhAfsDPgFrEAADNwFbAjgBjQH2AkQB9wH/AlYB9QH/ + AlkBXwHXAyYBOAgAAxkBIwNWAbMBvQFCARUB/wHQAVcBFQH/AcsBSAEBAf8BwQE6AQAB/wG+AT8BAAH/ + AcIBRgECAf8BwQFCAQMB/wGyAS0BAQH/A1sByAMgAS8cAAMdASoDSAGIA1gB3QGGATkBTwH8AeQBbgGP + Af8BzAFzAYIB/wFwAk0B+gNTAaoMAAFBAZUBuwH5AaED/wGlA/8BngP/AZkD/wGMA/8BcAP/AV4D/wFL + AfwC/wE1AfkC/wErAd8B/QH/ARwBqwL/AQABSAHOAf8DWgHYAyoBQQQAAlwBYAHUAisB8wH/AgAB+gH/ + AgAB7AH/AgUB8QH/AiEBowH7Az4BawgAAzYBWQI2AY0B9gIvAe8B/wIwAewB/wJBAfYB/wJmAfcB/wJX + AWIB3wQAAxgBIgFgAlsB1gHXAWEBJAH/AdgBWgEPAf8BwAE8AQAB/wHIAVgBHgH/AdgBkAFZAf8BugFG + AQ0B/wGnAS0BAAH/AaoBNAEAAf8BuAE/AQAB/wHCAUABAwH/AWUBWAFXAeUDIwEzDAADBgEIAzsBZANX + AcIBZgJMAfMBuAFGAV0B/wHkAWkBjwH/Ae0BjwGpAf8B9wGJAaEC/wGgAaYB/wH3AaQBqAH/A1oB3gwA + AVQBbgF/Ae4BxAP/AcQD/wGzA/8BqQP/AZwD/wGKAfsC/wFsAfYC/wFaAfEC/wFIAfAC/wE1AdsB9wH/ + ARoBrgH7Af8BAAGpAv8BAgFxAecB/wNaAdMDCQEMAk4BewHyAiUC/wIAAfgB/wIAAesB/wIAAecB/wIA + AesB/wIxAZkB+AI5AToBYAMyAVECPgGHAfQCHgHpAf8CJAHmAf8CMQHqAf8COwH0Af8CbAL/AlEBlgH3 + AwcBCgFVAlMBrQHcAWgBKgH/AdoBWgELAf8BxAE7AQAB/wHEATwBAAH/AesBywGzAf8B+AH/Af4B/wHj + Aa0BjAH/Aa4BKAEAAf8BrAEyAQAB/wGlAS4BAAH/Aa8BNwEAAf8BwQE/AQMB/wFcAloBzQMPARQEAAMJ + AQwDWQHHAYkBRgFWAf4BzQFXAWsB/wHkAYMBmAH/AecBpwG1Af8B4AHHAcsB/wHaAckBzAH/AeoBhQGa + Av8BkwGaAf8B9wGcAaAB/wFbAloB2QwAAVoBZgF0AecBwgP/AccD/wG3A/8BrgP/AaQD/wGZAf4C/wGI + AfsC/wFqAfYC/wFYAfEC/wFGAe0C/wEzAeQC/wEgAewC/wEgAdwC/wFRAVkBZAHsAxYBHwMxA04BfQHy + AhoB+gH/AgAB8QH/AgAB5QH/AgAB3wH/AgAB4wH/AhUBtgH9AiEBmgH7AgsB4wH/AhYB3wH/AiMB5AH/ + AjEB7gH/AlUB+QH/AlIBigH0AzgBXgMtAUUBxAFSASEB/wHoAWoBGwH/Ac8BRAEAAf8BywFEAQAB/wHG + AT0BAAH/Ad8BnwFtAf8B7wHfAdAB/wHVAYUBSwH/AbQBMAEAAf8BsQE2AQAB/wGsATMBAAH/AaUBLgEA + Af8BtwE+AQAB/wGyAS0BAQH/AT4CPQFqBAADHQEqAYUBUQFSAfcB5gGVAaQB/wHlAb8BxQH/AeUB2gHb + Af8B5AHjAeEB/wHlAeQB4QH/AeEB0gHVAf8B6wGFAZkC/wGVAZsB/wH1AZcBnAH/AVsCWgHZDAABWgFg + AWQB3gHIA/8B0gP/AcED/wG4A/8BrgP/AaUD/wGZA/8BiAH7Av8BagH2Av8BWAHxAv8BRwHuAv8BNAHv + Av8BJwHiAv8BQAFMAXAB8wMhATEEAAMvAUoCUwF+AfECEwH1Af8CAAHqAf8CAAHfAf8CAAHXAf8CAAHb + Af8CAAHcAf8CCAHXAf8CFwHeAf8CJAHnAf8CQwH0Af8CSAGNAfYDNgFZBAADVAGvAeYBcgEvAf8B4gFV + AQAB/wHVAUkBAAH/AdIBSgEAAf8ByAE5AQAB/wHOAVsBHgH/AeUBsAGJAf8BvgE3AQAB/wG5ATkBAAH/ + AbUBOQEAAf8BsgE2AQAB/wGsATIBAAH/AaoBMwEAAf8BwAFBAQQB/wFdAlkB0gQAAxoBJQFwAUcBWQH1 Ae0B0wHXAf8B9AH6AfcB/wH1AfQB8wH/AfgC9QH/AvoB+QH/AfMB5gHqAf8B6wGEAZgB/wH+AZQBmgH/ - AfYBlgGbAf8BWQJXAdkMAAFZAV0BZAHSAcwD/wHaA/8ByQP/AcED/wG4A/8BrwP/AaQD/wGZA/8BiAH7 - Av8BbQH2Av8BXAHxAv8BSQHwAv8BOgHuAv8BLgFcAZEB+AMuAUgIAAMwAUwCSAGIAfICEAHwAf8CAAHg - Af8CAAHVAf8CAAHMAf8CAAHMAf8CAwHUAf8CGAHfAf8CNQHuAf8COQGXAfYDNwFbCAABcQFXAU8B6AHz - AYMBLgH/AeABUAEAAf8B2QFPAQAB/wHVAUkBAAH/Ac8BPwEAAf8B2QGFAU8B/wH0Ae8B6QH/AckBWAEc - Af8BvgE5AQAB/wG7AT4BAAH/AbQBOwEAAf8BsQE5AQAB/wGqATQBAAH/AcABRwEGAf8BgQE1ASoB9gQA - AxoBJQF7AUcBVQL1AdwB4BH/AfkB6wHwAf8B6QGCAZYB/wH+AZMBmQH/AfYBlQGZAf8BWQJXAdkMAAFZ - AlsBxAHOAfwB/gH/AeED/wHRA/8BygP/AcED/wG3A/8BrgP/AaQD/wGYA/8BiAH7Av8BbgH1Av8BXAHz - Av8BSQH3Av8BJwFwAaMB/AM6AWEMAAMqAUACOAGWAfcCBgHnAf8CIgHoAf8COgHqAf8COgHqAf8CLwHn - Af8CIQHnAf8CKQGkAfoCMAExAU0MAAGOAVIBPwH0AfgBhAEpAf8B4gFOAQAB/wHfAVEBAAH/AeEBbQEr - Af8B4QF2ATsB/wHfAZkBZwH/AfcB+AH2Af8B9AHuAegB/wHfAaYBgwH/AcsBUAESAf8BxAFGAQUB/wG2 - AT0BAAH/Aa0BNgEAAf8BvwFGAQQB/wGcAT0BHwH6BAADGgElAXsBRwFVAfUB9wHeAeIR/wH5AewB8AH/ - AecBggGVAf8B/QGTAZkB/wH2AZUBmQH/AVkCVwHZDAACVgFXAbYB0QH4Av8B8gP/AdoD/wHRA/8BygP/ - AcAD/wG4A/8BrgP/AaQD/wGYAf4C/wGIAfsC/wFuAfcC/wFbAf4C/wEnAYIBuAH+A0YBgAwAAzIBUAIm - AZoB+QI6AfQB/wKFAv8CjwL/Ao4C/wKHAf4B/wJPAfUB/wInAbMB/AM4AV0MAAGOAVUBPwH0AfsBggEl - Af8B6AFXAQAB/wHuAZcBWAH/Ae8BqQF2Af8B6wGbAWQB/wHeAY0BVQH/AeIBsAGTAf8B8AHjAdwB/wH8 - A/8B3gGmAYUB/wHPAVEBFAH/AcoBTQERAf8BtQE6AQAB/wHBAUkBBAH/AZwBQAEgAfoEAAMaASUBeAFF - AUwB9QH2Ad4B4RH/AfcB4gHoAf8B6wGBAZMC/wGYAZ4B/wH3AZUBmQH/AVoCWAHYDAABUgJUAaYB2QH4 - AfsB/wH2AfoB8gH/Ae0B/wH9Af8B3gP/AdAD/wHKA/8BwQP/AbcD/wGtA/8BpAP/AZgB/gL/AYgB+wL/ - AW4D/wEoAagB2gH/A04BmAgAAzcBWwI3AZkB9wJDAfoB/wKTAv8CoAL/ApYB/QH/ApUB/QH/Ap8C/wKW - Af4B/wJiAfsB/wItAasB+wM+AWsIAAFxAVgBUgHmAfwBkgE8Af8B+AGmAWYB/wH2AbsBlwH/AfIBrQGB - Af8B6gGbAWMB/wHjAYkBTgH/AeABdQE9Af8B1gF3AUYB/wH1Ae0B5wH/AfIB5AHaAf8BzwFhASsB/wHT - AVgBHQH/AccBSwEOAf8BzQFUAQ4B/wGBAUEBMwH0BAADGgElAXgBRgFMAfUB9gHfAeMF/wH9AfoB+wH/ - AfgB4AHjAf8B7wGuAbYB/wHgAXMBjwH/AeABaQGEAf8B/QGSAZYB/wH3AZMBmAH/A1oB1QwAAk8BUQGc - AT0BUgHbAf8BKAEqAcEB/wFeAWkBwQH/AdcC7QH/Ad4D/wHSA/8BygP/AcAD/wG3A/8BrgP/AaQD/wGa - A/8BjAP/ATcBvwHnAf8DVAGrBAADNgFZAjYBkwH2AlQB/AH/AqoC/wK0Av8CsAH9Af8CNQHsAf8CLgHq - Af8CqwH9Af8CswL/AqwC/wKBAf0B/wI0AbEB+wM+AWsEAAFTAlIBqAHvAakBbQL/AdUBswH/AfsBwAGY - Af8B8QGsAYAB/wHfAaQBggH/Ad0BqQGMAf8B5QGUAV0B/wHfAYQBRwH/AewB0QHCAf8B9gHwAewB/wHS - AW8BOwH/AdIBYAEmAf8B2AFdASEB/wHjAV0BGwH/AV4BWgFZAc4EAAMaASUBdwFHAVQB9QHtAcsBzwH/ - Ae8BxgHIAf8B4AGLAZIB/wHNAV8BbgH/AaoBSwFnAf8BbQFCAWwB/wFFATYBZgH/AZMBRQFeAf8B6AFn - AXMB/wFnAUcBSQHyAzkBXwMGAQgEAAJTAWYB4wEYARcB8wH/AgEB4wH/AgABwgH/AWsBdgHEAf8B7AH9 - AfsB/wHfA/8B1wP/AdED/wHJA/8BwgP/AbkD/wGuA/8BpQP/AUoB2QHyAf8DWAHAAzcBWgJCAYsB9AJf - Af0B/wK7Av8CyAL/AsQC/wJFAfQB/wIRAZsB+wIhAZYB+AJEAfEB/wLBAv8CxgL/Ar8C/wKUAf4B/wJE - AaIB+AI9AT4BagMpAT4BygFwAUIC/wHZAbQC/wHLAaYB/wHpAaUBcgH/AekBzwHBAf8B9gH1AfQB/wHW - AYgBVAH/AdsBiAFTAf8B9wHxAe0B/wHnAcoBuQH/AdMBaQEyAf8B1wFsATYB/wHuAXIBMAH/Ac8BSQEV - Af8DOwFjBAADGgElAXkCUQH0Ac0BYgFoAf8BrwFOAV4B/wGBAUYBaAH/AUUBRAGBAf8BGAE+AYUB/wEH - ATwBhgH/AQ8BTgGWAf8BNwGGAbYB/wGYAaoBvwH/AccBhwGeAf8BaQEvAUYB+wNAAXAEAAIrAb8B/AEq - ASsB8gH/AjwB6wH/AgAB3gH/AUEBRQHKAf8B9AH/AfQB/wHsA/8B0QP/AbgD/wGZAfUC/wFyAeoB/AH/ - AVcB2gH2Af8BQgG6AdoB/QEzAZwBzAH7ATMBeQGpAfYDSgGLAkMBhQH2AmYC/wLUAv8C3wL/AtMC/wJV - AfcB/wIvAYsB9AMzAVMDLQFFAjkBiAHyAloB9AH/AtIC/wLZAv8C1gL/AqoC/wJDAaMB+wMGAQgBUgJQ - AaMB6AGoAXIC/wHcAbgB/wH1Ab4BlQH/Ad4BqwGOAf8B8AHmAeMB/wHlAcoBuwH/AewB2QHRAf8B6gHa - AdIB/wHUAYcBVgH/Ad0BgQFGAf8B7QGKAUgB/wHsAW4BLgH/AVsCWQHDAw0BEQQAAxoBJQFkAUQBWQH1 - AUsBQwFrAf8BHAFHAXUB/wEAAVIBpAH/AQABVQGqAf8BFQFzAbwB/wE6AacB2gH/AVsB0wH1Af8BcQHy - Av8BgQH7Av8BjwHtAv8BXAFdAY4B+AMvAUoEAAIfAaAB+gIPAe4B/wEmASUB+AH/AREBDgHqAf8BPQFK - AboB/QFlAYsBogH0AVkBdwGKAewBWAFoAXMB4gFZAVwBXwHMA1YBswNQAZ0DRQF9AzkBXwMwAUsDIAEu - BAACWQFcAckCUwHtAf8CyQL/Au0C/wJhAfsB/wIuAZAB9gM2AVkIAAMvAUoCQQGGAfECbAH4Af8C6wL/ - At4C/wKLAfMB/wJaAWIB1QQAAxYBHgFdAlgBywHpAagBcwL/Ad4BuAH/AfYBwQGaAf8B4AGlAYMB/wHm - AbsBpAH/AeIBrwGUAf8B2gGOAVwB/wHsAZkBXwH/AfkBoAFgAf8B7AGBAT4B/wFmAVYBVAHeAx8BLQgA - A0UBfQFWAaQB3gH+ASkBmgHXAf8BCAFtAcEB/wEYAZwB4AH/ATkBvgHuAf8BWAHgAf4B/wFrAfAC/wFw - AekC/wFsAbcB4AH+AVgBcwGMAe8BVgJYAbkDLwFKCAACTwFQAZsCFwGhAfwBJwElAccB/gJWAWEB3AEw - AjEBTQMYASEDEQEXAwkBDCAAAxYBHwJZAVsBwwJSAesB/wJgAv8CMwGNAfYDNwFbEAADMAFMAkUBhgHx - AocB/QH/AoQB8gH/AlkBXgHMAx4BKwgAAxYBHgFVAlMBrQHOAXUBRgH/AfQBvAGRAv8ByAGbAf8B/QG9 - AY4B/wH9AbUBhQL/AbMBgAH/AfQBnQFgAf8B0AFhATAB/wFYAlYBvAMcASgMAAFXAWgBhAHrAZYD/wGD - AfoC/wEwAWwBsQH6AT4BewGzAfgBXQHpAv8BVQHFAfYB/wFGAXsBnwH1AlkBWwHEA0ABcQMRARdUAAMW - AR8CWQFbAcMCPgGDAfQCNQE2AVgYAAMwAUsCRwGEAfICWQFgAc8DHQEpEAADBwEJAy8BSgNWAbYBfwFY - AUoB7wGmAVwBQwH6AaUBVwFAAfoBhgFTAUcB8QFbAlkBxAM2AVkDCgEOEAADQwF3AVkBXAFiAc8BUgGI - Ab8B9wJIAUkBhwM7AWQBWQFdAWYB1wNLAY4DIQEwUAADOAFeAUoBWQGAAesCVQFXAboDOgFhA1gBxwNZ - AcwDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBzgNZAcMDNAFVDAADHAEo - A1QBqwMzAVI0AAMRARcDOAFdA04BmQNWAbMDVgG8A1YBuwNVAbIDTgGUAzQBVAMMARA8AAM0AVQBPAFY - AYcB7wEyAdEC/wFPAXUBlAHxA2UB7gPiAf8D3QH/A9oB/wPaAf8D2AH/AtsB2gH/At8B2gH/At0B2gH/ - AtgB1wH/A9UB/wPUAf8D0wH/A+AB/wOZAf8DVwG9CAADGAEhAVQBWwFSAeEBFAGAATkB/wFDAVABSAHt - AysBQygAAwEBAgNDAXcBZQFdAVcB5QGvAW8BTQH9AdEBawEhAf8B4AFyASIB/wHoAXYBJAH/AegBdAEl - Af8B2wFuASUB/wG6AVkBGwH/AXYBQgEeAfoBWAFWAVUB2QM4AV0UAAMjATMDRwGCAyABLgMBAQIDBgEI - AwwBEAMDAQQEAAMyAVEBPAFYAY0B7wEwAc0C/wFBAY0BtwH5AjwBPQFoA40B9wT/A/QB/wPzAf8C8QHz - Af8C+AHzAf8C8QHoAf8C3gHfAf8D3gH/AukB4QH/AvEB6AH/Au4B6gH/AuYB5wH/A/UB/wPGAf8DWQHD - BAADEgEZAVQBWwFSAeEBKAFSAQAB/wEoAYABWAH/AQABpgGoAf8BQwFPAUgB7QMtAUYkAAFQAk8BmwG9 - AX8BUgL+AeMBwgL/AdIBpQH/AegBawEHAf8B5wF1ASIB/wHwAYYBLwH/AfYBkgFGAf8B9QGaAVUB/wHw - AZgBVgH/AfIBlQFJAf8B0wFjARMB/wFWATgBJAH3AzsBZAwAAwQBBgNXAboB6AG4AboB/wFrAmEB5ANU - Aa4DXAHJAWECYAHeA1kBvgM/AW8BWgJcAc0BcwHoAv8BPgGTAboB+AM9AWkEAAOFAfYD+wH/A+oB/wLq - AesB/wLxAewB/wLUAdwB/wJLAdQB/wIpAecB/wJHAeQB/wJsAdcB/wKkAc0B/wPQAf8C5QHfAf8D7QH/ - A70B/wNWAcEDFAEbAVYBWAFVAdkBKgFXAQoB/wE/AVQBEwH/ATEBPwEAAf8BGgFyAVsB/wEAAZ4BpwH/ - AUABTAFHAe4DLQFGIAABrwF9AVIB+gH4AcgBkQH/AfYB2gG5Af8B7wHDAZgB/wHVAWwBGgH/AdYBkwFV - Af8B3gGdAWMB/wHgAZoBYAH/AdIBjAFTAf8B4AGTAVYB/wHtAaABYgH/AfUBjwE2Af8BzgFXAQAB/wNW - AbsMAAMzAVIBvwKUAfsB9gL6Af8BwAG5AboB/wHIAb0BswH/AeoB4QHRAf8B8AHnAdYB/wHaAdIBwwH/ - AZUBkAGHAf8BoQGeAZAB/wFfAWEBagHbAzsBYwgAA4cB9gP8Af8C7AHtAf8D7gH/AvgB6AH/AnUB2gH/ - AgAB+QH/AgAC/wIAAv8CGQL/AkgB9gH/AnYB2AH/AsQBzgH/AvUB7wH/A8AB/wNWAcEBVAFYAVQB3QEX - AUUBAAH/AUABSwERAf8BQwFSARcB/wFBAVUBLwH/AVwBaAEvAf8BJwGFAWEB/wECAZsBrAH/AUIBTgFI - Ae0DLQFGHAAB0wGfAX8B/gHzAc4BqgH/AfQB2wG+Af8B7AHEAZ8B/wHOAXcBNAH/AdoBoQFnAf8B3AGp - AYEB/wHcAaYBdwH/AdkBlwFcAf8B3QGNAUkB/wHfAZMBUAH/Ad8BjQE+Af8B0QFgAQMB/wNYAcAIAAMB - AQIDVQGwAfUB3gHgAf8BxAHFAcYB/wHNAccBugL/AfYB3AL/AfMB2wL/AfIB2wL/AfgB4QH/AfkB7QHW - Af8BmQGUAYEB/wNEAXoMAAOIAfYD/QH/Au0B7gH/AvUB8QH/AusB4gH/AkYB4QH/AgAB/gH/AgAC/wIA - Av8CAAL/AgkC/wI8Af0B/wJ3AdYB/wPkAf8CxwHEAf8DVgHBAVgBWgFWAdsBKgFHAQUB/wE7AUABBwH/ - AUEBRwEqAf8CTAFVAf8BXgJsAf8BWAFpASsB/wEaAXQBXAH/AQABlAGqAf8BPAFKAUYB7wMuAUgYAAHN - AZYBdQH+Af0B6wHZAf8B/QHuAd4B/wHyAdABrQH/AdsBlgFMAf8B2wGmAWwB/wHWAaUBcgH/AeIBrwGF - Af8B4gGlAWcB/wHcAZABRwH/Ad4BlQFLAf8B2wGLATEB/wHNAVwBAAH/A1YBvggAAzABTAGfAoIB9QHv - AeIB5QH/AcIBugG1Af8B+QHnAcoC/wHoAckC/wHhAb8C/wHgAb8C/wHkAcUC/wH0AdcB/wHQAccBrgH/ - A1oB2AE2AjUBWAMQARUEAAOJAfYC/gH9Af8C8gHwAf8C+AHyAf8C6AHjAf8CRQHkAf8CAAL/AgAC/wIA - Av8CAAL/AgAC/wIDAv8CNwHpAf8CywHfAf8CzgHEAf8DVgHBAxABFgFYAVsBVwHWATMBVAEQAf8BbAFo - AVgB/wFWAVMBVgH/AlABVQH/AVsBaQFqAf8BUQFoASYB/wEpAYYBZwH/AQABjAGfAf8BQAFKAUIB7gMr - AUMUAAHIAacBZwH9Af8B7QHYAf8B/AHrAdsB/wH+AeQByQH/Ae8BuwGIAf8B7AG2AYAB/wHUAaMBagH/ - AdYBrAGDAf8B5wG0AYEB/wHxAaoBXAH/AeYBoAFSAf8B2wGNATQB/wHNAV0BAAH/A1YBvgQAAwcBCgNV - Aa0B+QHWAdMB/wHnAdUB1gH/AdQBxgG7Av8B3wG2Av8B0wGkAv8B0AGeAv8BzgGdAv8BzwGhAv8B4QG4 - Af8B5AHQAbEB/wGTAYQBdwH/AcwBkQGJAf8BXQJYAcsDKQE+A4kB9gP9Af8C7QHvAf8C9wHzAf8C8QHq - Af8CagHlAf8CBgH9Af8CAQL/AgAC/wIAAfsB/wIAAfgB/wIAAfUB/wJKAd8B/wPqAf8CygHGAf8DVgHB - BAADDwEUAloBWQHVATsBYQEcAf8BbgFvAVkB/wFmAWIBZgH/AWMBYQFrAf8BXgFpAWQB/wE6AWIBAgH/ - AR0BgAEtAf8BAAGbAW0B/wFCAVABSgHtAy4BSBAAAcgBpwFmAf0B/wHrAdYB/wH9AewB2gH/Af0B5wHQ - Af8B4QG7AZMB/wHnAbwBjwH/Ad4BsQGDAf8B0gGyAZIB/wHYAa0BgAH/AeQBmwFLAf8B4AGXAUgB/wHf - AYYBIwH/Ac8BXgEAAf8DVgG+BAADLgFHAagBiAGHAfcB/wHqAd4B/wHnAc8BzAH/AdIBvwG2Av8BzwGe - Af8B/gHLAZgB/wH+Ac0BoAL/AdEBowL/Ac4BnAL/AdUBnwH/Ad0BtwGOAf8BjwGNAYoB/wH6A/8B6gGo - AaQB/wFAAj8BbwKNAYsB9gLnAfwB/wKbAd0B/wLYAekD/wHxAf8CnQHmAf8CNgH8Af8CGgL/AhMB8gH/ - AnIB4QH/AqEB3wH/AqwB3gH/At8B4QH/AvkB9AH/A8YB/wNWAcEIAAMKAQ4BWAFbAVcB1gE3AWQBFQH/ - AXMBdAFdAf8BcAFtAW8B/wE6AV0BHgH/ATwBaQEcAf8BWwGHASsB/wErAaQBaAH/AQABpwGrAf8BQgFQ - AUgB7QMtAUUMAAHKAagBZgH9Af8B6wHUAf8B/AHrAdsC/wHrAdMB/wHyAdYBtAH/AeIBwgGfAf8B5wHC - AZsB/wHYAbMBiwH/Ad0BqgFtAf8B4wGcAUwB/wHhAZoBSwH/AeABdQESAf8B0QFcAQAB/wNWAb4EAANX - AboB3AGwAagB/wHbAbIBqAH/AcsBoQGeAf8BtwGoAacB/wHzAcQBowL/AdIBqgH/AfwB2AG8Av8B3gHB - Av8B5AG/Av8B1wGkAf8BtAGPAWkB/wGgAaMBpQL/AfEB8AH/AWACXAHUAxgBIgKNAYsB9gL5Av8CxAHo - Af8CvgHaAf8C2AHqAf8ChwHwAf8CVQL/AiwB+wH/AoIB4gH/Av4B5wH/Av0B6wH/AvcB6gH/AusB6AH/ - A/QB/wPIAf8DVgHBDAADDwEUAlkBVgHXATsBagEZAf8BRQFoAR8B/wE6AWUBHwH/AWICZAH/AWgBgAGB - Af8BVgGJASoB/wEXAZgBVwH/AQABngGpAf8BQgFPAUoB7QMrAUMIAAHEAZIBbQH8Af8B6gHQAf8B/QHr - AdgC/wHmAcsB/wH+AdUBqQH/AfEBwwGbAf8B6QG1AYkB/wHiAZwBVQH/AfQBpgFWAf8B+AGpAVUB/wHn - AZ8BTQH/Ad8BdwEVAf8B0AFdAQAB/wNWAb4EAAFqAmEB5AHHAZ4BmwH/AeQByAHHAf8B8wLmAf8B1AHV - AdcB/wHEAbQBrAH/AfIByQGtAv8B3wHIAv8B3gHLAf8B+wHaAbwB/wHMAaYBiwH/AY4BgwGBAf8B5AHj - AeUB/wHRAakBqAH9A0ABcAQAA40B9gb/AfkB/wLbAeUB/wKNAdIB/wKGAfYB/wJhAv8CMAH2Af8CqwHn - Af8C/AHtAf8C7AHtAf8C6gHrAf8D6AH/A/YB/wPJAf8DVgHBEAADCgEOAVgBWgFWAdgBJQFsAQAB/wFy - AYgBWwH/AXIBaQFzAf8BVwFVAVwB/wFZAWsBaAH/AU0BiAElAf8BGwGZAV4B/wEAAZUBqwH/AUIBUAFK - Ae0DNAFVBAABxAGVAXAB/AH/AeoBzwH/AfkBzgGnAf8B+AHKAaQB/wHrAbwBmAH/AeUBuwGeAf8B6wHE - AaoB/wHuAcEBoQH/AeoBsgGLAf8B7wGoAW4B/wHvAZIBRAH/Ae0BgAERAf8B0QFgAQAB/wNWAb4EAAMt - AUYDUwGqAawBhQGDAfkB7wHDAcAC/wHpAecB/wHVAdQB1QH/Ab8BtAGvAf8BzgGyAaUB/wHQAa0BoAH/ - AbYBlgGLAf8BnQGRAZAB/wHVAckBywL/Ae0B6wH/AV8BWgFZAdIDEgEYBAADjQH2BP8D+AP/AfsB/wLG - AeIB/wKKAdsB/wKOAfYB/wKSAfAB/wLiAe4B/wL0Ae8B/wPtAf8D6wH/A+oB/wP3Af8DywH/A1YBwRQA - AwoBDgFYAVsBVwHWAT4BiAEgAf8BcwGHAV0B/wFcAVgBWwH/AUoBRwFSAf8BUgJeAf8BOQGFAQkB/wEf - AaABSgH/AREBlQE4Af8DUwGqBAABxQGXAW8B/AH/AcEBiQH/Ac8BiQFIAf8D3wH/Ac8B1QHbAf8BwQHG - AckB/wHgAeQB6AH/AdUB3AHiAf8BwQHMAdUB/wHRAdsB4AH/AdgBwAGyAf8B2QFrASoB/wHiAWkBDgH/ - A1cBvwgAAwcBCQMmATkDUAGeAYMBZQFkAe8B6wG3AbQB/wHrAdYB1QH/AdsB1wHWAf8B0gLXAf8BygGw - AbMB/wHnAb8BugL/AfIB6wH/AeoBsAGrAf8DRAF6CAADjQH2BP8D+QH/AvkB+AH/Av0B+gH/AssB4AH/ - AscB3AH/AvsB8gH/AvYB8wH/Au8B8AH/A+8B/wPtAf8D6wH/A/kB/wPNAf8DVgHBGAADEQEXAVkBXQFW - AdcBOwGMARwB/wFoAXQBUQH/AU8BRgFRAf8BSwFhAT4B/wFUAaUBLQH/ASgBnwEAAf8BVAFbAVQB4QMd - ASoEAAHIAYsBVgH8AewBlAE+Af8BrQFoATUB/wHFAbsBtAH/Ac8BywHIAf8B3gHmAeoB/wHcAeMB6AH/ - AbsBwAHEAf8BngGCAWsB/wGoAYABZgH/AaIBdgFqAf8BmwE+ARoB/wHpAW4BIwH/A1YBvhQAAyMBNANM - AZMBaAJfAdsB5gGwAa0B/wH6AeYB5AL/Ae0B7gH/AfwBwwG9Av8B3QHPAf8BZQFeAVoB3QMTARoIAAOQ - AfYE/wP7Af8D+QH/AvoB+QH/AvwB+wH/AqwBzwH/AroB1AH/AvkB9gH/A/EB/wPvAf8D7QH/A+sB/wP3 - Af8DzwH/A1cBwhwAAwcBCgFXAVsBVwHWATgBjQEbAf8BUQGAAS4B/wFlAa0BQwH/AUQBsAEtAf8BVAFb - AVQB4QMVAR0IAAFrAWMBWAHdAfUBsQFnAf8B3gGKATkB/wHSAWYBFAH/Ab8BZgEoAf8BygGxAaAB/wHI - AbUBqAH/AasBbgFKAf8BnwE0AQAB/wGbASQBAAH/AZcBJAEAAf8BzQFYAR8B/wG/AW4BLQH+A0EBcxwA - Ax0BKQFHAkYBgAFmAmEB2gHgAagBpwH/Af0BzgHMAf8B5wGdAZYB/wNAAXAMAAOZAfgU/wL4AfwB/wLz - AfoD/wH+Af8D/QH/A/wB/wP6Af8D+QX/A9MB/wNXAcIgAAMPARQBWQFeAVkB1QEqAZwBDAH/ASgBlgEZ - Af8BVgFaAVYB2QMWAR8MAAMlATcBcQFlAVoB4AHzAaoBWQH/AfMBnwFKAf8B6QGJATAB/wHVAXQBLQH/ - AcsBaQEoAf8BywFcARUB/wHKAV8BHwH/AdEBZgEnAf8B2wFyAS8B/wGiAWUBPQH4A0wBkygAAxoBJAFA - Aj8BbwFlAl4B2QFeAlkBzAMTARoMAANbAcsDswH+A7gB/QO4Af0DuAH9A7gB/QO4Af0DuAH9A7gB/QO4 - Af0DuAH9A7gB/QO5Af0DuwH+A3QB9QM7AWUkAAMNARIBVgFhAVYB3AFWAVwBVQHcAxABFhQAAw0BEgND - AXcCWwFZAcQBfAFpAVYB5wGeAXUBTAH0AbMBewFCAfgBowFzAUgB9gGJAWcBTwHuAWIBYAFYAdYBUQJP + AfYBlgGbAf8BWwJaAdkMAAFZAl0B0gHMA/8B2gP/AckD/wHBA/8BuAP/Aa8D/wGkA/8BmQP/AYgB+wL/ + AWoB9gL/AVkB8QL/AUYB8AL/ATcB7gL/ATcBXAGIAfgDLgFICAADMAFMAksBfQHyAg0B8AH/AgAB4AH/ + AgAB1QH/AgABzAH/AgABzAH/AgAB1AH/AhUB3wH/AjIB7gH/Aj8BjQH2AzcBWwgAAWgBVwFWAegB8wGD + ASsB/wHgAU0BAAH/AdkBTAEAAf8B1QFGAQAB/wHPATwBAAH/AdkBhQFMAf8B9AHvAekB/wHJAVUBGQH/ + Ab4BNgEAAf8BuwE7AQAB/wG0ATgBAAH/AbEBNgEAAf8BqgExAQAB/wHAAUQBAwH/AXkBOAExAfYEAAMa + ASUBcAFHAVgC9QHcAeAR/wH5AesB8AH/AekBggGWAf8B/gGTAZkB/wH2AZUBmQH/AVsCWgHZDAABWQJb + AcQBzgH8Af4B/wHhA/8B0QP/AcoD/wHBA/8BtwP/Aa4D/wGkA/8BmAP/AYgB+wL/AWsB9QL/AVkB8wL/ + AUYB9wL/ASoBbQGaAfwDOgFhDAADKgFAAjsBjAH3AgMB5wH/Ah8B6AH/AjcB6gH/AjcB6gH/AiwB5wH/ + Ah4B5wH/AikBngH6AjABMQFNDAABgwFSAUIB9AH4AYQBJgH/AeIBSwEAAf8B3wFOAQAB/wHhAWoBKAH/ + AeEBcwE4Af8B3wGZAWQB/wH3AfgB9gH/AfQB7gHoAf8B3wGmAYMB/wHLAU0BDwH/AcQBQwECAf8BtgE6 + AQAB/wGtATMBAAH/Ab8BQwEBAf8BlQFAASIB+gQAAxoBJQFwAUcBWAH1AfcB3gHiEf8B+QHsAfAB/wHn + AYIBlQH/Af0BkwGZAf8B9gGVAZkB/wFbAloB2QwAA1YBtgHRAfgC/wHyA/8B2gP/AdED/wHKA/8BwAP/ + AbgD/wGuA/8BpAP/AZgB/gL/AYgB+wL/AWsB9wL/AVgB/gL/AScBfwGyAf4DRgGADAADMgFQAikBkAH5 + AjcB9AH/AoUC/wKPAv8CjgL/AocB/gH/AkwB9QH/AioBrQH8AzgBXQwAAYMBUgFCAfQB+wGCASIB/wHo + AVQBAAH/Ae4BlwFVAf8B7wGpAXMB/wHrAZsBYQH/Ad4BjQFSAf8B4gGwAZMB/wHwAeMB3AH/AfwD/wHe + AaYBhQH/Ac8BTgERAf8BygFKAQ4B/wG1ATcBAAH/AcEBRgEBAf8BlQFDASMB+gQAAxoBJQFvAUUBTAH1 + AfYB3gHhEf8B9wHiAegB/wHrAYEBkwL/AZgBngH/AfcBlQGZAf8DWgHYDAABUgJUAaYB2QH4AfsB/wH2 + AfoB8gH/Ae0B/wH9Af8B3gP/AdAD/wHKA/8BwQP/AbcD/wGtA/8BpAP/AZgB/gL/AYgB+wL/AWsD/wEl + AagB2gH/A04BmAgAAzcBWwI6AY0B9wJAAfoB/wKTAv8CoAL/ApYB/QH/ApUB/QH/Ap8C/wKWAf4B/wJf + AfsB/wItAZ8B+wM+AWsIAAFpAlgB5gH8AZIBOQH/AfgBpgFjAf8B9gG7AZcB/wHyAa0BgQH/AeoBmwFg + Af8B4wGJAUsB/wHgAXIBOgH/AdYBdAFDAf8B9QHtAecB/wHyAeQB2gH/Ac8BXgEoAf8B0wFVARoB/wHH + AUgBCwH/Ac0BUQELAf8BeQFEAT0B9AQAAxoBJQFvAUYBTAH1AfYB3wHjBf8B/QH6AfsB/wH4AeAB4wH/ + Ae8BrgG2Af8B4AFwAY8B/wHgAWYBhAH/Af0BkgGWAf8B9wGTAZgB/wNaAdUMAAJPAVEBnAE6AU8B2wH/ + ASUBJwHBAf8BWwFmAcEB/wHXAu0B/wHeA/8B0gP/AcoD/wHAA/8BtwP/Aa4D/wGkA/8BmgP/AYwD/wE0 + Ab8B5wH/A1QBqwQAAzYBWQI5AYkB9gJRAfwB/wKqAv8CtAL/ArAB/QH/AjIB7AH/AisB6gH/AqsB/QH/ + ArMC/wKsAv8CgQH9Af8CMgGlAfsDPgFrBAABUwJSAagB7wGpAWoC/wHVAbMB/wH7AcABmAH/AfEBrAGA + Af8B3wGkAYIB/wHdAakBjAH/AeUBlAFaAf8B3wGEAUQB/wHsAdEBwgH/AfYB8AHsAf8B0gFsATgB/wHS + AV0BIwH/AdgBWgEeAf8B4wFaARgB/wFeAlwBzgQAAxoBJQFvAUcBVwH1Ae0BywHPAf8B7wHGAcgB/wHg + AYsBkgH/Ac0BXAFrAf8BqgFIAWQB/wFqAT8BaQH/AUIBMwFjAf8BkwFCAVsB/wHoAWQBcAH/AWcBSgFM + AfIDOQFfAwYBCAQAAlgBYgHjARUBFAHzAf8CAAHjAf8CAAHCAf8BaAFzAcQB/wHsAf0B+wH/Ad8D/wHX + A/8B0QP/AckD/wHCA/8BuQP/Aa4D/wGlA/8BRwHZAfIB/wNYAcADNwFaAkUBfwH0AlwB/QH/ArsC/wLI + Av8CxAL/AkIB9AH/AhcBlgH7AigBkAH4AkEB8QH/AsEC/wLGAv8CvwL/ApQB/gH/AkQBmgH4Aj0BPgFq + AykBPgHKAW0BPwL/AdkBtAL/AcsBpgH/AekBpQFvAf8B6QHPAcEB/wH2AfUB9AH/AdYBiAFRAf8B2wGI + AVAB/wH3AfEB7QH/AecBygG5Af8B0wFmAS8B/wHXAWkBMwH/Ae4BbwEtAf8BzwFGARIB/wM7AWMEAAMa + ASUBcwJSAfQBzQFfAWUB/wGvAUsBWwH/AYEBQwFlAf8BQgFBAYEB/wEVATsBhQH/AQQBOQGGAf8BDAFL + AZYB/wE0AYYBtgH/AZgBqgG/Af8BxwGHAZ4B/wFiAS8BRgH7A0ABcAQAAisBuQH8AScBKAHyAf8COQHr + Af8CAAHeAf8BPgFCAcoB/wH0Af8B9AH/AewD/wHRA/8BuAP/AZkB9QL/AW8B6gH8Af8BVAHaAfYB/wFA + AbcB0QH9ATIBlgHCAfsBNgFzAZcB9gNKAYsCSAF7AfYCYwL/AtQC/wLfAv8C0wL/AlIB9wH/AjsBfwH0 + AzMBUwMtAUUCRAF9AfICVwH0Af8C0gL/AtkC/wLWAv8CqgL/AkMBmwH7AwYBCAFSAlABowHoAagBbwL/ + AdwBuAH/AfUBvgGVAf8B3gGrAY4B/wHwAeYB4wH/AeUBygG7Af8B7AHZAdEB/wHqAdoB0gH/AdQBhwFT + Af8B3QGBAUMB/wHtAYoBRQH/AewBawErAf8BWwJZAcMDDQERBAADGgElAV4BRAFZAfUBSAFAAWgB/wEZ + AUQBcgH/AQABTwGkAf8BAAFSAaoB/wESAXABvAH/ATcBpwHaAf8BWAHTAfUB/wFuAfIC/wGBAfsC/wGP + Ae0C/wJcAYUB+AMvAUoEAAIiAZoB+gIMAe4B/wEjASIB+AH/AQ4BCwHqAf8BQAFHAbcB/QFlAX8BkgH0 + AVkBbgF8AewBXAFjAWgB4gFZAlwBzANWAbMDUAGdA0UBfQM5AV8DMAFLAyABLgQAAlkBXAHJAlAB7QH/ + AskC/wLtAv8CXgH7Af8CMgGFAfYDNgFZCAADLwFKAkcBfgHxAmkB+AH/AusC/wLeAv8CiwHzAf8CWgFe + AdUEAAMWAR4BWwJYAcsB6QGoAXAC/wHeAbgB/wH2AcEBmgH/AeABpQGDAf8B5gG7AaQB/wHiAa8BlAH/ + AdoBjgFZAf8B7AGZAVwB/wH5AaABXQH/AewBgQE7Af8BYAFaAVgB3gMfAS0IAANFAX0BVgGeAdgB/gEm + AZoB1wH/AQUBagHBAf8BFQGcAeAB/wE2Ab4B7gH/AVUB4AH+Af8BaAHwAv8BbQHpAv8BbAGxAdoB/gFY + AWsBfgHvAVYCWAG5Ay8BSggAAk8BUAGbAhoBmAH8AScBJQHBAf4CWgFhAdwBMAIxAU0DGAEhAxEBFwMJ + AQwgAAMWAR8CWQFbAcMCTwHrAf8CXQL/AjYBgQH2AzcBWxAAAzADTAF+AfEChwH9Af8ChAHyAf8CWQFc + AcwDHgErCAADFgEeAVUCUwGtAc4BcgFDAf8B9AG8AZEC/wHIAZsB/wH9Ab0BjgH/Af0BtQGFAv8BswGA + Af8B9AGdAV0B/wHQAV4BLQH/AVgCVgG8AxwBKAwAAVkBZAF4AesBlgP/AYMB+gL/ATABaQGoAfoBPgF4 + AaQB+AFaAekC/wFSAcUB9gH/AUYBcAGSAfUCWQFbAcQDQAFxAxEBF1QAAxYBHwJZAVsBwwJBAXsB9AI1 + ATYBWBgAAzABSwJKAXsB8gJZAVwBzwMdASkQAAMHAQkDLwFKA1YBtgFzAVgBTQHvAaABVgFGAfoBnwFS + AUMB+gF+AVMBTwHxAVsCWQHEAzYBWQMKAQ4QAANDAXcBWQFcAV8BzwFSAYUBrQH3AkgBSQGHAzsBZAFZ + AV0BYAHXA0sBjgMhATBQAAM4AV4BUwFZAXYB6wJVAVcBugM6AWEDWQHHA1kBzANaAcoDWgHKA1oBygNa + AcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDXAHOA1kBwwM0AVUMAAMcASgDVAGrAzMBUjQAAxEBFwM4 + AV0DTgGZA1YBswNWAbwDVgG7A1UBsgNOAZQDNAFUAwwBEDwAAzQBVAFGAVgBewHvAS8B0QL/AVMBcAGG + AfEDYQHuA+IB/wPdAf8D2gH/A9oB/wPYAf8C2wHaAf8C3wHaAf8C3QHaAf8C2AHXAf8D1QH/A9QB/wPT + Af8D4AH/A5kB/wNXAb0IAAMYASEBWgFbAVgB4QERAYABNgH/AUwBUwFQAe0DKwFDKAADAQECA0MBdwFl + AV4BWwHlAawBaQFKAf0B0QFoAR4B/wHgAW8BHwH/AegBcwEhAf8B6AFxASIB/wHbAWsBIgH/AboBVgEY + Af8BcwFFASEB+gFbAVkBWAHZAzgBXRQAAyMBMwNHAYIDIAEuAwEBAgMGAQgDDAEQAwMBBAQAAzIBUQFG + AVgBfwHvAS0BzQL/AUEBigGtAfkCPAE9AWgDiAH3BP8D9AH/A/MB/wLxAfMB/wL4AfMB/wLxAegB/wLe + Ad8B/wPeAf8C6QHhAf8C8QHoAf8C7gHqAf8C5gHnAf8D9QH/A8YB/wNZAcMEAAMSARkBWgFbAVgB4QEl + AU8BAAH/ASUBgAFVAf8BAAGmAagB/wFMAVIBUAHtAy0BRiQAAVACTwGbAbcBfwFSAv4B4wHCAv8B0gGl + Af8B6AFoAQQB/wHnAXIBHwH/AfABhgEsAf8B9gGSAUMB/wH1AZoBUgH/AfABmAFTAf8B8gGVAUYB/wHT + AWABEAH/AVMBOwEwAfcDOwFkDAADBAEGA1cBugHoAbgBugH/AWQCYQHkA1QBrgNcAckDYAHeA1kBvgM/ + AW8BWgJcAc0BcAHoAv8BPgGLAawB+AM9AWkEAAN7AfYD+wH/A+oB/wLqAesB/wLxAewB/wLUAdwB/wJI + AdQB/wImAecB/wJEAeQB/wJpAdcB/wKkAc0B/wPQAf8C5QHfAf8D7QH/A70B/wNWAcEDFAEbAVkBWwFY + AdkBJwFUAQcB/wE8AVEBEAH/AS4BPAEAAf8BFwFvAVgB/wEAAZ4BpwH/AUkBUwFNAe4DLQFGIAABpgF6 + AU8B+gH4AcgBkQH/AfYB2gG5Af8B7wHDAZgB/wHVAWkBFwH/AdYBkwFSAf8B3gGdAWAB/wHgAZoBXQH/ + AdIBjAFQAf8B4AGTAVMB/wHtAaABXwH/AfUBjwEzAf8BzgFUAQAB/wNWAbsMAAMzAVIBswKRAfsB9gL6 + Af8BwAG5AboB/wHIAb0BswH/AeoB4QHRAf8B8AHnAdYB/wHaAdIBwwH/AZUBkAGHAf8BoQGeAZAB/wJf + AWMB2wM7AWMIAAN9AfYD/AH/AuwB7QH/A+4B/wL4AegB/wJyAdoB/wIAAfkB/wIAAv8CAAL/AhYC/wJF + AfYB/wJzAdgB/wLEAc4B/wL1Ae8B/wPAAf8DVgHBA1gB3QEUAUIBAAH/AT0BSAEOAf8BQAFPARQB/wE+ + AVIBLAH/AVkBZQEsAf8BJAGFAV4B/wEAAZsBrAH/AUsBUgFQAe0DLQFGHAABzQGZAX8B/gHzAc4BqgH/ + AfQB2wG+Af8B7AHEAZ8B/wHOAXQBMQH/AdoBoQFkAf8B3AGpAYEB/wHcAaYBdAH/AdkBlwFZAf8B3QGN + AUYB/wHfAZMBTQH/Ad8BjQE7Af8B0QFdAQAB/wNYAcAIAAMBAQIDVQGwAfUB3gHgAf8BxAHFAcYB/wHN + AccBugL/AfYB3AL/AfMB2wL/AfIB2wL/AfgB4QH/AfkB7QHWAf8BmQGUAYEB/wNEAXoMAAN9AfYD/QH/ + Au0B7gH/AvUB8QH/AusB4gH/AkMB4QH/AgAB/gH/AgAC/wIAAv8CAAL/AgYC/wI5Af0B/wJ0AdYB/wPk + Af8CxwHEAf8DVgHBA1oB2wEnAUQBAgH/ATgBPQEEAf8BPgFEAScB/wJJAVIB/wFbAmkB/wFVAWYBKAH/ + ARcBcQFZAf8BAAGUAaoB/wFGAU0BSwHvAy4BSBgAAccBkAF1Af4B/QHrAdkB/wH9Ae4B3gH/AfIB0AGt + Af8B2wGWAUkB/wHbAaYBaQH/AdYBpQFvAf8B4gGvAYUB/wHiAaUBZAH/AdwBkAFEAf8B3gGVAUgB/wHb + AYsBLgH/Ac0BWQEAAf8DVgG+CAADMAFMAZICewH1Ae8B4gHlAf8BwgG6AbUB/wH5AecBygL/AegByQL/ + AeEBvwL/AeABvwL/AeQBxQL/AfQB1wH/AdABxwGuAf8DWgHYATYCNQFYAxABFQQAA30B9gL+Af0B/wLy + AfAB/wL4AfIB/wLoAeMB/wJCAeQB/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wI0AekB/wLLAd8B/wLO + AcQB/wNWAcEDEAEWA1sB1gEwAVEBDQH/AWkBZQFVAf8BUwFQAVMB/wJNAVIB/wFYAWYBZwH/AU4BZQEj + Af8BJgGGAWQB/wEAAYwBnwH/AUkBUQFKAe4DKwFDFAABvwGnAWEB/QH/Ae0B2AH/AfwB6wHbAf8B/gHk + AckB/wHvAbsBiAH/AewBtgGAAf8B1AGjAWcB/wHWAawBgwH/AecBtAGBAf8B8QGqAVkB/wHmAaABTwH/ + AdsBjQExAf8BzQFaAQAB/wNWAb4EAAMHAQoDVQGtAfkB1gHTAf8B5wHVAdYB/wHUAcYBuwL/Ad8BtgL/ + AdMBpAL/AdABngL/Ac4BnQL/Ac8BoQL/AeEBuAH/AeQB0AGxAf8BkwGEAXQB/wHMAZEBiQH/AVsCWAHL + AykBPgN9AfYD/QH/Au0B7wH/AvcB8wH/AvEB6gH/AmcB5QH/AgMB/QH/AgAC/wIAAv8CAAH7Af8CAAH4 + Af8CAAH1Af8CRwHfAf8D6gH/AsoBxgH/A1YBwQQAAw8BFANaAdUBOAFeARkB/wFrAWwBVgH/AWMBXwFj + Af8BYAFeAWgB/wFbAWYBYQH/ATcBXwEAAf8BGgGAASoB/wEAAZsBagH/AUsBUwFRAe0DLgFIEAABvwGn + AWAB/QH/AesB1gH/Af0B7AHaAf8B/QHnAdAB/wHhAbsBkwH/AecBvAGPAf8B3gGxAYMB/wHSAbIBkgH/ + AdgBrQGAAf8B5AGbAUgB/wHgAZcBRQH/Ad8BhgEgAf8BzwFbAQAB/wNWAb4EAAMuAUcBngGFAYQB9wH/ + AeoB3gH/AecBzwHMAf8B0gG/AbYC/wHPAZ4B/wH+AcsBmAH/Af4BzQGgAv8B0QGjAv8BzgGcAv8B1QGf + Af8B3QG3AY4B/wGPAY0BigH/AfoD/wHqAagBpAH/AUACPwFvAoEBfwH2AucB/AH/ApsB3QH/AtgB6QP/ + AfEB/wKdAeYB/wIzAfwB/wIXAv8CEAHyAf8CbwHhAf8CoQHfAf8CrAHeAf8C3wHhAf8C+QH0Af8DxgH/ + A1YBwQgAAwoBDgNbAdYBNAFhARIB/wFwAXEBWgH/AW0BagFsAf8BNwFaARsB/wE5AWYBGQH/AVgBhwEo + Af8BKAGkAWUB/wEAAacBqwH/AUsBUwFQAe0DLQFFDAABwQGoAWAB/QH/AesB1AH/AfwB6wHbAv8B6wHT + Af8B8gHWAbQB/wHiAcIBnwH/AecBwgGbAf8B2AGzAYsB/wHdAaoBagH/AeMBnAFJAf8B4QGaAUgB/wHg + AXIBDwH/AdEBWQEAAf8DVgG+BAADVwG6AdwBsAGoAf8B2wGyAagB/wHLAaEBngH/AbcBqAGnAf8B8wHE + AaMC/wHSAaoB/wH8AdgBvAL/Ad4BwQL/AeQBvwL/AdcBpAH/AbQBjwFmAf8BoAGjAaUC/wHxAfAB/wFg + AlwB1AMYASICgQF/AfYC+QL/AsQB6AH/Ar4B2gH/AtgB6gH/AocB8AH/AlIC/wIpAfsB/wKCAeIB/wL+ + AecB/wL9AesB/wL3AeoB/wLrAegB/wP0Af8DyAH/A1YBwQwAAw8BFANZAdcBOAFnARYB/wFCAWUBHAH/ + ATcBYgEcAf8BXwJhAf8BZQGAAYEB/wFTAYkBJwH/ARQBmAFUAf8BAAGeAakB/wFLAVIBUQHtAysBQwgA + AbwBiQFqAfwB/wHqAdAB/wH9AesB2AL/AeYBywH/Af4B1QGpAf8B8QHDAZsB/wHpAbUBiQH/AeIBnAFS + Af8B9AGmAVMB/wH4AakBUgH/AecBnwFKAf8B3wF0ARIB/wHQAVoBAAH/A1YBvgQAAWMCYQHkAccBngGb + Af8B5AHIAccB/wHzAuYB/wHUAdUB1wH/AcQBtAGsAf8B8gHJAa0C/wHfAcgC/wHeAcsB/wH7AdoBvAH/ + AcwBpgGLAf8BjgGDAYEB/wHkAeMB5QH/AcgCqAH9A0ABcAQAA4EB9gb/AfkB/wLbAeUB/wKNAdIB/wKG + AfYB/wJeAv8CLQH2Af8CqwHnAf8C/AHtAf8C7AHtAf8C6gHrAf8D6AH/A/YB/wPJAf8DVgHBEAADCgEO + A1oB2AEiAWkBAAH/AW8BiAFYAf8BbwFmAXAB/wFUAVIBWQH/AVYBaAFlAf8BSgGIASIB/wEYAZkBWwH/ + AQABlQGrAf8BSwFTAVEB7QM0AVUEAAG8AYwBbQH8Af8B6gHPAf8B+QHOAacB/wH4AcoBpAH/AesBvAGY + Af8B5QG7AZ4B/wHrAcQBqgH/Ae4BwQGhAf8B6gGyAYsB/wHvAagBawH/Ae8BkgFBAf8B7QGAAQ4B/wHR + AV0BAAH/A1YBvgQAAy0BRgNTAaoBoQGCAYAB+QHvAcMBwAL/AekB5wH/AdUB1AHVAf8BvwG0Aa8B/wHO + AbIBpQH/AdABrQGgAf8BtgGWAYsB/wGdAZEBkAH/AdUByQHLAv8B7QHrAf8BXQFaAVkB0gMSARgEAAOB + AfYE/wP4A/8B+wH/AsYB4gH/AooB2wH/Ao4B9gH/ApIB8AH/AuIB7gH/AvQB7wH/A+0B/wPrAf8D6gH/ + A/cB/wPLAf8DVgHBFAADCgEOA1sB1gE7AYgBHQH/AXABhwFaAf8BWQFVAVgB/wFHAUQBTwH/AU8CWwH/ + ATYBhQEGAf8BHAGgAUcB/wEOAZUBNQH/A1MBqgQAAb0BjgFsAfwB/wHBAYkB/wHPAYkBRQH/A98B/wHP + AdUB2wH/AcEBxgHJAf8B4AHkAegB/wHVAdwB4gH/AcEBzAHVAf8B0QHbAeAB/wHYAcABsgH/AdkBaAEn + Af8B4gFmAQsB/wNXAb8IAAMHAQkDJgE5A1ABngF2AmIB7wHrAbcBtAH/AesB1gHVAf8B2wHXAdYB/wHS + AtcB/wHKAbABswH/AecBvwG6Av8B8gHrAf8B6gGwAasB/wNEAXoIAAOBAfYE/wP5Af8C+QH4Af8C/QH6 + Af8CywHgAf8CxwHcAf8C+wHyAf8C9gHzAf8C7wHwAf8D7wH/A+0B/wPrAf8D+QH/A80B/wNWAcEYAAMR + ARcBWQFdAVkB1wE4AYwBGQH/AWUBcQFOAf8BTAFDAU4B/wFIAV4BOwH/AVEBpQEqAf8BJQGfAQAB/wFa + AVsBWgHhAx0BKgQAAb8BggFRAfwB7AGUATsB/wGtAWUBMgH/AcUBuwG0Af8BzwHLAcgB/wHeAeYB6gH/ + AdwB4wHoAf8BuwHAAcQB/wGeAYIBaAH/AagBgAFjAf8BogFzAWcB/wGbATsBFwH/AekBawEgAf8DVgG+ + FAADIwE0A0wBkwFhAl8B2wHmAbABrQH/AfoB5gHkAv8B7QHuAf8B/AHDAb0C/wHdAc8B/wFiAV4BWgHd + AxMBGggAA4UB9gT/A/sB/wP5Af8C+gH5Af8C/AH7Af8CrAHPAf8CugHUAf8C+QH2Af8D8QH/A+8B/wPt + Af8D6wH/A/cB/wPPAf8DVwHCHAADBwEKA1sB1gE1AY0BGAH/AU4BgAErAf8BYgGtAUAB/wFBAbABKgH/ + AVoBWwFaAeEDFQEdCAABZAFfAVgB3QH1AbEBZAH/Ad4BigE2Af8B0gFjAREB/wG/AWMBJQH/AcoBsQGg + Af8ByAG1AagB/wGrAWsBRwH/AZ8BMQEAAf8BmwEhAQAB/wGXASEBAAH/Ac0BVQEcAf8BuQFuAS0B/gNB + AXMcAAMdASkBRwJGAYADYQHaAeABqAGnAf8B/QHOAcwB/wHnAZ0BlgH/A0ABcAwAA5MB+BT/AvgB/AH/ + AvMB+gP/Af4B/wP9Af8D/AH/A/oB/wP5Bf8D0wH/A1cBwiAAAw8BFAFaAV4BWgHVAScBnAEJAf8BJQGW + ARYB/wFZAVsBWQHZAxYBHwwAAyUBNwFmAWIBXQHgAfMBqgFWAf8B8wGfAUcB/wHpAYkBLQH/AdUBcQEq + Af8BywFmASUB/wHLAVkBEgH/AcoBXAEcAf8B0QFjASQB/wHbAW8BLAH/AZoBXwE+AfgDTAGTKAADGgEk + AUACPwFvAV8CXgHZAVwCWQHMAxMBGgwAA1sBywOtAf4DtQH9A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9 + A7UB/QO1Af0DtQH9A7YB/QO1Af4DbgH1AzsBZSQAAw0BEgFaAWEBWgHcAVoBXAFYAdwDEAEWFAADDQES + A0MBdwJbAVkBxAFvAWQBXAHnAY4BbQFRAfQBpAF4AUIB+AGTAWsBSAH2AXwBYQFUAe4CYAFbAdYBUQJP AZwDJwE6EAADIwEzA1YBuQNUAasDEQEXAxABFgMgAS4DAQECIwABAQMEBAUBBwMMARADHQEqAysBQwMv - AUkDJQE3AxYBHgMSARkDIAEuAy0BRQMyAVADMgFRAy4BSAMiATIMAAMGAQgDUAGkA1kBzwJaAVsBzgFP - AVcBaAHoAT0BWQF9AfIBVgFYAVsB4QNZAcwDWwHQA0gBhBgAAwQBBgM0AVQDVgGzAYEBZAFVAecBlQFl - AVgB7wGVAWYBWAHvAYEBXwFWAegBVwJWAbgDNgFZAwcBCRAAA10B0gG1ApoB/wF1AmAB/wNQAZ4DWgHb - A1YB5QMfASwgAAMDAQQDCgENAxEBFwFAAj8BbgFjAVwBVgHcAWkBWgFTAeQDWQHDA0IBdQM1AVYDRAF8 - AWACWQHXAagBbQFMAfcBsAF1AUEB+AFsAV0BVAHlA1QBqwNAAXEMAAMYASEBmgKWAfoB3gHOAcgB/wGt - AbEBzgH/AVcBwgH5Af8BZgHgAv8BhwGpAeAB/wHkAc4BwwH/AckCwgH/A1UBshQAAxIBGAFTAlIBqAH2 - AYoBWQH/AfABvwGrAf8B4wHGAcAB/wHVAcABvgH/AdMBvwG9Af8B5AHGAcAB/wHvAcABrQH/AfYBjwFe - Af8DVQGyAxgBIQwAAVsCWgHHAcgBswGyAf8BoAGHAYYB/QFfAVYBVAH7AW8CbAH/AV8CWQH+AVcCVgHf - A1kByQFaAlkBzQFaAlkBzQFaAlkBzQNbAdADWQHJA0UBfQMGAQgDIgExAzABTAMxAU0BXQFcAVoBzQH+ - AcYBpgH/AewB0AHFAf8B3AF/AUsB/gNSAakDSgGMAYQBYQFMAe4B9gHCAaUB/wHXAsYB/wHVAcUBxgH/ - Ae8ByAG0Af8BtwF2AUoB+gNOAZkIAAMEAQYDEAEWAz4BawNEAXkDQgF0AWgBgAGRAfMBdAGlAcoB/wNX - AcUDPwFtA0UBfQMhATADCQEMAwYBCAgAAxIBGAFbAlkBwwHzAakBhQH/Ac0BtgGuAf8BxgG8Ab8B/wHy - AeoB7QH/AcsBxgHIAf8BxgHCAcMB/wH0AewB7gH/AccBvgHCAf8ByAGyAa4B/wH0AbABjQH/AV4CWAHL - AxUBHQgAAw8BFANIAYQDVgG7AXoBfAF/Af4BdQGTAaAB/wF2AaMBrwH/AagBnwGtAf8BwQGOAZoB/wHO - AXMBgwH/AdYBaQFvAf8B4QF1AXcB/wHgAXIBdgH/AeABcgGBAf8BZQFCAUUB/QNEAXoDGgElAycBOwMn - ATsDSAGEAekBmwFjAf8ByAHFAdAB/wHqAbsBpAH/AV4BXAFaAc4BVgJVAbEB8QGvAYkB/wHGAcEBygH/ - AdwBvAGuAf8B4QG7AakB/wHEAbwBxAH/AesBvwGqAf8BYAJYAdEEAAFJAkgBiANcAecBWwJYAekBXAJX - Ad8BYQJcAdwDWwHZAZYBkAGPAfsBuAGiAZ4B/wFdAVcBVgHtA1sB2QFeAlgB3QNaAeQDYAHrA1sB4QM6 - AWIDCAELAVQCUgGmAfYBpQFsAf8B1gG9AcMB/wG0AbAB1gH/AtwB2QL/Af4B/AH/AfcC9QH/AvUB9AL/ - Af0B/AH/A90B/wHaAdMB1wH/AeAByAHFAf8B8wGlAXMB/wNVAbIDCgENBAADUgGoAWABZAFsAewBjQGX - AZ0B+wG0AeIB6wH/AbQB8wL/AasB/gL/AZQB9wH6Af8BkQHbAeQB/wGOAbMBwAH/AYYBgQGTAf8BawE7 - AT4B/AFoAk4B7wHQAlkB/wHeAXYBdwH/A1YBswcAAQEDBwEJAw8BFAFdAVoBWAHNAeIBwwG2Af8B0gHK - AdEB/wG3AXcBTQH6AX8BVAE+Ae4B4QHCAbUB/wHPAcYBzAH/AdIBfwFMAf4ByAFhATUB/QHXAcYBxQH/ - AdoBxQHCAf8BkwFnAUgB8gQAAZwCkAL5AvgB/wHhAt8B/wHcAtoB/wHZAtcB/wHKAscB/wHfAt4B/wHt - AusB/wH3AvQB/wH1AvIB/wH2AfMB9AH/Ae4B8AHsAf8BzAHsAdAB/wHRAc8BywH/A1YBuwMwAUsBzgFg - AUAB/QHNAaEBigH/AdgB1AHVAf8C1gH7Af8C0AH6A/8B/Qn/Af4C/QL/Av4B/wH+AvwB/wHZAdYB2gH/ - AcoBoQGOAf8B5wFvAT4B/wE2AjUBWAQAAXsBngGqAvoD/wHaA/8BrwHzAv8BjAHgAv8BiQHqAv8BhwH2 - Av8BkwH9Av8BngP/AZMB8wH+Af8BVAJXAd8DKQE+AZkCWgH7Ad8BcAFvAf8DVQGyAwABAQMKAQ0DHAEo - AzIBUAFMAksBkAHQAX8BWgH+AdMBzgHWAf8B4AG6AaYB/wHhAWQBHAH/AdsBwQG3Af8B1wHLAc8B/wGd - AWIBSAH2AY4BWwFDAfEB4AHIAcMB/wHYAsgB/wGzAWoBQQH5BAABtQKvAfwB7ALvAf8B1QLWAf8D2QH/ - AdcC2AH/AcsCzAH/AeEC4gH/AewC7QH/AuoB6wH/AeoC7AH/AewC7QH/AegB6gHpAf8B5gHvAegB/wHh - At4B/wNVAboDUgGpAesBkQFTAf8BywG2AbMB/wHaAd0B3gL/Av4B/wHFAcYB/AH/AtIB+hL/Av4B/wHd - Ad8B4QH/AcoBuAG3Af8B7QGVAVgB/wFYAlYBuQQAAYABlgGkAfcB3AP/AaIB6wL/AYAB3AL/AV0B0QL/ - AWUB3QL/AWEB5AL/AWwB6AL/AYUB9QL/AYwB+QL/AVQCWwHhAyABLgGgAlIB+gHdAXABcQH/A1UBsQMG - AQgDNwFaAWMBXAFZAdQBkwFkAUoB8wGRAV8BSQHzAccBYQEZAf4B4AG5AaYB/wHUAc8B1QH/Ae8BmQFc - Af8B4AG7AaoB/wHWAc8B1QH/AdMBfwFLAf4BxAFaAS4B/QHdAcwBygH/Ad4BywHIAf8BlQFfAUYB8wQA - AaICmAH5Ae4C8AH/AuYB5QH/A+YB/wPmAf8B6ALpAf8B5gLlAf8B7AHpAeYB/wHvAewB5gH/AukB5gH/ - A+MB/wHjAuIB/wLvAfAB/wHZAdQB1QH/A1QBrwFuAVoBVAHhAegBlgFcAf8B8wHsAe8B/wH+Af0E/wH+ - Af8C9wL/ArkB+wH/AtwO/wP+Av8C/gH/AfQB7QHyAf8B5wGYAWIB/wF5AVcBTwHoBAABXwGEAZMB8wGw - AfYC/wFyAdoC/wFLAcwC/wEyAcEC/wFTAdMC/wFAAdQC/wFKAdgC/wFcAeMC/wFlAewC/wFTAVkBXgHl - AykBPgGgAlMB+gHdAnAB/wNVAbEDKgFAAZgBWQE+AfUB4wHEAbYB/wHeAdcB3AH/Ad4B1gHbAf8B4AG4 - AaEB/wHjAZgBXwH/AdYBzwHTAf8B5wG/Aa0B/wHvAbUBlQH/AdMB0AHYAf8B5AHBAbEB/wHoAbwBpgH/ - AdQB0AHWAf8B6gHDAa8B/wFfAVwBWQHOBAABcwJsAeUE/wH8A/8B+QH9Af4B/wH0AfsB/QH/AfMB/AH+ - Af8B6wHpAesB/wHAAccB2gH/AawBtAHPAf8ByQHEAc8B/wLjAeAB/wHdAt4B/wHmAugB/wGzAq0B/wNI - AYcBhAFUAUcB7gHZAYUBSwH/AcUBwwHJAf8B8gHzAfQJ/wL0Av8BsAGqAcgB/wGxAacBowH/AeYB4gHf - Af8B+gL5Bf8B9gH1AfYB/wHHAcgBzgH/AdkBjAFXAf8BhgFWAUIB7wQAAVkBgAGSAfIBiQHrAv8BVAHQ - Av8BRwHLAv8BTQHOAv8BZwHZAv8BXQHbAv8BSgHWAv8BRwHYAv8BSwHlAv8BSwFZAWAB6wEsAisBQwGg - AVMBVAH6AdwBcAFxAf8DVQGxA1UBtQHfAbMBmQH/AdoB1wHgAf8B2wGxAZsB/wHcAbYBoQH/AdcB1gHf - Af8B6gG1AZgB/wHpAbsBpQH/AdcB0wHaAf8B8wGqAYAB/wHqAbwBpAH/Ad4B1wHbAf8B3gHYAd0B/wHp - Ac4BwgH/AcABZAFAAfsDOAFcBAADVwG6AesB4AHcAf8B4QHHAb4B/wHXAcoByAH/AdwBwgG6Af8B0QGj - AZkB/wFlAaMB3AH/AT8BtgHtAf8BIwHHAeoB/wEeAYMBzAH/AawBqAG8Af8B2QHSAc0B/wHaAtcB/wF6 - AncB/AMvAUoBggFUAUcB7gHbAYUBSQH/AckByAHMAf8B9gL3Bf8B7wLsAf8BzQHCAb4B/wG7AbABqwH/ - AZMBigGrAf8BtAGoAbYB/wHFAbkBtQH/AdICywH/A/EB/wHOAc8B1QH/AdwBjAFVAf8BgwFWAUUB7wQA - AVIBbAF7AeoBhgHdAf4B/wGJAeAC/wGFAdsB+wH/AW8BygHxAf8BWAG4AesB/wF2AdAB8gH/AYYB2wL/ - AYUB4wL/AWAB4AL/AVcBWgFfAdsDJAE1AaABVQFWAfoB3AFwAXEB/wNVAbEBdwFYAUwB6QHeAckBwgH/ - AeEB1gHXAf8BugFSASkB/QG+AWIBPwH9AeAB2gHdAf8B4wHGAboB/wH3AZ4BYQH/Ad0B1gHaAf8B5gHI - AbsB/wHUAW8BKwH+AY8BZwFLAfIBkwFnAU0B8gFhAlkBzwM1AVcDBwEJBAADSAGGAbwBoAGcAf8B4wF3 - ATcB/wHfAaMBcQH/AesBnwFsAf8B0wE5AQ8B/wFOAYQBtgH/AV4B3QL/AVkD/wEjAcsB+wH/AWYBgAG3 - Af8B4QHLAcQB/wHaAcgByQH/AWICVwHxAxUBHQFmAVcBVAHfAekBkAFOAf8B9AHrAe4B/wL5AfoB/wHS - AsoB/wG6AqwB/wHWAc8BzgH/AfsB+QH4Af8B6gHsAv8B7AHtAf0B/wHvAesB6AH/Ad8C2QH/AfkB+AH5 - Af8B9QHuAfIB/wHnAZIBVQH/AXYBVwFPAegEAAM1AVcDVQG1AVwBdQGGAe0BhgGlAbMB/wFyAYsBmAH/ - AWgBgwGUAf8BYwGTAakB/wFOAX8BogH+AUMBZQF9AfQCWgFdAcoDLwFKAx8BLAGYAVABUQH6AeIBcwF0 - Af8DVQG0AZMBXwFEAfMB4wHTAc8B/wHnAdcB1QH/AYwBXQE9AfMBkgFiAUAB9AHmAtsB/wHjAdEBywH/ - AeABaQEmAf8B5AG3AZ8B/wHgAeEB6gH/AdIBiQFtAf4DUwGqAzYBWQMVAR0DAwEECAADNAFUAZYBiQGP - Af4B7AGZAVcC/wHMAY4C/wHdAbcB/wHzAWABLgH/AY4BYAFqAf8BRgHEAf4B/wFOAfgB/QH/ASAB4QH6 - Af8BNAF0AdcB/wHgAcoBzQH/AcwCuAH/A1gB3QMGAQgBUgJQAaMB6gGMAUgB/wHPAa8BpwH/AboBtAG4 - Af8BzALCAf8B8wLxGf8B2wHfAeIB/wHIAa8BqAH/AesBjwFJAf8DVQG1DAADNgFZAX8BfgF3Af4BggF2 - AXQB/wGcAY0BhgH/AcUBpgGhAf8BhQF2AXsB/gFrAlkB9QFkAVYBVQHnA1oB2ANZAdcBqwFqAWgB/gHh - AoEB/wNQAZ0BdwFhAVMB5gHnAdQBzgH/AeYB3gHgAf8BwwFwATcB/gHFAXkBQgH+AeYB4AHkAf8B6QHT - AcoB/wF9AVQBQwHuAZsBYgFIAfYB5gHgAeIB/wHpAdQBzAH/AXQBXAFRAecDOgFhAyMBMwMIAQsIAAMa - ASUBfAFzAXsB9QHVAaMBjAH/Af0BtgFiAv8B5QGsAf8B+QGDATsB/wHCAWEBSAH/AWEBrwHKAf8BXQG1 - AZgB/wFaAbgBkAH/AUMBdwGLAf8BxQG3AbwB/wG4AqEB/wNWAbgEAAMtAUUBuQFiAUUB+wHTAZEBZAH/ - AdQBygHQCf8B/gL9Cf8D/QL/Av0B/wH+AvwB/wHaAdYB3AH/AdABlQFrAf8B2QF2AUIB/wMzAVMMAAM1 - AVUBdAFzAXIB/gFhAmMB/wFvAmsB/wG7AZ0BlwH/AfcBxQG8Af8B+wHEAb0B/wH5AcIBuwH/AfEBsQGr - Af8B6gGfAZkB/wHqAZMBkAH/AWcCWQHrAxwBKAFTAlIBqAHnAb8BpwH/AucB7gH/AecByQG6Af8B5wHK - Ab0B/wHnAegB7wH/AegBvAGgAf8BUQJQAZ8DTgGYAecBvQGlAf8B5wHrAfUB/wHiAakBhwH/AVICUAGk - AygBPAMMARAIAAMGAQgBYwJfAd0BuAGiAaMB/wFyAVoBnwH/AZYBdwGfAf8BlAFpAZsB/wFWATwBrwH/ - AVsBgwFQAf8BSgHDAVsB/wGWAfYBswH/AV0ByQFgAf8BcwGIAV0B/wGMAn8B/gM/AW0EAAMHAQkDUAGe - AesBowFoAf8B5wG3AaMB/wHXAc4B0gH/AdYB2AHaAf8B/gL8Af8B9QL0Af8B9ALzAv8B/QH+Af8B2gHc - Ad0B/wHWAc8B0gH/AeUBtwGmAf8B7AGmAWsB/wNTAaoDCQEMDAADHwEsA2oB+QFyAnEB/wFYAVoBWwH/ - A0oB9ANRAaIDVgG0A1wByQFmAmEB3gGAAXABbQHtAVsCWQHEAx0BKgQAAx0BKgF3AWEBWAHmAegBzgG8 - Af8B6ALjAf8B6AHiAeMB/wHoAcoBuAH/AXcBXAFRAeoDJQE3AxgBIgGVAWsBTAHzAekB2AHPAf8B6gHO - AbsB/wFfAlkB0gMcAScDBwEKDAADKgFBAk8BTgGXAk8BegHoAW4BcQH5Af8BnQGmAf4B/wEvATAB9gH/ - AR4BIwEyAfsBQQG9AVUB/wGiAf8BzgH/AYwB/wGwAf8BKAFnASAB/wNTAaoMAAMMARABVwJVAboB7AGw - AYAB/wHRAaUBkAH/AcgBsgGxAf8B8gHmAegB/wHKAcIBxAH/AcUBvQG/Af8B8wHoAeoB/wHKArYB/wHN - AaMBkQH/Ae4BtAGFAf8BWQJXAcIDEAEVFAADWwHLA9cB/wOTAf8DUAGjEAADBgEIEAADJAE2AVsCWQHE - AaoBagFHAfkBogFzAVEB+AFaAlcBxQMpAT4DBgEIAwABAQM9AWkBXgFaAVkBzAFeAlkBzAM7AWMDBwEK - AwEBAhQAA0MBdwFtAW8C/wHLAcwC/wFkAWIC/wEJAQ0BagH9ASkBeAEqAfoBYwGzAYYB+QFhAZMBcwHu - ATkBhwE8AfcDRwGDEAADDQESAlABTwGbAd8BnAFgAf8B7AG+AZwB/wHnAcIBrwH/AdkBtQGpAf8B1wGz - AagB/wHnAcIBrwH/AewBvgGdAf8B4QGgAWUB/wJSAVABowMTARoYAAMnAToDgwHxA14B2QMUARtwAAMQ - ARYCWAFwAd4CqQHmAf0CUwHQAfoCWQFiAdUDOwFkAyYBOAMSARkDKAE8AxYBHxgAAy0BRgNRAaIBaQFh - AVcB3wGJAXIBXgHuAYkBcgFfAe4BcQFjAVsB4QJTAVIBqAMwAUwDAgEDuAADIwEzA1kB7ANWAb4DEgEZ - CAADEQEXA1MBqgFpAVwBUgHqAXsBZgFNAfIBaQFdAVMB7QFZAlgBxwMqAUEEAAMJAQwcAANGAYEDVgG7 - A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNWAbYDVgG7AzwBaAwAAjkBOgFg - Ai8BgAH1AlYBYAHXA0oBiwMuAUgDGAEhAwcBCkAAAyYBOQNYAekB8gLnAf8B2gLQAf8DVwHCAxIBGQMR - ARcBYAFeAVoB2QH3AdgBqwL/Ad4BrQL/Ad0BrgL/AewBwgH/AegBzgGqAf8BYgFYAU4B7wNZAdIDWwHh - A1kBwwNQAZ0DPwFuAyABLgwAAb4BawE+Af0B8AGKASwB/wHtAXYBIQH/Ae4BdQEgAf8B7gFyARwB/wHu - AW8BFwH/Ae0BagENAf8B7QFlAQYB/wHtAWYBBQH/Ae0BYgEBAf8B7QFfAQAB/wHtAVwBAAH/AfIBWgEA - Af8B4wFYAQAB/wNZAcQMAAJRAVIBpwItAd4B/wIiAdUB/wIRAboB/wIEAaMB/wI+AW0B7gJVAVYBtANA - AXEDMgFRAxQBHDAAAycBOwNcAecB6gLfAf8B7ALiAf8B5gLZAf8B3ALVAf8DWQHEA1QBrgH6AbwBgAL/ - AdsBoQL/AcUBhgH/Af0BwgGEAf8B+AHCAYgC/wHdAakB/wHqAbUBhwH/Ab0BogGXAf8B4AHdAeAB/wHn - AeIB4wH/AdMBzAHNAf8BogGaAZsB/gFmAmUB9ANZAccDMQFPBAABzAF/AUYB/gH2AbcBigH/AfQBugGU - Af8B8gG3AY8B/wHyAbYBjwH/AfIBtQGNAf8B8wG0AYgB/wHzAbEBhQH/AfEBrgGAAf8B8AGqAXQB/wHw - AaoBcwH/Ae8BqQFyAf8B8wGsAXUB/wHvAXQBJQH/A1YBwQgAAwoBDQJaAV4BzgI7AfMB/wIsAewB/wIg - AeYB/wITAd4B/wICAc8B/wGXAZEBxQH/AbQBqwGwAf8BbQFnAZYB/wFaAVkBXgHZAlUBVgGxA0ABcSQA - AyQBNgNZAewB6QLcAf8B9QLtAf8B4QLYAf8B5ALZAf8B/AL3Af8BWgJYAe4BiAFfAUcB8wGuAV0BIQH/ - AeYBnAFKAv8BvgFiAf8B7QGkAU4B/wGuAVgBGgH/AeUBoQFUAf8B3gGWAU0B/wHNAZ8BdgH/Ac0BwgHB - Af8B7AHcAdgB/wHvAdkB1wH/AfAB3gHcAv8B/QH8Af8B4ALUAf8DVgG4BAABwQF9AUsB/gH/AfEB8wH/ - AZkB4AGwAf8BOwHHAVUB/wE6AcEBTwH/ASgBtQE3Af8BrAHdAbgB/wH9Ae8B9gH/AfkBtgGHAf8B+wGz - AYMB/wH6AasBcQH/AfUBrAGAAf8B6QHnAe4B/wHjAY8BWAH/A1gBwAgAAywBRAI3AZcB9gJDAfcB/wIy - AeoB/wImAeUB/wIVAeAB/wEgAR8B3QH/Ad0B1AHgAf8B9wHtAd4B/wHpAd4B2AH/Ad0B0gHMAf8BzAHC - AbwB/wJNAXYB+iAAAyQBNQFcAlkB7AHrAuQB/wH1Au0B/wHqAuIB/wH7AvgB/wH2AvQB/wFfAlsB7AMm - ATgBlAFfASsB/AGEATgBAQH/AdsBlgFIAf8B8gG5AWwB/wG3AXIBNAH/AWsBKAEAAf8BlQFHAQkB/wHJ - AYgBOwH/Ac8BnAFqAf8B5AHMAcQC/wHtAd8C/wHiAdEB/wH5AdUBxgH/AdgBwAG7Af8BagJnAegDKQE/ - BAABwgF/AU8B/gH/Ae8B8AH/AYUB3QGaAf8BHgHPATwB/wEXAcEBLQH/AQABqQEDAf8BlwHTAZsC/wLn - Af8B/QGwAWsC/wGxAW8C/wGhAVYB/wH8AZwBVAH/Ae0B4AHeAf8B5AGQAVYB/wNYAcAIAAI8AT0BZwIy - AeEB/wJBAfkB/wI2Ae0B/wIuAegB/wIXAeIB/wFOAUsB3gH/AfMB7AHfAf8B6AHfAdsB/wHiAdgB2gH/ - AegB3QHbAf8B7AHhAdwB/wJaAV0B0xwAAyQBNgFfAlcB6AHrAuYF/wH4AvYB/wH6AvYB/wHyAu8B/wFk - AmIB5wMnATsEAAGOAWUBQgH0AeABpwFfAv8B3wGzAf8BxwGmAYYB/wGfAXIBUgH/AZ4BcQFOAf8BhAFM - ASEB/wF1ATkBAwH/AagBbQFKAf8BaQJlAfQBcgJsAekBnQGTAZAB+AFyAWkBaAHtAVACTwGbAwoBDggA - AcABfwFTAf4B/wHvAe4B/wGHAeEBoQH/AScB3gFTAf8BIQHSAUQB/wEAAbgBGAH/AZcB1gGfAv8B6gHp - Af8B/gG2AXUC/wG8AYkB/wH+AawBZwH/AfwBogFdAf8B8AHkAeIB/wHkAZMBWQH/A1gBwAQAAwQBBgNR - AaICgwH0Af8BWQFYAfkB/wE1ATQB8gH/ASQBJQHsAf8BEQESAeYB/wGSAY8B4gH/AfoB8QHhAf8B5AHb - AdwB/wHjAdkB2gH/Ae8B5AHeAf8BwgG4AcYB/wNIAYUQAAMaASUDKgFBAzgBXANeAeUB7gLoDf8B8QLu - Af8BYgJgAekDJgE5CAADVgGzAe8BygGhAv8B+wH0Af8B+QH0Ae4B/wHsAdkBxgH/Ae0B2AHAAf8B5wHS - AboB/wHNAZEBVQH/AXIBUAE8Af4DRAF6AwMBBAMRARcUAAG9AX8BVwH+Af8B7wHrAf8BvAHuAccB/wGK - AeYBlAH/AYkB4wGPAf8BcAHZAXMB/wHGAekBxwL/AfEB8AL/Ac8BmQL/AdEBnAL/AcoBkwH/Af0BxwGU - Af8B9ALrAf8B4wGRAVoB/wNYAcAEAAMUARsBXQFcAW0B4QL5AfgB/wHoAeQB8QH/AcYBwAHvAf8BkAGN - AewB/wJHAegB/wHLAcUB5QL/AfcB4gH/AfMB6gHgAf8B7QHjAd0B/wH3AewB4wH/AZgBkAGwAf8DLAFE - CAADFgEfA1QBqwNkAecBbAJpAfABfwJqAfkB4ALWDf8B7wLrAf8BZAJjAewDIwEzDAADEQEXAWgBYQFc - AdwB+AHmAdMG/wH2AesB/wH7Ae0B3AH/AfcB2wG+Af8B4wG/AacB/wGrAacBrwH/AmsBbQH1AlwBXgHq - A1sB2QNZAcMDUgGmAzcBWgMDAQQEAAG8AX8BWgH+Af8B9gHmAf8ByAHHAfMB/wGUAYsB3gH/AZcBjgHe - Af8BlAGKAdkB/wHYAdMB7gH/AfUB9gH7Af8BmAGtAf4B/wGPAacB+wH/AYwBoQH6Af8BlgGmAfoB/wHv - AfAB9wH/AekBlQFVAf8DWAHABAADJgE5ApYBzwP/AfwB/wH5AfYB8gH/AfwB9wHvA/8B6wH/AdkB1AHo - Af8BPQE8AeYB/wFjAV8B4gH/AaABmgHgAf8ByQHCAdwB/wHvAekB4gH/AWIBXgFwAewDFgEfBAADFQEd - A1oB0wHHArgB/wHxAuUB/wH5AvEB/wH7AvQB/wHsAuUB/wHsAuUF/wHyAu0B/wFhAmAB6wMlATcUAAMJ - AQwDUAGeAXwBbwFlAeoB5AHNAb8B/wHiAb8BqQH/Ab4BXgEhAf8BxgGEAUQB/wHVAawBdAH/AcsBrAGL - Af8B0QG5AaIB/wHdAccBuAH/AdgByQHCAf8B0QHDAcUB/wFdAVsBWgHiAwwBEAQAAb0BfwFfAf4B/wH+ - AeoB/wFlAWoB3gH/AgABwwH/AgABtwH/AgABnwH/AZkBmAHTAf8B7gHwAv8BHgFeAfwB/wEMAVsB/QH/ - AQEBPwH8Af8BFAFAAfwB/wHpAesB+QH/Ae4BnQFYAf8DWAHABAADQwF4AsgB5gP/Af0B/wH2AvMB/wHz - Ae4B8QL/AfsB7QH/AawBpwHsAf8BHQEeAeoB/wIVAeQB/wEHAQgB3wH/AhAB3AH/ATQBMQHWAf8DVAGv - AwcBCQQAA1ABmgG8Aq8B/wHpAtoB/wHpAt0B/wH0AuoB/wHzAu4B/wH2AvQB/wHuAucB/wHmAt8B/wFh - AmAB4AMnATsgAAMuAUgBpgGgAaQB/AHUAbUBqAH/AbIBNAEAAf8BzAFVAQAB/wHPAWQBAAH/AdIBbwEH - Af8BzwFvAQoB/wHNAWcBCAH/Ab4BWwEYAf8B0AG4Aa8B/wNaAdUDAwEEBAABuwF/AWQB/gH/Af4B6AH/ - AWkBbgHoAf8CAAHfAf8CAAHSAf8CAAG4Af8BnAGbAdoB/wHuAfAC/wEyAYUB/QH/ASYBjAH9Af8BGgFl - AfwB/wElAVkB/QH/AeoB7AH8Af8B7AGdAVsB/wNYAcAEAAJZAVsBxwL6Af0C/wH9AfsB/wH4AfQB9QH/ - AfcB8wHyAv8B/AHvAf8BdwF1AfAB/wEuAS8B7gH/Ai8B6AH/Ah4B4QH/AgwB4QH/AgABxQH/Aj8BQAFu - CAADYQHuAdwCyQH/Ad0CzQH/Ab0CrwH/AZ8ClQH/Ad8C1AH/AfMC7wH/AfsC9gH/AXkCdAH0AzQBVCQA - AUcCRgGBAdcB2gHfAf8BvwGPAYQB/wGsASYBAAH/AcABSwEAAf8ByAFYAQAB/wHLAV0BAAH/AcoBWwEA - Af8BxwFPAQAB/wG9AUkBBQH/AcQBrAGmAf8DVQGyCAABugF/AWgB/gL/AewB/wGIAY0B6gH/ARYBGAHc - Af8BGgEcAdYB/wETARUBwwH/AawBrQHjAf8B8QH1Av8BSAGKAv8BPAGOAv8BMwFzAv8BQAFtAv8B7gHy - Av8B6wGdAV8B/wNYAcAEAAJZAYgB8gLtAfcB/wL5AfwD/wH+A/8B+QH/AfMB8AH1Af8BWgFZAfYB/wI2 - AfEB/wIxAeoB/wImAeQB/wIcAegB/wIaAZoB/AIwATEBTQgAAXoCbQH3Ae8C3AH/AcACsgH/A1UBtQM/ - AW8BogKZAf8B9ALrAf8B+ALxAf8BewJ3AfIDKgFBJAADVQGyAegB5wHoAf8BqQFVAUUB/wGyAS0BAAH/ - AckBWAEAAf8B2gFoAQAB/wHeAW4BAAH/AdABXgEAAf8BuwE8AQAB/wG1AUwBIgH/AbwCrgH/A0gBiAgA - AbUBfwFpAf4B+AHlAdgB/wHsAecB6wH/Ad8B1wHiAf8B3wHZAeQB/wHfAdgB5AH/Ae8B6QHrAf8B9gHu - AewB/wHiAdoB7QH/AeAB2QHtAf8B4AHaAe4B/wHjAd8B8AH/AfoB9AHyAf8B4gGTAV0B/wNWAcEEAAM4 - AVwCUAFSAaQCWgFdAcoBcgFzAZEB8wLDAd4B/wLOAfQB/wJyAv8CWAH+Af8CPwH3Af8CKQHrAf8CHQHq - Af8CWQFgAdQDEAEVCAADZAHsAcgCugH/A1UBsAMWAR4DVQGyAcACtAH/AegC3AH/AfAC5wH/AWsCaQHr - AxwBJyAAAwMBBANeAdkB3gHZAdwB/wGhATgBHQH/AcABQwEAAf8BzwFiAQAB/wHfAXIBAAH/AecBggEA - Af8B4AF1AQAB/wHJAVABAAH/AboBYAFCAf8BoQGZAZ4B/QM3AVoIAAHRAZ8BgwH/Af4BzgGYAf8B/QHI - AZIC/wHMAZEC/wHJAYwC/wHHAYkB/wH8Ab4BggH/AfkBtwF0Av8BvAFwAv8BuQFsAv8BtwFpAf8B/gGz - AWQC/wGxAWMB/wHvAZABPgH/A1kBxAwAAwcBCgMqAUEDOwFkAk8BUQGcAloBZgHeAlcBxQH/AmYB3wH/ - AmMB9AH/AkgB7gH/A1QBrwwAA0IBdANRAZwDHwEtA1UBsgHAArAB/wHeAswB/wHoAtoB/wHOAsEB/wNT - AaokAAMRARcBewJzAfMB0AG6Ab0B/wGRAQoBAAH/Aa8BJQEAAf8BugE9AQAB/wHEAUwBAAH/AckBUQEA - Af8ByAFRAQAB/wG7ATYBAAH/Ab4BbwFcAf8BggF3AYIB9wMhATAIAAF+AWQBYAHxAbIBfQFtAfwBoAFt - AV8B+wGgAWcBXwH7AaABZAFZAfsBoAFiAVQB+wGhAWEBTgH7AaEBXwFJAfsBoAFfAUQB+wGgAV8BNwH7 - AaABXwEyAfsBoAFfATIB+wGnAV8BMQH7AaQBUQErAfwDSAGGHAADFAEbAyIBMgNCAXUCVwFZAcICSgF7 - AfIDPgFrFAADUQGcAcUCtwH/Ae8C3QH/Ad4CywH/AcQCtwH/A2AB1AMVAR0kAAMwAU0BqwKiAf4B3AHO - Ac8B/wGdAk4B/wGtAVcBSgH/Aa4BWgFFAf8BrgFaAUEB/wGuAVoBPQH/AawBVQE5Af8BoQFBATQB/wHC - AZoBmAH/A2IB6QMHAQqMAANCAXYDZAHnAYECcQH3AWYCZAHsA04BmAMUARwoAAMiATEDXgHZA3YB7gF3 - AnkB7gKAAYIB8QOEAfMBiQGGAYkB9QGWAZIBlgH3AZoBkgGaAfkBnQGZAZsB+wG7AbYBtwH9A1YBuQgA - AzoBYQNYAccDWQHMA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAc4DWQHD - AzQBVUAAA04BmANZAcMDVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNW - Ab4DWQHEA0QBfAgAA0gBhAGXApUB8wGNAowB8AGNAowB8AGNAowB8AGNAosB8AGNAooB8AGMAooB8AGM - AooB8AGMAooB8AGaApcB8wNRAZwIAANlAe4D4gH/A90B/wPaAf8D2gH/A9gB/wHYAtcB/wPXAf8D1gH/ - A9UB/wPVAf8D1AH/A9MB/wPgAf8DmQH/A1cBvQwAAy4BRwFZAV0BYwHaAyUBNygAAZkBnQGfAf0BygHN - Ac8B/wHLAc0B0AH/AcsBzgHQAf8BygHNAdAB/wHKAc0BzwH/AckBzQHPAf8ByAHMAc4B/wHIAcwBzgH/ - AcgBywHNAf8ByAHLAc0B/wHIAcsBzQH/AcgBywHNAf8ByQHLAc4B/wGxAbUBtwH/A1sB0AMDAQQDLwFJ - A1IBpAHoAuMF/wH7AvkB/wH6AvcB/wH4AvQB/wH2AvAB/wHzAuwB/wHwAugB/wHyAusB/wHsAuUB/wNW - AbYDMQFNAwQBBgONAfcE/wP0Af8D8wH/AfMC8gH/AfEC8AH/AfAB8QHyAf8B7wHwAfEB/wHtAe4B7wH/ - AesB7AHrAf8B6wLsAf8B6QHqAewB/wHlAuYB/wP1Af8DxgH/A1kBwwgAAxsBJgE8AWIBggHvAQcB5AL/ - AVkBXAFgAdQoAAG1AbcBuQH9Ae0C8AH/AdkB2wHaAf8B2wHdAd4B/wHbAd0B3gH/AdsB3gHfAf8B2wHe - Ad8B/wHbAd4B4AH/AdsB3gHgAf8B2wHeAeAB/wHcAd4B4AH/AdsB3QHeAf8B2gHbAdwB/wHmAegB6QH/ - AeEB5gHpAf8DWAHLAz4BawGXApIB9QHdAtUB/wHeAtUG/wL9Af8B/AL4Af8B+gL1Af8B+ALxAf8B9QLt - Af8B8QLpAf8B9gLvAf8B4QLWAf8B3QLWAf8DlwH2A0QBegOFAfYD+wH/A+oB/wHrAuoB/wHqAesB6gH/ - AesB8AHxAf8B5gHpAeoB/wHhAeAB4gH/AeMB5QHnAf8B5wHsAe8B/wHhAeIB5QH/Ad4B3wHhAf8B3gLf - Af8C7AHrAf8DvQH/A1YBwQgAAw4BEwFJAWUBdgHoAQYB8QL/ATIBfgGkAfoCTAFNAZEDSQGHA0kBhwNJ - AYcDSQGHA0kBhwNJAYcDSQGHA0cBgAQAAaoBsQG1Af0BYwFlAWIB/wIiAQ0B/wIuAQ4B/wI8ARkB/wJR - ATEB/wJXATsB/wJZAT4B/wFWAVUBOgH/AUsBTAEuAf8BPgE/AR4B/wEyATMBGAH/ASgBJwESAf8CPAE2 - Af8BvwHGAcsB/wNaAcoDXgHOAfUC6QH/AdECyAH/AXACbgH/ArUBtAH/AcICwQH/AbwCuwH/AbwBuwG6 - Af8BugK5Af8BuQG4AbcB/wG7ArkB/wG1ArQB/wFwAm8B/wHJAsIB/wH4AuwB/wFgAl8B2QOHAfYD/AH/ - Ae0C7AH/Ae4B8AHyAf8B6QHsAe4B/wHaAcgBvwH/AdYBtwGnAf8B2QG+Aa4B/wHSAbYBpwH/AdABuQGw - Af8B1QG1AaMB/wHOAaoBlAH/AdYBzQHKAf8B7wHxAfMB/wPAAf8DVgHBCAADGwEmAUgBZwF/AesBAwHo - Av8BNAGbAcgB/wG7AbgBuQH/Ac0B2AHRAf8BywHVAdIB/wHJAdIB0AH/AcYB0QHOAf8BxAHPAc0B/wHB - Ac0BywH/AckB1QHXAf8BnQGkAagB/wQAAagBrQGyAf0BSgFNAUQB/wMAAf8CQAEfAf8CRwEiAf8BKQEo - AQAB/wI9AQsB/wI+AQ0B/wI7AQoB/wIxAQAB/wIkAQAB/wIcAQAB/wIRAQAB/wEgAR8BEgH/AbYBvQHC - Af8DWgHKA2oB5gHiAtAB/wHCArIB/wFaAVcBWAH/AV4BYgFpAf8BZQFqAXEB/wFkAWoBcgH/AWUBagFy - Af8BZQFqAXIB/wFkAWsBcwH/AWUBawFyAf8BYAFlAWwB/wFXAVUBVgH/AbkBrAGrAf8B4gLQAf8BdAJx - AesDiAH2A/wB/wHwAvIB/wHrAekB6gH/AdcBswGgAf8B6AG+AZUB/wH1AdEBogH/AfIB0gGnAf8B8wHQ - AaAB/wHrAcIBmQH/AfUBzQGhAf8B3gGoAXMB/wHTAcMBuwH/AfAB9AH3Af8DwQH/A1YBwQgAAykBPgEI - AX8BvwH8AQcB6gL/ASMBkQG3Af8BWQFwAUsB/wFVAYgBPQH/ATwBdwEbAf8BPQGDARoB/wFCAYUBIAH/ - AToBdQEdAf8BJwFlAQ4B/wFzAZ4BaAH/AakBrAG0Af8EAAGoAaoBsAH9AUQBRwFCAf8CNAElAf8C2wHV - Af8CvQG3Af8CKQEKAf8CJwEAAf8CJQEAAf8CHQEAAf8CJAEAAf8CJAEAAf8CIAEAAf8CFQEAAf8CJQEX - Af8BtAG7AcEB/wNaAcoBcgJuAe8BzgK5Af8BzgG/AcEB/wHYAcMBvAH/AeABpwGKAf8B5gGlAYAB/wHp - AaIBbgH/AekBnQFmAf8B6QGdAWYB/wHpAaEBbQH/AeYBpgF2Af8B4AGoAYsB/wHZAcEBugH/Ac4BwAHC - Af8BzgK5Af8BeQJyAfADiQH2A/4B/wHwAfQB9wH/Ad0BuwGrAf8B7gG3AYMB/wHyAcABhwH/Ad8BswGR - Af8B3gG/AaoB/wHeAbIBjgH/AfMBwQGJAf8B9wHIAZUB/wHUAaMBhgH/Ad4B3AHeAf8B8gH0AfUB/wPC - Af8DVgHBCAADHAEoARgBegGsAfoBBwHoAv8BIAGQAbUB/wFZAXYBUAH/AYMBpQFtAf8BXgGQAU0B/wFf - AZABTQH/ASEBaQEEAf8BHwFlAQcB/wEJAVMBAAH/AWIBkgFZAf8BqgGrAbUB/wQAAqgBrQH9AT8CQAH/ - AT4BPQEtAf8CgQFzAf8CqgGnAf8CkQGHAf8CHgEGAf8CkwGCAf8CUAE9Af8CFAEAAf8CGwEAAf8CGAEA - Af8CDQEAAf8CIAEXAf8BsAG3Ab0B/wNaAcoBgAJ+AfEB7QLkAf8C6wHxAf8B5QHRAcAB/wH5AYcBGgL/ - AW0BAAL/AW0BAAL/AW4BAAL/AW4BAAL/AW8BAAL/AW8BAAH/AfoBbQEAAf8B5wHEAaoB/wHsAfAB+AH/ - AeoC4AH/AX0CegHwA4kB9gT/AeoC5QH/AeUBqwGDAf8B9QGvAWcB/wHYAaoBjQH/AegB5gHoAf8C7QHr - Af8B5AHnAewB/wHbAa8BkgH/AfUBtQFzAf8B2QGiAXQB/wHbAdcB2AH/AfMB9wH4Af8CxQHEAf8DVgHB - CAADQgF1AQABuAHvAf8BBwHoAv8BIQGUAbYB/wGHAaEBgQH/AUABgwE0Af8BPAGDATEB/wE2AXQBJwH/ - ARIBWQEAAf8BEQFUAQEB/wEAAUcBAAH/AWEBkAFaAf8BqgGsAbQB/wQAAaUBqAGpAf0BRQFIAUYB/wMA - Af8CAwEAAf8CqAGlAf8CpQGdAf8CCAEAAf8CWAFNAf8CvQG6Af8CkQGJAf8CFQEBAf8CDgEAAf8CCAEA - Af8BGwEaARYB/wGtAbQBuQH/A1oBygN9AfAE/wHxAe4B8gH/Ad0B1QHPAf8B8AHAAWsC/wG3AUEC/wGm - AR0B/wH+AaIBEAH/Af4BoQEOAf8B/gGhAQ4C/wGfAQkB/wHwAZwBGQH/AdsBzQG9Af8B5AHjAegB/wHy - AusB/wGGAYMBhQHxA4kB9gT/AecB2gHWAf8B6gGpAW4B/wHrAacBYgH/AdoBwwG3Af8B8AHtAeYB/wHm - AbgBiQH/Ae0B5wHaAf8B2wHAAbMB/wHwAcIBmQH/AeYBuAGVAf8B2gHNAcgB/wH0AfgB+gH/A8YB/wNW - AcEEAAMKAQ0BWAFcAWAB1AEAAeEC/wEHAeAC/wEcAZUBwAH/AS8BXAFSAf8BNgGQATgB/wENAYEBDAH/ - ARABgQEPAf8BGAGCARYB/wEXAWsBEwH/AQABOgEAAf8BWgGJAVUB/wGsAa0BtQH/BAABogKoAf0BOwE+ - AUAB/wEPAQ4BDQH/AqwBpQH/Ar0BugH/AisBHAH/AggBAAH/AkgBQAH/Ar4BuwH/ApwBmAH/AhABAgH/ - AggBAAH/AQIBAQEAAf8BFgEXARUB/wGqAbIBtwH/A1oBygNmAeAB/wH7AfoB/wH4AfQB9QH/Ad8C2wH/ - AeABywGrAf8B/QHlAbsB/wH8AeABswH/AfsB2QGjAf8B/AHTAZYB/wH7AdABkAH/Af4BzwGIAf8B5AHA - AYgB/wHUAcsBygH/Ac0BzAG7Af8B4gHbAc8B/wFqAWkBagHoA4sB9gT/Ae4C6gH/AecBqwGAAf8B9gG0 - AW0B/wHUAZ8BdgH/AeMB4gHjAf8B6wHiAdAB/wHhAboBkwH/AdsBrQGLAf8B9wHTAbQB/wHeAa0BjgH/ - Ad8B2QHXAf8B9QH5AfoB/wPIAf8DVgHBBAADUQGgAQABmQHqAf8BAAHmAv8BBQHbAfYB/wE5AeYB/AH/ - AUIBpQHdAf8BTwGCAWsB/wGCAcQBdgH/AXUBvAF3Af8BdQG9AXYB/wGBAcIBggH/AUgBkQFIAf8BXQGM - AVkB/wGqAawBswH/BAABnwGmAagB/QEzATYBOAH/AXIBcQFwAf8DuAH/AgkBCAH/AwAB/wIZAQ0B/wKV - AY0B/wJMAUgB/wIDAQAB/wIGAQAB/wIGAQAB/wMAAf8BEwIVAf8BqAGwAbUB/wNaAcoDSQGHAcgCwgH/ - AfYB7wHuAf8B6gLlAf8BwwG0AasB/wHuAdwBzAH/Ae8B4gHUAf8B7AHiAdYB/wHrAeMB1wH/AeoB4wHW - Af8B6gHfAdAB/wHFAbYBrQH/AeAB1wHZAf8B7gHkAeMB/wHHAcABvwH/A04BmAONAfYE/wH3Af0B/gH/ - AeQBwAGsAf8B7wGsAW0B/wHxAboBhQH/AdgBpAGAAf8B2wG0AZsB/wHdAagBggH/AeUBxgGnAf8B5gGx - AY0B/wHdAbsBqAH/AegB7gHxAf8B9gL3Af8DyQH/A1YBwQQAAVcBWgFiAdUBAAHIAv8BAAHnAv8BBQH9 - Af4B/wFaA/8BigHuAf4B/wFnAYYBnwH/AbsB0gGwAf8BtwHPAbAB/wG4Ac8BsQH/AbkB0AGyAf8BtgHQ - AbAB/wGnAb4BoQH/AaQBpwGsAf8EAAGbAaIBpwH9ATQBOAE5Af8CYAFfAf8DvQH/AooBiQH/AjcBMgH/ - AwAB/wICAQAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ARIBEwEUAf8BpgGuAbMB/wNaAcoDBwEJAz0BaANY - AbkDYAHeAagBpQGmAf0B+QH3AfYB/wH1AfoB+QH/AfAB+gH4Af8B7AH6AfkB/wHoAfsB+QH/Ae8C+QH/ - AaUBnQGeAf4DYwHiA1oBvQNAAW8DCQEMA40B9gT/AfkB+gH7Af8B9QL2Af8B4wG5AaIB/wHsAa8BgQH/ - AfYBwAGRAf8B9gHBAZcB/wH1AcsBpwH/AegBsgGPAf8B3gG4AaQB/wHrAe4B8AH/AesB7QHuAf8B9wL2 - Af8DywH/A1YBwQQAASMBWAGRAfYBAAHHAv8BAAHqAv8BBAP/AVQD/wGUAfcC/wFkAYQBqgH/AtIBzQH/ - AdEB1gHRAf8BzwHUAdAB/wHNAdMBzwH/AcwB0gHPAf8B2QLgAf8BnAGfAaIB/wQAAZYBnQGjAf0BRQFI - AUkB/wITARIB/wOyAf8D0QH/AjYBNwH/Aw8B/wIDAQIB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ARABEQES - Af8BpQGtAbIB/wNaAcoMAAMOARMDWAHBBP8B+gP/AfUD/wHyA/8B7gP/AfkD/wFeAlwBzAMUARwMAAON - AfYE/wP5Af8B+QL7Af8B9wL7Af8B6wHbAdMB/wHnAcEBrgH/AeUBvAGlAf8B5QHBAa4B/wHoAdcB0AH/ - AfAB9AH3Af8B7gLwAf8B6wLqAf8D+QH/A80B/wNWAcEEAAFJAVcBcgHoAQABywL/AREBsQHMAfwBUwFl - AW0B4wFKAekB9wH/AYgB8gL/AlYBWAG7A0MBeANDAXgDQwF4A0MBeANDAXgDQwF4A0EBcgQAAZEBmQGe - Af0BVAFXAVgB/wEuAi0B/wNNAf8DSwH/AzcB/wNCAf8DPAH/AzAB/wIjASQB/wMZAf8DEQH/AQkCCAH/ - AR0CHgH/AaIBqgGvAf8DWgHKEAADUwGlA/0B/wH+A/8B+AP/AfUD/wHxA/8B+AP/A1UBshAAA5AB9gT/ - A/sB/wP5Af8B+AL5Af8B+AH9Af4B/wH1AfoB/QH/AfIB9QH4Af8B8gH2AfoB/wHzAfcB+gH/Ae8B8AHx - Af8D7QH/A+sB/wP3Af8DzwH/A1cBwgQAA1MBqgEAAckC/wEmAYkBqwH3AlIBUwGoATEBywHtAf8BYAHN - AewB/wMrAUIgAAGPAZcBnQH9AVIBVAFVAf8BPgI7Af8CQQFAAf8BPwI+Af8CRgFFAf8BRwJGAf8BSAJH - Af8CSQFIAf8BSgJJAf8CSAFHAf8CRQFEAf8BQgJAAf8BOwI6Af8BnAGkAaoB/wNZAcwQAANWAasD/QX/ - AfsD/wH4A/8B9QP/AfoD/wNXAbcDAwEEDAADmQH4HP8D/gH/A/0B/wP8Af8D+gH/A/kF/wPTAf8DVwHC - BAADOwFlASQBZwGdAfcBJQFqAZMB9gEbAWIBngH6AUYBaQF/Ae4CWgFhAdUDDQERIAABfwGHAY0B/gGP - AZcBmgH/AWYBagFtAf8BbQFyAXUB/wFsAXEBdAH/AWwBcQF0Af8BbAFxAXQB/wFsAXEBcwH/AWwBcQFz - Af8BbAFxAXQB/wFtAXABdAH/AW0BcgF1Af8BawFwAXMB/wF0AYEBhQH/AasBtgG8Af8DWQHHEAADVAGv - GP8DWAG7AwQBBQwAA1sBywOzAf4DuAH9A7gB/QO4Af0DuAH9A7gB/QO4Af0DuAH9A7gB/QO4Af0DuAH9 - A7kB/QO7Af4DdAH1AzsBZUAAAlkBWgHPAZEBlAGVAfsBhgGNAZMB+gGDAYoBkAH6AYYBjQGTAfoBhwGP - AZUB+gGKAZABlgH6AYwBkgGYAfoBjAGTAZgB+gGPAZYBmQH6AZABmAGaAfoBkgGYAZoB+gGTAZkBmwH6 - AZgBowGnAfwBcgF1AXcB8gM6AWIQAANRAZwBlQKTAfMBhwKGAe8BhwKGAe8BhwKGAe8BhwKGAe8BlQKT - AfMDUgGnAwEBAjAAAz8BbQEyAUgBpgH2AiEBIgExIAADBQEHAyMBMwM0AVQDJgE4AwwBEAMCAQNkAAMg - AS4DOgFhAzYBWQNFAX8DVgG7A1YBswNAAXADNwFaAzkBXwMcASgwAAM4AV4BPQGiAfgB/wJaAV0BygMX - ASATAAEBAwYBCAMLAQ8DQQFyAYICaAHvAV4CWAHZA1UBsgNIAYYDMgFRAxkBIwMNAREDCgEOAwcBCgMD - AQQIAAFZAlcBwgG+AYEBWQH7AaoBcgFOAfoBnwJ5AfoBoQF8AX0B+gGgAnsB+gGgAnoB+gGgAnoB+gGg - AnsB+gGgAXkBdwH6AbABewFmAfoBswF2AU0B+gG+AWUBRQH7AWACWwHQDAADAwEEA2AB3gJ/AX4B/gGG - AWcBZgH9AT4BbAG4Af8BOgG5AfMB/wE1AYgBzwH/AXcBcAF+Af4BjgGDAXEB/QFcAlYB/QNOAZccAAM5 - AWADSgGNAUkCSAGHAzcBWwQAAyABLgFMAWcBjgHuAUUBuQH0Af8BWQFaAVsByAMWAR4IAAMEAQUDJAE2 - A0QBeQNMAZIBdgJhAe4B/wH8Af0B/wH8AusB/wG+AaYBpwH9AWcCTQHyAVYCVAHfA1kBygNVAbIDUAGa - A0gBhQMzAVMDCwEPBAAB0gFzAUwC/wHEAV8B/wHvAZoBVgH/AdABxAHHAf8B0gLLAf8B0wHKAcsB/wHX - As4B/wHWAs4B/wHVAdAB0wH/AdQBwgG9Af8B/QG5AYwC/wGdAT4C/wGXAR8B/wHcAXcBQAH/EAADYwHf - Ab0BuQG4AfwBrAGlAaQB+gFhAagB0wH9AXEB5AL/AVsBtgHxAf8BmgGZAaUB+wHCAbcBtgH7AZMCkAH4 - A0ABcBgAA0gBiAF8AnoB+gGqAqMB/wGKAm0B/wFqAmkB+QJbAVkBwwMoATwDVAGvAVoB8AL/ASsBdAHE - Af8CRQFGAX4IAAMdASoBtQE+AQAB/wH0AVYBAAH/AbsBRwETAf8B8QHMAc0C/wLzAv8B9wH2Bv8B9AH1 - Af8B5wG9AbwB/wGgAVMBSwH/AWEBIAELAf8BVwEMAQAB/wGSATEBAAH/A1MBsAM2AVkEAAG7AXIBRAH8 - Af8BtgFZAf8B7QGUAVYB/wHUAcIBxAH/AdoBWAE9Af8B1wGgAZYB/wHbAdcB2gH/AdwBzgHNAf8B2wHT - AdQB/wHYAb4BugH/AfMBlAFhAf8B/gGOATYC/wGPASIB/wHFAWsBQAH9CAADEQEXAxUBHQMpAT8DMwFS - AygBPAFTAlUBsAGmAcIB3wH/AUoBTAFdAfMDOgFiAy0BRgMvAUoDGAEhAxUBHQMPARQMAAMpAT4BdAFu - AWcB8gG/AbsBsQH/AawBrQGmAf8BxgK6Af8BrgKUAf8BrwGaAZcB/wNeAdACVQFXAboBVAHFAe8B/gFX - AeoB/AH/AVoBWwFeAcgDCQEMBAABtQE+AQAC/wFsAQoB/wHvAWoBDwH/AbsBdgFrAv8B6AHmAv8B5wHo - Av8C7wL/AvYC/wL6Bv8C+wH/AfICzwH/AbMBZQFiAf8BdQE1ASMB/wGyAT0BAAH/A0kBiQQAAboBbgFB - AfwB/wG7AV8B/wHvAZsBXgH/Ad0B0QHSAf8B5gE4ARUB/wHhAZ0BkQH/AeUB7QHvAf8B5QHfAd0B/wLm - AegB/wHgAcoBxQH/AfIBggFMAf8B/QGNATYC/wGYASsB/wHEAWkBQAH9BAADSwGQA1wB5wFcAlUB6gFb - AlgB4wNbAeEDWgHeAWgBYwFhAfABzQG5AbUB/wF4AWgBZQH8AVoBWQFYAeQBXwFdAV4B4ANdAeIDXAHn - A2AB6wNYAeMDQAFwAxYBHwM3AVsDVQG1AYcBdgGhAf8BYAFbAYwB/wFcAV4BgQH/AboBuAG2Af8BvgGs - AasB/wG7AaYBpQH/AcIBrAGiAf8BRAFCAWsB9QE3AZUBxgH7AWAD/wFIAcYB9QH/AkYBRwGABAABtQE+ - AQAB/wH+AXYBGAH/AcoBXAElAf8B8QHDAbsB/wH8AdMBygH/AfcB0QHPAf8B2gGiAaUB/wHZAZ4BoQH/ - AasBVwFhAv8C9AL/AvUC/wH+Af0D/wH9Af8BuQFnAV4B/wG1AT4BAAH/A0wBkQQAAboBbgFAAfwB/wG8 - AWIB/wHwAaABZQH/AuYB6gH/AeUBlgGHAf8B5wHLAccB/wHtAfoB/gH/Ae0B8QH1Af8B7gH6Af4B/wHm - AdgB1AH/AfABZQE2Af8B/QGKATQC/wGcATMB/wHEAWgBQAH9BAABoAKSAfkB8gLwAf8B4gLgAf8B3QLb - Af8B3ALZAf8BzgLMAf8B0wLSAf8B5wLmAf8B7gLsAf8B8gLxAf8B8gLvAf8B9ALxAf8B5AHpAeIB/wHH - AeYBygH/AdABywHKAf8DVwHFA1YBswESAZYB4gH/AQoBkAHoAf8BAAGBAeoB/wEAAWoB6AH/AScBVwG8 - Af8BrwGlAZ8B/wHOAcABvgH/AcwBuAGyAf8BpwGaAbYB/wE2AXUBzQH/AUgB0AHyAf8BXAH5Av8BZAP/ - AUoBhAGrAfcDLAFEAbUBPgEAAf8B/gGHASoB/wHCAWwBWQH/AdUCmQH/AdYBnQGeAf8B1wGhAaMB/wHz - At4B/wH4AuwB/wG2AWcBbwH/Af0B5QHkAv8C7AL/AvMB/wH1Ac8BzQH/AY0BQgEtAf8B3gFOAQAB/wNL - AZAEAAG6AWsBPwH8Af8BwAFpAf8B8wGcAWAB/wHoAdIB0AH/AeoB6QHnAf8B6wHfAdwB/wHrAdkB1QH/ - AesB2QHWAf8B7AHhAdoB/wHnAcEBtQH/Ae8BSwEZAf8B/AGGAS8C/wGgATgB/wHEAWcBQAH9BAABvQK6 - Af0B7gLwAf8B0gLTAf8B1QLWAf8B1QLWAf8BwwLEAf8BzwLQAf8B9AH1AfQB/wHxAvIB/wHxAvIB/wHx - AvIB/wPzAf8B6QHuAeoB/wHcAe4B4AH/AeIB4AHfAf8DWQHHAVQBagF2AeEBPQGcAa4B9AEoAbYB1QH9 - ARkBsQHvAf8BEgGhAe8B/wFcAYYBqAH/AakBngGWAf8B0QLGAf8B2wHLAcYB/wG9AacBvgH/AUoBpgHg - Af8BXQH9Av8BXgH8Av8BXAH1AfwB/wFSAdsB8wH/AlcBWQHCAbUBPgEAAv8BlQE+Af8B2wFlASkB/wHL - AYwBhAH/AfABwgG/Av8B7gHrAv8B/QH8Bf8B+QLmAf8BuAFmAW4C/wHjAeIC/wHpAegB/wGzAWABXAH/ - AbMBcgFDAf8B8gFWAQAB/wNLAZAEAAG6AWoBPQH8Af8BxQFzAf8B/QGjAVcB/wH3AZkBUwH/AfgBmgFT - Af8B+AGXAU8B/wH4AZcBSwH/AfgBlAFIAf8B+AGUAUcB/wH5AY8BPwH/AfwBgQEtAv8BkQE1Av8BoAE8 - Af8BxAFlAUAB/QQAAbYCsAH8AeUC5gH/AdsC3AH/A98B/wPfAf8D4AH/AeEC4AH/A+AB/wPfAf8D4AH/ - A+AB/wPgAf8B4QHgAeEB/wHvAewB7wH/AeEC3QH/A1kBwwMMARADLwFJAVoBWAFdAeIBmwGPAZ4B/wF1 - AW0BiAH/AXUBbwF2Af8BnwKdAf8B1gLNAf8B5AHbAdkB/wH7AeIB2AH/AY8BlAHJAf8BTQHTAfAB/wGA - A/8BYgHgAfQB/wFRAVYBcQHmAjQBNQFVAbUBPgEAAv8BoQFTAv8BcgEPAf8B/AHPAakB/wHgAagBjgH/ - AcoBhgFzAf8B5QGsAakB/wH+AeAB3gL/AfwB+wH/AbkBawFyAv8B1gHNAf8B8gHBAbwB/wGCASwBIQH/ - AekBqgFrAf8B9gFXAQAB/wNLAY8EAAG7AWYBOgH8Af8BzgGTAf8B+AHYAb4B/wH4AdcBugH/AfcB1AG1 - Af8B9QHSAbMB/wHyAc8BsAH/AfEBzQGuAf8B8QHJAasB/wHvAckBqQH/AewBzAGtAf8B6AHEAakB/wH7 - Aa8BXgH/AcUBYQE9Af0EAAGOAosB9AH3AvgB/wPxAf8D8AH/Ae4C7wH/A+4B/wHsAu0B/wHqAusB/wPp - Af8D6AH/A+cB/wPlAf8D4wH/AesC7AH/Ac8CygH/A1UBsQE9Aj4BagEfAVQBpgH6ARIBYQHCAf8BFwFq - AdMB/wEMAVkBzgH/ASMBUQG8Af8BqAGgAaIB/wHkAdkB1AH/AfEB6QHqAf8BsAG2AdkB/wFZAWgBvgH/ - AS4BmgHZAf8BiAH+Av8BnQP/AVcBbgGHAe8CIQEiATEBtQE+AQAC/wGuAWkC/wFyAQ8C/wHcAb4C/wHc - Ab4B/wH+AdkBuAH/AeoBuQGdAf8BzQGJAXIB/wHbAZ0BmQH/AfoB0wHSAf8BvAFqAW4B/wG2AWoBYQH/ - Aa0BQgEvAf8B/AHBAYwB/wH2AVcBAAH/A0QBfAQAAbsBZAE3AfwB/gHTAZ4B/wH1AvgB/wH8A/8B/AP/ - AfwD/wH6Af0C/wH6AfsB/QH/AfoB9wH5Af8B+QL0Af8B+QHyAfMB/wHpAeYB6gH/AfIBswFsAf8BxgFg - ATkB/QQAAWYCYwHfCP8B+QL6Af8B9gL3Af8D8wH/Ae4C7wH/AeoC6wH/A+cB/wHiAuMB/wPeAf8B2QLb - Af8D1gH/Ad0C3gH/AagCogH/A0gBiAFUAWUBcAHdARsB3gL/ARAB1QL/AQABugL/AQABogL/AVIBmgHf - Af8ByAG0Aa4B/wHpAeAB3QH/Ae4B6QHwAf8BSQGMAdQB/wFbAcwB7wH/AYsB5wH3Af8BlwH9Av8BowP/ - AZgD/wJZAV4BzAG1AT4BAAL/AbsBiAL/AXIBDxX/AfIC5QH/AdICpQH/AaQBRQFOAf8BywGqAakB/wP2 - Bf8B9gFXAQAB/wMlATcEAAG7AWQBNwH8Af0B0gGcAf8B9gH1AfIK/wL8Av8B+QH2Av8B9wHyAv8B8wHu - Av8B8AHpAv8B8QHrAf8B8AHlAeQB/wHyAbMBagH/AcYBYAE3Af0EAANXAboB3wLVAf8B4wLZAf8B3ALT - Af8B2wLRAf8B2gLQAf8B1wLOAf8B1QLMAf8B1ALLAf8B0wLKAf8B0QLJAf8BzwLIAf8B0ALJAf8B1wLQ - Af8BeQJkAfsDNAFUAzIBUAM1AVYDVQG1AXMBkAGgAf8BpAHCAdoB/wHDAcoB0AH/AcsBvgG7Af8B8wHu - Ae0C/wH9Av8BhgGoAeEB/wF2AdsB8wH/AcQD/wG3A/8BSwGtAeIB/wE6AVwBkgH1AVQBVwFmAd8BtQE+ - AQAC/wHJAZ8C/wGyAW4C/wFyAQ8C/wFyAQ8C/wFyAQ8C/wFyAQ8C/wFyAQ8C/wFyAQ8C/wFyAQ8B/wH+ - AXIBDwH/Af4BcgEPAv8BcgEPAv8BcgEPAf8DKgFAAwQBBQQAAbsBYwE1AvwB0gGdAf8B9AHzAfEG/wH8 - AfsC/wH3AfYC/wH0AfEC/wHyAe0C/wHuAegC/wHuAecC/wHzAe8B/wHsAeUB5AH/AfABsgFrAf8BxgFd - ATYB/QQAA0wBkgG3AqEB/wHGArAB/wHBAqwB/wHCAq0B/wHDAq4B/wHEArAB/wHGArMB/wHIArYB/wHL - ArkB/wHOAr0B/wHRAsEB/wHZAssB/wHWAsMB/wFkAlcB8QMdASoIAAMsAUQBXAFRAUEB+AHsAeEB3AH/ - AeYB3QHbAf8B5QLaBf8B3wHZAdMB/wFBAUkBYAH7AVABqAHHAf0B0QP/AdED/wGNAccB6gH/A04BlAMB - AQIBtQE+AQAC/wHVAbUC/wHVAbUC/wHVAbQC/wHWAbUC/wHVAbMC/wHVAbMV/wG1AT4BAAH/AyoBQAME - AQUIAAG7AWMBNQH8AfsB0gGdAf8B8wHxAfAC/wL+Av8B+QH1Av8B9QHxAv8B8QHtAv8B7gHnAv8B7QHm - Av8B7wHpAv8B9gHzAf8B6wLlAf8B8QGzAW0B/wHHAV4BNwH9BAADPQFoAZwCiAH+AcoCtQH/AcYCsgH/ + AUkDJQE3AxYBHgMSARkDIAEuAy0BRQMyAVADMgFRAy4BSAMiATIMAAMGAQgDUAGkA1kBzwNcAc4BVgFX + AWUB6AFHAVkBdwHyA1sB4QNZAcwDWwHQA0gBhBgAAwQBBgM0AVQDVgGzAXQBZAFaAecBgwFiAVgB7wGD + AWMBWAHvAXIBXwFXAegBVwJWAbgDNgFZAwcBCRAAA10B0gG1ApoB/wFyAl0B/wNQAZ4DWgHbA1kB5QMf + ASwgAAMDAQQDCgENAxEBFwFAAj8BbgFhAVwBWgHcAWIBWgFWAeQDWQHDA0IBdQM1AVYDRAF8AV0CWQHX + AZ4BbQFRAfcBoQFyAUEB+AFlAV4BWAHlA1QBqwNAAXEMAAMYASEBkgKNAfoB3gHOAcgB/wGtAbEBzgH/ + AVQBwgH5Af8BYwHgAv8BhwGpAeAB/wHkAc4BwwH/AckCwgH/A1UBshQAAxIBGAFTAlIBqAH2AYoBVgH/ + AfABvwGrAf8B4wHGAcAB/wHVAcABvgH/AdMBvwG9Af8B5AHGAcAB/wHvAcABrQH/AfYBjwFbAf8DVQGy + AxgBIQwAA1kBxwHIAbMBsgH/AaABhwGGAf0BXwFWAVQB+wFsAmkB/wFfAlkB/gNXAd8DWQHJA1oBzQNa + Ac0DWgHNA1sB0ANZAckDRQF9AwYBCAMiATEDMAFMAzEBTQJcAVoBzQH+AcYBpgH/AewB0AHFAf8B1gF/ + AUsB/gNSAakDSgGMAXkBYQFTAe4B9gHCAaUB/wHXAsYB/wHVAcUBxgH/Ae8ByAG0Af8BrAFzAU0B+gNO + AZkIAAMEAQYDEAEWAz4BawNEAXkDQgF0AWIBdwGEAfMBcQGlAcoB/wNXAcUDPwFtA0UBfQMhATADCQEM + AwYBCAgAAxIBGAFbAlkBwwHzAakBhQH/Ac0BtgGuAf8BxgG8Ab8B/wHyAeoB7QH/AcsBxgHIAf8BxgHC + AcMB/wH0AewB7gH/AccBvgHCAf8ByAGyAa4B/wH0AbABjQH/AVsCWAHLAxUBHQgAAw8BFANIAYQDVgG7 + AXoBfAF/Af4BcgGTAaAB/wFzAaMBrwH/AagBnwGtAf8BwQGOAZoB/wHOAXABgwH/AdYBZgFsAf8B4QFy + AXQB/wHgAW8BcwH/AeABbwGBAf8BXwFAAUIB/QNEAXoDGgElAycBOwMnATsDSAGEAekBmwFgAf8ByAHF + AdAB/wHqAbsBpAH/AV4CXAHOAVYCVQGxAfEBrwGJAf8BxgHBAcoB/wHcAbwBrgH/AeEBuwGpAf8BxAG8 + AcQB/wHrAb8BqgH/AV0CWAHRBAABSQJIAYgDXAHnAVsCWAHpAVwCVwHfAWECXAHcA1sB2QGTAY0BjAH7 + AbgBogGeAf8BXQFaAVkB7QNbAdkBXgJYAd0DWgHkA2AB6wNbAeEDOgFiAwgBCwFUAlIBpgH2AaUBaQH/ + AdYBvQHDAf8BtAGwAdYB/wLcAdkC/wH+AfwB/wH3AvUB/wL1AfQC/wH9AfwB/wPdAf8B2gHTAdcB/wHg + AcgBxQH/AfMBpQFwAf8DVQGyAwoBDQQAA1IBqAFgAWQBZgHsAYoBlAGXAfsBtAHiAesB/wG0AfMC/wGr + Af4C/wGUAfcB+gH/AZEB2wHkAf8BjgGzAcAB/wGGAYEBkwH/AWgBOAE7AfwBZAJSAe8B0AJWAf8B3gFz + AXQB/wNWAbMHAAEBAwcBCQMPARQBXAJaAc0B4gHDAbYB/wHSAcoB0QH/AawBdAFNAfoBdgFUAUgB7gHh + AcIBtQH/Ac8BxgHMAf8BzAF/AUwB/gG/AVsBOAH9AdcBxgHFAf8B2gHFAcIB/wGIAWcBSwHyBAABkgKM + AvkC+AH/AeEC3wH/AdwC2gH/AdkC1wH/AcoCxwH/Ad8C3gH/Ae0C6wH/AfcC9AH/AfUC8gH/AfYB8wH0 + Af8B7gHwAewB/wHMAewB0AH/AdEBzwHLAf8DVgG7AzABSwHFAVoBQAH9Ac0BoQGKAf8B2AHUAdUB/wLW + AfsB/wLQAfoD/wH9Cf8B/gL9Av8C/gH/Af4C/AH/AdkB1gHaAf8BygGhAY4B/wHnAWwBOwH/ATYCNQFY + BAABeAGYAaMC+gP/AdoD/wGvAfMC/wGMAeAC/wGJAeoC/wGHAfYC/wGTAf0C/wGeA/8BkwHzAf4B/wNX + Ad8DKQE+AZUCWgH7Ad8BbQFsAf8DVQGyAwABAQMKAQ0DHAEoAzIBUAFMAksBkAHKAX8BWgH+AdMBzgHW + Af8B4AG6AaYB/wHhAWEBGQH/AdsBwQG3Af8B1wHLAc8B/wGQAWIBSAH2AYIBWwFJAfEB4AHIAcMB/wHY + AsgB/wGqAWoBQQH5BAABrwKpAfwB7ALvAf8B1QLWAf8D2QH/AdcC2AH/AcsCzAH/AeEC4gH/AewC7QH/ + AuoB6wH/AeoC7AH/AewC7QH/AegB6gHpAf8B5gHvAegB/wHhAt4B/wNVAboDUgGpAesBkQFQAf8BywG2 + AbMB/wHaAd0B3gL/Av4B/wHFAcYB/AH/AtIB+hL/Av4B/wHdAd8B4QH/AcoBuAG3Af8B7QGVAVUB/wFY + AlYBuQQAAXoBjAGaAfcB3AP/AaIB6wL/AYAB3AL/AVoB0QL/AWIB3QL/AV4B5AL/AWkB6AL/AYUB9QL/ + AYwB+QL/AVoCWwHhAyABLgGaAk8B+gHdAW0BbgH/A1UBsQMGAQgDNwFaAWACXAHUAYYBXwFMAfMBhAFf + AUwB8wHBAWEBGQH+AeABuQGmAf8B1AHPAdUB/wHvAZkBWQH/AeABuwGqAf8B1gHPAdUB/wHNAX8BSwH+ + Ab0BVAExAf0B3QHMAcoB/wHeAcsByAH/AYcBXwFMAfMEAAGWApAB+QHuAvAB/wLmAeUB/wPmAf8D5gH/ + AegC6QH/AeYC5QH/AewB6QHmAf8B7wHsAeYB/wLpAeYB/wPjAf8B4wLiAf8C7wHwAf8B2QHUAdUB/wNU + Aa8BZgFbAVoB4QHoAZYBWQH/AfMB7AHvAf8B/gH9BP8B/gH/AvcC/wK5AfsB/wLcDv8D/gL/Av4B/wH0 + Ae0B8gH/AecBmAFfAf8BbgFXAVYB6AQAAV8BfgGGAfMBsAH2Av8BbwHaAv8BSAHMAv8BLwHBAv8BUAHT + Av8BPQHUAv8BRwHYAv8BWQHjAv8BYgHsAv8BWAJeAeUDKQE+AZoCUAH6Ad0CbQH/A1UBsQMqAUABiQFZ + AUIB9QHjAcQBtgH/Ad4B1wHcAf8B3gHWAdsB/wHgAbgBoQH/AeMBmAFcAf8B1gHPAdMB/wHnAb8BrQH/ + Ae8BtQGVAf8B0wHQAdgB/wHkAcEBsQH/AegBvAGmAf8B1AHQAdYB/wHqAcMBrwH/AV4CXAHOBAABagJl + AeUE/wH8A/8B+QH9Af4B/wH0AfsB/QH/AfMB/AH+Af8B6wHpAesB/wHAAccB2gH/AawBtAHPAf8ByQHE + Ac8B/wLjAeAB/wHdAt4B/wHmAugB/wGzAq0B/wNIAYcBeQFUAU0B7gHZAYUBSAH/AcUBwwHJAf8B8gHz + AfQJ/wL0Av8BsAGqAcgB/wGxAacBowH/AeYB4gHfAf8B+gL5Bf8B9gH1AfYB/wHHAcgBzgH/AdkBjAFU + Af8BegFYAUoB7wQAAVkBeQGHAfIBiQHrAv8BUQHQAv8BRAHLAv8BSgHOAv8BZAHZAv8BWgHbAv8BRwHW + Av8BRAHYAv8BSAHlAv8BVAFZAWAB6wEsAisBQwGaAVABUQH6AdwBbQFuAf8DVQGxA1UBtQHfAbMBmQH/ + AdoB1wHgAf8B2wGxAZsB/wHcAbYBoQH/AdcB1gHfAf8B6gG1AZgB/wHpAbsBpQH/AdcB0wHaAf8B8wGq + AYAB/wHqAbwBpAH/Ad4B1wHbAf8B3gHYAd0B/wHpAc4BwgH/AbUBXwFAAfsDOAFcBAADVwG6AesB4AHc + Af8B4QHHAb4B/wHXAcoByAH/AdwBwgG6Af8B0QGjAZkB/wFiAaMB3AH/ATwBtgHtAf8BIAHHAeoB/wEb + AYMBzAH/AawBqAG8Af8B2QHSAc0B/wHaAtcB/wF3AnQB/AMvAUoBdwFUAU0B7gHbAYUBRgH/AckByAHM + Af8B9gL3Bf8B7wLsAf8BzQHCAb4B/wG7AbABqwH/AZMBigGrAf8BtAGoAbYB/wHFAbkBtQH/AdICywH/ + A/EB/wHOAc8B1QH/AdwBjAFSAf8BdgFYAUsB7wQAAVUBZQFvAeoBhgHdAf4B/wGJAeAC/wGFAdsB+wH/ + AWwBygHxAf8BVQG4AesB/wFzAdAB8gH/AYYB2wL/AYUB4wL/AV0B4AL/AloBXwHbAyQBNQGaAVEBUgH6 + AdwBbQFuAf8DVQGxAWwBWAFSAekB3gHJAcIB/wHhAdYB1wH/AbcBTwEsAf0BuwFcAUAB/QHgAdoB3QH/ + AeMBxgG6Af8B9wGeAV4B/wHdAdYB2gH/AeYByAG7Af8BzgFvASsB/gGEAWcBTgHyAYgBZwFRAfIBXQJZ + Ac8DNQFXAwcBCQQAA0gBhgG8AaABnAH/AeMBdAE0Af8B3wGjAW4B/wHrAZ8BaQH/AdMBNgEMAf8BSwGE + AbYB/wFbAd0C/wFWA/8BIAHLAfsB/wFjAYABtwH/AeEBywHEAf8B2gHIAckB/wFiAlcB8QMVAR0BYQJX + Ad8B6QGQAUsB/wH0AesB7gH/AvkB+gH/AdICygH/AboCrAH/AdYBzwHOAf8B+wH5AfgB/wHqAewC/wHs + Ae0B/QH/Ae8B6wHoAf8B3wLZAf8B+QH4AfkB/wH1Ae4B8gH/AecBkgFSAf8BagFXAVYB6AQAAzUBVwNV + AbUBXQFtAXoB7QGGAaUBswH/AW8BiwGYAf8BZQGDAZQB/wFgAZMBqQH/AU4BfwGcAf4BRgFlAXcB9AJa + AV0BygMvAUoDHwEsAY8BTQFOAfoB4gFwAXEB/wNVAbQBhgFfAUwB8wHjAdMBzwH/AecB1wHVAf8BggFd + AUQB8wGHAWIBQwH0AeYC2wH/AeMB0QHLAf8B4AFmASMB/wHkAbcBnwH/AeAB4QHqAf8BzAGDAW0B/gNT + AaoDNgFZAxUBHQMDAQQIAAM0AVQBkAGDAYkB/gHsAZkBVAL/AcwBjgL/Ad0BtwH/AfMBXQErAf8BjgFd + AWcB/wFDAcQB/gH/AUsB+AH9Af8BHQHhAfoB/wExAXEB1wH/AeABygHNAf8BzAK4Af8DWAHdAwYBCAFS + AlABowHqAYwBRQH/Ac8BrwGnAf8BugG0AbgB/wHMAsIB/wHzAvEZ/wHbAd8B4gH/AcgBrwGoAf8B6wGP + AUYB/wNVAbUMAAM2AVkBfwF+AXcB/gGCAXMBcQH/AZwBjQGGAf8BxQGmAaEB/wF/AXYBewH+AWgCWQH1 + AWQBXAFaAecDWgHYA1kB1wGlAWoBaAH+AeECgQH/A1ABnQFrAWEBWAHmAecB1AHOAf8B5gHeAeAB/wG9 + AXABNwH+Ab8BeQFCAf4B5gHgAeQB/wHpAdMBygH/AXMBVAFLAe4BkAFiAUgB9gHmAeAB4gH/AekB1AHM + Af8BawFcAVUB5wM6AWEDIwEzAwgBCwgAAxoBJQFwAW4BcAH1AdUBowGMAf8B/QG2AV8C/wHlAawB/wH5 + AYMBOAH/AcIBXgFFAf8BXgGvAcoB/wFaAbUBmAH/AVcBuAGQAf8BQAF0AYsB/wHFAbcBvAH/AbgCoQH/ + A1YBuAQAAy0BRQGtAV8BRQH7AdMBkQFhAf8B1AHKAdAJ/wH+Av0J/wP9Av8C/QH/Af4C/AH/AdoB1gHc + Af8B0AGVAWgB/wHZAXMBPwH/AzMBUwwAAzUBVQF0AXMBcgH+AV4CYAH/AWwCaAH/AbsBnQGXAf8B9wHF + AbwB/wH7AcQBvQH/AfkBwgG7Af8B8QGxAasB/wHqAZ8BmQH/AeoBkwGQAf8BYwJZAesDHAEoAVMCUgGo + AecBvwGnAf8C5wHuAf8B5wHJAboB/wHnAcoBvQH/AecB6AHvAf8B6AG8AaAB/wFRAlABnwNOAZgB5wG9 + AaUB/wHnAesB9QH/AeIBqQGHAf8BUgJQAaQDKAE8AwwBEAgAAwYBCAFfAl4B3QG4AaIBowH/AW8BVwGf + Af8BlgF0AZ8B/wGUAWYBmwH/AVMBOQGvAf8BWAGDAU0B/wFHAcMBWAH/AZYB9gGzAf8BWgHJAV0B/wFw + AYgBWgH/AYYCfwH+Az8BbQQAAwcBCQNQAZ4B6wGjAWUB/wHnAbcBowH/AdcBzgHSAf8B1gHYAdoB/wH+ + AvwB/wH1AvQB/wH0AvMC/wH9Af4B/wHaAdwB3QH/AdYBzwHSAf8B5QG3AaYB/wHsAaYBaAH/A1MBqgMJ + AQwMAAMfASwDagH5AW8CbgH/AVUBVwFYAf8DUAH0A1EBogNWAbQDXAHJA2AB3gF1AWkBaAHtAVsCWQHE + Ax0BKgQAAx0BKgFrAWEBWAHmAegBzgG8Af8B6ALjAf8B6AHiAeMB/wHoAcoBuAH/AWwBXAFUAeoDJQE3 + AxgBIgGHAWYBTAHzAekB2AHPAf8B6gHOAbsB/wFdAlkB0gMcAScDBwEKDAADKgFBAk8BTgGXAlYBbgHo + AWsBbgH5Af8BnQGmAf4B/wEsAS0B9gH/ASEBIwEyAfsBPgG9AVIB/wGiAf8BzgH/AYwB/wGwAf8BJQFk + AR0B/wNTAaoMAAMMARABVwJVAboB7AGwAYAB/wHRAaUBkAH/AcgBsgGxAf8B8gHmAegB/wHKAcIBxAH/ + AcUBvQG/Af8B8wHoAeoB/wHKArYB/wHNAaMBkQH/Ae4BtAGFAf8BWQJXAcIDEAEVFAADWwHLA9cB/wOT + Af8DUAGjEAADBgEIEAADJAE2AVsCWQHEAZ4BagFHAfkBmgFwAVQB+AFaAlcBxQMpAT4DBgEIAwABAQM9 + AWkBXAFaAVkBzAFcAlkBzAM7AWMDBwEKAwEBAhQAA0MBdwFqAWwC/wHLAcwC/wFhAV8C/wEMARABZAH9 + ASkBdQEqAfoBYwGqAYMB+QFhAYIBawHuATwBhAE/AfcDRwGDEAADDQESAlABTwGbAd8BnAFdAf8B7AG+ + AZwB/wHnAcIBrwH/AdkBtQGpAf8B1wGzAagB/wHnAcIBrwH/AewBvgGdAf8B4QGgAWIB/wJSAVABowMT + ARoYAAMnAToDewHxA14B2QMUARtwAAMQARYCWgFmAd4CqAHdAf0CUAHCAfoCWgFeAdUDOwFkAyYBOAMS + ARkDKAE8AxYBHxgAAy0BRgNRAaIBYgFeAVcB3wF8AWoBXgHuAXwBagFfAe4BZwFhAVsB4QJTAVIBqAMw + AUwDAgEDuAADIwEzA1kB7ANWAb4DEgEZCAADEQEXA1MBqgFkAVwBVQHqAXUBZgFRAfIBZgFdAVYB7QNZ + AccDKgFBBAADCQEMHAADRgGBA1YBuwNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNV + AbUDVgG2A1YBuwM8AWgMAAI5AToBYAI1AXcB9QJZAV0B1wNKAYsDLgFIAxgBIQMHAQpAAAMmATkDWAHp + AfIC5wH/AdoC0AH/A1cBwgMSARkDEQEXAl4BWwHZAfcB2AGrAv8B3gGtAv8B3QGuAv8B7AHCAf8B6AHO + AaoB/wFiAVgBUgHvA1kB0gNbAeEDWQHDA1ABnQM/AW4DIAEuDAABuwFlAUAB/QHwAYoBKQH/Ae0BcwEe + Af8B7gFyAR0B/wHuAW8BGQH/Ae4BbAEUAf8B7QFnAQoB/wHtAWIBAwH/Ae0BYwECAf8B7QFfAQAB/wHt + AVwBAAH/Ae0BWQEAAf8B8gFXAQAB/wHjAVUBAAH/A1kBxAwAAlEBUgGnAioB3gH/Ah8B1QH/Ag4BugH/ + AgEBowH/AkgBZwHuAlUBVgG0A0ABcQMyAVEDFAEcMAADJwE7A1wB5wHqAt8B/wHsAuIB/wHmAtkB/wHc + AtUB/wNZAcQDVAGuAfoBvAGAAv8B2wGhAv8BxQGGAf8B/QHCAYQB/wH4AcIBiAL/Ad0BqQH/AeoBtQGH + Af8BvQGiAZcB/wHgAd0B4AH/AecB4gHjAf8B0wHMAc0B/wGcAZQBlQH+A2UB9ANZAccDMQFPBAABxgF/ + AUYB/gH2AbcBigH/AfQBugGUAf8B8gG3AY8B/wHyAbYBjwH/AfIBtQGNAf8B8wG0AYgB/wHzAbEBhQH/ + AfEBrgGAAf8B8AGqAXEB/wHwAaoBcAH/Ae8BqQFvAf8B8wGsAXIB/wHvAXEBIgH/A1YBwQgAAwoBDQJc + AV4BzgI4AfMB/wIpAewB/wIdAeYB/wIQAd4B/wIAAc8B/wGXAZEBxQH/AbQBqwGwAf8BagFkAZYB/wJb + AV4B2QJVAVYBsQNAAXEkAAMkATYDWQHsAekC3AH/AfUC7QH/AeEC2AH/AeQC2QH/AfwC9wH/AVoCWAHu + AYABXwFMAfMBrgFaAR4B/wHmAZwBRwL/Ab4BXwH/Ae0BpAFLAf8BrgFVARcB/wHlAaEBUQH/Ad4BlgFK + Af8BzQGfAXMB/wHNAcIBwQH/AewB3AHYAf8B7wHZAdcB/wHwAd4B3AL/Af0B/AH/AeAC1AH/A1YBuAQA + AbsBfQFLAf4B/wHxAfMB/wGZAeABsAH/ATgBxwFSAf8BNwHBAUwB/wElAbUBNAH/AawB3QG4Af8B/QHv + AfYB/wH5AbYBhwH/AfsBswGDAf8B+gGrAW4B/wH1AawBgAH/AekB5wHuAf8B4wGPAVUB/wNYAcAIAAMs + AUQCOwGNAfYCQAH3Af8CLwHqAf8CIwHlAf8CEgHgAf8BHQEcAd0B/wHdAdQB4AH/AfcB7QHeAf8B6QHe + AdgB/wHdAdIBzAH/AcwBwgG8Af8CTQFzAfogAAMkATUBXAJZAewB6wLkAf8B9QLtAf8B6gLiAf8B+wL4 + Af8B9gL0Af8BXwJbAewDJgE4AYsBXAErAfwBhAE1AQAB/wHbAZYBRQH/AfIBuQFpAf8BtwFvATEB/wFo + ASUBAAH/AZUBRAEGAf8ByQGIATgB/wHPAZwBZwH/AeQBzAHEAv8B7QHfAv8B4gHRAf8B+QHVAcYB/wHY + AcABuwH/AWYCZAHoAykBPwQAAbwBfwFPAf4B/wHvAfAB/wGFAd0BmgH/ARsBzwE5Af8BFAHBASoB/wEA + AakBAAH/AZcB0wGbAv8C5wH/Af0BsAFoAv8BsQFsAv8BoQFTAf8B/AGcAVEB/wHtAeAB3gH/AeQBkAFT + Af8DWAHACAACPAE9AWcCLwHhAf8CPgH5Af8CMwHtAf8CKwHoAf8CFAHiAf8BSwFIAd4B/wHzAewB3wH/ + AegB3wHbAf8B4gHYAdoB/wHoAd0B2wH/AewB4QHcAf8CWgFdAdMcAAMkATYBXwJXAegB6wLmBf8B+AL2 + Af8B+gL2Af8B8gLvAf8BZAJiAecDJwE7BAABgwFlAUUB9AHgAacBXAL/Ad8BswH/AccBpgGGAf8BnwFv + AU8B/wGeAW4BSwH/AYQBSQEeAf8BcgE2AQAB/wGoAWoBRwH/A2UB9AFqAmUB6QGXAYsBhwH4AWoBZgFl + Ae0BUAJPAZsDCgEOCAABugF/AVMB/gH/Ae8B7gH/AYcB4QGhAf8BJAHeAVAB/wEeAdIBQQH/AQABuAEV + Af8BlwHWAZ8C/wHqAekB/wH+AbYBcgL/AbwBiQH/Af4BrAFkAf8B/AGiAVoB/wHwAeQB4gH/AeQBkwFW + Af8DWAHABAADBAEGA1EBogKDAfQB/wFWAVUB+QH/ATIBMQHyAf8BIQEiAewB/wEOAQ8B5gH/AZIBjwHi + Af8B+gHxAeEB/wHkAdsB3AH/AeMB2QHaAf8B7wHkAd4B/wHCAbgBxgH/A0gBhRAAAxoBJQMqAUEDOAFc + A14B5QHuAugN/wHxAu4B/wFiAmAB6QMmATkIAANWAbMB7wHKAaEC/wH7AfQB/wH5AfQB7gH/AewB2QHG + Af8B7QHYAcAB/wHnAdIBugH/Ac0BkQFSAf8BcgFQATwB/gNEAXoDAwEEAxEBFxQAAbcBfwFXAf4B/wHv + AesB/wG8Ae4BxwH/AYoB5gGUAf8BiQHjAY8B/wFtAdkBcAH/AcYB6QHHAv8B8QHwAv8BzwGZAv8B0QGc + Av8BygGTAf8B/QHHAZQB/wH0AusB/wHjAZEBVwH/A1gBwAQAAxQBGwFdAVwBZQHhAvkB+AH/AegB5AHx + Af8BxgHAAe8B/wGQAY0B7AH/AkQB6AH/AcsBxQHlAv8B9wHiAf8B8wHqAeAB/wHtAeMB3QH/AfcB7AHj + Af8BmAGQAbAB/wMsAUQIAAMWAR8DVAGrA2QB5wFoAmYB8AF3AmoB+QHgAtYN/wHvAusB/wFkAmMB7AMj + ATMMAAMRARcCYQFcAdwB+AHmAdMG/wH2AesB/wH7Ae0B3AH/AfcB2wG+Af8B4wG/AacB/wGrAacBrwH/ + AmgBagH1A1wB6gNbAdkDWQHDA1IBpgM3AVoDAwEEBAABtgF/AVoB/gH/AfYB5gH/AcgBxwHzAf8BlAGL + Ad4B/wGXAY4B3gH/AZQBigHZAf8B2AHTAe4B/wH1AfYB+wH/AZgBrQH+Af8BjwGnAfsB/wGMAaEB+gH/ + AZYBpgH6Af8B7wHwAfcB/wHpAZUBUgH/A1gBwAQAAyYBOQKWAc8D/wH8Af8B+QH2AfIB/wH8AfcB7wP/ + AesB/wHZAdQB6AH/AToBOQHmAf8BYAFcAeIB/wGgAZoB4AH/AckBwgHcAf8B7wHpAeIB/wFiAV4BagHs + AxYBHwQAAxUBHQNaAdMBxwK4Af8B8QLlAf8B+QLxAf8B+wL0Af8B7ALlAf8B7ALlBf8B8gLtAf8DYAHr + AyUBNxQAAwkBDANQAZ4BcAFmAWIB6gHkAc0BvwH/AeIBvwGpAf8BvgFbAR4B/wHGAYQBQQH/AdUBrAFx + Af8BywGsAYsB/wHRAbkBogH/Ad0BxwG4Af8B2AHJAcIB/wHRAcMBxQH/A10B4gMMARAEAAG3AX8BXwH+ + Af8B/gHqAf8BYgFnAd4B/wIAAcMB/wIAAbcB/wIAAZ8B/wGZAZgB0wH/Ae4B8AL/ARsBWwH8Af8BCQFY + Af0B/wEAATwB/AH/AREBPQH8Af8B6QHrAfkB/wHuAZ0BVQH/A1gBwAQAA0MBeALIAeYD/wH9Af8B9gLz + Af8B8wHuAfEC/wH7Ae0B/wGsAacB7AH/ARoBGwHqAf8CEgHkAf8BBAEFAd8B/wINAdwB/wExAS4B1gH/ + A1QBrwMHAQkEAANQAZoBvAKvAf8B6QLaAf8B6QLdAf8B9ALqAf8B8wLuAf8B9gL0Af8B7gLnAf8B5gLf + Af8DXwHgAycBOyAAAy4BSAGdAZcBmwH8AdQBtQGoAf8BsgExAQAB/wHMAVIBAAH/Ac8BYQEAAf8B0gFs + AQQB/wHPAWwBBwH/Ac0BZAEFAf8BvgFYARUB/wHQAbgBrwH/A1oB1QMDAQQEAAG1AX8BZAH+Af8B/gHo + Af8BZgFrAegB/wIAAd8B/wIAAdIB/wIAAbgB/wGcAZsB2gH/Ae4B8AL/AS8BhQH9Af8BIwGMAf0B/wEX + AWIB/AH/ASIBVgH9Af8B6gHsAfwB/wHsAZ0BWAH/A1gBwAQAA1kBxwL6Af0C/wH9AfsB/wH4AfQB9QH/ + AfcB8wHyAv8B/AHvAf8BdAFyAfAB/wErASwB7gH/AiwB6AH/AhsB4QH/AgkB4QH/AgABxQH/Aj8BQAFu + CAADYQHuAdwCyQH/Ad0CzQH/Ab0CrwH/AZ8ClQH/Ad8C1AH/AfMC7wH/AfsC9gH/AXMCbAH0AzQBVCQA + AUcCRgGBAdcB2gHfAf8BvwGPAYQB/wGsASMBAAH/AcABSAEAAf8ByAFVAQAB/wHLAVoBAAH/AcoBWAEA + Af8BxwFMAQAB/wG9AUYBAgH/AcQBrAGmAf8DVQGyCAABtAF/AWgB/gL/AewB/wGIAY0B6gH/ARMBFQHc + Af8BFwEZAdYB/wEQARIBwwH/AawBrQHjAf8B8QH1Av8BRQGKAv8BOQGOAv8BMAFwAv8BPQFqAv8B7gHy + Av8B6wGdAVwB/wNYAcAEAAJZAX0B8gLtAfcB/wL5AfwD/wH+A/8B+QH/AfMB8AH1Af8BVwFWAfYB/wIz + AfEB/wIuAeoB/wIjAeQB/wIZAegB/wIdAZEB/AIwATEBTQgAAXECbQH3Ae8C3AH/AcACsgH/A1UBtQM/ + AW8BogKZAf8B9ALrAf8B+ALxAf8BdQJvAfIDKgFBJAADVQGyAegB5wHoAf8BqQFSAUIB/wGyASoBAAH/ + AckBVQEAAf8B2gFlAQAB/wHeAWsBAAH/AdABWwEAAf8BuwE5AQAB/wG1AUkBHwH/AbwCrgH/A0gBiAgA + Aa8BfwFpAf4B+AHlAdgB/wHsAecB6wH/Ad8B1wHiAf8B3wHZAeQB/wHfAdgB5AH/Ae8B6QHrAf8B9gHu + AewB/wHiAdoB7QH/AeAB2QHtAf8B4AHaAe4B/wHjAd8B8AH/AfoB9AHyAf8B4gGTAVoB/wNWAcEEAAM4 + AVwCUAFSAaQCWgFdAcoBbgFvAYQB8wLDAd4B/wLOAfQB/wJvAv8CVQH+Af8CPAH3Af8CJgHrAf8CGgHq + Af8CXAFgAdQDEAEVCAADZAHsAcgCugH/A1UBsAMWAR4DVQGyAcACtAH/AegC3AH/AfAC5wH/AWgCZgHr + AxwBJyAAAwMBBANeAdkB3gHZAdwB/wGhATUBGgH/AcABQAEAAf8BzwFfAQAB/wHfAW8BAAH/AecBggEA + Af8B4AFyAQAB/wHJAU0BAAH/AboBXQE/Af8BoQGZAZ4B/QM3AVoIAAHRAZ8BgwH/Af4BzgGYAf8B/QHI + AZIC/wHMAZEC/wHJAYwC/wHHAYkB/wH8Ab4BggH/AfkBtwFxAv8BvAFtAv8BuQFpAv8BtwFmAf8B/gGz + AWEC/wGxAWAB/wHvAZABOwH/A1kBxAwAAwcBCgMqAUEDOwFkAk8BUQGcAloBYAHeAlQBxQH/AmMB3wH/ + AmAB9AH/AkUB7gH/A1QBrwwAA0IBdANRAZwDHwEtA1UBsgHAArAB/wHeAswB/wHoAtoB/wHOAsEB/wNT + AaokAAMRARcBcQJvAfMB0AG6Ab0B/wGRAQcBAAH/Aa8BIgEAAf8BugE6AQAB/wHEAUkBAAH/AckBTgEA + Af8ByAFOAQAB/wG7ATMBAAH/Ab4BbAFZAf8BfwFuAX8B9wMhATAIAAF0AWQBYAHxAawBegFqAfwBmQFk + AV8B+wGZAWABXwH7AZkBXwFZAfsBmQFfAVQB+wGZAV8BTgH7AZkBXwFJAfsBmQFfAUQB+wGZAV8BNAH7 + AZkBXwEyAfsBmQFfATIB+wGdAV8BMQH7AZsBSwErAfwDSAGGHAADFAEbAyIBMgNCAXUCVwFZAcICTQF1 + AfIDPgFrFAADUQGcAcUCtwH/Ae8C3QH/Ad4CywH/AcQCtwH/A2AB1AMVAR0kAAMwAU0BpQKcAf4B3AHO + Ac8B/wGdAksB/wGtAVQBRwH/Aa4BVwFCAf8BrgFXAT4B/wGuAVcBOgH/AawBUgE2Af8BoQE+ATEB/wHC + AZoBmAH/A2IB6QMHAQqMAANCAXYDZAHnAX0CbQH3A2QB7ANOAZgDFAEcKAADIgExA14B2QNsAe4BbQJu + Ae4CdwF7AfEDfgHzAYIBgAGCAfUBjAGKAYwB9wGQAY0BkAH5AZcBlQGWAfsBuAGzAbQB/QNWAbkIAAM6 + AWEDWQHHA1kBzANaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDXAHOA1kBwwM0 + AVVAAANOAZgDWQHDA1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+ + A1kBxANEAXwIAANIAYQBiQKHAfMBfwJ9AfABfwJ9AfABfwJ9AfABfwJ9AfABfwJ8AfABfQJ8AfABfQJ8 + AfABfQJ8AfABjAKJAfMDUQGcCAADYQHuA+IB/wPdAf8D2gH/A9oB/wPYAf8B2ALXAf8D1wH/A9YB/wPV + Af8D1QH/A9QB/wPTAf8D4AH/A5kB/wNXAb0MAAMuAUcBXAFeAWEB2gMlATcoAAGZAZ0BnwH9AcoBzQHP + Af8BywHNAdAB/wHLAc4B0AH/AcoBzQHQAf8BygHNAc8B/wHJAc0BzwH/AcgBzAHOAf8ByAHMAc4B/wHI + AcsBzQH/AcgBywHNAf8ByAHLAc0B/wHIAcsBzQH/AckBywHOAf8BsQG1AbcB/wNbAdADAwEEAy8BSQNS + AaQB6ALjBf8B+wL5Af8B+gL3Af8B+AL0Af8B9gLwAf8B8wLsAf8B8ALoAf8B8gLrAf8B7ALlAf8DVgG2 + AzEBTQMEAQYDiAH3BP8D9AH/A/MB/wHzAvIB/wHxAvAB/wHwAfEB8gH/Ae8B8AHxAf8B7QHuAe8B/wHr + AewB6wH/AesC7AH/AekB6gHsAf8B5QLmAf8D9QH/A8YB/wNZAcMIAAMbASYBRgFiAXUB7wEEAeQC/wJc + AWAB1CgAAbIBtAG2Af0B7QLwAf8B2QHbAdoB/wHbAd0B3gH/AdsB3QHeAf8B2wHeAd8B/wHbAd4B3wH/ + AdsB3gHgAf8B2wHeAeAB/wHbAd4B4AH/AdwB3gHgAf8B2wHdAd4B/wHaAdsB3AH/AeYB6AHpAf8B4QHm + AekB/wNYAcsDPgFrAYkChgH1Ad0C1QH/Ad4C1Qb/Av0B/wH8AvgB/wH6AvUB/wH4AvEB/wH1Au0B/wHx + AukB/wH2Au8B/wHhAtYB/wHdAtYB/wONAfYDRAF6A3sB9gP7Af8D6gH/AesC6gH/AeoB6wHqAf8B6wHw + AfEB/wHmAekB6gH/AeEB4AHiAf8B4wHlAecB/wHnAewB7wH/AeEB4gHlAf8B3gHfAeEB/wHeAt8B/wLs + AesB/wO9Af8DVgHBCAADDgETAVIBYQFqAegBAwHxAv8BMgF7AZ4B+gJMAU0BkQNJAYcDSQGHA0kBhwNJ + AYcDSQGHA0kBhwNJAYcDRwGABAABqAGuAbIB/QFgAWIBXwH/Ah8BCgH/AisBCwH/AjkBFgH/Ak4BLgH/ + AlQBOAH/AlYBOwH/AVMBUgE3Af8BSAFJASsB/wE7ATwBGwH/AS8BMAEVAf8BJQEkAQ8B/wI5ATMB/wG/ + AcYBywH/A1oBygNeAc4B9QLpAf8B0QLIAf8BbQJrAf8CtQG0Af8BwgLBAf8BvAK7Af8BvAG7AboB/wG6 + ArkB/wG5AbgBtwH/AbsCuQH/AbUCtAH/AW0CbAH/AckCwgH/AfgC7AH/A14B2QN9AfYD/AH/Ae0C7AH/ + Ae4B8AHyAf8B6QHsAe4B/wHaAcgBvwH/AdYBtwGnAf8B2QG+Aa4B/wHSAbYBpwH/AdABuQGwAf8B1QG1 + AaMB/wHOAaoBlAH/AdYBzQHKAf8B7wHxAfMB/wPAAf8DVgHBCAADGwEmAVEBYwF0AesBAAHoAv8BMQGb + AcgB/wG7AbgBuQH/Ac0B2AHRAf8BywHVAdIB/wHJAdIB0AH/AcYB0QHOAf8BxAHPAc0B/wHBAc0BywH/ + AckB1QHXAf8BnQGkAagB/wQAAagBqgGvAf0BRwFKAUEB/wMAAf8CPQEcAf8CRAEfAf8BJgElAQAB/wI6 + AQgB/wI7AQoB/wI4AQcB/wIuAQAB/wIhAQAB/wIZAQAB/wIOAQAB/wEdARwBDwH/AbYBvQHCAf8DWgHK + A2cB5gHiAtAB/wHCArIB/wFXAVQBVQH/AVsBXwFmAf8BYgFnAW4B/wFhAWcBbwH/AWIBZwFvAf8BYgFn + AW8B/wFhAWgBcAH/AWIBaAFvAf8BXQFiAWkB/wFUAVIBUwH/AbkBrAGrAf8B4gLQAf8BawJqAesDfQH2 + A/wB/wHwAvIB/wHrAekB6gH/AdcBswGgAf8B6AG+AZUB/wH1AdEBogH/AfIB0gGnAf8B8wHQAaAB/wHr + AcIBmQH/AfUBzQGhAf8B3gGoAXAB/wHTAcMBuwH/AfAB9AH3Af8DwQH/A1YBwQgAAykBPgELAXwBuQH8 + AQQB6gL/ASABkQG3Af8BVgFtAUgB/wFSAYgBOgH/ATkBdAEYAf8BOgGDARcB/wE/AYUBHQH/ATcBcgEa + Af8BJAFiAQsB/wFwAZ4BZQH/AakBrAG0Af8EAAKoAa0B/QFBAUQBPwH/AjEBIgH/AtsB1QH/Ar0BtwH/ + AiYBBwH/AiQBAAH/AiIBAAH/AhoBAAH/AiEBAAH/AiEBAAH/Ah0BAAH/AhIBAAH/AiIBFAH/AbQBuwHB + Af8DWgHKAWsCZgHvAc4CuQH/Ac4BvwHBAf8B2AHDAbwB/wHgAacBigH/AeYBpQGAAf8B6QGiAWsB/wHp + AZ0BYwH/AekBnQFjAf8B6QGhAWoB/wHmAaYBcwH/AeABqAGLAf8B2QHBAboB/wHOAcABwgH/Ac4CuQH/ + AW4CagHwA30B9gP+Af8B8AH0AfcB/wHdAbsBqwH/Ae4BtwGDAf8B8gHAAYcB/wHfAbMBkQH/Ad4BvwGq + Af8B3gGyAY4B/wHzAcEBiQH/AfcByAGVAf8B1AGjAYYB/wHeAdwB3gH/AfIB9AH1Af8DwgH/A1YBwQgA + AxwBKAEdAXcBpAH6AQQB6AL/AR0BkAG1Af8BVgFzAU0B/wGDAaUBagH/AVsBkAFKAf8BXAGQAUoB/wEe + AWYBAQH/ARwBYgEEAf8BBgFQAQAB/wFfAZIBVgH/AaoBqwG1Af8EAAKoAaoB/QE8Aj0B/wE7AToBKgH/ + AoEBcAH/AqoBpwH/ApEBhwH/AhsBAwH/ApMBggH/Ak0BOgH/AhEBAAH/AhgBAAH/AhUBAAH/AgoBAAH/ + Ah0BFAH/AbABtwG9Af8DWgHKAXcCdAHxAe0C5AH/AusB8QH/AeUB0QHAAf8B+QGHARcC/wFqAQAC/wFq + AQAC/wFrAQAC/wFrAQAC/wFsAQAC/wFsAQAB/wH6AWoBAAH/AecBxAGqAf8B7AHwAfgB/wHqAuAB/wF0 + AnAB8AN9AfYE/wHqAuUB/wHlAasBgwH/AfUBrwFkAf8B2AGqAY0B/wHoAeYB6AH/Au0B6wH/AeQB5wHs + Af8B2wGvAZIB/wH1AbUBcAH/AdkBogFxAf8B2wHXAdgB/wHzAfcB+AH/AsUBxAH/A1YBwQgAA0IBdQEA + AbgB7wH/AQQB6AL/AR4BlAG2Af8BhwGhAYEB/wE9AYMBMQH/ATkBgwEuAf8BMwFxASQB/wEPAVYBAAH/ + AQ4BUQEAAf8BAAFEAQAB/wFeAZABVwH/AaoBrAG0Af8EAAGlAqgB/QFCAUUBQwH/AwAB/wMAAf8CqAGl + Af8CpQGdAf8CBQEAAf8CVQFKAf8CvQG6Af8CkQGJAf8CEgEAAf8CCwEAAf8CBQEAAf8BGAEXARMB/wGt + AbQBuQH/A1oBygN0AfAE/wHxAe4B8gH/Ad0B1QHPAf8B8AHAAWgC/wG3AT4C/wGmARoB/wH+AaIBDQH/ + Af4BoQELAf8B/gGhAQsC/wGfAQYB/wHwAZwBFgH/AdsBzQG9Af8B5AHjAegB/wHyAusB/wF+AXsBfgHx + A30B9gT/AecB2gHWAf8B6gGpAWsB/wHrAacBXwH/AdoBwwG3Af8B8AHtAeYB/wHmAbgBiQH/Ae0B5wHa + Af8B2wHAAbMB/wHwAcIBmQH/AeYBuAGVAf8B2gHNAcgB/wH0AfgB+gH/A8YB/wNWAcEEAAMKAQ0CXAFg + AdQBAAHhAv8BBAHgAv8BGQGVAcAB/wEsAVkBTwH/ATMBkAE1Af8BCgGBAQkB/wENAYEBDAH/ARUBggET + Af8BFAFoARAB/wEAATcBAAH/AVcBiQFSAf8BrAGtAbUB/wQAAaICqAH9ATgBOwE9Af8BDAELAQoB/wKs + AaUB/wK9AboB/wIoARkB/wIFAQAB/wJFAT0B/wK+AbsB/wKcAZgB/wINAQAB/wIFAQAB/wMAAf8BEwEU + ARIB/wGqAbIBtwH/A1oBygNjAeAB/wH7AfoB/wH4AfQB9QH/Ad8C2wH/AeABywGrAf8B/QHlAbsB/wH8 + AeABswH/AfsB2QGjAf8B/AHTAZYB/wH7AdABkAH/Af4BzwGIAf8B5AHAAYgB/wHUAcsBygH/Ac0BzAG7 + Af8B4gHbAc8B/wNmAegDfwH2BP8B7gLqAf8B5wGrAYAB/wH2AbQBagH/AdQBnwFzAf8B4wHiAeMB/wHr + AeIB0AH/AeEBugGTAf8B2wGtAYsB/wH3AdMBtAH/Ad4BrQGOAf8B3wHZAdcB/wH1AfkB+gH/A8gB/wNW + AcEEAANRAaABAAGZAeoB/wEAAeYC/wECAdsB9gH/ATYB5gH8Af8BPwGlAd0B/wFMAYIBaAH/AYIBxAFz + Af8BcgG8AXQB/wFyAb0BcwH/AYEBwgGCAf8BRQGRAUUB/wFaAYwBVgH/AaoBrAGzAf8EAAGfAaYBqAH9 + ATABMwE1Af8BbwFuAW0B/wO4Af8CBgEFAf8DAAH/AhYBCgH/ApUBjQH/AkkBRQH/AwAB/wIDAQAB/wID + AQAB/wMAAf8BEAISAf8BqAGwAbUB/wNaAcoDSQGHAcgCwgH/AfYB7wHuAf8B6gLlAf8BwwG0AasB/wHu + AdwBzAH/Ae8B4gHUAf8B7AHiAdYB/wHrAeMB1wH/AeoB4wHWAf8B6gHfAdAB/wHFAbYBrQH/AeAB1wHZ + Af8B7gHkAeMB/wHHAcABvwH/A04BmAOBAfYE/wH3Af0B/gH/AeQBwAGsAf8B7wGsAWoB/wHxAboBhQH/ + AdgBpAGAAf8B2wG0AZsB/wHdAagBggH/AeUBxgGnAf8B5gGxAY0B/wHdAbsBqAH/AegB7gHxAf8B9gL3 + Af8DyQH/A1YBwQQAAloBXgHVAQAByAL/AQAB5wL/AQIB/QH+Af8BVwP/AYoB7gH+Af8BZAGGAZ8B/wG7 + AdIBsAH/AbcBzwGwAf8BuAHPAbEB/wG5AdABsgH/AbYB0AGwAf8BpwG+AaEB/wGkAacBrAH/BAABmwGi + AacB/QExATUBNgH/Al0BXAH/A70B/wKKAYkB/wI0AS8B/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8BDwEQAREB/wGmAa4BswH/A1oBygMHAQkDPQFoA1gBuQNgAd4BqAGlAaYB/QH5AfcB9gH/AfUB+gH5 + Af8B8AH6AfgB/wHsAfoB+QH/AegB+wH5Af8B7wL5Af8BnwGXAZgB/gNhAeIDWgG9A0ABbwMJAQwDgQH2 + BP8B+QH6AfsB/wH1AvYB/wHjAbkBogH/AewBrwGBAf8B9gHAAZEB/wH2AcEBlwH/AfUBywGnAf8B6AGy + AY8B/wHeAbgBpAH/AesB7gHwAf8B6wHtAe4B/wH3AvYB/wPLAf8DVgHBBAABLgFYAYcB9gEAAccC/wEA + AeoC/wEBA/8BUQP/AZQB9wL/AWEBhAGqAf8C0gHNAf8B0QHWAdEB/wHPAdQB0AH/Ac0B0wHPAf8BzAHS + Ac8B/wHZAuAB/wGcAZ8BogH/BAABlgGdAaMB/QFCAUUBRgH/AhABDwH/A7IB/wPRAf8CMwE0Af8DDAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AQ0BDgEPAf8BpQGtAbIB/wNaAcoMAAMOARMDWAHBBP8B+gP/ + AfUD/wHyA/8B7gP/AfkD/wNcAcwDFAEcDAADgQH2BP8D+QH/AfkC+wH/AfcC+wH/AesB2wHTAf8B5wHB + Aa4B/wHlAbwBpQH/AeUBwQGuAf8B6AHXAdAB/wHwAfQB9wH/Ae4C8AH/AesC6gH/A/kB/wPNAf8DVgHB + BAABUgFXAWkB6AEAAcsC/wEUAasBwwH8AVgBYAFlAeMBRwHpAfcB/wGIAfIC/wJWAVgBuwNDAXgDQwF4 + A0MBeANDAXgDQwF4A0MBeANBAXIEAAGRAZkBngH9AVEBVAFVAf8BKwIqAf8DSgH/A0gB/wM0Af8DPwH/ + AzkB/wMtAf8CIAEhAf8DFgH/Aw4B/wEGAgUB/wEaAhsB/wGiAaoBrwH/A1oByhAAA1MBpQP9Af8B/gP/ + AfgD/wH1A/8B8QP/AfgD/wNVAbIQAAOFAfYE/wP7Af8D+QH/AfgC+QH/AfgB/QH+Af8B9QH6Af0B/wHy + AfUB+AH/AfIB9gH6Af8B8wH3AfoB/wHvAfAB8QH/A+0B/wPrAf8D9wH/A88B/wNXAcIEAANTAaoBAAHJ + Av8BMgGGAaEB9wJSAVMBqAEuAcsB7QH/AV0BzQHsAf8DKwFCIAABjwGXAZ0B/QFPAVEBUgH/ATsCOAH/ + Aj4BPQH/ATwCOwH/AkMBQgH/AUQCQwH/AUUCRAH/AkYBRQH/AUcCRgH/AkUBRAH/AkIBQQH/AT8CPQH/ + ATgCNwH/AZwBpAGqAf8DWQHMEAADVgGrA/0F/wH7A/8B+AP/AfUD/wH6A/8DVwG3AwMBBAwAA5MB+Bz/ + A/4B/wP9Af8D/AH/A/oB/wP5Bf8D0wH/A1cBwgQAAzsBZQEwAWcBkQH3AS8BYgGJAfYBHgFcAZgB+gFM + AWMBdgHuAloBXgHVAw0BESAAAX8BgQGHAf4BjwGXAZoB/wFjAWcBagH/AWoBbwFyAf8BaQFuAXEB/wFp + AW4BcQH/AWkBbgFxAf8BaQFuAXAB/wFpAW4BcAH/AWkBbgFxAf8BagFtAXEB/wFqAW8BcgH/AWgBbQFw + Af8BcQGBAYUB/wGrAbYBvAH/A1kBxxAAA1QBrxj/A1gBuwMEAQUMAANbAcsDrQH+A7UB/QO1Af0DtQH9 + A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9A7UB/QO2Af0DtQH+A24B9QM7AWVAAAJZAVoBzwGOAZEBkgH7 + AX4BhAGKAfoBfQGBAYcB+gF+AYQBigH6AX4BhgGMAfoBgQGHAY0B+gGDAYkBjwH6AYMBigGPAfoBhgGN + AZAB+gGHAY8BkgH6AYkBjwGSAfoBigGQAZMB+gGPAZoBngH8AWoBbAFvAfIDOgFiEAADUQGcAYcChgHz + AXsCegHvAXsCegHvAXsCegHvAXsCegHvAYcChgHzA1IBpwMBAQIwAAM/AW0BNQFIAZYB9gIhASIBMSAA + AwUBBwMjATMDNAFUAyYBOAMMARADAgEDZAADIAEuAzoBYQM2AVkDRQF/A1YBuwNWAbMDQAFwAzcBWgM5 + AV8DHAEoMAADOAFeAToBogH4Af8CWgFdAcoDFwEgEwABAQMGAQgDCwEPA0EBcgF1AmQB7wFeAlsB2QNV + AbIDSAGGAzIBUQMZASMDDQERAwoBDgMHAQoDAwEECAABWQJXAcIBsgF8AVkB+wGjAW8BTQH6AZkCdgH6 + AZsBeQF6AfoBmgJ4AfoBmgJ3AfoBmgJ3AfoBmgJ4AfoBmgF2AXQB+gGnAXgBYAH6AakBcwFNAfoBsgFf + AUUB+wFeAlsB0AwAAwMBBANgAd4CfwF+Af4BhgFhAWAB/QE7AWkBuAH/ATcBuQHzAf8BMgGIAc8B/wF3 + AXABfgH+AY4BgwFrAf0BVgJSAf0DTgGXHAADOQFgA0oBjQFJAkgBhwM3AVsEAAMgAS4BUwFhAX8B7gFC + AbkB9AH/A1sByAMWAR4IAAMEAQUDJAE2A0QBeQNMAZIBbAJhAe4B/wH8Af0B/wH8AusB/wG7AaYBpwH9 + AWcCUQHyA1cB3wNaAcoDVQGyA1ABmgNIAYUDMwFTAwsBDwQAAdIBcAFJAv8BxAFcAf8B7wGaAVMB/wHQ + AcQBxwH/AdICywH/AdMBygHLAf8B1wLOAf8B1gLOAf8B1QHQAdMB/wHUAcIBvQH/Af0BuQGMAv8BnQE7 + Av8BlwEcAf8B3AF0AT0B/xAAA2AB3wG3AbMBsgH8AaQBnwGeAfoBWwGoAcoB/QFuAeQC/wFYAbYB8QH/ + ApUBmwH7AbcBqwGqAfsBiwKHAfgDQAFwGAADSAGIAXkCdwH6AaoCowH/AYoCagH/AWoCaQH5AlsBWQHD + AygBPANUAa8BVwHwAv8BKAFxAcQB/wJFAUYBfggAAx0BKgG1ATsBAAH/AfQBUwEAAf8BuwFEARAB/wHx + AcwBzQL/AvMC/wH3AfYG/wH0AfUB/wHnAb0BvAH/AaABUAFIAf8BXgEdAQgB/wFUAQkBAAH/AZIBLgEA + Af8DUwGwAzYBWQQAAbUBbwE/AfwB/wG2AVYB/wHtAZQBUwH/AdQBwgHEAf8B2gFVAToB/wHXAaABlgH/ + AdsB1wHaAf8B3AHOAc0B/wHbAdMB1AH/AdgBvgG6Af8B8wGUAV4B/wH+AY4BMwL/AY8BHwH/Ab4BZQFA + Af0IAAMRARcDFQEdAykBPwMzAVIDKAE8AVMCVQGwAaYBwgHfAf8CTAFdAfMDOgFiAy0BRgMvAUoDGAEh + AxUBHQMPARQMAAMpAT4BawFpAWcB8gG/AbsBsQH/AawBrQGmAf8BxgK6Af8BrgKUAf8BrwGaAZcB/wNe + AdACVQFXAboBVAG/AekB/gFUAeoB/AH/A1sByAMJAQwEAAG1ATsBAAL/AWkBBwH/Ae8BZwEMAf8BuwFz + AWgC/wHoAeYC/wHnAegC/wLvAv8C9gL/AvoG/wL7Af8B8gLPAf8BswFiAV8B/wFyATIBIAH/AbIBOgEA + Af8DSQGJBAABtAFrAT0B/AH/AbsBXAH/Ae8BmwFbAf8B3QHRAdIB/wHmATUBEgH/AeEBnQGRAf8B5QHt + Ae8B/wHlAd8B3QH/AuYB6AH/AeABygHFAf8B8gGCAUkB/wH9AY0BMwL/AZgBKAH/Ab0BYwFAAf0EAANL + AZADXAHnAVwCVQHqAVsCWAHjA1sB4QNaAd4BZQJdAfABzQG5AbUB/wF1AWUBYgH8A1oB5ANfAeADXQHi + A1wB5wNgAesDWAHjA0ABcAMWAR8DNwFbA1UBtQGHAXMBoQH/AV0BWAGMAf8BWQFbAYEB/wG6AbgBtgH/ + Ab4BrAGrAf8BuwGmAaUB/wHCAawBogH/AUQBQgFoAfUBNAGSAb0B+wFdA/8BRQHGAfUB/wJGAUcBgAQA + AbUBOwEAAf8B/gFzARUB/wHKAVkBIgH/AfEBwwG7Af8B/AHTAcoB/wH3AdEBzwH/AdoBogGlAf8B2QGe + AaEB/wGrAVQBXgL/AvQC/wL1Av8B/gH9A/8B/QH/AbkBZAFbAf8BtQE7AQAB/wNMAZEEAAG0AWsBPQH8 + Af8BvAFfAf8B8AGgAWIB/wLmAeoB/wHlAZYBhwH/AecBywHHAf8B7QH6Af4B/wHtAfEB9QH/Ae4B+gH+ + Af8B5gHYAdQB/wHwAWIBMwH/Af0BigExAv8BnAEwAf8BvQFiAUAB/QQAAZQCjQH5AfIC8AH/AeIC4AH/ + Ad0C2wH/AdwC2QH/Ac4CzAH/AdMC0gH/AecC5gH/Ae4C7AH/AfIC8QH/AfIC7wH/AfQC8QH/AeQB6QHi + Af8BxwHmAcoB/wHQAcsBygH/A1cBxQNWAbMBDwGWAeIB/wEHAZAB6AH/AQABgQHqAf8BAAFnAegB/wEk + AVQBvAH/Aa8BpQGfAf8BzgHAAb4B/wHMAbgBsgH/AacBmgG2Af8BMwFyAc0B/wFFAdAB8gH/AVkB+QL/ + AWED/wFQAYEBoQH3AywBRAG1ATsBAAH/Af4BhwEnAf8BwgFpAVYB/wHVApkB/wHWAZ0BngH/AdcBoQGj + Af8B8wLeAf8B+ALsAf8BtgFkAWwB/wH9AeUB5AL/AuwC/wLzAf8B9QHPAc0B/wGNAT8BKgH/Ad4BSwEA + Af8DSwGQBAABtAFoATwB/AH/AcABZgH/AfMBnAFdAf8B6AHSAdAB/wHqAekB5wH/AesB3wHcAf8B6wHZ + AdUB/wHrAdkB1gH/AewB4QHaAf8B5wHBAbUB/wHvAUgBFgH/AfwBhgEsAv8BoAE1Af8BvQFhAUAB/QQA + AboCtwH9Ae4C8AH/AdIC0wH/AdUC1gH/AdUC1gH/AcMCxAH/Ac8C0AH/AfQB9QH0Af8B8QLyAf8B8QLy + Af8B8QLyAf8D8wH/AekB7gHqAf8B3AHuAeAB/wHiAeAB3wH/A1kBxwFaAWQBaQHhAUABjgGcAfQBKwGz + AcwB/QEWAbEB7wH/AQ8BoQHvAf8BWQGGAagB/wGpAZ4BlgH/AdECxgH/AdsBywHGAf8BvQGnAb4B/wFH + AaYB4AH/AVoB/QL/AVsB/AL/AVkB9QH8Af8BTwHbAfMB/wJXAVkBwgG1ATsBAAL/AZUBOwH/AdsBYgEm + Af8BywGMAYQB/wHwAcIBvwL/Ae4B6wL/Af0B/AX/AfkC5gH/AbgBYwFrAv8B4wHiAv8B6QHoAf8BswFd + AVkB/wGzAW8BQAH/AfIBUwEAAf8DSwGQBAABtAFnAToB/AH/AcUBcAH/Af0BowFUAf8B9wGZAVAB/wH4 + AZoBUAH/AfgBlwFMAf8B+AGXAUgB/wH4AZQBRQH/AfgBlAFEAf8B+QGPATwB/wH8AYEBKgL/AZEBMgL/ + AaABOQH/Ab0BXwFAAf0EAAGwAqoB/AHlAuYB/wHbAtwB/wPfAf8D3wH/A+AB/wHhAuAB/wPgAf8D3wH/ + A+AB/wPgAf8D4AH/AeEB4AHhAf8B7wHsAe8B/wHhAt0B/wNZAcMDDAEQAy8BSQFdAVwBXQHiAZsBjwGe + Af8BcgFqAYgB/wFyAWwBcwH/AZ8CnQH/AdYCzQH/AeQB2wHZAf8B+wHiAdgB/wGPAZQByQH/AUoB0wHw + Af8BgAP/AV8B4AH0Af8CWAFpAeYCNAE1AVUBtQE7AQAC/wGhAVAC/wFvAQwB/wH8Ac8BqQH/AeABqAGO + Af8BygGGAXAB/wHlAawBqQH/Af4B4AHeAv8B/AH7Af8BuQFoAW8C/wHWAc0B/wHyAcEBvAH/AYIBKQEe + Af8B6QGqAWgB/wH2AVQBAAH/A0sBjwQAAbUBYwE3AfwB/wHOAZMB/wH4AdgBvgH/AfgB1wG6Af8B9wHU + AbUB/wH1AdIBswH/AfIBzwGwAf8B8QHNAa4B/wHxAckBqwH/Ae8ByQGpAf8B7AHMAa0B/wHoAcQBqQH/ + AfsBrwFbAf8BvgFbAUAB/QQAAYMCfwH0AfcC+AH/A/EB/wPwAf8B7gLvAf8D7gH/AewC7QH/AeoC6wH/ + A+kB/wPoAf8D5wH/A+UB/wPjAf8B6wLsAf8BzwLKAf8DVQGxAT0CPgFqASIBUQGgAfoBDwFeAcIB/wEU + AWcB0wH/AQkBVgHOAf8BIAFOAbwB/wGoAaABogH/AeQB2QHUAf8B8QHpAeoB/wGwAbYB2QH/AVYBZQG+ + Af8BKwGaAdkB/wGIAf4C/wGdA/8BWAFmAXsB7wIhASIBMQG1ATsBAAL/Aa4BZgL/AW8BDAL/AdwBvgL/ + AdwBvgH/Af4B2QG4Af8B6gG5AZ0B/wHNAYkBbwH/AdsBnQGZAf8B+gHTAdIB/wG8AWcBawH/AbYBZwFe + Af8BrQE/ASwB/wH8AcEBjAH/AfYBVAEAAf8DRAF8BAABtQFhATQB/AH+AdMBngH/AfUC+AH/AfwD/wH8 + A/8B/AP/AfoB/QL/AfoB+wH9Af8B+gH3AfkB/wH5AvQB/wH5AfIB8wH/AekB5gHqAf8B8gGzAWkB/wG+ + AVoBPAH9BAABYQJgAd8I/wH5AvoB/wH2AvcB/wPzAf8B7gLvAf8B6gLrAf8D5wH/AeIC4wH/A94B/wHZ + AtsB/wPWAf8B3QLeAf8BqAKiAf8DSAGIAVgBYgFlAd0BGAHeAv8BDQHVAv8BAAG6Av8BAAGiAv8BTwGa + Ad8B/wHIAbQBrgH/AekB4AHdAf8B7gHpAfAB/wFGAYwB1AH/AVgBzAHvAf8BiwHnAfcB/wGXAf0C/wGj + A/8BmAP/AlkBXAHMAbUBOwEAAv8BuwGIAv8BbwEMFf8B8gLlAf8B0gKlAf8BpAFCAUsB/wHLAaoBqQH/ + A/YF/wH2AVQBAAH/AyUBNwQAAbUBYQE0AfwB/QHSAZwB/wH2AfUB8gr/AvwC/wH5AfYC/wH3AfIC/wHz + Ae4C/wHwAekC/wHxAesB/wHwAeUB5AH/AfIBswFnAf8BvgFaAToB/QQAA1cBugHfAtUB/wHjAtkB/wHc + AtMB/wHbAtEB/wHaAtAB/wHXAs4B/wHVAswB/wHUAssB/wHTAsoB/wHRAskB/wHPAsgB/wHQAskB/wHX + AtAB/wFwAl8B+wM0AVQDMgFQAzUBVgNVAbUBcAGQAaAB/wGkAcIB2gH/AcMBygHQAf8BywG+AbsB/wHz + Ae4B7QL/Af0C/wGGAagB4QH/AXMB2wHzAf8BxAP/AbcD/wFIAa0B4gH/AUIBWQGGAfUCVwFhAd8BtQE7 + AQAC/wHJAZ8C/wGyAWsC/wFvAQwC/wFvAQwC/wFvAQwC/wFvAQwC/wFvAQwC/wFvAQwC/wFvAQwB/wH+ + AW8BDAH/Af4BbwEMAv8BbwEMAv8BbwEMAf8DKgFAAwQBBQQAAbUBYAEyAvwB0gGdAf8B9AHzAfEG/wH8 + AfsC/wH3AfYC/wH0AfEC/wHyAe0C/wHuAegC/wHuAecC/wHzAe8B/wHsAeUB5AH/AfABsgFoAf8BvgFX + ATkB/QQAA0wBkgG3AqEB/wHGArAB/wHBAqwB/wHCAq0B/wHDAq4B/wHEArAB/wHGArMB/wHIArYB/wHL + ArkB/wHOAr0B/wHRAsEB/wHZAssB/wHWAsMB/wFkAlcB8QMdASoIAAMsAUQBXAFUAUEB+AHsAeEB3AH/ + AeYB3QHbAf8B5QLaBf8B3wHZAdMB/wFBAUkBXwH7AU0BqAG+Af0B0QP/AdED/wGNAccB6gH/A04BlAMB + AQIBtQE7AQAC/wHVAbUC/wHVAbUC/wHVAbQC/wHWAbUC/wHVAbMC/wHVAbMV/wG1ATsBAAH/AyoBQAME + AQUIAAG1AWABMgH8AfsB0gGdAf8B8wHxAfAC/wL+Av8B+QH1Av8B9QHxAv8B8QHtAv8B7gHnAv8B7QHm + Av8B7wHpAv8B9gHzAf8B6wLlAf8B8QGzAWoB/wG+AVgBOgH9BAADPQFoAZYCggH+AcoCtQH/AcYCsgH/ AcYCswH/AcgCtAH/AcoCtwH/AcsCuQH/Ac0CvAH/AdECwAH/AdMCxAH/AdcCygH/Ad8C0gH/AckCtQH/ - AVsCWgHhAwwBEAwAA0oBjAFgAlsB/wGfApUB/wG0ArMB/wGIAYcBiAH/A1YBuANDAXcBUgFlAXwB6gHf - Af4C/wHnA/8B6wP/AVIBbQGhAfcDJAE2AbUBPgEAAv8B4AHHAv8B4AHHAv8B4AHHAv8B4AHHAv8B4AHH - Bf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/Ax0BKgMEAQUDAgEDCAABvgFe - AUAB/QH6AdQBoAH/AfIB7wHwAv8B/gP/AfgB9gL/AfUB8QL/AfEB7AL/Ae8B6wL/AfMB7gL/AfUB8wL/ - AfwB+wH/AewC6gH/AeABpQFgAf8BvwFWAS0B/QQAAyYBOAF9AnEB9gHGArEB/wHHArMB/wHHArMB/wHJ - ArYB/wHLArkB/wHNArwB/wHQAr8B/wHSAsMB/wHVAsgB/wHbAtAB/wHdAtEB/wGwApwB/wNWAcEQAAMB - AQIDNAFUA0IBdAM+AWwDMQFPAwsBDwMAAQECWQFeAskB+QL/AfsH/wHRAfgB/gH/AVoBWwFdAcgBtQE+ - AQAV/wG1AT4BAAH/AysBQgMHAQoDAwEEAwMBBAMCAQMDAAEBEAAB0AFfATAC/wHhAacB/wH3AfoB8wf/ - AfoD/wH1Av8B/AHyAv8B/gH2A/8B+gP/Af0F/wHxAfUB7gH/AecBswFqAf8B0wFZARoB/wQAAxABFgFn - AmMB6gHDAq0B/wHPArsB/wHQAr4B/wHRAr8B/wHUAsMB/wHXAscB/wHbAssB/wHeAtAB/wHhAtYB/wHp - At4B/wHdAssB/wGYAoQB/wNMAZIsAAJIAUkBhwExAV8BpgH7AU0BbgGpAfoBSgFrAacB+gFJAWoBsgH7 - AUEBTgF6Ae8DAQECAbUBPgEAAf8BtQE+AQAB/wG1AT4BAAH/AbUBPgEAAf8BtQE+AQAB/wMdASoDBAEF - AwIBAyAAAVYCVAGrAaoBWgEyAfsBkgFZAVYB9QGSAVkBWAH1AZIBWQFWAfUBkgFZAVQB9QGSAVkBTAH1 - AZIBWQFUAfUBkgFZAVQB9QGSAVkBVAH1AZIBWQFUAfUBmgFXAVEB9wGqAVYBLAH7AVgCVgG7CAADUQGc - AYACeAH6AZUCiwH7AZYCgAH6AZYCgQH6AZkCgwH6AZoChgH6AZwCjAH6AZ0CkAH6AZ4ClQH6AZsClgH7 - AZMCfwH8A18B4AMhATAYAAMhATEDQAFwA1ABngMpAT8EAAMKAQ4DEQEXHAADBAEFAxQBHAMnAToDLAFE - AygBPQMjATQDHgErAxgBIgMUARsDEAEVAwwBEAMJAQwDBAEGAzoBYQNYAccDWQHMA1oBygNaAcoDWgHK - A1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAc4DWQHDAzQBVQNKAYwDVgG2A1UBsQNVAbEDVQGx - A1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1YBtgNOAZgUAAFfAl4B2QHFArIB/wHP - ArsB/wNYAcADKQE/A1sBywNdAdIDMQFPGAADHwEsAlcBWgHFAVcBWgFgAdYDVwG/A1ABpANKAYsDQQFy - AzgBXQMxAU4DLQFFAygBPQMjATQDGgElA2UB7gPiAf8D3QH/A9oB/wPaAf8D2AH/A9gB/wPXAf8D1wH/ - A9UB/wPVAf8D1AH/A8gB/wPaAf8DmQH/A1cBvQFuAUABNQH9AbQBdgFoAf8BsAGGAXYB/wG0AYgBgAH/ - AbIBiAF3Af8BsQGGAXcB/wGuAYYBdwH/Aa0BhQF3Af8BrAGFAXYB/wGqAYQBdgH/AakBgQF1Af8BqAGC - AXYB/wGmAYEBdQH/AacBgwGCAf8BrAF1AW8B/wFIAT0BOQH0CAADOgFiAzgBXgMyAVEBhQJ7AfYB5gLS - Af8B5wLYAf8BxQK0Af8BnQKOAf8BzAK6Af8B4ALMAf8BjQJ/Af4DNwFbEAADAgEDAk8BUQGcATgB3gL/ - AUYBswHHAf8BKAGNAa0B/wEXAZYB0QH/ARIBfwHHAf4BLQFaAY4B9QFKAVcBaAHoAVcBWgFeAdUDVwG/ - A1IBpgNJAYkDNAFUA40B9wT/A/QB/wPzAf8D8wH/A/EB/wPwAf8D7gH/A+0B/wPrAf8D7AH/A+cB/wOW - Af8D0AH/A8wB/wNZAcMBpgFTAUIB/QHzAdsBzgH/AeAB0QHGAf8B3wHNAcEB/wHaAckBvwH/AdoByAG9 - Af8B2gHFAbsB/wHZAcUBugH/AdkBxQG4Af8B2AHDAbYB/wHYAcEBtAH/AdgBwQGyAf8B1gG/AbAB/wHY - AcQBtQH/AeQBvAGoAf8BWQFIAUQB8gQAAzUBVwGvAp0B/wG4AqQB/wGlApMB/wHHArQB/wHhAtEB/wHt - AuEB/wHsAt8B/wHjAtIB/wHbAs4B/wH0AusB/wHxAuIB/wFZAlcBwhAAAw4BEwFNAV8BdAHoAVgB0wH0 - Af8BswFzAVMB/wHiAakBhAH/AcEBlAFpAf8BpgGYAXQB/wGCAaMBnQH/AVcBsAHMAf8BOwG4AfYB/wEn - AbEC/wEbAZ4C/wELAVkB0wH/A1EBoAOFAfYD+wH/A+oB/wPrAf8D6gH/A+gB/wPnAf8D5gH/A+QB/wPj - Af8D5AH/A98B/wOcAf8D0AH/A8QB/wNWAcEBpAFSAUAB/QHvAccBnAH/AcQBpQGCAf8B2QGsAXUB/wHz - AbcBdwH/AfEBsQFuAf8B8gGtAWcB/wHyAakBXwH/AfIBpAFZAf8B8gGgAVMB/wHyAZwBTAH/AfIBmQFF - Af8B8gGVAT8B/wH1AZUBPAH/AfYBkAE1Af8BVgFHAUAB8QMMARABbAJpAecBzAK5Af8B3QLLAf8B2gLH - Af8B2ALHAf8B6QLcAf8B8QLmAf8B9gLsAf8B9gLtAf8B9gLtAf8B/QL2Af8B3QLQAf8DYQHcA0UBfgME - AQYIAAM4AVwBKQGpAfQB/wFiAaMBtAH/AeQBtAGLAv8BzwHEAv8B1gG9Av8B3AG2Af8B+wHIAZ0B/wHm - AbMBhAH/AcQBoAFwAf8BnwGbAXcB/wF0AqoB/wFRAc4C/wFYAVkBXAHNA4cB9gP8Af8D7QH/A+0B/wPs - Af8D6gH/A+kB/wPoAf8D5gH/A+UB/wPlAf8D4QH/A9MB/wPqAf8DwQH/A1YBwQGoAVEBQAH9AeYBywGu - Af8B0AHcAeMB/wHVAb0BpgH/Af4BvQGAAv8BvAGAAv8BtgFwAv8BsgFpAv8BrgFiAv8BqQFcAv8BpQFW - Av8BogFPAv8BnwFJAv8BnwFFAv8BmQE9Af8BWQFHAUAB8QQAA0wBkAHMAroB/wHpAtsB/wHoAtsB/wHt - AuAB/wHyAuYB/wHeAtEB/wHQAsMB/wHlAtoB/wH8AvQB/wH9AvcB/wHnAtsB/wHbAsYB/wGxAp4B/wM6 - AWIEAAMDAQQDVgG2AUkBzwL/AZcBkAGAAf8B/QHVAboB/wH0AbsBuQH/Af0B3gG/Af8B/gHdAb8C/wHm - AcsC/wHnAcsC/wHnAckC/wHRAa4B/wHRAaABWgH/AR8BiQHSAf8DSgGKA4gB9gP9Af8D7gH/A+4B/wPt - Af8D6wH/A+oB/wPpAf8D5wH/A+YB/wPmAf8D4wH/A6IB/wPTAf8DxwH/A1YBwQGnAVEBQAH9AfAB1gG6 - Af8B6AHzAfoB/wHhAcoBtAH/AfsBvAGBAv8BvQGCAv8BtwFzAv8BswFtAv8BrwFmAv8BqwFhAv8BpwFb - Av8BpAFUAv8BoQFPAv8BogFMAv8BnAFGAf8BWQFHAUEB8QMVAR0DSAGEAcACqwH/AeYC1wH/AewC4AH/ - Ae8C4wH/AX8CegHvA0IBdAMsAUQDSAGFAakCpAH6Af8C/AL/AvsB/wH5AvMB/wHwAuUB/wNTAaoEAAMZ - ASMBMQFZAZgB9QFqAckB6wH/AcgBoAF1Af8B/AHTAdEB/wH2AcsBxQH/AfwB4wHKAf8B/QHgAcoB/wGu - AaABgQH/AeIBxQGwAv8B3QHFAf8B9AHJAawB/wH4AdgBqwH/AVgBWQFaAdsDIwEzA4kB9gP9Af8D8AH/ - A+8B/wPuAf8D7AH/A+sB/wPqAf8D6QH/A+cB/wPpAf8D5AH/A5EB/wPNAf8DywH/A1YBwQGlAVMBQAH9 - AfsB1AGqAf8B4wHDAaIB/wHvAcABlgL/AcIBjAL/Ab4BhQL/AbkBdwL/AbUBcQL/AbEBagL/Aa4BZQL/ - AaoBXwL/AacBWQL/AaQBVAL/AaYBUgL/AaABSwH/AVkBRwFBAfEBZwJiAeQBwQKrAf8BzQK2Af8B5ALW - Af8B8wLpAf8BzQK9Af8DNAFVCAADCwEPAYQCfwHzAf8C+gn/Af0C9gH/A1sBywMAAQECQQFCAXMBMQGg - Af0B/wGVAbABrQH/Ae0BxAGkAf8B9QHHAdUB/wH4AeEB0gL/AekB2wH/Ac8BwwGnAf8BMgGkAUMB/wFY - AZEBTwH/Ad8BuwGsAf8B9QHLAbQB/wH4Ac4BoAH/A0oBigMTARoDiQH2A/4B/wPxAf8D8QH/A/AB/wPu - Af8D7QH/A+wB/wPqAf8D6QH/A+gB/wPmAf8DywH/A+gB/wPHAf8DVgHBAagBVAFAAf0B5wHKAagB/wHD - AbgBrQH/AdcBtQGWAv8BxQGPAv8BwQGKAv8BvAGDAv8BuAF1Av8BtAFvAv8BsgFpAv8BrgFkAv8BqwFe - Av8BqAFZAv8BqQFYAv8BpAFRAf8BWgFJAUEB8QFpAmYB4AHSAr0B/wHiAtIB/wHtAuIB/wH4Au0B/wGU - AowB+QMdASkEAAMUARsDVQGyAdgCxwH/Af4C+wX/AbMCqQH7A1EBoAMoAT0DBAEGAlkBXgHJAWEByAL/ - AbgBpgGFAf8B+QHWAdMB/wHzAcsB2AH/AfcB6wHeAf8B/AHkAd4B/wGBAbEBcAH/AWIB6AGfAf8BVAHb - AY0B/wFYAZYBUgH/AesB1gHLAf8BYgFhAVwB3AMpAT8DDQERA4kB9gT/A/MB/wPyAf8D8gH/A/AB/wPv - Af8D7QH/A+wB/wPqAf8D6gH/A+gB/wPIAf8D5QH/A8kB/wNWAcEBqAFTAUAB/QHrAdYBvwH/AeQB8wL/ - AdsBygG5Af8B+wHDAY0C/wHEAY8C/wHAAYcC/wG8AYIC/wG5AXQC/wG1AW8C/wGyAWkC/wGuAWQC/wGr - AV8C/wGtAV4C/wGoAVkB/wFaAUkBQwHxA1IBoQHUAsIB/wH2AuwB/wHyAugB/wH3Au4B/wHYAskB/wNg - AdYDVwG4AWoCaAHoAc4CuwH/AewC4Qn/AYICewHzAx0BKgQAAygBPAEhAU8BvQH6AZUBzgHiAf8B2AG2 - AZEB/wH3AdMB7AH/AfMB4AHkAf8B/AHuAewB/wHKAdABuAH/AVMBxgFtAf8BYQG6AWoB/wFeAc8BhAH/ - AVUB6AGbAf8BUwGZAU8B/wNOAZcDLwFKAxkBIwOLAfYE/wP0Af8D9AH/A/MB/wPxAf8D8AH/A+8B/wPt - Af8D7AH/A+0B/wPoAf8DiQH/A8kB/wPQAf8DVgHBAacBVQFAAf0B9gHcAb0B/wHnAeAB2AH/AecBzAGw - Af8B/gHHAZUC/wHGAZMC/wHCAYwC/wG+AYcC/wG7AYEC/wG4AXQC/wG0AW8C/wGyAWoC/wGvAWYC/wGx - AWUC/wGsAV8B/wFgAUkBQwHxAxwBKAFgAl8B0QGMAoQB8wHgAtEB/wH3Au8B/wH5AvEB/wHoAtoB/wHc - AskB/wHfAs8B/wHsAuMC/wL+Cf8B8ALlAf8DWAHBAwEBAgJPAVABmwFBAZ4C/wG1Ab4BqgH/AfIBzgG+ - Af8B9wHTAe8B/wH8AfMB8QL/AfEB9AH/AWEBugFiAf8BXAG6AWMB/wHrAd4B2AH/AcgB0gG5Af8BZgHK - AXAB/wFLAe4BlQH/AVkBXQFZAdcDNwFaAykBPwONAfYE/wP2Af8D9QH/A/UB/wPzAf8D8gH/A/AB/wPv - Af8D7QH/A+0B/wPqAf8DsAH/A9wB/wPPAf8DVgHBAagBWAFAAf0B9QHXAbAB/wHUAbYBmAH/AegBvwGZ - Av8BzgGeAv8ByAGYAv8BxQGRAv8BwQGMAv8BvgGGAv8BuwGBAv8BtwF0Av8BtQFwAv8BsgFsAv8BtQFr - Av8BsQFlAf8BYAFKAUMB8QQAAwgBCwFlAmIB3AHQArsB/wH1AuwB/wH9AvgG/wL9Av8C/gn/AfQC7QH/ - Af0C+wH/Ad0C0wH/A0ABbgQAATkBTgGLAfABhwHOAf0B/wHOAbkBkgL/Ad0B8QH/AfwB3gHuAf8B3gHb - AdQB/wHmAtsB/wHEAdIBtgH/AfEB6gHjAv8B8wH1Av8B9wHuAf8BhgGDAZYB/gNVAboBSQG/AWYB+gFZ - AV4BWQHXAzABTQONAfYE/wP3Af8D9gH/A/YB/wP0Af8D8wH/A/EB/wPwAf8D7gH/A+0B/wPrAf8D4gH/ - A/QB/wPMAf8DVgHBAagBVwFAAf0B5gHUAbwB/wHSAdoB4AH/AdUBxAGxAf8B/AHNAZ0C/wHLAZwC/wHH - AZUC/wHDAZEC/wHBAYsC/wG+AYYC/wG7AYIC/wG4AXYC/wG2AXEC/wG4AXEC/wG0AWsB/wFgAUwBQwHx - CAADVQGwAdwCywL/Av0B/wH8AvUB/wHrAuEB/wH6AvYJ/wGKAoQB8gNEAXkDVAGuA0oBjAgAAVYBXQFz - AeIBvAHjAeQB/wHpAccBkgH/Ae4B1wHQAf8BVwGcAUoB/wESAYoBDQH/AREBgAEKAf8BTgGDATgB/wHv - Ad0BzgL/AfIB4AH/AecB4QHCAf8CWQFdAdIDGwEmAyIBMgFaAV4BWwHIAVgBWwFYAcYDjQH2BP8D+QH/ - A/gB/wP4Af8D9gH/A/QB/wPzAf8D8gH/A/AB/wPxAf8D7QH/A50B/wPSAf8D0gH/A1YBwQGoAVgBQAH9 - AfAB4QHNAf8B5gHxAfkB/wHfAdMBwwH/AfwB0gGlAv8B0gGlAv8BzgGfAv8BywGZAv8ByAGUAv8BxAGQ - Av8BwgGLAv8BwAGHAv8BvQGCAv8BvgGEAv8BvAF0Af8BYAFMAUUB8QgAAxIBGQNSAaMB2wLNAf8BbwJq - AeIDQAFuAXcCcgHnAf8C/gH/AfwC+QH/A1wByRQAAy0BRQNVAbIBWgJdAcoBWQFqAWYB7AFJAcoBRAH/ - AUsB3QFJAf8BPgHYATgB/wEaAYwBKgH/AY0BrAHFAf8BqgHMAdcB/wFZAWoBiAHsAzEBTwMIAQsDAAEB - AwIBAwMfASwDkAH2BP8D+wH/A/kB/wP4Af8D9gH/A/QB/wPzAf8D8gH/A/EB/wPxAf8D7QH/A5YB/wPP - Af8D1AH/A1cBwgGjAXEBTQH+Af8B8gHNAf8B+gHeAcUC/wHbAbgC/wHgAbIC/wHeAa0C/wHZAaYC/wHW - AaIC/wHTAZwC/wHPAZgC/wHNAZQC/wHLAZAC/wHIAYwC/wHLAYwC/wHGAYcB/wFfAUoBPQHzEAADMgFQ - Ax8BLAQAA0oBiQFvAmoB4gNWAbEDNQFXIAADIAEuA1sBwwGEAasBhAH3AVwBYAFcAdQDPQFpAz4BawJB - AUIBcwMfAS0DBAEFAwABAQwAA5kB+Bz/A/4B/wP9Af8D/QH/A/sB/wPfAf8D9gH/A9QB/wNXAcIBWQFI - AT0B8gF7AU0BQAH6AXkBTQExAfoBeQFNATIB+gF4AU0BMgH6AXcBTQExAfoBdwFNAS8B+gF2AU0BLgH6 - AXYBTQEsAfoBdQFMASoB+gF1AUoBKgH6AXUBSgEpAfoBdQFJASkB+gFqAUMBNQH5AXcBOAErAfwBWAJW - AdmAAANbAcsDswH+A7gB/QO4Af0DuAH9A7gB/QO4Af0DuAH9A7gB/QO4Af0DuAH9A7gB/QO6Af0DvgH+ - A3QB9QM7AWVMAANWAbMDUgGpAzUBWAMtAUUDHAEnAxcBIAM7AWUBVwFkAWYB2wNBAXMDGgEkAwQBBhgA - AxUBHQNCAXYDVQGyA1cBwgNWAcEDVAGrAz4BawMPARQcAAMQARYDWwHIA2QB8QNiAe8DYgHvA2IB7wNi - Ae8DZwHyA1oB0wMUARsUAANWAbMBZwJNAfIBXAJXAeADVgG2A0QBeQMoATwDDQESKAADUgGpAQABlgHt - Af8BWQJeAdADRAF7AzUBVgJPAVEBnAEsAYoBtgH3AS0BhgGeAfUDPAFmAykBPgMXASADCgENAwIBAwwA - A0MBdwFjAlIB6gGtAXsBegH+AdoBoAGdAf8B4gG1Aa0B/wHeAa0BpQH/AcsBkQGKAf8BfAFDAUAB/AFY - AlYB3AM4AV0YAAMEAQYDdAHrA/oB/wPwAf8D8AH/A+8B/wPyAf8D8gH/A1cB3xQAASwCKwFDAaABbgFq - AfkB/wHjAdQB/wHvAcABswH/AdABmwGTAf8BlgFrAWkB/gFtAUQBRQH4AVgCUwHkA1cBvwNIAYYDLwFK - AxABFhgAAzEBTgEAAWEB6gH/AQABLQH0Af8BQwFnAX8B7gFWAV4BYAHZAQEBgwL/AQABMAHxAf8BUAFv - AXkB8QNTAaoDQQFyAzEBTwMhATEDDQESCAADUAGjAbICcQH9AfsC5AL/AekB5gL/AdkBzwL/AekB2QL/ - AegB1gL/AecB1QL/AdoBygH/AdwBmgGRAf8BXAI8AfgDRQF/CAADBAEGAyoBQQM/AW0DSgGLA1kB6wO9 - Af8DvwH/A7wB/wO9Af8DvgH/A60B/wNXAeUDTQGWA0IBdgMwAU0DFAEbBAABSQJIAYcB3wGsAaUC/wHc - AcUC/wHXAcEC/wHfAc0C/wHhAdMC/wHbAdAB/wH0AcgBvwH/AdkBpAGeAf8BrgFsAWkB/wFpAUQBQwH7 - AVkCTgHrAVkCWAHHA04BlAMlATcLAAEBAw4BEwFRAXABfQHmAQIBHQH3Af8BCgEwAv8BDQFUAv8BCQEU - AfgB/wEAAWcB+AH/AbkBywG1Av8B3gGvAf8BhgFyAWQB8QNQAaQDNgFZAyIBMgQAA0sBkAHEAYgBigH+ - Bf8B/gH8Av8B6QHnAv8BzQHDAv8B2AHJAv8B2gHJAv8B1wHGAv8B2gHHAv8B5QHRAf8B9AG1AacB/wFc - ATwBOwH4AzgBXAQAA1oBzQN+AfwBtwG4AbkB/wHQAdEB0gH/Ac4BzwHQAf8B2gHbAdwB/wLlAeYB/wHi - AeMB5AH/AeIB4wHkAf8B4wLlAf8C5QHnAf8BzAHRAc8B/wG7Ab8BvQH/AqwBrQH/A3kB/ANZAdIEAANb - AcgB8gHNAcQC/wHbAc0C/wHWAcwC/wHZAdEC/wHaAdQC/wHdAdYC/wHiAdkC/wHnAd0C/wHoAd4C/wHf - AdQB/wH6AcwBwQH/AeMBrQGmAf8BowFQAU8B/wNVAbIEAAMCAQMDCwEPAx0BKgFYAWABZQHWASYBYgH9 - Af8BWwFjAf0B/wFNAVgB/AH/ASoBPgH8Af8BDgGUAfUB/wHEAcMBpQL/AdsBpQL/Ae8BxwH/AewBvgGV - Af8DUQGnAzMBUgMqAUEBlgJlAfkB/wHwAe8C/wH7AfkC/wHwAe8C/wHvAe4C/wHZAdEC/wHcAcwC/wHg - Ac4C/wHYAccC/wHTAcEC/wHUAcEC/wHjAcwB/wHcAZQBhwH/AVgCVgHcAxABFgO8Af0C+AH3Af8B1QHR - Ac4B/wHTAdABzQH/AdIB0AHNAf8B0QHPAcwB/wHGAcQBwgH/AbcBtgGzAf8BvgG8AbsB/wLNAcsB/wLR - Ac8B/wHPAdEBzgH/Ac4BzwHNAf8D2QX/A2wB8wMcASgBfAFjAWEB8AH/AeEB2gL/AeAB3AL/AeEB3wL/ - AuMC/wLlAv8C5wL/AuUC/wHhAeAC/wHdAdsC/wHbAdUC/wHdAdAC/wHsAd0B/wHGAYIBdgH/A08BmwQA - AwkBDAMwAUsBWQFgAWMB1AE1AZoB/AH/AaUBsAH+Af8BnQGrAf0B/wFyAY0B/AH/AVQBZwH7Af8BHQFK - AfkB/wEUAYEB5gH/AZ4BrgGhAf8B/gG+AYMC/wHjAbAB/wGhAYQBaAH3A0UBfQFVAlMBsAHxAbsBuQL/ - AdwB1wL/AdsB2AL/Ae4B7QL/AfcB9QL/AdQB0QL/AbkBsgL/AcYBuwL/AdgBxwL/AdYBxAL/AdIBvgL/ - AdYBwQL/AdABugH/AY8BRAFAAf0DPgFrAa8BswG1AfsBuwGwAaYB/wGwAW4BPQH/AcYBiAFPAf8BxgGA - AUoB/wHGAXIBRQH/AcQBbgE/Af8BxAFoAToB/wHEAWMBNgH/AcIBXgEwAf8BwgFYASoB/wHCAVQBJwH/ - AcEBTAEeAf8BmQFCASEB/wHSAdQB1gH/A2gB8AE+Aj0BagG/AYsBigH+Af8B7AHrAv8B5wHoAv8C7gL/ - AvcB/wH+AvgB/wH8AvMB/wH+AvUC/wHvAe4C/wHqAesC/wLlAv8B5gHiAv8B0gHNAf8BgAJBAfkDMAFL - BAADQgF2AS0BdQGjAfYBIAFtAv8BjgGmAv8BjAGlAv8BjAGaAf0B/wFvAYgB/AH/AUYBYgH9Af8BJQFL - Av8BAQEtAv8BAAFdAfIB/wFVAaQBvAH/AcMBhAFLAf8BywFxATYB/wNWAcEBdQJiAekB/wHvAekC/wHk - AdwC/wHSAcsC/wHZAdIC/wHLAcoB/wH9AaoBrwH/Af4BwAHDAf8B/QGuAbQB/wH+Aa8BqwL/AdYBwwL/ - AdMBvwL/AdABvAL/AdoBwwH/AcwBhgFxAf8DUwGtAasBsQGzAfsBvQGvAaEB/wHmAaIBZAL/AbwBhwL/ - Aa4BcgL/AaUBaQL/AZwBYAL/AZQBWQH/Af4BjAFQAf8B/QGFAUcB/wH9AXUBQAH/AfwBbgE5Av8BZgEu - Af8BwAFPASIB/wHMAtAB/wJoAWkB8AFWAlQBqwHwAckByAL/AvoC/wH8Af0B/wH+AvoB/wH0AeUB5gH/ - AeYBvgG9Af8B3QGYAZMB/wHvAdIB0Ab/AfQB9QL/AfAB7wL/AfQB9QH/AfACvAH/AVsCVgHhAw8BFAQA - AVgBXQFgAcsBWAFgAWgB1gFCAXQBmQH1AScBiQHKAf8BFQGVAekB/wFTAYoB/gH/AWcBdAH8Af8BGgGL - AfkB/wE7AaYB4AH/ASoBiwHOAf8BIgGAAcUB/wErAaYB2gH/Aa8BhwFeAf8B3wGXAU0B/wFuAV8BVwHo - AaoBdwFxAfkB/wH3Ae4C/wHrAeIC/wHpAd4C/wHYAc0C/wGpAaoB/wHiAbYBugH/AacCbwH9Ab4BmwGc - Af4B/QGuAbMC/wHBAbUC/wHWAcIC/wHPAbsC/wHZAcIB/wHfAZ4BjgH/A1cBwgGtAbEBswH7Ab0BrwGj - Af8B4QGgAWQC/wG5AYcB/wH5AawBcwH/AfgBpAFrAf8B+AGdAWMB/wH2AZYBXAH/AfYBjgFUAf8B9QGI - AU4B/wH0AYEBRwH/AfMBdAFAAf8B/QFtATcB/wG9AVQBKgH/Ac0C0AH/AmgBaQHwAWkCXwHjAfwB5wHm - Af8B+gHoAeUB/wHmAcEBvAH/AdIBmQGWAf8ByAF3AXUB/wHKAXMBcQH/Ac8BcgFtAf8B0wGDAXQB/wHy - Ad0B2gb/AvgC/wL+Af8B0gGRAZAB/wNTAbAQAAJdAVoBygGEAS8BAAH/AUwBUgFMAf8BJwGLAv8BOAFj - Av8BTAGYAcgB/wHvAZwBSwH/AYYBNwEBAf8BdwExAQAB/wGUAT8BCgH/AdsBjAE6Af8B1wGVAUwB/wGH - AWoBTAHzAa8BggF/AfsB/wH1Ae0C/wHoAd8C/wHqAd8C/wHYAc4C/wGzAbYB/wHSAbIBswH/AVgBMQEw - AfcBpwJvAv0BwAHFAv8BuAGuAv8B1wHBAv8BzwG7Av8B2AHCAf8B4gGiAZIB/wNXAcIBrQGxAbUB+wG8 - Aa8BowH/AeIBowFoAv8BvQGLAf8B+gGxAYAB/wH5AakBbwH/AfkBogFoAf8B+AGbAWEB/wH3AZQBWgH/ - AfYBjgFUAf8B9gGIAU0B/wH1AYIBRgH/Af0BdgFAAf8BvgFbAS8B/wHNAtAB/wJoAWkB8AGhAXcBbgH3 - Ad0BnwGcAf8BsgFZAVcB/wGjAUUBRAH/AaYBSgFJAf8BsAFYAVcB/wG4AWMBYgH/Ab8BbAFrAf8BwAFm - AWMB/wHOAXYBbwH/AfcB3wHZBv8B9QHzAf8BowFPAU0B/QM9AWoQAAJZAVcBvwGeAVMBFQH/Ab4BhwFI - Af8BJQGFAfMB/wEGAVYB/QH/AVMBXAFdAf8BiwFFARIB/wFtATcBCQH/AWMBKwEAAf8BZAEpAQAB/wGA - AToBBQH/AY0BSQESAf8BbgFZAVQB6wGUAmsB9QH/AfQB7QL/AeoB4QL/AecB3AL/AeMB2wL/AbABsgH/ - Ae4BsgG2Af8B0gGyAbMB/wHiAbcBuQH/Af0BqAGtAv8BywHEAv8B1AHDAv8BzwG6Av8B2wHEAf8B2wGX - AYoB/wNVAbEBrQGxAbUB+wG7Aa4BogH/AeMBpgFrAv8BwgGQAf8B+wG1AYQB/wH6Aa4BdQH/AfkBpwFt - Af8B+AGhAWcB/wH4AZoBYAH/AfcBlQFbAf8B9gGOAVQB/wH2AYkBTgH/Af4BhgFIAf8BvwFfATQB/wHN - As4B/wJoAWkB8ANXAboB4QGzAbUB/wHhAaEBpQH/Ac4BhwGIAf8BvQFqAWwB/wGtAlkB/wGlAk4B/wGk - AkwB/wGpAVMBUgH/AaoBTgFNAf8ByQFxAW0B/wH9AewB6gL/AeEB3AH/AWQBSQFHAfEDHAEoEAACSQFI - AYgBzwGIATkC/wHGAXcB/wFWAaUB6QH/AQoBgwH0Af8BrgGcAZEB/wG9AaABgwH/Ab0BpAGKAf8BtQGY - AXQB/wGdAW8BSgH/AWQBMAEEAf8BhAE8AQUB/wFbAlkBxAFjAloB2AH4AeQB3gL/AfAB5gL/AeMB3AL/ - AeUB4QL/AdcB1QL/Aa8BsgL/AbIBtwL/Aa0BsQL/AcoBzAL/AeUB5AL/AdgB0wL/AcoBvAL/AdEBvAH/ - Aa4BdAFqAf4DQgF2Aa4BsgG2AfsBuwGuAaIB/wHjAasBbwL/AccBlQH/AfsBugGJAf8B+wG1AYMB/wH6 - Aa4BdAH/AfkBqAFuAf8B+QGgAWcB/wH4AZwBYgH/AfcBlQFbAf8B9gGRAVYB/wH+AY8BUQH/Ab4BZAE6 - Af8BzAHOAc0B/wFoAmkB8AMYASEBfgJwAewB/wHmAekC/wHUAdcB/wH9AcoBzQH/AfUBvQHAAf8B5QGn - AaoB/wHSAY4BjwH/Ab8CbgH/AbABXAFdAf8BoQFCAUMB/wHQAYoBiAH/AekBowGdAf8DWQHMFAADHAEo - AasBeAFHAfoB9wHTAa0B/wGzAc4B7wH/AWgBsQH3Af8B/gHzAecB/wHoAdEBugH/AekB0AG3Af8B6wHR - AbgB/wHmAcwBtAH/AdcBtAGOAf8BrQFyATMB/gM7AWQBSQJIAYcB3QGsAaYC/wH5AfIC/wHlAeIC/wHj - AeAC/wHmAeIC/wHjAd8C/wHUAdIC/wHbAdkC/wHrAeoC/wHoAecC/wLmAv8B4wHfAf8B/QG3AasB/wFn - AVUBVAHrAxQBGwGuAbIBtgH7AbsBrgGiAf8B4wGwAXMC/wHMAZsB/wH8Ab8BjgH/AfsBugGIAf8B+gGz - AYEB/wH6Aa0BcwH/AfkBpgFtAf8B+AGjAWgB/wH4AZ0BYgH/AfcBmQFeAf8B/gGXAVoB/wG+AWoBPgH/ - AcsBzQHMAf8BaAJpAfAEAAM7AWUBxgGzAbQB/QH/Ae0B7wL/AdwB3gL/AdoB3QL/AdgB3AL/AdUB2AL/ - Ac0B0AH/AfsBwwHHAf8B7gG7Ab8B/wHgAZwBnQH/AYwCRwH5AzwBaBgAA0QBegHyAcYBmwH/Af0B6gHY - Av8B7gHhAf8B/gH7AfMB/wH3AeQB0wH/AfMB2AHBAf8B8wHcAcUB/wH4AecB0wH/AfgBxQGTAf8DUQGg - AxABFgMPARQBagJbAeEB8wHdAdcC/wH9AfoC/wHrAegC/wHpAeUC/wHrAeYC/wHsAecC/wHmAeMC/wHq - AekC/wHuAe0C/wH3AfYC/wH+Af0B/wG3AWgBZQH9A0MBdwQAAa4BsQG2AfsBuwGuAaAB/wHoAbkBhAL/ - AdgBpwL/AcsBmgL/AcUBlAL/Ab4BjAL/AbkBhwL/AbMBgQL/Aa4BdAH/Af4BqAFuAf8B/gGkAWoC/wGk - AWYB/wHCAXEBRAH/AcsBzAHLAf8BaAJpAfAIAANYAbwB8wLoAv8B9wH5Av8B5wHqAv8B4wHmAv8B5AHn - Av8B7QHwAv8B5AHmAf8BvAGhAaIB/QFcAlkByQMvAUogAAJHAUYBgAG6AaABjgH4Af4B9QHqAv8B/QH4 - Av8B/AH4Af8B/gH4AfEB/wH+AfUB6QH/AcsBsgGJAfwDUAGdAw0BEgMDAQQEAAMpAT8BggJdAfAB8wHi - Ad8G/wH5AfcC/wH0Ae8C/wHyAe0C/wHtAekC/wH0AfIG/wL4Af8BwwGHAYYB/gNRAaIIAAGvAbMBtwH7 - AbMBpwGaAf8BzAGcAVsB/wHmAbkBggH/AeUBrgFwAf8B5QGoAWsB/wHkAaMBZgH/AeQBngFhAf8B4wGa - AV0B/wHiAZYBWAH/AeIBkgFUAf8B4QGOAVAB/wHkAY4BTQH/AakBYAEzAf8CyQHKAf8DaQHwCAADFgEf - AX4CcQHrDP8B/gH2AfcB/wHIAaQBpQH+AV0CWgHTATECMAFNLAADKgFBAlYBVQG0AY8BfwFyAfAB7AHJ - Aa4B/wGaAYgBeQHyAloBVwG9ATUCNAFVAwcBCQMBAQIMAAMqAUEBagJdAeIB3QGvAa4B/wH3AekB6AL/ - Af0B+AP/AfsC/wH4AfMC/wHwAe0B/wHsAsoB/wGVAm0B9wNLAY4MAAG9Ar4B/QHbAdgB1gH/AbQBpAGV - Af8BuwGqAZkB/wG6AaoBmgH/AboBqQGaAf8BugGoAZoB/wG5AagBmQH/AbkBqAGaAf8BuQGnAZgB/wG5 - AagBmQH/AbgBpwGYAf8BuAGkAZYB/wGyAaUBmgH/Au0B7gH/A24B8wwAA0ABbgHHArgB/QT/AcoCsQH+ - AV8CWQHXAzcBWmgAAxABFgFJAkgBiAFiAlsB1gGSAWcBZgH0Aa8BgAF5AfsBqgJqAfkBcgJfAegBVgJV - AbEDKgFBEAADbgHlA7cB+wGpAawBrwH6AakBrAGvAfoBqQGsAa8B+gGpAawBrwH6AakBrAGvAfoBqQGr - Aa8B+gGpAasBrwH6AakBrAGuAfoBqAGrAa4B+gGoAasBrgH6AacBqwGtAfoBqQGsAa8B+gO5AfwDXAHJ - DAADAQECA1cBuAFsAmUB5QE9AjwBaAMDAQQ0AAMIAQsCUwFVAbACSQGaAfMCMgGaAfMCUwFVAbADCAEL - qAADEAEWAzoBYQNVAbQDSwGOAwMBBCAAAwQBBgMCAQMEAAMBAQIDUAGdAjsC/wIAAfQB/wNQAZ0DAQEC - BAADAgEDAwQBBiQAAz0BaQFfAl4B1wNSAaFgAAMJAQwDNwFaA1QBqwFhAlwB6gGuAqgB/QHlAuEB/wGI - AoEB/gNVAbEDDQESGAADJQE3A0gBhAwAA0IBdAIsAfAB/wIAAc0B/wNCAXQMAAJHAUgBgwMmATgcAAMD - AQQDXgHZAbkCtAH/AWECXwHVAwEBAhgAAw0BEgMeASsDAwEEAxYBHgFUAVgBWQHdAUcBUAFeAeoDQgF0 - AxEBFwMcASgDNwFaA0QBewMoAT0MAAMpAT4DVAGuAWMCXwHqAakBqAGnAf0B3QLXAf8B+QH3AfgB/wH+ - A/8B+gH+Bv8BrwKoAf8DWQHPAxkBIxAAAwwBEAJRAVIBpwM7AWQDJAE1AwABAQQAAzkBXwIKAccB/wIA - AasB/wM5AV8HAAEBAyQBNQM7AWMCUQFSAacDDAEQGAADVQGyAaICmwH/Ab0CuAH/A0sBjgMAAQEYAANX - Ab0BOQFEAV0B8ANHAYIDIAEuASwBRAFlAfQBAAGIAfQB/wEAAVABpgH/A1kBzAFfAlUB6AGZAVQBUwH/ - AbQCZAH/AVkCSAHyAzgBXggAAYUCfwH1Ad8C0wH/AfoB8QHyBf8B+AH2AfgB/wH3AfUB9gH/AfMB6AHg - Af8B8QHLAaoB/wHxAdsBxQX/AccCwgH/AVcCVgHiAy0BRgwAAz4BawNEAXoDRAF5A0IBdAMAAQEEAAMw - AUsCEAGRAfsCEAGFAfsDMAFLBwABAQNCAXUDRAF5A0QBegM+AWsUAAMtAUUBewJ5AfoBxwLBAf8BawJq - AeYDDQESHAABNQFEAWQB9AEAAYwB/AH/AQABVAGsAf8DWAHGAVsBUAFPAekBhQGBAZUB/wEuAb0B/QH/ - AQABnwHgAf8BnQGSAbEC/wG7AbcB/wH+AasBqgH/AcsBYQFjAf8BYAJBAfkDMAFNBAAB4QLTBf8B/gH9 - AfsC/wH7AfMB/wH+AfYB5gH/AfsB5AHAAf8B/AHMAZAC/wG0AVcB/wH3AaIBSQH/AeoBxQGrAf8B/QP/ - AtUB2AH/A1MB8QM6AWIIAANQAZ0DNQFWA0oBjAM0AVQDPwFtBAADFQEdAkwBYQHkAkwBYQHkAxUBHQQA - Az8BbQM1AVUDSgGMAzUBVQJPAVEBnA8AAQEDOwFkAW4CbAHuAbsCtAH/AboCtQH/AzoBYgQAAwMBBANM - AY8DQwF3AxsBJgwAAzABTQFRAVQBYQHuAS4BtQH2Af8BAAGVAeIB/wFyAYMBpwL/AbsBrwH/AeQBygHH - Af8BYwHVAe8B/wGLAa4BygH/Af4BqgGnAf8B8AKOAf8B7AGEAYgB/wHMAWYBaQH/AVsCWAHZBAADVgGr - Aa8CqQH6AfsB+gHqA/8B3gL/AfcBywL/AeEBpwL/AckBhAL/AbQBWgH/AfcBnAE/Af8B5gGDATIB/wHe - AaUBhwH/AfYB9wH6Af8B5QHmAekB/wFfAlgB+QNKAYoDBAEGA0oBigM+AWoDQgF2A0sBjgMyAVAEAAMl - ATcCSAFgAesCSAFgAesDJQE3BAADMQFPA0wBjwNCAXYDPgFqAkgBSQGICAADDQERA1sBwwGcApYB/wG9 - ArcB/wHGAr8B/wNaAb0DBAEGA0oBiwNaAcUBtwKxAf8BvwK4Af8DPwFtDAADFAEcAWcCWwHhAfYB1wHT - Af8BZQHhAfkB/wFfAcUB5wH/AfUBxwHFAv8BwwG7Av8BsgGuAf8B/gGuAa0B/wH7AbEBtAH/Ae8BqwGk - Af8B3wGQAYoB/wHoAYMBhAH/AY8BTQFOAf8IAAMpAT8BYAJfAs8BwwG4Af4B/wHsAcsC/wHaAZ0C/wHB - AW0B/wH9Aa0BUQH/AfIBmQFEAf8B5AGDATcB/wHUAV4BIAH/AdABgAFZAf8B6wHfAd4B/wLpAesB/wFn - AlwB/QNLAZACRAFFAXwDPQFnAz0BZwNPAZcDEgEZAwoBDQJXAVkBwgIAAdMB/wIAAaEB/wJXAVkBwgMK - AQ0DEgEZA04BlgM9AWcDPgFqA0IBdAQAAwQBBQNUAawBsAKnAf8BxAK8Af8BwAK4Af8BuAKyAf8DWwHD - A14B0AGpAqQB/wHIAsIB/wHJAsIB/wFmAmUB4wMUARwMAAMcASgBkAFuAXAB/gH/AeQB3gH/Af4B1wHQ - Af8B+AHGAcQC/wHBAcMC/wHHAcoC/wHSAdMC/wLeAv8B4wHiAv8B3AHXAf8B8QG2Aa4B/wHFAXIBawH/ - AWECXgHgEAADPgFqAW4CbAHlAeIBxgGyAv8BvwF2Av8BpQFEAf8B7gGRATwB/wHgAXYBNgH/AdMBXwEn - Af8BwwE9AQwB/wG8AUYBKQH/AeEBvQG5Af8B3wHUAdYB/wNbAdADRAF7Az0BZwM9AWcDTwGXAxIBGAMO - ARMCTgFrAeQBHAEuAv8CAAH0Af8CTAFhAeQDDgETAxEBFwNOAZYDPQFnAj0BPgFqA0IBdAQAAzMBUgGm - Ap0B/wHDArcB/wHJAsYB/wPTAf8B1wLVAf8BoQKWAf8BvAK1Af8ByQHCAcEB/wGVAo4B+QNNAZEDEgEY - EAADBAEGAUoCSQGJAZsBjAGNAfsB9gLVAv8B7gHtAv8B/QH8Bv8B/AH5Av8B8AHtAv8B4AHbAf8B8wHI - AcIB/wHTAaEBnAH/AYUBXgFbAf8DOAFcFAADBAEGA0wBkwGLAX8BfgH0Ae0BrwGKAf8B8AGNAUQB/wHe - AW0BMAH/AdABYgE3Af8BxAFfAUIB/wG3AVgBRgH/AbwBhQF3Af8BuAGoAaoB/wNVAbQDSgGKAz0BaQNC - AXYDTAGPAywBQwQAAzsBZQE7AT8BjAHzAjIBhwHzAzsBZQQAAysBQgNMAY8DQgF2Aj0BPgFqAkkBSgGJ - BAADVgGzAb0CsgH/AbsCsgH/AcgCxgH/AeIC4wH/AeAC3QH/AagCngH/AZ0ClgH7A1QBpgMaASUfAAEB - AzEBTgNWAbMBegF2AXMB7AHJAbcBsQH/AdEBvAG3Af8BzQG1Aa8B/wGlAZQBkgH7AV8CXQHSAXICZwHy - AdYBygHJAf8BtQGxAbIB/wM5AV8cAAMaASUDWwHGAcUBnwGUAf8BywGcAY0B/wG8AZ8BnQH/AbYBpAGl - Af8BtgGpAasB/wG2AaYBpwH/AV8CUgH0AyUBNwJPAVEBnAM1AVUDSgGLAzIBUANSAaMDEQEXBAADFgEe - AxYBHgQAAxEBFwNSAaQDMgFRA0oBiwM1AVYDUAGdBAABYgJhAd8BuQGuAawB/wGIAXIBcwH/AaUCmwH/ - AewC6wH/AbgCrgH/AakBngGaAf8BQgFeAX4B9QNCAXQDMwFTAjwBPQFoAyMBNAMzAVMYAAMBAQIDFgEf - AyIBMgMoATwDJgE5AyYBOQMjATMDYAHeBP8BygLDAf8DNgFZIAADWQHHAbkBrQGwAf8BvQGyAbYB/wG6 - Aa4BsAH/AbsCrAH/AcgCtgH/AYECfwH+A0IBdgQAAz4BawNEAXkDQwF4A0IBcwM5AV8DUgGjAy4BRwMR - ARcDEQEXAy4BRwNRAaIDOgFgA0IBcwNEAXkDRAF6Az4BawQAAxYBHwNcAc8BiwFyAXAB/wGzAqYB/wG7 - ArMB/wG+AbUBtAH/AcQBrgGrAf8BGQGrAckB/wEAAcsB/AH/AQABrAHsAf8BAAGzAfAB/wEAAZQB3QH/ - AQABngHnAf8DTgGZDAADAgEDAxUBHQMWAR8DFgEeAxsBJgMjATQDNQFXA08BlwNhAdcB3ALaAf4B6gLl - Af8DWwHGAw4BExwAA1QBqwHCArMB/wHQAsMB/wHJArwB/wHIArwB/wHRAsQB/wG6Aq0B/wNXAb0IAAMM - ARACUgFUAaYDNAFUAkcBSAGDA0QBegM0AVQDTAGPA08BlwNPAZcDTAGPAzQBVANEAXoCRwFIAYMCNAE1 - AVUCUQFSAacDDAEQCAADUAGdAaMBnQGZAf8BpAGSAZAB/wGmAZMBkgH/AbQBqwGpAf8BPwGwAb0B/wEX - AdMB7wH/ARoB1gHzAf8BGQHVAfQB/wEaAdEB8wH/ARsB1QH2Af8BFQGyAeQB/wJTAVQBrAwAAwoBDQNX - AbgBcgFmAWcB6gF8AWwBbQHuAbkBpAGiAf0B0gG4AbYB/wHgAcsBygH/Ae0B2QHaAf8B4gLWAf8BdgJy - AekDTgGWAxYBHhwAA0IBdgGuAqEB/gHfAtYB/wHUAssB/wHUAssB/wHaAtEB/wHaAs8B/wFiAlkB7AMS - ARkMAAMjATMDUgGpAjQBNQFVA0MBdwNKAYsDQgF2Az0BZwM9AWgDQgF2A0oBiwNDAXcDNQFWA1IBqQMi - ATIMAANQAZoBcgGjAbYB/wGbAa0BsAH/AZIBwgHDAf8BgQHiAeMB/wErAYwBvwH8A0ABcQM7AWQDOgFi - AzoBYQM6AWEDMgFQFAADQwF4AYMCbgHvAZABdAF3AfEBdwJtAecBZgJiAdoDWwHEA04BlQM6AWADHQEq - AwEBAhwAAykBPgGOAosB+QHwAuwB/wHjAt8B/wHlAuEB/wHpAuYB/wHyAu0B/wGMAoIB+wM2AVkUAAMj - ATQCUQFSAacDRAF7AzUBVgM9AWkCPAE9AWcCPAE9AWcCPQE+AWoDNQFXA0QBewJRAVIBpwMjATQQAAMc - AScCRwFIAYMBWgJdAcoBWAFwAYIB7wFaAl0BygNIAYZsAAMhATABcAJsAewE/wP4Af8B9ALzAf8B7ALq - Af8B6QLmAf8BvwK3Af8DTwGcHAADDwEUAz4BawNQAZ0DSgGKA0QBewNEAXsCSQFKAYkCTwFRAZwCPQE+ - AWoDDwEUmAADQAFxAagCoAH5AYwCiQHyAXACbAHmA2AB1gNYAcEDVAGuA0YBfwMDAQQwAAMRARcDSAGI - A1cBvwNWAcEDTAGTAxsBJtgAAwYBCAMxAU8DQgF2A0gBhwJRAVwB3wEEAQUBsgH/AgsBywH/AgwBygH/ - AhkBmAH/AlYBVwHcAygBPFgAAwcBCgNEAXoDUgGpA0UBfQMmATgDCgEOFAADPwFuA1YBwQNXAb8DVgG+ - A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1gBwANWAb4DOQFfDAADPgFrAV4BVwFW - Ad8BmwFXATwB+gG8AX0BPQH+AVQBNAFvAf4BBgELAdQB/wErASwB7wH/AS8BMAH3Af8BSQFIAv8BWgFT - Av8BNgE1AcAB/wJZAVoBzgMKAQ4BXwJZAdcBhgFkAVIB9wF7AWIBWwH2AXsBYgFeAfYBfQFiAVsB9gF9 - AWIBWQH2AX0BYgFaAfYBfwFiAVgB9gGBAWIBTAH2AYMBYgFJAfYBgwFiAUkB9gGFAWIBSQH2AYUBYgFJ - AfYBhQFiAUkB9gGLAWUBUQH3AWABWgFXAdkUAAFVAlMBsAHlAaYBTQH/Ae4ByAGXAf8BqwGDAVsB/gF0 - AVIBOgH3AVcBVgFRAd8DVAGrAz4BawMjATMDBAEGBAABgQJ0AfYB2QLTAf8ByQK4Af8BuAKfAf8BvAKi - Af8BxAKpAf8BvgKkAf8BvAKqAf8ByQLBAf8B0gLMAf8BxwK9Af8BxQKwAf8B3gLAAf8B5ALFAf8BwgKT - Af8DVwHFBAADAwEEA1MBqgG7AZwBYwH9Af8B1gGqAv8B2QGcAf8B2wGzAZoB/wEhARsBvgH/AR4BIAHp - Af8CMAH3Af8CTQL/AVABVAHzAf8BNgFHAeAB/wE8ATQB7AH/AlMBXgHlAw8BFAF5AVsBWQHyAd8B2wHf - Af8B5wHgAeIB/wHhAbcBqgH/AeYBtAGSAf8B6gG5AZAB/wHdAbEBnQH/AdkByAHGAf8B2gHVAdoB/wHa - AdIB1QH/AdsB1AHXAf8B2wHUAdgB/wHcAdUB2AH/AeEB3AHfAf8B3AHbAeEB/wGAAWQBUwHxBAADFgEf - AVkCWgHKA1kBxANKAYoB0QGuAWkB/QG4Ab8BbwH/Ab4BxAGdAv8B7wHQAv8B7AHJAf8B9gHXAa0B/wHc - AbQBhgH/AakBgAFNAf0BbQFJATQB9gFdAVcBVAHgA04BmAG3AqoB/QH6A/8B4gLaAf8BzQK6Af8B1AK+ - Af8B0AK8Af8B0gLKAf8B+AL3Df8B8QLtAf8B4ALUAf8B+QLaAf8B4wKxAf8DWAHLBAADUAGdAecBrQFz - Av8B7gHEAv8B3wG1Av8B6AGsAf8BqwGXAaAB/wEBAQIBxQH/ARQBFgHzAf8CRwL/AV4BTwH7Af8BQgFO - AewB/wEfAbkB6QH/ARsBVQHAAf8DVgG+BAABcgFhAVwB7gHtAewB7wH/Af4BwwGfAf8B/gGpAUwB/wHY - AZcBawH/Ab0BggFuAv8BrQFXAf8B6QGcAVwB/wG8AaABnQH/AcMBswG0Af8ByAK3Af8BzAK8Af8B0ALB - Af8B3QHQAdEB/wHsAeoB7QH/AXoBYQFVAe4EAANIAYQBaAHvAZEB/wFTAb8BZwH/AT8BdQEgAf8BZAG9 - AVUB/wE1AcYBRAH/ATsBlwErAf8B6QHHAaMC/wHlAcQC/wHqAcwC/wHyAdkC/wH1Ad0C/wHsAdAB/wH6 - AdUBqQH/AWUBVQFQAeoBpgKSAfwB7wLyAf8B2ALPAf8BxQKxAf8ByAKyAf8BwAKzAf8B5QLfAf8B+gL3 - Af8B9gL1Af8B7wHwAfEB/wHyAvAB/wH3AvIB/wHeAtkB/wHYAsEB/wHaAqoB/wFbAloByAMvAUoBpgF0 - AUwB+gH/AccBkQL/AdMBnwL/AccBjgL/AdIBhwH/Ab0BlwGCAf8CAAHGAf8BJQEjAv8BZAFqAfoB/wE9 - AWkB3QH/AUIBPQHeAf8BMQGDAfwB/wEDAbIB7wH/AUIBUgFhAe0DNgFZAXICYQLuAd8B4AL/AbYBdQL/ - AdoBjAH/AZsBjAHEAf8BRAE/AdAB/wH3Ac4BjwH/AfwBsQFfAf8B5QG+Aa4B/wLrAe8B/wHsAuUB/wHs - AuYB/wHtAucB/wHyAu0B/wHuAe0B7gH/AXoBYQFYAe4EAAM6AWEBnAHfAa0B/gHuAf8B8gH/AaUB+AG5 - Af8BoAHxAbEB/wGoAf8BwAH/AWgBvwFmAf8B8gHZAbkC/wHnAcoC/wHoAcwB/wH9AegBzwH/Af0B6QHT - Av8B+AHqAf8B9QHdAcIB/wNTAa0BpgKRAfwB8ALzAf8B2QLQAf8ByAKzAf8BwAKtAf8BzALBAf8B7gLl - Af8B6ALmAf8B1ALSAf8BywLHAf8BygHJAcgB/wHkAuAB/wHuAuYB/wHWAskB/wHRAqMB/wFbAloByAFa - AlgBwAHOAXUBNgH/AdEBjAFJAf8B/AHDAXcC/wG9AWwC/wG8AWIB/wHtAbABVwH/ATcBJAGlAf8CPgL/ - AWsBcgH+Af8BIwHBAfcB/wEWAYoB4wH/AVcBJwGQAf8BVgGEAacB/wEAAYgB6AH/A1ABnQFyAmEB7gHy - AekB6AH/AfwBywGoAv8B8QHIAf8BsQGvAeMB/wFvAW0B4wH/AfsB8AHOAf8B9QHCAZgB/wHGAaABlAH/ - AcMBtwG5Af8BygK4Af8BzgK+Af8B0ALAAf8B2wLQAf8B8AHvAfIB/wF8AWMBXQHuBAADUAGeAYwB6AGl - Af8B4QH/AeMB/wG6Af8BwQH/AXUB/wGCAf8BdAHyAZEB/wFbAaMBUQH/Ae0B1wHBAv8B7wHXAf8B+wHq - AdUB/wH7AewB2wH/AfoB7gHgAv8B/gHxAf8BmgGDAV8B+wMqAUEBpgKQAfwB8ALzAf8B2QLQAf8BxwKy - Af8BvQKsAf8B0wLHAf8B6gLiAf8B4wHhAeAB/wGRAY0BjAH/ATABLgEtAf8BoAGdAZsB/wHZAdcB1gH/ - AewC5QH/AdoC0AH/AckCnwH/AVsCWgHIAYIBZgFRAe0BqgFaAR8B/wGXAUEBBgH/AcMBcQEuAf8B+QGx - AVUC/wGxAVYC/wG8AVMB/wG1AXMBTgH/AUgBPgGvAf8BXgFcAe4B/wFLAWsB3QH/AQoBtQHvAf8BRQGV - AbMB/wG4AWoBVAH/AlcBXgHZAyEBMAFyAmEB7gH2AfUB9gH/Af0B4gHUAv8B5AHJAf8BowGeAcMB/wFg - AV0BqAH/Af0B3gHDAf8B9wHVAcQB/wHeAdMB0QH/Ad4C1gH/AeIC2AH/AeQC2gH/AeQC3AH/AesB5QHm - Af8B9AH1AfgB/wF8AWUBYQHuAzsBZAFfAcUBfwH+AdoB/gHlAf8B2AH/AdwB/wGsAf8BuAH/AYkB/QGT - Af8BnAH6Aa0B/wE/AcABWAH/AWMBjAFHAf8B+AHnAdoB/wH9AfIB5AH/AfkB7wHjAf8B/AH4AfAB/wH8 - Ae0B3AH/AV0CWQHSAwEBAgGkApAB/AHwAvMB/wHZAtAB/wHHArIB/wG+Aq4B/wHVAsgB/wHoAuEB/wHo - AeUB5AH/AV4BWQFYAf8DAAH/AYECcwH/AeAC3QH/AeoC4gH/AdsC0gH/AcYCnwH/AVsCWgHIAZ8BcQE+ - AfgBjQFFAQ4B/wFyAS4BAAH/AZsBTAEQAf8B8QGtAVoC/wHEAXUC/wHOAYcB/wHUAZABOwH/AWoBLwEP - Af8BVAEtATwB/wGSAUgBMgH/AaIBmgGJAf8BMgGsAfkB/wGeAYMBgAH/A1ABnQQAAXMBYwFhAe4B+QH4 - AfkD/wH7Af8BxAHJAcoB/wFPAYoBsgH/ATIBagGfAf8BggGZAacB/wHsAd0B2AH/Ad8C1QH/AdwC0gH/ - Ad8C1gH/AeEC1wH/AeIC2QH/AeoC4wH/AfgB+QH7Af8BfAFnAWEB7gEwAjEBTQFqAbYBiQH5AdAB+AHT - Af8ByAH9AdUB/wHjAf8B7wH/Ab8B/gHPAf8BiwHvAZIB/wFjAeMBhwH/AUoBnwFCAf8B8gHfAdoB/wH9 - AfgB7wH/AfcB8QHtBf8ByAGnAZEB/gNCAXQEAAGkApAB/AHwAvQB/wHZAtAB/wHIArMB/wG8AqwB/wHQ - AsUB/wHsAuQB/wHjAuAB/wGuAaUBpAH/AWoCYAH/AbUBrQGsAf8B4ALdAf8B7wLlAf8B2QLNAf8BywKh - Af8BWwJaAcgBqAFqAUEB+QGJAUYBEAH/AZMBTQERAf8B2wGeAVMB/wH9AcsBigH/AeEBrAFrAf8BrwFx - AT0B/wGPAU0BGAH/AW8BLgEAAf8BbgErAQAB/wGGAToBAAH/AbIBXQEWAf8BnAFlAU4B/wGsAWsBRQH/ - A1EBogQAAXYBZQFjAe4B/gL7Af8B8wH6Af0B/wGbAdgB+QH/AYIBvQHiAf8BbwGyAdcB/wFbAbYB4gH/ - AbQBygHXAf8BygG1AbIB/wHFArUB/wHKArsB/wHOAr8B/wHRAsEB/wHbAtAB/wL6AfsB/wF8AWkBYQHu - AwQBBgFtAWkBWgHnAdQB8QHQAf8BowHtAbYB/wHMAf8B2wH/AZIB7wGjAf8BkAHUAY8B/wG2AdUBqQH/ - Ad8B4wHQAf8B/QH2AfMB/wH2AfQB8gH/AfcB+AH5A/8B/AH/AWwBXwFUAe4DDQESBAABowKPAfwB8AL0 - Af8B2QLQAf8BxwKyAf8BxAKwAf8BxwK8Af8B8QHoAekB/wH4AfkB+wH/AecC5QH/AeQC3gH/AeEB3gHd - Af8B8gHsAe0B/wHqAeQB5QH/AdYBxQHGAf8B1gKmAf8BWwJaAcgBgAFnAVQB6wHHAYkBPgH/AfMBtQFl - Av8B1AGbAf8B/gHdAbYB/wG+AZsBcwH/AZMBZwFIAf8BngF0AVQB/wGdAXEBTwH/AZABXwE3Af8BgAFF - ARUB/wFgASgBAAH/AXcBNwEAAf8BlwFjATQB/gNCAXQEAAF2AWcBZQHuAv8B/gH/AesB9QH8Af8BrgHc - AfcB/wHYAfcC/wHAAfAC/wF2AcoB8wH/Ab4B2AHnAf8B9QHwAe0B/wHxAu0B/wHzAu4B/wHzAu8B/wHz - AvAB/wH3AvQB/wH+A/8BfQFqAWEB7gNRAaIB+wHaAbwF/wHIAekBzAH/AY0B5QGaAf8BkAHZAZUB/wH0 - AesB5wL/AfgB/QL/AfoB+wH/AfUB9wH1Af8C9wH4Af8B/QH+Av8B7QHVAcgB/wNRAacIAAGjAo4B/AHw - AvMB/wHYAs8B/wHEArEB/wHKArQB/wHEArMB/wHQAcgBxwH/AdABxwHDAf8D7AH/Ad4C4AH/AfwC+gH/ - AfQB7gHtAf8B1ALNAf8B3QLBAf8B2gKoAf8DWQHJAlYBVQG0Ac4BiQE7Af8B7AHBAZAC/wHwAdsC/wH1 - AekB/wHyAekB3wH/Ad0BygG2Af8B2QHEAa4B/wHgAcwBuAH/AdoBxgGwAf8ByQGuAZQB/wGhAW4BRwH/ - AbEBYgEjAf8BagFUAUoB7gMYASEEAAF2AmkB7gT/AfwB/QL/Ac8B5wH3Af8B1QHsAfoB/wG0AeEB/QH/ - AZ4B1QH6Af8C3gHiAf8BuQGhAZ8B/wG4AqQB/wG+AqsB/wHDArAB/wHEArQB/wHSAcQBxQH/Af0B/gL/ - AX8BbAFjAe4BlgGAAVUB8wH/AfwB9wX/Ae8B2QG/Af8BvQHGAYsB/wHnAfQB5wL/AvsB/wH4AfoB/AH/ - AfoB/QL/AfwD/wH9B/8BlgF8AV8B+wMmATgIAAGzAqgB/QH3AvwB/wHeAtcB/wHJArYB/wHQAroB/wHZ - AccBywH/AaYBjQGBAf8BmAFSASEB/wGaAZYBkwH/AWsBcAFzAf8B6gLsAf8B5wHdAdQB/wHkAcsBsQH/ - AeoBxwGrAf8B0wGmAaUB/wFbAloBzgMpAT4BnAFuAUgB9gHuAdEBsAH/AfgB7gHiAf8B/QHzAekD/wH8 - Af8B+QHwAecB/wHvAdYBvgH/AfAB1gG+Af8B7wHWAb4B/wHxAd0ByQH/AfoB2AGyAf8B1QGGAUEB/wNO - AZQIAAGAAnEB8gj/AfsD/wHfAfIC/wHTAe0C/wHvAfsD/wL+Af8B7QLpAf8B7gLrAf8B8ALtAf8B8QHu - Ae8B/wHyAe8B8AH/AfUB9AH1Bf8BhgF0AW0B8QJAAT8BbgFiAV0BWgHTAboBogGKAfkB7wHUAbYB/wHz - AcwBrAH/AfMB1AG4Af8B7QHLAawB/wHsAcsBrwH/AfQB3gHKAf8B9QHiAdUB/wH3Ae0B5gH/AfcB5QHZ - Af8DWwHQAwEBAggAAY0ChQH3AeUC3wH/AdQCxwH/AcYCtAH/AcwCuAH/AdgBwgHEAf8BvQGmAaIB/wGf - AYEBagH/Aa0BoQGgAf8BqwGjAaQB/wHLAb8BwAH/AdMBwgHBAf8B4gHPAcYB/wHhAcgBugH/AckBpQGk - Af8DUQGnBAADRAF6AcwBpQFgAf0B/AHsAdcB/wH6AfIB5wH/AfsB8wHrAf8B/AH0AesB/wH3AeUB1AH/ - AfcB5AHSAf8B+QHuAeAC/wHzAdsB/wHyAbEBdAH/AVsCWQHEAwQBBggAAWACXAHUAYkCdAH3AYEBcQFu - AfYBhQFxAW0B9gGFAXEBawH2AYcBcQFoAfYBiQFxAWgB9gGIAXEBZwH2AYkBcwFrAfYBjQFzAWgB9gGN - AXMBZwH2AY0BcwFkAfYBjQFzAWIB9gGNAXMBYgH2AZYBdwFtAfcBXwJaAdgIAAMlATcCTwFOAZcBbgFm - AV8B4AHKAbEBmgH9AfMB3AHDAf8B/AHrAcoB/wGwAX8BZgH+A1UBsgJTAVIBqAFbAlkBxAMtAUUMAAE9 - AjwBZwFSAlEBoQFgAl0B1wF+Am8B+gFkAlkB7AFWAlQBqwNQAZ0BUgFRAVIBoQNSAaEDUgGhAVICUQGh - A1IBoQNSAaEDUgGkA0wBkwMYASEIAAJHAUYBgAGhAXsBYgH2AfcB4gHMAv8B/QH3B/8B/QP/AfoC/wHu - AdcB/wG8AYcBbQH8A1YBtgMMARBcAAMHAQoDMAFLAlYBVQG0AZIBdQFlAfQDVQG1aAADKAE8AlYBVQG0 - AXsBagFdAekBswGQAYEB+QG6AZsBewH6AYkBbgFdAfABXAJZAckDOgFh/wAZAAMfASwDSwGPA1UBtANX - Ab8DWAHAA1cBvQNUAa4DQQFzAw0BEmAAAwwBEANOAZQDVQG1A1UBtANVAbQDVQG1A1YBtgNWAbYDVQG6 - A1YBvgNBAXMYAAMFAQcDAQECLAADMgFQAUYBWAFGAe8BKgGYAT4B/wExAbABTwH/ATUBuAFWAf8BNgG4 - AVYB/wEyAbMBUQH/ASwBnQFDAf8BLAFSAS0B/QNXAcUDDwEULAADDwEUA04BlwNGAYADAwEEIAADSAGH - AZ4BQAFDAf8BsQFNAVAB/wG1AVABUwH/Ab4BWAFaAf8BxwFfAWEB/wHPAWcBaAH/AdQBawFsAf8B2QFw - AXEB/wHVAXYBdwH/AVsCVgHlAwYBCBAAAlMBVQGtAR0BdgHSAf8BQgFrAZYB9QFYAVkBWwHHAk0BTgGW - AzsBZQNKAY0BpAFtAVEB9wFjAV0BWQHXAVYCVQG0AU0CTAGRAUACPwFuAyUBNwQAAVkBXwFXAeABQAHV - AWsB/wFNAeUBiAH/AVgB4QGNAf8BXgHiAZIB/wFfAeEBkgH/AVsB4wGPAf8BUgHlAYsB/wFIAeABdQH/ - ASkBZwEtAf4DQAFxKAADJQE3AVQBWwFVAeEBJwGSASAB/wEpAUABCQH9A1YBswMQARYcAAFbAlgBywHw - AZsBlAL/AbsBpAH/Af4BvQGpAv8BvAGoAv8BvgGrAv8BvAGoAv8BvAGpAv8BvwGqAv8BwwG4Af8BXwJY - AeMDBAEGEAABPQFdAYUB8AE/AcEB/gH/AWIByQH+Af8BWwHIAf4B/wFGAbcB8AH/AWEBYwFtAf8B8wG4 - AYYC/wG/AXUC/wG5AWgC/wGyAVkC/wGxAVcB/wHsAaQBZQH/A0QBeQQAATsBiQFCAfwBZwHoAZwB/wF3 - Ad4BnwH/AYkB4QGnAf8BkAHjAawB/wGRAeMBrQH/AY0B4gGqAf8BhAHfAaIB/wFxAewBogH/AUYBrwFb - Af8DUQGgJAADQgF2ATABYgE1AfYBKgHQAWEB/wEvAckBPQH/AS4BngEAAf8BIgFYAQAB/wFWAVcBVgHb - Ay0BRhQAAwEBAgFpAlIB6QH8AcYBrAL/AfUB2QH/AfgB7gHZAf8B+gH0AeIB/wH7AfQB5AL/AfwB8QL/ - Af4B+QL/AfwB+AH/Ae0B4QHdAf8DVgG+EAADCQEMAQQBYwHUAf8BUgHFAf4B/wGSAdgC/wGWAdwC/wGD - AaoBvwH/AdgBnwF1Av8BzgGaAv8BywGTAv8BxQGIAv8BvgFyAf8B+AGyAWcB/wFwAXMBhwH/AlABUQGf - BAABWAGWAV8B+wGUAeoBtAH/AacB6AG8Af8BsgHsAccB/wG+AfMBzAH/AcAB9AHOAf8BtwHsAckB/wGt - AeoBwAH/AZ8B8AG7Af8BXgG2AXAB/wNMAZMgAAMnAToBJwGEATsB+gEtAdcBZQH/ASwB1gFqAf8BKQG0 - ATEB/wErAZgBAAH/AS4BpAEAAf8BKQFuAQAB/wNZAcoUAAMjATMBlAFPAU0B+wH/AdMBtwL/AfcB3wH/ - AZ0BjwGCAf8BSQFFAUEB/wGOAYgBjAH/AcIBsAGrAf8B6gHgAdED/wH+Af8BzQHBAcAB/wNGAYEQAAMc - ASgBAwFtAeIB/wFwAdAB/gH/Ab4B6AL/AbgB5QH9Af8BnwGMAYQB/wH9AdkBtAL/AdYBqwL/AdMBpAL/ - Ac4BmwL/AcgBjgH/AckBjwFpAf8BQQGvAfkB/wNSAakEAAFVAWwBVQHqAbIB8QHJAf8B0AH0Ad0B/wHm - AfsB7AH/AeUB8QHrAf8B4gHvAekB/wHtAfwB8AH/AdwB9gHmAf8BwAH5AdMB/wFXAZ0BXwH9AzYBWRwA - AwwBEANYAcABJgG7AUsB/wErAdMBYwH/ASgBzQFiAf8BLwHAAUIB/wEsAZcBAAH/ASwBmwEAAf8BLQGY - AQAB/wEoAT0BPAH4A0gBhgMDAQQMAANEAXoBvQFdAVMC/wHeAb4C/wHxAdkB/wHCAbQBowH/AUoBUAFL - Af8BgQGnAcAB/wETAU8BpwH/AlIBcgH/Ae8B2wHJAf8BkwF9AXsB+gMtAUUQAAIrASwBQwELAYIB8AH/ - AY8B2QH+Af8BwgHqAv8BwQHlAfgB/wHRAacBjAL/Ad4BuQL/AdwBtgL/AdkBsAL/AdUBqAH/AfMBpAFo - Af8BpgGqAa4B/wFDAbYB/gH/A0oBjQQAA04BmQG3AeABwAH/AfQB/wH0Af8B7AH9AdYB/wF0AYcB2wH/ - AWABZQHbAf8B0AH7AcUB/wHpAf8B7AH/Ac0B8gHUAf8BWAFbAVgB2QMHAQoYAAMmATgCUQFcAd8BAAES - AagB/wEbAa8BSQH/ASoB1QFcAf8BSAHmAYMB/wFHAesBhwH/AS8BwQFEAf8BLAGdAQEB/wEqAY0BAAH/ - AQYBYwGnAf8BCAE2AbMB/QNVAboDFQEdCAADVQGyAdIBbwFbAv8B5QHDAf8B8AHaAcIB/wHpAdkBwgH/ - AbACpwH/AYwBvwHoAf8BDwGvAv8BAAFrAdIB/wFlAWkBogH/AWICUgHvAxIBGRAAAzgBXgEbAZEB/AH/ - AZ4B3gL/AcgB6wL/AcUB4AHuAf8B5gG7AZsC/wHlAcgC/wHWAbAC/wGRAUUC/wGmAWIB/wHVAWYBNAH/ - AZsB2wH6Af8BPgG1Af4B/wNBAXIEAAMPARQBWgFhAVoB1QGiAdIBoAH/AXQBwwG2Af8BHgFlAbkB/wER - AVMBuQH/ATUBsAGVAf8BdAHTAY0B/wFdAWwBXQHwAykBPhgAA0EBcwIjAXUB9gIAAfcB/wEAARUBywH/ - AUYBxAFXAf8BiwH7AagB/wFoAf4BnwH/AUUB6gGDAf8BMAHWAWwB/wEsAcgBTAH/ASoBoAEMAf8BBQFx - AZwB/wEAAWsC/wEAATsBzgH/AlEBVwHfAzABSwMBAQIBYQJWAdwB4wGRAW0C/wHtAcoB/wHnAc8BtgH/ - AeUB0AG6Af8B2gHEAbYB/wFMAXUBpwH/AWQB2QH3Af8BIwHOAv8BAAGaAewB/wEVATkBXwH9A1EBpwMG - AQgMAANEAXkBLAGYAv8BrAHjAv8BzwHuAv8ByQLNAf8B8wHaAcUC/wHxAeIC/wHrAdYC/wGuAW0B/wHY - AYYBWQH/AS4BHgF1Af8BagGqAeEB/wE6Aa0B+gH/AzgBXAgAAxkBIwFBAWoBbgH2AXEBtAHdAf8BvQHU - Ad8B/wHCAdcB3wH/AV0BngHLAf8BFQFuAXMB/wNNAZYcAAIfAZkB+AIAAv8CAAL/AgAB2QH/AU4BiwFx - Af8BpgH5AaAB/wFoAf8BoAH/AUEB5gGCAf8BMgHVAWUB/wEsAc0BTgH/ARcBogFHAf8BAAFxAcQB/wEA - AWMC/wEAAW0C/wEAAUoB5AH/A1gBwAMfASwBbwE4ATcB9QHzAa0BiwH/AfsB5QHFAf8B0QG5AaQB/wHG - AbIBoAH/Ae0B2AHBAf8BzAG+AbkB/wFOAYsBswH/AWQB3QHzAf8BPgHwAv8BAAHFAfsB/wEGAVEBgQH+ - A1gBxgMVAR0IAANOAZQBPgGfAv8BuwHoAv8B1gHwAv8BzgHCAbYB/wH7AfAB5gL/AfYB7QH/Af0B8QHj - Af8B7gHNAa8B/wFbAUwBkwH/AQABCQG7Af8BAAEMAa0B/wEFARgBtQH/AlcBWgHFCAADOgFhAVgBqAHD - Af0BtAHPAeUB/wHmAeoB8QH/AewB7gH2Af8BvAHJAd0B/wFBAZYBzAH/AVgCWQHSAx8BLAMSARkDBAEG - AwQBBgwAAggBwQH9AgAC/wIAAv8BGQEXAf4B/wEBAQMBxwH/ARgBUwFrAf8BUwHnAWUB/wFLAfoBgQH/ - AS0BxwFFAf8BCgGUAVcB/wEAAZsB1AH/AQABngL/AQABYwL/AQABZQL/AQABYQH4Af8BVwFYAVkBxwM6 - AWIBjAE3AS8C/gHBAZkB/wHeAcgBrgH/AcUBrgGaAf8B0AG/AagB/wHTAcIBrQH/Ad8BzQGzAf8BuAGg - AZsB/wE7AWABmwH/AVwBzgHrAf8BUAH9Av8BAAHdAv8BAAFjAawB/wJXAVoB2gMlATcEAAJTAVUBsAFU - AasC/wHLAe0C/wHgAfQC/wHVAcABrQH/Af4B+wH4Av8B+wH3Af8B8wHwAewB/wHTAc4BzAH/AVEBWQG3 - Af8BXQF1AfEB/wE1AUwB2wH/ATQBSQHaAf8CWAFgAdEIAAFQAlIBowGeAdkB9AH/AbIB4AH6Af8BqgHa - AfYB/wGdAdQB9QH/AZUB0QH1Af8BcQHNAfcB/wFRAVMBYQHxAWIBVwFUAd8BZQFYAVIB6QFeAVgBVwHZ - AV4BWgFYAdgDUwGwAygBPAQAAhABuQH7AgEC/wJGAv8CgQH+Af8BVAFRAf0B/wEKAQIB3gH/AQUBLAGI - Af8BKgGkAT8B/wENAZwBhwH/AQABowHsAf8BAAHMAv8BAAHHAv8BAAGcAv8BAAFsAv8BAAFZAfQB/wNY - AcYDTgGZAboBRAExAf8B8wHAAZgB/wHWAcIBpAH/AdABuAGeAf8BxgGVAY0B/wHLAYcBjQH/AccBgwGN - Af8B1QGQAZQB/wHUAYIBkwH/AV4BUwGbAf8BUAGzAd4B/wFZAfYC/wEQAd8C/wE7AWsBpwH/AlYBVwHc - BAACWAFdAcsBawG5Av8B3AHzAv8B6gH3Av8B3QHGAbIB/wHzAd8B0AH/AfUB5QHYAf8B9gHpAd4B/wH4 - Ae0B5AH/Ab4BtgHMAf8BOQFEAbgB/wGXAZ8B0wH/AVABkAHQAf0DHwEsCAABTQJOAZYBsgHeAfIB/wHb - AfcC/wHRAe8C/wG4AeYC/wGgAd8C/wGGAdcC/wFTAVcBWQHsAasBcgFcAfgB/wHpAcAC/wHdAbwC/wHc - AbgB/wHcAaUBdwH/AWABVAFOAesDMAFLAigBwQH9AnEC/wKSAv8CcgL/AmgC/wFgAV4C/wElARgB4QH/ - ARkBIQFqAfsBAAGsAeMB/wEAAfUC/wEAAd4C/wEAAcIC/wEAAbAC/wEAAaYC/wEAAXMB+wH/A1kBxAFa - AlkCygFZAT8B/wHgAb4BmAH/AdMBtQGXAf8B0wGWAY0B/wHxAaIBpQH/Af4BswG0Af8B/gG0AbYB/wH+ - AbcBuQL/AcQBwgH/AfkBuAG6Af8BgwGAAbgB/wFLAa4B5QH/Aa0B8gHzAf8BcgGwAewB/wFEAUoBYwHt - BAACWQFhAdIBiwHIAv8B8QH6Av8B9wH8Av8B9gH5AfsB/wHwAeUB3AH/Ae4B4AHVAf8B7QHcAc8B/wHs - AdgByQH/AeoB1AHCAf8B9AHwAe0B/wH3AfsC/wFYAWgBfgHpDAADKAE8AXoBnAGpAfoE/wH1A/8BzwHy - Av8BtAHyAv8BYgGVAbwB/gFpAVkBTwHyAfkBzAGXAv8B3gGyAv8B4AG5Av8B4QG5Av8B7AG+Af8B7AGl - AWsB/wNXAb0CWAFdAcsCdgHlAf8CkQL/AnEC/wJnAv8CYwL/AUEBPQGZAfoDUAGdAVQBYQFpAd8BAAHp - Af4B/wEAAeQC/wEAAcAC/wEAAbEC/wEAAa4C/wEkAW0BqAH3AzoBYgFmAUIBQQHvAb4BagFLAf8BzAGi - AYQB/wHUAY4BhwH/AfcBqwGpAv8BtwGyAv8BtgGzAv8BvgG8Av8BxgHFAv8B2QHXAv8B/AH6Af8B5gGx - Ab0B/wFYAVQBXgHlAU4BbgG1Af0BHwFdAcoB/wNLAY8EAAMcAScCUwFVAa0CXAFfAdEBXQFeAWMB1wFf - AWIBaAHdAWABZAFvAeMBYwFqAXkB6QFlAXABiAHvAW0BfwGjAfUBdgGTAcgB+wGHAaYB8AH/AYgBqwH1 - Af8CVAFWAasQAAFGAkcBgAGGAZ4BqAH6AdYB5QHuAf8BvAHiAfEB/wFtAZUBuAH8AlABUgGjAWYCWgHb - Af8B2gGUAv8BzQGZAv8BzgGdAv8BzAGbAv8B1wGcAf8B/gG1AWoB/wNXAb8EAAJPAVEBnAJCAboB/AKD - Av8CXAH1Af8CRgFrAe8DMwFSBAADEAEWAVgCWgHAAQMBtQH2Af8BAAHPAv8BAAGkAv8BVAFdAWsB4AMn - AToEAAF5ASkBJAH8AbYBZwFSAf8B6AGrAaAC/wHGAcAC/wHPAccC/wHUAc0C/wHeAdcC/wHmAeEC/wHv - AekC/wL6Af8BwQGKAZ8B/gNUAa8DBAEGA0ABcAJLAUwBjwMBAQIvAAEBAwUBBxgAAy8BSgFRAlIBoQNS - AakDOQFfBAADRQF9AdwBkwFyAf4B/wH0AdQC/wH0Ad8C/wH1Ad0C/wHbAaoB/wGWAVMBOwH3AzEBTwgA - AzsBZAJKAX0B7gJZAV4B0AMYASEQAANMAZIBMQFnAasB9gJVAVcBugMMARAIAAFiAlEB3wGdAUEBQAH+ - AboBVgFVAf0BsQFcAV4B/AGwAV4BYwH8AZ8CXwH7AaABXwFgAfsBogFcAW4B+gGiAV8BaQH7AYABWQFn - AfIDRAF8eAABRwJGAYABdgFlAV4B5QG1AY0BfQH6AagBhQFuAfcBYAJcAdQDMwFShAADSwGOA1kBwwNX - AcIDQgF2QAADEQEXA0QBeQNWAbMDWAHGA1cBxQNUAa8DPQFqAw0BEhAAAlUBVwG6ASEBJAGXAfsBNwE6 - AZUB+AEvATUBkwH4ASsBLwGRAfgBKAEuAY4B+AEoASsBiwH4ASUBKAGHAfgCJQF/AfgBIwElAX0B+AEj - ASQBfAH4ASIBIwF7AfgCIwF6AfgCIwF6AfgBFgEXAXYB+wJZAVsBwwwAA1MBqgNYAdEDWAHLA1oB1QFH - AVoBcgHtATkBXQGAAfMBTwFVAV8B6AJbAVkB0ANaAc4DWQHSA0QBfAgAATEBdAGWAfcBAAG1AeEB/wEE - AasB2gH/AUYBUQFZAewDGQEjOAADQwF3AWYBVgFVAesCfwFNAf4BgQGpAUsB/wGGAbsBWQH/AYkBtgFa - Af8BswGoAXUB/wGiAVwBUQH9AVgCVAHeAzkBXwwAATQBNQGOAfYBJgFBAe4B/wEOASkB5AH/AQkBIgHg - Af8BDAEhAdoB/wEKAR0B1QH/AQcBGAHPAf8BEgEgAdYB/wESARwB0gH/AQUBDAHBAf8BBQEJAb0B/wED - AQcBuQH/AgABtQH/AgABrwH/AQEBAgG5Af8CKQGAAfcMAAGyAasBrAH/AdsB0gHRAf8B4gHMAcIB/wGF - AaMB3gH/AV0B0gL/AWsB6QL/AWUBrQHyAf8B2gHGAcIB/wHfAdUB1AH/AbwCtgH/A1UBtQgAATUBewGO - AfQBAAHoAv8BAAHuAv8BBAGDAbUB/wJWAVgB3ANKAYsDAwEELAABUgJQAaQBuAGDAX8B/gH/Ae8B5QH/ - Ad0B+AHPAf8B3wH1Ac4B/wHmAfUB1gH/AekB+gHfA/8B+gP/AfkB/wHrAcgBuQH/AWoBQQE8AfkDRAF6 - CAADVQG1ASIBNQHbAf8BAAEUAeQB/wFbAWoB0QH/AasBrwHQAf8BqQGuAdkB/wGzAbcB4AH/AZwBnwHH - Af8BmgGcAcQB/wG0AbYB3AH/AawBrgHTAf8BrwGwAcsB/wFoAWoBugH/AgABpAH/AQEBAwGrAf8CVgFY - AcEMAANRAaADVQGtA1ABnQNVAbUBZgGtAdQB/QFwAbcB5wH/AVYBYAFrAesDVAGmA1UBrQNSAakDKAE8 - CAABWQFdAV4B0wEAAdoB9AH/AQAB2QH3Af8BAAHMAfoB/wEGAbgB6wH/ASIBQwFqAfkDOAFcKAADSwGQ - AcYBmgF0Av8B/QHjAv8B6gHOAv8B4AHCAv8B3AG7Av8B3AG5Av8B3QG9Av8B4AHDAv8B6gHRA/8B9gH/ - Af0B5AHUAf8BagFBATwB+QM4AV0EAAMrAUIBKAEuAZ0B+wEMASgB6gH/AXQBiAHXAf8B+QH1AdkB/wH4 - AfYB6gP/AfsB/wJiAVYB/wJXAUwD/wH5Af8C+gHvAf8C+wHiAf8BjQGPAcUB/wIAAbUB/wEDAQUBkwH/ - AzIBURgAAzMBUgGCAXwBfQH6AaUBmgGcAf8DVAGuGAADJAE1AU8BZgFxAegBAAHbAfQB/wEAAdoB9gH/ - AQUB7gL/AQMBmgHUAf8BOAFHAVkB8gNLAZADIwEzHAADJgE4AYIBXAFDAfgBvwHTAY4C/wHbAbIC/wHP - AZwC/wHKAZMC/wHIAY8C/wHJAY4C/wHLAZQC/wHSAZ8C/wHWAakB/wHuAdUBqwL/AfgB4QH/AfIByAGt - Af8BWAFXAVQB3QMNARIDBAEFA1MBqgEhATQB3gH/AR4BNQHoAf8B1gHYAeUB/wH6AfkB8gH/Av0B/gH/ - AtUB1wH/AtIB0wH/Av0B/gH/AvoB9QH/AeEB4gHlAf8BJQEoAbwB/wEAAQUBtQH/AlYBWAG5AwkBDAwA - AzEBTwNWAbYDVwHoAXgBfAF3AfoBswGrAaYB/wGGAnAB/wNYAdEDEAEWGAADJAE1AU4BagF5AesBAAHh - AfkB/wEAAdAB9QH/AQEB1AH+Af8BCQHBAfEB/wEPAUgBmQH9AUIBSgFdAe0DUQGnA0oBiwMkATUQAANV - AbIBcwGPAToB/wFvAaMBQwH/AfgByQGNAv8BwAF1Av8BugFsAv8BuQFoAv8BuwFrAf8B1AGvAVkB/wF3 - AZgBOQH/AeEBvQFzAf8B7QHHAY4B/wGoAbIBZwH/AW0BqQFOAf8BlgFXAUAB/QM9AWoEAAMqAUEBOwFC - AY4B9QELAScB7QH/AW0BgwHoA/8B9wX/A7wB/wO1B/8B/AH/AZABlAHVAf8BAAEFAcAB/wEoASsBigH4 - AzEBThAAAXACbQHxAeMB2gHbAf8B8wHrAeoB/wHpAewB5AH/AdsB0AHOAf8BywG4AbkB/wGOAoEB/wFW - AlMB4wM9AWoDAQECFAADJgE4AUcBaQF7Ae0BAAHiAfkB/wEAAdMB8wH/AQ4B5QH9Af8BFgHmAv8BEAGv - AfIB/wEAAV4BxgH/AQABUwG+Af8BSgFNAVoB5wM4AV0MAAFtAVUBUQHqAUIBggEgAf8BGQFhAQEB/wFz - AYkBLAH/AfUBswFbAv8BsQFWAv8BrgFSAv8BswFYAf8BhgGKASoB/wEJAVsBAAH/AW4BhgEoAf8B/QHF - AYMB/wGdAZwBRgH/AVkBkQEyAf8BxgGcAWYB/wNTAbAIAAJUAVYBqwEoAToB3gH/AUMBVwH1Af8B7QHu - AfwF/wOMAf8DdgX/AeoB6wH+Af8BKAEvAd8B/wEIAREBwAH/AlUBVwG3AwEBAhAAAYcCfQH4Ae0C4AH/ - AeIC1gH/AecB3AHeAf8B2QHKAcsB/wHUAsMB/wHlAtQB/wHJAroB/wFaAlIB/QNXAcIDIQEwFAADKQE/ - AUEBZgF/Ae8BAAHjAfoB/wEAAc4B8gH/ARkB5AH7Af8BOwP/AUUB6gL/AV0B5AL/ARYBigHnAf8BJAE2 - AW0B9wNGAYAIAAGKAVsBQQH5ATABZAEPAf8BGgFPAQAB/wEXAU4BAAH/AbEBkQE1Av8BswFVAv8BtAFX - Av8BuAFaAf8BYQFuARwB/wEcAVIBAQH/ASEBUwEBAf8BqgGTATwB/wHlAbABXwH/AckBsgFqAf8B7AG6 - AYoB/wNXAcUIAAMnAToCQQGhAfkBngGiAf0B/wLPBv8DbQH/A1sF/wKnAv8BHQEeAf4B/wEfASEBqAH9 - Ay8BSRQAAYcChQH3AfkC8gH/AfIC7QH/AfEC7gH/AdwCzwH/Ac8CvQH/AdQCxQH/AeEC0gH/Ae8C4gH/ - AZgCjQH/A1EBoRgAAy0BRgE/AWgBggHvAQAB3QH0Af8BAAHHAfAB/wEYAeAB9gH/AVAD/wGOA/8BjwH2 - Av8BKgGjAfkB/wEqATUBZwH1Ay8BSgQAAZMBXwE0AfsBKAFPAQcB/wEZATsBAAH/AWcBZQEbAf8B4wGp - AU4C/wG3AV0B/wHbAaMBTAH/AbYBjgE5Af8BOAFKAQIB/wEdAT0BAAH/ASABQQEAAf8BOQFPAQYB/wGe - AYMBMgH/AaMBjwE/Af8BuwGXAVUB/wFZAlgBxwgAAwIBAwJQAVIBowF3AYIB5wH/Ab0BvAL/AvsC/wJM - AUgB/wI+ATkB/wL2Af4B/wJlAv8BKAEpAeIB/wNVAbIDBQEHFAABiAKHAfcB/gL8Af8B7ALmAf8B7wLq - Af8B3QLRAf8BzgK8Af8B0wLEAf8B1QLGAf8B7QLfAf8BugKtAf8DUgGpHAADSAGEAQABqAHaAf8BAAHr - Af0B/wEAAeQB9AH/ARYC/gH/AUcD/wGSA/8BmwP/ARMBdAHhAf8CVwFbAdADDwEUAYkBWAFIAfYBhQFu - AScB/wG3AYoBMwH/AfUBrgFTAv8BvgFqAf8B2wGsAWMB/wFRAVYBIgH/AT4BTQEaAf8BRAFOARwB/wE7 - AUQBEwH/ASwBNgEAAf8BNgE3AQAB/wI+AQAB/wE9AUMBCgH/AZIBZwEwAf8DVQG0DAADJAE2AUoBTAGM - AfMBsgG0Af4B/wLfAv8CbQFnAf8CaAFcAf8CwAH8Af8BVAFVAf4B/wE3ATgBkgH3AyoBQRgAA4cB9wHY - AsoB/wHIArcB/wHoAuAB/wHfAtMB/wHMArkB/wHSAsEB/wHVAsQB/wHmAtYB/wGtAp8B/wNRAaccAAFX - AVsBYAHWAQABygH5Af8BAAHgAv8BAAHvAv8BAAH8Av8BFQP/ATwB+gL/AYYD/wFiAeAC/wEHAUsBoQH+ - A0oBjAFhAVgBVwHZAbEBiwE5Af8B7QGqAUwC/wHKAYwC/wHeAbcB/wHgAdIBuQH/AZ8BpgGPAf8BoAGn - AY8B/wGoAasBkwH/AaYBqQGQAf8BlQGZAXQB/wFkAWgBQgH/AR8BLwEAAf8BJwE3AQIB/wGqAWgBNwH/ - A0MBdwwAAwMBBANQAZ0BggGFAeUB/wHJAcgC/wLmAe8B/wLmAe0B/wKWAv8BSQFLAeMB/wNTAaoDBgEI - GAABhwKGAfcBzQK7Af8BwwKyAf8B7wLqAf8B3gLSAf8BxgKzAf8B0AK+Af8B0QLAAf8B4gLRAf8BqQKa - Af8DUQGnHAABVQJXAboBAAHHAfMB/wEAAdEC/wEAAdoC/wEAAfUC/wEVAdgB8QH/ATUBYAGJAfUBLAGo - AcsB/QFbA/8BCgGCAegB/wNOAZQBRwJGAYEBnQFsATQB/wGlAbUBdgH/AfkB7gHaAv8B8AHhAv8B9gHq - Af8B8QHuAeAB/wHCAc8BuAH/AcYB0QG6Af8BzQHVAbwB/wHEAdABtwH/AboBzQG1Af8BhQGoAYYB/wFt - AYABMAH/AWwBWQFPAewDEgEZEAADJQE3AU8BUAGLAfEBvgHAAf4B/wLXAv8ByQHIAv8BjgGPAv8BNwE4 - AZAB9gMtAUUcAAOHAfcB7wLoAf8B8ALrAf8B/gL9Af8B2QLMAf8BvgKoAf8BxwK0Af8BzQK7Af8B3wLN - Af8BpgKXAf8DUQGnHAADEAEWAU0BZwF8AesBAAHTAv8BAAHPAv8BAAHoAv8BJQGMAcAB/gNZAc8BHwFr - AZsB+AEDAbMB8wH/AlcBWgG9Aw0BEgMNARIBYwFXAVYB3wG9AccBlQH/AcwB6QHRAf8B5QHpAdgB/wH4 - AfQB6QL/Af0B+AH/AdkB6AHWAf8BvgHYAb4B/wHAAdgBvwH/AcMB2QHBAf8BwAHfAcoB/wG3AdgBqwH/ - AZ4BfAFFAf4DRAF5GAADUAGeAYwBkAHlAf8CzAL/AbUBtAL/AXABcwHkAf8DVAGuIAADewH1Af8C/QH/ - AfYC7wH/AeQC2wH/Ad4C0wH/AdMCxQH/AcQCsAH/AcECqwH/AdYCwQH/AaICkQH/A1EBpyAAAzkBXwEe - AXwBrAH6AQAB0QH7Af8BAAHeAv8BAAHBAe0B/wEGAX8BrgH+AQABjQHbAf8CWQFbAcMDBAEGCAADJQE3 - AX8BWAFNAe8B4AHdAboB/wHbAfgB5wH/Ad4B8AHlAf8B7AH1Ae0B/wHjAe8B4wH/AdUB5wHWAf8B1QHq - AdwB/wHbAfYB6QH/AesB8AHPAf8ByQGTAVYB/wFSAlABpBwAAx0BKgFLAUwBjQHzAdYB2AL/AcwBzQL/ - Aj4BnAH4AyYBOSAAAz4BawNkAeoBzALFAf8B8ALoAf8B8ALoAf8B6ALjAf8B4ALZAf8BzgK/Af8B0AK5 - Af8BnQKLAf8DVAGrJAADOAFcAVQBXAFmAd8BAAGxAekB/wEAAeoC/wEAAcsB9AH/AVkBWgFdAcoDCQEM - EAADJQE3AWUCWAHdAeIBtwGeAf8B+AH3AewJ/wH7A/8B+gH+AfIB/wH2AdkBvQH/AZwBawFYAfgDTgGU - IAADAgEDA04BlAGTAZcB6AH/AZoBnwHpAf8CTwFTAaUDAwEEJAADCQEMA0sBjwFsAmsB7wHZAtYB/wH5 - AvYB/wH6AvcB/wH4AvcB/wHtAuUB/wGXAooB/wNOAZkoAAMNARIDTgGUAToBZwGKAfABWQFaAV0BygMN - ARIYAAMJAQwBRwJGAYABYwFaAVgB2QGXAWwBYgH1AbcBjwF5AfsBrQGGAWoB+QF3AV0BVQHqA1UBsgMn - ATooAAMbASYCVwFmAdsBUQFTAWsB5AMiATIwAAMVAR0DUAGeAYECgAH1A44B+QNkAeMDWQHHA0wBkwMW - AR8IAAFCAU0BPgcAAT4DAAEoAwABQAMAASABAQIAAQEBAAEBBgABCRYAA/8BAAHwAR8GAAHgAQ8GAAHg - AQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAHg - AQ8GAAHgAQ8GAAHgAQ8GAAHgAQ8GAAH4AQ8C/wH+AX8C/wHwAQcC/wH+AX8C/wHwAQMB+QHPAeABDwL/ - AeABAQH4AY8B4AEHAgAB4AEBAfABjwHmAUcCAAHAAQEB8AEHAeYBQwIAAcABAAHgAQcB/gEHAgABwAEA - AeIBEwHwAQcCAAHAAQABwgEzAeABDwIAAcABAAHEARMB4AEfAgABwAEBAYQBGQHgAW8CAAHgAQMBiAEJ - AeIBZwIAAfwBDwIAAeABRwIAAcABfwL/AfABBwIAAYMBvwL/AfwBPwL/Ac8BvwL/Af4BfwL/AfgBPwHH - AeMB4AEHAX8B/wHgAQMBwQHDAcABAwE/Af8BgAEBAcABAwHgAQcBjwH/AYABAQHgAQcBgAEBAYMB/wGA - AQEB4AEHAYABAQHBAf8BgAEBAeABBwGAAQEBwAH/AYABAQHgAQMBgAEBAeABPwGAAQABwAEBAYABAQHw - AR8EAAHAAQMB+AEPBAABwAEDAfwBBwQAAeABBwH+AQMBAAEBAfgBHwHgAQcB/wEBAYABAQH4AR8B8AEP - Af8BgQHAAQMB/AE/AfABDwH/AsABBwH8AT8B8AEPAf8B8AL/AfwBPwH4AR8B/wH8AeAD/wHCAQMB/wHh - AeABPwIAAYABAQH/AeABwAEPAgABgAEAAf8BwAGAAQcCAAGAAQAB/wGAAQABAwIAAYABAAH/AYEBAAED - AgABgAEAAf8BAwEAAQECAAGAAQAB/wEDBAABgAEAAY4BBwHgBAABAQEMAQ8B/AQAAQMBAAEfAf4EAAEB - AQABPwH/AQEDAAEBAQABPwH/AQMDAAEBAcABYwH/AYcDAAEDAcABAwH/AccDAAEHAeABAwL/AgABAQEP - AfABDwIAAv8BnwH/AYABAQIAAeMB/wGHAf8BgAEBAgABwQH/AYEB/wGAAQECAAHAAf8BwAH/AYABAQIA - AYABfwHAAf8BgAEBAgABgAE/AcAB/wGAAQEDAAEfAeABPwGAAQEDAAEPAfABHwGAAQEDAAEHAfgBDwGA - AQECAAEMAQcB/AEPAYABAQIAAR4BAwH8AQcBgAEBAgABPwGBAf4BAwGAAQECAAH/AcAB/wEDAYABAQIA - Af8B8AH/AYEBgAEBAgAB/wH4Af8BwQGAAQECAAP/AeEBgAEBBP8B4AEDAYABAQGAAQEBgAEHAYABAQGA - AQEDAAEDAgABgAEBAwABAQIAAYABAQMAAQECAAGAAQEDAAEBAgABgAEBBgABgAEBBgABgAEBBgABgAEB - BgABgAEBBgABgAEBBgAB/wHDAQABAQEAAQEBAAEBAeEBhwEAAQEBAAEHAQABAQHgAQcBAAEHAQABDwEA - AQcB8AEPAQABfwEAAf8BAAF/AfABDwEAAQ8BhwHhAeABBwH+AQcBAAIDAsABAwH4AQcBAAIBAoABAQHA - AQcGAAGAAQcGAAGAAQcCAAGAAQECAAGAAQcCAAHAAQMCAAGAAQcCAAHgAQcCAAGAAQcCAAHgAQcCAAGA - AQcCAAHAAQMCAAGAAQcCAAGAAQECAAGAAQEGAAGAAQEGAAGAAQEBAAIBAoABAQGAAQMBAAH/AQMCwAED - AYABDwL/AYcB4QHgAQcBgAF/Af8B+AIAAeMB/wHgAQcB/wHwAgABwQH/AYABAwHgASACAAGAAf8BgAEB - AcABAQMAAX8BgAEBAcABAwMAAT8BgAEBAYABBwMAAR8BgAEBAYABAQMAAQ8BgAEBBAABgAEHAYABAQQA - AcABAwGAAQEEAAHgAQEBgAEBAQABAQIAAfABAAGAAQEBAAEBAgAB+AEAAYABAQGAAQMCAAH8AQABgAEB - AfABAwIAAf4BAQGAAQEB/AEHAgAB/wEDAYABAwH/AQcCAAH/AYcBwAEHAYAB/wIAAeABBwHgAQcBgAH/ - AgAB4AEHAcABAwGAAwABwAEBAYABAQGAAwABgAMAAYABAAGAAQABgAMAAYADAAGAAwABgAMAAYADAAGA - AwABgAMAAYADAAGAAwABgAMAAYADAAGAAgABAQGAAwAB4AIAAQEBgAEBAgAB4AIAAQEBgAEBAgAB4AEB - AQABAQHAAQMBgAEBAfAB9wGAAQEB8AEDAcABAwHwA/8B8AEDAfABBwX/AeEBgAG/AYABAAHgAT8B/wHA - AQABAwGAAQAB4AEHAf8BgAIAAYABAAHAAQEB/wMAAYABAAHAAQEB/gMAAYABAAHAAQEB/AEBAQABAQGA - AQABgAEBAeABAwEAAQ8BgAEAAYABAQGAAQcCAAGAAQABgAEBAQABDwGAAQABgAEAAYABAQEAAR8B4AEA - AYABAAGAAQMBAAE/AeABAQGAAQABgAEDAQABPwHgAQEBgAEAAYABAwEAAT8BwAEBAYABAAHgAQcBAAF/ - AcABAQGAAQAB/gEHAcABfwHAAQEE/wHAAf8BwAEDAgAC/wIAAcABAwIAAeMB/wYAAcMB/wYAAcABAQYA - AcABAQYAAcABAQYAAcABAQYAAcABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQIAAeABBwIAAYABAQIA - AfABDwIAAYAB/wIAAfABBwIAAYAB/wIAAfABBwIAAv8CAAHwAQcB/wGPAfABPwL/AeABBwH/AYcBgAEB - AYABAQHAAQcB8AGDAgABgAEBAeABBwHgAQMCAAGAAQEBgAEBAcABAQIAAYABAQMAAQECAAGAAQEGAAGA - AQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQECAAHAAgABAQGAAQECAAHgAgABAQGAAQEBAAEB - AeACAAEHAYABAQEAAQEB/wHAAQABfwGAAQEBgAEBAfgBTwHgBQAB+AEHAeAFAAHAAQMBwAUAAYABAwHA - BwABwAUAAYABAAGABwABgAUAAQEBgAYAAQEIAAEBDgABgAEBBgABwAEDBgABwAEfBgAB8gEfAeABBwQA - BP8CAAL/AeABAwHwAQ8B4AEHAcABfwHgAQAB4AEHAeABDwGAAQcB4AEAAcABAwIAAYABAAHAAQABgAEB - AgABgAEAAYAHAAGABwABgAcAAYAGAAEBAeAGAAEBAeAGAAEBAeAGAAEDAeAFAAGAAQMB8AIAAQECAAHA - AQcB+AEAAYABAwIAAcABHwH8AQEBwAEHAgAB4AF/Av8B4AEPAgAB4AH/AfgBHwT/AfgBPwHIARMB/gE/ - Av8BwAEfAZwBOQH8AR8BgAEHAQABDwEEASAB/AEfAYABAwEAAQcBBAEgAfgBPwGAAQEBAAEDAQQBIAHg - AUMBgAEBAgABBAEgAcABAwGAAQEBgAMAAYABAwGAAQEB4AMAAYABBwGAAQEB8AEAAQQBIAGAAR8BwAEB - AfwBAAECAUABgAEDAfABAQH+AQECAAGAAQEBwAEBAfwBAwIAAcABAQHAAQMB+AEDAYABAQHAAQMB4AEH - AfABBwHAAQMBwAP/AeABDwHgAQcE/wHgAQ8B/wEDBv8B8AEBAv8B+AEfAgAB4AMAAfgBAQIAAYADAAGA - AwABgAEBAgABgAcAAYAHAAGADAABAQMAAQEDAAEBAwABAQMAAQEDAAEDAwABAQMAAQMDAAEDAwABAwIA - AYABAwIAAcABBwIAAcABBwL/AfABfwL/AeABHwj/AYABPwL/AcABBwHnAf8BAAEfAfwBPwHAAQMBwAEB - AQABHwH4AR8BwAEDAcABAQEAAR8B8AEPAYABBwGAAQEBAAEfAeABDwGAAQcBgAEBAQABHwHAAQMBgAEH - AYABAQEAAR8BgAEBAYABBwGAAQEBAAE/AwABAwGAAQEBgAF/AwABAQGAAQEBgAEHBAABgAEBAYABAQQA - AYABAQGABQABgAEDAYAFAAGAAQMBwAEAAYEBAQIAAf8B5wHhAQACwwEAAR8D/wGBBP8BDwH/AfABDwIA - AeABAwEHAf8B4AEHAgAB4AEDAQEB/wHAAQMCAAHgAQMBAQH/AYABAQIAAfwBPwEAAX8EAAHgAR8BgAEP - AgABgAEBAeABBwHAAQcCAAHAAQEB4AEDAeABAwIAAcABAwHgAQMB8AEBAgABwAEDAeABAwH4AwAB4AEH - AeABAwH4AwAB4AEHAeABAwH4AwAB8AEPAeABAwH4AgABAQH4AR8B4AEDAfwBAQGAAQMB+AEfAeABAwH+ - AQMBwAEHAfgBHwHwAQMB/wEHAeABDwH8AT8B/AEDCw== + A1sB4QMMARAMAANKAYwBXQJYAf8BnwKVAf8BtAKzAf8BiAGHAYgB/wNWAbgDQwF3AVUBYgFwAeoB3wH+ + Av8B5wP/AesD/wFSAW0BlgH3AyQBNgG1ATsBAAL/AeABxwL/AeABxwL/AeABxwL/AeABxwL/AeABxwX/ + AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wMdASoDBAEFAwIBAwgAAbsBWAFA + Af0B+gHUAaAB/wHyAe8B8AL/Af4D/wH4AfYC/wH1AfEC/wHxAewC/wHvAesC/wHzAe4C/wH1AfMC/wH8 + AfsB/wHsAuoB/wHgAaUBXQH/AbwBUgEwAf0EAAMmATgBdwJoAfYBxgKxAf8BxwKzAf8BxwKzAf8ByQK2 + Af8BywK5Af8BzQK8Af8B0AK/Af8B0gLDAf8B1QLIAf8B2wLQAf8B3QLRAf8BsAKcAf8DVgHBEAADAQEC + AzQBVANCAXQDPgFsAzEBTwMLAQ8DAAEBAlkBXALJAfkC/wH7B/8B0QH4Af4B/wNbAcgBtQE7AQAV/wG1 + ATsBAAH/AysBQgMHAQoDAwEEAwMBBAMCAQMDAAEBEAAB0AFcAS0C/wHhAacB/wH3AfoB8wf/AfoD/wH1 + Av8B/AHyAv8B/gH2A/8B+gP/Af0F/wHxAfUB7gH/AecBswFnAf8B0wFWARcB/wQAAxABFgFkAl8B6gHD + Aq0B/wHPArsB/wHQAr4B/wHRAr8B/wHUAsMB/wHXAscB/wHbAssB/wHeAtAB/wHhAtYB/wHpAt4B/wHd + AssB/wGYAoQB/wNMAZIsAAJIAUkBhwExAV8BnAH7AU0BawGiAfoBTQFoAaEB+gFJAWIBpgH7AUoBUgFw + Ae8DAQECAbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wMdASoDBAEFAwIBAyAA + AVYCVAGrAZ4BWgEyAfsBhgJZAfUBhgJZAfUBhgJZAfUBhgFZAVcB9QGGAVkBTAH1AYYBWQFXAfUBhgFZ + AVcB9QGGAVkBVwH1AYYBWQFXAfUBjgFUAVEB9wGeAVYBLAH7AVgCVgG7CAADUQGcAXwCdQH6AZICiAH7 + AY0CfAH6AY0CfAH6AZACfQH6AZICfgH6AZUCgwH6AZYChwH6AZgCjAH6AZYCkwH7AYoCfAH8A18B4AMh + ATAYAAMhATEDQAFwA1ABngMpAT8EAAMKAQ4DEQEXHAADBAEFAxQBHAMnAToDLAFEAygBPQMjATQDHgEr + AxgBIgMUARsDEAEVAwwBEAMJAQwDBAEGAzoBYQNZAccDWQHMA1oBygNaAcoDWgHKA1oBygNaAcoDWgHK + A1oBygNaAcoDWgHKA1oBygNcAc4DWQHDAzQBVQNKAYwDVgG2A1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGx + A1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1YBtgNOAZgUAANeAdkBxQKyAf8BzwK7Af8DWAHAAykBPwNb + AcsDXQHSAzEBTxgAAx8BLAJXAVoBxQJbAWAB1gNXAb8DUAGkA0oBiwNBAXIDOAFdAzEBTgMtAUUDKAE9 + AyMBNAMaASUDYQHuA+IB/wPdAf8D2gH/A9oB/wPYAf8D2AH/A9cB/wPXAf8D1QH/A9UB/wPUAf8DyAH/ + A9oB/wOZAf8DVwG9AWgBQAE4Af0BtAFzAWUB/wGwAYYBcwH/AbQBiAGAAf8BsgGIAXQB/wGxAYYBdAH/ + Aa4BhgF0Af8BrQGFAXQB/wGsAYUBcwH/AaoBhAFzAf8BqQGBAXIB/wGoAYIBcwH/AaYBgQFyAf8BpwGD + AYIB/wGsAXIBbAH/AU4BQAE/AfQIAAM6AWIDOAFeAzIBUQF7AnUB9gHmAtIB/wHnAtgB/wHFArQB/wGd + Ao4B/wHMAroB/wHgAswB/wGHAn8B/gM3AVsQAAMCAQMCTwFRAZwBNQHeAv8BQwGzAccB/wElAY0BrQH/ + ARQBlgHRAf8BEgF/AcEB/gEzAVkBhAH1AVIBVwFlAegCWgFeAdUDVwG/A1IBpgNJAYkDNAFUA4gB9wT/ + A/QB/wPzAf8D8wH/A/EB/wPwAf8D7gH/A+0B/wPrAf8D7AH/A+cB/wOWAf8D0AH/A8wB/wNZAcMBpgFQ + AUAB/QHzAdsBzgH/AeAB0QHGAf8B3wHNAcEB/wHaAckBvwH/AdoByAG9Af8B2gHFAbsB/wHZAcUBugH/ + AdkBxQG4Af8B2AHDAbYB/wHYAcEBtAH/AdgBwQGyAf8B1gG/AbAB/wHYAcQBtQH/AeQBvAGoAf8BWQFL + AUkB8gQAAzUBVwGvAp0B/wG4AqQB/wGlApMB/wHHArQB/wHhAtEB/wHtAuEB/wHsAt8B/wHjAtIB/wHb + As4B/wH0AusB/wHxAuIB/wFZAlcBwhAAAw4BEwFVAV8BagHoAVUB0wH0Af8BswFwAVAB/wHiAakBhAH/ + AcEBlAFmAf8BpgGYAXEB/wGCAaMBnQH/AVQBsAHMAf8BOAG4AfYB/wEkAbEC/wEYAZ4C/wEIAVYB0wH/ + A1EBoAN7AfYD+wH/A+oB/wPrAf8D6gH/A+gB/wPnAf8D5gH/A+QB/wPjAf8D5AH/A98B/wOcAf8D0AH/ + A8QB/wNWAcEBpAFPAUAB/QHvAccBnAH/AcQBpQGCAf8B2QGsAXIB/wHzAbcBdAH/AfEBsQFrAf8B8gGt + AWQB/wHyAakBXAH/AfIBpAFWAf8B8gGgAVAB/wHyAZwBSQH/AfIBmQFCAf8B8gGVATwB/wH1AZUBOQH/ + AfYBkAEyAf8BVgFPAUcB8QMMARABZQJkAecBzAK5Af8B3QLLAf8B2gLHAf8B2ALHAf8B6QLcAf8B8QLm + Af8B9gLsAf8B9gLtAf8B9gLtAf8B/QL2Af8B3QLQAf8DYQHcA0UBfgMEAQYIAAM4AVwBJgGpAfQB/wFf + AaMBtAH/AeQBtAGLAv8BzwHEAv8B1gG9Av8B3AG2Af8B+wHIAZ0B/wHmAbMBhAH/AcQBoAFtAf8BnwGb + AXQB/wFxAqoB/wFOAc4C/wJaAVwBzQN9AfYD/AH/A+0B/wPtAf8D7AH/A+oB/wPpAf8D6AH/A+YB/wPl + Af8D5QH/A+EB/wPTAf8D6gH/A8EB/wNWAcEBqAFOAUAB/QHmAcsBrgH/AdAB3AHjAf8B1QG9AaYB/wH+ + Ab0BgAL/AbwBgAL/AbYBbQL/AbIBZgL/Aa4BXwL/AakBWQL/AaUBUwL/AaIBTAL/AZ8BRgL/AZ8BQgL/ + AZkBOgH/AVkBTwFHAfEEAANMAZABzAK6Af8B6QLbAf8B6ALbAf8B7QLgAf8B8gLmAf8B3gLRAf8B0ALD + Af8B5QLaAf8B/AL0Af8B/QL3Af8B5wLbAf8B2wLGAf8BsQKeAf8DOgFiBAADAwEEA1YBtgFGAc8C/wGX + AZABgAH/Af0B1QG6Af8B9AG7AbkB/wH9Ad4BvwH/Af4B3QG/Av8B5gHLAv8B5wHLAv8B5wHJAv8B0QGu + Af8B0QGgAVcB/wEcAYkB0gH/A0oBigN9AfYD/QH/A+4B/wPuAf8D7QH/A+sB/wPqAf8D6QH/A+cB/wPm + Af8D5gH/A+MB/wOiAf8D0wH/A8cB/wNWAcEBpwFOAUAB/QHwAdYBugH/AegB8wH6Af8B4QHKAbQB/wH7 + AbwBgQL/Ab0BggL/AbcBcAL/AbMBagL/Aa8BYwL/AasBXgL/AacBWAL/AaQBUQL/AaEBTAL/AaIBSQL/ + AZwBQwH/AVkBTwFHAfEDFQEdA0gBhAHAAqsB/wHmAtcB/wHsAuAB/wHvAuMB/wFzAnAB7wNCAXQDLAFE + A0gBhQGiAp4B+gH/AvwC/wL7Af8B+QLzAf8B8ALlAf8DUwGqBAADGQEjATgBWQGJAfUBZwHJAesB/wHI + AaABcgH/AfwB0wHRAf8B9gHLAcUB/wH8AeMBygH/Af0B4AHKAf8BrgGgAYEB/wHiAcUBsAL/Ad0BxQH/ + AfQByQGsAf8B+AHYAasB/wNaAdsDIwEzA30B9gP9Af8D8AH/A+8B/wPuAf8D7AH/A+sB/wPqAf8D6QH/ + A+cB/wPpAf8D5AH/A5EB/wPNAf8DywH/A1YBwQGlAVABQAH9AfsB1AGqAf8B4wHDAaIB/wHvAcABlgL/ + AcIBjAL/Ab4BhQL/AbkBdAL/AbUBbgL/AbEBZwL/Aa4BYgL/AaoBXAL/AacBVgL/AaQBUQL/AaYBTwL/ + AaABSAH/AVkBTwFHAfEDYQHkAcECqwH/Ac0CtgH/AeQC1gH/AfMC6QH/Ac0CvQH/AzQBVQgAAwsBDwF+ + AnQB8wH/AvoJ/wH9AvYB/wNbAcsDAAEBAkEBQgFzAS4BoAH9Af8BlQGwAa0B/wHtAcQBpAH/AfUBxwHV + Af8B+AHhAdIC/wHpAdsB/wHPAcMBpwH/AS8BpAFAAf8BVQGRAUwB/wHfAbsBrAH/AfUBywG0Af8B+AHO + AaAB/wNKAYoDEwEaA30B9gP+Af8D8QH/A/EB/wPwAf8D7gH/A+0B/wPsAf8D6gH/A+kB/wPoAf8D5gH/ + A8sB/wPoAf8DxwH/A1YBwQGoAVEBQAH9AecBygGoAf8BwwG4Aa0B/wHXAbUBlgL/AcUBjwL/AcEBigL/ + AbwBgwL/AbgBcgL/AbQBbAL/AbIBZgL/Aa4BYQL/AasBWwL/AagBVgL/AakBVQL/AaQBTgH/AVoBUQFH + AfEBZAJjAeAB0gK9Af8B4gLSAf8B7QLiAf8B+ALtAf8BjgKJAfkDHQEpBAADFAEbA1UBsgHYAscB/wH+ + AvsF/wGnAp0B+wNRAaADKAE9AwQBBgJZAVwByQFeAcgC/wG4AaYBhQH/AfkB1gHTAf8B8wHLAdgB/wH3 + AesB3gH/AfwB5AHeAf8BgQGxAW0B/wFfAegBnwH/AVEB2wGNAf8BVQGWAU8B/wHrAdYBywH/AmEBXAHc + AykBPwMNAREDfQH2BP8D8wH/A/IB/wPyAf8D8AH/A+8B/wPtAf8D7AH/A+oB/wPqAf8D6AH/A8gB/wPl + Af8DyQH/A1YBwQGoAVABQAH9AesB1gG/Af8B5AHzAv8B2wHKAbkB/wH7AcMBjQL/AcQBjwL/AcABhwL/ + AbwBggL/AbkBcQL/AbUBbAL/AbIBZgL/Aa4BYQL/AasBXAL/Aa0BWwL/AagBVgH/AVoBUQFJAfEDUgGh + AdQCwgH/AfYC7AH/AfIC6AH/AfcC7gH/AdgCyQH/A2AB1gNXAbgBZgJlAegBzgK7Af8B7ALhCf8BewJx + AfMDHQEqBAADKAE8ASQBTQGvAfoBlQHOAeIB/wHYAbYBkQH/AfcB0wHsAf8B8wHgAeQB/wH8Ae4B7AH/ + AcoB0AG4Af8BUAHGAWoB/wFeAboBZwH/AVsBzwGEAf8BUgHoAZsB/wFQAZkBTAH/A04BlwMvAUoDGQEj + A38B9gT/A/QB/wP0Af8D8wH/A/EB/wPwAf8D7wH/A+0B/wPsAf8D7QH/A+gB/wOJAf8DyQH/A9AB/wNW + AcEBpwFSAUAB/QH2AdwBvQH/AecB4AHYAf8B5wHMAbAB/wH+AccBlQL/AcYBkwL/AcIBjAL/Ab4BhwL/ + AbsBgQL/AbgBcQL/AbQBbAL/AbIBZwL/Aa8BYwL/AbEBYgL/AawBXAH/AWABUQFJAfEDHAEoAV0CXAHR + AYICfgHzAeAC0QH/AfcC7wH/AfkC8QH/AegC2gH/AdwCyQH/Ad8CzwH/AewC4wL/Av4J/wHwAuUB/wNY + AcEDAQECAk8BUAGbAT4BngL/AbUBvgGqAf8B8gHOAb4B/wH3AdMB7wH/AfwB8wHxAv8B8QH0Af8BXgG6 + AV8B/wFZAboBYAH/AesB3gHYAf8ByAHSAbkB/wFjAcoBbQH/AUgB7gGVAf8BWQFdAVkB1wM3AVoDKQE/ + A4EB9gT/A/YB/wP1Af8D9QH/A/MB/wPyAf8D8AH/A+8B/wPtAf8D7QH/A+oB/wOwAf8D3AH/A88B/wNW + AcEBqAFTAUAB/QH1AdcBsAH/AdQBtgGYAf8B6AG/AZkC/wHOAZ4C/wHIAZgC/wHFAZEC/wHBAYwC/wG+ + AYYC/wG7AYEC/wG3AXEC/wG1AW0C/wGyAWkC/wG1AWgC/wGxAWIB/wFgAVIBSQHxBAADCAELA2EB3AHQ + ArsB/wH1AuwB/wH9AvgG/wL9Av8C/gn/AfQC7QH/Af0C+wH/Ad0C0wH/A0ABbgQAAUEBTgF9AfABhwHO + Af0B/wHOAbkBkgL/Ad0B8QH/AfwB3gHuAf8B3gHbAdQB/wHmAtsB/wHEAdIBtgH/AfEB6gHjAv8B8wH1 + Av8B9wHuAf8BgAF/AZAB/gNVAboBTAGwAWAB+gFZAV0BWQHXAzABTQOBAfYE/wP3Af8D9gH/A/YB/wP0 + Af8D8wH/A/EB/wPwAf8D7gH/A+0B/wPrAf8D4gH/A/QB/wPMAf8DVgHBAagBUwFAAf0B5gHUAbwB/wHS + AdoB4AH/AdUBxAGxAf8B/AHNAZ0C/wHLAZwC/wHHAZUC/wHDAZEC/wHBAYsC/wG+AYYC/wG7AYIC/wG4 + AXMC/wG2AW4C/wG4AW4C/wG0AWgB/wFgAVMBSQHxCAADVQGwAdwCywL/Av0B/wH8AvUB/wHrAuEB/wH6 + AvYJ/wF/AnsB8gNEAXkDVAGuA0oBjAgAAVoBXQFoAeIBvAHjAeQB/wHpAccBkgH/Ae4B1wHQAf8BVAGc + AUcB/wEPAYoBCgH/AQ4BgAEHAf8BSwGDATUB/wHvAd0BzgL/AfIB4AH/AecB4QHCAf8CWQFdAdIDGwEm + AyIBMgNbAcgBWAFbAVgBxgOBAfYE/wP5Af8D+AH/A/gB/wP2Af8D9AH/A/MB/wPyAf8D8AH/A/EB/wPt + Af8DnQH/A9IB/wPSAf8DVgHBAagBUwFAAf0B8AHhAc0B/wHmAfEB+QH/Ad8B0wHDAf8B/AHSAaUC/wHS + AaUC/wHOAZ8C/wHLAZkC/wHIAZQC/wHEAZAC/wHCAYsC/wHAAYcC/wG9AYIC/wG+AYQC/wG8AXEB/wFg + AVMBTAHxCAADEgEZA1IBowHbAs0B/wFlAmQB4gNAAW4BbQJqAecB/wL+Af8B/AL5Af8DXAHJFAADLQFF + A1UBsgFaAl0BygFZAmQB7AFGAcoBQQH/AUgB3QFGAf8BOwHYATUB/wEXAYwBJwH/AY0BrAHFAf8BqgHM + AdcB/wFZAWQBewHsAzEBTwMIAQsDAAEBAwIBAwMfASwDhQH2BP8D+wH/A/kB/wP4Af8D9gH/A/QB/wPz + Af8D8gH/A/EB/wPxAf8D7QH/A5YB/wPPAf8D1AH/A1cBwgGdAXEBTQH+Af8B8gHNAf8B+gHeAcUC/wHb + AbgC/wHgAbIC/wHeAa0C/wHZAaYC/wHWAaIC/wHTAZwC/wHPAZgC/wHNAZQC/wHLAZAC/wHIAYwC/wHL + AYwC/wHGAYcB/wFfAUwBRAHzEAADMgFQAx8BLAQAA0oBiQFlAmQB4gNWAbEDNQFXIAADIAEuA1sBwwGB + AaEBgQH3AVwBYAFcAdQDPQFpAz4BawJBAUIBcwMfAS0DBAEFAwABAQwAA5MB+Bz/A/4B/wP9Af8D/QH/ + A/sB/wPfAf8D9gH/A9QB/wNXAcIBWQFLAUcB8gF4AU0BQwH6AXYBTQExAfoBdgFNATIB+gF1AU0BMgH6 + AXQBTQExAfoBdAFNAS8B+gFzAU0BLgH6AXMBTQEsAfoBcgFNASoB+gFyAU0BKgH6AXIBTQEpAfoBcgFM + ASkB+gFqAUMBOwH5AXQBNQErAfwBWwJZAdmAAANbAcsDrQH+A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9 + A7UB/QO1Af0DtQH9A7UB/QO3Af0DuAH+A24B9QM7AWVMAANWAbMDUgGpAzUBWAMtAUUDHAEnAxcBIAM7 + AWUBWgFfAWEB2wNBAXMDGgEkAwQBBhgAAxUBHQNCAXYDVQGyA1cBwgNWAcEDVAGrAz4BawMPARQcAAMQ + ARYDWwHIA2QB8QNiAe8DYgHvA2IB7wNiAe8DZwHyA1oB0wMUARsUAANWAbMBZwJRAfIBXwJbAeADVgG2 + A0QBeQMoATwDDQESKAADUgGpAQABlgHtAf8BWwJeAdADRAF7AzUBVgJPAVEBnAE1AYcBpwH3ATMBgAGR + AfUDPAFmAykBPgMXASADCgENAwIBAwwAA0MBdwFfAlUB6gGnAXsBegH+AdoBoAGdAf8B4gG1Aa0B/wHe + Aa0BpQH/AcsBkQGKAf8BeQE+AT0B/AFcAloB3AM4AV0YAAMEAQYDawHrA/oB/wPwAf8D8AH/A+8B/wPy + Af8D8gH/A1cB3xQAASwCKwFDAZQCagH5Af8B4wHUAf8B7wHAAbMB/wHQAZsBkwH/AZABawFpAf4BZwFE + AUUB+AFaAlYB5ANXAb8DSAGGAy8BSgMQARYYAAMxAU4BAAFeAeoB/wEAASoB9AH/AUsBYQF2Ae4BWQJe + AdkBAAGDAv8BAAEtAfEB/wFTAWsBcQHxA1MBqgNBAXIDMQFPAyEBMQMNARIIAANQAaMBrwJrAf0B+wLk + Av8B6QHmAv8B2QHPAv8B6QHZAv8B6AHWAv8B5wHVAv8B2gHKAf8B3AGaAZEB/wFcAj4B+ANFAX8IAAME + AQYDKgFBAz8BbQNKAYsDWQHrA70B/wO/Af8DvAH/A70B/wO+Af8DrQH/A1sB5QNNAZYDQgF2AzABTQMU + ARsEAAFJAkgBhwHfAawBpQL/AdwBxQL/AdcBwQL/Ad8BzQL/AeEB0wL/AdsB0AH/AfQByAG/Af8B2QGk + AZ4B/wGuAWkBZgH/AWIBRAFDAfsBWQJVAesDWQHHA04BlAMlATcLAAEBAw4BEwFYAWkBcQHmAQABGgH3 + Af8BBwEtAv8BCgFRAv8BBgERAfgB/wEAAWQB+AH/AbkBywG1Av8B3gGvAf8BfgFuAWQB8QNQAaQDNgFZ + AyIBMgQAA0sBkAG+AYIBhAH+Bf8B/gH8Av8B6QHnAv8BzQHDAv8B2AHJAv8B2gHJAv8B1wHGAv8B2gHH + Av8B5QHRAf8B9AG1AacB/wFcAj4B+AM4AVwEAANaAc0DewH8AbcBuAG5Af8B0AHRAdIB/wHOAc8B0AH/ + AdoB2wHcAf8C5QHmAf8B4gHjAeQB/wHiAeMB5AH/AeMC5QH/AuUB5wH/AcwB0QHPAf8BuwG/Ab0B/wKs + Aa0B/wN2AfwDWQHSBAADWwHIAfIBzQHEAv8B2wHNAv8B1gHMAv8B2QHRAv8B2gHUAv8B3QHWAv8B4gHZ + Av8B5wHdAv8B6AHeAv8B3wHUAf8B+gHMAcEB/wHjAa0BpgH/AaMBTQFMAf8DVQGyBAADAgEDAwsBDwMd + ASoBWwJgAdYBIwFfAf0B/wFYAWAB/QH/AUoBVQH8Af8BJwE7AfwB/wELAZQB9QH/AcQBwwGlAv8B2wGl + Av8B7wHHAf8B7AG+AZUB/wNRAacDMwFSAyoBQQGOAmUB+QH/AfAB7wL/AfsB+QL/AfAB7wL/Ae8B7gL/ + AdkB0QL/AdwBzAL/AeABzgL/AdgBxwL/AdMBwQL/AdQBwQL/AeMBzAH/AdwBlAGHAf8BXAJaAdwDEAEW + A7kB/QL4AfcB/wHVAdEBzgH/AdMB0AHNAf8B0gHQAc0B/wHRAc8BzAH/AcYBxAHCAf8BtwG2AbMB/wG+ + AbwBuwH/As0BywH/AtEBzwH/Ac8B0QHOAf8BzgHPAc0B/wPZBf8DaAHzAxwBKAFyAl0B8AH/AeEB2gL/ + AeAB3AL/AeEB3wL/AuMC/wLlAv8C5wL/AuUC/wHhAeAC/wHdAdsC/wHbAdUC/wHdAdAC/wHsAd0B/wHG + AYIBcwH/A08BmwQAAwkBDAMwAUsBXAJgAdQBMgGaAfwB/wGlAbAB/gH/AZ0BqwH9Af8BbwGNAfwB/wFR + AWQB+wH/ARoBRwH5Af8BEQGBAeYB/wGeAa4BoQH/Af4BvgGDAv8B4wGwAf8BlgGBAWgB9wNFAX0BVQJT + AbAB8QG7AbkC/wHcAdcC/wHbAdgC/wHuAe0C/wH3AfUC/wHUAdEC/wG5AbIC/wHGAbsC/wHYAccC/wHW + AcQC/wHSAb4C/wHWAcEC/wHQAboB/wGPAUEBQAH9Az4BawGjAacBqQH7AbsBsAGmAf8BsAFrAToB/wHG + AYgBTAH/AcYBgAFHAf8BxgFvAUIB/wHEAWsBPAH/AcQBZQE3Af8BxAFgATMB/wHCAVsBLQH/AcIBVQEn + Af8BwgFRASQB/wHBAUkBGwH/AZkBPwEeAf8B0gHUAdYB/wNlAfABPgI9AWoBuQGFAYQB/gH/AewB6wL/ + AecB6AL/Au4C/wL3Af8B/gL4Af8B/ALzAf8B/gL1Av8B7wHuAv8B6gHrAv8C5QL/AeYB4gL/AdIBzQH/ + AXoCQQH5AzABSwQAA0IBdgEyAW4BkwH2AR0BagL/AY4BpgL/AYwBpQL/AYwBmgH9Af8BbAGIAfwB/wFD + AV8B/QH/ASIBSAL/AQABKgL/AQABWgHyAf8BUgGkAbwB/wHDAYQBSAH/AcsBbgEzAf8DVgHBAWsCYgHp + Af8B7wHpAv8B5AHcAv8B0gHLAv8B2QHSAv8BywHKAf8B/QGqAa8B/wH+AcABwwH/Af0BrgG0Af8B/gGv + AasC/wHWAcMC/wHTAb8C/wHQAbwC/wHaAcMB/wHMAYYBbgH/A1MBrQGfAaUBpwH7Ab0BrwGhAf8B5gGi + AWEC/wG8AYcC/wGuAW8C/wGlAWYC/wGcAV0C/wGUAVYB/wH+AYwBTQH/Af0BhQFEAf8B/QFyAT0B/wH8 + AWsBNgL/AWMBKwH/AcABTAEfAf8BzALQAf8CZQFmAfABVgJUAasB8AHJAcgC/wL6Av8B/AH9Af8B/gL6 + Af8B9AHlAeYB/wHmAb4BvQH/Ad0BmAGTAf8B7wHSAdAG/wH0AfUC/wHwAe8C/wH0AfUB/wHwArwB/wNb + AeEDDwEUBAABWAJbAcsBWwJgAdYBQgFuAYoB9QEkAYkBygH/ARIBlQHpAf8BUAGKAf4B/wFkAXEB/AH/ + ARcBiwH5Af8BOAGmAeAB/wEnAYsBzgH/AR8BgAHFAf8BKAGmAdoB/wGvAYcBWwH/Ad8BlwFKAf8BZwFf + AVcB6AGeAW4BagH5Af8B9wHuAv8B6wHiAv8B6QHeAv8B2AHNAv8BqQGqAf8B4gG2AboB/wGnAmkB/QG4 + AZUBlgH+Af0BrgGzAv8BwQG1Av8B1gHCAv8BzwG7Av8B2QHCAf8B3wGeAY4B/wNXAcIBoQGlAacB+wG9 + Aa8BowH/AeEBoAFhAv8BuQGHAf8B+QGsAXAB/wH4AaQBaAH/AfgBnQFgAf8B9gGWAVkB/wH2AY4BUQH/ + AfUBiAFLAf8B9AGBAUQB/wHzAXEBPQH/Af0BagE0Af8BvQFRAScB/wHNAtAB/wJlAWYB8AFkAl8B4wH8 + AecB5gH/AfoB6AHlAf8B5gHBAbwB/wHSAZkBlgH/AcgBdAFyAf8BygFwAW4B/wHPAW8BagH/AdMBgwFx + Af8B8gHdAdoG/wL4Av8C/gH/AdIBkQGQAf8DUwGwEAACXQFaAcoBhAEsAQAB/wFJAU8BSQH/ASQBiwL/ + ATUBYAL/AUkBmAHIAf8B7wGcAUgB/wGGATQBAAH/AXQBLgEAAf8BlAE8AQcB/wHbAYwBNwH/AdcBlQFJ + Af8BgAFkAUwB8wGjAX8BdgH7Af8B9QHtAv8B6AHfAv8B6gHfAv8B2AHOAv8BswG2Af8B0gGyAbMB/wFV + AjYB9wGnAmkC/QHAAcUC/wG4Aa4C/wHXAcEC/wHPAbsC/wHYAcIB/wHiAaIBkgH/A1cBwgGhAaUBqQH7 + AbwBrwGjAf8B4gGjAWUC/wG9AYsB/wH6AbEBgAH/AfkBqQFsAf8B+QGiAWUB/wH4AZsBXgH/AfcBlAFX + Af8B9gGOAVEB/wH2AYgBSgH/AfUBggFDAf8B/QFzAT0B/wG+AVgBLAH/Ac0C0AH/AmUBZgHwAZYBbgFt + AfcB3QGfAZwB/wGyAVYBVAH/AaMBQgFBAf8BpgFHAUYB/wGwAVUBVAH/AbgBYAFfAf8BvwFpAWgB/wHA + AWMBYAH/Ac4BcwFsAf8B9wHfAdkG/wH1AfMB/wGjAUwBSgH9Az0BahAAAlkBVwG/AZ4BUAESAf8BvgGH + AUUB/wEiAYUB8wH/AQMBUwH9Af8BUAFZAVoB/wGLAUIBDwH/AWoBNAEGAf8BYAEoAQAB/wFhASYBAAH/ + AYABNwECAf8BjQFGAQ8B/wFpAVkBVwHrAYcCaAH1Af8B9AHtAv8B6gHhAv8B5wHcAv8B4wHbAv8BsAGy + Af8B7gGyAbYB/wHSAbIBswH/AeIBtwG5Af8B/QGoAa0C/wHLAcQC/wHUAcMC/wHPAboC/wHbAcQB/wHb + AZcBigH/A1UBsQGhAaUBqQH7AbsBrgGiAf8B4wGmAWgC/wHCAZAB/wH7AbUBhAH/AfoBrgFyAf8B+QGn + AWoB/wH4AaEBZAH/AfgBmgFdAf8B9wGVAVgB/wH2AY4BUQH/AfYBiQFLAf8B/gGGAUUB/wG/AVwBMQH/ + Ac0CzgH/AmUBZgHwA1cBugHhAbMBtQH/AeEBoQGlAf8BzgGHAYgB/wG9AWcBaQH/Aa0CVgH/AaUCSwH/ + AaQCSQH/AakBUAFPAf8BqgFLAUoB/wHJAW4BagH/Af0B7AHqAv8B4QHcAf8BZAFRAU8B8QMcASgQAAJJ + AUgBiAHPAYgBNgL/AcYBdAH/AVMBpQHpAf8BBwGDAfQB/wGuAZwBkQH/Ab0BoAGDAf8BvQGkAYoB/wG1 + AZgBcQH/AZ0BbAFHAf8BYQEtAQEB/wGEATkBAgH/AVsCWQHEAV4CWgHYAfgB5AHeAv8B8AHmAv8B4wHc + Av8B5QHhAv8B1wHVAv8BrwGyAv8BsgG3Av8BrQGxAv8BygHMAv8B5QHkAv8B2AHTAv8BygG8Av8B0QG8 + Af8BqAF0AWoB/gNCAXYBogGmAaoB+wG7Aa4BogH/AeMBqwFsAv8BxwGVAf8B+wG6AYkB/wH7AbUBgwH/ + AfoBrgFxAf8B+QGoAWsB/wH5AaABZAH/AfgBnAFfAf8B9wGVAVgB/wH2AZEBUwH/Af4BjwFOAf8BvgFh + ATcB/wHMAc4BzQH/AWUCZgHwAxgBIQF0AmoB7AH/AeYB6QL/AdQB1wH/Af0BygHNAf8B9QG9AcAB/wHl + AacBqgH/AdIBjgGPAf8BvwJrAf8BsAFZAVoB/wGhAT8BQAH/AdABigGIAf8B6QGjAZ0B/wNZAcwUAAMc + ASgBpAF1AUoB+gH3AdMBrQH/AbMBzgHvAf8BZQGxAfcB/wH+AfMB5wH/AegB0QG6Af8B6QHQAbcB/wHr + AdEBuAH/AeYBzAG0Af8B1wG0AY4B/wGnAXIBMwH+AzsBZAFJAkgBhwHdAawBpgL/AfkB8gL/AeUB4gL/ + AeMB4AL/AeYB4gL/AeMB3wL/AdQB0gL/AdsB2QL/AesB6gL/AegB5wL/AuYC/wHjAd8B/wH9AbcBqwH/ + AWMBWAFXAesDFAEbAaIBpgGqAfsBuwGuAaIB/wHjAbABcAL/AcwBmwH/AfwBvwGOAf8B+wG6AYgB/wH6 + AbMBgQH/AfoBrQFwAf8B+QGmAWoB/wH4AaMBZQH/AfgBnQFfAf8B9wGZAVsB/wH+AZcBVwH/Ab4BZwE7 + Af8BywHNAcwB/wFlAmYB8AQAAzsBZQG+AbABsQH9Af8B7QHvAv8B3AHeAv8B2gHdAv8B2AHcAv8B1QHY + Av8BzQHQAf8B+wHDAccB/wHuAbsBvwH/AeABnAGdAf8BiQJHAfkDPAFoGAADRAF6AfIBxgGbAf8B/QHq + AdgC/wHuAeEB/wH+AfsB8wH/AfcB5AHTAf8B8wHYAcEB/wHzAdwBxQH/AfgB5wHTAf8B+AHFAZMB/wNR + AaADEAEWAw8BFAFkAlsB4QHzAd0B1wL/Af0B+gL/AesB6AL/AekB5QL/AesB5gL/AewB5wL/AeYB4wL/ + AeoB6QL/Ae4B7QL/AfcB9gL/Af4B/QH/AbQBYgFfAf0DQwF3BAABogGlAaoB+wG7Aa4BoAH/AegBuQGE + Av8B2AGnAv8BywGaAv8BxQGUAv8BvgGMAv8BuQGHAv8BswGBAv8BrgFxAf8B/gGoAWsB/wH+AaQBZwL/ + AaQBYwH/AcIBbgFBAf8BywHMAcsB/wFlAmYB8AgAA1gBvAHzAugC/wH3AfkC/wHnAeoC/wHjAeYC/wHk + AecC/wHtAfAC/wHkAeYB/wG5AaEBogH9AVwCWQHJAy8BSiAAAkcBRgGAAawBmQGFAfgB/gH1AeoC/wH9 + AfgC/wH8AfgB/wH+AfgB8QH/Af4B9QHpAf8BwgGsAYAB/ANQAZ0DDQESAwMBBAQAAykBPwF3Al0B8AHz + AeIB3wb/AfkB9wL/AfQB7wL/AfIB7QL/Ae0B6QL/AfQB8gb/AvgB/wG9AYEBgAH+A1EBoggAAaMBpwGr + AfsBswGnAZoB/wHMAZwBWAH/AeYBuQGCAf8B5QGuAW0B/wHlAagBaAH/AeQBowFjAf8B5AGeAV4B/wHj + AZoBWgH/AeIBlgFVAf8B4gGSAVEB/wHhAY4BTQH/AeQBjgFKAf8BqQFdATAB/wLJAcoB/wNmAfAIAAMW + AR8BdAJqAesM/wH+AfYB9wH/AcIBngGfAf4BXQJaAdMBMQIwAU0sAAMqAUECVgFVAbQBgQF2AWoB8AHs + AckBrgH/AYsBfQFyAfICWgFXAb0BNQI0AVUDBwEJAwEBAgwAAyoBQQFkAl0B4gHdAa8BrgH/AfcB6QHo + Av8B/QH4A/8B+wL/AfgB8wL/AfAB7QH/AewCygH/AYsCbQH3A0sBjgwAAboCuwH9AdsB2AHWAf8BtAGk + AZUB/wG7AaoBmQH/AboBqgGaAf8BugGpAZoB/wG6AagBmgH/AbkBqAGZAf8BuQGoAZoB/wG5AacBmAH/ + AbkBqAGZAf8BuAGnAZgB/wG4AaQBlgH/AbIBpQGaAf8C7QHuAf8DawHzDAADQAFuAb4CtQH9BP8BxAKr + Af4BXQJZAdcDNwFaaAADEAEWAUkCSAGIAWACWwHWAYcCZQH0AaMBeQFwAfsBngJqAfkBaQJfAegBVgJV + AbEDKgFBEAADZwHlA6sB+wGiAaQBpgH6AaIBpAGmAfoBogGkAaYB+gGiAaQBpgH6AaIBpAGmAfoBogGk + AaYB+gGiAaQBpgH6AaIBpAGmAfoBogGkAaYB+gGiAaQBpgH6AaEBpAGlAfoBogGkAaYB+gOzAfwDXAHJ + DAADAQECA1cBuANlAeUBPQI8AWgDAwEENAADCAELAlMBVQGwAkwBjAHzAjsBjAHzAlMBVQGwAwgBC6gA + AxABFgM6AWEDVQG0A0sBjgMDAQQgAAMEAQYDAgEDBAADAQECA1ABnQI4Av8CAAH0Af8DUAGdAwEBAgQA + AwIBAwMEAQYkAAM9AWkDXQHXA1IBoWAAAwkBDAM3AVoDVAGrAV0CXAHqAasCqAH9AeUC4QH/AYICfwH+ + A1UBsQMNARIYAAMlATcDSAGEDAADQgF0AikB8AH/AgABzQH/A0IBdAwAAkcBSAGDAyYBOBwAAwMBBANe + AdkBuQK0Af8DXgHVAwEBAhgAAw0BEgMeASsDAwEEAxYBHgJYAVkB3QFQAVMBXAHqA0IBdAMRARcDHAEo + AzcBWgNEAXsDKAE9DAADKQE+A1QBrgFfAlwB6gKoAacB/QHdAtcB/wH5AfcB+AH/Af4D/wH6Af4G/wGv + AqgB/wNZAc8DGQEjEAADDAEQAlEBUgGnAzsBZAMkATUDAAEBBAADOQFfAgcBxwH/AgABqwH/AzkBXwcA + AQEDJAE1AzsBYwJRAVIBpwMMARAYAANVAbIBogKbAf8BvQK4Af8DSwGOAwABARgAA1cBvQFBAUwBXQHw + A0cBggMgAS4BNwFIAWUB9AEAAYgB9AH/AQABTQGmAf8DWQHMAV8CVwHoAZkBUQFQAf8BtAJhAf8BWQJL + AfIDOAFeCAABfwJ0AfUB3wLTAf8B+gHxAfIF/wH4AfYB+AH/AfcB9QH2Af8B8wHoAeAB/wHxAcsBqgH/ + AfEB2wHFBf8BxwLCAf8BWwJaAeIDLQFGDAADPgFrA0QBegNEAXkDQgF0AwABAQQAAzABSwIWAY4B+wIW + AYIB+wMwAUsHAAEBA0IBdQNEAXkDRAF6Az4BaxQAAy0BRQF4AnYB+gHHAsEB/wFoAmcB5gMNARIcAAE+ + AUgBZAH0AQABjAH8Af8BAAFRAawB/wNYAcYBWwJUAekBhQGBAZUB/wErAb0B/QH/AQABnwHgAf8BnQGS + AbEC/wG7AbcB/wH+AasBqgH/AcsBXgFgAf8BYAJBAfkDMAFNBAAB4QLTBf8B/gH9AfsC/wH7AfMB/wH+ + AfYB5gH/AfsB5AHAAf8B/AHMAZAC/wG0AVQB/wH3AaIBRgH/AeoBxQGrAf8B/QP/AtUB2AH/A1MB8QM6 + AWIIAANQAZ0DNQFWA0oBjAM0AVQDPwFtBAADFQEdAlQBYQHkAlQBYQHkAxUBHQQAAz8BbQM1AVUDSgGM + AzUBVQJPAVEBnA8AAQEDOwFkAWkCZwHuAbsCtAH/AboCtQH/AzoBYgQAAwMBBANMAY8DQwF3AxsBJgwA + AzABTQJUAWEB7gErAbUB9gH/AQABlQHiAf8BbwGDAacC/wG7Aa8B/wHkAcoBxwH/AWAB1QHvAf8BiwGu + AcoB/wH+AaoBpwH/AfACjgH/AewBhAGIAf8BzAFjAWYB/wNbAdkEAANWAasBpgKiAfoB+wH6AeoD/wHe + Av8B9wHLAv8B4QGnAv8ByQGEAv8BtAFXAf8B9wGcATwB/wHmAYMBLwH/Ad4BpQGHAf8B9gH3AfoB/wHl + AeYB6QH/AV8CWAH5A0oBigMEAQYDSgGKAz4BagNCAXYDSwGOAzIBUAQAAyUBNwJRAWAB6wJRAWAB6wMl + ATcEAAMxAU8DTAGPA0IBdgM+AWoCSAFJAYgIAAMNAREDWwHDAZwClgH/Ab0CtwH/AcYCvwH/A1oBvQME + AQYDSgGLA1oBxQG3ArEB/wG/ArgB/wM/AW0MAAMUARwBYQJbAeEB9gHXAdMB/wFiAeEB+QH/AVwBxQHn + Af8B9QHHAcUC/wHDAbsC/wGyAa4B/wH+Aa4BrQH/AfsBsQG0Af8B7wGrAaQB/wHfAZABigH/AegBgwGE + Af8BjwFKAUsB/wgAAykBPwNcAc8ByQG9AbIB/gH/AewBywL/AdoBnQL/AcEBagH/Af0BrQFOAf8B8gGZ + AUEB/wHkAYMBNAH/AdQBWwEdAf8B0AGAAVYB/wHrAd8B3gH/AukB6wH/AWECVgH9A0sBkAJEAUUBfAM9 + AWcDPQFnA08BlwMSARkDCgENAlcBWQHCAgAB0wH/AgABoQH/AlcBWQHCAwoBDQMSARkDTgGWAz0BZwM+ + AWoDQgF0BAADBAEFA1QBrAGwAqcB/wHEArwB/wHAArgB/wG4ArIB/wNbAcMDXgHQAakCpAH/AcgCwgH/ + AckCwgH/AWICYAHjAxQBHAwAAxwBKAGKAW4BcAH+Af8B5AHeAf8B/gHXAdAB/wH4AcYBxAL/AcEBwwL/ + AccBygL/AdIB0wL/At4C/wHjAeIC/wHcAdcB/wHxAbYBrgH/AcUBbwFoAf8DXwHgEAADPgFqAWcCZQHl + AeIBxgGyAv8BvwFzAv8BpQFBAf8B7gGRATkB/wHgAXMBMwH/AdMBXAEkAf8BwwE6AQkB/wG8AUMBJgH/ + AeEBvQG5Af8B3wHUAdYB/wNbAdADRAF7Az0BZwM9AWcDTwGXAxIBGAMOARMCVAFkAeQBGQErAv8CAAH0 + Af8CVAFhAeQDDgETAxEBFwNOAZYDPQFnAj0BPgFqA0IBdAQAAzMBUgGmAp0B/wHDArcB/wHJAsYB/wPT + Af8B1wLVAf8BoQKWAf8BvAK1Af8ByQHCAcEB/wGOAosB+QNNAZEDEgEYEAADBAEGAUoCSQGJAZYBiQGK + AfsB9gLVAv8B7gHtAv8B/QH8Bv8B/AH5Av8B8AHtAv8B4AHbAf8B8wHIAcIB/wHTAaEBnAH/AYUBWwFY + Af8DOAFcFAADBAEGA0wBkwF/AXkBeAH0Ae0BrwGKAf8B8AGNAUEB/wHeAWoBLQH/AdABXwE0Af8BxAFc + AT8B/wG3AVUBQwH/AbwBhQF0Af8BuAGoAaoB/wNVAbQDSgGKAz0BaQNCAXYDTAGPAywBQwQAAzsBZQFB + AUcBggHzAjsBgAHzAzsBZQQAAysBQgNMAY8DQgF2Aj0BPgFqAkkBSgGJBAADVgGzAb0CsgH/AbsCsgH/ + AcgCxgH/AeIC4wH/AeAC3QH/AagCngH/AZcCkwH7A1QBpgMaASUfAAEBAzEBTgNWAbMBcAFuAWwB7AHJ + AbcBsQH/AdEBvAG3Af8BzQG1Aa8B/wGbAZEBjwH7A10B0gFqAmcB8gHWAcoByQH/AbUBsQGyAf8DOQFf + HAADGgElA1sBxgHFAZ8BlAH/AcsBnAGNAf8BvAGfAZ0B/wG2AaQBpQH/AbYBqQGrAf8BtgGmAacB/wFf + AlIB9AMlATcCTwFRAZwDNQFVA0oBiwMyAVADUgGjAxEBFwQAAxYBHgMWAR4EAAMRARcDUgGkAzIBUQNK + AYsDNQFWA1ABnQQAAV8CXgHfAbkBrgGsAf8BiAFvAXAB/wGlApsB/wHsAusB/wG4Aq4B/wGpAZ4BmgH/ + AUIBWQFzAfUDQgF0AzMBUwI8AT0BaAMjATQDMwFTGAADAQECAxYBHwMiATIDKAE8AyYBOQMmATkDIwEz + A2AB3gT/AcoCwwH/AzYBWSAAA1kBxwG5Aa0BsAH/Ab0BsgG2Af8BugGuAbAB/wG7AqwB/wHIArYB/wN/ + Af4DQgF2BAADPgFrA0QBeQNDAXgDQgFzAzkBXwNSAaMDLgFHAxEBFwMRARcDLgFHA1EBogM6AWADQgFz + A0QBeQNEAXoDPgFrBAADFgEfA1wBzwGLAW8BbQH/AbMCpgH/AbsCswH/Ab4BtQG0Af8BxAGuAasB/wEW + AasByQH/AQABywH8Af8BAAGsAewB/wEAAbMB8AH/AQABlAHdAf8BAAGeAecB/wNOAZkMAAMCAQMDFQEd + AxYBHwMWAR4DGwEmAyMBNAM1AVcDTwGXA14B1wHWAtQB/gHqAuUB/wNbAcYDDgETHAADVAGrAcICswH/ + AdACwwH/AckCvAH/AcgCvAH/AdECxAH/AboCrQH/A1cBvQgAAwwBEAJSAVQBpgM0AVQCRwFIAYMDRAF6 + AzQBVANMAY8DTwGXA08BlwNMAY8DNAFUA0QBegJHAUgBgwI0ATUBVQJRAVIBpwMMARAIAANQAZ0BowGd + AZkB/wGkAZIBkAH/AaYBkwGSAf8BtAGrAakB/wE8AbABvQH/ARQB0wHvAf8BFwHWAfMB/wEWAdUB9AH/ + ARcB0QHzAf8BGAHVAfYB/wESAbIB5AH/AlMBVAGsDAADCgENA1cBuAFpAWMBZAHqAXICZwHuAbYBpAGi + Af0B0gG4AbYB/wHgAcsBygH/Ae0B2QHaAf8B4gLWAf8BbAJqAekDTgGWAxYBHhwAA0IBdgGoApsB/gHf + AtYB/wHUAssB/wHUAssB/wHaAtEB/wHaAs8B/wFiAlkB7AMSARkMAAMjATMDUgGpAjQBNQFVA0MBdwNK + AYsDQgF2Az0BZwM9AWgDQgF2A0oBiwNDAXcDNQFWA1IBqQMiATIMAANQAZoBbwGjAbYB/wGbAa0BsAH/ + AZIBwgHDAf8BgQHiAeMB/wErAYMBuQH8A0ABcQM7AWQDOgFiAzoBYQM6AWEDMgFQFAADQwF4AXYCZgHv + AYMBbwFwAfEBbQJmAecDYQHaA1sBxANOAZUDOgFgAx0BKgMBAQIcAAMpAT4BiwKIAfkB8ALsAf8B4wLf + Af8B5QLhAf8B6QLmAf8B8gLtAf8BiQJ/AfsDNgFZFAADIwE0AlEBUgGnA0QBewM1AVYDPQFpAjwBPQFn + AjwBPQFnAj0BPgFqAzUBVwNEAXsCUQFSAacDIwE0EAADHAEnAkcBSAGDAVoCXQHKAVgBaAF1Ae8BWgJd + AcoDSAGGbAADIQEwAWoCZgHsBP8D+AH/AfQC8wH/AewC6gH/AekC5gH/Ab8CtwH/A08BnBwAAw8BFAM+ + AWsDUAGdA0oBigNEAXsDRAF7AkkBSgGJAk8BUQGcAj0BPgFqAw8BFJgAA0ABcQGcApQB+QGBAn0B8gFp + AmgB5gNgAdYDWAHBA1QBrgNGAX8DAwEEMAADEQEXA0gBiANXAb8DVgHBA0wBkwMbASbYAAMGAQgDMQFP + A0IBdgNIAYcCVwFcAd8BAQECAbIB/wIIAcsB/wIJAcoB/wIWAZgB/wJaAVsB3AMoATxYAAMHAQoDRAF6 + A1IBqQNFAX0DJgE4AwoBDhQAAz8BbgNWAcEDVwG/A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNW + Ab4DVgG+A1YBvgNYAcADVgG+AzkBXwwAAz4BawFcAlcB3wGTAVIBPwH6AbYBfQE9Af4BVAE0AW8B/gED + AQgB1AH/ASgBKQHvAf8BLAEtAfcB/wFGAUUC/wFXAVAC/wEzATIBwAH/A1wBzgMKAQ4BXQJZAdcBgwFk + AVIB9wF1AWIBWwH2AXUBYgFeAfYBdwFiAVsB9gF3AWIBWQH2AXcBYgFaAfYBeQFiAVgB9gF5AWIBSQH2 + AXsBYgFJAfYBewFiAUkB9gF7AWIBSQH2AXsBYgFJAfYBewFiAUkB9gGHAWUBUQH3AV4BWwFaAdkUAAFV + AlMBsAHlAaYBSgH/Ae4ByAGXAf8BpQF/AVsB/gFtAVIBPQH3A1cB3wNUAasDPgFrAyMBMwMEAQYEAAF5 + Am0B9gHZAtMB/wHJArgB/wG4Ap8B/wG8AqIB/wHEAqkB/wG+AqQB/wG8AqoB/wHJAsEB/wHSAswB/wHH + Ar0B/wHFArAB/wHeAsAB/wHkAsUB/wHCApMB/wNXAcUEAAMDAQQDUwGqAbgBnAFdAf0B/wHWAaoC/wHZ + AZwB/wHbAbMBmgH/AR4BGAG+Af8BGwEdAekB/wItAfcB/wJKAv8BTQFRAfMB/wEzAUQB4AH/ATkBMQHs + Af8CWAFeAeUDDwEUAXICWQHyAd8B2wHfAf8B5wHgAeIB/wHhAbcBqgH/AeYBtAGSAf8B6gG5AZAB/wHd + AbEBnQH/AdkByAHGAf8B2gHVAdoB/wHaAdIB1QH/AdsB1AHXAf8B2wHUAdgB/wHcAdUB2AH/AeEB3AHf + Af8B3AHbAeEB/wF3AWQBUwHxBAADFgEfA1oBygNZAcQDSgGKAcgBqwFjAf0BuAG/AWwB/wG+AcQBnQL/ + Ae8B0AL/AewByQH/AfYB1wGtAf8B3AG0AYYB/wGoAYABSgH9AWQBSQE3AfYBXwFbAVoB4ANOAZgBtAKo + Af0B+gP/AeIC2gH/Ac0CugH/AdQCvgH/AdACvAH/AdICygH/AfgC9w3/AfEC7QH/AeAC1AH/AfkC2gH/ + AeMCsQH/A1gBywQAA1ABnQHnAa0BcAL/Ae4BxAL/Ad8BtQL/AegBrAH/AasBlwGgAf8CAAHFAf8BEQET + AfMB/wJEAv8BWwFMAfsB/wE/AUsB7AH/ARwBuQHpAf8BGAFSAcAB/wNWAb4EAAFqAWEBXAHuAe0B7AHv + Af8B/gHDAZ8B/wH+AakBSQH/AdgBlwFoAf8BvQGCAWsC/wGtAVQB/wHpAZwBWQH/AbwBoAGdAf8BwwGz + AbQB/wHIArcB/wHMArwB/wHQAsEB/wHdAdAB0QH/AewB6gHtAf8BbwFhAVUB7gQAA0gBhAFlAe8BkQH/ + AVABvwFkAf8BPAFyAR0B/wFhAb0BUgH/ATIBxgFBAf8BOAGXASgB/wHpAccBowL/AeUBxAL/AeoBzAL/ + AfIB2QL/AfUB3QL/AewB0AH/AfoB1QGpAf8BYgFVAVMB6gGdAokB/AHvAvIB/wHYAs8B/wHFArEB/wHI + ArIB/wHAArMB/wHlAt8B/wH6AvcB/wH2AvUB/wHvAfAB8QH/AfIC8AH/AfcC8gH/Ad4C2QH/AdgCwQH/ + AdoCqgH/A1sByAMvAUoBoAFxAU0B+gH/AccBkQL/AdMBnwL/AccBjgL/AdIBhwH/Ab0BlwGCAf8CAAHG + Af8BIgEgAv8BYQFnAfoB/wE6AWYB3QH/AT8BOgHeAf8BLgGDAfwB/wEAAbIB7wH/AUsBVQFeAe0DNgFZ + AWoCYQLuAd8B4AL/AbYBcgL/AdoBjAH/AZsBjAHEAf8BQQE8AdAB/wH3Ac4BjwH/AfwBsQFcAf8B5QG+ + Aa4B/wLrAe8B/wHsAuUB/wHsAuYB/wHtAucB/wHyAu0B/wHuAe0B7gH/AW8BYQFYAe4EAAM6AWEBlgHZ + AacB/gHuAf8B8gH/AaUB+AG5Af8BoAHxAbEB/wGoAf8BwAH/AWUBvwFjAf8B8gHZAbkC/wHnAcoC/wHo + AcwB/wH9AegBzwH/Af0B6QHTAv8B+AHqAf8B9QHdAcIB/wNTAa0BnQKIAfwB8ALzAf8B2QLQAf8ByAKz + Af8BwAKtAf8BzALBAf8B7gLlAf8B6ALmAf8B1ALSAf8BywLHAf8BygHJAcgB/wHkAuAB/wHuAuYB/wHW + AskB/wHRAqMB/wNbAcgBWgJYAcABzgFyATMB/wHRAYwBRgH/AfwBwwF0Av8BvQFpAv8BvAFfAf8B7QGw + AVQB/wE0ASEBpQH/AjsC/wFoAW8B/gH/ASABwQH3Af8BEwGKAeMB/wFUASQBkAH/AVMBhAGnAf8BAAGI + AegB/wNQAZ0BagJhAe4B8gHpAegB/wH8AcsBqAL/AfEByAH/AbEBrwHjAf8BbAFqAeMB/wH7AfABzgH/ + AfUBwgGYAf8BxgGgAZQB/wHDAbcBuQH/AcoCuAH/Ac4CvgH/AdACwAH/AdsC0AH/AfAB7wHyAf8BcgFh + AV0B7gQAA1ABngGMAegBpQH/AeEB/wHjAf8BugH/AcEB/wFyAf8BggH/AXEB8gGRAf8BWAGjAU4B/wHt + AdcBwQL/Ae8B1wH/AfsB6gHVAf8B+wHsAdsB/wH6Ae4B4AL/Af4B8QH/AZUBgAFfAfsDKgFBAZ0ChwH8 + AfAC8wH/AdkC0AH/AccCsgH/Ab0CrAH/AdMCxwH/AeoC4gH/AeMB4QHgAf8BkQGNAYwB/wEtASsBKgH/ + AaABnQGbAf8B2QHXAdYB/wHsAuUB/wHaAtAB/wHJAp8B/wNbAcgBdQFjAVQB7QGqAVcBHAH/AZcBPgED + Af8BwwFuASsB/wH5AbEBUgL/AbEBUwL/AbwBUAH/AbUBcAFLAf8BRQE7Aa8B/wFbAVkB7gH/AUgBaAHd + Af8BBwG1Ae8B/wFCAZUBswH/AbgBZwFRAf8CWgFeAdkDIQEwAWoCYQHuAfYB9QH2Af8B/QHiAdQC/wHk + AckB/wGjAZ4BwwH/AV0BWgGoAf8B/QHeAcMB/wH3AdUBxAH/Ad4B0wHRAf8B3gLWAf8B4gLYAf8B5ALa + Af8B5ALcAf8B6wHlAeYB/wH0AfUB+AH/AXICYQHuAzsBZAFfAb8BfwH+AdoB/gHlAf8B2AH/AdwB/wGs + Af8BuAH/AYkB/QGTAf8BnAH6Aa0B/wE8AcABVQH/AWABjAFEAf8B+AHnAdoB/wH9AfIB5AH/AfkB7wHj + Af8B/AH4AfAB/wH8Ae0B3AH/AV0CWQHSAwEBAgGbAocB/AHwAvMB/wHZAtAB/wHHArIB/wG+Aq4B/wHV + AsgB/wHoAuEB/wHoAeUB5AH/AVsBVgFVAf8DAAH/AYECcAH/AeAC3QH/AeoC4gH/AdsC0gH/AcYCnwH/ + A1sByAGYAW4BPgH4AY0BQgELAf8BbwErAQAB/wGbAUkBDQH/AfEBrQFXAv8BxAFyAv8BzgGHAf8B1AGQ + ATgB/wFnASwBDAH/AVEBKgE5Af8BkgFFAS8B/wGiAZoBiQH/AS8BrAH5Af8BngGDAYAB/wNQAZ0EAAFr + AmEB7gH5AfgB+QP/AfsB/wHEAckBygH/AUwBigGyAf8BLwFnAZ8B/wGCAZkBpwH/AewB3QHYAf8B3wLV + Af8B3ALSAf8B3wLWAf8B4QLXAf8B4gLZAf8B6gLjAf8B+AH5AfsB/wFyAmEB7gEwAjEBTQFqAawBhgH5 + AdAB+AHTAf8ByAH9AdUB/wHjAf8B7wH/Ab8B/gHPAf8BiwHvAZIB/wFgAeMBhwH/AUcBnwE/Af8B8gHf + AdoB/wH9AfgB7wH/AfcB8QHtBf8BwgGhAYsB/gNCAXQEAAGbAocB/AHwAvQB/wHZAtAB/wHIArMB/wG8 + AqwB/wHQAsUB/wHsAuQB/wHjAuAB/wGuAaUBpAH/AWcCXQH/AbUBrQGsAf8B4ALdAf8B7wLlAf8B2QLN + Af8BywKhAf8DWwHIAZwBagFBAfkBiQFDAQ0B/wGTAUoBDgH/AdsBngFQAf8B/QHLAYoB/wHhAawBaAH/ + Aa8BbgE6Af8BjwFKARUB/wFsASsBAAH/AWsBKAEAAf8BhgE3AQAB/wGyAVoBEwH/AZwBYgFLAf8BrAFo + AUIB/wNRAaIEAAFsAmEB7gH+AvsB/wHzAfoB/QH/AZsB2AH5Af8BggG9AeIB/wFsAbIB1wH/AVgBtgHi + Af8BtAHKAdcB/wHKAbUBsgH/AcUCtQH/AcoCuwH/Ac4CvwH/AdECwQH/AdsC0AH/AvoB+wH/AXIBYwFh + Ae4DBAEGAWYBZAFcAecB1AHxAdAB/wGjAe0BtgH/AcwB/wHbAf8BkgHvAaMB/wGQAdQBjwH/AbYB1QGp + Af8B3wHjAdAB/wH9AfYB8wH/AfYB9AHyAf8B9wH4AfkD/wH8Af8BZwFfAVQB7gMNARIEAAGaAoYB/AHw + AvQB/wHZAtAB/wHHArIB/wHEArAB/wHHArwB/wHxAegB6QH/AfgB+QH7Af8B5wLlAf8B5ALeAf8B4QHe + Ad0B/wHyAewB7QH/AeoB5AHlAf8B1gHFAcYB/wHWAqYB/wNbAcgBdgFjAVcB6wHHAYkBOwH/AfMBtQFi + Av8B1AGbAf8B/gHdAbYB/wG+AZsBcAH/AZMBZAFFAf8BngFxAVEB/wGdAW4BTAH/AZABXAE0Af8BgAFC + ARIB/wFdASUBAAH/AXQBNAEAAf8BkQFjATQB/gNCAXQEAAFsAmEB7gL/Af4B/wHrAfUB/AH/Aa4B3AH3 + Af8B2AH3Av8BwAHwAv8BcwHKAfMB/wG+AdgB5wH/AfUB8AHtAf8B8QLtAf8B8wLuAf8B8wLvAf8B8wLw + Af8B9wL0Af8B/gP/AXMBZQFhAe4DUQGiAfsB2gG8Bf8ByAHpAcwB/wGNAeUBmgH/AZAB2QGVAf8B9AHr + AecC/wH4Af0C/wH6AfsB/wH1AfcB9QH/AvcB+AH/Af0B/gL/Ae0B1QHIAf8DUQGnCAABmgKFAfwB8ALz + Af8B2ALPAf8BxAKxAf8BygK0Af8BxAKzAf8B0AHIAccB/wHQAccBwwH/A+wB/wHeAuAB/wH8AvoB/wH0 + Ae4B7QH/AdQCzQH/Ad0CwQH/AdoCqAH/A1kByQJWAVUBtAHOAYkBOAH/AewBwQGQAv8B8AHbAv8B9QHp + Af8B8gHpAd8B/wHdAcoBtgH/AdkBxAGuAf8B4AHMAbgB/wHaAcYBsAH/AckBrgGUAf8BoQFrAUQB/wGx + AV8BIAH/AWUBVAFRAe4DGAEhBAABbAJjAe4E/wH8Af0C/wHPAecB9wH/AdUB7AH6Af8BtAHhAf0B/wGe + AdUB+gH/At4B4gH/AbkBoQGfAf8BuAKkAf8BvgKrAf8BwwKwAf8BxAK0Af8B0gHEAcUB/wH9Af4C/wF2 + AWcBYQHuAYgBdwFVAfMB/wH8AfcF/wHvAdkBvwH/Ab0BxgGLAf8B5wH0AecC/wL7Af8B+AH6AfwB/wH6 + Af0C/wH8A/8B/Qf/AZMBcwFfAfsDJgE4CAABsAKoAf0B9wL8Af8B3gLXAf8ByQK2Af8B0AK6Af8B2QHH + AcsB/wGmAY0BgQH/AZgBTwEeAf8BmgGWAZMB/wFoAW0BcAH/AeoC7AH/AecB3QHUAf8B5AHLAbEB/wHq + AccBqwH/AdMBpgGlAf8DXAHOAykBPgGQAWUBSAH2Ae4B0QGwAf8B+AHuAeIB/wH9AfMB6QP/AfwB/wH5 + AfAB5wH/Ae8B1gG+Af8B8AHWAb4B/wHvAdYBvgH/AfEB3QHJAf8B+gHYAbIB/wHVAYYBPgH/A04BlAgA + AXkCagHyCP8B+wP/Ad8B8gL/AdMB7QL/Ae8B+wP/Av4B/wHtAukB/wHuAusB/wHwAu0B/wHxAe4B7wH/ + AfIB7wHwAf8B9QH0AfUF/wF+AW8BZwHxAkABPwFuAl0BWgHTAa8BlgGHAfkB7wHUAbYB/wHzAcwBrAH/ + AfMB1AG4Af8B7QHLAawB/wHsAcsBrwH/AfQB3gHKAf8B9QHiAdUB/wH3Ae0B5gH/AfcB5QHZAf8DWwHQ + AwEBAggAAYgCggH3AeUC3wH/AdQCxwH/AcYCtAH/AcwCuAH/AdgBwgHEAf8BvQGmAaIB/wGfAYEBZwH/ + Aa0BoQGgAf8BqwGjAaQB/wHLAb8BwAH/AdMBwgHBAf8B4gHPAcYB/wHhAcgBugH/AckBpQGkAf8DUQGn + BAADRAF6AcMBpQFaAf0B/AHsAdcB/wH6AfIB5wH/AfsB8wHrAf8B/AH0AesB/wH3AeUB1AH/AfcB5AHS + Af8B+QHuAeAC/wHzAdsB/wHyAbEBcQH/AVsCWQHEAwQBBggAAWACXAHUAYYCbQH3AXkBaAFlAfYBewFo + AWQB9gF7AWgBYgH2AX0BaAFiAfYBfQFoAWIB9gF9AWgBYgH2AX0BawFiAfYBgQFrAWIB9gGBAWsBYgH2 + AYEBawFiAfYBgQFrAWIB9gGBAWsBYgH2AYwBbgFtAfcBXgJaAdgIAAMlATcCTwFOAZcBZgFjAV8B4AHB + Aa4BmgH9AfMB3AHDAf8B/AHrAcoB/wGqAX8BZgH+A1UBsgJTAVIBqAFbAlkBxAMtAUUMAAE9AjwBZwFS + AlEBoQNdAdcBewJsAfoBZAJZAewBVgJUAasDUAGdAVIBUQFSAaEDUgGhA1IBoQFSAlEBoQNSAaEDUgGh + A1IBpANMAZMDGAEhCAACRwFGAYABkwF1AWIB9gH3AeIBzAL/Af0B9wf/Af0D/wH6Av8B7gHXAf8BtgF+ + AWoB/ANWAbYDDAEQXAADBwEKAzABSwJWAVUBtAGHAW0BZQH0A1UBtWgAAygBPAJWAVUBtAFuAWMBXQHp + AaoBjAF9AfkBrQGTAXgB+gF8AWkBXQHwAVwCWQHJAzoBYf8AGQADHwEsA0sBjwNVAbQDVwG/A1gBwANX + Ab0DVAGuA0EBcwMNARJgAAMMARADTgGUA1UBtQNVAbQDVQG0A1UBtQNWAbYDVgG2A1UBugNWAb4DQQFz + GAADBQEHAwEBAiwAAzIBUAFLAVgBSwHvAScBmAE7Af8BLgGwAUwB/wEyAbgBUwH/ATMBuAFTAf8BLwGz + AU4B/wEpAZ0BQAH/AS8BTwEwAf0DVwHFAw8BFCwAAw8BFANOAZcDRgGAAwMBBCAAA0gBhwGeAT0BQAH/ + AbEBSgFNAf8BtQFNAVAB/wG+AVUBVwH/AccBXAFeAf8BzwFkAWUB/wHUAWgBaQH/AdkBbQFuAf8B1QFz + AXQB/wFeAlkB5QMGAQgQAAJTAVUBrQEaAXMB0gH/AUIBaAGJAfUDWQHHAk0BTgGWAzsBZQNKAY0BmgFt + AVEB9wFfAV0BWQHXAVYCVQG0AU0CTAGRAUACPwFuAyUBNwQAAVwBXwFbAeABPQHVAWgB/wFKAeUBiAH/ + AVUB4QGNAf8BWwHiAZIB/wFcAeEBkgH/AVgB4wGPAf8BTwHlAYsB/wFFAeABcgH/ASkBZwEtAf4DQAFx + KAADJQE3AVoCWwHhASQBkgEdAf8BLAFAAQwB/QNWAbMDEAEWHAABWwJYAcsB8AGbAZQC/wG7AaQB/wH+ + Ab0BqQL/AbwBqAL/Ab4BqwL/AbwBqAL/AbwBqQL/Ab8BqgL/AcMBuAH/AV8CWAHjAwQBBhAAAUMBXQF5 + AfABPAHBAf4B/wFfAckB/gH/AVgByAH+Af8BQwG3AfAB/wFeAWABagH/AfMBuAGGAv8BvwFyAv8BuQFl + Av8BsgFWAv8BsQFUAf8B7AGkAWIB/wNEAXkEAAE4AYABPgH8AWQB6AGcAf8BdAHeAZ8B/wGJAeEBpwH/ + AZAB4wGsAf8BkQHjAa0B/wGNAeIBqgH/AYQB3wGiAf8BbgHsAaIB/wFDAa8BWAH/A1EBoCQAA0IBdgEz + AWIBOAH2AScB0AFeAf8BLAHJAToB/wErAZ4BAAH/AR8BVQEAAf8DWgHbAy0BRhQAAwEBAgFjAlgB6QH8 + AcYBrAL/AfUB2QH/AfgB7gHZAf8B+gH0AeIB/wH7AfQB5AL/AfwB8QL/Af4B+QL/AfwB+AH/Ae0B4QHd + Af8DVgG+EAADCQEMAQEBYAHUAf8BTwHFAf4B/wGSAdgC/wGWAdwC/wGDAaoBvwH/AdgBnwFyAv8BzgGa + Av8BywGTAv8BxQGIAv8BvgFvAf8B+AGyAWQB/wFtAXABhwH/AlABUQGfBAABWAGTAV8B+wGUAeoBtAH/ + AacB6AG8Af8BsgHsAccB/wG+AfMBzAH/AcAB9AHOAf8BtwHsAckB/wGtAeoBwAH/AZ8B8AG7Af8BWwG2 + AW0B/wNMAZMgAAMnAToBKQF9AT4B+gEqAdcBYgH/ASkB1gFnAf8BJgG0AS4B/wEoAZgBAAH/ASsBpAEA + Af8BJgFrAQAB/wNaAcoUAAMjATMBkQFPAU0B+wH/AdMBtwL/AfcB3wH/AZ0BjwGCAf8BRgFCAT4B/wGO + AYgBjAH/AcIBsAGrAf8B6gHgAdED/wH+Af8BzQHBAcAB/wNGAYEQAAMcASgBAAFqAeIB/wFtAdAB/gH/ + Ab4B6AL/AbgB5QH9Af8BnwGMAYQB/wH9AdkBtAL/AdYBqwL/AdMBpAL/Ac4BmwL/AcgBjgH/AckBjwFm + Af8BPgGvAfkB/wNSAakEAAFVAWUBVQHqAbIB8QHJAf8B0AH0Ad0B/wHmAfsB7AH/AeUB8QHrAf8B4gHv + AekB/wHtAfwB8AH/AdwB9gHmAf8BwAH5AdMB/wFTAZ0BWQH9AzYBWRwAAwwBEANYAcABIwG7AUgB/wEo + AdMBYAH/ASUBzQFfAf8BLAHAAT8B/wEpAZcBAAH/ASkBmwEAAf8BKgGYAQAB/wExAj4B+ANIAYYDAwEE + DAADRAF6Ab0BWgFQAv8B3gG+Av8B8QHZAf8BwgG0AaMB/wFHAU0BSAH/AYEBpwHAAf8BEAFMAacB/wJP + AW8B/wHvAdsByQH/AYoBegF4AfoDLQFFEAACKwEsAUMBCAGCAfAB/wGPAdkB/gH/AcIB6gL/AcEB5QH4 + Af8B0QGnAYwC/wHeAbkC/wHcAbYC/wHZAbAC/wHVAagB/wHzAaQBZQH/AaYBqgGuAf8BQAG2Af4B/wNK + AY0EAANOAZkBtwHgAcAB/wH0Af8B9AH/AewB/QHWAf8BcQGHAdsB/wFdAWIB2wH/AdAB+wHFAf8B6QH/ + AewB/wHNAfIB1AH/A1sB2QMHAQoYAAMmATgCVwFcAd8BAAEPAagB/wEYAa8BRgH/AScB1QFZAf8BRQHm + AYMB/wFEAesBhwH/ASwBwQFBAf8BKQGdAQAB/wEnAY0BAAH/AQMBYAGnAf8BCwE5AbAB/QNVAboDFQEd + CAADVQGyAdIBbAFYAv8B5QHDAf8B8AHaAcIB/wHpAdkBwgH/AbACpwH/AYwBvwHoAf8BDAGvAv8BAAFo + AdIB/wFiAWYBogH/AWICVgHvAxIBGRAAAzgBXgEYAZEB/AH/AZ4B3gL/AcgB6wL/AcUB4AHuAf8B5gG7 + AZsC/wHlAcgC/wHWAbAC/wGRAUIC/wGmAV8B/wHVAWMBMQH/AZsB2wH6Af8BOwG1Af4B/wNBAXIEAAMP + ARQBWgFeAVoB1QGiAdIBoAH/AXEBwwG2Af8BGwFiAbkB/wEOAVABuQH/ATIBsAGVAf8BcQHTAY0B/wFd + AWgBXQHwAykBPhgAA0EBcwIuAW4B9gIAAfcB/wEAARIBywH/AUMBxAFUAf8BiwH7AagB/wFlAf4BnwH/ + AUIB6gGDAf8BLQHWAWkB/wEpAcgBSQH/AScBoAEJAf8BAgFuAZwB/wEAAWgC/wEAATgBzgH/A1cB3wMw + AUsDAQECAWECWgHcAeMBkQFqAv8B7QHKAf8B5wHPAbYB/wHlAdABugH/AdoBxAG2Af8BSQFyAacB/wFh + AdkB9wH/ASABzgL/AQABmgHsAf8BGAE8AVkB/QNRAacDBgEIDAADRAF5ASkBmAL/AawB4wL/Ac8B7gL/ + AckCzQH/AfMB2gHFAv8B8QHiAv8B6wHWAv8BrgFqAf8B2AGGAVYB/wErARsBcgH/AWcBqgHhAf8BNwGt + AfoB/wM4AVwIAAMZASMBRwFiAWUB9gFuAbQB3QH/Ab0B1AHfAf8BwgHXAd8B/wFaAZ4BywH/ARIBawFw + Af8DTQGWHAACJQGTAfgCAAL/AgAC/wIAAdkB/wFLAYsBbgH/AaYB+QGgAf8BZQH/AaAB/wE+AeYBggH/ + AS8B1QFiAf8BKQHNAUsB/wEUAaIBRAH/AQABbgHEAf8BAAFgAv8BAAFqAv8BAAFHAeQB/wNYAcADHwEs + AWwBQQFAAfUB8wGtAYsB/wH7AeUBxQH/AdEBuQGkAf8BxgGyAaAB/wHtAdgBwQH/AcwBvgG5Af8BSwGL + AbMB/wFhAd0B8wH/ATsB8AL/AQABxQH7Af8BBgFRAX8B/gNYAcYDFQEdCAADTgGUATsBnwL/AbsB6AL/ + AdYB8AL/Ac4BwgG2Af8B+wHwAeYC/wH2Ae0B/wH9AfEB4wH/Ae4BzQGvAf8BWAFJAZMB/wEAAQYBuwH/ + AQABCQGtAf8BAgEVAbUB/wJXAVoBxQgAAzoBYQFTAagBvQH9AbQBzwHlAf8B5gHqAfEB/wHsAe4B9gH/ + AbwByQHdAf8BPgGWAcwB/wNZAdIDHwEsAxIBGQMEAQYDBAEGDAACCwG8Af0CAAL/AgAC/wEWARQB/gH/ + AgABxwH/ARUBUAFoAf8BUAHnAWIB/wFIAfoBgQH/ASoBxwFCAf8BBwGUAVQB/wEAAZsB1AH/AQABngL/ + AQABYAL/AQABYgL/AQABXgH4Af8DWQHHAzoBYgGGATcBLwL+AcEBmQH/Ad4ByAGuAf8BxQGuAZoB/wHQ + Ab8BqAH/AdMBwgGtAf8B3wHNAbMB/wG4AaABmwH/ATgBXQGbAf8BWQHOAesB/wFNAf0C/wEAAd0C/wEA + AWABrAH/AlsBXQHaAyUBNwQAAlMBVQGwAVEBqwL/AcsB7QL/AeAB9AL/AdUBwAGtAf8B/gH7AfgC/wH7 + AfcB/wHzAfAB7AH/AdMBzgHMAf8BTgFWAbcB/wFaAXIB8QH/ATIBSQHbAf8BMQFGAdoB/wJYAV0B0QgA + AVACUgGjAZ4B2QH0Af8BsgHgAfoB/wGqAdoB9gH/AZ0B1AH1Af8BlQHRAfUB/wFuAc0B9wH/AlMBYQHx + AV8CVwHfAWICWAHpAV4BWwFaAdkBXgJaAdgDUwGwAygBPAQAAhYBrQH7AgAC/wJDAv8CgQH+Af8BUQFO + Af0B/wEHAQAB3gH/AQIBKQGIAf8BJwGkATwB/wEKAZwBhwH/AQABowHsAf8BAAHMAv8BAAHHAv8BAAGc + Av8BAAFpAv8BAAFWAfQB/wNYAcYDTgGZAboBQQEuAf8B8wHAAZgB/wHWAcIBpAH/AdABuAGeAf8BxgGV + AY0B/wHLAYcBjQH/AccBgwGNAf8B1QGQAZQB/wHUAYIBkwH/AVsBUAGbAf8BTQGzAd4B/wFWAfYC/wEN + Ad8C/wE4AWgBpwH/AloBWwHcBAACWAFbAcsBaAG5Av8B3AHzAv8B6gH3Av8B3QHGAbIB/wHzAd8B0AH/ + AfUB5QHYAf8B9gHpAd4B/wH4Ae0B5AH/Ab4BtgHMAf8BNgFBAbgB/wGXAZ8B0wH/AU0BkAHHAf0DHwEs + CAABTQJOAZYBsgHeAfIB/wHbAfcC/wHRAe8C/wG4AeYC/wGgAd8C/wGGAdcC/wNZAewBngFvAVwB+AH/ + AekBwAL/Ad0BvAL/AdwBuAH/AdwBpQF0Af8BYAFXAVUB6wMwAUsCKwG8Af0CbgL/ApIC/wJvAv8CZQL/ + AV0BWwL/ASIBFQHhAf8BHwEhAWIB+wEAAawB4wH/AQAB9QL/AQAB3gL/AQABwgL/AQABsAL/AQABpgL/ + AQABcAH7Af8DWQHEA1oCygFWATwB/wHgAb4BmAH/AdMBtQGXAf8B0wGWAY0B/wHxAaIBpQH/Af4BswG0 + Af8B/gG0AbYB/wH+AbcBuQL/AcQBwgH/AfkBuAG6Af8BgwGAAbgB/wFIAa4B5QH/Aa0B8gHzAf8BbwGw + AewB/wFNAVEBYAHtBAACWQFdAdIBiwHIAv8B8QH6Av8B9wH8Av8B9gH5AfsB/wHwAeUB3AH/Ae4B4AHV + Af8B7QHcAc8B/wHsAdgByQH/AeoB1AHCAf8B9AHwAe0B/wH3AfsC/wFYAWIBcgHpDAADKAE8AXcBlQGi + AfoE/wH1A/8BzwHyAv8BtAHyAv8BYgGPAbYB/gFnAVkBVQHyAfkBzAGXAv8B3gGyAv8B4AG5Av8B4QG5 + Av8B7AG+Af8B7AGlAWgB/wNXAb0CWAFbAcsCcwHlAf8CkQL/Am4C/wJkAv8CYAL/AUQBQAGQAfoDUAGd + AVcBXgFiAd8BAAHpAf4B/wEAAeQC/wEAAcAC/wEAAbEC/wEAAa4C/wEwAW0BngH3AzoBYgFjAkoB7wG+ + AWcBSAH/AcwBogGEAf8B1AGOAYcB/wH3AasBqQL/AbcBsgL/AbYBswL/Ab4BvAL/AcYBxQL/AdkB1wL/ + AfwB+gH/AeYBsQG9Af8BXQFYAV4B5QFLAWgBsgH9ARwBWgHKAf8DSwGPBAADHAEnAlMBVQGtA1wB0QJd + AV8B1wJeAWMB3QJfAWYB4wFiAWMBbgHpAWIBaAF7Ae8BagF0AZYB9QFtAZABvwH7AYcBpgHwAf8BiAGr + AfUB/wJUAVYBqxAAAUYCRwGAAX4BmAGiAfoB1gHlAe4B/wG8AeIB8QH/AWoBjAGyAfwCUAFSAaMBYQJa + AdsB/wHaAZQC/wHNAZkC/wHOAZ0C/wHMAZsC/wHXAZwB/wH+AbUBZwH/A1cBvwQAAk8BUQGcAj4BtAH8 + AoMC/wJZAfUB/wJLAWUB7wMzAVIEAAMQARYBWAJaAcABAAG1AfYB/wEAAc8C/wEAAaQC/wFaAV8BZQHg + AycBOgQAAXYBKwEnAfwBtgFkAU8B/wHoAasBoAL/AcYBwAL/Ac8BxwL/AdQBzQL/Ad4B1wL/AeYB4QL/ + Ae8B6QL/AvoB/wG7AYQBmQH+A1QBrwMEAQYDQAFwAksBTAGPAwEBAi8AAQEDBQEHGAADLwFKAVECUgGh + A1IBqQM5AV8EAANFAX0B1gGNAXIB/gH/AfQB1AL/AfQB3wL/AfUB3QL/AdsBqgH/AYwBUgE+AfcDMQFP + CAADOwFkAlEBcwHuAlsBXgHQAxgBIRAAA0wBkgE0AWIBmgH2AlUBVwG6AwwBEAgAAV8CVwHfAZcBQQFA + Af4BtwJSAf0BqwFZAVsB/AGqAVsBYAH8AZkCXwH7AZkCXwH7AZwBVgFrAfoBmgFfAWIB+wF5AVkBZwHy + A0QBfHgAAUcCRgGAAWwBZQFeAeUBqgGEAXoB+gGeAYIBbQH3AWACXAHUAzMBUoQAA0sBjgNZAcMDVwHC + A0IBdkAAAxEBFwNEAXkDVgGzA1gBxgNXAcUDVAGvAz0BagMNARIQAAJVAVcBugEhASQBlAH7ATsBPQGO + AfgBOAE6AYsB+AE0ATgBiAH4ATEBNwGFAfgBMQE0AYIB+AEuATEBfgH4Ai4BfAH4ASsBLgF6AfgBKwEs + AXkB+AEpASsBeAH4AisBdwH4AisBdwH4ARwBHQFtAfsCWQFbAcMMAANTAaoDWAHRA1gBywNaAdUBUAFd + AWoB7QE/AV0BdwHzAVYBVwFfAegDWwHQA1wBzgNZAdIDRAF8CAABNgFtAYwB9wEAAbUB4QH/AQEBqwHa + Af8BTwFXAVkB7AMZASM4AANDAXcBYgFZAVgB6wJ/AU0B/gGBAakBSAH/AYYBuwFWAf8BiQG2AVcB/wGz + AagBcgH/AaIBVgFOAf0BWgJYAd4DOQFfDAABNwE4AYMB9gEjAT4B7gH/AQsBJgHkAf8BBgEfAeAB/wEJ + AR4B2gH/AQcBGgHVAf8BBAEVAc8B/wEPAR0B1gH/AQ8BGQHSAf8BAgEJAcEB/wECAQYBvQH/AQABBAG5 + Af8CAAG1Af8CAAGvAf8CAAG5Af8CMwF6AfcMAAGyAasBrAH/AdsB0gHRAf8B4gHMAcIB/wGFAaMB3gH/ + AVoB0gL/AWgB6QL/AWIBrQHyAf8B2gHGAcIB/wHfAdUB1AH/AbwCtgH/A1UBtQgAAT4BdQGDAfQBAAHo + Av8BAAHuAv8BAQGDAbUB/wJaAVwB3ANKAYsDAwEELAABUgJQAaQBsgJ/Af4B/wHvAeUB/wHdAfgBzwH/ + Ad8B9QHOAf8B5gH1AdYB/wHpAfoB3wP/AfoD/wH5Af8B6wHIAbkB/wFqAkEB+QNEAXoIAANVAbUBHwEy + AdsB/wEAAREB5AH/AVgBZwHRAf8BqwGvAdAB/wGpAa4B2QH/AbMBtwHgAf8BnAGfAccB/wGaAZwBxAH/ + AbQBtgHcAf8BrAGuAdMB/wGvAbABywH/AWUBZwG6Af8CAAGkAf8CAAGrAf8CVgFYAcEMAANRAaADVQGt + A1ABnQNVAbUBYAGqAcsB/QFtAbcB5wH/AVkBYAFoAesDVAGmA1UBrQNSAakDKAE8CAABWgJdAdMBAAHa + AfQB/wEAAdkB9wH/AQABzAH6Af8BAwG4AesB/wElAUMBagH5AzgBXCgAA0sBkAHGAZoBcQL/Af0B4wL/ + AeoBzgL/AeABwgL/AdwBuwL/AdwBuQL/Ad0BvQL/AeABwwL/AeoB0QP/AfYB/wH9AeQB1AH/AWoCQQH5 + AzgBXQQAAysBQgEoAS4BlwH7AQkBJQHqAf8BcQGIAdcB/wH5AfUB2QH/AfgB9gHqA/8B+wH/Al8BUwH/ + AlQBSQP/AfkB/wL6Ae8B/wL7AeIB/wGNAY8BxQH/AgABtQH/AQABAgGTAf8DMgFRGAADMwFSAX0BeQF6 + AfoBpQGaAZwB/wNUAa4YAAMkATUBVgFjAWgB6AEAAdsB9AH/AQAB2gH2Af8BAgHuAv8BAAGaAdQB/wFD + AUoBWQHyA0sBkAMjATMcAAMmATgBfQFcAUMB+AG/AdMBjgL/AdsBsgL/Ac8BnAL/AcoBkwL/AcgBjwL/ + AckBjgL/AcsBlAL/AdIBnwL/AdYBqQH/Ae4B1QGrAv8B+AHhAf8B8gHIAa0B/wNYAd0DDQESAwQBBQNT + AaoBHgExAd4B/wEbATIB6AH/AdYB2AHlAf8B+gH5AfIB/wL9Af4B/wLVAdcB/wLSAdMB/wL9Af4B/wL6 + AfUB/wHhAeIB5QH/ASIBJQG8Af8BAAECAbUB/wJWAVgBuQMJAQwMAAMxAU8DVgG2A1cB6AF1AXkBdAH6 + AbMBqwGmAf8BhgJtAf8DWAHRAxABFhgAAyQBNQFVAWcBcQHrAQAB4QH5Af8BAAHQAfUB/wEAAdQB/gH/ + AQYBwQHxAf8BEgFFAZkB/QFLAVEBXQHtA1EBpwNKAYsDJAE1EAADVQGyAXABjwE3Af8BbAGjAUAB/wH4 + AckBjQL/AcABcgL/AboBaQL/AbkBZQL/AbsBaAH/AdQBrwFWAf8BdAGYATYB/wHhAb0BcAH/Ae0BxwGO + Af8BqAGyAWQB/wFqAakBSwH/AZYBUwFAAf0DPQFqBAADKgFBAkIBhAH1AQgBJAHtAf8BagGDAegD/wH3 + Bf8DvAH/A7UH/wH8Af8BkAGUAdUB/wEAAQIBwAH/ATEBNAGBAfgDMQFOEAABbQJnAfEB4wHaAdsB/wHz + AesB6gH/AekB7AHkAf8B2wHQAc4B/wHLAbgBuQH/AY4CgQH/A1gB4wM9AWoDAQECFAADJgE4AVABZgFx + Ae0BAAHiAfkB/wEAAdMB8wH/AQsB5QH9Af8BEwHmAv8BDQGvAfIB/wEAAVsBxgH/AQABUAG+Af8BUwFU + AVwB5wM4AV0MAAFmAVUBVAHqAT8BggEdAf8BFgFeAQAB/wFwAYkBKQH/AfUBswFYAv8BsQFTAv8BrgFP + Av8BswFVAf8BhgGKAScB/wEGAVgBAAH/AWsBhgElAf8B/QHFAYMB/wGdAZwBQwH/AVYBkQEvAf8BxgGc + AWMB/wNTAbAIAAJUAVYBqwElATcB3gH/AUABVAH1Af8B7QHuAfwF/wOMAf8DcwX/AeoB6wH+Af8BJQEs + Ad8B/wEFAQ4BwAH/AlUBVwG3AwEBAhAAAX4CegH4Ae0C4AH/AeIC1gH/AecB3AHeAf8B2QHKAcsB/wHU + AsMB/wHlAtQB/wHJAroB/wFUAk8B/QNXAcIDIQEwFAADKQE/AUoBYwFzAe8BAAHjAfoB/wEAAc4B8gH/ + ARYB5AH7Af8BOAP/AUIB6gL/AVoB5AL/ARMBigHnAf8BMAE5AW0B9wNGAYAIAAGHAVsBQQH5AS0BYQEM + Af8BFwFMAQAB/wEUAUsBAAH/AbEBkQEyAv8BswFSAv8BtAFUAv8BuAFXAf8BXgFrARkB/wEZAU8BAAH/ + AR4BUAEAAf8BqgGTATkB/wHlAbABXAH/AckBsgFnAf8B7AG6AYoB/wNXAcUIAAMnAToCQQGVAfkBngGi + Af0B/wLPBv8DagH/A1gF/wKnAv8BGgEbAf4B/wEiASQBqAH9Ay8BSRQAAYQCggH3AfkC8gH/AfIC7QH/ + AfEC7gH/AdwCzwH/Ac8CvQH/AdQCxQH/AeEC0gH/Ae8C4gH/AZgCjQH/A1EBoRgAAy0BRgFJAWQBdQHv + AQAB3QH0Af8BAAHHAfAB/wEVAeAB9gH/AU0D/wGOA/8BjwH2Av8BJwGjAfkB/wEwAT4BYgH1Ay8BSgQA + AZABXwEyAfsBJQFMAQQB/wEWATgBAAH/AWQBYgEYAf8B4wGpAUsC/wG3AVoB/wHbAaMBSQH/AbYBjgE2 + Af8BNQFHAQAB/wEaAToBAAH/AR0BPgEAAf8BNgFMAQMB/wGeAYMBLwH/AaMBjwE8Af8BuwGXAVIB/wNZ + AccIAAMCAQMCUAFSAaMBdAGCAecB/wG9AbwC/wL7Av8CSQFFAf8COwE2Af8C9gH+Af8CYgL/ASUBJgHi + Af8DVQGyAwUBBxQAAYUChAH3Af4C/AH/AewC5gH/Ae8C6gH/Ad0C0QH/Ac4CvAH/AdMCxAH/AdUCxgH/ + Ae0C3wH/AboCrQH/A1IBqRwAA0gBhAEAAagB2gH/AQAB6wH9Af8BAAHkAfQB/wETAv4B/wFEA/8BkgP/ + AZsD/wEQAXEB4QH/A1sB0AMPARQBfQFYAUgB9gGFAWsBJAH/AbcBigEwAf8B9QGuAVAC/wG+AWcB/wHb + AawBYAH/AU4BUwEfAf8BOwFKARcB/wFBAUsBGQH/ATgBQQEQAf8BKQEzAQAB/wEzATQBAAH/AjsBAAH/ + AToBQAEHAf8BkgFkAS0B/wNVAbQMAAMkATYCTAGCAfMBsgG0Af4B/wLfAv8CagFkAf8CZQFZAf8CwAH8 + Af8BUQFSAf4B/wE6ATsBigH3AyoBQRgAA4QB9wHYAsoB/wHIArcB/wHoAuAB/wHfAtMB/wHMArkB/wHS + AsEB/wHVAsQB/wHmAtYB/wGtAp8B/wNRAaccAAJbAWAB1gEAAcoB+QH/AQAB4AL/AQAB7wL/AQAB/AL/ + ARID/wE5AfoC/wGGA/8BXwHgAv8BBwFLAZsB/gNKAYwBXgFbAVoB2QGxAYsBNgH/Ae0BqgFJAv8BygGM + Av8B3gG3Af8B4AHSAbkB/wGfAaYBjwH/AaABpwGPAf8BqAGrAZMB/wGmAakBkAH/AZUBmQFxAf8BYQFl + AT8B/wEcASwBAAH/ASQBNAEAAf8BqgFlATQB/wNDAXcMAAMDAQQDUAGdAYIBhQHlAf8ByQHIAv8C5gHv + Af8C5gHtAf8ClgL/AUYBSAHjAf8DUwGqAwYBCBgAAYQCgwH3Ac0CuwH/AcMCsgH/Ae8C6gH/Ad4C0gH/ + AcYCswH/AdACvgH/AdECwAH/AeIC0QH/AakCmgH/A1EBpxwAAVUCVwG6AQABxwHzAf8BAAHRAv8BAAHa + Av8BAAH1Av8BEgHYAfEB/wE+AVoBggH1AS8BqAHCAf0BWAP/AQcBggHoAf8DTgGUAUcCRgGBAZ0BaQEx + Af8BpQG1AXMB/wH5Ae4B2gL/AfAB4QL/AfYB6gH/AfEB7gHgAf8BwgHPAbgB/wHGAdEBugH/Ac0B1QG8 + Af8BxAHQAbcB/wG6Ac0BtQH/AYUBqAGGAf8BagGAAS0B/wFmAVkBVQHsAxIBGRAAAyUBNwJTAYAB8QG+ + AcAB/gH/AtcC/wHJAcgC/wGOAY8C/wE7AT0BhQH2Ay0BRRwAA4QB9wHvAugB/wHwAusB/wH+Av0B/wHZ + AswB/wG+AqgB/wHHArQB/wHNArsB/wHfAs0B/wGmApcB/wNRAaccAAMQARYBVQFjAXMB6wEAAdMC/wEA + Ac8C/wEAAegC/wElAYYBugH+A1kBzwElAWUBlQH4AQABswHzAf8CVwFaAb0DDQESAw0BEgFgAlcB3wG9 + AccBlQH/AcwB6QHRAf8B5QHpAdgB/wH4AfQB6QL/Af0B+AH/AdkB6AHWAf8BvgHYAb4B/wHAAdgBvwH/ + AcMB2QHBAf8BwAHfAcoB/wG3AdgBqwH/AZgBfAFFAf4DRAF5GAADUAGeAYwBkAHlAf8CzAL/AbUBtAL/ + AW0BcAHkAf8DVAGuIAADcAH1Af8C/QH/AfYC7wH/AeQC2wH/Ad4C0wH/AdMCxQH/AcQCsAH/AcECqwH/ + AdYCwQH/AaICkQH/A1EBpyAAAzkBXwEhAXkBpAH6AQAB0QH7Af8BAAHeAv8BAAHBAe0B/wEGAX8BqAH+ + AQABjQHbAf8CWQFbAcMDBAEGCAADJQE3AXMBWAFQAe8B4AHdAboB/wHbAfgB5wH/Ad4B8AHlAf8B7AH1 + Ae0B/wHjAe8B4wH/AdUB5wHWAf8B1QHqAdwB/wHbAfYB6QH/AesB8AHPAf8ByQGTAVMB/wFSAlABpBwA + Ax0BKgJMAYIB8wHWAdgC/wHMAc0C/wI+AZYB+AMmATkgAAM+AWsDYQHqAcwCxQH/AfAC6AH/AfAC6AH/ + AegC4wH/AeAC2QH/Ac4CvwH/AdACuQH/AZ0CiwH/A1QBqyQAAzgBXAFXAVwBYQHfAQABsQHpAf8BAAHq + Av8BAAHLAfQB/wJaAV0BygMJAQwQAAMlATcBYgJYAd0B4gG3AZ4B/wH4AfcB7An/AfsD/wH6Af4B8gH/ + AfYB2QG9Af8BlgFlAVsB+ANOAZQgAAMCAQMDTgGUAZMBlwHoAf8BmgGfAekB/wJPAVMBpQMDAQQkAAMJ + AQwDSwGPA2UB7wHZAtYB/wH5AvYB/wH6AvcB/wH4AvcB/wHtAuUB/wGXAooB/wNOAZkoAAMNARIDTgGU + AUIBYwF8AfACWgFdAcoDDQESGAADCQEMAUcCRgGAAV4CWwHZAYkBaQFcAfUBqwGMAXAB+wGiAYMBagH5 + AWwBXAFVAeoDVQGyAycBOigAAxsBJgJaAWEB2wFVAVYBZAHkAyIBMjAAAxUBHQNQAZ4BeAJ3AfUDiwH5 + A18B4wNZAccDTAGTAxYBHwgAAUIBTQE+BwABPgMAASgDAAFAAwABIAEBAgABAQEAAQEGAAEJFgAD/wEA + AfABHwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYA + AeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAfgBDwL/Af4BfwL/AfABBwL/Af4BfwL/ + AfABAwH5Ac8B4AEPAv8B4AEBAfgBjwHgAQcCAAHgAQEB8AGPAeYBRwIAAcABAQHwAQcB5gFDAgABwAEA + AeABBwH+AQcCAAHAAQAB4gETAfABBwIAAcABAAHCATMB4AEPAgABwAEAAcQBEwHgAR8CAAHAAQEBhAEZ + AeABbwIAAeABAwGIAQkB4gFnAgAB/AEPAgAB4AFHAgABwAF/Av8B8AEHAgABgwG/Av8B/AE/Av8BzwG/ + Av8B/gF/Av8B+AE/AccB4wHgAQcBfwH/AeABAwHBAcMBwAEDAT8B/wGAAQEBwAEDAeABBwGPAf8BgAEB + AeABBwGAAQEBgwH/AYABAQHgAQcBgAEBAcEB/wGAAQEB4AEHAYABAQHAAf8BgAEBAeABAwGAAQEB4AE/ + AYABAAHAAQEBgAEBAfABHwQAAcABAwH4AQ8EAAHAAQMB/AEHBAAB4AEHAf4BAwEAAQEB+AEfAeABBwH/ + AQEBgAEBAfgBHwHwAQ8B/wGBAcABAwH8AT8B8AEPAf8CwAEHAfwBPwHwAQ8B/wHwAv8B/AE/AfgBHwH/ + AfwB4AP/AcIBAwH/AeEB4AE/AgABgAEBAf8B4AHAAQ8CAAGAAQAB/wHAAYABBwIAAYABAAH/AYABAAED + AgABgAEAAf8BgQEAAQMCAAGAAQAB/wEDAQABAQIAAYABAAH/AQMEAAGAAQABjgEHAeAEAAEBAQwBDwH8 + BAABAwEAAR8B/gQAAQEBAAE/Af8BAQMAAQEBAAE/Af8BAwMAAQEBwAFjAf8BhwMAAQMBwAEDAf8BxwMA + AQcB4AEDAv8CAAEBAQ8B8AEPAgAC/wGfAf8BgAEBAgAB4wH/AYcB/wGAAQECAAHBAf8BgQH/AYABAQIA + AcAB/wHAAf8BgAEBAgABgAF/AcAB/wGAAQECAAGAAT8BwAH/AYABAQMAAR8B4AE/AYABAQMAAQ8B8AEf + AYABAQMAAQcB+AEPAYABAQIAAQwBBwH8AQ8BgAEBAgABHgEDAfwBBwGAAQECAAE/AYEB/gEDAYABAQIA + Af8BwAH/AQMBgAEBAgAB/wHwAf8BgQGAAQECAAH/AfgB/wHBAYABAQIAA/8B4QGAAQEE/wHgAQMBgAEB + AYABAQGAAQcBgAEBAYABAQMAAQMCAAGAAQEDAAEBAgABgAEBAwABAQIAAYABAQMAAQECAAGAAQEGAAGA + AQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAH/AcMBAAEBAQABAQEAAQEB4QGHAQABAQEAAQcBAAEB + AeABBwEAAQcBAAEPAQABBwHwAQ8BAAF/AQAB/wEAAX8B8AEPAQABDwGHAeEB4AEHAf4BBwEAAgMCwAED + AfgBBwEAAgECgAEBAcABBwYAAYABBwYAAYABBwIAAYABAQIAAYABBwIAAcABAwIAAYABBwIAAeABBwIA + AYABBwIAAeABBwIAAYABBwIAAcABAwIAAYABBwIAAYABAQIAAYABAQYAAYABAQYAAYABAQEAAgECgAEB + AYABAwEAAf8BAwLAAQMBgAEPAv8BhwHhAeABBwGAAX8B/wH4AgAB4wH/AeABBwH/AfACAAHBAf8BgAED + AeABIAIAAYAB/wGAAQEBwAEBAwABfwGAAQEBwAEDAwABPwGAAQEBgAEHAwABHwGAAQEBgAEBAwABDwGA + AQEEAAGAAQcBgAEBBAABwAEDAYABAQQAAeABAQGAAQEBAAEBAgAB8AEAAYABAQEAAQECAAH4AQABgAEB + AYABAwIAAfwBAAGAAQEB8AEDAgAB/gEBAYABAQH8AQcCAAH/AQMBgAEDAf8BBwIAAf8BhwHAAQcBgAH/ + AgAB4AEHAeABBwGAAf8CAAHgAQcBwAEDAYADAAHAAQEBgAEBAYADAAGAAwABgAEAAYABAAGAAwABgAMA + AYADAAGAAwABgAMAAYADAAGAAwABgAMAAYADAAGAAwABgAMAAYACAAEBAYADAAHgAgABAQGAAQECAAHg + AgABAQGAAQECAAHgAQEBAAEBAcABAwGAAQEB8AH3AYABAQHwAQMBwAEDAfAD/wHwAQMB8AEHBf8B4QGA + Ab8BgAEAAeABPwH/AcABAAEDAYABAAHgAQcB/wGAAgABgAEAAcABAQH/AwABgAEAAcABAQH+AwABgAEA + AcABAQH8AQEBAAEBAYABAAGAAQEB4AEDAQABDwGAAQABgAEBAYABBwIAAYABAAGAAQEBAAEPAYABAAGA + AQABgAEBAQABHwHgAQABgAEAAYABAwEAAT8B4AEBAYABAAGAAQMBAAE/AeABAQGAAQABgAEDAQABPwHA + AQEBgAEAAeABBwEAAX8BwAEBAYABAAH+AQcBwAF/AcABAQT/AcAB/wHAAQMCAAL/AgABwAEDAgAB4wH/ + BgABwwH/BgABwAEBBgABwAEBBgABwAEBBgABwAEBBgABwAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEB + AgAB4AEHAgABgAEBAgAB8AEPAgABgAH/AgAB8AEHAgABgAH/AgAB8AEHAgAC/wIAAfABBwH/AY8B8AE/ + Av8B4AEHAf8BhwGAAQEBgAEBAcABBwHwAYMCAAGAAQEB4AEHAeABAwIAAYABAQGAAQEBwAEBAgABgAEB + AwABAQIAAYABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQIAAcACAAEBAYABAQIA + AeACAAEBAYABAQEAAQEB4AIAAQcBgAEBAQABAQH/AcABAAF/AYABAQGAAQEB+AFPAeAFAAH4AQcB4AUA + AcABAwHABQABgAEDAcAHAAHABQABgAEAAYAHAAGABQABAQGABgABAQgAAQEOAAGAAQEGAAHAAQMGAAHA + AR8GAAHyAR8B4AEHBAAE/wIAAv8B4AEDAfABDwHgAQcBwAF/AeABAAHgAQcB4AEPAYABBwHgAQABwAED + AgABgAEAAcABAAGAAQECAAGAAQABgAcAAYAHAAGABwABgAYAAQEB4AYAAQEB4AYAAQEB4AYAAQMB4AUA + AYABAwHwAgABAQIAAcABBwH4AQABgAEDAgABwAEfAfwBAQHAAQcCAAHgAX8C/wHgAQ8CAAHgAf8B+AEf + BP8B+AE/AcgBEwH+AT8C/wHAAR8BnAE5AfwBHwGAAQcBAAEPAQQBIAH8AR8BgAEDAQABBwEEASAB+AE/ + AYABAQEAAQMBBAEgAeABQwGAAQECAAEEASABwAEDAYABAQGAAwABgAEDAYABAQHgAwABgAEHAYABAQHw + AQABBAEgAYABHwHAAQEB/AEAAQIBQAGAAQMB8AEBAf4BAQIAAYABAQHAAQEB/AEDAgABwAEBAcABAwH4 + AQMBgAEBAcABAwHgAQcB8AEHAcABAwHAA/8B4AEPAeABBwT/AeABDwH/AQMG/wHwAQEC/wH4AR8CAAHg + AwAB+AEBAgABgAMAAYADAAGAAQECAAGABwABgAcAAYAMAAEBAwABAQMAAQEDAAEBAwABAQMAAQMDAAEB + AwABAwMAAQMDAAEDAgABgAEDAgABwAEHAgABwAEHAv8B8AF/Av8B4AEfCP8BgAE/Av8BwAEHAecB/wEA + AR8B/AE/AcABAwHAAQEBAAEfAfgBHwHAAQMBwAEBAQABHwHwAQ8BgAEHAYABAQEAAR8B4AEPAYABBwGA + AQEBAAEfAcABAwGAAQcBgAEBAQABHwGAAQEBgAEHAYABAQEAAT8DAAEDAYABAQGAAX8DAAEBAYABAQGA + AQcEAAGAAQEBgAEBBAABgAEBAYAFAAGAAQMBgAUAAYABAwHAAQABgQEBAgAB/wHnAeEBAALDAQABHwP/ + AYEE/wEPAf8B8AEPAgAB4AEDAQcB/wHgAQcCAAHgAQMBAQH/AcABAwIAAeABAwEBAf8BgAEBAgAB/AE/ + AQABfwQAAeABHwGAAQ8CAAGAAQEB4AEHAcABBwIAAcABAQHgAQMB4AEDAgABwAEDAeABAwHwAQECAAHA + AQMB4AEDAfgDAAHgAQcB4AEDAfgDAAHgAQcB4AEDAfgDAAHwAQ8B4AEDAfgCAAEBAfgBHwHgAQMB/AEB + AYABAwH4AR8B4AEDAf4BAwHAAQcB+AEfAfABAwH/AQcB4AEPAfwBPwH8AQML diff -Nru keepass2-2.16+dfsg/KeePass/Forms/OptionsForm.cs keepass2-2.18+dfsg/KeePass/Forms/OptionsForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/OptionsForm.cs 2011-07-09 15:16:58.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/OptionsForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -48,10 +48,10 @@ private bool m_bBlockUIUpdate = false; private bool m_bLoadingSettings = false; - private CheckedLVItemDXList m_cdxSecurityOptions = new CheckedLVItemDXList(); - private CheckedLVItemDXList m_cdxPolicy = new CheckedLVItemDXList(); - private CheckedLVItemDXList m_cdxGuiOptions = new CheckedLVItemDXList(); - private CheckedLVItemDXList m_cdxAdvanced = new CheckedLVItemDXList(); + private CheckedLVItemDXList m_cdxSecurityOptions = null; + private CheckedLVItemDXList m_cdxPolicy = null; + private CheckedLVItemDXList m_cdxGuiOptions = null; + private CheckedLVItemDXList m_cdxAdvanced = null; private HotKeyControlEx m_hkGlobalAutoType = null; private HotKeyControlEx m_hkSelectedAutoType = null; @@ -102,6 +102,9 @@ private void OnFormLoad(object sender, EventArgs e) { + // Can be invoked by tray command; don't use CenterParent + Debug.Assert(this.StartPosition == FormStartPosition.CenterScreen); + GlobalWindowManager.AddWindow(this); this.Icon = Properties.Resources.KeePass; @@ -221,32 +224,34 @@ m_lvSecurityOptions.Groups.Add(lvg); Debug.Assert(lvg.ListView == m_lvSecurityOptions); + m_cdxSecurityOptions = new CheckedLVItemDXList(m_lvSecurityOptions); + m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking, - "LockOnWindowMinimize", m_lvSecurityOptions, lvg, KPRes.LockOnMinimize); + "LockOnWindowMinimize", lvg, KPRes.LockOnMinimize); m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking, - "LockOnSessionSwitch", m_lvSecurityOptions, lvg, KPRes.LockOnSessionSwitch); + "LockOnSessionSwitch", lvg, KPRes.LockOnSessionSwitch); m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking, - "LockOnSuspend", m_lvSecurityOptions, lvg, KPRes.LockOnSuspend); + "LockOnSuspend", lvg, KPRes.LockOnSuspend); m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking, - "LockOnRemoteControlChange", m_lvSecurityOptions, lvg, KPRes.LockOnRemoteControlChange); + "LockOnRemoteControlChange", lvg, KPRes.LockOnRemoteControlChange); m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking, - "ExitInsteadOfLockingAfterTime", m_lvSecurityOptions, lvg, KPRes.ExitInsteadOfLockingAfterTime); + "ExitInsteadOfLockingAfterTime", lvg, KPRes.ExitInsteadOfLockingAfterTime); m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking, - "AlwaysExitInsteadOfLocking", m_lvSecurityOptions, lvg, KPRes.ExitInsteadOfLockingAlways); + "AlwaysExitInsteadOfLocking", lvg, KPRes.ExitInsteadOfLockingAlways); m_cdxSecurityOptions.CreateItem(Program.Config.Security, "ClipboardClearOnExit", - m_lvSecurityOptions, lvg, KPRes.ClipboardClearOnExit); + lvg, KPRes.ClipboardClearOnExit); m_cdxSecurityOptions.CreateItem(Program.Config.Security, - "UseClipboardViewerIgnoreFormat", m_lvSecurityOptions, lvg, + "UseClipboardViewerIgnoreFormat", lvg, KPRes.ClipboardViewerIgnoreFormat + " " + KPRes.NotRecommended); if(NativeLib.IsLibraryInstalled()) m_cdxSecurityOptions.CreateItem(Program.Config.Native, "NativeKeyTransformations", - m_lvSecurityOptions, lvg, KPRes.NativeLibUse); + lvg, KPRes.NativeLibUse); m_cdxSecurityOptions.CreateItem(Program.Config.Security, "MasterKeyOnSecureDesktop", - m_lvSecurityOptions, lvg, KPRes.MasterKeyOnSecureDesktop); + lvg, KPRes.MasterKeyOnSecureDesktop); m_cdxSecurityOptions.CreateItem(Program.Config.Security, "ClearKeyCommandLineParams", - m_lvSecurityOptions, lvg, KPRes.ClearKeyCmdLineParams); + lvg, KPRes.ClearKeyCmdLineParams); m_cdxSecurityOptions.UpdateData(false); m_lvSecurityOptions.Columns[0].Width = m_lvSecurityOptions.ClientRectangle.Width - @@ -257,18 +262,22 @@ string strDisplayDesc) { ListViewItem lvi = m_cdxPolicy.CreateItem(Program.Config.Security.Policy, - strPropertyName, m_lvPolicy, null, strDisplayName + "*"); + strPropertyName, null, strDisplayName + "*"); lvi.SubItems.Add(strDisplayDesc); } private void LoadPolicyOptions() { + m_cdxPolicy = new CheckedLVItemDXList(m_lvPolicy); + LoadPolicyOption("Plugins", KPRes.Plugins, KPRes.PolicyPluginsDesc); LoadPolicyOption("Export", KPRes.Export, KPRes.PolicyExportDesc); LoadPolicyOption("ExportNoKey", KPRes.Export + " - " + KPRes.NoKeyRepeat, KPRes.PolicyExportNoKeyDesc); LoadPolicyOption("Import", KPRes.Import, KPRes.PolicyImportDesc); LoadPolicyOption("Print", KPRes.Print, KPRes.PolicyPrintDesc); + LoadPolicyOption("PrintNoKey", KPRes.Print + " - " + KPRes.NoKeyRepeat, + KPRes.PolicyPrintNoKeyDesc); LoadPolicyOption("NewFile", KPRes.NewDatabase, KPRes.PolicyNewDatabaseDesc); LoadPolicyOption("SaveFile", KPRes.SaveDatabase, KPRes.PolicySaveDatabaseDesc); LoadPolicyOption("AutoType", KPRes.AutoType, KPRes.PolicyAutoTypeDesc); @@ -296,57 +305,80 @@ m_lvGuiOptions.Groups.Add(lvg); Debug.Assert(lvg.ListView == m_lvGuiOptions); + m_cdxGuiOptions = new CheckedLVItemDXList(m_lvGuiOptions); + m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "CloseButtonMinimizesWindow", - m_lvGuiOptions, lvg, KPRes.CloseButtonMinimizes); + lvg, KPRes.CloseButtonMinimizes); m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeToTray", - m_lvGuiOptions, lvg, KPRes.MinimizeToTray); + lvg, KPRes.MinimizeToTray); m_cdxGuiOptions.CreateItem(Program.Config.UI.TrayIcon, "ShowOnlyIfTrayed", - m_lvGuiOptions, lvg, KPRes.ShowTrayOnlyIfTrayed); + lvg, KPRes.ShowTrayOnlyIfTrayed); m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "ShowFullPathInTitle", - m_lvGuiOptions, lvg, KPRes.ShowFullPathInTitleBar); + lvg, KPRes.ShowFullPathInTitleBar); m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "DropToBackAfterClipboardCopy", - m_lvGuiOptions, lvg, KPRes.DropToBackOnCopy); + lvg, KPRes.DropToBackOnCopy); m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeAfterClipboardCopy", - m_lvGuiOptions, lvg, KPRes.MinimizeAfterCopy); + lvg, KPRes.MinimizeAfterCopy); m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeAfterLocking", - m_lvGuiOptions, lvg, KPRes.MinimizeAfterLocking); + lvg, KPRes.MinimizeAfterLocking); m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "MinimizeAfterOpeningDatabase", - m_lvGuiOptions, lvg, KPRes.MinimizeAfterOpeningDatabase); - m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindSearchInPasswords", - m_lvGuiOptions, lvg, KPRes.QuickSearchInPasswords); - m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindExcludeExpired", - m_lvGuiOptions, lvg, KPRes.QuickSearchExcludeExpired); - m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusResultsAfterQuickFind", - m_lvGuiOptions, lvg, KPRes.FocusResultsAfterQuickFind); - m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusQuickFindOnUntray", - m_lvGuiOptions, lvg, KPRes.FocusQuickFindOnUntray); + lvg, KPRes.MinimizeAfterOpeningDatabase); m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "DisableSaveIfNotModified", - m_lvGuiOptions, lvg, KPRes.DisableSaveIfNotModified); + lvg, KPRes.DisableSaveIfNotModified); lvg = new ListViewGroup(KPRes.EntryList); m_lvGuiOptions.Groups.Add(lvg); // m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "ShowGridLines", // m_lvGuiOptions, lvg, KPRes.ShowGridLines); m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "EntryListAutoResizeColumns", - m_lvGuiOptions, lvg, KPRes.EntryListAutoResizeColumns); + lvg, KPRes.EntryListAutoResizeColumns); m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "EntryListAlternatingBgColors", - m_lvGuiOptions, lvg, KPRes.AlternatingBgColors); + lvg, KPRes.AlternatingBgColors); m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "CopyUrlsInsteadOfOpening", - m_lvGuiOptions, lvg, KPRes.CopyUrlsInsteadOfOpening); + lvg, KPRes.CopyUrlsInsteadOfOpening); - lvg = new ListViewGroup(KPRes.EntryView); + if(!Program.Config.MainWindow.EntryListShowDerefData) + { + Debug.Assert(!Program.Config.MainWindow.EntryListShowDerefDataAsync); + Program.Config.MainWindow.EntryListShowDerefDataAsync = false; + } + ListViewItem lviDeref = m_cdxGuiOptions.CreateItem( + Program.Config.MainWindow, "EntryListShowDerefData", + lvg, KPRes.ShowDerefData + " (" + KPRes.Slow + ")"); + ListViewItem lviDerefAsync = m_cdxGuiOptions.CreateItem( + Program.Config.MainWindow, "EntryListShowDerefDataAsync", + lvg, KPRes.ShowDerefDataAsync + " (" + KPRes.IncompatibleWithSorting + ")"); + m_cdxGuiOptions.AddLink(lviDeref, lviDerefAsync, CheckItemLinkType.UncheckedUnchecked); + m_cdxGuiOptions.AddLink(lviDerefAsync, lviDeref, CheckItemLinkType.CheckedChecked); + + // lvg = new ListViewGroup(KPRes.EntryView); + // m_lvGuiOptions.Groups.Add(lvg); + // m_cdxGuiOptions.CreateItem(Program.Config.MainWindow.EntryView, "HideProtectedCustomStrings", + // lvg, KPRes.EntryViewHideProtectedCustomStrings); + + lvg = new ListViewGroup(KPRes.QuickSearchTb); m_lvGuiOptions.Groups.Add(lvg); - m_cdxGuiOptions.CreateItem(Program.Config.MainWindow.EntryView, "HideProtectedCustomStrings", - m_lvGuiOptions, lvg, KPRes.EntryViewHideProtectedCustomStrings); + m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindSearchInPasswords", + lvg, KPRes.QuickSearchInPwFields); + m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindExcludeExpired", + lvg, KPRes.QuickSearchExclExpired); + m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "QuickFindDerefData", + lvg, KPRes.QuickSearchDerefData + " (" + KPRes.Slow + ")"); + m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusResultsAfterQuickFind", + lvg, KPRes.FocusResultsAfterQuickSearch); + m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusQuickFindOnRestore", + lvg, KPRes.FocusQuickFindOnRestore); + m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "FocusQuickFindOnUntray", + lvg, KPRes.FocusQuickFindOnUntray); lvg = new ListViewGroup(KPRes.Advanced); m_lvGuiOptions.Groups.Add(lvg); m_cdxGuiOptions.CreateItem(Program.Config.UI, "UseCustomToolStripRenderer", - m_lvGuiOptions, lvg, KPRes.UseCustomToolStripRenderer); + lvg, KPRes.UseCustomToolStripRenderer); m_cdxGuiOptions.CreateItem(Program.Config.UI, "ForceSystemFontUnix", - m_lvGuiOptions, lvg, KPRes.ForceSystemFontUnix); + lvg, KPRes.ForceSystemFontUnix); m_cdxGuiOptions.CreateItem(Program.Config.UI, "ShowDbMntncResultsDialog", - m_lvGuiOptions, lvg, KPRes.DbMntncResults); + lvg, KPRes.DbMntncResults); m_cdxGuiOptions.UpdateData(false); m_lvGuiOptions.Columns[0].Width = m_lvGuiOptions.ClientRectangle.Width - @@ -388,61 +420,79 @@ { m_lvAdvanced.Columns.Add(string.Empty, 200); // Resize below + m_cdxAdvanced = new CheckedLVItemDXList(m_lvAdvanced); + ListViewGroup lvg = new ListViewGroup(KPRes.StartAndExit); m_lvAdvanced.Groups.Add(lvg); m_cdxAdvanced.CreateItem(Program.Config.Application.Start, "OpenLastFile", - m_lvAdvanced, lvg, KPRes.AutoRememberOpenLastFile); + lvg, KPRes.AutoRememberOpenLastFile); m_cdxAdvanced.CreateItem(Program.Config.Integration, "LimitToSingleInstance", - m_lvAdvanced, lvg, KPRes.LimitSingleInstance); + lvg, KPRes.LimitSingleInstance); m_cdxAdvanced.CreateItem(Program.Config.Application.Start, "CheckForUpdate", - m_lvAdvanced, lvg, KPRes.CheckForUpdAtStart); + lvg, KPRes.CheckForUpdAtStart); m_cdxAdvanced.CreateItem(Program.Config.Application.Start, "MinimizedAndLocked", - m_lvAdvanced, lvg, KPRes.StartMinimizedAndLocked); + lvg, KPRes.StartMinimizedAndLocked); m_cdxAdvanced.CreateItem(Program.Config.Application.FileClosing, "AutoSave", - m_lvAdvanced, lvg, KPRes.AutoSaveAtExit); + lvg, KPRes.AutoSaveAtExit); lvg = new ListViewGroup(KPRes.AfterDatabaseOpen); m_lvAdvanced.Groups.Add(lvg); m_cdxAdvanced.CreateItem(Program.Config.Application.FileOpening, "ShowExpiredEntries", - m_lvAdvanced, lvg, KPRes.AutoShowExpiredEntries); + lvg, KPRes.AutoShowExpiredEntries); m_cdxAdvanced.CreateItem(Program.Config.Application.FileOpening, "ShowSoonToExpireEntries", - m_lvAdvanced, lvg, KPRes.AutoShowSoonToExpireEntries); + lvg, KPRes.AutoShowSoonToExpireEntries); lvg = new ListViewGroup(KPRes.AutoType); m_lvAdvanced.Groups.Add(lvg); m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeMatchByTitle", - m_lvAdvanced, lvg, KPRes.AutoTypeMatchByTitle); + lvg, KPRes.AutoTypeMatchByTitle); + m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeMatchByUrlInTitle", + lvg, KPRes.AutoTypeMatchByUrlInTitle); + m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeMatchByUrlHostInTitle", + lvg, KPRes.AutoTypeMatchByUrlHostInTitle); m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypePrependInitSequenceForIE", - m_lvAdvanced, lvg, KPRes.AutoTypePrependInitSeqForIE); + lvg, KPRes.AutoTypePrependInitSeqForIE); m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeReleaseAltWithKeyPress", - m_lvAdvanced, lvg, KPRes.AutoTypeReleaseAltWithKeyPress); + lvg, KPRes.AutoTypeReleaseAltWithKeyPress); + m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeAdjustKeyboardLayout", + lvg, KPRes.SameKeybLayout); m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeCancelOnWindowChange", - m_lvAdvanced, lvg, KPRes.AutoTypeCancelOnWindowChange); + lvg, KPRes.AutoTypeCancelOnWindowChange); lvg = new ListViewGroup(KPRes.Advanced); m_lvAdvanced.Groups.Add(lvg); - m_cdxAdvanced.CreateItem(Program.Config.Integration, "SearchKeyFiles", - m_lvAdvanced, lvg, KPRes.SearchKeyFiles); - m_cdxAdvanced.CreateItem(Program.Config.Integration, "SearchKeyFilesOnRemovableMedia", - m_lvAdvanced, lvg, KPRes.SearchKeyFilesAlsoOnRemovable); + + if(!Program.Config.Integration.SearchKeyFiles) + Program.Config.Integration.SearchKeyFilesOnRemovableMedia = false; + ListViewItem lviSearch = m_cdxAdvanced.CreateItem( + Program.Config.Integration, "SearchKeyFiles", + lvg, KPRes.SearchKeyFiles); + ListViewItem lviSearchRmv = m_cdxAdvanced.CreateItem( + Program.Config.Integration, "SearchKeyFilesOnRemovableMedia", + lvg, KPRes.SearchKeyFilesAlsoOnRemovable); + m_cdxAdvanced.AddLink(lviSearch, lviSearchRmv, CheckItemLinkType.UncheckedUnchecked); + m_cdxAdvanced.AddLink(lviSearchRmv, lviSearch, CheckItemLinkType.CheckedChecked); + m_cdxAdvanced.CreateItem(Program.Config.Defaults, "RememberKeySources", - m_lvAdvanced, lvg, KPRes.RememberKeySources); + lvg, KPRes.RememberKeySources); m_cdxAdvanced.CreateItem(Program.Config.UI.Hiding, "SeparateHidingSettings", - m_lvAdvanced, lvg, KPRes.RememberHidingSettings); + lvg, KPRes.RememberHidingSettings); m_cdxAdvanced.CreateItem(Program.Config.UI.Hiding, "UnhideButtonAlsoUnhidesSource", - m_lvAdvanced, lvg, KPRes.UnhideSourceCharactersToo); + lvg, KPRes.UnhideSourceCharactersToo); m_cdxAdvanced.CreateItem(Program.Config.Application, "VerifyWrittenFileAfterSaving", - m_lvAdvanced, lvg, KPRes.VerifyWrittenFileAfterSave); + lvg, KPRes.VerifyWrittenFileAfterSave); m_cdxAdvanced.CreateItem(Program.Config.Application, "UseTransactedFileWrites", - m_lvAdvanced, lvg, KPRes.UseTransactedDatabaseWrites); + lvg, KPRes.UseTransactedDatabaseWrites); + m_cdxAdvanced.CreateItem(Program.Config.Application, "UseFileLocks", + lvg, KPRes.UseFileLocks + " " + KPRes.NotRecommended); m_cdxAdvanced.CreateItem(Program.Config.Defaults, "TanExpiresOnUse", - m_lvAdvanced, lvg, KPRes.TanExpiresOnUse); + lvg, KPRes.TanExpiresOnUse); m_cdxAdvanced.CreateItem(Program.Config.Defaults, "RecycleBinCollapse", - m_lvAdvanced, lvg, KPRes.RecycleBinCollapse); + lvg, KPRes.RecycleBinCollapse); m_cdxAdvanced.CreateItem(Program.Config.UI, "SecureDesktopPlaySound", - m_lvAdvanced, lvg, KPRes.SecDeskPlaySound); + lvg, KPRes.SecDeskPlaySound); m_cdxAdvanced.CreateItem(Program.Config.UI, "OptimizeForScreenReader", - m_lvAdvanced, lvg, KPRes.OptimizeForScreenReader); + lvg, KPRes.OptimizeForScreenReader); m_cdxAdvanced.UpdateData(false); m_lvAdvanced.Columns[0].Width = m_lvAdvanced.ClientRectangle.Width - @@ -531,6 +581,11 @@ int nTab = m_tabMain.SelectedIndex; if((nTab >= 0) && (nTab < m_tabMain.TabPages.Count)) Program.Config.Defaults.OptionsTabIndex = (uint)nTab; + + m_cdxSecurityOptions.Release(); + m_cdxPolicy.Release(); + m_cdxGuiOptions.Release(); + m_cdxAdvanced.Release(); } private static void ChangeHotKey(ref Keys kPrevHK, HotKeyControlEx hkControl, diff -Nru keepass2-2.16+dfsg/KeePass/Forms/OptionsForm.Designer.cs keepass2-2.18+dfsg/KeePass/Forms/OptionsForm.Designer.cs --- keepass2-2.16+dfsg/KeePass/Forms/OptionsForm.Designer.cs 2011-06-02 11:27:32.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/OptionsForm.Designer.cs 2011-08-27 10:18:20.000000000 +0000 @@ -75,8 +75,8 @@ this.m_lblRestoreHotKey = new System.Windows.Forms.Label(); this.m_tbGlobalAutoType = new System.Windows.Forms.TextBox(); this.m_tabAdvanced = new System.Windows.Forms.TabPage(); - this.m_lvAdvanced = new KeePass.UI.CustomListViewEx(); this.m_btnProxy = new System.Windows.Forms.Button(); + this.m_lvAdvanced = new KeePass.UI.CustomListViewEx(); ((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).BeginInit(); this.m_tabMain.SuspendLayout(); this.m_tabSecurity.SuspendLayout(); @@ -612,6 +612,16 @@ this.m_tabAdvanced.Text = "Advanced"; this.m_tabAdvanced.UseVisualStyleBackColor = true; // + // m_btnProxy + // + this.m_btnProxy.Location = new System.Drawing.Point(472, 279); + this.m_btnProxy.Name = "m_btnProxy"; + this.m_btnProxy.Size = new System.Drawing.Size(75, 23); + this.m_btnProxy.TabIndex = 1; + this.m_btnProxy.Text = "Proxy..."; + this.m_btnProxy.UseVisualStyleBackColor = true; + this.m_btnProxy.Click += new System.EventHandler(this.OnBtnProxy); + // // m_lvAdvanced // this.m_lvAdvanced.CheckBoxes = true; @@ -625,16 +635,6 @@ this.m_lvAdvanced.UseCompatibleStateImageBehavior = false; this.m_lvAdvanced.View = System.Windows.Forms.View.Details; // - // m_btnProxy - // - this.m_btnProxy.Location = new System.Drawing.Point(472, 279); - this.m_btnProxy.Name = "m_btnProxy"; - this.m_btnProxy.Size = new System.Drawing.Size(75, 23); - this.m_btnProxy.TabIndex = 1; - this.m_btnProxy.Text = "Proxy..."; - this.m_btnProxy.UseVisualStyleBackColor = true; - this.m_btnProxy.Click += new System.EventHandler(this.OnBtnProxy); - // // OptionsForm // this.AcceptButton = this.m_btnOK; @@ -651,7 +651,7 @@ this.MinimizeBox = false; this.Name = "OptionsForm"; this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Options"; this.Load += new System.EventHandler(this.OnFormLoad); this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.OnFormClosed); diff -Nru keepass2-2.16+dfsg/KeePass/Forms/PluginsForm.cs keepass2-2.18+dfsg/KeePass/Forms/PluginsForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/PluginsForm.cs 2011-07-02 19:22:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/PluginsForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/PrintForm.cs keepass2-2.18+dfsg/KeePass/Forms/PrintForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/PrintForm.cs 2011-07-02 19:22:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/PrintForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -31,6 +31,7 @@ using KeePass.Resources; using KeePassLib; +using KeePassLib.Collections; using KeePassLib.Security; using KeePassLib.Delegates; using KeePassLib.Resources; @@ -147,7 +148,7 @@ if(m_bPrintMode) { - try { m_wbMain.Print(); } // Throws in Mono 1.2.6+ + try { m_wbMain.ShowPrintDialog(); } // Throws in Mono 1.2.6+ catch(NotImplementedException) { MessageService.ShowWarning(KLRes.FrameworkNotImplExcp); @@ -351,14 +352,17 @@ if(bAutoType) { - foreach(KeyValuePair kvp in pe.AutoType.WindowSequencePairs) - WriteDetailsLine(sb, KPRes.AutoType, kvp.Key + ": " + kvp.Value, bSmallMono, bMonoPasswords, strFontInit, strFontExit); + foreach(AutoTypeAssociation a in pe.AutoType.Associations) + WriteDetailsLine(sb, KPRes.AutoType, a.WindowName + + ": " + a.Sequence, bSmallMono, bMonoPasswords, + strFontInit, strFontExit); } foreach(KeyValuePair kvp in pe.Strings) { if(bCustomStrings && !PwDefs.IsStandardField(kvp.Key)) - WriteDetailsLine(sb, kvp, bSmallMono, bMonoPasswords, strFontInit, strFontExit); + WriteDetailsLine(sb, kvp, bSmallMono, bMonoPasswords, + strFontInit, strFontExit); } sb.AppendLine(@" "); diff -Nru keepass2-2.16+dfsg/KeePass/Forms/PrintForm.Designer.cs keepass2-2.18+dfsg/KeePass/Forms/PrintForm.Designer.cs --- keepass2-2.16+dfsg/KeePass/Forms/PrintForm.Designer.cs 2010-08-20 11:12:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/PrintForm.Designer.cs 2011-07-24 13:09:42.000000000 +0000 @@ -505,7 +505,7 @@ 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 = "&Print"; + this.m_btnOK.Text = "&Print..."; this.m_btnOK.UseVisualStyleBackColor = true; this.m_btnOK.Click += new System.EventHandler(this.OnBtnOK); // diff -Nru keepass2-2.16+dfsg/KeePass/Forms/PrintForm.resx keepass2-2.18+dfsg/KeePass/Forms/PrintForm.resx --- keepass2-2.16+dfsg/KeePass/Forms/PrintForm.resx 2010-08-20 11:12:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/PrintForm.resx 2011-07-24 13:09:42.000000000 +0000 @@ -124,42 +124,42 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAW + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAS CAAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABEAMAAQEBAAEgBgABEEIAAxIBGQNTAaoDVAGrAx0BKiwAAyMBMwFkAkIB7AFZAlYBvgMSARmwAAMU - ARsBYAJWAdYBGwGAAd8B/wEnAW4BsAH/A1QBqygAAyYBOQFiAkUB6QHyAucB/wHaAtAB/wFZAlYBwgMS - ARmoAAMSARkBXgJWAdUBFAF1Ae0B/wFIAdsC/wFPAbQB6gH/A1MBqiQAAycBOwFkAkoB5wHqAt8B/wHs - AuIB/wHmAtkB/wHcAtUB/wFbAlgBxJQAAwMBBAMBAQIIAAMQARYBXgJVAdgBFQF2AfEB/wFHAdUC/wFY - AccB8gH/AV0CUwHXAxUBHSAAAyQBNgFkAkIB7AHpAtwB/wH1Au0B/wHhAtgB/wHkAtkB/wH8AvcB/wFh - Aj4B7owAAzQEVAGvAVwCVwHRAV4CWAHOAVICUQGhAygBPAFWAlUBtgE/AY4B9AH/AUUB1AL/AVcByAHz - Af8BXgJWAdUDFAEbIAADJAE1AWQCQwHsAesC5AH/AfUC7QH/AeoC4gH/AfsC+AH/AfYC9AH/AWQCQwHs - AyYBOIQAAwwBEANVAbIBbwFFAUYB+gGoAaUBoAH/AbYBsAGpAf8BowGfAZgB/wGAAXcBdQH/AV8CMgHz - AWQBRQFZAfwBywH0AfUB/wFqAccB+AH/AV4CVQHYAxUBHSAAAyQBNgFfAkUB6AHrAuYF/wH4AvYB/wH6 - AvYB/wHyAu8B/wFkAkoB5wMnATuEAAMEAQYBWgJXAcUBtwGzAa8B/wH1AekB2AL/AfMB3wL/AfUB4gL/ - AfQB4AH/AecB3gHLAf8BqAGgAZcB/wGmAaQBmAH/AXMBUwFgAfwBVgJVAbQDDwEUGAADGgElAyoBQQM4 - AVwBZQJMAeUB7gLoDf8B8QLuAf8BYgJFAekDJgE5iAADSAGGAbUBsQGuAv8B8wHbAv8B8gHZAv8B8AHY - Av8B7wHYAv8B8AHZAv8B9wHgAf8B+gHsAdQB/wGkAZwBkAH/AVICLgH0AyUBNxQAAxYBHwNUAasBZAJK - AecBZQI9AfABagJBAfkB4ALWDf8B7wLrAf8BZAJDAewDIwEzjAABXwJRAeAB9AHlAdMC/wHtAc4C/wHo - AcwC/wHlAccC/wHlAccC/wHmAcgC/wHnAc0C/wH1AdsB/wHgAdABtwH/AWQBYgFfAf8DUQGgEAADFQEd - AVoCVgHTAccCuAH/AfEC5QH/AfkC8QH/AfsC9AH/AewC5QH/AewC5QX/AfIC7QH/AWMCRQHrAyUBN5AA - AYECRwH5Af8B6AHLAv8B3wG7Av8B2gGyAv8B1gGqAv8B1QGpAv8B1wGsAv8B2wG0Av8B6AHHAf8B/QHl - AcUB/wGKAoEB/wFcAlgBzwMDAQQMAANQAZoBvAKvAf8B6QLaAf8B6QLdAf8B9ALqAf8B8wLuAf8B9gL0 - Af8B7gLnAf8B5gLfAf8BXwJRAeADJwE7lAABfAFsAWoB/AH/AdwBtwL/Ac8BngL/Ac0BmQL/Ac0BmQL/ - Ac0BmgL/AcwBmQL/Ac0BmgL/AdcBqQL/Ad0BtAH/AZcBhwGBAf8BXAJXAdEDAwEEDAABYwI+Ae4B3ALJ - Af8B3QLNAf8BvQKvAf8BnwKVAf8B3wLUAf8B8wLvAf8B+wL2Af8BZQI5AfQDNAFUmAABawI7AfMB/wHX - AbIC/wHLAZQC/wHSAaQC/wHVAakC/wHWAasC/wHTAagC/wHPAZ8C/wHTAZ0B/wH3AccBmAH/AYICgQH/ - A1QBrxAAAW0COQH3Ae8C3AH/AcACsgH/A1UBtQFAAj8BbwGiApkB/wH0AusB/wH4AvEB/wFnAjwB8gMq - AUGYAAFaAlcBxQHtAdABvgL/AdEBogL/AeABuwL/AeIBwwL/AeEBwgL/AeABvwL/AeABugL/AdgBpAH/ - AdcBrAGJAf8BXwE0ATYB+wE1AjQBVRAAAWQCQwHsAcgCugH/AVUCUwGwAxYBHgNVAbIBwAK0Af8B6ALc - Af8B8ALnAf8BZAJGAesDHAEnmAADLQFFAXECOwH3AfkBzwG3Av8B1gG1Av8B6QHSAv8B8AHbAv8B6wHT - Af8B/gHbAbgB/wHrAboBlwH/AY8BggGBAf8BVgJVAbMUAANCAXQBUQJPAZwDHwEtA1UBsgHAArAB/wHe - AswB/wHoAtoB/wHOAsEB/wNTAaqgAAM/AW0BZAI2AfYB4gHAAbIB/wHyAcUBsAH/AfQByAG0Af8B7QG+ - AakB/wHVAawBmQH/AZIBhwGEAf8BWgJXAcUDDwEUHAABUQJPAZwBxQK3Af8B7wLdAf8B3gLLAf8BxAK3 - Af8BYAJXAdQDFQEdpAABLAIrAUMBWwJYAcQBZwI8AfIBigFZAVcB+wF4Aj4B+AFgAlIB3gNIAYQDBgEI - IAADQgF2AWQCSgHnAW0COQH3AWQCQwHsA04BmAMUARygAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB - AQABAQUAAYAXAAP/AQAB/wHwAf8B4QQAAf8B4AH/AcAEAAH/AcAB/wGABAAB+QGAAf8FAAHgAQEB/gUA - AYABAwH8AQEFAAEHAeABAwUAAQ8BgAEHBQABDwEAAQ8FAAEHAQABHwUAAQcBAAE/BQABDwEAAT8FAAEP - AQABPwUAAR8BAAF/BAABgAEfAcABfwQAAcABPwHAAf8EAAs= + AwABEAMAAQEBAAEgBgABEEIAAxIBGQNTAaoDVAGrAx0BKiwAAyMBMwFkAkYB7AFZAlYBvgMSARmwAAMU + ARsBYAJXAdYBGgGAAd8B/wEmAW0BsAH/A1QBqygAAyYBOQFiAkgB6QHyAucB/wHaAtAB/wFZAlcBwgMS + ARmoAAMSARkBXgJZAdUBEwF0Ae0B/wFHAdsC/wFOAbQB6gH/A1MBqiQAAycBOwFkAk0B5wHqAt8B/wHs + AuIB/wHmAtkB/wHcAtUB/wFbAlkBxJQAAwMBBAMBAQIIAAMQARYBXgJWAdgBFAF1AfEB/wFGAdUC/wFX + AccB8gH/AV0CVgHXAxUBHSAAAyQBNgFkAkYB7AHpAtwB/wH1Au0B/wHhAtgB/wHkAtkB/wH8AvcB/wFh + AkIB7owAAzQEVAGvAVwCWAHRAV4CWQHOAVICUQGhAygBPANWAbYBPgGOAfQB/wFEAdQC/wFWAcgB8wH/ + AV4CWQHVAxQBGyAAAyQBNQFkAkYB7AHrAuQB/wH1Au0B/wHqAuIB/wH7AvgB/wH2AvQB/wFkAkYB7AMm + ATiEAAMMARADVQGyAW4BRgFHAfoBqAGlAaAB/wG2AbABqQH/AaMBnwGYAf8BgAF2AXQB/wFfAjcB8wFj + AUMBWAH8AcsB9AH1Af8BaQHHAfgB/wFeAlYB2AMVAR0gAAMkATYBXwJKAegB6wLmBf8B+AL2Af8B+gL2 + Af8B8gLvAf8BZAJNAecDJwE7hAADBAEGAVoCVwHFAbcBswGvAf8B9QHpAdgC/wHzAd8C/wH1AeIC/wH0 + AeAB/wHnAd4BywH/AagBoAGXAf8BpgGkAZgB/wFyAVEBXwH8AVYCVQG0Aw8BFBgAAxoBJQMqAUEDOAFc + AWUCTwHlAe4C6A3/AfEC7gH/AWICSAHpAyYBOYgAA0gBhgG1AbEBrgL/AfMB2wL/AfIB2QL/AfAB2AL/ + Ae8B2AL/AfAB2QL/AfcB4AH/AfoB7AHUAf8BpAGcAZAB/wFSAjEB9AMlATcUAAMWAR8DVAGrAWQCTQHn + AWMCPwHwAWoCQQH5AeAC1g3/Ae8C6wH/AWQCRgHsAyMBM4wAAV8CVAHgAfQB5QHTAv8B7QHOAv8B6AHM + Av8B5QHHAv8B5QHHAv8B5gHIAv8B5wHNAv8B9QHbAf8B4AHQAbcB/wFjAWEBXgH/A1EBoBAAAxUBHQFa + AlcB0wHHArgB/wHxAuUB/wH5AvEB/wH7AvQB/wHsAuUB/wHsAuUF/wHyAu0B/wFiAkoB6wMlATeQAAGA + AkcB+QH/AegBywL/Ad8BuwL/AdoBsgL/AdYBqgL/AdUBqQL/AdcBrAL/AdsBtAL/AegBxwH/Af0B5QHF + Af8BigKBAf8BXAJZAc8DAwEEDAADUAGaAbwCrwH/AekC2gH/AekC3QH/AfQC6gH/AfMC7gH/AfYC9AH/ + Ae4C5wH/AeYC3wH/AV8CVAHgAycBO5QAAXsBawFpAfwB/wHcAbcC/wHPAZ4C/wHNAZkC/wHNAZkC/wHN + AZoC/wHMAZkC/wHNAZoC/wHXAakC/wHdAbQB/wGXAYcBgQH/AVwCWAHRAwMBBAwAAWECQgHuAdwCyQH/ + Ad0CzQH/Ab0CrwH/AZ8ClQH/Ad8C1AH/AfMC7wH/AfsC9gH/AWUCPQH0AzQBVJgAAWoCPQHzAf8B1wGy + Av8BywGUAv8B0gGkAv8B1QGpAv8B1gGrAv8B0wGoAv8BzwGfAv8B0wGdAf8B9wHHAZgB/wGCAoEB/wNU + Aa8QAAFtAjoB9wHvAtwB/wHAArIB/wNVAbUBQAI/AW8BogKZAf8B9ALrAf8B+ALxAf8BZwJAAfIDKgFB + mAABWgJXAcUB7QHQAb4C/wHRAaIC/wHgAbsC/wHiAcMC/wHhAcIC/wHgAb8C/wHgAboC/wHYAaQB/wHX + AawBiQH/AV8BMwE1AfsBNQI0AVUQAAFkAkYB7AHIAroB/wFVAlMBsAMWAR4DVQGyAcACtAH/AegC3AH/ + AfAC5wH/AWMCSwHrAxwBJ5gAAy0BRQFuAjwB9wH5Ac8BtwL/AdYBtQL/AekB0gL/AfAB2wL/AesB0wH/ + Af4B2wG4Af8B6wG6AZcB/wGPAYIBgQH/A1YBsxQAA0IBdAFRAk8BnAMfAS0DVQGyAcACsAH/Ad4CzAH/ + AegC2gH/Ac4CwQH/A1MBqqAAAz8BbQFiAjcB9gHiAcABsgH/AfIBxQGwAf8B9AHIAbQB/wHtAb4BqQH/ + AdUBrAGZAf8BkgGHAYQB/wFaAlcBxQMPARQcAAFRAk8BnAHFArcB/wHvAt0B/wHeAssB/wHEArcB/wFg + AlgB1AMVAR2kAAEsAisBQwFbAlkBxAFnAkAB8gGJAVkBVwH7AXcCPgH4AWACVAHeA0gBhAMGAQggAANC + AXYBZAJNAecBbQI6AfcBZAJGAewDTgGYAxQBHKAAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEB + BQABgBcAA/8BAAH/AfAB/wHhBAAB/wHgAf8BwAQAAf8BwAH/AYAEAAH5AYAB/wUAAeABAQH+BQABgAED + AfwBAQUAAQcB4AEDBQABDwGAAQcFAAEPAQABDwUAAQcBAAEfBQABBwEAAT8FAAEPAQABPwUAAQ8BAAE/ + BQABHwEAAX8EAAGAAR8BwAF/BAABwAE/AcAB/wQACw== \ No newline at end of file diff -Nru keepass2-2.16+dfsg/KeePass/Forms/ProxyForm.cs keepass2-2.18+dfsg/KeePass/Forms/ProxyForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/ProxyForm.cs 2011-06-15 15:27:32.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/ProxyForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/PwEntryForm.cs keepass2-2.18+dfsg/KeePass/Forms/PwEntryForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/PwEntryForm.cs 2011-07-02 19:22:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/PwEntryForm.cs 2012-01-03 15:53:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -29,8 +29,9 @@ using KeePass.App; using KeePass.App.Configuration; -using KeePass.UI; +using KeePass.Native; using KeePass.Resources; +using KeePass.UI; using KeePass.Util; using KeePassLib; @@ -45,9 +46,9 @@ public enum PwEditMode { Invalid = 0, - AddNewEntry = 1, - EditExistingEntry = 2, - ViewReadOnlyEntry = 3 + AddNewEntry, + EditExistingEntry, + ViewReadOnlyEntry } public partial class PwEntryForm : Form @@ -70,14 +71,13 @@ private PwUuid m_pwCustomIconID = PwUuid.Zero; private ImageList m_ilIcons = null; - private Color m_clrNormalBackColor = Color.White; - private bool m_bRepeatPasswordFailed = false; private bool m_bLockEnabledState = false; + private bool m_bTouchedOnce = false; private bool m_bInitializing = false; + private bool m_bForceClosing = false; - private SecureEdit m_secPassword = new SecureEdit(); - private SecureEdit m_secRepeat = new SecureEdit(); + private PwInputControlGroup m_icgPassword = new PwInputControlGroup(); private RichTextBoxContextMenu m_ctxNotes = new RichTextBoxContextMenu(); private readonly string DeriveFromPrevious = "(" + KPRes.GenPwBasedOnPrevious + ")"; @@ -89,6 +89,9 @@ public event EventHandler EntrySaving; public event EventHandler EntrySaved; + private const PwCompareOptions m_cmpOpt = (PwCompareOptions.NullEmptyEquivStd | + PwCompareOptions.IgnoreTimes); + public bool HasModifiedEntry { get @@ -99,8 +102,8 @@ return true; } - return !m_pwEntry.EqualsEntry(m_pwInitialEntry, false, true, true, - false, false); + return !m_pwEntry.EqualsEntry(m_pwInitialEntry, m_cmpOpt, + MemProtCmpMode.CustomOnly); } } @@ -197,8 +200,9 @@ } bool bHideInitial = m_cbHidePassword.Checked; - m_secPassword.Attach(m_tbPassword, ProcessTextChangedPassword, bHideInitial); - m_secRepeat.Attach(m_tbRepeatPassword, ProcessTextChangedRepeatPw, bHideInitial); + m_icgPassword.Attach(m_tbPassword, m_cbHidePassword, m_lblPasswordRepeat, + m_tbRepeatPassword, m_lblQuality, m_pbQuality, m_lblQualityBitsText, + this, bHideInitial, false); m_dtExpireDateTime.CustomFormat = DateTimeFormatInfo.CurrentInfo.ShortDatePattern + " " + DateTimeFormatInfo.CurrentInfo.LongTimePattern; @@ -220,8 +224,7 @@ m_tbRepeatPassword.ReadOnly = m_tbUrl.ReadOnly = m_rtNotes.ReadOnly = true; - m_btnIcon.Enabled = m_btnGenPw.Enabled = - m_tbRepeatPassword.Enabled = m_cbExpires.Enabled = + m_btnIcon.Enabled = m_btnGenPw.Enabled = m_cbExpires.Enabled = m_dtExpireDateTime.Enabled = m_btnStandardExpires.Enabled = false; @@ -276,7 +279,7 @@ m_vStrings.Set(PwDefs.UserNameField, new ProtectedString(m_pwDatabase.MemoryProtection.ProtectUserName, m_tbUserName.Text)); - byte[] pb = m_secPassword.ToUtf8(); + byte[] pb = m_icgPassword.GetPasswordUtf8(); m_vStrings.Set(PwDefs.PasswordField, new ProtectedString(m_pwDatabase.MemoryProtection.ProtectPassword, pb)); MemUtil.ZeroByteArray(pb); @@ -292,8 +295,7 @@ m_tbUserName.Text = m_vStrings.ReadSafe(PwDefs.UserNameField); byte[] pb = m_vStrings.GetSafe(PwDefs.PasswordField).ReadUtf8(); - m_secPassword.SetPassword(pb); - if(bSetRepeatPw) m_secRepeat.SetPassword(pb); + m_icgPassword.SetPassword(pb, bSetRepeatPw); MemUtil.ZeroByteArray(pb); m_tbUrl.Text = m_vStrings.ReadSafe(PwDefs.UrlField); @@ -310,7 +312,7 @@ ListViewItem lvi = m_lvStrings.Items.Add(kvpStr.Key, (int)pwIcon); - if(!kvpStr.Value.IsViewable) + if(kvpStr.Value.IsProtected) lvi.SubItems.Add(PwDefs.HiddenPassword); else { @@ -339,8 +341,8 @@ m_lvBinaries.Items.Clear(); foreach(KeyValuePair kvpBin in m_vBinaries) { - PwIcon pwIcon = (kvpBin.Value.IsProtected ? m_pwObjectProtected : - m_pwObjectPlainText); + PwIcon pwIcon = (kvpBin.Value.IsProtected ? + m_pwObjectProtected : m_pwObjectPlainText); m_lvBinaries.Items.Add(kvpBin.Key, (int)pwIcon); } UIUtil.SetTopVisibleItem(m_lvBinaries, iTopVisible); @@ -418,7 +420,7 @@ int nWidth = m_lvAutoType.ClientRectangle.Width / 2; m_lvAutoType.Columns.Add(KPRes.TargetWindow, nWidth); - m_lvAutoType.Columns.Add(KPRes.KeystrokeSequence, nWidth); + m_lvAutoType.Columns.Add(KPRes.Sequence, nWidth); UpdateAutoTypeList(); @@ -439,10 +441,10 @@ m_lvAutoType.Items.Clear(); string strDefault = "(" + KPRes.Default + ")"; - foreach(KeyValuePair kvp in m_atConfig.WindowSequencePairs) + foreach(AutoTypeAssociation a in m_atConfig.Associations) { - ListViewItem lvi = m_lvAutoType.Items.Add(kvp.Key, (int)PwIcon.List); - lvi.SubItems.Add((kvp.Value.Length > 0) ? kvp.Value : strDefault); + ListViewItem lvi = m_lvAutoType.Items.Add(a.WindowName, (int)PwIcon.List); + lvi.SubItems.Add((a.Sequence.Length > 0) ? a.Sequence : strDefault); } } @@ -515,6 +517,7 @@ GlobalWindowManager.CustomizeControl(m_ctxStrMoveToStandard); m_pwInitialEntry = m_pwEntry.CloneDeep(); + StrUtil.NormalizeNewLines(m_pwInitialEntry.Strings, true); m_ttRect.SetToolTip(m_btnIcon, KPRes.SelectIcon); m_ttRect.SetToolTip(m_cbHidePassword, KPRes.TogglePasswordAsterisks); @@ -523,12 +526,9 @@ m_ttBalloon.SetToolTip(m_tbRepeatPassword, KPRes.PasswordRepeatHint); - m_ttValidationError.ToolTipTitle = KPRes.ValidationFailed; - - m_clrNormalBackColor = m_tbPassword.BackColor; m_dynGenProfiles = new DynamicMenu(m_ctxPwGenProfiles.DropDownItems); m_dynGenProfiles.MenuClick += this.OnProfilesDynamicMenuClick; - m_ctxNotes.Attach(m_rtNotes); + m_ctxNotes.Attach(m_rtNotes, this); string strTitle = string.Empty, strDesc = string.Empty; if(m_pwEditMode == PwEditMode.AddNewEntry) @@ -584,8 +584,7 @@ UpdateEntryStrings(false, true); UpdateEntryBinaries(false, false); - if(PwDefs.IsTanEntry(m_pwEntry)) - m_btnTools.Enabled = false; + if(PwDefs.IsTanEntry(m_pwEntry)) m_btnTools.Enabled = false; CustomizeForScreenReader(); @@ -627,18 +626,6 @@ { if(m_bInitializing) return; - byte[] pb = m_secPassword.ToUtf8(); - uint uBits = QualityEstimation.EstimatePasswordBits(pb); - MemUtil.ZeroByteArray(pb); - m_lblQualityBitsText.Text = uBits.ToString() + " " + KPRes.Bits; - int iPos = (int)((100 * uBits) / (256 / 2)); - if(iPos < 0) iPos = 0; else if(iPos > 100) iPos = 100; - m_pbQuality.Value = iPos; - - bool bHidePassword = m_cbHidePassword.Checked; - m_secPassword.EnableProtection(bHidePassword); - m_secRepeat.EnableProtection(bHidePassword); - int nStringsSel = m_lvStrings.SelectedItems.Count; int nBinSel = m_lvBinaries.SelectedItems.Count; @@ -649,8 +636,10 @@ ProtectedBinary pbSel = m_vBinaries.Get(strBin); if(pbSel != null) { + byte[] pbBinData = pbSel.ReadData(); BinaryDataClass bdc = BinaryDataClassifier.Classify( - strBin, pbSel.ReadData()); + strBin, pbBinData); + MemUtil.ZeroByteArray(pbBinData); if(DataEditorForm.SupportsDataType(bdc) && (m_pwEditMode != PwEditMode.ViewReadOnlyEntry)) bBinEdit = true; @@ -703,10 +692,12 @@ (nStringsSel == 1); } - private bool SaveEntry() + private bool SaveEntry(PwEntry peTarget, bool bValidate) { if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return true; + if(bValidate && !m_icgPassword.ValidateData(true)) return false; + if(this.EntrySaving != null) { CancellableOperationEventArgs eaCancel = new CancellableOperationEventArgs(); @@ -714,33 +705,33 @@ if(eaCancel.Cancel) return false; } - m_pwEntry.History = m_vHistory; // Must be called before CreateBackup() + peTarget.History = m_vHistory; // Must be called before CreateBackup() bool bCreateBackup = (m_pwEditMode != PwEditMode.AddNewEntry); - if(bCreateBackup) m_pwEntry.CreateBackup(null); + if(bCreateBackup) peTarget.CreateBackup(null); - m_pwEntry.IconId = m_pwEntryIcon; - m_pwEntry.CustomIconUuid = m_pwCustomIconID; + peTarget.IconId = m_pwEntryIcon; + peTarget.CustomIconUuid = m_pwCustomIconID; if(m_cbCustomForegroundColor.Checked) - m_pwEntry.ForegroundColor = m_clrForeground; - else m_pwEntry.ForegroundColor = Color.Empty; + peTarget.ForegroundColor = m_clrForeground; + else peTarget.ForegroundColor = Color.Empty; if(m_cbCustomBackgroundColor.Checked) - m_pwEntry.BackgroundColor = m_clrBackground; - else m_pwEntry.BackgroundColor = Color.Empty; + peTarget.BackgroundColor = m_clrBackground; + else peTarget.BackgroundColor = Color.Empty; - m_pwEntry.OverrideUrl = m_tbOverrideUrl.Text; + peTarget.OverrideUrl = m_tbOverrideUrl.Text; List vNewTags = StrUtil.StringToTags(m_tbTags.Text); - m_pwEntry.Tags.Clear(); - foreach(string strTag in vNewTags) m_pwEntry.AddTag(strTag); + peTarget.Tags.Clear(); + foreach(string strTag in vNewTags) peTarget.AddTag(strTag); - m_pwEntry.Expires = m_cbExpires.Checked; - if(m_pwEntry.Expires) m_pwEntry.ExpiryTime = m_dtExpireDateTime.Value; + peTarget.Expires = m_cbExpires.Checked; + if(peTarget.Expires) peTarget.ExpiryTime = m_dtExpireDateTime.Value; UpdateEntryStrings(true, false); - m_pwEntry.Strings = m_vStrings; - m_pwEntry.Binaries = m_vBinaries; + peTarget.Strings = m_vStrings; + peTarget.Binaries = m_vBinaries; m_atConfig.Enabled = m_cbAutoTypeEnabled.Checked; m_atConfig.ObfuscationOptions = (m_cbAutoTypeObfuscation.Checked ? @@ -752,21 +743,26 @@ m_atConfig.DefaultSequence = m_tbDefaultAutoTypeSeq.Text; else { Debug.Assert(false); } - m_pwEntry.AutoType = m_atConfig; + peTarget.AutoType = m_atConfig; + + peTarget.Touch(true, false); // Touch *after* backup + if(object.ReferenceEquals(peTarget, m_pwEntry)) m_bTouchedOnce = true; + + StrUtil.NormalizeNewLines(peTarget.Strings, true); - m_pwEntry.Touch(true, false); // Touch *after* backup + PwCompareOptions cmpOpt = m_cmpOpt; + if(bCreateBackup) cmpOpt |= PwCompareOptions.IgnoreLastBackup; - if(m_pwEntry.EqualsEntry(m_pwInitialEntry, false, true, true, false, - bCreateBackup)) + if(peTarget.EqualsEntry(m_pwInitialEntry, cmpOpt, MemProtCmpMode.CustomOnly)) { - m_pwEntry.LastModificationTime = m_pwInitialEntry.LastModificationTime; + peTarget.LastModificationTime = m_pwInitialEntry.LastModificationTime; if(bCreateBackup) - m_pwEntry.History.Remove(m_pwEntry.History.GetAt( - m_pwEntry.History.UCount - 1)); // Undo backup + peTarget.History.Remove(peTarget.History.GetAt( + peTarget.History.UCount - 1)); // Undo backup } - m_pwEntry.MaintainBackups(m_pwDatabase); + peTarget.MaintainBackups(m_pwDatabase); if(this.EntrySaved != null) this.EntrySaved(this, EventArgs.Empty); @@ -775,26 +771,20 @@ private void OnBtnOK(object sender, EventArgs e) { - // Immediately close if we're just viewing an entry - if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return; - - if(m_secPassword.ContentsEqualTo(m_secRepeat) == false) - { - m_bRepeatPasswordFailed = true; - - m_tbRepeatPassword.BackColor = AppDefs.ColorEditError; - m_ttValidationError.Show(KPRes.PasswordRepeatFailed, m_tbRepeatPassword); - - this.DialogResult = DialogResult.None; - return; - } - - if(!SaveEntry()) this.DialogResult = DialogResult.None; + if(SaveEntry(m_pwEntry, true)) m_bForceClosing = true; + else this.DialogResult = DialogResult.None; } private void OnBtnCancel(object sender, EventArgs e) { - m_pwEntry.Touch(false); + m_bForceClosing = true; + + try + { + ushort usEsc = NativeMethods.GetAsyncKeyState((int)Keys.Escape); + if((usEsc & 0x8000) != 0) m_bForceClosing = false; + } + catch(Exception) { Debug.Assert(KeePassLib.Native.NativeLib.IsUnix()); } } private void CleanUpEx() @@ -805,44 +795,7 @@ Program.Config.UI.Hiding.HideInEntryWindow = m_cbHidePassword.Checked; m_ctxNotes.Detach(); - m_secPassword.Detach(); - m_secRepeat.Detach(); - } - - private void OnCheckedHidePassword(object sender, EventArgs e) - { - if(m_bInitializing) return; - - if(!m_cbHidePassword.Checked && !AppPolicy.Try(AppPolicyId.UnhidePasswords)) - { - m_cbHidePassword.Checked = true; - return; - } - - ProcessTextChangedRepeatPw(sender, e); // Clear red warning color - EnableControlsEx(); - } - - private void ProcessTextChangedPassword(object sender, EventArgs e) - { - if(m_bRepeatPasswordFailed) - { - m_tbPassword.BackColor = m_clrNormalBackColor; - m_tbRepeatPassword.BackColor = m_clrNormalBackColor; - m_bRepeatPasswordFailed = false; - } - - EnableControlsEx(); - } - - private void ProcessTextChangedRepeatPw(object sender, EventArgs e) - { - if(m_bRepeatPasswordFailed) - { - m_tbPassword.BackColor = m_clrNormalBackColor; - m_tbRepeatPassword.BackColor = m_clrNormalBackColor; - m_bRepeatPasswordFailed = false; - } + m_icgPassword.Release(); } private void OnBtnStrAdd(object sender, EventArgs e) @@ -923,7 +876,8 @@ MessageService.NewLine + KPRes.AttachNewRenameRemarks1 + MessageService.NewLine + KPRes.AttachNewRenameRemarks2; - DialogResult dr = MessageService.Ask(strMsg, null, MessageBoxButtons.YesNoCancel); + DialogResult dr = MessageService.Ask(strMsg, null, + MessageBoxButtons.YesNoCancel); if(dr == DialogResult.Cancel) continue; else if(dr == DialogResult.Yes) @@ -1034,11 +988,13 @@ ProtectedBinary pb = m_vBinaries.Get(lvi.Text); Debug.Assert(pb != null); if(pb == null) throw new ArgumentException(); - try { File.WriteAllBytes(strFileName, pb.ReadData()); } + byte[] pbData = pb.ReadData(); + try { File.WriteAllBytes(strFileName, pbData); } catch(Exception exWrite) { MessageService.ShowWarning(strFileName, exWrite); } + MemUtil.ZeroByteArray(pbData); } private void OnBtnAutoTypeAdd(object sender, EventArgs e) @@ -1046,7 +1002,7 @@ if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return; EditAutoTypeItemForm dlg = new EditAutoTypeItemForm(); - dlg.InitEx(m_atConfig, m_vStrings, null, false); + dlg.InitEx(m_atConfig, m_vStrings, -1, false); if(UIUtil.ShowDialogAndDestroy(dlg) == DialogResult.OK) { @@ -1061,11 +1017,10 @@ EditAutoTypeItemForm dlg = new EditAutoTypeItemForm(); - ListView.SelectedListViewItemCollection lvSel = m_lvAutoType.SelectedItems; + ListView.SelectedIndexCollection lvSel = m_lvAutoType.SelectedIndices; Debug.Assert(lvSel.Count == 1); if(lvSel.Count != 1) return; - string strOriginalName = lvSel[0].Text; - dlg.InitEx(m_atConfig, m_vStrings, strOriginalName, false); + dlg.InitEx(m_atConfig, m_vStrings, lvSel[0], false); if(UIUtil.ShowDialogAndDestroy(dlg) == DialogResult.OK) UpdateAutoTypeList(); @@ -1082,7 +1037,7 @@ j = nItemCount - i - 1; if(m_lvAutoType.Items[j].Selected) - m_atConfig.Remove(m_lvAutoType.Items[j].Text); + m_atConfig.RemoveAt(j); } UpdateAutoTypeList(); @@ -1135,6 +1090,7 @@ m_pwEntry.RestoreFromBackup((uint)lvsi[0], m_pwDatabase); m_pwEntry.Touch(true, false); + m_bTouchedOnce = true; this.DialogResult = DialogResult.OK; // Doesn't invoke OnBtnOK } @@ -1153,52 +1109,54 @@ EnableControlsEx(); } - private void SetExpireDays(int nDays) + private void SetExpireIn(int nYears, int nMonths, int nDays) { if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return; - m_cbExpires.Checked = true; + DateTime dt = DateTime.Now; + if(nYears != 0) dt = dt.AddYears(nYears); + if(nMonths != 0) dt = dt.AddMonths(nMonths); + if(nDays != 0) dt = dt.AddDays(nDays); - DateTime dtNow = DateTime.Now; - DateTime dtNew = dtNow.AddDays(nDays); - m_dtExpireDateTime.Value = m_dtExpireDateTime.Value = dtNew; + m_cbExpires.Checked = true; + m_dtExpireDateTime.Value = dt; EnableControlsEx(); } private void OnMenuExpireNow(object sender, EventArgs e) { - SetExpireDays(0); + SetExpireIn(0, 0, 0); } private void OnMenuExpire1Week(object sender, EventArgs e) { - SetExpireDays(7); + SetExpireIn(0, 0, 7); } private void OnMenuExpire2Weeks(object sender, EventArgs e) { - SetExpireDays(14); + SetExpireIn(0, 0, 14); } private void OnMenuExpire1Month(object sender, EventArgs e) { - SetExpireDays(30); + SetExpireIn(0, 1, 0); } private void OnMenuExpire3Months(object sender, EventArgs e) { - SetExpireDays(91); + SetExpireIn(0, 3, 0); } private void OnMenuExpire6Months(object sender, EventArgs e) { - SetExpireDays(182); + SetExpireIn(0, 6, 0); } private void OnMenuExpire1Year(object sender, EventArgs e) { - SetExpireDays(365); + SetExpireIn(1, 0, 0); } private void OnBtnStandardExpiresClick(object sender, EventArgs e) @@ -1272,7 +1230,7 @@ m_atConfig.DefaultSequence = m_tbDefaultAutoTypeSeq.Text; EditAutoTypeItemForm ef = new EditAutoTypeItemForm(); - ef.InitEx(m_atConfig, m_vStrings, "(" + KPRes.Default + ")", true); + ef.InitEx(m_atConfig, m_vStrings, -1, true); if(UIUtil.ShowDialogAndDestroy(ef) == DialogResult.OK) m_tbDefaultAutoTypeSeq.Text = m_atConfig.DefaultSequence; @@ -1325,15 +1283,15 @@ } else if(strStandardField == PwDefs.PasswordField) { - string strPw = StrUtil.Utf8.GetString(m_secPassword.ToUtf8()); - if((strPw.Length > 0) && (strText.Length > 0)) - strPw += ", "; - m_tbPassword.Text = (strPw + strText); - - string strRep = StrUtil.Utf8.GetString(m_secRepeat.ToUtf8()); - if((strRep.Length > 0) && (strText.Length > 0)) - strRep += ", "; - m_tbRepeatPassword.Text = (strRep + strText); + string strPw = m_icgPassword.GetPassword(); + if((strPw.Length > 0) && (strText.Length > 0)) strPw += ", "; + strPw += strText; + + string strRep = m_icgPassword.GetRepeat(); + if((strRep.Length > 0) && (strText.Length > 0)) strRep += ", "; + strRep += strText; + + m_icgPassword.SetPasswords(strPw, strRep); } else if(strStandardField == PwDefs.UrlField) { @@ -1390,7 +1348,7 @@ { PwGeneratorForm pgf = new PwGeneratorForm(); - byte[] pbCurPassword = m_secPassword.ToUtf8(); + byte[] pbCurPassword = m_icgPassword.GetPasswordUtf8(); bool bAtLeastOneChar = (pbCurPassword.Length > 0); ProtectedString ps = new ProtectedString(true, pbCurPassword); Array.Clear(pbCurPassword, 0, pbCurPassword.Length); @@ -1402,14 +1360,13 @@ if(pgf.ShowDialog() == DialogResult.OK) { byte[] pbEntropy = EntropyForm.CollectEntropyIfEnabled(pgf.SelectedProfile); - ProtectedString psNew = new ProtectedString(true); - PwGenerator.Generate(psNew, pgf.SelectedProfile, pbEntropy, + ProtectedString psNew; + PwGenerator.Generate(out psNew, pgf.SelectedProfile, pbEntropy, Program.PwGeneratorPool); byte[] pbNew = psNew.ReadUtf8(); - m_secPassword.SetPassword(pbNew); - m_secRepeat.SetPassword(pbNew); - Array.Clear(pbNew, 0, pbNew.Length); + m_icgPassword.SetPassword(pbNew, true); + MemUtil.ZeroByteArray(pbNew); } UIUtil.DestroyForm(pgf); @@ -1421,14 +1378,14 @@ PwProfile pwp = null; if(e.ItemName == DeriveFromPrevious) { - byte[] pbCur = m_secPassword.ToUtf8(); + byte[] pbCur = m_icgPassword.GetPasswordUtf8(); ProtectedString psCur = new ProtectedString(true, pbCur); - Array.Clear(pbCur, 0, pbCur.Length); + MemUtil.ZeroByteArray(pbCur); pwp = PwProfile.DeriveFromPassword(psCur); } else { - foreach(PwProfile pwgo in Program.Config.PasswordGenerator.UserProfiles) + foreach(PwProfile pwgo in PwGeneratorUtil.GetAllProfiles(false)) { if(pwgo.Name == e.ItemName) { @@ -1440,12 +1397,11 @@ if(pwp != null) { - ProtectedString psNew = new ProtectedString(true); - PwGenerator.Generate(psNew, pwp, null, Program.PwGeneratorPool); + ProtectedString psNew; + PwGenerator.Generate(out psNew, pwp, null, Program.PwGeneratorPool); byte[] pbNew = psNew.ReadUtf8(); - m_secPassword.SetPassword(pbNew); - m_secRepeat.SetPassword(pbNew); - Array.Clear(pbNew, 0, pbNew.Length); + m_icgPassword.SetPassword(pbNew, true); + MemUtil.ZeroByteArray(pbNew); } else { Debug.Assert(false); } } @@ -1455,11 +1411,8 @@ m_dynGenProfiles.Clear(); m_dynGenProfiles.AddItem(DeriveFromPrevious, Properties.Resources.B16x16_CompFile); - PwGeneratorUtil.AddStandardProfilesIfNoneAvailable(); - - if(Program.Config.PasswordGenerator.UserProfiles.Count > 0) - m_dynGenProfiles.AddSeparator(); - foreach(PwProfile pwgo in Program.Config.PasswordGenerator.UserProfiles) + m_dynGenProfiles.AddSeparator(); + foreach(PwProfile pwgo in PwGeneratorUtil.GetAllProfiles(true)) { if(pwgo.Name != DeriveFromPrevious) m_dynGenProfiles.AddItem(pwgo.Name, @@ -1630,11 +1583,9 @@ string strRef = CreateFieldReference(); if(strRef.Length == 0) return; - string strPw = StrUtil.Utf8.GetString(m_secPassword.ToUtf8()); - string strRep = StrUtil.Utf8.GetString(m_secRepeat.ToUtf8()); - - m_secPassword.SetPassword(StrUtil.Utf8.GetBytes(strPw + strRef)); - m_secRepeat.SetPassword(StrUtil.Utf8.GetBytes(strRep + strRef)); + string strPw = m_icgPassword.GetPassword(); + string strRep = m_icgPassword.GetRepeat(); + m_icgPassword.SetPasswords(strPw + strRef, strRep + strRef); } private void OnFieldRefInUrl(object sender, EventArgs e) @@ -1660,24 +1611,36 @@ private void OnFormClosing(object sender, FormClosingEventArgs e) { - /* VistaTaskDialog dlg = new VistaTaskDialog(this.Handle); - dlg.AddButton((int)DialogResult.Yes, KPRes.Yes, null); - dlg.AddButton((int)DialogResult.No, KPRes.No, null); - dlg.CommandLinks = false; - dlg.Content = KPRes.CloseDialogWarning; - dlg.MainInstruction = KPRes.CloseDialogConfirmation; - dlg.VerificationText = KPRes.DialogNoShowAgain; - dlg.WindowTitle = PwDefs.ShortProductName; - - if(dlg.ShowDialog()) + bool bCancel = false; + if(!m_bForceClosing && (m_pwEditMode != PwEditMode.ViewReadOnlyEntry)) { - if((dlg.Result == (int)DialogResult.No) || - (dlg.Result == (int)DialogResult.Cancel)) + PwEntry pe = m_pwInitialEntry.CloneDeep(); + SaveEntry(pe, false); + + bool bModified = !pe.EqualsEntry(m_pwInitialEntry, m_cmpOpt, + MemProtCmpMode.CustomOnly); + bModified |= !m_icgPassword.ValidateData(false); + + if(bModified) { - e.Cancel = true; - return; + DialogResult dr = MessageService.Ask(KPRes.SaveBeforeCloseQuestion, + PwDefs.ShortProductName, MessageBoxButtons.YesNoCancel); + if((dr == DialogResult.Yes) || (dr == DialogResult.OK)) + { + bCancel = !SaveEntry(m_pwEntry, true); + if(!bCancel) this.DialogResult = DialogResult.OK; + } + else if(dr == DialogResult.Cancel) bCancel = true; } - } */ + } + if(bCancel) + { + this.DialogResult = DialogResult.None; + e.Cancel = true; + return; + } + + if(!m_bTouchedOnce) m_pwEntry.Touch(false, false); CleanUpEx(); } diff -Nru keepass2-2.16+dfsg/KeePass/Forms/PwEntryForm.Designer.cs keepass2-2.18+dfsg/KeePass/Forms/PwEntryForm.Designer.cs --- keepass2-2.16+dfsg/KeePass/Forms/PwEntryForm.Designer.cs 2011-06-15 17:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/PwEntryForm.Designer.cs 2011-12-28 13:20:44.000000000 +0000 @@ -65,7 +65,6 @@ this.m_btnStandardExpires = new System.Windows.Forms.Button(); this.m_lblSeparator = new System.Windows.Forms.Label(); this.m_ttBalloon = new System.Windows.Forms.ToolTip(this.components); - this.m_ttValidationError = new System.Windows.Forms.ToolTip(this.components); this.m_tabMain = new System.Windows.Forms.TabControl(); this.m_tabEntry = new System.Windows.Forms.TabPage(); this.m_rtNotes = new KeePass.UI.CustomRichTextBoxEx(); @@ -304,69 +303,69 @@ this.m_menuExpireSep2, this.m_menuExpire1Year}); this.m_ctxDefaultTimes.Name = "m_ctxDefaultTimes"; - this.m_ctxDefaultTimes.Size = new System.Drawing.Size(119, 176); + this.m_ctxDefaultTimes.Size = new System.Drawing.Size(126, 176); // // m_menuExpireNow // this.m_menuExpireNow.Name = "m_menuExpireNow"; - this.m_menuExpireNow.Size = new System.Drawing.Size(118, 22); + this.m_menuExpireNow.Size = new System.Drawing.Size(125, 22); this.m_menuExpireNow.Text = "&Now"; this.m_menuExpireNow.Click += new System.EventHandler(this.OnMenuExpireNow); // // m_menuExpireSep0 // this.m_menuExpireSep0.Name = "m_menuExpireSep0"; - this.m_menuExpireSep0.Size = new System.Drawing.Size(115, 6); + this.m_menuExpireSep0.Size = new System.Drawing.Size(122, 6); // // m_menuExpire1Week // this.m_menuExpire1Week.Name = "m_menuExpire1Week"; - this.m_menuExpire1Week.Size = new System.Drawing.Size(118, 22); + this.m_menuExpire1Week.Size = new System.Drawing.Size(125, 22); this.m_menuExpire1Week.Text = "&1 Week"; this.m_menuExpire1Week.Click += new System.EventHandler(this.OnMenuExpire1Week); // // m_menuExpire2Weeks // this.m_menuExpire2Weeks.Name = "m_menuExpire2Weeks"; - this.m_menuExpire2Weeks.Size = new System.Drawing.Size(118, 22); + this.m_menuExpire2Weeks.Size = new System.Drawing.Size(125, 22); this.m_menuExpire2Weeks.Text = "&2 Weeks"; this.m_menuExpire2Weeks.Click += new System.EventHandler(this.OnMenuExpire2Weeks); // // m_menuExpireSep1 // this.m_menuExpireSep1.Name = "m_menuExpireSep1"; - this.m_menuExpireSep1.Size = new System.Drawing.Size(115, 6); + this.m_menuExpireSep1.Size = new System.Drawing.Size(122, 6); // // m_menuExpire1Month // this.m_menuExpire1Month.Name = "m_menuExpire1Month"; - this.m_menuExpire1Month.Size = new System.Drawing.Size(118, 22); + this.m_menuExpire1Month.Size = new System.Drawing.Size(125, 22); this.m_menuExpire1Month.Text = "1 &Month"; this.m_menuExpire1Month.Click += new System.EventHandler(this.OnMenuExpire1Month); // // m_menuExpire3Months // this.m_menuExpire3Months.Name = "m_menuExpire3Months"; - this.m_menuExpire3Months.Size = new System.Drawing.Size(118, 22); + this.m_menuExpire3Months.Size = new System.Drawing.Size(125, 22); this.m_menuExpire3Months.Text = "&3 Months"; this.m_menuExpire3Months.Click += new System.EventHandler(this.OnMenuExpire3Months); // // m_menuExpire6Months // this.m_menuExpire6Months.Name = "m_menuExpire6Months"; - this.m_menuExpire6Months.Size = new System.Drawing.Size(118, 22); + this.m_menuExpire6Months.Size = new System.Drawing.Size(125, 22); this.m_menuExpire6Months.Text = "&6 Months"; this.m_menuExpire6Months.Click += new System.EventHandler(this.OnMenuExpire6Months); // // m_menuExpireSep2 // this.m_menuExpireSep2.Name = "m_menuExpireSep2"; - this.m_menuExpireSep2.Size = new System.Drawing.Size(115, 6); + this.m_menuExpireSep2.Size = new System.Drawing.Size(122, 6); // // m_menuExpire1Year // this.m_menuExpire1Year.Name = "m_menuExpire1Year"; - this.m_menuExpire1Year.Size = new System.Drawing.Size(118, 22); + this.m_menuExpire1Year.Size = new System.Drawing.Size(125, 22); this.m_menuExpire1Year.Text = "1 &Year"; this.m_menuExpire1Year.Click += new System.EventHandler(this.OnMenuExpire1Year); // @@ -428,7 +427,6 @@ this.m_cbHidePassword.TabIndex = 8; this.m_cbHidePassword.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.m_cbHidePassword.UseVisualStyleBackColor = true; - this.m_cbHidePassword.CheckedChanged += new System.EventHandler(this.OnCheckedHidePassword); // // m_btnStandardExpires // @@ -455,13 +453,6 @@ this.m_ttBalloon.IsBalloon = true; this.m_ttBalloon.ReshowDelay = 100; // - // m_ttValidationError - // - this.m_ttValidationError.AutoPopDelay = 32000; - this.m_ttValidationError.InitialDelay = 250; - this.m_ttValidationError.ReshowDelay = 100; - this.m_ttValidationError.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Warning; - // // m_tabMain // this.m_tabMain.Controls.Add(this.m_tabEntry); @@ -684,13 +675,13 @@ this.m_ctxListOperations.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.m_menuListCtxCopyFieldValue}); this.m_ctxListOperations.Name = "m_ctxListOperations"; - this.m_ctxListOperations.Size = new System.Drawing.Size(213, 26); + this.m_ctxListOperations.Size = new System.Drawing.Size(235, 26); // // m_menuListCtxCopyFieldValue // this.m_menuListCtxCopyFieldValue.Image = global::KeePass.Properties.Resources.B16x16_EditCopy; this.m_menuListCtxCopyFieldValue.Name = "m_menuListCtxCopyFieldValue"; - this.m_menuListCtxCopyFieldValue.Size = new System.Drawing.Size(212, 22); + this.m_menuListCtxCopyFieldValue.Size = new System.Drawing.Size(234, 22); this.m_menuListCtxCopyFieldValue.Text = "&Copy Field Value to Clipboard"; this.m_menuListCtxCopyFieldValue.Click += new System.EventHandler(this.OnCtxCopyFieldValue); // @@ -1039,40 +1030,40 @@ this.m_menuListCtxMoveStandardURL, this.m_menuListCtxMoveStandardNotes}); this.m_ctxStrMoveToStandard.Name = "m_ctxStrMoveToStandard"; - this.m_ctxStrMoveToStandard.Size = new System.Drawing.Size(144, 114); + this.m_ctxStrMoveToStandard.Size = new System.Drawing.Size(155, 114); // // m_menuListCtxMoveStandardTitle // this.m_menuListCtxMoveStandardTitle.Name = "m_menuListCtxMoveStandardTitle"; - this.m_menuListCtxMoveStandardTitle.Size = new System.Drawing.Size(143, 22); + this.m_menuListCtxMoveStandardTitle.Size = new System.Drawing.Size(154, 22); this.m_menuListCtxMoveStandardTitle.Text = "To &Title"; this.m_menuListCtxMoveStandardTitle.Click += new System.EventHandler(this.OnCtxMoveToTitle); // // m_menuListCtxMoveStandardUser // this.m_menuListCtxMoveStandardUser.Name = "m_menuListCtxMoveStandardUser"; - this.m_menuListCtxMoveStandardUser.Size = new System.Drawing.Size(143, 22); + this.m_menuListCtxMoveStandardUser.Size = new System.Drawing.Size(154, 22); this.m_menuListCtxMoveStandardUser.Text = "To User &Name"; this.m_menuListCtxMoveStandardUser.Click += new System.EventHandler(this.OnCtxMoveToUserName); // // m_menuListCtxMoveStandardPassword // this.m_menuListCtxMoveStandardPassword.Name = "m_menuListCtxMoveStandardPassword"; - this.m_menuListCtxMoveStandardPassword.Size = new System.Drawing.Size(143, 22); + this.m_menuListCtxMoveStandardPassword.Size = new System.Drawing.Size(154, 22); this.m_menuListCtxMoveStandardPassword.Text = "To &Password"; this.m_menuListCtxMoveStandardPassword.Click += new System.EventHandler(this.OnCtxMoveToPassword); // // m_menuListCtxMoveStandardURL // this.m_menuListCtxMoveStandardURL.Name = "m_menuListCtxMoveStandardURL"; - this.m_menuListCtxMoveStandardURL.Size = new System.Drawing.Size(143, 22); + this.m_menuListCtxMoveStandardURL.Size = new System.Drawing.Size(154, 22); this.m_menuListCtxMoveStandardURL.Text = "To &URL"; this.m_menuListCtxMoveStandardURL.Click += new System.EventHandler(this.OnCtxMoveToURL); // // m_menuListCtxMoveStandardNotes // this.m_menuListCtxMoveStandardNotes.Name = "m_menuListCtxMoveStandardNotes"; - this.m_menuListCtxMoveStandardNotes.Size = new System.Drawing.Size(143, 22); + this.m_menuListCtxMoveStandardNotes.Size = new System.Drawing.Size(154, 22); this.m_menuListCtxMoveStandardNotes.Text = "To No&tes"; this.m_menuListCtxMoveStandardNotes.Click += new System.EventHandler(this.OnCtxMoveToNotes); // @@ -1083,25 +1074,25 @@ this.m_ctxPwGenSep0, this.m_ctxPwGenProfiles}); this.m_ctxPwGen.Name = "m_ctxPwGen"; - this.m_ctxPwGen.Size = new System.Drawing.Size(209, 54); + this.m_ctxPwGen.Size = new System.Drawing.Size(229, 54); // // m_ctxPwGenOpen // this.m_ctxPwGenOpen.Image = global::KeePass.Properties.Resources.B16x16_KGPG_Gen; this.m_ctxPwGenOpen.Name = "m_ctxPwGenOpen"; - this.m_ctxPwGenOpen.Size = new System.Drawing.Size(208, 22); + this.m_ctxPwGenOpen.Size = new System.Drawing.Size(228, 22); this.m_ctxPwGenOpen.Text = "&Open Password Generator..."; this.m_ctxPwGenOpen.Click += new System.EventHandler(this.OnPwGenOpen); // // m_ctxPwGenSep0 // this.m_ctxPwGenSep0.Name = "m_ctxPwGenSep0"; - this.m_ctxPwGenSep0.Size = new System.Drawing.Size(205, 6); + this.m_ctxPwGenSep0.Size = new System.Drawing.Size(225, 6); // // m_ctxPwGenProfiles // this.m_ctxPwGenProfiles.Name = "m_ctxPwGenProfiles"; - this.m_ctxPwGenProfiles.Size = new System.Drawing.Size(208, 22); + this.m_ctxPwGenProfiles.Size = new System.Drawing.Size(228, 22); this.m_ctxPwGenProfiles.Text = "Generate Using Profile"; // // m_ctxTools @@ -1115,26 +1106,26 @@ this.m_ctxToolsSep1, this.m_ctxToolsFieldRefs}); this.m_ctxTools.Name = "m_ctxTools"; - this.m_ctxTools.Size = new System.Drawing.Size(222, 126); + this.m_ctxTools.Size = new System.Drawing.Size(242, 126); // // m_ctxToolsHelp // this.m_ctxToolsHelp.Image = global::KeePass.Properties.Resources.B16x16_Help; this.m_ctxToolsHelp.Name = "m_ctxToolsHelp"; - this.m_ctxToolsHelp.Size = new System.Drawing.Size(221, 22); + this.m_ctxToolsHelp.Size = new System.Drawing.Size(241, 22); this.m_ctxToolsHelp.Text = "&Help"; this.m_ctxToolsHelp.Click += new System.EventHandler(this.OnCtxToolsHelp); // // m_ctxToolsSep0 // this.m_ctxToolsSep0.Name = "m_ctxToolsSep0"; - this.m_ctxToolsSep0.Size = new System.Drawing.Size(218, 6); + this.m_ctxToolsSep0.Size = new System.Drawing.Size(238, 6); // // m_ctxToolsUrlHelp // this.m_ctxToolsUrlHelp.Image = global::KeePass.Properties.Resources.B16x16_Help; this.m_ctxToolsUrlHelp.Name = "m_ctxToolsUrlHelp"; - this.m_ctxToolsUrlHelp.Size = new System.Drawing.Size(221, 22); + this.m_ctxToolsUrlHelp.Size = new System.Drawing.Size(241, 22); this.m_ctxToolsUrlHelp.Text = "&URL Field: Help"; this.m_ctxToolsUrlHelp.Click += new System.EventHandler(this.OnCtxUrlHelp); // @@ -1142,7 +1133,7 @@ // this.m_ctxToolsUrlSelApp.Image = global::KeePass.Properties.Resources.B16x16_View_Detailed; this.m_ctxToolsUrlSelApp.Name = "m_ctxToolsUrlSelApp"; - this.m_ctxToolsUrlSelApp.Size = new System.Drawing.Size(221, 22); + this.m_ctxToolsUrlSelApp.Size = new System.Drawing.Size(241, 22); this.m_ctxToolsUrlSelApp.Text = "URL Field: Select &Application..."; this.m_ctxToolsUrlSelApp.Click += new System.EventHandler(this.OnCtxUrlSelApp); // @@ -1150,14 +1141,14 @@ // this.m_ctxToolsUrlSelDoc.Image = global::KeePass.Properties.Resources.B16x16_CompFile; this.m_ctxToolsUrlSelDoc.Name = "m_ctxToolsUrlSelDoc"; - this.m_ctxToolsUrlSelDoc.Size = new System.Drawing.Size(221, 22); + this.m_ctxToolsUrlSelDoc.Size = new System.Drawing.Size(241, 22); this.m_ctxToolsUrlSelDoc.Text = "URL Field: Select &Document..."; this.m_ctxToolsUrlSelDoc.Click += new System.EventHandler(this.OnCtxUrlSelDoc); // // m_ctxToolsSep1 // this.m_ctxToolsSep1.Name = "m_ctxToolsSep1"; - this.m_ctxToolsSep1.Size = new System.Drawing.Size(218, 6); + this.m_ctxToolsSep1.Size = new System.Drawing.Size(238, 6); // // m_ctxToolsFieldRefs // @@ -1168,41 +1159,41 @@ this.m_ctxToolsFieldRefsInUrl, this.m_ctxToolsFieldRefsInNotes}); this.m_ctxToolsFieldRefs.Name = "m_ctxToolsFieldRefs"; - this.m_ctxToolsFieldRefs.Size = new System.Drawing.Size(221, 22); + this.m_ctxToolsFieldRefs.Size = new System.Drawing.Size(241, 22); this.m_ctxToolsFieldRefs.Text = "Insert Field &Reference"; // // m_ctxToolsFieldRefsInTitle // this.m_ctxToolsFieldRefsInTitle.Name = "m_ctxToolsFieldRefsInTitle"; - this.m_ctxToolsFieldRefsInTitle.Size = new System.Drawing.Size(164, 22); + this.m_ctxToolsFieldRefsInTitle.Size = new System.Drawing.Size(180, 22); this.m_ctxToolsFieldRefsInTitle.Text = "In &Title Field"; this.m_ctxToolsFieldRefsInTitle.Click += new System.EventHandler(this.OnFieldRefInTitle); // // m_ctxToolsFieldRefsInUserName // this.m_ctxToolsFieldRefsInUserName.Name = "m_ctxToolsFieldRefsInUserName"; - this.m_ctxToolsFieldRefsInUserName.Size = new System.Drawing.Size(164, 22); + this.m_ctxToolsFieldRefsInUserName.Size = new System.Drawing.Size(180, 22); this.m_ctxToolsFieldRefsInUserName.Text = "In User &Name Field"; this.m_ctxToolsFieldRefsInUserName.Click += new System.EventHandler(this.OnFieldRefInUserName); // // m_ctxToolsFieldRefsInPassword // this.m_ctxToolsFieldRefsInPassword.Name = "m_ctxToolsFieldRefsInPassword"; - this.m_ctxToolsFieldRefsInPassword.Size = new System.Drawing.Size(164, 22); + this.m_ctxToolsFieldRefsInPassword.Size = new System.Drawing.Size(180, 22); this.m_ctxToolsFieldRefsInPassword.Text = "In &Password Field"; this.m_ctxToolsFieldRefsInPassword.Click += new System.EventHandler(this.OnFieldRefInPassword); // // m_ctxToolsFieldRefsInUrl // this.m_ctxToolsFieldRefsInUrl.Name = "m_ctxToolsFieldRefsInUrl"; - this.m_ctxToolsFieldRefsInUrl.Size = new System.Drawing.Size(164, 22); + this.m_ctxToolsFieldRefsInUrl.Size = new System.Drawing.Size(180, 22); this.m_ctxToolsFieldRefsInUrl.Text = "In &URL Field"; this.m_ctxToolsFieldRefsInUrl.Click += new System.EventHandler(this.OnFieldRefInUrl); // // m_ctxToolsFieldRefsInNotes // this.m_ctxToolsFieldRefsInNotes.Name = "m_ctxToolsFieldRefsInNotes"; - this.m_ctxToolsFieldRefsInNotes.Size = new System.Drawing.Size(164, 22); + this.m_ctxToolsFieldRefsInNotes.Size = new System.Drawing.Size(180, 22); this.m_ctxToolsFieldRefsInNotes.Text = "In N&otes Field"; this.m_ctxToolsFieldRefsInNotes.Click += new System.EventHandler(this.OnFieldRefInNotes); // @@ -1280,7 +1271,6 @@ private System.Windows.Forms.ToolTip m_ttRect; private System.Windows.Forms.Label m_lblSeparator; private System.Windows.Forms.ToolTip m_ttBalloon; - private System.Windows.Forms.ToolTip m_ttValidationError; private System.Windows.Forms.TabControl m_tabMain; private System.Windows.Forms.TabPage m_tabEntry; private System.Windows.Forms.TabPage m_tabAdvanced; diff -Nru keepass2-2.16+dfsg/KeePass/Forms/PwEntryForm.resx keepass2-2.18+dfsg/KeePass/Forms/PwEntryForm.resx --- keepass2-2.16+dfsg/KeePass/Forms/PwEntryForm.resx 2011-06-15 17:17:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/PwEntryForm.resx 2011-12-28 13:20:44.000000000 +0000 @@ -126,9 +126,6 @@ 113, 17 - - 224, 17 - 642, 17 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/PwGeneratorForm.cs keepass2-2.18+dfsg/KeePass/Forms/PwGeneratorForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/PwGeneratorForm.cs 2011-07-02 19:25:34.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/PwGeneratorForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -100,6 +100,7 @@ FontUtil.AssignDefaultBold(m_rbStandardCharSet); FontUtil.AssignDefaultBold(m_rbPattern); FontUtil.AssignDefaultBold(m_rbCustom); + FontUtil.AssignDefaultMono(m_tbPreview, true); m_ttMain.SetToolTip(m_btnProfileAdd, KPRes.GenProfileSaveDesc); m_ttMain.SetToolTip(m_btnProfileRemove, KPRes.GenProfileRemoveDesc); @@ -165,9 +166,7 @@ m_cmbProfiles.SelectedIndex = ((m_optInitial == null) ? 0 : 1); - PwGeneratorUtil.AddStandardProfilesIfNoneAvailable(); - - foreach(PwProfile ppw in Program.Config.PasswordGenerator.UserProfiles) + foreach(PwProfile ppw in PwGeneratorUtil.GetAllProfiles(true)) { m_cmbProfiles.Items.Add(ppw.Name); @@ -234,8 +233,8 @@ string strProfile = m_cmbProfiles.Text; m_btnProfileRemove.Enabled = ((strProfile != CustomMeta) && - (strProfile != DeriveFromPrevious) && - (strProfile != AutoGeneratedMeta)); + (strProfile != DeriveFromPrevious) && (strProfile != AutoGeneratedMeta) && + !PwGeneratorUtil.IsBuiltInProfile(strProfile)); m_tabAdvanced.Text = ((m_cbExcludeLookAlike.Checked || m_cbNoRepeat.Checked || (m_tbExcludeChars.Text.Length > 0)) ? @@ -372,7 +371,7 @@ SetGenerationOptions(Program.Config.PasswordGenerator.AutoGeneratedPasswordsProfile); else { - foreach(PwProfile pwgo in Program.Config.PasswordGenerator.UserProfiles) + foreach(PwProfile pwgo in PwGeneratorUtil.GetAllProfiles(false)) { if(pwgo.Name == strProfile) { @@ -405,7 +404,7 @@ pwCurrent.Name = strProfile; if(strProfile.Equals(CustomMeta) || strProfile.Equals(DeriveFromPrevious) || - (strProfile.Length == 0)) + (strProfile.Length == 0) || PwGeneratorUtil.IsBuiltInProfile(strProfile)) { MessageService.ShowWarning(KPRes.FieldNameInvalid); } @@ -417,22 +416,53 @@ } else { + List lUser = Program.Config.PasswordGenerator.UserProfiles; + bool bExists = false; - for(int i = 0; i < Program.Config.PasswordGenerator.UserProfiles.Count; ++i) + for(int i = 0; i < lUser.Count; ++i) { - if(Program.Config.PasswordGenerator.UserProfiles[i].Name == strProfile) + if(lUser[i].Name.Equals(strProfile, StrUtil.CaseIgnoreCmp)) { - Program.Config.PasswordGenerator.UserProfiles[i] = pwCurrent; - m_cmbProfiles.SelectedIndex = m_cmbProfiles.FindString(strProfile); - bExists = true; + lUser[i] = pwCurrent; + + for(int j = 0; j < m_cmbProfiles.Items.Count; ++j) + { + if(m_cmbProfiles.Items[j].ToString().Equals(strProfile, + StrUtil.CaseIgnoreCmp)) + { + m_bBlockUIUpdate = true; + m_cmbProfiles.Items[j] = strProfile; // Fix case + m_bBlockUIUpdate = false; + m_cmbProfiles.SelectedIndex = j; + bExists = true; + break; + } + } + + break; } } - if(bExists == false) + if(!bExists) { - Program.Config.PasswordGenerator.UserProfiles.Add(pwCurrent); - m_cmbProfiles.Items.Add(strProfile); - m_cmbProfiles.SelectedIndex = m_cmbProfiles.Items.Count - 1; + m_bBlockUIUpdate = true; + + List lAll = PwGeneratorUtil.GetAllProfiles(false); + for(int c = 0; c < lAll.Count; ++c) + m_cmbProfiles.Items.RemoveAt(m_cmbProfiles.Items.Count - 1); + + lUser.Add(pwCurrent); + + int iNewSel = 0; + foreach(PwProfile pwAdd in PwGeneratorUtil.GetAllProfiles(true)) + { + m_cmbProfiles.Items.Add(pwAdd.Name); + if(pwAdd.Name == strProfile) + iNewSel = m_cmbProfiles.Items.Count - 1; + } + + m_bBlockUIUpdate = false; + m_cmbProfiles.SelectedIndex = iNewSel; } } } @@ -446,7 +476,7 @@ string strProfile = m_cmbProfiles.Text; if((strProfile == CustomMeta) || (strProfile == DeriveFromPrevious) || - (strProfile == AutoGeneratedMeta)) + (strProfile == AutoGeneratedMeta) || PwGeneratorUtil.IsBuiltInProfile(strProfile)) return; m_cmbProfiles.SelectedIndex = 0; @@ -456,12 +486,12 @@ { m_cmbProfiles.Items.RemoveAt(i); - List lProfiles = Program.Config.PasswordGenerator.UserProfiles; - for(int j = 0; j < lProfiles.Count; ++j) + List lUser = Program.Config.PasswordGenerator.UserProfiles; + for(int j = 0; j < lUser.Count; ++j) { - if(lProfiles[j].Name == strProfile) + if(lUser[j].Name == strProfile) { - lProfiles.RemoveAt(j); + lUser.RemoveAt(j); break; } } @@ -499,8 +529,8 @@ { Application.DoEvents(); - ProtectedString psNew = new ProtectedString(false); - PwGenerator.Generate(psNew, pwOpt, null, Program.PwGeneratorPool); + ProtectedString psNew; + PwGenerator.Generate(out psNew, pwOpt, null, Program.PwGeneratorPool); sbList.AppendLine(psNew.ReadString()); m_pbPreview.Value = (int)((100 * i) / MaxPreviewPasswords); } diff -Nru keepass2-2.16+dfsg/KeePass/Forms/SearchForm.cs keepass2-2.18+dfsg/KeePass/Forms/SearchForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/SearchForm.cs 2011-07-02 19:25:34.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/SearchForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -27,11 +27,14 @@ using System.Diagnostics; using KeePass.UI; +using KeePass.Util; +using KeePass.Util.Spr; using KeePass.Resources; using KeePassLib; using KeePassLib.Collections; using KeePassLib.Delegates; +using KeePassLib.Interfaces; using KeePassLib.Security; using KeePassLib.Utility; @@ -91,6 +94,8 @@ Properties.Resources.B48x48_XMag, strTitle, KPRes.SearchDesc); this.Icon = Properties.Resources.KeePass; + m_cbDerefData.Text = m_cbDerefData.Text + " (" + KPRes.Slow + ")"; + SearchParameters sp = Program.Config.Defaults.SearchParameters; m_cbTitle.Checked = sp.SearchInTitles; m_cbUserName.Checked = sp.SearchInUserNames; @@ -102,13 +107,16 @@ m_cbGroupName.Checked = sp.SearchInGroupNames; m_cbTags.Checked = sp.SearchInTags; - StringComparison sc = Program.Config.Defaults.SearchParameters.ComparisonMode; + StringComparison sc = sp.ComparisonMode; m_cbCaseSensitive.Checked = ((sc != StringComparison.CurrentCultureIgnoreCase) && (sc != StringComparison.InvariantCultureIgnoreCase) && (sc != StringComparison.OrdinalIgnoreCase)); - m_cbRegEx.Checked = Program.Config.Defaults.SearchParameters.RegularExpression; - m_cbExcludeExpired.Checked = Program.Config.Defaults.SearchParameters.ExcludeExpired; + m_cbRegEx.Checked = sp.RegularExpression; + m_cbExcludeExpired.Checked = sp.ExcludeExpired; + + string strTrf = SearchUtil.GetTransformation(sp); + m_cbDerefData.Checked = (strTrf == SearchUtil.StrTrfDeref); UIUtil.SetFocus(m_tbSearch, this); } @@ -139,12 +147,25 @@ if(m_pdContext != null) MainForm.AutoAdjustMemProtSettings(m_pdContext, sp); - try { m_pgRoot.SearchEntries(sp, listResults, true); } - catch(Exception exFind) { MessageService.ShowWarning(exFind); } + Form fOptDialog; + IStatusLogger sl = StatusUtil.CreateStatusDialog(this, out fOptDialog, + null, KPRes.SearchingOp + "...", true, false); + if(fOptDialog != null) Program.MainForm.RedirectActivationPush(fOptDialog); + this.Enabled = false; + + Exception exFind = null; + try { m_pgRoot.SearchEntries(sp, listResults, sl); } + catch(Exception ex) { exFind = ex; } + + if(fOptDialog != null) Program.MainForm.RedirectActivationPop(); + this.Enabled = true; + sl.EndLogging(); + + if(exFind != null) MessageService.ShowWarning(exFind); m_pgResultsGroup = pgResults; - sp.SearchString = string.Empty; // Clear for saving + sp.SearchString = string.Empty; // Clear for saving (sp points to global) } private void OnBtnCancel(object sender, EventArgs e) @@ -182,6 +203,9 @@ sp.ExcludeExpired = m_cbExcludeExpired.Checked; + SearchUtil.SetTransformation(sp, (m_cbDerefData.Checked ? + SearchUtil.StrTrfDeref : string.Empty)); + return sp; } } diff -Nru keepass2-2.16+dfsg/KeePass/Forms/SearchForm.Designer.cs keepass2-2.18+dfsg/KeePass/Forms/SearchForm.Designer.cs --- keepass2-2.16+dfsg/KeePass/Forms/SearchForm.Designer.cs 2010-05-27 14:09:50.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/SearchForm.Designer.cs 2011-09-08 10:39:18.000000000 +0000 @@ -34,6 +34,7 @@ this.m_tbSearch = new System.Windows.Forms.TextBox(); this.m_lblSearchFor = new System.Windows.Forms.Label(); this.m_grpSearchIn = new System.Windows.Forms.GroupBox(); + this.m_cbTags = new System.Windows.Forms.CheckBox(); this.m_cbGroupName = new System.Windows.Forms.CheckBox(); this.m_cbUuid = new System.Windows.Forms.CheckBox(); this.m_cbOtherFields = new System.Windows.Forms.CheckBox(); @@ -43,10 +44,10 @@ this.m_cbUserName = new System.Windows.Forms.CheckBox(); this.m_cbTitle = new System.Windows.Forms.CheckBox(); this.m_grpOptions = new System.Windows.Forms.GroupBox(); + this.m_cbDerefData = new System.Windows.Forms.CheckBox(); this.m_cbExcludeExpired = new System.Windows.Forms.CheckBox(); this.m_cbCaseSensitive = new System.Windows.Forms.CheckBox(); this.m_cbRegEx = new System.Windows.Forms.CheckBox(); - this.m_cbTags = new System.Windows.Forms.CheckBox(); ((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).BeginInit(); this.m_grpSearchIn.SuspendLayout(); this.m_grpOptions.SuspendLayout(); @@ -64,7 +65,7 @@ // m_btnOK // this.m_btnOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.m_btnOK.Location = new System.Drawing.Point(183, 289); + this.m_btnOK.Location = new System.Drawing.Point(183, 314); this.m_btnOK.Name = "m_btnOK"; this.m_btnOK.Size = new System.Drawing.Size(75, 23); this.m_btnOK.TabIndex = 5; @@ -75,7 +76,7 @@ // m_btnCancel // this.m_btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.m_btnCancel.Location = new System.Drawing.Point(264, 289); + this.m_btnCancel.Location = new System.Drawing.Point(264, 314); this.m_btnCancel.Name = "m_btnCancel"; this.m_btnCancel.Size = new System.Drawing.Size(75, 23); this.m_btnCancel.TabIndex = 6; @@ -117,6 +118,16 @@ this.m_grpSearchIn.TabStop = false; this.m_grpSearchIn.Text = "Search in"; // + // m_cbTags + // + this.m_cbTags.AutoSize = true; + this.m_cbTags.Location = new System.Drawing.Point(113, 65); + this.m_cbTags.Name = "m_cbTags"; + this.m_cbTags.Size = new System.Drawing.Size(50, 17); + this.m_cbTags.TabIndex = 7; + this.m_cbTags.Text = "T&ags"; + this.m_cbTags.UseVisualStyleBackColor = true; + // // m_cbGroupName // this.m_cbGroupName.AutoSize = true; @@ -199,15 +210,26 @@ // // m_grpOptions // + this.m_grpOptions.Controls.Add(this.m_cbDerefData); this.m_grpOptions.Controls.Add(this.m_cbExcludeExpired); this.m_grpOptions.Controls.Add(this.m_cbCaseSensitive); this.m_grpOptions.Location = new System.Drawing.Point(12, 212); this.m_grpOptions.Name = "m_grpOptions"; - this.m_grpOptions.Size = new System.Drawing.Size(327, 67); + this.m_grpOptions.Size = new System.Drawing.Size(327, 92); this.m_grpOptions.TabIndex = 4; this.m_grpOptions.TabStop = false; this.m_grpOptions.Text = "Options"; // + // m_cbDerefData + // + this.m_cbDerefData.AutoSize = true; + this.m_cbDerefData.Location = new System.Drawing.Point(9, 65); + this.m_cbDerefData.Name = "m_cbDerefData"; + this.m_cbDerefData.Size = new System.Drawing.Size(140, 17); + this.m_cbDerefData.TabIndex = 2; + this.m_cbDerefData.Text = "Resolve fiel&d references"; + this.m_cbDerefData.UseVisualStyleBackColor = true; + // // m_cbExcludeExpired // this.m_cbExcludeExpired.AutoSize = true; @@ -238,23 +260,13 @@ this.m_cbRegEx.Text = "&Regular expression"; this.m_cbRegEx.UseVisualStyleBackColor = true; // - // m_cbTags - // - this.m_cbTags.AutoSize = true; - this.m_cbTags.Location = new System.Drawing.Point(113, 65); - this.m_cbTags.Name = "m_cbTags"; - this.m_cbTags.Size = new System.Drawing.Size(50, 17); - this.m_cbTags.TabIndex = 7; - this.m_cbTags.Text = "T&ags"; - this.m_cbTags.UseVisualStyleBackColor = true; - // // SearchForm // 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(351, 324); + this.ClientSize = new System.Drawing.Size(351, 349); this.Controls.Add(this.m_cbRegEx); this.Controls.Add(this.m_grpOptions); this.Controls.Add(this.m_grpSearchIn); @@ -303,5 +315,6 @@ private System.Windows.Forms.CheckBox m_cbGroupName; private System.Windows.Forms.CheckBox m_cbUuid; private System.Windows.Forms.CheckBox m_cbTags; + private System.Windows.Forms.CheckBox m_cbDerefData; } } \ No newline at end of file diff -Nru keepass2-2.16+dfsg/KeePass/Forms/SingleLineEditForm.cs keepass2-2.18+dfsg/KeePass/Forms/SingleLineEditForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/SingleLineEditForm.cs 2011-07-02 19:25:34.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/SingleLineEditForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/StatusLoggerForm.cs keepass2-2.18+dfsg/KeePass/Forms/StatusLoggerForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/StatusLoggerForm.cs 2011-01-01 11:28:52.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/StatusLoggerForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/StatusProgressForm.cs keepass2-2.18+dfsg/KeePass/Forms/StatusProgressForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/StatusProgressForm.cs 2011-06-07 11:09:46.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/StatusProgressForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -48,6 +48,30 @@ get { return m_bCancelled; } } + public static StatusProgressForm ConstructEx(string strTitle, + bool bCanCancel, bool bMarqueeProgress, Form fOwner, + string strInitialOp) + { + StatusProgressForm dlg = new StatusProgressForm(); + dlg.InitEx(strTitle, bCanCancel, bMarqueeProgress, fOwner); + + if(fOwner != null) dlg.Show(fOwner); + else dlg.Show(); + + dlg.StartLogging(strInitialOp, false); + + return dlg; + } + + public static void DestroyEx(StatusProgressForm dlg) + { + if(dlg == null) { Debug.Assert(false); return; } + + dlg.EndLogging(); + dlg.Close(); + UIUtil.DestroyForm(dlg); + } + public void InitEx(string strTitle, bool bCanCancel, bool bMarqueeProgress, Form fOwner) { @@ -106,7 +130,8 @@ if(strText != null) m_lblTotal.Text = strText; - if((nPercent >= 0) && (nPercent <= 100)) m_pbTotal.Value = nPercent; + if((nPercent >= 0) && (nPercent <= 100)) + m_pbTotal.Value = nPercent; // .NET compares with cached value } private bool SetProgressGlobal(string strText, int nPercent) diff -Nru keepass2-2.16+dfsg/KeePass/Forms/TanWizardForm.cs keepass2-2.18+dfsg/KeePass/Forms/TanWizardForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/TanWizardForm.cs 2011-07-02 19:25:32.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/TanWizardForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/TextEncodingForm.cs keepass2-2.18+dfsg/KeePass/Forms/TextEncodingForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/TextEncodingForm.cs 2011-03-19 14:59:20.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/TextEncodingForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/UpdateCheckForm.cs keepass2-2.18+dfsg/KeePass/Forms/UpdateCheckForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/UpdateCheckForm.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/UpdateCheckForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -0,0 +1,202 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2012 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.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Diagnostics; + +using KeePass.Native; +using KeePass.Resources; +using KeePass.UI; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Utility; + +namespace KeePass.Forms +{ + public partial class UpdateCheckForm : Form, IGwmWindow + { + private List m_lInfo = null; + private ImageList m_ilIcons = null; + + public bool CanCloseWithoutDataLoss { get { return true; } } + + public void InitEx(List lInfo, bool bModal) + { + m_lInfo = lInfo; + + if(!bModal) this.ShowInTaskbar = true; + } + + public UpdateCheckForm() + { + InitializeComponent(); + Program.Translation.ApplyTo(this); + } + + private void OnFormLoad(object sender, EventArgs e) + { + if(m_lInfo == null) throw new InvalidOperationException(); + + GlobalWindowManager.AddWindow(this, this); + + BannerFactory.CreateBannerEx(this, m_bannerImage, + Properties.Resources.B48x48_WWW, KPRes.UpdateCheck, + KPRes.UpdateCheckResults); + this.Icon = Properties.Resources.KeePass; + this.Text = KPRes.UpdateCheck + " - " + PwDefs.ShortProductName; + + // UIUtil.SetExplorerTheme(m_lvInfo.Handle); + + int nWidth = m_lvInfo.ClientRectangle.Width - UIUtil.GetVScrollBarWidth(); + m_lvInfo.Columns.Add(KPRes.Component, (nWidth * 2) / 6); + m_lvInfo.Columns.Add(KPRes.Status, (nWidth * 2) / 6); + m_lvInfo.Columns.Add(KPRes.Installed, nWidth / 6); + m_lvInfo.Columns.Add(KPRes.Available, nWidth / 6); + + List lImages = new List(); + lImages.Add(Properties.Resources.B16x16_Help); + lImages.Add(Properties.Resources.B16x16_Apply); + lImages.Add(Properties.Resources.B16x16_Redo); + lImages.Add(Properties.Resources.B16x16_History); + lImages.Add(Properties.Resources.B16x16_Error); + m_ilIcons = UIUtil.BuildImageListUnscaled(lImages, 16, 16); + + m_lvInfo.SmallImageList = m_ilIcons; + + string strCat = string.Empty; + ListViewGroup lvg = null; + + foreach(UpdateComponentInfo uc in m_lInfo) + { + if(uc.Category != strCat) + { + lvg = new ListViewGroup(uc.Category); + m_lvInfo.Groups.Add(lvg); + strCat = uc.Category; + } + + ListViewItem lvi = new ListViewItem(uc.Name); + + string strStatus = KPRes.Unknown + "."; + if(uc.Status == UpdateComponentStatus.UpToDate) + { + strStatus = KPRes.UpToDate + "."; + lvi.ImageIndex = 1; + } + else if(uc.Status == UpdateComponentStatus.NewVerAvailable) + { + strStatus = KPRes.NewVersionAvailable + "!"; + lvi.ImageIndex = 2; + } + else if(uc.Status == UpdateComponentStatus.PreRelease) + { + strStatus = KPRes.PreReleaseVersion + "."; + lvi.ImageIndex = 3; + } + else if(uc.Status == UpdateComponentStatus.DownloadFailed) + { + strStatus = KPRes.UpdateCheckFailedNoDl; + lvi.ImageIndex = 4; + } + else lvi.ImageIndex = 0; + + lvi.SubItems.Add(strStatus); + lvi.SubItems.Add(StrUtil.VersionToString(uc.VerInstalled)); + + if((uc.Status == UpdateComponentStatus.UpToDate) || + (uc.Status == UpdateComponentStatus.NewVerAvailable) || + (uc.Status == UpdateComponentStatus.PreRelease)) + lvi.SubItems.Add(StrUtil.VersionToString(uc.VerAvailable)); + else lvi.SubItems.Add("?"); + + if(lvg != null) lvi.Group = lvg; + m_lvInfo.Items.Add(lvi); + } + } + + private void CleanUpEx() + { + if(m_ilIcons != null) + { + m_lvInfo.SmallImageList = null; + m_ilIcons.Dispose(); + m_ilIcons = null; + } + } + + private void OnFormClosed(object sender, FormClosedEventArgs e) + { + CleanUpEx(); + GlobalWindowManager.RemoveWindow(this); + } + + private void OnLinkWeb(object sender, LinkLabelLinkClickedEventArgs e) + { + OpenUrl(PwDefs.HomepageUrl); + } + + private void OnLinkPlugins(object sender, LinkLabelLinkClickedEventArgs e) + { + OpenUrl(PwDefs.PluginsUrl); + } + + private void OpenUrl(string strUrl) + { + if(!KeePassLib.Native.NativeLib.IsUnix()) + { + // Process.Start has a considerable delay when opening URLs + // here (different thread, etc.), therefore try the native + // ShellExecute first (which doesn't have any delay) + try + { + IntPtr h = NativeMethods.ShellExecute(this.Handle, + null, strUrl, null, null, NativeMethods.SW_SHOW); + long l = h.ToInt64(); + if((l < 0) || (l > 32)) return; + else { Debug.Assert(false); } + } + catch(Exception) { Debug.Assert(false); } + } + + try { Process.Start(strUrl); } + catch(Exception) { Debug.Assert(false); } + } + + private void OnInfoItemActivate(object sender, EventArgs e) + { + ListView.SelectedListViewItemCollection lvsic = m_lvInfo.SelectedItems; + if((lvsic == null) || (lvsic.Count != 1)) { Debug.Assert(false); return; } + ListViewItem lvi = lvsic[0]; + if((lvi == null) || (lvi.Group == null)) { Debug.Assert(false); return; } + + string strGroup = (lvi.Group.Header ?? string.Empty); + if(strGroup == PwDefs.ShortProductName) + OpenUrl(PwDefs.HomepageUrl); + else if(strGroup == KPRes.Plugins) + OpenUrl(PwDefs.PluginsUrl); + else { Debug.Assert(false); } + } + } +} diff -Nru keepass2-2.16+dfsg/KeePass/Forms/UpdateCheckForm.Designer.cs keepass2-2.18+dfsg/KeePass/Forms/UpdateCheckForm.Designer.cs --- keepass2-2.16+dfsg/KeePass/Forms/UpdateCheckForm.Designer.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/UpdateCheckForm.Designer.cs 2011-12-17 10:53:40.000000000 +0000 @@ -0,0 +1,129 @@ +namespace KeePass.Forms +{ + partial class UpdateCheckForm + { + /// + /// 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_btnClose = new System.Windows.Forms.Button(); + this.m_bannerImage = new System.Windows.Forms.PictureBox(); + this.m_lvInfo = new KeePass.UI.CustomListViewEx(); + this.m_linkWeb = new System.Windows.Forms.LinkLabel(); + this.m_linkPlugins = new System.Windows.Forms.LinkLabel(); + ((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).BeginInit(); + this.SuspendLayout(); + // + // m_btnClose + // + this.m_btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.m_btnClose.Location = new System.Drawing.Point(509, 310); + this.m_btnClose.Name = "m_btnClose"; + this.m_btnClose.Size = new System.Drawing.Size(75, 23); + this.m_btnClose.TabIndex = 0; + this.m_btnClose.Text = "&Close"; + this.m_btnClose.UseVisualStyleBackColor = true; + // + // 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(596, 60); + this.m_bannerImage.TabIndex = 1; + this.m_bannerImage.TabStop = false; + // + // m_lvInfo + // + this.m_lvInfo.FullRowSelect = true; + this.m_lvInfo.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.m_lvInfo.Location = new System.Drawing.Point(12, 71); + this.m_lvInfo.MultiSelect = false; + this.m_lvInfo.Name = "m_lvInfo"; + this.m_lvInfo.ShowItemToolTips = true; + this.m_lvInfo.Size = new System.Drawing.Size(572, 233); + this.m_lvInfo.TabIndex = 1; + this.m_lvInfo.UseCompatibleStateImageBehavior = false; + this.m_lvInfo.View = System.Windows.Forms.View.Details; + this.m_lvInfo.ItemActivate += new System.EventHandler(this.OnInfoItemActivate); + // + // m_linkWeb + // + this.m_linkWeb.AutoSize = true; + this.m_linkWeb.Location = new System.Drawing.Point(9, 315); + this.m_linkWeb.Name = "m_linkWeb"; + this.m_linkWeb.Size = new System.Drawing.Size(91, 13); + this.m_linkWeb.TabIndex = 2; + this.m_linkWeb.TabStop = true; + this.m_linkWeb.Text = "KeePass Website"; + this.m_linkWeb.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkWeb); + // + // m_linkPlugins + // + this.m_linkPlugins.AutoSize = true; + this.m_linkPlugins.Location = new System.Drawing.Point(106, 315); + this.m_linkPlugins.Name = "m_linkPlugins"; + this.m_linkPlugins.Size = new System.Drawing.Size(69, 13); + this.m_linkPlugins.TabIndex = 3; + this.m_linkPlugins.TabStop = true; + this.m_linkPlugins.Text = "Plugins Page"; + this.m_linkPlugins.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkPlugins); + // + // UpdateCheckForm + // + this.AcceptButton = this.m_btnClose; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.m_btnClose; + this.ClientSize = new System.Drawing.Size(596, 345); + this.Controls.Add(this.m_linkPlugins); + this.Controls.Add(this.m_linkWeb); + this.Controls.Add(this.m_lvInfo); + this.Controls.Add(this.m_bannerImage); + this.Controls.Add(this.m_btnClose); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "UpdateCheckForm"; + this.ShowInTaskbar = false; + 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); + ((System.ComponentModel.ISupportInitialize)(this.m_bannerImage)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button m_btnClose; + private System.Windows.Forms.PictureBox m_bannerImage; + private KeePass.UI.CustomListViewEx m_lvInfo; + private System.Windows.Forms.LinkLabel m_linkWeb; + private System.Windows.Forms.LinkLabel m_linkPlugins; + } +} \ No newline at end of file diff -Nru keepass2-2.16+dfsg/KeePass/Forms/UpdateCheckForm.resx keepass2-2.18+dfsg/KeePass/Forms/UpdateCheckForm.resx --- keepass2-2.16+dfsg/KeePass/Forms/UpdateCheckForm.resx 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/UpdateCheckForm.resx 2011-12-17 10:53:40.000000000 +0000 @@ -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 -Nru keepass2-2.16+dfsg/KeePass/Forms/UrlSchemeForm.cs keepass2-2.18+dfsg/KeePass/Forms/UrlSchemeForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/UrlSchemeForm.cs 2011-01-01 11:28:52.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/UrlSchemeForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Forms/UrlSchemesForm.cs keepass2-2.18+dfsg/KeePass/Forms/UrlSchemesForm.cs --- keepass2-2.16+dfsg/KeePass/Forms/UrlSchemesForm.cs 2011-02-21 18:09:38.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/UrlSchemesForm.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -57,9 +57,11 @@ this.Icon = Properties.Resources.KeePass; this.Text = KPRes.UrlSchemeOverrides; + UIUtil.SetExplorerTheme(m_lvOverrides.Handle); + int nWidth = (m_lvOverrides.ClientSize.Width - UIUtil.GetVScrollBarWidth()) / 4; m_lvOverrides.Columns.Add(KPRes.Scheme, nWidth); - m_lvOverrides.Columns.Add(KPRes.UrlOverride, nWidth * 3 - 1); + m_lvOverrides.Columns.Add(KPRes.UrlOverride, nWidth * 3); UpdateOverridesList(); } @@ -73,16 +75,28 @@ { m_lvOverrides.BeginUpdate(); m_lvOverrides.Items.Clear(); + m_lvOverrides.Groups.Clear(); - foreach(AceUrlSchemeOverride ovr in m_aceTmp.Overrides) + for(int i = 0; i < 2; ++i) { - ListViewItem lvi = new ListViewItem(ovr.Scheme); - lvi.SubItems.Add(ovr.UrlOverride); - lvi.Tag = ovr; // Set before setting the Checked property - - lvi.Checked = ovr.Enabled; + List l = ((i == 0) ? + m_aceTmp.BuiltInOverrides : m_aceTmp.CustomOverrides); - m_lvOverrides.Items.Add(lvi); + ListViewGroup lvg = new ListViewGroup((i == 0) ? + KPRes.OverridesBuiltIn : KPRes.OverridesCustom); + m_lvOverrides.Groups.Add(lvg); + + foreach(AceUrlSchemeOverride ovr in l) + { + ListViewItem lvi = new ListViewItem(ovr.Scheme); + lvi.SubItems.Add(ovr.UrlOverride); + lvi.Tag = ovr; // Set before setting the Checked property + + lvi.Checked = ovr.Enabled; + + m_lvOverrides.Items.Add(lvi); + lvg.Items.Add(lvi); + } } m_lvOverrides.EndUpdate(); @@ -99,8 +113,22 @@ private void EnableControlsEx() { - m_btnEdit.Enabled = (m_lvOverrides.SelectedIndices.Count == 1); - m_btnDelete.Enabled = (m_lvOverrides.SelectedIndices.Count >= 1); + ListView.SelectedIndexCollection lvsic = m_lvOverrides.SelectedIndices; + bool bOne = (lvsic.Count == 1); + bool bAtLeastOne = (lvsic.Count >= 1); + + bool bBuiltIn = false; + for(int i = 0; i < lvsic.Count; ++i) + { + AceUrlSchemeOverride ovr = (m_lvOverrides.Items[lvsic[i]].Tag as + AceUrlSchemeOverride); + if(ovr == null) { Debug.Assert(false); continue; } + + if(ovr.IsBuiltIn) { bBuiltIn = true; break; } + } + + m_btnEdit.Enabled = (bOne && !bBuiltIn); + m_btnDelete.Enabled = (bAtLeastOne && !bBuiltIn); } private void OnOverridesSelectedIndexChanged(object sender, EventArgs e) @@ -117,7 +145,7 @@ dlg.InitEx(ovr); if(UIUtil.ShowDialogAndDestroy(dlg) == DialogResult.OK) { - m_aceTmp.Overrides.Add(ovr); + m_aceTmp.CustomOverrides.Add(ovr); UpdateOverridesList(); m_lvOverrides.EnsureVisible(m_lvOverrides.Items.Count - 1); } @@ -130,10 +158,15 @@ AceUrlSchemeOverride ovr = (lvsic[0].Tag as AceUrlSchemeOverride); if(ovr == null) { Debug.Assert(false); return; } + if(ovr.IsBuiltIn) { Debug.Assert(false); return; } UrlSchemeForm dlg = new UrlSchemeForm(); dlg.InitEx(ovr); - if(UIUtil.ShowDialogAndDestroy(dlg) == DialogResult.OK) UpdateOverridesList(); + if(UIUtil.ShowDialogAndDestroy(dlg) == DialogResult.OK) + { + UpdateOverridesList(); + m_lvOverrides.EnsureVisible(m_lvOverrides.Items.Count - 1); + } } private void OnBtnDelete(object sender, EventArgs e) @@ -145,16 +178,19 @@ { AceUrlSchemeOverride ovr = (lvi.Tag as AceUrlSchemeOverride); if(ovr == null) { Debug.Assert(false); continue; } + if(ovr.IsBuiltIn) { Debug.Assert(false); continue; } - m_aceTmp.Overrides.Remove(ovr); + try { m_aceTmp.CustomOverrides.Remove(ovr); } + catch(Exception) { Debug.Assert(false); } } UpdateOverridesList(); + m_lvOverrides.EnsureVisible(m_lvOverrides.Items.Count - 1); } private void OnBtnOK(object sender, EventArgs e) { - m_aceOvr.Overrides = m_aceTmp.Overrides; + m_aceTmp.CopyTo(m_aceOvr); } } } diff -Nru keepass2-2.16+dfsg/KeePass/Forms/UrlSchemesForm.Designer.cs keepass2-2.18+dfsg/KeePass/Forms/UrlSchemesForm.Designer.cs --- keepass2-2.16+dfsg/KeePass/Forms/UrlSchemesForm.Designer.cs 2010-12-27 10:30:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Forms/UrlSchemesForm.Designer.cs 2011-08-26 13:46:14.000000000 +0000 @@ -30,7 +30,7 @@ { this.m_btnOK = new System.Windows.Forms.Button(); this.m_btnCancel = new System.Windows.Forms.Button(); - this.m_lvOverrides = new System.Windows.Forms.ListView(); + this.m_lvOverrides = new KeePass.UI.CustomListViewEx(); this.m_btnAdd = new System.Windows.Forms.Button(); this.m_btnEdit = new System.Windows.Forms.Button(); this.m_btnDelete = new System.Windows.Forms.Button(); @@ -40,7 +40,7 @@ // m_btnOK // this.m_btnOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.m_btnOK.Location = new System.Drawing.Point(320, 253); + this.m_btnOK.Location = new System.Drawing.Point(320, 289); this.m_btnOK.Name = "m_btnOK"; this.m_btnOK.Size = new System.Drawing.Size(75, 23); this.m_btnOK.TabIndex = 0; @@ -51,7 +51,7 @@ // m_btnCancel // this.m_btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.m_btnCancel.Location = new System.Drawing.Point(401, 253); + this.m_btnCancel.Location = new System.Drawing.Point(401, 289); this.m_btnCancel.Name = "m_btnCancel"; this.m_btnCancel.Size = new System.Drawing.Size(75, 23); this.m_btnCancel.TabIndex = 1; @@ -66,7 +66,7 @@ this.m_lvOverrides.Location = new System.Drawing.Point(12, 12); this.m_lvOverrides.Name = "m_lvOverrides"; this.m_lvOverrides.ShowItemToolTips = true; - this.m_lvOverrides.Size = new System.Drawing.Size(383, 218); + this.m_lvOverrides.Size = new System.Drawing.Size(383, 256); this.m_lvOverrides.TabIndex = 2; this.m_lvOverrides.UseCompatibleStateImageBehavior = false; this.m_lvOverrides.View = System.Windows.Forms.View.Details; @@ -106,7 +106,7 @@ // m_lblSep // this.m_lblSep.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; - this.m_lblSep.Location = new System.Drawing.Point(0, 243); + this.m_lblSep.Location = new System.Drawing.Point(0, 280); this.m_lblSep.Name = "m_lblSep"; this.m_lblSep.Size = new System.Drawing.Size(489, 2); this.m_lblSep.TabIndex = 6; @@ -117,7 +117,7 @@ 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(488, 288); + this.ClientSize = new System.Drawing.Size(488, 324); this.Controls.Add(this.m_lblSep); this.Controls.Add(this.m_btnDelete); this.Controls.Add(this.m_btnEdit); @@ -142,7 +142,7 @@ private System.Windows.Forms.Button m_btnOK; private System.Windows.Forms.Button m_btnCancel; - private System.Windows.Forms.ListView m_lvOverrides; + private KeePass.UI.CustomListViewEx m_lvOverrides; private System.Windows.Forms.Button m_btnAdd; private System.Windows.Forms.Button m_btnEdit; private System.Windows.Forms.Button m_btnDelete; diff -Nru keepass2-2.16+dfsg/KeePass/KeePass.csproj keepass2-2.18+dfsg/KeePass/KeePass.csproj --- keepass2-2.16+dfsg/KeePass/KeePass.csproj 2011-07-12 08:25:06.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/KeePass.csproj 2012-01-05 09:55:42.000000000 +0000 @@ -221,6 +221,9 @@ KeePassLib\Serialization\BinaryReaderEx.cs + + KeePassLib\Serialization\FileLock.cs + KeePassLib\Serialization\FileTransactionEx.cs @@ -368,6 +371,12 @@ AboutForm.cs + + Form + + + AutoTypeCtxForm.cs + Form @@ -404,6 +413,12 @@ DataViewerForm.cs + + Form + + + DuplicationForm.cs + Form @@ -626,6 +641,12 @@ TextEncodingForm.cs + + Form + + + UpdateCheckForm.cs + Form @@ -649,6 +670,7 @@ + Form @@ -687,11 +709,14 @@ + Component + + @@ -700,6 +725,7 @@ + @@ -728,6 +754,9 @@ Designer AboutForm.cs + + AutoTypeCtxForm.cs + Designer CharPickerForm.cs @@ -750,6 +779,9 @@ Designer DataViewerForm.cs + + DuplicationForm.cs + EcasActionForm.cs @@ -883,6 +915,9 @@ TextEncodingForm.cs + + UpdateCheckForm.cs + UrlSchemeForm.cs @@ -907,7 +942,6 @@ - @@ -941,17 +975,20 @@ + - + + + @@ -1080,6 +1117,7 @@ + @@ -1203,6 +1241,6 @@ --> - "$(FrameworkSDKDir)bin\sgen.exe" /assembly:"$(TargetPath)" /force /nologo /compiler:/keycontainer:VS_KEY_E6D8E2B3F89DA59B /compiler:/delaysign- + "$(FrameworkSDKDir)bin\sgen.exe" /assembly:"$(TargetPath)" /force /nologo /compiler:/keycontainer:VS_KEY_33430356D8D7D1B8 /compiler:/delaysign- \ No newline at end of file diff -Nru keepass2-2.16+dfsg/KeePass/Native/NativeMethods.cs keepass2-2.18+dfsg/KeePass/Native/NativeMethods.cs --- keepass2-2.16+dfsg/KeePass/Native/NativeMethods.cs 2011-07-09 17:46:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Native/NativeMethods.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -46,6 +46,10 @@ internal static extern IntPtr SendMessageHDItem(IntPtr hWnd, int nMsg, IntPtr wParam, ref HDITEM hdItem); + // [DllImport("User32.dll", EntryPoint = "SendMessage")] + // private static extern IntPtr SendMessageLVGroup(IntPtr hWnd, int nMsg, + // IntPtr wParam, ref LVGROUP lvGroup); + [DllImport("User32.dll", SetLastError = true)] internal static extern IntPtr SendMessageTimeout(IntPtr hWnd, int nMsg, IntPtr wParam, IntPtr lParam, uint fuFlags, uint uTimeout, @@ -77,6 +81,14 @@ [DllImport("User32.dll", EntryPoint = "GetClassLongPtr")] private static extern IntPtr GetClassLongPtr64(IntPtr hWnd, int nIndex); + [DllImport("User32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool IsIconic(IntPtr hWnd); + + [DllImport("User32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool IsZoomed(IntPtr hWnd); + [DllImport("User32.dll", SetLastError = true)] private static extern int GetWindowTextLength(IntPtr hWnd); @@ -256,6 +268,13 @@ [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool CloseHandle(IntPtr hObject); + [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] + internal static extern uint GetFileAttributes(string lpFileName); + + [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool DeleteFile(string lpFileName); + [DllImport("Kernel32.dll", ExactSpelling = true, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode, @@ -359,5 +378,10 @@ [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool PlaySound(string pszSound, IntPtr hmod, uint fdwSound); + + [DllImport("Shell32.dll", CharSet = CharSet.Auto)] + internal static extern IntPtr ShellExecute(IntPtr hwnd, + string lpOperation, string lpFile, string lpParameters, + string lpDirectory, int nShowCmd); } } diff -Nru keepass2-2.16+dfsg/KeePass/Native/NativeMethods.Defs.cs keepass2-2.18+dfsg/KeePass/Native/NativeMethods.Defs.cs --- keepass2-2.16+dfsg/KeePass/Native/NativeMethods.Defs.cs 2011-06-09 09:13:48.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Native/NativeMethods.Defs.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -89,6 +89,8 @@ internal const int WS_VISIBLE = 0x10000000; + internal const int SW_SHOW = 5; + internal const int GCLP_HICON = -14; internal const int GCLP_HICONSM = -34; @@ -96,6 +98,7 @@ internal const int ICON_BIG = 1; internal const int ICON_SMALL2 = 2; + internal const int EM_GETCHARFORMAT = WM_USER + 58; internal const int EM_SETCHARFORMAT = WM_USER + 68; internal const int ES_WANTRETURN = 0x1000; @@ -116,12 +119,16 @@ internal const int ECM_FIRST = 0x1500; internal const int EM_SETCUEBANNER = ECM_FIRST + 1; + internal const uint INVALID_FILE_ATTRIBUTES = 0xFFFFFFFFU; + internal const uint FSCTL_LOCK_VOLUME = 589848; internal const uint FSCTL_UNLOCK_VOLUME = 589852; internal const int LVM_FIRST = 0x1000; internal const int LVM_ENSUREVISIBLE = LVM_FIRST + 19; internal const int LVM_SCROLL = LVM_FIRST + 20; + // internal const int LVM_SETGROUPINFO = LVM_FIRST + 147; // >= Vista + // internal const int LVM_GETGROUPINFOBYINDEX = LVM_FIRST + 153; // >= Vista internal const int WM_MOUSEACTIVATE = 0x21; internal const int MA_ACTIVATE = 1; @@ -184,6 +191,36 @@ // internal const int LVN_FIRST = -100; // internal const int LVN_LINKCLICK = LVN_FIRST - 84; + // internal const uint LVGF_NONE = 0x00000000; + // internal const uint LVGF_HEADER = 0x00000001; + // internal const uint LVGF_FOOTER = 0x00000002; + // internal const uint LVGF_STATE = 0x00000004; + // internal const uint LVGF_ALIGN = 0x00000008; + // internal const uint LVGF_GROUPID = 0x00000010; + // internal const uint LVGF_SUBTITLE = 0x00000100; + // internal const uint LVGF_TASK = 0x00000200; + // internal const uint LVGF_DESCRIPTIONTOP = 0x00000400; + // internal const uint LVGF_DESCRIPTIONBOTTOM = 0x00000800; + // internal const uint LVGF_TITLEIMAGE = 0x00001000; + // internal const uint LVGF_EXTENDEDIMAGE = 0x00002000; + // internal const uint LVGF_ITEMS = 0x00004000; + // internal const uint LVGF_SUBSET = 0x00008000; + // internal const uint LVGF_SUBSETITEMS = 0x00010000; + + // internal const uint LVGS_NORMAL = 0x00000000; + // internal const uint LVGS_COLLAPSED = 0x00000001; + // internal const uint LVGS_HIDDEN = 0x00000002; + // internal const uint LVGS_NOHEADER = 0x00000004; + // internal const uint LVGS_COLLAPSIBLE = 0x00000008; + // internal const uint LVGS_FOCUSED = 0x00000010; + // internal const uint LVGS_SELECTED = 0x00000020; + // internal const uint LVGS_SUBSETED = 0x00000040; + // internal const uint LVGS_SUBSETLINKFOCUSED = 0x00000080; + + // private const int TTN_FIRST = -520; + // internal const int TTN_NEEDTEXTA = TTN_FIRST; + // internal const int TTN_NEEDTEXTW = TTN_FIRST - 10; + [return: MarshalAs(UnmanagedType.Bool)] internal delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); diff -Nru keepass2-2.16+dfsg/KeePass/Native/NativeMethods.New.cs keepass2-2.18+dfsg/KeePass/Native/NativeMethods.New.cs --- keepass2-2.16+dfsg/KeePass/Native/NativeMethods.New.cs 2011-06-09 11:16:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Native/NativeMethods.New.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -21,11 +21,12 @@ using System.Text; using System.Security; using System.Runtime.InteropServices; -using System.Diagnostics; using System.Windows.Forms; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; +using System.IO; +using System.Diagnostics; using KeePass.UI; using KeePass.Util; @@ -53,7 +54,12 @@ if(!KeePassLib.Native.NativeLib.IsUnix()) return GetForegroundWindow(); // Windows API - return new IntPtr(int.Parse(RunXDoTool("getactivewindow"))); + try + { + return new IntPtr(int.Parse(RunXDoTool("getactivewindow"))); + } + catch(Exception) { Debug.Assert(false); } + return IntPtr.Zero; } private static readonly char[] m_vWindowTrim = { '\r', '\n' }; @@ -337,5 +343,97 @@ return false; } + + /// + /// Method for testing whether a file exists or not. Also + /// supports NTFS alternate data streams. + /// + /// Path of the file or stream. + /// true if the file exists. + public static bool FileExists(string strFilePath) + { + if(strFilePath == null) throw new ArgumentNullException("strFilePath"); + + try + { + return (GetFileAttributes(strFilePath) != INVALID_FILE_ATTRIBUTES); + } + catch(Exception) { Debug.Assert(KeePassLib.Native.NativeLib.IsUnix()); } + + // Fallback to .NET method for Unix-like systems + try { return File.Exists(strFilePath); } + catch(Exception) { Debug.Assert(false); } // Invalid path + + return false; + } + + /* internal static LVGROUP GetGroupInfoByIndex(ListView lv, uint uIndex) + { + if(lv == null) throw new ArgumentNullException("lv"); + if(uIndex >= (uint)lv.Groups.Count) + throw new ArgumentOutOfRangeException("uIndex"); + + const int nStrLen = 1024; + + LVGROUP g = new LVGROUP(); + g.cbSize = (uint)Marshal.SizeOf(typeof(LVGROUP)); + + g.mask = ...; + + g.pszHeader = new StringBuilder(nStrLen); + g.cchHeader = nStrLen - 1; + g.pszFooter = new StringBuilder(nStrLen); + g.cchFooter = nStrLen - 1; + g.pszSubtitle = new StringBuilder(nStrLen); + g.cchSubtitle = (uint)(nStrLen - 1); + g.pszTask = new StringBuilder(nStrLen); + g.cchTask = (uint)(nStrLen - 1); + g.pszDescriptionTop = new StringBuilder(nStrLen); + g.cchDescriptionTop = (uint)(nStrLen - 1); + g.pszDescriptionBottom = new StringBuilder(nStrLen); + g.cchDescriptionBottom = (uint)(nStrLen - 1); + g.pszSubsetTitle = new StringBuilder(nStrLen); + g.cchSubsetTitle = (uint)(nStrLen - 1); + + SendMessageLVGroup(lv.Handle, LVM_GETGROUPINFOBYINDEX, + new IntPtr((int)uIndex), ref g); + return g; + } */ + + /* internal static uint GetGroupStateByIndex(ListView lv, uint uIndex, + uint uStateMask, out int iGroupID) + { + if(lv == null) throw new ArgumentNullException("lv"); + if(uIndex >= (uint)lv.Groups.Count) + throw new ArgumentOutOfRangeException("uIndex"); + + LVGROUP g = new LVGROUP(); + g.cbSize = (uint)Marshal.SizeOf(g); + + g.mask = (LVGF_STATE | LVGF_GROUPID); + g.stateMask = uStateMask; + + SendMessageLVGroup(lv.Handle, LVM_GETGROUPINFOBYINDEX, + new IntPtr((int)uIndex), ref g); + + iGroupID = g.iGroupId; + return g.state; + } + + internal static void SetGroupState(ListView lv, int iGroupID, + uint uStateMask, uint uState) + { + if(lv == null) throw new ArgumentNullException("lv"); + + LVGROUP g = new LVGROUP(); + g.cbSize = (uint)Marshal.SizeOf(g); + + g.mask = LVGF_STATE; + g.stateMask = uStateMask; + g.state = uState; + + SendMessageLVGroup(lv.Handle, LVM_SETGROUPINFO, + new IntPtr(iGroupID), ref g); + } */ } } diff -Nru keepass2-2.16+dfsg/KeePass/Native/NativeMethods.Structs.cs keepass2-2.18+dfsg/KeePass/Native/NativeMethods.Structs.cs --- keepass2-2.16+dfsg/KeePass/Native/NativeMethods.Structs.cs 2011-03-10 20:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Native/NativeMethods.Structs.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -189,6 +189,14 @@ public Int32 iOrder; } + // [StructLayout(LayoutKind.Sequential)] + // internal struct NMHDR + // { + // public IntPtr hwndFrom; + // public IntPtr idFrom; + // public int code; + // } + [StructLayout(LayoutKind.Sequential)] private struct LASTINPUTINFO { @@ -210,5 +218,58 @@ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string szTypeName; } + + /* // LVGROUP for Windows Vista and higher + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct LVGROUP + { + public uint cbSize; + public uint mask; + + // [MarshalAs(UnmanagedType.LPWStr)] + // public StringBuilder pszHeader; + public IntPtr pszHeader; + public int cchHeader; + + // [MarshalAs(UnmanagedType.LPWStr)] + // public StringBuilder pszFooter; + public IntPtr pszFooter; + public int cchFooter; + + public int iGroupId; + public uint stateMask; + public uint state; + public uint uAlign; + + // [MarshalAs(UnmanagedType.LPWStr)] + // public StringBuilder pszSubtitle; + public IntPtr pszSubtitle; + public uint cchSubtitle; + + // [MarshalAs(UnmanagedType.LPWStr)] + // public StringBuilder pszTask; + public IntPtr pszTask; + public uint cchTask; + + // [MarshalAs(UnmanagedType.LPWStr)] + // public StringBuilder pszDescriptionTop; + public IntPtr pszDescriptionTop; + public uint cchDescriptionTop; + + // [MarshalAs(UnmanagedType.LPWStr)] + // public StringBuilder pszDescriptionBottom; + public IntPtr pszDescriptionBottom; + public uint cchDescriptionBottom; + + public int iTitleImage; + public int iExtendedImage; + public int iFirstItem; + public uint cItems; + + // [MarshalAs(UnmanagedType.LPWStr)] + // public StringBuilder pszSubsetTitle; + public IntPtr pszSubsetTitle; + public uint cchSubsetTitle; + } */ } } diff -Nru keepass2-2.16+dfsg/KeePass/Native/NativeMethods.Unix.cs keepass2-2.18+dfsg/KeePass/Native/NativeMethods.Unix.cs --- keepass2-2.16+dfsg/KeePass/Native/NativeMethods.Unix.cs 2011-05-24 17:37:14.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Native/NativeMethods.Unix.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -24,6 +24,11 @@ using System.Runtime.InteropServices; using System.Diagnostics; +using KeePass.UI; +using KeePass.Util; + +using KeePassLib.Utility; + namespace KeePass.Native { internal static partial class NativeMethods @@ -74,7 +79,7 @@ long lCurrent; long.TryParse(strCurrent.Trim(), out lCurrent); - fCurrent.WindowState = FormWindowState.Minimized; + UIUtil.SetWindowState(fCurrent, FormWindowState.Minimized); int nStart = Environment.TickCount; while((Environment.TickCount - nStart) < 1000) @@ -107,7 +112,7 @@ string str = RunXDoTool("getactivewindow getwindowname"); if(string.IsNullOrEmpty(str)) return false; - return (str.Trim() != "usage: getactivewindow"); + return !(str.Trim().Equals("usage: getactivewindow", StrUtil.CaseIgnoreCmp)); } internal static string RunXDoTool(string strParams) @@ -115,24 +120,9 @@ try { Application.DoEvents(); // E.g. for clipboard updates - - ProcessStartInfo psi = new ProcessStartInfo(); - - psi.CreateNoWindow = true; - psi.FileName = "xdotool"; - psi.WindowStyle = ProcessWindowStyle.Hidden; - psi.UseShellExecute = false; - psi.RedirectStandardOutput = true; - - if(!string.IsNullOrEmpty(strParams)) psi.Arguments = strParams; - - Process p = Process.Start(psi); - - string strOutput = p.StandardOutput.ReadToEnd(); - p.WaitForExit(); - + string strOutput = WinUtil.RunConsoleApp("xdotool", strParams); Application.DoEvents(); // E.g. for clipboard updates - return strOutput; + return (strOutput ?? string.Empty); } catch(Exception) { Debug.Assert(false); } diff -Nru keepass2-2.16+dfsg/KeePass/Native/NativeProgressDialog.cs keepass2-2.18+dfsg/KeePass/Native/NativeProgressDialog.cs --- keepass2-2.16+dfsg/KeePass/Native/NativeProgressDialog.cs 2011-01-01 11:31:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Native/NativeProgressDialog.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -22,35 +22,53 @@ using System.Runtime.InteropServices; using System.Diagnostics; +using KeePass.Util; + using KeePassLib; using KeePassLib.Interfaces; namespace KeePass.Native { + [Flags] + public enum ProgDlgFlags + { + Normal = 0x0, + Modal = 0x1, + AutoTime = 0x2, + NoTime = 0x4, + NoMinimize = 0x8, + NoProgressBar = 0x10, + MarqueeProgress = 0x20, + NoCancel = 0x40 + } + public sealed class NativeProgressDialog : IStatusLogger { - private IProgressDialog m_p = null; - private uint m_uFlags = 0; + private IProgressDialog m_p; + private uint m_uFlags; + private IntPtr m_hWndParent; + private uint m_uLastPercent = 0; + + private const uint PDTIMER_RESET = 0x1; + private const uint PDTIMER_PAUSE = 0x2; + private const uint PDTIMER_RESUME = 0x3; + + public static bool IsSupported + { + get + { + return (WinUtil.IsAtLeastWindowsVista && + !KeePassLib.Native.NativeLib.IsUnix()); + } + } - private const uint PROGDLG_NORMAL = 0x00000000; - private const uint PROGDLG_MODAL = 0x00000001; - private const uint PROGDLG_AUTOTIME = 0x00000002; - private const uint PROGDLG_NOTIME = 0x00000004; - private const uint PROGDLG_NOMINIMIZE = 0x00000008; - private const uint PROGDLG_NOPROGRESSBAR = 0x00000010; - private const uint PROGDLG_MARQUEEPROGRESS = 0x00000020; - private const uint PROGDLG_NOCANCEL = 0x00000040; - - public NativeProgressDialog(bool bAutoTime, bool bNoTime, bool bMarquee, - bool bNoCancel) - { - if(bAutoTime) m_uFlags |= PROGDLG_AUTOTIME; - if(bNoTime) m_uFlags |= PROGDLG_NOTIME; - if(bMarquee) m_uFlags |= PROGDLG_MARQUEEPROGRESS; - if(bNoCancel) m_uFlags |= PROGDLG_NOCANCEL; + public NativeProgressDialog(IntPtr hWndParent, ProgDlgFlags fl) + { + m_hWndParent = hWndParent; + m_uFlags = (uint)fl; try { m_p = (IProgressDialog)(new Win32ProgressDialog()); } - catch(Exception) { Debug.Assert(false); } + catch(Exception) { Debug.Assert(false); m_p = null; } } ~NativeProgressDialog() @@ -60,54 +78,53 @@ public void StartLogging(string strOperation, bool bWriteOperationToLog) { - if(m_p != null) - { - m_p.SetTitle(PwDefs.ShortProductName); + if(m_p == null) { Debug.Assert(false); return; } - m_p.StartProgressDialog(IntPtr.Zero, IntPtr.Zero, m_uFlags, IntPtr.Zero); + m_p.SetTitle(PwDefs.ShortProductName); + m_p.StartProgressDialog(m_hWndParent, IntPtr.Zero, m_uFlags, IntPtr.Zero); + m_p.Timer(PDTIMER_RESET, IntPtr.Zero); + m_p.SetLine(1, strOperation, false, IntPtr.Zero); - m_p.SetLine(1, strOperation, false, IntPtr.Zero); - } + m_p.SetProgress(0, 100); + m_uLastPercent = 0; } public void EndLogging() { - if(m_p != null) - { - m_p.StopProgressDialog(); - try { Marshal.ReleaseComObject(m_p); } - catch(Exception) { Debug.Assert(false); } - m_p = null; - } + if(m_p == null) return; // Might be freed/null already, don't assert + + m_p.StopProgressDialog(); + try { Marshal.ReleaseComObject(m_p); } + catch(Exception) { Debug.Assert(false); } + m_p = null; } public bool SetProgress(uint uPercent) { - if(m_p != null) + if(m_p == null) { Debug.Assert(false); return true; } + + if(uPercent != m_uLastPercent) { m_p.SetProgress(uPercent, 100); - return !m_p.HasUserCancelled(); + m_uLastPercent = uPercent; } - return true; + return !m_p.HasUserCancelled(); } public bool SetText(string strNewText, LogStatusType lsType) { - if(m_p != null) - { - m_p.SetLine(2, strNewText, false, IntPtr.Zero); - return !m_p.HasUserCancelled(); - } + if(m_p == null) { Debug.Assert(false); return true; } - return true; + m_p.SetLine(2, strNewText, false, IntPtr.Zero); + return !m_p.HasUserCancelled(); } public bool ContinueWork() { - if(m_p != null) return !m_p.HasUserCancelled(); + if(m_p == null) { Debug.Assert(false); return true; } - return true; + return !m_p.HasUserCancelled(); } } diff -Nru keepass2-2.16+dfsg/KeePass/Plugins/DefaultPluginHost.cs keepass2-2.18+dfsg/KeePass/Plugins/DefaultPluginHost.cs --- keepass2-2.16+dfsg/KeePass/Plugins/DefaultPluginHost.cs 2011-01-01 11:31:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Plugins/DefaultPluginHost.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Plugins/IPluginHost.cs keepass2-2.18+dfsg/KeePass/Plugins/IPluginHost.cs --- keepass2-2.16+dfsg/KeePass/Plugins/IPluginHost.cs 2011-01-01 11:33:52.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Plugins/IPluginHost.cs 2012-01-01 12:01:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Plugins/PlgxCache.cs keepass2-2.18+dfsg/KeePass/Plugins/PlgxCache.cs --- keepass2-2.16+dfsg/KeePass/Plugins/PlgxCache.cs 2011-01-01 11:35:42.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Plugins/PlgxCache.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -68,7 +68,7 @@ if(Program.Config.Application.PluginCachePath.Length > 0) { string strRoot = SprEngine.Compile(Program.Config.Application.PluginCachePath, - false, null, null, false, false); + null); if(!string.IsNullOrEmpty(strRoot)) { if(strRoot.EndsWith(new string(Path.DirectorySeparatorChar, 1))) @@ -202,7 +202,8 @@ if(!Directory.Exists(strRoot)) return; DirectoryInfo di = new DirectoryInfo(strRoot); - foreach(DirectoryInfo diSub in di.GetDirectories("*", SearchOption.TopDirectoryOnly)) + foreach(DirectoryInfo diSub in di.GetDirectories("*", + SearchOption.TopDirectoryOnly)) { try { diff -Nru keepass2-2.16+dfsg/KeePass/Plugins/PlgxCsprojLoader.cs keepass2-2.18+dfsg/KeePass/Plugins/PlgxCsprojLoader.cs --- keepass2-2.16+dfsg/KeePass/Plugins/PlgxCsprojLoader.cs 2011-03-12 15:37:46.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Plugins/PlgxCsprojLoader.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Plugins/PlgxPlugin.cs keepass2-2.18+dfsg/KeePass/Plugins/PlgxPlugin.cs --- keepass2-2.16+dfsg/KeePass/Plugins/PlgxPlugin.cs 2011-03-19 15:04:22.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Plugins/PlgxPlugin.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -524,16 +524,44 @@ CompileEmbeddedRes(plgx); PrepareSourceFiles(plgx); - CompilerResults cr; - if(!CompileAssembly(plgx, out cr, null)) - if(!CompileAssembly(plgx, out cr, "v3.5")) - { - if(Program.CommandLineArgs[ - AppDefs.CommandLineOptions.SavePluginCompileRes] != null) - SaveCompilerResults(plgx, cr); + string[] vCompilers; + if(Environment.Version.Major >= 4) + { + vCompilers = new string[] { + null, + "v4", // Suggested in CodeDomProvider.CreateProvider doc + "v4.0", // Apparently works for most people + "v3.5" + }; + } + else // <= 3.5 + { + vCompilers = new string[] { + null, "v3.5", + "v4", // Suggested in CodeDomProvider.CreateProvider doc + "v4.0" // Apparently works for most people + }; + } - throw new InvalidOperationException(); + CompilerResults cr = null; + bool bCompiled = false; + for(int iCmp = 0; iCmp < vCompilers.Length; ++iCmp) + { + if(CompileAssembly(plgx, ref cr, vCompilers[iCmp])) + { + bCompiled = true; + break; } + } + + if(!bCompiled) + { + if(Program.CommandLineArgs[ + AppDefs.CommandLineOptions.SavePluginCompileRes] != null) + SaveCompilerResults(plgx, cr); + + throw new InvalidOperationException(); + } Program.TempFilesPool.Add(cr.PathToAssembly); @@ -547,7 +575,7 @@ } private static bool CompileAssembly(PlgxPluginInfo plgx, - out CompilerResults cr, string strCompilerVersion) + ref CompilerResults cr, string strCompilerVersion) { try { @@ -575,13 +603,15 @@ } catch(Exception) { } - cr = null; + // cr = null; // Keep previous results for output return false; } private static void SaveCompilerResults(PlgxPluginInfo plgx, CompilerResults cr) { + if(cr == null) { Debug.Assert(false); return; } + StringBuilder sb = new StringBuilder(); foreach(string strOut in cr.Output) { @@ -696,7 +726,7 @@ str = StrUtil.ReplaceCaseInsensitive(str, @"{PLGX_CACHE_DIR}", strCacheDir); // str = UrlUtil.ConvertSeparators(str); - str = SprEngine.Compile(str, false, null, null, false, false); + str = SprEngine.Compile(str, null); string strApp, strArgs; StrUtil.SplitCommandLine(str, out strApp, out strArgs); diff -Nru keepass2-2.16+dfsg/KeePass/Plugins/PlgxPluginInfo.cs keepass2-2.18+dfsg/KeePass/Plugins/PlgxPluginInfo.cs --- keepass2-2.16+dfsg/KeePass/Plugins/PlgxPluginInfo.cs 2011-03-12 15:37:46.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Plugins/PlgxPluginInfo.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Plugins/Plugin.cs keepass2-2.18+dfsg/KeePass/Plugins/Plugin.cs --- keepass2-2.16+dfsg/KeePass/Plugins/Plugin.cs 2011-01-01 11:35:42.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Plugins/Plugin.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -66,5 +66,14 @@ { get { return null; } } + + /// + /// URL of a version information file. See + /// http://keepass.info/help/v2_dev/plg_index.html#upd + /// + public virtual string UpdateUrl + { + get { return null; } + } } } diff -Nru keepass2-2.16+dfsg/KeePass/Plugins/PluginInfo.cs keepass2-2.18+dfsg/KeePass/Plugins/PluginInfo.cs --- keepass2-2.16+dfsg/KeePass/Plugins/PluginInfo.cs 2011-01-01 11:35:42.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Plugins/PluginInfo.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Plugins/PluginManager.cs keepass2-2.18+dfsg/KeePass/Plugins/PluginManager.cs --- keepass2-2.16+dfsg/KeePass/Plugins/PluginManager.cs 2011-03-19 15:04:22.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Plugins/PluginManager.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -52,7 +52,7 @@ { return m_vPlugins.GetEnumerator(); } - + public IEnumerator GetEnumerator() { return m_vPlugins.GetEnumerator(); diff -Nru keepass2-2.16+dfsg/KeePass/Program.cs keepass2-2.18+dfsg/KeePass/Program.cs --- keepass2-2.16+dfsg/KeePass/Program.cs 2011-06-15 14:59:52.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Program.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -202,6 +202,11 @@ Application.SetCompatibleTextRenderingDefault(false); Application.DoEvents(); // Required + int nRandomSeed = (int)DateTime.UtcNow.Ticks; + // Prevent overflow (see Random class constructor) + if(nRandomSeed == int.MinValue) nRandomSeed = 17; + m_rndGlobal = new Random(nRandomSeed); + InitEnvSecurity(); try { SelfTest.TestFipsComplianceProblems(); } @@ -211,11 +216,6 @@ return; } - int nRandomSeed = (int)DateTime.Now.Ticks; - // Prevent overflow (see Random class constructor) - if(nRandomSeed == int.MinValue) nRandomSeed = 17; - m_rndGlobal = new Random(nRandomSeed); - // Set global localized strings PwDatabase.LocalizedAppName = PwDefs.ShortProductName; Kdb4File.DetermineLanguageId(); diff -Nru keepass2-2.16+dfsg/KeePass/Properties/AssemblyInfo.cs keepass2-2.18+dfsg/KeePass/Properties/AssemblyInfo.cs --- keepass2-2.16+dfsg/KeePass/Properties/AssemblyInfo.cs 2011-07-05 12:43:06.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Properties/AssemblyInfo.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -27,7 +27,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Dominik Reichl")] [assembly: AssemblyProduct("KeePass")] -[assembly: AssemblyCopyright("Copyright © 2003-2011 Dominik Reichl")] +[assembly: AssemblyCopyright("Copyright © 2003-2012 Dominik Reichl")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -38,5 +38,5 @@ [assembly: Guid("02020c52-c0da-47c0-9f3f-a6fe76cee400")] // Assembly version information -[assembly: AssemblyVersion("2.1.6.*")] -[assembly: AssemblyFileVersion("2.1.6.0")] +[assembly: AssemblyVersion("2.1.8.*")] +[assembly: AssemblyFileVersion("2.1.8.0")] diff -Nru keepass2-2.16+dfsg/KeePass/Properties/Resources.Designer.cs keepass2-2.18+dfsg/KeePass/Properties/Resources.Designer.cs --- keepass2-2.16+dfsg/KeePass/Properties/Resources.Designer.cs 2011-06-15 12:05:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Properties/Resources.Designer.cs 2011-09-27 16:46:12.000000000 +0000 @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.4211 +// Runtime Version:2.0.50727.5446 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -200,6 +200,13 @@ } } + internal static System.Drawing.Bitmap B16x16_EditCopyLink { + get { + object obj = ResourceManager.GetObject("B16x16_EditCopyLink", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + internal static System.Drawing.Bitmap B16x16_EditDelete { get { object obj = ResourceManager.GetObject("B16x16_EditDelete", resourceCulture); diff -Nru keepass2-2.16+dfsg/KeePass/Properties/Resources.resx keepass2-2.18+dfsg/KeePass/Properties/Resources.resx --- keepass2-2.16+dfsg/KeePass/Properties/Resources.resx 2011-06-15 12:05:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Properties/Resources.resx 2011-09-27 16:46:12.000000000 +0000 @@ -571,4 +571,7 @@ ..\Resources\Images\B16x16_Imp_KasperskyPwMgr.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Nuvola_Derived\B16x16_EditCopyLink.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff -Nru keepass2-2.16+dfsg/KeePass/Resources/KPRes.Generated.cs keepass2-2.18+dfsg/KeePass/Resources/KPRes.Generated.cs --- keepass2-2.16+dfsg/KeePass/Resources/KPRes.Generated.cs 2011-07-05 11:40:12.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Resources/KPRes.Generated.cs 2011-12-30 10:46:16.000000000 +0000 @@ -29,7 +29,6 @@ m_strAction = TryGetEx(dictNew, "Action", m_strAction); m_strActivateDatabaseTab = TryGetEx(dictNew, "ActivateDatabaseTab", m_strActivateDatabaseTab); m_strAddEntry = TryGetEx(dictNew, "AddEntry", m_strAddEntry); - m_strAddEntryBtn = TryGetEx(dictNew, "AddEntryBtn", m_strAddEntryBtn); m_strAddEntryDesc = TryGetEx(dictNew, "AddEntryDesc", m_strAddEntryDesc); m_strAddStringField = TryGetEx(dictNew, "AddStringField", m_strAddStringField); m_strAddStringFieldDesc = TryGetEx(dictNew, "AddStringFieldDesc", m_strAddStringFieldDesc); @@ -74,6 +73,8 @@ m_strAutoTypeEntrySelectionDescShort = TryGetEx(dictNew, "AutoTypeEntrySelectionDescShort", m_strAutoTypeEntrySelectionDescShort); m_strAutoTypeGlobalHint = TryGetEx(dictNew, "AutoTypeGlobalHint", m_strAutoTypeGlobalHint); m_strAutoTypeMatchByTitle = TryGetEx(dictNew, "AutoTypeMatchByTitle", m_strAutoTypeMatchByTitle); + m_strAutoTypeMatchByUrlHostInTitle = TryGetEx(dictNew, "AutoTypeMatchByUrlHostInTitle", m_strAutoTypeMatchByUrlHostInTitle); + m_strAutoTypeMatchByUrlInTitle = TryGetEx(dictNew, "AutoTypeMatchByUrlInTitle", m_strAutoTypeMatchByUrlInTitle); m_strAutoTypeObfuscationHint = TryGetEx(dictNew, "AutoTypeObfuscationHint", m_strAutoTypeObfuscationHint); m_strAutoTypePrependInitSeqForIE = TryGetEx(dictNew, "AutoTypePrependInitSeqForIE", m_strAutoTypePrependInitSeqForIE); m_strAutoTypeReleaseAltWithKeyPress = TryGetEx(dictNew, "AutoTypeReleaseAltWithKeyPress", m_strAutoTypeReleaseAltWithKeyPress); @@ -82,22 +83,24 @@ m_strAutoTypeUnknownPlaceholder = TryGetEx(dictNew, "AutoTypeUnknownPlaceholder", m_strAutoTypeUnknownPlaceholder); m_strAutoTypeXDoToolRequired = TryGetEx(dictNew, "AutoTypeXDoToolRequired", m_strAutoTypeXDoToolRequired); m_strAutoTypeXDoToolRequiredGlobalVer = TryGetEx(dictNew, "AutoTypeXDoToolRequiredGlobalVer", m_strAutoTypeXDoToolRequiredGlobalVer); + m_strAvailable = TryGetEx(dictNew, "Available", m_strAvailable); m_strAvailableLanguages = TryGetEx(dictNew, "AvailableLanguages", m_strAvailableLanguages); m_strBackgroundColor = TryGetEx(dictNew, "BackgroundColor", m_strBackgroundColor); m_strBinaryNoConv = TryGetEx(dictNew, "BinaryNoConv", m_strBinaryNoConv); m_strBits = TryGetEx(dictNew, "Bits", m_strBits); m_strBold = TryGetEx(dictNew, "Bold", m_strBold); m_strBrowser = TryGetEx(dictNew, "Browser", m_strBrowser); + m_strBuiltIn = TryGetEx(dictNew, "BuiltIn", m_strBuiltIn); m_strButtonBack = TryGetEx(dictNew, "ButtonBack", m_strButtonBack); m_strButtonFinish = TryGetEx(dictNew, "ButtonFinish", m_strButtonFinish); m_strButtonNext = TryGetEx(dictNew, "ButtonNext", m_strButtonNext); m_strCancel = TryGetEx(dictNew, "Cancel", m_strCancel); + m_strCancelCmd = TryGetEx(dictNew, "CancelCmd", m_strCancelCmd); m_strCannotMoveEntriesBcsGroup = TryGetEx(dictNew, "CannotMoveEntriesBcsGroup", m_strCannotMoveEntriesBcsGroup); m_strChangeMasterKey = TryGetEx(dictNew, "ChangeMasterKey", m_strChangeMasterKey); m_strChangeMasterKeyIntroShort = TryGetEx(dictNew, "ChangeMasterKeyIntroShort", m_strChangeMasterKeyIntroShort); m_strCheckForUpdAtStart = TryGetEx(dictNew, "CheckForUpdAtStart", m_strCheckForUpdAtStart); - m_strChkForUpdGotLatest = TryGetEx(dictNew, "ChkForUpdGotLatest", m_strChkForUpdGotLatest); - m_strChkForUpdNewVersion = TryGetEx(dictNew, "ChkForUpdNewVersion", m_strChkForUpdNewVersion); + m_strCheckingForUpd = TryGetEx(dictNew, "CheckingForUpd", m_strCheckingForUpd); m_strClearKeyCmdLineParams = TryGetEx(dictNew, "ClearKeyCmdLineParams", m_strClearKeyCmdLineParams); m_strClearMru = TryGetEx(dictNew, "ClearMru", m_strClearMru); m_strClipboard = TryGetEx(dictNew, "Clipboard", m_strClipboard); @@ -108,9 +111,10 @@ m_strCloseButton = TryGetEx(dictNew, "CloseButton", m_strCloseButton); m_strCloseButtonMinimizes = TryGetEx(dictNew, "CloseButtonMinimizes", m_strCloseButtonMinimizes); m_strColumn = TryGetEx(dictNew, "Column", m_strColumn); + m_strColumns = TryGetEx(dictNew, "Columns", m_strColumns); m_strCompany = TryGetEx(dictNew, "Company", m_strCompany); m_strComparison = TryGetEx(dictNew, "Comparison", m_strComparison); - m_strComponents = TryGetEx(dictNew, "Components", m_strComponents); + m_strComponent = TryGetEx(dictNew, "Component", m_strComponent); m_strCondition = TryGetEx(dictNew, "Condition", m_strCondition); m_strConfigAffectAdmin = TryGetEx(dictNew, "ConfigAffectAdmin", m_strConfigAffectAdmin); m_strConfigAffectUser = TryGetEx(dictNew, "ConfigAffectUser", m_strConfigAffectUser); @@ -129,6 +133,7 @@ m_strCopiedEntryData = TryGetEx(dictNew, "CopiedEntryData", m_strCopiedEntryData); m_strCopy = TryGetEx(dictNew, "Copy", m_strCopy); m_strCopyAll = TryGetEx(dictNew, "CopyAll", m_strCopyAll); + m_strCopyLink = TryGetEx(dictNew, "CopyLink", m_strCopyLink); m_strCopyOfItem = TryGetEx(dictNew, "CopyOfItem", m_strCopyOfItem); m_strCopyPasswordFull = TryGetEx(dictNew, "CopyPasswordFull", m_strCopyPasswordFull); m_strCopyPasswordMenu = TryGetEx(dictNew, "CopyPasswordMenu", m_strCopyPasswordMenu); @@ -178,11 +183,11 @@ m_strDescription = TryGetEx(dictNew, "Description", m_strDescription); m_strDetails = TryGetEx(dictNew, "Details", m_strDetails); m_strDialogNoShowAgain = TryGetEx(dictNew, "DialogNoShowAgain", m_strDialogNoShowAgain); + m_strDisable = TryGetEx(dictNew, "Disable", m_strDisable); m_strDisabled = TryGetEx(dictNew, "Disabled", m_strDisabled); m_strDisableSaveIfNotModified = TryGetEx(dictNew, "DisableSaveIfNotModified", m_strDisableSaveIfNotModified); - m_strDiscardChanges = TryGetEx(dictNew, "DiscardChanges", m_strDiscardChanges); + m_strDiscardChangesCmd = TryGetEx(dictNew, "DiscardChangesCmd", m_strDiscardChangesCmd); m_strDocumentationHint = TryGetEx(dictNew, "DocumentationHint", m_strDocumentationHint); - m_strDontDeleteCmd = TryGetEx(dictNew, "DontDeleteCmd", m_strDontDeleteCmd); m_strDragDrop = TryGetEx(dictNew, "DragDrop", m_strDragDrop); m_strDropToBackOnCopy = TryGetEx(dictNew, "DropToBackOnCopy", m_strDropToBackOnCopy); m_strDuplicateStringFieldName = TryGetEx(dictNew, "DuplicateStringFieldName", m_strDuplicateStringFieldName); @@ -200,6 +205,7 @@ m_strEmptyMasterPwHint = TryGetEx(dictNew, "EmptyMasterPwHint", m_strEmptyMasterPwHint); m_strEmptyMasterPwQuestion = TryGetEx(dictNew, "EmptyMasterPwQuestion", m_strEmptyMasterPwQuestion); m_strEmptyRecycleBinQuestion = TryGetEx(dictNew, "EmptyRecycleBinQuestion", m_strEmptyRecycleBinQuestion); + m_strEnable = TryGetEx(dictNew, "Enable", m_strEnable); m_strEnabled = TryGetEx(dictNew, "Enabled", m_strEnabled); m_strEncoding = TryGetEx(dictNew, "Encoding", m_strEncoding); m_strEncodingAnsi = TryGetEx(dictNew, "EncodingAnsi", m_strEncodingAnsi); @@ -212,8 +218,6 @@ m_strEntry = TryGetEx(dictNew, "Entry", m_strEntry); m_strEntryList = TryGetEx(dictNew, "EntryList", m_strEntryList); m_strEntryListAutoResizeColumns = TryGetEx(dictNew, "EntryListAutoResizeColumns", m_strEntryListAutoResizeColumns); - m_strEntryView = TryGetEx(dictNew, "EntryView", m_strEntryView); - m_strEntryViewHideProtectedCustomStrings = TryGetEx(dictNew, "EntryViewHideProtectedCustomStrings", m_strEntryViewHideProtectedCustomStrings); m_strEnvironmentVariable = TryGetEx(dictNew, "EnvironmentVariable", m_strEnvironmentVariable); m_strEqualsOp = TryGetEx(dictNew, "EqualsOp", m_strEqualsOp); m_strErrorCode = TryGetEx(dictNew, "ErrorCode", m_strErrorCode); @@ -276,8 +280,9 @@ m_strFileVerifyHashFailRec = TryGetEx(dictNew, "FileVerifyHashFailRec", m_strFileVerifyHashFailRec); m_strFilter = TryGetEx(dictNew, "Filter", m_strFilter); m_strFind = TryGetEx(dictNew, "Find", m_strFind); + m_strFocusQuickFindOnRestore = TryGetEx(dictNew, "FocusQuickFindOnRestore", m_strFocusQuickFindOnRestore); m_strFocusQuickFindOnUntray = TryGetEx(dictNew, "FocusQuickFindOnUntray", m_strFocusQuickFindOnUntray); - m_strFocusResultsAfterQuickFind = TryGetEx(dictNew, "FocusResultsAfterQuickFind", m_strFocusResultsAfterQuickFind); + m_strFocusResultsAfterQuickSearch = TryGetEx(dictNew, "FocusResultsAfterQuickSearch", m_strFocusResultsAfterQuickSearch); m_strFolder = TryGetEx(dictNew, "Folder", m_strFolder); m_strFont = TryGetEx(dictNew, "Font", m_strFont); m_strForceSystemFontUnix = TryGetEx(dictNew, "ForceSystemFontUnix", m_strForceSystemFontUnix); @@ -328,9 +333,10 @@ m_strImportingStatusMsg = TryGetEx(dictNew, "ImportingStatusMsg", m_strImportingStatusMsg); m_strImportMustRead = TryGetEx(dictNew, "ImportMustRead", m_strImportMustRead); m_strImportMustReadQuestion = TryGetEx(dictNew, "ImportMustReadQuestion", m_strImportMustReadQuestion); + m_strIncompatibleWithSorting = TryGetEx(dictNew, "IncompatibleWithSorting", m_strIncompatibleWithSorting); m_strInheritSettingFromParent = TryGetEx(dictNew, "InheritSettingFromParent", m_strInheritSettingFromParent); + m_strInstalled = TryGetEx(dictNew, "Installed", m_strInstalled); m_strInternet = TryGetEx(dictNew, "Internet", m_strInternet); - m_strInvalidFileStructure = TryGetEx(dictNew, "InvalidFileStructure", m_strInvalidFileStructure); m_strInvalidKey = TryGetEx(dictNew, "InvalidKey", m_strInvalidKey); m_strInvalidUrl = TryGetEx(dictNew, "InvalidUrl", m_strInvalidUrl); m_strInvalidUserPassword = TryGetEx(dictNew, "InvalidUserPassword", m_strInvalidUserPassword); @@ -346,7 +352,9 @@ m_strKeyboardKeyAlt = TryGetEx(dictNew, "KeyboardKeyAlt", m_strKeyboardKeyAlt); m_strKeyboardKeyCtrl = TryGetEx(dictNew, "KeyboardKeyCtrl", m_strKeyboardKeyCtrl); m_strKeyboardKeyCtrlLeft = TryGetEx(dictNew, "KeyboardKeyCtrlLeft", m_strKeyboardKeyCtrlLeft); + m_strKeyboardKeyEsc = TryGetEx(dictNew, "KeyboardKeyEsc", m_strKeyboardKeyEsc); m_strKeyboardKeyModifiers = TryGetEx(dictNew, "KeyboardKeyModifiers", m_strKeyboardKeyModifiers); + m_strKeyboardKeyReturn = TryGetEx(dictNew, "KeyboardKeyReturn", m_strKeyboardKeyReturn); m_strKeyboardKeyShift = TryGetEx(dictNew, "KeyboardKeyShift", m_strKeyboardKeyShift); m_strKeyboardKeyShiftLeft = TryGetEx(dictNew, "KeyboardKeyShiftLeft", m_strKeyboardKeyShiftLeft); m_strKeyChanged = TryGetEx(dictNew, "KeyChanged", m_strKeyChanged); @@ -356,9 +364,8 @@ m_strKeyFiles = TryGetEx(dictNew, "KeyFiles", m_strKeyFiles); m_strKeyFileSelect = TryGetEx(dictNew, "KeyFileSelect", m_strKeyFileSelect); m_strKeyFileUseExisting = TryGetEx(dictNew, "KeyFileUseExisting", m_strKeyFileUseExisting); - m_strKeyProvWithGuiOnSD = TryGetEx(dictNew, "KeyProvWithGuiOnSD", m_strKeyProvWithGuiOnSD); - m_strKeyProvWithGuiOnSDHint = TryGetEx(dictNew, "KeyProvWithGuiOnSDHint", m_strKeyProvWithGuiOnSDHint); - m_strKeystrokeSequence = TryGetEx(dictNew, "KeystrokeSequence", m_strKeystrokeSequence); + m_strKeyProvIncmpWithSD = TryGetEx(dictNew, "KeyProvIncmpWithSD", m_strKeyProvIncmpWithSD); + m_strKeyProvIncmpWithSDHint = TryGetEx(dictNew, "KeyProvIncmpWithSDHint", m_strKeyProvIncmpWithSDHint); m_strLanguageSelected = TryGetEx(dictNew, "LanguageSelected", m_strLanguageSelected); m_strLastAccessTime = TryGetEx(dictNew, "LastAccessTime", m_strLastAccessTime); m_strLastModificationTime = TryGetEx(dictNew, "LastModificationTime", m_strLastModificationTime); @@ -398,6 +405,7 @@ m_strNewerNetRequired = TryGetEx(dictNew, "NewerNetRequired", m_strNewerNetRequired); m_strNewGroup = TryGetEx(dictNew, "NewGroup", m_strNewGroup); m_strNewState = TryGetEx(dictNew, "NewState", m_strNewState); + m_strNewVersionAvailable = TryGetEx(dictNew, "NewVersionAvailable", m_strNewVersionAvailable); m_strNo = TryGetEx(dictNew, "No", m_strNo); m_strNoFileAccessRead = TryGetEx(dictNew, "NoFileAccessRead", m_strNoFileAccessRead); m_strNoKeyFileSpecifiedMeta = TryGetEx(dictNew, "NoKeyFileSpecifiedMeta", m_strNoKeyFileSpecifiedMeta); @@ -420,10 +428,13 @@ m_strOpenDatabaseFileStc = TryGetEx(dictNew, "OpenDatabaseFileStc", m_strOpenDatabaseFileStc); m_strOpenedDatabaseFile = TryGetEx(dictNew, "OpenedDatabaseFile", m_strOpenedDatabaseFile); m_strOpeningDatabase = TryGetEx(dictNew, "OpeningDatabase", m_strOpeningDatabase); + m_strOpenWith = TryGetEx(dictNew, "OpenWith", m_strOpenWith); m_strOptimizeForScreenReader = TryGetEx(dictNew, "OptimizeForScreenReader", m_strOptimizeForScreenReader); m_strOptions = TryGetEx(dictNew, "Options", m_strOptions); m_strOptionsDesc = TryGetEx(dictNew, "OptionsDesc", m_strOptionsDesc); m_strOtherPlaceholders = TryGetEx(dictNew, "OtherPlaceholders", m_strOtherPlaceholders); + m_strOverridesBuiltIn = TryGetEx(dictNew, "OverridesBuiltIn", m_strOverridesBuiltIn); + m_strOverridesCustom = TryGetEx(dictNew, "OverridesCustom", m_strOverridesCustom); m_strOverwrite = TryGetEx(dictNew, "Overwrite", m_strOverwrite); m_strOverwriteExistingFileQuestion = TryGetEx(dictNew, "OverwriteExistingFileQuestion", m_strOverwriteExistingFileQuestion); m_strPackageInstallHint = TryGetEx(dictNew, "PackageInstallHint", m_strPackageInstallHint); @@ -465,16 +476,20 @@ m_strPolicyNewDatabaseDesc = TryGetEx(dictNew, "PolicyNewDatabaseDesc", m_strPolicyNewDatabaseDesc); m_strPolicyPluginsDesc = TryGetEx(dictNew, "PolicyPluginsDesc", m_strPolicyPluginsDesc); m_strPolicyPrintDesc = TryGetEx(dictNew, "PolicyPrintDesc", m_strPolicyPrintDesc); + m_strPolicyPrintNoKeyDesc = TryGetEx(dictNew, "PolicyPrintNoKeyDesc", m_strPolicyPrintNoKeyDesc); m_strPolicyRequiredFlag = TryGetEx(dictNew, "PolicyRequiredFlag", m_strPolicyRequiredFlag); m_strPolicySaveDatabaseDesc = TryGetEx(dictNew, "PolicySaveDatabaseDesc", m_strPolicySaveDatabaseDesc); m_strPolicyTriggersEditDesc = TryGetEx(dictNew, "PolicyTriggersEditDesc", m_strPolicyTriggersEditDesc); + m_strPreReleaseVersion = TryGetEx(dictNew, "PreReleaseVersion", m_strPreReleaseVersion); m_strPrint = TryGetEx(dictNew, "Print", m_strPrint); m_strPrintDesc = TryGetEx(dictNew, "PrintDesc", m_strPrintDesc); - m_strQuickSearch = TryGetEx(dictNew, "QuickSearch", m_strQuickSearch); - m_strQuickSearchExcludeExpired = TryGetEx(dictNew, "QuickSearchExcludeExpired", m_strQuickSearchExcludeExpired); - m_strQuickSearchInPasswords = TryGetEx(dictNew, "QuickSearchInPasswords", m_strQuickSearchInPasswords); + m_strQuickSearchExclExpired = TryGetEx(dictNew, "QuickSearchExclExpired", m_strQuickSearchExclExpired); + m_strQuickSearchInPwFields = TryGetEx(dictNew, "QuickSearchInPwFields", m_strQuickSearchInPwFields); + m_strQuickSearchDerefData = TryGetEx(dictNew, "QuickSearchDerefData", m_strQuickSearchDerefData); + m_strQuickSearchTb = TryGetEx(dictNew, "QuickSearchTb", m_strQuickSearchTb); m_strRandomMacAddress = TryGetEx(dictNew, "RandomMacAddress", m_strRandomMacAddress); m_strReady = TryGetEx(dictNew, "Ready", m_strReady); + m_strRecommended = TryGetEx(dictNew, "Recommended", m_strRecommended); m_strRecycleBin = TryGetEx(dictNew, "RecycleBin", m_strRecycleBin); m_strRecycleBinCollapse = TryGetEx(dictNew, "RecycleBinCollapse", m_strRecycleBinCollapse); m_strRedo = TryGetEx(dictNew, "Redo", m_strRedo); @@ -484,6 +499,7 @@ m_strRepairMode = TryGetEx(dictNew, "RepairMode", m_strRepairMode); m_strRestartKeePassQuestion = TryGetEx(dictNew, "RestartKeePassQuestion", m_strRestartKeePassQuestion); m_strRootDirectory = TryGetEx(dictNew, "RootDirectory", m_strRootDirectory); + m_strSameKeybLayout = TryGetEx(dictNew, "SameKeybLayout", m_strSameKeybLayout); m_strSampleEntry = TryGetEx(dictNew, "SampleEntry", m_strSampleEntry); m_strSave = TryGetEx(dictNew, "Save", m_strSave); m_strSaveBeforeCloseQuestion = TryGetEx(dictNew, "SaveBeforeCloseQuestion", m_strSaveBeforeCloseQuestion); @@ -498,6 +514,7 @@ m_strSearch = TryGetEx(dictNew, "Search", m_strSearch); m_strSearchDesc = TryGetEx(dictNew, "SearchDesc", m_strSearchDesc); m_strSearchGroupName = TryGetEx(dictNew, "SearchGroupName", m_strSearchGroupName); + m_strSearchingOp = TryGetEx(dictNew, "SearchingOp", m_strSearchingOp); m_strSearchItemsFoundSmall = TryGetEx(dictNew, "SearchItemsFoundSmall", m_strSearchItemsFoundSmall); m_strSearchKeyFiles = TryGetEx(dictNew, "SearchKeyFiles", m_strSearchKeyFiles); m_strSearchKeyFilesAlsoOnRemovable = TryGetEx(dictNew, "SearchKeyFilesAlsoOnRemovable", m_strSearchKeyFilesAlsoOnRemovable); @@ -509,19 +526,22 @@ m_strSelectAll = TryGetEx(dictNew, "SelectAll", m_strSelectAll); m_strSelectColor = TryGetEx(dictNew, "SelectColor", m_strSelectColor); m_strSelectDifferentGroup = TryGetEx(dictNew, "SelectDifferentGroup", m_strSelectDifferentGroup); + m_strSelectedColumn = TryGetEx(dictNew, "SelectedColumn", m_strSelectedColumn); m_strSelectedLower = TryGetEx(dictNew, "SelectedLower", m_strSelectedLower); m_strSelectFile = TryGetEx(dictNew, "SelectFile", m_strSelectFile); m_strSelectIcon = TryGetEx(dictNew, "SelectIcon", m_strSelectIcon); m_strSelectLanguage = TryGetEx(dictNew, "SelectLanguage", m_strSelectLanguage); m_strSelectLanguageDesc = TryGetEx(dictNew, "SelectLanguageDesc", m_strSelectLanguageDesc); m_strSelfTestFailed = TryGetEx(dictNew, "SelfTestFailed", m_strSelfTestFailed); - m_strShowAllEntries = TryGetEx(dictNew, "ShowAllEntries", m_strShowAllEntries); + m_strSequence = TryGetEx(dictNew, "Sequence", m_strSequence); + m_strShowDerefData = TryGetEx(dictNew, "ShowDerefData", m_strShowDerefData); + m_strShowDerefDataAsync = TryGetEx(dictNew, "ShowDerefDataAsync", m_strShowDerefDataAsync); m_strShowEntries = TryGetEx(dictNew, "ShowEntries", m_strShowEntries); - m_strShowExpiredEntries = TryGetEx(dictNew, "ShowExpiredEntries", m_strShowExpiredEntries); m_strShowFullPathInTitleBar = TryGetEx(dictNew, "ShowFullPathInTitleBar", m_strShowFullPathInTitleBar); m_strShowIn = TryGetEx(dictNew, "ShowIn", m_strShowIn); m_strShowTrayOnlyIfTrayed = TryGetEx(dictNew, "ShowTrayOnlyIfTrayed", m_strShowTrayOnlyIfTrayed); m_strSize = TryGetEx(dictNew, "Size", m_strSize); + m_strSlow = TryGetEx(dictNew, "Slow", m_strSlow); m_strSoonToExpireEntries = TryGetEx(dictNew, "SoonToExpireEntries", m_strSoonToExpireEntries); m_strSpecialKeys = TryGetEx(dictNew, "SpecialKeys", m_strSpecialKeys); m_strStandardExpireSelect = TryGetEx(dictNew, "StandardExpireSelect", m_strStandardExpireSelect); @@ -529,6 +549,7 @@ m_strStartAndExit = TryGetEx(dictNew, "StartAndExit", m_strStartAndExit); m_strStartMinimizedAndLocked = TryGetEx(dictNew, "StartMinimizedAndLocked", m_strStartMinimizedAndLocked); m_strStartsWith = TryGetEx(dictNew, "StartsWith", m_strStartsWith); + m_strStatus = TryGetEx(dictNew, "Status", m_strStatus); m_strStrikeout = TryGetEx(dictNew, "Strikeout", m_strStrikeout); m_strString = TryGetEx(dictNew, "String", m_strString); m_strSuccess = TryGetEx(dictNew, "Success", m_strSuccess); @@ -582,9 +603,15 @@ m_strUnhideSourceCharactersToo = TryGetEx(dictNew, "UnhideSourceCharactersToo", m_strUnhideSourceCharactersToo); m_strUnknown = TryGetEx(dictNew, "Unknown", m_strUnknown); m_strUnknownError = TryGetEx(dictNew, "UnknownError", m_strUnknownError); - m_strUnknownFileVersion = TryGetEx(dictNew, "UnknownFileVersion", m_strUnknownFileVersion); - m_strUpdateCheckingFailed = TryGetEx(dictNew, "UpdateCheckingFailed", m_strUpdateCheckingFailed); + m_strUpdateCheck = TryGetEx(dictNew, "UpdateCheck", m_strUpdateCheck); + m_strUpdateCheckEnableQ = TryGetEx(dictNew, "UpdateCheckEnableQ", m_strUpdateCheckEnableQ); + m_strUpdateCheckFailedNoDl = TryGetEx(dictNew, "UpdateCheckFailedNoDl", m_strUpdateCheckFailedNoDl); + m_strUpdateCheckInfo = TryGetEx(dictNew, "UpdateCheckInfo", m_strUpdateCheckInfo); + m_strUpdateCheckInfoPriv = TryGetEx(dictNew, "UpdateCheckInfoPriv", m_strUpdateCheckInfoPriv); + m_strUpdateCheckInfoRes = TryGetEx(dictNew, "UpdateCheckInfoRes", m_strUpdateCheckInfoRes); + m_strUpdateCheckResults = TryGetEx(dictNew, "UpdateCheckResults", m_strUpdateCheckResults); m_strUpdatedUIState = TryGetEx(dictNew, "UpdatedUIState", m_strUpdatedUIState); + m_strUpToDate = TryGetEx(dictNew, "UpToDate", m_strUpToDate); m_strUrl = TryGetEx(dictNew, "Url", m_strUrl); m_strUrlOpenDesc = TryGetEx(dictNew, "UrlOpenDesc", m_strUrlOpenDesc); m_strUrlOpenTitle = TryGetEx(dictNew, "UrlOpenTitle", m_strUrlOpenTitle); @@ -594,6 +621,7 @@ m_strUrlSchemeOverride = TryGetEx(dictNew, "UrlSchemeOverride", m_strUrlSchemeOverride); m_strUrlSchemeOverrides = TryGetEx(dictNew, "UrlSchemeOverrides", m_strUrlSchemeOverrides); m_strUseCustomToolStripRenderer = TryGetEx(dictNew, "UseCustomToolStripRenderer", m_strUseCustomToolStripRenderer); + m_strUseFileLocks = TryGetEx(dictNew, "UseFileLocks", m_strUseFileLocks); m_strUseTransactedDatabaseWrites = TryGetEx(dictNew, "UseTransactedDatabaseWrites", m_strUseTransactedDatabaseWrites); m_strUserAccount = TryGetEx(dictNew, "UserAccount", m_strUserAccount); m_strUserName = TryGetEx(dictNew, "UserName", m_strUserName); @@ -612,7 +640,6 @@ m_strWebBrowser = TryGetEx(dictNew, "WebBrowser", m_strWebBrowser); m_strWebSiteLogin = TryGetEx(dictNew, "WebSiteLogin", m_strWebSiteLogin); m_strWebSites = TryGetEx(dictNew, "WebSites", m_strWebSites); - m_strWebsiteVisitQuestion = TryGetEx(dictNew, "WebsiteVisitQuestion", m_strWebsiteVisitQuestion); m_strWindowsFavorites = TryGetEx(dictNew, "WindowsFavorites", m_strWindowsFavorites); m_strWindowsOS = TryGetEx(dictNew, "WindowsOS", m_strWindowsOS); m_strWithoutContext = TryGetEx(dictNew, "WithoutContext", m_strWithoutContext); @@ -628,7 +655,6 @@ "Action", "ActivateDatabaseTab", "AddEntry", - "AddEntryBtn", "AddEntryDesc", "AddStringField", "AddStringFieldDesc", @@ -673,6 +699,8 @@ "AutoTypeEntrySelectionDescShort", "AutoTypeGlobalHint", "AutoTypeMatchByTitle", + "AutoTypeMatchByUrlHostInTitle", + "AutoTypeMatchByUrlInTitle", "AutoTypeObfuscationHint", "AutoTypePrependInitSeqForIE", "AutoTypeReleaseAltWithKeyPress", @@ -681,22 +709,24 @@ "AutoTypeUnknownPlaceholder", "AutoTypeXDoToolRequired", "AutoTypeXDoToolRequiredGlobalVer", + "Available", "AvailableLanguages", "BackgroundColor", "BinaryNoConv", "Bits", "Bold", "Browser", + "BuiltIn", "ButtonBack", "ButtonFinish", "ButtonNext", "Cancel", + "CancelCmd", "CannotMoveEntriesBcsGroup", "ChangeMasterKey", "ChangeMasterKeyIntroShort", "CheckForUpdAtStart", - "ChkForUpdGotLatest", - "ChkForUpdNewVersion", + "CheckingForUpd", "ClearKeyCmdLineParams", "ClearMru", "Clipboard", @@ -707,9 +737,10 @@ "CloseButton", "CloseButtonMinimizes", "Column", + "Columns", "Company", "Comparison", - "Components", + "Component", "Condition", "ConfigAffectAdmin", "ConfigAffectUser", @@ -728,6 +759,7 @@ "CopiedEntryData", "Copy", "CopyAll", + "CopyLink", "CopyOfItem", "CopyPasswordFull", "CopyPasswordMenu", @@ -777,11 +809,11 @@ "Description", "Details", "DialogNoShowAgain", + "Disable", "Disabled", "DisableSaveIfNotModified", - "DiscardChanges", + "DiscardChangesCmd", "DocumentationHint", - "DontDeleteCmd", "DragDrop", "DropToBackOnCopy", "DuplicateStringFieldName", @@ -799,6 +831,7 @@ "EmptyMasterPwHint", "EmptyMasterPwQuestion", "EmptyRecycleBinQuestion", + "Enable", "Enabled", "Encoding", "EncodingAnsi", @@ -811,8 +844,6 @@ "Entry", "EntryList", "EntryListAutoResizeColumns", - "EntryView", - "EntryViewHideProtectedCustomStrings", "EnvironmentVariable", "EqualsOp", "ErrorCode", @@ -875,8 +906,9 @@ "FileVerifyHashFailRec", "Filter", "Find", + "FocusQuickFindOnRestore", "FocusQuickFindOnUntray", - "FocusResultsAfterQuickFind", + "FocusResultsAfterQuickSearch", "Folder", "Font", "ForceSystemFontUnix", @@ -927,9 +959,10 @@ "ImportingStatusMsg", "ImportMustRead", "ImportMustReadQuestion", + "IncompatibleWithSorting", "InheritSettingFromParent", + "Installed", "Internet", - "InvalidFileStructure", "InvalidKey", "InvalidUrl", "InvalidUserPassword", @@ -945,7 +978,9 @@ "KeyboardKeyAlt", "KeyboardKeyCtrl", "KeyboardKeyCtrlLeft", + "KeyboardKeyEsc", "KeyboardKeyModifiers", + "KeyboardKeyReturn", "KeyboardKeyShift", "KeyboardKeyShiftLeft", "KeyChanged", @@ -955,9 +990,8 @@ "KeyFiles", "KeyFileSelect", "KeyFileUseExisting", - "KeyProvWithGuiOnSD", - "KeyProvWithGuiOnSDHint", - "KeystrokeSequence", + "KeyProvIncmpWithSD", + "KeyProvIncmpWithSDHint", "LanguageSelected", "LastAccessTime", "LastModificationTime", @@ -997,6 +1031,7 @@ "NewerNetRequired", "NewGroup", "NewState", + "NewVersionAvailable", "No", "NoFileAccessRead", "NoKeyFileSpecifiedMeta", @@ -1019,10 +1054,13 @@ "OpenDatabaseFileStc", "OpenedDatabaseFile", "OpeningDatabase", + "OpenWith", "OptimizeForScreenReader", "Options", "OptionsDesc", "OtherPlaceholders", + "OverridesBuiltIn", + "OverridesCustom", "Overwrite", "OverwriteExistingFileQuestion", "PackageInstallHint", @@ -1064,16 +1102,20 @@ "PolicyNewDatabaseDesc", "PolicyPluginsDesc", "PolicyPrintDesc", + "PolicyPrintNoKeyDesc", "PolicyRequiredFlag", "PolicySaveDatabaseDesc", "PolicyTriggersEditDesc", + "PreReleaseVersion", "Print", "PrintDesc", - "QuickSearch", - "QuickSearchExcludeExpired", - "QuickSearchInPasswords", + "QuickSearchExclExpired", + "QuickSearchInPwFields", + "QuickSearchDerefData", + "QuickSearchTb", "RandomMacAddress", "Ready", + "Recommended", "RecycleBin", "RecycleBinCollapse", "Redo", @@ -1083,6 +1125,7 @@ "RepairMode", "RestartKeePassQuestion", "RootDirectory", + "SameKeybLayout", "SampleEntry", "Save", "SaveBeforeCloseQuestion", @@ -1097,6 +1140,7 @@ "Search", "SearchDesc", "SearchGroupName", + "SearchingOp", "SearchItemsFoundSmall", "SearchKeyFiles", "SearchKeyFilesAlsoOnRemovable", @@ -1108,19 +1152,22 @@ "SelectAll", "SelectColor", "SelectDifferentGroup", + "SelectedColumn", "SelectedLower", "SelectFile", "SelectIcon", "SelectLanguage", "SelectLanguageDesc", "SelfTestFailed", - "ShowAllEntries", + "Sequence", + "ShowDerefData", + "ShowDerefDataAsync", "ShowEntries", - "ShowExpiredEntries", "ShowFullPathInTitleBar", "ShowIn", "ShowTrayOnlyIfTrayed", "Size", + "Slow", "SoonToExpireEntries", "SpecialKeys", "StandardExpireSelect", @@ -1128,6 +1175,7 @@ "StartAndExit", "StartMinimizedAndLocked", "StartsWith", + "Status", "Strikeout", "String", "Success", @@ -1181,9 +1229,15 @@ "UnhideSourceCharactersToo", "Unknown", "UnknownError", - "UnknownFileVersion", - "UpdateCheckingFailed", + "UpdateCheck", + "UpdateCheckEnableQ", + "UpdateCheckFailedNoDl", + "UpdateCheckInfo", + "UpdateCheckInfoPriv", + "UpdateCheckInfoRes", + "UpdateCheckResults", "UpdatedUIState", + "UpToDate", "Url", "UrlOpenDesc", "UrlOpenTitle", @@ -1193,6 +1247,7 @@ "UrlSchemeOverride", "UrlSchemeOverrides", "UseCustomToolStripRenderer", + "UseFileLocks", "UseTransactedDatabaseWrites", "UserAccount", "UserName", @@ -1211,7 +1266,6 @@ "WebBrowser", "WebSiteLogin", "WebSites", - "WebsiteVisitQuestion", "WindowsFavorites", "WindowsOS", "WithoutContext", @@ -1261,17 +1315,6 @@ get { return m_strAddEntry; } } - private static string m_strAddEntryBtn = - @"Add Entry..."; - /// - /// Look up a localized string similar to - /// 'Add Entry...'. - /// - public static string AddEntryBtn - { - get { return m_strAddEntryBtn; } - } - private static string m_strAddEntryDesc = @"Create a new password entry."; /// @@ -1756,6 +1799,28 @@ get { return m_strAutoTypeMatchByTitle; } } + private static string m_strAutoTypeMatchByUrlHostInTitle = + @"An entry matches if the host component of its URL is contained in the target window title"; + /// + /// Look up a localized string similar to + /// 'An entry matches if the host component of its URL is contained in the target window title'. + /// + public static string AutoTypeMatchByUrlHostInTitle + { + get { return m_strAutoTypeMatchByUrlHostInTitle; } + } + + private static string m_strAutoTypeMatchByUrlInTitle = + @"An entry matches if its URL is contained in the target window title"; + /// + /// Look up a localized string similar to + /// 'An entry matches if its URL is contained in the target window title'. + /// + public static string AutoTypeMatchByUrlInTitle + { + get { return m_strAutoTypeMatchByUrlInTitle; } + } + private static string m_strAutoTypeObfuscationHint = @"Auto-type obfuscation may not work with all windows."; /// @@ -1844,6 +1909,17 @@ get { return m_strAutoTypeXDoToolRequiredGlobalVer; } } + private static string m_strAvailable = + @"Available"; + /// + /// Look up a localized string similar to + /// 'Available'. + /// + public static string Available + { + get { return m_strAvailable; } + } + private static string m_strAvailableLanguages = @"Available Languages"; /// @@ -1910,6 +1986,17 @@ get { return m_strBrowser; } } + private static string m_strBuiltIn = + @"built-in"; + /// + /// Look up a localized string similar to + /// 'built-in'. + /// + public static string BuiltIn + { + get { return m_strBuiltIn; } + } + private static string m_strButtonBack = @"< &Back"; /// @@ -1954,6 +2041,17 @@ get { return m_strCancel; } } + private static string m_strCancelCmd = + @"&Cancel"; + /// + /// Look up a localized string similar to + /// '&Cancel'. + /// + public static string CancelCmd + { + get { return m_strCancelCmd; } + } + private static string m_strCannotMoveEntriesBcsGroup = @"Cannot move entries because they aren't stored in the same group."; /// @@ -1998,26 +2096,15 @@ get { return m_strCheckForUpdAtStart; } } - private static string m_strChkForUpdGotLatest = - @"You have the latest version."; + private static string m_strCheckingForUpd = + @"Checking for updates"; /// /// Look up a localized string similar to - /// 'You have the latest version.'. + /// 'Checking for updates'. /// - public static string ChkForUpdGotLatest + public static string CheckingForUpd { - get { return m_strChkForUpdGotLatest; } - } - - private static string m_strChkForUpdNewVersion = - @"New KeePass version available!"; - /// - /// Look up a localized string similar to - /// 'New KeePass version available!'. - /// - public static string ChkForUpdNewVersion - { - get { return m_strChkForUpdNewVersion; } + get { return m_strCheckingForUpd; } } private static string m_strClearKeyCmdLineParams = @@ -2130,6 +2217,17 @@ get { return m_strColumn; } } + private static string m_strColumns = + @"Columns"; + /// + /// Look up a localized string similar to + /// 'Columns'. + /// + public static string Columns + { + get { return m_strColumns; } + } + private static string m_strCompany = @"Company"; /// @@ -2152,15 +2250,15 @@ get { return m_strComparison; } } - private static string m_strComponents = - @"Components"; + private static string m_strComponent = + @"Component"; /// /// Look up a localized string similar to - /// 'Components'. + /// 'Component'. /// - public static string Components + public static string Component { - get { return m_strComponents; } + get { return m_strComponent; } } private static string m_strCondition = @@ -2361,6 +2459,17 @@ get { return m_strCopyAll; } } + private static string m_strCopyLink = + @"Copy Link"; + /// + /// Look up a localized string similar to + /// 'Copy Link'. + /// + public static string CopyLink + { + get { return m_strCopyLink; } + } + private static string m_strCopyOfItem = @"Copy"; /// @@ -2900,6 +3009,17 @@ get { return m_strDialogNoShowAgain; } } + private static string m_strDisable = + @"Disable"; + /// + /// Look up a localized string similar to + /// 'Disable'. + /// + public static string Disable + { + get { return m_strDisable; } + } + private static string m_strDisabled = @"Disabled"; /// @@ -2922,15 +3042,15 @@ get { return m_strDisableSaveIfNotModified; } } - private static string m_strDiscardChanges = - @"Discard changes"; + private static string m_strDiscardChangesCmd = + @"&Discard changes"; /// /// Look up a localized string similar to - /// 'Discard changes'. + /// '&Discard changes'. /// - public static string DiscardChanges + public static string DiscardChangesCmd { - get { return m_strDiscardChanges; } + get { return m_strDiscardChangesCmd; } } private static string m_strDocumentationHint = @@ -2944,17 +3064,6 @@ get { return m_strDocumentationHint; } } - private static string m_strDontDeleteCmd = - @"Do&n't delete"; - /// - /// Look up a localized string similar to - /// 'Do&n't delete'. - /// - public static string DontDeleteCmd - { - get { return m_strDontDeleteCmd; } - } - private static string m_strDragDrop = @"Drag&Drop"; /// @@ -3142,6 +3251,17 @@ get { return m_strEmptyRecycleBinQuestion; } } + private static string m_strEnable = + @"Enable"; + /// + /// Look up a localized string similar to + /// 'Enable'. + /// + public static string Enable + { + get { return m_strEnable; } + } + private static string m_strEnabled = @"Enabled"; /// @@ -3274,28 +3394,6 @@ get { return m_strEntryListAutoResizeColumns; } } - private static string m_strEntryView = - @"Entry View"; - /// - /// Look up a localized string similar to - /// 'Entry View'. - /// - public static string EntryView - { - get { return m_strEntryView; } - } - - private static string m_strEntryViewHideProtectedCustomStrings = - @"Hide in-memory protected custom strings using asterisks"; - /// - /// Look up a localized string similar to - /// 'Hide in-memory protected custom strings using asterisks'. - /// - public static string EntryViewHideProtectedCustomStrings - { - get { return m_strEntryViewHideProtectedCustomStrings; } - } - private static string m_strEnvironmentVariable = @"Environment variable"; /// @@ -3978,6 +4076,17 @@ get { return m_strFind; } } + private static string m_strFocusQuickFindOnRestore = + @"Focus quick search box when restoring from taskbar"; + /// + /// Look up a localized string similar to + /// 'Focus quick search box when restoring from taskbar'. + /// + public static string FocusQuickFindOnRestore + { + get { return m_strFocusQuickFindOnRestore; } + } + private static string m_strFocusQuickFindOnUntray = @"Focus quick search box when restoring from tray"; /// @@ -3989,15 +4098,15 @@ get { return m_strFocusQuickFindOnUntray; } } - private static string m_strFocusResultsAfterQuickFind = - @"Focus entry list after a successful quick search (toolbar)"; + private static string m_strFocusResultsAfterQuickSearch = + @"Focus entry list after a successful quick search"; /// /// Look up a localized string similar to - /// 'Focus entry list after a successful quick search (toolbar)'. + /// 'Focus entry list after a successful quick search'. /// - public static string FocusResultsAfterQuickFind + public static string FocusResultsAfterQuickSearch { - get { return m_strFocusResultsAfterQuickFind; } + get { return m_strFocusResultsAfterQuickSearch; } } private static string m_strFolder = @@ -4550,6 +4659,17 @@ get { return m_strImportMustReadQuestion; } } + private static string m_strIncompatibleWithSorting = + @"incompatible with sorting"; + /// + /// Look up a localized string similar to + /// 'incompatible with sorting'. + /// + public static string IncompatibleWithSorting + { + get { return m_strIncompatibleWithSorting; } + } + private static string m_strInheritSettingFromParent = @"Inherit setting from parent"; /// @@ -4561,26 +4681,26 @@ get { return m_strInheritSettingFromParent; } } - private static string m_strInternet = - @"Internet"; + private static string m_strInstalled = + @"Installed"; /// /// Look up a localized string similar to - /// 'Internet'. + /// 'Installed'. /// - public static string Internet + public static string Installed { - get { return m_strInternet; } + get { return m_strInstalled; } } - private static string m_strInvalidFileStructure = - @"Invalid file structure!"; + private static string m_strInternet = + @"Internet"; /// /// Look up a localized string similar to - /// 'Invalid file structure!'. + /// 'Internet'. /// - public static string InvalidFileStructure + public static string Internet { - get { return m_strInvalidFileStructure; } + get { return m_strInternet; } } private static string m_strInvalidKey = @@ -4748,6 +4868,17 @@ get { return m_strKeyboardKeyCtrlLeft; } } + private static string m_strKeyboardKeyEsc = + @"Esc"; + /// + /// Look up a localized string similar to + /// 'Esc'. + /// + public static string KeyboardKeyEsc + { + get { return m_strKeyboardKeyEsc; } + } + private static string m_strKeyboardKeyModifiers = @"Key Modifiers"; /// @@ -4759,6 +4890,17 @@ get { return m_strKeyboardKeyModifiers; } } + private static string m_strKeyboardKeyReturn = + @"Return"; + /// + /// Look up a localized string similar to + /// 'Return'. + /// + public static string KeyboardKeyReturn + { + get { return m_strKeyboardKeyReturn; } + } + private static string m_strKeyboardKeyShift = @"Shift"; /// @@ -4858,37 +5000,26 @@ get { return m_strKeyFileUseExisting; } } - private static string m_strKeyProvWithGuiOnSD = - @"The selected key provider cannot be used, because it might try to show a dialog and this isn't allowed on a secure desktop."; + private static string m_strKeyProvIncmpWithSD = + @"The selected key provider cannot be used, because it is incompatible with the secure desktop."; /// /// Look up a localized string similar to - /// 'The selected key provider cannot be used, because it might try to show a dialog and this isn't allowed on a secure desktop.'. + /// 'The selected key provider cannot be used, because it is incompatible with the secure desktop.'. /// - public static string KeyProvWithGuiOnSD + public static string KeyProvIncmpWithSD { - get { return m_strKeyProvWithGuiOnSD; } + get { return m_strKeyProvIncmpWithSD; } } - private static string m_strKeyProvWithGuiOnSDHint = + private static string m_strKeyProvIncmpWithSDHint = @"If you want to use the selected key provider, you have to disable the secure desktop option in 'Tools' -> 'Options' -> tab 'Security'."; /// /// Look up a localized string similar to /// 'If you want to use the selected key provider, you have to disable the secure desktop option in 'Tools' -> 'Options' -> tab 'Security'.'. /// - public static string KeyProvWithGuiOnSDHint - { - get { return m_strKeyProvWithGuiOnSDHint; } - } - - private static string m_strKeystrokeSequence = - @"Keystroke Sequence"; - /// - /// Look up a localized string similar to - /// 'Keystroke Sequence'. - /// - public static string KeystrokeSequence + public static string KeyProvIncmpWithSDHint { - get { return m_strKeystrokeSequence; } + get { return m_strKeyProvIncmpWithSDHint; } } private static string m_strLanguageSelected = @@ -5320,6 +5451,17 @@ get { return m_strNewState; } } + private static string m_strNewVersionAvailable = + @"New version available"; + /// + /// Look up a localized string similar to + /// 'New version available'. + /// + public static string NewVersionAvailable + { + get { return m_strNewVersionAvailable; } + } + private static string m_strNo = @"No"; /// @@ -5562,6 +5704,17 @@ get { return m_strOpeningDatabase; } } + private static string m_strOpenWith = + @"Open with {PARAM}"; + /// + /// Look up a localized string similar to + /// 'Open with {PARAM}'. + /// + public static string OpenWith + { + get { return m_strOpenWith; } + } + private static string m_strOptimizeForScreenReader = @"Optimize for screen reader (only enable if you're using a screen reader)"; /// @@ -5606,6 +5759,28 @@ get { return m_strOtherPlaceholders; } } + private static string m_strOverridesBuiltIn = + @"Built-In Overrides"; + /// + /// Look up a localized string similar to + /// 'Built-In Overrides'. + /// + public static string OverridesBuiltIn + { + get { return m_strOverridesBuiltIn; } + } + + private static string m_strOverridesCustom = + @"Custom Overrides"; + /// + /// Look up a localized string similar to + /// 'Custom Overrides'. + /// + public static string OverridesCustom + { + get { return m_strOverridesCustom; } + } + private static string m_strOverwrite = @"Overwrite"; /// @@ -6057,6 +6232,17 @@ get { return m_strPolicyPrintDesc; } } + private static string m_strPolicyPrintNoKeyDesc = + @"Do not require entering current master key before printing."; + /// + /// Look up a localized string similar to + /// 'Do not require entering current master key before printing.'. + /// + public static string PolicyPrintNoKeyDesc + { + get { return m_strPolicyPrintNoKeyDesc; } + } + private static string m_strPolicyRequiredFlag = @"The following policy flag is required"; /// @@ -6090,6 +6276,17 @@ get { return m_strPolicyTriggersEditDesc; } } + private static string m_strPreReleaseVersion = + @"Pre-release version"; + /// + /// Look up a localized string similar to + /// 'Pre-release version'. + /// + public static string PreReleaseVersion + { + get { return m_strPreReleaseVersion; } + } + private static string m_strPrint = @"Print"; /// @@ -6112,37 +6309,48 @@ get { return m_strPrintDesc; } } - private static string m_strQuickSearch = - @"Quick Search"; + private static string m_strQuickSearchExclExpired = + @"Exclude expired entries in quick searches"; + /// + /// Look up a localized string similar to + /// 'Exclude expired entries in quick searches'. + /// + public static string QuickSearchExclExpired + { + get { return m_strQuickSearchExclExpired; } + } + + private static string m_strQuickSearchInPwFields = + @"Search for passwords in quick searches"; /// /// Look up a localized string similar to - /// 'Quick Search'. + /// 'Search for passwords in quick searches'. /// - public static string QuickSearch + public static string QuickSearchInPwFields { - get { return m_strQuickSearch; } + get { return m_strQuickSearchInPwFields; } } - private static string m_strQuickSearchExcludeExpired = - @"Exclude expired entries in quick searches (toolbar)"; + private static string m_strQuickSearchDerefData = + @"Resolve field references in quick searches"; /// /// Look up a localized string similar to - /// 'Exclude expired entries in quick searches (toolbar)'. + /// 'Resolve field references in quick searches'. /// - public static string QuickSearchExcludeExpired + public static string QuickSearchDerefData { - get { return m_strQuickSearchExcludeExpired; } + get { return m_strQuickSearchDerefData; } } - private static string m_strQuickSearchInPasswords = - @"Search for passwords in quick searches (toolbar)"; + private static string m_strQuickSearchTb = + @"Quick Search (Toolbar)"; /// /// Look up a localized string similar to - /// 'Search for passwords in quick searches (toolbar)'. + /// 'Quick Search (Toolbar)'. /// - public static string QuickSearchInPasswords + public static string QuickSearchTb { - get { return m_strQuickSearchInPasswords; } + get { return m_strQuickSearchTb; } } private static string m_strRandomMacAddress = @@ -6167,6 +6375,17 @@ get { return m_strReady; } } + private static string m_strRecommended = + @"recommended"; + /// + /// Look up a localized string similar to + /// 'recommended'. + /// + public static string Recommended + { + get { return m_strRecommended; } + } + private static string m_strRecycleBin = @"Recycle Bin"; /// @@ -6266,6 +6485,17 @@ get { return m_strRootDirectory; } } + private static string m_strSameKeybLayout = + @"Ensure same keyboard layouts during auto-type"; + /// + /// Look up a localized string similar to + /// 'Ensure same keyboard layouts during auto-type'. + /// + public static string SameKeybLayout + { + get { return m_strSameKeybLayout; } + } + private static string m_strSampleEntry = @"Sample Entry"; /// @@ -6420,6 +6650,17 @@ get { return m_strSearchGroupName; } } + private static string m_strSearchingOp = + @"Searching"; + /// + /// Look up a localized string similar to + /// 'Searching'. + /// + public static string SearchingOp + { + get { return m_strSearchingOp; } + } + private static string m_strSearchItemsFoundSmall = @"entries found."; /// @@ -6541,6 +6782,17 @@ get { return m_strSelectDifferentGroup; } } + private static string m_strSelectedColumn = + @"Selected column"; + /// + /// Look up a localized string similar to + /// 'Selected column'. + /// + public static string SelectedColumn + { + get { return m_strSelectedColumn; } + } + private static string m_strSelectedLower = @"selected"; /// @@ -6607,37 +6859,48 @@ get { return m_strSelfTestFailed; } } - private static string m_strShowAllEntries = - @"Show All Entries"; + private static string m_strSequence = + @"Sequence"; /// /// Look up a localized string similar to - /// 'Show All Entries'. + /// 'Sequence'. /// - public static string ShowAllEntries + public static string Sequence { - get { return m_strShowAllEntries; } + get { return m_strSequence; } } - private static string m_strShowEntries = - @"Show Entries"; + private static string m_strShowDerefData = + @"Show dereferenced data"; /// /// Look up a localized string similar to - /// 'Show Entries'. + /// 'Show dereferenced data'. /// - public static string ShowEntries + public static string ShowDerefData { - get { return m_strShowEntries; } + get { return m_strShowDerefData; } } - private static string m_strShowExpiredEntries = - @"Show Expired Entries"; + private static string m_strShowDerefDataAsync = + @"Show dereferenced data asynchronously"; /// /// Look up a localized string similar to - /// 'Show Expired Entries'. + /// 'Show dereferenced data asynchronously'. /// - public static string ShowExpiredEntries + public static string ShowDerefDataAsync { - get { return m_strShowExpiredEntries; } + get { return m_strShowDerefDataAsync; } + } + + private static string m_strShowEntries = + @"Show Entries"; + /// + /// Look up a localized string similar to + /// 'Show Entries'. + /// + public static string ShowEntries + { + get { return m_strShowEntries; } } private static string m_strShowFullPathInTitleBar = @@ -6684,6 +6947,17 @@ get { return m_strSize; } } + private static string m_strSlow = + @"slow"; + /// + /// Look up a localized string similar to + /// 'slow'. + /// + public static string Slow + { + get { return m_strSlow; } + } + private static string m_strSoonToExpireEntries = @"Expired Entries and Entries That Will Expire Soon"; /// @@ -6761,6 +7035,17 @@ get { return m_strStartsWith; } } + private static string m_strStatus = + @"Status"; + /// + /// Look up a localized string similar to + /// 'Status'. + /// + public static string Status + { + get { return m_strStatus; } + } + private static string m_strStrikeout = @"Strikeout"; /// @@ -7301,10 +7586,10 @@ } private static string m_strUnhidePasswordsDesc = - @"Allow displaying passwords as plain text."; + @"Allow displaying passwords as plain-text."; /// /// Look up a localized string similar to - /// 'Allow displaying passwords as plain text.'. + /// 'Allow displaying passwords as plain-text.'. /// public static string UnhidePasswordsDesc { @@ -7344,26 +7629,81 @@ get { return m_strUnknownError; } } - private static string m_strUnknownFileVersion = - @"Unknown file version!"; + private static string m_strUpdateCheck = + @"Update Check"; + /// + /// Look up a localized string similar to + /// 'Update Check'. + /// + public static string UpdateCheck + { + get { return m_strUpdateCheck; } + } + + private static string m_strUpdateCheckEnableQ = + @"Enable automatic update check?"; + /// + /// Look up a localized string similar to + /// 'Enable automatic update check?'. + /// + public static string UpdateCheckEnableQ + { + get { return m_strUpdateCheckEnableQ; } + } + + private static string m_strUpdateCheckFailedNoDl = + @"Update check failed. Version information file cannot be downloaded."; + /// + /// Look up a localized string similar to + /// 'Update check failed. Version information file cannot be downloaded.'. + /// + public static string UpdateCheckFailedNoDl + { + get { return m_strUpdateCheckFailedNoDl; } + } + + private static string m_strUpdateCheckInfo = + @"KeePass can automatically check for updates on each program start."; + /// + /// Look up a localized string similar to + /// 'KeePass can automatically check for updates on each program start.'. + /// + public static string UpdateCheckInfo + { + get { return m_strUpdateCheckInfo; } + } + + private static string m_strUpdateCheckInfoPriv = + @"No personal information is sent to the KeePass server. KeePass just downloads a small version information file and compares the available version with the installed version."; /// /// Look up a localized string similar to - /// 'Unknown file version!'. + /// 'No personal information is sent to the KeePass server. KeePass just downloads a small version information file and compares the available version with the installed version.'. /// - public static string UnknownFileVersion + public static string UpdateCheckInfoPriv { - get { return m_strUnknownFileVersion; } + get { return m_strUpdateCheckInfoPriv; } } - private static string m_strUpdateCheckingFailed = - @"Update checking failed."; + private static string m_strUpdateCheckInfoRes = + @"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."; /// /// Look up a localized string similar to - /// 'Update checking failed.'. + /// '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.'. /// - public static string UpdateCheckingFailed + public static string UpdateCheckInfoRes { - get { return m_strUpdateCheckingFailed; } + get { return m_strUpdateCheckInfoRes; } + } + + private static string m_strUpdateCheckResults = + @"The results of the update check."; + /// + /// Look up a localized string similar to + /// 'The results of the update check.'. + /// + public static string UpdateCheckResults + { + get { return m_strUpdateCheckResults; } } private static string m_strUpdatedUIState = @@ -7377,6 +7717,17 @@ get { return m_strUpdatedUIState; } } + private static string m_strUpToDate = + @"Up to date"; + /// + /// Look up a localized string similar to + /// 'Up to date'. + /// + public static string UpToDate + { + get { return m_strUpToDate; } + } + private static string m_strUrl = @"URL"; /// @@ -7476,6 +7827,17 @@ get { return m_strUseCustomToolStripRenderer; } } + private static string m_strUseFileLocks = + @"Use database lock files"; + /// + /// Look up a localized string similar to + /// 'Use database lock files'. + /// + public static string UseFileLocks + { + get { return m_strUseFileLocks; } + } + private static string m_strUseTransactedDatabaseWrites = @"Use file transactions for writing databases"; /// @@ -7674,17 +8036,6 @@ get { return m_strWebSites; } } - private static string m_strWebsiteVisitQuestion = - @"Do you want to visit the KeePass website now?"; - /// - /// Look up a localized string similar to - /// 'Do you want to visit the KeePass website now?'. - /// - public static string WebsiteVisitQuestion - { - get { return m_strWebsiteVisitQuestion; } - } - private static string m_strWindowsFavorites = @"Windows Favorites"; /// Binary files /tmp/5s8pt3vrtI/keepass2-2.16+dfsg/KeePass/Resources/Nuvola_Derived/B16x16_EditCopyLink.png and /tmp/MZd7WL3rPq/keepass2-2.18+dfsg/KeePass/Resources/Nuvola_Derived/B16x16_EditCopyLink.png differ diff -Nru keepass2-2.16+dfsg/KeePass/UI/AsyncPwListUpdate.cs keepass2-2.18+dfsg/KeePass/UI/AsyncPwListUpdate.cs --- keepass2-2.16+dfsg/KeePass/UI/AsyncPwListUpdate.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/AsyncPwListUpdate.cs 2012-01-01 12:02:36.000000000 +0000 @@ -0,0 +1,265 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2012 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.Windows.Forms; +using System.Threading; +using System.Diagnostics; + +using KeePass.Forms; +using KeePass.Util.Spr; + +using KeePassLib; + +namespace KeePass.UI +{ + public sealed class PwListItem + { + private static long m_idNext = 1; + + private readonly PwEntry m_pe; + public PwEntry Entry + { + get { return m_pe; } + } + + private readonly long m_id; + public long ListViewItemID + { + get { return m_id; } + } + + public PwListItem(PwEntry pe) + { + if(pe == null) throw new ArgumentNullException("pe"); + + m_pe = pe; + + m_id = m_idNext; + unchecked { ++m_idNext; } + } + } + + public delegate string PwTextUpdateDelegate(string strText, PwListItem li); + + public sealed class AsyncPwListUpdate + { + private readonly ListView m_lv; + + private object m_objListEditSync = new object(); + public object ListEditSyncObject + { + get { return m_objListEditSync; } + } + + private Dictionary m_dValidIDs = new Dictionary(); + private object m_objValidIDsSync = new object(); + + private sealed class LviUpdInfo + { + public ListView ListView { get; set; } + + public long UpdateID { get; set; } + + public string Text { get; set; } + public PwListItem ListItem { get; set; } + public int IndexHint { get; set; } + public int SubItem { get; set; } + + public PwTextUpdateDelegate Function { get; set; } + + public object ListEditSyncObject { get; set; } + + public object ValidIDsSyncObject { get; set; } + public Dictionary ValidIDs { get; set; } + } + + public AsyncPwListUpdate(ListView lv) + { + if(lv == null) throw new ArgumentNullException("lv"); + + m_lv = lv; + } + + public void Queue(string strText, PwListItem li, int iIndexHint, + int iSubItem, PwTextUpdateDelegate f) + { + if(strText == null) { Debug.Assert(false); return; } + if(li == null) { Debug.Assert(false); return; } + if(iSubItem < 0) { Debug.Assert(false); return; } + if(f == null) { Debug.Assert(false); return; } + + LviUpdInfo state = new LviUpdInfo(); + state.ListView = m_lv; + state.UpdateID = unchecked((li.ListViewItemID << 6) + iSubItem); + state.Text = strText; + state.ListItem = li; + state.IndexHint = ((iIndexHint >= 0) ? iIndexHint : 0); + state.SubItem = iSubItem; + state.Function = f; + state.ListEditSyncObject = m_objListEditSync; + state.ValidIDsSyncObject = m_objValidIDsSync; + state.ValidIDs = m_dValidIDs; + + lock(m_objValidIDsSync) + { + Debug.Assert(!m_dValidIDs.ContainsKey(state.UpdateID)); + m_dValidIDs[state.UpdateID] = true; + } + + try + { + if(!ThreadPool.QueueUserWorkItem(new WaitCallback(UpdateItemFn), + state)) throw new InvalidOperationException(); + } + catch(Exception) + { + Debug.Assert(false); + lock(m_objValidIDsSync) { m_dValidIDs.Remove(state.UpdateID); } + } + } + + /// + /// Cancel all pending updates. This method is asynchronous, + /// i.e. it returns immediately and the number of queued + /// updates will decrease continually. + /// + public void CancelPendingUpdatesAsync() + { + lock(m_objValidIDsSync) + { + List vKeys = new List(m_dValidIDs.Keys); + foreach(long lKey in vKeys) + { + m_dValidIDs[lKey] = false; + } + } + } + + public void WaitAll() + { + while(true) + { + lock(m_objValidIDsSync) + { + if(m_dValidIDs.Count == 0) break; + } + + Thread.Sleep(4); + Application.DoEvents(); + } + } + + private static void UpdateItemFn(object state) + { + LviUpdInfo lui = (state as LviUpdInfo); + if(lui == null) { Debug.Assert(false); return; } + + try // Avoid cross-thread exceptions + { + bool bWork; + lock(lui.ValidIDsSyncObject) + { + if(!lui.ValidIDs.TryGetValue(lui.UpdateID, + out bWork)) { Debug.Assert(false); return; } + } + + if(bWork) + { + string strNew = lui.Function(lui.Text, lui.ListItem); + if(strNew == null) { Debug.Assert(false); return; } + if(strNew == lui.Text) return; + + // if(lui.ListView.InvokeRequired) + lui.ListView.Invoke(new SetItemTextDelegate( + SetItemText), new object[] { strNew, lui }); + // else SetItemText(strNew, lui); + } + } + catch(Exception) { Debug.Assert(false); } + finally + { + try // Avoid cross-thread exceptions + { + lock(lui.ValidIDsSyncObject) + { + if(!lui.ValidIDs.Remove(lui.UpdateID)) { Debug.Assert(false); } + } + } + catch(Exception) { Debug.Assert(false); } + } + } + + private delegate void SetItemTextDelegate(string strText, LviUpdInfo lui); + + private static void SetItemText(string strText, LviUpdInfo lui) + { + try // Avoid cross-thread exceptions + { + long lTargetID = lui.ListItem.ListViewItemID; + int iIndexHint = lui.IndexHint; + + lock(lui.ListEditSyncObject) + { + ListView.ListViewItemCollection lvic = lui.ListView.Items; + int nCount = lvic.Count; + + // for(int i = 0; i < nCount; ++i) + for(int i = nCount; i > 0; --i) + { + int j = ((iIndexHint + i) % nCount); + ListViewItem lvi = lvic[j]; + + PwListItem li = (lvi.Tag as PwListItem); + if(li == null) { Debug.Assert(false); continue; } + + if(li.ListViewItemID != lTargetID) continue; + + lvi.SubItems[lui.SubItem].Text = strText; + break; + } + } + } + catch(Exception) { Debug.Assert(false); } + } + + internal static string SprCompileFn(string strText, PwListItem li) + { + string strCmp = null; + + while(strCmp == null) + { + try + { + strCmp = SprEngine.Compile(strText, MainForm.GetEntryListSprContext( + li.Entry, Program.MainForm.DocumentManager.SafeFindContainerOf( + li.Entry))); + } + catch(InvalidOperationException) { } // Probably collection changed + catch(NullReferenceException) { } // Objects disposed already + catch(Exception) { Debug.Assert(false); } + } + + if(strCmp == strText) return strText; + return (strCmp + " - " + strText); + } + } +} diff -Nru keepass2-2.16+dfsg/KeePass/UI/BackgroundForm.cs keepass2-2.18+dfsg/KeePass/UI/BackgroundForm.cs --- keepass2-2.16+dfsg/KeePass/UI/BackgroundForm.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/BackgroundForm.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/BannerFactory.cs keepass2-2.18+dfsg/KeePass/UI/BannerFactory.cs --- keepass2-2.16+dfsg/KeePass/UI/BannerFactory.cs 2011-07-12 07:40:34.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/BannerFactory.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -68,7 +68,8 @@ public static class BannerFactory { - private static Dictionary m_vImageCache = new Dictionary(); + private static Dictionary m_vImageCache = + new Dictionary(); private const int MaxCachedImages = 32; private static BfBannerGenerator m_pCustomGen = null; @@ -81,6 +82,12 @@ public static Image CreateBanner(int nWidth, int nHeight, BannerStyle bs, Image imgIcon, string strTitle, string strLine) { + return CreateBanner(nWidth, nHeight, bs, imgIcon, strTitle, strLine, false); + } + + public static Image CreateBanner(int nWidth, int nHeight, BannerStyle bs, + Image imgIcon, string strTitle, string strLine, bool bNoCache) + { // imgIcon may be null. Debug.Assert(strTitle != null); if(strTitle == null) throw new ArgumentNullException("strTitle"); Debug.Assert(strLine != null); if(strLine == null) throw new ArgumentNullException("strLine"); @@ -99,11 +106,11 @@ strImageID += ":" + ((uint)bs).ToString(); - // Try getting the banner from the banner cache. - Image img; - if(m_vImageCache.TryGetValue(strImageID, out img)) return img; + // Try getting the banner from the banner cache + Image img = null; + if(!bNoCache && m_vImageCache.TryGetValue(strImageID, out img)) + return img; - Debug.Assert(img == null); if(m_pCustomGen != null) img = m_pCustomGen(new BfBannerInfo(nWidth, nHeight, bs, imgIcon, strTitle, strLine)); @@ -283,17 +290,20 @@ g.Dispose(); } - if(m_vImageCache.Count >= MaxCachedImages) + if(!bNoCache) { - foreach(string strKey in m_vImageCache.Keys) + if(m_vImageCache.Count >= MaxCachedImages) { - m_vImageCache.Remove(strKey); - break; // Remove first item only + foreach(string strKey in m_vImageCache.Keys) + { + m_vImageCache.Remove(strKey); + break; // Remove first item only + } } - } - // Save in cache - m_vImageCache[strImageID] = img; + // Save in cache + m_vImageCache[strImageID] = img; + } return img; } @@ -324,14 +334,45 @@ public static void CreateBannerEx(Form f, PictureBox picBox, Image imgIcon, string strTitle, string strLine) { + CreateBannerEx(f, picBox, imgIcon, strTitle, strLine, false); + } + + public static void CreateBannerEx(Form f, PictureBox picBox, Image imgIcon, + string strTitle, string strLine, bool bNoCache) + { if(picBox == null) { Debug.Assert(false); return; } try { picBox.Image = CreateBanner(picBox.Width, picBox.Height, - BannerStyle.Default, imgIcon, strTitle, strLine); + BannerStyle.Default, imgIcon, strTitle, strLine, bNoCache); } catch(Exception) { Debug.Assert(false); } } + + /// + /// Update/create a dialog banner. This method is intended for + /// updating banners in resizable dialogs. The created banner + /// images bypass the cache of the factory and are disposed + /// when the dialog is resized (i.e. the caller shouldn't do + /// anything with the banner images). + /// + public static void UpdateBanner(Form f, PictureBox picBox, Image imgIcon, + string strTitle, string strLine, ref int nOldWidth) + { + int nWidth = picBox.Width; + if(nWidth != nOldWidth) + { + Image imgPrev = null; + if(nOldWidth >= 0) imgPrev = picBox.Image; + + BannerFactory.CreateBannerEx(f, picBox, imgIcon, strTitle, + strLine, true); + + if(imgPrev != null) imgPrev.Dispose(); // Release old banner + + nOldWidth = nWidth; + } + } } } diff -Nru keepass2-2.16+dfsg/KeePass/UI/CheckedLVItemDXList.cs keepass2-2.18+dfsg/KeePass/UI/CheckedLVItemDXList.cs --- keepass2-2.16+dfsg/KeePass/UI/CheckedLVItemDXList.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/CheckedLVItemDXList.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -30,22 +30,83 @@ namespace KeePass.UI { + public enum CheckItemLinkType + { + None = 0, + CheckedChecked, + UncheckedUnchecked, + CheckedUnchecked, + UncheckedChecked + } + public sealed class CheckedLVItemDXList { + private ListView m_lv; + private List m_vObjects = new List(); private List m_vProperties = new List(); private List m_vListViewItems = new List(); - public CheckedLVItemDXList() + private List m_vLinks = new List(); + + private sealed class CheckItemLink + { + private ListViewItem m_lvSource; + public ListViewItem Source { get { return m_lvSource; } } + + private ListViewItem m_lvTarget; + public ListViewItem Target { get { return m_lvTarget; } } + + private CheckItemLinkType m_t; + public CheckItemLinkType Type { get { return m_t; } } + + public CheckItemLink(ListViewItem lviSource, ListViewItem lviTarget, + CheckItemLinkType cilType) + { + m_lvSource = lviSource; + m_lvTarget = lviTarget; + m_t = cilType; + } + } + + public CheckedLVItemDXList(ListView lv) + { + if(lv == null) throw new ArgumentNullException("lv"); + + m_lv = lv; + m_lv.ItemChecked += this.OnItemCheckedChanged; + } + +#if DEBUG + ~CheckedLVItemDXList() + { + Debug.Assert(m_lv == null); // Release should have been called + } +#endif + + public void Release() { + if(m_lv == null) { Debug.Assert(false); return; } + + m_vObjects.Clear(); + m_vProperties.Clear(); + m_vListViewItems.Clear(); + m_vLinks.Clear(); + + m_lv.ItemChecked -= this.OnItemCheckedChanged; + m_lv = null; } public void UpdateData(bool bGuiToInternals) { + if(m_lv == null) { Debug.Assert(false); return; } + for(int i = 0; i < m_vObjects.Count; ++i) { object o = m_vObjects[i]; + Debug.Assert(m_vListViewItems[i].Index >= 0); + Debug.Assert(m_lv.Items.IndexOf(m_vListViewItems[i]) >= 0); if(bGuiToInternals) { bool bChecked = m_vListViewItems[i].Checked; @@ -60,18 +121,19 @@ } public ListViewItem CreateItem(object pContainer, string strPropertyName, - ListView lvList, ListViewGroup lvgContainer, string strDisplayString) + ListViewGroup lvgContainer, string strDisplayString) { if(pContainer == null) throw new ArgumentNullException("pContainer"); if(strPropertyName == null) throw new ArgumentNullException("strPropertyName"); if(strPropertyName.Length == 0) throw new ArgumentException(); - if(lvList == null) throw new ArgumentNullException("lvList"); if(strDisplayString == null) throw new ArgumentNullException("strDisplayString"); + if(m_lv == null) { Debug.Assert(false); return null; } + Type t = pContainer.GetType(); PropertyInfo pi = t.GetProperty(strPropertyName); if((pi == null) || (pi.PropertyType != typeof(bool)) || - (pi.CanRead == false) || (pi.CanWrite == false)) + !pi.CanRead || !pi.CanWrite) throw new ArgumentException(); ListViewItem lvi = new ListViewItem(strDisplayString); @@ -79,9 +141,10 @@ { lvi.Group = lvgContainer; Debug.Assert(lvgContainer.Items.IndexOf(lvi) >= 0); + Debug.Assert(m_lv.Groups.IndexOf(lvgContainer) >= 0); } - lvList.Items.Add(lvi); + m_lv.Items.Add(lvi); m_vObjects.Add(pContainer); m_vProperties.Add(pi); @@ -89,5 +152,49 @@ return lvi; } + + public void AddLink(ListViewItem lviSource, ListViewItem lviTarget, + CheckItemLinkType t) + { + if(lviSource == null) { Debug.Assert(false); return; } + if(lviTarget == null) { Debug.Assert(false); return; } + + if(m_lv == null) { Debug.Assert(false); return; } + + Debug.Assert(m_vListViewItems.IndexOf(lviSource) >= 0); + Debug.Assert(m_vListViewItems.IndexOf(lviTarget) >= 0); + + m_vLinks.Add(new CheckItemLink(lviSource, lviTarget, t)); + } + + private void OnItemCheckedChanged(object sender, ItemCheckedEventArgs e) + { + ListViewItem lvi = e.Item; + if(lvi == null) { Debug.Assert(false); return; } + + bool bChecked = lvi.Checked; + + // Debug.Assert(m_vListViewItems.IndexOf(lvi) >= 0); + foreach(CheckItemLink cl in m_vLinks) + { + if(cl.Source == lvi) + { + if(cl.Target.Index < 0) continue; + + if((cl.Type == CheckItemLinkType.CheckedChecked) && + bChecked && !cl.Target.Checked) + cl.Target.Checked = true; + else if((cl.Type == CheckItemLinkType.UncheckedUnchecked) && + !bChecked && cl.Target.Checked) + cl.Target.Checked = false; + else if((cl.Type == CheckItemLinkType.CheckedUnchecked) && + bChecked && cl.Target.Checked) + cl.Target.Checked = false; + else if((cl.Type == CheckItemLinkType.UncheckedChecked) && + !bChecked && !cl.Target.Checked) + cl.Target.Checked = true; + } + } + } } } diff -Nru keepass2-2.16+dfsg/KeePass/UI/ColorMenuItem.cs keepass2-2.18+dfsg/KeePass/UI/ColorMenuItem.cs --- keepass2-2.16+dfsg/KeePass/UI/ColorMenuItem.cs 2011-03-27 14:03:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/ColorMenuItem.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/ColumnProvider.cs keepass2-2.18+dfsg/KeePass/UI/ColumnProvider.cs --- keepass2-2.16+dfsg/KeePass/UI/ColumnProvider.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/ColumnProvider.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/ColumnProviderPool.cs keepass2-2.18+dfsg/KeePass/UI/ColumnProviderPool.cs --- keepass2-2.16+dfsg/KeePass/UI/ColumnProviderPool.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/ColumnProviderPool.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/CustomListViewEx.cs keepass2-2.18+dfsg/KeePass/UI/CustomListViewEx.cs --- keepass2-2.16+dfsg/KeePass/UI/CustomListViewEx.cs 2011-06-04 15:29:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/CustomListViewEx.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -21,9 +21,11 @@ using System.Collections.Generic; using System.Text; using System.Windows.Forms; +using System.Threading; using System.Diagnostics; using KeePass.Native; +using KeePass.Util; namespace KeePass.UI { @@ -57,5 +59,123 @@ base.OnMouseHover(e); } */ + + /* protected override void OnKeyUp(KeyEventArgs e) + { + base.OnKeyUp(e); + UnfocusGroupInSingleMode(); + } + private void UnfocusGroupInSingleMode() + { + try + { + if(!WinUtil.IsAtLeastWindowsVista) return; + if(KeePassLib.Native.NativeLib.IsUnix()) return; + if(!this.ShowGroups) return; + if(this.MultiSelect) return; + + const uint m = (NativeMethods.LVGS_FOCUSED | NativeMethods.LVGS_SELECTED); + + uint uGroups = (uint)this.Groups.Count; + for(uint u = 0; u < uGroups; ++u) + { + int iGroupID; + if(NativeMethods.GetGroupStateByIndex(this, u, m, + out iGroupID) == m) + { + NativeMethods.SetGroupState(this, iGroupID, m, + NativeMethods.LVGS_SELECTED); + return; + } + } + } + catch(Exception) { Debug.Assert(false); } + } */ + + protected override void OnKeyDown(KeyEventArgs e) + { + try { if(SkipGroupHeaderIfRequired(e)) return; } + catch(Exception) { Debug.Assert(false); } + + base.OnKeyDown(e); + } + + private bool SkipGroupHeaderIfRequired(KeyEventArgs e) + { + if(!this.ShowGroups) return false; + if(this.MultiSelect) return false; + + ListViewItem lvi = this.FocusedItem; + if(lvi != null) + { + ListViewGroup g = lvi.Group; + ListViewItem lviChangeTo = null; + + if((e.KeyCode == Keys.Up) && IsFirstLastItemInGroup(g, lvi, true)) + lviChangeTo = (GetNextLvi(g, true) ?? lvi); // '??' for top item + else if((e.KeyCode == Keys.Down) && IsFirstLastItemInGroup(g, lvi, false)) + lviChangeTo = (GetNextLvi(g, false) ?? lvi); // '??' for bottom item + + if(lviChangeTo != null) + { + foreach(ListViewItem lviEnum in this.Items) + lviEnum.Selected = false; + + lviChangeTo.Selected = true; + lviChangeTo.Focused = true; + EnsureVisible(lviChangeTo.Index); + + e.Handled = true; + return true; + } + } + + return false; + } + + private static bool IsFirstLastItemInGroup(ListViewGroup g, + ListViewItem lvi, bool bFirst) + { + if(g == null) { Debug.Assert(false); return false; } + + ListViewItemCollection c = g.Items; + if(c.Count == 0) { Debug.Assert(false); return false; } + + return (bFirst ? (c[0] == lvi) : (c[c.Count - 1] == lvi)); + } + + private ListViewItem GetNextLvi(ListViewGroup gBaseExcl, bool bUp) + { + if(gBaseExcl == null) { Debug.Assert(false); return null; } + + int i = this.Groups.IndexOf(gBaseExcl); + if(i < 0) { Debug.Assert(false); return null; } + + if(bUp) + { + --i; + while(i >= 0) + { + ListViewGroup g = this.Groups[i]; + if(g.Items.Count > 0) return g.Items[g.Items.Count - 1]; + + --i; + } + } + else // Down + { + ++i; + int nGroups = this.Groups.Count; + while(i < nGroups) + { + ListViewGroup g = this.Groups[i]; + if(g.Items.Count > 0) return g.Items[0]; + + ++i; + } + } + + return null; + } } } diff -Nru keepass2-2.16+dfsg/KeePass/UI/CustomMenuStripEx.cs keepass2-2.18+dfsg/KeePass/UI/CustomMenuStripEx.cs --- keepass2-2.16+dfsg/KeePass/UI/CustomMenuStripEx.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/CustomMenuStripEx.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/CustomRichTextBoxEx.cs keepass2-2.18+dfsg/KeePass/UI/CustomRichTextBoxEx.cs --- keepass2-2.16+dfsg/KeePass/UI/CustomRichTextBoxEx.cs 2011-02-27 19:29:32.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/CustomRichTextBoxEx.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/CustomSplitContainerEx.cs keepass2-2.18+dfsg/KeePass/UI/CustomSplitContainerEx.cs --- keepass2-2.16+dfsg/KeePass/UI/CustomSplitContainerEx.cs 2011-02-18 17:35:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/CustomSplitContainerEx.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/CustomToolStripEx.cs keepass2-2.18+dfsg/KeePass/UI/CustomToolStripEx.cs --- keepass2-2.16+dfsg/KeePass/UI/CustomToolStripEx.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/CustomToolStripEx.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/CustomToolStripRendererEx.cs keepass2-2.18+dfsg/KeePass/UI/CustomToolStripRendererEx.cs --- keepass2-2.16+dfsg/KeePass/UI/CustomToolStripRendererEx.cs 2011-01-08 16:49:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/CustomToolStripRendererEx.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/CustomTreeViewEx.cs keepass2-2.18+dfsg/KeePass/UI/CustomTreeViewEx.cs --- keepass2-2.16+dfsg/KeePass/UI/CustomTreeViewEx.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/CustomTreeViewEx.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -27,8 +27,21 @@ namespace KeePass.UI { + // public delegate string QueryToolTipDelegate(TreeNode tn); + public sealed class CustomTreeViewEx : TreeView { + // private QueryToolTipDelegate m_fnQueryToolTip = null; + // /// + // /// This handler will be used to dynamically query tooltip + // /// texts for tree nodes. + // /// + // public QueryToolTipDelegate QueryToolTip + // { + // get { return m_fnQueryToolTip; } + // set { m_fnQueryToolTip = value; } + // } + public CustomTreeViewEx() : base() { // Double-buffering isn't supported by tree views @@ -65,5 +78,28 @@ // } // catch(Exception) { } } + + // protected override void WndProc(ref Message m) + // { + // if(m.Msg == NativeMethods.WM_NOTIFY) + // { + // NativeMethods.NMHDR nm = (NativeMethods.NMHDR)m.GetLParam( + // typeof(NativeMethods.NMHDR)); + // if((nm.code == NativeMethods.TTN_NEEDTEXTA) || + // (nm.code == NativeMethods.TTN_NEEDTEXTW)) + // DynamicAssignNodeToolTip(); + // } + // base.WndProc(ref m); + // } + + // private void DynamicAssignNodeToolTip() + // { + // if(m_fnQueryToolTip == null) return; + // TreeViewHitTestInfo hti = HitTest(PointToClient(Cursor.Position)); + // if(hti == null) { Debug.Assert(false); return; } + // TreeNode tn = hti.Node; + // if(tn == null) return; + // tn.ToolTipText = (m_fnQueryToolTip(tn) ?? string.Empty); + // } } } diff -Nru keepass2-2.16+dfsg/KeePass/UI/DocumentManagerEx.cs keepass2-2.18+dfsg/KeePass/UI/DocumentManagerEx.cs --- keepass2-2.16+dfsg/KeePass/UI/DocumentManagerEx.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/DocumentManagerEx.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -24,6 +24,7 @@ using System.Diagnostics; using KeePassLib; +using KeePassLib.Delegates; using KeePassLib.Serialization; namespace KeePass.UI @@ -147,6 +148,67 @@ return null; } + + /// + /// Search for an entry in all opened databases. The + /// entry is identified by its reference (not its UUID). + /// + /// Entry to search for. + /// Database containing the entry. + public PwDatabase FindContainerOf(PwEntry peObj) + { + if(peObj == null) return null; // No assert + + PwGroup pg = peObj.ParentGroup; + if(pg != null) + { + while(pg.ParentGroup != null) { pg = pg.ParentGroup; } + + foreach(PwDocument ds in m_vDocs) + { + PwDatabase pd = ds.Database; + if((pd == null) || !pd.IsOpen) continue; + + if(object.ReferenceEquals(pd.RootGroup, pg)) + return pd; + } + + Debug.Assert(false); + } + + return SlowFindContainerOf(peObj); + } + + private PwDatabase SlowFindContainerOf(PwEntry peObj) + { + PwDatabase pdRet = null; + foreach(PwDocument ds in m_vDocs) + { + PwDatabase pd = ds.Database; + if((pd == null) || !pd.IsOpen) continue; + + EntryHandler eh = delegate(PwEntry pe) + { + if(object.ReferenceEquals(pe, peObj)) + { + pdRet = pd; + return false; // Stop traversal + } + + return true; + }; + + pd.RootGroup.TraverseTree(TraversalMethod.PreOrder, null, eh); + if(pdRet != null) return pdRet; + } + + return null; + } + + public PwDatabase SafeFindContainerOf(PwEntry peObj) + { + return (FindContainerOf(peObj) ?? m_dsActive.Database); + } } public sealed class PwDocument diff -Nru keepass2-2.16+dfsg/KeePass/UI/DynamicMenu.cs keepass2-2.18+dfsg/KeePass/UI/DynamicMenu.cs --- keepass2-2.16+dfsg/KeePass/UI/DynamicMenu.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/DynamicMenu.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -99,7 +99,8 @@ return AddItem(strItemText, imgSmallIcon, null); } - public ToolStripMenuItem AddItem(string strItemText, Image imgSmallIcon, object objTag) + public ToolStripMenuItem AddItem(string strItemText, Image imgSmallIcon, + object objTag) { Debug.Assert(strItemText != null); if(strItemText == null) throw new ArgumentNullException("strItemText"); diff -Nru keepass2-2.16+dfsg/KeePass/UI/FileDialogsEx.cs keepass2-2.18+dfsg/KeePass/UI/FileDialogsEx.cs --- keepass2-2.16+dfsg/KeePass/UI/FileDialogsEx.cs 2011-06-04 08:55:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/FileDialogsEx.cs 2012-01-01 12:02:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -62,25 +62,25 @@ if(fsOrigin == FileSaveOrigin.Locking) { dlg.MainInstruction = KPRes.FileSaveQLocking; - dlg.AddButton((int)DialogResult.Yes, KPRes.Save, KPRes.FileSaveQOpYesLocking); - dlg.AddButton((int)DialogResult.No, KPRes.DiscardChanges, KPRes.FileSaveQOpNoLocking); - dlg.AddButton((int)DialogResult.Cancel, KPRes.Cancel, KPRes.FileSaveQOpCancel + + dlg.AddButton((int)DialogResult.Yes, KPRes.SaveCmd, KPRes.FileSaveQOpYesLocking); + dlg.AddButton((int)DialogResult.No, KPRes.DiscardChangesCmd, KPRes.FileSaveQOpNoLocking); + dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, KPRes.FileSaveQOpCancel + " " + KPRes.FileSaveQOpCancelLocking); } else if(fsOrigin == FileSaveOrigin.Exiting) { dlg.MainInstruction = KPRes.FileSaveQExiting; - dlg.AddButton((int)DialogResult.Yes, KPRes.Save, KPRes.FileSaveQOpYesExiting); - dlg.AddButton((int)DialogResult.No, KPRes.DiscardChanges, KPRes.FileSaveQOpNoExiting); - dlg.AddButton((int)DialogResult.Cancel, KPRes.Cancel, KPRes.FileSaveQOpCancel + + dlg.AddButton((int)DialogResult.Yes, KPRes.SaveCmd, KPRes.FileSaveQOpYesExiting); + dlg.AddButton((int)DialogResult.No, KPRes.DiscardChangesCmd, KPRes.FileSaveQOpNoExiting); + dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, KPRes.FileSaveQOpCancel + " " + KPRes.FileSaveQOpCancelExiting); } else { dlg.MainInstruction = KPRes.FileSaveQClosing; - dlg.AddButton((int)DialogResult.Yes, KPRes.Save, KPRes.FileSaveQOpYesClosing); - dlg.AddButton((int)DialogResult.No, KPRes.DiscardChanges, KPRes.FileSaveQOpNoClosing); - dlg.AddButton((int)DialogResult.Cancel, KPRes.Cancel, KPRes.FileSaveQOpCancel + + dlg.AddButton((int)DialogResult.Yes, KPRes.SaveCmd, KPRes.FileSaveQOpYesClosing); + dlg.AddButton((int)DialogResult.No, KPRes.DiscardChangesCmd, KPRes.FileSaveQOpNoClosing); + dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, KPRes.FileSaveQOpCancel + " " + KPRes.FileSaveQOpCancelClosing); bShowCheckBox = false; } diff -Nru keepass2-2.16+dfsg/KeePass/UI/FontUtil.cs keepass2-2.18+dfsg/KeePass/UI/FontUtil.cs --- keepass2-2.16+dfsg/KeePass/UI/FontUtil.cs 2011-07-12 07:40:34.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/FontUtil.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/GlobalWindowManager.cs keepass2-2.18+dfsg/KeePass/UI/GlobalWindowManager.cs --- keepass2-2.16+dfsg/KeePass/UI/GlobalWindowManager.cs 2011-03-25 19:55:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/GlobalWindowManager.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -177,14 +177,28 @@ if(kvp.Value == null) continue; else if(kvp.Value.CanCloseWithoutDataLoss) { - kvp.Key.DialogResult = DialogResult.Cancel; - kvp.Key.Close(); + if(kvp.Key.InvokeRequired) + kvp.Key.Invoke(new CloseFormDelegate( + GlobalWindowManager.CloseForm), kvp.Key); + else CloseForm(kvp.Key); Application.DoEvents(); } } } + private delegate void CloseFormDelegate(Form f); + + private static void CloseForm(Form f) + { + try + { + f.DialogResult = DialogResult.Cancel; + f.Close(); + } + catch(Exception) { Debug.Assert(false); } + } + public static bool HasWindow(IntPtr hWindow) { foreach(KeyValuePair kvp in m_vWindows) diff -Nru keepass2-2.16+dfsg/KeePass/UI/HotKeyControlEx.cs keepass2-2.18+dfsg/KeePass/UI/HotKeyControlEx.cs --- keepass2-2.16+dfsg/KeePass/UI/HotKeyControlEx.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/HotKeyControlEx.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/IGwmWindow.cs keepass2-2.18+dfsg/KeePass/UI/IGwmWindow.cs --- keepass2-2.16+dfsg/KeePass/UI/IGwmWindow.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/IGwmWindow.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/ImageComboBoxEx.cs keepass2-2.18+dfsg/KeePass/UI/ImageComboBoxEx.cs --- keepass2-2.16+dfsg/KeePass/UI/ImageComboBoxEx.cs 2011-06-09 12:19:46.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/ImageComboBoxEx.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/KeyboardControl.cs keepass2-2.18+dfsg/KeePass/UI/KeyboardControl.cs --- keepass2-2.16+dfsg/KeePass/UI/KeyboardControl.cs 2011-02-12 15:26:46.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/KeyboardControl.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/ListSorter.cs keepass2-2.18+dfsg/KeePass/UI/ListSorter.cs --- keepass2-2.16+dfsg/KeePass/UI/ListSorter.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/ListSorter.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -20,6 +20,7 @@ using System; using System.Collections; using System.Windows.Forms; +using System.ComponentModel; using System.Diagnostics; using KeePass.Resources; @@ -29,14 +30,11 @@ { public sealed class ListSorter : IComparer { - private int m_nColumn = -1; - private SortOrder m_oSort = SortOrder.Ascending; - private bool m_bCompareNaturally = true; - private bool m_bCompareTimes = false; - // Cached version of a string representing infinity private string m_strNeverExpires = string.Empty; + private int m_nColumn = -1; + [DefaultValue(-1)] public int Column { get { return m_nColumn; } @@ -45,6 +43,7 @@ set { m_nColumn = value; } } + private SortOrder m_oSort = SortOrder.Ascending; public SortOrder Order { get { return m_oSort; } @@ -53,6 +52,8 @@ set { m_oSort = value; } } + private bool m_bCompareNaturally = true; + [DefaultValue(true)] public bool CompareNaturally { get { return m_bCompareNaturally; } @@ -61,6 +62,8 @@ set { m_bCompareNaturally = value; } } + private bool m_bCompareTimes = false; + [DefaultValue(false)] public bool CompareTimes { get { return m_bCompareTimes; } diff -Nru keepass2-2.16+dfsg/KeePass/UI/ListViewSortMenu.cs keepass2-2.18+dfsg/KeePass/UI/ListViewSortMenu.cs --- keepass2-2.16+dfsg/KeePass/UI/ListViewSortMenu.cs 2011-02-14 16:12:58.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/ListViewSortMenu.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/ListViewStateEx.cs keepass2-2.18+dfsg/KeePass/UI/ListViewStateEx.cs --- keepass2-2.16+dfsg/KeePass/UI/ListViewStateEx.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/ListViewStateEx.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/MruList.cs keepass2-2.18+dfsg/KeePass/UI/MruList.cs --- keepass2-2.16+dfsg/KeePass/UI/MruList.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/MruList.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/NotifyIconEx.cs keepass2-2.18+dfsg/KeePass/UI/NotifyIconEx.cs --- keepass2-2.16+dfsg/KeePass/UI/NotifyIconEx.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/NotifyIconEx.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/OnDemandStatusDialog.cs keepass2-2.18+dfsg/KeePass/UI/OnDemandStatusDialog.cs --- keepass2-2.16+dfsg/KeePass/UI/OnDemandStatusDialog.cs 2011-02-18 22:47:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/OnDemandStatusDialog.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -36,6 +36,7 @@ private Thread m_th = null; private Form m_fOwner; private StatusProgressForm m_dlgModal = null; + private object m_objSync = new object(); private const uint InitialProgress = 0; private const string InitialStatus = null; @@ -58,7 +59,7 @@ public void EndLogging() { - lock(this) { m_bTerminate = true; } + lock(m_objSync) { m_bTerminate = true; } m_th = null; if(m_dlgModal != null) @@ -70,7 +71,7 @@ public bool SetProgress(uint uPercent) { - lock(this) { m_uProgress = uPercent; } + lock(m_objSync) { m_uProgress = uPercent; } return ((m_dlgModal != null) ? m_dlgModal.SetProgress(uPercent) : true); } @@ -89,7 +90,7 @@ if(!m_bUseThread && (m_dlgModal == null)) m_dlgModal = ConstructStatusDialog(); - lock(this) { m_strProgress = strNewText; } + lock(m_objSync) { m_strProgress = strNewText; } return ((m_dlgModal != null) ? m_dlgModal.SetText(strNewText, lsType) : true); } @@ -106,7 +107,7 @@ StatusProgressForm dlg = null; while(true) { - lock(this) + lock(m_objSync) { if(m_bTerminate) break; @@ -134,10 +135,8 @@ private StatusProgressForm ConstructStatusDialog() { - StatusProgressForm dlg = new StatusProgressForm(); - dlg.InitEx(m_strTitle, false, true, m_bUseThread ? null : m_fOwner); - dlg.Show(); - dlg.StartLogging(null, false); + StatusProgressForm dlg = StatusProgressForm.ConstructEx( + m_strTitle, false, true, (m_bUseThread ? null : m_fOwner), null); dlg.SetProgress(m_uProgress); MainForm mfOwner = ((m_fOwner != null) ? (m_fOwner as MainForm) : null); @@ -161,9 +160,7 @@ mfOwner.UIBlockInteraction(false); } - dlg.EndLogging(); - dlg.Close(); - dlg.Dispose(); + StatusProgressForm.DestroyEx(dlg); // Conflict with 3116455 // if(mfOwner != null) mfOwner.Activate(); // Prevent disappearing diff -Nru keepass2-2.16+dfsg/KeePass/UI/OpenWithMenu.cs keepass2-2.18+dfsg/KeePass/UI/OpenWithMenu.cs --- keepass2-2.16+dfsg/KeePass/UI/OpenWithMenu.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/OpenWithMenu.cs 2012-01-01 12:04:42.000000000 +0000 @@ -0,0 +1,295 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2012 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.Windows.Forms; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.IO; +using System.Diagnostics; + +using Microsoft.Win32; + +using KeePass.Resources; +using KeePass.Util; + +using KeePassLib; +using KeePassLib.Native; +using KeePassLib.Utility; + +namespace KeePass.UI +{ + internal sealed class OpenWithItem + { + private string m_strPath; + public string FilePath { get { return m_strPath; } } + + private string m_strMenuText; + // public string MenuText { get { return m_strMenuText; } } + + private Image m_imgIcon; + public Image Image { get { return m_imgIcon; } } + + private ToolStripMenuItem m_tsmi; + public ToolStripMenuItem MenuItem { get { return m_tsmi; } } + + private OpenWithItem(string strFilePath, string strMenuText, + Image imgIcon, DynamicMenu dynMenu) + { + m_strPath = strFilePath; + m_strMenuText = strMenuText; + m_imgIcon = imgIcon; + + m_tsmi = dynMenu.AddItem(m_strMenuText, m_imgIcon, this); + + try { m_tsmi.ToolTipText = m_strPath; } + catch(Exception) { } // Too long? + } + + public static OpenWithItem Create(string strFilePath, string strMenuText, + Image imgIcon, DynamicMenu dynMenu) + { + return new OpenWithItem(strFilePath, strMenuText, imgIcon, dynMenu); + } + } + + public sealed class OpenWithMenu + { + private ToolStripMenuItem m_tsmiHost; + private DynamicMenu m_dynMenu; + + private List m_lOpenWith = null; + + public OpenWithMenu(ToolStripMenuItem tsmiHost) + { + if(tsmiHost == null) { Debug.Assert(false); return; } + + m_tsmiHost = tsmiHost; + m_dynMenu = new DynamicMenu(m_tsmiHost); + m_dynMenu.MenuClick += this.OnOpenUrl; + + m_tsmiHost.DropDownOpening += this.OnMenuOpening; + } + + ~OpenWithMenu() + { + Destroy(); + } + + public void Destroy() + { + if(m_dynMenu != null) + { + m_dynMenu.Clear(); + m_dynMenu.MenuClick -= this.OnOpenUrl; + m_dynMenu = null; + + m_tsmiHost.DropDownOpening -= this.OnMenuOpening; + m_tsmiHost = null; + + // After the menu has been destroyed: + ReleaseOpenWithList(); // Release icons, ... + } + } + + private void OnMenuOpening(object sender, EventArgs e) + { + if(m_dynMenu == null) { Debug.Assert(false); return; } + + if(m_lOpenWith == null) CreateOpenWithList(); + + PwEntry[] v = Program.MainForm.GetSelectedEntries(); + if(v == null) v = new PwEntry[0]; + + bool bCanOpenWith = true; + uint uValidUrls = 0; + foreach(PwEntry pe in v) + { + string strUrl = pe.Strings.ReadSafe(PwDefs.UrlField); + if(string.IsNullOrEmpty(strUrl)) continue; + + ++uValidUrls; + bCanOpenWith &= !WinUtil.IsCommandLineUrl(strUrl); + } + if((v.Length == 0) || (uValidUrls == 0)) bCanOpenWith = false; + + foreach(OpenWithItem it in m_lOpenWith) + it.MenuItem.Enabled = bCanOpenWith; + } + + private void CreateOpenWithList() + { + ReleaseOpenWithList(); + + m_dynMenu.Clear(); + m_dynMenu.AddSeparator(); + + m_lOpenWith = new List(); + FindAppsByKnown(); + FindAppsByRegistry(); + + if(m_lOpenWith.Count == 0) m_dynMenu.Clear(); // Remove separator + } + + private void ReleaseOpenWithList() + { + if(m_lOpenWith == null) return; + + foreach(OpenWithItem it in m_lOpenWith) + { + if(it.Image != null) it.Image.Dispose(); + } + + m_lOpenWith = null; + } + + private void OnOpenUrl(object sender, DynamicMenuEventArgs e) + { + if(e == null) { Debug.Assert(false); return; } + + OpenWithItem it = (e.Tag as OpenWithItem); + if(it == null) { Debug.Assert(false); return; } + + PwEntry[] v = Program.MainForm.GetSelectedEntries(); + if(v == null) { Debug.Assert(false); return; } + + foreach(PwEntry pe in v) + { + string strUrl = pe.Strings.ReadSafe(PwDefs.UrlField); + if(string.IsNullOrEmpty(strUrl)) continue; + + WinUtil.OpenUrlWithApp(strUrl, pe, it.FilePath); + } + } + + private void AddAppByFile(string strAppCmdLine, string strName) + { + if(string.IsNullOrEmpty(strAppCmdLine)) return; // No assert + + string strPath = UrlUtil.GetShortestAbsolutePath( + UrlUtil.GetQuotedAppPath(strAppCmdLine).Trim()); + if(strPath.Length == 0) { Debug.Assert(false); return; } + + foreach(OpenWithItem it in m_lOpenWith) + { + if(it.FilePath.Equals(strPath, StrUtil.CaseIgnoreCmp)) + return; // Already have an item for this + } + + // Filter non-existing/legacy applications + try { if(!File.Exists(strPath)) return; } + catch(Exception) { Debug.Assert(false); return; } + + if(string.IsNullOrEmpty(strName)) + strName = UrlUtil.StripExtension(UrlUtil.GetFileName(strPath)); + + Image img = null; + try + { + Icon ico = Icon.ExtractAssociatedIcon(strPath); + if(ico == null) throw new InvalidOperationException(); + + img = new Bitmap(16, 16, PixelFormat.Format32bppArgb); + using(Graphics g = Graphics.FromImage(img)) + { + g.Clear(Color.Transparent); + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.SmoothingMode = SmoothingMode.HighQuality; + g.DrawIcon(ico, new Rectangle(0, 0, img.Width, img.Height)); + } + + ico.Dispose(); + } + catch(Exception) { Debug.Assert(false); } + + string strMenuText = KPRes.OpenWith.Replace(@"{PARAM}", strName); + OpenWithItem owi = OpenWithItem.Create(strPath, strMenuText, + img, m_dynMenu); + m_lOpenWith.Add(owi); + } + + private void FindAppsByKnown() + { + AddAppByFile(AppLocator.InternetExplorerPath, @"&Internet Explorer"); + AddAppByFile(AppLocator.FirefoxPath, @"&Firefox"); + AddAppByFile(AppLocator.OperaPath, @"O&pera"); + + AddAppByFile(AppLocator.ChromePath, (NativeLib.IsUnix() ? + @"&Google Chromium" : @"&Google Chrome")); + + AddAppByFile(AppLocator.SafariPath, @"&Safari"); + + if(NativeLib.IsUnix()) + { + AddAppByFile(AppLocator.FindAppUnix("epiphany-browser"), @"&Epiphany"); + AddAppByFile(AppLocator.FindAppUnix("arora"), @"&Arora"); + AddAppByFile(AppLocator.FindAppUnix("galeon"), @"Ga&leon"); + AddAppByFile(AppLocator.FindAppUnix("konqueror"), @"&Konqueror"); + } + } + + private void FindAppsByRegistry() + { + try { FindAppsByRegistryPriv("SOFTWARE\\Clients\\StartMenuInternet"); } + catch(Exception) { } + try { FindAppsByRegistryPriv("SOFTWARE\\Wow6432Node\\Clients\\StartMenuInternet"); } + catch(Exception) { } + } + + private void FindAppsByRegistryPriv(string strRootSubKey) + { + RegistryKey kRoot = Registry.LocalMachine.OpenSubKey(strRootSubKey); + if(kRoot == null) return; // No assert, key might not exist + string[] vAppSubKeys = kRoot.GetSubKeyNames(); + + foreach(string strAppSubKey in vAppSubKeys) + { + RegistryKey kApp = kRoot.OpenSubKey(strAppSubKey); + string strName = (kApp.GetValue(string.Empty) as string); + string strAltName = null; + + RegistryKey kCmd = kApp.OpenSubKey("shell\\open\\command"); + if(kCmd == null) { Debug.Assert(false); kApp.Close(); continue; } + string strCmdLine = (kCmd.GetValue(string.Empty) as string); + kCmd.Close(); + + RegistryKey kCaps = kApp.OpenSubKey("Capabilities"); + if(kCaps != null) + { + strAltName = (kCaps.GetValue("ApplicationName") as string); + kCaps.Close(); + } + + kApp.Close(); + + string strDisplayName = string.Empty; + if(strName != null) strDisplayName = strName; + if((strAltName != null) && (strAltName.Length <= strDisplayName.Length)) + strDisplayName = strAltName; + + AddAppByFile(strCmdLine, strDisplayName); + } + + kRoot.Close(); + } + } +} diff -Nru keepass2-2.16+dfsg/KeePass/UI/PromptedTextBox.cs keepass2-2.18+dfsg/KeePass/UI/PromptedTextBox.cs --- keepass2-2.16+dfsg/KeePass/UI/PromptedTextBox.cs 2011-01-01 11:35:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/PromptedTextBox.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/ProtectedDialog.cs keepass2-2.18+dfsg/KeePass/UI/ProtectedDialog.cs --- keepass2-2.16+dfsg/KeePass/UI/ProtectedDialog.cs 2011-07-11 11:51:52.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/ProtectedDialog.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/PwInputControlGroup.cs keepass2-2.18+dfsg/KeePass/UI/PwInputControlGroup.cs --- keepass2-2.16+dfsg/KeePass/UI/PwInputControlGroup.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/PwInputControlGroup.cs 2012-01-01 12:04:42.000000000 +0000 @@ -0,0 +1,331 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2012 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.Drawing; +using System.Windows.Forms; +using System.Diagnostics; + +using KeePass.App; +using KeePass.App.Configuration; +using KeePass.Forms; +using KeePass.Resources; + +using KeePassLib; +using KeePassLib.Cryptography; +using KeePassLib.Utility; + +namespace KeePass.UI +{ + public sealed class PwInputControlGroup + { + private TextBox m_tbPassword = null; + private CheckBox m_cbHide = null; + private Label m_lblRepeat = null; + private TextBox m_tbRepeat = null; + private Label m_lblQualityPrompt = null; + private QualityProgressBar m_pbQuality = null; + private Label m_lblQualityBits = null; + private Form m_fParent = null; + + private SecureEdit m_secPassword = null; + private SecureEdit m_secRepeat = null; + + private bool m_bInitializing = false; + private bool m_bPrgmCheck = false; + + private bool m_bEnabled = true; + public bool Enabled + { + get { return m_bEnabled; } + set + { + if(value != m_bEnabled) + { + m_bEnabled = value; + UpdateUI(); + } + } + } + + public uint PasswordLength + { + get + { + if(m_secPassword == null) { Debug.Assert(false); return 0; } + return m_secPassword.TextLength; + } + } + + private bool AutoRepeat + { + get + { + if(m_cbHide == null) { Debug.Assert(false); return false; } + return !m_cbHide.Checked; + } + } + + public PwInputControlGroup() + { + } + +#if DEBUG + ~PwInputControlGroup() + { + Debug.Assert(m_tbPassword == null); // Owner should call Release() + Debug.Assert(m_uBlockUIUpdate == 0); + } +#endif + + public void Attach(TextBox tbPassword, CheckBox cbHide, Label lblRepeat, + TextBox tbRepeat, Label lblQualityPrompt, QualityProgressBar pbQuality, + Label lblQualityBits, Form fParent, bool bInitialHide, bool bSecureDesktopMode) + { + if(tbPassword == null) throw new ArgumentNullException("tbPassword"); + if(cbHide == null) throw new ArgumentNullException("cbHide"); + if(lblRepeat == null) throw new ArgumentNullException("lblRepeat"); + if(tbRepeat == null) throw new ArgumentNullException("tbRepeat"); + if(lblQualityPrompt == null) throw new ArgumentNullException("lblQualityPrompt"); + if(pbQuality == null) throw new ArgumentNullException("pbQuality"); + if(lblQualityBits == null) throw new ArgumentNullException("lblQualityBits"); + if(fParent == null) throw new ArgumentNullException("fParent"); + + Release(); + m_bInitializing = true; + + m_tbPassword = tbPassword; + m_cbHide = cbHide; + m_lblRepeat = lblRepeat; + m_tbRepeat = tbRepeat; + m_lblQualityPrompt = lblQualityPrompt; + m_pbQuality = pbQuality; + m_lblQualityBits = lblQualityBits; + m_fParent = fParent; + + m_secPassword = new SecureEdit(); + m_secPassword.SecureDesktopMode = bSecureDesktopMode; + m_secPassword.Attach(m_tbPassword, this.OnPasswordTextChanged, bInitialHide); + + m_secRepeat = new SecureEdit(); + m_secRepeat.SecureDesktopMode = bSecureDesktopMode; + m_secRepeat.Attach(m_tbRepeat, this.OnRepeatTextChanged, bInitialHide); + + m_cbHide.Checked = bInitialHide; + m_cbHide.CheckedChanged += this.OnHideCheckedChanged; + + Debug.Assert(m_pbQuality.Minimum == 0); + Debug.Assert(m_pbQuality.Maximum == 100); + + m_bInitializing = false; + UpdateUI(); + } + + public void Release() + { + Debug.Assert(!m_bInitializing); + if(m_tbPassword == null) return; + + m_secPassword.Detach(); + m_secRepeat.Detach(); + + m_cbHide.CheckedChanged -= this.OnHideCheckedChanged; + + m_tbPassword = null; + m_cbHide = null; + m_lblRepeat = null; + m_tbRepeat = null; + m_lblQualityPrompt = null; + m_pbQuality = null; + m_lblQualityBits = null; + m_fParent = null; + + m_secPassword = null; + m_secRepeat = null; + } + + private uint m_uBlockUIUpdate = 0; + private void UpdateUI() + { + if((m_uBlockUIUpdate > 0) || m_bInitializing) return; + ++m_uBlockUIUpdate; + + ulong uFlags = 0; + if(m_fParent is KeyCreationForm) + uFlags = Program.Config.UI.KeyCreationFlags; + + byte[] pbUtf8 = m_secPassword.ToUtf8(); + + m_tbPassword.Enabled = m_bEnabled; + m_cbHide.Enabled = (m_bEnabled && ((uFlags & + (ulong)AceKeyUIFlags.DisableHidePassword) == 0)); + + if((uFlags & (ulong)AceKeyUIFlags.CheckHidePassword) != 0) + { + m_bPrgmCheck = true; + m_cbHide.Checked = true; + m_bPrgmCheck = false; + } + if((uFlags & (ulong)AceKeyUIFlags.UncheckHidePassword) != 0) + { + m_bPrgmCheck = true; + m_cbHide.Checked = false; + m_bPrgmCheck = false; + } + + bool bAutoRepeat = this.AutoRepeat; + if(bAutoRepeat && (m_secRepeat.TextLength > 0)) + m_secRepeat.SetPassword(new byte[0]); + + byte[] pbRepeat = m_secRepeat.ToUtf8(); + if(!MemUtil.ArraysEqual(pbUtf8, pbRepeat) && !bAutoRepeat) + m_tbRepeat.BackColor = AppDefs.ColorEditError; + else m_tbRepeat.ResetBackColor(); + + bool bRepeatEnable = (m_bEnabled && !bAutoRepeat); + m_lblRepeat.Enabled = bRepeatEnable; + m_tbRepeat.Enabled = bRepeatEnable; + + m_lblQualityPrompt.Enabled = m_bEnabled; + m_pbQuality.Enabled = m_bEnabled; + m_lblQualityBits.Enabled = m_bEnabled; + + uint uBits = QualityEstimation.EstimatePasswordBits(pbUtf8); + m_lblQualityBits.Text = uBits.ToString() + " " + KPRes.Bits; + int iPos = (int)((100 * uBits) / (256 / 2)); + if(iPos < 0) iPos = 0; else if(iPos > 100) iPos = 100; + m_pbQuality.Value = iPos; + + MemUtil.ZeroByteArray(pbUtf8); + MemUtil.ZeroByteArray(pbRepeat); + --m_uBlockUIUpdate; + } + + private void OnPasswordTextChanged(object sender, EventArgs e) + { + UpdateUI(); + } + + private void OnRepeatTextChanged(object sender, EventArgs e) + { + UpdateUI(); + } + + private void OnHideCheckedChanged(object sender, EventArgs e) + { + if(m_bInitializing) return; + + bool bHide = m_cbHide.Checked; + if(!bHide && !m_bPrgmCheck && !AppPolicy.Try(AppPolicyId.UnhidePasswords)) + { + m_cbHide.Checked = true; + return; + } + + m_secPassword.EnableProtection(bHide); + m_secRepeat.EnableProtection(bHide); + + if(bHide && !m_bPrgmCheck) + { + ++m_uBlockUIUpdate; + byte[] pb = GetPasswordUtf8(); + m_secRepeat.SetPassword(pb); + MemUtil.ZeroByteArray(pb); + --m_uBlockUIUpdate; + } + + UpdateUI(); + if(!m_bPrgmCheck) UIUtil.SetFocus(m_tbPassword, m_fParent); + } + + public void SetPassword(byte[] pbUtf8, bool bSetRepeatPw) + { + if(pbUtf8 == null) { Debug.Assert(false); return; } + + ++m_uBlockUIUpdate; + m_secPassword.SetPassword(pbUtf8); + if(bSetRepeatPw && !this.AutoRepeat) + m_secRepeat.SetPassword(pbUtf8); + --m_uBlockUIUpdate; + + UpdateUI(); + } + + public void SetPasswords(string strPassword, string strRepeat) + { + byte[] pbP = ((strPassword != null) ? StrUtil.Utf8.GetBytes( + strPassword) : null); + byte[] pbR = ((strRepeat != null) ? StrUtil.Utf8.GetBytes( + strRepeat) : null); + SetPasswords(pbP, pbR); + } + + public void SetPasswords(byte[] pbPasswordUtf8, byte[] pbRepeatUtf8) + { + ++m_uBlockUIUpdate; + if(pbPasswordUtf8 != null) + m_secPassword.SetPassword(pbPasswordUtf8); + if((pbRepeatUtf8 != null) && !this.AutoRepeat) + m_secRepeat.SetPassword(pbRepeatUtf8); + --m_uBlockUIUpdate; + + UpdateUI(); + } + + public string GetPassword() + { + return StrUtil.Utf8.GetString(m_secPassword.ToUtf8()); + } + + public byte[] GetPasswordUtf8() + { + return m_secPassword.ToUtf8(); + } + + public string GetRepeat() + { + if(this.AutoRepeat) return GetPassword(); + return StrUtil.Utf8.GetString(m_secRepeat.ToUtf8()); + } + + public byte[] GetRepeatUtf8() + { + if(this.AutoRepeat) return GetPasswordUtf8(); + return m_secRepeat.ToUtf8(); + } + + public bool ValidateData(bool bUIOnError) + { + if(this.AutoRepeat) return true; + if(m_secPassword.ContentsEqualTo(m_secRepeat)) return true; + + if(bUIOnError) + { + if(!VistaTaskDialog.ShowMessageBox(KPRes.PasswordRepeatFailed, + KPRes.ValidationFailed, PwDefs.ShortProductName, + VtdIcon.Warning, m_fParent.Handle)) + MessageService.ShowWarning(KPRes.PasswordRepeatFailed); + } + + return false; + } + } +} diff -Nru keepass2-2.16+dfsg/KeePass/UI/QualityProgressBar.cs keepass2-2.18+dfsg/KeePass/UI/QualityProgressBar.cs --- keepass2-2.16+dfsg/KeePass/UI/QualityProgressBar.cs 2011-01-01 11:37:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/QualityProgressBar.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -103,6 +103,11 @@ Color clrStart = Color.FromArgb(255, 128, 0); Color clrEnd = Color.FromArgb(0, 255, 0); + if(!this.Enabled) + { + clrStart = UIUtil.ColorToGrayscale(SystemColors.ControlDark); + clrEnd = UIUtil.ColorToGrayscale(SystemColors.Control); + } bool bRtl = (this.RightToLeft == RightToLeft.Yes); if(bRtl) diff -Nru keepass2-2.16+dfsg/KeePass/UI/RichTextBoxContextMenu.cs keepass2-2.18+dfsg/KeePass/UI/RichTextBoxContextMenu.cs --- keepass2-2.16+dfsg/KeePass/UI/RichTextBoxContextMenu.cs 2011-01-01 11:37:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/RichTextBoxContextMenu.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -23,27 +23,31 @@ using System.Diagnostics; using KeePass.Resources; +using KeePass.Util; namespace KeePass.UI { - internal enum RichTextBoxContextMenuCommands - { - Undo = 0, - Cut, - Copy, - Paste, - Delete, - CopyAll, - SelectAll, - Count - } - public sealed class RichTextBoxContextMenu { private RichTextBox m_rtb = null; + private Form m_form = null; private ContextMenuStrip m_ctx = null; private ToolStripItem[] m_vMenuItems = - new ToolStripItem[(int)RichTextBoxContextMenuCommands.Count]; + new ToolStripItem[(int)RtbCtxCommands.Count]; + private string m_strCurLink = string.Empty; + + private enum RtbCtxCommands + { + Undo = 0, + Cut, + Copy, + Paste, + Delete, + CopyLink, + CopyAll, + SelectAll, + Count + } public RichTextBoxContextMenu() { @@ -51,14 +55,21 @@ ~RichTextBoxContextMenu() { - this.Detach(); + Detach(); } + [Obsolete] public void Attach(RichTextBox rtb) { - this.Detach(); + Attach(rtb, null); + } + + public void Attach(RichTextBox rtb, Form fParent) + { + Detach(); m_rtb = rtb; + m_form = fParent; m_ctx = CreateContextMenu(); m_ctx.Opening += this.OnMenuOpening; @@ -77,10 +88,11 @@ m_ctx.Opening -= this.OnMenuOpening; m_ctx = null; - for(int i = 0; i < (int)RichTextBoxContextMenuCommands.Count; ++i) + for(int i = 0; i < (int)RtbCtxCommands.Count; ++i) m_vMenuItems[i] = null; m_rtb = null; + m_form = null; } } @@ -103,22 +115,81 @@ Properties.Resources.B16x16_EditDelete, this.OnDeleteCommand); ctx.Items.Add(new ToolStripSeparator()); + m_vMenuItems[++iPos] = ctx.Items.Add(KPRes.CopyLink, + Properties.Resources.B16x16_EditCopyLink, this.OnCopyLinkCommand); m_vMenuItems[++iPos] = ctx.Items.Add(KPRes.CopyAll, Properties.Resources.B16x16_EditShred, this.OnCopyAllCommand); m_vMenuItems[++iPos] = ctx.Items.Add(KPRes.SelectAll, Properties.Resources.B16x16_Edit, this.OnSelectAllCommand); - Debug.Assert(iPos == ((int)RichTextBoxContextMenuCommands.Count - 1)); + Debug.Assert(iPos == ((int)RtbCtxCommands.Count - 1)); return ctx; } private void OnMenuOpening(object sender, EventArgs e) { - m_vMenuItems[(int)RichTextBoxContextMenuCommands.Undo].Enabled = - m_vMenuItems[(int)RichTextBoxContextMenuCommands.Cut].Enabled = - m_vMenuItems[(int)RichTextBoxContextMenuCommands.Paste].Enabled = - m_vMenuItems[(int)RichTextBoxContextMenuCommands.Delete].Enabled = - !m_rtb.ReadOnly; + bool bHasText = (m_rtb.TextLength > 0); + bool bHasSel = (m_rtb.SelectionLength > 0); + + if(m_rtb.ReadOnly) + { + m_vMenuItems[(int)RtbCtxCommands.Undo].Enabled = false; + m_vMenuItems[(int)RtbCtxCommands.Cut].Enabled = false; + m_vMenuItems[(int)RtbCtxCommands.Paste].Enabled = false; + m_vMenuItems[(int)RtbCtxCommands.Delete].Enabled = false; + } + else // Editable + { + m_vMenuItems[(int)RtbCtxCommands.Undo].Enabled = m_rtb.CanUndo; + m_vMenuItems[(int)RtbCtxCommands.Cut].Enabled = bHasSel; + m_vMenuItems[(int)RtbCtxCommands.Paste].Enabled = true; // Optimistic + m_vMenuItems[(int)RtbCtxCommands.Delete].Enabled = bHasSel; + } + + m_vMenuItems[(int)RtbCtxCommands.Copy].Enabled = bHasSel; + m_vMenuItems[(int)RtbCtxCommands.CopyAll].Enabled = bHasText; + m_vMenuItems[(int)RtbCtxCommands.SelectAll].Enabled = bHasText; + + m_strCurLink = GetLinkBelowMouse(); + m_vMenuItems[(int)RtbCtxCommands.CopyLink].Enabled = (m_strCurLink.Length > 0); + } + + private string GetLinkBelowMouse() + { + // Save selection + int iSelStart = m_rtb.SelectionStart, iSelLength = m_rtb.SelectionLength; + + string strLink = string.Empty; + try + { + int p = m_rtb.GetCharIndexFromPosition(m_rtb.PointToClient( + Cursor.Position)); + m_rtb.Select(p, 1); + if(UIUtil.RtfIsFirstCharLink(m_rtb)) + { + int l = p; + while((l - 1) >= 0) + { + m_rtb.Select(l - 1, 1); + if(!UIUtil.RtfIsFirstCharLink(m_rtb)) break; + --l; + } + + int r = p, n = m_rtb.TextLength; + while((r + 1) < n) + { + m_rtb.Select(r + 1, 1); + if(!UIUtil.RtfIsFirstCharLink(m_rtb)) break; + ++r; + } + + strLink = m_rtb.Text.Substring(l, r - l + 1); + } + } + catch(Exception) { Debug.Assert(false); } + + m_rtb.Select(iSelStart, iSelLength); // Restore selection + return strLink; } private void OnUndoCommand(object sender, EventArgs e) @@ -155,6 +226,12 @@ m_rtb.Select(nStart, 0); } + private void OnCopyLinkCommand(object sender, EventArgs e) + { + ClipboardUtil.Copy(m_strCurLink, false, false, null, null, + (m_form != null) ? m_form.Handle : IntPtr.Zero); + } + private void OnCopyAllCommand(object sender, EventArgs e) { int nStart = m_rtb.SelectionStart, nLength = m_rtb.SelectionLength; diff -Nru keepass2-2.16+dfsg/KeePass/UI/RichTextBuilder.cs keepass2-2.18+dfsg/KeePass/UI/RichTextBuilder.cs --- keepass2-2.16+dfsg/KeePass/UI/RichTextBuilder.cs 2011-06-14 17:44:46.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/RichTextBuilder.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/SecureEdit.cs keepass2-2.18+dfsg/KeePass/UI/SecureEdit.cs --- keepass2-2.16+dfsg/KeePass/UI/SecureEdit.cs 2011-03-19 15:09:56.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/SecureEdit.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -331,7 +331,7 @@ public void SetPassword(byte[] pbUtf8) { Debug.Assert(pbUtf8 != null); - if(pbUtf8 == null) throw new ArgumentNullException("pbUTF8"); + if(pbUtf8 == null) throw new ArgumentNullException("pbUtf8"); if(m_secString != null) { diff -Nru keepass2-2.16+dfsg/KeePass/UI/ShowWarningsLogger.cs keepass2-2.18+dfsg/KeePass/UI/ShowWarningsLogger.cs --- keepass2-2.16+dfsg/KeePass/UI/ShowWarningsLogger.cs 2011-01-01 11:37:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/ShowWarningsLogger.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/StatusBarLogger.cs keepass2-2.18+dfsg/KeePass/UI/StatusBarLogger.cs --- keepass2-2.16+dfsg/KeePass/UI/StatusBarLogger.cs 2011-01-01 11:37:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/StatusBarLogger.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/StatusUtil.cs keepass2-2.18+dfsg/KeePass/UI/StatusUtil.cs --- keepass2-2.16+dfsg/KeePass/UI/StatusUtil.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/StatusUtil.cs 2012-01-01 12:04:42.000000000 +0000 @@ -0,0 +1,121 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2012 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.Windows.Forms; +using System.Diagnostics; + +using KeePass.Forms; +using KeePass.Native; + +using KeePassLib; +using KeePassLib.Interfaces; + +namespace KeePass.UI +{ + public static class StatusUtil + { + private sealed class StatusProgressFormWrapper : IStatusLogger + { + private StatusProgressForm m_dlg; + public StatusProgressForm Form + { + get { return m_dlg; } + } + + public StatusProgressFormWrapper(Form fParent, string strTitle, + bool bCanCancel, bool bMarqueeProgress) + { + m_dlg = new StatusProgressForm(); + m_dlg.InitEx(strTitle, bCanCancel, bMarqueeProgress, fParent); + + if(fParent != null) m_dlg.Show(fParent); + else m_dlg.Show(); + } + + public void StartLogging(string strOperation, bool bWriteOperationToLog) + { + if(m_dlg == null) { Debug.Assert(false); return; } + + m_dlg.StartLogging(strOperation, false); + } + + public void EndLogging() + { + if(m_dlg == null) { Debug.Assert(false); return; } + + m_dlg.EndLogging(); + m_dlg.Close(); + UIUtil.DestroyForm(m_dlg); + m_dlg = null; + } + + public bool SetProgress(uint uPercent) + { + if(m_dlg == null) { Debug.Assert(false); return true; } + + return m_dlg.SetProgress(uPercent); + } + + public bool SetText(string strNewText, LogStatusType lsType) + { + if(m_dlg == null) { Debug.Assert(false); return true; } + + return m_dlg.SetText(strNewText, lsType); + } + + public bool ContinueWork() + { + if(m_dlg == null) { Debug.Assert(false); return true; } + + return m_dlg.ContinueWork(); + } + } + + public static IStatusLogger CreateStatusDialog(Form fParent, out Form fOptDialog, + string strTitle, string strOp, bool bCanCancel, bool bMarqueeProgress) + { + if(string.IsNullOrEmpty(strTitle)) strTitle = PwDefs.ShortProductName; + if(strOp == null) strOp = string.Empty; + + IStatusLogger sl; + // if(NativeProgressDialog.IsSupported) + // { + // ProgDlgFlags fl = (ProgDlgFlags.AutoTime | ProgDlgFlags.NoMinimize); + // if(!bCanCancel) fl |= ProgDlgFlags.NoCancel; + // if(bMarqueeProgress) fl |= ProgDlgFlags.MarqueeProgress; + // sl = new NativeProgressDialog((fParent != null) ? fParent.Handle : + // IntPtr.Zero, fl); + // fOptDialog = null; + // } + // else + // { + StatusProgressFormWrapper w = new StatusProgressFormWrapper(fParent, + strTitle, bCanCancel, bMarqueeProgress); + sl = w; + fOptDialog = w.Form; + // } + + sl.StartLogging(strOp, false); + return sl; + } + } +} diff -Nru keepass2-2.16+dfsg/KeePass/UI/TabControlEx.cs keepass2-2.18+dfsg/KeePass/UI/TabControlEx.cs --- keepass2-2.16+dfsg/KeePass/UI/TabControlEx.cs 2011-07-09 15:16:58.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/TabControlEx.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/TaskbarList.cs keepass2-2.18+dfsg/KeePass/UI/TaskbarList.cs --- keepass2-2.16+dfsg/KeePass/UI/TaskbarList.cs 2011-03-02 10:51:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/TaskbarList.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/ThemeToolStripRenderer.cs keepass2-2.18+dfsg/KeePass/UI/ThemeToolStripRenderer.cs --- keepass2-2.16+dfsg/KeePass/UI/ThemeToolStripRenderer.cs 2011-01-01 11:37:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/ThemeToolStripRenderer.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/UISystemFonts.cs keepass2-2.18+dfsg/KeePass/UI/UISystemFonts.cs --- keepass2-2.16+dfsg/KeePass/UI/UISystemFonts.cs 2011-07-09 15:16:58.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/UISystemFonts.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/UIUtil.cs keepass2-2.18+dfsg/KeePass/UI/UIUtil.cs --- keepass2-2.16+dfsg/KeePass/UI/UIUtil.cs 2011-06-09 11:02:48.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/UIUtil.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -87,7 +87,7 @@ try { NativeMethods.CHARFORMAT2 cf = new NativeMethods.CHARFORMAT2(); - cf.cbSize = (UInt32)Marshal.SizeOf(cf); + cf.cbSize = (uint)Marshal.SizeOf(cf); cf.dwMask = NativeMethods.CFM_LINK; cf.dwEffects = NativeMethods.CFE_LINK; @@ -104,6 +104,35 @@ catch(Exception) { Debug.Assert(false); } } + private static NativeMethods.CHARFORMAT2 RtfGetCharFormat(RichTextBox rtb) + { + NativeMethods.CHARFORMAT2 cf = new NativeMethods.CHARFORMAT2(); + cf.cbSize = (uint)Marshal.SizeOf(cf); + + try + { + IntPtr wParam = (IntPtr)NativeMethods.SCF_SELECTION; + IntPtr lParam = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf)); + Marshal.StructureToPtr(cf, lParam, false); + + NativeMethods.SendMessage(rtb.Handle, + NativeMethods.EM_GETCHARFORMAT, wParam, lParam); + + cf = (NativeMethods.CHARFORMAT2)Marshal.PtrToStructure(lParam, + typeof(NativeMethods.CHARFORMAT2)); + Marshal.FreeCoTaskMem(lParam); + } + catch(Exception) { Debug.Assert(false); } + + return cf; + } + + public static bool RtfIsFirstCharLink(RichTextBox rtb) + { + NativeMethods.CHARFORMAT2 cf = RtfGetCharFormat(rtb); + return ((cf.dwEffects & NativeMethods.CFE_LINK) != 0); + } + public static void RtfLinkifyExtUrls(RichTextBox richTextBox, bool bResetSelection) { const string strProto = "cmd://"; @@ -151,6 +180,32 @@ catch(Exception) { Debug.Assert(false); } } + public static void RtfLinkifyReferences(RichTextBox rtb, + bool bResetTempSelection) + { + try + { + string str = rtb.Text; + + int iOffset = 0; + while(true) + { + int iStart = str.IndexOf(SprEngine.StrRefStart, iOffset, + StrUtil.CaseIgnoreCmp); + if(iStart < 0) break; + int iEnd = str.IndexOf(SprEngine.StrRefEnd, iStart + 1, + StrUtil.CaseIgnoreCmp); + if(iEnd <= iStart) break; + + string strRef = str.Substring(iStart, iEnd - iStart + 1); + RtfLinkifyText(rtb, strRef, bResetTempSelection); + + iOffset = iStart + 1; + } + } + catch(Exception) { Debug.Assert(false); } + } + public static Image CreateColorBitmap24(int nWidth, int nHeight, Color color) { Bitmap bmp = new Bitmap(nWidth, nHeight, PixelFormat.Format24bppRgb); @@ -420,7 +475,6 @@ if(pe.ParentGroup != null) { string strGroup = pe.ParentGroup.GetFullPath(); - if(strGroup != lvg.Header) { lvg = new ListViewGroup(strGroup, HorizontalAlignment.Left); @@ -483,6 +537,125 @@ lv.EndUpdate(); } + /// + /// Fill a ListView with password entries. + /// + public static void CreateEntryList(ListView lv, List lCtxs, + AceAutoTypeCtxFlags f, ImageList ilIcons) + { + if(lv == null) throw new ArgumentNullException("lv"); + if(lCtxs == null) throw new ArgumentNullException("lCtxs"); + + lv.BeginUpdate(); + + lv.Items.Clear(); + lv.Columns.Clear(); + lv.ShowGroups = true; + lv.SmallImageList = ilIcons; + + Debug.Assert((f & AceAutoTypeCtxFlags.ColTitle) != AceAutoTypeCtxFlags.None); + f |= AceAutoTypeCtxFlags.ColTitle; // Enforce title + + lv.Columns.Add(KPRes.Title); + if((f & AceAutoTypeCtxFlags.ColUserName) != AceAutoTypeCtxFlags.None) + lv.Columns.Add(KPRes.UserName); + if((f & AceAutoTypeCtxFlags.ColPassword) != AceAutoTypeCtxFlags.None) + lv.Columns.Add(KPRes.Password); + if((f & AceAutoTypeCtxFlags.ColUrl) != AceAutoTypeCtxFlags.None) + lv.Columns.Add(KPRes.Url); + if((f & AceAutoTypeCtxFlags.ColNotes) != AceAutoTypeCtxFlags.None) + lv.Columns.Add(KPRes.Notes); + if((f & AceAutoTypeCtxFlags.ColSequence) != AceAutoTypeCtxFlags.None) + lv.Columns.Add(KPRes.Sequence); + + ListViewGroup lvg = new ListViewGroup(Guid.NewGuid().ToString()); + DateTime dtNow = DateTime.Now; + bool bFirstEntry = true; + + foreach(AutoTypeCtx ctx in lCtxs) + { + if(ctx == null) { Debug.Assert(false); continue; } + PwEntry pe = ctx.Entry; + if(pe == null) { Debug.Assert(false); continue; } + PwDatabase pd = ctx.Database; + if(pd == null) { Debug.Assert(false); continue; } + + if(pe.ParentGroup != null) + { + string strGroup = pe.ParentGroup.GetFullPath(" - ", true); + if(strGroup != lvg.Header) + { + lvg = new ListViewGroup(strGroup, HorizontalAlignment.Left); + lv.Groups.Add(lvg); + } + } + + SprContext sprCtx = new SprContext(pe, pd, SprCompileFlags.Deref); + sprCtx.ForcePlainTextPasswords = false; + + ListViewItem lvi = new ListViewItem(SprEngine.Compile( + pe.Strings.ReadSafe(PwDefs.TitleField), sprCtx)); + + if(pe.Expires && (pe.ExpiryTime <= dtNow)) + lvi.ImageIndex = (int)PwIcon.Expired; + else if(pe.CustomIconUuid == PwUuid.Zero) + lvi.ImageIndex = (int)pe.IconId; + else + { + int nInx = pd.GetCustomIconIndex(pe.CustomIconUuid); + if(nInx > -1) + { + ilIcons.Images.Add(new Bitmap(pd.GetCustomIcon( + pe.CustomIconUuid))); + lvi.ImageIndex = ilIcons.Images.Count - 1; + } + else { Debug.Assert(false); lvi.ImageIndex = (int)pe.IconId; } + } + + if((f & AceAutoTypeCtxFlags.ColUserName) != AceAutoTypeCtxFlags.None) + lvi.SubItems.Add(SprEngine.Compile(pe.Strings.ReadSafe( + PwDefs.UserNameField), sprCtx)); + if((f & AceAutoTypeCtxFlags.ColPassword) != AceAutoTypeCtxFlags.None) + lvi.SubItems.Add(SprEngine.Compile(pe.Strings.ReadSafe( + PwDefs.PasswordField), sprCtx)); + if((f & AceAutoTypeCtxFlags.ColUrl) != AceAutoTypeCtxFlags.None) + lvi.SubItems.Add(SprEngine.Compile(pe.Strings.ReadSafe( + PwDefs.UrlField), sprCtx)); + if((f & AceAutoTypeCtxFlags.ColNotes) != AceAutoTypeCtxFlags.None) + lvi.SubItems.Add(StrUtil.MultiToSingleLine(SprEngine.Compile( + pe.Strings.ReadSafe(PwDefs.NotesField), sprCtx))); + if((f & AceAutoTypeCtxFlags.ColSequence) != AceAutoTypeCtxFlags.None) + lvi.SubItems.Add(ctx.Sequence); + Debug.Assert(lvi.SubItems.Count == lv.Columns.Count); + + if(!pe.ForegroundColor.IsEmpty) + lvi.ForeColor = pe.ForegroundColor; + if(!pe.BackgroundColor.IsEmpty) + lvi.BackColor = pe.BackgroundColor; + + lvi.Tag = ctx; + + lv.Items.Add(lvi); + lvg.Items.Add(lvi); + + if(bFirstEntry) + { + lvi.Selected = true; + lvi.Focused = true; + + bFirstEntry = false; + } + } + + lv.EndUpdate(); + + int nColWidth = lv.ClientRectangle.Width / lv.Columns.Count; + foreach(ColumnHeader ch in lv.Columns) + { + ch.Width = nColWidth; + } + } + public static int GetVScrollBarWidth() { try { return SystemInformation.VerticalScrollBarWidth; } @@ -682,15 +855,46 @@ { if((tn == null) || (pg == null)) { Debug.Assert(false); return; } - if(pg.Notes.Length > 0) - { - string str = pg.Name + MessageService.NewParagraph + pg.Notes; + string str = GetPwGroupToolTip(pg); + if(str == null) return; - try { tn.ToolTipText = str; } - catch(Exception) { Debug.Assert(false); } + try { tn.ToolTipText = str; } + catch(Exception) { Debug.Assert(false); } + } + + public static string GetPwGroupToolTip(PwGroup pg) + { + if(pg == null) { Debug.Assert(false); return null; } + + StringBuilder sb = new StringBuilder(); + sb.Append(pg.Name); + + string strNotes = pg.Notes.Trim(); + if(strNotes.Length > 0) + { + sb.Append(MessageService.NewParagraph); + sb.Append(strNotes); } + else return null; + + // uint uSubGroups, uEntries; + // pg.GetCounts(true, out uSubGroups, out uEntries); + // sb.Append(MessageService.NewParagraph); + // sb.Append(KPRes.Subgroups); sb.Append(": "); sb.Append(uSubGroups); + // sb.Append(MessageService.NewLine); + // sb.Append(KPRes.Entries); sb.Append(": "); sb.Append(uEntries); + + return sb.ToString(); } + // public static string GetPwGroupToolTipTN(TreeNode tn) + // { + // if(tn == null) { Debug.Assert(false); return null; } + // PwGroup pg = (tn.Tag as PwGroup); + // if(pg == null) { Debug.Assert(false); return null; } + // return GetPwGroupToolTip(pg); + // } + public static Color LightenColor(Color clrBase, double dblFactor) { if((dblFactor <= 0.0) || (dblFactor > 1.0)) return clrBase; @@ -807,7 +1011,6 @@ if(pb == null) throw new ArgumentNullException("pb"); MemoryStream ms = new MemoryStream(pb, false); - try { return Image.FromStream(ms); } catch(Exception) { @@ -816,14 +1019,15 @@ throw; } + finally { ms.Close(); } } private static Image TryLoadIco(byte[] pb) { MemoryStream ms = new MemoryStream(pb, false); - try { return (new Icon(ms)).ToBitmap(); } catch(Exception) { } + finally { ms.Close(); } return null; } @@ -852,12 +1056,32 @@ public static void ConfigureTbButton(ToolStripItem tb, string strText, string strTooltip) { + ConfigureTbButton(tb, strText, strTooltip, null); + } + + private static char[] m_vTbTrim = null; + public static void ConfigureTbButton(ToolStripItem tb, string strText, + string strTooltip, ToolStripMenuItem tsmiEquiv) + { if(strText != null) tb.Text = strText; - if(strTooltip != null) - tb.ToolTipText = StrUtil.RemoveAccelerator(strTooltip); - else if(strText != null) - tb.ToolTipText = StrUtil.RemoveAccelerator(strText); + if(m_vTbTrim == null) + m_vTbTrim = new char[] { ' ', '\t', '\r', '\n', '.', '\u2026' }; + + string strTip = (strTooltip ?? strText); + if(strTip == null) return; + + strTip = StrUtil.RemoveAccelerator(strTip); + strTip = strTip.Trim(m_vTbTrim); + + if((tsmiEquiv != null) && (strTip.Length > 0)) + { + string strShortcut = tsmiEquiv.ShortcutKeyDisplayString; + if(!string.IsNullOrEmpty(strShortcut)) + strTip += " (" + strShortcut + ")"; + } + + tb.ToolTipText = strTip; } public static void CreateGroupList(PwGroup pgContainer, ComboBox cmb, @@ -989,29 +1213,55 @@ Color clrBg = lv.BackColor; - // Items in sorted groups don't have display-ordered indices - // (in contrast to a non-grouped sorted list) - if(lv.ShowGroups && (lv.ListViewItemSorter != null)) - bAlternate = false; - - for(int i = 0; i < lv.Items.Count; ++i) + if(!lv.ShowGroups || !bAlternate) { - ListViewItem lvi = lv.Items[i]; - Debug.Assert(lvi.Index == i); - Debug.Assert(lvi.UseItemStyleForSubItems); - - if(!bAlternate) + for(int i = 0; i < lv.Items.Count; ++i) { - if(ColorsEqual(lvi.BackColor, clrAlternate)) + ListViewItem lvi = lv.Items[i]; + Debug.Assert(lvi.Index == i); + Debug.Assert(lvi.UseItemStyleForSubItems); + + if(!bAlternate) + { + if(ColorsEqual(lvi.BackColor, clrAlternate)) + lvi.BackColor = clrBg; + } + else if(((i & 1) == 0) && ColorsEqual(lvi.BackColor, clrAlternate)) lvi.BackColor = clrBg; + else if(((i & 1) == 1) && ColorsEqual(lvi.BackColor, clrBg)) + lvi.BackColor = clrAlternate; + } + } + else // Groups && alternating + { + foreach(ListViewGroup lvg in lv.Groups) + { + // Within the group the items are not in display order, + // but the order can be derived from the item indices + List lItems = new List(); + foreach(ListViewItem lviEnum in lvg.Items) + lItems.Add(lviEnum); + lItems.Sort(UIUtil.LviCompareByIndex); + + for(int i = 0; i < lItems.Count; ++i) + { + ListViewItem lvi = lItems[i]; + Debug.Assert(lvi.UseItemStyleForSubItems); + + if(((i & 1) == 0) && ColorsEqual(lvi.BackColor, clrAlternate)) + lvi.BackColor = clrBg; + else if(((i & 1) == 1) && ColorsEqual(lvi.BackColor, clrBg)) + lvi.BackColor = clrAlternate; + } } - else if(((i & 1) == 0) && ColorsEqual(lvi.BackColor, clrAlternate)) - lvi.BackColor = clrBg; - else if(((i & 1) == 1) && ColorsEqual(lvi.BackColor, clrBg)) - lvi.BackColor = clrAlternate; } } + private static int LviCompareByIndex(ListViewItem a, ListViewItem b) + { + return a.Index.CompareTo(b.Index); + } + public static bool SetSortIcon(ListView lv, int iColumn, SortOrder so) { if(lv == null) { Debug.Assert(false); return false; } @@ -1275,6 +1525,30 @@ else { Debug.Assert(false); } } + public static string GetColumnWidths(ListView lv) + { + if(lv == null) { Debug.Assert(false); return string.Empty; } + + int n = lv.Columns.Count; + int[] vSizes = new int[n]; + for(int i = 0; i < n; ++i) vSizes[i] = lv.Columns[i].Width; + + return StrUtil.SerializeIntArray(vSizes); + } + + public static void SetColumnWidths(ListView lv, string strSizes) + { + if(string.IsNullOrEmpty(strSizes)) return; // No assert + + int[] vSizes = StrUtil.DeserializeIntArray(strSizes); + + int n = lv.Columns.Count; + Debug.Assert(n == vSizes.Length); + + for(int i = 0; i < Math.Min(n, vSizes.Length); ++i) + lv.Columns[i].Width = vSizes[i]; + } + public static void SetButtonImage(Button btn, Image img, bool b16To15) { if(btn == null) { Debug.Assert(false); return; } @@ -1606,7 +1880,7 @@ if(string.IsNullOrEmpty(strWav)) strWav = @"%SystemRoot%\Media\Windows User Account Control.wav"; - strWav = SprEngine.Compile(strWav, false, null, null, false, false); + strWav = SprEngine.Compile(strWav, null); if(!File.Exists(strWav)) throw new FileNotFoundException(); @@ -1663,5 +1937,86 @@ return null; } + + /// + /// Set the state of a window. This is a workaround for + /// https://sourceforge.net/projects/keepass/forums/forum/329221/topic/4610118 + /// + public static void SetWindowState(Form f, FormWindowState fws) + { + if(f == null) { Debug.Assert(false); return; } + + f.WindowState = fws; + + // If the window state change / resize handler changes + // the window state again, the property gets out of sync + // with the real state. Therefore, we now make sure that + // the property is synchronized with the actual window + // state. + try + { + // Get the value that .NET currently caches; note + // this isn't necessarily the real window state + // due to the bug + FormWindowState fwsCached = f.WindowState; + + IntPtr hWnd = f.Handle; + if(hWnd == IntPtr.Zero) { Debug.Assert(false); return; } + + // Get the real state using Windows API functions + bool bIsRealMin = NativeMethods.IsIconic(hWnd); + bool bIsRealMax = NativeMethods.IsZoomed(hWnd); + + FormWindowState? fwsFix = null; + if(bIsRealMin && (fwsCached != FormWindowState.Minimized)) + fwsFix = FormWindowState.Minimized; + else if(bIsRealMax && (fwsCached != FormWindowState.Maximized) && + !bIsRealMin) + fwsFix = FormWindowState.Maximized; + else if(!bIsRealMin && !bIsRealMax && + (fwsCached != FormWindowState.Normal)) + fwsFix = FormWindowState.Normal; + + if(fwsFix.HasValue) + { + // If the window is invisible, no state + // change / resize handlers are called + bool bVisible = f.Visible; + if(bVisible) f.Visible = false; + f.WindowState = fwsFix.Value; + if(bVisible) f.Visible = true; + } + } + catch(Exception) { Debug.Assert(KeePassLib.Native.NativeLib.IsUnix()); } + } + + private static KeysConverter m_convKeys = null; + public static string GetKeysName(Keys k) + { + if(m_convKeys == null) m_convKeys = new KeysConverter(); + return m_convKeys.ConvertToString(k); + } + + /// + /// Assign shortcut keys to a menu item. This method uses + /// custom-translated display strings. + /// + public static void AssignShortcut(ToolStripMenuItem tsmi, Keys k) + { + if(tsmi == null) { Debug.Assert(false); return; } + + tsmi.ShortcutKeys = k; + + string str = string.Empty; + if((k & Keys.Control) != Keys.None) + str += KPRes.KeyboardKeyCtrl + "+"; + if((k & Keys.Alt) != Keys.None) + str += KPRes.KeyboardKeyAlt + "+"; + if((k & Keys.Shift) != Keys.None) + str += KPRes.KeyboardKeyShift + "+"; + str += GetKeysName(k & Keys.KeyCode); + + tsmi.ShortcutKeyDisplayString = str; + } } } diff -Nru keepass2-2.16+dfsg/KeePass/UI/UserActivityNotifyFilter.cs keepass2-2.18+dfsg/KeePass/UI/UserActivityNotifyFilter.cs --- keepass2-2.16+dfsg/KeePass/UI/UserActivityNotifyFilter.cs 2011-01-01 11:37:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/UserActivityNotifyFilter.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/UI/VistaTaskDialog.cs keepass2-2.18+dfsg/KeePass/UI/VistaTaskDialog.cs --- keepass2-2.16+dfsg/KeePass/UI/VistaTaskDialog.cs 2011-01-01 11:37:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/UI/VistaTaskDialog.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -186,7 +186,8 @@ public sealed class VistaTaskDialog { - private const int VtdConfigSize = 96; + private const int VtdConfigSize32 = 96; + private const int VtdConfigSize64 = 160; private VtdConfig m_cfg = new VtdConfig(true); private int m_iResult = (int)DialogResult.Cancel; @@ -222,6 +223,12 @@ } } + public string FooterText + { + get { return m_cfg.pszFooter; } + set { m_cfg.pszFooter = value; } + } + public string VerificationText { get { return m_cfg.pszVerificationText; } @@ -275,6 +282,12 @@ m_cfg.hMainIcon = hIcon; } + public void SetFooterIcon(VtdIcon vtdIcon) + { + m_cfg.dwFlags &= ~VtdFlags.UseHIconFooter; + m_cfg.hFooterIcon = new IntPtr((int)vtdIcon); + } + private void ButtonsToPtr() { if(m_vButtons.Count == 0) { m_cfg.pButtons = IntPtr.Zero; return; } @@ -317,7 +330,10 @@ private bool InternalShowDialog() { if(IntPtr.Size == 4) - { Debug.Assert(Marshal.SizeOf(typeof(VtdConfig)) == VtdConfigSize); } + { Debug.Assert(Marshal.SizeOf(typeof(VtdConfig)) == VtdConfigSize32); } + else if(IntPtr.Size == 8) + { Debug.Assert(Marshal.SizeOf(typeof(VtdConfig)) == VtdConfigSize64); } + else { Debug.Assert(false); } m_cfg.cbSize = (uint)Marshal.SizeOf(typeof(VtdConfig)); diff -Nru keepass2-2.16+dfsg/KeePass/Util/AppLocator.cs keepass2-2.18+dfsg/KeePass/Util/AppLocator.cs --- keepass2-2.16+dfsg/KeePass/Util/AppLocator.cs 2011-01-01 11:37:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/AppLocator.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -27,6 +27,7 @@ using KeePass.Util.Spr; +using KeePassLib.Native; using KeePassLib.Security; using KeePassLib.Utility; @@ -34,85 +35,74 @@ { public static class AppLocator { - private static string m_strIE = null; - private static string m_strFirefox = null; - private static string m_strOpera = null; - private static string m_strChrome = null; + private const int BrwIE = 0; + private const int BrwFirefox = 1; + private const int BrwOpera = 2; + private const int BrwChrome = 3; + private const int BrwSafari = 4; + + private static Dictionary m_dictPaths = + new Dictionary(); public static string InternetExplorerPath { - get - { - if(m_strIE != null) return m_strIE; - else - { - try { m_strIE = FindInternetExplorer(); } - catch(Exception) { m_strIE = null; } - - return m_strIE; - } - } + get { return GetPath(BrwIE, FindInternetExplorer); } } public static string FirefoxPath { - get - { - if(m_strFirefox != null) return m_strFirefox; - else - { - try { m_strFirefox = FindFirefox(); } - catch(Exception) { m_strFirefox = null; } - - return m_strFirefox; - } - } + get { return GetPath(BrwFirefox, FindFirefox); } } public static string OperaPath { - get - { - if(m_strOpera != null) return m_strOpera; - else - { - try { m_strOpera = FindOpera(); } - catch(Exception) { m_strOpera = null; } - - return m_strOpera; - } - } + get { return GetPath(BrwOpera, FindOpera); } } public static string ChromePath { - get - { - if(m_strChrome != null) return m_strChrome; - else - { - try { m_strChrome = FindChrome(); } - catch(Exception) { m_strChrome = null; } + get { return GetPath(BrwChrome, FindChrome); } + } - return m_strChrome; - } - } + public static string SafariPath + { + get { return GetPath(BrwSafari, FindSafari); } } - public static string FillPlaceholders(string strText, SprContentFlags cf) + private delegate string FindAppDelegate(); + + private static string GetPath(int iBrwID, FindAppDelegate f) + { + string strPath; + if(m_dictPaths.TryGetValue(iBrwID, out strPath)) return strPath; + + try { strPath = f(); } + catch(Exception) { strPath = null; } + + m_dictPaths[iBrwID] = strPath; + return strPath; + } + + public static string FillPlaceholders(string strText, SprContext ctx) { string str = strText; - str = AppLocator.ReplacePath(str, @"{INTERNETEXPLORER}", AppLocator.InternetExplorerPath, cf); - str = AppLocator.ReplacePath(str, @"{FIREFOX}", AppLocator.FirefoxPath, cf); - str = AppLocator.ReplacePath(str, @"{OPERA}", AppLocator.OperaPath, cf); - str = AppLocator.ReplacePath(str, @"{GOOGLECHROME}", AppLocator.ChromePath, cf); + str = AppLocator.ReplacePath(str, @"{INTERNETEXPLORER}", + AppLocator.InternetExplorerPath, ctx); + str = AppLocator.ReplacePath(str, @"{FIREFOX}", + AppLocator.FirefoxPath, ctx); + str = AppLocator.ReplacePath(str, @"{OPERA}", + AppLocator.OperaPath, ctx); + str = AppLocator.ReplacePath(str, @"{GOOGLECHROME}", + AppLocator.ChromePath, ctx); + str = AppLocator.ReplacePath(str, @"{SAFARI}", + AppLocator.SafariPath, ctx); return str; } private static string ReplacePath(string str, string strPlaceholder, - string strFill, SprContentFlags cf) + string strFill, SprContext ctx) { if(str == null) { Debug.Assert(false); return string.Empty; } if(strPlaceholder == null) { Debug.Assert(false); return str; } @@ -120,10 +110,10 @@ if(strFill == null) return str; // No assert string strRep; - if((cf != null) && cf.EncodeQuotesForCommandLine) - strRep = "\"" + SprEngine.TransformContent(strFill, cf) + "\""; + if((ctx != null) && ctx.EncodeQuotesForCommandLine) + strRep = "\"" + SprEngine.TransformContent(strFill, ctx) + "\""; else - strRep = SprEngine.TransformContent("\"" + strFill + "\"", cf); + strRep = SprEngine.TransformContent("\"" + strFill + "\"", ctx); return StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, strRep); } @@ -154,6 +144,8 @@ private static string FindFirefox() { + if(NativeLib.IsUnix()) return FindAppUnix("firefox"); + try { string strPath = FindFirefoxPr(false); @@ -205,6 +197,8 @@ private static string FindOpera() { + if(NativeLib.IsUnix()) return FindAppUnix("opera"); + RegistryKey kHtml = Registry.ClassesRoot.OpenSubKey("Opera.HTML", false); RegistryKey kShell = kHtml.OpenSubKey("shell", false); RegistryKey kOpen = kShell.OpenSubKey("open", false); @@ -228,6 +222,8 @@ // HKEY_CLASSES_ROOT\\ChromeHTML\\shell\\open\\command private static string FindChrome() { + if(NativeLib.IsUnix()) return FindAppUnix("chromium-browser"); + RegistryKey kHtml = Registry.ClassesRoot.OpenSubKey("ChromeHTML", false); RegistryKey kShell = kHtml.OpenSubKey("shell", false); RegistryKey kOpen = kShell.OpenSubKey("open", false); @@ -272,5 +268,42 @@ kApps.Close(); return strPath; } + + // HKEY_LOCAL_MACHINE\\SOFTWARE\\Apple Computer, Inc.\\Safari\\BrowserExe + private static string FindSafari() + { + RegistryKey kSoftware = Registry.LocalMachine.OpenSubKey("SOFTWARE", false); + RegistryKey kApple = kSoftware.OpenSubKey("Apple Computer, Inc.", false); + RegistryKey kSafari = kApple.OpenSubKey("Safari", false); + string strPath = (kSafari.GetValue("BrowserExe") as string); + + if(strPath != null) + { + strPath = strPath.Trim(); + strPath = UrlUtil.GetQuotedAppPath(strPath).Trim(); + } + else { Debug.Assert(false); } + + kSafari.Close(); + kApple.Close(); + kSoftware.Close(); + return strPath; + } + + public static string FindAppUnix(string strApp) + { + string str = WinUtil.RunConsoleApp("whereis", "-b " + strApp); + if(str == null) return null; + + str = str.Trim(); + + int iPrefix = str.IndexOf(':'); + if(iPrefix >= 0) str = str.Substring(iPrefix + 1).Trim(); + + int iSep = str.IndexOfAny(new char[]{ ' ', '\t', '\r', '\n' }); + if(iSep >= 0) str = str.Substring(0, iSep); + + return ((str.Length > 0) ? str : null); + } } } diff -Nru keepass2-2.16+dfsg/KeePass/Util/AutoType.cs keepass2-2.18+dfsg/KeePass/Util/AutoType.cs --- keepass2-2.16+dfsg/KeePass/Util/AutoType.cs 2011-03-06 11:32:34.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/AutoType.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -57,8 +57,10 @@ public bool SendObfuscated { get; set; } public PwEntry Entry { get; private set; } + public PwDatabase Database { get; private set; } - public AutoTypeEventArgs(string strSequence, bool bObfuscated, PwEntry pe) + public AutoTypeEventArgs(string strSequence, bool bObfuscated, PwEntry pe, + PwDatabase pd) { if(strSequence == null) throw new ArgumentNullException("strSequence"); // pe may be null @@ -66,6 +68,7 @@ m_strSeq = strSequence; this.SendObfuscated = bObfuscated; this.Entry = pe; + this.Database = pd; } } @@ -122,10 +125,13 @@ return StrUtil.SimplePatternMatch(strF, strWindow, StrUtil.CaseIgnoreCmp); } - private static bool Execute(string strSeq, PwEntry pweData) + private static bool Execute(AutoTypeCtx ctx) { - Debug.Assert(strSeq != null); if(strSeq == null) return false; - Debug.Assert(pweData != null); if(pweData == null) return false; + if(ctx == null) { Debug.Assert(false); return false; } + + string strSeq = ctx.Sequence; + PwEntry pweData = ctx.Entry; + if(pweData == null) { Debug.Assert(false); return false; } if(!pweData.GetAutoTypeEnabled()) return false; if(!AppPolicy.Try(AppPolicyId.AutoType)) return false; @@ -140,18 +146,17 @@ } } - PwDatabase pwDatabase = null; - try { pwDatabase = Program.MainForm.PluginHost.Database; } - catch(Exception) { } + PwDatabase pwDatabase = ctx.Database; bool bObfuscate = (pweData.AutoType.ObfuscationOptions != AutoTypeObfuscationOptions.None); - AutoTypeEventArgs args = new AutoTypeEventArgs(strSeq, bObfuscate, pweData); + AutoTypeEventArgs args = new AutoTypeEventArgs(strSeq, bObfuscate, + pweData, pwDatabase); if(AutoType.FilterCompilePre != null) AutoType.FilterCompilePre(null, args); - args.Sequence = SprEngine.Compile(args.Sequence, true, pweData, - pwDatabase, true, false); + args.Sequence = SprEngine.Compile(args.Sequence, new SprContext( + pweData, pwDatabase, SprCompileFlags.All, true, false)); string strError = ValidateAutoTypeSequence(args.Sequence); if(strError != null) @@ -185,67 +190,136 @@ return true; } - private static bool PerformInternal(PwEntry pwe, string strWindow) + private static bool PerformInternal(AutoTypeCtx ctx, string strWindow) { - Debug.Assert(pwe != null); if(pwe == null) return false; + if(ctx == null) { Debug.Assert(false); return false; } - string strSeq = GetSequenceForWindow(pwe, strWindow, false); - if((strSeq == null) || (strSeq.Length == 0)) return false; + AutoTypeCtx ctxNew = ctx.Clone(); if(Program.Config.Integration.AutoTypePrependInitSequenceForIE && WinUtil.IsInternetExplorer7Window(strWindow)) { - strSeq = @"{DELAY 50}1{DELAY 50}{BACKSPACE}" + strSeq; + ctxNew.Sequence = @"{DELAY 50}1{DELAY 50}{BACKSPACE}" + + ctxNew.Sequence; } - AutoType.Execute(strSeq, pwe); - return true; + return AutoType.Execute(ctxNew); } - private static string GetSequenceForWindow(PwEntry pwe, string strWindow, - bool bRequireDefinedWindow) + private static List GetSequencesForWindow(PwEntry pwe, + string strWindow, PwDatabase pdContext) { - Debug.Assert(strWindow != null); if(strWindow == null) return null; - Debug.Assert(pwe != null); if(pwe == null) return null; + List l = new List(); + + if(pwe == null) { Debug.Assert(false); return l; } + if(strWindow == null) { Debug.Assert(false); return l; } - if(!pwe.GetAutoTypeEnabled()) return null; + if(!pwe.GetAutoTypeEnabled()) return l; - string strSeq = null; - foreach(KeyValuePair kvp in pwe.AutoType.WindowSequencePairs) + SprContext sprCtx = new SprContext(pwe, pdContext, + SprCompileFlags.NonActive); + + // Specifically defined sequences must match before the title, + // in order to allow selecting the first item as default one + foreach(AutoTypeAssociation a in pwe.AutoType.Associations) { - string strWndSpec = kvp.Key; + string strWndSpec = a.WindowName; if(strWndSpec == null) { Debug.Assert(false); continue; } - strWndSpec = strWndSpec.Trim(); - - if(strWndSpec.Length > 0) - strWndSpec = SprEngine.Compile(strWndSpec, false, pwe, - null, false, false); + strWndSpec = SprEngine.Compile(strWndSpec.Trim(), sprCtx); if(MatchWindows(strWndSpec, strWindow)) { - strSeq = kvp.Value; - break; + string strSeq = a.Sequence; + if(string.IsNullOrEmpty(strSeq)) + strSeq = pwe.GetAutoTypeSequence(); + AddSequence(l, strSeq); } } if(Program.Config.Integration.AutoTypeMatchByTitle) { - string strTitle = pwe.Strings.ReadSafe(PwDefs.TitleField); - strTitle = strTitle.Trim(); + string strTitle = SprEngine.Compile(pwe.Strings.ReadSafe( + PwDefs.TitleField).Trim(), sprCtx); + if((strTitle.Length > 0) && (strWindow.IndexOf(strTitle, + StrUtil.CaseIgnoreCmp) >= 0)) + AddSequence(l, pwe.GetAutoTypeSequence()); + } - if(string.IsNullOrEmpty(strSeq) && (strTitle.Length > 0) && - (strWindow.IndexOf(strTitle, StrUtil.CaseIgnoreCmp) >= 0)) - { - strSeq = pwe.AutoType.DefaultSequence; - Debug.Assert(strSeq != null); - } + string strCmpUrl = null; // To cache compiled URL + if(Program.Config.Integration.AutoTypeMatchByUrlInTitle) + { + strCmpUrl = SprEngine.Compile(pwe.Strings.ReadSafe( + PwDefs.UrlField).Trim(), sprCtx); + if((strCmpUrl.Length > 0) && (strWindow.IndexOf(strCmpUrl, + StrUtil.CaseIgnoreCmp) >= 0)) + AddSequence(l, pwe.GetAutoTypeSequence()); + } + + if(Program.Config.Integration.AutoTypeMatchByUrlHostInTitle) + { + if(strCmpUrl == null) + strCmpUrl = SprEngine.Compile(pwe.Strings.ReadSafe( + PwDefs.UrlField).Trim(), sprCtx); + + string strCleanUrl = StrUtil.RemovePlaceholders(strCmpUrl); + string strHost = UrlUtil.GetHost(strCleanUrl); + + if(strHost.StartsWith("www.", StrUtil.CaseIgnoreCmp) && + (strCleanUrl.StartsWith("http:", StrUtil.CaseIgnoreCmp) || + strCleanUrl.StartsWith("https:", StrUtil.CaseIgnoreCmp))) + strHost = strHost.Substring(4); + + if((strHost.Length > 0) && (strWindow.IndexOf(strHost, + StrUtil.CaseIgnoreCmp) >= 0)) + AddSequence(l, pwe.GetAutoTypeSequence()); } - if((strSeq == null) && bRequireDefinedWindow) return null; + return l; + } - if(!string.IsNullOrEmpty(strSeq)) return strSeq; - return pwe.GetAutoTypeSequence(); + private static void AddSequence(List lSeq, string strSeq) + { + string strCanSeq = CanonicalizeSeq(strSeq); + + for(int i = 0; i < lSeq.Count; ++i) + { + string strCanEx = CanonicalizeSeq(lSeq[i]); + if(strCanEx.Equals(strCanSeq)) return; // Exists already + } + + lSeq.Add(strSeq); // Non-canonical version + } + + private const string StrBraceOpen = @"{1E1F63AB-2F63-4B60-ADBA-7F38B8D7778E}"; + private const string StrBraceClose = @"{34D698D7-CEBF-4AF0-87BF-DC1B1F5E95A0}"; + private static string CanonicalizeSeq(string strSeq) + { + // Preprocessing: balance braces + strSeq = strSeq.Replace(@"{{}", StrBraceOpen); + strSeq = strSeq.Replace(@"{}}", StrBraceClose); + + StringBuilder sb = new StringBuilder(); + + bool bInPlh = false; + for(int i = 0; i < strSeq.Length; ++i) + { + char ch = strSeq[i]; + + if(ch == '{') bInPlh = true; + else if(ch == '}') bInPlh = false; + else if(bInPlh) ch = char.ToUpper(ch); + + sb.Append(ch); + } + + strSeq = sb.ToString(); + + // Postprocessing: restore braces + strSeq = strSeq.Replace(StrBraceOpen, @"{{}"); + strSeq = strSeq.Replace(StrBraceClose, @"{}}"); + + return strSeq; } public static bool IsValidAutoTypeWindow(IntPtr hWindow, bool bBeepIfNot) @@ -285,7 +359,8 @@ if(string.IsNullOrEmpty(strWindow)) return false; if(!IsValidAutoTypeWindow(hWnd, true)) return false; - PwObjectList vList = new PwObjectList(); + List lCtxs = new List(); + PwDatabase pdCurrent = null; DateTime dtNow = DateTime.Now; EntryHandler eh = delegate(PwEntry pe) @@ -293,8 +368,11 @@ // Ignore expired entries if(pe.Expires && (pe.ExpiryTime < dtNow)) return true; - if(GetSequenceForWindow(pe, strWindow, true) != null) - vList.Add(pe); + List lSeq = GetSequencesForWindow(pe, strWindow, pdCurrent); + foreach(string strSeq in lSeq) + { + lCtxs.Add(new AutoTypeCtx(strSeq, pe, pdCurrent)); + } return true; }; @@ -302,36 +380,43 @@ foreach(PwDatabase pwSource in vSources) { if(pwSource.IsOpen == false) continue; + pdCurrent = pwSource; pwSource.RootGroup.TraverseTree(TraversalMethod.PreOrder, null, eh); } - if(vList.UCount == 1) - AutoType.PerformInternal(vList.GetAt(0), strWindow); - else if(vList.UCount > 1) - { - EntryListForm elf = new EntryListForm(); - elf.InitEx(KPRes.AutoTypeEntrySelection, KPRes.AutoTypeEntrySelectionDescShort, - KPRes.AutoTypeEntrySelectionDescLong, - Properties.Resources.B48x48_KGPG_Key2, ilIcons, vList); - elf.EnsureForeground = true; + if(lCtxs.Count == 1) + AutoType.PerformInternal(lCtxs[0], strWindow); + else if(lCtxs.Count > 1) + { + AutoTypeCtxForm dlg = new AutoTypeCtxForm(); + dlg.InitEx(lCtxs, ilIcons); - if(elf.ShowDialog() == DialogResult.OK) + if(dlg.ShowDialog() == DialogResult.OK) { try { NativeMethods.EnsureForegroundWindow(hWnd); } catch(Exception) { Debug.Assert(false); } - if(elf.SelectedEntry != null) - AutoType.PerformInternal(elf.SelectedEntry, strWindow); + if(dlg.SelectedCtx != null) + AutoType.PerformInternal(dlg.SelectedCtx, strWindow); } - UIUtil.DestroyForm(elf); + UIUtil.DestroyForm(dlg); } return true; } + [Obsolete] public static bool PerformIntoPreviousWindow(Form fCurrent, PwEntry pe) { - if((pe != null) && !pe.GetAutoTypeEnabled()) return false; + return PerformIntoPreviousWindow(fCurrent, pe, + Program.MainForm.DocumentManager.SafeFindContainerOf(pe)); + } + + public static bool PerformIntoPreviousWindow(Form fCurrent, PwEntry pe, + PwDatabase pdContext) + { + if(pe == null) { Debug.Assert(false); return false; } + if(!pe.GetAutoTypeEnabled()) return false; if(!AppPolicy.Try(AppPolicyId.AutoTypeWithoutContext)) return false; bool bTopMost = ((fCurrent != null) ? fCurrent.TopMost : false); @@ -341,7 +426,7 @@ { if(!NativeMethods.LoseFocus(fCurrent)) { Debug.Assert(false); } - return PerformIntoCurrentWindow(pe); + return PerformIntoCurrentWindow(pe, pdContext); } finally { @@ -349,8 +434,17 @@ } } + [Obsolete] public static bool PerformIntoCurrentWindow(PwEntry pe) { + return PerformIntoCurrentWindow(pe, + Program.MainForm.DocumentManager.SafeFindContainerOf(pe)); + } + + public static bool PerformIntoCurrentWindow(PwEntry pe, PwDatabase pdContext) + { + if(pe == null) { Debug.Assert(false); return false; } + if(!pe.GetAutoTypeEnabled()) return false; if(!AppPolicy.Try(AppPolicyId.AutoTypeWithoutContext)) return false; string strWindow; @@ -369,7 +463,11 @@ Thread.Sleep(100); - return AutoType.PerformInternal(pe, strWindow); + List lSeq = GetSequencesForWindow(pe, strWindow, pdContext); + if(lSeq.Count == 0) lSeq.Add(pe.GetAutoTypeSequence()); + + AutoTypeCtx ctx = new AutoTypeCtx(lSeq[0], pe, pdContext); + return AutoType.PerformInternal(ctx, strWindow); } private static string ValidateAutoTypeSequence(string strSequence) diff -Nru keepass2-2.16+dfsg/KeePass/Util/AutoTypeCtx.cs keepass2-2.18+dfsg/KeePass/Util/AutoTypeCtx.cs --- keepass2-2.16+dfsg/KeePass/Util/AutoTypeCtx.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/AutoTypeCtx.cs 2012-01-01 12:04:42.000000000 +0000 @@ -0,0 +1,75 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2012 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.Util +{ + /// + /// Auto-type candidate context. + /// + public sealed class AutoTypeCtx + { + private string m_strSeq = string.Empty; + public string Sequence + { + get { return m_strSeq; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strSeq = value; + } + } + + private PwEntry m_pe = null; + public PwEntry Entry + { + get { return m_pe; } + set { m_pe = value; } + } + + private PwDatabase m_pd = null; + public PwDatabase Database + { + get { return m_pd; } + set { m_pd = value; } + } + + public AutoTypeCtx() { } + + public AutoTypeCtx(string strSequence, PwEntry pe, PwDatabase pd) + { + if(strSequence == null) throw new ArgumentNullException("strSequence"); + + m_strSeq = strSequence; + m_pe = pe; + m_pd = pd; + } + + public AutoTypeCtx Clone() + { + return (AutoTypeCtx)this.MemberwiseClone(); + } + } +} diff -Nru keepass2-2.16+dfsg/KeePass/Util/BinaryDataClassifier.cs keepass2-2.18+dfsg/KeePass/Util/BinaryDataClassifier.cs --- keepass2-2.16+dfsg/KeePass/Util/BinaryDataClassifier.cs 2011-06-15 17:14:34.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/BinaryDataClassifier.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -105,11 +105,10 @@ try { Image.FromStream(ms); - - ms.Close(); return BinaryDataClass.Image; } - catch(Exception) { ms.Close(); } + catch(Exception) { } + finally { ms.Close(); } return BinaryDataClass.Unknown; } diff -Nru keepass2-2.16+dfsg/KeePass/Util/CancellableOperationEventArgs.cs keepass2-2.18+dfsg/KeePass/Util/CancellableOperationEventArgs.cs --- keepass2-2.16+dfsg/KeePass/Util/CancellableOperationEventArgs.cs 2011-01-01 11:37:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/CancellableOperationEventArgs.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/CheckForUpdate.cs keepass2-2.18+dfsg/KeePass/Util/CheckForUpdate.cs --- keepass2-2.16+dfsg/KeePass/Util/CheckForUpdate.cs 2011-06-02 08:45:14.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/CheckForUpdate.cs 1970-01-01 00:00:00.000000000 +0000 @@ -1,205 +0,0 @@ -/* - KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 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.Net; -using System.Net.Cache; -using System.Windows.Forms; -using System.Xml; -using System.Diagnostics; -using System.Threading; - -// using KeePass.Native; -using KeePass.Resources; - -using KeePassLib; -using KeePassLib.Resources; -using KeePassLib.Serialization; -using KeePassLib.Utility; - -namespace KeePass.Util -{ - public static class CheckForUpdate - { - private const string ElemRoot = "KeePass"; - - private const string ElemVersionU = "Version32"; - private const string ElemVersionStr = "VersionDisplayString"; - - private static volatile string m_strVersionURL = string.Empty; - private static volatile ToolStripStatusLabel m_tsResultsViewer = null; - - public static void StartAsync(string strVersionUrl, ToolStripStatusLabel tsResultsViewer) - { - m_strVersionURL = strVersionUrl; - m_tsResultsViewer = tsResultsViewer; - - // Local, but thread will continue to run anyway - Thread th = new Thread(new ThreadStart(CheckForUpdate.OnStartCheck)); - th.Start(); - } - - private static void OnStartCheck() - { - // NativeProgressDialog dlg = null; - // if(m_tsResultsViewer == null) - // { - // dlg = new NativeProgressDialog(); - // dlg.StartLogging(KPRes.Wait + "...", false); - // } - - try - { - IOWebClient webClient = new IOWebClient(); - IOConnection.ConfigureWebClient(webClient); - - Uri uri = new Uri(m_strVersionURL); - - webClient.DownloadDataCompleted += - new DownloadDataCompletedEventHandler(OnDownloadCompleted); - - webClient.DownloadDataAsync(uri); - } - // catch(NotImplementedException) - // { - // ReportStatusEx(KLRes.FrameworkNotImplExcp, true); - // } - catch(Exception) { } - - // if(dlg != null) dlg.EndLogging(); - } - - private static void OnDownloadCompleted(object sender, DownloadDataCompletedEventArgs e) - { - string strXmlFile = NetUtil.GZipUtf8ResultToString(e); - - if(strXmlFile == null) - { - if(e.Error != null) - { - if(m_tsResultsViewer == null) - MessageService.ShowWarning(KPRes.UpdateCheckingFailed, e.Error); - else if(e.Error.Message != null) - CheckForUpdate.SetTsStatus(KPRes.UpdateCheckingFailed + " " + - e.Error.Message); - } - else ReportStatusEx(KPRes.UpdateCheckingFailed, true); - - return; - } - - XmlDocument xmlDoc = new XmlDocument(); - - try { xmlDoc.LoadXml(strXmlFile); } - catch(Exception) - { - StructureFail(); - return; - } - - XmlElement xmlRoot = xmlDoc.DocumentElement; - if(xmlRoot == null) { StructureFail(); return; } - if(xmlRoot.Name != ElemRoot) { StructureFail(); return; } - - uint uVersion = 0; - - foreach(XmlNode xmlChild in xmlRoot.ChildNodes) - { - if(xmlChild.Name == ElemVersionU) - uint.TryParse(xmlChild.InnerText, out uVersion); - else if(xmlChild.Name == ElemVersionStr) - { - // strVersion = xmlChild.InnerText; - } - } - - if(uVersion > PwDefs.Version32) - { - if(m_tsResultsViewer == null) - { - if(MessageService.AskYesNo(KPRes.ChkForUpdNewVersion + - MessageService.NewParagraph + KPRes.WebsiteVisitQuestion)) - { - WinUtil.OpenUrl(PwDefs.HomepageUrl, null); - } - } - else CheckForUpdate.SetTsStatus(KPRes.ChkForUpdNewVersion); - } - else if(uVersion == PwDefs.Version32) - ReportStatusEx(KPRes.ChkForUpdGotLatest, false); - else - ReportStatusEx(KPRes.UnknownFileVersion, true); - } - - private static void ReportStatusEx(string strText, bool bIsWarning) - { - ReportStatusEx(strText, strText, bIsWarning); - } - - private static void ReportStatusEx(string strLongText, string strShortText, - bool bIsWarning) - { - if(m_tsResultsViewer == null) - { - if(bIsWarning) MessageService.ShowWarning(strLongText); - else MessageService.ShowInfo(strLongText); - } - else CheckForUpdate.SetTsStatus(strShortText); - } - - private static void StructureFail() - { - Debug.Assert(false); - - if(m_tsResultsViewer == null) - MessageService.ShowWarning(KPRes.InvalidFileStructure); - else - CheckForUpdate.SetTsStatus(KPRes.ChkForUpdGotLatest + " " + - KPRes.InvalidFileStructure); - } - - private static void SetTsStatus(string strText) - { - if(strText == null) { Debug.Assert(false); return; } - if(m_tsResultsViewer == null) { Debug.Assert(false); return; } - - try - { - ToolStrip pParent = m_tsResultsViewer.Owner; - if((pParent != null) && pParent.InvokeRequired) - { - pParent.Invoke(new Priv_CfuSsd(CheckForUpdate.SetTsStatusDirect), - new object[] { strText }); - } - else CheckForUpdate.SetTsStatusDirect(strText); - } - catch(Exception) { Debug.Assert(false); } - } - - public delegate void Priv_CfuSsd(string strText); - - private static void SetTsStatusDirect(string strText) - { - try { m_tsResultsViewer.Text = strText; } - catch(Exception) { Debug.Assert(false); } - } - } -} diff -Nru keepass2-2.16+dfsg/KeePass/Util/ClipboardContents.cs keepass2-2.18+dfsg/KeePass/Util/ClipboardContents.cs --- keepass2-2.16+dfsg/KeePass/Util/ClipboardContents.cs 2011-03-25 19:55:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/ClipboardContents.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/ClipboardEventChainBlocker.cs keepass2-2.18+dfsg/KeePass/Util/ClipboardEventChainBlocker.cs --- keepass2-2.16+dfsg/KeePass/Util/ClipboardEventChainBlocker.cs 2011-05-23 17:29:34.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/ClipboardEventChainBlocker.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/ClipboardUtil.cs keepass2-2.18+dfsg/KeePass/Util/ClipboardUtil.cs --- keepass2-2.16+dfsg/KeePass/Util/ClipboardUtil.cs 2011-03-26 14:11:24.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/ClipboardUtil.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -32,6 +32,7 @@ using KeePass.App; using KeePass.Ecas; using KeePass.Native; +using KeePass.UI; using KeePass.Util; using KeePass.Util.Spr; @@ -76,8 +77,9 @@ if(bIsEntryInfo && !AppPolicy.Try(AppPolicyId.CopyToClipboard)) return false; - string strData = (bSprCompile ? SprEngine.Compile(strToCopy, false, - peEntryInfo, pwReferenceSource, false, false) : strToCopy); + string strData = (bSprCompile ? SprEngine.Compile(strToCopy, + new SprContext(peEntryInfo, pwReferenceSource, + SprCompileFlags.All)) : strToCopy); try { @@ -232,7 +234,7 @@ NativeMethods.LoseFocus(formContext); if(Program.Config.MainWindow.MinimizeAfterClipboardCopy) - formContext.WindowState = FormWindowState.Minimized; + UIUtil.SetWindowState(formContext, FormWindowState.Minimized); } return true; diff -Nru keepass2-2.16+dfsg/KeePass/Util/ClipboardUtil.Windows.cs keepass2-2.18+dfsg/KeePass/Util/ClipboardUtil.Windows.cs --- keepass2-2.16+dfsg/KeePass/Util/ClipboardUtil.Windows.cs 2011-05-25 07:48:56.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/ClipboardUtil.Windows.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/CommandLineArgs.cs keepass2-2.18+dfsg/KeePass/Util/CommandLineArgs.cs --- keepass2-2.16+dfsg/KeePass/Util/CommandLineArgs.cs 2011-04-20 17:55:38.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/CommandLineArgs.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -148,7 +148,10 @@ XmlSerializer xml = new XmlSerializer(typeof(string[])); xml.Serialize(ms, args); - return Convert.ToBase64String(ms.ToArray(), Base64FormattingOptions.None); + string strSerialized = Convert.ToBase64String(ms.ToArray(), + Base64FormattingOptions.None); + ms.Close(); + return strSerialized; } public static string[] SafeDeserialize(string str) @@ -161,6 +164,7 @@ try { return (string[])xml.Deserialize(ms); } catch(Exception) { Debug.Assert(false); } + finally { ms.Close(); } return null; } diff -Nru keepass2-2.16+dfsg/KeePass/Util/EntryMenu.cs keepass2-2.18+dfsg/KeePass/Util/EntryMenu.cs --- keepass2-2.16+dfsg/KeePass/Util/EntryMenu.cs 2011-03-25 19:55:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/EntryMenu.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -170,12 +170,16 @@ private static void OnAutoType(object sender, EventArgs e) { - ToolStripMenuItem tsmi = sender as ToolStripMenuItem; + ToolStripMenuItem tsmi = (sender as ToolStripMenuItem); Debug.Assert(tsmi != null); if(tsmi == null) return; - PwEntry pe = tsmi.Tag as PwEntry; + PwEntry pe = (tsmi.Tag as PwEntry); Debug.Assert(pe != null); if(pe == null) return; - try { AutoType.PerformIntoCurrentWindow(pe); } + try + { + AutoType.PerformIntoCurrentWindow(pe, + Program.MainForm.DocumentManager.SafeFindContainerOf(pe)); + } catch(Exception ex) { MessageService.ShowWarning(ex); @@ -184,13 +188,14 @@ private static void OnCopyField(object sender, string strField) { - ToolStripMenuItem tsmi = sender as ToolStripMenuItem; + ToolStripMenuItem tsmi = (sender as ToolStripMenuItem); Debug.Assert(tsmi != null); if(tsmi == null) return; - PwEntry pe = tsmi.Tag as PwEntry; + PwEntry pe = (tsmi.Tag as PwEntry); Debug.Assert(pe != null); if(pe == null) return; ClipboardUtil.Copy(pe.Strings.ReadSafe(strField), true, true, - pe, Program.MainForm.DocumentManager.ActiveDatabase, IntPtr.Zero); + pe, Program.MainForm.DocumentManager.SafeFindContainerOf(pe), + IntPtr.Zero); } private static void OnCopyUserName(object sender, EventArgs e) diff -Nru keepass2-2.16+dfsg/KeePass/Util/EntryTemplates.cs keepass2-2.18+dfsg/KeePass/Util/EntryTemplates.cs --- keepass2-2.16+dfsg/KeePass/Util/EntryTemplates.cs 2011-07-05 11:47:22.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/EntryTemplates.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -91,7 +91,7 @@ tsmi.Click += OnMenuExecute; Image img = null; - PwDatabase pd = Program.MainForm.ActiveDatabase; + PwDatabase pd = Program.MainForm.DocumentManager.SafeFindContainerOf(pe); if(pd != null) { if(!pe.CustomIconUuid.EqualsValue(PwUuid.Zero)) diff -Nru keepass2-2.16+dfsg/KeePass/Util/EntryUtil.cs keepass2-2.18+dfsg/KeePass/Util/EntryUtil.cs --- keepass2-2.16+dfsg/KeePass/Util/EntryUtil.cs 2011-06-02 15:59:02.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/EntryUtil.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -92,11 +92,13 @@ else continue; // DialogResult.No } - try { File.WriteAllBytes(strFile, kvp.Value.ReadData()); } + byte[] pbData = kvp.Value.ReadData(); + try { File.WriteAllBytes(strFile, pbData); } catch(Exception exWrite) { MessageService.ShowWarning(strFile, exWrite); } + MemUtil.ZeroByteArray(pbData); } if(bCancel) break; } @@ -157,20 +159,16 @@ // Adjust protection settings and add entries foreach(PwEntry pe in vEntries) { - ProtectedString ps = pe.Strings.Get(PwDefs.TitleField); - if(ps != null) ps.EnableProtection(pwDatabase.MemoryProtection.ProtectTitle); - - ps = pe.Strings.Get(PwDefs.UserNameField); - if(ps != null) ps.EnableProtection(pwDatabase.MemoryProtection.ProtectUserName); - - ps = pe.Strings.Get(PwDefs.PasswordField); - if(ps != null) ps.EnableProtection(pwDatabase.MemoryProtection.ProtectPassword); - - ps = pe.Strings.Get(PwDefs.UrlField); - if(ps != null) ps.EnableProtection(pwDatabase.MemoryProtection.ProtectUrl); - - ps = pe.Strings.Get(PwDefs.NotesField); - if(ps != null) ps.EnableProtection(pwDatabase.MemoryProtection.ProtectNotes); + pe.Strings.EnableProtection(PwDefs.TitleField, + pwDatabase.MemoryProtection.ProtectTitle); + pe.Strings.EnableProtection(PwDefs.UserNameField, + pwDatabase.MemoryProtection.ProtectUserName); + pe.Strings.EnableProtection(PwDefs.PasswordField, + pwDatabase.MemoryProtection.ProtectPassword); + pe.Strings.EnableProtection(PwDefs.UrlField, + pwDatabase.MemoryProtection.ProtectUrl); + pe.Strings.EnableProtection(PwDefs.NotesField, + pwDatabase.MemoryProtection.ProtectNotes); pgStorage.AddEntry(pe, true, true); } @@ -178,304 +176,26 @@ gz.Close(); ms.Close(); } - public static string FillPlaceholders(string strText, PwEntry pe, - PwDatabase pd, SprContentFlags cf) - { - if(pe == null) return strText; - - string str = strText; - - // Legacy, for backward compatibility only; see PickChars - str = ReplacePickPw(str, pe, pd, cf); - - return str; - } - - public static string FillPlaceholdersFinal(string strText, PwEntry pe, - PwDatabase pd, SprContentFlags cf) - { - if(pe == null) return strText; - - string str = strText; - - str = ReplacePickChars(str, pe, pd, cf); - str = ReplaceNewPasswordPlaceholder(str, pe, pd, cf); - str = ReplaceHmacOtpPlaceholder(str, pe, pd, cf); - - return str; - } - - /* private static string ReplacePickPw(string strText, PwEntry pe, - SprContentFlags cf) + public static string FillPlaceholders(string strText, SprContext ctx) { - string str = strText; - - for(int iID = 1; iID < (int.MaxValue - 1); ++iID) - { - string strPlaceholder = @"{PICKPASSWORDCHARS"; - if(iID > 1) strPlaceholder += iID.ToString(); - strPlaceholder += @"}"; - - if(str.IndexOf(strPlaceholder, StrUtil.CaseIgnoreCmp) >= 0) - { - ProtectedString ps = pe.Strings.Get(PwDefs.PasswordField); - if(ps != null) - { - byte[] pb = ps.ReadUtf8(); - bool bNotEmpty = (pb.Length > 0); - Array.Clear(pb, 0, pb.Length); - - if(bNotEmpty) - { - CharPickerForm cpf = new CharPickerForm(); - cpf.InitEx(ps, true, true, 0); - - if(cpf.ShowDialog() == DialogResult.OK) - str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, - SprEngine.TransformContent(cpf.SelectedCharacters.ReadString(), cf)); - UIUtil.DestroyForm(cpf); - } - } - - str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, string.Empty); - } - else break; - } - - return str; - } */ - - // Legacy, for backward compatibility only; see PickChars - private static string ReplacePickPw(string strText, PwEntry pe, - PwDatabase pd, SprContentFlags cf) - { - string str = strText; - - while(true) - { - const string strStart = @"{PICKPASSWORDCHARS"; - - int iStart = str.IndexOf(strStart, StrUtil.CaseIgnoreCmp); - if(iStart < 0) break; - - int iEnd = str.IndexOf('}', iStart); - if(iEnd < 0) break; - - string strPlaceholder = str.Substring(iStart, iEnd - iStart + 1); - - string strParam = str.Substring(iStart + strStart.Length, - iEnd - (iStart + strStart.Length)); - string[] vParams = strParam.Split(new char[]{ ':' }); - - uint uCharCount = 0; - if(vParams.Length >= 2) uint.TryParse(vParams[1], out uCharCount); - - str = ReplacePickPwPlaceholder(str, strPlaceholder, pe, pd, cf, uCharCount); - } - - return str; - } - - private static string ReplacePickPwPlaceholder(string str, - string strPlaceholder, PwEntry pe, PwDatabase pd, SprContentFlags cf, - uint uCharCount) - { - if(str.IndexOf(strPlaceholder, StrUtil.CaseIgnoreCmp) < 0) return str; - - ProtectedString ps = pe.Strings.Get(PwDefs.PasswordField); - if(ps != null) - { - string strPassword = ps.ReadString(); - string strPick = SprEngine.Compile(strPassword, false, pe, pd, - false, false); // Do not transform content yet + if((ctx == null) || (ctx.Entry == null)) return strText; - if(!string.IsNullOrEmpty(strPick)) - { - ProtectedString psPick = new ProtectedString(false, strPick); - CharPickerForm dlg = new CharPickerForm(); - dlg.InitEx(psPick, true, true, uCharCount, null); - - if(dlg.ShowDialog() == DialogResult.OK) - str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, - SprEngine.TransformContent(dlg.SelectedCharacters.ReadString(), cf)); - UIUtil.DestroyForm(dlg); - } - } - - return StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, string.Empty); - } - - private static string ReplacePickChars(string strText, PwEntry pe, - PwDatabase pd, SprContentFlags cf) - { string str = strText; - Dictionary dPicked = new Dictionary(); - while(true) - { - const string strStart = @"{PICKCHARS"; - - int iStart = str.IndexOf(strStart, StrUtil.CaseIgnoreCmp); - if(iStart < 0) break; - - int iEnd = str.IndexOf('}', iStart); - if(iEnd < 0) break; - - string strPlaceholder = str.Substring(iStart, iEnd - iStart + 1); - - string strParam = str.Substring(iStart + strStart.Length, - iEnd - (iStart + strStart.Length)); - - string strRep = string.Empty; - bool bEncode = true; - - if(strParam.Length == 0) - strRep = ShowCharPickDlg(pe.Strings.GetSafe(PwDefs.PasswordField), - 0, null); - else if(strParam.StartsWith(":")) - { - string strParams = strParam.Substring(1); - string[] vParams = strParams.Split(new char[] { ':' }, - StringSplitOptions.None); - - string strField = string.Empty; - if(vParams.Length >= 1) strField = (vParams[0] ?? string.Empty).Trim(); - if(strField.Length == 0) strField = PwDefs.PasswordField; - - string strOptions = string.Empty; - if(vParams.Length >= 2) strOptions = (vParams[1] ?? string.Empty); - - Dictionary dOptions = new Dictionary(); - string[] vOptions = strOptions.Split(new char[] { ',' }, - StringSplitOptions.RemoveEmptyEntries); - foreach(string strOption in vOptions) - { - string[] vKvp = strOption.Split(new char[] { '=' }, - StringSplitOptions.None); - if(vKvp.Length != 2) continue; - - dOptions[vKvp[0].Trim().ToLower()] = vKvp[1].Trim(); - } - - string strID = string.Empty; - if(dOptions.ContainsKey("id")) strID = dOptions["id"].ToLower(); - - uint uCharCount = 0; - if(dOptions.ContainsKey("c")) - uint.TryParse(dOptions["c"], out uCharCount); - if(dOptions.ContainsKey("count")) - uint.TryParse(dOptions["count"], out uCharCount); - - bool? bInitHide = null; - if(dOptions.ContainsKey("hide")) - bInitHide = StrUtil.StringToBool(dOptions["hide"]); - - ProtectedString psContent = pe.Strings.GetSafe(strField); - if(psContent.Length == 0) { } // Leave strRep empty - else if((strID.Length > 0) && dPicked.ContainsKey(strID)) - strRep = dPicked[strID]; - else - strRep = ShowCharPickDlg(psContent, uCharCount, bInitHide); - - if(strID.Length > 0) dPicked[strID] = strRep; + if((ctx.Flags & SprCompileFlags.NewPassword) != SprCompileFlags.None) + str = ReplaceNewPasswordPlaceholder(str, ctx); - if(dOptions.ContainsKey("conv")) - { - int iOffset = 0; - if(dOptions.ContainsKey("conv-offset")) - int.TryParse(dOptions["conv-offset"], out iOffset); - - string strConvFmt = string.Empty; - if(dOptions.ContainsKey("conv-fmt")) - strConvFmt = dOptions["conv-fmt"]; - - string strConv = dOptions["conv"]; - if(strConv.Equals("d", StrUtil.CaseIgnoreCmp)) - { - strRep = ConvertToDownArrows(strRep, iOffset, strConvFmt); - bEncode = false; - } - } - } - - str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, - bEncode ? SprEngine.TransformContent(strRep, cf) : strRep); - } + if((ctx.Flags & SprCompileFlags.HmacOtp) != SprCompileFlags.None) + str = ReplaceHmacOtpPlaceholder(str, ctx); return str; } - private static string ShowCharPickDlg(ProtectedString psWord, uint uCharCount, - bool? bInitHide) - { - CharPickerForm cpf = new CharPickerForm(); - cpf.InitEx(psWord, true, true, uCharCount, bInitHide); - - string strResult = string.Empty; - if(cpf.ShowDialog() == DialogResult.OK) - strResult = cpf.SelectedCharacters.ReadString(); - - UIUtil.DestroyForm(cpf); - return strResult; - } - - private static string ConvertToDownArrows(string str, int iOffset, - string strLayout) - { - if(string.IsNullOrEmpty(str)) return string.Empty; - - StringBuilder sb = new StringBuilder(); - for(int i = 0; i < str.Length; ++i) - { - // if((sb.Length > 0) && !string.IsNullOrEmpty(strSep)) sb.Append(strSep); - - char ch = str[i]; - - int? iDowns = null; - if(strLayout.Length == 0) - { - if((ch >= '0') && (ch <= '9')) iDowns = (int)ch - '0'; - else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a'; - else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A'; - } - else if(strLayout.Equals("0a", StrUtil.CaseIgnoreCmp)) - { - if((ch >= '0') && (ch <= '9')) iDowns = (int)ch - '0'; - else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a' + 10; - else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A' + 10; - } - else if(strLayout.Equals("a0", StrUtil.CaseIgnoreCmp)) - { - if((ch >= '0') && (ch <= '9')) iDowns = (int)ch - '0' + 26; - else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a'; - else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A'; - } - else if(strLayout.Equals("1a", StrUtil.CaseIgnoreCmp)) - { - if((ch >= '1') && (ch <= '9')) iDowns = (int)ch - '1'; - else if(ch == '0') iDowns = 9; - else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a' + 10; - else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A' + 10; - } - else if(strLayout.Equals("a1", StrUtil.CaseIgnoreCmp)) - { - if((ch >= '1') && (ch <= '9')) iDowns = (int)ch - '1' + 26; - else if(ch == '0') iDowns = 9 + 26; - else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a'; - else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A'; - } - - if(!iDowns.HasValue) continue; - - for(int j = 0; j < (iOffset + iDowns); ++j) sb.Append(@"{DOWN}"); - } - - return sb.ToString(); - } - private static string ReplaceNewPasswordPlaceholder(string strText, - PwEntry pe, PwDatabase pd, SprContentFlags cf) + SprContext ctx) { + PwEntry pe = ctx.Entry; + PwDatabase pd = ctx.Database; if((pe == null) || (pd == null)) return strText; string str = strText; @@ -483,19 +203,20 @@ const string strNewPwPlh = @"{NEWPASSWORD}"; if(str.IndexOf(strNewPwPlh, StrUtil.CaseIgnoreCmp) >= 0) { - ProtectedString psAutoGen = new ProtectedString( - pd.MemoryProtection.ProtectPassword); - PwgError e = PwGenerator.Generate(psAutoGen, + ProtectedString psAutoGen; + PwgError e = PwGenerator.Generate(out psAutoGen, Program.Config.PasswordGenerator.AutoGeneratedPasswordsProfile, null, Program.PwGeneratorPool); + psAutoGen = psAutoGen.WithProtection(pd.MemoryProtection.ProtectPassword); if(e == PwgError.Success) { pe.CreateBackup(pd); pe.Strings.Set(PwDefs.PasswordField, psAutoGen); + pe.Touch(true, false); pd.Modified = true; - string strIns = SprEngine.TransformContent(psAutoGen.ReadString(), cf); + string strIns = SprEngine.TransformContent(psAutoGen.ReadString(), ctx); str = StrUtil.ReplaceCaseInsensitive(str, strNewPwPlh, strIns); } } @@ -504,8 +225,10 @@ } private static string ReplaceHmacOtpPlaceholder(string strText, - PwEntry pe, PwDatabase pd, SprContentFlags cf) + SprContext ctx) { + PwEntry pe = ctx.Entry; + PwDatabase pd = ctx.Database; if((pe == null) || (pd == null)) return strText; string str = strText; diff -Nru keepass2-2.16+dfsg/KeePass/Util/GlobalMutexPool.cs keepass2-2.18+dfsg/KeePass/Util/GlobalMutexPool.cs --- keepass2-2.16+dfsg/KeePass/Util/GlobalMutexPool.cs 2011-04-22 11:48:38.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/GlobalMutexPool.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/HotKeyManager.cs keepass2-2.18+dfsg/KeePass/Util/HotKeyManager.cs --- keepass2-2.16+dfsg/KeePass/Util/HotKeyManager.cs 2011-03-12 10:10:56.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/HotKeyManager.cs 2012-01-01 12:04:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/IniFile.cs keepass2-2.18+dfsg/KeePass/Util/IniFile.cs --- keepass2-2.16+dfsg/KeePass/Util/IniFile.cs 2011-01-01 11:37:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/IniFile.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/IpcBroadcast.cs keepass2-2.18+dfsg/KeePass/Util/IpcBroadcast.cs --- keepass2-2.16+dfsg/KeePass/Util/IpcBroadcast.cs 2011-04-22 10:46:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/IpcBroadcast.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/IpcBroadcast.Fsw.cs keepass2-2.18+dfsg/KeePass/Util/IpcBroadcast.Fsw.cs --- keepass2-2.16+dfsg/KeePass/Util/IpcBroadcast.Fsw.cs 2011-04-22 09:37:02.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/IpcBroadcast.Fsw.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/IpcUtilEx.cs keepass2-2.18+dfsg/KeePass/Util/IpcUtilEx.cs --- keepass2-2.16+dfsg/KeePass/Util/IpcUtilEx.cs 2011-04-22 09:29:06.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/IpcUtilEx.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/KeyUtil.cs keepass2-2.18+dfsg/KeePass/Util/KeyUtil.cs --- keepass2-2.16+dfsg/KeePass/Util/KeyUtil.cs 2011-03-08 13:24:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/KeyUtil.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -59,7 +59,7 @@ if(Program.KeyProviderPool.IsKeyProvider(strKeyFile)) { KeyProviderQueryContext ctxKP = new KeyProviderQueryContext( - IOConnectionInfo.FromPath(args.FileName), false); + IOConnectionInfo.FromPath(args.FileName), false, false); bool bPerformHash; byte[] pbProvKey = Program.KeyProviderPool.GetKey(strKeyFile, ctxKP, diff -Nru keepass2-2.16+dfsg/KeePass/Util/NetUtil.cs keepass2-2.18+dfsg/KeePass/Util/NetUtil.cs --- keepass2-2.16+dfsg/KeePass/Util/NetUtil.cs 2011-03-19 15:04:22.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/NetUtil.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -30,7 +30,7 @@ { public static class NetUtil { - public static string GZipUtf8ResultToString(DownloadDataCompletedEventArgs e) + /* public static string GZipUtf8ResultToString(DownloadDataCompletedEventArgs e) { if(e.Cancelled || (e.Error != null) || (e.Result == null)) return null; @@ -57,7 +57,7 @@ msZipped.Close(); return StrUtil.Utf8.GetString(msUTF8.ToArray()); - } + } */ public static string WebPageLogin(Uri url, string strPostData, out List> vCookies) diff -Nru keepass2-2.16+dfsg/KeePass/Util/PwGeneratorUtil.cs keepass2-2.18+dfsg/KeePass/Util/PwGeneratorUtil.cs --- keepass2-2.16+dfsg/KeePass/Util/PwGeneratorUtil.cs 2011-02-04 18:58:32.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/PwGeneratorUtil.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -32,13 +32,30 @@ { public static class PwGeneratorUtil { - /// - /// Add standard profiles if none are available. If there is - /// at least one profile available, this function does nothing. - /// - public static void AddStandardProfilesIfNoneAvailable() + private static string m_strBuiltInSuffix = null; + internal static string BuiltInSuffix + { + get + { + if(m_strBuiltInSuffix == null) + m_strBuiltInSuffix = " (" + KPRes.BuiltIn + ")"; + return m_strBuiltInSuffix; + } + } + + private static List m_lBuiltIn = null; + public static List BuiltInProfiles + { + get + { + if(m_lBuiltIn == null) AllocStandardProfiles(); + return m_lBuiltIn; + } + } + + private static void AllocStandardProfiles() { - if(Program.Config.PasswordGenerator.UserProfiles.Count > 0) return; + m_lBuiltIn = new List(); AddStdPattern(KPRes.RandomMacAddress, @"HH\-HH\-HH\-HH\-HH\-HH"); @@ -52,12 +69,60 @@ { PwProfile p = new PwProfile(); - p.Name = strName; + p.Name = strName + PwGeneratorUtil.BuiltInSuffix; p.CollectUserEntropy = false; p.GeneratorType = PasswordGeneratorType.Pattern; p.Pattern = strPattern; - Program.Config.PasswordGenerator.UserProfiles.Add(p); + m_lBuiltIn.Add(p); + } + + /// + /// Get a list of all password generator profiles (built-in + /// and user-defined ones). + /// + public static List GetAllProfiles(bool bSort) + { + List lUser = Program.Config.PasswordGenerator.UserProfiles; + + // Sort it in the configuration file + if(bSort) lUser.Sort(PwGeneratorUtil.CompareProfilesByName); + + // Remove old built-in profiles by KeePass <= 2.17 + for(int i = lUser.Count - 1; i >= 0; --i) + { + if(IsBuiltInProfile(lUser[i].Name)) lUser.RemoveAt(i); + } + + List l = new List(); + l.AddRange(PwGeneratorUtil.BuiltInProfiles); + l.AddRange(lUser); + if(bSort) l.Sort(PwGeneratorUtil.CompareProfilesByName); + return l; + } + + public static bool IsBuiltInProfile(string strName) + { + if(strName == null) { Debug.Assert(false); return false; } + + string strWithSuffix = strName + PwGeneratorUtil.BuiltInSuffix; + foreach(PwProfile p in PwGeneratorUtil.BuiltInProfiles) + { + if(p.Name.Equals(strName, StrUtil.CaseIgnoreCmp) || + p.Name.Equals(strWithSuffix, StrUtil.CaseIgnoreCmp)) + return true; + } + + return false; + } + + public static int CompareProfilesByName(PwProfile a, PwProfile b) + { + if(a == b) return 0; + if(a == null) { Debug.Assert(false); return -1; } + if(b == null) { Debug.Assert(false); return 1; } + + return StrUtil.CompareNaturally(a.Name, b.Name); } } } diff -Nru keepass2-2.16+dfsg/KeePass/Util/SearchUtil.cs keepass2-2.18+dfsg/KeePass/Util/SearchUtil.cs --- keepass2-2.16+dfsg/KeePass/Util/SearchUtil.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/SearchUtil.cs 2012-01-01 12:06:50.000000000 +0000 @@ -0,0 +1,68 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2012 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.Util.Spr; + +using KeePassLib; + +namespace KeePass.Util +{ + public static class SearchUtil + { + internal const string StrTrfDeref = "Deref"; + + internal static void PrepareForSerialize(SearchParameters sp) + { + if(sp == null) { Debug.Assert(false); return; } + + sp.DataTransformation = GetTransformation(sp); + } + + internal static void FinishDeserialize(SearchParameters sp) + { + if(sp == null) { Debug.Assert(false); return; } + + SetTransformation(sp, sp.DataTransformation); + } + + internal static string GetTransformation(SearchParameters spIn) + { + if(spIn == null) { Debug.Assert(false); return string.Empty; } + + if(spIn.DataTransformationFn == null) return string.Empty; + return StrTrfDeref; + } + + internal static void SetTransformation(SearchParameters spOut, + string strTrf) + { + if(spOut == null) { Debug.Assert(false); return; } + if(strTrf == null) { Debug.Assert(false); return; } + + if(strTrf == StrTrfDeref) + spOut.DataTransformationFn = SprEngine.DerefFn; + else spOut.DataTransformationFn = null; + } + } +} diff -Nru keepass2-2.16+dfsg/KeePass/Util/SendInputEx.cs keepass2-2.18+dfsg/KeePass/Util/SendInputEx.cs --- keepass2-2.16+dfsg/KeePass/Util/SendInputEx.cs 2011-05-23 17:29:34.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/SendInputEx.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -86,7 +86,7 @@ SiStateEx si = new SiStateEx(); if(KeePassLib.Native.NativeLib.IsUnix()) { - si.DefaultDelay /= 2; // Starting external program takes time + si.DefaultDelay /= 3; // Starting external program takes time return si; } diff -Nru keepass2-2.16+dfsg/KeePass/Util/SendInputEx.Unix.cs keepass2-2.18+dfsg/KeePass/Util/SendInputEx.Unix.cs --- keepass2-2.16+dfsg/KeePass/Util/SendInputEx.Unix.cs 2011-05-08 08:47:46.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/SendInputEx.Unix.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -98,6 +98,8 @@ // the xdotool command line parameter is wrapped in '') strSequence = strSequence.Replace(@"'", @"{apostrophe}"); + strSequence = strSequence.Replace("\\", @"{backslash}"); + StringBuilder sb = new StringBuilder(); bool bInCode = false; Keys kMod = Keys.None; diff -Nru keepass2-2.16+dfsg/KeePass/Util/SendInputEx.Windows.cs keepass2-2.18+dfsg/KeePass/Util/SendInputEx.Windows.cs --- keepass2-2.16+dfsg/KeePass/Util/SendInputEx.Windows.cs 2011-03-22 19:44:14.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/SendInputEx.Windows.cs 2012-01-04 15:21:26.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -39,6 +39,8 @@ si.CurrentKeyboardLayout = hklSelf; + if(!Program.Config.Integration.AutoTypeAdjustKeyboardLayout) return; + if(hklSelf != hklTarget) { si.OriginalKeyboardLayout = NativeMethods.ActivateKeyboardLayout( @@ -307,7 +309,7 @@ // Workaround for ^/& .NET SendKeys bug: // https://connect.microsoft.com/VisualStudio/feedback/details/93922/sendkeys-send-sends-wrong-character - string[] vSpecial = new string[]{ @"{^}", @"{%}", @"´", @"`" }; + string[] vSpecial = new string[]{ @"{^}", @"{%}", @"´", @"`", @"@" }; List vSend = StrUtil.SplitWithSep(strSequence, vSpecial, true); foreach(string strSend in vSend) @@ -318,6 +320,7 @@ else if(strSend.Equals(@"{%}")) SendCharNative('%'); else if(strSend.Equals(@"´")) SendCharNative('´'); else if(strSend.Equals(@"`")) SendCharNative('`'); + else if(strSend.Equals(@"@")) SendCharNative('@'); else SendKeys.SendWait(strSend); } } diff -Nru keepass2-2.16+dfsg/KeePass/Util/SessionLockNotifier.cs keepass2-2.18+dfsg/KeePass/Util/SessionLockNotifier.cs --- keepass2-2.16+dfsg/KeePass/Util/SessionLockNotifier.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/SessionLockNotifier.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/ShellUtil.cs keepass2-2.18+dfsg/KeePass/Util/ShellUtil.cs --- keepass2-2.16+dfsg/KeePass/Util/ShellUtil.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/ShellUtil.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/Spr/SprContentFlags.cs keepass2-2.18+dfsg/KeePass/Util/Spr/SprContentFlags.cs --- keepass2-2.16+dfsg/KeePass/Util/Spr/SprContentFlags.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/Spr/SprContentFlags.cs 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -/* - KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 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.Util.Spr -{ - public sealed class SprContentFlags - { - private bool m_bMakeAT; - public bool EncodeAsAutoTypeSequence - { - get { return m_bMakeAT; } - } - - private bool m_bMakeCmdQuotes; - public bool EncodeQuotesForCommandLine - { - get { return m_bMakeCmdQuotes; } - } - - private bool m_bNoUrlSchemeOnce = false; - public bool UrlRemoveSchemeOnce - { - get { return m_bNoUrlSchemeOnce; } - set { m_bNoUrlSchemeOnce = value; } - } - - public SprContentFlags(bool bEncodeAsAutoTypeSequence, - bool bEncodeQuotesForCommandLine) - { - m_bMakeAT = bEncodeAsAutoTypeSequence; - m_bMakeCmdQuotes = bEncodeQuotesForCommandLine; - } - } -} diff -Nru keepass2-2.16+dfsg/KeePass/Util/Spr/SprContext.cs keepass2-2.18+dfsg/KeePass/Util/Spr/SprContext.cs --- keepass2-2.16+dfsg/KeePass/Util/Spr/SprContext.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/Spr/SprContext.cs 2012-01-01 12:06:50.000000000 +0000 @@ -0,0 +1,172 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2012 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; +using KeePassLib.Interfaces; + +using SprRefsCache = System.Collections.Generic.Dictionary; + +namespace KeePass.Util.Spr +{ + [Flags] + public enum SprCompileFlags + { + None = 0, + + AppPaths = 0x1, // Paths to IE, Firefox, Opera, ... + PickChars = 0x2, + EntryStrings = 0x4, + UrlRmvScm = 0x8, + PasswordEnc = 0x10, + Group = 0x20, + Paths = 0x40, // App-dir, doc-dir, path sep, ... + AutoType = 0x80, // Replacements like {CLEARFIELD}, ... + DateTime = 0x100, + References = 0x200, + EnvVars = 0x400, + NewPassword = 0x800, + HmacOtp = 0x1000, + Comments = 0x2000, + + All = 0x3FFF, + + UIInteractive = SprCompileFlags.PickChars, + StateChanging = (SprCompileFlags.NewPassword | SprCompileFlags.HmacOtp), + + Active = (SprCompileFlags.UIInteractive | SprCompileFlags.StateChanging), + NonActive = (SprCompileFlags.All & ~SprCompileFlags.Active), + + Deref = (SprCompileFlags.EntryStrings | SprCompileFlags.UrlRmvScm | + SprCompileFlags.References) + } + + public sealed class SprContext + { + private PwEntry m_pe = null; + public PwEntry Entry + { + get { return m_pe; } + set { m_pe = value; } + } + + private PwDatabase m_pd = null; + public PwDatabase Database + { + get { return m_pd; } + set { m_pd = value; } + } + + private bool m_bMakeAT = false; + public bool EncodeAsAutoTypeSequence + { + get { return m_bMakeAT; } + set { m_bMakeAT = value; } + } + + private bool m_bMakeCmdQuotes = false; + public bool EncodeQuotesForCommandLine + { + get { return m_bMakeCmdQuotes; } + set { m_bMakeCmdQuotes = value; } + } + + private bool m_bForcePlainTextPasswords = true; + public bool ForcePlainTextPasswords + { + get { return m_bForcePlainTextPasswords; } + set { m_bForcePlainTextPasswords = value; } + } + + private SprCompileFlags m_flags = SprCompileFlags.All; + public SprCompileFlags Flags + { + get { return m_flags; } + set { m_flags = value; } + } + + private SprRefsCache m_refsCache = new SprRefsCache(); + /// + /// Used internally by SprEngine; don't modify it. + /// + internal SprRefsCache RefsCache + { + get { return m_refsCache; } + } + + private bool m_bNoUrlSchemeOnce = false; + /// + /// Used internally by SprEngine; don't modify it. + /// + internal bool UrlRemoveSchemeOnce + { + get { return m_bNoUrlSchemeOnce; } + set { m_bNoUrlSchemeOnce = value; } + } + + public SprContext() { } + + public SprContext(PwEntry pe, PwDatabase pd, SprCompileFlags fl) + { + Init(pe, pd, false, false, fl); + } + + public SprContext(PwEntry pe, PwDatabase pd, SprCompileFlags fl, + bool bEncodeAsAutoTypeSequence, bool bEncodeQuotesForCommandLine) + { + Init(pe, pd, bEncodeAsAutoTypeSequence, bEncodeQuotesForCommandLine, fl); + } + + private void Init(PwEntry pe, PwDatabase pd, bool bAT, bool bCmdQuotes, + SprCompileFlags fl) + { + m_pe = pe; + m_pd = pd; + m_bMakeAT = bAT; + m_bMakeCmdQuotes = bCmdQuotes; + m_flags = fl; + } + + public SprContext Clone() + { + return (SprContext)this.MemberwiseClone(); + } + + /// + /// Used by SprEngine internally; do not use. + /// + internal SprContext WithoutContentTransformations() + { + SprContext ctx = Clone(); + + ctx.m_bMakeAT = false; + ctx.m_bMakeCmdQuotes = false; + ctx.m_bNoUrlSchemeOnce = false; + + Debug.Assert(object.ReferenceEquals(m_pe, ctx.m_pe)); + Debug.Assert(object.ReferenceEquals(m_pd, ctx.m_pd)); + Debug.Assert(object.ReferenceEquals(m_refsCache, ctx.m_refsCache)); + return ctx; + } + } +} diff -Nru keepass2-2.16+dfsg/KeePass/Util/Spr/SprEncoding.cs keepass2-2.18+dfsg/KeePass/Util/Spr/SprEncoding.cs --- keepass2-2.16+dfsg/KeePass/Util/Spr/SprEncoding.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/Spr/SprEncoding.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/Spr/SprEngine.cs keepass2-2.18+dfsg/KeePass/Util/Spr/SprEngine.cs --- keepass2-2.16+dfsg/KeePass/Util/Spr/SprEngine.cs 2011-06-21 15:51:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/Spr/SprEngine.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -24,234 +24,230 @@ using System.IO; using System.Diagnostics; +using KeePass.App.Configuration; + using KeePassLib; using KeePassLib.Collections; using KeePassLib.Security; using KeePassLib.Utility; -using SprRefsCache = System.Collections.Generic.Dictionary; - namespace KeePass.Util.Spr { /// /// String placeholders and field reference replacement engine. /// - public static class SprEngine + public static partial class SprEngine { private const uint MaxRecursionDepth = 12; private const StringComparison ScMethod = StringComparison.OrdinalIgnoreCase; private static string m_strAppExePath = string.Empty; + // private static readonly char[] m_vPlhEscapes = new char[] { '{', '}', '%' }; + private static void InitializeStatic() { m_strAppExePath = WinUtil.GetExecutable(); } + [Obsolete] public static string Compile(string strText, bool bIsAutoTypeSequence, PwEntry pwEntry, PwDatabase pwDatabase, bool bEscapeForAutoType, bool bEscapeQuotesForCommandLine) { + SprContext ctx = new SprContext(pwEntry, pwDatabase, SprCompileFlags.All, + bEscapeForAutoType, bEscapeQuotesForCommandLine); + return Compile(strText, ctx); + } + + public static string Compile(string strText, SprContext ctx) + { if(strText == null) { Debug.Assert(false); return string.Empty; } if(strText.Length == 0) return string.Empty; SprEngine.InitializeStatic(); - SprContentFlags cf = new SprContentFlags(bEscapeForAutoType && - bIsAutoTypeSequence, bEscapeQuotesForCommandLine); - - SprRefsCache vRefsCache = new SprRefsCache(); + if(ctx == null) ctx = new SprContext(); + ctx.RefsCache.Clear(); - string str = SprEngine.CompileInternal(strText, pwEntry, pwDatabase, - cf, 0, vRefsCache); + string str = SprEngine.CompileInternal(strText, ctx, 0); - if(bEscapeForAutoType && !bIsAutoTypeSequence) - str = SprEncoding.MakeAutoTypeSequence(str); + // if(bEscapeForAutoType && !bIsAutoTypeSequence) + // str = SprEncoding.MakeAutoTypeSequence(str); return str; } - private static string CompileInternal(string strText, PwEntry pwEntry, - PwDatabase pwDatabase, SprContentFlags cf, uint uRecursionLevel, - SprRefsCache vRefsCache) + private static string CompileInternal(string strText, SprContext ctx, + uint uRecursionLevel) { if(strText == null) { Debug.Assert(false); return string.Empty; } + if(ctx == null) { Debug.Assert(false); ctx = new SprContext(); } if(uRecursionLevel >= SprEngine.MaxRecursionDepth) { Debug.Assert(false); // Most likely a recursive reference - return string.Empty; // Do not return strText + return string.Empty; // Do not return strText (endless loop) } string str = strText; - str = AppLocator.FillPlaceholders(str, cf); - str = EntryUtil.FillPlaceholders(str, pwEntry, pwDatabase, cf); - if(pwEntry != null) + if((ctx.Flags & SprCompileFlags.Comments) != SprCompileFlags.None) + str = RemoveComments(str); + + if((ctx.Flags & SprCompileFlags.AppPaths) != SprCompileFlags.None) + str = AppLocator.FillPlaceholders(str, ctx); + + if(ctx.Entry != null) { - List vKeys = pwEntry.Strings.GetKeys(); + if((ctx.Flags & SprCompileFlags.PickChars) != SprCompileFlags.None) + str = ReplacePickPw(str, ctx, uRecursionLevel); - // Ensure that all standard field names are in the list - // (this is required in order to replace the standard placeholders - // even if the corresponding standard field isn't present in - // the entry) - List vStdNames = PwDefs.GetStandardFields(); - foreach(string strStdField in vStdNames) - { - if(!vKeys.Contains(strStdField)) vKeys.Add(strStdField); - } + if((ctx.Flags & SprCompileFlags.EntryStrings) != SprCompileFlags.None) + str = FillEntryStrings(str, ctx, uRecursionLevel); - // Do not directly enumerate the strings in pwEntry.Strings, - // because strings might change during the Spr compilation - foreach(string strField in vKeys) + if((ctx.Flags & SprCompileFlags.UrlRmvScm) != SprCompileFlags.None) { - string strKey = (PwDefs.IsStandardField(strField) ? - (@"{" + strField + @"}") : - (@"{" + PwDefs.AutoTypeStringPrefix + strField + @"}")); - - // Use GetSafe because the field doesn't necessarily exist - // (might be a standard field that has been added above) - str = SprEngine.FillIfExists(str, strKey, pwEntry.Strings.GetSafe( - strField), pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache); + ctx.UrlRemoveSchemeOnce = true; + str = SprEngine.FillIfExists(str, @"{URL:RMVSCM}", + ctx.Entry.Strings.GetSafe(PwDefs.UrlField), ctx, uRecursionLevel); + Debug.Assert(!ctx.UrlRemoveSchemeOnce); } - if(cf != null) cf.UrlRemoveSchemeOnce = true; - str = SprEngine.FillIfExists(str, @"{URL:RMVSCM}", - pwEntry.Strings.GetSafe(PwDefs.UrlField), pwEntry, - pwDatabase, cf, uRecursionLevel, vRefsCache); - if(cf != null) { Debug.Assert(!cf.UrlRemoveSchemeOnce); } - - if(str.IndexOf(@"{PASSWORD_ENC}", SprEngine.ScMethod) >= 0) + if(((ctx.Flags & SprCompileFlags.PasswordEnc) != SprCompileFlags.None) && + (str.IndexOf(@"{PASSWORD_ENC}", SprEngine.ScMethod) >= 0)) str = SprEngine.FillIfExists(str, @"{PASSWORD_ENC}", new ProtectedString(false, - StrUtil.EncryptString(pwEntry.Strings.ReadSafe(PwDefs.PasswordField))), - pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache); + StrUtil.EncryptString(ctx.Entry.Strings.ReadSafe(PwDefs.PasswordField))), + ctx, uRecursionLevel); - if(pwEntry.ParentGroup != null) + if(((ctx.Flags & SprCompileFlags.Group) != SprCompileFlags.None) && + (ctx.Entry.ParentGroup != null)) { str = SprEngine.FillIfExists(str, @"{GROUP}", new ProtectedString( - false, pwEntry.ParentGroup.Name), pwEntry, pwDatabase, - cf, uRecursionLevel, vRefsCache); + false, ctx.Entry.ParentGroup.Name), ctx, uRecursionLevel); str = SprEngine.FillIfExists(str, @"{GROUPPATH}", new ProtectedString( - false, pwEntry.ParentGroup.GetFullPath()), pwEntry, pwDatabase, - cf, uRecursionLevel, vRefsCache); + false, ctx.Entry.ParentGroup.GetFullPath()), ctx, uRecursionLevel); } } - if(m_strAppExePath != null) + if((ctx.Flags & SprCompileFlags.Paths) != SprCompileFlags.None) str = SprEngine.FillIfExists(str, @"{APPDIR}", new ProtectedString( false, UrlUtil.GetFileDirectory(m_strAppExePath, false, false)), - pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache); + ctx, uRecursionLevel); + + if(ctx.Database != null) + { + if((ctx.Flags & SprCompileFlags.Paths) != SprCompileFlags.None) + { + // For backward compatibility only + str = SprEngine.FillIfExists(str, @"{DOCDIR}", new ProtectedString( + false, UrlUtil.GetFileDirectory(ctx.Database.IOConnectionInfo.Path, + false, false)), ctx, uRecursionLevel); + + str = SprEngine.FillIfExists(str, @"{DB_PATH}", new ProtectedString( + false, ctx.Database.IOConnectionInfo.Path), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DB_DIR}", new ProtectedString( + false, UrlUtil.GetFileDirectory(ctx.Database.IOConnectionInfo.Path, + false, false)), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DB_NAME}", new ProtectedString( + false, UrlUtil.GetFileName(ctx.Database.IOConnectionInfo.Path)), + ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DB_BASENAME}", new ProtectedString( + false, UrlUtil.StripExtension(UrlUtil.GetFileName( + ctx.Database.IOConnectionInfo.Path))), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DB_EXT}", new ProtectedString( + false, UrlUtil.GetExtension(ctx.Database.IOConnectionInfo.Path)), + ctx, uRecursionLevel); + } + } + + if((ctx.Flags & SprCompileFlags.Paths) != SprCompileFlags.None) + str = SprEngine.FillIfExists(str, @"{ENV_DIRSEP}", new ProtectedString( + false, Path.DirectorySeparatorChar.ToString()), ctx, uRecursionLevel); + + if((ctx.Flags & SprCompileFlags.AutoType) != SprCompileFlags.None) + str = StrUtil.ReplaceCaseInsensitive(str, @"{CLEARFIELD}", + @"{HOME}+({END}){DEL}{DELAY 50}"); - if(pwDatabase != null) + if((ctx.Flags & SprCompileFlags.DateTime) != SprCompileFlags.None) { - // For backward compatibility only - str = SprEngine.FillIfExists(str, @"{DOCDIR}", new ProtectedString( - false, UrlUtil.GetFileDirectory(pwDatabase.IOConnectionInfo.Path, - false, false)), pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache); - - str = SprEngine.FillIfExists(str, @"{DB_PATH}", new ProtectedString( - false, pwDatabase.IOConnectionInfo.Path), pwEntry, pwDatabase, - cf, uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DB_DIR}", new ProtectedString( - false, UrlUtil.GetFileDirectory(pwDatabase.IOConnectionInfo.Path, - false, false)), pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DB_NAME}", new ProtectedString( - false, UrlUtil.GetFileName(pwDatabase.IOConnectionInfo.Path)), - pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DB_BASENAME}", new ProtectedString( - false, UrlUtil.StripExtension(UrlUtil.GetFileName( - pwDatabase.IOConnectionInfo.Path))), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DB_EXT}", new ProtectedString( - false, UrlUtil.GetExtension(pwDatabase.IOConnectionInfo.Path)), - pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache); - } - - str = StrUtil.ReplaceCaseInsensitive(str, @"{CLEARFIELD}", - @"{HOME}+({END}){DEL}{DELAY 50}"); - - str = SprEngine.FillIfExists(str, @"{ENV_DIRSEP}", new ProtectedString( - false, Path.DirectorySeparatorChar.ToString()), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - - DateTime dtNow = DateTime.Now; // Local time - str = SprEngine.FillIfExists(str, @"{DT_YEAR}", new ProtectedString( - false, dtNow.Year.ToString("D4")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DT_MONTH}", new ProtectedString( - false, dtNow.Month.ToString("D2")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DT_DAY}", new ProtectedString( - false, dtNow.Day.ToString("D2")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DT_HOUR}", new ProtectedString( - false, dtNow.Hour.ToString("D2")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DT_MINUTE}", new ProtectedString( - false, dtNow.Minute.ToString("D2")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DT_SECOND}", new ProtectedString( - false, dtNow.Second.ToString("D2")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DT_SIMPLE}", new ProtectedString( - false, dtNow.ToString("yyyyMMddHHmmss")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - - dtNow = dtNow.ToUniversalTime(); - str = SprEngine.FillIfExists(str, @"{DT_UTC_YEAR}", new ProtectedString( - false, dtNow.Year.ToString("D4")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DT_UTC_MONTH}", new ProtectedString( - false, dtNow.Month.ToString("D2")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DT_UTC_DAY}", new ProtectedString( - false, dtNow.Day.ToString("D2")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DT_UTC_HOUR}", new ProtectedString( - false, dtNow.Hour.ToString("D2")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DT_UTC_MINUTE}", new ProtectedString( - false, dtNow.Minute.ToString("D2")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DT_UTC_SECOND}", new ProtectedString( - false, dtNow.Second.ToString("D2")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - str = SprEngine.FillIfExists(str, @"{DT_UTC_SIMPLE}", new ProtectedString( - false, dtNow.ToString("yyyyMMddHHmmss")), pwEntry, pwDatabase, cf, - uRecursionLevel, vRefsCache); - - str = SprEngine.FillRefPlaceholders(str, pwDatabase, cf, uRecursionLevel, - vRefsCache); - - // Replace environment variables - foreach(DictionaryEntry de in Environment.GetEnvironmentVariables()) - { - string strKey = (de.Key as string); - string strValue = (de.Value as string); - - if((strKey != null) && (strValue != null)) - str = SprEngine.FillIfExists(str, @"%" + strKey + @"%", - new ProtectedString(false, strValue), pwEntry, pwDatabase, - cf, uRecursionLevel, vRefsCache); - else { Debug.Assert(false); } + DateTime dtNow = DateTime.Now; // Local time + str = SprEngine.FillIfExists(str, @"{DT_YEAR}", new ProtectedString( + false, dtNow.Year.ToString("D4")), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DT_MONTH}", new ProtectedString( + false, dtNow.Month.ToString("D2")), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DT_DAY}", new ProtectedString( + false, dtNow.Day.ToString("D2")), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DT_HOUR}", new ProtectedString( + false, dtNow.Hour.ToString("D2")), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DT_MINUTE}", new ProtectedString( + false, dtNow.Minute.ToString("D2")), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DT_SECOND}", new ProtectedString( + false, dtNow.Second.ToString("D2")), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DT_SIMPLE}", new ProtectedString( + false, dtNow.ToString("yyyyMMddHHmmss")), ctx, uRecursionLevel); + + dtNow = dtNow.ToUniversalTime(); + str = SprEngine.FillIfExists(str, @"{DT_UTC_YEAR}", new ProtectedString( + false, dtNow.Year.ToString("D4")), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DT_UTC_MONTH}", new ProtectedString( + false, dtNow.Month.ToString("D2")), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DT_UTC_DAY}", new ProtectedString( + false, dtNow.Day.ToString("D2")), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DT_UTC_HOUR}", new ProtectedString( + false, dtNow.Hour.ToString("D2")), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DT_UTC_MINUTE}", new ProtectedString( + false, dtNow.Minute.ToString("D2")), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DT_UTC_SECOND}", new ProtectedString( + false, dtNow.Second.ToString("D2")), ctx, uRecursionLevel); + str = SprEngine.FillIfExists(str, @"{DT_UTC_SIMPLE}", new ProtectedString( + false, dtNow.ToString("yyyyMMddHHmmss")), ctx, uRecursionLevel); + } + + if((ctx.Flags & SprCompileFlags.References) != SprCompileFlags.None) + str = SprEngine.FillRefPlaceholders(str, ctx, uRecursionLevel); + + if(((ctx.Flags & SprCompileFlags.EnvVars) != SprCompileFlags.None) && + (str.IndexOf('%') >= 0)) + { + // Replace environment variables + foreach(DictionaryEntry de in Environment.GetEnvironmentVariables()) + { + string strKey = (de.Key as string); + string strValue = (de.Value as string); + + if((strKey != null) && (strValue != null)) + str = SprEngine.FillIfExists(str, @"%" + strKey + @"%", + new ProtectedString(false, strValue), ctx, uRecursionLevel); + else { Debug.Assert(false); } + } + } + + str = EntryUtil.FillPlaceholders(str, ctx); + + if((ctx.Flags & SprCompileFlags.PickChars) != SprCompileFlags.None) + str = ReplacePickChars(str, ctx, uRecursionLevel); + + if(ctx.EncodeAsAutoTypeSequence) + { + str = StrUtil.NormalizeNewLines(str, false); + str = str.Replace("\n", @"{ENTER}"); } - str = EntryUtil.FillPlaceholdersFinal(str, pwEntry, pwDatabase, cf); return str; } private static string FillIfExists(string strData, string strPlaceholder, - ProtectedString psParsable, PwEntry pwEntry, PwDatabase pwDatabase, - SprContentFlags cf, uint uRecursionLevel, SprRefsCache vRefsCache) + ProtectedString psParsable, SprContext ctx, uint uRecursionLevel) { - // The UrlRemoveSchemeOnce property of cf must be cleared + // The UrlRemoveSchemeOnce property of ctx must be cleared // before this method returns and before any recursive call bool bRemoveScheme = false; - if(cf != null) + if(ctx != null) { - bRemoveScheme = cf.UrlRemoveSchemeOnce; - cf.UrlRemoveSchemeOnce = false; + bRemoveScheme = ctx.UrlRemoveSchemeOnce; + ctx.UrlRemoveSchemeOnce = false; } if(strData == null) { Debug.Assert(false); return string.Empty; } @@ -262,20 +258,21 @@ if(strData.IndexOf(strPlaceholder, SprEngine.ScMethod) >= 0) { string strReplacement = SprEngine.CompileInternal( - psParsable.ReadString(), pwEntry, pwDatabase, null, - uRecursionLevel + 1, vRefsCache); + psParsable.ReadString(), ctx.WithoutContentTransformations(), + uRecursionLevel + 1); - if(bRemoveScheme) strReplacement = UrlUtil.RemoveScheme(strReplacement); + if(bRemoveScheme) + strReplacement = UrlUtil.RemoveScheme(strReplacement); return SprEngine.FillPlaceholder(strData, strPlaceholder, - strReplacement, cf); + strReplacement, ctx); } return strData; } private static string FillPlaceholder(string strData, string strPlaceholder, - string strReplaceWith, SprContentFlags cf) + string strReplaceWith, SprContext ctx) { if(strData == null) { Debug.Assert(false); return string.Empty; } if(strPlaceholder == null) { Debug.Assert(false); return strData; } @@ -283,75 +280,112 @@ if(strReplaceWith == null) { Debug.Assert(false); return strData; } return StrUtil.ReplaceCaseInsensitive(strData, strPlaceholder, - SprEngine.TransformContent(strReplaceWith, cf)); + SprEngine.TransformContent(strReplaceWith, ctx)); } - public static string TransformContent(string strContent, SprContentFlags cf) + public static string TransformContent(string strContent, SprContext ctx) { if(strContent == null) { Debug.Assert(false); return string.Empty; } string str = strContent; - if(cf != null) + if(ctx != null) { - if(cf.EncodeQuotesForCommandLine) + if(ctx.EncodeQuotesForCommandLine) str = SprEncoding.MakeCommandQuotes(str); - if(cf.EncodeAsAutoTypeSequence) + if(ctx.EncodeAsAutoTypeSequence) str = SprEncoding.MakeAutoTypeSequence(str); } return str; } - private static string FillRefPlaceholders(string strSeq, PwDatabase pwDatabase, - SprContentFlags cf, uint uRecursionLevel, SprRefsCache vRefsCache) + private static string FillEntryStrings(string str, SprContext ctx, + uint uRecursionLevel) { - if(pwDatabase == null) return strSeq; + List vKeys = ctx.Entry.Strings.GetKeys(); + + // Ensure that all standard field names are in the list + // (this is required in order to replace the standard placeholders + // even if the corresponding standard field isn't present in + // the entry) + List vStdNames = PwDefs.GetStandardFields(); + foreach(string strStdField in vStdNames) + { + if(!vKeys.Contains(strStdField)) vKeys.Add(strStdField); + } + + // Do not directly enumerate the strings in ctx.Entry.Strings, + // because strings might change during the Spr compilation + foreach(string strField in vKeys) + { + string strKey = (PwDefs.IsStandardField(strField) ? + (@"{" + strField + @"}") : + (@"{" + PwDefs.AutoTypeStringPrefix + strField + @"}")); + + if(!ctx.ForcePlainTextPasswords && strKey.Equals(@"{" + + PwDefs.PasswordField + @"}", StrUtil.CaseIgnoreCmp) && + Program.Config.MainWindow.IsColumnHidden(AceColumnType.Password)) + { + str = SprEngine.FillIfExists(str, strKey, new ProtectedString( + false, PwDefs.HiddenPassword), ctx, uRecursionLevel); + continue; + } + + // Use GetSafe because the field doesn't necessarily exist + // (might be a standard field that has been added above) + str = SprEngine.FillIfExists(str, strKey, ctx.Entry.Strings.GetSafe( + strField), ctx, uRecursionLevel); + } + return str; + } + + private const string StrRemStart = @"{C:"; + private const string StrRemEnd = @"}"; + private static string RemoveComments(string strSeq) + { string str = strSeq; - const string strStart = @"{REF:"; - const string strEnd = @"}"; + while(true) + { + int iStart = str.IndexOf(StrRemStart, SprEngine.ScMethod); + if(iStart < 0) break; + int iEnd = str.IndexOf(StrRemEnd, iStart + 1, SprEngine.ScMethod); + if(iEnd <= iStart) break; + + str = (str.Substring(0, iStart) + str.Substring(iEnd + StrRemEnd.Length)); + } + + return str; + } + + internal const string StrRefStart = @"{REF:"; + internal const string StrRefEnd = @"}"; + private static string FillRefPlaceholders(string strSeq, SprContext ctx, + uint uRecursionLevel) + { + if(ctx.Database == null) return strSeq; + + string str = strSeq; int nOffset = 0; for(int iLoop = 0; iLoop < 20; ++iLoop) { - str = SprEngine.FillRefsUsingCache(str, vRefsCache); + str = SprEngine.FillRefsUsingCache(str, ctx); - int nStart = str.IndexOf(strStart, nOffset, SprEngine.ScMethod); + int nStart = str.IndexOf(StrRefStart, nOffset, SprEngine.ScMethod); if(nStart < 0) break; - int nEnd = str.IndexOf(strEnd, nStart, SprEngine.ScMethod); - if(nEnd < 0) break; + int nEnd = str.IndexOf(StrRefEnd, nStart + 1, SprEngine.ScMethod); + if(nEnd <= nStart) break; string strFullRef = str.Substring(nStart, nEnd - nStart + 1); + char chScan, chWanted; + PwEntry peFound = FindRefTarget(strFullRef, ctx, out chScan, out chWanted); - string strRef = str.Substring(nStart + strStart.Length, nEnd - - nStart - strStart.Length); - if(strRef.Length <= 4) { nOffset = nStart + 1; continue; } - if(strRef[1] != '@') { nOffset = nStart + 1; continue; } - if(strRef[3] != ':') { nOffset = nStart + 1; continue; } - - char chScan = char.ToUpper(strRef[2]); - char chWanted = char.ToUpper(strRef[0]); - - SearchParameters sp = SearchParameters.None; - sp.SearchString = strRef.Substring(4); - if(chScan == 'T') sp.SearchInTitles = true; - else if(chScan == 'U') sp.SearchInUserNames = true; - else if(chScan == 'A') sp.SearchInUrls = true; - else if(chScan == 'P') sp.SearchInPasswords = true; - else if(chScan == 'N') sp.SearchInNotes = true; - else if(chScan == 'I') sp.SearchInUuids = true; - else if(chScan == 'O') sp.SearchInOther = true; - else { nOffset = nStart + 1; continue; } - - PwObjectList lFound = new PwObjectList(); - pwDatabase.RootGroup.SearchEntries(sp, lFound, true); - if(lFound.UCount > 0) + if(peFound != null) { - PwEntry peFound = lFound.GetAt(0); - string strInsData; if(chWanted == 'T') strInsData = peFound.Strings.ReadSafe(PwDefs.TitleField); @@ -367,13 +401,20 @@ strInsData = peFound.Uuid.ToHexString(); else { nOffset = nStart + 1; continue; } + if((chWanted == 'P') && !ctx.ForcePlainTextPasswords && + Program.Config.MainWindow.IsColumnHidden(AceColumnType.Password)) + strInsData = PwDefs.HiddenPassword; + + SprContext sprSub = ctx.WithoutContentTransformations(); + sprSub.Entry = peFound; + string strInnerContent = SprEngine.CompileInternal(strInsData, - peFound, pwDatabase, null, uRecursionLevel + 1, vRefsCache); - strInnerContent = SprEngine.TransformContent(strInnerContent, cf); + sprSub, uRecursionLevel + 1); + strInnerContent = SprEngine.TransformContent(strInnerContent, ctx); // str = str.Substring(0, nStart) + strInnerContent + str.Substring(nEnd + 1); - SprEngine.AddRefToCache(strFullRef, strInnerContent, vRefsCache); - str = SprEngine.FillRefsUsingCache(str, vRefsCache); + SprEngine.AddRefToCache(strFullRef, strInnerContent, ctx); + str = SprEngine.FillRefsUsingCache(str, ctx); } else { nOffset = nStart + 1; continue; } } @@ -381,28 +422,95 @@ return str; } - private static string FillRefsUsingCache(string strText, SprRefsCache vRefs) + public static PwEntry FindRefTarget(string strFullRef, SprContext ctx, + out char chScan, out char chWanted) + { + chScan = char.MinValue; + chWanted = char.MinValue; + + if(strFullRef == null) { Debug.Assert(false); return null; } + if(!strFullRef.StartsWith(StrRefStart, SprEngine.ScMethod) || + !strFullRef.EndsWith(StrRefEnd, SprEngine.ScMethod)) + return null; + if((ctx == null) || (ctx.Database == null)) { Debug.Assert(false); return null; } + + string strRef = strFullRef.Substring(StrRefStart.Length, + strFullRef.Length - StrRefStart.Length - StrRefEnd.Length); + if(strRef.Length <= 4) return null; + if(strRef[1] != '@') return null; + if(strRef[3] != ':') return null; + + chScan = char.ToUpper(strRef[2]); + chWanted = char.ToUpper(strRef[0]); + + SearchParameters sp = SearchParameters.None; + sp.SearchString = strRef.Substring(4); + if(chScan == 'T') sp.SearchInTitles = true; + else if(chScan == 'U') sp.SearchInUserNames = true; + else if(chScan == 'A') sp.SearchInUrls = true; + else if(chScan == 'P') sp.SearchInPasswords = true; + else if(chScan == 'N') sp.SearchInNotes = true; + else if(chScan == 'I') sp.SearchInUuids = true; + else if(chScan == 'O') sp.SearchInOther = true; + else return null; + + PwObjectList lFound = new PwObjectList(); + ctx.Database.RootGroup.SearchEntries(sp, lFound); + + return ((lFound.UCount > 0) ? lFound.GetAt(0) : null); + } + + private static string FillRefsUsingCache(string strText, SprContext ctx) { string str = strText; - foreach(KeyValuePair kvp in vRefs) + foreach(KeyValuePair kvp in ctx.RefsCache) { - str = str.Replace(kvp.Key, kvp.Value); + // str = str.Replace(kvp.Key, kvp.Value); + str = StrUtil.ReplaceCaseInsensitive(str, kvp.Key, kvp.Value); } return str; } private static void AddRefToCache(string strRef, string strValue, - SprRefsCache vRefs) + SprContext ctx) { if(strRef == null) { Debug.Assert(false); return; } if(strValue == null) { Debug.Assert(false); return; } - if(vRefs == null) { Debug.Assert(false); return; } + if(ctx == null) { Debug.Assert(false); return; } // Only add if not exists, do not overwrite - if(vRefs.ContainsKey(strRef) == false) - vRefs.Add(strRef, strValue); + if(!ctx.RefsCache.ContainsKey(strRef)) + ctx.RefsCache.Add(strRef, strValue); + } + + // internal static bool MightChange(string strText) + // { + // if(string.IsNullOrEmpty(strText)) return false; + // return (strText.IndexOfAny(m_vPlhEscapes) >= 0); + // } + + /// + /// Fast probabilistic test whether a string might be + /// changed when compiling with SprCompileFlags.Deref. + /// + internal static bool MightDeref(string strText) + { + if(strText == null) return false; + return (strText.IndexOf('{') >= 0); + } + + internal static string DerefFn(string str, PwEntry pe) + { + if(!MightDeref(str)) return str; + + SprContext ctx = new SprContext(pe, + Program.MainForm.DocumentManager.SafeFindContainerOf(pe), + SprCompileFlags.Deref); + // ctx.ForcePlainTextPasswords = false; + + return Compile(str, ctx); } } } diff -Nru keepass2-2.16+dfsg/KeePass/Util/Spr/SprEngine.PickChars.cs keepass2-2.18+dfsg/KeePass/Util/Spr/SprEngine.PickChars.cs --- keepass2-2.16+dfsg/KeePass/Util/Spr/SprEngine.PickChars.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/Spr/SprEngine.PickChars.cs 2012-01-01 12:06:50.000000000 +0000 @@ -0,0 +1,325 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2012 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.Windows.Forms; +using System.Diagnostics; + +using KeePass.Forms; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Security; +using KeePassLib.Utility; + +namespace KeePass.Util.Spr +{ + /// + /// String placeholders and field reference replacement engine. + /// + public static partial class SprEngine + { + /* private static string ReplacePickPw(string strText, PwEntry pe, + SprContentFlags cf) + { + string str = strText; + + for(int iID = 1; iID < (int.MaxValue - 1); ++iID) + { + string strPlaceholder = @"{PICKPASSWORDCHARS"; + if(iID > 1) strPlaceholder += iID.ToString(); + strPlaceholder += @"}"; + + if(str.IndexOf(strPlaceholder, StrUtil.CaseIgnoreCmp) >= 0) + { + ProtectedString ps = pe.Strings.Get(PwDefs.PasswordField); + if(ps != null) + { + byte[] pb = ps.ReadUtf8(); + bool bNotEmpty = (pb.Length > 0); + Array.Clear(pb, 0, pb.Length); + + if(bNotEmpty) + { + CharPickerForm cpf = new CharPickerForm(); + cpf.InitEx(ps, true, true, 0); + + if(cpf.ShowDialog() == DialogResult.OK) + str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, + SprEngine.TransformContent(cpf.SelectedCharacters.ReadString(), cf)); + UIUtil.DestroyForm(cpf); + } + } + + str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, string.Empty); + } + else break; + } + + return str; + } */ + + // Legacy, for backward compatibility only; see PickChars + private static string ReplacePickPw(string strText, SprContext ctx, + uint uRecursionLevel) + { + if(ctx.Entry == null) { Debug.Assert(false); return strText; } + + string str = strText; + + while(true) + { + const string strStart = @"{PICKPASSWORDCHARS"; + + int iStart = str.IndexOf(strStart, StrUtil.CaseIgnoreCmp); + if(iStart < 0) break; + + int iEnd = str.IndexOf('}', iStart); + if(iEnd < 0) break; + + string strPlaceholder = str.Substring(iStart, iEnd - iStart + 1); + + string strParam = str.Substring(iStart + strStart.Length, + iEnd - (iStart + strStart.Length)); + string[] vParams = strParam.Split(new char[] { ':' }); + + uint uCharCount = 0; + if(vParams.Length >= 2) uint.TryParse(vParams[1], out uCharCount); + + str = ReplacePickPwPlaceholder(str, strPlaceholder, uCharCount, + ctx, uRecursionLevel); + } + + return str; + } + + private static string ReplacePickPwPlaceholder(string str, + string strPlaceholder, uint uCharCount, SprContext ctx, + uint uRecursionLevel) + { + if(str.IndexOf(strPlaceholder, StrUtil.CaseIgnoreCmp) < 0) return str; + + ProtectedString ps = ctx.Entry.Strings.Get(PwDefs.PasswordField); + if(ps != null) + { + string strPassword = ps.ReadString(); + + string strPick = SprEngine.CompileInternal(strPassword, + ctx.WithoutContentTransformations(), uRecursionLevel + 1); + + if(!string.IsNullOrEmpty(strPick)) + { + ProtectedString psPick = new ProtectedString(false, strPick); + CharPickerForm dlg = new CharPickerForm(); + dlg.InitEx(psPick, true, true, uCharCount, null); + + if(dlg.ShowDialog() == DialogResult.OK) + str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, + SprEngine.TransformContent( + dlg.SelectedCharacters.ReadString(), ctx)); + UIUtil.DestroyForm(dlg); + } + } + + return StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, string.Empty); + } + + private static string ReplacePickChars(string strText, SprContext ctx, + uint uRecursionLevel) + { + if(ctx.Entry == null) return strText; // No assert + + string str = strText; + + Dictionary dPicked = new Dictionary(); + while(true) + { + const string strStart = @"{PICKCHARS"; + + int iStart = str.IndexOf(strStart, StrUtil.CaseIgnoreCmp); + if(iStart < 0) break; + + int iEnd = str.IndexOf('}', iStart); + if(iEnd < 0) break; + + string strPlaceholder = str.Substring(iStart, iEnd - iStart + 1); + + string strParam = str.Substring(iStart + strStart.Length, + iEnd - (iStart + strStart.Length)); + + string strRep = string.Empty; + bool bEncode = true; + + if(strParam.Length == 0) + strRep = ShowCharPickDlg(ctx.Entry.Strings.ReadSafe( + PwDefs.PasswordField), 0, null, ctx, uRecursionLevel); + else if(strParam.StartsWith(":")) + { + string strParams = strParam.Substring(1); + string[] vParams = strParams.Split(new char[] { ':' }, + StringSplitOptions.None); + + string strField = string.Empty; + if(vParams.Length >= 1) strField = (vParams[0] ?? string.Empty).Trim(); + if(strField.Length == 0) strField = PwDefs.PasswordField; + + string strOptions = string.Empty; + if(vParams.Length >= 2) strOptions = (vParams[1] ?? string.Empty); + + Dictionary dOptions = new Dictionary(); + string[] vOptions = strOptions.Split(new char[] { ',' }, + StringSplitOptions.RemoveEmptyEntries); + foreach(string strOption in vOptions) + { + string[] vKvp = strOption.Split(new char[] { '=' }, + StringSplitOptions.None); + if(vKvp.Length != 2) continue; + + dOptions[vKvp[0].Trim().ToLower()] = vKvp[1].Trim(); + } + + string strID = string.Empty; + if(dOptions.ContainsKey("id")) strID = dOptions["id"].ToLower(); + + uint uCharCount = 0; + if(dOptions.ContainsKey("c")) + uint.TryParse(dOptions["c"], out uCharCount); + if(dOptions.ContainsKey("count")) + uint.TryParse(dOptions["count"], out uCharCount); + + bool? bInitHide = null; + if(dOptions.ContainsKey("hide")) + bInitHide = StrUtil.StringToBool(dOptions["hide"]); + + string strContent = ctx.Entry.Strings.ReadSafe(strField); + if(strContent.Length == 0) { } // Leave strRep empty + else if((strID.Length > 0) && dPicked.ContainsKey(strID)) + strRep = dPicked[strID]; + else + strRep = ShowCharPickDlg(strContent, uCharCount, bInitHide, + ctx, uRecursionLevel); + + if(strID.Length > 0) dPicked[strID] = strRep; + + if(dOptions.ContainsKey("conv")) + { + int iOffset = 0; + if(dOptions.ContainsKey("conv-offset")) + int.TryParse(dOptions["conv-offset"], out iOffset); + + string strConvFmt = string.Empty; + if(dOptions.ContainsKey("conv-fmt")) + strConvFmt = dOptions["conv-fmt"]; + + string strConv = dOptions["conv"]; + if(strConv.Equals("d", StrUtil.CaseIgnoreCmp)) + { + strRep = ConvertToDownArrows(strRep, iOffset, strConvFmt); + bEncode = false; + } + } + } + + str = StrUtil.ReplaceCaseInsensitive(str, strPlaceholder, + bEncode ? SprEngine.TransformContent(strRep, ctx) : strRep); + } + + return str; + } + + private static string ShowCharPickDlg(string strWord, uint uCharCount, + bool? bInitHide, SprContext ctx, uint uRecursionLevel) + { + string strPick = SprEngine.CompileInternal(strWord, + ctx.WithoutContentTransformations(), uRecursionLevel + 1); + + // No need to show the dialog when there's nothing to pick from + // (this also prevents the dialog from showing up MaxRecursionDepth + // times in case of a cyclic {PICKCHARS}) + if(string.IsNullOrEmpty(strPick)) return string.Empty; + + CharPickerForm cpf = new CharPickerForm(); + cpf.InitEx(new ProtectedString(false, strPick), true, true, + uCharCount, bInitHide); + + string strResult = string.Empty; + if(cpf.ShowDialog() == DialogResult.OK) + strResult = cpf.SelectedCharacters.ReadString(); + + UIUtil.DestroyForm(cpf); + return strResult; // Don't transform here + } + + private static string ConvertToDownArrows(string str, int iOffset, + string strLayout) + { + if(string.IsNullOrEmpty(str)) return string.Empty; + + StringBuilder sb = new StringBuilder(); + for(int i = 0; i < str.Length; ++i) + { + // if((sb.Length > 0) && !string.IsNullOrEmpty(strSep)) sb.Append(strSep); + + char ch = str[i]; + + int? iDowns = null; + if(strLayout.Length == 0) + { + if((ch >= '0') && (ch <= '9')) iDowns = (int)ch - '0'; + else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a'; + else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A'; + } + else if(strLayout.Equals("0a", StrUtil.CaseIgnoreCmp)) + { + if((ch >= '0') && (ch <= '9')) iDowns = (int)ch - '0'; + else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a' + 10; + else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A' + 10; + } + else if(strLayout.Equals("a0", StrUtil.CaseIgnoreCmp)) + { + if((ch >= '0') && (ch <= '9')) iDowns = (int)ch - '0' + 26; + else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a'; + else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A'; + } + else if(strLayout.Equals("1a", StrUtil.CaseIgnoreCmp)) + { + if((ch >= '1') && (ch <= '9')) iDowns = (int)ch - '1'; + else if(ch == '0') iDowns = 9; + else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a' + 10; + else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A' + 10; + } + else if(strLayout.Equals("a1", StrUtil.CaseIgnoreCmp)) + { + if((ch >= '1') && (ch <= '9')) iDowns = (int)ch - '1' + 26; + else if(ch == '0') iDowns = 9 + 26; + else if((ch >= 'a') && (ch <= 'z')) iDowns = (int)ch - 'a'; + else if((ch >= 'A') && (ch <= 'Z')) iDowns = (int)ch - 'A'; + } + + if(!iDowns.HasValue) continue; + + for(int j = 0; j < (iOffset + iDowns); ++j) sb.Append(@"{DOWN}"); + } + + return sb.ToString(); + } + } +} diff -Nru keepass2-2.16+dfsg/KeePass/Util/TempFilesPool.cs keepass2-2.18+dfsg/KeePass/Util/TempFilesPool.cs --- keepass2-2.16+dfsg/KeePass/Util/TempFilesPool.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/TempFilesPool.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/TextSimilarity.cs keepass2-2.18+dfsg/KeePass/Util/TextSimilarity.cs --- keepass2-2.16+dfsg/KeePass/Util/TextSimilarity.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/TextSimilarity.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePass/Util/UpdateCheckEx.cs keepass2-2.18+dfsg/KeePass/Util/UpdateCheckEx.cs --- keepass2-2.16+dfsg/KeePass/Util/UpdateCheckEx.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/UpdateCheckEx.cs 2012-01-01 12:06:50.000000000 +0000 @@ -0,0 +1,488 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2012 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.Threading; +using System.Windows.Forms; +using System.Diagnostics; + +using KeePass.Forms; +using KeePass.Plugins; +using KeePass.Resources; +using KeePass.UI; + +using KeePassLib; +using KeePassLib.Interfaces; +using KeePassLib.Serialization; +using KeePassLib.Utility; + +namespace KeePass.Util +{ + public enum UpdateComponentStatus + { + Unknown = 0, + UpToDate, + NewVerAvailable, + PreRelease, + DownloadFailed + } + + public sealed class UpdateComponentInfo + { + private readonly string m_strName; // Never null + public string Name + { + get { return m_strName; } + } + + private readonly ulong m_uVerInstalled; + public ulong VerInstalled + { + get { return m_uVerInstalled; } + } + + private ulong m_uVerAvailable = 0; + public ulong VerAvailable + { + get { return m_uVerAvailable; } + set { m_uVerAvailable = value; } + } + + private UpdateComponentStatus m_status = UpdateComponentStatus.Unknown; + public UpdateComponentStatus Status + { + get { return m_status; } + set { m_status = value; } + } + + private readonly string m_strUpdateUrl; // Never null + public string UpdateUrl + { + get { return m_strUpdateUrl; } + } + + private readonly string m_strCat; // Never null + public string Category + { + get { return m_strCat; } + } + + public UpdateComponentInfo(string strName, ulong uVerInstalled, + string strUpdateUrl, string strCategory) + { + if(strName == null) throw new ArgumentNullException("strName"); + if(strUpdateUrl == null) throw new ArgumentNullException("strUpdateUrl"); + if(strCategory == null) throw new ArgumentNullException("strCategory"); + + m_strName = strName; + m_uVerInstalled = uVerInstalled; + m_strUpdateUrl = strUpdateUrl; + m_strCat = strCategory; + } + } + + public static class UpdateCheckEx + { + private sealed class UpdateCheckParams + { + public readonly bool ForceUI; + public readonly Form Parent; // May be null + + public UpdateCheckParams(bool bForceUI, Form fOptParent) + { + this.ForceUI = bForceUI; + this.Parent = fOptParent; + } + } + + public static void Run(bool bForceUI, Form fOptParent) + { + DateTime dtNow = DateTime.Now, dtLast; + string strLast = Program.Config.Application.LastUpdateCheck; + if(!bForceUI && (strLast.Length > 0) && TimeUtil.TryDeserializeUtc( + strLast, out dtLast)) + { + if(CompareDates(dtLast, dtNow) == 0) return; // Checked today already + } + Program.Config.Application.LastUpdateCheck = TimeUtil.SerializeUtc(dtNow); + + UpdateCheckParams p = new UpdateCheckParams(bForceUI, fOptParent); + if(!bForceUI) // Async + { + // // Local, but thread will continue to run anyway + // Thread th = new Thread(new ParameterizedThreadStart( + // UpdateCheckEx.RunPriv)); + // th.Start(p); + + try + { + ThreadPool.QueueUserWorkItem(new WaitCallback( + UpdateCheckEx.RunPriv), p); + } + catch(Exception) { Debug.Assert(false); } + } + else RunPriv(p); + } + + private static int CompareDates(DateTime a, DateTime b) + { + if(a.Year != b.Year) return ((a.Year < b.Year) ? -1 : 1); + if(a.Month != b.Month) return ((a.Month < b.Month) ? -1 : 1); + if(a.Day != b.Day) return ((a.Day < b.Day) ? -1 : 1); + return 0; + } + + private static void RunPriv(object o) + { + UpdateCheckParams p = (o as UpdateCheckParams); + if(p == null) { Debug.Assert(false); return; } + + IStatusLogger sl = null; + try + { + if(p.ForceUI) + { + Form fStatusDialog; + sl = StatusUtil.CreateStatusDialog(p.Parent, out fStatusDialog, + KPRes.UpdateCheck, KPRes.CheckingForUpd + "...", true, true); + } + + List lInst = GetInstalledComponents(); + List lUrls = GetUrls(lInst); + Dictionary> dictAvail = + DownloadInfoFiles(lUrls, sl); + if(dictAvail == null) return; // User cancelled + + MergeInfo(lInst, dictAvail); + + bool bUpdAvail = false; + foreach(UpdateComponentInfo uc in lInst) + { + if(uc.Status == UpdateComponentStatus.NewVerAvailable) + { + bUpdAvail = true; + break; + } + } + + if(sl != null) { sl.EndLogging(); sl = null; } + + if(bUpdAvail || p.ForceUI) + { + UpdateCheckForm dlg = new UpdateCheckForm(); + dlg.InitEx(lInst, p.ForceUI); + UIUtil.ShowDialogAndDestroy(dlg); + } + } + catch(Exception) { Debug.Assert(false); } + finally + { + try { if(sl != null) sl.EndLogging(); } + catch(Exception) { Debug.Assert(false); } + } + } + + private sealed class UpdateDownloadInfo + { + public readonly string Url; // Never null + public object SyncObj = new object(); + public bool Ready = false; + public List ComponentInfo = null; + + public UpdateDownloadInfo(string strUrl) + { + if(strUrl == null) throw new ArgumentNullException("strUrl"); + + this.Url = strUrl; + } + } + + private static Dictionary> + DownloadInfoFiles(List lUrls, IStatusLogger sl) + { + List lDl = new List(); + foreach(string strUrl in lUrls) + { + if(string.IsNullOrEmpty(strUrl)) { Debug.Assert(false); continue; } + + UpdateDownloadInfo dl = new UpdateDownloadInfo(strUrl); + lDl.Add(dl); + + ThreadPool.QueueUserWorkItem(new WaitCallback( + UpdateCheckEx.DownloadInfoFile), dl); + } + + while(true) + { + bool bReady = true; + foreach(UpdateDownloadInfo dl in lDl) + { + lock(dl.SyncObj) { bReady &= dl.Ready; } + } + + if(bReady) break; + Thread.Sleep(40); + + if(sl != null) + { + if(!sl.ContinueWork()) return null; + } + } + + Dictionary> dict = + new Dictionary>(); + foreach(UpdateDownloadInfo dl in lDl) + { + dict[dl.Url.ToLower()] = dl.ComponentInfo; + } + return dict; + } + + private static void DownloadInfoFile(object o) + { + UpdateDownloadInfo dl = (o as UpdateDownloadInfo); + if(dl == null) { Debug.Assert(false); return; } + + dl.ComponentInfo = LoadInfoFile(dl.Url); + lock(dl.SyncObj) { dl.Ready = true; } + } + + private static List GetUrls(List l) + { + List lUrls = new List(); + foreach(UpdateComponentInfo uc in l) + { + string strUrl = uc.UpdateUrl; + if(string.IsNullOrEmpty(strUrl)) continue; + + bool bFound = false; + for(int i = 0; i < lUrls.Count; ++i) + { + if(lUrls[i].Equals(strUrl, StrUtil.CaseIgnoreCmp)) + { + bFound = true; + break; + } + } + + if(!bFound) lUrls.Add(strUrl); + } + + return lUrls; + } + + private static List LoadInfoFile(string strUrl) + { + try + { + IOConnectionInfo ioc = IOConnectionInfo.FromPath(strUrl.Trim()); + + Stream s = IOConnection.OpenRead(ioc); + if(s == null) throw new InvalidOperationException(); + MemoryStream ms = new MemoryStream(); + MemUtil.CopyStream(s, ms); + s.Close(); + byte[] pb = ms.ToArray(); + ms.Close(); + + if(ioc.Path.EndsWith(".gz", StrUtil.CaseIgnoreCmp)) + pb = MemUtil.Decompress(pb); + + string strData = StrUtil.Utf8.GetString(pb); + strData = StrUtil.NormalizeNewLines(strData, false); + string[] vLines = strData.Split('\n'); + + List l = new List(); + bool bHeader = true, bFooterFound = false; + char chSep = ':'; // Modified by header + for(int i = 0; i < vLines.Length; ++i) + { + string str = vLines[i].Trim(); + if(str.Length == 0) continue; + + if(bHeader) + { + chSep = str[0]; + bHeader = false; + } + else if(str[0] == chSep) + { + bFooterFound = true; + break; + } + else // Component info + { + string[] vInfo = str.Split(new char[] { chSep }); + if(vInfo.Length >= 2) + { + UpdateComponentInfo c = new UpdateComponentInfo( + vInfo[0].Trim(), 0, ioc.Path, string.Empty); + c.VerAvailable = StrUtil.GetVersion(vInfo[1]); + + AddComponent(l, c); + } + } + } + + return (bFooterFound ? l : null); + } + catch(Exception) { } + + return null; + } + + private static void AddComponent(List l, + UpdateComponentInfo c) + { + if((l == null) || (c == null)) { Debug.Assert(false); return; } + + for(int i = l.Count - 1; i >= 0; --i) + { + if(l[i].Name.Equals(c.Name, StrUtil.CaseIgnoreCmp)) + l.RemoveAt(i); + } + + l.Add(c); + } + + private static List GetInstalledComponents() + { + List l = new List(); + + foreach(PluginInfo pi in Program.MainForm.PluginManager) + { + Plugin p = pi.Interface; + string strUrl = ((p != null) ? (p.UpdateUrl ?? string.Empty) : + string.Empty); + + AddComponent(l, new UpdateComponentInfo(pi.Name.Trim(), + StrUtil.GetVersion(pi.FileVersion), strUrl.Trim(), + KPRes.Plugins)); + } + + // Add KeePass at the end to override any buggy plugin names + AddComponent(l, new UpdateComponentInfo(PwDefs.ShortProductName, + PwDefs.FileVersion64, PwDefs.VersionUrl, PwDefs.ShortProductName)); + + l.Sort(UpdateCheckEx.CompareComponents); + return l; + } + + private static int CompareComponents(UpdateComponentInfo a, + UpdateComponentInfo b) + { + if(a.Name == b.Name) return 0; + if(a.Name == PwDefs.ShortProductName) return -1; + if(b.Name == PwDefs.ShortProductName) return 1; + + return a.Name.CompareTo(b.Name); + } + + private static void MergeInfo(List lInst, + Dictionary> dictAvail) + { + string strOvrId = PwDefs.VersionUrl.ToLower(); + List lOvr; + dictAvail.TryGetValue(strOvrId, out lOvr); + + foreach(UpdateComponentInfo uc in lInst) + { + string strUrlId = uc.UpdateUrl.ToLower(); + List lAvail; + dictAvail.TryGetValue(strUrlId, out lAvail); + + if(SetComponentAvail(uc, lOvr)) { } + else if(SetComponentAvail(uc, lAvail)) { } + else if((strUrlId.Length > 0) && (lAvail == null)) + uc.Status = UpdateComponentStatus.DownloadFailed; + else uc.Status = UpdateComponentStatus.Unknown; + } + } + + private static bool SetComponentAvail(UpdateComponentInfo uc, + List lAvail) + { + if(uc == null) { Debug.Assert(false); return false; } + if(lAvail == null) return false; // No assert + + foreach(UpdateComponentInfo ucAvail in lAvail) + { + if(ucAvail.Name.Equals(uc.Name, StrUtil.CaseIgnoreCmp)) + { + uc.VerAvailable = ucAvail.VerAvailable; + + if(uc.VerInstalled == uc.VerAvailable) + uc.Status = UpdateComponentStatus.UpToDate; + else if(uc.VerInstalled < uc.VerAvailable) + uc.Status = UpdateComponentStatus.NewVerAvailable; + else uc.Status = UpdateComponentStatus.PreRelease; + + return true; + } + } + + return false; + } + + public static void EnsureConfigured(Form fParent) + { + if(Program.Config.Application.Start.CheckForUpdateConfigured) return; + + // If the user has manually enabled the automatic update check + // before, there's no need to ask him again + if(!Program.Config.Application.Start.CheckForUpdate) + { + string strHdr = KPRes.UpdateCheckInfo; + string strSub = KPRes.UpdateCheckInfoRes + MessageService.NewParagraph + + KPRes.UpdateCheckInfoPriv; + + VistaTaskDialog dlg = new VistaTaskDialog((fParent != null) ? + fParent.Handle : IntPtr.Zero); + dlg.CommandLinks = true; + dlg.Content = strHdr; + dlg.MainInstruction = KPRes.UpdateCheckEnableQ; + dlg.WindowTitle = PwDefs.ShortProductName; + dlg.AddButton((int)DialogResult.Yes, KPRes.Enable + + " (" + KPRes.Recommended + ")", null); + dlg.AddButton((int)DialogResult.No, KPRes.Disable, null); + dlg.SetIcon(VtdCustomIcon.Question); + dlg.FooterText = strSub; + dlg.SetFooterIcon(VtdIcon.Information); + + int iResult; + if(dlg.ShowDialog()) iResult = dlg.Result; + else + { + string strMain = strHdr + MessageService.NewParagraph + strSub; + iResult = (MessageService.AskYesNo(strMain + MessageService.NewParagraph + + KPRes.UpdateCheckEnableQ, PwDefs.ShortProductName) ? + (int)DialogResult.Yes : (int)DialogResult.No); + } + + Program.Config.Application.Start.CheckForUpdate = ((iResult == + (int)DialogResult.OK) || (iResult == (int)DialogResult.Yes)); + } + + Program.Config.Application.Start.CheckForUpdateConfigured = true; + } + } +} diff -Nru keepass2-2.16+dfsg/KeePass/Util/WinUtil.cs keepass2-2.18+dfsg/KeePass/Util/WinUtil.cs --- keepass2-2.16+dfsg/KeePass/Util/WinUtil.cs 2011-07-09 15:16:58.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/WinUtil.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -119,7 +119,13 @@ public static void OpenUrl(string strUrlToOpen, PwEntry peDataSource) { - // If URL is null, return false, do not throw exception. + OpenUrl(strUrlToOpen, peDataSource, true); + } + + public static void OpenUrl(string strUrlToOpen, PwEntry peDataSource, + bool bAllowOverride) + { + // If URL is null, return, do not throw exception. Debug.Assert(strUrlToOpen != null); if(strUrlToOpen == null) return; string strPrevWorkDir = Directory.GetCurrentDirectory(); @@ -138,16 +144,17 @@ bool bCmdQuotes = WinUtil.IsCommandLineUrl(strUrlFlt); - string strUrl = SprEngine.Compile(strUrlFlt, false, peDataSource, - pwDatabase, false, bCmdQuotes); + string strUrl = SprEngine.Compile(strUrlFlt, new SprContext( + peDataSource, pwDatabase, SprCompileFlags.All, false, bCmdQuotes)); string strOvr = Program.Config.Integration.UrlSchemeOverrides.GetOverrideForUrl( strUrl); + if(!bAllowOverride) strOvr = null; if(strOvr != null) { bCmdQuotes = WinUtil.IsCommandLineUrl(strOvr); - strUrl = SprEngine.Compile(strOvr, false, peDataSource, pwDatabase, - false, bCmdQuotes); + strUrl = SprEngine.Compile(strOvr, new SprContext( + peDataSource, pwDatabase, SprCompileFlags.All, false, bCmdQuotes)); } if(WinUtil.IsCommandLineUrl(strUrl)) @@ -194,6 +201,25 @@ Program.MainForm.UpdateUI(false, null, false, null, false, null, false); } + public static void OpenUrlWithApp(string strUrlToOpen, PwEntry peDataSource, + string strAppPath) + { + if(string.IsNullOrEmpty(strUrlToOpen)) return; + if(string.IsNullOrEmpty(strAppPath)) return; + + char[] vPathTrim = new char[]{ ' ', '\t', '\r', '\n', + '\"', '\'' }; + + string strUrl = strUrlToOpen.Trim(vPathTrim); + if(strUrl.Length == 0) { Debug.Assert(false); return; } + + string strApp = strAppPath.Trim(vPathTrim); + if(strApp.Length == 0) { Debug.Assert(false); return; } + + string str = "cmd://\"" + strApp + "\" \"" + strUrl + "\""; + OpenUrl(str, peDataSource, false); + } + private static void StartWithoutShellExecute(string strApp, string strArgs) { try @@ -236,7 +262,7 @@ try { m_strExePath = Assembly.GetExecutingAssembly().Location; } catch(Exception) { } - if((m_strExePath == null) || (m_strExePath.Length == 0)) + if(string.IsNullOrEmpty(m_strExePath)) { m_strExePath = Assembly.GetExecutingAssembly().GetName().CodeBase; m_strExePath = UrlUtil.FileUrlToPath(m_strExePath); @@ -499,5 +525,83 @@ if(NativeLib.IsUnix()) return "Unix"; return "Windows"; } + + public static void RemoveZoneIdentifier(string strFilePath) + { + // No throw + if(string.IsNullOrEmpty(strFilePath)) { Debug.Assert(false); return; } + + try + { + string strZoneId = strFilePath + ":Zone.Identifier"; + + if(NativeMethods.FileExists(strZoneId)) + NativeMethods.DeleteFile(strZoneId); + } + catch(Exception) { Debug.Assert(NativeLib.IsUnix()); } + } + + public static string RunConsoleApp(string strAppPath, string strParams) + { + if(strAppPath == null) throw new ArgumentNullException("strAppPath"); + if(strAppPath.Length == 0) throw new ArgumentException("strAppPath"); + + try + { + ProcessStartInfo psi = new ProcessStartInfo(); + + psi.CreateNoWindow = true; + psi.FileName = strAppPath; + psi.WindowStyle = ProcessWindowStyle.Hidden; + psi.UseShellExecute = false; + psi.RedirectStandardOutput = true; + + if(!string.IsNullOrEmpty(strParams)) psi.Arguments = strParams; + + Process p = Process.Start(psi); + + string strOutput = p.StandardOutput.ReadToEnd(); + p.WaitForExit(); + + return strOutput; + } + catch(Exception) { Debug.Assert(false); } + + return null; + } + + public static string LocateSystemApp(string strExeName) + { + if(strExeName == null) { Debug.Assert(false); return string.Empty; } + if(strExeName.Length == 0) return strExeName; + + if(NativeLib.IsUnix()) return strExeName; + + try + { + string str = null; + for(int i = 0; i < 3; ++i) + { + if(i == 0) + str = Environment.GetFolderPath( + Environment.SpecialFolder.System); + else if(i == 1) + str = Environment.GetEnvironmentVariable("WinDir"); + else if(i == 2) + str = Environment.GetEnvironmentVariable("SystemRoot"); + + if(!string.IsNullOrEmpty(str)) + { + str = UrlUtil.EnsureTerminatingSeparator(str, false); + str += strExeName; + + if(File.Exists(str)) return str; + } + } + } + catch(Exception) { Debug.Assert(false); } + + return strExeName; + } } } diff -Nru keepass2-2.16+dfsg/KeePass/Util/XmlUtil.cs keepass2-2.18+dfsg/KeePass/Util/XmlUtil.cs --- keepass2-2.16+dfsg/KeePass/Util/XmlUtil.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePass/Util/XmlUtil.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Collections/AutoTypeConfig.cs keepass2-2.18+dfsg/KeePassLib/Collections/AutoTypeConfig.cs --- keepass2-2.16+dfsg/KeePassLib/Collections/AutoTypeConfig.cs 2011-03-01 19:54:16.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Collections/AutoTypeConfig.cs 2012-01-01 11:50:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -32,45 +32,70 @@ UseClipboard = 1 } - /* public sealed class AutoTypeAssociation + public sealed class AutoTypeAssociation : IEquatable, + IDeepCloneable { private string m_strWindow = string.Empty; - private string m_strSequence = string.Empty; - public string WindowName { get { return m_strWindow; } set { Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value"); - m_strWindow = value; } } - public string KeySequence + private string m_strSequence = string.Empty; + public string Sequence { get { return m_strSequence; } set { Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value"); - m_strSequence = value; } } - } */ + + public AutoTypeAssociation() { } + + public AutoTypeAssociation(string strWindow, string strSeq) + { + if(strWindow == null) throw new ArgumentNullException("strWindow"); + if(strSeq == null) throw new ArgumentNullException("strSeq"); + + m_strWindow = strWindow; + m_strSequence = strSeq; + } + + public bool Equals(AutoTypeAssociation other) + { + if(other == null) return false; + + if(m_strWindow != other.m_strWindow) return false; + if(m_strSequence != other.m_strSequence) return false; + + return true; + } + + public AutoTypeAssociation CloneDeep() + { + return (AutoTypeAssociation)this.MemberwiseClone(); + } + } /// - /// A dictionary of auto-type window/keystroke sequence pairs. + /// A list of auto-type associations. /// - public sealed class AutoTypeConfig : IDeepCloneable + public sealed class AutoTypeConfig : IEquatable, + IDeepCloneable { private bool m_bEnabled = true; private AutoTypeObfuscationOptions m_atooObfuscation = AutoTypeObfuscationOptions.None; private string m_strDefaultSequence = string.Empty; - private Dictionary m_vWindowSeqPairs = - new Dictionary(); + private List m_lWindowAssocs = + new List(); /// /// Specify whether auto-type is enabled or not. @@ -92,7 +117,7 @@ /// /// The default keystroke sequence that is auto-typed if - /// no matching window is found in the Items + /// no matching window is found in the Associations /// container. /// public string DefaultSequence @@ -108,134 +133,88 @@ /// /// Get all auto-type window/keystroke sequence pairs. /// - public IEnumerable> WindowSequencePairs + public IEnumerable Associations { - get { return m_vWindowSeqPairs; } + get { return m_lWindowAssocs; } } public int AssociationsCount { - get { return m_vWindowSeqPairs.Count; } + get { return m_lWindowAssocs.Count; } } /// - /// Construct a new auto-type dictionary. + /// Construct a new auto-type associations list. /// public AutoTypeConfig() { } /// - /// Remove all window/keystroke sequence associations. + /// Remove all associations. /// public void Clear() { - m_vWindowSeqPairs.Clear(); + m_lWindowAssocs.Clear(); } /// - /// Clone the auto-type dictionary. + /// Clone the auto-type associations list. /// /// New, cloned object. public AutoTypeConfig CloneDeep() { - AutoTypeConfig newDic = new AutoTypeConfig(); + AutoTypeConfig newCfg = new AutoTypeConfig(); - newDic.m_bEnabled = m_bEnabled; - newDic.m_atooObfuscation = m_atooObfuscation; - newDic.m_strDefaultSequence = m_strDefaultSequence; + newCfg.m_bEnabled = m_bEnabled; + newCfg.m_atooObfuscation = m_atooObfuscation; + newCfg.m_strDefaultSequence = m_strDefaultSequence; - foreach(KeyValuePair kvp in m_vWindowSeqPairs) - newDic.Set(kvp.Key, kvp.Value); + foreach(AutoTypeAssociation a in m_lWindowAssocs) + newCfg.Add(a.CloneDeep()); - return newDic; + return newCfg; } - public bool EqualsConfig(AutoTypeConfig cfg) + public bool Equals(AutoTypeConfig other) { - if(cfg == null) { Debug.Assert(false); return false; } + if(other == null) { Debug.Assert(false); return false; } - if(m_bEnabled != cfg.m_bEnabled) return false; - if(m_atooObfuscation != cfg.m_atooObfuscation) return false; - if(m_strDefaultSequence != cfg.m_strDefaultSequence) return false; + if(m_bEnabled != other.m_bEnabled) return false; + if(m_atooObfuscation != other.m_atooObfuscation) return false; + if(m_strDefaultSequence != other.m_strDefaultSequence) return false; - if(m_vWindowSeqPairs.Count != cfg.m_vWindowSeqPairs.Count) return false; - foreach(KeyValuePair kvp in m_vWindowSeqPairs) + if(m_lWindowAssocs.Count != other.m_lWindowAssocs.Count) return false; + for(int i = 0; i < m_lWindowAssocs.Count; ++i) { - string strValue = cfg.Get(kvp.Key); - if((strValue == null) || (strValue != kvp.Value)) return false; + if(!m_lWindowAssocs[i].Equals(other.m_lWindowAssocs[i])) + return false; } return true; } - /// - /// Set a window/keystroke sequence pair. - /// - /// Name of the window. Must not be null. - /// Keystroke sequence for the specified - /// window. Must not be null. - /// Thrown if one of the input - /// parameters is null. - public void Set(string strWindow, string strKeystrokeSequence) + public void Add(AutoTypeAssociation a) { - Debug.Assert(strWindow != null); if(strWindow == null) throw new ArgumentNullException("strWindow"); - Debug.Assert(strKeystrokeSequence != null); if(strKeystrokeSequence == null) throw new ArgumentNullException("strKeystrokeSequence"); + Debug.Assert(a != null); if(a == null) throw new ArgumentNullException("a"); - m_vWindowSeqPairs[strWindow] = strKeystrokeSequence; + m_lWindowAssocs.Add(a); } - /// - /// Get a keystroke sequence associated with the specified window. - /// Returns null, if no sequence can be found. - /// - /// Window identifier. - /// Keystroke sequence associated with the specified window. - /// The return value is null, if no keystroke sequence has been - /// defined for this window yet. - /// Thrown if the input - /// parameter is null. - public string Get(string strWindow) + public AutoTypeAssociation GetAt(int iIndex) { - Debug.Assert(strWindow != null); if(strWindow == null) throw new ArgumentNullException("strWindow"); + if((iIndex < 0) || (iIndex >= m_lWindowAssocs.Count)) + throw new ArgumentOutOfRangeException("iIndex"); - string str; - if(m_vWindowSeqPairs.TryGetValue(strWindow, out str)) return str; - - return null; + return m_lWindowAssocs[iIndex]; } - /// - /// Get a keystroke sequence associated with the specified window. - /// Returns an empty string (""), if no sequence can be found. - /// - /// Window identifier. - /// Keystroke sequence associated with the specified window. - /// The return value is an empty string (""), if no keystroke - /// sequence has been defined for this window yet. - /// Thrown if the input - /// parameter is null. - public string GetSafe(string strWindow) - { - Debug.Assert(strWindow != null); if(strWindow == null) throw new ArgumentNullException("strWindow"); - - string str; - if(m_vWindowSeqPairs.TryGetValue(strWindow, out str)) - return str; - - return string.Empty; - } - - /// - /// Remove an auto-type entry. - /// - /// Window identifier. Must not be null. - /// Returns true if the entry has been removed. - public bool Remove(string strWindow) + public void RemoveAt(int iIndex) { - Debug.Assert(strWindow != null); if(strWindow == null) throw new ArgumentNullException("strWindow"); + if((iIndex < 0) || (iIndex >= m_lWindowAssocs.Count)) + throw new ArgumentOutOfRangeException("iIndex"); - return m_vWindowSeqPairs.Remove(strWindow); + m_lWindowAssocs.RemoveAt(iIndex); } } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Collections/ProtectedBinaryDictionary.cs keepass2-2.18+dfsg/KeePassLib/Collections/ProtectedBinaryDictionary.cs --- keepass2-2.16+dfsg/KeePassLib/Collections/ProtectedBinaryDictionary.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Collections/ProtectedBinaryDictionary.cs 2012-01-01 11:50:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -82,13 +82,10 @@ { ProtectedBinaryDictionary plNew = new ProtectedBinaryDictionary(); - ProtectedBinary pbNew; foreach(KeyValuePair kvpBin in m_vBinaries) { - pbNew = new ProtectedBinary(kvpBin.Value); // Clone deep - Debug.Assert(pbNew != kvpBin.Value); - - plNew.Set(kvpBin.Key, pbNew); + // ProtectedBinary objects are immutable + plNew.Set(kvpBin.Key, kvpBin.Value); } return plNew; @@ -104,7 +101,7 @@ { ProtectedBinary pb = dict.Get(kvp.Key); if(pb == null) return false; - if(!MemUtil.ArraysEqual(pb.ReadData(), kvp.Value.ReadData())) return false; + if(!pb.Equals(kvp.Value)) return false; } return true; diff -Nru keepass2-2.16+dfsg/KeePassLib/Collections/ProtectedStringDictionary.cs keepass2-2.18+dfsg/KeePassLib/Collections/ProtectedStringDictionary.cs --- keepass2-2.16+dfsg/KeePassLib/Collections/ProtectedStringDictionary.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Collections/ProtectedStringDictionary.cs 2012-01-01 15:18:28.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -82,31 +82,75 @@ { ProtectedStringDictionary plNew = new ProtectedStringDictionary(); - ProtectedString psNew; foreach(KeyValuePair kvpStr in m_vStrings) { - psNew = new ProtectedString(kvpStr.Value); - Debug.Assert(psNew != kvpStr.Value); - - plNew.Set(kvpStr.Key, psNew); + // ProtectedString objects are immutable + plNew.Set(kvpStr.Key, kvpStr.Value); } return plNew; } + [Obsolete] public bool EqualsDictionary(ProtectedStringDictionary dict) { + return EqualsDictionary(dict, PwCompareOptions.None, MemProtCmpMode.None); + } + + [Obsolete] + public bool EqualsDictionary(ProtectedStringDictionary dict, + MemProtCmpMode mpCompare) + { + return EqualsDictionary(dict, PwCompareOptions.None, mpCompare); + } + + public bool EqualsDictionary(ProtectedStringDictionary dict, + PwCompareOptions pwOpt, MemProtCmpMode mpCompare) + { if(dict == null) { Debug.Assert(false); return false; } - if(m_vStrings.Count != dict.m_vStrings.Count) return false; + bool bNeEqStd = ((pwOpt & PwCompareOptions.NullEmptyEquivStd) != + PwCompareOptions.None); + if(!bNeEqStd) + { + if(m_vStrings.Count != dict.m_vStrings.Count) return false; + } foreach(KeyValuePair kvp in m_vStrings) { + bool bStdField = PwDefs.IsStandardField(kvp.Key); ProtectedString ps = dict.Get(kvp.Key); + + if(bNeEqStd && (ps == null) && bStdField) + ps = ProtectedString.Empty; + if(ps == null) return false; + + if(mpCompare == MemProtCmpMode.Full) + { + if(ps.IsProtected != kvp.Value.IsProtected) return false; + } + else if(mpCompare == MemProtCmpMode.CustomOnly) + { + if(!bStdField && (ps.IsProtected != kvp.Value.IsProtected)) + return false; + } + if(ps.ReadString() != kvp.Value.ReadString()) return false; } + if(bNeEqStd) + { + foreach(KeyValuePair kvp in dict.m_vStrings) + { + ProtectedString ps = Get(kvp.Key); + + if(ps != null) continue; // Compared previously + if(!PwDefs.IsStandardField(kvp.Key)) return false; + if(!kvp.Value.IsEmpty) return false; + } + } + return true; } @@ -146,7 +190,7 @@ ProtectedString ps; if(m_vStrings.TryGetValue(strName, out ps)) return ps; - return new ProtectedString(); + return ProtectedString.Empty; } /// @@ -201,7 +245,7 @@ if(m_vStrings.TryGetValue(strName, out ps)) { if(ps.IsProtected) return PwDefs.HiddenPassword; - else return ps.ReadString(); + return ps.ReadString(); } return string.Empty; @@ -245,5 +289,18 @@ return v; } + + public void EnableProtection(string strField, bool bProtect) + { + ProtectedString ps = Get(strField); + if(ps == null) return; // Nothing to do, no assert + + if(ps.IsProtected != bProtect) + { + byte[] pbData = ps.ReadUtf8(); + Set(strField, new ProtectedString(bProtect, pbData)); + MemUtil.ZeroByteArray(pbData); + } + } } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Collections/PwObjectList.cs keepass2-2.18+dfsg/KeePassLib/Collections/PwObjectList.cs --- keepass2-2.16+dfsg/KeePassLib/Collections/PwObjectList.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Collections/PwObjectList.cs 2012-01-01 11:50:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Collections/PwObjectPool.cs keepass2-2.18+dfsg/KeePassLib/Collections/PwObjectPool.cs --- keepass2-2.16+dfsg/KeePassLib/Collections/PwObjectPool.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Collections/PwObjectPool.cs 2012-01-01 11:50:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Collections/StringDictionaryEx.cs keepass2-2.18+dfsg/KeePassLib/Collections/StringDictionaryEx.cs --- keepass2-2.16+dfsg/KeePassLib/Collections/StringDictionaryEx.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Collections/StringDictionaryEx.cs 2012-01-01 11:50:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/Cipher/CipherPool.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/Cipher/CipherPool.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/Cipher/CipherPool.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/Cipher/CipherPool.cs 2012-01-01 11:50:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/Cipher/ICipherEngine.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/Cipher/ICipherEngine.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/Cipher/ICipherEngine.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/Cipher/ICipherEngine.cs 2012-01-01 11:50:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -48,7 +48,7 @@ /// /// Encrypt a stream. /// - /// Stream to read the plain text from. + /// Stream to read the plain-text from. /// Key to use. /// Initialization vector. /// Stream, from which the encrypted data can be read. diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/Cipher/Salsa20Cipher.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/Cipher/Salsa20Cipher.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/Cipher/Salsa20Cipher.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/Cipher/Salsa20Cipher.cs 2012-01-01 11:50:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/Cipher/StandardAesEngine.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/Cipher/StandardAesEngine.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/Cipher/StandardAesEngine.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/Cipher/StandardAesEngine.cs 2012-01-01 11:50:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/CryptoRandom.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/CryptoRandom.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/CryptoRandom.cs 2011-02-27 20:04:32.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/CryptoRandom.cs 2012-01-01 11:50:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -82,7 +82,7 @@ Random r = new Random(); m_uCounter = (uint)r.Next(); - AddEntropy(GetSystemData()); + AddEntropy(GetSystemData(r)); AddEntropy(GetCspData()); } @@ -122,14 +122,14 @@ SHA256Managed shaPool = new SHA256Managed(); #endif m_pbEntropyPool = shaPool.ComputeHash(pbFinal); - ms.Close(); } + ms.Close(); } - private static byte[] GetSystemData() + private static byte[] GetSystemData(Random rWeak) { - byte[] pb; MemoryStream ms = new MemoryStream(); + byte[] pb; pb = MemUtil.UInt32ToBytes((uint)Environment.TickCount); ms.Write(pb, 0, pb.Length); @@ -145,8 +145,7 @@ ms.Write(pb, 0, pb.Length); #endif - Random r = new Random(); - pb = MemUtil.UInt32ToBytes((uint)r.Next()); + pb = MemUtil.UInt32ToBytes((uint)rWeak.Next()); ms.Write(pb, 0, pb.Length); pb = MemUtil.UInt32ToBytes((uint)NativeLib.GetPlatformID()); @@ -205,7 +204,9 @@ pb = Guid.NewGuid().ToByteArray(); ms.Write(pb, 0, pb.Length); - return ms.ToArray(); + byte[] pbAll = ms.ToArray(); + ms.Close(); + return pbAll; } private byte[] GetCspData() @@ -235,6 +236,7 @@ pbFinal = ms.ToArray(); Debug.Assert(pbFinal.Length == (m_pbEntropyPool.Length + pbCounter.Length + pbCspRandom.Length)); + ms.Close(); m_uGeneratedBytesCount += 32; } diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/CryptoRandomStream.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/CryptoRandomStream.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/CryptoRandomStream.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/CryptoRandomStream.cs 2012-01-01 11:50:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/HashingStreamEx.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/HashingStreamEx.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/HashingStreamEx.cs 2011-06-20 11:31:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/HashingStreamEx.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/HmacOtp.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/HmacOtp.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/HmacOtp.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/HmacOtp.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/CharSetBasedGenerator.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/CharSetBasedGenerator.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/CharSetBasedGenerator.cs 2011-03-19 14:40:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/CharSetBasedGenerator.cs 2012-01-01 15:18:28.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -29,9 +29,10 @@ { internal static class CharSetBasedGenerator { - public static PwgError Generate(ProtectedString psOutBuffer, + internal static PwgError Generate(out ProtectedString psOut, PwProfile pwProfile, CryptoRandomStream crsRandomSource) { + psOut = ProtectedString.Empty; if(pwProfile.Length == 0) return PwgError.Success; PwCharSet pcs = new PwCharSet(pwProfile.CharSet.ToString()); @@ -53,9 +54,9 @@ vGenerated[nIndex] = ch; } - byte[] pbUTF8 = StrUtil.Utf8.GetBytes(vGenerated); - psOutBuffer.SetString(StrUtil.Utf8.GetString(pbUTF8, 0, pbUTF8.Length)); - Array.Clear(pbUTF8, 0, pbUTF8.Length); + byte[] pbUtf8 = StrUtil.Utf8.GetBytes(vGenerated); + psOut = new ProtectedString(true, pbUtf8); + MemUtil.ZeroByteArray(pbUtf8); Array.Clear(vGenerated, 0, vGenerated.Length); return PwgError.Success; diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/CustomPwGenerator.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/CustomPwGenerator.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/CustomPwGenerator.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/CustomPwGenerator.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/CustomPwGeneratorPool.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/CustomPwGeneratorPool.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/CustomPwGeneratorPool.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/CustomPwGeneratorPool.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/PatternBasedGenerator.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/PatternBasedGenerator.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/PatternBasedGenerator.cs 2011-03-19 14:40:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/PatternBasedGenerator.cs 2012-01-01 15:18:28.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -29,9 +29,10 @@ { internal static class PatternBasedGenerator { - public static PwgError Generate(ProtectedString psOutBuffer, + internal static PwgError Generate(out ProtectedString psOut, PwProfile pwProfile, CryptoRandomStream crsRandomSource) { + psOut = ProtectedString.Empty; LinkedList vGenerated = new LinkedList(); PwCharSet pcsCurrent = new PwCharSet(); PwCharSet pcsCustom = new PwCharSet(); @@ -118,8 +119,8 @@ PwGenerator.ShufflePassword(vArray, crsRandomSource); byte[] pbUtf8 = StrUtil.Utf8.GetBytes(vArray); - psOutBuffer.SetString(StrUtil.Utf8.GetString(pbUtf8, 0, pbUtf8.Length)); - Array.Clear(pbUtf8, 0, pbUtf8.Length); + psOut = new ProtectedString(true, pbUtf8); + MemUtil.ZeroByteArray(pbUtf8); Array.Clear(vArray, 0, vArray.Length); vGenerated.Clear(); @@ -133,8 +134,8 @@ while(true) { - int nOpen = str.IndexOf('{'); - int nClose = str.IndexOf('}'); + int nOpen = FindFirstUnescapedChar(str, '{'); + int nClose = FindFirstUnescapedChar(str, '}'); if((nOpen >= 0) && (nOpen < nClose)) { @@ -155,5 +156,18 @@ return str; } + + private static int FindFirstUnescapedChar(string str, char ch) + { + for(int i = 0; i < str.Length; ++i) + { + char chCur = str[i]; + + if(chCur == '\\') ++i; // Next is escaped, skip it + else if(chCur == ch) return i; + } + + return -1; + } } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/PwCharSet.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/PwCharSet.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/PwCharSet.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/PwCharSet.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/PwGenerator.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/PwGenerator.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/PwGenerator.cs 2011-01-01 11:23:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/PwGenerator.cs 2012-01-01 15:18:28.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -39,27 +39,23 @@ /// public static class PwGenerator { - public static PwgError Generate(ProtectedString psOutBuffer, + public static PwgError Generate(out ProtectedString psOut, PwProfile pwProfile, byte[] pbUserEntropy, CustomPwGeneratorPool pwAlgorithmPool) { - Debug.Assert(psOutBuffer != null); - if(psOutBuffer == null) throw new ArgumentNullException("psOutBuffer"); Debug.Assert(pwProfile != null); if(pwProfile == null) throw new ArgumentNullException("pwProfile"); - psOutBuffer.Clear(); - CryptoRandomStream crs = CreateCryptoStream(pbUserEntropy); PwgError e = PwgError.Unknown; if(pwProfile.GeneratorType == PasswordGeneratorType.CharSet) - e = CharSetBasedGenerator.Generate(psOutBuffer, pwProfile, crs); + e = CharSetBasedGenerator.Generate(out psOut, pwProfile, crs); else if(pwProfile.GeneratorType == PasswordGeneratorType.Pattern) - e = PatternBasedGenerator.Generate(psOutBuffer, pwProfile, crs); + e = PatternBasedGenerator.Generate(out psOut, pwProfile, crs); else if(pwProfile.GeneratorType == PasswordGeneratorType.Custom) - e = GenerateCustom(psOutBuffer, pwProfile, crs, pwAlgorithmPool); - else { Debug.Assert(false); } + e = GenerateCustom(out psOut, pwProfile, crs, pwAlgorithmPool); + else { Debug.Assert(false); psOut = ProtectedString.Empty; } return e; } @@ -123,10 +119,12 @@ } } - private static PwgError GenerateCustom(ProtectedString psOutBuffer, + private static PwgError GenerateCustom(out ProtectedString psOut, PwProfile pwProfile, CryptoRandomStream crs, CustomPwGeneratorPool pwAlgorithmPool) { + psOut = ProtectedString.Empty; + Debug.Assert(pwProfile.GeneratorType == PasswordGeneratorType.Custom); if(pwAlgorithmPool == null) return PwgError.UnknownAlgorithm; @@ -141,7 +139,7 @@ ProtectedString pwd = pwg.Generate(pwProfile.CloneDeep(), crs); if(pwd == null) return PwgError.Unknown; - psOutBuffer.SetString(pwd.ReadString()); + psOut = pwd; return PwgError.Success; } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/PwProfile.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/PwProfile.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/PasswordGenerator/PwProfile.cs 2011-03-19 14:40:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/PasswordGenerator/PwProfile.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Text; using System.Xml.Serialization; +using System.ComponentModel; using System.Diagnostics; using KeePassLib.Interfaces; @@ -55,6 +56,7 @@ public sealed class PwProfile : IDeepCloneable { private string m_strName = string.Empty; + [DefaultValue("")] public string Name { get { return m_strName; } @@ -69,6 +71,7 @@ } private bool m_bUserEntropy = false; + [DefaultValue(false)] public bool CollectUserEntropy { get { return m_bUserEntropy; } @@ -96,6 +99,7 @@ } private string m_strCharSetRanges = string.Empty; + [DefaultValue("")] public string CharSetRanges { get { this.UpdateCharSet(true); return m_strCharSetRanges; } @@ -108,6 +112,7 @@ } private string m_strCharSetAdditional = string.Empty; + [DefaultValue("")] public string CharSetAdditional { get { this.UpdateCharSet(true); return m_strCharSetAdditional; } @@ -120,6 +125,7 @@ } private string m_strPattern = string.Empty; + [DefaultValue("")] public string Pattern { get { return m_strPattern; } @@ -127,6 +133,7 @@ } private bool m_bPatternPermute = false; + [DefaultValue(false)] public bool PatternPermutePassword { get { return m_bPatternPermute; } @@ -134,6 +141,7 @@ } private bool m_bNoLookAlike = false; + [DefaultValue(false)] public bool ExcludeLookAlike { get { return m_bNoLookAlike; } @@ -141,6 +149,7 @@ } private bool m_bNoRepeat = false; + [DefaultValue(false)] public bool NoRepeatingCharacters { get { return m_bNoRepeat; } @@ -148,6 +157,7 @@ } private string m_strExclude = string.Empty; + [DefaultValue("")] public string ExcludeCharacters { get { return m_strExclude; } @@ -159,6 +169,7 @@ } private string m_strCustomID = string.Empty; + [DefaultValue("")] public string CustomAlgorithmUuid { get { return m_strCustomID; } @@ -170,6 +181,7 @@ } private string m_strCustomOpt = string.Empty; + [DefaultValue("")] public string CustomAlgorithmOptions { get { return m_strCustomOpt; } @@ -227,8 +239,8 @@ PwProfile pp = new PwProfile(); Debug.Assert(psPassword != null); if(psPassword == null) return pp; - byte[] pbUTF8 = psPassword.ReadUtf8(); - char[] vChars = StrUtil.Utf8.GetChars(pbUTF8); + byte[] pbUtf8 = psPassword.ReadUtf8(); + char[] vChars = StrUtil.Utf8.GetChars(pbUtf8); pp.GeneratorType = PasswordGeneratorType.CharSet; pp.Length = (uint)vChars.Length; @@ -253,7 +265,7 @@ } Array.Clear(vChars, 0, vChars.Length); - Array.Clear(pbUTF8, 0, pbUTF8.Length); + MemUtil.ZeroByteArray(pbUtf8); return pp; } diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/PopularPasswords.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/PopularPasswords.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/PopularPasswords.cs 2011-03-19 14:46:50.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/PopularPasswords.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/QualityEstimation.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/QualityEstimation.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/QualityEstimation.cs 2011-03-19 14:46:50.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/QualityEstimation.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Cryptography/SelfTest.cs keepass2-2.18+dfsg/KeePassLib/Cryptography/SelfTest.cs --- keepass2-2.16+dfsg/KeePassLib/Cryptography/SelfTest.cs 2011-06-04 17:31:02.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Cryptography/SelfTest.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -67,7 +67,7 @@ TestHmacOtp(); - TestProtectedMemory(); + TestProtectedObjects(); TestStrUtil(); TestUrlUtil(); @@ -243,7 +243,7 @@ #endif } - private static void TestProtectedMemory() + private static void TestProtectedObjects() { #if DEBUG byte[] pbData = Encoding.ASCII.GetBytes("Test Test Test Test"); @@ -259,9 +259,43 @@ byte[] pbData3 = Encoding.ASCII.GetBytes("Test Test Test Test Test"); ProtectedBinary pb2 = new ProtectedBinary(true, pbData2); ProtectedBinary pb3 = new ProtectedBinary(true, pbData3); - if(!pb.EqualsValue(pb2)) throw new SecurityException("ProtectedBinary-4"); - if(pb.EqualsValue(pb3)) throw new SecurityException("ProtectedBinary-5"); - if(pb2.EqualsValue(pb3)) throw new SecurityException("ProtectedBinary-6"); + if(!pb.Equals(pb2)) throw new SecurityException("ProtectedBinary-4"); + if(pb.Equals(pb3)) throw new SecurityException("ProtectedBinary-5"); + if(pb2.Equals(pb3)) throw new SecurityException("ProtectedBinary-6"); + + if(pb.GetHashCode() != pb2.GetHashCode()) + throw new SecurityException("ProtectedBinary-7"); + if(!((object)pb).Equals((object)pb2)) + throw new SecurityException("ProtectedBinary-8"); + if(((object)pb).Equals((object)pb3)) + throw new SecurityException("ProtectedBinary-9"); + if(((object)pb2).Equals((object)pb3)) + throw new SecurityException("ProtectedBinary-10"); + + ProtectedString ps = new ProtectedString(); + if(ps.Length != 0) throw new SecurityException("ProtectedString-1"); + if(!ps.IsEmpty) throw new SecurityException("ProtectedString-2"); + if(ps.ReadString().Length != 0) + throw new SecurityException("ProtectedString-3"); + + ps = new ProtectedString(true, "Test"); + ProtectedString ps2 = new ProtectedString(true, + StrUtil.Utf8.GetBytes("Test")); + if(ps.IsEmpty) throw new SecurityException("ProtectedString-4"); + pbData = ps.ReadUtf8(); + pbData2 = ps2.ReadUtf8(); + if(!MemUtil.ArraysEqual(pbData, pbData2)) + throw new SecurityException("ProtectedString-5"); + if(pbData.Length != 4) + throw new SecurityException("ProtectedString-6"); + if(ps.ReadString() != ps2.ReadString()) + throw new SecurityException("ProtectedString-7"); + pbData = ps.ReadUtf8(); + pbData2 = ps2.ReadUtf8(); + if(!MemUtil.ArraysEqual(pbData, pbData2)) + throw new SecurityException("ProtectedString-8"); + if(!ps.IsProtected) throw new SecurityException("ProtectedString-9"); + if(!ps2.IsProtected) throw new SecurityException("ProtectedString-10"); #endif } @@ -293,12 +327,38 @@ List v3 = StrUtil.SplitWithSep("pqrs", vSeps, false); if(v3.Count != 1) throw new InvalidOperationException("StrUtil-15"); if(!v3[0].Equals("pqrs")) throw new InvalidOperationException("StrUtil-16"); + + if(StrUtil.VersionToString(0x000F000E000D000CUL) != "15.14.13.12") + throw new InvalidOperationException("StrUtil-V1"); + if(StrUtil.VersionToString(0x00FF000E00010000UL) != "255.14.1") + throw new InvalidOperationException("StrUtil-V2"); + if(StrUtil.VersionToString(0x000F00FF00000000UL) != "15.255") + throw new InvalidOperationException("StrUtil-V3"); + if(StrUtil.VersionToString(0x00FF000000000000UL) != "255") + throw new InvalidOperationException("StrUtil-V4"); #endif } private static void TestUrlUtil() { #if DEBUG + if(UrlUtil.GetHost(@"scheme://domain:port/path?query_string#fragment_id") != + "domain") + throw new InvalidOperationException("UrlUtil-H1"); + if(UrlUtil.GetHost(@"http://example.org:80") != "example.org") + throw new InvalidOperationException("UrlUtil-H2"); + if(UrlUtil.GetHost(@"mailto:bob@example.com") != "example.com") + throw new InvalidOperationException("UrlUtil-H3"); + if(UrlUtil.GetHost(@"ftp://asmith@ftp.example.org") != "ftp.example.org") + throw new InvalidOperationException("UrlUtil-H4"); + if(UrlUtil.GetHost(@"scheme://username:password@domain:port/path?query_string#fragment_id") != + "domain") + throw new InvalidOperationException("UrlUtil-H5"); + if(UrlUtil.GetHost(@"bob@example.com") != "example.com") + throw new InvalidOperationException("UrlUtil-H6"); + if(UrlUtil.GetHost(@"s://u:p@d.tld:p/p?q#f") != "d.tld") + throw new InvalidOperationException("UrlUtil-H7"); + if(NativeLib.IsUnix()) return; string strBase = "\\\\HOMESERVER\\Apps\\KeePass\\KeePass.exe"; @@ -306,10 +366,10 @@ string strRel = "..\\..\\Documents\\KeePass\\NewDatabase.kdbx"; string str = UrlUtil.MakeRelativePath(strBase, strDoc); - if(!str.Equals(strRel)) throw new InvalidOperationException("UrlUtil-1"); + if(!str.Equals(strRel)) throw new InvalidOperationException("UrlUtil-R1"); str = UrlUtil.MakeAbsolutePath(strBase, strRel); - if(!str.Equals(strDoc)) throw new InvalidOperationException("UrlUtil-2"); + if(!str.Equals(strDoc)) throw new InvalidOperationException("UrlUtil-R2"); #endif } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Delegates/Handlers.cs keepass2-2.18+dfsg/KeePassLib/Delegates/Handlers.cs --- keepass2-2.16+dfsg/KeePassLib/Delegates/Handlers.cs 2011-02-12 17:19:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Delegates/Handlers.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -44,4 +44,6 @@ public delegate bool EntryHandler(PwEntry pe); public delegate void VoidDelegate(); + + public delegate string StrPwEntryDelegate(string str, PwEntry pe); } diff -Nru keepass2-2.16+dfsg/KeePassLib/Interfaces/IDeepCloneable.cs keepass2-2.18+dfsg/KeePassLib/Interfaces/IDeepCloneable.cs --- keepass2-2.16+dfsg/KeePassLib/Interfaces/IDeepCloneable.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Interfaces/IDeepCloneable.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Interfaces/IStatusLogger.cs keepass2-2.18+dfsg/KeePassLib/Interfaces/IStatusLogger.cs --- keepass2-2.16+dfsg/KeePassLib/Interfaces/IStatusLogger.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Interfaces/IStatusLogger.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Interfaces/IStructureItem.cs keepass2-2.18+dfsg/KeePassLib/Interfaces/IStructureItem.cs --- keepass2-2.16+dfsg/KeePassLib/Interfaces/IStructureItem.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Interfaces/IStructureItem.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Interfaces/ITimeLogger.cs keepass2-2.18+dfsg/KeePassLib/Interfaces/ITimeLogger.cs --- keepass2-2.16+dfsg/KeePassLib/Interfaces/ITimeLogger.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Interfaces/ITimeLogger.cs 2012-01-01 11:51:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Interfaces/IUIOperations.cs keepass2-2.18+dfsg/KeePassLib/Interfaces/IUIOperations.cs --- keepass2-2.16+dfsg/KeePassLib/Interfaces/IUIOperations.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Interfaces/IUIOperations.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/KeePassLib.csproj keepass2-2.18+dfsg/KeePassLib/KeePassLib.csproj --- keepass2-2.16+dfsg/KeePassLib/KeePassLib.csproj 2010-09-18 08:14:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/KeePassLib.csproj 2012-01-05 09:19:28.000000000 +0000 @@ -100,6 +100,7 @@ + diff -Nru keepass2-2.16+dfsg/KeePassLib/Keys/CompositeKey.cs keepass2-2.18+dfsg/KeePassLib/Keys/CompositeKey.cs --- keepass2-2.16+dfsg/KeePassLib/Keys/CompositeKey.cs 2011-07-08 11:46:10.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Keys/CompositeKey.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -60,25 +60,24 @@ { } - /// - /// Deconstructor, clears up the key. - /// - ~CompositeKey() - { - this.Clear(); - } - - /// - /// Clears the key. This function also erases all previously stored - /// user key data objects. - /// - public void Clear() - { - foreach(IUserKey pKey in m_vUserKeys) - pKey.Clear(); - - m_vUserKeys.Clear(); - } + // /// + // /// Deconstructor, clears up the key. + // /// + // ~CompositeKey() + // { + // Clear(); + // } + + // /// + // /// Clears the key. This function also erases all previously stored + // /// user key data objects. + // /// + // public void Clear() + // { + // foreach(IUserKey pKey in m_vUserKeys) + // pKey.Clear(); + // m_vUserKeys.Clear(); + // } /// /// Add a user key. @@ -163,12 +162,14 @@ { byte[] pbKeyData = b.ReadData(); ms.Write(pbKeyData, 0, pbKeyData.Length); - Array.Clear(pbKeyData, 0, pbKeyData.Length); + MemUtil.ZeroByteArray(pbKeyData); } } SHA256Managed sha256 = new SHA256Managed(); - return sha256.ComputeHash(ms.ToArray()); + byte[] pbHash = sha256.ComputeHash(ms.ToArray()); + ms.Close(); + return pbHash; } public bool EqualsValue(CompositeKey ckOther) @@ -209,8 +210,8 @@ { Debug.Assert(false); return null; } ProtectedBinary pbRet = new ProtectedBinary(true, pbTrf32); - Array.Clear(pbTrf32, 0, 32); - Array.Clear(pbRaw32, 0, 32); + MemUtil.ZeroByteArray(pbTrf32); + MemUtil.ZeroByteArray(pbRaw32); return pbRet; } diff -Nru keepass2-2.16+dfsg/KeePassLib/Keys/IUserKey.cs keepass2-2.18+dfsg/KeePassLib/Keys/IUserKey.cs --- keepass2-2.16+dfsg/KeePassLib/Keys/IUserKey.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Keys/IUserKey.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -38,9 +38,9 @@ get; } - /// - /// Clear the key and securely erase all security-critical information. - /// - void Clear(); + // /// + // /// Clear the key and securely erase all security-critical information. + // /// + // void Clear(); } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Keys/KcpCustomKey.cs keepass2-2.18+dfsg/KeePassLib/Keys/KcpCustomKey.cs --- keepass2-2.16+dfsg/KeePassLib/Keys/KcpCustomKey.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Keys/KcpCustomKey.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -24,12 +24,13 @@ using System.Security.Cryptography; using KeePassLib.Security; +using KeePassLib.Utility; namespace KeePassLib.Keys { public sealed class KcpCustomKey : IUserKey { - private string m_strName; + private readonly string m_strName; private ProtectedBinary m_pbKey; /// @@ -61,9 +62,9 @@ else m_pbKey = new ProtectedBinary(true, pbKeyData); } - public void Clear() - { - m_pbKey.Clear(); - } + // public void Clear() + // { + // m_pbKey = null; + // } } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Keys/KcpKeyFile.cs keepass2-2.18+dfsg/KeePassLib/Keys/KcpKeyFile.cs --- keepass2-2.16+dfsg/KeePassLib/Keys/KcpKeyFile.cs 2011-02-19 11:41:54.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Keys/KcpKeyFile.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -27,6 +27,7 @@ using KeePassLib.Cryptography; using KeePassLib.Security; +using KeePassLib.Serialization; using KeePassLib.Utility; namespace KeePassLib.Keys @@ -36,8 +37,8 @@ /// public sealed class KcpKeyFile : IUserKey { - private string m_strPath = string.Empty; - private ProtectedBinary m_pbKeyData = null; + private string m_strPath; + private ProtectedBinary m_pbKeyData; /// /// Path to the key file. @@ -59,47 +60,48 @@ public KcpKeyFile(string strKeyFile) { - byte[] pbKey = LoadXmlKeyFile(strKeyFile); - if(pbKey == null) pbKey = LoadKeyFile(strKeyFile); - - if(pbKey == null) throw new InvalidOperationException(); + Construct(IOConnectionInfo.FromPath(strKeyFile)); + } - m_strPath = strKeyFile; - m_pbKeyData = new ProtectedBinary(true, pbKey); + public KcpKeyFile(IOConnectionInfo iocKeyFile) + { + Construct(iocKeyFile); } - /// - /// Clear the key and securely erase all security-critical information. - /// - public void Clear() + private void Construct(IOConnectionInfo iocFile) { - m_strPath = string.Empty; + byte[] pbKey = LoadXmlKeyFile(iocFile); + if(pbKey == null) pbKey = LoadKeyFile(iocFile); - if(m_pbKeyData != null) - { - m_pbKeyData.Clear(); - m_pbKeyData = null; - } + if(pbKey == null) throw new InvalidOperationException(); + + m_strPath = iocFile.Path; + m_pbKeyData = new ProtectedBinary(true, pbKey); } - private static byte[] LoadKeyFile(string strKeyFilePath) - { - FileStream fs; + // public void Clear() + // { + // m_strPath = string.Empty; + // m_pbKeyData = null; + // } - try { fs = new FileStream(strKeyFilePath, FileMode.Open, FileAccess.Read, FileShare.Read); } - catch(Exception) { return null; } + private static byte[] LoadKeyFile(IOConnectionInfo iocFile) + { + Stream sIn = null; + try { sIn = IOConnection.OpenRead(iocFile); } + catch(Exception) { } + if(sIn == null) return null; - long lLength = fs.Length; - BinaryReader br = new BinaryReader(fs); + long lLength = sIn.Length; + BinaryReader br = new BinaryReader(sIn); byte[] pbFileData = br.ReadBytes((int)lLength); br.Close(); - fs.Close(); + sIn.Close(); byte[] pbKey = null; - if(lLength == 32) pbKey = LoadBinaryKey32(pbFileData); else if(lLength == 64) pbKey = LoadHexKey32(pbFileData); - + if(pbKey == null) { if(pbFileData.Length == lLength) @@ -129,12 +131,9 @@ try { string strHex = Encoding.ASCII.GetString(pbFileData, 0, 64); - - if(StrUtil.IsHexString(strHex, true) == false) - return null; + if(!StrUtil.IsHexString(strHex, true)) return null; byte[] pbKey = MemUtil.HexStringToByteArray(strHex); - if((pbKey == null) || (pbKey.Length != 32)) return null; @@ -197,16 +196,19 @@ private const string KeyElementName = "Key"; private const string KeyDataElementName = "Data"; - private static byte[] LoadXmlKeyFile(string strFile) + private static byte[] LoadXmlKeyFile(IOConnectionInfo iocFile) { - Debug.Assert(strFile != null); if(strFile == null) throw new ArgumentNullException("strFile"); + Debug.Assert(iocFile != null); if(iocFile == null) throw new ArgumentNullException("iocFile"); + Stream sIn = null; byte[] pbKeyData = null; try { + sIn = IOConnection.OpenRead(iocFile); + XmlDocument doc = new XmlDocument(); - doc.Load(strFile); + doc.Load(sIn); XmlElement el = doc.DocumentElement; if((el == null) || !el.Name.Equals(RootElementName)) return null; @@ -228,7 +230,8 @@ } } } - catch(Exception) { return null; } + catch(Exception) { pbKeyData = null; } + finally { if(sIn != null) sIn.Close(); } return pbKeyData; } diff -Nru keepass2-2.16+dfsg/KeePassLib/Keys/KcpPassword.cs keepass2-2.18+dfsg/KeePassLib/Keys/KcpPassword.cs --- keepass2-2.16+dfsg/KeePassLib/Keys/KcpPassword.cs 2011-03-19 14:46:50.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Keys/KcpPassword.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -32,8 +32,8 @@ /// public sealed class KcpPassword : IUserKey { - private ProtectedString m_psPassword = null; - private ProtectedBinary m_pbKeyData = null; + private ProtectedString m_psPassword; + private ProtectedBinary m_pbKeyData; /// /// Get the password as protected string. @@ -75,22 +75,10 @@ m_pbKeyData = new ProtectedBinary(true, pbRaw); } - /// - /// Clear the key and securely erase all security-critical information. - /// - public void Clear() - { - if(m_psPassword != null) - { - m_psPassword.Clear(); - m_psPassword = null; - } - - if(m_pbKeyData != null) - { - m_pbKeyData.Clear(); - m_pbKeyData = null; - } - } + // public void Clear() + // { + // m_psPassword = null; + // m_pbKeyData = null; + // } } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Keys/KcpUserAccount.cs keepass2-2.18+dfsg/KeePassLib/Keys/KcpUserAccount.cs --- keepass2-2.16+dfsg/KeePassLib/Keys/KcpUserAccount.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Keys/KcpUserAccount.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -73,17 +73,10 @@ Array.Clear(pbKey, 0, pbKey.Length); } - /// - /// Clear the key and securely erase all security-critical information. - /// - public void Clear() - { - if(m_pbKeyData != null) - { - m_pbKeyData.Clear(); - m_pbKeyData = null; - } - } + // public void Clear() + // { + // m_pbKeyData = null; + // } private static string GetUserKeyFilePath(bool bCreate) { diff -Nru keepass2-2.16+dfsg/KeePassLib/Keys/KeyProvider.cs keepass2-2.18+dfsg/KeePassLib/Keys/KeyProvider.cs --- keepass2-2.16+dfsg/KeePassLib/Keys/KeyProvider.cs 2011-02-12 18:19:08.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Keys/KeyProvider.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -44,12 +44,20 @@ get { return m_bCreatingNewKey; } } - public KeyProviderQueryContext(IOConnectionInfo ioInfo, bool bCreatingNewKey) + private bool m_bSecDesktop; + public bool IsOnSecureDesktop + { + get { return m_bSecDesktop; } + } + + public KeyProviderQueryContext(IOConnectionInfo ioInfo, bool bCreatingNewKey, + bool bOnSecDesktop) { if(ioInfo == null) throw new ArgumentNullException("ioInfo"); m_ioInfo = ioInfo.CloneDeep(); m_bCreatingNewKey = bCreatingNewKey; + m_bSecDesktop = bOnSecDesktop; } } @@ -108,6 +116,16 @@ get { return true; } } + /// + /// 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. + /// + public virtual bool SecureDesktopCompatible + { + get { return false; } + } + public abstract byte[] GetKey(KeyProviderQueryContext ctx); } diff -Nru keepass2-2.16+dfsg/KeePassLib/Keys/KeyProviderPool.cs keepass2-2.18+dfsg/KeePassLib/Keys/KeyProviderPool.cs --- keepass2-2.16+dfsg/KeePassLib/Keys/KeyProviderPool.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Keys/KeyProviderPool.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Keys/KeyValidator.cs keepass2-2.18+dfsg/KeePassLib/Keys/KeyValidator.cs --- keepass2-2.16+dfsg/KeePassLib/Keys/KeyValidator.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Keys/KeyValidator.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Keys/KeyValidatorPool.cs keepass2-2.18+dfsg/KeePassLib/Keys/KeyValidatorPool.cs --- keepass2-2.16+dfsg/KeePassLib/Keys/KeyValidatorPool.cs 2011-03-19 14:46:50.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Keys/KeyValidatorPool.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Keys/UserKeyType.cs keepass2-2.18+dfsg/KeePassLib/Keys/UserKeyType.cs --- keepass2-2.16+dfsg/KeePassLib/Keys/UserKeyType.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Keys/UserKeyType.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Native/NativeLib.cs keepass2-2.18+dfsg/KeePassLib/Native/NativeLib.cs --- keepass2-2.16+dfsg/KeePassLib/Native/NativeLib.cs 2011-02-27 20:04:32.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Native/NativeLib.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Native/NativeMethods.cs keepass2-2.18+dfsg/KeePassLib/Native/NativeMethods.cs --- keepass2-2.16+dfsg/KeePassLib/Native/NativeMethods.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Native/NativeMethods.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Properties/AssemblyInfo.cs keepass2-2.18+dfsg/KeePassLib/Properties/AssemblyInfo.cs --- keepass2-2.16+dfsg/KeePassLib/Properties/AssemblyInfo.cs 2011-07-05 12:43:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Properties/AssemblyInfo.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -27,7 +27,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Dominik Reichl")] [assembly: AssemblyProduct("KeePassLib")] -[assembly: AssemblyCopyright("Copyright © 2003-2011 Dominik Reichl")] +[assembly: AssemblyCopyright("Copyright © 2003-2012 Dominik Reichl")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -38,5 +38,5 @@ [assembly: Guid("395f6eec-a1e0-4438-aa82-b75099348134")] // Assembly version information -[assembly: AssemblyVersion("2.1.6.*")] -[assembly: AssemblyFileVersion("2.1.6.0")] +[assembly: AssemblyVersion("2.1.8.*")] +[assembly: AssemblyFileVersion("2.1.8.0")] diff -Nru keepass2-2.16+dfsg/KeePassLib/PwCustomIcon.cs keepass2-2.18+dfsg/KeePassLib/PwCustomIcon.cs --- keepass2-2.16+dfsg/KeePassLib/PwCustomIcon.cs 2011-01-01 11:25:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/PwCustomIcon.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/PwDatabase.cs keepass2-2.18+dfsg/KeePassLib/PwDatabase.cs --- keepass2-2.16+dfsg/KeePassLib/PwDatabase.cs 2011-07-09 12:42:24.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/PwDatabase.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -96,6 +96,7 @@ private byte[] m_pbHashOfLastIO = null; private bool m_bUseFileTransactions = false; + private bool m_bUseFileLocks = false; private IStatusLogger m_slStatus = null; @@ -436,6 +437,12 @@ set { m_bUseFileTransactions = value; } } + public bool UseFileLocks + { + get { return m_bUseFileLocks; } + set { m_bUseFileLocks = value; } + } + private string m_strDetachBins = null; /// /// Detach binaries when opening a file. If this isn't null, @@ -519,6 +526,7 @@ m_pbHashOfLastIO = null; m_bUseFileTransactions = false; + m_bUseFileLocks = false; } /// @@ -604,22 +612,24 @@ { Debug.Assert(ValidateUuidUniqueness()); - // bool bMadeUnhidden = UrlUtil.UnhideFile(m_ioSource.Path); - // Stream s = IOConnection.OpenWrite(m_ioSource); - - FileTransactionEx ft = new FileTransactionEx(m_ioSource, m_bUseFileTransactions); - Stream s = ft.OpenWrite(); - - Kdb4File kdb = new Kdb4File(this); - kdb.Save(s, null, Kdb4Format.Default, slLogger); + FileLock fl = null; + if(m_bUseFileLocks) fl = new FileLock(m_ioSource); + try + { + FileTransactionEx ft = new FileTransactionEx(m_ioSource, + m_bUseFileTransactions); + Stream s = ft.OpenWrite(); - ft.CommitWrite(); + Kdb4File kdb = new Kdb4File(this); + kdb.Save(s, null, Kdb4Format.Default, slLogger); - // if(bMadeUnhidden) UrlUtil.HideFile(m_ioSource.Path, true); // Hide again + ft.CommitWrite(); - m_pbHashOfLastIO = kdb.HashOfFileOnDisk; - m_pbHashOfFileOnDisk = kdb.HashOfFileOnDisk; - Debug.Assert(m_pbHashOfFileOnDisk != null); + m_pbHashOfLastIO = kdb.HashOfFileOnDisk; + m_pbHashOfFileOnDisk = kdb.HashOfFileOnDisk; + Debug.Assert(m_pbHashOfFileOnDisk != null); + } + finally { if(fl != null) fl.Dispose(); } m_bModified = false; } @@ -762,8 +772,10 @@ { Debug.Assert(mm != PwMergeMethod.CreateNewUuids); - bool bEquals = peLocal.EqualsEntry(pe, true, false, true, - true, false); + const PwCompareOptions cmpOpt = (PwCompareOptions.IgnoreParentGroup | + PwCompareOptions.IgnoreLastAccess | PwCompareOptions.IgnoreHistory | + PwCompareOptions.NullEmptyEquivStd); + bool bEquals = peLocal.EqualsEntry(pe, cmpOpt, MemProtCmpMode.None); bool bOrgBackup = !bEquals; if(mm != PwMergeMethod.OverwriteExisting) @@ -1634,6 +1646,7 @@ ProtectedString psB = b.Strings.Get(kvpA.Key); if(psB == null) return false; + // Ignore protection setting, compare values only if(!kvpA.Value.ReadString().Equals(psB.ReadString())) return false; } @@ -1654,7 +1667,13 @@ ProtectedBinary pbB = b.Binaries.Get(kvpBin.Key); if(pbB == null) return false; - if(!kvpBin.Value.EqualsValue(pbB)) return false; + // Ignore protection setting, compare values only + byte[] pbDataA = kvpBin.Value.ReadData(); + byte[] pbDataB = pbB.ReadData(); + bool bBinEq = MemUtil.ArraysEqual(pbDataA, pbDataB); + MemUtil.ZeroByteArray(pbDataA); + MemUtil.ZeroByteArray(pbDataB); + if(!bBinEq) return false; } return true; @@ -1733,6 +1752,7 @@ ++uDeleted; } + if(uDeleted > 0) m_bUINeedsIconUpdate = true; return uDeleted; } } diff -Nru keepass2-2.16+dfsg/KeePassLib/PwDefs.cs keepass2-2.18+dfsg/KeePassLib/PwDefs.cs --- keepass2-2.16+dfsg/KeePassLib/PwDefs.cs 2011-07-12 07:51:06.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/PwDefs.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -19,9 +19,11 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Xml.Serialization; +using System.ComponentModel; +using System.Diagnostics; +using KeePassLib.Delegates; using KeePassLib.Interfaces; namespace KeePassLib @@ -46,15 +48,15 @@ /// Version, encoded as 32-bit unsigned integer. /// 2.00 = 0x02000000, 2.01 = 0x02000100, 2.15 = 0x02010500, etc. /// - public const uint Version32 = 0x02010600; - public const ulong FileVersion64 = 0x0002001000000000UL; + public const uint Version32 = 0x02010800; + public const ulong FileVersion64 = 0x0002001200000000UL; /// /// Version, encoded as string. /// - public const string VersionString = "2.16"; + public const string VersionString = "2.18"; - public const string Copyright = @"Copyright © 2003-2011 Dominik Reichl"; + public const string Copyright = @"Copyright © 2003-2012 Dominik Reichl"; /// /// Product website URL. Terminated by a forward slash. @@ -77,10 +79,10 @@ public const string TranslationsUrl = "http://keepass.info/translations.html"; /// - /// URL to an XML file that contains information about the latest KeePass - /// available on the website. + /// URL to a TXT file (eventually compressed) that contains information + /// about the latest KeePass version available on the website. /// - public const string VersionUrl = "http://keepass.info/update/version2.xml.gz"; + public const string VersionUrl = "http://keepass.info/update/version2x.txt.gz"; /// /// URL to the root path of the online KeePass help. Terminated by @@ -213,6 +215,7 @@ public sealed class SearchParameters { private string m_strText = string.Empty; + [DefaultValue("")] public string SearchString { get { return m_strText; } @@ -224,6 +227,7 @@ } private bool m_bRegex = false; + [DefaultValue(false)] public bool RegularExpression { get { return m_bRegex; } @@ -231,6 +235,7 @@ } private bool m_bSearchInTitles = true; + [DefaultValue(true)] public bool SearchInTitles { get { return m_bSearchInTitles; } @@ -238,6 +243,7 @@ } private bool m_bSearchInUserNames = true; + [DefaultValue(true)] public bool SearchInUserNames { get { return m_bSearchInUserNames; } @@ -245,6 +251,7 @@ } private bool m_bSearchInPasswords = false; + [DefaultValue(false)] public bool SearchInPasswords { get { return m_bSearchInPasswords; } @@ -252,6 +259,7 @@ } private bool m_bSearchInUrls = true; + [DefaultValue(true)] public bool SearchInUrls { get { return m_bSearchInUrls; } @@ -259,6 +267,7 @@ } private bool m_bSearchInNotes = true; + [DefaultValue(true)] public bool SearchInNotes { get { return m_bSearchInNotes; } @@ -266,6 +275,7 @@ } private bool m_bSearchInOther = true; + [DefaultValue(true)] public bool SearchInOther { get { return m_bSearchInOther; } @@ -273,6 +283,7 @@ } private bool m_bSearchInUuids = false; + [DefaultValue(false)] public bool SearchInUuids { get { return m_bSearchInUuids; } @@ -280,6 +291,7 @@ } private bool m_bSearchInGroupNames = false; + [DefaultValue(false)] public bool SearchInGroupNames { get { return m_bSearchInGroupNames; } @@ -287,6 +299,7 @@ } private bool m_bSearchInTags = true; + [DefaultValue(true)] public bool SearchInTags { get { return m_bSearchInTags; } @@ -305,12 +318,44 @@ } private bool m_bExcludeExpired = false; + [DefaultValue(false)] public bool ExcludeExpired { get { return m_bExcludeExpired; } set { m_bExcludeExpired = value; } } + private bool m_bRespectEntrySearchingDisabled = true; + [DefaultValue(true)] + public bool RespectEntrySearchingDisabled + { + get { return m_bRespectEntrySearchingDisabled; } + set { m_bRespectEntrySearchingDisabled = value; } + } + + private StrPwEntryDelegate m_fnDataTrf = null; + [XmlIgnore] + public StrPwEntryDelegate DataTransformationFn + { + get { return m_fnDataTrf; } + set { m_fnDataTrf = value; } + } + + private string m_strDataTrf = string.Empty; + /// + /// Only for serialization. + /// + [DefaultValue("")] + public string DataTransformation + { + get { return m_strDataTrf; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strDataTrf = value; + } + } + [XmlIgnore] public static SearchParameters None { @@ -322,8 +367,8 @@ // sp.m_bRegex = false; sp.m_bSearchInTitles = false; sp.m_bSearchInUserNames = false; - sp.m_bSearchInUrls = false; // sp.m_bSearchInPasswords = false; + sp.m_bSearchInUrls = false; sp.m_bSearchInNotes = false; sp.m_bSearchInOther = false; // sp.m_bSearchInUuids = false; @@ -331,6 +376,7 @@ sp.m_bSearchInTags = false; // sp.m_scType = StringComparison.InvariantCultureIgnoreCase; // sp.m_bExcludeExpired = false; + // m_bRespectEntrySearchingDisabled = true; return sp; } @@ -342,6 +388,11 @@ public SearchParameters() { } + + public SearchParameters Clone() + { + return (SearchParameters)this.MemberwiseClone(); + } } #pragma warning restore 1591 // Missing XML comments warning diff -Nru keepass2-2.16+dfsg/KeePassLib/PwDeletedObject.cs keepass2-2.18+dfsg/KeePassLib/PwDeletedObject.cs --- keepass2-2.16+dfsg/KeePassLib/PwDeletedObject.cs 2011-07-09 12:42:24.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/PwDeletedObject.cs 2012-01-01 11:52:30.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/PwEntry.cs keepass2-2.18+dfsg/KeePassLib/PwEntry.cs --- keepass2-2.16+dfsg/KeePassLib/PwEntry.cs 2011-06-20 13:10:22.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/PwEntry.cs 2012-01-01 11:53:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -72,7 +72,6 @@ set { Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value"); - m_uuid = value; } } @@ -106,7 +105,6 @@ set { Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value"); - m_listStrings = value; } } @@ -120,7 +118,6 @@ set { Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value"); - m_listBinaries = value; } } @@ -134,7 +131,6 @@ set { Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value"); - m_listAutoType = value; } } @@ -148,7 +144,6 @@ set { Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value"); - m_listHistory = value; } } @@ -173,7 +168,6 @@ set { Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value"); - m_pwCustomIconID = value; } } @@ -261,7 +255,6 @@ set { if(value == null) throw new ArgumentNullException("value"); - m_strOverrideUrl = value; } } @@ -275,7 +268,6 @@ set { if(value == null) throw new ArgumentNullException("value"); - m_vTags = value; } } @@ -378,39 +370,87 @@ return peNew; } + private static PwCompareOptions BuildCmpOpt(bool bIgnoreParentGroup, + bool bIgnoreLastMod, bool bIgnoreLastAccess, bool bIgnoreHistory, + bool bIgnoreThisLastBackup) + { + PwCompareOptions pwOpt = PwCompareOptions.None; + if(bIgnoreParentGroup) pwOpt |= PwCompareOptions.IgnoreParentGroup; + if(bIgnoreLastMod) pwOpt |= PwCompareOptions.IgnoreLastMod; + if(bIgnoreLastAccess) pwOpt |= PwCompareOptions.IgnoreLastAccess; + if(bIgnoreHistory) pwOpt |= PwCompareOptions.IgnoreHistory; + if(bIgnoreThisLastBackup) pwOpt |= PwCompareOptions.IgnoreLastBackup; + return pwOpt; + } + + [Obsolete] public bool EqualsEntry(PwEntry pe, bool bIgnoreParentGroup, bool bIgnoreLastMod, bool bIgnoreLastAccess, bool bIgnoreHistory, bool bIgnoreThisLastBackup) { + return EqualsEntry(pe, BuildCmpOpt(bIgnoreParentGroup, bIgnoreLastMod, + bIgnoreLastAccess, bIgnoreHistory, bIgnoreThisLastBackup), + MemProtCmpMode.None); + } + + [Obsolete] + public bool EqualsEntry(PwEntry pe, bool bIgnoreParentGroup, bool bIgnoreLastMod, + bool bIgnoreLastAccess, bool bIgnoreHistory, bool bIgnoreThisLastBackup, + MemProtCmpMode mpCmpStr) + { + return EqualsEntry(pe, BuildCmpOpt(bIgnoreParentGroup, bIgnoreLastMod, + bIgnoreLastAccess, bIgnoreHistory, bIgnoreThisLastBackup), mpCmpStr); + } + + public bool EqualsEntry(PwEntry pe, PwCompareOptions pwOpt, + MemProtCmpMode mpCmpStr) + { if(pe == null) { Debug.Assert(false); return false; } + bool bNeEqStd = ((pwOpt & PwCompareOptions.NullEmptyEquivStd) != + PwCompareOptions.None); + bool bIgnoreLastAccess = ((pwOpt & PwCompareOptions.IgnoreLastAccess) != + PwCompareOptions.None); + bool bIgnoreLastMod = ((pwOpt & PwCompareOptions.IgnoreLastMod) != + PwCompareOptions.None); + if(!m_uuid.EqualsValue(pe.m_uuid)) return false; - if(!bIgnoreParentGroup) + if((pwOpt & PwCompareOptions.IgnoreParentGroup) == PwCompareOptions.None) { if(m_pParentGroup != pe.m_pParentGroup) return false; if(!bIgnoreLastMod && (m_tParentGroupLastMod != pe.m_tParentGroupLastMod)) return false; } - if(!m_listStrings.EqualsDictionary(pe.m_listStrings)) return false; + if(!m_listStrings.EqualsDictionary(pe.m_listStrings, pwOpt, mpCmpStr)) + return false; if(!m_listBinaries.EqualsDictionary(pe.m_listBinaries)) return false; - if(!m_listAutoType.EqualsConfig(pe.m_listAutoType)) return false; + if(!m_listAutoType.Equals(pe.m_listAutoType)) return false; - if(!bIgnoreHistory) + if((pwOpt & PwCompareOptions.IgnoreHistory) == PwCompareOptions.None) { - if(!bIgnoreThisLastBackup && (m_listHistory.UCount != pe.m_listHistory.UCount)) + bool bIgnoreLastBackup = ((pwOpt & PwCompareOptions.IgnoreLastBackup) != + PwCompareOptions.None); + + if(!bIgnoreLastBackup && (m_listHistory.UCount != pe.m_listHistory.UCount)) return false; - if(bIgnoreThisLastBackup && (m_listHistory.UCount == 0)) + if(bIgnoreLastBackup && (m_listHistory.UCount == 0)) { Debug.Assert(false); return false; } - if(bIgnoreThisLastBackup && ((m_listHistory.UCount - 1) != pe.m_listHistory.UCount)) + if(bIgnoreLastBackup && ((m_listHistory.UCount - 1) != pe.m_listHistory.UCount)) return false; + + PwCompareOptions cmpSub = PwCompareOptions.IgnoreParentGroup; + if(bNeEqStd) cmpSub |= PwCompareOptions.NullEmptyEquivStd; + if(bIgnoreLastMod) cmpSub |= PwCompareOptions.IgnoreLastMod; + if(bIgnoreLastAccess) cmpSub |= PwCompareOptions.IgnoreLastAccess; + for(uint uHist = 0; uHist < pe.m_listHistory.UCount; ++uHist) { if(!m_listHistory.GetAt(uHist).EqualsEntry(pe.m_listHistory.GetAt( - uHist), true, bIgnoreLastMod, bIgnoreLastAccess, false, false)) + uHist), cmpSub, MemProtCmpMode.None)) return false; } } @@ -589,10 +629,14 @@ { if(peData == null) { Debug.Assert(false); return false; } + PwCompareOptions cmpOpt = (PwCompareOptions.IgnoreParentGroup | + PwCompareOptions.IgnoreHistory | PwCompareOptions.NullEmptyEquivStd); + if(bIgnoreLastMod) cmpOpt |= PwCompareOptions.IgnoreLastMod; + if(bIgnoreLastAccess) cmpOpt |= PwCompareOptions.IgnoreLastAccess; + foreach(PwEntry pe in m_listHistory) { - if(pe.EqualsEntry(peData, true, bIgnoreLastMod, bIgnoreLastAccess, - true, false)) return true; + if(pe.EqualsEntry(peData, cmpOpt, MemProtCmpMode.None)) return true; } return false; @@ -660,7 +704,7 @@ public bool GetAutoTypeEnabled() { - if(m_listAutoType.Enabled == false) return false; + if(!m_listAutoType.Enabled) return false; if(m_pParentGroup != null) return m_pParentGroup.GetAutoTypeEnabledInherited(); @@ -717,10 +761,10 @@ } uSize += (ulong)m_listAutoType.DefaultSequence.Length; - foreach(KeyValuePair kvpCfg in m_listAutoType.WindowSequencePairs) + foreach(AutoTypeAssociation a in m_listAutoType.Associations) { - uSize += (ulong)kvpCfg.Key.Length; - uSize += (ulong)kvpCfg.Value.Length; + uSize += (ulong)a.WindowName.Length; + uSize += (ulong)a.Sequence.Length; } foreach(PwEntry peHistory in m_listHistory) diff -Nru keepass2-2.16+dfsg/KeePassLib/PwEnums.cs keepass2-2.18+dfsg/KeePassLib/PwEnums.cs --- keepass2-2.16+dfsg/KeePassLib/PwEnums.cs 2011-06-15 14:23:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/PwEnums.cs 2012-01-01 11:53:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -60,7 +60,6 @@ PreOrder = 1 } -#pragma warning disable 1591 // Missing XML comments warning /// /// Methods for merging password databases/entries. /// @@ -73,9 +72,7 @@ CreateNewUuids = 4, Synchronize = 5 } -#pragma warning restore 1591 // Missing XML comments warning -#pragma warning disable 1591 // Missing XML comments warning /// /// Icon identifiers for groups and password entries. /// @@ -156,7 +153,6 @@ /// Count } -#pragma warning restore 1591 // Missing XML comments warning public enum ProxyServerType { @@ -164,4 +160,48 @@ System = 1, Manual = 2 } + + /// + /// Comparison modes for in-memory protected objects. + /// + public enum MemProtCmpMode + { + /// + /// Ignore the in-memory protection states. + /// + None = 0, + + /// + /// Ignore the in-memory protection states of standard + /// objects; do compare in-memory protection states of + /// custom objects. + /// + CustomOnly, + + /// + /// Compare in-memory protection states. + /// + Full + } + + [Flags] + public enum PwCompareOptions + { + None = 0x0, + + /// + /// Empty standard string fields are considered to be the + /// same as non-existing standard string fields. + /// This doesn't affect custom string comparisons. + /// + NullEmptyEquivStd = 0x1, + + IgnoreParentGroup = 0x2, + IgnoreLastAccess = 0x4, + IgnoreLastMod = 0x8, + IgnoreHistory = 0x10, + IgnoreLastBackup = 0x20, + + IgnoreTimes = (IgnoreLastAccess | IgnoreLastMod) + } } diff -Nru keepass2-2.16+dfsg/KeePassLib/PwGroup.cs keepass2-2.18+dfsg/KeePassLib/PwGroup.cs --- keepass2-2.16+dfsg/KeePassLib/PwGroup.cs 2011-07-09 12:31:24.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/PwGroup.cs 2012-01-01 11:53:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -76,7 +76,6 @@ set { Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value"); - m_uuid = value; } } @@ -90,7 +89,6 @@ set { Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value"); - m_strName = value; } } @@ -104,7 +102,6 @@ set { Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value"); - m_strNotes = value; } } @@ -129,7 +126,6 @@ set { Debug.Assert(value != null); if(value == null) throw new ArgumentNullException("value"); - m_pwCustomIconID = value; } } @@ -503,6 +499,13 @@ } } + public uint GetEntriesCount(bool bRecursive) + { + uint uGroups, uEntries; + GetCounts(bRecursive, out uGroups, out uEntries); + return uEntries; + } + /// /// Traverse the group/entry tree in the current group. Various traversal /// methods are available. @@ -637,14 +640,12 @@ EntryHandler eh = delegate(PwEntry pe) { // Enable protection of current string - ProtectedString ps = pe.Strings.Get(strFieldName); - if(ps != null) ps.EnableProtection(bEnable); + pe.Strings.EnableProtection(strFieldName, bEnable); // Do the same for all history items foreach(PwEntry peHistory in pe.History) { - ProtectedString psHistory = peHistory.Strings.Get(strFieldName); - if(psHistory != null) psHistory.EnableProtection(bEnable); + peHistory.Strings.EnableProtection(strFieldName, bEnable); } return true; @@ -654,41 +655,72 @@ } /// - /// Search this group and all groups in the current one for entries. + /// Search this group and all subgroups for entries. + /// + /// Specifies the search method. + /// Entry list in which the search results will + /// be stored. + public void SearchEntries(SearchParameters sp, PwObjectList listStorage) + { + SearchEntries(sp, listStorage, null); + } + + /// + /// Search this group and all subgroups for entries. /// - /// Specifies the search method. + /// Specifies the search method. /// Entry list in which the search results will /// be stored. - public void SearchEntries(SearchParameters searchParams, PwObjectList listStorage, - bool bRespectEntrySearchingDisabled) + public void SearchEntries(SearchParameters sp, PwObjectList listStorage, + IStatusLogger slStatus) { - List lTerms = StrUtil.SplitSearchTerms(searchParams.SearchString); - if((lTerms.Count <= 1) || searchParams.RegularExpression) + if(sp == null) { Debug.Assert(false); return; } + if(listStorage == null) { Debug.Assert(false); return; } + + ulong uCurEntries = 0, uTotalEntries = 0; + + List lTerms = StrUtil.SplitSearchTerms(sp.SearchString); + if((lTerms.Count <= 1) || sp.RegularExpression) { - SearchEntriesSingle(searchParams, listStorage, bRespectEntrySearchingDisabled); + if(slStatus != null) uTotalEntries = GetEntriesCount(true); + SearchEntriesSingle(sp, listStorage, slStatus, ref uCurEntries, + uTotalEntries); return; } // Search longer strings first (for improved performance) lTerms.Sort(StrUtil.CompareLengthGt); - string strFullSearch = searchParams.SearchString; // Backup + string strFullSearch = sp.SearchString; // Backup PwGroup pg = this; for(int iTerm = 0; iTerm < lTerms.Count; ++iTerm) { + // Update counters for a better state guess + if(slStatus != null) + { + ulong uRemRounds = (ulong)(lTerms.Count - iTerm); + uTotalEntries = uCurEntries + (uRemRounds * + pg.GetEntriesCount(true)); + } + PwGroup pgNew = new PwGroup(); - searchParams.SearchString = lTerms[iTerm]; + sp.SearchString = lTerms[iTerm]; bool bNegate = false; - if(searchParams.SearchString.StartsWith("-")) + if(sp.SearchString.StartsWith("-")) { - searchParams.SearchString = searchParams.SearchString.Substring(1); - bNegate = (searchParams.SearchString.Length > 0); + sp.SearchString = sp.SearchString.Substring(1); + bNegate = (sp.SearchString.Length > 0); } - pg.SearchEntriesSingle(searchParams, pgNew.Entries, bRespectEntrySearchingDisabled); + if(!pg.SearchEntriesSingle(sp, pgNew.Entries, slStatus, + ref uCurEntries, uTotalEntries)) + { + pg = null; + break; + } if(bNegate) { @@ -703,54 +735,60 @@ else pg = pgNew; } - listStorage.Add(pg.Entries); - searchParams.SearchString = strFullSearch; // Restore + if(pg != null) listStorage.Add(pg.Entries); + sp.SearchString = strFullSearch; // Restore } - private void SearchEntriesSingle(SearchParameters searchParams, - PwObjectList listStorage, bool bRespectEntrySearchingDisabled) - { - Debug.Assert(searchParams != null); if(searchParams == null) throw new ArgumentNullException("searchParams"); - Debug.Assert(listStorage != null); if(listStorage == null) throw new ArgumentNullException("listStorage"); - - string strSearch = searchParams.SearchString; - if(strSearch == null) { Debug.Assert(false); throw new ArgumentException(); } - strSearch = strSearch.Trim(); - - StringComparison scType = searchParams.ComparisonMode; - Regex rx = null; - EntryHandler eh = null; - - bool bTitle = searchParams.SearchInTitles; - bool bUserName = searchParams.SearchInUserNames; - bool bPassword = searchParams.SearchInPasswords; - bool bUrl = searchParams.SearchInUrls; - bool bNotes = searchParams.SearchInNotes; - bool bOther = searchParams.SearchInOther; - bool bUuids = searchParams.SearchInUuids; - bool bGroupName = searchParams.SearchInGroupNames; - bool bTags = searchParams.SearchInTags; - bool bExcludeExpired = searchParams.ExcludeExpired; + private bool SearchEntriesSingle(SearchParameters spIn, + PwObjectList listStorage, IStatusLogger slStatus, + ref ulong uCurEntries, ulong uTotalEntries) + { + SearchParameters sp = spIn.Clone(); + if(sp.SearchString == null) { Debug.Assert(false); return true; } + sp.SearchString = sp.SearchString.Trim(); + + bool bTitle = sp.SearchInTitles; + bool bUserName = sp.SearchInUserNames; + bool bPassword = sp.SearchInPasswords; + bool bUrl = sp.SearchInUrls; + bool bNotes = sp.SearchInNotes; + bool bOther = sp.SearchInOther; + bool bUuids = sp.SearchInUuids; + bool bGroupName = sp.SearchInGroupNames; + bool bTags = sp.SearchInTags; + bool bExcludeExpired = sp.ExcludeExpired; + bool bRespectEntrySearchingDisabled = sp.RespectEntrySearchingDisabled; DateTime dtNow = DateTime.Now; - if(searchParams.RegularExpression) + Regex rx = null; + if(sp.RegularExpression) { RegexOptions ro = RegexOptions.Compiled; - if((scType == StringComparison.CurrentCultureIgnoreCase) || - (scType == StringComparison.InvariantCultureIgnoreCase) || - (scType == StringComparison.OrdinalIgnoreCase)) + if((sp.ComparisonMode == StringComparison.CurrentCultureIgnoreCase) || + (sp.ComparisonMode == StringComparison.InvariantCultureIgnoreCase) || + (sp.ComparisonMode == StringComparison.OrdinalIgnoreCase)) { ro |= RegexOptions.IgnoreCase; } - rx = new Regex(strSearch, ro); + rx = new Regex(sp.SearchString, ro); } - if(strSearch.Length <= 0) // Report all + ulong uLocalCurEntries = uCurEntries; + + EntryHandler eh = null; + if(sp.SearchString.Length <= 0) // Report all { eh = delegate(PwEntry pe) { + if(slStatus != null) + { + if(!slStatus.SetProgress((uint)((uLocalCurEntries * + 100UL) / uTotalEntries))) return false; + ++uLocalCurEntries; + } + if(bRespectEntrySearchingDisabled && !pe.GetSearchingEnabled()) return true; // Skip if(bExcludeExpired && pe.Expires && (dtNow > pe.ExpiryTime)) @@ -764,6 +802,13 @@ { eh = delegate(PwEntry pe) { + if(slStatus != null) + { + if(!slStatus.SetProgress((uint)((uLocalCurEntries * + 100UL) / uTotalEntries))) return false; + ++uLocalCurEntries; + } + if(bRespectEntrySearchingDisabled && !pe.GetSearchingEnabled()) return true; // Skip if(bExcludeExpired && pe.Expires && (dtNow > pe.ExpiryTime)) @@ -777,45 +822,43 @@ if(strKey == PwDefs.TitleField) { - if(bTitle) SearchEvalAdd(strSearch, kvp.Value.ReadString(), - scType, rx, pe, listStorage); + if(bTitle) SearchEvalAdd(sp, kvp.Value.ReadString(), + rx, pe, listStorage); } else if(strKey == PwDefs.UserNameField) { - if(bUserName) SearchEvalAdd(strSearch, kvp.Value.ReadString(), - scType, rx, pe, listStorage); + if(bUserName) SearchEvalAdd(sp, kvp.Value.ReadString(), + rx, pe, listStorage); } else if(strKey == PwDefs.PasswordField) { - if(bPassword) SearchEvalAdd(strSearch, kvp.Value.ReadString(), - scType, rx, pe, listStorage); + if(bPassword) SearchEvalAdd(sp, kvp.Value.ReadString(), + rx, pe, listStorage); } else if(strKey == PwDefs.UrlField) { - if(bUrl) SearchEvalAdd(strSearch, kvp.Value.ReadString(), - scType, rx, pe, listStorage); + if(bUrl) SearchEvalAdd(sp, kvp.Value.ReadString(), + rx, pe, listStorage); } else if(strKey == PwDefs.NotesField) { - if(bNotes) SearchEvalAdd(strSearch, kvp.Value.ReadString(), - scType, rx, pe, listStorage); + if(bNotes) SearchEvalAdd(sp, kvp.Value.ReadString(), + rx, pe, listStorage); } else if(bOther) - SearchEvalAdd(strSearch, kvp.Value.ReadString(), - scType, rx, pe, listStorage); + SearchEvalAdd(sp, kvp.Value.ReadString(), + rx, pe, listStorage); // An entry can match only once => break if we have added it if(listStorage.UCount > uInitialResults) break; } if(bUuids && (listStorage.UCount == uInitialResults)) - SearchEvalAdd(strSearch, pe.Uuid.ToHexString(), - scType, rx, pe, listStorage); + SearchEvalAdd(sp, pe.Uuid.ToHexString(), rx, pe, listStorage); if(bGroupName && (listStorage.UCount == uInitialResults) && (pe.ParentGroup != null)) - SearchEvalAdd(strSearch, pe.ParentGroup.Name, - scType, rx, pe, listStorage); + SearchEvalAdd(sp, pe.ParentGroup.Name, rx, pe, listStorage); if(bTags) { @@ -823,7 +866,7 @@ { if(listStorage.UCount != uInitialResults) break; // Match - SearchEvalAdd(strSearch, strTag, scType, rx, pe, listStorage); + SearchEvalAdd(sp, strTag, rx, pe, listStorage); } } @@ -831,21 +874,34 @@ }; } - PreOrderTraverseTree(null, eh); + if(!PreOrderTraverseTree(null, eh)) return false; + uCurEntries = uLocalCurEntries; + return true; } - private static void SearchEvalAdd(string strSearch, string strDataField, - StringComparison scType, Regex rx, PwEntry pe, PwObjectList lResults) + private static void SearchEvalAdd(SearchParameters sp, string strDataField, + Regex rx, PwEntry pe, PwObjectList lResults) { + bool bMatch = false; + if(rx == null) + bMatch = (strDataField.IndexOf(sp.SearchString, + sp.ComparisonMode) >= 0); + else bMatch = rx.IsMatch(strDataField); + + if(!bMatch && (sp.DataTransformationFn != null)) { - if(strDataField.IndexOf(strSearch, scType) >= 0) - lResults.Add(pe); - } - else // Regular expression - { - if(rx.IsMatch(strDataField)) lResults.Add(pe); + string strCmp = sp.DataTransformationFn(strDataField, pe); + if(!object.ReferenceEquals(strCmp, strDataField)) + { + if(rx == null) + bMatch = (strCmp.IndexOf(sp.SearchString, + sp.ComparisonMode) >= 0); + else bMatch = rx.IsMatch(strCmp); + } } + + if(bMatch) lResults.Add(pe); } public List BuildEntryTagsList() diff -Nru keepass2-2.16+dfsg/KeePassLib/PwUuid.cs keepass2-2.18+dfsg/KeePassLib/PwUuid.cs --- keepass2-2.16+dfsg/KeePassLib/PwUuid.cs 2011-01-06 13:57:14.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/PwUuid.cs 2012-01-01 11:53:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Resources/KLRes.Generated.cs keepass2-2.18+dfsg/KeePassLib/Resources/KLRes.Generated.cs --- keepass2-2.16+dfsg/KeePassLib/Resources/KLRes.Generated.cs 2011-07-05 11:40:12.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Resources/KLRes.Generated.cs 2011-12-30 10:46:16.000000000 +0000 @@ -34,6 +34,7 @@ m_strFileCorrupted = TryGetEx(dictNew, "FileCorrupted", m_strFileCorrupted); m_strFileHeaderEndEarly = TryGetEx(dictNew, "FileHeaderEndEarly", m_strFileHeaderEndEarly); m_strFileLoadFailed = TryGetEx(dictNew, "FileLoadFailed", m_strFileLoadFailed); + m_strFileLockedWrite = TryGetEx(dictNew, "FileLockedWrite", m_strFileLockedWrite); m_strFileNewVerReq = TryGetEx(dictNew, "FileNewVerReq", m_strFileNewVerReq); m_strFileSaveCorruptionWarning = TryGetEx(dictNew, "FileSaveCorruptionWarning", m_strFileSaveCorruptionWarning); m_strFileSaveFailed = TryGetEx(dictNew, "FileSaveFailed", m_strFileSaveFailed); @@ -49,6 +50,7 @@ m_strKeePass1xHint = TryGetEx(dictNew, "KeePass1xHint", m_strKeePass1xHint); m_strMasterSeedLengthInvalid = TryGetEx(dictNew, "MasterSeedLengthInvalid", m_strMasterSeedLengthInvalid); m_strOldFormat = TryGetEx(dictNew, "OldFormat", m_strOldFormat); + m_strTryAgainSecs = TryGetEx(dictNew, "TryAgainSecs", m_strTryAgainSecs); m_strUnknownHeaderId = TryGetEx(dictNew, "UnknownHeaderId", m_strUnknownHeaderId); m_strUserAccountKeyError = TryGetEx(dictNew, "UserAccountKeyError", m_strUserAccountKeyError); } @@ -62,6 +64,7 @@ "FileCorrupted", "FileHeaderEndEarly", "FileLoadFailed", + "FileLockedWrite", "FileNewVerReq", "FileSaveCorruptionWarning", "FileSaveFailed", @@ -77,6 +80,7 @@ "KeePass1xHint", "MasterSeedLengthInvalid", "OldFormat", + "TryAgainSecs", "UnknownHeaderId", "UserAccountKeyError" }; @@ -174,6 +178,17 @@ get { return m_strFileLoadFailed; } } + private static string m_strFileLockedWrite = + @"The file is locked, because the following user is currently writing to it:"; + /// + /// Look up a localized string similar to + /// 'The file is locked, because the following user is currently writing to it:'. + /// + public static string FileLockedWrite + { + get { return m_strFileLockedWrite; } + } + private static string m_strFileNewVerReq = @"A newer KeePass version is required to open this file."; /// @@ -339,6 +354,17 @@ get { return m_strOldFormat; } } + private static string m_strTryAgainSecs = + @"Please try it again in a few seconds."; + /// + /// Look up a localized string similar to + /// 'Please try it again in a few seconds.'. + /// + public static string TryAgainSecs + { + get { return m_strTryAgainSecs; } + } + private static string m_strUnknownHeaderId = @"Unknown header ID!"; /// diff -Nru keepass2-2.16+dfsg/KeePassLib/Security/ProtectedBinary.cs keepass2-2.18+dfsg/KeePassLib/Security/ProtectedBinary.cs --- keepass2-2.16+dfsg/KeePassLib/Security/ProtectedBinary.cs 2011-01-07 15:06:48.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Security/ProtectedBinary.cs 2012-01-01 11:53:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -32,45 +32,35 @@ { /// /// Represents a protected binary, i.e. a byte array that is encrypted - /// in-memory. + /// in memory. A ProtectedBinary object is immutable and + /// thread-safe. /// - public sealed class ProtectedBinary + public sealed class ProtectedBinary : IEquatable { + private const int PmBlockSize = 16; + // In-memory protection is supported only on Windows 2000 SP3 and // higher. - private static bool m_bProtectionSupported = true; + private static bool m_bProtectionSupported; - private byte[] m_pbData = new byte[0]; // Never null + private byte[] m_pbData; // Never null // The real length of the data. This value can be different than // m_pbData.Length, as the length of m_pbData always is a multiple - // of 16 (required for fast in-memory protection). - private uint m_uDataLen = 0; + // of PmBlockSize (required for fast in-memory protection). + private uint m_uDataLen; - private bool m_bDoProtect = false; // See default constructor. + private bool m_bProtected; - private XorredBuffer m_xbEncrypted = null; - - /// - /// A flag specifying whether the ProtectedBinary object has turned on - /// in-memory protection or not. - /// - public bool IsProtected - { - get { return m_bDoProtect; } - } + private object m_objSync = new object(); /// - /// A value specifying whether the ProtectedString object is currently - /// in-memory protected or not. This flag can be different than - /// IsProtected: if a XorredBuffer is used, the IsProtected - /// flag represents the memory protection flag, but not the actual protection. - /// In this case use IsViewable, which returns true if a - /// XorredBuffer is currently in use. + /// A flag specifying whether the ProtectedBinary object has + /// turned on in-memory protection or not. /// - public bool IsViewable + public bool IsProtected { - get { return (!m_bDoProtect && (m_xbEncrypted == null)); } + get { return m_bProtected; } } /// @@ -78,19 +68,16 @@ /// public uint Length { - get - { - if(m_xbEncrypted != null) return m_xbEncrypted.Length; - return m_uDataLen; - } + get { return m_uDataLen; } } static ProtectedBinary() { - try // Test if ProtectedMemory is supported + try // Test whether ProtectedMemory is supported { - byte[] pbDummy = new byte[128]; + byte[] pbDummy = new byte[PmBlockSize * 2]; ProtectedMemory.Protect(pbDummy, MemoryProtectionScope.SameProcess); + m_bProtectionSupported = true; } catch(Exception) // Windows 98 / ME { @@ -100,57 +87,26 @@ /// /// Construct a new, empty protected binary data object. Protection - /// is disabled by default! You need to call the - /// EnableProtection member function to enable the protection - /// manually, if you wish the data to be protected. + /// is disabled. /// public ProtectedBinary() { - } - - /// - /// Construct a new, empty protected binary data object. - /// - /// If this parameter is true, - /// the data will be encrypted in-memory. If it is false, the - /// data is stored in plain-text in the process memory. - public ProtectedBinary(bool bEnableProtection) - { - m_bDoProtect = bEnableProtection; + Init(false, new byte[0]); } /// /// Construct a new protected binary data object. /// /// If this paremeter is true, - /// the data will be encrypted in-memory. If it is false, the + /// the data will be encrypted in memory. If it is false, the /// data is stored in plain-text in the process memory. - /// Initial value of the protected - /// object. The input parameter is not modified. - public ProtectedBinary(bool bEnableProtection, byte[] pbInitialValue) - { - m_bDoProtect = bEnableProtection; - SetData(pbInitialValue); - } - - /// - /// Construct a new protected binary data object. Copy the data from - /// an existing object. - /// - /// Existing ProtectedBinary object, - /// which is used to initialize the new object. This parameter must - /// not be null. - /// Thrown if the input - /// parameter is null. - public ProtectedBinary(ProtectedBinary pbTemplate) + /// 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. + public ProtectedBinary(bool bEnableProtection, byte[] pbData) { - Debug.Assert(pbTemplate != null); if(pbTemplate == null) throw new ArgumentNullException("pbTemplate"); - - m_bDoProtect = pbTemplate.m_bDoProtect; - - byte[] pbBuf = pbTemplate.ReadData(); - SetData(pbBuf); - MemUtil.ZeroByteArray(pbBuf); + Init(bEnableProtection, pbData); } /// @@ -166,134 +122,61 @@ { Debug.Assert(xbProtected != null); if(xbProtected == null) throw new ArgumentNullException("xbProtected"); - m_bDoProtect = bEnableProtection; - m_xbEncrypted = xbProtected; - } - - /// - /// Clear the protected data object. Doesn't change the protection level. - /// - public void Clear() - { - m_pbData = new byte[0]; - m_uDataLen = 0; - - m_xbEncrypted = null; - } - - /// - /// Change the protection level (protect or don't protect). Note: you - /// only need to call this function if you really want to change the - /// protection. If you specified the protection flag in the constructor, - /// and don't want to change it, you don't need to call this function. - /// - /// If true, the data will be protected - /// (encrypted in-memory). Otherwise the data will be stored in - /// plain-text in the process memory. - public void EnableProtection(bool bEnableProtection) - { - if(m_xbEncrypted != null) - { - m_bDoProtect = bEnableProtection; - return; - } - - if(m_bDoProtect && !bEnableProtection) // Unprotect - { - byte[] pb = ReadData(); - Debug.Assert(pb.Length == m_uDataLen); - - Clear(); - - m_pbData = pb; - m_bDoProtect = false; - } - else if(!m_bDoProtect && bEnableProtection) // Protect - { - m_bDoProtect = true; - SetData(m_pbData); - } + byte[] pb = xbProtected.ReadPlainText(); + Init(bEnableProtection, pb); + MemUtil.ZeroByteArray(pb); } - /// - /// Set protected data. This function also clears the internal - /// XorredBuffer object. - /// - /// Data to store in the protected object. The input - /// byte array will not be modified, the data is copied to an internal - /// buffer of the protected object. This parameter must not be null; - /// if you want to clear the object, call the Clear member - /// function. - /// Thrown if the input - /// parameter is null. - public void SetData(byte[] pbNew) + private void Init(bool bEnableProtection, byte[] pbData) { - Debug.Assert(pbNew != null); - if(pbNew == null) throw new ArgumentNullException("pbNew"); + if(pbData == null) throw new ArgumentNullException("pbData"); - // Clear(); - m_xbEncrypted = null; + m_bProtected = bEnableProtection; + m_uDataLen = (uint)pbData.Length; - m_uDataLen = (uint)pbNew.Length; + int nBlocks = (int)m_uDataLen / PmBlockSize; + if((nBlocks * PmBlockSize) < (int)m_uDataLen) ++nBlocks; + Debug.Assert((nBlocks * PmBlockSize) >= (int)m_uDataLen); - if(m_bDoProtect && m_bProtectionSupported) - { - int nAllocatedMem = (((int)m_uDataLen / 16) + 1) * 16; - m_pbData = new byte[nAllocatedMem]; - Array.Clear(m_pbData, nAllocatedMem - 16, 16); // Clear the rest - Array.Copy(pbNew, m_pbData, (int)m_uDataLen); + m_pbData = new byte[nBlocks * PmBlockSize]; + Array.Copy(pbData, m_pbData, (int)m_uDataLen); + // Data size must be > 0, otherwise 'Protect' throws + if(m_bProtected && m_bProtectionSupported && (m_uDataLen > 0)) ProtectedMemory.Protect(m_pbData, MemoryProtectionScope.SameProcess); - } - else // !m_bDoProtect - { - m_pbData = new byte[m_uDataLen]; - pbNew.CopyTo(m_pbData, 0); - } } /// - /// Get 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 - /// applications. Make sure that your clear it properly after usage. + /// 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. public byte[] ReadData() { - if(m_xbEncrypted != null) - { - byte[] pb = m_xbEncrypted.ReadPlainText(); - SetData(pb); // Clear the XorredBuffer object - - return (pb ?? new byte[0]); // pb is writable, because XB is now invalid - } + if(m_uDataLen == 0) return new byte[0]; - if(m_pbData.Length == 0) return new byte[0]; + byte[] pbReturn = new byte[m_uDataLen]; - if(m_bDoProtect && m_bProtectionSupported) + if(m_bProtected && m_bProtectionSupported) { - Debug.Assert((m_pbData.Length % 16) == 0); - ProtectedMemory.Unprotect(m_pbData, MemoryProtectionScope.SameProcess); + lock(m_objSync) + { + ProtectedMemory.Unprotect(m_pbData, MemoryProtectionScope.SameProcess); + Array.Copy(m_pbData, pbReturn, (int)m_uDataLen); + ProtectedMemory.Protect(m_pbData, MemoryProtectionScope.SameProcess); + } } - - byte[] pbReturn = new byte[m_uDataLen]; - if(m_uDataLen > 0) Array.Copy(m_pbData, pbReturn, (int)m_uDataLen); - - if(m_bDoProtect && m_bProtectionSupported) - ProtectedMemory.Protect(m_pbData, MemoryProtectionScope.SameProcess); + else Array.Copy(m_pbData, pbReturn, (int)m_uDataLen); return pbReturn; } /// /// Read the protected data and return it protected with a sequence - /// of bytes generated by a random stream. The object's data will be - /// invisible in process memory only if the object has been initialized - /// using a XorredBuffer. If no XorredBuffer has been used - /// or the binary has been read once already (in plain-text), the - /// operation won't be secure and the protected string will be visible - /// in process memory. + /// of bytes generated by a random stream. /// /// Random number source. /// Protected data. @@ -304,61 +187,55 @@ Debug.Assert(crsRandomSource != null); if(crsRandomSource == null) throw new ArgumentNullException("crsRandomSource"); - if(m_xbEncrypted != null) - { - uint uLen = m_xbEncrypted.Length; - byte[] randomPad = crsRandomSource.GetRandomBytes(uLen); - return m_xbEncrypted.ChangeKey(randomPad); - } - else - { - byte[] pbData = ReadData(); - uint uLen = (uint)pbData.Length; + byte[] pbData = ReadData(); + uint uLen = (uint)pbData.Length; - byte[] randomPad = crsRandomSource.GetRandomBytes(uLen); - Debug.Assert(randomPad.Length == uLen); + byte[] randomPad = crsRandomSource.GetRandomBytes(uLen); + Debug.Assert(randomPad.Length == uLen); - for(uint i = 0; i < uLen; ++i) - pbData[i] ^= randomPad[i]; + for(uint i = 0; i < uLen; ++i) + pbData[i] ^= randomPad[i]; - return pbData; - } + return pbData; } - public bool EqualsValue(ProtectedBinary pb) + public override int GetHashCode() { - if(pb == null) { Debug.Assert(false); throw new ArgumentNullException("pb"); } + int h = (m_bProtected ? 0x7B11D289 : 0); - if((pb.m_xbEncrypted != null) && (m_xbEncrypted != null)) - return pb.m_xbEncrypted.EqualsValue(m_xbEncrypted); - if((pb.m_xbEncrypted != null) && (m_xbEncrypted == null)) + byte[] pb = ReadData(); + unchecked { - if(pb.m_xbEncrypted.Length != m_uDataLen) return false; - - byte[] pbThis = ReadData(); - bool bEqThis = pb.m_xbEncrypted.EqualsValue(pbThis); - MemUtil.ZeroByteArray(pbThis); - return bEqThis; + for(int i = 0; i < pb.Length; ++i) + h = (h << 3) + h + (int)pb[i]; } - if((pb.m_xbEncrypted == null) && (m_xbEncrypted != null)) - { - if(m_xbEncrypted.Length != pb.m_uDataLen) return false; + MemUtil.ZeroByteArray(pb); - byte[] pbOther = pb.ReadData(); - bool bEqOther = m_xbEncrypted.EqualsValue(pbOther); - MemUtil.ZeroByteArray(pbOther); - return bEqOther; - } + return h; + } - // (pb.m_xbEncrypted == null) && (m_xbEncrypted == null) + public override bool Equals(object obj) + { + return Equals(obj as ProtectedBinary); + } - if(m_uDataLen != pb.m_uDataLen) return false; + public bool Equals(ProtectedBinary other) + { + if(other == null) return false; // No assert + + if(m_bProtected != other.m_bProtected) return false; + if(m_uDataLen != other.m_uDataLen) return false; byte[] pbL = ReadData(); - byte[] pbR = pb.ReadData(); + byte[] pbR = other.ReadData(); bool bEq = MemUtil.ArraysEqual(pbL, pbR); MemUtil.ZeroByteArray(pbL); MemUtil.ZeroByteArray(pbR); + +#if DEBUG + if(bEq) { Debug.Assert(GetHashCode() == other.GetHashCode()); } +#endif + return bEq; } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Security/ProtectedString.cs keepass2-2.18+dfsg/KeePassLib/Security/ProtectedString.cs --- keepass2-2.16+dfsg/KeePassLib/Security/ProtectedString.cs 2011-03-19 14:46:50.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Security/ProtectedString.cs 2012-01-05 09:29:10.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -18,10 +18,8 @@ */ using System; -using System.Security; using System.Text; using System.Diagnostics; -using System.Runtime.InteropServices; using KeePassLib.Cryptography; using KeePassLib.Utility; @@ -30,115 +28,83 @@ using KeePassLibSD; #endif +// SecureString objects are limited to 65536 characters, don't use + namespace KeePassLib.Security { /// /// Represents an in-memory encrypted string. + /// ProtectedString objects are immutable and thread-safe. /// +#if (DEBUG && !KeePassLibSD) + [DebuggerDisplay(@"{ReadString()}")] +#endif public sealed class ProtectedString { - // SecureString objects are supported only on Windows 2000 SP3 and - // higher. On all other systems (98 / ME) we use a standard string - // object instead of the secure one. This of course decreases the - // security of the class, but at least allows the application - // to run on older systems, too. - private SecureString m_secString = null; // Created in constructor - private string m_strAlternativeSecString = string.Empty; + // Exactly one of the following will be non-null + private ProtectedBinary m_pbUtf8 = null; + private string m_strPlainText = null; - private string m_strPlainText = string.Empty; // Never null - private bool m_bIsProtected = false; // See default constructor + private bool m_bIsProtected; - private XorredBuffer m_xbEncrypted = null; // UTF-8 representation - - /// - /// A flag specifying whether the ProtectedString object has turned on - /// in-memory protection or not. - /// - public bool IsProtected + private static ProtectedString m_psEmpty = new ProtectedString(); + public static ProtectedString Empty { - get { return m_bIsProtected; } + get { return m_psEmpty; } } /// - /// A value specifying whether the ProtectedString object is currently - /// in-memory protected or not. This flag can be different than - /// IsProtected: if a XorredBuffer is used, the IsProtected - /// flag represents the memory protection flag, but not the actual protection. - /// In this case use IsViewable, which returns true if a - /// XorredBuffer is currently in use. + /// A flag specifying whether the ProtectedString object + /// has turned on in-memory protection or not. /// - public bool IsViewable + public bool IsProtected { - get { return (!m_bIsProtected && (m_xbEncrypted == null)); } + get { return m_bIsProtected; } } public bool IsEmpty { get { - if(m_xbEncrypted != null) return (m_xbEncrypted.Length == 0); - - if(m_bIsProtected) - { - if(m_secString != null) return (m_secString.Length == 0); - else return (m_strAlternativeSecString.Length == 0); - } + ProtectedBinary pBin = m_pbUtf8; // Local ref for thread-safety + if(pBin != null) return (pBin.Length == 0); + Debug.Assert(m_strPlainText != null); return (m_strPlainText.Length == 0); } } + private int m_nCachedLength = -1; public int Length { get { - if(m_xbEncrypted != null) - { - byte[] pb = m_xbEncrypted.ReadPlainText(); + if(m_nCachedLength >= 0) return m_nCachedLength; - string str = StrUtil.Utf8.GetString(pb, 0, pb.Length); - SetString(str); // Clear the XorredBuffer object - - // No need to erase the pb buffer, the plain text is - // now readable in memory anyway (in str). - - return ((str != null) ? str.Length : 0); + ProtectedBinary pBin = m_pbUtf8; // Local ref for thread-safety + if(pBin != null) + { + byte[] pbPlain = pBin.ReadData(); + m_nCachedLength = StrUtil.Utf8.GetCharCount(pbPlain); + MemUtil.ZeroByteArray(pbPlain); } - - if(m_bIsProtected) + else { - if(m_secString != null) return m_secString.Length; - else return m_strAlternativeSecString.Length; + Debug.Assert(m_strPlainText != null); + m_nCachedLength = m_strPlainText.Length; } - - return m_strPlainText.Length; // Unprotected string + + return m_nCachedLength; } } /// /// Construct a new protected string object. Protection is - /// disabled by default! You need to call the - /// EnableProtection member function in order to - /// enable the protection, if you wish the string to be protected. + /// disabled. /// public ProtectedString() { - try { m_secString = new SecureString(); } - catch(NotSupportedException) { } // Windows 98 / ME - } - - /// - /// Construct a new in-memory encrypted string object. - /// - /// 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. - public ProtectedString(bool bEnableProtection) - { - try { m_secString = new SecureString(); } - catch(NotSupportedException) { } // Windows 98 / ME - - m_bIsProtected = bEnableProtection; + Init(false, string.Empty); } /// @@ -152,11 +118,7 @@ /// parameter won't be modified. public ProtectedString(bool bEnableProtection, string strValue) { - try { m_secString = new SecureString(); } - catch(NotSupportedException) { } // Windows 98 / ME - - m_bIsProtected = bEnableProtection; - SetString(strValue); + Init(bEnableProtection, strValue); } /// @@ -167,36 +129,11 @@ /// 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. + /// UTF-8 byte array. This parameter won't be modified; the caller + /// is responsible for clearing it. public ProtectedString(bool bEnableProtection, byte[] vUtf8Value) { - if(vUtf8Value == null) throw new ArgumentNullException("vUtf8Value"); - - try { m_secString = new SecureString(); } - catch(NotSupportedException) { } // Windows 98 / ME - - m_bIsProtected = bEnableProtection; - SetString(StrUtil.Utf8.GetString(vUtf8Value, 0, vUtf8Value.Length)); - } - - /// - /// Construct a new protected string. The string is initialized - /// to the value passed in the pbTemplate protected string. - /// - /// The initial string value. This - /// parameter won't be modified. Must not be null. - /// Thrown if the input - /// parameter is null. - public ProtectedString(ProtectedString psTemplate) - { - Debug.Assert(psTemplate != null); - if(psTemplate == null) throw new ArgumentNullException("psTemplate"); - - try { m_secString = new SecureString(); } - catch(NotSupportedException) { } // Windows 98 / ME - - m_bIsProtected = psTemplate.m_bIsProtected; - SetString(psTemplate.ReadString()); + Init(bEnableProtection, vUtf8Value); } /// @@ -211,141 +148,58 @@ /// parameter is null. public ProtectedString(bool bEnableProtection, XorredBuffer xbProtected) { - Debug.Assert(xbProtected != null); if(xbProtected == null) throw new ArgumentNullException("xbProtected"); - try { m_secString = new SecureString(); } - catch(NotSupportedException) { } // Windows 98 / ME - - m_bIsProtected = bEnableProtection; - m_xbEncrypted = xbProtected; + byte[] pb = xbProtected.ReadPlainText(); + Init(bEnableProtection, pb); + MemUtil.ZeroByteArray(pb); } - /// - /// Clear the string. Doesn't change the protection level. - /// - public void Clear() + private void Init(bool bEnableProtection, string str) { - if(m_secString != null) m_secString.Clear(); - else m_strAlternativeSecString = string.Empty; - - m_strPlainText = string.Empty; - - m_xbEncrypted = null; - } + if(str == null) throw new ArgumentNullException("str"); - /// - /// Change the protection level (protect or don't protect). Note: you - /// only need to call this function if you really want to change the - /// protection. If you specified the protection flag in the constructor, - /// and don't want to change it, you don't need to call this function. - /// - /// If true, the string will be protected - /// (encrypted in-memory). Otherwise the string will be stored in - /// plain-text in the process memory. - public void EnableProtection(bool bProtect) - { - if(m_xbEncrypted != null) - { - m_bIsProtected = bProtect; - return; - } - - if(m_bIsProtected && !bProtect) // Unprotect - { - string strPlainText = ReadString(); - - Clear(); - - m_strPlainText = strPlainText; - m_bIsProtected = false; - } - else if(!m_bIsProtected && bProtect) // Protect - { - m_bIsProtected = true; + m_bIsProtected = bEnableProtection; - SetString(m_strPlainText); - } + // The string already is in memory and immutable, + // protection would be useless + m_strPlainText = str; } - /// - /// Assign a new string value to the object. - /// - /// New string. The string must not contain - /// a null terminator. - /// Thrown if the input - /// parameter is null. - /// Thrown if the new string - /// contains a null terminator. - public void SetString(string strNewValue) + private void Init(bool bEnableProtection, byte[] pbUtf8) { - Clear(); - - Debug.Assert(strNewValue != null); if(strNewValue == null) throw new ArgumentNullException("strNewValue"); - - // String must not contain any null character - Debug.Assert(strNewValue.IndexOf((char)0) < 0); + if(pbUtf8 == null) throw new ArgumentNullException("pbUtf8"); - if(m_bIsProtected) - { - if(m_secString != null) - { - char ch; - for(int i = 0; i < strNewValue.Length; ++i) - { - ch = strNewValue[i]; - if(ch == 0) throw new ArgumentException(); + m_bIsProtected = bEnableProtection; - m_secString.AppendChar(ch); - } - } - else m_strAlternativeSecString = strNewValue; - } - else // Currently not protected - { - m_strPlainText = strNewValue; - } + if(bEnableProtection) + m_pbUtf8 = new ProtectedBinary(true, pbUtf8); + else + m_strPlainText = StrUtil.Utf8.GetString(pbUtf8, 0, pbUtf8.Length); } /// /// Convert the protected string to a normal string object. /// Be careful with this function, the returned string object - /// isn't protected any more and stored in plain-text in the + /// isn't protected anymore and stored in plain-text in the /// process memory. /// /// Plain-text string. Is never null. public string ReadString() { - if(m_xbEncrypted != null) - { - byte[] pb = m_xbEncrypted.ReadPlainText(); - - string str = StrUtil.Utf8.GetString(pb, 0, pb.Length); - SetString(str); // Clear the XorredBuffer object + if(m_strPlainText != null) return m_strPlainText; - // No need to erase the pb buffer, the plain text is - // now readable in memory anyway (in str). + byte[] pb = ReadUtf8(); + string str = ((pb.Length == 0) ? string.Empty : + StrUtil.Utf8.GetString(pb, 0, pb.Length)); + // No need to clear pb + + // As the text is now visible in process memory anyway, + // there's no need to protect it anymore + m_strPlainText = str; + m_pbUtf8 = null; // Thread-safe order - return (str ?? string.Empty); - } - - if(m_bIsProtected) - { - if(m_secString != null) - { -#if !KeePassLibSD - IntPtr p = Marshal.SecureStringToGlobalAllocUnicode(m_secString); - string str = Marshal.PtrToStringUni(p); - Marshal.ZeroFreeGlobalAllocUnicode(p); -#else - string str = m_secString.ReadAsString(); -#endif - return (str ?? string.Empty); - } - else return m_strAlternativeSecString; - } - - return m_strPlainText; // Unprotected string + return str; } /// @@ -356,50 +210,15 @@ /// Plain-text UTF-8 byte array. public byte[] ReadUtf8() { - if(m_xbEncrypted != null) - { - byte[] pb = m_xbEncrypted.ReadPlainText(); - - // Clear XorredBuffer - SetString(StrUtil.Utf8.GetString(pb, 0, pb.Length)); - - return pb; - } + ProtectedBinary pBin = m_pbUtf8; // Local ref for thread-safety + if(pBin != null) return pBin.ReadData(); - if(m_bIsProtected) - { - if(m_secString != null) - { -#if !KeePassLibSD - Debug.Assert(sizeof(char) == 2); - char[] vChars = new char[m_secString.Length]; - - IntPtr p = Marshal.SecureStringToGlobalAllocUnicode(m_secString); - for(int i = 0; i < vChars.Length; ++i) - vChars[i] = (char)Marshal.ReadInt16(p, i * 2); - Marshal.ZeroFreeGlobalAllocUnicode(p); - - byte[] pb = StrUtil.Utf8.GetBytes(vChars, 0, vChars.Length); - Array.Clear(vChars, 0, vChars.Length); -#else - byte[] pb = StrUtil.Utf8.GetBytes(m_secString.ReadAsString()); -#endif - return pb; - } - else return StrUtil.Utf8.GetBytes(m_strAlternativeSecString); - } - - return StrUtil.Utf8.GetBytes(m_strPlainText); // Unprotected string + return StrUtil.Utf8.GetBytes(m_strPlainText); } /// /// Read the protected string and return it protected with a sequence - /// of bytes generated by a random stream. The object's data will be - /// invisible in process memory only if the object has been initialized - /// using a XorredBuffer. If no XorredBuffer has been used - /// or the string has been read once already (in plain-text), the - /// operation won't be secure and the protected string will be visible - /// in process memory. + /// of bytes generated by a random stream. /// /// Random number source. /// Protected string. @@ -409,25 +228,26 @@ { Debug.Assert(crsRandomSource != null); if(crsRandomSource == null) throw new ArgumentNullException("crsRandomSource"); - if(m_xbEncrypted != null) - { - uint uLen = m_xbEncrypted.Length; - byte[] randomPad = crsRandomSource.GetRandomBytes(uLen); - return m_xbEncrypted.ChangeKey(randomPad); - } - else // Not using XorredBuffer - { - byte[] pbData = ReadUtf8(); - uint uLen = (uint)pbData.Length; + byte[] pbData = ReadUtf8(); + uint uLen = (uint)pbData.Length; - byte[] randomPad = crsRandomSource.GetRandomBytes(uLen); - Debug.Assert(randomPad.Length == uLen); + byte[] randomPad = crsRandomSource.GetRandomBytes(uLen); + Debug.Assert(randomPad.Length == uLen); - for(uint i = 0; i < uLen; ++i) - pbData[i] ^= randomPad[i]; + for(uint i = 0; i < uLen; ++i) + pbData[i] ^= randomPad[i]; - return pbData; - } + return pbData; + } + + public ProtectedString WithProtection(bool bProtect) + { + if(bProtect == m_bIsProtected) return this; + + byte[] pb = ReadUtf8(); + ProtectedString ps = new ProtectedString(bProtect, pb); + MemUtil.ZeroByteArray(pb); + return ps; } } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Security/XorredBuffer.cs keepass2-2.18+dfsg/KeePassLib/Security/XorredBuffer.cs --- keepass2-2.16+dfsg/KeePassLib/Security/XorredBuffer.cs 2011-01-07 15:06:48.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Security/XorredBuffer.cs 2012-01-01 11:53:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -24,13 +24,13 @@ { /// /// Represents an object that is encrypted using a XOR pad until - /// it is read. The key XOR pad can be changed without revealing the - /// protected data in process memory. + /// it is read. XorredBuffer objects are immutable and + /// thread-safe. /// public sealed class XorredBuffer { - private byte[] m_pbData = new byte[0]; // Never null - private byte[] m_pbXorPad = new byte[0]; // Never null + private byte[] m_pbData; // Never null + private byte[] m_pbXorPad; // Always valid for m_pbData /// /// Length of the protected data in bytes. @@ -45,18 +45,20 @@ /// and a XOR pad that decrypts the protected data. The /// byte array must have the same size /// as the byte array. + /// The XorredBuffer object takes ownership of the two byte + /// arrays, i.e. the caller must not use or modify them afterwards. /// /// Protected data (XOR pad applied). - /// XOR pad that is used to decrypt the - /// parameter. + /// XOR pad that can be used to decrypt the + /// parameter. /// Thrown if one of the input /// parameters is null. /// Thrown if the byte arrays are /// of different size. public XorredBuffer(byte[] pbProtectedData, byte[] pbXorPad) { - Debug.Assert(pbProtectedData != null); if(pbProtectedData == null) throw new ArgumentNullException("pbProtectedData"); - Debug.Assert(pbXorPad != null); if(pbXorPad == null) throw new ArgumentNullException("pbXorPad"); + if(pbProtectedData == null) { Debug.Assert(false); throw new ArgumentNullException("pbProtectedData"); } + if(pbXorPad == null) { Debug.Assert(false); throw new ArgumentNullException("pbXorPad"); } Debug.Assert(pbProtectedData.Length == pbXorPad.Length); if(pbProtectedData.Length != pbXorPad.Length) throw new ArgumentException(); @@ -65,82 +67,31 @@ m_pbXorPad = pbXorPad; } - private void Decrypt() - { - Debug.Assert((m_pbData.Length == m_pbXorPad.Length) || (m_pbXorPad.Length == 0)); - - if(m_pbData.Length == m_pbXorPad.Length) - { - for(int i = 0; i < m_pbData.Length; ++i) - m_pbData[i] ^= m_pbXorPad[i]; - - m_pbXorPad = new byte[0]; - } - } - /// - /// Decrypt the buffer. The XorredBuffer protection is useless - /// after you used this method. The object cannot be re-encrypted. + /// Get a copy of the plain-text. The caller is responsible + /// for clearing the byte array safely after using it. /// /// Unprotected plain-text byte array. public byte[] ReadPlainText() { - Decrypt(); - return m_pbData; - } + byte[] pbPlain = new byte[m_pbData.Length]; - /// - /// Change the protection key for this XorredBuffer object. - /// The data will first be decrypted using the old key and then - /// re-encrypted using the new key. This operation doesn't reveal - /// the plain-text in the process memory. - /// - /// New protection pad. Must contain exactly - /// the same number of bytes as the length of the currently protected data. - /// Use the Length property of the XorredBuffer to query - /// the data length and pass a correct number of bytes to ChangeKey. - /// New protected data (encrypted using the new XOR pad). - /// Thrown if the input - /// parameter is null. - /// Thrown if the input - /// byte array doesn't have the correct size. - public byte[] ChangeKey(byte[] pbNewXorPad) - { - Debug.Assert(pbNewXorPad != null); if(pbNewXorPad == null) throw new ArgumentNullException("pbNewXorPad"); - - Debug.Assert(pbNewXorPad.Length == m_pbData.Length); - if(pbNewXorPad.Length != m_pbData.Length) throw new ArgumentException(); - - if(m_pbXorPad.Length == m_pbData.Length) // Data is protected - { - for(int i = 0; i < m_pbData.Length; ++i) - m_pbData[i] ^= (byte)(m_pbXorPad[i] ^ pbNewXorPad[i]); - } - else // Data is unprotected - { - for(int i = 0; i < m_pbData.Length; ++i) - m_pbData[i] ^= pbNewXorPad[i]; - } + for(int i = 0; i < pbPlain.Length; ++i) + pbPlain[i] = (byte)(m_pbData[i] ^ m_pbXorPad[i]); - m_pbXorPad = pbNewXorPad; - return m_pbData; + return pbPlain; } - public bool EqualsValue(XorredBuffer xb) + /* public bool EqualsValue(XorredBuffer xb) { if(xb == null) { Debug.Assert(false); throw new ArgumentNullException("xb"); } if(xb.m_pbData.Length != m_pbData.Length) return false; - bool bDecThis = (m_pbData.Length == m_pbXorPad.Length); - bool bDecOther = (xb.m_pbData.Length == xb.m_pbXorPad.Length); for(int i = 0; i < m_pbData.Length; ++i) { - byte bt1 = m_pbData[i]; - if(bDecThis) bt1 ^= m_pbXorPad[i]; - - byte bt2 = xb.m_pbData[i]; - if(bDecOther) bt2 ^= xb.m_pbXorPad[i]; + byte bt1 = (byte)(m_pbData[i] ^ m_pbXorPad[i]); + byte bt2 = (byte)(xb.m_pbData[i] ^ xb.m_pbXorPad[i]); if(bt1 != bt2) return false; } @@ -154,43 +105,12 @@ if(pb.Length != m_pbData.Length) return false; - if(m_pbData.Length == m_pbXorPad.Length) - { - for(int i = 0; i < m_pbData.Length; ++i) - { - if((byte)(m_pbData[i] ^ m_pbXorPad[i]) != pb[i]) return false; - } - return true; - } - for(int i = 0; i < m_pbData.Length; ++i) { - if(m_pbData[i] != pb[i]) return false; + if((byte)(m_pbData[i] ^ m_pbXorPad[i]) != pb[i]) return false; } - return true; - } - /// - /// XOR all bytes in a data buffer with a pad. Both byte arrays must - /// be of the same size. - /// - /// Data to be protected. - /// XOR pad. - /// Thrown if one of the - /// parameters is null. - /// Thrown if the length of - /// the data array and the pad aren't equal. - [Obsolete("Use MemUtil.XorArray instead.")] - public static void XorArrays(byte[] pbData, byte[] pbPad) - { - Debug.Assert(pbData != null); if(pbData == null) throw new ArgumentNullException("pbData"); - Debug.Assert(pbPad != null); if(pbPad == null) throw new ArgumentNullException("pbPad"); - - Debug.Assert(pbData.Length == pbPad.Length); - if(pbData.Length != pbPad.Length) throw new ArgumentException(); - - for(int i = 0; i < pbData.Length; ++i) - pbData[i] ^= pbPad[i]; - } + return true; + } */ } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Serialization/BinaryReaderEx.cs keepass2-2.18+dfsg/KeePassLib/Serialization/BinaryReaderEx.cs --- keepass2-2.16+dfsg/KeePassLib/Serialization/BinaryReaderEx.cs 2011-01-01 11:27:20.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Serialization/BinaryReaderEx.cs 2012-01-01 11:53:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Serialization/FileLock.cs keepass2-2.18+dfsg/KeePassLib/Serialization/FileLock.cs --- keepass2-2.16+dfsg/KeePassLib/Serialization/FileLock.cs 1970-01-01 00:00:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Serialization/FileLock.cs 2012-01-05 09:29:10.000000000 +0000 @@ -0,0 +1,260 @@ +/* + KeePass Password Safe - The Open-Source Password Manager + Copyright (C) 2003-2012 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.Threading; +using System.Diagnostics; + +using KeePassLib.Cryptography; +using KeePassLib.Resources; +using KeePassLib.Utility; + +namespace KeePassLib.Serialization +{ + public sealed class FileLockException : Exception + { + private readonly string m_strMsg; + + public override string Message + { + get { return m_strMsg; } + } + + public FileLockException(string strBaseFile, string strUser) + { + StringBuilder sb = new StringBuilder(); + + if(!string.IsNullOrEmpty(strBaseFile)) + { + sb.Append(strBaseFile); + sb.Append(MessageService.NewParagraph); + } + + sb.Append(KLRes.FileLockedWrite); + sb.Append(MessageService.NewLine); + + if(!string.IsNullOrEmpty(strUser)) sb.Append(strUser); + else sb.Append("?"); + + sb.Append(MessageService.NewParagraph); + sb.Append(KLRes.TryAgainSecs); + + m_strMsg = sb.ToString(); + } + } + + public sealed class FileLock : IDisposable + { + private const string LockFileExt = ".lock"; + private const string LockFileHeader = "KeePass Lock File"; + + private IOConnectionInfo m_iocLockFile; + + private sealed class LockFileInfo + { + public readonly string ID; + public readonly DateTime Time; + public readonly string UserName; + public readonly string Machine; + public readonly string Domain; + + private LockFileInfo(string strID, string strTime, string strUserName, + string strMachine, string strDomain) + { + this.ID = (strID ?? string.Empty).Trim(); + + DateTime dt; + if(TimeUtil.TryDeserializeUtc(strTime.Trim(), out dt)) + this.Time = dt; + else + { + Debug.Assert(false); + this.Time = DateTime.UtcNow; + } + + this.UserName = (strUserName ?? string.Empty).Trim(); + this.Machine = (strMachine ?? string.Empty).Trim(); + this.Domain = (strDomain ?? string.Empty).Trim(); + + if(this.Domain.Equals(this.Machine, StrUtil.CaseIgnoreCmp)) + this.Domain = string.Empty; + } + + public string GetOwner() + { + StringBuilder sb = new StringBuilder(); + sb.Append((this.UserName.Length > 0) ? this.UserName : "?"); + + bool bMachine = (this.Machine.Length > 0); + bool bDomain = (this.Domain.Length > 0); + if(bMachine || bDomain) + { + sb.Append(" ("); + sb.Append(this.Machine); + if(bMachine && bDomain) sb.Append(" @ "); + sb.Append(this.Domain); + sb.Append(")"); + } + + return sb.ToString(); + } + + public static LockFileInfo Load(IOConnectionInfo iocLockFile) + { + Stream s = null; + try + { + s = IOConnection.OpenRead(iocLockFile); + if(s == null) return null; + StreamReader sr = new StreamReader(s, StrUtil.Utf8); + string str = sr.ReadToEnd(); + sr.Close(); + if(str == null) { Debug.Assert(false); return null; } + + str = StrUtil.NormalizeNewLines(str, false); + string[] v = str.Split('\n'); + if((v == null) || (v.Length < 6)) { Debug.Assert(false); return null; } + + if(!v[0].StartsWith(LockFileHeader)) { Debug.Assert(false); return null; } + return new LockFileInfo(v[1], v[2], v[3], v[4], v[5]); + } + catch(FileNotFoundException) { } + catch(Exception) { Debug.Assert(false); } + finally { if(s != null) s.Close(); } + + return null; + } + + // Throws on error + public static LockFileInfo Create(IOConnectionInfo iocLockFile) + { + LockFileInfo lfi; + Stream s = null; + try + { + byte[] pbID = CryptoRandom.Instance.GetRandomBytes(16); + string strTime = TimeUtil.SerializeUtc(DateTime.Now); + +#if !KeePassLibSD + lfi = new LockFileInfo(Convert.ToBase64String(pbID), strTime, + Environment.UserName, Environment.MachineName, + Environment.UserDomainName); +#else + lfi = new LockFileInfo(Convert.ToBase64String(pbID), strTime, + string.Empty, string.Empty, string.Empty); +#endif + + StringBuilder sb = new StringBuilder(); +#if !KeePassLibSD + sb.AppendLine(LockFileHeader); + sb.AppendLine(lfi.ID); + sb.AppendLine(strTime); + sb.AppendLine(lfi.UserName); + sb.AppendLine(lfi.Machine); + sb.AppendLine(lfi.Domain); +#else + sb.Append(LockFileHeader + MessageService.NewLine); + sb.Append(lfi.ID + MessageService.NewLine); + sb.Append(strTime + MessageService.NewLine); + sb.Append(lfi.UserName + MessageService.NewLine); + sb.Append(lfi.Machine + MessageService.NewLine); + sb.Append(lfi.Domain + MessageService.NewLine); +#endif + + byte[] pbFile = StrUtil.Utf8.GetBytes(sb.ToString()); + + s = IOConnection.OpenWrite(iocLockFile); + if(s == null) throw new IOException(iocLockFile.GetDisplayName()); + s.Write(pbFile, 0, pbFile.Length); + } + finally { if(s != null) s.Close(); } + + return lfi; + } + } + + public FileLock(IOConnectionInfo iocBaseFile) + { + if(iocBaseFile == null) throw new ArgumentNullException("strBaseFile"); + + m_iocLockFile = iocBaseFile.CloneDeep(); + m_iocLockFile.Path += LockFileExt; + + LockFileInfo lfiEx = LockFileInfo.Load(m_iocLockFile); + if(lfiEx != null) + { + m_iocLockFile = null; // Otherwise Dispose deletes the existing one + throw new FileLockException(iocBaseFile.GetDisplayName(), + lfiEx.GetOwner()); + } + + LockFileInfo.Create(m_iocLockFile); + } + + ~FileLock() + { + Dispose(false); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool bDisposing) + { + if(m_iocLockFile == null) return; + + bool bFileDeleted = false; + for(int r = 0; r < 5; ++r) + { + // if(!OwnLockFile()) { bFileDeleted = true; break; } + + try + { + IOConnection.DeleteFile(m_iocLockFile); + bFileDeleted = true; + } + catch(Exception) { Debug.Assert(false); } + + if(bFileDeleted) break; + + if(bDisposing) Thread.Sleep(50); + } + + if(bDisposing && !bFileDeleted) + IOConnection.DeleteFile(m_iocLockFile); // Possibly with exception + + m_iocLockFile = null; + } + + // private bool OwnLockFile() + // { + // if(m_iocLockFile == null) { Debug.Assert(false); return false; } + // if(m_strLockID == null) { Debug.Assert(false); return false; } + // LockFileInfo lfi = LockFileInfo.Load(m_iocLockFile); + // if(lfi == null) return false; + // return m_strLockID.Equals(lfi.ID); + // } + } +} diff -Nru keepass2-2.16+dfsg/KeePassLib/Serialization/FileTransactionEx.cs keepass2-2.18+dfsg/KeePassLib/Serialization/FileTransactionEx.cs --- keepass2-2.16+dfsg/KeePassLib/Serialization/FileTransactionEx.cs 2011-01-01 11:27:20.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Serialization/FileTransactionEx.cs 2012-01-01 11:53:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Serialization/HashedBlockStream.cs keepass2-2.18+dfsg/KeePassLib/Serialization/HashedBlockStream.cs --- keepass2-2.16+dfsg/KeePassLib/Serialization/HashedBlockStream.cs 2011-05-20 09:19:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Serialization/HashedBlockStream.cs 2012-01-01 11:53:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Serialization/IOConnection.cs keepass2-2.18+dfsg/KeePassLib/Serialization/IOConnection.cs --- keepass2-2.16+dfsg/KeePassLib/Serialization/IOConnection.cs 2011-07-12 08:00:06.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Serialization/IOConnection.cs 2012-01-01 11:53:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -219,6 +219,12 @@ public static Stream OpenRead(IOConnectionInfo ioc) { + if(StrUtil.IsDataUri(ioc.Path)) + { + byte[] pbData = StrUtil.DataUriToData(ioc.Path); + if(pbData != null) return new MemoryStream(pbData, false); + } + if(ioc.IsLocalFile()) return OpenReadLocal(ioc); return CreateWebClient(ioc).OpenRead(new Uri(ioc.Path)); @@ -243,7 +249,16 @@ if(ioc.IsLocalFile()) return OpenWriteLocal(ioc); - return CreateWebClient(ioc).OpenWrite(new Uri(ioc.Path)); + Uri uri = new Uri(ioc.Path); + + // Mono does not set HttpWebRequest.Method to POST for writes, + // so one needs to set the method to PUT explicitly + if(NativeLib.IsUnix() && (uri.Scheme.Equals(Uri.UriSchemeHttp, + StrUtil.CaseIgnoreCmp) || uri.Scheme.Equals(Uri.UriSchemeHttps, + StrUtil.CaseIgnoreCmp))) + return CreateWebClient(ioc).OpenWrite(uri, WebRequestMethods.Http.Put); + + return CreateWebClient(ioc).OpenWrite(uri); } #else public static Stream OpenWrite(IOConnectionInfo ioc) @@ -275,7 +290,7 @@ if(s == null) throw new FileNotFoundException(); // For FTP clients we called RETR to get the file, but we never - // followed-up and downloaded the file. Close may produce a + // followed-up and downloaded the file; close may produce a // 550 error -- that's okay try { s.Close(); } catch(Exception) { } @@ -306,7 +321,7 @@ } else req.Method = WrmDeleteFile; - req.GetResponse(); + DisposeResponse(req.GetResponse(), true); } #endif } @@ -350,7 +365,7 @@ req.Headers.Set(WrhMoveFileTo, iocTo.Path); } - req.GetResponse(); + DisposeResponse(req.GetResponse(), true); } #endif @@ -366,5 +381,23 @@ // } // DeleteFile(iocFrom); } + + private static void DisposeResponse(WebResponse wr, bool bGetStream) + { + if(wr == null) return; + + try + { + if(bGetStream) + { + Stream s = wr.GetResponseStream(); + if(s != null) s.Close(); + } + } + catch(Exception) { Debug.Assert(false); } + + try { wr.Close(); } + catch(Exception) { Debug.Assert(false); } + } } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Serialization/IOConnectionInfo.cs keepass2-2.18+dfsg/KeePassLib/Serialization/IOConnectionInfo.cs --- keepass2-2.16+dfsg/KeePassLib/Serialization/IOConnectionInfo.cs 2011-03-19 14:50:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Serialization/IOConnectionInfo.cs 2012-01-01 11:53:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -20,9 +20,10 @@ using System; using System.Collections.Generic; using System.Text; -using System.Diagnostics; using System.IO; using System.Net; +using System.ComponentModel; +using System.Diagnostics; using KeePassLib.Interfaces; using KeePassLib.Utility; @@ -77,6 +78,7 @@ } private string m_strUser = string.Empty; + [DefaultValue("")] public string UserName { get { return m_strUser; } @@ -90,6 +92,7 @@ } private string m_strPassword = string.Empty; + [DefaultValue("")] public string Password { get { return m_strPassword; } diff -Nru keepass2-2.16+dfsg/KeePassLib/Serialization/Kdb4File.cs keepass2-2.18+dfsg/KeePassLib/Serialization/Kdb4File.cs --- keepass2-2.16+dfsg/KeePassLib/Serialization/Kdb4File.cs 2011-07-12 07:57:46.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Serialization/Kdb4File.cs 2012-01-04 16:38:16.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -172,6 +172,7 @@ private const string AttrId = "ID"; private const string AttrRef = "Ref"; private const string AttrProtected = "Protected"; + private const string AttrProtectedInMemPlainXml = "ProtectInMemory"; private const string AttrCompressed = "Compressed"; private const string ElemIsExpanded = "IsExpanded"; @@ -206,8 +207,6 @@ private Dictionary m_dictBinPool = new Dictionary(); - private Dictionary m_dictBinPoolCopyOnRead = - new Dictionary(); private byte[] m_pbHashOfFileOnDisk = null; @@ -332,7 +331,7 @@ foreach(KeyValuePair kvp in m_dictBinPool) { - if(pb.EqualsValue(kvp.Value)) return kvp.Key; + if(pb.Equals(kvp.Value)) return kvp.Key; } return null; @@ -343,16 +342,7 @@ if(strKey == null) { Debug.Assert(false); return null; } ProtectedBinary pb; - if(m_dictBinPool.TryGetValue(strKey, out pb)) - { - m_dictBinPool.Remove(strKey); - m_dictBinPoolCopyOnRead[strKey] = pb; - - return pb; - } - - if(m_dictBinPoolCopyOnRead.TryGetValue(strKey, out pb)) - return new ProtectedBinary(pb); + if(m_dictBinPool.TryGetValue(strKey, out pb)) return pb; return null; } @@ -383,7 +373,9 @@ while(File.Exists(strPath)); #if !KeePassLibSD - File.WriteAllBytes(strPath, pb.ReadData()); + byte[] pbData = pb.ReadData(); + File.WriteAllBytes(strPath, pbData); + MemUtil.ZeroByteArray(pbData); #else FileStream fs = new FileStream(strPath, FileMode.Create, FileAccess.Write, FileShare.None); diff -Nru keepass2-2.16+dfsg/KeePassLib/Serialization/Kdb4File.Read.cs keepass2-2.18+dfsg/KeePassLib/Serialization/Kdb4File.Read.cs --- keepass2-2.16+dfsg/KeePassLib/Serialization/Kdb4File.Read.cs 2011-06-20 13:00:58.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Serialization/Kdb4File.Read.cs 2012-01-01 11:53:36.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -126,7 +126,7 @@ m_randomStream = new CryptoRandomStream(m_craInnerRandomStream, m_pbProtectedStreamKey); } - else m_randomStream = null; // No random stream for plain text files + else m_randomStream = null; // No random stream for plain-text files ReadXmlStreamed(readerStream, hashedStream); // ReadXmlDom(readerStream); @@ -149,6 +149,10 @@ sSource.Close(); + // Reset memory protection settings (to always use reasonable + // defaults) + m_pwDatabase.MemoryProtection = new MemoryProtectionConfig(); + // Remove old backups (this call is required here in order to apply // the default history maintenance settings for people upgrading from // KeePass <= 2.14 to >= 2.15; also it ensures history integrity in diff -Nru keepass2-2.16+dfsg/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs keepass2-2.18+dfsg/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs --- keepass2-2.16+dfsg/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs 2011-07-06 15:26:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs 2012-01-04 16:52:00.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -105,7 +105,6 @@ m_ctxGroups.Clear(); m_dictBinPool = new Dictionary(); - m_dictBinPoolCopyOnRead = new Dictionary(); KdbContext ctx = KdbContext.Null; @@ -610,7 +609,9 @@ return KdbContext.Entry; else if((ctx == KdbContext.EntryAutoTypeItem) && (xr.Name == ElemAutoTypeItem)) { - m_ctxEntry.AutoType.Set(m_ctxATName, m_ctxATSeq); + AutoTypeAssociation atAssoc = new AutoTypeAssociation(m_ctxATName, + m_ctxATSeq); + m_ctxEntry.AutoType.Add(atAssoc); m_ctxATName = null; m_ctxATSeq = null; return KdbContext.EntryAutoType; @@ -637,10 +638,10 @@ private string ReadString(XmlReader xr) { XorredBuffer xb = ProcessNode(xr); - if(xb != null) { byte[] pb = xb.ReadPlainText(); + if(pb.Length == 0) return string.Empty; return StrUtil.Utf8.GetString(pb, 0, pb.Length); } @@ -731,7 +732,17 @@ XorredBuffer xb = ProcessNode(xr); if(xb != null) return new ProtectedString(true, xb); - ProtectedString ps = new ProtectedString(false, ReadString(xr)); + bool bProtect = false; + if(m_format == Kdb4Format.PlainXml) + { + if(xr.MoveToAttribute(AttrProtectedInMemPlainXml)) + { + string strProtect = xr.Value; + bProtect = ((strProtect != null) && (strProtect == ValTrue)); + } + } + + ProtectedString ps = new ProtectedString(bProtect, ReadString(xr)); return ps; } @@ -761,7 +772,7 @@ } string strValue = ReadString(xr); - if(strValue.Length == 0) return new ProtectedBinary(false); + if(strValue.Length == 0) return new ProtectedBinary(); byte[] pbData = Convert.FromBase64String(strValue); if(bCompressed) pbData = MemUtil.Decompress(pbData); diff -Nru keepass2-2.16+dfsg/KeePassLib/Serialization/Kdb4File.Write.cs keepass2-2.18+dfsg/KeePassLib/Serialization/Kdb4File.Write.cs --- keepass2-2.16+dfsg/KeePassLib/Serialization/Kdb4File.Write.cs 2011-03-26 19:06:24.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Serialization/Kdb4File.Write.cs 2012-01-04 16:41:02.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -418,22 +418,23 @@ WriteObject(kvp.Key, kvp.Value, true); } - private void WriteList(string name, AutoTypeConfig dictAutoType) + private void WriteList(string name, AutoTypeConfig cfgAutoType) { Debug.Assert(name != null); - Debug.Assert(dictAutoType != null); - if(dictAutoType == null) throw new ArgumentNullException("dictAutoType"); + Debug.Assert(cfgAutoType != null); + if(cfgAutoType == null) throw new ArgumentNullException("cfgAutoType"); m_xmlWriter.WriteStartElement(name); - WriteObject(ElemAutoTypeEnabled, dictAutoType.Enabled); - WriteObject(ElemAutoTypeObfuscation, (int)dictAutoType.ObfuscationOptions); + WriteObject(ElemAutoTypeEnabled, cfgAutoType.Enabled); + WriteObject(ElemAutoTypeObfuscation, (int)cfgAutoType.ObfuscationOptions); - if(dictAutoType.DefaultSequence.Length > 0) - WriteObject(ElemAutoTypeDefaultSeq, dictAutoType.DefaultSequence, true); + if(cfgAutoType.DefaultSequence.Length > 0) + WriteObject(ElemAutoTypeDefaultSeq, cfgAutoType.DefaultSequence, true); - foreach(KeyValuePair kvp in dictAutoType.WindowSequencePairs) - WriteObject(ElemAutoTypeItem, ElemWindow, ElemKeystrokeSequence, kvp); + foreach(AutoTypeAssociation a in cfgAutoType.Associations) + WriteObject(ElemAutoTypeItem, ElemWindow, ElemKeystrokeSequence, + new KeyValuePair(a.WindowName, a.Sequence)); m_xmlWriter.WriteEndElement(); } @@ -632,21 +633,25 @@ m_xmlWriter.WriteEndElement(); m_xmlWriter.WriteStartElement(ElemValue); + bool bProtected = value.IsProtected; if(bIsEntryString) { + // Adjust memory protection setting (which might be different + // from the database default, e.g. due to an import which + // didn't specify the correct setting) if(name == PwDefs.TitleField) - value.EnableProtection(m_pwDatabase.MemoryProtection.ProtectTitle); + bProtected = m_pwDatabase.MemoryProtection.ProtectTitle; else if(name == PwDefs.UserNameField) - value.EnableProtection(m_pwDatabase.MemoryProtection.ProtectUserName); + bProtected = m_pwDatabase.MemoryProtection.ProtectUserName; else if(name == PwDefs.PasswordField) - value.EnableProtection(m_pwDatabase.MemoryProtection.ProtectPassword); + bProtected = m_pwDatabase.MemoryProtection.ProtectPassword; else if(name == PwDefs.UrlField) - value.EnableProtection(m_pwDatabase.MemoryProtection.ProtectUrl); + bProtected = m_pwDatabase.MemoryProtection.ProtectUrl; else if(name == PwDefs.NotesField) - value.EnableProtection(m_pwDatabase.MemoryProtection.ProtectNotes); + bProtected = m_pwDatabase.MemoryProtection.ProtectNotes; } - if(value.IsProtected && (m_format != Kdb4Format.PlainXml)) + if(bProtected && (m_format != Kdb4Format.PlainXml)) { m_xmlWriter.WriteAttributeString(AttrProtected, ValTrue); @@ -695,6 +700,9 @@ strValue = sb.ToString(); // Correct string for current code page } + if((m_format == Kdb4Format.PlainXml) && bProtected) + m_xmlWriter.WriteAttributeString(AttrProtectedInMemPlainXml, ValTrue); + m_xmlWriter.WriteString(StrUtil.SafeXmlString(strValue)); } diff -Nru keepass2-2.16+dfsg/KeePassLib/Serialization/OldFormatException.cs keepass2-2.18+dfsg/KeePassLib/Serialization/OldFormatException.cs --- keepass2-2.16+dfsg/KeePassLib/Serialization/OldFormatException.cs 2011-01-01 11:27:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Serialization/OldFormatException.cs 2012-01-01 11:53:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Translation/KPControlCustomization.cs keepass2-2.18+dfsg/KeePassLib/Translation/KPControlCustomization.cs --- keepass2-2.16+dfsg/KeePassLib/Translation/KPControlCustomization.cs 2011-03-19 14:50:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Translation/KPControlCustomization.cs 2012-01-01 11:53:34.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using System.Text; +using System.ComponentModel; using System.Windows.Forms; using System.Diagnostics; using System.Xml.Serialization; @@ -47,34 +48,54 @@ private string m_strPosX = string.Empty; [XmlAttribute] + [DefaultValue("")] public string X { get { return m_strPosX; } - set { m_strPosX = value; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strPosX = value; + } } private string m_strPosY = string.Empty; [XmlAttribute] + [DefaultValue("")] public string Y { get { return m_strPosY; } - set { m_strPosY = value; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strPosY = value; + } } private string m_strSizeW = string.Empty; [XmlAttribute] + [DefaultValue("")] public string Width { get { return m_strSizeW; } - set { m_strSizeW = value; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strSizeW = value; + } } private string m_strSizeH = string.Empty; [XmlAttribute] + [DefaultValue("")] public string Height { get { return m_strSizeH; } - set { m_strSizeH = value; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strSizeH = value; + } } public void SetControlRelativeValue(LayoutParameterEx lp, string strValue) @@ -181,7 +202,7 @@ public sealed class KPControlCustomization : IComparable { - private string m_strMemberName; + private string m_strMemberName = string.Empty; /// /// Member variable name of the control to be translated. /// @@ -189,7 +210,11 @@ public string Name { get { return m_strMemberName; } - set { m_strMemberName = value; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strMemberName = value; + } } private string m_strHash = string.Empty; @@ -197,14 +222,23 @@ public string BaseHash { get { return m_strHash; } - set { m_strHash = value; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strHash = value; + } } private string m_strText = string.Empty; + [DefaultValue("")] public string Text { get { return m_strText; } - set { m_strText = value; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strText = value; + } } private string m_strEngText = string.Empty; diff -Nru keepass2-2.16+dfsg/KeePassLib/Translation/KPFormCustomization.cs keepass2-2.18+dfsg/KeePassLib/Translation/KPFormCustomization.cs --- keepass2-2.16+dfsg/KeePassLib/Translation/KPFormCustomization.cs 2011-01-01 11:27:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Translation/KPFormCustomization.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -37,7 +37,11 @@ public string FullName { get { return m_strFQName; } - set { m_strFQName = value; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strFQName = value; + } } private KPControlCustomization m_ccWindow = new KPControlCustomization(); diff -Nru keepass2-2.16+dfsg/KeePassLib/Translation/KPStringTable.cs keepass2-2.18+dfsg/KeePassLib/Translation/KPStringTable.cs --- keepass2-2.16+dfsg/KeePassLib/Translation/KPStringTable.cs 2011-01-01 11:27:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Translation/KPStringTable.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -33,7 +33,11 @@ public string Name { get { return m_strName; } - set { m_strName = value; } + set + { + if(value == null) throw new ArgumentNullException("value"); + m_strName = value; + } } private List m_vItems = new List(); @@ -45,7 +49,6 @@ set { if(value == null) throw new ArgumentNullException("value"); - m_vItems = value; } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Translation/KPStringTableItem.cs keepass2-2.18+dfsg/KeePassLib/Translation/KPStringTableItem.cs --- keepass2-2.16+dfsg/KeePassLib/Translation/KPStringTableItem.cs 2011-01-01 11:27:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Translation/KPStringTableItem.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Translation/KPTranslation.cs keepass2-2.18+dfsg/KeePassLib/Translation/KPTranslation.cs --- keepass2-2.16+dfsg/KeePassLib/Translation/KPTranslation.cs 2011-01-01 11:27:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Translation/KPTranslation.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -24,6 +24,7 @@ using System.Xml; using System.Xml.Serialization; using System.Windows.Forms; +using System.ComponentModel; using System.Drawing; using System.Diagnostics; @@ -76,6 +77,7 @@ } private string m_strUnusedText = string.Empty; + [DefaultValue("")] public string UnusedText { get { return m_strUnusedText; } diff -Nru keepass2-2.16+dfsg/KeePassLib/Translation/KPTranslationProperties.cs keepass2-2.18+dfsg/KeePassLib/Translation/KPTranslationProperties.cs --- keepass2-2.16+dfsg/KeePassLib/Translation/KPTranslationProperties.cs 2011-01-01 11:27:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Translation/KPTranslationProperties.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Utility/AppLogEx.cs keepass2-2.18+dfsg/KeePassLib/Utility/AppLogEx.cs --- keepass2-2.16+dfsg/KeePassLib/Utility/AppLogEx.cs 2011-01-01 11:27:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Utility/AppLogEx.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLib/Utility/MemUtil.cs keepass2-2.18+dfsg/KeePassLib/Utility/MemUtil.cs --- keepass2-2.16+dfsg/KeePassLib/Utility/MemUtil.cs 2011-03-12 10:21:44.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Utility/MemUtil.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -40,27 +40,26 @@ /// 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. + /// 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 + /// Thrown if /// is null. - public static byte[] HexStringToByteArray(string strHexString) + public static byte[] HexStringToByteArray(string strHex) { - Debug.Assert(strHexString != null); if(strHexString == null) throw new ArgumentNullException("strHexString"); + if(strHex == null) { Debug.Assert(false); throw new ArgumentNullException("strHex"); } - int nStrLen = strHexString.Length; - if((nStrLen & 1) != 0) return null; // Only even strings supported + int nStrLen = strHex.Length; + if((nStrLen & 1) != 0) { Debug.Assert(false); return null; } byte[] pb = new byte[nStrLen / 2]; byte bt; char ch; - for(int i = 0; i < nStrLen; ++i) + for(int i = 0; i < nStrLen; i += 2) { - ch = strHexString[i]; - if((ch == ' ') || (ch == '\t') || (ch == '\r') || (ch == '\n')) continue; + ch = strHex[i]; if((ch >= '0') && (ch <= '9')) bt = (byte)(ch - '0'); @@ -68,20 +67,20 @@ bt = (byte)(ch - 'a' + 10); else if((ch >= 'A') && (ch <= 'F')) bt = (byte)(ch - 'A' + 10); - else bt = 0; + else { Debug.Assert(false); bt = 0; } bt <<= 4; - ++i; - ch = strHexString[i]; + ch = strHex[i + 1]; if((ch >= '0') && (ch <= '9')) bt += (byte)(ch - '0'); else if((ch >= 'a') && (ch <= 'f')) bt += (byte)(ch - 'a' + 10); else if((ch >= 'A') && (ch <= 'F')) bt += (byte)(ch - 'A' + 10); + else { Debug.Assert(false); } - pb[i / 2] = bt; + pb[i >> 1] = bt; } return pb; diff -Nru keepass2-2.16+dfsg/KeePassLib/Utility/MessageService.cs keepass2-2.18+dfsg/KeePassLib/Utility/MessageService.cs --- keepass2-2.16+dfsg/KeePassLib/Utility/MessageService.cs 2011-05-28 08:42:52.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Utility/MessageService.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -146,7 +146,7 @@ else strAppend = obj.ToString(); - if((strAppend != null) && (strAppend.Length > 0)) + if(!string.IsNullOrEmpty(strAppend)) { if(bSeparator) sbText.Append(strNewPara); else bSeparator = true; @@ -369,8 +369,14 @@ public static void ShowSaveWarning(string strFilePath, Exception ex, bool bCorruptionWarning) { - string str = string.Empty; + FileLockException fl = (ex as FileLockException); + if(fl != null) + { + ShowWarning(fl.Message); + return; + } + string str = string.Empty; if((strFilePath != null) && (strFilePath.Length > 0)) str += strFilePath + MessageService.NewParagraph; diff -Nru keepass2-2.16+dfsg/KeePassLib/Utility/StrUtil.cs keepass2-2.18+dfsg/KeePassLib/Utility/StrUtil.cs --- keepass2-2.16+dfsg/KeePassLib/Utility/StrUtil.cs 2011-05-20 13:29:40.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Utility/StrUtil.cs 2012-01-03 15:53:32.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -23,6 +23,7 @@ using System.Diagnostics; using System.Text; using System.Drawing; +// using System.Drawing.Imaging; using System.IO; using System.Text.RegularExpressions; using System.Security.Cryptography; @@ -189,7 +190,7 @@ str = str.Replace("\"", @"""); str = str.Replace("\'", @"'"); - str = str.Replace("\r", string.Empty); + str = NormalizeNewLines(str, false); str = str.Replace("\n", @"
    "); return str; @@ -602,7 +603,6 @@ for(char ch = 'A'; ch <= 'Z'; ++ch) { string strEnhAcc = @"(&" + ch.ToString() + @")"; - if(str.IndexOf(strEnhAcc) >= 0) { str = str.Replace(@" " + strEnhAcc, string.Empty); @@ -717,12 +717,50 @@ return "null"; } - public static string ToWindowsString(string str) + /// + /// 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 Mac OS. + /// + /// 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. + public static string NormalizeNewLines(string str, bool bWindows) { if(string.IsNullOrEmpty(str)) return str; - string strSingular = str.Replace("\r", string.Empty); - return strSingular.Replace("\n", "\r\n"); + str = str.Replace("\r\n", "\n"); + str = str.Replace("\r", "\n"); + + if(bWindows) str = str.Replace("\n", "\r\n"); + + return str; + } + + private static char[] m_vNewLineChars = null; + public static void NormalizeNewLines(ProtectedStringDictionary dict, + bool bWindows) + { + if(dict == null) { Debug.Assert(false); return; } + + if(m_vNewLineChars == null) + m_vNewLineChars = new char[]{ '\r', '\n' }; + + List vKeys = dict.GetKeys(); + foreach(string strKey in vKeys) + { + ProtectedString ps = dict.Get(strKey); + if(ps == null) { Debug.Assert(false); continue; } + + string strValue = ps.ReadString(); + if(strValue.IndexOfAny(m_vNewLineChars) < 0) continue; + + dict.Set(strKey, new ProtectedString(ps.IsProtected, + NormalizeNewLines(strValue, bWindows))); + } } public static string AlphaNumericOnly(string str) @@ -770,36 +808,56 @@ private static readonly char[] m_vVersionSep = new char[]{ '.', ',' }; public static ulong GetVersion(string strVersion) { - if(string.IsNullOrEmpty(strVersion)) { Debug.Assert(false); return 0; } + if(strVersion == null) { Debug.Assert(false); return 0; } - string[] vVer = strVersion.Split(m_vVersionSep); + string[] vVer = strVersion.Trim().Split(m_vVersionSep); if((vVer == null) || (vVer.Length == 0)) { Debug.Assert(false); return 0; } ushort uPart; - StrUtil.TryParseUShort(vVer[0], out uPart); + StrUtil.TryParseUShort(vVer[0].Trim(), out uPart); ulong uVer = ((ulong)uPart << 48); if(vVer.Length >= 2) { - StrUtil.TryParseUShort(vVer[1], out uPart); + StrUtil.TryParseUShort(vVer[1].Trim(), out uPart); uVer |= ((ulong)uPart << 32); } if(vVer.Length >= 3) { - StrUtil.TryParseUShort(vVer[2], out uPart); + StrUtil.TryParseUShort(vVer[2].Trim(), out uPart); uVer |= ((ulong)uPart << 16); } if(vVer.Length >= 4) { - StrUtil.TryParseUShort(vVer[3], out uPart); + StrUtil.TryParseUShort(vVer[3].Trim(), out uPart); uVer |= (ulong)uPart; } return uVer; } + public static string VersionToString(ulong uVersion) + { + string str = string.Empty; + + for(int i = 0; i < 4; ++i) + { + ushort us = (ushort)(uVersion & 0xFFFFUL); + + if((us != 0) || (str.Length > 0)) + { + if(str.Length > 0) str = "." + str; + str = us.ToString() + str; + } + + uVersion >>= 16; + } + + return str; + } + private static readonly byte[] m_pbOptEnt = { 0xA5, 0x74, 0x2E, 0xEC }; public static string EncryptString(string strPlainText) @@ -1001,7 +1059,7 @@ if(strMulti.Length == 0) return string.Empty; string str = strMulti; - str = str.Replace("\r\n", "\n"); + str = str.Replace("\r\n", " "); str = str.Replace("\r", " "); str = str.Replace("\n", " "); @@ -1040,5 +1098,107 @@ if(x.Length == y.Length) return 0; return ((x.Length > y.Length) ? -1 : 1); } + + /* public static string ImageToDataUri(Image img) + { + if(img == null) { Debug.Assert(false); return string.Empty; } + + MemoryStream ms = new MemoryStream(); + img.Save(ms, ImageFormat.Png); + + byte[] pbImage = ms.ToArray(); + string strImage = Convert.ToBase64String(pbImage); + + ms.Close(); + return ("data:image/png;base64," + strImage); + } */ + + public static bool IsDataUri(string strUri) + { + if(strUri == null) { Debug.Assert(false); return false; } + + return strUri.StartsWith("data:", StrUtil.CaseIgnoreCmp); + } + + /// + /// Create a data URI (according to RFC 2397). + /// + /// Data to encode. + /// Optional MIME type. If null, + /// an appropriate type is used. + /// Data URI. + public static string DataToDataUri(byte[] pbData, string strMimeType) + { + if(pbData == null) throw new ArgumentNullException("pbData"); + + if(strMimeType == null) strMimeType = "application/octet-stream"; + +#if !KeePassLibSD + return ("data:" + strMimeType + ";base64," + Convert.ToBase64String( + pbData, Base64FormattingOptions.None)); +#else + return ("data:" + strMimeType + ";base64," + Convert.ToBase64String( + pbData)); +#endif + } + + /// + /// Convert a data URI (according to RFC 2397) to binary data. + /// + /// Data URI to decode. + /// Decoded binary data. + public static byte[] DataUriToData(string strDataUri) + { + if(strDataUri == null) throw new ArgumentNullException("strDataUri"); + if(!strDataUri.StartsWith("data:", StrUtil.CaseIgnoreCmp)) return null; + + int iSep = strDataUri.IndexOf(','); + if(iSep < 0) return null; + + string strDesc = strDataUri.Substring(5, iSep - 5); + bool bBase64 = strDesc.EndsWith(";base64", StrUtil.CaseIgnoreCmp); + + string strData = strDataUri.Substring(iSep + 1); + + if(bBase64) return Convert.FromBase64String(strData); + + MemoryStream ms = new MemoryStream(); + + string[] v = strData.Split('%'); + byte[] pb = Encoding.ASCII.GetBytes(v[0]); + ms.Write(pb, 0, pb.Length); + for(int i = 1; i < v.Length; ++i) + { + ms.WriteByte(Convert.ToByte(v[i].Substring(0, 2), 16)); + pb = Encoding.ASCII.GetBytes(v[i].Substring(2)); + ms.Write(pb, 0, pb.Length); + } + + pb = ms.ToArray(); + ms.Close(); + return pb; + } + + /// + /// Remove placeholders from a string (wrapped in '{' and '}'). + /// This doesn't remove environment variables (wrapped in '%'). + /// + public static string RemovePlaceholders(string str) + { + if(str == null) { Debug.Assert(false); return string.Empty; } + + while(true) + { + int iPlhStart = str.IndexOf('{'); + if(iPlhStart < 0) break; + + int iPlhEnd = str.IndexOf('}', iPlhStart); // '{' might be at end + if(iPlhEnd < 0) break; + + str = (str.Substring(0, iPlhStart) + str.Substring(iPlhEnd + 1)); + } + + return str; + } } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Utility/TimeUtil.cs keepass2-2.18+dfsg/KeePassLib/Utility/TimeUtil.cs --- keepass2-2.16+dfsg/KeePassLib/Utility/TimeUtil.cs 2011-01-01 11:27:18.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Utility/TimeUtil.cs 2012-01-05 09:29:10.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -182,5 +182,41 @@ return DateTime.Now; } + +#if !KeePassLibSD + private static string[] m_vUSMonths = null; + /// + /// Parse a US textual date string, like e.g. "January 02, 2012". + /// + public static DateTime? ParseUSTextDate(string strDate) + { + if(strDate == null) { Debug.Assert(false); return null; } + + if(m_vUSMonths == null) + m_vUSMonths = new string[]{ "January", "February", "March", + "April", "May", "June", "July", "August", "September", + "October", "November", "December" }; + + string str = strDate.Trim(); + for(int i = 0; i < m_vUSMonths.Length; ++i) + { + if(str.StartsWith(m_vUSMonths[i], StrUtil.CaseIgnoreCmp)) + { + str = str.Substring(m_vUSMonths[i].Length); + string[] v = str.Split(new char[]{ ',', ';' }); + if((v == null) || (v.Length != 2)) return null; + + string strDay = v[0].Trim().TrimStart('0'); + int iDay, iYear; + if(int.TryParse(strDay, out iDay) && + int.TryParse(v[1].Trim(), out iYear)) + return new DateTime(iYear, i + 1, iDay); + else { Debug.Assert(false); return null; } + } + } + + return null; + } +#endif } } diff -Nru keepass2-2.16+dfsg/KeePassLib/Utility/UrlUtil.cs keepass2-2.18+dfsg/KeePassLib/Utility/UrlUtil.cs --- keepass2-2.16+dfsg/KeePassLib/Utility/UrlUtil.cs 2011-07-06 15:26:00.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLib/Utility/UrlUtil.cs 2012-01-01 11:54:42.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -515,5 +515,53 @@ return str; } + + /// + /// Get the host component of an 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. + /// + public static string GetHost(string strUrl) + { + if(strUrl == null) { Debug.Assert(false); return string.Empty; } + + StringBuilder sb = new StringBuilder(); + bool bInExtHost = false; + for(int i = 0; i < strUrl.Length; ++i) + { + char ch = strUrl[i]; + if(bInExtHost) + { + if(ch == '/') + { + if(sb.Length == 0) { } // Ignore leading '/'s + else break; + } + else sb.Append(ch); + } + else // !bInExtHost + { + if(ch == ':') bInExtHost = true; + } + } + + string str = sb.ToString(); + if(str.Length == 0) str = strUrl; + + // Remove the login part + int nLoginLen = str.IndexOf('@'); + if(nLoginLen >= 0) str = str.Substring(nLoginLen + 1); + + // Remove the port + int iPort = str.LastIndexOf(':'); + if(iPort >= 0) str = str.Substring(0, iPort); + + return str; + } } } diff -Nru keepass2-2.16+dfsg/KeePassLibSD/ColorTranslator.cs keepass2-2.18+dfsg/KeePassLibSD/ColorTranslator.cs --- keepass2-2.16+dfsg/KeePassLibSD/ColorTranslator.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLibSD/ColorTranslator.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLibSD/GZipStream.cs keepass2-2.18+dfsg/KeePassLibSD/GZipStream.cs --- keepass2-2.16+dfsg/KeePassLibSD/GZipStream.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLibSD/GZipStream.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLibSD/InvalidDataException.cs keepass2-2.18+dfsg/KeePassLibSD/InvalidDataException.cs --- keepass2-2.16+dfsg/KeePassLibSD/InvalidDataException.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLibSD/InvalidDataException.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLibSD/KeePassLibSD.csproj keepass2-2.18+dfsg/KeePassLibSD/KeePassLibSD.csproj --- keepass2-2.16+dfsg/KeePassLibSD/KeePassLibSD.csproj 2011-03-15 11:11:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLibSD/KeePassLibSD.csproj 2011-12-22 12:54:50.000000000 +0000 @@ -230,6 +230,9 @@ Serialization\BinaryReaderEx.cs + + Serialization\FileLock.cs + Serialization\FileTransactionEx.cs diff -Nru keepass2-2.16+dfsg/KeePassLibSD/Properties/AssemblyInfo.cs keepass2-2.18+dfsg/KeePassLibSD/Properties/AssemblyInfo.cs --- keepass2-2.16+dfsg/KeePassLibSD/Properties/AssemblyInfo.cs 2011-07-05 12:43:46.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLibSD/Properties/AssemblyInfo.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -27,7 +27,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Dominik Reichl")] [assembly: AssemblyProduct("KeePassLibSD")] -[assembly: AssemblyCopyright("Copyright © 2003-2011 Dominik Reichl")] +[assembly: AssemblyCopyright("Copyright © 2003-2012 Dominik Reichl")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -38,4 +38,4 @@ [assembly: Guid("1d3c6f10-e10b-47be-a2f1-af2562d7d470")] // Assembly version information -[assembly: AssemblyVersion("2.1.6.*")] +[assembly: AssemblyVersion("2.1.8.*")] diff -Nru keepass2-2.16+dfsg/KeePassLibSD/ProtectedData.cs keepass2-2.18+dfsg/KeePassLibSD/ProtectedData.cs --- keepass2-2.16+dfsg/KeePassLibSD/ProtectedData.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLibSD/ProtectedData.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLibSD/ProtectedMemory.cs keepass2-2.18+dfsg/KeePassLibSD/ProtectedMemory.cs --- keepass2-2.16+dfsg/KeePassLibSD/ProtectedMemory.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLibSD/ProtectedMemory.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLibSD/SecureStringEx.cs keepass2-2.18+dfsg/KeePassLibSD/SecureStringEx.cs --- keepass2-2.16+dfsg/KeePassLibSD/SecureStringEx.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLibSD/SecureStringEx.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLibSD/SHA256.cs keepass2-2.18+dfsg/KeePassLibSD/SHA256.cs --- keepass2-2.16+dfsg/KeePassLibSD/SHA256.cs 2011-03-15 11:11:28.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLibSD/SHA256.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/KeePassLibSD/SortedDictionary.cs keepass2-2.18+dfsg/KeePassLibSD/SortedDictionary.cs --- keepass2-2.16+dfsg/KeePassLibSD/SortedDictionary.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/KeePassLibSD/SortedDictionary.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/ShInstUtil/ShInstUtil.cpp keepass2-2.18+dfsg/ShInstUtil/ShInstUtil.cpp --- keepass2-2.16+dfsg/ShInstUtil/ShInstUtil.cpp 2011-01-01 12:03:12.000000000 +0000 +++ keepass2-2.18+dfsg/ShInstUtil/ShInstUtil.cpp 2012-01-01 12:30:18.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -19,7 +19,11 @@ #include "ShInstUtil.h" +#pragma warning(push) +#pragma warning(disable: 4996) // SCL warning +#include #include +#pragma warning(pop) static const std_string g_strNGenInstall = _T("ngen_install"); static const std_string g_strNGenUninstall = _T("ngen_uninstall"); @@ -194,14 +198,16 @@ if(strRoot.size() == 0) return strNGen; EnsureTerminatingSeparator(strRoot); - FILETIME ftCreation; - ZeroMemory(&ftCreation, sizeof(FILETIME)); - FindNGenRec(strRoot, strNGen, ftCreation); + ULONGLONG ullVersion = 0; + FindNGenRec(strRoot, strNGen, ullVersion); return strNGen; } -void FindNGenRec(const std_string& strPath, std_string& strNGenPath, FILETIME& ftCreation) +#pragma warning(push) +#pragma warning(disable: 4127) // Conditional expression is constant +void FindNGenRec(const std_string& strPath, std_string& strNGenPath, + ULONGLONG& ullVersion) { const std_string strSearch = strPath + _T("*.*"); const std_string strNGen = _T("ngen.exe"); @@ -216,15 +222,15 @@ if((wfd.cFileName[0] == 0) || (_tcsicmp(wfd.cFileName, _T(".")) == 0) || (_tcsicmp(wfd.cFileName, _T("..")) == 0)) { } else if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) - FindNGenRec((strPath + wfd.cFileName) + _T("\\"), strNGenPath, ftCreation); + FindNGenRec((strPath + wfd.cFileName) + _T("\\"), strNGenPath, ullVersion); else if(_tcsicmp(wfd.cFileName, strNGen.c_str()) == 0) { - if((wfd.ftCreationTime.dwHighDateTime > ftCreation.dwHighDateTime) || - ((wfd.ftCreationTime.dwHighDateTime == ftCreation.dwHighDateTime) && - (wfd.ftCreationTime.dwLowDateTime > ftCreation.dwLowDateTime))) + const std_string strFullPath = strPath + strNGen; + const ULONGLONG ullThisVer = SiuGetFileVersion(strFullPath); + if(ullThisVer >= ullVersion) { - strNGenPath = strPath + wfd.cFileName; - ftCreation = wfd.ftCreationTime; + strNGenPath = strFullPath; + ullVersion = ullThisVer; } } @@ -233,6 +239,30 @@ FindClose(hFind); } +#pragma warning(pop) + +ULONGLONG SiuGetFileVersion(const std_string& strFilePath) +{ + DWORD dwDummy = 0; + const DWORD dwVerSize = GetFileVersionInfoSize( + strFilePath.c_str(), &dwDummy); + if(dwVerSize == 0) return 0; + + boost::scoped_array vVerInfo(new BYTE[dwVerSize]); + if(vVerInfo.get() == NULL) return 0; // Out of memory + + if(GetFileVersionInfo(strFilePath.c_str(), 0, dwVerSize, + vVerInfo.get()) == FALSE) return 0; + + VS_FIXEDFILEINFO* pFileInfo = NULL; + UINT uFixedInfoLen = 0; + if(VerQueryValue(vVerInfo.get(), _T("\\"), (LPVOID*)&pFileInfo, + &uFixedInfoLen) == FALSE) return 0; + if(pFileInfo == NULL) return 0; + + return ((static_cast(pFileInfo->dwFileVersionMS) << + 32) | static_cast(pFileInfo->dwFileVersionLS)); +} void CheckDotNetInstalled() { diff -Nru keepass2-2.16+dfsg/ShInstUtil/ShInstUtil.h keepass2-2.18+dfsg/ShInstUtil/ShInstUtil.h --- keepass2-2.16+dfsg/ShInstUtil/ShInstUtil.h 2011-01-01 12:02:58.000000000 +0000 +++ keepass2-2.18+dfsg/ShInstUtil/ShInstUtil.h 2012-01-01 12:30:18.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -97,7 +97,9 @@ std_string GetKeePassExePath(); void EnsureTerminatingSeparator(std_string& strPath); std_string FindNGen(); -void FindNGenRec(const std_string& strPath, std_string& strNGenPath, FILETIME& ftCreation); +void FindNGenRec(const std_string& strPath, std_string& strNGenPath, + ULONGLONG& ullVersion); +ULONGLONG SiuGetFileVersion(const std_string& strFilePath); void CheckDotNetInstalled(); #endif // ___SH_INST_UTIL_H___ diff -Nru keepass2-2.16+dfsg/ShInstUtil/ShInstUtil.rc keepass2-2.18+dfsg/ShInstUtil/ShInstUtil.rc --- keepass2-2.16+dfsg/ShInstUtil/ShInstUtil.rc 2011-07-12 08:03:08.000000000 +0000 +++ keepass2-2.18+dfsg/ShInstUtil/ShInstUtil.rc 2012-01-05 09:33:10.000000000 +0000 @@ -13,7 +13,7 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// Deutsch (Deutschland) resources +// German (Germany) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) #ifdef _WIN32 @@ -46,12 +46,12 @@ #endif // APSTUDIO_INVOKED -#endif // Deutsch (Deutschland) resources +#endif // German (Germany) resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -// Englisch (USA) resources +// English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 @@ -65,8 +65,8 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,1,6,0 - PRODUCTVERSION 2,1,6,0 + FILEVERSION 2,1,8,0 + PRODUCTVERSION 2,1,8,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -83,12 +83,12 @@ BEGIN VALUE "CompanyName", "Dominik Reichl" VALUE "FileDescription", "ShInstUtil - KeePass Helper Utility" - VALUE "FileVersion", "2, 1, 6, 0" + VALUE "FileVersion", "2, 1, 8, 0" VALUE "InternalName", "ShInstUtil" - VALUE "LegalCopyright", "Copyright (c) 2007-2011 Dominik Reichl" + VALUE "LegalCopyright", "Copyright (c) 2007-2012 Dominik Reichl" VALUE "OriginalFilename", "ShInstUtil.exe" VALUE "ProductName", "ShInstUtil - KeePass Helper Utility" - VALUE "ProductVersion", "2, 1, 6, 0" + VALUE "ProductVersion", "2, 1, 8, 0" END END BLOCK "VarFileInfo" @@ -97,7 +97,7 @@ END END -#endif // Englisch (USA) resources +#endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff -Nru keepass2-2.16+dfsg/ShInstUtil/ShInstUtil.sln keepass2-2.18+dfsg/ShInstUtil/ShInstUtil.sln --- keepass2-2.16+dfsg/ShInstUtil/ShInstUtil.sln 2009-08-31 17:49:50.000000000 +0000 +++ keepass2-2.18+dfsg/ShInstUtil/ShInstUtil.sln 2011-09-10 10:21:28.000000000 +0000 @@ -1,6 +1,6 @@  -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShInstUtil", "ShInstUtil.vcproj", "{C9FBA6FD-04AC-4B2F-8277-B852B8013DAE}" EndProject Global diff -Nru keepass2-2.16+dfsg/ShInstUtil/ShInstUtil.vcproj keepass2-2.18+dfsg/ShInstUtil/ShInstUtil.vcproj --- keepass2-2.16+dfsg/ShInstUtil/ShInstUtil.vcproj 2009-09-01 15:08:46.000000000 +0000 +++ keepass2-2.18+dfsg/ShInstUtil/ShInstUtil.vcproj 2011-10-23 10:21:46.000000000 +0000 @@ -1,11 +1,12 @@ - @@ -122,7 +121,6 @@ RuntimeLibrary="0" UsePrecompiledHeader="0" WarningLevel="4" - Detect64BitPortabilityProblems="true" DebugInformationFormat="3" /> - diff -Nru keepass2-2.16+dfsg/Translation/DefaultText.xml keepass2-2.18+dfsg/Translation/DefaultText.xml --- keepass2-2.16+dfsg/Translation/DefaultText.xml 2011-07-05 11:40:10.000000000 +0000 +++ keepass2-2.18+dfsg/Translation/DefaultText.xml 2011-12-29 15:29:30.000000000 +0000 @@ -10,9 +10,6 @@ Add Entry - - Add Entry... - Create a new password entry. @@ -145,6 +142,12 @@ An entry matches if its title is contained in the target window title + + An entry matches if the host component of its URL is contained in the target window title + + + An entry matches if its URL is contained in the target window title + Auto-type obfuscation may not work with all windows. @@ -169,6 +172,9 @@ For global auto-type, the 'xdotool' utility/package is required (version 2.20100818.3004 or higher!). + + Available + Available Languages @@ -187,6 +193,9 @@ Browser + + built-in + < &Back @@ -199,6 +208,9 @@ Cancel + + &Cancel + Cannot move entries because they aren't stored in the same group. @@ -211,11 +223,8 @@ Check for update at KeePass startup - - You have the latest version. - - - New KeePass version available! + + Checking for updates Clear master key command line parameters after using them once @@ -247,14 +256,17 @@ Column + + Columns + Company Comparison - - Components + + Component Condition @@ -310,6 +322,9 @@ Copy All + + Copy Link + Copy @@ -457,21 +472,21 @@ Do not show this dialog again. + + Disable + Disabled Disable 'Save' command (instead of graying it out) if the database hasn't been modified - - Discard changes + + &Discard changes Please see the documentation for more details. - - Do&n't delete - Drag&Drop @@ -523,6 +538,9 @@ Are you sure you want to permanently delete the items? + + Enable + Enabled @@ -559,12 +577,6 @@ Automatically resize entry list columns when resizing the main window - - Entry View - - - Hide in-memory protected custom strings using asterisks - Environment variable @@ -751,11 +763,14 @@ Find + + Focus quick search box when restoring from taskbar + Focus quick search box when restoring from tray - - Focus entry list after a successful quick search (toolbar) + + Focus entry list after a successful quick search Folder @@ -907,15 +922,18 @@ Have you understood how the import process works and want to start it now? + + incompatible with sorting + Inherit setting from parent + + Installed + Internet - - Invalid file structure! - Invalid Key @@ -961,9 +979,15 @@ LCtrl + + Esc + Key Modifiers + + Return + Shift @@ -991,15 +1015,12 @@ Use an existing file as key file - - The selected key provider cannot be used, because it might try to show a dialog and this isn't allowed on a secure desktop. + + The selected key provider cannot be used, because it is incompatible with the secure desktop. - + If you want to use the selected key provider, you have to disable the secure desktop option in 'Tools' -> 'Options' -> tab 'Security'. - - Keystroke Sequence - The selected language has been activated. KeePass must be restarted in order to load the language. @@ -1117,6 +1138,9 @@ New state + + New version available + No @@ -1183,6 +1207,9 @@ Opening password database... + + Open with {PARAM} + Optimize for screen reader (only enable if you're using a screen reader) @@ -1195,6 +1222,12 @@ Other Placeholders + + Built-In Overrides + + + Custom Overrides + Overwrite @@ -1318,6 +1351,9 @@ Allow printing password entry lists. + + Do not require entering current master key before printing. + The following policy flag is required @@ -1327,20 +1363,26 @@ Allow editing triggers. + + Pre-release version + Print Print password entries. - - Quick Search + + Exclude expired entries in quick searches - - Exclude expired entries in quick searches (toolbar) + + Search for passwords in quick searches - - Search for passwords in quick searches (toolbar) + + Resolve field references in quick searches + + + Quick Search (Toolbar) Random MAC Address @@ -1348,6 +1390,9 @@ Ready. + + recommended + Recycle Bin @@ -1375,6 +1420,9 @@ Root Directory + + Ensure same keyboard layouts during auto-type + Sample Entry @@ -1417,6 +1465,9 @@ Search Results + + Searching + entries found. @@ -1450,6 +1501,9 @@ Please select a different group. + + Selected column + selected @@ -1468,15 +1522,18 @@ One or more of the KeePass self-tests failed. - - Show All Entries + + Sequence + + + Show dereferenced data + + + Show dereferenced data asynchronously Show Entries - - Show Expired Entries - Show full path in title bar (instead of file name only) @@ -1489,6 +1546,9 @@ Size + + slow + Expired Entries and Entries That Will Expire Soon @@ -1510,6 +1570,9 @@ Starts with + + Status + Strikeout @@ -1658,7 +1721,7 @@ Unhide Passwords - Allow displaying passwords as plain text. + Allow displaying passwords as plain-text. Unhide button also unhides source characters @@ -1669,15 +1732,33 @@ An unknown error occurred. - - Unknown file version! + + Update Check + + + Enable automatic update check? + + + Update check failed. Version information file cannot be downloaded. + + + KeePass can automatically check for updates on each program start. + + + No personal information is sent to the KeePass server. KeePass just downloads a small version information file and compares the available version with the installed version. + + + 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. - - Update checking failed. + + The results of the update check. User interface state updated + + Up to date + URL @@ -1705,6 +1786,9 @@ Use custom ToolStrip renderer + + Use database lock files + Use file transactions for writing databases @@ -1759,9 +1843,6 @@ Web Sites - - Do you want to visit the KeePass website now? - Windows Favorites @@ -1816,6 +1897,9 @@ Failed to load the specified file! + + The file is locked, because the following user is currently writing to it: + A newer KeePass version is required to open this file. @@ -1861,6 +1945,9 @@ The selected file appears to be an old format + + Please try it again in a few seconds. + Unknown header ID! diff -Nru keepass2-2.16+dfsg/Translation/TrlUtil/AccelKeysCheck.cs keepass2-2.18+dfsg/Translation/TrlUtil/AccelKeysCheck.cs --- keepass2-2.16+dfsg/Translation/TrlUtil/AccelKeysCheck.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/Translation/TrlUtil/AccelKeysCheck.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/Translation/TrlUtil/FormTrlMgr.cs keepass2-2.18+dfsg/Translation/TrlUtil/FormTrlMgr.cs --- keepass2-2.16+dfsg/Translation/TrlUtil/FormTrlMgr.cs 2011-06-02 11:28:36.000000000 +0000 +++ keepass2-2.18+dfsg/Translation/TrlUtil/FormTrlMgr.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -44,12 +44,14 @@ List l = new List(); AddForm(l, new AboutForm()); + AddForm(l, new AutoTypeCtxForm()); AddForm(l, new CharPickerForm()); AddForm(l, new ColumnsForm()); AddForm(l, new DatabaseOperationsForm()); AddForm(l, new DatabaseSettingsForm()); AddForm(l, new DataEditorForm()); AddForm(l, new DataViewerForm()); + AddForm(l, new DuplicationForm()); AddForm(l, new EcasActionForm()); AddForm(l, new EcasConditionForm()); AddForm(l, new EcasEventForm()); @@ -86,6 +88,7 @@ AddForm(l, new StatusProgressForm()); AddForm(l, new TanWizardForm()); AddForm(l, new TextEncodingForm()); + AddForm(l, new UpdateCheckForm()); AddForm(l, new UrlSchemeForm()); AddForm(l, new UrlSchemesForm()); @@ -134,6 +137,7 @@ else if(t == typeof(RichTextBox)) bAdd = true; else if(t == typeof(KeePass.UI.CustomRichTextBoxEx)) bAdd = true; else if(t == typeof(ComboBox)) bAdd = true; + else if(t == typeof(KeePass.UI.ImageComboBoxEx)) bAdd = true; else if(t == typeof(Label)) bAdd = true; else if(t == typeof(ListView)) bAdd = true; else if(t == typeof(CustomListViewEx)) bAdd = true; diff -Nru keepass2-2.16+dfsg/Translation/TrlUtil/KeePass1xLngImport.cs keepass2-2.18+dfsg/Translation/TrlUtil/KeePass1xLngImport.cs --- keepass2-2.16+dfsg/Translation/TrlUtil/KeePass1xLngImport.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/Translation/TrlUtil/KeePass1xLngImport.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/Translation/TrlUtil/MainForm.cs keepass2-2.18+dfsg/Translation/TrlUtil/MainForm.cs --- keepass2-2.16+dfsg/Translation/TrlUtil/MainForm.cs 2011-04-05 15:55:58.000000000 +0000 +++ keepass2-2.18+dfsg/Translation/TrlUtil/MainForm.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -44,7 +44,6 @@ private string m_strFile = string.Empty; private ImageList m_ilStr = new ImageList(); - private Color m_clrFindBack; private const string m_strFileFilter = "KeePass Translation (*.lngx)|*.lngx|All Files (*.*)|*.*"; @@ -69,7 +68,6 @@ this.Text += " " + PwDefs.VersionString; m_trl.Forms = FormTrlMgr.CreateListOfCurrentVersion(); - m_clrFindBack = m_tbFind.BackColor; m_rtbUnusedText.SimpleTextOnly = true; string strSearchTr = ((WinUtil.IsAtLeastWindowsVista ? @@ -930,7 +928,7 @@ private void OnFindTextChanged(object sender, EventArgs e) { - m_tbFind.BackColor = m_clrFindBack; + m_tbFind.ResetBackColor(); } private void OnTabMainSelectedIndexChanged(object sender, EventArgs e) diff -Nru keepass2-2.16+dfsg/Translation/TrlUtil/PreviewForm.cs keepass2-2.18+dfsg/Translation/TrlUtil/PreviewForm.cs --- keepass2-2.16+dfsg/Translation/TrlUtil/PreviewForm.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/Translation/TrlUtil/PreviewForm.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 diff -Nru keepass2-2.16+dfsg/Translation/TrlUtil/Program.cs keepass2-2.18+dfsg/Translation/TrlUtil/Program.cs --- keepass2-2.16+dfsg/Translation/TrlUtil/Program.cs 2011-01-01 11:39:04.000000000 +0000 +++ keepass2-2.18+dfsg/Translation/TrlUtil/Program.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -161,7 +161,7 @@ string strValue = xmlData.SelectSingleNode("Value").InnerText; if(strValue.Contains("\"")) { - Console.WriteLine(strValue); + // Console.WriteLine(strValue); strValue = strValue.Replace("\"", "\"\""); } diff -Nru keepass2-2.16+dfsg/Translation/TrlUtil/Properties/AssemblyInfo.cs keepass2-2.18+dfsg/Translation/TrlUtil/Properties/AssemblyInfo.cs --- keepass2-2.16+dfsg/Translation/TrlUtil/Properties/AssemblyInfo.cs 2011-07-05 12:44:00.000000000 +0000 +++ keepass2-2.18+dfsg/Translation/TrlUtil/Properties/AssemblyInfo.cs 2012-01-01 12:06:50.000000000 +0000 @@ -1,6 +1,6 @@ /* KeePass Password Safe - The Open-Source Password Manager - Copyright (C) 2003-2011 Dominik Reichl + Copyright (C) 2003-2012 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 @@ -27,7 +27,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Dominik Reichl")] [assembly: AssemblyProduct("KeePass Translation Utility")] -[assembly: AssemblyCopyright("Copyright © 2008-2011 Dominik Reichl")] +[assembly: AssemblyCopyright("Copyright © 2008-2012 Dominik Reichl")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -38,5 +38,5 @@ [assembly: Guid("39aa6f93-a1c9-497f-bad2-cc42a61d5710")] // Assembly version information -[assembly: AssemblyVersion("2.1.6.0")] -[assembly: AssemblyFileVersion("2.1.6.0")] +[assembly: AssemblyVersion("2.1.8.0")] +[assembly: AssemblyFileVersion("2.1.8.0")]