/// <summary>
        /// Convert hashtable of public settings into two parts:
        /// 1) Array of public settings in format:
        /// [
        ///             {
        ///                 "Name":  "String Parameter",
        ///                 "Value":  "String Value",
        ///                 "TypeName":  "System.String"
        ///             }
        /// ]
        /// 2) Private settings hashtable. We extract all sensitive information (like password from PSCredential)
        ///    and store it in private settings. Public settings will reference them in form:
        ///             {
        ///                 "Name":  "AdminCredential",
        ///                 "Value":
        ///                 {
        ///                     "Password" : "PrivateSettings:28AC4D36-A99B-41DE-8421-2BCC1C7C1A3B"
        ///                     "UserName" : "DOMAIN\LOGIN"
        ///                 },
        ///                 "TypeName":  "System.Management.Automation.PSCredential"
        ///             }
        /// and private hashtable will look like that:
        /// {
        ///     "28AC4D36-A99B-41DE-8421-2BCC1C7C1A3B" : "password"
        /// }
        /// </summary>
        /// <param name="arguments"></param>
        /// <returns>tuple of array (public settings) and hashtable (private settings)</returns>
        private Tuple <DscPublicSettings.Property[], Hashtable> ConvertSettings(Hashtable arguments)
        {
            var publicSettings  = new List <DscPublicSettings.Property>();
            var privateSettings = new Hashtable();

            if (arguments != null)
            {
                foreach (DictionaryEntry argument in arguments)
                {
                    object entryValue = argument.Value;
                    string entryType  = argument.Value == null ? "null" : argument.Value.GetType().ToString();
                    string entryName  = argument.Key.ToString();
                    // Special case for PSCredential
                    PSCredential credential = argument.Value as PSCredential;
                    if (credential == null)
                    {
                        PSObject psObject = argument.Value as PSObject;
                        if (psObject != null)
                        {
                            credential = psObject.BaseObject as PSCredential;
                        }
                    }
                    if (credential != null)
                    {
                        // plainTextPassword is a string object with sensitive information  in plain text.
                        // We pass it to 3rd party serializer which may create copies of the string.
                        string plainTextPassword = ConvertToUnsecureString(credential.Password);
                        string userName          = credential.UserName;
                        string passwordRef       = Guid.NewGuid().ToString();
                        privateSettings.Add(passwordRef, plainTextPassword);
                        var newValue = new Hashtable();
                        newValue["UserName"] = String.Format(CultureInfo.InvariantCulture, userName);
                        newValue["Password"] = String.Format(CultureInfo.InvariantCulture, "PrivateSettingsRef:{0}",
                                                             passwordRef);
                        entryValue = newValue;
                        entryType  = typeof(PSCredential).ToString();
                    }

                    var entry = new DscPublicSettings.Property()
                    {
                        Name     = entryName,
                        TypeName = entryType,
                        Value    = entryValue,
                    };
                    publicSettings.Add(entry);
                }
            }
            return(new Tuple <DscPublicSettings.Property[], Hashtable>(publicSettings.ToArray(), privateSettings));
        }
        /// <summary>
        /// Convert hashtable of public settings into two parts:
        /// 1) Array of public settings in format:
        /// [
        ///             {
        ///                 "Name":  "String Parameter",
        ///                 "Value":  "String Value",
        ///                 "TypeName":  "System.String"
        ///             }
        /// ]
        /// 2) Private settings hashtable. We extract all sensitive information (like password from PSCredential)
        ///    and store it in private settings. Public settings will reference them in form:
        ///             {
        ///                 "Name":  "AdminCredential",
        ///                 "Value":  
        ///                 {
        ///                     "Password" : "PrivateSettings:28AC4D36-A99B-41DE-8421-2BCC1C7C1A3B"
        ///                     "UserName" : "DOMAIN\LOGIN"
        ///                 },
        ///                 "TypeName":  "System.Management.Automation.PSCredential"
        ///             }
        /// and private hashtable will look like that:
        /// {
        ///     "28AC4D36-A99B-41DE-8421-2BCC1C7C1A3B" : "password"
        /// }
        /// </summary>
        /// <param name="arguments"></param>
        /// <returns>tuple of array (public settings) and hashtable (private settings)</returns>
        private Tuple<DscPublicSettings.Property[], Hashtable> ConvertSettings(Hashtable arguments)
        {
            var publicSettings = new List<DscPublicSettings.Property>();
            var privateSettings = new Hashtable();
            if (arguments != null)
            {
                foreach (DictionaryEntry argument in arguments)
                {
                    object entryValue = argument.Value;
                    string entryType = argument.Value == null ? "null" : argument.Value.GetType().ToString();
                    string entryName = argument.Key.ToString();
                    // Special case for PSCredential
                    PSCredential credential = argument.Value as PSCredential;
                    if (credential == null)
                    {
                        PSObject psObject = argument.Value as PSObject;
                        if (psObject != null)
                        {
                            credential = psObject.BaseObject as PSCredential;
                        }
                    }
                    if (credential != null)
                    {
                        // plainTextPassword is a string object with sensitive information  in plain text. 
                        // We pass it to 3rd party serializer which may create copies of the string.
                        string plainTextPassword = ConvertToUnsecureString(credential.Password);
                        string userName = credential.UserName;
                        string passwordRef = Guid.NewGuid().ToString();
                        privateSettings.Add(passwordRef, plainTextPassword);
                        var newValue = new Hashtable();
                        newValue["UserName"] = String.Format(CultureInfo.InvariantCulture, userName);
                        newValue["Password"] = String.Format(CultureInfo.InvariantCulture, "PrivateSettingsRef:{0}",
                            passwordRef);
                        entryValue = newValue;
                        entryType = typeof (PSCredential).ToString();
                    }

                    var entry = new DscPublicSettings.Property()
                    {
                        Name = entryName,
                        TypeName = entryType,
                        Value = entryValue,
                    };
                    publicSettings.Add(entry);
                }
            }
            return new Tuple<DscPublicSettings.Property[], Hashtable>(publicSettings.ToArray(), privateSettings);
        }