Added IColumnManager and IResultsFolder and supporting enums and structs

--- PInvoke/Shell32/ShObjIdl.IFolderView.cs
+++ PInvoke/Shell32/ShObjIdl.IFolderView.cs
@@ -1,13 +1,98 @@
 using System;
 using System.Drawing;
 using System.Runtime.InteropServices;
-using System.Text;
 using static Vanara.PInvoke.Ole32;

 namespace Vanara.PInvoke
 {
 	public static partial class Shell32
 	{
+		public const int MAX_COLUMN_NAME_LEN = 80;
+
+		///
+		/// <para>
+		/// Used by members of the IColumnManager interface to specify which set of columns are being requested, either all or only those
+		/// currently visible.
+		/// </para>
+		///
+		// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/ne-shobjidl_core-cm_enum_flags typedef enum CM_ENUM_FLAGS {
+		// CM_ENUM_ALL, CM_ENUM_VISIBLE } ;
+		[PInvokeData("shobjidl_core.h", MSDNShortId = "9706ae59-d172-4518-8090-375b1a0ff4fb")]
+		public enum CM_ENUM_FLAGS
+		{
+			/// Enumerate all.
+			CM_ENUM_ALL = 0x00000001,
+
+			/// Enumerate visible.
+			CM_ENUM_VISIBLE = 0x00000002,
+		}
+
+		///
+		/// <para>Indicates which values in the CM_COLUMNINFO structure should be set during calls to IColumnManager::SetColumnInfo.</para>
+		///
+		// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/ne-shobjidl_core-cm_mask typedef enum CM_MASK { CM_MASK_WIDTH,
+		// CM_MASK_DEFAULTWIDTH, CM_MASK_IDEALWIDTH, CM_MASK_NAME, CM_MASK_STATE } ;
+		[PInvokeData("shobjidl_core.h", MSDNShortId = "c6ba9410-7c56-428c-9ad9-4e769c047863")]
+		public enum CM_MASK
+		{
+			/// The uWidth member is specified.
+			CM_MASK_WIDTH = 0x00000001,
+
+			/// The uDefaultWidth member is specified.
+			CM_MASK_DEFAULTWIDTH = 0x00000002,
+
+			/// The uIdealWidth member is specified.
+			CM_MASK_IDEALWIDTH = 0x00000004,
+
+			/// The wszName member is specified.
+			CM_MASK_NAME = 0x00000008,
+
+			/// The dwState member is specified.
+			CM_MASK_STATE = 0x00000010,
+		}
+
+		///
+		/// <para>
+		/// Specifies width values in pixels and includes special support for default and autosize. Used by members of the IColumnManager
+		/// interface through the CM_COLUMNINFO structure.
+		/// </para>
+		///
+		// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/ne-shobjidl_core-cm_set_width_value typedef enum
+		// CM_SET_WIDTH_VALUE { CM_WIDTH_USEDEFAULT, CM_WIDTH_AUTOSIZE } ;
+		[PInvokeData("shobjidl_core.h", MSDNShortId = "c5778bcc-fc9e-499a-b5e5-31c4f2df4871")]
+		public enum CM_SET_WIDTH_VALUE
+		{
+			/// Use the default width.
+			CM_WIDTH_USEDEFAULT = -1,
+
+			/// Use the auto-size width.
+			CM_WIDTH_AUTOSIZE = -2,
+		}
+
+		///
+		/// <para>Specifies column state values. Used by members of the IColumnManager interface through the CM_COLUMNINFO structure.</para>
+		///
+		// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/ne-shobjidl_core-cm_state typedef enum CM_STATE {
+		// CM_STATE_NONE, CM_STATE_VISIBLE, CM_STATE_FIXEDWIDTH, CM_STATE_NOSORTBYFOLDERNESS, CM_STATE_ALWAYSVISIBLE } ;
+		[PInvokeData("shobjidl_core.h", MSDNShortId = "a614dfdc-9535-40c4-9a17-5ab032113508")]
+		public enum CM_STATE
+		{
+			/// The column is not currently displayed.
+			CM_STATE_NONE = 0x00000000,
+
+			/// The column is currently displayed.
+			CM_STATE_VISIBLE = 0x00000001,
+
+			/// The column cannot be resized.
+			CM_STATE_FIXEDWIDTH = 0x00000002,
+
+			/// Do not sort folders separately.
+			CM_STATE_NOSORTBYFOLDERNESS = 0x00000004,
+
+			/// The column cannot be hidden.
+			CM_STATE_ALWAYSVISIBLE = 0x00000008,
+		}
+
 		/// Flags for <see cref="IFolderView2.SetText(FVTEXTTYPE, string)"/>.
 		[PInvokeData("shobjidl_core.h", MSDNShortId = "72528831-ec5d-417e-94dd-7345b5fd7de6")]
 		public enum FVTEXTTYPE
@@ -16,8 +101,131 @@
 			FVST_EMPTYTEXT = 0
 		}

+		/// The direction in which the items are sorted.
+		[PInvokeData("shobjidl_core.h", MSDNShortId = "3ca4c318-6462-4e22-813c-ef7b3ef03230")]
+		public enum SORTDIRECTION
+		{
+			///
+			/// The items are sorted in ascending order. Whether the sort is alphabetical, numerical, and so on, is determined by the data
+			/// type of the column indicated in <see cref="SORTCOLUMN.propkey"/>.
+			///
+			SORT_DESCENDING = -1,
+
+			///
+			/// The items are sorted in descending order. Whether the sort is alphabetical, numerical, and so on, is determined by the data
+			/// type of the column indicated in <see cref="SORTCOLUMN.propkey"/>.
+			///
+			SORT_ASCENDING = 1
+		}
+
 		///
-		/// Exposes methods that retrieve information about a folder's display options, select specified items in that folder, and set the folder's view mode.
+		/// Exposes methods that enable inspection and manipulation of columns in the Windows Explorer Details view. Each column is
+		/// referenced by a PROPERTYKEY structure, which names a property.
+		///
+		/// <remarks>
+		/// <para>
+		/// This interface can be accessed even when the Windows Explorer window is in a non-column view mode such as icons, thumbnails, or
+		/// tiles. It affects those views, as well as views in which the column header control displays the set of columns to which
+		/// <c>IColumnManager</c> provides access.
+		/// </para>
+		/// <para>
+		/// The default implementation of the Windows Explorer view object, created by SHCreateShellFolderViewEx, supports this interface
+		/// retrieved through QueryInterface. Code that runs in the Windows Explorer (such as view callbacks, context menus or drop targets)
+		/// can access the view object using IServiceProvider::QueryService, querying for <c>SID_SFolderView</c>.
+		/// </para>
+		/// </remarks>
+		// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nn-shobjidl_core-icolumnmanager
+		[PInvokeData("shobjidl_core.h", MSDNShortId = "d01cacd8-1867-4f44-bbc3-876bd727c0fe")]
+		[ComImport, Guid("d8ec27bb-3f3b-4042-b10a-4acfd924d453"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+		public interface IColumnManager
+		{
+			/// Sets the state for a specified column.
+			/// <param name="propkey">
+			/// <para>Type: <c>REFPROPERTYKEY</c></para>
+			/// <para>A reference to a PROPERTYKEY structure that identifies the column.</para>
+			/// </param>
+			/// <param name="pcmci">
+			/// <para>Type: <c>const CM_COLUMNINFO*</c></para>
+			/// <para>A pointer to a CM_COLUMNINFO structure that contains the state to set for this column.</para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-icolumnmanager-setcolumninfo HRESULT
+			// SetColumnInfo( REFPROPERTYKEY propkey, const CM_COLUMNINFO *pcmci );
+			void SetColumnInfo(in PROPERTYKEY propkey, in CM_COLUMNINFO pcmci);
+
+			/// Gets information about each column: width, visibility, display name, and state.
+			/// <param name="propkey">
+			/// <para>Type: <c>REFPROPERTYKEY</c></para>
+			/// <para>A reference to a PROPERTYKEY structure.</para>
+			/// </param>
+			/// <param name="pcmci">
+			/// <para>Type: <c>CM_COLUMNINFO*</c></para>
+			/// <para>
+			/// A pointer to a CM_COLUMNINFO structure. On entry, set this structure's <c>dwMask</c> member to specify the information to
+			/// retrieve. Also set its <c>cbSize</c> member. When this method returns successfully, the structure contains the requested information.
+			/// </para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-icolumnmanager-getcolumninfo HRESULT
+			// GetColumnInfo( REFPROPERTYKEY propkey, CM_COLUMNINFO *pcmci );
+			void GetColumnInfo(in PROPERTYKEY propkey, ref CM_COLUMNINFO pcmci);
+
+			/// Gets the column count for either the visible columns or the complete set of columns.
+			/// <param name="dwFlags">
+			/// <para>Type: <c>CM_ENUM_FLAGS</c></para>
+			/// <para>
+			/// A value from the CM_ENUM_FLAGS enumeration that specifies whether to show only visible columns or all columns regardless of visibility.
+			/// </para>
+			/// </param>
+			/// <returns>
+			/// <para>Type: <c>UINT*</c></para>
+			/// <para>Contains a pointer to the column count.</para>
+			/// </returns>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-icolumnmanager-getcolumncount HRESULT
+			// GetColumnCount( CM_ENUM_FLAGS dwFlags, UINT *puCount );
+			uint GetColumnCount(CM_ENUM_FLAGS dwFlags);
+
+			///
+			/// Gets an array of PROPERTYKEY structures that represent the columns that the view supports. Includes either all columns or
+			/// only those currently visible.
+			///
+			/// <param name="dwFlags">
+			/// <para>Type: <c>CM_ENUM_FLAGS</c></para>
+			/// <para>
+			/// A value from the CM_ENUM_FLAGS enumeration that specifies whether to show only visible columns or all columns regardless of visibility.
+			/// </para>
+			/// </param>
+			/// <param name="rgkeyOrder">
+			/// <para>Type: <c>PROPERTYKEY*</c></para>
+			/// <para>On success, contains a pointer to an array of PROPERTYKEY structures that represent the columns.</para>
+			/// </param>
+			/// <param name="cColumns">
+			/// <para>Type: <c>UINT</c></para>
+			/// <para>The length of the rgkeyOrder array.</para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-icolumnmanager-getcolumns HRESULT
+			// GetColumns( CM_ENUM_FLAGS dwFlags, PROPERTYKEY *rgkeyOrder, UINT cColumns );
+			void GetColumns(CM_ENUM_FLAGS dwFlags, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] PROPERTYKEY[] rgkeyOrder, uint cColumns);
+
+			/// Sets the collection of columns for the view to display.
+			/// <param name="rgkeyOrder">
+			/// <para>Type: <c>const PROPERTYKEY*</c></para>
+			/// <para>A pointer to an array of PROPERTYKEY structures that specify the columns to display.</para>
+			/// </param>
+			/// <param name="cVisible">
+			/// <para>Type: <c>UINT</c></para>
+			/// <para>The size of the rgkeyOrder array.</para>
+			/// </param>
+			/// <remarks>
+			/// <c>Note</c><c>IColumnManager::SetColumns</c> clears the state of all columns, so IColumnManager::SetColumnInfo must be called
+			/// afterward to set the state of individual columns.
+			/// </remarks>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-icolumnmanager-setcolumns HRESULT
+			// SetColumns( const PROPERTYKEY *rgkeyOrder, UINT cVisible );
+			void SetColumns([In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] PROPERTYKEY[] rgkeyOrder, uint cVisible);
+		}
+
+		///
+		/// Exposes methods that retrieve information about a folder's display options, select specified items in that folder, and set the
+		/// folder's view mode.
 		///
 		[ComImport, Guid("cde725b0-ccc9-4519-917e-325d72fab4ce"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 		[PInvokeData("Shobjidl.h", MSDNShortId = "bb761848")]
@@ -33,7 +241,10 @@

 			/// Gets the folder object.
 			/// <param name="riid">Reference to the desired IID to represent the folder.</param>
-			/// <param name="ppv">When this method returns, contains the interface pointer requested in <paramref name="riid"/>. This is typically IShellFolder or a related interface. This can also be an IShellItemArray with a single element.</param>
+			/// <param name="ppv">
+			/// When this method returns, contains the interface pointer requested in <paramref name="riid"/>. This is typically IShellFolder
+			/// or a related interface. This can also be an IShellItemArray with a single element.
+			/// </param>
 			[return: MarshalAs(UnmanagedType.IUnknown)]
 			object GetFolder(in Guid riid);

@@ -42,7 +253,9 @@
 			/// <param name="ppidl">The address of a pointer to a PIDL containing the item's identifier information.</param>
 			PIDL Item(int iItemIndex);

-			/// Gets the number of items in the folder. This can be the number of all items, or a subset such as the number of selected items.
+			///
+			/// Gets the number of items in the folder. This can be the number of all items, or a subset such as the number of selected items.
+			///
 			/// <param name="uFlags">Flags from the _SVGIO enumeration that limit the count to certain types of items.</param>
 			/// <returns>The number of items (files and folders) displayed in the folder view.</returns>
 			int ItemCount(SVGIO uFlags);
@@ -50,7 +263,10 @@
 			/// Gets the address of an enumeration object based on the collection of items in the folder view.
 			/// <param name="uFlags">_SVGIO values that limit the enumeration to certain types of items.</param>
 			/// <param name="riid">Reference to the desired IID to represent the folder.</param>
-			/// <param name="ppv">When this method returns, contains the interface pointer requested in <paramref name="riid"/>. This is typically an IEnumIDList, IDataObject, or IShellItemArray. If an error occurs, this value is NULL.</param>
+			/// <param name="ppv">
+			/// When this method returns, contains the interface pointer requested in <paramref name="riid"/>. This is typically an
+			/// IEnumIDList, IDataObject, or IShellItemArray. If an error occurs, this value is NULL.
+			/// </param>
 			[return: MarshalAs(UnmanagedType.IUnknown)]
 			object Items(SVGIO uFlags, in Guid riid);

@@ -67,11 +283,16 @@
 			/// <returns>The position of the item's upper-left corner.</returns>
 			Point GetItemPosition([In] PIDL pidl);

-			/// Gets a POINT structure containing the width (x) and height (y) dimensions, including the surrounding white space, of an item.
+			///
+			/// Gets a POINT structure containing the width (x) and height (y) dimensions, including the surrounding white space, of an item.
+			///
 			/// <returns>The current sizing dimensions of the items in the folder's view.</returns>
 			Point GetSpacing();

-			/// Gets a pointer to a POINT structure containing the default width (x) and height (y) measurements of an item, including the surrounding white space.
+			///
+			/// Gets a pointer to a POINT structure containing the default width (x) and height (y) measurements of an item, including the
+			/// surrounding white space.
+			///
 			/// <returns>The default sizing dimensions of the items in the folder's view.</returns>
 			Point GetDefaultSpacing();

@@ -88,15 +309,19 @@
 			/// Allows the selection and positioning of items visible in the folder's view.
 			/// <param name="cidl">The number of items to select.</param>
 			/// <param name="apidl">A pointer to an array of size <paramref name="cidl"/> that contains the PIDLs of the items.</param>
-			/// <param name="apt">A pointer to an array of <paramref name="cidl"/> structures containing the locations each corresponding element in <paramref name="apidl"/> should be positioned.</param>
+			/// <param name="apt">
+			/// A pointer to an array of <paramref name="cidl"/> structures containing the locations each corresponding element in <paramref
+			/// name="apidl"/> should be positioned.
+			/// </param>
 			/// <param name="dwFlags">One of the _SVSIF constants that specifies the type of selection to apply.</param>
 			void SelectAndPositionItems(uint cidl, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] PIDL[] apidl, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] Point[] apt, SVSIF dwFlags);
 		}

 		///
-		/// Exposes methods that retrieve information about a folder's display options, select specified items in that folder, and set the folder's view mode.
+		/// Exposes methods that retrieve information about a folder's display options, select specified items in that folder, and set the
+		/// folder's view mode.
 		///
-		/// <seealso cref="Vanara.PInvoke.Shell32.IFolderView" />
+		/// <seealso cref="Vanara.PInvoke.Shell32.IFolderView"/>
 		[ComImport, Guid("1af3a467-214f-4298-908e-06b03e0b39f9"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 		[PInvokeData("Shobjidl.h", MSDNShortId = "bb761848")]
 		public interface IFolderView2 : IFolderView
@@ -111,7 +336,10 @@

 			/// Gets the folder object.
 			/// <param name="riid">Reference to the desired IID to represent the folder.</param>
-			/// <param name="ppv">When this method returns, contains the interface pointer requested in <paramref name="riid"/>. This is typically IShellFolder or a related interface. This can also be an IShellItemArray with a single element.</param>
+			/// <param name="ppv">
+			/// When this method returns, contains the interface pointer requested in <paramref name="riid"/>. This is typically IShellFolder
+			/// or a related interface. This can also be an IShellItemArray with a single element.
+			/// </param>
 			[return: MarshalAs(UnmanagedType.IUnknown)]
 			new object GetFolder(in Guid riid);

@@ -120,7 +348,9 @@
 			/// <param name="ppidl">The address of a pointer to a PIDL containing the item's identifier information.</param>
 			new PIDL Item(int iItemIndex);

-			/// Gets the number of items in the folder. This can be the number of all items, or a subset such as the number of selected items.
+			///
+			/// Gets the number of items in the folder. This can be the number of all items, or a subset such as the number of selected items.
+			///
 			/// <param name="uFlags">Flags from the _SVGIO enumeration that limit the count to certain types of items.</param>
 			/// <returns>The number of items (files and folders) displayed in the folder view.</returns>
 			new int ItemCount(SVGIO uFlags);
@@ -128,7 +358,10 @@
 			/// Gets the address of an enumeration object based on the collection of items in the folder view.
 			/// <param name="uFlags">_SVGIO values that limit the enumeration to certain types of items.</param>
 			/// <param name="riid">Reference to the desired IID to represent the folder.</param>
-			/// <param name="ppv">When this method returns, contains the interface pointer requested in <paramref name="riid"/>. This is typically an IEnumIDList, IDataObject, or IShellItemArray. If an error occurs, this value is NULL.</param>
+			/// <param name="ppv">
+			/// When this method returns, contains the interface pointer requested in <paramref name="riid"/>. This is typically an
+			/// IEnumIDList, IDataObject, or IShellItemArray. If an error occurs, this value is NULL.
+			/// </param>
 			[return: MarshalAs(UnmanagedType.IUnknown)]
 			new object Items(SVGIO uFlags, in Guid riid);

@@ -145,11 +378,16 @@
 			/// <returns>The position of the item's upper-left corner.</returns>
 			new Point GetItemPosition([In] PIDL pidl);

-			/// Gets a POINT structure containing the width (x) and height (y) dimensions, including the surrounding white space, of an item.
+			///
+			/// Gets a POINT structure containing the width (x) and height (y) dimensions, including the surrounding white space, of an item.
+			///
 			/// <returns>The current sizing dimensions of the items in the folder's view.</returns>
 			new Point GetSpacing();

-			/// Gets a pointer to a POINT structure containing the default width (x) and height (y) measurements of an item, including the surrounding white space.
+			///
+			/// Gets a pointer to a POINT structure containing the default width (x) and height (y) measurements of an item, including the
+			/// surrounding white space.
+			///
 			/// <returns>The default sizing dimensions of the items in the folder's view.</returns>
 			new Point GetDefaultSpacing();

@@ -166,34 +404,60 @@
 			/// Allows the selection and positioning of items visible in the folder's view.
 			/// <param name="cidl">The number of items to select.</param>
 			/// <param name="apidl">A pointer to an array of size <paramref name="cidl"/> that contains the PIDLs of the items.</param>
-			/// <param name="apt">A pointer to an array of <paramref name="cidl"/> structures containing the locations each corresponding element in <paramref name="apidl"/> should be positioned.</param>
+			/// <param name="apt">
+			/// A pointer to an array of <paramref name="cidl"/> structures containing the locations each corresponding element in <paramref
+			/// name="apidl"/> should be positioned.
+			/// </param>
 			/// <param name="dwFlags">One of the _SVSIF constants that specifies the type of selection to apply.</param>
 			new void SelectAndPositionItems(uint cidl, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] PIDL[] apidl, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] Point[] apt, SVSIF dwFlags);

 			/// Groups the view by the given property key and direction.
-			/// <param name="key"><para>Type: <c>REFPROPERTYKEY</c></para>
-			/// <para>A PROPERTYKEY by which the view should be grouped.</para></param>
-			/// <param name="fAscending"><para>Type: <c>BOOL</c></para>
-			/// <para>A value of type <c>BOOL</c> to indicate sort order of the groups.</para></param>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setgroupby
-			// HRESULT SetGroupBy( REFPROPERTYKEY key, BOOL fAscending );
+			/// <param name="key">
+			/// <para>Type: <c>REFPROPERTYKEY</c></para>
+			/// <para>A PROPERTYKEY by which the view should be grouped.</para>
+			/// </param>
+			/// <param name="fAscending">
+			/// <para>Type: <c>BOOL</c></para>
+			/// <para>A value of type <c>BOOL</c> to indicate sort order of the groups.</para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setgroupby HRESULT
+			// SetGroupBy( REFPROPERTYKEY key, BOOL fAscending );
 			void SetGroupBy(in PROPERTYKEY key, [MarshalAs(UnmanagedType.Bool)] bool fAscending);

 			/// Retrieves the property and sort order used for grouping items in the folder display.
-			/// <param name="pkey"><para>Type: <c>PROPERTYKEY*</c></para>
-			/// <para>A pointer to the PROPERTYKEY by which the view is grouped.</para></param>
-			/// <param name="pfAscending"><para>Type: <c>BOOL*</c></para>
-			/// <para>A pointer to a value of type <c>BOOL</c> that indicates sort order of the groups.</para></param>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getgroupby
-			// HRESULT GetGroupBy( PROPERTYKEY *pkey, BOOL *pfAscending );
+			/// <param name="pkey">
+			/// <para>Type: <c>PROPERTYKEY*</c></para>
+			/// <para>A pointer to the PROPERTYKEY by which the view is grouped.</para>
+			/// </param>
+			/// <param name="pfAscending">
+			/// <para>Type: <c>BOOL*</c></para>
+			/// <para>A pointer to a value of type <c>BOOL</c> that indicates sort order of the groups.</para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getgroupby HRESULT
+			// GetGroupBy( PROPERTYKEY *pkey, BOOL *pfAscending );
 			void GetGroupBy(out PROPERTYKEY pkey, [MarshalAs(UnmanagedType.Bool)] out bool pfAscending);

 			///
-			///   <para>[This method is still implemented, but should be considered deprecated as of Windows 7. It might not be implemented in future versions of Windows. It cannot be used with items in search results or library views, so consider using the item's existing properties or, if applicable, emitting properties from your namespace or property handler. See Developing Property Handlers for Windows Search for more information.]</para><para>Caches a property for an item in the view's property cache.</para>
-			///
-			/// <param name="pidl"><para>Type: <c>PCUITEMID_CHILD</c></para><para>A PIDL that identifies the item.</para></param>
-			/// <param name="propkey"><para>Type: <c>REFPROPERTYKEY</c></para><para>The PROPERTYKEY which is to be stored.</para></param>
-			/// <param name="propvar"><para>Type: <c>const PROPVARIANT*</c></para><para>A pointer to a PROPVARIANT structure in which the PROPERTYKEY is stored.</para></param>
+			/// <para>
+			/// [This method is still implemented, but should be considered deprecated as of Windows 7. It might not be implemented in future
+			/// versions of Windows. It cannot be used with items in search results or library views, so consider using the item's existing
+			/// properties or, if applicable, emitting properties from your namespace or property handler. See Developing Property Handlers
+			/// for Windows Search for more information.]
+			/// </para>
+			/// <para>Caches a property for an item in the view's property cache.</para>
+			///
+			/// <param name="pidl">
+			/// <para>Type: <c>PCUITEMID_CHILD</c></para>
+			/// <para>A PIDL that identifies the item.</para>
+			/// </param>
+			/// <param name="propkey">
+			/// <para>Type: <c>REFPROPERTYKEY</c></para>
+			/// <para>The PROPERTYKEY which is to be stored.</para>
+			/// </param>
+			/// <param name="propvar">
+			/// <para>Type: <c>const PROPVARIANT*</c></para>
+			/// <para>A pointer to a PROPVARIANT structure in which the PROPERTYKEY is stored.</para>
+			/// </param>
 			/// <remarks>The property is displayed in the view, but not written to the underlying item.</remarks>
 			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setviewproperty
 			// DEPRECATED_HRESULT SetViewProperty( PCUITEMID_CHILD pidl, REFPROPERTYKEY propkey, REFPROPVARIANT propvar );
@@ -201,23 +465,52 @@
 			void SetViewProperty([In] PIDL pidl, in PROPERTYKEY propkey, [In] PROPVARIANT propvar);

 			///
-			///   <para>[This method is still implemented, but should be considered deprecated as of Windows 7. It might not be implemented in future versions of Windows. It cannot be used with items in search results or library views, so consider using the item's existing properties or, if applicable, emitting properties from your namespace or property handler. See Developing Property Handlers for Windows Search for more information.]</para><para>Gets a property value for a given property key from the view's cache.</para>
-			///
-			/// <param name="pidl"><para>Type: <c>PCUITEMID_CHILD</c></para><para>A pointer to an item identifier list (PIDL).</para></param>
-			/// <param name="propkey"><para>Type: <c>REFPROPERTYKEY</c></para><para>The PROPERTYKEY to be retrieved.</para></param>
-			/// <param name="ppropvar"><para>Type: <c>PROPVARIANT*</c></para><para>A pointer to a PROPVARIANT structure in which the PROPERTYKEY is stored.</para></param>
+			/// <para>
+			/// [This method is still implemented, but should be considered deprecated as of Windows 7. It might not be implemented in future
+			/// versions of Windows. It cannot be used with items in search results or library views, so consider using the item's existing
+			/// properties or, if applicable, emitting properties from your namespace or property handler. See Developing Property Handlers
+			/// for Windows Search for more information.]
+			/// </para>
+			/// <para>Gets a property value for a given property key from the view's cache.</para>
+			///
+			/// <param name="pidl">
+			/// <para>Type: <c>PCUITEMID_CHILD</c></para>
+			/// <para>A pointer to an item identifier list (PIDL).</para>
+			/// </param>
+			/// <param name="propkey">
+			/// <para>Type: <c>REFPROPERTYKEY</c></para>
+			/// <para>The PROPERTYKEY to be retrieved.</para>
+			/// </param>
+			/// <param name="ppropvar">
+			/// <para>Type: <c>PROPVARIANT*</c></para>
+			/// <para>A pointer to a PROPVARIANT structure in which the PROPERTYKEY is stored.</para>
+			/// </param>
 			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getviewproperty
 			// DEPRECATED_HRESULT GetViewProperty( PCUITEMID_CHILD pidl, REFPROPERTYKEY propkey, PROPVARIANT *ppropvar );
 			[Obsolete]
 			void GetViewProperty([In] PIDL pidl, in PROPERTYKEY propkey, [In, Out] PROPVARIANT ppropvar);

 			///
-			///   <para>[This method is still implemented, but should be considered deprecated as of Windows 7. It might not be implemented in future versions of Windows. It cannot be used with items in search results or library views, so consider using the item's existing properties or, if applicable, emitting properties from your namespace or property handler. See Developing Property Handlers for Windows Search for more information.]</para><para>Set the list of tile properties for an item.</para>
-			///
-			/// <param name="pidl"><para>Type: <c>PCUITEMID_CHILD</c></para><para>A pointer to an item identifier list (PIDL).</para></param>
-			/// <param name="pszPropList"><para>Type: <c>LPCWSTR</c></para><para>A pointer to a Unicode string containing a list of properties.</para></param>
+			/// <para>
+			/// [This method is still implemented, but should be considered deprecated as of Windows 7. It might not be implemented in future
+			/// versions of Windows. It cannot be used with items in search results or library views, so consider using the item's existing
+			/// properties or, if applicable, emitting properties from your namespace or property handler. See Developing Property Handlers
+			/// for Windows Search for more information.]
+			/// </para>
+			/// <para>Set the list of tile properties for an item.</para>
+			///
+			/// <param name="pidl">
+			/// <para>Type: <c>PCUITEMID_CHILD</c></para>
+			/// <para>A pointer to an item identifier list (PIDL).</para>
+			/// </param>
+			/// <param name="pszPropList">
+			/// <para>Type: <c>LPCWSTR</c></para>
+			/// <para>A pointer to a Unicode string containing a list of properties.</para>
+			/// </param>
 			/// <remarks>
-			/// The pszPropList parameter must be of the form "prop:<canonical-property-name>;<canonical-property-name>" where "<canonical-property-name>" is replaced by an actual canonical property name. The parameter can contain one or more properties delimited by semicolons.
+			/// The pszPropList parameter must be of the form "prop:<canonical-property-name>;<canonical-property-name>" where
+			/// "<canonical-property-name>" is replaced by an actual canonical property name. The parameter can contain one or more
+			/// properties delimited by semicolons.
 			/// </remarks>
 			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-settileviewproperties
 			// DEPRECATED_HRESULT SetTileViewProperties( PCUITEMID_CHILD pidl, LPCWSTR pszPropList );
@@ -225,12 +518,25 @@
 			void SetTileViewProperties([In] PIDL pidl, [MarshalAs(UnmanagedType.LPWStr)] string pszPropList);

 			///
-			///   <para>[This method is still implemented, but should be considered deprecated as of Windows 7. It might not be implemented in future versions of Windows. It cannot be used with items in search results or library views, so consider using the item's existing properties or, if applicable, emitting properties from your namespace or property handler. See Developing Property Handlers for Windows Search for more information.]</para><para>Sets the list of extended tile properties for an item.</para>
-			///
-			/// <param name="pidl"><para>Type: <c>PCUITEMID_CHILD</c></para><para>A pointer to an item identifier list (PIDL).</para></param>
-			/// <param name="pszPropList"><para>Type: <c>LPCWSTR</c></para><para>A pointer to a Unicode string containing a list of properties.</para></param>
+			/// <para>
+			/// [This method is still implemented, but should be considered deprecated as of Windows 7. It might not be implemented in future
+			/// versions of Windows. It cannot be used with items in search results or library views, so consider using the item's existing
+			/// properties or, if applicable, emitting properties from your namespace or property handler. See Developing Property Handlers
+			/// for Windows Search for more information.]
+			/// </para>
+			/// <para>Sets the list of extended tile properties for an item.</para>
+			///
+			/// <param name="pidl">
+			/// <para>Type: <c>PCUITEMID_CHILD</c></para>
+			/// <para>A pointer to an item identifier list (PIDL).</para>
+			/// </param>
+			/// <param name="pszPropList">
+			/// <para>Type: <c>LPCWSTR</c></para>
+			/// <para>A pointer to a Unicode string containing a list of properties.</para>
+			/// </param>
 			/// <remarks>
-			/// The pszPropList parameter must be of the form "prop:<canonical-property-name>;<canonical-property-name>" where "<canonical-property-name>" is an actual canonical property name. It can contain one or more properties delimited by semicolons.
+			/// The pszPropList parameter must be of the form "prop:<canonical-property-name>;<canonical-property-name>" where
+			/// "<canonical-property-name>" is an actual canonical property name. It can contain one or more properties delimited by semicolons.
 			/// </remarks>
 			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setextendedtileviewproperties
 			// DEPRECATED_HRESULT SetExtendedTileViewProperties( PCUITEMID_CHILD pidl, LPCWSTR pszPropList );
@@ -238,20 +544,35 @@
 			void SetExtendedTileViewProperties([In] PIDL pidl, [MarshalAs(UnmanagedType.LPWStr)] string pszPropList);

 			/// Sets the default text to be used when there are no items in the view.
-			/// <param name="iType"><para>Type: <c>FVTEXTTYPE</c></para><para>This value should be set to the following flag.</para><para>FVST_EMPTYTEXT</para><para>Set the text to display when there are no items in the view.</para></param>
-			/// <param name="pwszText"><para>Type: <c>LPCWSTR</c></para><para>A pointer to a Unicode string that contains the text to be used.</para></param>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-settext
-			// HRESULT SetText( FVTEXTTYPE iType, LPCWSTR pwszText );
+			/// <param name="iType">
+			/// <para>Type: <c>FVTEXTTYPE</c></para>
+			/// <para>This value should be set to the following flag.</para>
+			/// <para>FVST_EMPTYTEXT</para>
+			/// <para>Set the text to display when there are no items in the view.</para>
+			/// </param>
+			/// <param name="pwszText">
+			/// <para>Type: <c>LPCWSTR</c></para>
+			/// <para>A pointer to a Unicode string that contains the text to be used.</para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-settext HRESULT SetText(
+			// FVTEXTTYPE iType, LPCWSTR pwszText );
 			void SetText(FVTEXTTYPE iType, [MarshalAs(UnmanagedType.LPWStr)] string pwszText);

 			/// Sets and applies specified folder flags.
-			/// <param name="dwMask"><para>Type: <c>DWORD</c></para><para>The value of type <c>DWORD</c> that specifies the bitmask indicating which items in the structure are desired or valid.</para></param>
-			/// <param name="dwFlags"><para>Type: <c>DWORD</c></para><para>The value of type <c>DWORD</c> that contains one or more FOLDERFLAGS.</para></param>
+			/// <param name="dwMask">
+			/// <para>Type: <c>DWORD</c></para>
+			/// <para>The value of type <c>DWORD</c> that specifies the bitmask indicating which items in the structure are desired or valid.</para>
+			/// </param>
+			/// <param name="dwFlags">
+			/// <para>Type: <c>DWORD</c></para>
+			/// <para>The value of type <c>DWORD</c> that contains one or more FOLDERFLAGS.</para>
+			/// </param>
 			/// <remarks>
-			///   <c>For Windows 7 or later:</c> This method must be used in combination with the FVO_CUSTOMPOSITION flag from the FOLDERVIEWOPTIONS enumeration.
+			/// <c>For Windows 7 or later:</c> This method must be used in combination with the FVO_CUSTOMPOSITION flag from the
+			/// FOLDERVIEWOPTIONS enumeration.
 			/// </remarks>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setcurrentfolderflags
-			// HRESULT SetCurrentFolderFlags( DWORD dwMask, DWORD dwFlags );
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setcurrentfolderflags HRESULT
+			// SetCurrentFolderFlags( DWORD dwMask, DWORD dwFlags );
 			void SetCurrentFolderFlags(FOLDERFLAGS dwMask, FOLDERFLAGS dwFlags);

 			/// Gets the currently applied folder flags.
@@ -259,8 +580,8 @@
 			/// <para>Type: <c>DWORD*</c></para>
 			/// <para>A pointer to a <c>DWORD</c> with any FOLDERFLAGS that have been applied to the folder.</para>
 			/// </returns>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getcurrentfolderflags
-			// HRESULT GetCurrentFolderFlags( DWORD *pdwFlags );
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getcurrentfolderflags HRESULT
+			// GetCurrentFolderFlags( DWORD *pdwFlags );
 			FOLDERFLAGS GetCurrentFolderFlags();

 			/// Gets the count of sort columns currently applied to the view.
@@ -268,63 +589,87 @@
 			/// <para>Type: <c>int*</c></para>
 			/// <para>A pointer to an <c>int</c>.</para>
 			/// </returns>
-			/// <remarks>
-			/// Returns E_INVALIDARG if the column count provided does not equal the count of sort columns in the view.
-			/// </remarks>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getsortcolumncount
-			// HRESULT GetSortColumnCount( int *pcColumns );
+			/// <remarks>Returns E_INVALIDARG if the column count provided does not equal the count of sort columns in the view.</remarks>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getsortcolumncount HRESULT
+			// GetSortColumnCount( int *pcColumns );
 			int GetSortColumnCount();

 			/// Sets and sorts the view by the given sort columns.
-			/// <param name="rgSortColumns"><para>Type: <c>const SORTCOLUMN*</c></para><para>A pointer to a SORTCOLUMN structure. The size of this structure is determined by cColumns.</para></param>
-			/// <param name="cColumns"><para>Type: <c>int</c></para><para>The count of columns to sort by.</para></param>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setsortcolumns
-			// HRESULT SetSortColumns( const SORTCOLUMN *rgSortColumns, int cColumns );
+			/// <param name="rgSortColumns">
+			/// <para>Type: <c>const SORTCOLUMN*</c></para>
+			/// <para>A pointer to a SORTCOLUMN structure. The size of this structure is determined by cColumns.</para>
+			/// </param>
+			/// <param name="cColumns">
+			/// <para>Type: <c>int</c></para>
+			/// <para>The count of columns to sort by.</para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setsortcolumns HRESULT
+			// SetSortColumns( const SORTCOLUMN *rgSortColumns, int cColumns );
 			void SetSortColumns([In] SORTCOLUMN[] rgSortColumns, int cColumns);

 			/// Gets the sort columns currently applied to the view.
-			/// <param name="rgSortColumns"><para>Type: <c>const SORTCOLUMN*</c></para><para>A pointer to a SORTCOLUMN structure. The size of this structure is determined by cColumns.</para></param>
-			/// <param name="cColumns"><para>Type: <c>int</c></para><para>The count of columns to sort by.</para></param>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getsortcolumns
-			// HRESULT GetSortColumns( SORTCOLUMN *rgSortColumns, int cColumns );
+			/// <param name="rgSortColumns">
+			/// <para>Type: <c>const SORTCOLUMN*</c></para>
+			/// <para>A pointer to a SORTCOLUMN structure. The size of this structure is determined by cColumns.</para>
+			/// </param>
+			/// <param name="cColumns">
+			/// <para>Type: <c>int</c></para>
+			/// <para>The count of columns to sort by.</para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getsortcolumns HRESULT
+			// GetSortColumns( SORTCOLUMN *rgSortColumns, int cColumns );
 			void GetSortColumns([In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] SORTCOLUMN[] rgSortColumns, int cColumns);

 			/// Retrieves an object that represents a specified item.
-			/// <param name="iItem"><para>Type: <c>int</c></para><para>The zero-based index of the item to retrieve.</para></param>
-			/// <param name="riid"><para>Type: <c>REFIID</c></para><para>Reference to the desired IID to represent the item, such as IID_IShellItem.</para></param>
-			/// <param name="ppv"><para>Type: <c>void**</c></para><para>When this method returns, contains the interface pointer requested in <paramref name="riid"/>. This is typically IShellItem.</para></param>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getitem
-			// HRESULT GetItem( int iItem, REFIID riid, void **ppv );
+			/// <param name="iItem">
+			/// <para>Type: <c>int</c></para>
+			/// <para>The zero-based index of the item to retrieve.</para>
+			/// </param>
+			/// <param name="riid">
+			/// <para>Type: <c>REFIID</c></para>
+			/// <para>Reference to the desired IID to represent the item, such as IID_IShellItem.</para>
+			/// </param>
+			/// <param name="ppv">
+			/// <para>Type: <c>void**</c></para>
+			/// <para>When this method returns, contains the interface pointer requested in <paramref name="riid"/>. This is typically IShellItem.</para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getitem HRESULT GetItem( int
+			// iItem, REFIID riid, void **ppv );
 			void GetItem(int iItem, in Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object ppv);

 			/// Gets the next visible item in relation to a given index in the view.
-			/// <param name="iStart"><para>Type: <c>int</c></para>
-			/// <para>The zero-based position at which to start searching for a visible item.</para></param>
-			/// <param name="fPrevious"><para>Type: <c>BOOL</c></para>
-			/// <para>
-			///   <c>TRUE</c> to find the first visible item before iStart. <c>FALSE</c> to find the first visible item after iStart.</para></param>
-			/// <param name="piItem"><para>Type: <c>int*</c></para>
-			/// <para>When this method returns, contains a pointer to a value that receives the index of the visible item in the view.</para></param>
+			/// <param name="iStart">
+			/// <para>Type: <c>int</c></para>
+			/// <para>The zero-based position at which to start searching for a visible item.</para>
+			/// </param>
+			/// <param name="fPrevious">
+			/// <para>Type: <c>BOOL</c></para>
+			/// <para><c>TRUE</c> to find the first visible item before iStart. <c>FALSE</c> to find the first visible item after iStart.</para>
+			/// </param>
+			/// <param name="piItem">
+			/// <para>Type: <c>int*</c></para>
+			/// <para>When this method returns, contains a pointer to a value that receives the index of the visible item in the view.</para>
+			/// </param>
 			/// <returns>
 			/// <para>Type: <c>HRESULT</c></para>
 			/// <para>This method can return one of these values.</para>
 			/// <list type="table">
-			///   <listheader>
-			///     <term>Return code</term>
-			///     <term>Description</term>
-			///   </listheader>
-			///   <item>
-			///     <term>S_OK</term>
-			///     <term>Item retrieved.</term>
-			///   </item>
-			///   <item>
-			///     <term>S_FALSE</term>
-			///     <term>Item not found. Note that this is a success code.</term>
-			///   </item>
+			/// <listheader>
+			/// <term>Return code</term>
+			/// <term>Description</term>
+			/// </listheader>
+			/// <item>
+			/// <term>S_OK</term>
+			/// <term>Item retrieved.</term>
+			/// </item>
+			/// <item>
+			/// <term>S_FALSE</term>
+			/// <term>Item not found. Note that this is a success code.</term>
+			/// </item>
 			/// </list>
 			/// </returns>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getvisibleitem
-			// HRESULT GetVisibleItem( int iStart, BOOL fPrevious, int *piItem );
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getvisibleitem HRESULT
+			// GetVisibleItem( int iStart, BOOL fPrevious, int *piItem );
 			[PreserveSig]
 			HRESULT GetVisibleItem(int iStart, [MarshalAs(UnmanagedType.Bool)] bool fPrevious, out int piItem);

@@ -335,14 +680,18 @@
 			/// <para>Type: <c>HRESULT</c></para>
 			/// <para>Returns S_OK if a selected item was found, or an error value otherwise, including the following:</para>
 			/// <list type="table">
-			///   <listheader>
-			///     <term>Return code</term>
-			///     <term>Description</term>
-			///   </listheader>
-			///   <item>
-			///     <term>S_FALSE</term>
-			///     <term>Item not found. Note that this is a success code. The operation was successful in searching the view, it simply did not find a currently selected item after the given index (iStart). It is possible that no item was selected, or that the selected item had an index less than iStart.</term>
-			///   </item>
+			/// <listheader>
+			/// <term>Return code</term>
+			/// <term>Description</term>
+			/// </listheader>
+			/// <item>
+			/// <term>S_FALSE</term>
+			/// <term>
+			/// Item not found. Note that this is a success code. The operation was successful in searching the view, it simply did not find
+			/// a currently selected item after the given index (iStart). It is possible that no item was selected, or that the selected item
+			/// had an index less than iStart.
+			/// </term>
+			/// </item>
 			/// </list>
 			/// </returns>
 			[PreserveSig]
@@ -377,14 +726,16 @@
 			/// </item>
 			/// </list>
 			/// </returns>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getselection
-			// HRESULT GetSelection( BOOL fNoneImpliesFolder, IShellItemArray **ppsia );
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getselection HRESULT
+			// GetSelection( BOOL fNoneImpliesFolder, IShellItemArray **ppsia );
 			[PreserveSig]
 			HRESULT GetSelection([MarshalAs(UnmanagedType.Bool)] bool fNoneImpliesFolder, out IShellItemArray ppsia);

 			/// Gets the selection state including check state.
-			/// <param name="pidl"><para>Type: <c>PCUITEMID_CHILD</c></para>
-			/// <para>A PIDL of the item.</para></param>
+			/// <param name="pidl">
+			/// <para>Type: <c>PCUITEMID_CHILD</c></para>
+			/// <para>A PIDL of the item.</para>
+			/// </param>
 			/// <returns>
 			/// <para>Type: <c>DWORD*</c></para>
 			/// <para>
@@ -392,37 +743,55 @@
 			/// <c>SVSI_SELECT</c>, <c>SVSI_CHECK</c>, or <c>SVSI_CHECK2</c>. Other <c>_SVSIF</c> constants are not returned by this API.
 			/// </para>
 			/// </returns>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getselectionstate
-			// HRESULT GetSelectionState( PCUITEMID_CHILD pidl, DWORD *pdwFlags );
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getselectionstate HRESULT
+			// GetSelectionState( PCUITEMID_CHILD pidl, DWORD *pdwFlags );
 			SVSIF GetSelectionState([In] PIDL pidl);

 			/// Invokes the given verb on the current selection.
-			/// <param name="pszVerb"><para>Type: <c>LPCSTR</c></para><para>A pointer to a Unicode string containing a verb.</para></param>
+			/// <param name="pszVerb">
+			/// <para>Type: <c>LPCSTR</c></para>
+			/// <para>A pointer to a Unicode string containing a verb.</para>
+			/// </param>
 			/// <remarks>If pszVerb is <c>NULL</c>, then the default verb is invoked on the selection.</remarks>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-invokeverbonselection
-			// HRESULT InvokeVerbOnSelection( LPCSTR pszVerb );
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-invokeverbonselection HRESULT
+			// InvokeVerbOnSelection( LPCSTR pszVerb );
 			void InvokeVerbOnSelection([MarshalAs(UnmanagedType.LPWStr)] string pszVerb);

 			/// Sets and applies the view mode and image size.
-			/// <param name="uViewMode"><para>Type: <c>FOLDERVIEWMODE</c></para><para>The FOLDERVIEWMODE to be applied.</para></param>
-			/// <param name="iImageSize"><para>Type: <c>int</c></para><para>The size of the image in pixels.</para></param>
+			/// <param name="uViewMode">
+			/// <para>Type: <c>FOLDERVIEWMODE</c></para>
+			/// <para>The FOLDERVIEWMODE to be applied.</para>
+			/// </param>
+			/// <param name="iImageSize">
+			/// <para>Type: <c>int</c></para>
+			/// <para>The size of the image in pixels.</para>
+			/// </param>
 			/// <remarks>If iImageSize is -1 then the current default icon size for the view mode is used.</remarks>
 			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setviewmodeandiconsize
 			// HRESULT SetViewModeAndIconSize( FOLDERVIEWMODE uViewMode, int iImageSize );
 			void SetViewModeAndIconSize(FOLDERVIEWMODE uViewMode, int iImageSize);

 			/// Gets the current view mode and icon size applied to the view.
-			/// <param name="puViewMode"><para>Type: <c>FOLDERVIEWMODE*</c></para><para>A pointer to the current FOLDERVIEWMODE.</para></param>
-			/// <param name="piImageSize"><para>Type: <c>int*</c></para><para>A pointer to the size of the icon in pixels.</para></param>
+			/// <param name="puViewMode">
+			/// <para>Type: <c>FOLDERVIEWMODE*</c></para>
+			/// <para>A pointer to the current FOLDERVIEWMODE.</para>
+			/// </param>
+			/// <param name="piImageSize">
+			/// <para>Type: <c>int*</c></para>
+			/// <para>A pointer to the size of the icon in pixels.</para>
+			/// </param>
 			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getviewmodeandiconsize
 			// HRESULT GetViewModeAndIconSize( FOLDERVIEWMODE *puViewMode, int *piImageSize );
 			void GetViewModeAndIconSize(out FOLDERVIEWMODE puViewMode, out int piImageSize);

 			/// Turns on group subsetting and sets the number of visible rows of items in each group.
-			/// <param name="cVisibleRows"><para>Type: <c>UINT</c></para><para>The number of rows to be visible.</para></param>
+			/// <param name="cVisibleRows">
+			/// <para>Type: <c>UINT</c></para>
+			/// <para>The number of rows to be visible.</para>
+			/// </param>
 			/// <remarks>If cVisibleRows is zero, subsetting is turned off.</remarks>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setgroupsubsetcount
-			// HRESULT SetGroupSubsetCount( UINT cVisibleRows );
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setgroupsubsetcount HRESULT
+			// SetGroupSubsetCount( UINT cVisibleRows );
 			void SetGroupSubsetCount(uint cVisibleRows);

 			/// Gets the count of visible rows displayed for a group's subset.
@@ -431,59 +800,193 @@
 			/// <para>The number of rows currently visible.</para>
 			/// </returns>
 			/// <remarks>If group subsetting is disabled the number of rows is zero.</remarks>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getgroupsubsetcount
-			// HRESULT GetGroupSubsetCount( UINT *pcVisibleRows );
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-getgroupsubsetcount HRESULT
+			// GetGroupSubsetCount( UINT *pcVisibleRows );
 			uint GetGroupSubsetCount();

 			/// Sets redraw on and off.
-			/// <param name="fRedrawOn"><para>Type: <c>BOOL</c></para><para>a <c>BOOL</c> value.</para></param>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setredraw
-			// HRESULT SetRedraw( BOOL fRedrawOn );
+			/// <param name="fRedrawOn">
+			/// <para>Type: <c>BOOL</c></para>
+			/// <para>a <c>BOOL</c> value.</para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-setredraw HRESULT SetRedraw(
+			// BOOL fRedrawOn );
 			void SetRedraw([MarshalAs(UnmanagedType.Bool)] bool fRedrawOn);

 			///
 			/// Checks to see if this view sourced the current drag-and-drop or cut-and-paste operation (used by drop target objects).
 			///
 			/// <returns>
-			///   <para>Type: <c>HRESULT</c></para><para>If this method succeeds, it returns <c>S_OK</c>. Otherwise, it returns an <c>HRESULT</c> error code.</para>
+			/// <para>Type: <c>HRESULT</c></para>
+			/// <para>If this method succeeds, it returns <c>S_OK</c>. Otherwise, it returns an <c>HRESULT</c> error code.</para>
 			/// </returns>
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-ismoveinsamefolder
-			// HRESULT IsMoveInSameFolder( );
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-ismoveinsamefolder HRESULT
+			// IsMoveInSameFolder( );
 			[PreserveSig]
 			HRESULT IsMoveInSameFolder();

 			/// Starts a rename operation on the current selection.
-			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-dorename
-			// HRESULT DoRename( );
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifolderview2-dorename HRESULT DoRename( );
 			void DoRename();
+		}
+
+		///
+		/// <para>Exposes methods that hold items from a data object.</para>
+		/// <para>
+		/// An <c>IResultsFolder</c> is a folder that can hold items from all over the namespace and represent them to the user in a single folder.
+		/// </para>
+		///
+		// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl/nn-shobjidl-iresultsfolder
+		[PInvokeData("shobjidl.h", MSDNShortId = "db44052b-bd26-412f-9f2a-66a0c53b65ac")]
+		[ComImport, Guid("96E5AE6D-6AE1-4b1c-900C-C6480EAA8828"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+		public interface IResultsFolder
+		{
+			/// Adds an item to a results folder.
+			/// <param name="psi">
+			/// <para>Type: <c>IShellItem*</c></para>
+			/// <para>A pointer to an IShellItem.</para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl/nf-shobjidl-iresultsfolder-additem HRESULT AddItem( IShellItem
+			// *psi );
+			void AddItem([In] IShellItem psi);
+
+			/// Inserts a pointer to an item identifier list (PIDL) into a results folder.
+			/// <param name="pidl">
+			/// <para>Type: <c>PCIDLIST_ABSOLUTE</c></para>
+			/// <para>A pointer to the IDList of the given object relative to the Desktop.</para>
+			/// </param>
+			/// <param name="ppidlAdded">
+			/// <para>Type: <c>PITEMID_CHILD*</c></para>
+			/// <para>A PIDL consisting of 0 or 1 SHITEMID structures, relative to a parent folder. This parameter maybe <c>NULL</c>.</para>
+			/// </param>
+			/// <remarks>
+			/// The PIDL received represents the item that was just added and is a unique representation of this item generated by this
+			/// results folder. It is only valid when used in reference to this results folder and should not be combined with a PIDL to
+			/// another folder, including the folder this item originally came from.
+			/// </remarks>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl/nf-shobjidl-iresultsfolder-addidlist HRESULT AddIDList(
+			// PCIDLIST_ABSOLUTE pidl, PITEMID_CHILD *ppidlAdded );
+			void AddIDList([In] PIDL pidl, out PIDL ppidlAdded);
+
+			/// Removes an item from a results folder.
+			/// <param name="psi">
+			/// <para>Type: <c>IShellItem*</c></para>
+			/// <para>A pointer to an IShellItem.</para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl/nf-shobjidl-iresultsfolder-removeitem HRESULT RemoveItem(
+			// IShellItem *psi );
+			void RemoveItem([In] IShellItem psi);
+
+			/// Removes a pointer to an item identifier list (PIDL) from a results folder.
+			/// <param name="pidl">
+			/// <para>Type: <c>PCIDLIST_ABSOLUTE</c></para>
+			/// <para>A PIDL relative to the Desktop.</para>
+			/// </param>
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl/nf-shobjidl-iresultsfolder-removeidlist HRESULT RemoveIDList(
+			// PCIDLIST_ABSOLUTE pidl );
+			void RemoveIDList([In] PIDL pidl);
+
+			/// Removes all items from a results folder.
+			// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl/nf-shobjidl-iresultsfolder-removeall HRESULT RemoveAll( );
+			void RemoveAll();
+		}
+
+		///
+		/// <para>Defines column information. Used by members of the IColumnManager interface.</para>
+		///
+		// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/ns-shobjidl_core-cm_columninfo typedef struct CM_COLUMNINFO {
+		// DWORD cbSize; DWORD dwMask; DWORD dwState; UINT uWidth; UINT uDefaultWidth; UINT uIdealWidth; WCHAR wszName[80]; } CM_COLUMNINFO;
+		[PInvokeData("shobjidl_core.h", MSDNShortId = "b4437aa7-9682-4819-a353-936179e84005")]
+		[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
+		public struct CM_COLUMNINFO
+		{
+			///
+			/// <para>Type: <c>DWORD</c></para>
+			/// <para>The size of the structure, in bytes.</para>
+			///
+			public uint cbSize;
+
+			///
+			/// <para>Type: <c>DWORD</c></para>
+			/// <para>One or more values from the CM_MASK enumeration that specify which members of this structure are valid.</para>
+			///
+			public CM_MASK dwMask;
+
+			///
+			/// <para>Type: <c>DWORD</c></para>
+			/// <para>One or more values from the CM_STATE enumeration that specify the state of the column.</para>
+			///
+			public CM_STATE dwState;
+
+			///
+			/// <para>Type: <c>UINT</c></para>
+			/// <para>One of the members of the CM_SET_WIDTH_VALUE enumeration that specifies the column width.</para>
+			///
+			public CM_SET_WIDTH_VALUE uWidth;
+
+			///
+			/// <para>Type: <c>UINT</c></para>
+			/// <para>The default width of the column.</para>
+			///
+			public uint uDefaultWidth;
+
+			///
+			/// <para>Type: <c>UINT</c></para>
+			/// <para>The ideal width of the column.</para>
+			///
+			public uint uIdealWidth;
+
+			///
+			/// <para>Type: <c>WCHAR[MAX_COLUMN_NAME_LEN]</c></para>
+			/// <para>A buffer of size MAX_COLUMN_NAME_LEN that contains the name of the column as a null-terminated Unicode string.</para>
+			///
+			[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_COLUMN_NAME_LEN)]
+			public string wszName;
+
+			/// Initializes a new instance of the <see cref="CM_COLUMNINFO"/> struct for retrieval of specified items.
+			/// <param name="mask">The mask of items to retrieve.</param>
+			public CM_COLUMNINFO(CM_MASK mask) : this()
+			{
+				cbSize = (uint)Marshal.SizeOf(this);
+				dwMask = mask;
+			}
 		}

 		/// Stores information about how to sort a column that is displayed in the folder view.
 		/// <remarks>
-		/// Each column displayed in the folder view (for example, "details" view mode), is associated with a property that has a PROPERTYKEY ID. When you want to sort the view by a particular property, you specify the property key for that property.
+		/// Each column displayed in the folder view (for example, "details" view mode), is associated with a property that has a PROPERTYKEY
+		/// ID. When you want to sort the view by a particular property, you specify the property key for that property.
 		/// </remarks>
-		// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/ns-shobjidl_core-sortcolumn
-		// typedef struct SORTCOLUMN { PROPERTYKEY propkey; SORTDIRECTION direction; } SORTCOLUMN;
+		// https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/ns-shobjidl_core-sortcolumn typedef struct SORTCOLUMN {
+		// PROPERTYKEY propkey; SORTDIRECTION direction; } SORTCOLUMN;
 		[PInvokeData("shobjidl_core.h", MSDNShortId = "3ca4c318-6462-4e22-813c-ef7b3ef03230")]
 		[StructLayout(LayoutKind.Sequential)]
 		public struct SORTCOLUMN
 		{
-			/// <para>Type: <c>PROPERTYKEY</c></para><para>The ID of the column by which the user will sort. A PROPERTYKEY structure. For example, for the "Name" column, the property key is PKEY_ItemNameDisplay.</para>
+			///
+			/// <para>Type: <c>PROPERTYKEY</c></para>
+			/// <para>
+			/// The ID of the column by which the user will sort. A PROPERTYKEY structure. For example, for the "Name" column, the property
+			/// key is PKEY_ItemNameDisplay.
+			/// </para>
+			///
 			public PROPERTYKEY propkey;
-			/// <para>Type: <c>SORTDIRECTION</c></para><para>The direction in which the items are sorted. One of the following values.</para><para>SORT_DESCENDING</para><para>The items are sorted in ascending order. Whether the sort is alphabetical, numerical, and so on, is determined by the data type of the column indicated in <c>propkey</c>.</para><para>SORT_ASCENDING</para><para>The items are sorted in descending order. Whether the sort is alphabetical, numerical, and so on, is determined by the data type of the column indicated in <c>propkey</c>.</para>
+
+			///
+			/// <para>Type: <c>SORTDIRECTION</c></para>
+			/// <para>The direction in which the items are sorted. One of the following values.</para>
+			/// <para>SORT_DESCENDING</para>
+			/// <para>
+			/// The items are sorted in ascending order. Whether the sort is alphabetical, numerical, and so on, is determined by the data
+			/// type of the column indicated in <c>propkey</c>.
+			/// </para>
+			/// <para>SORT_ASCENDING</para>
+			/// <para>
+			/// The items are sorted in descending order. Whether the sort is alphabetical, numerical, and so on, is determined by the data
+			/// type of the column indicated in <c>propkey</c>.
+			/// </para>
+			///
 			public SORTDIRECTION direction;
-		}
-
-		///
-		/// The direction in which the items are sorted.
-		///
-		[PInvokeData("shobjidl_core.h", MSDNShortId = "3ca4c318-6462-4e22-813c-ef7b3ef03230")]
-		public enum SORTDIRECTION
-		{
-			/// The items are sorted in ascending order. Whether the sort is alphabetical, numerical, and so on, is determined by the data type of the column indicated in <see cref="SORTCOLUMN.propkey"/>.
-			SORT_DESCENDING = -1,
-			/// The items are sorted in descending order. Whether the sort is alphabetical, numerical, and so on, is determined by the data type of the column indicated in <see cref="SORTCOLUMN.propkey"/>.
-			SORT_ASCENDING = 1
 		}
 	}
 }


implemented AudioExtractionProcess

implemented AudioExtractionProcess

--- processing/AudioExtractionProcess.cs
+++ processing/AudioExtractionProcess.cs
@@ -1,19 +1,91 @@
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using de.fhb.oll.mediacategorizer.model;
+using de.fhb.oll.mediacategorizer.tools;

 namespace de.fhb.oll.mediacategorizer.processing
 {
     class AudioExtractionProcess : ProcessBase
     {
-        public AudioExtractionProcess(params IProcess[] dependencies)
+        private FfmpegTool ffmpeg;
+
+        private Queue<Action> taskQueue;
+        private readonly AutoResetEvent finishedEvent = new AutoResetEvent(false);
+
+        public AudioExtractionProcess(params IProcess[] dependencies)
             : base("Extraktion der Audiospur", dependencies)
         { }

+        private string BuildAudioPath(Media media)
+        {
+            return Path.Combine(Project.GetWorkingDirectory(), string.Format("{0}.wav", media.Id));
+        }
+
         protected override void Work()
         {
-            throw new NotImplementedException();
+            InitializeTool();
+            var media = Project.Media.ToArray();
+            taskQueue = new Queue<Action>();
+            for (var i = 0; i < media.Length; i++)
+            {
+                var i_ = i;
+                taskQueue.Enqueue(() => ProcessMedia(media[i_], media.Length, i_));
+            }
+            ProcessNextItem();
+            finishedEvent.WaitOne();
+            if (ErrorMessage == null)
+            {
+                WorkItem = null;
+                OnProgress(1, "abgeschlossen");
+            }
+        }
+
+        private void InitializeTool()
+        {
+            if (ffmpeg == null)
+            {
+                ffmpeg = (FfmpegTool)ToolProvider.Create(typeof(FfmpegTool));
+            }
+        }
+
+        private void ProcessNextItem()
+        {
+            if (taskQueue.Count == 0)
+            {
+                finishedEvent.Set();
+            }
+            else
+            {
+                Task.Run(taskQueue.Dequeue());
+            }
+        }
+
+        private void ProcessMedia(Media m, int total, int no)
+        {
+            WorkItem = m.Name;
+            m.AudioFile = BuildAudioPath(m);
+            OnProgress(CalculateProgress(total, no, 0), "Audiodaten als 16Bit PCM Wave Mono speichern...");
+            if (File.Exists(m.AudioFile))
+            {
+                ProcessNextItem();
+                return;
+            }
+            var success = ffmpeg.ExtractAudio(m.MediaFile, m.AudioFile, p => OnProgress(CalculateProgress(total, no, p)));
+            if (success)
+            {
+                ProcessNextItem();
+            }
+            else
+            {
+                OnError("ffmpeg wurde mit einem Fehler beendet");
+                finishedEvent.Set();
+            }
         }
     }
 }


Throw NotImplementedException for features not supported by WinAppDriver

--- appium-dotnet-driver/Appium/Windows/WindowsDriver.cs
+++ appium-dotnet-driver/Appium/Windows/WindowsDriver.cs
@@ -103,7 +103,8 @@
         /// <returns>First element found</returns>
         public W FindElementByWindowsUIAutomation(string selector)
         {
-            return (W)this.FindElement("-windows uiautomation", selector);
+            //return (W)this.FindElement("-windows uiautomation", selector);
+            throw new NotImplementedException();
         }

         /// <summary>
@@ -113,8 +114,9 @@
         /// <returns>ReadOnlyCollection of elements found</returns>
         public ReadOnlyCollection<W> FindElementsByWindowsUIAutomation(string selector)
         {
-            return CollectionConverterUnility.ConvertToExtendedWebElementCollection<W>(
-                this.FindElements("-windows uiautomation", selector));
+            //return CollectionConverterUnility.ConvertToExtendedWebElementCollection<W>(
+            //    this.FindElements("-windows uiautomation", selector));
+            throw new NotImplementedException();
         }

         #endregion IFindByWindowsUIAutomation Members


New comment layout, updated Multiport tests

--- IPTables.Net.Tests/RuleBuilderMultiportTests.cs
+++ IPTables.Net.Tests/RuleBuilderMultiportTests.cs
@@ -34,8 +34,8 @@

             Assert.AreEqual(1, rules.Chains.Count());
             Assert.AreEqual(2, rules.Chains.First().Rules.Count);
-            Assert.AreEqual("-A INPUT -s 8.1.1.1 -j ACCEPT -m comment --comment '_|QGkTSfSaLIaS4B/kr3WQ|1' -m multiport --sports 1:2", rules.Chains.First().Rules.First().GetActionCommand());
-            Assert.AreEqual("-A INPUT -s 8.1.1.2 -j ACCEPT -m comment --comment '_|ciE0aMcfwN36u0sNiC6w|1' -m multiport --sports 3", rules.Chains.First().Rules.Skip(1).First().GetActionCommand());
+            Assert.AreEqual("-A INPUT -s 8.1.1.1 -j ACCEPT -m comment --comment '_|uXTlO5H/5x9hJe9WK1hw|1' -m multiport --sports 1:2", rules.Chains.First().Rules.First().GetActionCommand());
+            Assert.AreEqual("-A INPUT -s 8.1.1.2 -j ACCEPT -m comment --comment '_|s5FXv5bN+84QgKZzjZ3Q|1' -m multiport --sports 3", rules.Chains.First().Rules.Skip(1).First().GetActionCommand());
         }

         [Test]
@@ -72,11 +72,11 @@

             Assert.AreEqual(2, rules.Chains.Count());
             Assert.AreEqual(1, rules.Chains.GetChainOrDefault("INPUT","filter").Rules.Count);
-            Assert.AreEqual("-A INPUT -s 8.1.1.1 -j QGkTSfSaLIaS4B/kr3WQ -m comment --comment '_|MA|INPUT_8.1.1.1'",
+            Assert.AreEqual("-A INPUT -s 8.1.1.1 -j uXTlO5H/5x9hJe9WK1hw -m comment --comment '_|MA|INPUT_8.1.1.1'",
                 rules.Chains.GetChainOrDefault("INPUT", "filter").Rules.First().GetActionCommand());

-            Assert.AreEqual("-A QGkTSfSaLIaS4B/kr3WQ -j ACCEPT -m comment --comment '_|QGkTSfSaLIaS4B/kr3WQ|1' -m multiport --sports 10,20,30,40,50,60,70,80,90,100,110,120,130,140,150",
-                rules.Chains.GetChainOrDefault("QGkTSfSaLIaS4B/kr3WQ", "filter").Rules.First().GetActionCommand());
+            Assert.AreEqual("-A uXTlO5H/5x9hJe9WK1hw -j ACCEPT -m comment --comment '_|uXTlO5H/5x9hJe9WK1hw|1' -m multiport --sports 10,20,30,40,50,60,70,80,90,100,110,120,130,140,150",
+                rules.Chains.GetChainOrDefault("uXTlO5H/5x9hJe9WK1hw", "filter").Rules.First().GetActionCommand());
         }

         private void setSourceIp(IpTablesRule arg1, IPAddress arg2)


Bumped ver

Bumped ver

--- Iag.Unity.DataAccess/Properties/AssemblyInfo.cs
+++ Iag.Unity.DataAccess/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.6.0")]
-[assembly: AssemblyFileVersion("1.0.6.0")]
+[assembly: AssemblyVersion("1.0.7.0")]
+[assembly: AssemblyFileVersion("1.0.7.0")]


Do not draw insertion caret if dragged items are not files. Fixes Issue 139.

--- ImageListView/ImageListViewNavigationManager.cs
+++ ImageListView/ImageListViewNavigationManager.cs
@@ -854,7 +854,8 @@
             /// </summary>
             public void DragOver(DragEventArgs e)
             {
-                if (mImageListView.AllowDrop || (mImageListView.AllowDrag && selfDragging))
+                if (e.Data.GetDataPresent(DataFormats.FileDrop) &&
+                    (mImageListView.AllowDrop || (mImageListView.AllowDrag && selfDragging)))
                 {
                     if (mImageListView.Items.Count == 0)
                     {
@@ -959,11 +960,8 @@
             /// </summary>
             public void DragLeave()
             {
-                if (mImageListView.AllowDrag && selfDragging)
-                {
-                    DropTarget = null;
-                    mImageListView.Refresh(true);
-                }
+                DropTarget = null;
+                mImageListView.Refresh(true);

                 if (scrollTimer.Enabled)
                     scrollTimer.Enabled = false;


日時フィールドのエディタ書式から秒が扱える書式を削除。

日時フィールドのエディタ書式から秒が扱える書式を削除。

--- Implem.Pleasanter/Models/Sites/SiteUtilities.cs
+++ Implem.Pleasanter/Models/Sites/SiteUtilities.cs
@@ -2221,7 +2221,7 @@
         {
             return forControl
                 ? DisplayAccessor.Displays.DisplayHash
-                    .Where(o => new string[] { "Ymd", "Ymdhm", "Ymdhms" }.Contains(o.Key))
+                    .Where(o => new string[] { "Ymd", "Ymdhm" }.Contains(o.Key))
                     .ToDictionary(o => o.Key, o => Displays.Get(o.Key))
                 : DisplayAccessor.Displays.DisplayHash
                     .Where(o => o.Value.Type == DisplayAccessor.Displays.Types.Date)


Renamed the dummy translator which raise exception if it will be called anytime.

--- it.unifi.dsi.stlab.networkreasoner.gas.system/exactly-dimensioned-instance/NetwonRaphsonSystem.cs
+++ it.unifi.dsi.stlab.networkreasoner.gas.system/exactly-dimensioned-instance/NetwonRaphsonSystem.cs
@@ -61,12 +61,15 @@

 			this.UnknownVector = new DimensionalObjectWrapperWithoutDimension<
 				Vector<NodeForNetwonRaphsonSystem>> {
-				WrappedObject = new Vector<NodeForNetwonRaphsonSystem> ()};
+				WrappedObject = new Vector<NodeForNetwonRaphsonSystem> ()
+			};

 			var initialUnknownGuessVector = this.makeInitialGuessForUnknowns (
 				new UnknownInitializationSimplyRandomized (), network);

-			network.doOnNodes (new NodeHandlerWithDelegateOnRawNode<GasNodeAbstract> (aNode => {
+			network.doOnNodes (new NodeHandlerWithDelegateOnRawNode<GasNodeAbstract> (
+				aNode => {
+
 				var newtonRaphsonNode = new NodeForNetwonRaphsonSystem ();
 				newtonRaphsonNode.initializeWith (aNode);

@@ -109,7 +112,7 @@
 				var value = unknownInitialization.initialValueFor (aVertex, rand);

 				initialUnknowns.Add (aVertex, value.makeAdimensional (
-					thisDimensionalTranslatorShouldNeverBeCalled).WrappedObject
+					throwExceptionIfThisTranslatorIsCalled).WrappedObject
 				);
 			}
 			)
@@ -118,8 +121,8 @@
 			return initialUnknowns;
 		}

-		protected virtual double thisDimensionalTranslatorShouldNeverBeCalled (
-			double aDimensionalValue)
+		protected virtual T throwExceptionIfThisTranslatorIsCalled<T> (
+			T aDimensionalValue)
 		{
 			throw new Exception ("dimensional -> adimensional translation " +
 				"requested where it shouldn't for initial unknown guess value."
@@ -327,6 +330,12 @@
 			this.EventsListener.onMutateStepStarted (iterationNumber);

 			var unknownVectorAtPreviousStep = this.computeUnknownVectorAtPreviousStep ();
+
+			// we perform the adimensional translation just to ensure that we're
+			// working with adimensional objects, since the translator raise an exception
+			// if it is called.
+			unknownVectorAtPreviousStep = unknownVectorAtPreviousStep.makeAdimensional (
+				throwExceptionIfThisTranslatorIsCalled);

 			var FvectorAtPreviousStep = this.computeFvectorAtPreviousStep ();

@@ -587,7 +596,7 @@
 		public DimensionalObjectWrapper<Vector<NodeForNetwonRaphsonSystem>> makeUnknownsDimensional (
 			DimensionalObjectWrapper<Vector<NodeForNetwonRaphsonSystem>> adimensionalWrapper)
 		{
-			var result = adimensionalWrapper.makeAdimensional (
+			var result = adimensionalWrapper.makeDimensional (
 				fromAdimensionalUnknownsToDimensionalUnknowns);

 			this.EventsListener.onUnknownWithDimensionReverted (


Remove documentation.

Remove documentation.

--- source/Nuke.Core/BuildServers/TeamServices.cs
+++ source/Nuke.Core/BuildServers/TeamServices.cs
@@ -28,302 +28,66 @@
             _messageSink = messageSink ?? Console.WriteLine;
         }

-        ///
-        /// The local path on the agent where all folders for a given build definition are created.
-        /// For example: <c>C:\agent\_work\1</c>.
-        ///
         public string AgentBuildDirectory => EnsureVariable("AGENT_BUILDDIRECTORY");
-
-        ///
-        /// The directory the agent is installed into. This contains the agent software.
-        /// For example: <c>C:\agent</c>. If you are using an on-premises agent, this directory is specified by you.
-        /// See Agents.
-        ///
         public string AgentHomeDirectory => EnsureVariable("AGENT_HOMEDIRECTORY");
-
-        ///
-        /// The ID of the agent.
-        ///
         public long AgentId => EnsureVariable<long>("AGENT_ID");
-
-        ///
-        /// The status of the build.
-        ///
         public TeamServicesJobStatus AgentJobStatus => EnsureVariable<TeamServicesJobStatus>("AGENT_JOBSTATUS");
-
-        ///
-        /// The name of the machine on which the agent is installed.
-        ///
         public string AgentMachineName => EnsureVariable("AGENT_MACHINENAME");
-
-        ///
-        /// The name of the agent that is registered with the pool.
-        /// If you are using an on-premises agent, this directory is specified by you.
-        /// See Agents.
-        ///
         public string AgentName => EnsureVariable("AGENT_NAME");
-
-        ///
-        /// The working directory for this agent. For example: <c>C:\agent\_work</c>.
-        ///
         public string AgentWorkFolder => EnsureVariable("AGENT_WORKFOLDER");
-
-        ///
-        /// The local path on the agent where any artifacts are copied to before being pushed to their destination.
-        /// For example: <c>c:\agent\_work\1\a</c>.
-        /// <para/>
-        /// A typical way to use this folder is to publish your build artifacts with the
-        /// Copy files and
-        /// Publish build artifacts steps.
-        /// <para/>
-        /// Note: This directory is purged before each new build, so you don't have to clean it up yourself.
-        /// <para/>
-        /// <see cref="ArtifactStagingDirectory"/> and <see cref="StagingDirectory"/> are interchangeable.
-        /// <para/>
-        /// See Artifacts in Team Build.
-        ///
         public string ArtifactStagingDirectory => EnsureVariable("BUILD_ARTIFACTSTAGINGDIRECTORY");
-
-        ///
-        /// The ID of the record for the completed build.
-        ///
         public long BuildId => EnsureVariable<long>("BUILD_BUILDID");
-
-        ///
-        /// The name of the completed build. You can specify the build number format that generates this value in the
-        /// definition options.
-        /// <para/>
-        /// A typical use of this variable is to make it part of the label format, which you specify on the
-        /// repository tab.
-        /// <para/>
-        /// Note: This value can contain whitespace or other invalid label characters. In these cases, the
-        /// label format will fail.
-        ///
         public long BuildNumber => EnsureVariable<long>("BUILD_BUILDNUMBER");
-
-        ///
-        /// The URI for the build. For example: <c>vstfs:///Build/Build/1430</c>.
-        ///
         public string BuildUri => EnsureVariable("BUILD_BUILDURI");
-
-        ///
-        /// The local path on the agent you can use as an output folder for compiled binaries. For example: <c>C:\agent\_work\1\b</c>.
-        /// <para/>
-        /// By default, new build definitions are not set up to clean this directory. You can define your build to clean it up on the
-        /// Repository tab.
-        ///
         public string BinariesDirectory => EnsureVariable("BUILD_BINARIESDIRECTORY");
-
-        ///
-        /// The name of the build definition.
-        /// <para/>
-        /// Note: This value can contain whitespace or other invalid label characters. In these cases, the
-        /// label format will fail.
-        ///
         public string DefinitionName => EnsureVariable("BUILD_DEFINITIONNAME");
-
-        ///
-        /// The version of the build definition.
-        ///
         public long DefinitionVersion => EnsureVariable<long>("BUILD_DEFINITIONVERSION");
-
-        ///
-        /// The person who checked in the changes or the system identity or the person who clicked queue build.
-        /// <para/>
-        /// Note: This value can contain whitespace or other invalid label characters. In these cases, the
-        /// label format will fail.
-        ///
         public string QueuedBy => EnsureVariable("BUILD_QUEUEDBY");
-
-        ///
-        /// How are the identity variables set?
-        ///
         public Guid QueuedById => EnsureVariable<Guid>("BUILD_QUEUEDBYID");
-
-        ///
-        /// VSTS Only.
-        /// <para/>
-        /// The event that caused the build to run.
-        /// <para/>
-        /// See Build definition triggers,
-        /// Improve code quality with branch policies.
-        ///
         public TeamServicesBuildReason BuildReason => EnsureVariable<TeamServicesBuildReason>("BUILD_REASON");
-
-        ///
-        /// The value you've selected for Clean in the
-        /// source repository settings.
-        ///
         public bool RepositoryClean => EnsureVariable<bool>("BUILD_REPOSITORY_CLEAN");
-
-        ///
-        /// The local path on the agent where your source code files are downloaded. For example: <c>C:\agent\_work\1\s</c>.
-        /// <para/>
-        /// By default, new build definitions update only the changed files.You can modify how files are downloaded on the
-        /// Repository tab.
-        ///
         public string RepositoryLocalPath => EnsureVariable("BUILD_REPOSITORY_LOCALPATH");
-
-        ///
-        /// The name of the repository.
-        ///
         public string RepositoryName => EnsureVariable("BUILD_REPOSITORY_NAME");
-
-        ///
-        /// The type of repository you selected.
-        ///
         public TeamServicesRepositoryType RepositoryProvider => EnsureVariable<TeamServicesRepositoryType>("BUILD_REPOSITORY_PROVIDER");
-
-        ///
-        /// Defined if your repository
-        /// is Team Foundation Version Control. The name of the TFVC workspace
-        /// used by the build agent.
-        /// <para/>
-        /// For example, if the Agent.BuildDirectory is <c>C:\agent\_work\12</c> and the Agent.Id is <c>8</c>, the workspace name could be: <c>ws_12_8</c>.
-        ///
-        [CanBeNull]
-        public string RepositoryTfvcWorkspace => Variable("BUILD_REPOSITORY_TFVC_WORKSPACE");
-
-        ///
-        /// The URL for the repository. For example:
-        ///

-        ///
Git: <c>https://fabrikamfiber.visualstudio.com/_git/Scripts</c>

-        ///
TFVC: <c>https://fabrikamfiber.visualstudio.com/</c>

-        ///

-        ///
+        [CanBeNull] public string RepositoryTfvcWorkspace => Variable("BUILD_REPOSITORY_TFVC_WORKSPACE");
         public string RepositoryUri => EnsureVariable("BUILD_REPOSITORY_URI");
-
-        ///
-        /// How are the identity variables set?
-        /// <para/>
-        /// Note: This value can contain whitespace or other invalid label characters. In these cases, the
-        /// label format will fail.
-        ///
         public string RequestedFor => EnsureVariable("BUILD_REQUESTEDFOR");
-
-        ///
-        /// How are the identity variables set?
-        ///
         public string RequestedForEmail => EnsureVariable("BUILD_REQUESTEDFOREMAIL");
-
-        ///
-        /// How are the identity variables set?
-        ///
         public Guid RequestedForId => EnsureVariable<Guid>("BUILD_REQUESTEDFORID");
-
-        ///
-        /// The branch the build was queued for. Some examples:
-        ///

-        ///
Git repo branch: <c>refs/heads/master</c>

-        ///
Git repo pull request: <c>refs/pull/1/merge</c>

-        ///
TFVC repo branch: <c>$/teamproject/main</c>

-        ///
TFVC repo gated check-in: <c>Gated_2016-06-06_05.20.51.4369;username@live.com</c>

-        ///
TFVC repo shelveset build: <c>myshelveset;username@live.com</c>

-        ///

-        /// When you use this variable in your build number format, the forward slash characters (<c>/</c>) are replaced with underscore characters <c>_</c>).
-        /// <para/>
-        /// Note: In TFVC, if you are running a gated check-in build or manually building a shelveset, you cannot use this variable in your build number format.
-        ///
         public string SourceBranch => EnsureVariable("BUILD_SOURCEBRANCH");
-
-        ///
-        /// The name of the branch the build was queued for.
-        ///

-        ///
Git repo branch or pull request: The last path segment in the ref. For example, in <c>refs/heads/master</c> this value is <c>master</c>.

-        ///
TFVC repo branch: The last path segment in the root server path for the workspace. For example in <c>$/teamproject/main</c> this value is <c>main</c>.

-        ///
TFVC repo gated check-in or shelveset build is the name of the shelveset. For example, <c>Gated_2016-06-06_05.20.51.4369;username@live.com</c> or <c>myshelveset;username@live.com</c>.

-        ///

-        /// Note: In TFVC, if you are running a gated check-in build or manually building a shelveset, you cannot use this variable in your build number format.
-        ///
         public string SourceBranchName => EnsureVariable("BUILD_SOURCEBRANCHNAME");
-
-        /// The local path on the agent where your source code files are downloaded. For example: c:\agent\_work\1\s
         public string SourceDirectory => EnsureVariable("BUILD_SOURCESDIRECTORY");
-
-        ///
-        /// The latest version control change that is included in this build.
-        ///
-        /// Git: The commit ID.
-        /// TFVC: the changeset.
-        ///
         public string SourceVersion => EnsureVariable("BUILD_SOURCEVERSION");
-
-        ///
-        /// The local path on the agent where any artifacts are copied to before being pushed to their destination. For
-        /// example: c:\agent\_work\1\a
-        ///
-        /// A typical way to use this folder is to publish your build artifacts with the Copy files and Publish build
-        /// artifacts steps.
-        ///
         public string StagingDirectory => EnsureVariable("BUILD_STAGINGDIRECTORY");
-
-        /// The value you've selected for Checkout submodules on the repository tab.
         public bool RepositoryGitSubmoduleCheckout => EnsureVariable<bool>("BUILD_REPOSITORY_GIT_SUBMODULECHECKOUT");
-
-        ///
-        /// Defined if your repository is Team Foundation Version Control.
-        ///
-        /// If you are running a gated build or a shelveset build, this is set to the name of the shelveset you are
-        /// building.
-        ///
         [CanBeNull] public string SourceTfvcShelveset => Variable("BUILD_SOURCETFVCSHELVESET");
-
-        /// The local path on the agent where the test results are created. For example: <c>C:\agent\_work\1\TestResults</c>.
         public string TestResultsDirectory => EnsureVariable("COMMON_TESTRESULTSDIRECTORY");
-
-        /// OAuth token used to access the REST API.
-        [CanBeNull]
-        public string AccessToken => Variable("SYSTEM_ACCESSTOKEN");
-
-        /// The GUID of the team foundation collection.
+        [CanBeNull] public string AccessToken => Variable("SYSTEM_ACCESSTOKEN");
         public Guid CollectionId => EnsureVariable<Guid>("SYSTEM_COLLECTIONID");
-
-        /// The local path on the agent where your source code files are downloaded. For example: <c>C:\agent\_work\1\s</c>.
         public string DefaultWorkingDirectory => EnsureVariable("SYSTEM_DEFAULTWORKINGDIRECTORY");
-
-        /// The ID of the build definition.
         public long DefinitionId => EnsureVariable<long>("SYSTEM_DEFINITIONID");
-
-        /// The ID of the pull request that caused this build. For example: 17.
-        /// <remarks>This variable is initialized only if the build ran because of a Git PR affected by a branch policy.</remarks>
         [CanBeNull] public string PullRequestId => Variable("SYSTEM_PULLREQUEST_PULLREQUESTID");
-
-        /// The branch that is being revewiewed in a pull request. For example: refs/heads/users/raisa/new-feature.
-        /// <remarks>This variable is initialized only if the build ran because of a Git PR affected by a branch policy.</remarks>
         [CanBeNull] public string PullRequestSourceBranch => Variable("SYSTEM_PULLREQUEST_SOURCEBRANCH");
-
-        /// The branch that is the target of a pull request. For example: refs/heads/master.
-        /// <remarks>This variable is initialized only if the build ran because of a Git PR affected by a branch policy.</remarks>
         [CanBeNull] public string PullRequestTargetBranch => Variable("SYSTEM_PULLREQUEST_TARGETBRANCH");
-
-        /// The URI of the team foundation collection. For example: <c>https://fabrikamfiber.visualstudio.com/</c>.
         public string TeamFoundationCollectionUri => EnsureVariable("SYSTEM_TEAMFOUNDATIONCOLLECTIONURI");
-
-        /// The name of the team project that contains this build.
         public string TeamProject => EnsureVariable("SYSTEM_TEAMPROJECT");
-
-        /// The ID of the team project that this build belongs to.
         public Guid TeamProjectId => EnsureVariable<Guid>("SYSTEM_TEAMPROJECTID");

-        /// Upload user interested log to builds container logs\tool folder. For example: c:\msbuild.log.
         public void UploadLog(string localFilePath)
         {
             _messageSink($"##vso[build.uploadlog]{localFilePath}");
         }

-        /// Update build number for current build.
         public void UpdateBuildNumber(string buildNumber)
         {
             _messageSink($"##vso[build.updatebuildnumber]{buildNumber}");
         }

-        /// Adds a build tag for the current build.
         public void AddBuildTag(string buildTag)
         {
             _messageSink($"##vso[build.addbuildtag]{buildTag}");
         }

-        /// Log error issue to timeline record of current task.
         public void LogError (
             string message,
             string sourcePath = null,
@@ -334,7 +98,6 @@
             LogIssue(TeamServicesIssueType.Error, message, sourcePath, lineNumber, columnNumber, code);
         }

-        /// Log warning issue to timeline record of current task.
         public void LogWarning (
             string message,
             string sourcePath = null,
@@ -345,7 +108,6 @@
             LogIssue(TeamServicesIssueType.Warning, message, sourcePath, lineNumber, columnNumber, code);
         }

-        /// Log issue to timeline record of current task.
         public void LogIssue (
             TeamServicesIssueType type,
             string message,


ParseDateTimePermissivelyWithException --> ParseDateTimePermissivelyWithException

--- Palaso/Extensions/DateTimeExtensions.cs
+++ Palaso/Extensions/DateTimeExtensions.cs
@@ -4,6 +4,7 @@
 using System.Globalization;
 using System.Linq;
 using System.Text;
+using Palaso.Progress.LogBox;

 namespace Palaso.Extensions
 {
@@ -61,10 +62,27 @@

 		/// <summary>
+		/// if we can't parse it, we stick in the min value & write a warning to the progress
+//        /// </summary>
+//
+//        public static DateTime ParseDateTimePermissivelyWithFallbackToDefaultAndWarningToProgress(string when, IProgress progress)
+//        {
+//            try
+//            {
+//                return ParseDateTimePermissivelyWithException(when);
+//            }
+//            catch (Exception error)
+//            {
+//                progress.WriteWarning(error.Message);
+//                return default(DateTime);
+//            }
+//        }
+
+		/// <summary>
 		/// We have this permsissive business because we released versions of SayMore which used the local
 		/// format, rather than a universal one.
 		/// </summary>
-		public static DateTime ParseDateTimePermissively(string when)
+		public static DateTime ParseDateTimePermissivelyWithException(string when)
 		{
 			try
 			{


Fix Mono threading problem in LogBox

Fix Mono threading problem in LogBox

A mono-specific patch was added to LogBox to work around a Mono bug
in adding colored text to a RichTextBox. Unfortunately the patch
bypassed necessary code to make sure the text is added on the UI
thread. (Reviewed by JasonN).

--- PalasoUIWindowsForms/Progress/LogBox.cs
+++ PalasoUIWindowsForms/Progress/LogBox.cs
@@ -249,14 +249,6 @@

 		private void Write(Color color, FontStyle style, string msg, params object[] args)
 		{
-#if MONO // changing the text colour throws exceptions with mono 2011-12-09
-		// so just append plain text
-			_box.AppendText(string.Format(msg + Environment.NewLine, args));
-			_box.ScrollToCaret();
-			_verboseBox.AppendText(string.Format(msg + Environment.NewLine, args));
-			_verboseBox.ScrollToCaret();
-#else
-
 #if !DEBUG
 			try
 			{
@@ -267,6 +259,8 @@
 				var styleForDelegate = style;
 				SafeInvoke(rtfBox, (() =>
 				{
+#if !MONO // changing the text colour throws exceptions with mono 2011-12-09
+						// so just append plain text
 					if (!rtfBoxForDelegate.Font.FontFamily.IsStyleAvailable(styleForDelegate))
 						style = rtfBoxForDelegate.Font.Style;

@@ -275,10 +269,13 @@
 						rtfBoxForDelegate.SelectionStart = rtfBoxForDelegate.Text.Length;
 						rtfBoxForDelegate.SelectionColor = color;
 						rtfBoxForDelegate.SelectionFont = fnt;
+#endif
 						rtfBoxForDelegate.AppendText(string.Format(msg + Environment.NewLine, args));
 						rtfBoxForDelegate.SelectionStart = rtfBoxForDelegate.Text.Length;
 						rtfBoxForDelegate.ScrollToCaret();
+#if !MONO
 					}
+#endif
 				}));
 			}
 #if !DEBUG
@@ -290,7 +287,6 @@
 				//stack trace didn't actually go into this method, but the build date was after I wrote this.  So this exception may never actually happen.
 			}
 #endif
-#endif //MONO
 		}

 		public void WriteWarning(string message, params object[] args)


Don't add pop out on android.

Don't add pop out on android.

--- PartPreviewWindow/PartPreviewContent.cs
+++ PartPreviewWindow/PartPreviewContent.cs
@@ -38,6 +38,7 @@
 using MatterHackers.MatterControl.PrintQueue;
 using MatterHackers.MatterControl.SlicerConfiguration;
 using MatterHackers.VectorMath;
+using MatterHackers.Agg.PlatformAbstract;

 namespace MatterHackers.MatterControl.PartPreviewWindow
 {
@@ -138,7 +139,7 @@

             int tabPointSize = 16;
             // add the correct tabs based on wether we are stand alone or embeded
-            if (windowMode == View3DWidget.WindowMode.StandAlone)
+            if (windowMode == View3DWidget.WindowMode.StandAlone || OsInformation.OperatingSystem == OSType.Android)
             {
                 tabControl.AddTab(new SimpleTextTabWidget(partPreview3DView, "3D View Tab", tabPointSize,
                     selectedTabColor, new RGBA_Bytes(), ActiveTheme.Instance.TabLabelUnselected, new RGBA_Bytes()));


Fixing small issue related to wire format for reporting deployment status.

--- Kudu.Core/Deployment/RemoteDeploymentManager.cs
+++ Kudu.Core/Deployment/RemoteDeploymentManager.cs
@@ -55,9 +55,7 @@

         public string ActiveDeploymentId {
             get {
-                return _client.Get("id").EnsureSuccessful()
-                              .Content
-                              .ReadAsString();
+                return _client.GetJson<string>("id");
             }
         }


Saved original span and parent to the resulting AST object.

--- Languages/IronPython/IronPython/Modules/_ast.cs
+++ Languages/IronPython/IronPython/Modules/_ast.cs
@@ -126,6 +126,8 @@
             private PythonTuple __attributes = new PythonTuple();   // Genshi assumes _fields in not None
             protected int? _lineno; // both lineno and col_offset are expected to be int, in cpython anything is accepted
             protected int? _col_offset;
+            protected ScopeStatement _parent;
+            protected SourceSpan _span;

             public PythonTuple _fields {
                 get { return __fields; }
@@ -206,6 +208,9 @@

                 // IronPython counts from 1; CPython counts from 0
                 _col_offset = node.Start.Column - 1;
+
+                _span = node.Span;
+                _parent = node.Parent;
             }

             internal static PythonList ConvertStatements(Statement stmt) {


fix prox on droid

fix prox on droid

--- Plugin.Sensors.Android/ProximityImpl.cs
+++ Plugin.Sensors.Android/ProximityImpl.cs
@@ -4,7 +4,7 @@

 namespace Plugin.Sensors
 {
-    public class ProximityImpl : AbstractSensor<bool>
+    public class ProximityImpl : AbstractSensor<bool>, IProximity
     {
         public ProximityImpl() : base(SensorType.Proximity)
         {


Reduce nesting

Reduce nesting

--- PoE-TradeUI/PoE-TradeUI.Core/PoeGame.cs
+++ PoE-TradeUI/PoE-TradeUI.Core/PoeGame.cs
@@ -113,24 +113,23 @@
                     if(e.HWnd == _poeHandle) SetWindowState(false, false, false);
                     break;
                 case HookEvent.EVENT_OBJECT_CREATE:
-                   // Debug.WriteLine("CRETATE");
                     if (_windowState.Open) break;
-                    uint pid = 0;
+                    uint pid;
                     Native.GetWindowThreadProcessId(e.HWnd, out pid);
                     var p = Process.GetProcessById((int)pid);

-                    var lower = p.ProcessName.ToLower();
-                    if (lower.Contains("path") && lower.Contains("of") && lower.Contains("exile")) {
-                        lower = p.MainWindowTitle.ToLower();
-                        if (lower.Contains("path") && lower.Contains("of") && lower.Contains("exile")) {
-                            _poeProcess = p;
-                            _poeHandle = _poeProcess.MainWindowHandle;
-                            SetWindowState(false, true, true);
-                        }
-                    }
+                    if (!TitleCheck(p.ProcessName.ToLower())) break;
+                    if (!TitleCheck(p.MainWindowTitle.ToLower())) break;
+
+                    _poeProcess = p;
+                    _poeHandle = _poeProcess.MainWindowHandle;
+                    SetWindowState(false, true, true);
+
                     break;
             }
         }
+
+        private static bool TitleCheck(string title) => title.Contains("path") && title.Contains("of") && title.Contains("exile");

         private static Process FindGame() => (from process in Process.GetProcesses()
             let lower = process.ProcessName.ToLower()


Prevent possible crash in JunkRemoveWindow with invalid IJunkResult without Confidence

--- source/BulkCrapUninstaller/Forms/JunkRemoveWindow.cs
+++ source/BulkCrapUninstaller/Forms/JunkRemoveWindow.cs
@@ -386,7 +386,7 @@
         {
             _listViewWrapper = new TypedObjectListView<IJunkResult>(objectListViewMain);

-            olvColumnSafety.AspectGetter = x => (x as IJunkResult)?.Confidence.GetConfidence().GetLocalisedName();
+            olvColumnSafety.AspectGetter = x => ((x as IJunkResult)?.Confidence?.GetConfidence() ?? ConfidenceLevel.Unknown).GetLocalisedName();
             olvColumnPath.GroupKeyGetter = x => (x as IJunkResult)?.Source?.CategoryName ?? CommonStrings.Unknown;
             olvColumnPath.AspectGetter = rowObject => (rowObject as IJunkResult)?.GetDisplayName();
             olvColumnUninstallerName.AspectGetter = rowObject =>


tweak cors

tweak cors

--- source/FlowplaneExtensions/App_Start/WebApiConfig.cs
+++ source/FlowplaneExtensions/App_Start/WebApiConfig.cs
@@ -17,7 +17,7 @@

             var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
             config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
-            config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
+            config.EnableCors(new EnableCorsAttribute("*", "", ""));

             config.Routes.MapHttpRoute(
                 name: "Api_Register_GetAll",


Fix resolution order

Fix resolution order

--- source/Nuke.Common/ProjectModel/SolutionAttribute.cs
+++ source/Nuke.Common/ProjectModel/SolutionAttribute.cs
@@ -15,9 +15,9 @@
     ///
     ///     Injects an instance of <see cref="Solution"/>. The solution path is resolved in the following order:
     ///

+    ///
From the constructor argument

     ///
From command-line arguments (e.g., <c>-[MemberName] path/to/solution.sln</c>)

     ///
From environment variables (e.g., <c>[MemberName]=path/to/solution.sln</c>)

-    ///
From the constructor argument

     ///
From the <c>.nuke</c> configuration file

     ///

     ///
@@ -53,12 +53,12 @@
         // TODO: for just [Solution] without parameter being passed, do wildcard search?
         private string GetSolutionFile(string memberName)
         {
+            if (_solutionFileRootRelativePath != null)
+                return PathConstruction.Combine(NukeBuild.RootDirectory, _solutionFileRootRelativePath);
+
             var parameterValue = ParameterService.Instance.GetParameter<PathConstruction.AbsolutePath>(memberName);
             if (parameterValue != null)
                 return parameterValue;
-
-            if (_solutionFileRootRelativePath != null)
-                return PathConstruction.Combine(NukeBuild.RootDirectory, _solutionFileRootRelativePath);

             return GetSolutionFileFromConfigurationFile();
         }