text:
// <copyright file="SparseVector.cs" company="Math.NET">
// Math.NET Numerics, part of the Math.NET Project
// http://numerics.mathdotnet.com
// http://github.com/mathnet/mathnet-numerics
// http://mathnetnumerics.codeplex.com
//
// Copyright (c) 2009-2013 Math.NET
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>

using MathNet.Numerics.LinearAlgebra.Storage;
using MathNet.Numerics.Threading;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;

namespace MathNet.Numerics.LinearAlgebra.Single
{
    ///
    /// A vector with sparse storage, intended for very large vectors where most of the cells are zero.
    ///
    /// <remarks>The sparse vector is not thread safe.</remarks>
    [Serializable]
    [DebuggerDisplay("SparseVector {Count}-Single {NonZerosCount}-NonZero")]
    public class SparseVector : Vector
    {
        readonly SparseVectorStorage<float> _storage;

        ///
        /// Gets the number of non zero elements in the vector.
        ///
        /// <value>The number of non zero elements.</value>
        public int NonZerosCount
        {
            get { return _storage.ValueCount; }
        }

        ///
        /// Create a new sparse vector straight from an initialized vector storage instance.
        /// The storage is used directly without copying.
        /// Intended for advanced scenarios where you're working directly with
        /// storage for performance or interop reasons.
        ///
        public SparseVector(SparseVectorStorage<float> storage)
            : base(storage)
        {
            _storage = storage;
        }

        ///
        /// Create a new sparse vector with the given length.
        /// All cells of the vector will be initialized to zero.
        /// Zero-length vectors are not supported.
        ///
        /// <exception cref="ArgumentException">If length is less than one.</exception>
        public SparseVector(int length)
            : this(new SparseVectorStorage<float>(length))
        {
        }

        ///
        /// Create a new sparse vector as a copy of the given other vector.
        /// This new vector will be independent from the other vector.
        /// A new memory block will be allocated for storing the vector.
        ///
        public static SparseVector OfVector(Vector<float> vector)
        {
            return new SparseVector(SparseVectorStorage<float>.OfVector(vector.Storage));
        }

        ///
        /// Create a new sparse vector as a copy of the given enumerable.
        /// This new vector will be independent from the enumerable.
        /// A new memory block will be allocated for storing the vector.
        ///
        public static SparseVector OfEnumerable(IEnumerable<float> enumerable)
        {
            return new SparseVector(SparseVectorStorage<float>.OfEnumerable(enumerable));
        }

        ///
        /// Create a new sparse vector as a copy of the given indexed enumerable.
        /// Keys must be provided at most once, zero is assumed if a key is omitted.
        /// This new vector will be independent from the enumerable.
        /// A new memory block will be allocated for storing the vector.
        ///
        public static SparseVector OfIndexedEnumerable(int length, IEnumerable<Tuple<int, float>> enumerable)
        {
            return new SparseVector(SparseVectorStorage<float>.OfIndexedEnumerable(length, enumerable));
        }

        ///
        /// Create a new sparse vector and initialize each value using the provided value.
        ///
        public static SparseVector Create(int length, float value)
        {
            return new SparseVector(SparseVectorStorage<float>.OfValue(length, value));
        }

        ///
        /// Create a new sparse vector and initialize each value using the provided init function.
        ///
        public static SparseVector Create(int length, Func<int, float> init)
        {
            return new SparseVector(SparseVectorStorage<float>.OfInit(length, init));
        }

        ///
        /// Adds a scalar to each element of the vector and stores the result in the result vector.
        /// Warning, the new 'sparse vector' with a non-zero scalar added to it will be a 100% filled
        /// sparse vector and very inefficient. Would be better to work with a dense vector instead.
        ///
        /// <param name="scalar">
        /// The scalar to add.
        /// </param>
        /// <param name="result">
        /// The vector to store the result of the addition.
        /// </param>
        protected override void DoAdd(float scalar, Vector<float> result)
        {
            if (scalar == 0.0f)
            {
                if (!ReferenceEquals(this, result))
                {
                    CopyTo(result);
                }

                return;
            }

            if (ReferenceEquals(this, result))
            {
                //populate a new vector with the scalar
                var vnonZeroValues = new float[Count];
                var vnonZeroIndices = new int[Count];
                for (int index = 0; index < Count; index++)
                {
                    vnonZeroIndices[index] = index;
                    vnonZeroValues[index] = scalar;
                }

                //populate the non zero values from this
                var indices = _storage.Indices;
                var values = _storage.Values;
                for (int j = 0; j < _storage.ValueCount; j++)
                {
                    vnonZeroValues[indices[j]] = values[j] + scalar;
                }

                //assign this vectors arrary to the new arrays.
                _storage.Values = vnonZeroValues;
                _storage.Indices = vnonZeroIndices;
                _storage.ValueCount = Count;
            }

            else
            {
                for (var index = 0; index < Count; index++)
                {
                    result.At(index, At(index) + scalar);
                }
            }
        }

        ///
        /// Adds another vector to this vector and stores the result into the result vector.
        ///
        /// <param name="other">
        /// The vector to add to this one.
        /// </param>
        /// <param name="result">
        /// The vector to store the result of the addition.
        /// </param>
        protected override void DoAdd(Vector<float> other, Vector<float> result)
        {
            var otherSparse = other as SparseVector;
            if (otherSparse == null)
            {
                base.DoAdd(other, result);
                return;
            }

            var resultSparse = result as SparseVector;
            if (resultSparse == null)
            {
                base.DoAdd(other, result);
                return;
            }

            // TODO (ruegg, 2011-10-11): Options to optimize?

            var otherStorage = otherSparse._storage;
            if (ReferenceEquals(this, resultSparse))
            {
                int i = 0, j = 0;
                while (j < otherStorage.ValueCount)
                {
                    if (i >= _storage.ValueCount || _storage.Indices[i] > otherStorage.Indices[j])
                    {
                        var otherValue = otherStorage.Values[j];
                        if (otherValue != 0.0f)
                        {
                            _storage.InsertAtIndexUnchecked(i++, otherStorage.Indices[j], otherValue);
                        }
                        j++;
                    }
                    else if (_storage.Indices[i] == otherStorage.Indices[j])
                    {
                        // TODO: result can be zero, remove?
                        _storage.Values[i++] += otherStorage.Values[j++];
                    }
                    else
                    {
                        i++;
                    }
                }
            }
            else
            {
                result.Clear();
                int i = 0, j = 0, last = -1;
                while (i < _storage.ValueCount || j < otherStorage.ValueCount)
                {
                    if (j >= otherStorage.ValueCount || i < _storage.ValueCount && _storage.Indices[i] <= otherStorage.Indices[j])
                    {
                        var next = _storage.Indices[i];
                        if (next != last)
                        {
                            last = next;
                            result.At(next, _storage.Values[i] + otherSparse.At(next));
                        }
                        i++;
                    }
                    else
                    {
                        var next = otherStorage.Indices[j];
                        if (next != last)
                        {
                            last = next;
                            result.At(next, At(next) + otherStorage.Values[j]);
                        }
                        j++;
                    }
                }
            }
        }

        ///
        /// Subtracts a scalar from each element of the vector and stores the result in the result vector.
        ///
        /// <param name="scalar">
        /// The scalar to subtract.
        /// </param>
        /// <param name="result">
        /// The vector to store the result of the subtraction.
        /// </param>
        protected override void DoSubtract(float scalar, Vector<float> result)
        {
            DoAdd(-scalar, result);
        }

        ///
        /// Subtracts another vector to this vector and stores the result into the result vector.
        ///
        /// <param name="other">
        /// The vector to subtract from this one.
        /// </param>
        /// <param name="result">
        /// The vector to store the result of the subtraction.
        /// </param>
        protected override void DoSubtract(Vector<float> other, Vector<float> result)
        {
            if (ReferenceEquals(this, other))
            {
                result.Clear();
                return;
            }

            var otherSparse = other as SparseVector;
            if (otherSparse == null)
            {
                base.DoSubtract(other, result);
                return;
            }

            var resultSparse = result as SparseVector;
            if (resultSparse == null)
            {
                base.DoSubtract(other, result);
                return;
            }

            // TODO (ruegg, 2011-10-11): Options to optimize?

            var otherStorage = otherSparse._storage;
            if (ReferenceEquals(this, resultSparse))
            {
                int i = 0, j = 0;
                while (j < otherStorage.ValueCount)
                {
                    if (i >= _storage.ValueCount || _storage.Indices[i] > otherStorage.Indices[j])
                    {
                        var otherValue = otherStorage.Values[j];
                        if (otherValue != 0.0f)
                        {
                            _storage.InsertAtIndexUnchecked(i++, otherStorage.Indices[j], -otherValue);
                        }
                        j++;
                    }
                    else if (_storage.Indices[i] == otherStorage.Indices[j])
                    {
                        // TODO: result can be zero, remove?
                        _storage.Values[i++] -= otherStorage.Values[j++];
                    }
                    else
                    {
                        i++;
                    }
                }
            }
            else
            {
                result.Clear();
                int i = 0, j = 0, last = -1;
                while (i < _storage.ValueCount || j < otherStorage.ValueCount)
                {
                    if (j >= otherStorage.ValueCount || i < _storage.ValueCount && _storage.Indices[i] <= otherStorage.Indices[j])
                    {
                        var next = _storage.Indices[i];
                        if (next != last)
                        {
                            last = next;
                            result.At(next, _storage.Values[i] - otherSparse.At(next));
                        }
                        i++;
                    }
                    else
                    {
                        var next = otherStorage.Indices[j];
                        if (next != last)
                        {
                            last = next;
                            result.At(next, At(next) - otherStorage.Values[j]);
                        }
                        j++;
                    }
                }
            }
        }

        ///
        /// Negates vector and saves result to <paramref name="result"/>
        ///
        /// <param name="result">Target vector</param>
        protected override void DoNegate(Vector<float> result)
        {
            var sparseResult = result as SparseVector;
            if (sparseResult == null)
            {
                result.Clear();
                for (var index = 0; index < _storage.ValueCount; index++)
                {
                    result.At(_storage.Indices[index], -_storage.Values[index]);
                }
                return;
            }

            if (!ReferenceEquals(this, result))
            {
                sparseResult._storage.ValueCount = _storage.ValueCount;
                sparseResult._storage.Indices = new int[_storage.ValueCount];
                Buffer.BlockCopy(_storage.Indices, 0, sparseResult._storage.Indices, 0, _storage.ValueCount * Constants.SizeOfInt);
                sparseResult._storage.Values = new float[_storage.ValueCount];
                Array.Copy(_storage.Values, sparseResult._storage.Values, _storage.ValueCount);
            }

            Control.LinearAlgebraProvider.ScaleArray(-1.0f, sparseResult._storage.Values, sparseResult._storage.Values);
        }

        ///
        /// Multiplies a scalar to each element of the vector and stores the result in the result vector.
        ///
        /// <param name="scalar">
        /// The scalar to multiply.
        /// </param>
        /// <param name="result">
        /// The vector to store the result of the multiplication.
        /// </param>
        protected override void DoMultiply(float scalar, Vector<float> result)
        {
            var sparseResult = result as SparseVector;
            if (sparseResult == null)
            {
                result.Clear();
                for (var index = 0; index < _storage.ValueCount; index++)
                {
                    result.At(_storage.Indices[index], scalar * _storage.Values[index]);
                }
            }
            else
            {
                if (!ReferenceEquals(this, result))
                {
                    sparseResult._storage.ValueCount = _storage.ValueCount;
                    sparseResult._storage.Indices = new int[_storage.ValueCount];
                    Buffer.BlockCopy(_storage.Indices, 0, sparseResult._storage.Indices, 0, _storage.ValueCount * Constants.SizeOfInt);
                    sparseResult._storage.Values = new float[_storage.ValueCount];
                    Array.Copy(_storage.Values, sparseResult._storage.Values, _storage.ValueCount);
                }

                Control.LinearAlgebraProvider.ScaleArray(scalar, sparseResult._storage.Values, sparseResult._storage.Values);
            }
        }

        ///
        /// Computes the dot product between this vector and another vector.
        ///
        /// <param name="other">The other vector.</param>
        /// <returns>The sum of a[i]*b[i] for all i.</returns>
        protected override float DoDotProduct(Vector<float> other)
        {
            var result = 0f;
            if (ReferenceEquals(this, other))
            {
                for (var i = 0; i < _storage.ValueCount; i++)
                {
                    result += _storage.Values[i] * _storage.Values[i];
                }
            }
            else
            {
                for (var i = 0; i < _storage.ValueCount; i++)
                {
                    result += _storage.Values[i] * other.At(_storage.Indices[i]);
                }
            }
            return result;
        }

        ///
        /// Computes the canonical modulus, where the result has the sign of the divisor,
        /// for each element of the vector for the given divisor.
        ///
        /// <param name="divisor">The scalar denominator to use.</param>
        /// <param name="result">A vector to store the results in.</param>
        protected override void DoModulus(float divisor, Vector<float> result)
        {
            if (ReferenceEquals(this, result))
            {
                for (var index = 0; index < _storage.ValueCount; index++)
                {
                    _storage.Values[index] = Euclid.Modulus(_storage.Values[index], divisor);
                }
            }
            else
            {
                result.Clear();
                for (var index = 0; index < _storage.ValueCount; index++)
                {
                    result.At(_storage.Indices[index], Euclid.Modulus(_storage.Values[index], divisor));
                }
            }
        }

        ///
        /// Computes the remainder (% operator), where the result has the sign of the dividend,
        /// for each element of the vector for the given divisor.
        ///
        /// <param name="divisor">The scalar denominator to use.</param>
        /// <param name="result">A vector to store the results in.</param>
        protected override void DoRemainder(float divisor, Vector<float> result)
        {
            if (ReferenceEquals(this, result))
            {
                for (var index = 0; index < _storage.ValueCount; index++)
                {
                    _storage.Values[index] %= divisor;
                }
            }
            else
            {
                result.Clear();
                for (var index = 0; index < _storage.ValueCount; index++)
                {
                    result.At(_storage.Indices[index], _storage.Values[index] % divisor);
                }
            }
        }

        ///
        /// Adds two Vectors together and returns the results.
        ///
        /// <param name="leftSide">One of the vectors to add.</param>
        /// <param name="rightSide">The other vector to add.</param>
        /// <returns>The result of the addition.</returns>
        /// <exception cref="ArgumentException">If <paramref name="leftSide"/> and <paramref name="rightSide"/> are not the same size.</exception>
        /// <exception cref="ArgumentNullException">If <paramref name="leftSide"/> or <paramref name="rightSide"/> is <see langword="null" />.</exception>
        public static SparseVector operator +(SparseVector leftSide, SparseVector rightSide)
        {
            if (leftSide == null)
            {
                throw new ArgumentNullException("leftSide");
            }

            return (SparseVector)leftSide.Add(rightSide);
        }

        ///
        /// Returns a Vector containing the negated values of <paramref name="rightSide"/>.
        ///
        /// <param name="rightSide">The vector to get the values from.</param>
        /// <returns>A vector containing the negated values as <paramref name="rightSide"/>.</returns>
        /// <exception cref="ArgumentNullException">If <paramref name="rightSide"/> is <see langword="null" />.</exception>
        public static SparseVector operator -(SparseVector rightSide)
        {
            if (rightSide == null)
            {
                throw new ArgumentNullException("rightSide");
            }

            return (SparseVector)rightSide.Negate();
        }

        ///
        /// Subtracts two Vectors and returns the results.
        ///
        /// <param name="leftSide">The vector to subtract from.</param>
        /// <param name="rightSide">The vector to subtract.</param>
        /// <returns>The result of the subtraction.</returns>
        /// <exception cref="ArgumentException">If <paramref name="leftSide"/> and <paramref name="rightSide"/> are not the same size.</exception>
        /// <exception cref="ArgumentNullException">If <paramref name="leftSide"/> or <paramref name="rightSide"/> is <see langword="null" />.</exception>
        public static SparseVector operator -(SparseVector leftSide, SparseVector rightSide)
        {
            if (leftSide == null)
            {
                throw new ArgumentNullException("leftSide");
            }

            return (SparseVector)leftSide.Subtract(rightSide);
        }

        ///
        /// Multiplies a vector with a scalar.
        ///
        /// <param name="leftSide">The vector to scale.</param>
        /// <param name="rightSide">The scalar value.</param>
        /// <returns>The result of the multiplication.</returns>
        /// <exception cref="ArgumentNullException">If <paramref name="leftSide"/> is <see langword="null" />.</exception>
        public static SparseVector operator *(SparseVector leftSide, float rightSide)
        {
            if (leftSide == null)
            {
                throw new ArgumentNullException("leftSide");
            }

            return (SparseVector)leftSide.Multiply(rightSide);
        }

        ///
        /// Multiplies a vector with a scalar.
        ///
        /// <param name="leftSide">The scalar value.</param>
        /// <param name="rightSide">The vector to scale.</param>
        /// <returns>The result of the multiplication.</returns>
        /// <exception cref="ArgumentNullException">If <paramref name="rightSide"/> is <see langword="null" />.</exception>
        public static SparseVector operator *(float leftSide, SparseVector rightSide)
        {
            if (rightSide == null)
            {
                throw new ArgumentNullException("rightSide");
            }

            return (SparseVector)rightSide.Multiply(leftSide);
        }

        ///
        /// Computes the dot product between two Vectors.
        ///
        /// <param name="leftSide">The left row vector.</param>
        /// <param name="rightSide">The right column vector.</param>
        /// <returns>The dot product between the two vectors.</returns>
        /// <exception cref="ArgumentException">If <paramref name="leftSide"/> and <paramref name="rightSide"/> are not the same size.</exception>
        /// <exception cref="ArgumentNullException">If <paramref name="leftSide"/> or <paramref name="rightSide"/> is <see langword="null" />.</exception>
        public static float operator *(SparseVector leftSide, SparseVector rightSide)
        {
            if (leftSide == null)
            {
                throw new ArgumentNullException("leftSide");
            }

            return leftSide.DotProduct(rightSide);
        }

        ///
        /// Divides a vector with a scalar.
        ///
        /// <param name="leftSide">The vector to divide.</param>
        /// <param name="rightSide">The scalar value.</param>
        /// <returns>The result of the division.</returns>
        /// <exception cref="ArgumentNullException">If <paramref name="leftSide"/> is <see langword="null" />.</exception>
        public static SparseVector operator /(SparseVector leftSide, float rightSide)
        {
            if (leftSide == null)
            {
                throw new ArgumentNullException("leftSide");
            }

            return (SparseVector)leftSide.Divide(rightSide);
        }

        ///
        /// Computes the remainder (% operator), where the result has the sign of the dividend,
        /// of each element of the vector of the given divisor.
        ///
        /// <param name="leftSide">The vector whose elements we want to compute the modulus of.</param>
        /// <param name="rightSide">The divisor to use,</param>
        /// <returns>The result of the calculation</returns>
        /// <exception cref="ArgumentNullException">If <paramref name="leftSide"/> is <see langword="null" />.</exception>
        public static SparseVector operator %(SparseVector leftSide, float rightSide)
        {
            if (leftSide == null)
            {
                throw new ArgumentNullException("leftSide");
            }

            return (SparseVector)leftSide.Remainder(rightSide);
        }

        ///
        /// Returns the index of the absolute minimum element.
        ///
        /// <returns>The index of absolute minimum element.</returns>
        public override int AbsoluteMinimumIndex()
        {
            if (_storage.ValueCount == 0)
            {
                // No non-zero elements. Return 0
                return 0;
            }

            var index = 0;
            var min = Math.Abs(_storage.Values[index]);
            for (var i = 1; i < _storage.ValueCount; i++)
            {
                var test = Math.Abs(_storage.Values[i]);
                if (test < min)
                {
                    index = i;
                    min = test;
                }
            }

            return _storage.Indices[index];
        }

        ///
        /// Returns the index of the absolute maximum element.
        ///
        /// <returns>The index of absolute maximum element.</returns>
        public override int MaximumIndex()
        {
            if (_storage.ValueCount == 0)
            {
                return 0;
            }

            var index = 0;
            var max = _storage.Values[0];
            for (var i = 1; i < _storage.ValueCount; i++)
            {
                if (max < _storage.Values[i])
                {
                    index = i;
                    max = _storage.Values[i];
                }
            }

            return _storage.Indices[index];
        }

        ///
        /// Returns the index of the minimum element.
        ///
        /// <returns>The index of minimum element.</returns>
        public override int MinimumIndex()
        {
            if (_storage.ValueCount == 0)
            {
                return 0;
            }

            var index = 0;
            var min = _storage.Values[0];
            for (var i = 1; i < _storage.ValueCount; i++)
            {
                if (min > _storage.Values[i])
                {
                    index = i;
                    min = _storage.Values[i];
                }
            }

            return _storage.Indices[index];
        }

        ///
        /// Computes the sum of the vector's elements.
        ///
        /// <returns>The sum of the vector's elements.</returns>
        public override float Sum()
        {
            var result = 0.0f;
            for (var i = 0; i < _storage.ValueCount; i++)
            {
                result += _storage.Values[i];
            }
            return result;
        }

        ///
        /// Calculates the L1 norm of the vector, also known as Manhattan norm.
        ///
        /// <returns>The sum of the absolute values.</returns>
        public override double L1Norm()
        {
            double result = 0d;
            for (var i = 0; i < _storage.ValueCount; i++)
            {
                result += Math.Abs(_storage.Values[i]);
            }
            return result;
        }

        ///
        /// Calculates the infinity norm of the vector.
        ///
        /// <returns>The maximum absolute value.</returns>
        public override double InfinityNorm()
        {
            return CommonParallel.Aggregate(0, _storage.ValueCount, i => Math.Abs(_storage.Values[i]), Math.Max, 0f);
        }

        ///
        /// Computes the p-Norm.
        ///
        /// <param name="p">The p value.</param>
        /// <returns>Scalar <c>ret = ( ∑|this[i]|^p )^(1/p)</c></returns>
        public override double Norm(double p)
        {
            if (p < 0d) throw new ArgumentOutOfRangeException("p");

            if (_storage.ValueCount == 0)
            {
                return 0d;
            }

            if (p == 1d) return L1Norm();
            if (p == 2d) return L2Norm();
            if (double.IsPositiveInfinity(p)) return InfinityNorm();

            double sum = 0d;
            for (var index = 0; index < _storage.ValueCount; index++)
            {
                sum += Math.Pow(Math.Abs(_storage.Values[index]), p);
            }
            return Math.Pow(sum, 1.0 / p);
        }

        ///
        /// Pointwise multiplies this vector with another vector and stores the result into the result vector.
        ///
        /// <param name="other">The vector to pointwise multiply with this one.</param>
        /// <param name="result">The vector to store the result of the pointwise multiplication.</param>
        protected override void DoPointwiseMultiply(Vector<float> other, Vector<float> result)
        {
            if (ReferenceEquals(this, other))
            {
                for (var i = 0; i < _storage.ValueCount; i++)
                {
                    _storage.Values[i] *= _storage.Values[i];
                }
            }
            else
            {
                for (var i = 0; i < _storage.ValueCount; i++)
                {
                    var index = _storage.Indices[i];
                    result.At(index, other.At(index) * _storage.Values[i]);
                }
            }
        }

        ///
        /// Pointwise multiplies this vector with another vector and stores the result into the result vector.
        ///
        /// <param name="divisor">The vector to pointwise multiply with this one.</param>
        /// <param name="result">The vector to store the result of the pointwise multiplication.</param>
        protected override void DoPointwiseDivide(Vector<float> divisor, Vector<float> result)
        {
            if (ReferenceEquals(this, divisor))
            {
                for (var i = 0; i < _storage.ValueCount; i++)
                {
                    _storage.Values[i] /= _storage.Values[i];
                }
            }
            else
            {
                for (var i = 0; i < _storage.ValueCount; i++)
                {
                    var index = _storage.Indices[i];
                    result.At(index, _storage.Values[i] / divisor.At(index));
                }
            }
        }

        #region Parse Functions

        ///
        /// Creates a float sparse vector based on a string. The string can be in the following formats (without the
        /// quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float.
        ///
        /// <returns>
        /// A float sparse vector containing the values specified by the given string.
        /// </returns>
        /// <param name="value">
        /// the string to parse.
        /// </param>
        /// <param name="formatProvider">
        /// An <see cref="IFormatProvider"/> that supplies culture-specific formatting information.
        /// </param>
        public static SparseVector Parse(string value, IFormatProvider formatProvider = null)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }

            value = value.Trim();
            if (value.Length == 0)
            {
                throw new FormatException();
            }

            // strip out parens
            if (value.StartsWith("(", StringComparison.Ordinal))
            {
                if (!value.EndsWith(")", StringComparison.Ordinal))
                {
                    throw new FormatException();
                }

                value = value.Substring(1, value.Length - 2).Trim();
            }

            if (value.StartsWith("[", StringComparison.Ordinal))
            {
                if (!value.EndsWith("]", StringComparison.Ordinal))
                {
                    throw new FormatException();
                }

                value = value.Substring(1, value.Length - 2).Trim();
            }

            // parsing
            var tokens = value.Split(new[] { formatProvider.GetTextInfo().ListSeparator, " ", "\t" }, StringSplitOptions.RemoveEmptyEntries);
            var data = tokens.Select(t => float.Parse(t, NumberStyles.Any, formatProvider)).ToList();
            if (data.Count == 0) throw new FormatException();
            return OfEnumerable(data);
        }

        ///
        /// Converts the string representation of a real sparse vector to float-precision sparse vector equivalent.
        /// A return value indicates whether the conversion succeeded or failed.
        ///
        /// <param name="value">
        /// A string containing a real vector to convert.
        /// </param>
        /// <param name="result">
        /// The parsed value.
        /// </param>
        /// <returns>
        /// If the conversion succeeds, the result will contain a complex number equivalent to value.
        /// Otherwise the result will be <c>null</c>.
        /// </returns>
        public static bool TryParse(string value, out SparseVector result)
        {
            return TryParse(value, null, out result);
        }

        ///
        /// Converts the string representation of a real sparse vector to float-precision sparse vector equivalent.
        /// A return value indicates whether the conversion succeeded or failed.
        ///
        /// <param name="value">
        /// A string containing a real vector to convert.
        /// </param>
        /// <param name="formatProvider">
        /// An <see cref="IFormatProvider"/> that supplies culture-specific formatting information about value.
        /// </param>
        /// <param name="result">
        /// The parsed value.
        /// </param>
        /// <returns>
        /// If the conversion succeeds, the result will contain a complex number equivalent to value.
        /// Otherwise the result will be <c>null</c>.
        /// </returns>
        public static bool TryParse(string value, IFormatProvider formatProvider, out SparseVector result)
        {
            bool ret;
            try
            {
                result = Parse(value, formatProvider);
                ret = true;
            }
            catch (ArgumentNullException)
            {
                result = null;
                ret = false;
            }
            catch (FormatException)
            {
                result = null;
                ret = false;
            }

            return ret;
        }

        #endregion

        public override string ToTypeString()
        {
            return string.Format("SparseVector {0}-Single {1:P2} Filled", Count, NonZerosCount / (double)Count);
        }
    }
}


A gospel music show that includes sermonettes from leading pastors and man-on-the-street segments.
Performaners include LeAndria Johnson; William Murphy; Livre'; and Todd Dulaney. Also: Pastor Joel Peebles.
Performers include Vicki Yohe; Da' TRUTH and Joann Rosario; Damien Sneed and the Levites; Isabel Davis; and Christina. Also: Bishop Millicent Hunter.
Performers include Kurt Carr and the Kurt Carr Singers; Brian Courtney Wilson; Kathy Taylor; and Naturally 7. Also: Pastor Charles Jenkins.
Performers include the Rance Allen Group, Deon Kipping, Ruth La'Ontra and Shelby 5. Also: Pastor Van Moody.
Performers include Charles Jenkins, Jonathan Butler and Tim Bowman Jr. Also: Bishop Dale Bon.
Earnest Pugh, Wess Morgan, KeKe Wyatt, DeWayne Crocker Jr. and Charles King perform. Also: Pastor George Lynos.
Travis Greene, Anaysha, the Howard Gospel Choir and Mary Millben perform. Also: Pastor William McDowell.
Performers include Marvin Sapp; Jason Nelson; Brandon Camphor and One Way; and Jor'Dan Armstrong. Also: Pastor Medina Pullings.
Fantasia, Anita Wilson, William McDowell and Virtue perform. Also: pastor Bobby Manning.
Ricky Dillard, Myron Butler, Bryan Wilson and Royce Love perform. Also: Pastor John Guns.
Kierra Sheard, Maurette Brown Clark, Resound, Uncle Reece and Star Swain perform. Also: Pastor Tony Lee.
Jonathan Nelson, Richard Smallwood, Kelly Price and Latice Crawford perform. Also: Pastor Jamal Bryant.
Shirley Caesar; Fred Hammond; Bri; and Pastor Kimberly Ray.
Yolanda Adams; Anthony Brown and Group Therapy; and Uche Agu.
Israel Houghton, Bryan Popin, Kelontae Gavin and Joshua Rogers perform.
Performers include Mali Music; Regina Belle; James Hall and Worship & Praise; and Geoffrey Golden.
Performers include Tamela Mann; Micah Stampley; Charles Butler & Trinity; and Jekalyn Carr.
Canton Jones, Keith "Wonderboy" Johnson and JJ Hairston are featured.
Fantasia, Anita Wilson, William McDowell and Virtue are featured.
In the premiere, host Tye Tribbett is joined by Jonathan McReynolds, the Arkansas Gospel Mass Choir, KlarKent and Uche Agu. Also: Pastor Darryl Hill.


Information technology outsourcing or ITO is a company's outsourcing of computer or Internet related work, such as IT Support or programming to other companies. The concept of outsourcing thereby helps the firms to perform well in their core competencies and thus mitigating rise of skill or expertise shortage in the areas where they want to outsource.
Why IT should be Outsourced?
The lowering of the overall cost of the service to the business. This will involve reducing the scope, defining quality levels, re-pricing, re-negotiation, and cost re-structuring. Access to lower cost economies through offshoring called "labor arbitrage" generated by the wage gap between industrialized and developing nations.
Resources (for example investment, people, infrastructure) are focused on developing the core business competence. For example often organizations outsource their IT support to specialised IT services companies.
Achieve a steep change in quality through contracting out the service with a new service level agreement.
Services will be provided to a legally binding contract with financial penalties and legal redress. This is not the case with internal services.
An organization can use an outsourcing agreement as a catalyst for major step change that can not be achieved alone. The outsourcer becomes a Change agent in the process.
Organizations embarking on high-risk projects generally look for outsourcing partners with deep domain expertise. While the buyer should never outsource total responsibility for the project, hiring additional staffers with relevant experience reduces risk.
Individuals may wish to outsource their work in order to optimise their work-leisure balance.
Organizations choose to transfer liabilities inherent to specific business processes or services that are outside of their core competencies.


text:
package org.kie.remote.services.exception;

import org.kie.remote.services.rest.exception.KieRemoteRestOperationException;

/**
 * This exception should be thrown when operation's relating to a deployment fail.
 */
public class KieRemoteServicesDeploymentException extends KieRemoteRestOperationException {

    /** generated serial version UID */
    private static final long serialVersionUID = -8714630316007772520L;

    public KieRemoteServicesDeploymentException(String s) {
        super(s, Status.INTERNAL_SERVER_ERROR);
    }

    public KieRemoteServicesDeploymentException(String s, Throwable throwable) {
        super(s, throwable, Status.INTERNAL_SERVER_ERROR);
    }
}

redpajama_set_name: RedPajamaGithub


text:
using namespace Snowda;

Block &Page::block()
{
    uintptr_t addr = reinterpret_cast<uintptr_t>(this);
    addr &= ~((2 << 20) - 1);
    return *reinterpret_cast<Block *>(addr);
}

const Block &Page::block() const
{
    uintptr_t addr = reinterpret_cast<uintptr_t>(this);
    addr &= ~((2 << 20) - 1);
    return *reinterpret_cast<const Block *>(addr);
}

BlockEntry &Page::blockEntry()
{
    return block().entry(*this);
}

const BlockEntry &Page::blockEntry() const
{
    return block().entry(*this);
}

size_t Page::size() const
{
    return data_.size();
}

uint8_t *Page::data()
{
    return data_.data();
}

const uint8_t *Page::data() const
{
    return data_.data();
}


Formaat: 21.0 (h) x 15.0 (b) x 2.2 (d) cm. Gewicht: 728 gram.
Chef and his intrepid gang of ingredient hunters – comic characters called the Ingreedies – take you on a world trip that will tantalise your taste buds and inspire adventures in the kitchen. Join Melvin in the rainforest for some edible Amazonian treats and try explosive chillies in Mexico with Lexi, while Bentley explains all about how the Swedes preserve their food, and Chai discovers magical spice blends in India.
This book draws on the culture, history, science and geography behind our food and serves it up as a visual feast of illustrations, maps and recipes.
Exciting but accessible recipes for 13 meals that the family can eat together, including French tarte Tatin, American chowder, Chinese 'dan dan' noodles, Moroccan chicken stew and many more.


Note: This entry also runs on Boston Breakers Report.
Marta is just unbelievable. She's in the pantheon: Gretzky, Jordan, Pele, Schumacher. Watching her play tonight was a pure pleasure, even if it did lead to a 2-1 loss for the suddenly struggling Breakers. Check out the match report on Bleacher Report.


For your even better orientation at work, we have created a new perspective on the cash receipts journals. Existing cash book in the next election, we extended the registration of individual income and expenditure, and the data are divided into transparent columns. Extended cash book is another tool that will greatly facilitate the control and also within the Finding of the payments or receipts for invoices.


Mulching is an excellent lawn care activity to perform in spring and fall for the protection and enhancement of your yard and garden. If you already hired our specialists in lawn care in Vienna VA for spring prep work and mulching, you know this activity comes with great benefits all year long. In case you did not hire our pros yet, here are some benefits of mulch you should consider!
How Should You Save Money on Lawn Care in Oakton VA?
Experts in lawn care know that most homeowners cannot wait to collaborate with them on their lawns and gardens to turn them into picture-perfect corners of wondrous paradises. However, when it comes to allocating a budget for your yearlong outdoor activities, things can get tricky. You probably spend the most money on water, fertilizers, tools, and all sorts of products and equipment helping you maintain your landscape in tip-top shape. Today, our experts in lawn care in Oakton VA are here to offer some money saving tips in lawn care this year!
As we mentioned before, lawn reseeding in spring may be a crucial step you need to take to ensure your yard reaches its maximum potential regarding health, growth, and aesthetics. Applying seeds on bare spots or more extensive areas of exposed soil help you get an even, lush, and thriving yard to enjoy for the entire year. However, many homeowners make a handful of mistakes when reseeding. Our specialists in Lawn Care in Bethesda VA are here today to offer you their advice on how to avoid such errors.
Our long waiting for spring is finally over. We can hardly wait for nature to burst with life and enchant us with its colors and scents. But to welcome spring properly, we have to prepare our lawns and gardens and make sure everything is in order. Our experts in lawn care in Potomac VA are here to offer you a quick reminder and checklist of the things you have to consider regarding lawn care this time of year.
Can You Recycle Christmas Trees into the Best Lawn Care in Vienna VA Practices?
In January one of the critical issues to handle from an environmental point of view is the recycling of your natural Christmas tree. Apart from dropping it off to one of the tree collection centers managed by your local city authorities, you can also take the matter into your own hands: turn the tree into the best lawn care in Vienna VA solutions. How can you do that? Our specialists have the answers for you!
Nature sleeps under its blanket of snow this time of year, and we are sure you enjoy the months of no mowing, weeding, and gardening. You may also take advantage of January and the National Mail Order Gardening Month to think about supplies and tools for the spring. However, if you think you are off the hook when it comes to lawn maintenance and minimal landscaping, you are wrong. Fortunately, our team of lawn care in Oakton VA wants to share some winter lawn maintenance tips with you to make your life easy and your property ready to embrace spring!
Seasoned homeowners know pruning and trimming of trees and shrubs usually consist of three main stages: late spring, late summer, and late fall. However, more and more horticulturists talk about early and even mid-winter pruning and trimming of trees and shrubs. If you want to comprehend the secrets of cold season pruning – why and how to do it – our specialists in lawn care in Potomac VA are here with some answers and explanations.
Few things work better in the organic fertilization category than homemade compost. While in summer, your compost pile benefits from the warm temperatures, in winter, the cold weather slows down bacterial activity, threatening to close your operation until better times. Our experts in lawn care in Bethesda VA are here today to offer you their tips, tricks, and suggestions on how to manage your compost in winter to achieve excellent fertilizer in spring!
From interior design to medicine, industry's standards change annually, and experts reveal the most exciting highlights. The lawn care and landscaping industries are all the rage right now say our lawn care Great Falls VA experts.
The new generation of property owners – young, busy, no-nonsense type of dynamic people – have a whole range of expectations from their lawn service providers. In turn, companies should quickly adapt, improve, and change to stay ahead of the competition. Here are some of the essential selection criteria of a lawn care Great Falls VA company in 2019!
Petscaping – preparing an area of your property for pets and kids to play – is one of the essential landscaping trends in 2019. More and more young couples want to find peace and privacy on their properties, without forgetting about their furry friends. According to statistics, more than half of homeowners have one or two dogs around, which need their little corners of paradise to play in and enjoy. If you want to rebuild your property next year according to petscaping trends, here are the things our lawn care McLean VA experts want you to know!


As I tell it in "In the Plex," on the day of the Google IPO in 2004, director of engineering Wayne Rosing addressed an all-hands meeting. In his hand was a baseball bat. His message to Googlers was that even though lots of them were going to be pretty rich that day, he would not tolerate any displays of wealth that could endanger the egalitarian company culture. Specifically, he said that if he looked in the parking lot over the next few days and saw an influx of new Porsches or similar bling-y just-bought cars, he would take that baseball bat and smash some windshields.
Google culture is by and large fixed now. But if Wayne Rosing were still around (he left in 2005), he'd probably be very busy with that baseball bat. Case in point: Ben Sloss Treynor, who came to Google in 2003. Treynor has been instrumental in helping build up Google infrastructure and is the father of the company's Site Engineering Reliability team, which I described in my Wired story about Google data centers. I found him an affable and very helpful source when I interviewed him, twice, for my story.
He seems to have a good sense of humor about his purchases. Recently when an incredulous car buff asked him to prove he owned all that horsepower–by taking their picture with pieces of bread of them– Treynor responded by posing the cars with bread items appropriate to the home country of the respective autos.
But would Wayne Rosing be amused? My guess is if he had stuck around at Google, Rosing would have long given up trying to police displays of wealth. How many Tesla windshields can one guy smash, anyway?


text:
Fraser Forster dismisses Celtic loan recall as Southampton keeper opens up permanent switch
The keeper has been in impressive form since returning to the Parkhead club in the summer.
Celtic keeper Fraser Forster has dismissed claims Southampton have an option to recall him in January.
The Englishman returned to Celtic in the summer on a short-term deal as he fell out of favour at St Mary's behind Angus Gunn and Alex McCarthy.
Reports suggested there was a clause in his deal that would give his parent club the option to bring him back in the New Year.
But the keeper has denied those rumours and insists he will be at Parkhead until the end of the season.
He said: "I don't think there's a recall (option), so I think I'm here for the season from my side of things.
"I'm happy here and glad to be back here playing. I just want to do as well as I can so I think I'll be here for the season.
"It's brilliant. When I had the opportunity to come back up I was glad that it was going to be for the season.
(Image: REUTERS)
"I wanted to be back here and I wanted to be playing.
"I had a very hard 18 months before going back up where I wasn't playing for Southampton when I'd so used to playing. I think I played pretty much every game before then apart from when I was out injured.
"I've had a good start to the season so I'm absolutely buzzing to be up here and making the most of it."
Olivier Ntcham goes in-depth on Celtic glory goal and reveals celebration almost ended in disaster
Forster still has two and a half years left on his Southampton deal and Celtic fans would love to see him sign a permanent deal after his impressive start to the season for Neil Lennon's men.
But the goalie says the decision is out of his hands as he opened up on his future at Saints.
He added: "I'm only focusing on the short term really.
"So much of what will happen will be out of my hands.
"I'm just concentrating week by week, enjoying it while I can. The rest will take care of itself."
Celtic FC news
Lennon wants killer instinct
Griff issues defiant message
Jags 1 Celtic 2 - 3 talking points
Neil Lennon hints at big signing
Celtic Transfer News

redpajama_set_name: RedPajamaCommonCrawl


The War Powers Resolution will probably be something brought up over the next week or so while people discuss the constitutionality of President Donald Trump's airstrikes on Syria. The other discussion might be just what exactly the U.S.' role in Syria is after UN Ambassador Nikki Haley told Fox News Sunday it was "up to Assad" on whether more strikes would happen, and promised more strikes would happen to hurt Assad if he still uses chemical weapons. All these strikes are happening despite no vote in Congress allowing the president to use the military against Assad, just like it didn't happen in 2013 when former President Barack Obama did similar strikes and the Pentagon sent troo-err-military advisers into Syria.
The War Powers Resolution/Act is a continuous source of debate within U.S. foreign policy circles. The Constitution says in Article 1, Section 8 only Congress can declare war. Congress passed the War Powers Resolution in 1973 overriding a veto from Richard Nixon, in hopes of pushing back a little against executive overreach on issues of military action. The legislative branch was hoping to correct an abysmal mistake from 1950 where no vote on getting involved in Korea ever happened, nor was any resolution sent to Congress on the issue. The prevailing theory appears to be the War Powers Resolution allows the President to involve American troops in any combat, so long as he or she tells Congress about it within 48 hours. This comes from Section 4 of the act.
There's also Section 5b which includes has the 60-90 day timeline, typically discussed as to how long U.S. military action can go on.
Within sixty calendar days after a report is submitted or is required to be submitted pursuant to section 1543(a)(1) of this title, whichever is earlier, the President shall terminate any use of United States Armed Forces with respect to which such report was submitted (or required to be submitted), unless the Congress (1) has declared war or has enacted a specific authorization for such use of United States Armed Forces, (2) has extended by law such sixty-day period, or (3) is physically unable to meet as a result of an armed attack upon the United States. Such sixty-day period shall be extended for not more than an additional thirty days if the President determines and certifies to the Congress in writing that unavoidable military necessity respecting the safety of United States Armed Forces requires the continued use of such armed forces in the course of bringing about a prompt removal of such forces.
But one thing Michigan Congressman Justin Amash explained on Twitter, is the fact Section 2 tends to be ignored in public discussion (emphasis mine).
The question now becomes whether Section 4 runs askew of Section 2. The former could be read as allowing the President to get troops involved in combat, then inform Congress of what's going on. I believe this was something addressed in Clear and Present Danger by Tom Clancy where the Army Rangers were involved in an attack on a drug cartel without the knowledge of Congress. Clancy's interpretation (and he was much smarter than I'll ever be) was the traditional one regarding Congress knowing when troops were going into combat.
Yet, it's possible the actual interpretation involves troop movements, not necessarily inserting them into combat. Example: If Trump had told Congress he was sending a carrier group to the Arabian Sea, then it would fall under the auspices of the War Powers Resolution. The same could be said if more troops were headed to Iraq or Afghanistan, where the U.S. still has active wars, or if there was an increase in troops in any of the other U.S. bases on foreign soil. It would still be up to Congress to approve whether the U.S. gets involved into any offensive action, say, airstrikes in Kosovo or Syria before those strikes could begin.
This is only a possible interpretation, not necessarily what the resolution actually means but it certainly seem plausible, given the constraints laid out in Section 2 and the Constitution itself. It's why Trump-and, previously, Obama may have violated the War Powers Resolution and the Constitution by involving the U.S. military in offensive actions against Syria, without authorization from Congress. There needs to be a vote in Congress as soon as possible on whether the military should be involved in Syria (it shouldn't). Senator Bob Corker claimed to be working on a new Authorization for Use of Military Force, but the text has yet to be released. He should do this sooner, rather than later, so Congress can debate and vote on the issue.
Whether they will is anyone's guess.


text:
Renée Anne Louprette
Photos by Joshua South
Renée Anne Louprette has established an international career as organ recitalist, conductor, and teacher. She is associated with a number of distinguished music programs in the New York City area, having served as Associate Director of Music at the Church of St. Ignatius Loyola, Associate Director of Music and the Arts at Trinity Wall Street, Organist and Associate Director at the Unitarian Church of All Souls, and Director of Music at the Church of Notre Dame.
Since 2019 Ms. Louprette has been Assistant Professor of Music and College Organist at Bard College, where she directs the Bard Baroque Ensemble. She was subsequently appointed to the faculty of the Bard College Conservatory in 2020. She has been the University Organist and Organ Area Coordinator at Mason Gross School of the Arts, Rutgers University, since 2013, and is a former member of the faculty at the Manhattan School of Music, The Hartt School of the University of Hartford, and the John J. Cali School of Music at Montclair State University.
Ms. Louprette made her organ recital debuts in the 2018–19 season at the Royal Festival Hall in London, Walt Disney Concert Hall in Los Angeles, the Cathedral of Notre Dame in Paris, and in collaboration with the American Brass Quintet at Church of the Ascension in New York. She has released solo recordings of the music of J. S. Bach and 20th-century French organ masterworks to critical acclaim, in addition to a recent duo recording with traditional Irish musician Ivan Goff. She is a graduate of the Master of Music program in conducting from Bard College Conservatory and holds degrees in piano and organ from The Hartt School, University of Hartford, and a diplôme supérieur in organ from the Centre d'Études Supérieures de Musique et de Danse de Toulouse.
Renée Anne Louprette performed with The Orchestra Now on March 20, 2021.
Bio: February 2021
Andrés Rivas Frank Corliss


Quietly on Christmas Eve the Gyros and Seafood Express opened in Tarpon Springs. Noticeable because of the old school neon lights in the windows of the restaurant that was closed a few months ago next to the Waffle House in Tarpon. This Gyros place sits across from our office so we have had several chance to savor the flavor.
Their specialty is a intriguing combination Seafood and Gyros. Their prices are outstanding as they are a true bargain for many of the dishes.
Gyros in the heart of one of the largest Greek communities in Florida and the US it is tough to compete. With Helas, Mamas, Mr. Soulvaki only a stones throw away they do not have a chance. But with a deal like 5 Bucks Gyros, fries and drink this is a place to have lunch, or dinner. The Gyros is a pretty standard affair but I will say they do one thing only the best of place seems to do, put the Tzaziki on top not on the Pitta, saves the pitta from falling apart. However, they have not been serving it straight from the spit which is disappointing, The do have the Gyros spinning on the spit, but they seem to pre-slice it and pull it from the warming tray. Shame on you guys the Gyros is best when slightly browned as it is being sliced.
Seafood not something the area has had and it is a welcomed addition, from fish, catfish, shrimp, scallops and more. They server it fried, scampi, and blackened. I have sampled the medium shrimp, scallops and fish sandwich and would say it was pretty good all were fried. The batter could use a little more seasoning but for the price it was well worth it. Currently they are running a 5 buck 20 shrimp, fires and drink deal. One of the sides they offer includes hushpuppes while they taste great their size needs to be improved as these are some of the smallest puppies I have ever been served. Price on the seafood is extremely competitive when comparing to Long John Silvers but LJS may have a little edge on flavor at this point.
Fried Chicken and stuff. Chicken, strips, wings, livers and gizzards oh my! They have an appeal to almost everyone how eats a little southern style cooking. I have been told the Livers and Gizzards are good but they are not my cup of tea. I have tried the wings and they do them well, not breaded they are fried naked and the sauces are not fancy simple Mild, Medium or Hot. These wings are not the little fake wings but a decent size and still have the tips attached, and they also have the drumette style in the pile. We tried the 20 Wings and Fries for $9.99 and it was enough to share.
They have added weekly lunch specials for $4.99 including the fish sandwich, burger and a couple of other main items.
Check out the Gyros and Seafood Express on US Highway 19 N. a block or so south of MLK in Tarpon Springs. No menu available on line at this time.
A review of G&S from the techies at www.end2endsupport.com.


With supplies of Suntory's prolific line of Japanese Whisky becoming increasingly constrained, many people have been wondering how the company could continue its legacy of innovation. It was only a matter of time before Suntory shared a vision that had likely been years in the making. In January they lifted the veil and fans around the world were introduced to the next chapter in Suntory Whisky.
Suntory's new blend once again manages to whip up excitement by offering a release that pushes the boundaries of the whisky industry even further. Named "Ao", the Japanese word for "blue", this whisky was named with the seven seas in mind. The seas link the world's five largest whisky regions and it was from Suntory distilleries in these nations that liquid was chosen for blending to form this revolutionary new expression. For the first time, fans can experience the unity of Irish, Scotch, American, Canadian and Japanese whiskies from Suntory's world renowned distilleries.
Over the past few years, the Japanese pursuit of perfection has transformed the global perception of blended whisky. The craftsmanship and inspiration of Suntory blenders drove the category to new heights, giving enthusiasts a taste of a truly harmonious whisky. By giving these artisans an expanded palette of ingredients, Suntory "Ao" allows these blending geniuses to develop completely new flavors while still maintaining the company's reputation for producing blended whisky that is impeccably well balanced.
Merging the unique flavor characteristics of five regions creates whisky with a personality all its own. The whiskies are reportedly hand-selected by Suntory chief blender Shinji Fuwa to make the best use of the individual flavor profiles offered by each. The combination creates a complex whisky that delivers new perspectives, which vary depending on the temperature of the liquid, and the manner in which it is enjoyed. Suntory "Ao" offers whisky enthusiasts a unique experience that utilises the distinguishing features, and power of, Suntory's acclaimed distilleries combined.
Try It First. Pre-Order Now.
Suntory "Ao" will be released on April 16th. Given the coverage the bottle has already received, and with fans urgently awaiting the release, this exceptional whisky will be extremely difficult to obtain. With this in mind, we are offering a limited number of reservations. To ensure you're one of the first to give it a try, we recommend reserving your bottle as soon as possible. Place your reservation today, and rest easy knowing you'll be one of the first to receive this exciting new release from Suntory. Don't delay, reserve your bottle now.


The Ɂehdzo Got'ı̨nę also have an important role in wildlife and habitat management.
13.9.5 The Board shall consult regularly with Renewable Resources Councils with respect to matters within the Board's jurisdiction.
One of the Board's top priorities is to deepen its collaboration with Ɂehdzo Got'ı̨nę in environmental assessment work. Our staff meet with Ɂehdzo Got'ı̨nę to seek their input on development applications. The board also helps Ɂehdzo Got'ı̨nę in understanding applications and voicing their concerns. While working in a collaborative spirit, the Board also maintains its independent decision‐making authority.
The Board works directly with the Ɂehdzo Got'ı̨nę to propose, conduct, and provide feedback on research relating to wildlife and wildlife habitat. Ɂehdzo Got'ı̨nę members regularly participate in workshops about research in the Sahtú. They also monitor or work alongside scientists doing research.
The Board also aims to help the Ɂehdzo Got'ı̨nę maintain and strengthen the region's traditional economy. The traditional economy includes sustenance activities such as hunting, trapping, and fishing as well as the production of clothing, crafts, and art. All of these activities are based upon the traditional relationship between people, wildlife, and the land.


text:
// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

// This program hung when run under the C/C++ ThreadSanitizer. TSAN defers
// asynchronous signals until the signaled thread calls into libc. The runtime's
// sysmon goroutine idles itself using direct usleep syscalls, so it could
// run for an arbitrarily long time without triggering the libc interceptors.
// See https://golang.org/issue/18717.

import (
	"os"
	"os/signal"
	"syscall"
)

/*
#cgo CFLAGS: -g -fsanitize=thread
#cgo LDFLAGS: -g -fsanitize=thread

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void raise_usr2(int signo) {
	raise(SIGUSR2);
}

static void register_handler(int signo) {
	struct sigaction sa;
	memset(&sa, 0, sizeof(sa));
	sigemptyset(&sa.sa_mask);
	sa.sa_flags = SA_ONSTACK;
	sa.sa_handler = raise_usr2;

	if (sigaction(SIGUSR1, &sa, NULL) != 0) {
		perror("failed to register SIGUSR1 handler");
		exit(EXIT_FAILURE);
	}
}
*/
import "C"

func main() {
	ch := make(chan os.Signal)
	signal.Notify(ch, syscall.SIGUSR2)

	C.register_handler(C.int(syscall.SIGUSR1))
	syscall.Kill(syscall.Getpid(), syscall.SIGUSR1)

	<-ch
}


text:
Dive team search begins in Oxshott lake for Robyn Mercer murder investigation
Get updates from Oxshott where dive teams have begun searching a lake for evidence in the Robyn Mercer murder investigation
Charlotte Talbot
Oliver Florence
Charlotte Tobitt
Tom Smurthwaite
Divers searching for evidence in relation to the Robyn Mercer murder investigation
A dive team has today (Tuesday October 18) begun searching an Oxshott lake for new evidence in the Robyn Mercer murder investigation.
Ms Mercer, 50, was found dead outside her home in Walton Road, West Molesey , on Monday March 14.
Specialist Group International divers have now teamed up with Surrey Police for this new search.
Reporter Tom Smurthwaite is at the scene and we will be bringing live updates on the search.
Robyn Mercer murder: Detective reveals possible lines of enquiry
You can also catch up with the latest on this investigation with the links below.
Robyn Mercer murder investigation
Man released without charge
Detective reveals lines of enquiry
Potential breakthrough after Crimewatch
Timeline of events six months on
Conclusion of day one of the search
Divers from Specialist Group International have finished their search at Littleheath Common Ponds in Oxshott for today, and will be back in the water tomorrow (Wednesday).
There did not appear to be any significant discoveries, although the police were not giving away any details.
A diver searches the shallows
DCI Rymarz, from Surrey Police, would not reveal why the police were targeting this particular lake in Oxshott, only that it was part of the ongoing Robyn Mercer murder investigation.
Peter Faulding, CEO of Specialist Group International and forensic search specialist, said the lake operation was 'going well'.
"The water varies in depth and there's actually good visibility," he added.
"We'll probably be here another two to three days as part of the ongoing investigation."
So that concludes today's events, check Get Surrey for the latest news as and when there are any developments.
15:48 Oliver Florence
Tributes to Robyn Mercer
Following her death in March, the family of the 50-year-old from West Molesey described her as a "wonderful person, loving mother and devoted friend".
Art specialist Paul Crane who knew Ms Mercer for more than 20 years through her work as an antiques dealer said she was "full of the most golden energy".
"She was so polite it was unbelievable," he said. "She was just full of kindness. She was extremely well thought of in the industry.
"She had worked in the trade for more than 20 years and had a great deal of knowledge of the history of silversmithing.
"She was a very private person. I'm so shocked this has happened."
Robyn Mercer, 50, was found battered to death in the front garden of her home in Walton Road, West Molesey
15:19 Charlotte Tobitt
Family 'supportive' of police search
Speaking about Ms Mercer's family, DCI Rymarz said: "They are being very supportive of the enquiries that we're doing, they are obviously very upset."
He told reporters that police are in close contact with Ms Mercer's South African family, where she was originally from.
"They are just hopeful that we will be in a position at some stage to bring Robyn's killer to justice."
DCI Rymarz also confirmed that the weapon was some sort of a machete or an axe. He can't go into any more detail at this stage.
Photos from the scene
Here are a few of the photos taken by our photographer Darren Pepe to give you a glimpse of what's going on.
Specialist Group International divers at Littleheath Pond in Oxshott as part of the Robyn Mercer murder investigation
Focused on finding Robyn's killer
DCI Rymarz has addressed the fact that people have been arrested in connection with Ms Mercer's murder for other offences.
He said: "Ultimately the enquiry is focused on one thing and that is to find the person responsible for Robyn's murder."
A 26-year-old man from West Molesey arrested on suspicion of conspiracy to burgle and murder and on conspiracy to pervert the course of justice has been re-bailed to December 16.
A 26-year-old man from West Molesey arrested on suspicion of conspiracy to burgle and murder has been re-bailed to December 16.
A 45-year-old woman from Oxshott arrested on suspicion of conspiracy to pervert the course of justice has been re-bailed until December 16.
Search to last for a few days
More from Tom who explains that the inflatable boat used by SGI employs advanced scanning equipment to survey the floor of the lake and looks for objects that could pose a danger to the divers, along with anything that could potentially help the investigation.
Police have said that the search is set to last for a few days.
DCI Paul Rymarz briefs the press as divers search Littleheath Pond in Oxshott in connection with the murder of Robyn Mercer
Crimewatch appeal 'very useful'
DCI Paul Rymarz has said the Crimewatch appeal which aired on TV last month was "very useful, very interesting".
"We received some other very important information and what that tends to do is that tends to stimulate other people to perhaps come forward and it's certainly something that has helped us in this particular enquiry."
Map of the lake and murder scene
We're hearing from our reporter that a new batch of divers is getting ready to go in to the lake, which as our map shows is about seven miles south of Robyn Mercer's West Molesey home.
We'll have some more updates from DCI Rymarz for you shortly.
Investigation update
It's now been more than six months since the body of Robyn Mercer was found outside her West Molesey home with a post-mortem examination revealing she died as a result of multiple blows to the head. Several people have so far been arrested and either bailed or released without charge in connection with the investigation.
The search of the lake in Oxshott comes a month after detectives issued a fresh appeal on Crimewatch and Crimestoppers are also offering a £10,000 reward for information that leads to arrest and conviction.
Update from our reporter on the scene
Our reporter Tom Smurthwaite, who is on the banks of the pond watching the search, says the divers will not be searching the entire body of water, which covers around five acres, but instead will concentrate on a section by the public footpath.
There are currently two divers from Specialist Group International underwater while a boat is patrolling the lake and scanning for objects. The divers are going down to depths of 11 metres, about 20 metres from the edge of the water.
DCI Paul Rymarz would not reveal to Tom whether the search was linked to the two Oxshott women arrested and bailed as part of the investigation or why they are concentrating on a particular spot.
The boat scanning the water at the lake in Oxshott
13:17 Charlotte Talbot
"There are people in Elmbridge who know who is responsible"
Continuing to talk to the press at the scene, DCI Rymarz said he believes "there are people in Elmbridge who know who is responsible" for the murder.
He has urged them to come forward and speak to police.
Our photographer at the scene, Darren Pepe, has shared some photos of the divers in action.
They're from Specialist Group International and are working together with Surrey Police.
DCI Rymarz speaks
Detective Chief Inspector, who is in charge of this investigation, has spoken to press at the scene about the dive activity.
He said he cannot go into the specific reason police have come to Littleheath pond in Oxshott.
But he added: "It's a very thorough search and hopefully that will demonstrate our ongoing commitment to finding the people or person responsible for Robyn's murder."
Video of the divers out on the water
Here's some footage from our reporter Tom Smurthwaite who's down at Littleheath Pond.
Latest picture from the scene
A diving team searching the pond on Littleheath Common
Littleheath Pond
The pond is just north of the railway line between Oxshott and Cobham and Stoke D'Abernon stations. It is about seven miles by road from the scene of the murder at the house on Walton Road near Molesey Library.
Map showing location of Littleheath Pond, Oxshott
Search for evidence begins
Surrey Police, along with divers from Specialist Group International, have today begun searching a lake in Oxshott.
The search is part of the murder investigation into Robyn Mercer's death.
The mother-of-two was found dead outside her home in Walton Road, West Molesey, at about 8am on Monday March 14.
The murder investigation has now come to Littleheath Pond in Oxshott in a search for fresh evidence.
Robyn Mercer
We will bring you updates, including photos and videos, from the scene.
First photo from the search
Our reporter Tom Smurthwaite is at the scene to see how the search unfolds.
He will hopefully speak to Detective Chief Inspector Paul Rymarz who is in charge of the murder investigation.
Here is Tom's first photo from the scene:
Dive teams at Littleheath Common Ponds in Oxshott on Tuesday October 18
Dive team search begins


text:
Theo Walcott | Arsenal & England Wonderkid
Walcott News
Home » Arsene Wenger Reveals Reasons for Theo Walcott's Absence against Bayern
Arsene Wenger Reveals Reasons for Theo Walcott's Absence against Bayern
Arsenal decided to go without Theo Walcott in the first leg of the Champions League game against Bayern Munich.
It was a major surprise considering that Walcott has been in great form over the last few weeks. The 27-year-old only recently scored hat tricks against the likes of Southampton, while also scoring in the 2-1 loss against Manchester City. Yet, Arsene Wenger has explained the reason for dropping Walcott and going for a defensive formation against the German club. He said that Arsenal have recently come up against Bayern Munich with the second leg at the Allianz Arena. However, this time around, the second leg will be at the Emirates stadium.
As a result, there is a huge psychological difference. Rather than suffer a heavy defeat in the first leg and lose any hope of qualification to the last 8, Arsenal would rather opt for a defensive performance and try to win the game and the tie in front of their own supporters. Wenger is clearly targeting a balanced performance from his team.
Arsenal come into the game with a disappointing form after having recently suffered defeats against the likes of Watford and Chelsea. As a result, confidence is low amongst the Arsenal ranks. Arsenal have also not qualified for the last eight of the Champions League in each of the last six campaigns.
"We usually play the second leg here [Allianz Arena] so tonight is a psychological problem.We want a strong defensive performance [but] we have to go fowrard and get the right balance because Bayern have a lot of possession and we need to defend together. I will play with four midfielders with Ozil as a second striker tonight. It is a big opportunity for him," said Wenger. Despite the cautious approach, Arsenal ended up losing 5-1.
Copyright © 2021, Theo Walcott.


text:
<?php

namespace Calina\Bundle\MainBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Calina\Bundle\MainBundle\Entity\Book;
use Calina\Bundle\MainBundle\Entity\User;
use Calina\Bundle\MainBundle\Services\Reporting\TextFactory;
use Calina\Bundle\MainBundle\Services\Reporting\XmlFactory;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class BooksController extends Controller
{
    public function indexAction(Request $request)
    {
        $serializer = $this->get("serializer_wrapper");
        $allBooks = $serializer->getAll('Book');
        $searchBooks = null;
        $criteria = array();

        if ($request->isMethod('GET')) {
            $em = $this->getDoctrine()->getManager();
            $criteria = $request->query->all();

            $searchBooks = $em->getRepository("CalinaMainBundle:Book")->findByCriteria($allBooks,
                $criteria);
        }

        else if ($request->isMethod('POST')) {
            $parameters = $request->request->all();
            $bookToSell = $serializer->get($parameters['book'], "Book");
            $currentQuantity = $bookToSell->getQuantity();
            $toSubstract = $parameters['quantity'];
            $currentQuantity > $toSubstract ? $bookToSell->setQuantity($currentQuantity - $toSubstract) :
            $this->get('session')->getFlashBag()->add('notice','Not enough stock. Please try another operation.');
            $serializer->serialize($bookToSell);
        }

        $books = $searchBooks == null ? $allBooks : $searchBooks;
        $searchCriteria = array(
            'Name' => array_key_exists("Name", $criteria) ? $criteria["Name"] : "",
            "Author" => array_key_exists("Author", $criteria) ? $criteria["Author"] : "",
            "Genre" => array_key_exists("Genre", $criteria) ? $criteria["Genre"] : ""
            );

        return $this->render('CalinaMainBundle:Books:index.html.twig', array(
            'books' => $books,
            'searchCriteria' => $searchCriteria
            ));
    }

    public function addEditAction($id = null, Request $request) {
        $serializer = $this->get("serializer_wrapper");

        $id = $request->query->get('id');
        $book = $id == null ? new Book() : $serializer->get($id, 'Book');

        $form = $this->createFormBuilder($book)
        ->add('name', 'text')
        ->add('author', 'text')
        ->add('genre', 'text')
        ->add('quantity', 'integer')
        ->add('price', 'integer')
        ->getForm();

        if ($request->isMethod('POST')) {
            $form->bind($request);

            if ($form->isValid()) {
                $serializer->serialize($book);
                return $this->redirect($this->generateUrl('books_list'));
            }
        }

        return $this->render('CalinaMainBundle:Books:add-edit.html.twig', array(
            'form' => $form->createView(),
            ));
    }

    public function makeReportAction($type) {
        if($type == 'text') {
            $factory = new TextFactory();
        } else {
            $factory = new XmlFactory();
        }

        $serializer = $this->get("serializer_wrapper");
        $allBooks = $serializer->getAll('Book');
        $content = array();
        foreach ($allBooks as $book) {
            $content[$book->getId()] = $book->getName();
        }

        $serializer = $serializer->getSerializer();
        $kernel = $this->get('kernel');

        $report = $factory->makeReport($serializer, $kernel);

        $file = $report->write($content);
        $response = new Response();
        $response->headers->set('Content-Type', 'application/octet-stream');
        $response->headers->set('Content-Disposition', 'attachement;' . $file);
        $response->setContent(file_get_contents($file));
        return $response;
    }

}


Phone or text message us on 0451 496 122, or if you prefer a landline, we are on (08) 9389 1422.
Phone or text message us on 0452 283 499, or if you prefer a landline, we are on (08) 9300 3499.
If you would like to receive a Janome Email Alert from time to time about new models, catalogue sales, new class dates and so on, sign up here.


text:
Home » Blogs » Charles Gaba's blog » Hawaii: Either 1,200 (yay)...or 12,000 (holy crap!) UPDATED: It's 1,200.
Hawaii: Either 1,200 (yay)...or 12,000 (holy crap!) UPDATED: It's 1,200.
Well, this news is either moderately interesting or jaw-droppingly awesome, depending on what the actual number is.
@charles_gaba The total number of individual enrollees in the Hawaii Health Connector is over 12,000. More info here: http://t.co/ertrxWh6n4
— HI Health Connector (@HIConnector) December 10, 2014
When you visit the link, it goes to a video interview with the executive director of the HI exchange, who states, when asked "do we know how many signups there've been so far?" that "it's about 12,000; we were at 250 this time last year, so we've made a lot of progress."
Now, hold the phone a minute. According to the Kaiser Family Foundation, Hawaii only has around 53,000 residents total who are even eligible to enroll via the ACA exchange to begin with.
More to the point, HI only enrolled 8,600 people as of last April, and that number had grown to 10,750 as of the end of September.
So...my question is, does that "12,000 so far" figure include the current 2014 enrollees, or does it only include 2015 enrollees (renewals of existing plans + new additions)??
If it includes the 10,750 figure, that means that they've only enrolled about 1,250 people so far for 2015. This would actually be pretty good, since it's still 5x as many as this time last year, and the daily rate would still be 16% higher on average than all of last year.
On the other hand, if it doesn't include current enrollees--if all 12,000 of those folks are people who have enrolled in 2015 QHPs via the Hawaii Health Connector, then that would be astonishing: 480 per day, or 11x faster than 2014 as a whole.
The only other state to meet this rate is Massachusetts, which is a special case.
Of course, it's also possible that the 12K figure refers to "applications" or "determinations" as opposed to actual "plans selected". It's even conceivable that it includes Medicaid enrollees as well, although HI has never really reported Medicaid numbers to my recollection.
Anyway, until I hear clarification one way or the other, I'm going to go with 1,200 through yesterday for now...but stay tuned...
UPDATE: OK, as I suspected, it's actually more like 1,200; the 12K figure is indeed cumulative since last October:
@charles_gaba Aloha Charles. The 12,000 enrollees number is cumulative since the start of the Connector. Mahalo.
Ah, well; it was a nice idea...


text:
Details for: Orpheus girl /
Orpheus girl /
by Rebele-Henry, Brynne [author.].
Material type: BookPublisher: New York, NY : Soho Teen, 2019.Description: 164 pages ; 22 cm.ISBN: 9781641290746; 1641290749.Subject(s): Lesbians -- Fiction | Lesbian teenagers -- Fiction | Best friends -- Fiction | Friendship -- Fiction | Camps -- Fiction | Mythology, Greek -- Fiction | Grandmothers -- Fiction | Family life -- Texas -- Fiction | Texas -- Fiction
"Content warning: There are scenes in this book that depict self-harm, homophobia, transphobia, and violence against LGBTQ characters." -- verso.
Summary: When sixteen-year-old, mythology-obsessed Raya and her true love, Sarah, are sent from their conservative Texas town to a re-education camp, Raya assumes the role of Orpheus to save them.Summary: Raya-- abandoned by her mother, obsessed with ancient myths-- lives with her grandmother in a small conservative Texas town. For years she has hidden her feelings for her best friend and true love, Sarah. When the two are caught in an intimate moment, they are sent to Friendly Saviors: a re-education camp meant to "fix" them and make them heterosexual. Subjected to abusive and brutal "treatments" by the staff, Raya vows to assume the mythic role of Orpheus to save them both and to return them to the world of the living... at any cost.
Young Adult Collection Young Adult New Book Shelf YA FIC REB Checked out 02/15/2020 39270004868034
In her debut novel, award-winning poet Brynne Rebele-Henry re-imagines the Orpheus myth as a love story between two teenage girls who are sent to conversion therapy after being caught together in an intimate moment.

 Abandoned by a single mother she never knew, 16-year-old Raya--obsessed with ancient myths--lives with her grandmother in a small conservative Texas town. For years Raya has fought to hide her feelings for her best friend and true love, Sarah. When the two are outed, they are sent to Friendly Saviors: a re-education camp meant to "fix" them and make them heterosexual. Upon arrival, Raya vows to assume the role of Orpheus, to return to the world of the living with her love--and after she, Sarah, and the other teen residents are subjected to abusive and brutal "treatments" by the staff, Raya only becomes more determined to escape.

 In a haunting voice reminiscent of Sylvia Plath and the contemporary lyricism of David Levithan, Brynne Rebele-Henry weaves a powerful inversion of the Orpheus myth informed by the disturbing real-world truths of conversion therapy. Orpheus Girl is a story of dysfunctional families, trauma, first love, heartbreak, and ultimately, the fierce adolescent resilience that has the power to triumph over darkness and ignorance.

 CW: There are scenes in this book that depict self-harm, homophobia, transphobia, and violence against LGBTQ characters.
When sixteen-year-old, mythology-obsessed Raya and her true love, Sarah, are sent from their conservative Texas town to a re-education camp, Raya assumes the role of Orpheus to save them.
Raya-- abandoned by her mother, obsessed with ancient myths-- lives with her grandmother in a small conservative Texas town. For years she has hidden her feelings for her best friend and true love, Sarah. When the two are caught in an intimate moment, they are sent to Friendly Saviors: a re-education camp meant to "fix" them and make them heterosexual. Subjected to abusive and brutal "treatments" by the staff, Raya vows to assume the mythic role of Orpheus to save them both and to return them to the world of the living... at any cost.
Excerpt provided by Syndetics
<opt> <anon I1="BLANK" I2="BLANK">Every night Grammy and I watch Mom on the TV. I always thought Mom was a silver screen kind of beauty because of that picture of her in high school: blonde, dimples, all clean-looking. But in this show she's dark-sexy, her hair colored a deep brunette, silky bedsheets held up around her neck with gold ribbons. Mom left Pieria when I was a kid. Grammy would say it was because she needed to go be Aphrodite on the TV. I know that it's because she was tired of it all, of the town and the people. So she disappeared one night. She only told Grammy as she was walking out the door. I was two. In the car on the way to church this morning, I write Sarah's name in the condensation on the passenger's window, then wipe it off before Grammy can see. The car is a worn-down blue Volvo from the seventies. It's a miracle it's still running. Every time Grammy slides the key in the ignition and it actually starts, she thanks God under her breath. The seat belts are frayed so much that they could snap if you pulled too hard, so we stopped using them. I have to hold onto the car door to keep from falling out of my seat every time Grammy brakes. She drives like a maniac. Runs over mailboxes on a regular basis, hits curbs, mows down shrubs. Once she ran over an abandoned lemonade stand. She never stops to deal with what she's run over, just keeps going, like she's late on her way to somewhere really important. I get through the service like I always do: running myths through my head. Ever since I found my mom playing Aphrodite on that soap opera, I've been memorizing them. I know it's stupid, but I've always thought that one day I'll open the door and she'll be there, and I'll need something to talk about. And since my mom's Aphrodite, I might as well be able to talk about myths. During the service I think about Persephone, how the girl was pulled away from everything she'd ever known and taken to a strange world. Or Atalanta. In these myths, girls are always being changed or taken by men, their voices, their protests ignored. And the queer girls, like Atalanta, are forced to become something else. Grammy's always talking about how one day I'll have a normal life, with a husband and two kids (a boy and a girl) and a brick house with a white picket fence and a big yellow dog who'll run around the yard. She says my husband should work so I don't have to, and I'll stay home all day and make cookies the way she taught me and go to PTA meetings and church. Whenever she talks about it, she gets a misty look in her eyes and twists the gold chain of her cross necklace between her fingers, and I know it's not my life she's imagining, that secretly she's wondering what would have happened if her own husband hadn't died in a car accident at twenty-seven and left her with a two-year-old girl, if her girl hadn't gotten pregnant senior year of high school only to run off three years later. Instead, she still has a job arranging and delivering flowers for weddings and funerals and baptisms, continual reminders of her own wedding and her husband's service, and she makes me go to cotillions and dance with boys, refuses to let me wear pants to school, and makes me go to church three times a week and Bible camp in the summer and try out for cheerleading every August. Every fall since fourth grade, she's bought me a new pair of shiny green pom-poms. She takes the day off work to come to the tryouts with me. I walk into the gym with a lump in my throat, but I never can kick high enough or land lightly enough, and every year we drive home together in disappointed silence. When we get home, Grammy always says she has a "headache worse than Satan," and she goes upstairs to lie down and change out of the "Go Team!" sweatshirt she wears just for tryouts. We both know that her head's not hurting, that she just doesn't want to have to pretend not to be let down yet again, but I always nod and don't say anything. This year, before she went upstairs, she said, "You were supposed to be my second chance." But she said it so quietly I think I wasn't supposed to hear her. Since then we've never talked about tryouts again. I think maybe she finally just gave up. Once the service ends, I heap pastries and the little watercress-and-pickle and peanut-butter tea sandwiches that the church ladies make onto my plate, then sit down on the coffee-stained couch outside Preacher Sam's office and eat until I feel sick. Every time I go to Sarah's dad's church I get this sinking feeling, like something's wrong with me and if they find out, when they find out, it's all over. Most nights I dream that Sarah and the choir boys and Preacher Sam are peering down at me. I'm wearing another girl's clothes but I don't know why. When Preacher Sam hands me a crucifix, my skin starts burning and wings burst out of my back, and I'm trying to get the wings to stop sprouting from my back but they won't, and soon I'm screaming and burning and they're whispering "freak" and then they're yelling it. The dreams started when I was eight, shortly after I realized I was different from the girls I went to school with, but I didn't yet know how, just that there was some strange and invisible barrier separating me from them. Often, at after-school church camp, I'd watch the girls running around, skipping rope or drawing on the pavement outside the church, and my back would ache for reasons I could never discern. On those days, I tried to pinpoint the difference, the thing separating me, causing me to feel like every movement I made was an act, a dream that I would wake up from, like a fortune-teller sifting her tea leaves, trying to gather together some foreign objects and principles into a crystalline answer. But for years the bowl would come back empty, nothing more than water and stray oolong straining to reach the surface. When I was born, I had two small, misplaced vertebrae sticking out of my back. They looked like wings. The doctors took pictures, then set the vertebrae back in place. Now I just have two bumps and a line of scars on my back. Sometimes at night, I run my fingers over the bumps, try to imagine what the wings would have looked like. The doctors made the first incision in my vertebrae, so the worst of the scars are low on my back, though the scar tissue maps all the way up to my shoulders in a messy sprawl. The doctors said I healed better than expected. They'd thought I'd be disfigured. But I just don't wear bikinis like the other girls, always make sure my tops don't slip down past my shoulder blades. I don't need anyone else thinking about my being different even more than they already do. I don't want to cause any suspicion--at least not any more suspicion than being motherless in a little town already creates. The only time that Grammy ever acknowledged my scars was once when I was ten. I was standing in front of the bathroom mirror staring at the faded-to-pale lines, watching the ruined skin ripple when I moved. I remember trying not to cry when I saw how ugly it was, how the marks of what was once a wound, a defect, covered me. I'd never paid much notice to the scars before, had always just considered them a part of me, normal, but the day before, Sarah and I had gone swimming, and when she'd crouched at the edge of the pool before diving in, I saw the smooth stretch of her back, her unscarred shoulders, the skin taut and gold from the sun, and a hard lump of something akin to shame worked its way into my throat and made it hard to swallow. Later that night, alone in the house, I prepared to try to find a way to make myself beautiful too, to try to rid myself of the ruined thing inside of me--the constant gnawing feeling that I was hiding something, that some part of my girlhood, and my body itself, was defective, wrong. But there was no way to get rid of the scars, no way to remove the proof that I was different than the other, unmarred girls I grew up with. I remember clawing at the scars, as if I could scrape the ugliness away, as if I could cleanse it out of myself from the outside in. When that didn't work, I scrubbed at my back with a washcloth I'd covered with dish soap. I was getting hysterical by then, my face screwed up with panic. My skin was flushed with shame and I was crying so hard that I didn't hear her come in, but when I looked up she was in the doorway, watching. Grammy knelt down on the bathroom floor so that we were at eye level, and she grabbed both of my hands in hers. My fingers were bloody from scratching the skin around the scars, and the blood smeared into a faint red on her palms. She stared at me for a minute, like she was trying to remember something she hadn't recalled for years, and then she cleared her throat. "Raya, this is God's doing. He makes everything in his image, you know. And so he gave you these wings, like an angel. You know, when you were born, the parts of your back they had to take out looked just like a baby bird's. He made you in his image; he made you like him. And you need to accept that." Though I never put much weight in God, from then on, whenever I saw the scars, that feeling of disgust that had always risen up in my mouth like bile whenever I saw my body was replaced with a kind of grudging acceptance: Grammy said they were beautiful, that I was marked for some reason, that maybe my being here wasn't as much of an accident as I'd always felt like it was, and I thought that maybe that could be enough. Excerpted from Orpheus Girl by Brynne Rebele-Henry All rights reserved by the original copyright owners. Excerpts are provided for display purposes only and may not be reproduced, reprinted or distributed without the written permission of the publisher.</anon> </opt>


Kimberly Vela is an alumna and graduate student at St. Mary's University. As a vegetarian for six years, Vela learned how to cook for herself and loves to share her recipes with her friends.
Preheat oven to 350° F. Grease 9 x 13 inch pan. In blender or food processor, blend tofu and soy milk until smooth. Add oil, sugar and vanilla, then blend. Combine the dry ingredients in mixing bowl and mix well. Fold in nuts. Dough will be thick. Spread in baking pan, bake 25 minutes.
Prepare topping: Mix all ingredients except nuts in saucepan. Heat until sugar dissolves. Increase heat, bring to boil one minute. Stir in nuts, remove from heat. Remove blondies from oven, pour on topping, then bake 10 more minutes. Let cool completely before serving.