text:
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using Aurora.DataManager.Migration;
using Aurora.Framework;
//using System.Data.Sqlite;
using Community.CsharpSqlite.SQLiteClient;
using OpenMetaverse;

namespace Aurora.DataManager.SQLite
{
    public class SQLiteLoader : DataManagerBase
    {
        protected Dictionary<string, FieldInfo> m_Fields = new Dictionary<string, FieldInfo>();
        protected string _connectionString;
        protected static bool _hadToConvert = false;
        protected static Dictionary<string, object> _locks = new Dictionary<string, object>();
        protected string _fileName;

        protected object GetLock()
        {
            lock (_locks)
            {
                if (!_locks.ContainsKey(_fileName))
                    _locks.Add(_fileName, new object());
                return _locks[_fileName];
            }
        }

        public override string Identifier
        {
            get { return "SQLiteConnector"; }
        }

        #region Database

        public override void ConnectToDatabase(string connectionString, string migratorName, bool validateTables)
        {
            _connectionString = connectionString;
            string[] s1 = _connectionString.Split(new[] { "Data Source=", "," }, StringSplitOptions.RemoveEmptyEntries);
            bool needsUTFConverted = false;
            _fileName = Path.GetFileName(s1[0]);
            if (s1[0].EndsWith(";"))
            {
                _fileName = Path.GetFileNameWithoutExtension(s1[1].Substring(7, s1[1].Length - 7)) + "utf8.db";
                _connectionString = "Data Source=file://" + _fileName;
                s1 = new string[1] { "file://" + _fileName };
                needsUTFConverted = true;
                _hadToConvert = true;
            }
            if (_fileName == s1[0]) //Only add this if we arn't an absolute path already
                _connectionString = _connectionString.Replace("Data Source=", "Data Source=" + Util.BasePathCombine("") + "\\");
            SqliteConnection connection = new SqliteConnection(_connectionString);
            connection.Open();
            var migrationManager = new MigrationManager(this, migratorName, validateTables);
            migrationManager.DetermineOperation();
            migrationManager.ExecuteOperation();
            connection.Close();

            if (needsUTFConverted && _hadToConvert)
            {
                string file = connectionString.Split(new[] { "Data Source=", "," }, StringSplitOptions.RemoveEmptyEntries)[1].Substring(7);
                if (File.Exists(file))
                {
                    //UTF16 db, gotta convert it
                    System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection("Data Source=" + file + ";version=3;UseUTF16Encoding=True");
                    conn.Open();
                    var RetVal = new List<string>();
                    using (var cmd = new System.Data.SQLite.SQLiteCommand("SELECT name FROM Sqlite_master", conn))
                    {
                        using (IDataReader rdr = cmd.ExecuteReader())
                        {
                            while (rdr.Read())
                            {
                                for (int i = 0; i < rdr.FieldCount; i++)
                                {
                                    RetVal.Add(rdr.GetValue(i).ToString());
                                }
                            }
                        }
                    }
                    foreach (string table in RetVal)
                    {
                        if (TableExists(table) && !table.StartsWith("sqlite") && !table.StartsWith("idx_") && table != "aurora_migrator_version")
                        {
                            var retVal = new List<object[]>();
                            using (var cmd = new System.Data.SQLite.SQLiteCommand("SELECT * FROM " + table, conn))
                            {
                                using (IDataReader reader = cmd.ExecuteReader())
                                {
                                    while (reader.Read())
                                    {
                                        List<object> obs = new List<object>();
                                        for (int i = 0; i < reader.FieldCount; i++)
                                        {
                                            Type r = reader[i].GetType();
                                            if (r == typeof(DBNull))
                                                obs.Add(null);
                                            else
                                                obs.Add(reader[i].ToString());
                                        }
                                        retVal.Add(obs.ToArray());
                                    }
                                }
                            }
                            try
                            {
                                if(retVal.Count > 0)
                                    InsertMultiple(table, retVal);
                            }
                            catch { }
                        }
                    }
                }
            }
        }

        public override void CloseDatabase(DataReaderConnection conn)
        {
            if (conn == null)
                return;
            if (conn.DataReader != null)
                conn.DataReader.Close();
            if (conn != null && conn.Connection != null && conn.Connection is SqliteConnection)
                ((SqliteConnection)conn.Connection).Close();
        }

        #endregion

        #region Query

        protected void PrepReader(ref SqliteCommand cmd)
        {
            int retries = 0;
            restart:
            try
            {
                SqliteConnection connection = new SqliteConnection(_connectionString);
                connection.Open();
                cmd.Connection = connection;
            }

            catch (SqliteBusyException ex)
            {
                if (retries++ > 5)
                    MainConsole.Instance.Warn("[SqliteDataManager]: Exception processing command: " + cmd.CommandText + ", Exception: " +
                               ex);
                else
                    goto restart;
            }
            catch (SqliteException ex)
            {
                MainConsole.Instance.Warn("[SqliteDataManager]: Exception processing command: " + cmd.CommandText + ", Exception: " +
                           ex);
                //throw ex;
            }
            catch (Exception ex)
            {
                MainConsole.Instance.Warn("[SqliteDataManager]: Exception processing command: " + cmd.CommandText + ", Exception: " +
                           ex);
                throw ex;
            }
        }

        protected SqliteCommand PrepReader(string query)
        {
            try
            {
                SqliteConnection connection = new SqliteConnection(_connectionString);
                connection.Open();
                var cmd = connection.CreateCommand();
                cmd.CommandText = query;
                return cmd as SqliteCommand;
            }
            catch (SqliteException)
            {
                //throw ex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return null;
        }

        protected int ExecuteNonQuery(SqliteCommand cmd)
        {
            int retries = 0;
            restart:
            try
            {
                lock (GetLock())
                {
                    PrepReader(ref cmd);
                    UnescapeSql(cmd);
                    var value = cmd.ExecuteNonQuery();
                    cmd.Connection.Close();
                    return value;
                }
            }
            catch (SqliteBusyException ex)
            {
                if (retries++ > 5)
                    MainConsole.Instance.Warn("[SqliteDataManager]: Exception processing command: " + cmd.CommandText + ", Exception: " +
                               ex);
                else
                    goto restart;
                return 0;
            }
            catch (SqliteException ex)
            {
                MainConsole.Instance.Warn("[SqliteDataManager]: Exception processing command: " + cmd.CommandText + ", Exception: " +
                           ex);
            }
            catch (Exception ex)
            {
                MainConsole.Instance.Warn("[SqliteDataManager]: Exception processing command: " + cmd.CommandText + ", Exception: " +
                           ex);
                throw ex;
            }
            return 0;
        }

        private static void UnescapeSql(SqliteCommand cmd)
        {
            foreach (SqliteParameter v in cmd.Parameters)
            {
                if (v.Value.ToString().Contains("\\'"))
                {
                    v.Value = v.Value.ToString().Replace("\\'", "\'");
                }
                if (v.Value.ToString().Contains("\\\""))
                {
                    v.Value = v.Value.ToString().Replace("\\\"", "\"");
                }
            }
        }

        protected void CloseReaderCommand(SqliteCommand cmd)
        {
            cmd.Connection.Close();
            cmd.Parameters.Clear();
            //cmd.Dispose ();
        }

        private void AddParams(ref SqliteCommand cmd, Dictionary<string, object> ps)
        {
            foreach (KeyValuePair<string, object> p in ps)
                AddParam(ref cmd, p.Key, p.Value);
        }

        private void AddParam(ref SqliteCommand cmd, string key, object value)
        {
            AddParam(ref cmd, key, value, false);
        }
        private void AddParam(ref SqliteCommand cmd, string key, object value, bool convertByteString)
        {
            if (value is UUID)
                cmd.Parameters.Add(key, value.ToString());
            else if (value is Vector3)
                cmd.Parameters.Add(key, value.ToString());
            else if (value is Quaternion)
                cmd.Parameters.Add(key, value.ToString());
            else if (value is byte[] && convertByteString)
                cmd.Parameters.Add(key, Utils.BytesToString((byte[])value));
            else
                cmd.Parameters.Add(key, value);
        }

        public override List<string> QueryFullData(string whereClause, string table, string wantedValue)
        {
            string query = String.Format("select {0} from {1} {2} ", wantedValue, table, whereClause);
            return QueryFullData2(query);
        }

        public override List<string> QueryFullData(string whereClause, QueryTables tables, string wantedValue)
        {
            string query = string.Format("SELECT {0} FROM {1} {2} ", wantedValue, tables.ToSQL(), whereClause);
            return QueryFullData2(query);
        }

        private List<string> QueryFullData2(string query)
        {
            var cmd = PrepReader(query);
            lock (GetLock())
            {
                using (SqliteDataReader reader = cmd.ExecuteReader())
                {
                    var RetVal = new List<string>();
                    while (reader.Read())
                    {
                        if (reader.HasRows)
                        {
                            for (int i = 0; i < reader.FieldCount; i++)
                            {
                                RetVal.Add(reader.GetValue(i).ToString());
                            }
                        }
                    }
                    //reader.Close();
                    CloseReaderCommand(cmd);

                    return RetVal;
                }
            }
        }

        public override DataReaderConnection QueryData(string whereClause, string table, string wantedValue)
        {
            string query = String.Format("select {0} from {1} {2}",wantedValue, table, whereClause);
            SqliteConnection conn;
            var data = QueryData2(query, out conn);
            return new DataReaderConnection { DataReader = data, Connection = conn };
        }

        public override DataReaderConnection QueryData(string whereClause, QueryTables tables, string wantedValue)
        {
            string query = string.Format("SELECT {0} FROM {1} {2}", wantedValue, tables, whereClause);
            SqliteConnection conn;
            var data = QueryData2(query, out conn);
            return new DataReaderConnection { DataReader = data, Connection = conn };
        }

        private IDataReader QueryData2(string query, out SqliteConnection conn)
        {
            var cmd = PrepReader(query);
            conn = cmd.Connection;
            return cmd.ExecuteReader();
        }

        public override List<string> Query(string[] wantedValue, string table, QueryFilter queryFilter, Dictionary<string, bool> sort, uint? start, uint? count)
        {
            string query = string.Format("SELECT {0} FROM {1}", string.Join(", ", wantedValue), table);
            return Query2(query, queryFilter, sort, start, count);
        }

        public override List<string> Query(string[] wantedValue, QueryTables tables, QueryFilter queryFilter, Dictionary<string, bool> sort, uint? start, uint? count)
        {
            string query = string.Format("SELECT {0} FROM {1} ", string.Join(", ", wantedValue), tables.ToSQL());
            return Query2(query, queryFilter, sort, start, count);
        }

        private List<string> Query2(string query, QueryFilter queryFilter, Dictionary<string, bool> sort, uint? start, uint? count)
        {
            Dictionary<string, object> ps = new Dictionary<string, object>();
            List<string> retVal = new List<string>();
            List<string> parts = new List<string>();

            if (queryFilter != null && queryFilter.Count > 0)
            {
                query += " WHERE " + queryFilter.ToSQL(':', out ps);
            }

            if (sort != null && sort.Count > 0)
            {
                parts = new List<string>();
                foreach (KeyValuePair<string, bool> sortOrder in sort)
                {
                    parts.Add(string.Format("`{0}` {1}", sortOrder.Key, sortOrder.Value ? "ASC" : "DESC"));
                }
                query += " ORDER BY " + string.Join(", ", parts.ToArray());
            }

            if (start.HasValue)
            {
                query += " LIMIT " + start.Value.ToString();
                if (count.HasValue)
                {
                    query += ", " + count.Value.ToString();
                }
            }

            int i = 0;

            var cmd = PrepReader(query);
            AddParams(ref cmd, ps);
            lock (GetLock())
            {
                using (SqliteDataReader reader = cmd.ExecuteReader())
                {
                    var RetVal = new List<string>();
                    while (reader.Read())
                    {
                        if (reader.HasRows)
                        {
                            for (i = 0; i < reader.FieldCount; i++)
                                RetVal.Add(reader[i] == null ? null : reader[i].ToString());
                        }
                    }
                    //reader.Close();
                    CloseReaderCommand(cmd);

                    return RetVal;
                }
            }
        }

        public override Dictionary<string, List<string>> QueryNames(string[] keyRow, object[] keyValue, string table, string wantedValue)
        {
            string query = String.Format("select {0} from {1} where ", wantedValue, table);
            return QueryNames2(keyRow, keyValue, query);
        }

        public override Dictionary<string, List<string>> QueryNames(string[] keyRow, object[] keyValue, QueryTables tables, string wantedValue)
        {
            string query = string.Format("SELECT {0} FROM {1} where ", wantedValue, tables.ToSQL());
            return QueryNames2(keyRow, keyValue, query);
        }

        private Dictionary<string, List<string>> QueryNames2(string[] keyRow, object[] keyValue, string query)
        {
            Dictionary<string, object> ps = new Dictionary<string, object>();
            int i = 0;
            foreach (object value in keyValue)
            {
                ps[":" + keyRow[i].Replace("`", "")] = value;
                query += String.Format("{0} = :{1} and ", keyRow[i], keyRow[i].Replace("`", ""));
                i++;
            }
            query = query.Remove(query.Length - 5);
            var cmd = PrepReader(query);
            AddParams(ref cmd, ps);
            lock (GetLock())
            {
                using (SqliteDataReader reader = cmd.ExecuteReader())
                {
                    var RetVal = new Dictionary<string, List<string>>();
                    while (reader.Read())
                    {
                        if (reader.HasRows)
                        {
                            for (i = 0; i < reader.FieldCount; i++)
                            {
                                Type r = reader[i].GetType();
                                if (r == typeof(DBNull))
                                    AddValueToList(ref RetVal, reader.GetName(i), null);
                                else
                                    AddValueToList(ref RetVal, reader.GetName(i), reader[i].ToString());
                            }
                        }
                    }
                    //reader.Close();
                    CloseReaderCommand(cmd);

                    return RetVal;
                }
            }
        }

        private void AddValueToList(ref Dictionary<string, List<string>> dic, string key, string value)
        {
            if (!dic.ContainsKey(key))
                dic.Add(key, new List<string>());

            dic[key].Add(value);
        }

        #endregion

        #region Update

        public override bool Update(string table, Dictionary<string, object> values, Dictionary<string, int> incrementValues, QueryFilter queryFilter, uint? start, uint? count)
        {
            if ((values == null || values.Count < 1) && (incrementValues == null || incrementValues.Count < 1))
            {
                MainConsole.Instance.Warn("Update attempted with no values");
                return false;
            }

            string query = string.Format("UPDATE {0}", table); ;
            Dictionary<string, object> ps = new Dictionary<string, object>();

            string filter = "";
            if (queryFilter != null && queryFilter.Count > 0)
            {
                filter = " WHERE " + queryFilter.ToSQL(':', out ps);
            }

            List<string> parts = new List<string>();
            if (values != null)
            {
                foreach (KeyValuePair<string, object> value in values)
                {
                    string key = ":updateSet_" + value.Key.Replace("`", "");
                    ps[key] = value.Value;
                    parts.Add(string.Format("{0} = {1}", value.Key, key));
                }
            }
            if (incrementValues != null)
            {
                foreach (KeyValuePair<string, int> value in incrementValues)
                {
                    string key = ":updateSet_increment_" + value.Key.Replace("`", "");
                    ps[key] = value.Value;
                    parts.Add(string.Format("{0} = {0} + {1}", value.Key, key));
                }
            }

            query += " SET " + string.Join(", ", parts.ToArray()) + filter;

            if (start.HasValue)
            {
                query += " LIMIT " + start.Value.ToString();
                if (count.HasValue)
                {
                    query += ", " + count.Value.ToString();
                }
            }

            SqliteCommand cmd = new SqliteCommand(query);
            AddParams(ref cmd, ps);

            try
            {
                ExecuteNonQuery(cmd);
            }
            catch (SqliteException e)
            {
                MainConsole.Instance.Error("[SqliteLoader] Update(" + query + "), " + e);
            }
            CloseReaderCommand(cmd);
            return true;
        }

        #endregion

        #region Insert

        public override bool InsertMultiple(string table, List<object[]> values)
        {
            var cmd = new SqliteCommand();

            string query = String.Format("insert into {0} select ", table);
            int a = 0;
            foreach (object[] value in values)
            {
                foreach (object v in value)
                {
                    query += ":" + Util.ConvertDecString(a) + ",";
                    AddParam(ref cmd, Util.ConvertDecString(a++), v, true);
                }
                query = query.Remove(query.Length - 1);
                query += " union all select ";
            }
            query = query.Remove(query.Length - (" union all select ").Length);

            cmd.CommandText = query;
            ExecuteNonQuery(cmd);
            CloseReaderCommand(cmd);
            return true;
        }

        public override bool Insert(string table, object[] values)
        {
            var cmd = new SqliteCommand();

            string query = "";
            query = String.Format("insert into {0} values(", table);
            int a = 0;
            foreach (object value in values)
            {
                query += ":" + Util.ConvertDecString(a) + ",";
                AddParam(ref cmd, Util.ConvertDecString(a++), value, true);
            }
            query = query.Remove(query.Length - 1);
            query += ")";
            cmd.CommandText = query;
            ExecuteNonQuery(cmd);
            CloseReaderCommand(cmd);
            return true;
        }

        private bool InsertOrReplace(string table, Dictionary<string, object> row, bool insert)
        {
            SqliteCommand cmd = new SqliteCommand();
            string query = (insert ? "INSERT" : "REPLACE") + " INTO " + table + " (" + string.Join(", ", row.Keys.ToArray<string>()) + ")";
            List<string> ps = new List<string>();
            foreach (KeyValuePair<string, object> field in row)
            {
                string key = ":" + field.Key.Replace("`", "");
                ps.Add(key);
                AddParam(ref cmd, key, field.Value);
            }
            query += " VALUES( " + string.Join(", ", ps.ToArray<string>()) + " )";

            cmd.CommandText = query;
            try
            {
                ExecuteNonQuery(cmd);
            }
            catch (Exception e)
            {
                MainConsole.Instance.Error("[SqliteLoader] " + (insert ? "Insert" : "Replace") + "(" + query + "), " + e);
            }
            CloseReaderCommand(cmd);
            return true;
        }

        public override bool Insert(string table, Dictionary<string, object> row)
        {
            return InsertOrReplace(table, row, true);
        }

        public override bool Insert(string table, object[] values, string updateKey, object updateValue)
        {
            var cmd = new SqliteCommand();
            Dictionary<string, object> ps = new Dictionary<string, object>();

            string query = "";
            query = String.Format("insert into {0} values (", table);
            int i = 0;
            foreach (object value in values)
            {
                ps[":" + Util.ConvertDecString(i)] = value;
                query = String.Format(query + ":{0},", Util.ConvertDecString(i++));
            }
            query = query.Remove(query.Length - 1);
            query += ")";
            cmd.CommandText = query;
            AddParams(ref cmd, ps);
            try
            {
                ExecuteNonQuery(cmd);
                CloseReaderCommand(cmd);
            }
                //Execute the update then...
            catch (Exception)
            {
                cmd = new SqliteCommand();
                query = String.Format("UPDATE {0} SET {1} = '{2}'", table, updateKey, updateValue);
                cmd.CommandText = query;
                ExecuteNonQuery(cmd);
                CloseReaderCommand(cmd);
            }
            return true;
        }

        public override bool InsertSelect(string tableA, string[] fieldsA, string tableB, string[] valuesB)
        {
            SqliteCommand cmd = PrepReader(string.Format("INSERT INTO {0}{1} SELECT {2} FROM {3}",
                tableA,
                (fieldsA.Length > 0 ? " (" + string.Join(", ", fieldsA) + ")" : ""),
                string.Join(", ", valuesB),
                tableB
            ));

            try
            {
                ExecuteNonQuery(cmd);
            }
            catch (Exception e)
            {
                MainConsole.Instance.Error("[SqliteLoader] INSERT .. SELECT (" + cmd.CommandText + "), " + e);
            }
            CloseReaderCommand(cmd);
            return true;
        }

        #endregion

        #region REPLACE INTO

        public override bool Replace(string table, Dictionary<string, object> row)
        {
            return InsertOrReplace(table, row, false);
        }

        #endregion

        #region Delete

        public override bool DeleteByTime(string table, string key)
        {
            QueryFilter filter = new QueryFilter();
            filter.andLessThanEqFilters["(datetime(" + key.Replace("`", "") + ", 'localtime') - datetime('now', 'localtime'))"] = 0;

            return Delete(table, filter);
        }

        public override bool Delete(string table, QueryFilter queryFilter)
        {
            Dictionary<string, object> ps = new Dictionary<string, object>();
            string query = "DELETE FROM " + table + (queryFilter != null ? (" WHERE " + queryFilter.ToSQL(':', out ps)) : "");

            SqliteCommand cmd = new SqliteCommand(query);
            AddParams(ref cmd, ps);
            try
            {
                ExecuteNonQuery(cmd);
            }
            catch (Exception e)
            {
                MainConsole.Instance.Error("[SqliteDataManager] Delete(" + query + "), " + e);
                return false;
            }
            CloseReaderCommand(cmd);
            return true;
        }

        #endregion

        public override string ConCat(string[] toConcat)
        {
#if (!ISWIN)
            string returnValue = "";
            foreach (string s in toConcat)
                returnValue = returnValue + (s + " || ");
#else
            string returnValue = toConcat.Aggregate("", (current, s) => current + (s + " || "));
#endif
            return returnValue.Substring(0, returnValue.Length - 4);
        }

        #region Tables

        public override bool TableExists(string tableName)
        {
            var cmd = PrepReader("SELECT name FROM Sqlite_master WHERE name='" + tableName + "'");
            lock (GetLock())
            {
                using (IDataReader rdr = cmd.ExecuteReader())
                {
                    if (rdr.Read())
                    {
                        CloseReaderCommand(cmd);
                        return true;
                    }
                    else
                    {
                        CloseReaderCommand(cmd);
                        return false;
                    }
                }
            }
        }

        public override void CreateTable(string table, ColumnDefinition[] columns, IndexDefinition[] indices)
        {
            if (TableExists(table))
            {
                throw new DataManagerException("Trying to create a table with name of one that already exists.");
            }

            IndexDefinition primary = null;
            foreach (IndexDefinition index in indices)
            {
                if (index.Type == IndexType.Primary)
                {
                    primary = index;
                    break;
                }
            }

            List<string> columnDefinition = new List<string>();

            bool has_auto_increment = false;
            foreach (ColumnDefinition column in columns)
            {
                if (column.Type.auto_increment)
                {
                    has_auto_increment = true;
                }
                columnDefinition.Add(column.Name + " " + GetColumnTypeStringSymbol(column.Type));
            }
            if (!has_auto_increment && primary != null && primary.Fields.Length > 0)
            {
                columnDefinition.Add("PRIMARY KEY (" + string.Join(", ", primary.Fields) + ")");
            }

            var cmd = new SqliteCommand {
                CommandText = string.Format("create table " + table + " ({0})", string.Join(", ", columnDefinition.ToArray()))
            };
            ExecuteNonQuery(cmd);
            CloseReaderCommand(cmd);

            if (indices.Length >= 1 && (primary == null || indices.Length >= 2))
            {
                columnDefinition = new List<string>(primary != null ? indices.Length : indices.Length - 1); // reusing existing variable for laziness
                uint i = 0;
                foreach (IndexDefinition index in indices)
                {
                    if (index.Type == IndexType.Primary || index.Fields.Length < 1)
                    {
                        continue;
                    }

                    i++;
                    columnDefinition.Add("CREATE " + (index.Type == IndexType.Unique ? "UNIQUE " : string.Empty) + "INDEX idx_" + table + "_" + i.ToString() + " ON " + table + "(" + string.Join(", ", index.Fields) + ")");
                }
                foreach (string query in columnDefinition)
                {
                    cmd = new SqliteCommand
                    {
                        CommandText = query
                    };
                    ExecuteNonQuery(cmd);
                    CloseReaderCommand(cmd);
                }
            }
        }

        public override void UpdateTable(string table, ColumnDefinition[] columns, IndexDefinition[] indices, Dictionary<string, string> renameColumns)
        {
            if (!TableExists(table))
            {
                throw new DataManagerException("Trying to update a table with name of one that does not exist.");
            }

            List<ColumnDefinition> oldColumns = ExtractColumnsFromTable(table);

            Dictionary<string, ColumnDefinition> sameColumns = new Dictionary<string, ColumnDefinition>();
            foreach (ColumnDefinition column in oldColumns)
            {
#if (!ISWIN)
                foreach (ColumnDefinition innercolumn in columns)
                {
                    if (innercolumn.Name.ToLower() == column.Name.ToLower() || renameColumns.ContainsKey(column.Name) && renameColumns[column.Name].ToLower() == innercolumn.Name.ToLower())
                    {
                        sameColumns.Add(column.Name, column);
                        break;
                    }
                }
#else
                if (columns.Any(innercolumn => innercolumn.Name.ToLower() == column.Name.ToLower() ||
                                               renameColumns.ContainsKey(column.Name) &&
                                               renameColumns[column.Name].ToLower() == innercolumn.Name.ToLower()))
                {
                    sameColumns.Add(column.Name, column);
                }
#endif
            }

            string renamedTempTableColumnDefinition = string.Empty;
            string renamedTempTableColumn = string.Empty;

            foreach (ColumnDefinition column in oldColumns)
            {
                if (renamedTempTableColumnDefinition != string.Empty)
                {
                    renamedTempTableColumnDefinition += ", ";
                    renamedTempTableColumn += ", ";
                }
                renamedTempTableColumn += column.Name;
                renamedTempTableColumnDefinition += column.Name + " " + GetColumnTypeStringSymbol(column.Type);
            }

            var cmd = new SqliteCommand {
                CommandText = "CREATE TABLE " + table + "__temp(" + renamedTempTableColumnDefinition + ");"
            };
            ExecuteNonQuery(cmd);
            CloseReaderCommand(cmd);

            cmd = new SqliteCommand {
                CommandText = "INSERT INTO " + table + "__temp SELECT " + renamedTempTableColumn + " from " + table + ";"
            };
            ExecuteNonQuery(cmd);
            CloseReaderCommand(cmd);

            cmd = new SqliteCommand {
                CommandText = "drop table " + table
            };
            ExecuteNonQuery(cmd);
            CloseReaderCommand(cmd);

            List<string> newTableColumnDefinition = new List<string>(columns.Length);

            IndexDefinition primary = null;
            foreach (IndexDefinition index in indices)
            {
                if (index.Type == IndexType.Primary)
                {
                    primary = index;
                    break;
                }
            }

            bool has_auto_increment = false;
            foreach (ColumnDefinition column in columns)
            {
                if (column.Type.auto_increment)
                {
                    has_auto_increment = true;
                }
                newTableColumnDefinition.Add(column.Name + " " + GetColumnTypeStringSymbol(column.Type));
            }
            if (!has_auto_increment && primary != null && primary.Fields.Length > 0){
                newTableColumnDefinition.Add("PRIMARY KEY (" + string.Join(", ", primary.Fields) + ")");
            }

            cmd = new SqliteCommand {
                CommandText = string.Format("create table " + table + " ({0}) ", string.Join(", ", newTableColumnDefinition.ToArray()))
            };
            ExecuteNonQuery(cmd);
            CloseReaderCommand(cmd);

            if (indices.Length >= 1 && (primary == null || indices.Length >= 2))
            {
                newTableColumnDefinition = new List<string>(primary != null ? indices.Length : indices.Length - 1); // reusing existing variable for laziness
                uint i = 0;
                foreach (IndexDefinition index in indices)
                {
                    if (index.Type == IndexType.Primary || index.Fields.Length < 1)
                    {
                        continue;
                    }

                    i++;
                    newTableColumnDefinition.Add("CREATE " + (index.Type == IndexType.Unique ? "UNIQUE " : string.Empty) + "INDEX idx_" + table + "_" + i.ToString() + " ON " + table + "(" + string.Join(", ", index.Fields) + ")");
                }
                foreach (string query in newTableColumnDefinition)
                {
                    cmd = new SqliteCommand
                    {
                        CommandText = query
                    };
                    ExecuteNonQuery(cmd);
                    CloseReaderCommand(cmd);
                }
            }

            string InsertFromTempTableColumnDefinition = string.Empty;
            string InsertIntoFromTempTableColumnDefinition = string.Empty;

            foreach (ColumnDefinition column in sameColumns.Values)
            {
                if (InsertFromTempTableColumnDefinition != string.Empty)
                {
                    InsertFromTempTableColumnDefinition += ", ";
                }
                if (InsertIntoFromTempTableColumnDefinition != string.Empty)
                {
                    InsertIntoFromTempTableColumnDefinition += ", ";
                }
                if (renameColumns.ContainsKey(column.Name))
                    InsertIntoFromTempTableColumnDefinition += renameColumns[column.Name];
                else
                    InsertIntoFromTempTableColumnDefinition += column.Name;
                InsertFromTempTableColumnDefinition += column.Name;
            }

            cmd = new SqliteCommand {
                CommandText = "INSERT INTO " + table + " (" + InsertIntoFromTempTableColumnDefinition + ") SELECT " + InsertFromTempTableColumnDefinition + " from " + table + "__temp;"
            };
            ExecuteNonQuery(cmd);
            CloseReaderCommand(cmd);

            cmd = new SqliteCommand {
                CommandText = "drop table " + table + "__temp"
            };
            ExecuteNonQuery(cmd);
            CloseReaderCommand(cmd);
        }

        public override string GetColumnTypeStringSymbol(ColumnTypes type)
        {
            switch (type)
            {
                case ColumnTypes.Double:
                    return "DOUBLE";
                case ColumnTypes.Integer11:
                    return "INT(11)";
                case ColumnTypes.Integer30:
                    return "INT(30)";
                case ColumnTypes.UInteger11:
                    return "INT(11) UNSIGNED";
                case ColumnTypes.UInteger30:
                    return "INT(30) UNSIGNED";
                case ColumnTypes.Char36:
                    return "CHAR(36)";
                case ColumnTypes.Char32:
                    return "CHAR(32)";
                case ColumnTypes.Char5:
                    return "CHAR(5)";
                case ColumnTypes.String:
                    return "TEXT";
                case ColumnTypes.String1:
                    return "VARCHAR(1)";
                case ColumnTypes.String2:
                    return "VARCHAR(2)";
                case ColumnTypes.String16:
                    return "VARCHAR(16)";
                case ColumnTypes.String30:
                    return "VARCHAR(30)";
                case ColumnTypes.String32:
                    return "VARCHAR(32)";
                case ColumnTypes.String36:
                    return "VARCHAR(36)";
                case ColumnTypes.String45:
                    return "VARCHAR(45)";
                case ColumnTypes.String50:
                    return "VARCHAR(50)";
                case ColumnTypes.String64:
                    return "VARCHAR(64)";
                case ColumnTypes.String128:
                    return "VARCHAR(128)";
                case ColumnTypes.String100:
                    return "VARCHAR(100)";
                case ColumnTypes.String10:
                    return "VARCHAR(10)";
                case ColumnTypes.String255:
                    return "VARCHAR(255)";
                case ColumnTypes.String512:
                    return "VARCHAR(512)";
                case ColumnTypes.String1024:
                    return "VARCHAR(1024)";
                case ColumnTypes.String8196:
                    return "VARCHAR(8196)";
                case ColumnTypes.Blob:
                    return "blob";
                case ColumnTypes.LongBlob:
                    return "blob";
                case ColumnTypes.Text:
                    return "VARCHAR(512)";
                case ColumnTypes.MediumText:
                    return "VARCHAR(512)";
                case ColumnTypes.LongText:
                    return "VARCHAR(512)";
                case ColumnTypes.Date:
                    return "DATE";
                case ColumnTypes.DateTime:
                    return "DATETIME";
                case ColumnTypes.Float:
                    return "float";
                case ColumnTypes.Unknown:
                    return "";
                case ColumnTypes.TinyInt1:
                    return "TINYINT(1)";
                case ColumnTypes.TinyInt4:
                    return "TINYINT(4)";
                default:
                    throw new DataManagerException("Unknown column type.");
            }
        }

        public override string GetColumnTypeStringSymbol(ColumnTypeDef coldef)
        {
            string symbol;
            switch (coldef.Type)
            {
                case ColumnType.Blob:
                case ColumnType.LongBlob:
                    symbol = "BLOB";
                    break;
                case ColumnType.Boolean:
                    symbol = "TINYINT(1)";
                    break;
                case ColumnType.Char:
                    symbol = "CHAR(" + coldef.Size + ")";
                    break;
                case ColumnType.Date:
                    symbol = "DATE";
                    break;
                case ColumnType.DateTime:
                    symbol = "DATETIME";
                    break;
                case ColumnType.Double:
                    symbol = "DOUBLE";
                    break;
                case ColumnType.Float:
                    symbol = "FLOAT";
                    break;
                case ColumnType.Integer:
                    if (!coldef.auto_increment)
                    {
                        symbol = "INT(" + coldef.Size + ")";
                    }
                    else
                    {
                        symbol = "INTEGER PRIMARY KEY AUTOINCREMENT";
                    }
                    break;
                case ColumnType.TinyInt:
                    symbol = "TINYINT(" + coldef.Size + ")";
                    break;
                case ColumnType.String:
                    symbol = "VARCHAR(" + coldef.Size + ")";
                    break;
                case ColumnType.Text:
                case ColumnType.MediumText:
                case ColumnType.LongText:
                    symbol = "TEXT";
                    break;
                case ColumnType.UUID:
                    symbol = "CHAR(36)";
                    break;
                default:
                    throw new DataManagerException("Unknown column type.");
            }
            return symbol + (coldef.isNull ? " NULL" : " NOT NULL") +
                ((coldef.isNull && coldef.defaultValue == null) ? " DEFAULT NULL" :
                (coldef.defaultValue != null ? " DEFAULT " + (coldef.defaultValue.StartsWith("'") && coldef.defaultValue.EndsWith("'") ? coldef.defaultValue : "'" + coldef.defaultValue + "'") : ""));
        }

        protected override List<ColumnDefinition> ExtractColumnsFromTable(string tableName)
        {
            List<ColumnDefinition> defs = new List<ColumnDefinition>();
            IndexDefinition primary = null;
            bool isFaux = false;
            foreach (KeyValuePair<string, IndexDefinition> index in ExtractIndicesFromTable(tableName))
            {
                if (index.Value.Type == IndexType.Primary)
                {
                    isFaux = index.Key == "#fauxprimary#";
                    primary = index.Value;
                    break;
                }
            }

            var cmd = PrepReader(string.Format("PRAGMA table_info({0})", tableName));
            lock (GetLock())
            {
                using (SqliteDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        if (rdr.HasRows)
                        {

                            var name = rdr["name"];
                            var type = rdr["type"];
                            object defaultValue = rdr["dflt_value"];

                            ColumnTypeDef typeDef = ConvertTypeToColumnType(type.ToString());
                            typeDef.isNull = uint.Parse(rdr["notnull"].ToString()) == 0;
                            typeDef.defaultValue = defaultValue == null || defaultValue.GetType() == typeof(System.DBNull) ? null : defaultValue.ToString();

                            if (
                                uint.Parse(rdr["pk"].ToString()) == 1 &&
                                primary != null &&
                                isFaux == true &&
                                primary.Fields.Length == 1 &&
                                primary.Fields[0].ToLower() == name.ToString().ToLower() &&
                                (typeDef.Type == ColumnType.Integer || typeDef.Type == ColumnType.TinyInt)
                            )
                            {
                                typeDef.auto_increment = true;
                            }

                            defs.Add(new ColumnDefinition
                            {
                                Name = name.ToString(),
                                Type = typeDef,
                            });
                        }
                    }
                    rdr.Close();
                }
            }
            CloseReaderCommand(cmd);

            return defs;
        }

        protected override Dictionary<string, IndexDefinition> ExtractIndicesFromTable(string tableName)
        {
            Dictionary<string, IndexDefinition> defs = new Dictionary<string, IndexDefinition>();
            IndexDefinition primary = new IndexDefinition
            {
                Fields = new string[]{},
                Type = IndexType.Primary
            };

            string autoIncrementField = null;

            List<string> fields = new List<string>();

            SqliteCommand cmd = PrepReader(string.Format("PRAGMA table_info({0})", tableName));
            lock (GetLock())
            {
                using (SqliteDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        if (rdr.HasRows)
                        {

                            if (uint.Parse(rdr["pk"].ToString()) > 0)
                            {
                                fields.Add(rdr["name"].ToString());
                                if (autoIncrementField == null)
                                {
                                    ColumnTypeDef typeDef = ConvertTypeToColumnType(rdr["type"].ToString());
                                    if (typeDef.Type == ColumnType.Integer || typeDef.Type == ColumnType.TinyInt)
                                    {
                                        autoIncrementField = rdr["name"].ToString();
                                    }
                                }
                            }
                        }
                    }
                    rdr.Close();
                }
            }
            CloseReaderCommand(cmd);
            primary.Fields = fields.ToArray();

            cmd = PrepReader(string.Format("PRAGMA index_list({0})", tableName));
            Dictionary<string, bool> indices = new Dictionary<string, bool>();
            lock (GetLock())
            {
                using (SqliteDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        if (rdr.HasRows)
                            indices[rdr["name"].ToString()] = (uint.Parse(rdr["unique"].ToString()) > 0);
                    }
                    rdr.Close();
                }
            }
            CloseReaderCommand(cmd);

            bool checkForPrimary = primary.Fields.Length > 0;
            foreach (KeyValuePair<string, bool> index in indices)
            {
                defs[index.Key] = new IndexDefinition
                {
                    Type = index.Value ? IndexType.Unique : IndexType.Index
                };
                fields = new List<string>();
                cmd = PrepReader(string.Format("PRAGMA index_info({0})", index.Key));
                lock (GetLock())
                {
                    using (SqliteDataReader rdr = cmd.ExecuteReader())
                    {
                        while (rdr.Read())
                        {
                            if (rdr.HasRows)
                                fields.Add(rdr["name"].ToString());
                        }
                        rdr.Close();
                    }
                }
                defs[index.Key].Fields = fields.ToArray();
                CloseReaderCommand(cmd);
                if (checkForPrimary && defs[index.Key].Fields.Length == primary.Fields.Length)
                {
                    uint i = 0;
                    bool isPrimary = true;
                    foreach (string pkField in primary.Fields)
                    {
                        if (defs[index.Key].Fields[i++] != pkField)
                        {
                            isPrimary = false;
                            break;
                        }
                    }
                    if (isPrimary)
                    {
//                        MainConsole.Instance.Warn("[" + Identifier + "]: Primary Key found (" + string.Join(", ", defs[index.Key].Fields) + ")");
                        defs[index.Key].Type = IndexType.Primary;
                        checkForPrimary = false;
                    }
                }
            }

            if (checkForPrimary == true && autoIncrementField != null)
            {
                primary = new IndexDefinition
                {
                    Fields = new string[1] { autoIncrementField },
                    Type = IndexType.Primary
                };
                defs["#fauxprimary#"] = primary;
            }

            return defs;
        }

        public override void DropTable(string tableName)
        {
            var cmd = new SqliteCommand {CommandText = string.Format("drop table {0}", tableName)};
            ExecuteNonQuery(cmd);
            CloseReaderCommand(cmd);
        }

        public override void ForceRenameTable(string oldTableName, string newTableName)
        {
            var cmd = new SqliteCommand
                          {
                              CommandText =
                                  string.Format("ALTER TABLE {0} RENAME TO {1}", oldTableName,
                                                newTableName + "_renametemp")
                          };
            ExecuteNonQuery(cmd);
            cmd.CommandText = string.Format("ALTER TABLE {0} RENAME TO {1}", newTableName + "_renametemp", newTableName);
            ExecuteNonQuery(cmd);
            CloseReaderCommand(cmd);
        }

        protected override void CopyAllDataBetweenMatchingTables(string sourceTableName, string destinationTableName, ColumnDefinition[] columnDefinitions, IndexDefinition[] indexDefinitions)
        {
            var cmd = new SqliteCommand
                          {
                              CommandText =
                                  string.Format("insert into {0} select * from {1}", destinationTableName, sourceTableName)
                          };
            ExecuteNonQuery(cmd);
            CloseReaderCommand(cmd);
        }

        #endregion

        public override IGenericData Copy()
        {
            return new SQLiteLoader();
        }
    }
}


text:
Police: Infant died from serious injuries, guardian arrested
A one-year-old baby was not breathing Wednesday when he was taken to the hospital with serious injuries, Dover police said.
Police: Infant died from serious injuries, guardian arrested A one-year-old baby was not breathing Wednesday when he was taken to the hospital with serious injuries, Dover police said. Check out this story on delawareonline.com: https://www.delawareonline.com/story/news/crime/2019/01/03/police-infant-died-serious-injuries-guardian-arrested/2476794002/
Josephine Peterson, Delaware News Journal Published 6:01 p.m. ET Jan. 3, 2019
Edjuan Blackshear, 29, was charged with child abuse and endangering the welfare of a child.(Photo: Courtesy of Dover Police Department)
The infant, Miles Duncan, sustained multiple injuries to his head and torso. He also suffered internal injuries, Master Cpl. Mark Hoffman of Dover police said.
Duncan was initially sent to Bayhealth Kent General Hospital before he was transported to A.I. DuPont Children's Hospital, where he died early Thursday morning.
Edjuan Blackshear, 29, was the only one home with Duncan at the time, Hoffman said. He was arrested and charged with child abuse and endangering the welfare of a child. He was jailed at the Sussex Correctional Institution in lieu of $101,000 cash-only bond.
Police are still collecting information on the case, and additional charges are expected to be added. Hoffman said. Delaware's Office of the Attorney General will also be investigating.
Police looking for man who allegedly tried to lure girls from Walmart to his SUV
After string of thefts from vehicles in Frankford area, police make arrest
Read or Share this story: https://www.delawareonline.com/story/news/crime/2019/01/03/police-infant-died-serious-injuries-guardian-arrested/2476794002/
These national brands could be leaving Delaware soon
Paralyzed Wilmington man faced $9,000 water bill
Fiancee questions police story after fatal officer-involved shooting
Former Wilmington mayor Hal Haskell dies

redpajama_set_name: RedPajamaCommonCrawl


I had a toe fusion end of July, had soft cast one week, then hard cast 5 weeks, now wearing boot for another 4 weeks - no more appts. to see doctor. After first week of wearing boot, I had taken off boot inside house and walked a short distance to window, turned around to go back to sit in chair and I jammed my big toe that I had fusion on into piece of furniture. Toe/foot swelled with GREAT pain - had feelings of painful cramping mixed with throbbing pain and couldn't walk on it. Iced and elevated and next day, feels much better, however, still painful ESPECIALLY in area underneath big toe near fusion. Also, I have two screws. I'm hoping I didn't loosen screws or undo anything from surgery and that this is just a setback to my recovery. Thank you.
You are nine weeks post surgery, according you my math, when you jammed your toe. In theory your joint should be fused by now, BUT, trauma to the surgical site could still cause damage.
At the very least you may have loosened a screw which could end up being a problem even in itself, without hurting the fusion.
The fact that your surgeon requested you wear a boot for another four weeks suggests to me that your surgeon still had some concerns about the surgical site.
I tell my surgical patients all the time that if there is any trauma to their surgical site to call me and let me know about it. Based on the report the patient gives me determines whether or not I want to see them.
I would think your surgeon would also be interested in knowing about the trauma you sustained to your great toe. He or she may want to examine the surgical site, might even want to take an x-ray to see if there has been any damage to the surgery.
I would also think you would want your doctor to take a look at the foot as you have probably made a lot of sacrifices in order to go through the surgery and the recovery period, and would not want all that effort to go to waste.


text:
The journey west online text
There and Back. The first thing to know about Monkey is that it is a version of a story called Journey to the West. Journey to the West was first published in with the Chinese title Hsi Yu Ki, (Records of the Western World); this was translated into English as Journey to the West. We're reading a classic translation of Hsi Yu Ki called Monkey. Journey to the West after a pilgrimage said to have taken fourteen years (the text actually only provides evidence for nine of those years, but presumably there was room to add additional episodes) they arrive at the half-real, He recorded his journey in the book Journey to the West Author: Wu Cheng'en. Journey to the West Chapter 1 4. It awes the jade sea into calm: Amid the snowy breakers the sea−serpent rises from the deep. It rises high in the corner of the world where Fire and Wood meet; Its summit towers above the Eastern Sea. Red cliffs and strange rocks; Beetling crags and jagged peaks.
There and Back. The first thing to know about Monkey is that it is a version of a story called Journey to the West. Journey to the West was first published in with the Chinese title Hsi Yu Ki, (Records of the Western World); this was translated into English as Journey to the West. We're reading a classic translation of Hsi Yu Ki called Monkey. Quick Intro. Basically, Journey to the West is about Tang San Zang's journey to the west (duh) and the difficulties he and his disciples face in between. It is overflowing with magic, demons, gods, immortals, and scrumptious action and adventure! It has lots of humor and some angst as well. Journey to the West Earliest known edition of the book from the 16th century Author Wu Cheng'en Original title 西 遊 記 Country Ming China Language Chinese Genre Gods and demons fiction, Chinese mythology, fantasy, adventure Publication date c. (print) Journey to the West Journey to the West in Traditional (top) and Simplified (bottom) Chinese characters Traditional Chinese 西遊記 Author: Wu Cheng'en. Journey to the West after a pilgrimage said to have taken fourteen years (the text actually only provides evidence for nine of those years, but presumably there was room to add additional episodes) they arrive at the half-real, He recorded his journey in the book Journey to the West Author: Wu Cheng'en. Journey to the West Chapter 1 4. It awes the jade sea into calm: Amid the snowy breakers the sea−serpent rises from the deep. It rises high in the corner of the world where Fire and Wood meet; Its summit towers above the Eastern Sea. Red cliffs and strange rocks; Beetling crags and jagged peaks.Those scriptures are secret, Taoist texts. What can you be but an Immortal?" "I won't deceive you," said the woodcutter, "That song was indeed taught to me by. The geography described in the book is, however, almost entirely fantasy; once Xuanzang departs Chang'an, the Tang capital, and crosses the. Journey to the West, Chapter by chapter. Chapter 1 - The Divine Root Conceives and the Spring Breaks Forth, As the Heart's Nature Is Cultivated, the Great Way. Journey to the West: english version - Kindle edition by Cheng En WU. Download it once Life Reset: Hobnobbing (New Era Online Book 3). Shemer Kuznits. Journey to the West or Xiyou Ji is a Chinese novel published in the 16th century during the . He recorded his journey in the book Great Tang Records on the Western Regions. .. Legend of Wukong · Monkey Hero · Monkey Magic · Saiyuki : Journey West · SonSon · Westward Journey Online II · Whomp 'Em · Yūyūki.
Guns N' Roses - Sweet Child O' Mine (Official Music Video), time: 5:03
Tags:Ceramah kh malik sanusi dantata,Itil service strategy 2011 edition,East st louis toodle oo pdf,Did tv show services
2 thoughts on "The journey west online text"
Faunris says:
Quite right! I think, what is it good idea.
Taukree says:
It is remarkable, very valuable information
Baidu browser 2016 yearly calendar
Schreibmaschinenkurs programme ware s
3crwer100 75 software s
Mitsubishi tokyo drift gta sa mac
Dujas on The journey west online text


"To equip the saints for the work of ministry."
"Therefore encourage one another and build each other up."
"Love one another-as I have loved you."
Our congregation's Stephen Ministry equips lay people to provide confidential, one-to-one Christian care to individuals in our congregation and community who are experiencing a crisis or difficulty, such as . . .
Do you know someone else-perhaps a friend, neighbor, coworker, or relative-who could benefit from Stephen Ministry?
Do you have any other questions about Stephen Ministry?
To learn more, email stephenministry@harvestdothan.com or call the church office (334) 702-6555 and ask to speak to a Stephen Leader or our Congregational Care Pastor.


I'm attempting to feature 24 doors for my very own Tonbridge Advent Calendar. This could fail dreadfully as I found No.1 very difficult to find, but I'm always up for a challenge.
If you have an interesting or attractive front door, or know where one can be found, let me know. Of course the door will have to be numbered between 1 to 24 ... Here goes with the first one.


text:
Live Now: Arkansas vs. Kentucky
NCAA Baseball Championship – Auburn Regional - Auburn, Alabama
SE Louisiana
Auburn1-0
Big bats break records in Auburn's regional opener win
Auburn Athletics
Photo: Auburn Athletics
AUBURN, Ala. - The elephant in the room quickly became the Tiger in the park.
Cole Foster crushed three of Auburn's seven home runs and drove in nine to lead the Tigers to a 19-7 victory Friday in the opening day of the Auburn Regional at standing-room-only Plainsman Park.
In the buildup to Auburn's first home regional in 12 years, head coach Butch Thompson referred to the Tigers' recent offensive woes as "the elephant in the room."
Auburn quickly addressed that concern by scoring 11 first-inning runs, equaling in just one inning the Tigers' combined output in their previous four games.
"Great night for us," Thompson said. "The entire lineup came out swinging. We've been looking for that. When you see them invest in something and then get rewarded for it, that's a good feeling."
Playing for the first time in seven games while recovering from an oblique injury, Foster drilled a towering two-run homer over the Green Monster in left field after Blake Rambusch led off with a single.
After Sonny DiChiara singled, Bobby Peirce homered to right-center to give Auburn a 4-0 lead. The Tigers' first eight batters reached base, with Brooks Carlson doubling and scoring on a balk to make it 5-0.
Batting ninth, Mike Bello's sacrifice fly scored Brody Moore to put Auburn ahead 6-0
After Rambusch was hit by a pitch to load the bases, Foster wrote his name in the record books by hitting a grand slam for a 10-0 Tigers advantage.
The switch-hitting Foster batted right-handed for his first homer and left-handed for his second, becoming the first player in program history to homer from both sides of the plate in the same inning, a feat only three players in Major League Baseball history have accomplished, including former Auburn standout Mark Bellhorn.
DiChiara followed with Auburn's fourth homer for an 11-0 lead to cap the first-inning fireworks, the Tigers' first four-homer inning since 2010.
Auburn's power surge continued in the second inning with a solo homer from Nate LaRue and a Rambusch double that plated Bello to make it 13-1.
Batting left-handed in the bottom of the fourth, Foster became the first player in program history to homer three times in an NCAA Tournament game, smashing a three-run shot to right field.
"It's definitely awesome to have a night like this," Foster said. "I'm just glad we came out on top."
Foster doubled in the eighth to finish with 14 total bases, equaling a program record shared by Tony Caldwell (2011), Bo Jackson (1985) and Bob Berry (1982).
LaRue's second homer, a solo shot in the sixth, helped the Tigers tie the program record for most home runs in a game with seven.
Auburn tacked on two more in the eighth, tying its season high with 19 runs on a season-best 20 hits.
Nine different players recorded a hit in the game, including six with multiple hits. Auburn starter Trace Bright (4-4, 4.80) benefited from that bountiful run support, striking out a career-high 10 while allowing four runs in five innings. The Tigers have won the past six games in which Bright has started.
"It's comforting to have 11 runs in the first inning," Bright said. "Kudos to Cole and everybody else up and down the lineup. You've still got to stay locked in, you've still got to stay focused, you've still got to treat it like a 0-0 ballgame."
Konner Copeland struck out four in 2.2 innings and Brooks Fuller recorded the final four outs of Auburn's program-record seventh consecutive regional victory.
Southeastern Louisiana starter Adam Guth failed to record an out, allowing earned runs to all eight batters he faced, to fall to 4-2.
Fans packed the Tigers Terrace down the left-field line, filled each level of the stadium parking deck and enjoyed a warm afternoon and evening under tents beyond the fence in right-center field.
"Everybody's worked during our tenure here for seven years to create a night like that in our ballpark," Thompson said. "That's special."
"Growing up an Auburn fan, it's amazing to see that kind of crowd for this environment to be what it was tonight," said Bright, a native of nearby Montgomery. "We hope to continue that all weekend. It's amazing to play behind."
Auburn (38-19) will play Florida State Saturday at 6 p.m. CT in the winner's bracket while Southeastern Louisiana (30-30) meets UCLA Saturday at noon CT in an elimination game.
Foster says 'it's good to be back' after Auburn's win


In 2014, HPS published a briefing note 'Air Quality (PM2.5 particulate air pollution) and Mortality in Scotland'. This provided information on the sources and levels of anthropogenic (manmade) air pollution in Scotland.
It also described the estimated impact of exposure to manmade fine particulate matter (PM2.5), much of which is derived from road transport vehicles.
This briefing provides an update to that briefing note with more recent data, up to 2016, for both PM2.5 levels and for estimated excess attributable mortality at both Scotland and individual local authority level.


text:
Settings Subscribe
NumisTip
Collecting Old Australian Coins
Walter Eigner Collecting old Australian coins provides a fascinating glimpse into Australia's history through its circulating coinage. While there is a general impression that old coins are too expensive for new collectors to collect that couldn't be further from the truth. For just a few dollars you could obtain a later year mint-state pre-decimal coin, and for less than the cost of a modern proof set you can purchase a George V (1911-1936) pre-decimal coin. 1-Nov-2019
The case for certified coins
Walter Eigner The debate on certified coins vs uncertified coins has been going on in Australia since PCGS first reached the mainstream Australian market back in 2008. While today most Australian coin collectors favour PCGS graded coins, a recent incident has reaffirmed the importance of and buying certified coins and valuing them first, especially when buying on-line. 5-Oct-2019
Valuing Old Coins
Walter Eigner By far the most common question we get asked is "what is my coin worth?" Perhaps you found a few old coins which is why you're here reading this article. Maybe you're a seasoned collector already looking to get more precise values for your coins than the printed catalogues can offer. Perhaps you're an investor looking to value your coin portfolio. This guide will cover all of that. 28-Sep-2019
The Silver of Edward VII
Walter Eigner Although Australia had been a nation since 1901, it wasn't until 1910 that her first official coins were produced. While the Melbourne mint was producing sovereigns and half sovereigns at the time, these were technically Imperial British coins. The first coins issued specifically for Australia were struck in silver and of the denominations threepence, sixpence, shilling, and florin. These featured the Australian Coat of Arms on the reverse and the crowed bust of King Edward VII on the obverse. 10-Sep-2019
Sydney Mint Half Sovereigns
Walter Eigner The discovery of gold in the colony New South Wales in 1851 prompted a surge of immigration among prospectors seeking wealth in the new colony. This lead to the production of half sovereigns in Sydney as of 1855. Only 3.3 million half sovereigns were produced from 1855 to 1869 resulting in individual years being very scarce and valuable. To add to this, the high bullion content of Sydney mint half sovereigns, which were alloyed with silver, compared with their British counterparts, which were alloyed with copper...
Previous Page: IntroductionNext Page: Type II - Wreathed Bust
Half Sovereigns of the Sydney Mint (1853 - 1869)
Type I - Filleted Bust
The first business strike half sovereigns struck at the Sydney Mint were dated 1855 and 1856. Rather than using copper to harden the metal as the Royal Mint did, the Sydney Mint used silver. The reverse design featured a banksia wreath tied into a bow surrounding the word AUSTRALIA; these are positioned below a crown with the legend SYDNEY MINT and HALF SOVEREIGN encircling the entire design. This design was short-lived with the Sydney Mint reverting to the imperial shield design in 1871.
The first two years featured the filleted bust of Queen Victoria designed by James Wyon and is known as the Type I design. This design was replaced in 1857 by the wreathed bust of Queen Victoria or Type II design, designed by cousin Leonard Charles Wyon, son of William Wyon, engraver of the standard Young Head bust used since 1839. Patterns of the L.C. Wyon design were struck dated 1855 and 1856 with the 1855 dies used for business strikes, most likely in 1857 prior to being overdated to 1857.
Excluding varieties, overdates and the exceedingly rare 1855 Type II, the key date of the series is undoubtedly the 1855. The 1855 dated Type I half sovereign is very rare being survived by approximately 55 to 60 examples. The 1860 is also rare with an estimated 200 to 250 surviving examples.
The Sydney mint series is marked by low survival rates, likely due to the gold-silver alloy giving them a higher intrinsic value than their face value making it profitable to melt them down for their metal content. This gold-silver alloy continued for the entire series despite official protests to the Colonial Treasurer by Sydney based chemist Charles Watt with the Mint Master arguing that the extra value from the silver content was a decided advantage.
Out of the Type I series, only the 1856 can be readily acquired with lower grade examples being reasonably common and higher grade examples having survived through the Indian hoard. Survival rates of the 1855 are higher than the rest of the series at about 1 in 400 due to being a known rarity for much of its existence. This has meant that examples have survived regardless of condition thus leading to a higher proportion of problematic examples surviving when compared to the rest of the series which saw problem coins melted over the years. Despite the higher survival rate, the tiny mintage of just 21,000 has meant that the survival count is nonetheless very low.
Some 1856 half sovereigns were struck from a reworked 1855 die and can be identified by sharp corners on the 6 consistent with the 5 punch a tiny dot after the date as per figure 18565ODHALF. Although the dot's location matches that of the 1855's dot, it is typically smaller due to die wear and it is entirely possible that the dot may have been filled or worn away prior to the retirement of the die. Further research is required to determine if 1856/5 overdates exist without the dot.
In addition to these, some 1856 half sovereigns were struck with a simpler reverse made from a reworked pattern die. The positioning and count of the berries are different along with the general shape of the design and a number of other minor features. These can easily be identified by a missing berry above L of HALF on the reverse and only 1 berry before the H of HALF like in figure 1856ALT compared with the standard reverse in figure 1856STD.
In addition to the 1855 and 1856 issues, four pairs of 1853 dated pieces were struck at the Royal mint London in order to seek approval for the colony�s Sydney mint design. Three of these pairs now exist in museums with the last in private hands.
562GoodVGFineVFEFaUNC 563GoodVGFineVFEFaUNCUNC 564GoodVGFineVFEFaUNCUNC 565VGFineVF 561Proof


Kate Francis Battersby is an Auckland based Food and Lifestyle photographer.
What's the best thing about photographing food?
It stays still… most of the time. Ice Cream doesn't like to stay still.
What attracted you to food photography?
Talk about some of the challenges you face when photographing food.
You need to be quite quick because it will always look its best when fresh. Also you need to make sure the light and the focus is on the right part not just the pretty part. I work with natural light so sometimes when shooting a book it is a rush to get all the shots in early enough. We can sometime get in 16 shots a day when shooting books, its extremely fun but also quite gruelling.
Do you get tasting Benefits?
YES. I have had to learn some self control over the years. I have eat my way through a few books now.
Which part of photography do you like best ie. Shooting, editing etc?
I really love the buzz of being on a shoot day. I have had the great pleasure of work with an amazing team over the years. It's great when you can have a team who don't take anything to seriously and can have a laugh during the day, especially when you are working multiple longs days at a time.
What do you dislike about working as a creative?
The thing I dislike I guess is really that anyone can be a "creative" these days. I find that a lot of Influencers are biding for the same work but not providing the same quality outcomes that you get from someone who actually does these things for a living and has trained. Not all, but more and more are popping up. Also I feel like it is very easy to be taken advantage of when it comes to being paid. Sure exposure is great and all that, but whats even better is being able to pay your rent.
What informs your creativity outside of photography?
I do a bit of pottery and illustration in my own time and I love the different colours and shapes that can be made. It also reminds me to slow down a bit, because they are not fast mediums. In photography I think that everything can happen very quickly and you move from shot to shot very fast. Sometimes its nice to take a bit longer to set up the shot and really think about what you are doing and what goes where. Treat the shot like a vase or a painting that can't be fixed up in photoshop later, make everything very purposeful and deliberate.
I love publications. I have had an idea to try and get a book on Te Rongoa (Native NZ herbal medicines) published but to have it also act as a guide. An informative, educational tool that is shot and designed beautifully.
I would love to just travel and photograph cookbooks all over the world. I would also love to do a bit more creative direction, i've got a lot of ideas but not all the skills or hands to be able to put them into action.
You also shoot a bit of lifestyle how do the two styles interlink for you?
I do shoot "lifestyle", but only really because thats what the client will want. I don't think I have any lifestyle type shots in any of my personal work. I love portraits and still life when I am doing my own thing. In terms of food I like using lifestyle photos as a context image for the ingredient or place. I think people like to feel part of the scene and that is adds another sensory aspect to the food.
Any words of wisdom that inspire you to keep going?
This last year has been a particularly hard one for me professionally, but I also find that when things are really tough it can be a good time to re-evaluate what you want and what you like. I don't have any words of wisdom - I'm not a words person, i'm a visual person. If doesn't look right, maybe its not, I find that relatable both in life and in work.


This product contains 2 documents written by 1 different author. Each author covered all of Administrative Law in approximately 60 pages , but we combine a variety of authors from various years to maximize the possibility that your exam topics are well covered and in a learning style that suits you.
Thorough exam notes for Administrative Law.


Arthritis 101 is a series of research-based information workshops and arthritis screening clinics that will be delivered across Canada this Fall. The workshops will be hosted by the Alliance for the Canadian Arthritis Program (or "ACAP") - a group of over 20 different national and regional stakeholder groups working on behalf of Canadians with arthritis. They are designed to inform Canada's federal and provincial elected officials about latest information on arthritis prevention and care and about the national standards developed at the Summit on Standards for Arthritis Prevention and Care (November 1-2, 2005).
This workshop is very important for people living with arthritis in New Brunswick. The first step is informing the government around the needs of people with arthritis and which of those are not currently being met. Change happens at the government level so awareness about arthritis is critical.
The workshop will be held during a weekday morning, ideally when the legislative house is sitting. Breakfast and presentations will be held first at a venue to be announced. After, an arthritis screening test for all government officials will take place at the legislative building.
The planning committee for Arthritis 101 is looking for two to three people with arthritis to participate as consumer ambassadors in the planning, organization and attending the workshop.


Here is Colin Frederick Clune's obituary. Please accept Everhere's sincere condolences.
With heavy hearts, at the age of 79, we announce the death of Colin Frederick Clune (Balcatta, Western Australia), who passed away on April 4, 2019. Family and friends are welcome to send flowers or leave their condolences on this memorial page and share them with the family. A funeral service will be held on Friday, April 12th 2019 at 10:00 AM at the Seasons Balcatta Chapel (401 Wanneroo Rd, Balcatta WA).
Here are the tributes to Colin Frederick Clune who passed away in Balcatta, Western Australia.
Would you like to offer Colin Frederick Clune's loved ones a condolence message? Write your message of sympathy today.
There are no additional memories for Colin Frederick Clune at this time. You can add a memory to pay tribute to Colin Frederick Clune at any time.


Research. You need to know what others are selling before you decide what wares you will offer. Lots of people sell handmade items, but those who work hard to make their items unique in some way are the ones who truly stand out. After you've decided on a product, check out the other sellers on Etsy and find what they're offering, and then figure out how you can do it differently.


text:
Е́ктор Хосе́ Ка́мпора (, *26 березня 1909 — †19 грудня 1980), також відомий як Ель Ті́о (), — аргентинський політик, який тимчасово виконував обов'язки президента Аргентини з 25 травня по 13 липня 1973 року.

Примітки

Посилання
 Біографія

redpajama_set_name: RedPajamaWikipedia


Hello! Thank you for taking the time to read our story and learn more about our family. We are very proud of you and the decisions you have made to reach this point. We know that even as you are choosing life for your child, you are also choosing loss for yourself. What a selfless gift! We respect and admire you for your courage.
We met in college through mutual friends. Caleb always says it was love at first sight! After 2 years of dating, we got married. Since our wedding, we have moved 8 times, traveled to 6 different countries, had 3 children, and finished 1 graduate program. We are now settled in a beautiful town in Georgia and love the life with which the Lord has blessed us!
We have always desired to have a large family. After having three biological children, we felt as though the Lord was leading us to grow our family through adoption. When we told our oldest daughter, Lucy, of our desire to grow our family, she immediately said, "We should adopt!" What a blessing that the Lord has already been at work in our children's hearts.
Adoption is the best picture of the way we are brought into Christ's family as brothers and sisters of Jesus and co-heirs to His inheritance. We will honor our child's culture and heritage, and celebrate his or her differences and similarities to our family and children. Your child's story will be a little different than his or her brother and sisters, and we are excited to see how it unfolds and the role we will play in it. Thank you for considering allowing us to welcome your child into our family!


"The best product at the best price"
Perfect specifications and technical accomplishment count for nothing unless a product can unlock the power, the excitement and the emotion of Music.
Concert Sound Installation Consultancy Services is a full service that offers all major brands of Audio products. By being a large Audio specialist and a web based reseller, it permits us to pick our Suppliers based on their product quality.
Concert Sound Installation Consultancy Services will give you the Power and the best of the best within your budget. we will help plan, budget and commosion your project whether it be a House of Worship, Concert Hall, Stadium, arena, Night club. Whether you need a simple Public Address System or a fully integrated remote controlled PA sytem, right the way though to fully fledged EN54 Complient voice alarm system we are here to help. just call us.
Concert Sound Installation takes a well-executed and systematic approach to each phase of the design.
Concert Sound Installation specializes in providing the custom design needed for a successfully integrated Audio system.
We join all these elements and more, that require essential care and coordination, include electrical, the interior and architectural requirements, noise restraint, sound and acoustic considerations, lighting, and other building elements, even furniture. The Audio system ideas that we suggest are in accordance with all these factors.
Concert Sound Installation will provide a no obligation quote based on the best available equipment at the best available prices for your application.
Concert Sound Installation can arrange Finance, with conditions and subject to status.
Have you ever been in a place when the sound is loud, hard and tinny?
It is a proven fact that bulk standard off the shelf and domestic audio systems wrongly used in the place you were in, when turned up, can emit harmonic distortions.
This hard and tinny sound, to the listener, is perceived as volume.
The harmonic distortions produced by such systems actually attack the inner ear and certain areas of the brain; it can cause a tired, agitated, fatigued, and sometimes aggressive reaction.
This reaction is what you felt.
The X Factor is achieved when certain Professional Audio products are brought together, producing an impact, sound, feel and atmosphere that promotes an amazing uplifted sensation of well-being, which in turn leads to an immediate sense of belonging and a desire to return.
Our Clients have told us that after the Installation of our handpicked Products, the attendance in their Venue, Establishment or Outlet, have increased by up to 50% but more importantly the customers stayed longer.


Reading has now become a major part of my life, with University getting in the way, I couldn't read as much as I would have liked. Now I'm regularly taking part in Blog Tours, hosted by the amazing Neverland Blog Tours., I am reading every month now. Last month, I said I would try and make this a monthly feature on An Ocean Glimmer and I'm pleased to say I will feature on Blog Tours all the way to January 2018!
I know that feels like forever away, but if you read my Monthly Favourites, you'll know how quick I feel this year is going. This week is the Blog Tour for 37 Hours by J. F. Kirwan, the second book in the Nadia Laksheva Spy Thriller Series. I am really excited to share with you, my thoughts on 37 Hours and today I am sharing the day with Sarah over at Sunshine Sarah xo.
But her mysterious nemesis is always one step ahead and the clock is ticking. In 37 Hours, the warhead will explode, reducing the city of London to a pile of ash. Only this time, Nadia is prepared to pull the trigger at any cost… The deadly trail will take her from crowded Moscow to the silent streets of Chernobyl.
Will Nadia find what she is looking for before the clock hits zero?
I feel this is one of those books I'll never forget! I just could not put it down and I will admit I only started 37 Hours last weekend and I managed to finish it before Monday, that was even with working on Saturday. I love Kirwan's way of writing and he had me sitting on the edge of my seat, especially towards the end, he is a very talented author. I know this is the second book in the series but it definitely did not feel that way!
I love books like that as you can just pick it up and read. I've done it before where I've picked up the second or even third book and I'm clueless over what's happened and nothing makes sense. I probably will go back and read 66 Metres as at the beginning events from this book are spoken about and I'm intrigued to read what exactly happened. I was able to connect really well with the characters, especially Nadia.
I suppose this is something we all wish for, with characters we like, I also love how much diving is involved in the book. You can most definitely tell she is a diver, and this is related back to Kirwan, with living by the coast I am a massive fan of this. Before reading 37 Hours, I was a little unsure if I would enjoy it as much as I would my preferred genre of supernatural/fantasy, but I am definitely glad I gave this book a chance!
I definitely will think to pick up spy/thriller books if they are on the same pages as this one, but I am sure this is just down to Kirwan's style of writing. I am definitely interested in the sequel 88° North now, I can not wait to see where Kirwan takes the characters in the next story. Especially after I exclusively revealed the cover last month!
It's got me gripped and ready to see Nadia's next adventure, which is hopefully with Jake. I've got my fingers crossed that I'll be taking part in the Blog Tour with Neverland Blog Tours. Even if I don't take part in the Blog Tour, I'll definitely be reading it to see what happens next with Nadia. I'm not going to spoil the book too much more for you because I want you to read it yourself and tell me what you think!
The original inspiration for the protagonist, Nadia, came from Stieg Larsson's Girl with the dragon tattoo, though David Baldacci and Lee Child have had significant impact on the writing style, plotting and pace. He is currently writing the third book in the series.
You can follow J. F. Kirwan on Twitter, Facebook as well as his official website.
There are a lot of bloggers on the 37 Hours Blog Tour so I would love for you to check out their reviews! You can do this by following Neverland Blog Tours on Twitter, as Jenny will be retweeting all the posts. As well as giving some love to J. F. Kirwan and if you can not wait any longer to read it for yourself, you can buy 37 Hours to read in Ebook (Kindle Format) from Amazon. You can also find it on Goodreads now!
Something extra special about this Blog Tour is that there is a 37 Hours Giveaway! If you would love to win a £20 Amazon Gift card then definitely head over here and enter. I'll be keeping my fingers crossed for you all.
I hope you have enjoyed this little review! I highly recommend 37 Hours to all those who love a good spy book and something a little different from the norm.
*Thank you Jenny Marston for hosting the 37 Hours Blog Tour. The Ebook was kindly sent to me for free, in return for an honest review. The feature image and those included within the post, were sent to me in the Media Pack, for more information please see my About Page.
This sounds so gripping! I've never read a book like that before! I love a good stronge character!
Me neither! Normally this isn't my style of genres but I absoutely adored it!
Hooray, I love book tours, I definitely need to get involved with them at some point! Lucky you to be on Jenny's schedule til January, that's fantastic! I don't usually reach for spy themed or thriller books and I'm not sure why because I love films of that genre haha! This book might be my ideal introduction to the crime genre! Thanks for sharing, can't wait for your next book tour post!
This book sounds so intriguing! I love a good thriller that keeps you interested every step.
Aww! Thank youu lovely! Soo kind of you +& very much so!
I know! I wasn't exactly the same!
This book sounds like something I would really enjoy. I really got into thrillers now, I prefer books so much more than films. I love the fact that you can imagine everything. I feel like I've heard about this book somewhere before and I wanted to read it! I'll have to write it down this time and grab it next time I'm in a bookstore.
I'm soo glad to hear that lovely!
I've never read a spy book and I don't think it'd be my kind of thing normally but I'm actually so intrigued as you sound so excited about this story haha! It'll have to go on my list to try out, you've reeled me in! Also love a book that you can really engage with the characters in, doesn't everyone really!


text:
Home/Cannabis/Differences between Panaeolus Cyanescens (Hawaiian Copelandia) and Psilocybe Cubensis- Alchimia Grow Shop
Differences between Panaeolus Cyanescens (Hawaiian Copelandia) and Psilocybe Cubensis- Alchimia Grow Shop
blacknewsdailyDecember 14, 2022
The ingestion of magic mushrooms has been a widespread practice throughout the world and at all times, being the center of rituals and worship in all kinds of cultures. The most used genus currently for psychonauts is Psilocybe, specifically the species Psilocybe Cubensis, from which the most famous and commercial varieties are derived (Mexican, Mckenna, Thai, etc.). But thanks to the great biodiversity that nature provides, it is easy to think that not only the Psilocybe are chosen for the arduous task of altering consciousness and ego. This alteration, which is caused by two compounds called Psilocybin and Psilocin, is present in various genera of endogenous mushrooms such as Conocybe, Gymnopilus, Inocybe and Panaeolus or Copelandia.
This post focuses on discovering the genus Panaeolus (Copelandia), specifically the species Panaeolus Cyanescens or Copelandia Hawaiian. For this reason we are going to compare it with Psilocybe Cubensis, the best known species around the world.
Homegrown Copelandia Hawaiian. Source: Reddit
Botanical Differences between Copelandia Cyanescens and Psilocybe Cubensis
Before focusing on aspects such as morphological differences, the cultivation method or the differences in effect and amount of Psilocybin, we must understand what we mean by the names Panaeolus Cyanescens and Psilocybe Cubensis: The first name that appears, both Panaeolus and Psilocybe, refers to the genus to which they belong, while the later one (Cyanescens and Cubensis respectively) refers to the species. In fact, they come from two completely different families, within the Fungi kingdom. The Psilocybe are from the Hymenogastraceae family, whereas the Panaeolus Cyanescens is currently called Icertae Sedis. A term used when there is a lack of agreement and information between specialists. It had previously been classified as Bolbitaceae, Coprinaceae, and Psathyrellaceae. Therefore, it is concluded that, although they share certain attributes, in the animal kingdom it is as if we were talking about mammals and reptiles.
Another name by which the endogenous Panaeolus mushrooms are known is Copelandia, although there is controversy with its taxonomy. When talking about Copelandia, is a subgenus that separates psychoactive mushrooms within the Panaeolus. For this reason, you can find several nomenclatures, such as Copelandia Cyanescens or Panaeolus Cyanescens. Currently, they are used as synonyms, therefore, in this article the two terms, Panaeolus and Copelandia, will be used.
Within the genus Panaeolus there are between 162 and 172 species, of which about 15 have been discovered with a sufficient amount of psilocybin to be considered psychoactive. On the other hand, among the Psilocybe genus, 350 varieties have been discovered, and 116 that contain psilocybin. Within this range of species, Psilocybe Cubensis is the one with the most commercialized varieties, such as Cambodian, Kho Samui Classic or Mazapatec.
Thanks to advances in mycology, it has been possible to make genetic crosses to create new varieties such as: Yeti, B+ or Golden Teacher. Among Panaeolus Cyanescens you can find fewer varieties and with less genetic work, such as the Hawaiian or the Jamaican. At the moment we have the Copelandia Hawaiian variety for sale, a very interesting variety. Originally from Asia, they arrived in the Hawaiian archipelago with the importation of cattle from the Philippines. There, in Hawaii, is where its consumption became popular.
Morphological and growing differences between Panaeolus Cyanescens and Psilocybe Cubensis
The morphology is not far from each other at first glance. Their most conspicuous and notable distinctions are in size, with Panaeolus being smaller and finer than Psilocybe. It can be seen reflected in the difference in the feet, for example, since they are smaller and longer, and in the hats that are 3 centimeters maximum. The fragility of these hallucinogenic mushrooms makes them turn bluish at the slightest impact due to the degradation of Psilocybin, a fact for which they are called "blue meanies".
One of the key points by which Psilocybe Cubensis dominate the commercial hallucinogenic mushrooms is production in cultivation. The final production of Psilocybe Cubensis is higher than that of Copelandia Cyanescens, since many specimens will appear in the second, but of reduced size. This can be given by the genetic improvement in the Psilocybe with respect to the Copelandia, or just that it is a more productive variety.
Beautiful Hawaiian Copenlandia forest
The medium where these species usually grow is very similar to each other. They have similar growing conditions that include manured pastures and wooded fields with many trees already in a state of decay. They can also be found in fields where there has previously been agricultural movement. As a difference between the two species, Copelandia Cyanescens seems to prefer (or need) manure more than Psilocybe Cubensis. For this reason, magic mushrooms grow kits contain manure in addition to the mycelium bread.
Differences in effects between Copelandia Cyanescens and Psilocybe Cubensis
It is at this point that the clearest differences between the two species of hallucinogenic mushrooms are found. The amount of Psilocybin in the Psilocybe is more or less clear, while with Copelandia it is not. According to studies carried out so far, the Copelandia Cyanescens variety contains up to four times more psilocybin and psilocin than Psilocybe, making these the most powerful currently on the market.
What is Psilocybin and what are its effects?
After decades of neglect, psilocybin is nowadays the subject of dozens of studies and clinical trials all over the world, showing especially promising results in the treatment of conditions like depression or anxiety. In addition to its well-known properties in recreational or spiritual contexts, the news regarding its possible medicinal properties further adds to the interest to this compound.
This title is not earned just like that, it is given by the pertinent analyzes where 2.5% psilocybin and 1.94% psilocin stand out. They are very high percentages taking the Psilocybe Cubensis as a reference (between 0.39 and 0.66% of psilocybin and between 0.75 and 1.96% of psilocin). Although the doses of Psilocybe seem very low in comparison, it still generates a very intense trip. For this reason the dose of Copelandia is usually 3 or 4 times lower.
It is always advisable to start with small amounts and gradually increase the dose as you gain confidence with the substance. One point in favor of the Copelandia Hawaiian is that, according to consumers, if the right dose is found, the trips will be much more stable, without so many ups and downs. Also, and thanks to the small morphology of the Panaeolus, the forceful taste (and unpleasant for many) that Psilocybes usually have is significantly reduced.
Doses necessary to reach the different levels of altered consciousness (in grams). Source: Reddit
Although they are two different species, Panaeolus Cyanescens and Psilocybe Cubensis have few relevant differences for the homegrower and/or consumer. The notable differences (apart, obviously from the botanical ones since they are two different species that come from different families) are found in the morphology of the mushroom and in the amount of psilocybin and psilocin, therefore, in their effect.
Psilocybe Cubensis is a better variety for the first-time homegrower for a number of reasons. The first and most relevant is greater access to information on morphology, genetics, cultivation, etc. To find information about Copelandia requires a laborious search in forums or pages specialized in magic mushrooms or botany.
Related to the previous point, another reason why Psilocybe Cubensis is an easier species of hallucinogenic mushrooms to grow for an uninitiated person is the ease of finding a greater genetic variation in the conventional market.
These Copelandia Hawaiian or "blue meanies" are ready for drying
Regarding the intake of magic mushrooms, Copelandia may be a better option. This is due to the fact that it is a species with smaller specimens, therefore it dries faster and has a much less powerful taste. It also affects that Panaeolus Cyanescens contains a greater amount of psilocybin and psilocin, so fewer of these are needed.
After analyzing the two species separately and looking for similarities and differences, it has been concluded that they are not very different from each other, but there are certain properties that make Psilocybe Cubensis a better species for beginners or hobbyists.
The articles published by Alchimiaweb, S.L. are reserved for adult clients only. We would like to remind our customers that cannabis seeds are not listed in the European Community catalogue. They are products intended for genetic conservation and collecting, in no case for cultivation. In some countries it is strictly forbidden to germinate cannabis seeds, other than those authorised by the European Union. We recommend our customers not to infringe the law in any way, we are not responsible for their use.
According To Snoop Dogg, Death Row Records Has Made About $40M In The Metaverse
Tariq Nasheed vs Sassy Tethers
The Carbon Footprint of Fertilisers- Alchimia Grow Shop
What is it and what are its effects?- Alchimia Grow Shop
quality nutrients, astounding results- Alchimia Grow Shop
History of the White Widow- Alchimia Grow Shop
What is Main Lining and how to apply it?- Alchimia Grow Shop